From a4e0d0222d7407dc51a1a045a04f194dcbfbafa9 Mon Sep 17 00:00:00 2001 From: JavithNaseem-J Date: Fri, 23 Oct 2026 11:15:29 +0530 Subject: [PATCH] adapter.aasx: Skip conflicting files in failsafe mode --- sdk/basyx/aas/adapter/aasx.py | 1 + sdk/test/adapter/aasx/test_aasx.py | 53 ++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) diff --git a/sdk/basyx/aas/adapter/aasx.py b/sdk/basyx/aas/adapter/aasx.py index bbbfac955..03fb35ab5 100644 --- a/sdk/basyx/aas/adapter/aasx.py +++ b/sdk/basyx/aas/adapter/aasx.py @@ -782,6 +782,7 @@ def _collect_supplementary_file(file_name: str) -> None: f"Trying to write supplementary file {file_name} to AASX " f"twice with different contents" ) + continue else: raise ValueError( f"Trying to write supplementary file {file_name} to AASX twice with" diff --git a/sdk/test/adapter/aasx/test_aasx.py b/sdk/test/adapter/aasx/test_aasx.py index 8560513a9..7bccde78e 100644 --- a/sdk/test/adapter/aasx/test_aasx.py +++ b/sdk/test/adapter/aasx/test_aasx.py @@ -11,6 +11,7 @@ import tempfile import unittest import warnings +import zipfile from pathlib import Path import pyecma376_2 @@ -228,6 +229,58 @@ def test_writing_file_twice(self) -> None: with aasx.AASXWriter(tmpdir_path / "tmp.aasx") as writer: writer.write_all_aas_objects("/aasx/data.xml", data, file_store) + def test_writing_conflicting_file_twice(self) -> None: + def create_store( + identifier: str, content: bytes + ) -> tuple[ + model.DictIdentifiableStore[model.Identifiable], + aasx.DictSupplementaryFileContainer, + ]: + submodel = model.Submodel( + id_=identifier, + submodel_element=[ + model.File( + id_short="ExampleFile", + content_type="application/pdf", + value="/aasx/manual.pdf", + ) + ], + ) + files = aasx.DictSupplementaryFileContainer() + files.add_file("/aasx/manual.pdf", io.BytesIO(content), "application/pdf") + return model.DictIdentifiableStore([submodel]), files + + with tempfile.TemporaryDirectory() as tmpdir: + tmpdir_path = Path(tmpdir) + with self.assertLogs(level="ERROR") as log: + with aasx.AASXWriter( + tmpdir_path / "failsafe.aasx", failsafe=True + ) as writer: + writer.write_all_aas_objects( + "/aasx/a.xml", *create_store("urn:sm:1", b"AAA") + ) + writer.write_all_aas_objects( + "/aasx/b.xml", *create_store("urn:sm:2", b"BBB") + ) + + self.assertTrue( + any("twice with different contents" in entry for entry in log.output) + ) + with zipfile.ZipFile(tmpdir_path / "failsafe.aasx") as archive: + self.assertEqual(archive.namelist().count("aasx/manual.pdf"), 1) + self.assertEqual(archive.read("aasx/manual.pdf"), b"AAA") + + with self.assertRaisesRegex(ValueError, "twice with different contents"): + with aasx.AASXWriter( + tmpdir_path / "strict.aasx", failsafe=False + ) as writer: + writer.write_all_aas_objects( + "/aasx/a.xml", *create_store("urn:sm:1", b"AAA") + ) + writer.write_all_aas_objects( + "/aasx/b.xml", *create_store("urn:sm:2", b"BBB") + ) + def test_write_non_aas(self) -> None: with tempfile.TemporaryDirectory() as tmpdir: tmpdir_path = Path(tmpdir)