Skip to content
Open
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
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ coverage = [
"coverage==7.13.4"
]
formatting = [
"black==25.12.0",
"black==26.1.0",
"isort==8.0.1"
]
linting = [
Expand Down
6 changes: 3 additions & 3 deletions src/fundamend/reader/ahbreader.py
Original file line number Diff line number Diff line change
Expand Up @@ -189,17 +189,17 @@ def get_version(self) -> str:

def get_bedingungen(self) -> list[Bedingung]:
"""returns the plain bedingungen"""
return [_to_bedingung(x) for x in self._element_tree.getroot().find("Bedingungen")] # type:ignore[union-attr]
return [_to_bedingung(x) for x in self._element_tree.getroot().find("Bedingungen")] # type: ignore[union-attr]

def get_ub_bedingungen(self) -> list[UbBedingung]:
"""returns the UB Bedingungen"""
return [
_to_ub_bedingung(x) for x in self._element_tree.getroot().find("UB_Bedingungen") # type:ignore[union-attr]
_to_ub_bedingung(x) for x in self._element_tree.getroot().find("UB_Bedingungen") # type: ignore[union-attr]
]

def get_pakete(self) -> list[Paket]:
"""returns the package definitions"""
return [_to_paket(x) for x in self._element_tree.getroot().find("Pakete")] # type:ignore[union-attr]
return [_to_paket(x) for x in self._element_tree.getroot().find("Pakete")] # type: ignore[union-attr]

def get_anwendungsfall(self, pruefidentifikator: str) -> Anwendungsfall | None:
"""find the anwendungsfall matching the pruefidentifikator or return None"""
Expand Down
2 changes: 1 addition & 1 deletion src/fundamend/sqlmodels/ahbtabellen_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def create_ahbtabellen_view(session: Session) -> None:
"""
_execute_bare_sql(session=session, path_to_sql_commands=Path(__file__).parent / "create_ahbtabellen_view.sql")
number_of_rows = session.scalar(
select(func.count(AhbTabellenLine.id)) # type:ignore[arg-type] # pylint:disable=not-callable
select(func.count(AhbTabellenLine.id)) # type: ignore[arg-type] # pylint:disable=not-callable
)
_logger.info(
"There are %d rows in the AHBTabellen view %s",
Expand Down
2 changes: 1 addition & 1 deletion src/fundamend/sqlmodels/ahbview.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ def create_ahb_view(session: Session) -> None:
_execute_bare_sql(session=session, path_to_sql_commands=Path(__file__).parent / "materialize_ahb_view.sql")

number_of_inserted_rows = session.scalar(
select(func.count(AhbHierarchyMaterialized.id)) # type:ignore[arg-type] # pylint:disable=not-callable #
select(func.count(AhbHierarchyMaterialized.id)) # type: ignore[arg-type] # pylint:disable=not-callable #
)
_logger.info(
"Inserted %d rows into the materialized view %s",
Expand Down
6 changes: 3 additions & 3 deletions src/fundamend/sqlmodels/anwendungshandbuch.py
Original file line number Diff line number Diff line change
Expand Up @@ -223,7 +223,7 @@ def to_model(self) -> PydanticSegment:
data_elements=tuple(
x.to_model()
for x in sorted(
(self.data_elements or []) + (self.data_element_groups or []), # type:ignore[operator]
(self.data_elements or []) + (self.data_element_groups or []), # type: ignore[operator]
key=lambda y: y.position or 0,
)
),
Expand Down Expand Up @@ -316,7 +316,7 @@ def to_model(self) -> PydanticSegmentGroup:
elements=tuple(
x.to_model()
for x in sorted(
(self.segments or []) + (self.segment_groups or []), # type:ignore[operator]
(self.segments or []) + (self.segment_groups or []), # type: ignore[operator]
key=lambda y: y.position or 0,
)
),
Expand Down Expand Up @@ -392,7 +392,7 @@ def to_model(self) -> PydanticAnwendungsfall:
elements=tuple(
x.to_model()
for x in sorted(
((self.segments or []) + (self.segment_groups or [])), # type:ignore[operator]
((self.segments or []) + (self.segment_groups or [])), # type: ignore[operator]
key=lambda y: y.position or 0,
)
),
Expand Down
6 changes: 3 additions & 3 deletions src/fundamend/sqlmodels/expression_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,9 +170,9 @@ def create_and_fill_ahb_expression_table(session: Session, use_cpu_intensive_val
ahb_status_col,
AhbHierarchyMaterialized.anwendungshandbuch_primary_key,
)
rows.extend(session.exec(stmt)) # type:ignore[arg-type]
rows.extend(session.exec(stmt)) # type: ignore[arg-type]
non_empty_rows: list[tuple[EdifactFormatVersion, str, str, uuid.UUID]] = [
r for r in rows if r[2] is not None and r[0] is not None and r[2].strip() # type:ignore[misc]
r for r in rows if r[2] is not None and r[0] is not None and r[2].strip() # type: ignore[misc]
]
if not any(rows):
raise ValueError(
Expand All @@ -184,7 +184,7 @@ def create_and_fill_ahb_expression_table(session: Session, use_cpu_intensive_val
row
for row in non_empty_rows
if (key := (row[0], row[1], row[2].strip())) not in seen
and not seen.add(key) # type:ignore[ func-returns-value]
and not seen.add(key) # type: ignore[ func-returns-value]
]
ahb_expression_rows: list[AhbExpression] = []
for row in unique_rows: # there are ~3600 unique rows for FV2410+FV2504 as of 2025-04-15
Expand Down
6 changes: 3 additions & 3 deletions src/fundamend/sqlmodels/messageimplementationguide.py
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ def to_model(self) -> PydanticSegment:
data_elements=tuple(
x.to_model()
for x in sorted(
(self.data_elements or []) + (self.data_element_groups or []), # type:ignore[operator]
(self.data_elements or []) + (self.data_element_groups or []), # type: ignore[operator]
key=lambda y: y.position or 0,
)
),
Expand Down Expand Up @@ -342,7 +342,7 @@ def to_model(self) -> PydanticSegmentGroup:
elements=tuple(
x.to_model()
for x in sorted(
(self.segments or []) + (self.segment_groups or []), # type:ignore[operator]
(self.segments or []) + (self.segment_groups or []), # type: ignore[operator]
key=lambda y: y.position or 0,
)
),
Expand Down Expand Up @@ -416,7 +416,7 @@ def to_model(self) -> PydanticMessageImplementationGuide:
elements=tuple(
x.to_model()
for x in sorted(
((self.segments or []) + (self.segment_groups or [])), # type:ignore[operator]
((self.segments or []) + (self.segment_groups or [])), # type: ignore[operator]
key=lambda y: y.position or 0,
)
),
Expand Down
40 changes: 10 additions & 30 deletions unittests/test_ahb_diff_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,18 +79,14 @@ def test_diff_view_no_duplicate_id_paths(session_fv2410_fv2504_with_diff_view: S
Test that there are no duplicate id_paths for the same version pair comparison.
Each id_path should appear exactly once in the diff results.
"""
result = session_fv2410_fv2504_with_diff_view.execute(
text(
"""
result = session_fv2410_fv2504_with_diff_view.execute(text("""
SELECT id_path, COUNT(*) as cnt
FROM v_ahb_diff
WHERE old_format_version = 'FV2410' AND new_format_version = 'FV2504'
AND old_pruefidentifikator = '55109' AND new_pruefidentifikator = '55109'
GROUP BY id_path
HAVING COUNT(*) > 1
"""
)
)
"""))
duplicates = list(result)
assert len(duplicates) == 0, f"Found duplicate id_paths in diff results: {duplicates[:5]}"

Expand All @@ -100,9 +96,7 @@ def test_diff_view_added_rows_have_null_old_columns(session_fv2410_fv2504_with_d
Test that 'added' rows have NULL values for old_* columns and populated new_* columns.
This verifies the SQL is correctly setting NULL for the old version.
"""
result = session_fv2410_fv2504_with_diff_view.execute(
text(
"""
result = session_fv2410_fv2504_with_diff_view.execute(text("""
SELECT
SUM(CASE WHEN old_segment_code IS NOT NULL THEN 1 ELSE 0 END) as old_segment_not_null,
SUM(CASE WHEN old_line_ahb_status IS NOT NULL THEN 1 ELSE 0 END) as old_status_not_null,
Expand All @@ -111,9 +105,7 @@ def test_diff_view_added_rows_have_null_old_columns(session_fv2410_fv2504_with_d
WHERE old_format_version = 'FV2410' AND new_format_version = 'FV2504'
AND old_pruefidentifikator = '55109' AND new_pruefidentifikator = '55109'
AND diff_status = 'added'
"""
)
)
"""))
row = list(result)[0]
assert row[0] == 0, "Added rows should have NULL old_segment_code"
assert row[1] == 0, "Added rows should have NULL old_line_ahb_status"
Expand All @@ -125,9 +117,7 @@ def test_diff_view_deleted_rows_have_null_new_columns(session_fv2410_fv2504_with
Test that 'deleted' rows have NULL values for new_* columns and populated old_* columns.
This verifies the SQL is correctly setting NULL for the new version.
"""
result = session_fv2410_fv2504_with_diff_view.execute(
text(
"""
result = session_fv2410_fv2504_with_diff_view.execute(text("""
SELECT
SUM(CASE WHEN new_segment_code IS NOT NULL THEN 1 ELSE 0 END) as new_segment_not_null,
SUM(CASE WHEN new_line_ahb_status IS NOT NULL THEN 1 ELSE 0 END) as new_status_not_null,
Expand All @@ -136,9 +126,7 @@ def test_diff_view_deleted_rows_have_null_new_columns(session_fv2410_fv2504_with
WHERE old_format_version = 'FV2410' AND new_format_version = 'FV2504'
AND old_pruefidentifikator = '55109' AND new_pruefidentifikator = '55109'
AND diff_status = 'deleted'
"""
)
)
"""))
row = list(result)[0]
assert row[0] == 0, "Deleted rows should have NULL new_segment_code"
assert row[1] == 0, "Deleted rows should have NULL new_line_ahb_status"
Expand All @@ -150,18 +138,14 @@ def test_diff_view_modified_rows_have_actual_differences(session_fv2410_fv2504_w
Test that 'modified' rows actually have differences in at least one compared field.
This verifies the CASE statement logic is correct.
"""
result = session_fv2410_fv2504_with_diff_view.execute(
text(
"""
result = session_fv2410_fv2504_with_diff_view.execute(text("""
SELECT id_path, old_line_ahb_status, new_line_ahb_status,
old_line_name, new_line_name, old_bedingung, new_bedingung
FROM v_ahb_diff
WHERE old_format_version = 'FV2410' AND new_format_version = 'FV2504'
AND old_pruefidentifikator = '55109' AND new_pruefidentifikator = '55109'
AND diff_status = 'modified'
"""
)
)
"""))
for row in result:
id_path, old_status, new_status, old_name, new_name, old_bed, new_bed = row
# At least one of status, name, or bedingung must be different
Expand All @@ -175,15 +159,11 @@ def test_diff_view_nonexistent_pruefi_returns_empty(session_fv2410_fv2504_with_d
"""
Test that querying a non-existent prüfidentifikator returns empty results.
"""
result = session_fv2410_fv2504_with_diff_view.execute(
text(
"""
result = session_fv2410_fv2504_with_diff_view.execute(text("""
SELECT COUNT(*) FROM v_ahb_diff
WHERE old_format_version = 'FV2410' AND new_format_version = 'FV2504'
AND old_pruefidentifikator = '99999' AND new_pruefidentifikator = '99999'
"""
)
)
"""))
count = list(result)[0][0]
assert count == 0, "Non-existent prüfi should return no results"

Expand Down
2 changes: 1 addition & 1 deletion unittests/test_pydantic_features.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ def test_json_dump(model: Anwendungshandbuch | MessageImplementationGuide) -> No
if isinstance(model, Anwendungshandbuch):
root_model = RootModel[Anwendungshandbuch](model)
elif isinstance(model, MessageImplementationGuide):
root_model = RootModel[MessageImplementationGuide](model) # type:ignore[assignment]
root_model = RootModel[MessageImplementationGuide](model) # type: ignore[assignment]
else:
raise ValueError(f"Unexpected type: {model}")
json_dict = root_model.model_dump(mode="json")
Expand Down
Loading