From ff0b89172ef926a2d9ab0cc47573ba94497f2a94 Mon Sep 17 00:00:00 2001 From: konstantin Date: Sun, 12 Apr 2026 17:53:42 +0000 Subject: [PATCH 1/4] feat: upgrade to ahbicht v2.0.0, remove inject dependency - Remove inject, EvaluatableDataProvider, TokenLogicProvider, SingletonTokenLogicProvider, create_content_evaluation_result_based_evaluators imports from expression_view.py - Remove _setup_weird_ahbicht_dependency_injection() function entirely - Update is_valid_expression call to use new format params instead of setter callback - Bump ahbicht dep to >=2.0.0 Co-Authored-By: Claude Opus 4.6 (1M context) --- pyproject.toml | 2 +- src/fundamend/sqlmodels/expression_view.py | 45 ++-------------------- 2 files changed, 5 insertions(+), 42 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 95d4aca..aa5f6d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ sqlmodels = [ "sqlalchemy[mypy]>=2.0.37" ] ahbicht = [ - "ahbicht>=1.0.0,<2" + "ahbicht>=2.0.0" ] coverage = [ "coverage==7.13.5" diff --git a/src/fundamend/sqlmodels/expression_view.py b/src/fundamend/sqlmodels/expression_view.py index 9f36b04..b12142b 100644 --- a/src/fundamend/sqlmodels/expression_view.py +++ b/src/fundamend/sqlmodels/expression_view.py @@ -5,7 +5,6 @@ import asyncio import logging import uuid -from contextvars import ContextVar from typing import Optional from efoli import EdifactFormat, EdifactFormatVersion @@ -24,13 +23,9 @@ try: - import inject - from ahbicht.content_evaluation.evaluationdatatypes import EvaluatableData, EvaluatableDataProvider - from ahbicht.content_evaluation.evaluator_factory import create_content_evaluation_result_based_evaluators + from ahbicht.content_evaluation.ahb_context import AhbContext from ahbicht.content_evaluation.expression_check import is_valid_expression - from ahbicht.content_evaluation.token_logic_provider import SingletonTokenLogicProvider, TokenLogicProvider from ahbicht.expressions.condition_expression_parser import extract_categorized_keys - from ahbicht.models.content_evaluation_result import ContentEvaluationResult from lark.exceptions import VisitError except ImportError as import_error: import_error.msg += "; Did you install fundamend[sqlmodels,ahbicht]?" @@ -39,39 +34,6 @@ _logger = logging.getLogger(__name__) -_content_evaluation_result: ContextVar[Optional[ContentEvaluationResult]] = ContextVar( - "_content_evaluation_result", default=None -) - - -def _get_evaluatable_data() -> EvaluatableData[ContentEvaluationResult]: - """ - returns the _content_evaluation_result context var value wrapped in a EvaluatableData container. - This is the kind of data that the ContentEvaluationResultBased RC/FC Evaluators, HintsProvider and Package Resolver - require. - :return: - """ - cer = _content_evaluation_result.get() - assert cer is not None - return EvaluatableData( - body=cer, - edifact_format=EdifactFormat.UTILMD, # not important, something has to be here - edifact_format_version=EdifactFormatVersion.FV2504, # not important, something has to be here - ) - - -def _setup_weird_ahbicht_dependency_injection() -> None: - def configure(binder: inject.Binder) -> None: - binder.bind( - TokenLogicProvider, - SingletonTokenLogicProvider( - [*create_content_evaluation_result_based_evaluators(EdifactFormat.UTILMD, EdifactFormatVersion.FV2504)] - ), - ) - binder.bind_to_provider(EvaluatableDataProvider, _get_evaluatable_data) - - inject.configure_once(configure) - def _generate_node_texts(session: Session, expression: str, ahb_pk: uuid.UUID) -> str: categorized_key_extract = asyncio.run(extract_categorized_keys(expression)) @@ -120,7 +82,9 @@ def _get_validity_node_texts_and_error_message_cpu_intensive( expression: str, session: Session, anwendungshandbuch_pk: uuid.UUID ) -> tuple[bool, str, str | None]: try: - is_valid, error_message = asyncio.run(is_valid_expression(expression, _content_evaluation_result.set)) + is_valid, error_message = asyncio.run( + is_valid_expression(expression, EdifactFormat.UTILMD, EdifactFormatVersion.FV2504) + ) if is_valid: # we might actually get a meaningful node_texts even for invalid expressions, but I don't like it node_texts = _generate_node_texts(session, expression, anwendungshandbuch_pk) else: @@ -157,7 +121,6 @@ def create_and_fill_ahb_expression_table(session: Session, use_cpu_intensive_val outcomes. This leads to only few additional expressions marked as invalid but is very slow. """ rows: list[tuple[EdifactFormatVersion | None, str, str | None, uuid.UUID]] = [] - _setup_weird_ahbicht_dependency_injection() for ahb_status_col in [ AhbHierarchyMaterialized.segmentgroup_ahb_status, AhbHierarchyMaterialized.segment_ahb_status, From 92864568f50edf4ea808e7eb1ac8a4de90e42324 Mon Sep 17 00:00:00 2001 From: konstantin Date: Sun, 12 Apr 2026 17:55:25 +0000 Subject: [PATCH 2/4] fix: address reviewer feedback on ahbicht v2 upgrade - Remove unused AhbContext import - Fix unbound is_valid variable in except branch - Pass actual format/version from row data instead of hardcoding UTILMD Co-Authored-By: Claude Opus 4.6 (1M context) --- src/fundamend/sqlmodels/expression_view.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/fundamend/sqlmodels/expression_view.py b/src/fundamend/sqlmodels/expression_view.py index b12142b..45eaa46 100644 --- a/src/fundamend/sqlmodels/expression_view.py +++ b/src/fundamend/sqlmodels/expression_view.py @@ -23,7 +23,6 @@ try: - from ahbicht.content_evaluation.ahb_context import AhbContext from ahbicht.content_evaluation.expression_check import is_valid_expression from ahbicht.expressions.condition_expression_parser import extract_categorized_keys from lark.exceptions import VisitError @@ -79,17 +78,24 @@ def _generate_node_texts(session: Session, expression: str, ahb_pk: uuid.UUID) - def _get_validity_node_texts_and_error_message_cpu_intensive( - expression: str, session: Session, anwendungshandbuch_pk: uuid.UUID + expression: str, + session: Session, + anwendungshandbuch_pk: uuid.UUID, + edifact_format: EdifactFormat, + edifact_format_version: EdifactFormatVersion, ) -> tuple[bool, str, str | None]: + is_valid = True # default: assume valid unless proven otherwise + error_message: str | None = None try: is_valid, error_message = asyncio.run( - is_valid_expression(expression, EdifactFormat.UTILMD, EdifactFormatVersion.FV2504) + is_valid_expression(expression, edifact_format, edifact_format_version) ) if is_valid: # we might actually get a meaningful node_texts even for invalid expressions, but I don't like it node_texts = _generate_node_texts(session, expression, anwendungshandbuch_pk) else: node_texts = "" except NotImplementedError: # ahbicht fault/missing feature -> act like it's valid + is_valid = True node_texts = _generate_node_texts(session, expression, anwendungshandbuch_pk) error_message = None return is_valid, node_texts, error_message @@ -155,7 +161,7 @@ def create_and_fill_ahb_expression_table(session: Session, use_cpu_intensive_val if use_cpu_intensive_validity_check: # as of 2025-04-15 I have no clue how long this actually takes for all expressions _, node_texts, error_message = _get_validity_node_texts_and_error_message_cpu_intensive( - expression, session, row[3] + expression, session, row[3], EdifactFormat(row[1]), row[0] ) else: _, node_texts, error_message = _get_validity_node_texts_and_error_message_fast(expression, session, row[3]) From ddd988c64eae7634f5803a507577027468740ab2 Mon Sep 17 00:00:00 2001 From: konstantin Date: Sun, 12 Apr 2026 18:08:01 +0000 Subject: [PATCH 3/4] fix: remove unused Optional import Co-Authored-By: Claude Opus 4.6 (1M context) --- src/fundamend/sqlmodels/expression_view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fundamend/sqlmodels/expression_view.py b/src/fundamend/sqlmodels/expression_view.py index 45eaa46..d70721d 100644 --- a/src/fundamend/sqlmodels/expression_view.py +++ b/src/fundamend/sqlmodels/expression_view.py @@ -5,7 +5,7 @@ import asyncio import logging import uuid -from typing import Optional + from efoli import EdifactFormat, EdifactFormatVersion from sqlalchemy import Index From 80d8f0f7ddd04f593ecc304843d246858b622334 Mon Sep 17 00:00:00 2001 From: konstantin Date: Sun, 12 Apr 2026 18:10:54 +0000 Subject: [PATCH 4/4] fix: isort and black formatting Co-Authored-By: Claude Opus 4.6 (1M context) --- src/fundamend/sqlmodels/expression_view.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/fundamend/sqlmodels/expression_view.py b/src/fundamend/sqlmodels/expression_view.py index d70721d..db5fd3e 100644 --- a/src/fundamend/sqlmodels/expression_view.py +++ b/src/fundamend/sqlmodels/expression_view.py @@ -6,7 +6,6 @@ import logging import uuid - from efoli import EdifactFormat, EdifactFormatVersion from sqlalchemy import Index @@ -87,9 +86,7 @@ def _get_validity_node_texts_and_error_message_cpu_intensive( is_valid = True # default: assume valid unless proven otherwise error_message: str | None = None try: - is_valid, error_message = asyncio.run( - is_valid_expression(expression, edifact_format, edifact_format_version) - ) + is_valid, error_message = asyncio.run(is_valid_expression(expression, edifact_format, edifact_format_version)) if is_valid: # we might actually get a meaningful node_texts even for invalid expressions, but I don't like it node_texts = _generate_node_texts(session, expression, anwendungshandbuch_pk) else: