Skip to content

fix: use EdifactFormat as type for the format property of AHB & MIG #129

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 17, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/fundamend/models/anwendungshandbuch.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@

from datetime import date

from efoli import EdifactFormat

from fundamend.models.base import FundamendBaseModel


Expand Down Expand Up @@ -128,7 +130,7 @@ class Anwendungsfall(FundamendBaseModel):
pruefidentifikator: str #: e.g. '25001'
beschreibung: str #: e.g. 'Berechnungsformel'
kommunikation_von: str #: e.g. 'NB an MSB / LF'
format: str #: e.g. 'UTILTS'
format: EdifactFormat #: e.g. 'UTILTS'
elements: tuple[Segment | SegmentGroup, ...]

@property
Expand Down
4 changes: 3 additions & 1 deletion src/fundamend/models/messageimplementationguide.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
from datetime import date
from enum import StrEnum

from efoli import EdifactFormat

from .base import FundamendBaseModel

# I didn't invent the data model ;)
Expand Down Expand Up @@ -168,6 +170,6 @@ class MessageImplementationGuide(FundamendBaseModel):
versionsnummer: str
"""e.g. '1.1c'"""

format: str #: e.g. 'UTILTS'
format: EdifactFormat #: e.g. 'UTILTS'

elements: tuple[Segment | SegmentGroup, ...]
6 changes: 5 additions & 1 deletion src/fundamend/reader/ahbreader.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
from datetime import date, datetime
from pathlib import Path

from efoli import EdifactFormat

from fundamend.models.anwendungshandbuch import (
Anwendungsfall,
Anwendungshandbuch,
Expand Down Expand Up @@ -249,11 +251,13 @@ def _read_anwendungsfall(self, original_element: ET.Element) -> Anwendungsfall:
format_element = original_element[0]
if _is_uebertragungsdatei(format_element):
format_element = original_element[0][0]
if not format_element.tag.startswith("M_"):
format_element = next((child for child in original_element[0] if child.tag.startswith("M_")))
return Anwendungsfall(
pruefidentifikator=original_element.attrib["Pruefidentifikator"],
beschreibung=original_element.attrib["Beschreibung"],
kommunikation_von=original_element.attrib["Kommunikation_von"],
format=lstrip("M_", format_element.tag),
format=EdifactFormat(lstrip("M_", format_element.tag)),
elements=tuple(segments_and_groups),
)

Expand Down
6 changes: 4 additions & 2 deletions src/fundamend/reader/migreader.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
from datetime import date, datetime
from pathlib import Path

from efoli import EdifactFormat

from fundamend.models.messageimplementationguide import (
Code,
DataElement,
Expand Down Expand Up @@ -160,12 +162,12 @@ def get_version(self) -> str:
root = self._element_tree.getroot() # might be either <M_FORMAT> or <Uebertragungsdatei>
return root.attrib["Versionsnummer"]

def get_format(self) -> str:
def get_format(self) -> EdifactFormat:
"""returns the format of the message implementation guide, e.g. 'UTILTS'"""
root = self._element_tree.getroot()
if _is_uebertragungsdatei(root):
root = _get_first_tag_starting_with_m(root)
return lstrip("M_", root.tag) # converts 'M_UTILTS' to 'UTILTS'
return EdifactFormat(lstrip("M_", root.tag)) # converts 'M_UTILTS' to 'UTILTS'

def _iter_segments_and_segment_groups(self, element: ET.Element) -> list[SegmentGroup | Segment]:
"""recursive function that builds a list of all segments and segment groups"""
Expand Down
4 changes: 2 additions & 2 deletions src/fundamend/sqlmodels/anwendungshandbuch.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from typing import Optional, Union
from uuid import UUID

from efoli import EdifactFormatVersion
from efoli import EdifactFormat, EdifactFormatVersion

# pylint: disable=too-few-public-methods, duplicate-code, missing-function-docstring

Expand Down Expand Up @@ -338,7 +338,7 @@ class Anwendungsfall(SQLModel, table=True):
pruefidentifikator: str = Field(index=True) #: e.g. '25001'
beschreibung: str = Field(index=True) #: e.g. 'Berechnungsformel'
kommunikation_von: str #: e.g. 'NB an MSB / LF'
format: str = Field(index=True) #: e.g. 'UTILTS'
format: EdifactFormat = Field(index=True) #: e.g. 'UTILTS'
segments: list[Segment] = Relationship(back_populates="anwendungsfall")
segment_groups: list[SegmentGroup] = Relationship(back_populates="anwendungsfall")
position: Optional[int] = Field(default=None, index=True)
Expand Down
2 changes: 1 addition & 1 deletion src/fundamend/sqlmodels/expression_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ class AhbExpression(SQLModel, table=True):
)
id: uuid.UUID = Field(primary_key=True, default_factory=uuid.uuid4)
edifact_format_version: EdifactFormatVersion = Field(index=True)
format: str = Field(index=True) # the edifact format, e.g. 'UTILMD'
format: EdifactFormat = Field(index=True) # the edifact format, e.g. 'UTILMD'
# expressions and conditions are always interpreted on a per-format basis (no pruefidentifikator required)
expression: str = Field(index=True) #: e.g 'Muss [1] U [2]'
node_texts: str = Field()
Expand Down
6 changes: 3 additions & 3 deletions unittests/__snapshots__/test_ahbreader.ambr

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions unittests/__snapshots__/test_migreader.ambr

Large diffs are not rendered by default.