refactor(generator): имя пояса — комментарием, а не константой

- Зачем:
  - константу COUNTER_TIMEZONE не читал ни один модуль, единственным её
    читателем был тест про неё же; связь имени и смещения держится тем, что
    они стоят в одной строке.
- Что:
  - COUNTER_TIMEZONE снят, имя пояса ушло комментарием к
    COUNTER_TIMEZONE_MINUTES.
  - тест сходимости имени и смещения снят вместе с ним; test_world.py
    вернулся к прежнему виду.
- Проверка:
  - make lint, make typecheck, make test (407 тестов)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-08 19:56:26 +03:00
co-authored by Claude Opus 5
parent 359570ec65
commit a02eba56c2
2 changed files with 8 additions and 21 deletions
+8 -11
View File
@@ -16,17 +16,14 @@ from datetime import date
# Счётчик стенда: сайт один, номер — константа мира. # Счётчик стенда: сайт один, номер — константа мира.
COUNTER_ID = 42150607 COUNTER_ID = 42150607
# Часовой пояс счётчика — Самара, UTC+4 — записан двумя способами, потому что # Часовой пояс счётчика, минуты от UTC. Модельные сутки считаются в этом поясе,
# стороны просят разное. Генератору нужны минуты: в этом поясе считаются # как в выгрузке Метрики: `EventDate` — дата в поясе счётчика, `UTCEventTime` —
# модельные сутки, как в выгрузке Метрики — `EventDate` дата в поясе счётчика, # абсолютная метка. Отсюда следствие, о котором сторона хранилища должна знать
# `UTCEventTime` абсолютная метка. Отсюда следствие, о котором сторона # заранее: `toDate(UTCEventTime)` ≠ `EventDate` у ночных событий (спека
# хранилища должна знать заранее: `toDate(UTCEventTime)` ≠ `EventDate` у ночных # генератора, раздел 9). Рядом имя того же пояса: числа ClickHouse в этом месте
# событий (спека генератора, раздел 9). Хранилищу тот же пояс нужен именем из # не принимает, витрины пишутся именем (docs/architecture/storage.md, «Часовые
# базы поясов — так пишутся `toDate` и типы колонок DDS # пояса»).
# (docs/architecture/storage.md, «Часовые пояса»). Пути отсюда в SQL нет, имя COUNTER_TIMEZONE_MINUTES = 240 # Europe/Samara
# переносят руками — но берут его здесь.
COUNTER_TIMEZONE = "Europe/Samara"
COUNTER_TIMEZONE_MINUTES = 240
# D0 — первый день оси модельного времени, понедельник. Реальный календарь в # D0 — первый день оси модельного времени, понедельник. Реальный календарь в
# модели не участвует: дата нужна лишь затем, чтобы дни оси легли в # модели не участвует: дата нужна лишь затем, чтобы дни оси легли в
-10
View File
@@ -6,9 +6,6 @@
«в среднем 3–4 возврата» и «средняя кука активна ≈1,9 дня». «в среднем 3–4 возврата» и «средняя кука активна ≈1,9 дня».
""" """
from datetime import datetime, time, timedelta
from zoneinfo import ZoneInfo
from clickstream_generator import catalog, world from clickstream_generator import catalog, world
@@ -30,13 +27,6 @@ def test_origin_is_a_monday():
assert world.ORIGIN.weekday() == 0 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(): def test_weekly_profile_covers_a_week_and_averages_to_one():
assert len(world.WEEKLY_PROFILE_PERCENT) == 7 assert len(world.WEEKLY_PROFILE_PERCENT) == 7
assert sum(world.WEEKLY_PROFILE_PERCENT) == 700 assert sum(world.WEEKLY_PROFILE_PERCENT) == 700