diff --git a/capella2polarion/converters/data_session.py b/capella2polarion/converters/data_session.py index 46ef2914..5b9e6282 100644 --- a/capella2polarion/converters/data_session.py +++ b/capella2polarion/converters/data_session.py @@ -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] diff --git a/capella2polarion/converters/element_converter.py b/capella2polarion/converters/element_converter.py index af7a492a..70df813a 100644 --- a/capella2polarion/converters/element_converter.py +++ b/capella2polarion/converters/element_converter.py @@ -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.""" @@ -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 @@ -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( @@ -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) @@ -341,8 +335,8 @@ 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 @@ -350,8 +344,8 @@ def _get_requirement_types_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