From 833b317191c8035b5594e7a1349ef6b288c95c56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Gr=C3=BCndger?= Date: Mon, 5 May 2025 09:47:43 +0200 Subject: [PATCH 1/5] optionally use the rust parser --- ogn/parser/parse.py | 137 ++++++++++++++++-- poetry.lock | 346 +++++++++++++++++++++++++++++++------------- pyproject.toml | 4 +- 3 files changed, 375 insertions(+), 112 deletions(-) diff --git a/ogn/parser/parse.py b/ogn/parser/parse.py index da0a6b6..51daeff 100644 --- a/ogn/parser/parse.py +++ b/ogn/parser/parse.py @@ -1,6 +1,6 @@ from datetime import datetime, timezone -from ogn.parser.utils import createTimestamp, parseAngle, KNOTS_TO_MS, KPH_TO_MS, FEETS_TO_METER, INCH_TO_MM, fahrenheit_to_celsius, CheapRuler, normalized_quality +from ogn.parser.utils import FPM_TO_MS, HPM_TO_DEGS, createTimestamp, parseAngle, KNOTS_TO_MS, KPH_TO_MS, FEETS_TO_METER, INCH_TO_MM, fahrenheit_to_celsius, CheapRuler, normalized_quality from ogn.parser.pattern import PATTERN_APRS, PATTERN_APRS_POSITION, PATTERN_APRS_POSITION_WEATHER, PATTERN_APRS_STATUS, PATTERN_SERVER from ogn.parser.exceptions import AprsParseError, OgnParseError @@ -19,11 +19,33 @@ from ogn.parser.aprs_comment.microtrak_parser import MicrotrakParser from ogn.parser.aprs_comment.generic_parser import GenericParser +from ogn_parser import parse as rust_parse + positions = {} server_timestamp = None +mapping = { + 'OGCAPT': 'capturs', + 'OGNFNT': 'fanet', + 'OGFLR': 'flarm', + 'OGFLR6': 'flarm', + 'OGFLR7': 'flarm', + 'OGFLYM': 'flymaster', + 'OGINRE': 'inreach', + 'OGLT24': 'lt24', + 'OGNMTK': 'microtrak', + 'OGNAVI': 'naviter', + 'OGNSDR': 'receiver', + 'OGNSKY': 'safesky', + 'OGPAW': 'pilot_aware', + 'OGSKYL': 'skylines', + 'OGSPID': 'spider', + 'OGSPOT': 'spot', + 'OGNTRK': 'tracker', +} + -def parse(aprs_message, reference_timestamp=None, calculate_relations=False, use_server_timestamp=True): +def parse(aprs_message, reference_timestamp=None, calculate_relations=False, use_server_timestamp=True, use_rust_parser=False): global server_timestamp if use_server_timestamp is True: @@ -31,14 +53,107 @@ def parse(aprs_message, reference_timestamp=None, calculate_relations=False, use elif reference_timestamp is None: reference_timestamp = datetime.now(timezone.utc) - message = parse_aprs(aprs_message, reference_timestamp=reference_timestamp) - if message['aprs_type'] == 'position' or message['aprs_type'] == 'status': - try: - message.update(parse_comment(message['comment'], - dstcall=message['dstcall'], - aprs_type=message['aprs_type'])) - except Exception: - raise OgnParseError(f"dstcall: {message['dstcall']}, aprs_type: {message['aprs_type']}, comment: {message['comment']}") + if use_rust_parser: + rust_zeug = rust_parse(aprs_message) + message = {'raw_message': aprs_message, 'reference_timestamp': reference_timestamp} + if parser_error := rust_zeug.get('parsererror'): + message['aprs_type'] = 'comment' + message['comment'] = str(parser_error) + elif aprs_packet := rust_zeug.get('aprspacket'): + message.update({ + 'aprs_type': 'position', + 'beacon_type': mapping.get(aprs_packet['to'], 'unknown'), + 'name': aprs_packet['from'], + 'dstcall': aprs_packet['to'], + }) + if via := aprs_packet.get('via'): + message['receiver_name'] = via[-1] + if aprs_packet['via'][0] != 'TCPIP*' and aprs_packet['via'][0].endswith('*'): message['relay'] = aprs_packet['via'][0][:-1] + if position := aprs_packet.get('position'): + message.update({ + 'latitude': position['latitude'], + 'longitude': position['longitude'], + 'symboltable': position['symbol_table'], + 'symbolcode': position['symbol_code'], + }) + if 'timestamp' in position: message['timestamp'] = createTimestamp(position['timestamp'], reference_timestamp) + + if 'wind_direction' in position: + message['aprs_type'] = 'position_weather' + if 'wind_direction' in position: message["wind_direction"] = position['wind_direction'] + if 'wind_speed' in position: message["wind_speed"] = position['wind_speed'] * KNOTS_TO_MS / KPH_TO_MS + if 'gust' in position: message['wind_speed_peak'] = position['gust'] * KNOTS_TO_MS / KPH_TO_MS + if 'temperature' in position: message['temperature'] = fahrenheit_to_celsius(position['temperature']) + if 'rainfall_1h' in position: message['rainfall_1h'] = position['rainfall_1h'] / 100.0 * INCH_TO_MM + if 'rainfall_24h' in position: message['rainfall_24h'] = position['rainfall_24h'] / 100.0 * INCH_TO_MM + if 'humidity' in position: message['humidity'] = 1. if position['humidity'] == 0 else position['humidity'] * 0.01 + if 'barometric_pressure' in position: message['barometric_pressure'] = position['barometric_pressure'] + + if 'course' in position: message["track"] = position['course'] + if 'speed' in position: message["ground_speed"] = position['speed'] * KNOTS_TO_MS / KPH_TO_MS + if 'altitude' in position: message["altitude"] = position['altitude'] * FEETS_TO_METER + + if 'reserved' in position: message['reserved'] = position['reserved'] + if 'address_type' in position: message['address_type'] = position['address_type'] + if 'aircraft_type' in position: message['aircraft_type'] = position['aircraft_type'] + if 'is_notrack' in position: message['no-tracking'] = position['is_notrack'] + if 'is_stealth' in position: message['stealth'] = position['is_stealth'] + if 'address' in position: message['address'] = f"{position['address']:06X}" + + if 'climb_rate' in position: message["climb_rate"] = position['climb_rate'] * FPM_TO_MS + if 'turn_rate' in position: message["turn_rate"] = position['turn_rate'] * HPM_TO_DEGS + if 'signal_quality' in position: message["signal_quality"] = position['signal_quality'] + if 'error' in position: message["error_count"] = position['error'] + if 'frequency_offset' in position: message["frequency_offset"] = position['frequency_offset'] + if 'gps_quality' in position: message["gps_quality"] = position['gps_quality'] + if 'flight_level' in position: message["flightlevel"] = position['flight_level'] + if 'signal_power' in position: message["signal_power"] = position['signal_power'] + if 'software_version' in position: message["software_version"] = position['software_version'] + if 'hardware_version' in position: message["hardware_version"] = position['hardware_version'] + if 'original_address' in position: message["real_address"] = f"{position['original_address']:06X}" + + if 'unparsed' in position: message["user_comment"] = position['unparsed'] + + elif status := aprs_packet.get('status'): + message['aprs_type'] = 'status' + if 'timestamp' in status: message['timestamp'] = createTimestamp(status['timestamp'], reference_timestamp) + + if 'version' in status: message["version"] = status['version'] + if 'platform' in status: message["platform"] = status['platform'] + if 'cpu_load' in status: message["cpu_load"] = status['cpu_load'] + if 'ram_free' in status: message["free_ram"] = status['ram_free'] + if 'ram_total' in status: message["total_ram"] = status['ram_total'] + if 'ntp_offset' in status: message["ntp_error"] = status['ntp_offset'] + if 'ntp_correction' in status: message["rt_crystal_correction"] = status['ntp_correction'] + if 'voltage' in status: message["voltage"] = status['voltage'] + if 'amperage' in status: message["amperage"] = status['amperage'] + if 'cpu_temperature' in status: message["cpu_temp"] = status['cpu_temperature'] + if 'visible_senders' in status: message["senders_visible"] = status['visible_senders'] + if 'latency' in status: message["latency"] = status['latency'] + if 'senders' in status: message["senders_total"] = status['senders'] + if 'rf_correction_manual' in status: message["rec_crystal_correction"] = status['rf_correction_manual'] + if 'rf_correction_automatic' in status: message["rec_crystal_correction_fine"] = status['rf_correction_automatic'] + if 'noise' in status: message["rec_input_noise"] = status['noise'] + if 'senders_signal_quality' in status: message["senders_signal"] = status['senders_signal_quality'] + if 'senders_messages' in status: message["senders_messages"] = status['senders_messages'] + if 'good_senders_signal_quality' in status: message["good_senders_signal"] = status['good_senders_signal_quality'] + if 'good_senders' in status: message["good_senders"] = status['good_senders'] + if 'good_and_bad_senders' in status: message["good_and_bad_senders"] = status['good_and_bad_senders'] + + if 'unparsed' in status: message["user_comment"] = status['unparsed'] + else: + raise ValueError("WTF") + + else: + raise ValueError("WTF") + + else: + message = parse_aprs(aprs_message, reference_timestamp=reference_timestamp) + if message['aprs_type'] == 'position' or message['aprs_type'] == 'status': + try: + message.update(parse_comment(message['comment'], dstcall=message['dstcall'], aprs_type=message['aprs_type'])) + except Exception: + raise OgnParseError(f"dstcall: {message['dstcall']}, aprs_type: {message['aprs_type']}, comment: {message['comment']}") if message['aprs_type'].startswith('position') and calculate_relations is True: positions[message['name']] = (message['longitude'], message['latitude']) @@ -112,7 +227,7 @@ def parse_aprs(message, reference_timestamp=None): 'name': match.group('callsign'), 'dstcall': match.group('dstcall'), - 'relay': match.group('relay') if match.group('relay') else None, + 'relay': match.group('relay'), 'receiver_name': match.group('receiver'), 'timestamp': createTimestamp(match_position_weather.group('time'), reference_timestamp), 'latitude': parseAngle('0' + match_position_weather.group('latitude')) * # noqa: W504 diff --git a/poetry.lock b/poetry.lock index a5dddb7..b2bb55d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,116 +2,116 @@ [[package]] name = "certifi" -version = "2025.1.31" +version = "2025.4.26" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" groups = ["main"] files = [ - {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, - {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, + {file = "certifi-2025.4.26-py3-none-any.whl", hash = "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3"}, + {file = "certifi-2025.4.26.tar.gz", hash = "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6"}, ] [[package]] name = "charset-normalizer" -version = "3.4.1" +version = "3.4.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" groups = ["main"] files = [ - {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, - {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, - {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, - {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, - {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, - {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, - {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, - {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, - {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, - {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, + {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, + {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, + {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, + {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, + {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, + {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, + {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, + {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, + {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, ] [[package]] @@ -278,16 +278,129 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "ogn-parser" +version = "0.3.11" +description = "OGN message parser for Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "ogn_parser-0.3.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f856f48dee814f8a3a0ec0dfe41f85c34559167b066abbe5f842d0eb262456e"}, + {file = "ogn_parser-0.3.11-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:090e6e7ac391c99b006a8edd9f0c284d6ac68d2b1a42f44b7bc819c05b25b00f"}, + {file = "ogn_parser-0.3.11-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74033f129b15ea22641efe57774fb2bd4cc0187426f2d05bb0e351d5bfafbecd"}, + {file = "ogn_parser-0.3.11-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a766b43a9056c0b72ab5febf573072833b3b2a1ae34983069489eb005ff2f6b4"}, + {file = "ogn_parser-0.3.11-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4dd0e79a3078574e22c24e8c7538010d903146ecb0d02ab0a4f29fac51be4d32"}, + {file = "ogn_parser-0.3.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82767cefb2bf7447efb46ec7f6ae0e8d73849422ca02854c02282ff3f2b597f0"}, + {file = "ogn_parser-0.3.11-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:667cbd7f9567cc055f2761e94e0b89735fb849d81c50b2ede925f7a045277285"}, + {file = "ogn_parser-0.3.11-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:2aa894253738e28564d8f9653a004f45445c09d9529dc04d50f9f82e491a5c7a"}, + {file = "ogn_parser-0.3.11-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0a92bf1e5bc017305ca608a78017dc137ba48a96bee578a94c05fc848ba4bda3"}, + {file = "ogn_parser-0.3.11-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bd85d57db21e547c21015a736862cfbbf494e1ba91576c3d363b189ddd93c998"}, + {file = "ogn_parser-0.3.11-cp310-cp310-win32.whl", hash = "sha256:fb04c64d0eace9a25d21109062b9cacf8722c39550fcbe8270663c133d08232e"}, + {file = "ogn_parser-0.3.11-cp310-cp310-win_amd64.whl", hash = "sha256:6702c89800acb2ca90d355bc9e9673726bdf9dc9bfc90d8dc6f5b5a6a9f59e64"}, + {file = "ogn_parser-0.3.11-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f5292817d7dc191ff846368e08e4b8ba27dd3fe763abe09d25c56f8c234d3b8c"}, + {file = "ogn_parser-0.3.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8576a98b54fe08df3f9b67b546ff4993fdff4a042ae4d99a5d84651840b0bd5d"}, + {file = "ogn_parser-0.3.11-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7f7f366862dd5adf42336eed69d6fe8f4d60d5f5df2dbe4a02dad9fe0e51b18"}, + {file = "ogn_parser-0.3.11-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24539617b328f9f2e0bb9d9226cffdf8ca78657e05ff02e12edb30eaba1cf446"}, + {file = "ogn_parser-0.3.11-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b22dd84e1eb51e6d93b97ea9146fdc14bb6b85ffc2f5a68b0ebd88ef58a10fd"}, + {file = "ogn_parser-0.3.11-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24fa35bf36567d77f263de070746d6db2dd740103926cbf0cac8d2f905e05830"}, + {file = "ogn_parser-0.3.11-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63be7b30b07fa8c6dd8fe9b0318e529a71d32b81685ea982fc086be71903e15b"}, + {file = "ogn_parser-0.3.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d90a64dc4e858ef2aff24ca5db6e2eb943e7b7f6a4168b428d292ec17c8a81a"}, + {file = "ogn_parser-0.3.11-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b86ef6df7b05c9057246c0a4e3ac0d9d365414a384e7db13af9ac11a5e732ea0"}, + {file = "ogn_parser-0.3.11-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:2d5ea5cfeeb5dc50bdd66112152d02eb9b38a53584eedd9b594692890d56626e"}, + {file = "ogn_parser-0.3.11-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:dd53b16cd4adddcb76aa55d44332a1ef5dd4d9189fde3b5a4d38fe4847c98a9d"}, + {file = "ogn_parser-0.3.11-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:68255457f5306a3f446f359bce62b98cd8bbd6317d261f3cf98d99acffec0a26"}, + {file = "ogn_parser-0.3.11-cp311-cp311-win32.whl", hash = "sha256:2961de043d57224c52eada2cc9dcd78e7801dba1183c2b1d4f38833b07cecf23"}, + {file = "ogn_parser-0.3.11-cp311-cp311-win_amd64.whl", hash = "sha256:0ef5bdff2557c3ba4f6ee5a2b3ad7a1be6cc547067c617f9a3e9105821e1d5bc"}, + {file = "ogn_parser-0.3.11-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:8770150dc0fa70605730f452d0d397e1487720b659401f0e53f62c6874c90653"}, + {file = "ogn_parser-0.3.11-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0adf53416f4c34da0779a4a26abc040090602fb159b7a4715f58ab1b398472ec"}, + {file = "ogn_parser-0.3.11-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45f4eb3d04cd2104da1882fff3a8e33eb09df34f66cf74f7ee358218e2534d56"}, + {file = "ogn_parser-0.3.11-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:625bbab1f8745362474656ac72b6a4dfc6408feb8eb2142eb1b19929c7486984"}, + {file = "ogn_parser-0.3.11-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:15f04ebf1272e5a17b3f91ddbeebceb79aa7414ac97c33cb1c645352f08b1ae0"}, + {file = "ogn_parser-0.3.11-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b32da8e363b778c96ae9911ad3930b2cf1fd0d3a04285dafc78d9081647cb0d"}, + {file = "ogn_parser-0.3.11-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4c6944255605b2be4c6da9a492b1d7019bcd5b52262c86d7289117ea024ce7fd"}, + {file = "ogn_parser-0.3.11-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:597249ce8316baf6b5f375404de117ddf20a704d1e60ebb5d0877102ac1cfbd2"}, + {file = "ogn_parser-0.3.11-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6e0cfb1a802a3a396f901a085e25c8b88d3f61cf68cfe6f912d3e29b74c1952a"}, + {file = "ogn_parser-0.3.11-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7ed7cbd40bcb5eb9478a6abf74446cd4eb28108c69348c49a3b5c171adbdce6c"}, + {file = "ogn_parser-0.3.11-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4e7b6914641df22db4fb2e182fcd91737584690b535fb7f5e3b5597b2b43f1ec"}, + {file = "ogn_parser-0.3.11-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0157c80f8038328932dbf97fa5dab18bc413a4bcd0bbdd5ca2efb733194b61d7"}, + {file = "ogn_parser-0.3.11-cp312-cp312-win32.whl", hash = "sha256:553997a50fc8c39f0d804ab7d2608dea5850c56748500d7dff3e7c50aa69f0e3"}, + {file = "ogn_parser-0.3.11-cp312-cp312-win_amd64.whl", hash = "sha256:7d02ee647acf0a2a2c1a62ff45bec70e3e85716f77dad2c2cbf1c23718b3ed48"}, + {file = "ogn_parser-0.3.11-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:fc1cfde99b54bf18665334e434bf1566e3ace5fdbc546da471be843f462e70d8"}, + {file = "ogn_parser-0.3.11-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a965a8b8abdf88eae7a600078c9cb36ff3534a67aa08fd9b41c30d20c9ac5067"}, + {file = "ogn_parser-0.3.11-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f339d18ccbaef495dc073eeefa8005f7178ae770fbba752c939d1ebc240b83fb"}, + {file = "ogn_parser-0.3.11-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:559236ca8591699dbe9d76a941ee296b5d10165d895340283fc9bd49e0c71181"}, + {file = "ogn_parser-0.3.11-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b619d6eb9b0380296dbd71e1c7e38fa05424547841b14a19dff018073418e26"}, + {file = "ogn_parser-0.3.11-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1cd515ab5531ae0afae82e20c0f618f37d1248489d88d802e8bf6d59538c9536"}, + {file = "ogn_parser-0.3.11-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07fd5b7c5a08a69c0e97295926f1e4e16c174093339cf7a945eb8e78331050ab"}, + {file = "ogn_parser-0.3.11-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e68f7d44cf1ba33ae42dee7b342ff8808ed72eeaf583c70d6c6d3f526c7eea40"}, + {file = "ogn_parser-0.3.11-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5e91b2c315b99f6b290aac5cfaad255c7413b5d7f9b460407d52013a2ff3a852"}, + {file = "ogn_parser-0.3.11-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:979c75cb83e71ab304dd40bcb9a49548ff6979852dd1420228c128134fa3fd75"}, + {file = "ogn_parser-0.3.11-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:a65d0135c722efdf23ba007bd439b4d9212888698e1c62ec05b4d60ae39fd5ec"}, + {file = "ogn_parser-0.3.11-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ec614305b6f77b541a026af0c4fb797e094779df6e211600accbff2c4def2f51"}, + {file = "ogn_parser-0.3.11-cp313-cp313-win32.whl", hash = "sha256:7a2f4217b83770c38e7d6b152924cbc1fd1db0c46227349ba3155552c3258b8c"}, + {file = "ogn_parser-0.3.11-cp313-cp313-win_amd64.whl", hash = "sha256:156b981151c8bbb092114cf50cb4a8d92db3191af8e5f82c30fb590ba6046254"}, + {file = "ogn_parser-0.3.11-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadf26d175d6f12e4a43c69d949cb7962442541505a97bbcfa84544b49d29c36"}, + {file = "ogn_parser-0.3.11-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:86e4d76cd69cc153793ef27e059d8b29626b3cf029a459ee488b941b34c5b726"}, + {file = "ogn_parser-0.3.11-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419f89a952a56759db7a307b59a0c882635991701ba137c5205ee6d56fd261d8"}, + {file = "ogn_parser-0.3.11-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:05997ce20b375a7987185f4e3577aa6b5b798cc1f0583806be10387bdea1945a"}, + {file = "ogn_parser-0.3.11-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:071f614a6ec2e882e80726c9eb1cee55c96439c307d57859a9f6cec1b4c8ddd9"}, + {file = "ogn_parser-0.3.11-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:1acfddcde2d62f8688b6b151137a618bf42792d0d394bf7cd3a836e879c0f1f2"}, + {file = "ogn_parser-0.3.11-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:37f27fe87ede38377f29ae266a1ceec7f8daa7fa8f533d884886c9bc14186448"}, + {file = "ogn_parser-0.3.11-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f214205fdd3339b8f70c56f7575fcaafea0fb6039f87a8cedbbabafb7d3deb29"}, + {file = "ogn_parser-0.3.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:543380f92d048195c2e33d61a21a0efa6313e9e0daf99425e8f9ed6919ba85c5"}, + {file = "ogn_parser-0.3.11-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:45d16d39dfa7042dca21a069d8455dbf304fef3894d48ffb5aef5c4f47731368"}, + {file = "ogn_parser-0.3.11-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d12b27c94564adcc0ea49bc9d9dac92b40980c03a48040ff492e0e23132d4337"}, + {file = "ogn_parser-0.3.11-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b41461376982f72c93cfa9cafaa4689031d14cb893d09e865f0c558a513ea80d"}, + {file = "ogn_parser-0.3.11-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:84a77c21a547092ffb4302d8f956649441666e9228e0bc14a2f76a829b737179"}, + {file = "ogn_parser-0.3.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a63102f427a3ef4411edf5f87cda7d207fcc0cf8e78a43f8683a15e47cb9d355"}, + {file = "ogn_parser-0.3.11-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c5054eb7ef630ec19039c8c25ae832cd19da3a52a2b2b9f1224b9ba2d858f9ba"}, + {file = "ogn_parser-0.3.11-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:1270647f135b5a46a9364d6b2c965b970734b17bd36bfa33cde419575a3a9f56"}, + {file = "ogn_parser-0.3.11-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d1d86e79924265362fe9db76bfd420c8bd9a7d92e5fcde934953905b6bc846ec"}, + {file = "ogn_parser-0.3.11-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:54312853d3d2d9d531e03e89f1e10f3a186d6ae58bdc76aac5ba6a320d6448b7"}, + {file = "ogn_parser-0.3.11-cp39-cp39-win32.whl", hash = "sha256:7bca26c752416c11e5665e89410e6d04c7270d91de0f51ea51e663047504a9d2"}, + {file = "ogn_parser-0.3.11-cp39-cp39-win_amd64.whl", hash = "sha256:e737f16847e653213e241cb1a0440e4fcb9ca45b305c49b9a7f0b720158ac716"}, + {file = "ogn_parser-0.3.11-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a2b34c66a92853dbcb83339e466614f6deb72269f70ebf47fd97681fe261bb2"}, + {file = "ogn_parser-0.3.11-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:472419b64f876d27f1f1ae9869f74107f9bb826fa9accfed8d960ae71677d039"}, + {file = "ogn_parser-0.3.11-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bb02e18c5014f84fa0059431898c25afedbd21ac847625333f9cf117805375f"}, + {file = "ogn_parser-0.3.11-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4ad53c7363239408b47115d61c3d97d7b0c5d1d1338b3573697a1dded8e32e2"}, + {file = "ogn_parser-0.3.11-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d447ab81e4a925ebc23e9b2a9294bdad0a661d46e784c5b4730f7be9ed048756"}, + {file = "ogn_parser-0.3.11-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb335d4b91625f0ca957f3e32fc2cda07d65b4a81441aa7310e2ce04ac7052b"}, + {file = "ogn_parser-0.3.11-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:80e439c2cabcd2e6ec97479a6086cdad218a129dd7f23f1717916afec5b95ceb"}, + {file = "ogn_parser-0.3.11-pp310-pypy310_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:703f24e19e51a32f7c8cb22e84437ea694b8abf48d3445716ef593611d59ee31"}, + {file = "ogn_parser-0.3.11-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:3071ca2ebc3ef4029e27afb803df38370b71f59bdc8bb6cfafec560489cb1603"}, + {file = "ogn_parser-0.3.11-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:7b970b652d702e17f188091328c52444482f9560e4f0da86bd77a2acf273fb30"}, + {file = "ogn_parser-0.3.11-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90aa377e9cf1e4661ce3b59f4a187aec6b3161b713464ff7315f71aeeea0a24a"}, + {file = "ogn_parser-0.3.11-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:885146252556522fb02b787ad19d4e259fa8d47639850f23e46b393f70c88fa4"}, + {file = "ogn_parser-0.3.11-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5042f38feff89f7bb03278d0bfb79a3820a6710f5c9bd7548f60667cc662796"}, + {file = "ogn_parser-0.3.11-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d4d5202df1240fc2b8cbba32f24a995eb5919b17ba6b2082b2b7a98a29024afa"}, + {file = "ogn_parser-0.3.11-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4d174c949c9c4bdfa9b60375a5ab299e4c16e769d965fa28a132e24f7405c5c9"}, + {file = "ogn_parser-0.3.11-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da0f803c8cde6344dd0bdc5c72b9ddbc59a507184c1bacd7d1c640df4030dd51"}, + {file = "ogn_parser-0.3.11-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:318c446405bed6970e2b0969da0d7a33397a323e38f82c01ff9fe6d080ad686e"}, + {file = "ogn_parser-0.3.11-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:4188311a853a62cbf7368cf28e4a6ee929823efc92f844640d43fb67bf6c17e2"}, + {file = "ogn_parser-0.3.11-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:ae0608f409c8eaafc1a0b7bb973504a7222578de6bc5f0e8b674cece09567114"}, + {file = "ogn_parser-0.3.11-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:c5335f63135759b511c5139e243115f369756349d8ceab78651219b2b7bd8b74"}, + {file = "ogn_parser-0.3.11-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01f0fd09bc4fac622876e95c339660cde8124340eea222fd1f3f009867eb93fa"}, + {file = "ogn_parser-0.3.11-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0a6d794ef13dd74064ef00e8a9445ef8623183de000841f9c02f585d568741b"}, + {file = "ogn_parser-0.3.11-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dbb45dd9af4e4765942b6dc546c5e068704bf8bdb5bc89fe11b80db98ade4771"}, + {file = "ogn_parser-0.3.11-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a0485236e7f088f5e4ccb90627442388ed35aeec4083aeec060990c4aa7ffff8"}, + {file = "ogn_parser-0.3.11-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:a9188687a6bd9a8d993580091cf4776b0136a4e651091bb7dcbe73ad0854cbb5"}, + {file = "ogn_parser-0.3.11-pp39-pypy39_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:4402f4b6f4f57cda1dd5fa9f2ae92f194bec938e4d57bcae7c577730b43bc747"}, + {file = "ogn_parser-0.3.11-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:329bd9e3e14891e6e9876e57e80ed75a4fbbbaca2abb2e35b97f5800d1dc9696"}, + {file = "ogn_parser-0.3.11-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:48b52f052c5f87b9dca58cc51a2d061161b2e977ede055b0a3721247b1170872"}, + {file = "ogn_parser-0.3.11.tar.gz", hash = "sha256:856206e3375b0c4d493cde8aa8db6328591404c2a6ef457bcc52086c448cd669"}, +] + [[package]] name = "packaging" -version = "24.2" +version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"}, - {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"}, + {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, + {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] [[package]] @@ -306,6 +419,18 @@ files = [ dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "py-cpuinfo" +version = "9.0.0" +description = "Get CPU info with pure Python" +optional = false +python-versions = "*" +groups = ["dev"] +files = [ + {file = "py-cpuinfo-9.0.0.tar.gz", hash = "sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690"}, + {file = "py_cpuinfo-9.0.0-py3-none-any.whl", hash = "sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5"}, +] + [[package]] name = "pycodestyle" version = "2.13.0" @@ -353,6 +478,27 @@ tomli = {version = ">=1", markers = "python_version < \"3.11\""} [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +[[package]] +name = "pytest-benchmark" +version = "5.1.0" +description = "A ``pytest`` fixture for benchmarking code. It will group the tests into rounds that are calibrated to the chosen timer." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pytest-benchmark-5.1.0.tar.gz", hash = "sha256:9ea661cdc292e8231f7cd4c10b0319e56a2118e2c09d9f50e1b3d150d2aca105"}, + {file = "pytest_benchmark-5.1.0-py3-none-any.whl", hash = "sha256:922de2dfa3033c227c96da942d1878191afa135a29485fb942e85dff1c592c89"}, +] + +[package.dependencies] +py-cpuinfo = "*" +pytest = ">=8.1" + +[package.extras] +aspect = ["aspectlib"] +elasticsearch = ["elasticsearch"] +histogram = ["pygal", "pygaljs", "setuptools"] + [[package]] name = "pytest-cov" version = "6.1.1" @@ -458,4 +604,4 @@ zstd = ["zstandard (>=0.18.0)"] [metadata] lock-version = "2.1" python-versions = ">=3.9" -content-hash = "a27639fb20733da0d1c89badbc616eb74acceb08e82e0dd5848b2ef26dcf58bb" +content-hash = "0d6f75144deb74c6ffbd5d526969f2e3cf3e4a612a81aac6ee724ebc56b6a4df" diff --git a/pyproject.toml b/pyproject.toml index c9c0257..b32e081 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,8 @@ keywords = ["gliding", "ogn"] readme = "README.md" requires-python = ">=3.9" dependencies = [ - "requests (>=2.32.3,<3.0.0)" + "requests (>=2.32.3,<3.0.0)", + "ogn-parser (>=0.3.8,<0.4.0)" ] classifiers = [ "Development Status :: 4 - Beta", @@ -44,6 +45,7 @@ packages = [ flake8 = "^7.2.0" pytest = "^8.3.5" pytest-cov = "^6.1.1" +pytest-benchmark = "^5.1.0" [build-system] requires = ["poetry-core>=2.0.0,<3.0.0"] From 34e8d0461ee6120c9ede759adc5a80127ac8b44f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Gr=C3=BCndger?= Date: Mon, 5 May 2025 09:48:01 +0200 Subject: [PATCH 2/5] test the rust parser --- tests/parser/test_parse.py | 2 +- tests/rust_migration/__init__.py | 19 ++++++ tests/rust_migration/test_benchmarks.py | 26 ++++++++ tests/rust_migration/test_migration.py | 82 +++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 tests/rust_migration/__init__.py create mode 100644 tests/rust_migration/test_benchmarks.py create mode 100644 tests/rust_migration/test_migration.py diff --git a/tests/parser/test_parse.py b/tests/parser/test_parse.py index b452f50..d8945ca 100644 --- a/tests/parser/test_parse.py +++ b/tests/parser/test_parse.py @@ -84,7 +84,7 @@ def test_naviter_beacons(): @pytest.mark.skip(reason="todo") def test_delay_beacons(): - _parse_valid_beacon_data_file(filename='OGNDELAY_Delay.txt', beacon_type='unknown') + _parse_valid_beacon_data_file(filename='OGNDELAY_Delay.txt', beacon_type='tracker') def test_wx_beacons(): diff --git a/tests/rust_migration/__init__.py b/tests/rust_migration/__init__.py new file mode 100644 index 0000000..84979ce --- /dev/null +++ b/tests/rust_migration/__init__.py @@ -0,0 +1,19 @@ +import os + + +def get_valid_beacons(): + # iterate over all txt files in the valid_messages directory + valid_beacons = [] + for filename in os.listdir(os.path.dirname(__file__) + '/../../ogn-aprs-protocol/valid_messages/'): + if filename in ('OGADSB_ADSB.txt', 'OGCAPT_Capturs.txt'): + continue + + if filename.endswith('.txt'): + with open(os.path.dirname(__file__) + '/../../ogn-aprs-protocol/valid_messages/' + filename) as f: + for line in f: + if line.strip() == '': + continue + + valid_beacons.append(line.strip()) + + return valid_beacons diff --git a/tests/rust_migration/test_benchmarks.py b/tests/rust_migration/test_benchmarks.py new file mode 100644 index 0000000..c4ff91d --- /dev/null +++ b/tests/rust_migration/test_benchmarks.py @@ -0,0 +1,26 @@ +from ogn.parser.parse import parse +from datetime import datetime + +from tests.rust_migration import get_valid_beacons + +valid_beacons = get_valid_beacons() + + +def legacy_parser(): + reference_timestamp = datetime(2015, 4, 10, 17, 0) + for line in valid_beacons: + parse(line, reference_timestamp=reference_timestamp) + + +def rust_parser(): + reference_timestamp = datetime(2015, 4, 10, 17, 0) + for line in valid_beacons: + parse(line, reference_timestamp=reference_timestamp, use_rust_parser=True) + + +def test_legacy_parser(benchmark): + benchmark(legacy_parser) + + +def test_rust_parser(benchmark): + benchmark(rust_parser) diff --git a/tests/rust_migration/test_migration.py b/tests/rust_migration/test_migration.py new file mode 100644 index 0000000..aa4754f --- /dev/null +++ b/tests/rust_migration/test_migration.py @@ -0,0 +1,82 @@ +from ogn.parser.parse import parse +from datetime import datetime +import pytest + +from tests.rust_migration import get_valid_beacons + +valid_beacons = get_valid_beacons() + + +def test_parser_differences_keywise(): + differences = [] + error_combinations = {} + for line in valid_beacons: + py_parse_result = parse(line, reference_timestamp=datetime(2015, 4, 10, 17, 0), use_server_timestamp=False) + rust_parse_result = parse(line, reference_timestamp=datetime(2015, 4, 10, 17, 0), use_server_timestamp=False, use_rust_parser=True) + py_parse_result, rust_parse_result = sort_dicts(py_parse_result, rust_parse_result) + + # Skip deprecated APRS messages + if py_parse_result['aprs_type'] in ('status', 'position') and py_parse_result['dstcall'] == 'APRS': + continue + + missing_keys = [k for k in py_parse_result.keys() - rust_parse_result.keys() if py_parse_result[k] not in ('', None) and k not in ('comment')] + extra_keys = rust_parse_result.keys() - py_parse_result.keys() + if (missing_keys or extra_keys) and str((py_parse_result['dstcall'], missing_keys, extra_keys)) not in error_combinations: + error_combinations[str((py_parse_result['dstcall'], missing_keys, extra_keys))] = True + missing_entries = ('\n' + '\n'.join([f" - {k}: {py_parse_result[k]}" for k in missing_keys])) if missing_keys else ' []' + extra_entries = ('\n' + '\n'.join([f" - {k}: {rust_parse_result[k]}" for k in extra_keys])) if extra_keys else ' []' + delta = f"```\n{line}\ndropped:{missing_entries}\nadded:{extra_entries}\n```" + differences.append(delta) + + if differences: + pytest.fail('\n\n'.join(differences)) + + +def test_parser_differences_valuewise(): + differences = [] + for line in valid_beacons: + py_parse_result = parse(line, reference_timestamp=datetime(2015, 4, 10, 17, 0), use_server_timestamp=False) + rust_parse_result = parse(line, reference_timestamp=datetime(2015, 4, 10, 17, 0), use_server_timestamp=False, use_rust_parser=True) + py_parse_result, rust_parse_result = sort_dicts(py_parse_result, rust_parse_result) + + # Skip deprecated APRS messages + if py_parse_result['aprs_type'] in ('status', 'position') and py_parse_result['dstcall'] == 'APRS': + continue + + for key in py_parse_result.keys() & rust_parse_result.keys(): + # Skip keys that differ too much (comment: intended; gps_quality and timestamp: FIXME) + if key in ('comment', 'gps_quality'): + continue + + py_value, rust_value = py_parse_result[key], rust_parse_result[key] + + # Skip keys that are not equal but are close enough (float values) + if isinstance(py_value, float) and isinstance(rust_value, float) and abs(py_value - rust_value) < 1e-4: + continue + + if py_value != rust_value: + entry = f"{line}\nPython: {key}={py_value}\nRust: {key}={rust_value}" + differences.append(entry) + + if differences: + pytest.fail('\n\n'.join(differences)) + + +def test_failing(): + failing_lines = [ + r"""MYC78FF44>OGNMYC:>140735h Pilot=RichardHunt""", + ] + + for line in failing_lines: + py_parse_result = parse(line, reference_timestamp=datetime(2015, 4, 10, 17, 0), use_server_timestamp=False) + rust_parse_result = parse(line, reference_timestamp=datetime(2015, 4, 10, 17, 0), use_server_timestamp=False, use_rust_parser=True) + py_parse_result, rust_parse_result = sort_dicts(py_parse_result, rust_parse_result) + + assert py_parse_result == rust_parse_result, f"Results do not match for line: {line}\nPy: {py_parse_result}\nRu: {rust_parse_result}" + + +def sort_dicts(dict1, dict2): + # sort dictionaries for comparison + dict1 = {k: dict1[k] for k in sorted(dict1.keys())} + dict2 = {k: dict2[k] for k in sorted(dict2.keys())} + return dict1, dict2 From e50ccf6e6ea870f5377a65bbd48da5415cc7a264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Gr=C3=BCndger?= Date: Mon, 5 May 2025 17:21:14 +0200 Subject: [PATCH 3/5] added migration documentation --- parser_v2_migration.md | 480 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 480 insertions(+) create mode 100644 parser_v2_migration.md diff --git a/parser_v2_migration.md b/parser_v2_migration.md new file mode 100644 index 0000000..b243b57 --- /dev/null +++ b/parser_v2_migration.md @@ -0,0 +1,480 @@ +# About this document +With version 2, the regex-based parser core has been replaced by a new Rust-based parser. +This document outlines the background and the resulting changes. + +# Background +This parser, which was originally implemented entirely in native Python, has existed since 2016. +Over time, several issues have emerged: +1. Although the APRS format is extensively documented, compliance with the format is not enforced (e.g., it's possible to use illegal APRS callsigns like "D-1234" or invalid positions such as |lat| > 90 or |lon| > 180). +2. The APRS comment field, used by OGN for additional information (signal strength, software version, CPU load, etc.), is not standardized. In practice, new fields are added or changed sporadically—typically without prior discussion. +3. Similarly, new `dst_call`s are occasionally introduced, again usually without prior discussion. This means the parser must be retroactively adjusted to accommodate them. +4. To maximize performance, the original parser used (precompiled) regular expressions. Since the regex used depended on the `dst_call`, the number of regexes was substantial. Additionally, regex patterns are not very intuitive to read. +5. Even with regex optimization, the parser’s throughput was limited to around 100,000 beacons per minute on a Raspberry Pi. On thermally active days, this rate can be significantly exceeded, making improved performance desirable. + +# Solution +To solve the above-mentioned problems, the parser was completely rewritten. For performance reasons, the Rust language was used: +[ogn-parser-rs](https://github.com/Meisterschueler/ogn-parser-rs). +Python bindings were created using [Maturin](https://github.com/PyO3/maturin) and [pythonize](https://github.com/davidhewitt/pythonize). +These bindings are compiled for all major architectures: + +- Linux (x86_64, x86, aarch64, armv7, s390x, ppc64le) +- musllinux (x86_64, x86, aarch64, armv7) +- Windows (x64, x86) +- macOS (x86_64, aarch64) + +They are published on PyPI and can be installed using `pip install ogn_parser`. +Within Rust, the parser is over 11x faster than the regex-based approach. +In Python, it is still 3.5x faster than the regex parser. To keep differences between the regex parser and the Rust parser minimal, some calculations (e.g., true timestamp calculation and computation of distance and bearing to the receiver) are still performed in Python. +This reduces the performance advantage to 2x. In the future, these calculations can also be moved to Rust to fully realize the potential 3.5x speedup. + +# Consequences +Since all beacons are now parsed by a single parser that no longer considers `dst_call`, the results may differ from the previous parser. + +## Fundamental differences +1. APRS comments from positions and statuses are split into words (separated by spaces). Unparsable parts of the comment are joined (with spaces) and assigned to the attribute user_comment. +2. The raw APRS comment is no longer returned. +3. The SSID in an APRS callsign must conform to APRS standards, i.e., it must be numeric. +4. Elements with an empty string ("") or None are not returned. + +## Beacon-specific differences +The differences between the Rust parser and the old parser are analyzed using the example beacons stored at [ogn-aprs-protocol](https://github.com/glidernet/ogn-aprs-protocol). +For each example, a sample beacon is provided along with the differing parser results. +“dropped” and “added” refer to attributes that were only found by the Python or Rust parser, respectively. + +### APRS +(The `dst_call` "APRS" is outdated and is therefore not considered.) + +### FXCAPP +``` +FXC201699>FXCAPP,qAS,FLYXC:/114100h3236.19S/01903.01Eg312/017/A=003474 !W05! id1E201699 +dropped: [] +added: + - address_type: 2 + - stealth: False + - no-tracking: False + - aircraft_type: 7 + - address: 201699 +``` + +### OGAIRM +``` +AIRF00108>OGAIRM,qAS,Airmate:/151551h4326.16N\00637.42E^245/186/A=002555 !W18! idf00108 +198 +dropped: [] +added: + - user_comment: idf00108 +198 +``` + +### OGAPIK +``` +FLRDDA396>OGAPIK,qAS,APIK:/113700h4520.00N/00510.00E'000/050/A=000472 !W37! id07DDA396 euiecdb86fffe00001b +dropped: [] +added: + - address_type: 3 + - stealth: False + - no-tracking: False + - aircraft_type: 1 + - user_comment: euiecdb86fffe00001b + - address: DDA396 +``` + +### OGEVARIO +``` +OGN06A4D0>OGEVARIO,qAS,EVARIO:/054700h4223.23N/00902.69E'251/005/A=001130 !W34! id1F06A4D0 +000fpm +0rot gps8x3 +dropped: [] +added: + - climb_rate: 0.0 + - address_type: 3 + - stealth: False + - gps_quality: 8x3 + - no-tracking: False + - aircraft_type: 7 + - turn_rate: 0.0 + - address: 06A4D0 +``` + +### OGNINRE +``` +OGN8A0749>OGNINRE,qAS,INREACH:/142700h0448.38N/07600.74W'000/000/A=004583 id300434060496190 inReac True +dropped: [] +added: + - user_comment: id300434060496190 inReac True +``` + +``` +ICAA01158>OGNINRE,qAS,Inreach:/073000h4315.20N/00450.47W'247/001/A=001056 !W00! id3DA01158 +000fpm +0.0rot 0.0dB 0e +0.0kHz gps2x3 +dropped: [] +added: + - climb_rate: 0.0 + - frequency_offset: 0.0 + - signal_quality: 0.0 + - address_type: 1 + - stealth: False + - gps_quality: 2x3 + - no-tracking: False + - aircraft_type: 15 + - error_count: 0 + - turn_rate: 0.0 + - address: A01158 +``` + +### OGLT24 +``` +FLRDDE48A>OGLT24,qAS,LT24:/102606h4030.47N/00338.38W'000/018/A=002267 id25387 +000fpm GPS +dropped: + - lt24_id: 25387 + - source: GPS +added: + - user_comment: id25387 GPS +``` + +### OGNAVI +``` +NAV042121>OGNAVI,qAS,NAVITER:/140648h4550.36N/01314.85E'090/152/A=001086 !W47! id0440042121 +000fpm +0.5rot +dropped: + - do_not_track: False +added: + - no-tracking: False +``` + +### OGNTRK +``` +OGN8E20F0>OGNTRK,LEMD,OGNDELAY*,qAS,DLY2APRS:/114801h4030.23N/00341.96W'079/000/A=002450 !W44! id068E20F0 +000fpm +1.1rot 56.9dB 0e +3.1kHz gps3x5 31dly +dropped: [] +added: + - no-tracking: False + - user_comment: 31dly +``` + +### OGNDVS +``` +LEZS>OGNDVS,TCPIP*,qAC,GLIDERN2:>161501h 1:0 2.563s/1ms 74dB/+9kHz 090/5/6kt 51.6F 86.9% 0.0mm/h +dropped: [] +added: + - user_comment: 1:0 2.563s/1ms 74dB/+9kHz 090/5/6kt 51.6F 86.9% 0.0mm/h +``` + +### OGNEMO +``` +CZBA2>OGNEMO,TCPIP*,qAC,NEMO:/094148h4326.64NI07951.12W&/A=000602 v2.00 nemobridge - Superlinxs 9dBi omni +dropped: + - relay: TCPIP +added: + - user_comment: v2.00 nemobridge - Superlinxs 9dBi omni +``` + +``` +CZBA4>OGNEMO,TCPIP*,qAC,NEMO:/094148h4326.58NI07950.86W&/A=000602 v2.00 nemobridge - Omni 0dBi + 23dB AMP +dropped: + - relay: TCPIP +added: + - signal_quality: 23.0 + - user_comment: v2.00 nemobridge - Omni 0dBi + AMP +``` + +### OGNFNO +``` +FNO0003F4>OGNFNO,qAS,Neurone:/171603h4338.04N/00510.74E'316/000/A=000623 !W28! id200003F4 +000fpm +0.0rot +dropped: [] +added: + - climb_rate: 0.0 + - address_type: 0 + - stealth: False + - no-tracking: False + - aircraft_type: 8 + - turn_rate: 0.0 + - address: 0003F4 +``` + +### OGNFNT +``` +FNT1103CE>OGNFNT,qAS,FNB1103CE:/183727h5057.94N/00801.00Eg355/002/A=001042 !W10! id1E1103CE +03fpm +dropped: [] +added: + - no-tracking: False +``` + +``` +FNB1103CE>OGNFNT,TCPIP*,qAC,GLIDERN3:/183738h5057.95NI00801.00E&/A=001042 +dropped: + - relay: TCPIP +added: [] +``` + +``` +FNT1118C1>OGNFNT,qAS,BelaVista:/191919h3841.98N\00919.39Wn !W68! id3E1118C1 FNT71 26.3dB -12.4kHz +dropped: [] +added: + - frequency_offset: -12.399999618530273 + - no-tracking: False + - signal_quality: 26.299999237060547 + - user_comment: !W68! FNT71 +``` + +``` +FNT1118C1>OGNFNT,qAS,BelaVista:>191924h Name="FlrmAIC" 26.0dB -12.1kHz +dropped: + - frequency_offset: -12.1 + - fanet_name: FlrmAIC + - signal_quality: 26.0 +added: + - user_comment: Name="FlrmAIC" 26.0dB -12.1kHz +``` + +``` +FNT0828B8>OGNFNT,qAS,Huenenb2:/210414h4710.43N/00826.96E_152/001g002t057r000p000h48b10227 0.0dB +dropped: [] +added: + - signal_quality: 0.0 + - beacon_type: fanet +``` + +### OGNMTK +``` +MTK39447C>OGNMTK,qAS,Microtrak:/170054h4909.81N/00218.71E'136/000/A=000209 !W15! id2339447C rssi-111 snr-5 sf10 gw1 abw0108000B36 gps16 +dropped: [] +added: + - user_comment: rssi-111 snr-5 sf10 gw1 abw0108000B36 gps16 +``` + +### OGNMYC +``` +MYC78FF44>OGNMYC:>140735h Pilot=RichardHunt +dropped: [] +added: + - user_comment: Pilot=RichardHunt +``` + +``` +MYC78FF44>OGNMYC:/140814h5205.34N/00207.12W'000/000/A=000095 id1B78FF44 +dropped: [] +added: + - address_type: 3 + - stealth: False + - no-tracking: False + - aircraft_type: 6 + - address: 78FF44 +``` + +### OGNSDR +``` +LILH>OGNSDR,TCPIP*,qAC,GLIDERN2:/132201h4457.61NI00900.58E&/A=000423 +dropped: + - relay: TCPIP +added: [] +``` + +``` +SCVH>OGNSDR,TCPIP*,qAC,GLIDERN4:>153734h v0.2.8.RPI-GPU CPU:0.3 RAM:744.5/968.2MB NTP:3.6ms/+2.0ppm +68.2C 3/3Acfts[1h] Lat:1.6s RF:-8+67.8ppm/+10.33dB/+1.3dB@10km[30998]/+10.4dB@10km[3/5] +dropped: [] +added: + - good_and_bad_senders: 5 + - good_senders: 3 + - latency: 1.600000023841858 + - senders_messages: 30998 + - senders_signal: 1.2999999523162842 + - rec_crystal_correction: -8 + - good_senders_signal: 10.399999618530273 + - rec_input_noise: 10.329999923706055 + - rec_crystal_correction_fine: 67.80000305175781 +``` + +### OGNSXR +``` +K2B9>OGNSXR,TCPIP*,qAC,GLIDERN0:/000627h4353.05NI07215.22W&/A=000692 +dropped: + - relay: TCPIP +added: [] +``` + +``` +K2B9>OGNSXR,TCPIP*,qAC,GLIDERN0:>152545h vMB101-ESP32-OGNbase 3.7V 0/min 0/0Acfts[1h] 10sat time_synched 0_m_r_uptime +dropped: [] +added: + - senders_visible: 0 + - senders_total: 0 + - user_comment: vMB101-ESP32-OGNbase 0/min 10sat time_synched 0_m_r_uptime + - voltage: 3.700000047683716 +``` + +``` +K2B9>OGNSXR,TCPIP*,qAC,GLIDERN0:>194557h vMB101-ESP32-OGNbase 3.8V 9sat time_synched 1155_m_r_sleep +dropped: [] +added: + - user_comment: vMB101-ESP32-OGNbase 9sat time_synched 1155_m_r_sleep + - voltage: 3.799999952316284 +``` + +``` +K2B9>OGNSXR,TCPIP*,qAC,GLIDERN0:>195343h vMB101-ESP32-OGNbase time_not_synched 269_m_uptime +dropped: [] +added: + - user_comment: vMB101-ESP32-OGNbase time_not_synched 269_m_uptime +``` + +### OGFLR +``` +FLR1EFCCC>OGFLR,qAS,K2B9:/172500h4432.07N/07306.44W^000/000/A=000646 !W72! id061EFCCC +039fpm 67.0dB +dropped: [] +added: + - signal_quality: 67.0 +``` + +### OGNTRK +``` +OGN3FC859>OGNTRK,qAS,LZHL:>093215h h00 v00 9sat/1 164m 1002.6hPa +20.2degC 0% 3.34V 14/-110.5dBm 1/min +dropped: + - hardware_version: 0 + - relays: 1 + - noise_level: -110.5 + - humidity: 0 + - temperature: 20.2 + - gps_altitude: 164 + - pressure: 1002.6 + - gps_quality: 1 + - gps_satellites: 9 + - transmitter_power: 14 + - software_version: 0 +added: + - user_comment: h00 v00 9sat/1 164m 1002.6hPa +20.2degC 0% 14/-110.5dBm 1/min +``` + +``` +OGN2FD00F>OGNTRK,qAS,LZHL:/093213h4848.78N/01708.32E'000/000/A=000538 !W12! id072FD00F -058fpm +0.0rot FL003.12 32.8dB 0e -0.8kHz gps3x5 +dropped: [] +added: + - no-tracking: False +``` + +``` +FLRDD9C70>OGNTRK,OGN2FD00F*,qAS,LZHL:/093021h4848.77N/01708.33E'000/000/A=000518 !W66! id06DD9C70 -019fpm +0.0rot 29.0dB 0e -0.8kHz gps2x3 s6.09 h03 +dropped: [] +added: + - hardware_version: 3 + - no-tracking: False + - software_version: 6.090000152587891 +``` + +### OGNTTN +``` +OGN60E6A0>OGNTTN,qAS,TTN2OGN:/181002h4030.24N/00341.95W'235/003/A=002343 !W27! id0760E6A0 +000fpm -12.4rot FL020.64 gps3x5 7.2dB +dropped: [] +added: + - flightlevel: 20.639999389648438 + - climb_rate: 0.0 + - signal_quality: 7.199999809265137 + - address_type: 3 + - stealth: False + - gps_quality: 3x5 + - no-tracking: False + - aircraft_type: 1 + - turn_rate: -37.19999885559082 + - address: 60E6A0 +``` + +``` +OGN60E6A0>OGNTTN,qAS,TTN2OGN:>172606h SN=OGN60E6A0 9.5dB +dropped: [] +added: + - user_comment: SN=OGN60E6A0 9.5dB +``` + +``` +OGN60E6A0>OGNTTN,qAS,TTN2OGN:>173011h h02 v01 8sat/1/22dB 724m 932.3hPa +31.8degC +18.8% +4.28V 14/-99.5dBm 63/min 6.8dB +dropped: [] +added: + - user_comment: h02 v01 8sat/1/22dB 724m 932.3hPa +31.8degC +18.8% 14/-99.5dBm 63/min 6.8dB + - voltage: 4.28000020980835 +``` + +### OGTTN3 +``` +OGNC3088C>OGTTN3,qAS,TTN3OGN:/180751h4030.23N/00341.98W'115/003/A=002218 !W61! id07C3088C +000fpm -7.2rot FL024.48 gps9x14 9.5dB +dropped: [] +added: + - flightlevel: 24.479999542236328 + - climb_rate: 0.0 + - signal_quality: 9.5 + - address_type: 3 + - stealth: False + - gps_quality: 9x14 + - no-tracking: False + - aircraft_type: 1 + - turn_rate: -21.59999942779541 + - address: C3088C +``` + +``` +OGN60E6A0>OGTTN3,qAS,TTN3OGN:>180757h Class=OPEN Base=LELT PilotID=12345 9.2dB +dropped: [] +added: + - user_comment: Class=OPEN Base=LELT PilotID=12345 9.2dB +``` + +### OGNWMN +``` +N0ABC7>OGNWMN,qAS,WMN:/134300h4923.60N/01535.54E'000/000/A=001624 id07N0ABC7A39971 +dropped: [] +added: + - user_comment: id07N0ABC7A39971 +``` + +### OGPAW +``` +ICA404EC3>OGPAW,qAS,UKWOG:/104337h5211.24N\00032.65W^124/081/A=004026 !W62! id21404EC3 12.5dB +2.2kHz +dropped: [] +added: + - frequency_offset: 2.200000047683716 + - signal_quality: 12.5 + - address_type: 1 + - stealth: False + - no-tracking: False + - aircraft_type: 8 + - address: 404EC3 +``` + +``` +ICA404EC3>OGPAW,qAS,UKWOG:/104341h5211.18N\00032.53W^131/081/A=004010 !W85! id21404EC3 9.2dB +2.2kHz +10.0dBm +dropped: [] +added: + - frequency_offset: 2.200000047683716 + - signal_quality: 9.199999809265137 + - address_type: 1 + - signal_power: 10.0 + - stealth: False + - no-tracking: False + - aircraft_type: 8 + - address: 404EC3 +``` + +### OGSKYL +``` +FLRDDDD78>OGSKYL,qAS,SKYLINES:/134403h4225.90N/00144.83E'000/000/A=008438 id2816 +000fpm +dropped: + - skylines_id: 2816 +added: + - user_comment: id2816 +``` + +### OGSPID +``` +FLRDDF944>OGSPID,qAS,SPIDER:/190930h3322.78S/07034.60W'000/000/A=002263 id300234010617040 +19dB LWE 3D +dropped: + - spider_id: 300234010617040 + - signal_power: 19 + - gps_quality: 3D + - spider_registration: LWE +added: + - signal_quality: 19.0 + - user_comment: id300234010617040 LWE 3D +``` + +### OGSPOT +``` +ICA3E7540>OGSPOT,qAS,SPOT:/161427h1448.35S/04610.86W'000/000/A=008677 id0-2860357 SPOT3 GOOD +dropped: + - status: GOOD + - model: SPOT3 + - spot_id: 0-2860357 +added: + - user_comment: id0-2860357 SPOT3 GOOD +``` From c27ab126b58cd660238e8b207fe022c1d9020505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Gr=C3=BCndger?= Date: Tue, 20 May 2025 19:35:50 +0200 Subject: [PATCH 4/5] updated migration documentation --- ogn/parser/parse.py | 2 +- parser_v2_migration.md | 219 ++++++++++++++++++++----------- tests/rust_migration/__init__.py | 5 +- 3 files changed, 145 insertions(+), 81 deletions(-) diff --git a/ogn/parser/parse.py b/ogn/parser/parse.py index 51daeff..a309863 100644 --- a/ogn/parser/parse.py +++ b/ogn/parser/parse.py @@ -31,7 +31,7 @@ 'OGFLR6': 'flarm', 'OGFLR7': 'flarm', 'OGFLYM': 'flymaster', - 'OGINRE': 'inreach', + 'OGNINRE': 'inreach', 'OGLT24': 'lt24', 'OGNMTK': 'microtrak', 'OGNAVI': 'naviter', diff --git a/parser_v2_migration.md b/parser_v2_migration.md index b243b57..3b31f66 100644 --- a/parser_v2_migration.md +++ b/parser_v2_migration.md @@ -44,85 +44,124 @@ For each example, a sample beacon is provided along with the differing parser re ### APRS (The `dst_call` "APRS" is outdated and is therefore not considered.) +### OGNCAPT and OGNINRE +These messages are ignored + ### FXCAPP ``` FXC201699>FXCAPP,qAS,FLYXC:/114100h3236.19S/01903.01Eg312/017/A=003474 !W05! id1E201699 dropped: [] added: + - address: 201699 - address_type: 2 - stealth: False - - no-tracking: False - aircraft_type: 7 - - address: 201699 + - no-tracking: False ``` -### OGAIRM +### OGADSB ``` -AIRF00108>OGAIRM,qAS,Airmate:/151551h4326.16N\00637.42E^245/186/A=002555 !W18! idf00108 +198 +ICA34364F>OGADSB,qAS,LEMDadsb:/140827h4038.69N\00344.37W^235/248/A=010350 id2534364F +1792fpm fnANE06BK dropped: [] added: - - user_comment: idf00108 +198 + - climb_rate: 9.10336 + - address: 34364F + - address_type: 1 + - stealth: False + - aircraft_type: 9 + - no-tracking: False + - user_comment: fnANE06BK ``` -### OGAPIK ``` -FLRDDA396>OGAPIK,qAS,APIK:/113700h4520.00N/00510.00E'000/050/A=000472 !W37! id07DDA396 euiecdb86fffe00001b +ICA4CA4EB>OGADSB,qAS,LEMDadsb:/142346h4034.03N\00315.64W^008/370/A=038000 id254CA4EB +000fpm 0.0rot fnRYR4057 regEI-DPG modelB738 dropped: [] added: - - address_type: 3 + - climb_rate: 0.0 + - turn_rate: 0.0 + - address: 4CA4EB + - address_type: 1 - stealth: False + - aircraft_type: 9 - no-tracking: False - - aircraft_type: 1 - - user_comment: euiecdb86fffe00001b - - address: DDA396 + - user_comment: fnRYR4057 regEI-DPG modelB738 ``` -### OGEVARIO ``` -OGN06A4D0>OGEVARIO,qAS,EVARIO:/054700h4223.23N/00902.69E'251/005/A=001130 !W34! id1F06A4D0 +000fpm +0rot gps8x3 +ICAA4FFC0>OGADSB,qAS,ADSBExch:/151612h4002.40N/10513.83W'000/001/A=005275 !W00! id05A4FFC0 +0fpm +0.0rot 0.0dB 0e +0.0kHz gps2x3 dropped: [] added: - climb_rate: 0.0 + - frequency_offset: 0.0 + - turn_rate: 0.0 + - signal_quality: 0.0 + - address: A4FFC0 + - error_count: 0 + - address_type: 1 + - stealth: False + - aircraft_type: 1 + - no-tracking: False + - gps_quality: 2x3 +``` + +### OGADSL +``` +OGN631C45>OGADSL,qAS,OxfBarton:/104536h5145.96N/00111.47W'267/000/A=000312 !W25! id07631C45 -177fpm 22.8dB +2.5kHz gps63x63 +dropped: [] +added: + - climb_rate: -0.8991600000000001 + - frequency_offset: 2.5 + - signal_quality: 22.799999237060547 + - address: 631C45 - address_type: 3 - stealth: False - - gps_quality: 8x3 + - aircraft_type: 1 - no-tracking: False - - aircraft_type: 7 - - turn_rate: 0.0 - - address: 06A4D0 + - gps_quality: 63x63 +``` + +### OGAIRM +``` +AIRF00108>OGAIRM,qAS,Airmate:/151551h4326.16N\00637.42E^245/186/A=002555 !W18! idf00108 +198 +dropped: [] +added: + - user_comment: idf00108 +198 ``` -### OGNINRE +### OGAPIK ``` -OGN8A0749>OGNINRE,qAS,INREACH:/142700h0448.38N/07600.74W'000/000/A=004583 id300434060496190 inReac True +FLRDDA396>OGAPIK,qAS,APIK:/113700h4520.00N/00510.00E'000/050/A=000472 !W37! id07DDA396 euiecdb86fffe00001b dropped: [] added: - - user_comment: id300434060496190 inReac True + - address: DDA396 + - address_type: 3 + - stealth: False + - aircraft_type: 1 + - no-tracking: False + - user_comment: euiecdb86fffe00001b ``` +### OGEVARIO ``` -ICAA01158>OGNINRE,qAS,Inreach:/073000h4315.20N/00450.47W'247/001/A=001056 !W00! id3DA01158 +000fpm +0.0rot 0.0dB 0e +0.0kHz gps2x3 +OGN06A4D0>OGEVARIO,qAS,EVARIO:/054700h4223.23N/00902.69E'251/005/A=001130 !W34! id1F06A4D0 +000fpm +0rot gps8x3 dropped: [] added: - climb_rate: 0.0 - - frequency_offset: 0.0 - - signal_quality: 0.0 - - address_type: 1 + - turn_rate: 0.0 + - address: 06A4D0 + - address_type: 3 - stealth: False - - gps_quality: 2x3 + - aircraft_type: 7 - no-tracking: False - - aircraft_type: 15 - - error_count: 0 - - turn_rate: 0.0 - - address: A01158 + - gps_quality: 8x3 ``` ### OGLT24 ``` FLRDDE48A>OGLT24,qAS,LT24:/102606h4030.47N/00338.38W'000/018/A=002267 id25387 +000fpm GPS dropped: - - lt24_id: 25387 - source: GPS + - lt24_id: 25387 added: - user_comment: id25387 GPS ``` @@ -167,8 +206,8 @@ CZBA4>OGNEMO,TCPIP*,qAC,NEMO:/094148h4326.58NI07950.86W&/A=000602 v2.00 nemobrid dropped: - relay: TCPIP added: - - signal_quality: 23.0 - user_comment: v2.00 nemobridge - Omni 0dBi + AMP + - signal_quality: 23.0 ``` ### OGNFNO @@ -177,12 +216,12 @@ FNO0003F4>OGNFNO,qAS,Neurone:/171603h4338.04N/00510.74E'316/000/A=000623 !W28! i dropped: [] added: - climb_rate: 0.0 + - turn_rate: 0.0 + - address: 0003F4 - address_type: 0 - stealth: False - - no-tracking: False - aircraft_type: 8 - - turn_rate: 0.0 - - address: 0003F4 + - no-tracking: False ``` ### OGNFNT @@ -205,8 +244,8 @@ FNT1118C1>OGNFNT,qAS,BelaVista:/191919h3841.98N\00919.39Wn !W68! id3E1118C1 FNT7 dropped: [] added: - frequency_offset: -12.399999618530273 - - no-tracking: False - signal_quality: 26.299999237060547 + - no-tracking: False - user_comment: !W68! FNT71 ``` @@ -224,8 +263,8 @@ added: FNT0828B8>OGNFNT,qAS,Huenenb2:/210414h4710.43N/00826.96E_152/001g002t057r000p000h48b10227 0.0dB dropped: [] added: - - signal_quality: 0.0 - beacon_type: fanet + - signal_quality: 0.0 ``` ### OGNMTK @@ -248,11 +287,11 @@ added: MYC78FF44>OGNMYC:/140814h5205.34N/00207.12W'000/000/A=000095 id1B78FF44 dropped: [] added: + - address: 78FF44 - address_type: 3 - stealth: False - - no-tracking: False - aircraft_type: 6 - - address: 78FF44 + - no-tracking: False ``` ### OGNSDR @@ -267,15 +306,15 @@ added: [] SCVH>OGNSDR,TCPIP*,qAC,GLIDERN4:>153734h v0.2.8.RPI-GPU CPU:0.3 RAM:744.5/968.2MB NTP:3.6ms/+2.0ppm +68.2C 3/3Acfts[1h] Lat:1.6s RF:-8+67.8ppm/+10.33dB/+1.3dB@10km[30998]/+10.4dB@10km[3/5] dropped: [] added: - - good_and_bad_senders: 5 + - rec_crystal_correction_fine: 67.80000305175781 - good_senders: 3 - latency: 1.600000023841858 - - senders_messages: 30998 - - senders_signal: 1.2999999523162842 + - rec_input_noise: 10.329999923706055 - rec_crystal_correction: -8 + - senders_signal: 1.2999999523162842 - good_senders_signal: 10.399999618530273 - - rec_input_noise: 10.329999923706055 - - rec_crystal_correction_fine: 67.80000305175781 + - good_and_bad_senders: 5 + - senders_messages: 30998 ``` ### OGNSXR @@ -290,18 +329,18 @@ added: [] K2B9>OGNSXR,TCPIP*,qAC,GLIDERN0:>152545h vMB101-ESP32-OGNbase 3.7V 0/min 0/0Acfts[1h] 10sat time_synched 0_m_r_uptime dropped: [] added: - - senders_visible: 0 - senders_total: 0 - - user_comment: vMB101-ESP32-OGNbase 0/min 10sat time_synched 0_m_r_uptime + - senders_visible: 0 - voltage: 3.700000047683716 + - user_comment: vMB101-ESP32-OGNbase 0/min 10sat time_synched 0_m_r_uptime ``` ``` K2B9>OGNSXR,TCPIP*,qAC,GLIDERN0:>194557h vMB101-ESP32-OGNbase 3.8V 9sat time_synched 1155_m_r_sleep dropped: [] added: - - user_comment: vMB101-ESP32-OGNbase 9sat time_synched 1155_m_r_sleep - voltage: 3.799999952316284 + - user_comment: vMB101-ESP32-OGNbase 9sat time_synched 1155_m_r_sleep ``` ``` @@ -311,29 +350,21 @@ added: - user_comment: vMB101-ESP32-OGNbase time_not_synched 269_m_uptime ``` -### OGFLR -``` -FLR1EFCCC>OGFLR,qAS,K2B9:/172500h4432.07N/07306.44W^000/000/A=000646 !W72! id061EFCCC +039fpm 67.0dB -dropped: [] -added: - - signal_quality: 67.0 -``` - ### OGNTRK ``` OGN3FC859>OGNTRK,qAS,LZHL:>093215h h00 v00 9sat/1 164m 1002.6hPa +20.2degC 0% 3.34V 14/-110.5dBm 1/min dropped: + - temperature: 20.2 - hardware_version: 0 + - software_version: 0 + - pressure: 1002.6 - relays: 1 - - noise_level: -110.5 - humidity: 0 - - temperature: 20.2 - gps_altitude: 164 - - pressure: 1002.6 + - noise_level: -110.5 - gps_quality: 1 - gps_satellites: 9 - transmitter_power: 14 - - software_version: 0 added: - user_comment: h00 v00 9sat/1 164m 1002.6hPa +20.2degC 0% 14/-110.5dBm 1/min ``` @@ -349,9 +380,9 @@ added: FLRDD9C70>OGNTRK,OGN2FD00F*,qAS,LZHL:/093021h4848.77N/01708.33E'000/000/A=000518 !W66! id06DD9C70 -019fpm +0.0rot 29.0dB 0e -0.8kHz gps2x3 s6.09 h03 dropped: [] added: - - hardware_version: 3 - - no-tracking: False - software_version: 6.090000152587891 + - no-tracking: False + - hardware_version: 3 ``` ### OGNTTN @@ -359,16 +390,32 @@ added: OGN60E6A0>OGNTTN,qAS,TTN2OGN:/181002h4030.24N/00341.95W'235/003/A=002343 !W27! id0760E6A0 +000fpm -12.4rot FL020.64 gps3x5 7.2dB dropped: [] added: - - flightlevel: 20.639999389648438 - climb_rate: 0.0 + - turn_rate: -37.19999885559082 + - flightlevel: 20.639999389648438 - signal_quality: 7.199999809265137 + - address: 60E6A0 - address_type: 3 - stealth: False - - gps_quality: 3x5 + - aircraft_type: 1 - no-tracking: False + - gps_quality: 3x5 +``` + +``` +OGN8E20F0>OGNTTN,RELAY*,qAS,TTN2OGN:/172403h4030.24N/00341.94W'182/002/A=002441 !W66! id078E20F0 -039fpm +8.4rot FL023.17 gps4x7 7.5dB +dropped: [] +added: + - climb_rate: -0.19812000000000002 + - turn_rate: 25.19999885559082 + - flightlevel: 23.170000076293945 + - signal_quality: 7.5 + - address: 8E20F0 + - stealth: False + - address_type: 3 - aircraft_type: 1 - - turn_rate: -37.19999885559082 - - address: 60E6A0 + - no-tracking: False + - gps_quality: 4x7 ``` ``` @@ -382,25 +429,25 @@ added: OGN60E6A0>OGNTTN,qAS,TTN2OGN:>173011h h02 v01 8sat/1/22dB 724m 932.3hPa +31.8degC +18.8% +4.28V 14/-99.5dBm 63/min 6.8dB dropped: [] added: - - user_comment: h02 v01 8sat/1/22dB 724m 932.3hPa +31.8degC +18.8% 14/-99.5dBm 63/min 6.8dB - voltage: 4.28000020980835 + - user_comment: h02 v01 8sat/1/22dB 724m 932.3hPa +31.8degC +18.8% 14/-99.5dBm 63/min 6.8dB ``` -### OGTTN3 +### OGNTTN3 ``` OGNC3088C>OGTTN3,qAS,TTN3OGN:/180751h4030.23N/00341.98W'115/003/A=002218 !W61! id07C3088C +000fpm -7.2rot FL024.48 gps9x14 9.5dB dropped: [] added: - - flightlevel: 24.479999542236328 - climb_rate: 0.0 + - turn_rate: -21.59999942779541 + - flightlevel: 24.479999542236328 - signal_quality: 9.5 + - address: C3088C - address_type: 3 - stealth: False - - gps_quality: 9x14 - - no-tracking: False - aircraft_type: 1 - - turn_rate: -21.59999942779541 - - address: C3088C + - no-tracking: False + - gps_quality: 9x14 ``` ``` @@ -410,6 +457,22 @@ added: - user_comment: Class=OPEN Base=LELT PilotID=12345 9.2dB ``` +``` +OGNC30824>OGTTN3,RELAY*,qAS,TTN3OGN:/181005h4030.24N/00341.94W'218/000/A=002353 !W56! id07C30824 +000fpm +8.6rot FL024.45 gps3x5 8.2dB +dropped: [] +added: + - climb_rate: 0.0 + - turn_rate: 25.80000114440918 + - flightlevel: 24.450000762939453 + - signal_quality: 8.199999809265137 + - address: C30824 + - stealth: False + - address_type: 3 + - aircraft_type: 1 + - no-tracking: False + - gps_quality: 3x5 +``` + ### OGNWMN ``` N0ABC7>OGNWMN,qAS,WMN:/134300h4923.60N/01535.54E'000/000/A=001624 id07N0ABC7A39971 @@ -425,11 +488,11 @@ dropped: [] added: - frequency_offset: 2.200000047683716 - signal_quality: 12.5 + - address: 404EC3 - address_type: 1 - stealth: False - - no-tracking: False - aircraft_type: 8 - - address: 404EC3 + - no-tracking: False ``` ``` @@ -437,13 +500,13 @@ ICA404EC3>OGPAW,qAS,UKWOG:/104341h5211.18N\00032.53W^131/081/A=004010 !W85! id21 dropped: [] added: - frequency_offset: 2.200000047683716 + - signal_power: 10.0 - signal_quality: 9.199999809265137 + - address: 404EC3 - address_type: 1 - - signal_power: 10.0 - stealth: False - - no-tracking: False - aircraft_type: 8 - - address: 404EC3 + - no-tracking: False ``` ### OGSKYL @@ -459,10 +522,10 @@ added: ``` FLRDDF944>OGSPID,qAS,SPIDER:/190930h3322.78S/07034.60W'000/000/A=002263 id300234010617040 +19dB LWE 3D dropped: - - spider_id: 300234010617040 - signal_power: 19 - - gps_quality: 3D + - spider_id: 300234010617040 - spider_registration: LWE + - gps_quality: 3D added: - signal_quality: 19.0 - user_comment: id300234010617040 LWE 3D diff --git a/tests/rust_migration/__init__.py b/tests/rust_migration/__init__.py index 84979ce..a861e90 100644 --- a/tests/rust_migration/__init__.py +++ b/tests/rust_migration/__init__.py @@ -1,11 +1,12 @@ import os +from pathlib import Path def get_valid_beacons(): # iterate over all txt files in the valid_messages directory valid_beacons = [] - for filename in os.listdir(os.path.dirname(__file__) + '/../../ogn-aprs-protocol/valid_messages/'): - if filename in ('OGADSB_ADSB.txt', 'OGCAPT_Capturs.txt'): + for filename in os.listdir(Path(__file__).parent.parent.parent / "ogn-aprs-protocol" / "valid_messages"): + if filename in ('OGNINRE_InReach.txt', 'OGCAPT_Capturs.txt'): continue if filename.endswith('.txt'): From 1a6a7661bc80f4fb952fe7ad343f74e404d38b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Gr=C3=BCndger?= Date: Wed, 21 May 2025 09:16:00 +0200 Subject: [PATCH 5/5] Skip development test cases --- tests/rust_migration/test_migration.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/rust_migration/test_migration.py b/tests/rust_migration/test_migration.py index aa4754f..cf0d684 100644 --- a/tests/rust_migration/test_migration.py +++ b/tests/rust_migration/test_migration.py @@ -7,6 +7,7 @@ valid_beacons = get_valid_beacons() +@pytest.mark.skip("For development only") def test_parser_differences_keywise(): differences = [] error_combinations = {} @@ -32,6 +33,7 @@ def test_parser_differences_keywise(): pytest.fail('\n\n'.join(differences)) +@pytest.mark.skip("For development only") def test_parser_differences_valuewise(): differences = [] for line in valid_beacons: @@ -62,6 +64,7 @@ def test_parser_differences_valuewise(): pytest.fail('\n\n'.join(differences)) +@pytest.mark.skip("For development only") def test_failing(): failing_lines = [ r"""MYC78FF44>OGNMYC:>140735h Pilot=RichardHunt""",