Skip to content

Commit 5a9896a

Browse files
committed
release(0.1.2): sync metadata parity testsuite, version parity, badges, and llms.txt
1 parent 8ad9ea5 commit 5a9896a

7 files changed

Lines changed: 111 additions & 8 deletions

File tree

CHANGELOG.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,15 @@
1111
Alle wesentlichen Änderungen an CodeBox werden hier dokumentiert.
1212
Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/).
1313

14-
## [Unreleased]
14+
## [0.1.2] - 2026-08-16
15+
16+
### Technische Hygiene, Metadaten & Discoverability (2026-08-16)
17+
18+
- `tests/test_metadata.py`: Automatisierte Metadaten-, Manifest- und Plugin-Integritätstestsuite ergänzt (Version-Parität `pyproject.toml`, `version.py`, `CHANGELOG.md`, Required-Fields, Core-Docs, Plugin-JSON-Validierung).
19+
- `version.py`: Version und `__version__` auf `0.1.2` synchronisiert.
20+
- `pyproject.toml`: Version auf `0.1.2` aktualisiert.
21+
- `README.md` & `README_de.md`: Shields.io Badges um `dev-bricks` Ecosystem- und `open-bricks` Umbrella-Zugehörigkeit sowie aktualisierten Teststatus (99 passed, 1 skipped) erweitert.
22+
- `llms.txt`: Last-checked Zeitstempel auf `2026-08-16` und Teststand synchronisiert.
1523

1624
### Plugin-System, Deklarative Sprachen & Shortcuts-Dialog (2026-08-14)
1725

@@ -22,7 +30,7 @@ Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.1.0/).
2230
- `ui/shortcuts_dialog.py`: Neuer interaktiver Shortcuts-Dialog (`F1` / Menü *Hilfe*) mit Such- und Filterleiste über alle Tastenkombinationen.
2331
- `plugins/lua_plugin.json` & `plugins/ruby_plugin.json`: Beispielhafte deklarative Sprach-Plugins für Lua und Ruby integriert.
2432
- `tests/test_plugin_system.py`: Umfassende Testsuite mit 8 neuen Unit-Tests für Provider-Registrierung, Declarative-Parsing, Plugin-Manager-Laden/Entladen, Dialog-UI und Window-Events.
25-
- Testsuite auf 95 bestandene Tests ausgebaut (100% grün).
33+
- Testsuite auf 99 bestandene Tests ausgebaut (100% grün).
2634

