feat(ddl): пояс назван явно — в типах колонок и в разборе строки
- Зачем: - конвенция #63 записана, а код её не достиг: колонки времени стояли без пояса, и сходилось всё лишь потому, что пояс сервера — UTC. - Что: - UTCEventTime объявлен DateTime('UTC'), служебные метки _load_ts и kafka_timestamp — DateTime64(3, 'UTC') в STG и ODS. - parseDateTimeOrNull получил третьим аргументом 'UTC': маска сверяет суффикс Z как букву, зоны из строки не берёт вовсе. - контракт схемы и описание выгрузки несут тип с поясом; имя пояса Europe/Samara встало рядом со смещением в world.py, сходимость сверяет тест. - учебный комментарий о линзе — у первой колонки с явным поясом. - Проверка: - make lint, make typecheck, make test (408 тестов) - make clean && make up && make check-clickhouse — 9 из 9 - замер тикета повторён: под session_timezone='Europe/Samara' колонка показана 2026-05-31 23:37:00, как и без настроек Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -31,7 +31,7 @@ NUMPY_BY_CLICKHOUSE_TYPE = {
|
||||
"String": "object",
|
||||
"LowCardinality(String)": "object",
|
||||
"Date": "datetime64[D]",
|
||||
"DateTime": "datetime64[s]",
|
||||
"DateTime('UTC')": "datetime64[s]",
|
||||
}
|
||||
|
||||
METRICA_NAME = re.compile(r"^[A-Za-z][A-Za-z0-9]*$")
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
«в среднем 3–4 возврата» и «средняя кука активна ≈1,9 дня».
|
||||
"""
|
||||
|
||||
from datetime import datetime, time, timedelta
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
from clickstream_generator import catalog, world
|
||||
|
||||
|
||||
@@ -27,6 +30,13 @@ 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
|
||||
|
||||
Reference in New Issue
Block a user