fix(generator): сторожа имён DDS и порядка строк, торговый словарь — по границе
- Зачем:
- слепая линия Кодекса (свежий тред, high) нашла три места, где обещание
контракта не подкреплено: имена для DDS не сверялись ни с чем, порядок
строк документа держался только на нумерации, а комментарий рекламировал
торговые события, которые мастер-спека прямо исключила.
- Что:
- имена для DDS записаны независимо и сверяются целиком: они не выводятся
правилом из имён Метрики, значит осмысленно неверное имя иначе молча
уезжает в опубликованное описание (проверено подменой referer).
- строки документа сверяются парами «номер, колонка»: рендер в другом
порядке больше не проходит зелёным (проверено перевёрнутым рендером).
- productEventType: detail и remove убраны из комментария — раздел 10
мастер-спеки отказался от полного словаря торговых событий Метрики;
стенд шлёт add и purchase.
- Проверка:
- make test (250 тестов), make lint;
- make docs, затем git diff --exit-code docs/ — пусто;
- обе новые проверки проверены мутациями: каждая краснеет своим тестом.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -87,6 +87,60 @@ NUMPY_BY_CLICKHOUSE_TYPE = {
|
||||
"DateTime": "datetime64[s]",
|
||||
}
|
||||
|
||||
# Имена для DDS — не производная от имён Метрики, а решение тикета #36:
|
||||
# вывести их правилом нельзя (акронимы, «timezone» одним словом), поэтому
|
||||
# сверять их не с чем, кроме такой же независимой записи. Без неё осмысленно
|
||||
# неверное имя молча уезжает в опубликованное описание выгрузки.
|
||||
EXPECTED_DDS_NAMES = {
|
||||
"WatchID": "watch_id",
|
||||
"VisitID": "visit_id",
|
||||
"ClientID": "client_id",
|
||||
"CounterID": "counter_id",
|
||||
"EventDate": "event_date",
|
||||
"UTCEventTime": "utc_event_time",
|
||||
"ClientTimeZone": "client_timezone",
|
||||
"EventType": "event_type",
|
||||
"Sign": "sign",
|
||||
"URL": "url",
|
||||
"Referer": "referer",
|
||||
"Title": "title",
|
||||
"UTMSource": "utm_source",
|
||||
"UTMMedium": "utm_medium",
|
||||
"UTMCampaign": "utm_campaign",
|
||||
"UTMContent": "utm_content",
|
||||
"UTMTerm": "utm_term",
|
||||
"LastTrafficSource": "last_traffic_source",
|
||||
"HasGCLID": "has_gclid",
|
||||
"YCLID": "yclid",
|
||||
"Browser": "browser",
|
||||
"BrowserMajorVersion": "browser_major_version",
|
||||
"BrowserLanguage": "browser_language",
|
||||
"OperatingSystem": "operating_system",
|
||||
"OperatingSystemRoot": "operating_system_root",
|
||||
"DeviceCategory": "device_category",
|
||||
"MobilePhoneModel": "mobile_phone_model",
|
||||
"ScreenWidth": "screen_width",
|
||||
"ScreenHeight": "screen_height",
|
||||
"IPAddress": "ip_address",
|
||||
"RegionCountry": "region_country",
|
||||
"RegionCity": "region_city",
|
||||
"RegionCountryID": "region_country_id",
|
||||
"RegionCityID": "region_city_id",
|
||||
"GoalsReached": "goals_reached",
|
||||
"ParsedParamsKey1": "parsed_params_key1",
|
||||
"purchaseID": "purchase_id",
|
||||
"purchaseRevenue": "purchase_revenue",
|
||||
"purchaseCurrency": "purchase_currency",
|
||||
"purchaseCoupon": "purchase_coupon",
|
||||
"productID": "product_id",
|
||||
"productName": "product_name",
|
||||
"productCategory": "product_category",
|
||||
"productPrice": "product_price",
|
||||
"productQuantity": "product_quantity",
|
||||
"productEventType": "product_event_type",
|
||||
"ecommerce": "ecommerce",
|
||||
}
|
||||
|
||||
METRICA_NAME = re.compile(r"^[A-Za-z][A-Za-z0-9]*$")
|
||||
DDS_NAME = re.compile(r"^[a-z][a-z0-9_]*$")
|
||||
ARRAY_TYPE = re.compile(r"^Array\((.+)\)$")
|
||||
@@ -124,6 +178,11 @@ def test_dds_names_are_unique():
|
||||
assert len(set(names)) == len(names)
|
||||
|
||||
|
||||
def test_dds_names_are_the_ones_we_chose():
|
||||
"""Переименование колонки в DDS — решение, а не правка мимоходом."""
|
||||
assert {column.name: column.dds_name for column in COLUMNS} == EXPECTED_DDS_NAMES
|
||||
|
||||
|
||||
@pytest.mark.parametrize("column", COLUMNS, ids=lambda column: column.name)
|
||||
def test_attributes_are_filled(column: Column):
|
||||
assert column.name.strip()
|
||||
|
||||
Reference in New Issue
Block a user