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:
parent
25b8bc4abf
commit
33ec43d78d
@ -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():
|
||||
|
||||
@ -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)
|
||||
|
||||
Reference in New Issue
Block a user