diff --git a/poetry.lock b/poetry.lock index 5cc4871..628c963 100644 --- a/poetry.lock +++ b/poetry.lock @@ -940,4 +940,4 @@ cffi = ["cffi (>=1.17,<2.0) ; platform_python_implementation != \"PyPy\" and pyt [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "062583db7ebaf0380273033b41ada3514af90a26b06d7ca44a24d92320883586" +content-hash = "3c3f0f5ca716db37fdddecde7ea969bc8a21e7ee3576798f45a13cda003117de" diff --git a/pyproject.toml b/pyproject.toml index 2d54c20..7ecb005 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,6 +16,7 @@ asam-qc-baselib = {git = "https://github.com/asam-ev/qc-baselib-py.git", rev = " osi-python = {git = "https://github.com/OpenSimulationInterface/osi-python.git", rev = "main"} pyyaml = "^6.0.0" iso3166 = "^2.1.1" +protobuf = ">=6.30.2" [tool.poetry.group.dev.dependencies] pytest = "^8.2.2" diff --git a/qc_ositrace/checks/osirules/osirules_checker.py b/qc_ositrace/checks/osirules/osirules_checker.py index 208dafb..cae05fb 100644 --- a/qc_ositrace/checks/osirules/osirules_checker.py +++ b/qc_ositrace/checks/osirules/osirules_checker.py @@ -10,6 +10,7 @@ ) from osi3trace.osi_trace import OSITrace +import google.protobuf.descriptor import google.protobuf.message from importlib import resources as impresources @@ -125,6 +126,17 @@ def register_issue( ) +if hasattr(google.protobuf.descriptor.FieldDescriptor, "is_repeated"): + + def field_descriptor_is_repeated(field_descriptor) -> bool: + return bool(field_descriptor.is_repeated) + +else: + + def field_descriptor_is_repeated(field_descriptor) -> bool: + return field_descriptor.label == field_descriptor.LABEL_REPEATED + + def evaluate_rule_condition( message: google.protobuf.message.Message, field_name: str, rule: dict ) -> bool: @@ -134,7 +146,7 @@ def evaluate_rule_condition( f"Field '{field_name}' not found in message '{message.DESCRIPTOR.full_name}'. Rule evaluation skipped." ) return False - if field_descriptor.label == field_descriptor.LABEL_REPEATED: + if field_descriptor_is_repeated(field_descriptor): values = getattr(message, field_name) else: values = [getattr(message, field_name)] if message.HasField(field_name) else [] @@ -198,7 +210,7 @@ def check_message_against_rules( f"Field '{field_name}' not found in message '{message.DESCRIPTOR.full_name}'. Skipping rules check." ) continue - if field_descriptor.label == field_descriptor.LABEL_REPEATED: + if field_descriptor_is_repeated(field_descriptor): has_field = True values = getattr(message, field_name) else: @@ -264,7 +276,7 @@ def check_message_against_rules( # Process other rules for each set field for field, value in message.ListFields(): - values = value if field.label == field.LABEL_REPEATED else [value] + values = value if field_descriptor_is_repeated(field) else [value] for rule_uid, rule in field_rules.get(field.name, []): if "is_greater_than" in rule and not all( [value > rule["is_greater_than"] for value in values]