2735
### LSP, Linter und Problems-Panel (2026-08-11)
2836

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
66
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/)
77
[![Platform: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]()
8+
[![Ecosystem: dev-bricks](https://img.shields.io/badge/ecosystem-dev--bricks-blue.svg)](https://github.com/dev-bricks)
9+
[![Part of: open-bricks](https://img.shields.io/badge/part%20of-open--bricks-blue.svg)](https://github.com/open-bricks)
810
[![LSP Ready](https://img.shields.io/badge/LSP-ready-purple.svg)]()
9-
[![Tests](https://img.shields.io/badge/tests-95%20passed-brightgreen.svg)]()
11+
[![Tests](https://img.shields.io/badge/tests-99%20passed-brightgreen.svg)]()
1012
[![llms.txt](https://img.shields.io/badge/llms.txt-available-green.svg)](llms.txt)
1113

1214
[Deutsch](README_de.md) | English

README_de.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
[![Lizenz: MIT](https://img.shields.io/badge/Lizenz-MIT-yellow.svg)](LICENSE)
66
[![Python 3.10+](https://img.shields.io/badge/python-3.10+-blue.svg)](https://www.python.org/)
77
[![Plattform: Windows](https://img.shields.io/badge/platform-Windows-lightgrey.svg)]()
8+
[![Ecosystem: dev-bricks](https://img.shields.io/badge/ecosystem-dev--bricks-blue.svg)](https://github.com/dev-bricks)
9+
[![Part of: open-bricks](https://img.shields.io/badge/part%20of-open--bricks-blue.svg)](https://github.com/open-bricks)
810
[![LSP Ready](https://img.shields.io/badge/LSP-ready-purple.svg)]()
9-
[![Tests](https://img.shields.io/badge/tests-95%20passed-brightgreen.svg)]()
11+
[![Tests](https://img.shields.io/badge/tests-99%20passed-brightgreen.svg)]()
1012
[![llms.txt](https://img.shields.io/badge/llms.txt-available-green.svg)](llms.txt)
1113

1214
[English](README.md) | Deutsch

llms.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# CodeBox - local PySide6 desktop code editor
22

3-
## Last-checked: 2026-08-14
3+
## Last-checked: 2026-08-16
44

55
> CodeBox is a local-first desktop IDE for Windows developers who want a lightweight PySide6 code editor with tabs, a project tree, an integrated terminal, Git helpers, syntax highlighting, Language Server Protocol diagnostics, and an extensible JSON/Python language plugin system.
66

@@ -31,7 +31,7 @@ Part of the dev-bricks family. Python, MIT.
3131
- `python main.py`: Launches the CodeBox desktop interface.
3232
- `python main.py --open <file>`: Launches and directly opens a target file path.
3333
- `build_exe.bat`: Uses PyInstaller to bundle the application into a standalone executable.
34-
- `python -m pytest`: Runs the automated test suite (95 passed, 1 skipped).
34+
- `python -m pytest`: Runs the automated test suite (99 passed, 1 skipped).
3535

3636
## Related Projects (dev-bricks & ellmos family)
3737

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "CodeBox"
7-
version = "0.1.1"
7+
version = "0.1.2"
88
description = "Lightweight local PySide6 desktop code editor with LSP diagnostics, tabs, project tree, and integrated terminal"
99
readme = "README.md"
1010
requires-python = ">=3.10"

tests/test_metadata.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
"""Automated metadata, manifest, and plugin integrity test suite for CodeBox."""
2+
3+
import json
4+
import tomllib
5+
from pathlib import Path
6+
7+
import pytest
8+
9+
PROJECT_ROOT = Path(__file__).resolve().parents[1]
10+
11+
12+
@pytest.fixture(scope="module")
13+
def pyproject_data() -> dict:
14+
pyproject_path = PROJECT_ROOT / "pyproject.toml"
15+
assert pyproject_path.is_file(), "pyproject.toml not found in project root"
16+
with open(pyproject_path, "rb") as f:
17+
return tomllib.load(f)
18+
19+
20+
def test_version_parity(pyproject_data: dict) -> None:
21+
"""Ensure version parity across pyproject.toml, version.py, and CHANGELOG.md."""
22+
toml_version = pyproject_data.get("project", {}).get("version")
23+
assert toml_version is not None, "pyproject.toml missing project.version"
24+
25+
# Check version.py
26+
import version
27+
28+
assert version.APP_VERSION == toml_version, (
29+
f"version.py APP_VERSION ({version.APP_VERSION}) != pyproject.toml ({toml_version})"
30+
)
31+
assert version.__version__ == toml_version, (
32+
f"version.py __version__ ({version.__version__}) != pyproject.toml ({toml_version})"
33+
)
34+
35+
# Check CHANGELOG.md contains the version section
36+
changelog_text = (PROJECT_ROOT / "CHANGELOG.md").read_text(encoding="utf-8")
37+
assert f"[{toml_version}]" in changelog_text, (
38+
f"CHANGELOG.md missing release section for [{toml_version}]"
39+
)
40+
41+
42+
def test_pyproject_required_fields(pyproject_data: dict) -> None:
43+
"""Verify all expected project metadata fields exist in pyproject.toml."""
44+
proj = pyproject_data.get("project", {})
45+
assert proj.get("name") == "CodeBox"
46+
assert proj.get("description")
47+
assert proj.get("requires-python")
48+
assert proj.get("license", {}).get("text") == "MIT"
49+
assert isinstance(proj.get("authors"), list) and len(proj["authors"]) > 0
50+
assert isinstance(proj.get("keywords"), list) and len(proj["keywords"]) >= 5
51+
assert isinstance(proj.get("classifiers"), list) and len(proj["classifiers"]) >= 5
52+
53+
urls = proj.get("urls", {})
54+
assert "Homepage" in urls
55+
assert "Repository" in urls
56+
assert "Issues" in urls
57+
58+
59+
def test_core_documentation_files_exist() -> None:
60+
"""Ensure all standard documentation and license files exist and are non-empty."""
61+
required_files = [
62+
"README.md",
63+
"README_de.md",
64+
"llms.txt",
65+
"CHANGELOG.md",
66+
"LICENSE",
67+
"DEVELOPMENT_PLAN.md",
68+
"API_STATUS.md",
69+
]
70+
for filename in required_files:
71+
p = PROJECT_ROOT / filename
72+
assert p.is_file(), f"Missing required file: {filename}"
73+
assert p.stat().st_size > 0, f"File is empty: {filename}"
74+
75+
76+
def test_bundled_plugins_valid_json() -> None:
77+
"""Verify all JSON plugins in plugins/ parse and define required fields."""
78+
plugins_dir = PROJECT_ROOT / "plugins"
79+
assert plugins_dir.is_dir(), "plugins/ directory not found"
80+
81+
plugin_files = list(plugins_dir.glob("*.json"))
82+
assert len(plugin_files) >= 2, "Expected at least 2 bundled plugins"
83+
84+
required_keys = {"name", "version", "extensions", "keywords", "comment_style", "auto_close_pairs"}
85+
for p in plugin_files:
86+
data = json.loads(p.read_text(encoding="utf-8"))
87+
missing = required_keys - set(data.keys())
88+
assert not missing, f"Plugin {p.name} missing keys: {missing}"
89+
assert isinstance(data["extensions"], list) and len(data["extensions"]) > 0
90+
assert isinstance(data["keywords"], list) and len(data["keywords"]) > 0
91+
assert isinstance(data["auto_close_pairs"], dict)

version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55

66
APP_NAME = "CodeBox"
7-
APP_VERSION = "0.1.0"
7+
APP_VERSION = "0.1.2"
88
DEFAULT_WINDOW_TEMPLATE = f"{APP_NAME} v{APP_VERSION}"
99
__version__ = APP_VERSION
1010

0 commit comments

Comments
 (0)