Skip to content

Commit c38f057

Browse files
committed
chore: technical hygiene, ruff config, cleanup and metadata parity tests (Pfad A)
1 parent 252243f commit c38f057

8 files changed

Lines changed: 73 additions & 9 deletions

File tree

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,16 @@ All notable public changes are documented in this file.
44

55
## Unreleased
66

7+
## 0.3.1 - 2026-08-16
8+
9+
### Maintenance & Technical Hygiene (Pfad A)
10+
11+
- Standardized linting configuration: added `[tool.ruff]` and `[tool.ruff.lint]` configuration in `pyproject.toml` (`target-version = "py310"`, `line-length = 120`, `E402`/`E501` ignore).
12+
- Fixed unused import `default_state_dir` in `memoryhooker/cli.py`.
13+
- Reorganized module imports in `tests/test_providers.py`.
14+
- Added automated metadata & manifest contract test suite in `tests/test_metadata.py` (verifying version parity across `pyproject.toml`, `ellmos-module.v2.json`, and `__version__`, required fields, and module exports).
15+
- Synchronized documentation badges (139/139 passed).
16+
717
## 0.3.0
818

919
### Added

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
[![open-bricks](https://img.shields.io/badge/umbrella-open--bricks-indigo.svg)](https://github.com/open-bricks)
77
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
88
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
9+
[![Tests](https://img.shields.io/badge/tests-139%20passed-brightgreen.svg)](tests/)
10+
[![llms.txt](https://img.shields.io/badge/llms.txt-available-0055ff?logo=markdown)](llms.txt)
911
[![Language: Deutsch](https://img.shields.io/badge/Language-Deutsch-de.svg)](README_de.md)
1012

1113
> [!NOTE]

README_de.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
[![open-bricks](https://img.shields.io/badge/umbrella-open--bricks-indigo.svg)](https://github.com/open-bricks)
77
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
88
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/downloads/)
9+
[![Tests](https://img.shields.io/badge/tests-139%20bestanden-brightgreen.svg)](tests/)
10+
[![llms.txt](https://img.shields.io/badge/llms.txt-verf%C3%BCgbar-0055ff?logo=markdown)](llms.txt)
911
[![Language: English](https://img.shields.io/badge/Language-English-gb.svg)](README.md)
1012

1113
> [!NOTE]

llms.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Umbrella: open-bricks
1414
- memoryhooker/config.py: configuration schema and safe defaults.
1515
- memoryhooker/backends/: local read-only retrieval adapters.
1616
- memoryhooker/providers/: host-specific snippet generators.
17-
- tests/: automated behavior and provider-contract tests.
17+
- tests/: 139 automated behavior, metadata parity, and provider-contract tests.
1818

1919
## Safety properties
2020

memoryhooker/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from .modes import evaluate_prompt, session_start_message
3030
from .providers import PROVIDER_REGISTRY, resolve_provider
3131
from .providers.claude import ClaudeProvider
32-
from .state import SessionState, default_state_dir, state_path_for_session
32+
from .state import SessionState, state_path_for_session
3333

3434
# Kandidaten-Feldnamen fuer den Prompt-Text im UserPromptSubmit-stdin-JSON.
3535
# ACHTUNG (siehe ROADMAP.md, "Zu verifizieren, bevor gebaut wird"): der

pyproject.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,12 @@ include = ["memoryhooker*"]
2626
[tool.pytest.ini_options]
2727
pythonpath = "."
2828
testpaths = ["tests"]
29+
30+
[tool.ruff]
31+
line-length = 120
32+
target-version = "py310"
33+
34+
[tool.ruff.lint]
35+
select = ["E", "F", "W"]
36+
ignore = ["E501", "E402"]
37+

tests/test_metadata.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import json
2+
from pathlib import Path
3+
import tomllib
4+
5+
import memoryhooker
6+
7+
8+
def test_version_parity():
9+
root = Path(__file__).resolve().parent.parent
10+
pyproject_path = root / "pyproject.toml"
11+
module_v2_path = root / "ellmos-module.v2.json"
12+
13+
with pyproject_path.open("rb") as f:
14+
pyproject_data = tomllib.load(f)
15+
pyproject_version = pyproject_data["project"]["version"]
16+
17+
with module_v2_path.open("r", encoding="utf-8") as f:
18+
module_v2_data = json.load(f)
19+
module_v2_version = module_v2_data["version"]
20+
21+
assert memoryhooker.__version__ == pyproject_version
22+
assert memoryhooker.__version__ == module_v2_version
23+
24+
25+
def test_module_v2_contract():
26+
root = Path(__file__).resolve().parent.parent
27+
module_v2_path = root / "ellmos-module.v2.json"
28+
29+
with module_v2_path.open("r", encoding="utf-8") as f:
30+
data = json.load(f)
31+
32+
assert data["schema"] == "ellmos.module.v2"
33+
assert data["id"] == "memoryhooker"
34+
assert "provides" in data
35+
assert "surfaces" in data
36+
assert "boundaries" in data
37+
38+
39+
def test_package_exports():
40+
expected_exports = ["Hit", "MemoryBackend", "Config", "load_config", "__version__"]
41+
for export_name in expected_exports:
42+
assert hasattr(memoryhooker, export_name)
43+
assert export_name in memoryhooker.__all__

tests/test_providers.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
1+
from pathlib import Path
2+
3+
import pytest
4+
15
from memoryhooker.config import ProvidersConfig
26
from memoryhooker.providers import PROVIDER_REGISTRY, resolve_provider
37
from memoryhooker.providers.agy import AgyProvider
48
from memoryhooker.providers.claude import ClaudeProvider
59
from memoryhooker.providers.codex import CodexProvider
610
from memoryhooker.providers.git import GitProvider
11+
from memoryhooker.providers.kimi import KimiProvider
712
from memoryhooker.providers.manual import ManualProvider
813

914

@@ -69,13 +74,6 @@ def test_provider_registry_has_all_six():
6974
assert set(PROVIDER_REGISTRY) == {"claude", "codex", "agy", "kimi", "git", "manual"}
7075

7176

72-
from pathlib import Path
73-
74-
import pytest
75-
76-
from memoryhooker.providers.kimi import KimiProvider
77-
78-
7977
def test_kimi_provider_emits_only_userpromptsubmit_in_plain_format():
8078
"""Kimi-Vertrag (Probe 2026-07-28, CLI 0.29.2): nur UserPromptSubmit speist
8179
stdout als Kontext ein; SessionStart ist ein Beobachtungs-Event und wird

0 commit comments

Comments
 (0)