From f104aa7759ae1bec758f15d88834f5dd9df3fad7 Mon Sep 17 00:00:00 2001 From: CHISANW Date: Mon, 12 Oct 2026 11:22:50 +0900 Subject: [PATCH] fix: resolve native DOCX parsing failures with numbering overrides - Register the CTNumLvlImpl constructor for Windows, Linux, and macOS - Add regression tests for DOCX numbering overrides - Verify all four previously failing DOCX files on Windows - Pass 13 numbering tests and 7 Unicode regression tests --- .../tests/test_docx_numbering.py | 79 +++++++++++++++++++ .../reachability-metadata.json | 11 +++ .../reachability-metadata.json | 11 +++ .../reachability-metadata.json | 11 +++ 4 files changed, 112 insertions(+) create mode 100644 bindings/iscc-tika-python/tests/test_docx_numbering.py diff --git a/bindings/iscc-tika-python/tests/test_docx_numbering.py b/bindings/iscc-tika-python/tests/test_docx_numbering.py new file mode 100644 index 0000000..a1709f6 --- /dev/null +++ b/bindings/iscc-tika-python/tests/test_docx_numbering.py @@ -0,0 +1,79 @@ +"""Native-image regression: XMLBeans must construct CTNumLvlImpl for lvlOverride.""" +from io import BytesIO +from zipfile import ZIP_DEFLATED, ZipFile + +import pytest + +from iscc_tika import Extractor + +W = "http://schemas.openxmlformats.org/wordprocessingml/2006/main" + + +def numbering_docx(override): + """Small self-contained document; no copied public document or image assets.""" + parts = { + "[Content_Types].xml": ''' + + + + + ''', + "_rels/.rels": ''' + + ''', + "word/_rels/document.xml.rels": ''' + + ''', + "word/document.xml": f''' + First numbered item + Second numbered item + + ''', + "word/numbering.xml": f''' + + {override} + ''', + } + output = BytesIO() + with ZipFile(output, "w", ZIP_DEFLATED) as archive: + for name, text in parts.items(): + archive.writestr(name, text.encode("utf-8")) + return output.getvalue() + + +@pytest.mark.parametrize("override", [ + "", + '', + '', + '', + '', +]) +@pytest.mark.parametrize("as_xml", [False, True]) +def test_docx_numbering_overrides(override, as_xml, tmp_path): + data = numbering_docx(override) + path = tmp_path / "numbering-overrides.docx" + path.write_bytes(data) + extractor = Extractor().set_xml_output(as_xml) + for text, metadata in ( + extractor.extract_file_to_string(str(path)), + extractor.extract_bytes_to_string(bytearray(data)), + ): + assert "First numbered item" in text + assert "Second numbered item" in text + assert metadata["Content-Type"] == [ + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ] + + +@pytest.mark.parametrize("platform", ["windows", "linux", "macos"]) +def test_numbering_override_constructor_registered(platform): + """Check every native build target, even when pytest runs on just one OS.""" + import json + from pathlib import Path + + root = Path(__file__).resolve().parents[3] + file = root / "iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika" / f"tika-3.3.2-{platform}/reachability-metadata.json" + entries = json.loads(file.read_text(encoding="utf-8"))["reflection"] + entry = next(x for x in entries if x["type"] == + "org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTNumLvlImpl") + assert {"name": "", "parameterTypes": ["org.apache.xmlbeans.SchemaType"]} in entry["methods"] diff --git a/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-linux/reachability-metadata.json b/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-linux/reachability-metadata.json index 7ec6734..c170a99 100644 --- a/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-linux/reachability-metadata.json +++ b/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-linux/reachability-metadata.json @@ -4246,6 +4246,17 @@ ], "type": "org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTNumImpl" }, + { + "methods": [ + { + "name": "", + "parameterTypes": [ + "org.apache.xmlbeans.SchemaType" + ] + } + ], + "type": "org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTNumLvlImpl" + }, { "methods": [ { diff --git a/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-macos/reachability-metadata.json b/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-macos/reachability-metadata.json index c3dc79d..48a86ff 100644 --- a/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-macos/reachability-metadata.json +++ b/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-macos/reachability-metadata.json @@ -4347,6 +4347,17 @@ ], "type": "org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTNumImpl" }, + { + "methods": [ + { + "name": "", + "parameterTypes": [ + "org.apache.xmlbeans.SchemaType" + ] + } + ], + "type": "org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTNumLvlImpl" + }, { "methods": [ { diff --git a/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-windows/reachability-metadata.json b/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-windows/reachability-metadata.json index c2206c3..6bea153 100644 --- a/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-windows/reachability-metadata.json +++ b/iscc-tika-core/tika-native/src/main/resources/META-INF/io.iscc.tika/tika-3.3.2-windows/reachability-metadata.json @@ -4448,6 +4448,17 @@ ], "type": "org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTNumImpl" }, + { + "methods": [ + { + "name": "", + "parameterTypes": [ + "org.apache.xmlbeans.SchemaType" + ] + } + ], + "type": "org.openxmlformats.schemas.wordprocessingml.x2006.main.impl.CTNumLvlImpl" + }, { "methods": [ {