From 79ca2e8a4b0a47a8df176dc914fbd1bd2a57d471 Mon Sep 17 00:00:00 2001 From: Martin Kleine <24376955+datenzar@users.noreply.github.com> Date: Mon, 24 Nov 2025 22:14:45 +0100 Subject: [PATCH 1/2] docs: remove version section from README --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index de2efee..5394336 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,3 @@ params_livetext = OcrmacParams( ) hocr = engine.process(Path("document.pdf"), params_livetext) ``` - -## Version - -0.1.0 From b19d6427fddf44c99ebe6fedd6e86ab13aadcb10 Mon Sep 17 00:00:00 2001 From: Martin Kleine Date: Sun, 30 Nov 2025 11:16:28 +0100 Subject: [PATCH 2/2] feat: update dependencies and improve parameter validation BREAKING CHANGE: Move parameter validation to engine modules - Bumped `ocrbridge-core` dependency version to `>=2.0.0` in `pyproject.toml` and `uv.lock`. - Added parameter validation utilities in `models.py` for language codes and list length. - Adjusted test assertions in `test_models.py` for improved error messaging. Note: Commit message generated with AI assistance. --- pyproject.toml | 2 +- src/ocrbridge/engines/ocrmac/__init__.py | 2 +- src/ocrbridge/engines/ocrmac/engine.py | 2 ++ src/ocrbridge/engines/ocrmac/models.py | 24 ++++++++++++------------ tests/__init__.py | 1 - tests/test_models.py | 2 +- uv.lock | 10 +++++----- 7 files changed, 22 insertions(+), 21 deletions(-) delete mode 100644 tests/__init__.py diff --git a/pyproject.toml b/pyproject.toml index 4dfb368..584158b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ requires-python = ">=3.10" license = { text = "MIT" } dependencies = [ - "ocrbridge-core>=0.1.0", + "ocrbridge-core>=2.0.0", "ocrmac>=0.2.2", "pdf2image>=1.17.0", "Pillow>=10.0.0", diff --git a/src/ocrbridge/engines/ocrmac/__init__.py b/src/ocrbridge/engines/ocrmac/__init__.py index f3d9c43..2c2d63e 100644 --- a/src/ocrbridge/engines/ocrmac/__init__.py +++ b/src/ocrbridge/engines/ocrmac/__init__.py @@ -5,4 +5,4 @@ __all__ = ["OcrmacEngine", "OcrmacParams", "RecognitionLevel"] -__version__ = "0.1.0" +__version__ = "1.0.0" diff --git a/src/ocrbridge/engines/ocrmac/engine.py b/src/ocrbridge/engines/ocrmac/engine.py index 9774037..f21f4d5 100644 --- a/src/ocrbridge/engines/ocrmac/engine.py +++ b/src/ocrbridge/engines/ocrmac/engine.py @@ -29,6 +29,8 @@ class OcrmacEngine(OCREngine): Platform: macOS 10.15+ (macOS Sonoma 14.0+ for LiveText) """ + __param_model__ = OcrmacParams + @property def name(self) -> str: """Return engine name.""" diff --git a/src/ocrbridge/engines/ocrmac/models.py b/src/ocrbridge/engines/ocrmac/models.py index 2898c91..45c8bab 100644 --- a/src/ocrbridge/engines/ocrmac/models.py +++ b/src/ocrbridge/engines/ocrmac/models.py @@ -1,11 +1,15 @@ """ocrmac OCR engine parameter models.""" -import re from enum import Enum from pydantic import Field, field_validator from ocrbridge.core.models import OCREngineParams # type: ignore[reportMissingTypeStubs] +from ocrbridge.core.validation import ( + PATTERN_IETF_BCP47, + validate_language_code_format, + validate_list_length, +) class RecognitionLevel(str, Enum): @@ -54,18 +58,14 @@ def validate_languages(cls, v: list[str] | None) -> list[str] | None: if v is None: return v - if len(v) > 5: - raise ValueError("Maximum 5 languages allowed") - - # IETF BCP 47 format: language[-Script][-Region] - # Examples: en, en-US, zh-Hans, zh-Hans-CN - pattern = r"^[a-z]{2,3}(-[A-Z][a-z]{3})?(-[A-Z]{2})?$" + # Use core utilities for validation + validate_list_length(v, max_length=5, field_name="languages") + # Validate each language code format using core utility for lang in v: - if not re.match(pattern, lang, re.IGNORECASE): - raise ValueError( - f"Invalid IETF BCP 47 language code: '{lang}'. " - f"Expected format: 'en-US', 'fr-FR', 'zh-Hans'" - ) + validate_language_code_format( + lang, + PATTERN_IETF_BCP47, + ) return v diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index 2800a67..0000000 --- a/tests/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Tests package placeholder.""" diff --git a/tests/test_models.py b/tests/test_models.py index b77cbe2..f002b2f 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -104,7 +104,7 @@ def test_invalid_language_code_format(self) -> None: # Should raise a value_error from our custom validator error_str = str(exc_info.value) - assert "Invalid IETF BCP 47 language code" in error_str or "value_error" in error_str + assert "Invalid IETF BCP 47" in error_str or "value_error" in error_str def test_empty_language_list(self) -> None: """Test that empty language list raises error.""" diff --git a/uv.lock b/uv.lock index f2bcb5f..087bb6d 100644 --- a/uv.lock +++ b/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 2 +revision = 3 requires-python = ">=3.10" [[package]] @@ -475,14 +475,14 @@ wheels = [ [[package]] name = "ocrbridge-core" -version = "1.0.0" +version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/37/d3b11bad906ae1bdb3a57bb4a556d364077ed7347e8b7802c98f152904d2/ocrbridge_core-1.0.0.tar.gz", hash = "sha256:caa662e0aceb813dbde55b010e3fd8cfde278a9c41b3d3ba5ed55adb9226f428", size = 86764, upload-time = "2025-11-24T00:41:46.975Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ac/ed/af98ad6d9c57f277e414dc8962a44341a5726c8e15a120ea8fd15fc0d331/ocrbridge_core-2.0.0.tar.gz", hash = "sha256:e763390d44f313050686756056a62458ce4a44ba89760b395a5389add7b70a64", size = 94244, upload-time = "2025-11-29T17:26:05.38Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/c6/23fd2ef0855a5ca3f351b621ac9b33251d19a4b5048456b5a66a8d6313b4/ocrbridge_core-1.0.0-py3-none-any.whl", hash = "sha256:1ddf1a2c4334771f5ec89bba1559aff0526a8954cdfadd6335360cd87a92bab3", size = 8118, upload-time = "2025-11-24T00:41:45.46Z" }, + { url = "https://files.pythonhosted.org/packages/f1/2a/f64fada140f7a2c0e750a89ea59df9a46299b2cdc697fe35d1381754d1da/ocrbridge_core-2.0.0-py3-none-any.whl", hash = "sha256:2666b0c9489f3b92108502971c503db31a2eca106836ade6259724ec47bd174f", size = 12290, upload-time = "2025-11-29T17:26:03.823Z" }, ] [[package]] @@ -514,7 +514,7 @@ test = [ [package.metadata] requires-dist = [ { name = "hatchling", marker = "extra == 'build'" }, - { name = "ocrbridge-core", specifier = ">=0.1.0" }, + { name = "ocrbridge-core", specifier = ">=2.0.0" }, { name = "ocrmac", specifier = ">=0.2.2" }, { name = "pdf2image", specifier = ">=1.17.0" }, { name = "pillow", specifier = ">=10.0.0" },