Fix --jpeg-quality/--jpg-quality being dropped by the CLI (closes #1723)
namespace_to_options() only copied argparse namespace keys that were literal members of OcrOptions.model_fields. The CLI dest for both --jpeg-quality and --jpg-quality was jpeg_quality, but the pydantic field was named jpg_quality (jpeg_quality existed only as a compatibility property, absent from model_fields). The value was silently dropped into extra_attrs, and the optimizer always fell back to its own hardcoded default regardless of the flag. The same alias mismatch also affected the Python API: create_options() uses the same model_fields-matching logic as namespace_to_options(), so ocrmypdf.ocr(jpeg_quality=...) was silently dropped too - only the canonical jpg_quality= kwarg worked. Rather than patch around the mismatch, consolidate on a single canonical name: OcrOptions.jpeg_quality (matching the primary --jpeg-quality CLI flag and the already-consistent naming in OptimizeOptions). jpg_quality becomes a deprecated compatibility property, and ocrmypdf.ocr(jpg_quality=) is a deprecated alias that warns and forwards to jpeg_quality via a new create_options() remap step. --jpg-quality remains a working (already hidden) CLI alias with no code-path divergence, since it now shares an argparse dest that matches the field name directly.
This commit is contained in:
@@ -79,6 +79,45 @@ def test_language_parameter_mapped_to_languages():
|
||||
assert options.languages == ['eng', 'spa']
|
||||
|
||||
|
||||
def test_jpeg_quality_parameter_reaches_options():
|
||||
"""The canonical 'jpeg_quality' API parameter must reach OcrOptions.
|
||||
|
||||
Regression test for GitHub issue #1723: --jpeg-quality was silently
|
||||
dropped by the CLI's namespace_to_options() because the OcrOptions field
|
||||
was named jpg_quality. create_options(), used by the Python API, has the
|
||||
same field-name matching logic and is affected the same way when passed
|
||||
the alias name.
|
||||
"""
|
||||
from ocrmypdf.api import create_options, setup_plugin_infrastructure
|
||||
from ocrmypdf.cli import get_parser
|
||||
|
||||
setup_plugin_infrastructure()
|
||||
parser = get_parser()
|
||||
|
||||
options = create_options(
|
||||
input_file='test.pdf', output_file='output.pdf', parser=parser, jpeg_quality=10
|
||||
)
|
||||
assert options.jpeg_quality == 10
|
||||
|
||||
|
||||
def test_jpg_quality_parameter_deprecated_alias():
|
||||
"""The old 'jpg_quality' API parameter still works but warns."""
|
||||
from ocrmypdf.api import create_options, setup_plugin_infrastructure
|
||||
from ocrmypdf.cli import get_parser
|
||||
|
||||
setup_plugin_infrastructure()
|
||||
parser = get_parser()
|
||||
|
||||
with pytest.warns(UserWarning, match='jpg_quality'):
|
||||
options = create_options(
|
||||
input_file='test.pdf',
|
||||
output_file='output.pdf',
|
||||
parser=parser,
|
||||
jpg_quality=42,
|
||||
)
|
||||
assert options.jpeg_quality == 42
|
||||
|
||||
|
||||
def test_stream_api(resources: Path):
|
||||
in_ = (resources / 'graph.pdf').open('rb')
|
||||
out = BytesIO()
|
||||
|
||||
Reference in New Issue
Block a user