Skip to content

Commit 5642823

Browse files
committed
fix: handle MSSDK and bytes serialization in legacy package writing
- Exclude MSSDK collection assets from metadata JSON and convert bytes to base64 - Add None guards for transformation_rule_set and transformation_test_data
1 parent ea3ce50 commit 5642823

1 file changed

Lines changed: 24 additions & 7 deletions

File tree

src/ted_sws/data_manager/adapters/mapping_package_repository.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -285,25 +285,38 @@ def _write_package_metadata(self, mapping_package: MappingPackage):
285285
:param mapping_package:
286286
:return:
287287
"""
288-
def convert_paths(obj):
288+
import base64
289+
290+
def convert_for_json(obj):
291+
"""Convert non-JSON-serializable objects (Path, bytes) to serializable form."""
289292
if isinstance(obj, pathlib.Path):
290293
return str(obj)
294+
elif isinstance(obj, bytes):
295+
# Convert bytes to base64 string for JSON serialization
296+
return base64.b64encode(obj).decode('utf-8')
291297
elif isinstance(obj, dict):
292-
return {k: convert_paths(v) for k, v in obj.items()}
298+
return {k: convert_for_json(v) for k, v in obj.items()}
293299
elif isinstance(obj, list):
294-
return [convert_paths(i) for i in obj]
300+
return [convert_for_json(i) for i in obj]
295301
elif isinstance(obj, tuple):
296-
return tuple(convert_paths(i) for i in obj)
302+
return tuple(convert_for_json(i) for i in obj)
297303
else:
298304
return obj
299305

300306
package_path = self.repository_path / mapping_package.identifier
301307
package_path.mkdir(parents=True, exist_ok=True)
302308
metadata_path = package_path / MS_METADATA_FILE_NAME
303309
package_metadata = mapping_package.model_dump()
304-
[package_metadata.pop(key, None) for key in
305-
["transformation_rule_set", "shacl_test_suites", "sparql_test_suites"]]
306-
package_metadata = convert_paths(package_metadata)
310+
# Exclude legacy fields (written separately) and MSSDK collection asset fields (contain file content)
311+
fields_to_exclude = [
312+
"transformation_rule_set", "shacl_test_suites", "sparql_test_suites", # Legacy fields
313+
"technical_mapping_suite", "vocabulary_mapping_suite", # MSSDK - written separately
314+
"conceptual_mapping_asset", # MSSDK - bytes content (xlsx)
315+
"test_data_suites", "test_suites_sparql", "test_suites_shacl", "test_results", # MSSDK test suites
316+
]
317+
for key in fields_to_exclude:
318+
package_metadata.pop(key, None)
319+
package_metadata = convert_for_json(package_metadata)
307320
with metadata_path.open("w", encoding="utf-8") as f:
308321
f.write(json.dumps(package_metadata))
309322

@@ -371,6 +384,8 @@ def _write_package_transform_rules(self, mapping_package: MappingPackage):
371384
:param mapping_package:
372385
:return:
373386
"""
387+
if mapping_package.transformation_rule_set is None:
388+
return
374389
package_path = self.repository_path / mapping_package.identifier
375390
transform_path = package_path / MS_TRANSFORM_FOLDER_NAME
376391
mappings_path = transform_path / MS_MAPPINGS_FOLDER_NAME
@@ -418,6 +433,8 @@ def _write_test_data_package(self, mapping_package: MappingPackage):
418433
:param mapping_package:
419434
:return:
420435
"""
436+
if mapping_package.transformation_test_data is None:
437+
return
421438
package_path = self.repository_path / mapping_package.identifier
422439
test_data_path = package_path / MS_TEST_DATA_FOLDER_NAME
423440
test_data_path.mkdir(parents=True, exist_ok=True)

0 commit comments

Comments
 (0)