feat(ddl): часовые пояса — линза названа явно #75
@@ -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 — первый день оси модельного времени, понедельник. Реальный календарь в
|
||||
# модели не участвует: дата нужна лишь затем, чтобы дни оси легли в
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user