fix: вид абсолютного периода берётся из словаря; проверка ключей repeats

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
This commit is contained in:
Andrey Epifancev 2026-10-18 13:18:49 +04:00
parent 25b8bc4abf
commit 33ec43d78d
2 changed files with 34 additions and 1 deletions

View File

@ -322,7 +322,7 @@ def _load_periods(directory: Path) -> PeriodRules:
pattern = _rx(file, f"{key}.pattern", _get(file, entry, "pattern"))
if not set(pattern.groupindex) <= _PERIOD_GROUPS:
raise _fail(file, f"{key}.pattern", f"допустимые имена групп: {sorted(_PERIOD_GROUPS)}")
absolute.append(PeriodPattern(kind, pattern))
absolute.append(PeriodPattern(abs_kind, pattern))
months: list[tuple[str, int]] = []
for stem, number in _map(file, "months", _get(file, data, "months")).items():
month = _int(file, f"months.{stem}", number)
@ -424,6 +424,13 @@ def _load_orders(directory: Path) -> CodeOrders:
raise _fail(file, "version", "поддерживается только версия 1")
repeats = _map(file, "repeats", _get(file, data, "repeats"))
editions_raw = _map(file, "editions", _get(file, data, "editions"))
for ed_name, forms_node in repeats.items():
if ed_name not in editions_raw:
raise _fail(file, f"repeats.{ed_name}", "редакции нет в editions")
known_forms = _map(file, f"editions.{ed_name}", editions_raw[ed_name])
for form_name in _map(file, f"repeats.{ed_name}", forms_node):
if form_name not in known_forms:
raise _fail(file, f"repeats.{ed_name}.{form_name}", "формы нет в editions этой редакции")
editions: list[Edition] = []
sequences: dict[tuple[Edition, DocumentType, FormVariant], tuple[str, ...]] = {}
for ed_name, forms_node in editions_raw.items():

View File

@ -139,3 +139,29 @@ def test_label_keys_are_checked(tmp_path: Path) -> None:
target.write_text(target.read_text(encoding="utf-8").replace(" okpo:", " okpo_x:", 1), encoding="utf-8")
with pytest.raises(RulesError, match="statement_headers"):
load_rules(tmp_path)
def test_absolute_period_kinds_come_from_dictionary(rules: Rules) -> None:
expected = [
"range_end",
"day_month_year",
"quarter",
"half",
"months",
"month_range",
"year",
]
data = yaml.safe_load((RULES_DIR / "statement_periods.yaml").read_text(encoding="utf-8"))
assert [p["kind"] for p in data["absolute"]] == expected
assert [p.kind for p in rules.periods.absolute] == expected
def test_repeats_for_unknown_form_rejected(tmp_path: Path) -> None:
for path in RULES_DIR.glob("*.yaml"):
(tmp_path / path.name).write_bytes(path.read_bytes())
orders = tmp_path / "statement_code_orders.yaml"
orders.write_text(
orders.read_text(encoding="utf-8").replace(" INCOME: []", " DISCLOSURE: []", 1), encoding="utf-8"
)
with pytest.raises(RulesError, match="repeats"):
load_rules(tmp_path)