feat(generator): дефолт профиля — daily-wave, ci стал служебным
- Зачем:
- менти доставался плоский тестовый профиль ci; учебный профиль
должен быть один — daily-wave с суточной волной (issue #6).
- Что:
- дефолт daily-wave во всех точках: форма пульта generator_control,
launch.py (API и CLI), Config, Makefile, четыре shell-скрипта.
- автопроверки передают ci явно; контрактный тест пульта теперь
проверяет сам дефолт Param профиля (через AST), а не подстроку.
- доки в том же изменении: README, OPERATIONS, TEST_PLAN,
generator/README, runbook startup-history.
- Проверка:
- make test (206 + 31 passed) и make lint — зелёные.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -119,14 +119,14 @@ class TestConfigDefaults:
|
||||
if orig_value is not None:
|
||||
os.environ["GEN_TICK_SECONDS"] = orig_value
|
||||
|
||||
def test_launch_profile_defaults_to_ci(self, monkeypatch, data_dir):
|
||||
"""По умолчанию выбран быстрый профиль запуска ci."""
|
||||
def test_launch_profile_defaults_to_daily_wave(self, monkeypatch, data_dir):
|
||||
"""По умолчанию выбран учебный профиль запуска daily-wave."""
|
||||
monkeypatch.setenv("GEN_DATA_DIR", str(data_dir))
|
||||
monkeypatch.delenv("GEN_LAUNCH_PROFILE", raising=False)
|
||||
|
||||
config = Config()
|
||||
|
||||
assert config.launch_profile == "ci"
|
||||
assert config.launch_profile == "daily-wave"
|
||||
|
||||
def test_launch_profile_can_be_read_from_env(self, monkeypatch, data_dir):
|
||||
"""Выбранный профиль запуска попадает в конфигурацию для логов."""
|
||||
|
||||
@@ -42,6 +42,25 @@ def _declared_param_types() -> dict[str, set[str]]:
|
||||
return param_types
|
||||
|
||||
|
||||
def _declared_param_defaults() -> dict[str, object]:
|
||||
param_defaults = {}
|
||||
for node in ast.walk(_tree()):
|
||||
if not isinstance(node, ast.Dict):
|
||||
continue
|
||||
for key, value in zip(node.keys, node.values, strict=True):
|
||||
if not (
|
||||
isinstance(key, ast.Constant)
|
||||
and isinstance(key.value, str)
|
||||
and isinstance(value, ast.Call)
|
||||
and isinstance(value.func, ast.Name)
|
||||
and value.func.id == "Param"
|
||||
and value.args
|
||||
):
|
||||
continue
|
||||
param_defaults[key.value] = ast.literal_eval(value.args[0])
|
||||
return param_defaults
|
||||
|
||||
|
||||
def test_dag_file_exists_and_uses_dynamic_profiles():
|
||||
"""DAG берёт варианты профилей из PROFILES, а не из ручного списка."""
|
||||
text = DAG_PATH.read_text(encoding="utf-8")
|
||||
@@ -55,9 +74,11 @@ def test_dag_file_exists_and_uses_dynamic_profiles():
|
||||
def test_trigger_form_has_expected_param_enums():
|
||||
"""Форма запуска ограничивает операции и профили."""
|
||||
text = DAG_PATH.read_text(encoding="utf-8")
|
||||
param_defaults = _declared_param_defaults()
|
||||
|
||||
assert 'enum=["backfill", "import", "next-day", "check"]' in text
|
||||
assert "enum=sorted(PROFILES)" in text
|
||||
assert param_defaults["profile"] == "daily-wave"
|
||||
assert '"duration": Param(' in text
|
||||
assert '"artifact_path": Param(' in text
|
||||
assert '"expected_t_end": Param(' in text
|
||||
|
||||
@@ -5,6 +5,17 @@
|
||||
from datetime import datetime, timezone
|
||||
|
||||
|
||||
def test_daily_wave_is_the_default_for_api_and_cli(monkeypatch):
|
||||
"""Ручные точки входа без профиля выбирают daily-wave."""
|
||||
from clickstream_generator.launch import _parse_args, build_launch_env
|
||||
|
||||
monkeypatch.delenv("PROFILE", raising=False)
|
||||
monkeypatch.delenv("GEN_LAUNCH_PROFILE", raising=False)
|
||||
|
||||
assert build_launch_env("backfill")["GEN_LAUNCH_PROFILE"] == "daily-wave"
|
||||
assert _parse_args(["backfill"]).profile == "daily-wave"
|
||||
|
||||
|
||||
def test_duration_2d_sets_model_t_end_from_t0():
|
||||
"""Длительность 2d считается от T0 без ручного GEN_MODEL_T_END."""
|
||||
from clickstream_generator.launch import build_launch_env
|
||||
|
||||
Reference in New Issue
Block a user