From a02eba56c234bc21f3ff57e9fd842a1059450c33 Mon Sep 17 00:00:00 2001 From: Dmitry Dementiev Date: Sat, 8 Aug 2026 19:56:26 +0300 Subject: [PATCH] =?UTF-8?q?refactor(generator):=20=D0=B8=D0=BC=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=8F=D1=81=D0=B0=20=E2=80=94=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B5=D0=BC,=20?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=20=D0=BA=D0=BE=D0=BD=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D1=82=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - константу COUNTER_TIMEZONE не читал ни один модуль, единственным её читателем был тест про неё же; связь имени и смещения держится тем, что они стоят в одной строке. - Что: - COUNTER_TIMEZONE снят, имя пояса ушло комментарием к COUNTER_TIMEZONE_MINUTES. - тест сходимости имени и смещения снят вместе с ним; test_world.py вернулся к прежнему виду. - Проверка: - make lint, make typecheck, make test (407 тестов) Co-Authored-By: Claude Opus 5 --- generator/src/clickstream_generator/world.py | 19 ++++++++----------- generator/tests/test_world.py | 10 ---------- 2 files changed, 8 insertions(+), 21 deletions(-) diff --git a/generator/src/clickstream_generator/world.py b/generator/src/clickstream_generator/world.py index 3f99b83..e25e6e8 100644 --- a/generator/src/clickstream_generator/world.py +++ b/generator/src/clickstream_generator/world.py @@ -16,17 +16,14 @@ from datetime import date # Счётчик стенда: сайт один, номер — константа мира. COUNTER_ID = 42150607 -# Часовой пояс счётчика — Самара, UTC+4 — записан двумя способами, потому что -# стороны просят разное. Генератору нужны минуты: в этом поясе считаются -# модельные сутки, как в выгрузке Метрики — `EventDate` дата в поясе счётчика, -# `UTCEventTime` абсолютная метка. Отсюда следствие, о котором сторона -# хранилища должна знать заранее: `toDate(UTCEventTime)` ≠ `EventDate` у ночных -# событий (спека генератора, раздел 9). Хранилищу тот же пояс нужен именем из -# базы поясов — так пишутся `toDate` и типы колонок DDS -# (docs/architecture/storage.md, «Часовые пояса»). Пути отсюда в SQL нет, имя -# переносят руками — но берут его здесь. -COUNTER_TIMEZONE = "Europe/Samara" -COUNTER_TIMEZONE_MINUTES = 240 +# Часовой пояс счётчика, минуты от UTC. Модельные сутки считаются в этом поясе, +# как в выгрузке Метрики: `EventDate` — дата в поясе счётчика, `UTCEventTime` — +# абсолютная метка. Отсюда следствие, о котором сторона хранилища должна знать +# заранее: `toDate(UTCEventTime)` ≠ `EventDate` у ночных событий (спека +# генератора, раздел 9). Рядом имя того же пояса: числа ClickHouse в этом месте +# не принимает, витрины пишутся именем (docs/architecture/storage.md, «Часовые +# пояса»). +COUNTER_TIMEZONE_MINUTES = 240 # Europe/Samara # D0 — первый день оси модельного времени, понедельник. Реальный календарь в # модели не участвует: дата нужна лишь затем, чтобы дни оси легли в diff --git a/generator/tests/test_world.py b/generator/tests/test_world.py index 57da1fe..872b16f 100644 --- a/generator/tests/test_world.py +++ b/generator/tests/test_world.py @@ -6,9 +6,6 @@ «в среднем 3–4 возврата» и «средняя кука активна ≈1,9 дня». """ -from datetime import datetime, time, timedelta -from zoneinfo import ZoneInfo - from clickstream_generator import catalog, world @@ -30,13 +27,6 @@ def test_origin_is_a_monday(): assert world.ORIGIN.weekday() == 0 -def test_the_counter_timezone_name_and_offset_say_the_same_thing(): - """Имя пояса просит хранилище, минуты — генератор; расходиться им нельзя.""" - midnight = datetime.combine(world.ORIGIN, time()) - named = ZoneInfo(world.COUNTER_TIMEZONE).utcoffset(midnight) - assert named == timedelta(minutes=world.COUNTER_TIMEZONE_MINUTES) - - def test_weekly_profile_covers_a_week_and_averages_to_one(): assert len(world.WEEKLY_PROFILE_PERCENT) == 7 assert sum(world.WEEKLY_PROFILE_PERCENT) == 700