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:
@@ -17,6 +17,7 @@ from PIL import Image, ImageDraw
|
||||
from ocrmypdf import optimize as opt
|
||||
from ocrmypdf._exec import jbig2enc, pngquant
|
||||
from ocrmypdf._exec.ghostscript import rasterize_pdf
|
||||
from ocrmypdf.cli import get_options_and_plugins
|
||||
from ocrmypdf.helpers import IMG2PDF_KWARGS, Resolution
|
||||
from ocrmypdf.optimize import PdfImage, extract_image_filter
|
||||
from ocrmypdf.pluginspec import GhostscriptRasterDevice
|
||||
@@ -81,6 +82,28 @@ def test_jpg_png_params(resources, outpdf):
|
||||
)
|
||||
|
||||
|
||||
def test_jpeg_quality_cli_flag_reaches_options(resources, outpdf):
|
||||
# Regression test for #1723: --jpeg-quality was silently dropped by
|
||||
# namespace_to_options() because the argparse dest ('jpeg_quality') did
|
||||
# not match the OcrOptions field it was checked against.
|
||||
input_ = fspath(resources / 'c02-22.pdf')
|
||||
options, _pm = get_options_and_plugins(
|
||||
['--jpeg-quality', '10', input_, fspath(outpdf)]
|
||||
)
|
||||
assert options.jpeg_quality == 10
|
||||
|
||||
|
||||
def test_jpg_quality_cli_alias_reaches_options(resources, outpdf):
|
||||
# --jpg-quality is a hidden alias for --jpeg-quality (same argparse dest).
|
||||
input_ = fspath(resources / 'c02-22.pdf')
|
||||
options, _pm = get_options_and_plugins(
|
||||
['--jpg-quality', '42', input_, fspath(outpdf)]
|
||||
)
|
||||
assert options.jpeg_quality == 42
|
||||
# The old field name is still readable as a deprecated compatibility alias.
|
||||
assert options.jpg_quality == 42
|
||||
|
||||
|
||||
@needs_jbig2enc
|
||||
def test_jbig2_lossless(resources, outpdf):
|
||||
"""Test that JBIG2 lossless encoding works without JBIG2Globals."""
|
||||
|
||||
Reference in New Issue
Block a user