Skip to content

Commit

Permalink
refactor(converter): Gather serialization errors in ConverterData
Browse files Browse the repository at this point in the history
  • Loading branch information
ewuerger committed Feb 27, 2024
1 parent 0279eb1 commit ff4d3e3
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 20 deletions.
1 change: 1 addition & 0 deletions capella2polarion/converters/data_session.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class ConverterData:
capella_element: diagram.Diagram | common.GenericElement
work_item: dm.CapellaWorkItem | None = None
description_references: list[str] = dataclasses.field(default_factory=list)
errors: set[str] = dataclasses.field(default_factory=set)


ConverterSession = dict[str, ConverterData]
34 changes: 14 additions & 20 deletions capella2polarion/converters/element_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ def __init__(
self.capella_polarion_mapping = capella_polarion_mapping
self.converter_session = converter_session
self.generate_attachments = generate_attachments
self.non_existing: dict[str, set[str]] = {}

def serialize_all(self) -> list[data_models.CapellaWorkItem]:
"""Serialize all items of the converter_session."""
Expand All @@ -142,16 +141,12 @@ def serialize(self, uuid: str) -> data_models.CapellaWorkItem | None:
] = getattr(self, f"_{converter}")
serializer(converter_data, **params)
except Exception as error:
logger.error(
"Serializing model element %r failed. %s",
uuid,
error.args[0],
)
converter_data.errors.add(error.args[0])
converter_data.work_item = None
return None # Force to not overwrite on failure
assert converter_data.work_item is not None
for finding in self.non_existing.get(uuid, []):
logger.warning("Found %s (%r)", finding, uuid)
for finding in converter_data.errors:
logger.warning("Serialization failed: %s (%r).", finding, uuid)
return converter_data.work_item

# General helper functions
Expand Down Expand Up @@ -295,10 +290,9 @@ def repair_images(node: etree._Element) -> None:
node.attrib["src"] = f"workitemimg:{file_name}"

except FileNotFoundError:
logger.error(
"Inline image can't be found from %r for %r",
file_path,
obj._short_repr_(),
self.converter_session[obj.uuid].errors.add(
f"Inline image can't be found from {file_path!r} "
f"for {obj._short_repr_()!r}"
)

repaired_markup = chelpers.process_html_fragments(
Expand All @@ -321,16 +315,16 @@ def _replace_markup(
try:
self.model.by_uuid(uuid)
except KeyError:
self.non_existing.setdefault(uuid, set()).add(
"reference in description"
self.converter_session[uuid].errors.add(
"Non-existing model element referenced in description"
)
return strike_through(match.group(default_group))
if pid := self.capella_polarion_mapping.get_work_item_id(uuid):
referenced_uuids.append(uuid)
return POLARION_WORK_ITEM_URL.format(pid=pid)

self.non_existing.setdefault(uuid, set()).add(
"reference in description"
self.converter_session[uuid].errors.add(
"Non-existing work item referenced in description"
)
return match.group(default_group)

Expand All @@ -341,17 +335,17 @@ def _get_requirement_types_text(
type_texts = collections.defaultdict(list)
for req in getattr(obj, "requirements", []):
if req is None:
self.non_existing.setdefault(obj.uuid, set()).add(
"RequirementsRelation with broken target"
self.converter_session[obj.uuid].errors.add(
"Found RequirementsRelation with broken target"
)
continue

if not (req.type and req.text):
identifier = (
req.long_name or req.name or req.summary or req.uuid
)
self.non_existing.setdefault(obj.uuid, set()).add(
f"Requirement without text or type on {identifier!r}"
self.converter_session[obj.uuid].errors.add(
f"Found Requirement without text or type on {identifier!r}"
)
continue

Expand Down

0 comments on commit ff4d3e3

Please sign in to comment.