From aedf30165e343aeadfce039125b978a8f09134c1 Mon Sep 17 00:00:00 2001 From: "Pierre R. Mai" Date: Thu, 16 Oct 2025 20:35:45 +0200 Subject: [PATCH 1/3] Switch to osi-python, basic MCAP support Signed-off-by: Pierre R. Mai --- poetry.lock | 219 +++++++++++++++++- pyproject.toml | 2 +- .../deserialization_expected_version_360.mcap | Bin 0 -> 117202 bytes tests/test_osirules_checks.py | 14 ++ 4 files changed, 226 insertions(+), 9 deletions(-) create mode 100644 tests/data/deserialization_expected_version/deserialization_expected_version_360.mcap diff --git a/poetry.lock b/poetry.lock index ed8bcd0..5cc4871 100644 --- a/poetry.lock +++ b/poetry.lock @@ -300,6 +300,94 @@ html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] source = ["Cython (>=3.0.11,<3.1.0)"] +[[package]] +name = "lz4" +version = "4.4.4" +description = "LZ4 Bindings for Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "lz4-4.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f170abb8416c4efca48e76cac2c86c3185efdf841aecbe5c190121c42828ced0"}, + {file = "lz4-4.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d33a5105cd96ebd32c3e78d7ece6123a9d2fb7c18b84dec61f27837d9e0c496c"}, + {file = "lz4-4.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30ebbc5b76b4f0018988825a7e9ce153be4f0d4eba34e6c1f2fcded120573e88"}, + {file = "lz4-4.4.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc64d6dfa7a89397529b22638939e70d85eaedc1bd68e30a29c78bfb65d4f715"}, + {file = "lz4-4.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a355223a284f42a723c120ce68827de66d5cb872a38732b3d5abbf544fa2fe26"}, + {file = "lz4-4.4.4-cp310-cp310-win32.whl", hash = "sha256:b28228197775b7b5096898851d59ef43ccaf151136f81d9c436bc9ba560bc2ba"}, + {file = "lz4-4.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:45e7c954546de4f85d895aa735989d77f87dd649f503ce1c8a71a151b092ed36"}, + {file = "lz4-4.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:e3fc90f766401684740978cd781d73b9685bd81b5dbf7257542ef9de4612e4d2"}, + {file = "lz4-4.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ddfc7194cd206496c445e9e5b0c47f970ce982c725c87bd22de028884125b68f"}, + {file = "lz4-4.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:714f9298c86f8e7278f1c6af23e509044782fa8220eb0260f8f8f1632f820550"}, + {file = "lz4-4.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8474c91de47733856c6686df3c4aca33753741da7e757979369c2c0d32918ba"}, + {file = "lz4-4.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80dd27d7d680ea02c261c226acf1d41de2fd77af4fb2da62b278a9376e380de0"}, + {file = "lz4-4.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9b7d6dddfd01b49aedb940fdcaf32f41dc58c926ba35f4e31866aeec2f32f4f4"}, + {file = "lz4-4.4.4-cp311-cp311-win32.whl", hash = "sha256:4134b9fd70ac41954c080b772816bb1afe0c8354ee993015a83430031d686a4c"}, + {file = "lz4-4.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:f5024d3ca2383470f7c4ef4d0ed8eabad0b22b23eeefde1c192cf1a38d5e9f78"}, + {file = "lz4-4.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:6ea715bb3357ea1665f77874cf8f55385ff112553db06f3742d3cdcec08633f7"}, + {file = "lz4-4.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:23ae267494fdd80f0d2a131beff890cf857f1b812ee72dbb96c3204aab725553"}, + {file = "lz4-4.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fff9f3a1ed63d45cb6514bfb8293005dc4141341ce3500abdfeb76124c0b9b2e"}, + {file = "lz4-4.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ea7f07329f85a8eda4d8cf937b87f27f0ac392c6400f18bea2c667c8b7f8ecc"}, + {file = "lz4-4.4.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ccab8f7f7b82f9fa9fc3b0ba584d353bd5aa818d5821d77d5b9447faad2aaad"}, + {file = "lz4-4.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43e9d48b2daf80e486213128b0763deed35bbb7a59b66d1681e205e1702d735"}, + {file = "lz4-4.4.4-cp312-cp312-win32.whl", hash = "sha256:33e01e18e4561b0381b2c33d58e77ceee850a5067f0ece945064cbaac2176962"}, + {file = "lz4-4.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d21d1a2892a2dcc193163dd13eaadabb2c1b803807a5117d8f8588b22eaf9f12"}, + {file = "lz4-4.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:2f4f2965c98ab254feddf6b5072854a6935adab7bc81412ec4fe238f07b85f62"}, + {file = "lz4-4.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ed6eb9f8deaf25ee4f6fad9625d0955183fdc90c52b6f79a76b7f209af1b6e54"}, + {file = "lz4-4.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:18ae4fe3bafb344dbd09f976d45cbf49c05c34416f2462828f9572c1fa6d5af7"}, + {file = "lz4-4.4.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57fd20c5fc1a49d1bbd170836fccf9a338847e73664f8e313dce6ac91b8c1e02"}, + {file = "lz4-4.4.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9cb387c33f014dae4db8cb4ba789c8d2a0a6d045ddff6be13f6c8d9def1d2a6"}, + {file = "lz4-4.4.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d0be9f68240231e1e44118a4ebfecd8a5d4184f0bdf5c591c98dd6ade9720afd"}, + {file = "lz4-4.4.4-cp313-cp313-win32.whl", hash = "sha256:e9ec5d45ea43684f87c316542af061ef5febc6a6b322928f059ce1fb289c298a"}, + {file = "lz4-4.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:a760a175b46325b2bb33b1f2bbfb8aa21b48e1b9653e29c10b6834f9bb44ead4"}, + {file = "lz4-4.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:f4c21648d81e0dda38b4720dccc9006ae33b0e9e7ffe88af6bf7d4ec124e2fba"}, + {file = "lz4-4.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bd1add57b6fe1f96bed2d529de085e9378a3ac04b86f116d10506f85b68e97fc"}, + {file = "lz4-4.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:900912e8a7cf74b4a2bea18a3594ae0bf1138f99919c20017167b6e05f760aa4"}, + {file = "lz4-4.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:017f8d269a739405a59d68a4d63d23a8df23e3bb2c70aa069b7563af08dfdffb"}, + {file = "lz4-4.4.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac522788296a9a02a39f620970dea86c38e141e21e51238f1b5e9fa629f8e69"}, + {file = "lz4-4.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6b56aa9eef830bf6443acd8c4e18b208a8993dc32e0d6ef4263ecfa6afb3f599"}, + {file = "lz4-4.4.4-cp39-cp39-win32.whl", hash = "sha256:585b42eb37ab16a278c3a917ec23b2beef175aa669f4120142b97aebf90ef775"}, + {file = "lz4-4.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:4ab1537bd3b3bfbafd3c8847e06827129794488304f21945fc2f5b669649d94f"}, + {file = "lz4-4.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:38730927ad51beb42ab8dbc5555270bfbe86167ba734265f88bbd799fced1004"}, + {file = "lz4-4.4.4.tar.gz", hash = "sha256:070fd0627ec4393011251a094e08ed9fdcc78cb4e7ab28f507638eee4e39abda"}, +] + +[package.extras] +docs = ["sphinx (>=1.6.0)", "sphinx_bootstrap_theme"] +flake8 = ["flake8"] +tests = ["psutil", "pytest (!=3.3.0)", "pytest-cov"] + +[[package]] +name = "mcap" +version = "1.3.0" +description = "MCAP libraries for Python" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mcap-1.3.0-py3-none-any.whl", hash = "sha256:6262a68cd5a9ed7f8fe8fa6330412a87949842782ab42a4800cd033d0f38e4cd"}, + {file = "mcap-1.3.0.tar.gz", hash = "sha256:5f0d5826ba3b8418508c1d992bada4c5744073f1b3e6d685579f0aca0389fb2f"}, +] + +[package.dependencies] +lz4 = "*" +zstandard = "*" + +[[package]] +name = "mcap-protobuf-support" +version = "0.5.3" +description = "Protobuf support for the Python MCAP library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "mcap_protobuf_support-0.5.3-py3-none-any.whl", hash = "sha256:2cdfe7082f26f7da1bae8fa91c9196820562d03dccf39d4e4de11e8287f92dcb"}, + {file = "mcap_protobuf_support-0.5.3.tar.gz", hash = "sha256:0545ed005cdc6ac22c5d87a7d8574f0e9adb0c5da7b0f46ae896f5702fc1a250"}, +] + +[package.dependencies] +mcap = ">=0.0.14" +protobuf = ">=4.25" + [[package]] name = "mypy-extensions" version = "1.1.0" @@ -313,23 +401,26 @@ files = [ ] [[package]] -name = "open-simulation-interface" -version = "3.7.0" +name = "osi-python" +version = "0.0.0" description = "ASAM Open Simulation Interface Python Bindings." optional = false -python-versions = "*" +python-versions = ">=3.10" groups = ["main"] files = [] develop = false [package.dependencies] -protobuf = ">=4.24.4" +mcap = ">=1.2.2" +mcap-protobuf-support = ">=0.5.3" +protobuf = ">=6.30.2" +typing-extensions = ">=4.9,<5.0" [package.source] type = "git" -url = "https://github.com/OpenSimulationInterface/open-simulation-interface.git" -reference = "v3.7.0" -resolved_reference = "ec5e811c8baee55a843834ef6bc4910bb9164ca7" +url = "https://github.com/OpenSimulationInterface/osi-python.git" +reference = "main" +resolved_reference = "90f307637f35f6bafcbe6b14905738965d04507e" [[package]] name = "packaging" @@ -734,7 +825,119 @@ files = [ [package.dependencies] typing-extensions = ">=4.12.0" +[[package]] +name = "zstandard" +version = "0.25.0" +description = "Zstandard bindings for Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd"}, + {file = "zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0"}, + {file = "zstandard-0.25.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e"}, + {file = "zstandard-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74"}, + {file = "zstandard-0.25.0-cp310-cp310-win32.whl", hash = "sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa"}, + {file = "zstandard-0.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e"}, + {file = "zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c"}, + {file = "zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6"}, + {file = "zstandard-0.25.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa"}, + {file = "zstandard-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7"}, + {file = "zstandard-0.25.0-cp311-cp311-win32.whl", hash = "sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4"}, + {file = "zstandard-0.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2"}, + {file = "zstandard-0.25.0-cp311-cp311-win_arm64.whl", hash = "sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137"}, + {file = "zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b"}, + {file = "zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a"}, + {file = "zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512"}, + {file = "zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa"}, + {file = "zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd"}, + {file = "zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01"}, + {file = "zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9"}, + {file = "zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94"}, + {file = "zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551"}, + {file = "zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98"}, + {file = "zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf"}, + {file = "zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09"}, + {file = "zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5"}, + {file = "zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049"}, + {file = "zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3"}, + {file = "zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859"}, + {file = "zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c"}, + {file = "zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088"}, + {file = "zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12"}, + {file = "zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2"}, + {file = "zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d"}, + {file = "zstandard-0.25.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b9af1fe743828123e12b41dd8091eca1074d0c1569cc42e6e1eee98027f2bbd0"}, + {file = "zstandard-0.25.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b14abacf83dfb5c25eb4e4a79520de9e7e205f72c9ee7702f91233ae57d33a2"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:a51ff14f8017338e2f2e5dab738ce1ec3b5a851f23b18c1ae1359b1eecbee6df"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3b870ce5a02d4b22286cf4944c628e0f0881b11b3f14667c1d62185a99e04f53"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:05353cef599a7b0b98baca9b068dd36810c3ef0f42bf282583f438caf6ddcee3"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:19796b39075201d51d5f5f790bf849221e58b48a39a5fc74837675d8bafc7362"}, + {file = "zstandard-0.25.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:53e08b2445a6bc241261fea89d065536f00a581f02535f8122eba42db9375530"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1f3689581a72eaba9131b1d9bdbfe520ccd169999219b41000ede2fca5c1bfdb"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d8c56bb4e6c795fc77d74d8e8b80846e1fb8292fc0b5060cd8131d522974b751"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:53f94448fe5b10ee75d246497168e5825135d54325458c4bfffbaafabcc0a577"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c2ba942c94e0691467ab901fc51b6f2085ff48f2eea77b1a48240f011e8247c7"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:07b527a69c1e1c8b5ab1ab14e2afe0675614a09182213f21a0717b62027b5936"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:51526324f1b23229001eb3735bc8c94f9c578b1bd9e867a0a646a3b17109f388"}, + {file = "zstandard-0.25.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89c4b48479a43f820b749df49cd7ba2dbc2b1b78560ecb5ab52985574fd40b27"}, + {file = "zstandard-0.25.0-cp39-cp39-win32.whl", hash = "sha256:1cd5da4d8e8ee0e88be976c294db744773459d51bb32f707a0f166e5ad5c8649"}, + {file = "zstandard-0.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:37daddd452c0ffb65da00620afb8e17abd4adaae6ce6310702841760c2c26860"}, + {file = "zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b"}, +] + +[package.extras] +cffi = ["cffi (>=1.17,<2.0) ; platform_python_implementation != \"PyPy\" and python_version < \"3.14\"", "cffi (>=2.0.0b) ; platform_python_implementation != \"PyPy\" and python_version >= \"3.14\""] + [metadata] lock-version = "2.1" python-versions = "^3.10" -content-hash = "dd55f2e93f32d97b18f5a3a88281204db29c224692b1718fb54f6478dd592e6b" +content-hash = "062583db7ebaf0380273033b41ada3514af90a26b06d7ca44a24d92320883586" diff --git a/pyproject.toml b/pyproject.toml index ebd7a7d..2d54c20 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ packages = [ [tool.poetry.dependencies] python = "^3.10" asam-qc-baselib = {git = "https://github.com/asam-ev/qc-baselib-py.git", rev = "main"} -open-simulation-interface = {git = "https://github.com/OpenSimulationInterface/open-simulation-interface.git", rev = "v3.7.0"} +osi-python = {git = "https://github.com/OpenSimulationInterface/osi-python.git", rev = "main"} pyyaml = "^6.0.0" iso3166 = "^2.1.1" diff --git a/tests/data/deserialization_expected_version/deserialization_expected_version_360.mcap b/tests/data/deserialization_expected_version/deserialization_expected_version_360.mcap new file mode 100644 index 0000000000000000000000000000000000000000..96f5a9e1adf74fd84292f4ec4e788e557526a792 GIT binary patch literal 117202 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 literal 0 HcmV?d00001 diff --git a/tests/test_osirules_checks.py b/tests/test_osirules_checks.py index 6f28002..c47406c 100644 --- a/tests/test_osirules_checks.py +++ b/tests/test_osirules_checks.py @@ -91,6 +91,20 @@ def test_osirules_expected_version( "sensorview.mounting_position.is_set", 547, ), + ( + "deserialization_expected_version/deserialization_expected_version_360.mcap", + "SensorView", + "3.6.0", + "sensorview.mounting_position.is_set", + 0, + ), + ( + "deserialization_expected_version/deserialization_expected_version_360.mcap", + "SensorView", + "3.7.0", + "sensorview.mounting_position.is_set", + 547, + ), ], ) def test_osirules_automatic_rules( From 7af30607ad4848982696049a22ff572a3ec50dac Mon Sep 17 00:00:00 2001 From: "Pierre R. Mai" Date: Thu, 16 Oct 2025 21:04:51 +0200 Subject: [PATCH 2/3] Add primitive topic handling for mcap files Signed-off-by: Pierre R. Mai --- .../deserialization_checker.py | 5 ++- .../checks/osirules/osirules_checker.py | 7 +++- qc_ositrace/main.py | 8 +++++ tests/test_deserialization_checks.py | 36 +++++++++++++++++++ tests/test_setup.py | 20 +++++++++-- 5 files changed, 71 insertions(+), 5 deletions(-) diff --git a/qc_ositrace/checks/deserialization/deserialization_checker.py b/qc_ositrace/checks/deserialization/deserialization_checker.py index cbbdc33..c7fd9d9 100644 --- a/qc_ositrace/checks/deserialization/deserialization_checker.py +++ b/qc_ositrace/checks/deserialization/deserialization_checker.py @@ -68,7 +68,10 @@ def run_checks(config: Configuration, result: Result) -> None: try: try: trace = OSITrace( - config.get_config_param("InputFile"), config.get_config_param("osiType") + config.get_config_param("InputFile"), + config.get_config_param("osiType"), + False, + config.get_config_param("osiTopic"), ) except Exception as e: logging.error(f"Error reading input file: {e}") diff --git a/qc_ositrace/checks/osirules/osirules_checker.py b/qc_ositrace/checks/osirules/osirules_checker.py index 16a1781..789faf9 100644 --- a/qc_ositrace/checks/osirules/osirules_checker.py +++ b/qc_ositrace/checks/osirules/osirules_checker.py @@ -469,7 +469,12 @@ def run_checks(config: Configuration, result: Result) -> None: try: try: - trace = OSITrace(config.get_config_param("InputFile"), expected_type_name) + trace = OSITrace( + config.get_config_param("InputFile"), + expected_type_name, + False, + config.get_config_param("osiTopic"), + ) except Exception as e: logging.error(f"Error reading input file: {e}") raise RuntimeError(f"Error reading input file: {e}") from e diff --git a/qc_ositrace/main.py b/qc_ositrace/main.py index 0485993..8027975 100644 --- a/qc_ositrace/main.py +++ b/qc_ositrace/main.py @@ -28,6 +28,11 @@ def args_entrypoint() -> argparse.Namespace: type=pathlib.Path, help="Path to the input OSI Trace file.", ) + parser.add_argument( + "--osiTopic", + type=str, + help="Channel topic of a multi-trace OSI Trace file to select.", + ) parser.add_argument( "--osiType", type=str, @@ -101,6 +106,9 @@ def main(): logging.info("Setting input file: %s", args.input_file) config.set_config_param("InputFile", str(args.input_file)) + if args.osiTopic: + logging.info("Setting OSI Topic: %s", args.osiTopic) + config.set_config_param("osiTopic", args.osiTopic) if args.osiType: logging.info("Setting OSI Type: %s", args.osiType) config.set_config_param("osiType", args.osiType) diff --git a/tests/test_deserialization_checks.py b/tests/test_deserialization_checks.py index 62b2b23..72eb8a3 100644 --- a/tests/test_deserialization_checks.py +++ b/tests/test_deserialization_checks.py @@ -4,6 +4,9 @@ from typing import List +from qc_ositrace.checks.deserialization.deserialization_constants import ( + CHECKER_ID as deserialization_checker_id, +) from qc_baselib import IssueSeverity from test_setup import * @@ -58,3 +61,36 @@ def test_deserialization_expected_version( launch_main(monkeypatch) check_issues(rule_uid, issue_count, issue_severity) cleanup_files() + + +@pytest.mark.parametrize( + "target_file,target_topic,target_type,target_version,issue_count", + [ + ("360", "MySensorView", "SensorView", "3.5.0", 547), + ("360", "MySensorView", "SensorView", "3.6.0", 0), + ("360", "Foo", "SensorView", "3.6.0", -1), + ], +) +def test_deserialization_mcap_topic( + target_file: str, + target_topic: str, + target_type: str, + target_version: str, + issue_count: int, + monkeypatch, +) -> None: + base_path = "tests/data/deserialization_expected_version/" + target_file_name = f"deserialization_expected_version_{target_file}.mcap" + rule_uid = "asam.net:osi:3.0.0:deserialization.expected_version" + issue_severity = IssueSeverity.ERROR + + target_file_path = os.path.join(base_path, target_file_name) + create_test_config( + target_file_path, target_type, target_version, None, target_topic + ) + launch_main(monkeypatch) + if issue_count < 0: + check_failure(deserialization_checker_id) + else: + check_issues(rule_uid, issue_count, issue_severity) + cleanup_files() diff --git a/tests/test_setup.py b/tests/test_setup.py index 1f933ff..280bb40 100644 --- a/tests/test_setup.py +++ b/tests/test_setup.py @@ -3,10 +3,12 @@ from typing import Optional +from contextlib import suppress + import qc_ositrace.main as main from qc_ositrace import constants -from qc_baselib import Configuration, Result, IssueSeverity +from qc_baselib import Configuration, Result, IssueSeverity, StatusType CONFIG_FILE_PATH = "bundle_config.xml" REPORT_FILE_PATH = "osi_bundle_report.xqar" @@ -17,6 +19,7 @@ def create_test_config( target_file_type: str, target_file_version: Optional[str] = None, target_file_rules: Optional[str] = None, + target_file_topic: Optional[str] = None, ): test_config = Configuration() test_config.set_config_param(name="InputFile", value=target_file_path) @@ -25,6 +28,8 @@ def create_test_config( test_config.set_config_param(name="osiVersion", value=target_file_version) if target_file_rules is not None: test_config.set_config_param(name="osiRulesFile", value=target_file_rules) + if target_file_topic is not None: + test_config.set_config_param(name="osiTopic", value=target_file_topic) test_config.register_checker_bundle(checker_bundle_name=constants.BUNDLE_NAME) test_config.set_checker_bundle_param( checker_bundle_name=constants.BUNDLE_NAME, @@ -47,6 +52,14 @@ def check_issues(rule_uid: str, issue_count: int, severity: IssueSeverity): assert issue.level == severity +def check_failure(checker_id: str): + result = Result() + result.load_from_file(REPORT_FILE_PATH) + + status = result.get_checker_status(checker_id) + assert status == StatusType.ERROR + + def launch_main(monkeypatch): monkeypatch.setattr( sys, @@ -61,5 +74,6 @@ def launch_main(monkeypatch): def cleanup_files(): - os.remove(REPORT_FILE_PATH) - os.remove(CONFIG_FILE_PATH) + with suppress(Exception): + os.remove(REPORT_FILE_PATH) + os.remove(CONFIG_FILE_PATH) From 04706e9b2a04a29edf4d4c7388b980e5ca8a1ad2 Mon Sep 17 00:00:00 2001 From: "Pierre R. Mai" Date: Fri, 7 Nov 2025 10:58:31 +0100 Subject: [PATCH 3/3] Switch to keyword arguments on OSITrace, add tests Add tests to ensure topic is correctly ignored for single trace files, also fix formatting error in related_to code. Signed-off-by: Pierre R. Mai --- .../deserialization_checker.py | 7 ++-- .../checks/osirules/osirules_checker.py | 13 ++++--- tests/test_deserialization_checks.py | 34 +++++++++++++++++++ 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/qc_ositrace/checks/deserialization/deserialization_checker.py b/qc_ositrace/checks/deserialization/deserialization_checker.py index c7fd9d9..6db0fc5 100644 --- a/qc_ositrace/checks/deserialization/deserialization_checker.py +++ b/qc_ositrace/checks/deserialization/deserialization_checker.py @@ -68,10 +68,9 @@ def run_checks(config: Configuration, result: Result) -> None: try: try: trace = OSITrace( - config.get_config_param("InputFile"), - config.get_config_param("osiType"), - False, - config.get_config_param("osiTopic"), + path=config.get_config_param("InputFile"), + type_name=config.get_config_param("osiType"), + topic=config.get_config_param("osiTopic"), ) except Exception as e: logging.error(f"Error reading input file: {e}") diff --git a/qc_ositrace/checks/osirules/osirules_checker.py b/qc_ositrace/checks/osirules/osirules_checker.py index 789faf9..6b59fb0 100644 --- a/qc_ositrace/checks/osirules/osirules_checker.py +++ b/qc_ositrace/checks/osirules/osirules_checker.py @@ -406,7 +406,11 @@ def check_message_against_rules( ) else: # Check if referred message matches one of the expected types - expected_types = ["osi3." + t for t in rule['refers_to']] if isinstance(rule['refers_to'], list) else ["osi3." + rule['refers_to']] + expected_types = ( + ["osi3." + t for t in rule["refers_to"]] + if isinstance(rule["refers_to"], list) + else ["osi3." + rule["refers_to"]] + ) if referred_message.DESCRIPTOR.full_name not in expected_types: register_issue( result, @@ -470,10 +474,9 @@ def run_checks(config: Configuration, result: Result) -> None: try: try: trace = OSITrace( - config.get_config_param("InputFile"), - expected_type_name, - False, - config.get_config_param("osiTopic"), + path=config.get_config_param("InputFile"), + type_name=expected_type_name, + topic=config.get_config_param("osiTopic"), ) except Exception as e: logging.error(f"Error reading input file: {e}") diff --git a/tests/test_deserialization_checks.py b/tests/test_deserialization_checks.py index 72eb8a3..e21c5e5 100644 --- a/tests/test_deserialization_checks.py +++ b/tests/test_deserialization_checks.py @@ -94,3 +94,37 @@ def test_deserialization_mcap_topic( else: check_issues(rule_uid, issue_count, issue_severity) cleanup_files() + + +@pytest.mark.parametrize( + "target_file,target_topic,target_type,target_version,issue_count", + [ + ("360", "MySensorView", "SensorView", "3.5.0", 547), + ("360", "MySensorView", "SensorView", "3.6.0", 0), + ("360", "Foo", "SensorView", "3.5.0", 547), + ("360", "Foo", "SensorView", "3.6.0", 0), + ], +) +def test_deserialization_single_topic( + target_file: str, + target_topic: str, + target_type: str, + target_version: str, + issue_count: int, + monkeypatch, +) -> None: + base_path = "tests/data/deserialization_expected_version/" + target_file_name = f"deserialization_expected_version_{target_file}.osi" + rule_uid = "asam.net:osi:3.0.0:deserialization.expected_version" + issue_severity = IssueSeverity.ERROR + + target_file_path = os.path.join(base_path, target_file_name) + create_test_config( + target_file_path, target_type, target_version, None, target_topic + ) + launch_main(monkeypatch) + if issue_count < 0: + check_failure(deserialization_checker_id) + else: + check_issues(rule_uid, issue_count, issue_severity) + cleanup_files()