From a0bbfd4871ebc45810374da9c8cdba97f6a5a95f Mon Sep 17 00:00:00 2001 From: tsygankoviva Date: Fri, 30 Oct 2026 13:29:23 +0300 Subject: [PATCH] 0.1.2 --- CHANGELOG.md | 13 ++++++++ MANIFEST.in | 3 ++ README.md | 11 ++++--- VERSION | 2 +- arm_statements/py.typed | 0 arm_statements/version.py | 16 ++------- tests/test_version.py | 69 +++++---------------------------------- 7 files changed, 35 insertions(+), 79 deletions(-) create mode 100644 CHANGELOG.md create mode 100644 arm_statements/py.typed diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..4692d5e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog + +## 0.1.2 — 2026-10-30 + +- Добавлен маркер PEP 561 `arm_statements/py.typed` в дистрибутив: аннотации доступны потребителям библиотеки. +- `statements_version()` получает версию только из `importlib.metadata` дистрибутива `pylib-ai-arm-statements`; при отсутствии метаданных возвращает `None`. Параметр пути и чтение `arm_statements/VERSION` удалены. +- `statement_code_orders.yaml` обновлён байтовой копией `docs/contracts/statement-code-orders.yaml`: комментарии описывают библиотечную поставку без `sync-statements`. +- README приведён к установке библиотеки; changelog и маркер типов включены в исходный дистрибутив. + +## 0.1.1 + +- Общий код нормализации ББ/ОФР оформлен как устанавливаемый пакет `pylib-ai-arm-statements` с импортом `arm_statements` и YAML-словарями. +- Добавлены проверки упаковки, тесты и настройки Ruff/mypy. diff --git a/MANIFEST.in b/MANIFEST.in index e1b6beb..f19418e 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,3 +3,6 @@ include VERSION include requirements.txt recursive-include arm_statements *.py recursive-include arm_statements/rules *.yaml + +include CHANGELOG.md +include arm_statements/py.typed diff --git a/README.md b/README.md index 7983673..8632510 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # arm-statements Общий код нормализации форм ББ/ОФР (пакет `arm_statements`) для tabular-parser, scan-gateway и arm-core. -Раскладывается копией в `api/arm_statements/` хостов скриптом `sync-statements` из arm-ka-docs. +Устанавливается как библиотека `pylib_ai_arm_statements` из локального checkout или собранного wheel; в PyPI не публикуется. Спека: arm-ka-docs, `openspec/changes/unified-statement-normalization/`. -Копия раскладывается `make -C docs sync-statements`; прямые правки копии в хостах запрещены. +В сервисах библиотека устанавливается через `make venv` / `make install`; исходники и словари изменяются в этом репозитории. +История выпусков — [CHANGELOG.md](CHANGELOG.md). ## Как проверить @@ -140,7 +141,7 @@ make_warning(code: str, message: str, rules: Rules, *, line_refs: Sequence[str] # SHEET_NOT_JOINED, SHEET_OTHER только через неё to_jsonable(obj: object) -> Any # dataclass пакета → json-совместимое значение (golden) candidate_from_dict(data: Mapping[str, Any]) -> FormCandidate # обратная для кандидата -statements_version(path: Path | None = None) -> str | None # содержимое api/arm_statements/VERSION копии +statements_version() -> str | None # importlib.metadata: версия установленного дистрибутива load_rules(directory: Path | None = None) -> Rules # RulesError при ошибке словаря default_rules() -> Rules # кэш словарей пакета ``` @@ -238,8 +239,8 @@ Rules.warnings -> Mapping[str, WarningRule] # WarningRule(code, severit ## Как менять словари -Словари пакета — данные в `arm_statements/rules/*.yaml`, правка идёт PR сюда, затем `make -C docs sync-statements` в -хостах («сначала пакет»). +Словари пакета — данные в `arm_statements/rules/*.yaml`, правка идёт PR сюда, затем выпускается новая версия библиотеки +и обновляется зависимость в сервисах («сначала пакет»). - `statement_code_orders.yaml` — **байтовая копия** `docs/contracts/statement-code-orders.yaml` (arm-ka-docs); руками не правится. Перечень кодов меняется только PR в docs, затем копия переносится сюда без изменений. diff --git a/VERSION b/VERSION index 6da28dd..d917d3e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.1 \ No newline at end of file +0.1.2 diff --git a/arm_statements/py.typed b/arm_statements/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/arm_statements/version.py b/arm_statements/version.py index 24af87c..1388999 100644 --- a/arm_statements/version.py +++ b/arm_statements/version.py @@ -1,20 +1,10 @@ -"""Версия копии из VERSION или метаданных установленного пакета.""" +"""Версия установленного дистрибутива библиотеки.""" from importlib.metadata import PackageNotFoundError, version -from pathlib import Path - -_DEFAULT_MARKER = Path(__file__).parent / "VERSION" -def statements_version(path: Path | None = None) -> str | None: - """Прочитать VERSION; для установленного пакета использовать версию дистрибутива.""" - marker = _DEFAULT_MARKER if path is None else path - if marker.is_file(): - text = marker.read_text(encoding="utf-8").strip() - if text or path is not None: - return text or None - if path is not None: - return None +def statements_version() -> str | None: + """Вернуть версию установленного пакета или None, если метаданные недоступны.""" try: return version("pylib-ai-arm-statements") except PackageNotFoundError: diff --git a/tests/test_version.py b/tests/test_version.py index ab26ecc..1f19e2e 100644 --- a/tests/test_version.py +++ b/tests/test_version.py @@ -1,74 +1,23 @@ from importlib.metadata import PackageNotFoundError -from pathlib import Path import pytest import arm_statements.version as version_module from arm_statements.version import statements_version -FULL_HASH = "abc1234def5678abc1234def5678abc1234def56" + +def test_version_from_distribution(monkeypatch: pytest.MonkeyPatch) -> None: + def distribution_version(name: str) -> str: + assert name == "pylib-ai-arm-statements" + return "0.1.2" + + monkeypatch.setattr(version_module, "version", distribution_version) + assert statements_version() == "0.1.2" -def test_version_absent_file_is_none(tmp_path: Path) -> None: - assert statements_version(tmp_path / "VERSION") is None - - -def test_version_read_from_file(tmp_path: Path) -> None: - marker = tmp_path / "VERSION" - marker.write_text(f"{FULL_HASH}\n", encoding="utf-8") - assert statements_version(marker) == FULL_HASH - - -def test_version_empty_file_is_none(tmp_path: Path) -> None: - marker = tmp_path / "VERSION" - marker.write_text(" \n", encoding="utf-8") - assert statements_version(marker) is None - - -@pytest.mark.parametrize("contents", [None, " \n"]) -def test_default_marker_falls_back_to_distribution( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch, contents: str | None -) -> None: - marker = tmp_path / "VERSION" - if contents is not None: - marker.write_text(contents, encoding="utf-8") - monkeypatch.setattr(version_module, "_DEFAULT_MARKER", marker) - monkeypatch.setattr(version_module, "version", lambda name: "0.1.1" if name == "pylib-ai-arm-statements" else None) - assert statements_version() == "0.1.1" - - -def test_default_marker_takes_priority(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - marker = tmp_path / "VERSION" - marker.write_text(f" {FULL_HASH}\n", encoding="utf-8") - monkeypatch.setattr(version_module, "_DEFAULT_MARKER", marker) - - def unexpected_metadata_lookup(name: str) -> str: - raise AssertionError(f"Unexpected metadata lookup: {name}") - - monkeypatch.setattr(version_module, "version", unexpected_metadata_lookup) - assert statements_version() == FULL_HASH - - -def test_default_version_without_metadata_is_none(tmp_path: Path, monkeypatch: pytest.MonkeyPatch) -> None: - monkeypatch.setattr(version_module, "_DEFAULT_MARKER", tmp_path / "VERSION") - +def test_version_without_metadata_is_none(monkeypatch: pytest.MonkeyPatch) -> None: def missing_distribution(name: str) -> str: raise PackageNotFoundError(name) monkeypatch.setattr(version_module, "version", missing_distribution) assert statements_version() is None - - -@pytest.mark.parametrize("contents", [None, " \n"]) -def test_explicit_marker_does_not_use_distribution( - tmp_path: Path, monkeypatch: pytest.MonkeyPatch, contents: str | None -) -> None: - marker = tmp_path / "VERSION" - if contents is not None: - marker.write_text(contents, encoding="utf-8") - - def unexpected_metadata_lookup(name: str) -> str: - raise AssertionError(f"Unexpected metadata lookup: {name}") - - monkeypatch.setattr(version_module, "version", unexpected_metadata_lookup) - assert statements_version(marker) is None