From 94e5935a805214dcf53f6e85da9c7d00474eb3e6 Mon Sep 17 00:00:00 2001 From: Dylan Verheul Date: Sat, 31 Jan 2026 05:56:54 +0100 Subject: [PATCH 1/6] Refactor test fixtures --- src/euring/formats.py | 15 +++-- src/euring/main.py | 4 +- src/euring/record.py | 8 +-- tests/fixtures.py | 123 +++++++++++++++++++++++++++++++++++++++ tests/test_cli.py | 60 +------------------ tests/test_converters.py | 21 +------ tests/test_decoding.py | 74 ++--------------------- uv.lock | 104 ++++++++++++++++----------------- 8 files changed, 195 insertions(+), 214 deletions(-) create mode 100644 tests/fixtures.py diff --git a/src/euring/formats.py b/src/euring/formats.py index 20b6a0f..9733cfb 100644 --- a/src/euring/formats.py +++ b/src/euring/formats.py @@ -36,20 +36,19 @@ def format_display_name(format: str) -> str: def format_hint(format: str) -> str | None: """Suggest the closest machine-friendly format name.""" - raw = format.strip() - lower = raw.lower() - if lower in FORMAT_VALUES: - return lower - if "2020" in lower: + value = format.strip().lower() + if value in FORMAT_VALUES: + return value + if "2020" in value: return FORMAT_EURING2020 - if "2000" in lower: - if "plus" in lower or "+" in lower: + if "2000" in value: + if "plus" in value or "+" in value: return FORMAT_EURING2000PLUS return FORMAT_EURING2000 return None -def unknown_format_error(format: str, name: str = "format") -> str: +def unknown_format_error_message(format: str, name: str = "format") -> str: """Return an error message for an unknown EURING format.""" hint = format_hint(format) message = f'Unknown {name} "{format}". Use {FORMAT_EURING2000}, {FORMAT_EURING2000PLUS}, or {FORMAT_EURING2020}."' diff --git a/src/euring/main.py b/src/euring/main.py index 645b4b5..135836d 100644 --- a/src/euring/main.py +++ b/src/euring/main.py @@ -25,7 +25,7 @@ FORMAT_EURING2000PLUS, FORMAT_EURING2020, normalize_format, - unknown_format_error, + unknown_format_error_message, ) from .record import EuringRecord @@ -531,7 +531,7 @@ def fields( try: normalized_format = normalize_format(format) except ValueError: - typer.echo(unknown_format_error(format, name="format"), err=True) + typer.echo(unknown_format_error_message(format, name="format"), err=True) raise typer.Exit(1) if normalized_format == FORMAT_EURING2000: allowed_keys = keys_2000 diff --git a/src/euring/record.py b/src/euring/record.py index 861756c..ab47b16 100644 --- a/src/euring/record.py +++ b/src/euring/record.py @@ -15,7 +15,7 @@ FORMAT_JSON, format_display_name, normalize_format, - unknown_format_error, + unknown_format_error_message, ) from .rules import record_rule_errors, requires_euring2020 from .utils import is_all_hyphens, is_empty @@ -447,7 +447,7 @@ def _normalize_target_format(target_format: str) -> str: try: return normalize_format(target_format) except ValueError: - raise ValueError(unknown_format_error(target_format, "target format")) + raise ValueError(unknown_format_error_message(target_format, "target format")) def _normalize_source_format(source_format: str | None, value: str) -> str: @@ -467,7 +467,7 @@ def _normalize_source_format(source_format: str | None, value: str) -> str: try: return normalize_format(source_format) except ValueError: - raise ValueError(unknown_format_error(source_format, "source format")) + raise ValueError(unknown_format_error_message(source_format, "source format")) def _field_index(key: str) -> int: @@ -485,7 +485,7 @@ def _normalize_decode_format(format: str | None) -> str | None: try: return normalize_format(format) except ValueError: - raise EuringConstraintException(unknown_format_error(format)) + raise EuringConstraintException(unknown_format_error_message(format)) def _decode_raw_record(value: object, format: str | None) -> tuple[str, dict[str, str], list[dict[str, str]]]: diff --git a/tests/fixtures.py b/tests/fixtures.py new file mode 100644 index 0000000..7bc989f --- /dev/null +++ b/tests/fixtures.py @@ -0,0 +1,123 @@ +"""Shared test fixtures for EURING records.""" + +from euring.fields import EURING2000_FIELDS, EURING_FIELDS + +default_test_record_dict = { + "ringing_scheme": "GBB", + "primary_identification_method": "A0", + "identification_number": "1234567890", + "verification_of_the_metal_ring": "0", + "metal_ring_information": "1", + "other_marks_information": "ZZ", + "species_mentioned": "00010", + "species_concluded": "00010", + "manipulated": "N", + "moved_before_recovery": "0", + "catching_method": "M", + "catching_lures": "U", + "sex_mentioned": "U", + "sex_concluded": "U", + "age_mentioned": "2", + "age_concluded": "2", + "status": "U", + "brood_size": "99", + "pullus_age": "99", + "accuracy_of_pullus_age": "0", + "date": "01012024", + "accuracy_of_date": "0", + "time": "0000", + "place_code": "AB00", + "geographical_coordinates": "+0000000+0000000", + "accuracy_of_coordinates": "1", + "condition": "9", + "circumstances": "99", + "circumstances_presumed": "0", + "euring_code_identifier": "4", + "distance": "00000", + "direction": "000", + "elapsed_time": "00000", + # EURING2000 fields stop here. + "wing_length": "", + "third_primary": "", + "state_of_wing_point": "", + "mass": "", + "moult": "", + "plumage_code": "", + "hind_claw": "", + "bill_length": "", + "bill_method": "", + "total_head_length": "", + "tarsus": "", + "tarsus_method": "", + "tail_length": "", + "tail_difference": "", + "fat_score": "", + "fat_score_method": "", + "pectoral_muscle": "", + "brood_patch": "", + "primary_score": "", + "primary_moult": "", + "old_greater_coverts": "", + "alula": "", + "carpal_covert": "", + "sexing_method": "", + "place_name": "", + "remarks": "", + "reference": "", + # EURING2000+ fields stop here. + "latitude": "", + "longitude": "", + "current_place_code": "", + "more_other_marks": "", +} + + +def _field_index(key: str) -> int: + for index, field in enumerate(EURING_FIELDS): + if field.key == key: + return index + raise ValueError(f"Unknown key: {key}") + + +def _set_value(values: list[str], key: str, value: str) -> None: + values[_field_index(key)] = value + + +def _make_euring2000_plus_record(*, accuracy: str) -> str: + values = [default_test_record_dict[field.key] for field in EURING2000_FIELDS] + values[_field_index("accuracy_of_coordinates")] = accuracy + return "|".join(values) + + +def _make_euring2000_plus_record_with_invalid_species(*, accuracy: str = "1") -> str: + values = _make_euring2000_plus_record(accuracy=accuracy).split("|") + values[6] = "12ABC" + values[7] = "12ABC" + return "|".join(values) + + +def _make_euring2020_record_for_coords( + *, + geo_value: str, + lat_value: str, + lng_value: str, + accuracy: str = "1", +) -> str: + base = _make_euring2000_plus_record(accuracy=accuracy).split("|") + values = base + [""] * (len(EURING_FIELDS) - len(base)) + _set_value(values, "geographical_coordinates", geo_value) + _set_value(values, "latitude", lat_value) + _set_value(values, "longitude", lng_value) + return "|".join(values) + + +def _make_euring2020_record_with_coords() -> str: + values = [""] * len(EURING_FIELDS) + _set_value(values, "ringing_scheme", "GBB") + _set_value(values, "primary_identification_method", "A0") + _set_value(values, "identification_number", "1234567890") + _set_value(values, "place_code", "AB00") + _set_value(values, "accuracy_of_coordinates", "A") + _set_value(values, "latitude", "52.3760") + _set_value(values, "longitude", "4.9000") + return "|".join(values) diff --git a/tests/test_cli.py b/tests/test_cli.py index 49178f7..d89e677 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -7,65 +7,7 @@ from euring.coordinates import _lat_to_euring_coordinate, _lng_to_euring_coordinate from euring.fields import EURING_FIELDS from euring.main import app - - -def _make_euring2020_record_with_coords() -> str: - values = [""] * len(EURING_FIELDS) - - def set_value(key: str, value: str) -> None: - for index, field in enumerate(EURING_FIELDS): - if field["key"] == key: - values[index] = value - return - raise ValueError(f"Unknown key: {key}") - - set_value("ringing_scheme", "GBB") - set_value("primary_identification_method", "A0") - set_value("identification_number", "1234567890") - set_value("place_code", "AB00") - set_value("accuracy_of_coordinates", "A") - set_value("latitude", "52.3760") - set_value("longitude", "4.9000") - return "|".join(values) - - -def _make_euring2000_plus_record_with_invalid_species() -> str: - values = [ - "GBB", - "A0", - "1234567890", - "0", - "1", - "ZZ", - "12ABC", - "12ABC", - "N", - "0", - "M", - "U", - "U", - "U", - "2", - "2", - "U", - "99", - "99", - "0", - "01012024", - "0", - "0000", - "AB00", - "+0000000+0000000", - "1", - "9", - "99", - "0", - "4", - "00000", - "000", - "00000", - ] - return "|".join(values) +from fixtures import _make_euring2000_plus_record_with_invalid_species, _make_euring2020_record_with_coords def test_lookup_place_verbose_includes_details(): diff --git a/tests/test_converters.py b/tests/test_converters.py index bdfad58..711e28f 100644 --- a/tests/test_converters.py +++ b/tests/test_converters.py @@ -8,6 +8,7 @@ from euring.converters import convert_euring_record from euring.coordinates import _lat_to_euring_coordinate, _lng_to_euring_coordinate from euring.fields import EURING_FIELDS +from fixtures import _make_euring2020_record_with_coords def _load_fixture(module_name: str, attr: str) -> str: @@ -19,26 +20,6 @@ def _load_fixture(module_name: str, attr: str) -> str: return getattr(module, attr)[0] -def _make_euring2020_record_with_coords() -> str: - values = [""] * len(EURING_FIELDS) - for index, field in enumerate(EURING_FIELDS): - if field["key"] == "ringing_scheme": - values[index] = "GBB" - if field["key"] == "primary_identification_method": - values[index] = "A0" - if field["key"] == "identification_number": - values[index] = "1234567890" - if field["key"] == "place_code": - values[index] = "AB00" - if field["key"] == "accuracy_of_coordinates": - values[index] = "A" - if field["key"] == "latitude": - values[index] = "52.3760" - if field["key"] == "longitude": - values[index] = "4.9000" - return "|".join(values) - - def test_convert_unknown_target_format(): with pytest.raises(ValueError): convert_euring_record("value", target_format="bad") diff --git a/tests/test_decoding.py b/tests/test_decoding.py index 95d3606..4147b83 100644 --- a/tests/test_decoding.py +++ b/tests/test_decoding.py @@ -15,75 +15,11 @@ from euring.fields import EURING_FIELDS from euring.parsing import euring_decode_value from euring.types import TYPE_ALPHANUMERIC, TYPE_INTEGER - - -def _make_euring2000_plus_record(*, accuracy: str) -> str: - values = [ - "GBB", - "A0", - "1234567890", - "0", - "1", - "ZZ", - "00010", - "00010", - "N", - "0", - "M", - "U", - "U", - "U", - "2", - "2", - "U", - "99", - "99", - "0", - "01012024", - "0", - "0000", - "AB00", - "+0000000+0000000", - accuracy, - "9", - "99", - "0", - "4", - "00000", - "000", - "00000", - ] - return "|".join(values) - - -def _make_euring2000_plus_record_with_invalid_species(*, accuracy: str) -> str: - values = _make_euring2000_plus_record(accuracy=accuracy).split("|") - values[6] = "12ABC" - values[7] = "12ABC" - return "|".join(values) - - -def _make_euring2020_record_for_coords( - *, - geo_value: str, - lat_value: str, - lng_value: str, - accuracy: str = "1", -) -> str: - base = _make_euring2000_plus_record(accuracy=accuracy).split("|") - values = base + [""] * (len(EURING_FIELDS) - len(base)) - - def set_value(key: str, value: str) -> None: - for index, field in enumerate(EURING_FIELDS): - if field["key"] == key: - values[index] = value - return - raise ValueError(f"Unknown key: {key}") - - set_value("geographical_coordinates", geo_value) - set_value("latitude", lat_value) - set_value("longitude", lng_value) - return "|".join(values) +from fixtures import ( + _make_euring2000_plus_record, + _make_euring2000_plus_record_with_invalid_species, + _make_euring2020_record_for_coords, +) class TestDecoding: diff --git a/uv.lock b/uv.lock index b938458..3234eeb 100644 --- a/uv.lock +++ b/uv.lock @@ -384,31 +384,31 @@ toml = [ [[package]] name = "debugpy" -version = "1.8.19" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/73/75/9e12d4d42349b817cd545b89247696c67917aab907012ae5b64bbfea3199/debugpy-1.8.19.tar.gz", hash = "sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb", size = 1644590, upload-time = "2025-12-15T21:53:28.044Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/98/d57054371887f37d3c959a7a8dc3c76b763acb65f5e78d849d7db7cadc5b/debugpy-1.8.19-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:fce6da15d73be5935b4438435c53adb512326a3e11e4f90793ea87cd9f018254", size = 2098493, upload-time = "2025-12-15T21:53:30.149Z" }, - { url = "https://files.pythonhosted.org/packages/ee/dd/c517b9aa3500157a30e4f4c4f5149f880026bd039d2b940acd2383a85d8e/debugpy-1.8.19-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:e24b1652a1df1ab04d81e7ead446a91c226de704ff5dde6bd0a0dbaab07aa3f2", size = 3087875, upload-time = "2025-12-15T21:53:31.511Z" }, - { url = "https://files.pythonhosted.org/packages/d8/57/3d5a5b0da9b63445253107ead151eff29190c6ad7440c68d1a59d56613aa/debugpy-1.8.19-cp310-cp310-win32.whl", hash = "sha256:327cb28c3ad9e17bc925efc7f7018195fd4787c2fe4b7af1eec11f1d19bdec62", size = 5239378, upload-time = "2025-12-15T21:53:32.979Z" }, - { url = "https://files.pythonhosted.org/packages/a6/36/7f9053c4c549160c87ae7e43800138f2695578c8b65947114c97250983b6/debugpy-1.8.19-cp310-cp310-win_amd64.whl", hash = "sha256:b7dd275cf2c99e53adb9654f5ae015f70415bbe2bacbe24cfee30d54b6aa03c5", size = 5271129, upload-time = "2025-12-15T21:53:35.085Z" }, - { url = "https://files.pythonhosted.org/packages/80/e2/48531a609b5a2aa94c6b6853afdfec8da05630ab9aaa96f1349e772119e9/debugpy-1.8.19-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:c5dcfa21de1f735a4f7ced4556339a109aa0f618d366ede9da0a3600f2516d8b", size = 2207620, upload-time = "2025-12-15T21:53:37.1Z" }, - { url = "https://files.pythonhosted.org/packages/1b/d4/97775c01d56071969f57d93928899e5616a4cfbbf4c8cc75390d3a51c4a4/debugpy-1.8.19-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:806d6800246244004625d5222d7765874ab2d22f3ba5f615416cf1342d61c488", size = 3170796, upload-time = "2025-12-15T21:53:38.513Z" }, - { url = "https://files.pythonhosted.org/packages/8d/7e/8c7681bdb05be9ec972bbb1245eb7c4c7b0679bb6a9e6408d808bc876d3d/debugpy-1.8.19-cp311-cp311-win32.whl", hash = "sha256:783a519e6dfb1f3cd773a9bda592f4887a65040cb0c7bd38dde410f4e53c40d4", size = 5164287, upload-time = "2025-12-15T21:53:40.857Z" }, - { url = "https://files.pythonhosted.org/packages/f2/a8/aaac7ff12ddf5d68a39e13a423a8490426f5f661384f5ad8d9062761bd8e/debugpy-1.8.19-cp311-cp311-win_amd64.whl", hash = "sha256:14035cbdbb1fe4b642babcdcb5935c2da3b1067ac211c5c5a8fdc0bb31adbcaa", size = 5188269, upload-time = "2025-12-15T21:53:42.359Z" }, - { url = "https://files.pythonhosted.org/packages/4a/15/d762e5263d9e25b763b78be72dc084c7a32113a0bac119e2f7acae7700ed/debugpy-1.8.19-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:bccb1540a49cde77edc7ce7d9d075c1dbeb2414751bc0048c7a11e1b597a4c2e", size = 2549995, upload-time = "2025-12-15T21:53:43.773Z" }, - { url = "https://files.pythonhosted.org/packages/a7/88/f7d25c68b18873b7c53d7c156ca7a7ffd8e77073aa0eac170a9b679cf786/debugpy-1.8.19-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:e9c68d9a382ec754dc05ed1d1b4ed5bd824b9f7c1a8cd1083adb84b3c93501de", size = 4309891, upload-time = "2025-12-15T21:53:45.26Z" }, - { url = "https://files.pythonhosted.org/packages/c5/4f/a65e973aba3865794da65f71971dca01ae66666132c7b2647182d5be0c5f/debugpy-1.8.19-cp312-cp312-win32.whl", hash = "sha256:6599cab8a783d1496ae9984c52cb13b7c4a3bd06a8e6c33446832a5d97ce0bee", size = 5286355, upload-time = "2025-12-15T21:53:46.763Z" }, - { url = "https://files.pythonhosted.org/packages/d8/3a/d3d8b48fec96e3d824e404bf428276fb8419dfa766f78f10b08da1cb2986/debugpy-1.8.19-cp312-cp312-win_amd64.whl", hash = "sha256:66e3d2fd8f2035a8f111eb127fa508469dfa40928a89b460b41fd988684dc83d", size = 5328239, upload-time = "2025-12-15T21:53:48.868Z" }, - { url = "https://files.pythonhosted.org/packages/71/3d/388035a31a59c26f1ecc8d86af607d0c42e20ef80074147cd07b180c4349/debugpy-1.8.19-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:91e35db2672a0abaf325f4868fcac9c1674a0d9ad9bb8a8c849c03a5ebba3e6d", size = 2538859, upload-time = "2025-12-15T21:53:50.478Z" }, - { url = "https://files.pythonhosted.org/packages/4a/19/c93a0772d0962294f083dbdb113af1a7427bb632d36e5314297068f55db7/debugpy-1.8.19-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:85016a73ab84dea1c1f1dcd88ec692993bcbe4532d1b49ecb5f3c688ae50c606", size = 4292575, upload-time = "2025-12-15T21:53:51.821Z" }, - { url = "https://files.pythonhosted.org/packages/5c/56/09e48ab796b0a77e3d7dc250f95251832b8bf6838c9632f6100c98bdf426/debugpy-1.8.19-cp313-cp313-win32.whl", hash = "sha256:b605f17e89ba0ecee994391194285fada89cee111cfcd29d6f2ee11cbdc40976", size = 5286209, upload-time = "2025-12-15T21:53:53.602Z" }, - { url = "https://files.pythonhosted.org/packages/fb/4e/931480b9552c7d0feebe40c73725dd7703dcc578ba9efc14fe0e6d31cfd1/debugpy-1.8.19-cp313-cp313-win_amd64.whl", hash = "sha256:c30639998a9f9cd9699b4b621942c0179a6527f083c72351f95c6ab1728d5b73", size = 5328206, upload-time = "2025-12-15T21:53:55.433Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b9/cbec520c3a00508327476c7fce26fbafef98f412707e511eb9d19a2ef467/debugpy-1.8.19-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:1e8c4d1bd230067bf1bbcdbd6032e5a57068638eb28b9153d008ecde288152af", size = 2537372, upload-time = "2025-12-15T21:53:57.318Z" }, - { url = "https://files.pythonhosted.org/packages/88/5e/cf4e4dc712a141e10d58405c58c8268554aec3c35c09cdcda7535ff13f76/debugpy-1.8.19-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d40c016c1f538dbf1762936e3aeb43a89b965069d9f60f9e39d35d9d25e6b809", size = 4268729, upload-time = "2025-12-15T21:53:58.712Z" }, - { url = "https://files.pythonhosted.org/packages/82/a3/c91a087ab21f1047db328c1d3eb5d1ff0e52de9e74f9f6f6fa14cdd93d58/debugpy-1.8.19-cp314-cp314-win32.whl", hash = "sha256:0601708223fe1cd0e27c6cce67a899d92c7d68e73690211e6788a4b0e1903f5b", size = 5286388, upload-time = "2025-12-15T21:54:00.687Z" }, - { url = "https://files.pythonhosted.org/packages/17/b8/bfdc30b6e94f1eff09f2dc9cc1f9cd1c6cde3d996bcbd36ce2d9a4956e99/debugpy-1.8.19-cp314-cp314-win_amd64.whl", hash = "sha256:8e19a725f5d486f20e53a1dde2ab8bb2c9607c40c00a42ab646def962b41125f", size = 5327741, upload-time = "2025-12-15T21:54:02.148Z" }, - { url = "https://files.pythonhosted.org/packages/25/3e/e27078370414ef35fafad2c06d182110073daaeb5d3bf734b0b1eeefe452/debugpy-1.8.19-py2.py3-none-any.whl", hash = "sha256:360ffd231a780abbc414ba0f005dad409e71c78637efe8f2bd75837132a41d38", size = 5292321, upload-time = "2025-12-15T21:54:16.024Z" }, +version = "1.8.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/b7/cd8080344452e4874aae67c40d8940e2b4d47b01601a8fd9f44786c757c7/debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33", size = 1645207, upload-time = "2026-01-29T23:03:28.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/be/8bd693a0b9d53d48c8978fa5d889e06f3b5b03e45fd1ea1e78267b4887cb/debugpy-1.8.20-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:157e96ffb7f80b3ad36d808646198c90acb46fdcfd8bb1999838f0b6f2b59c64", size = 2099192, upload-time = "2026-01-29T23:03:29.707Z" }, + { url = "https://files.pythonhosted.org/packages/77/1b/85326d07432086a06361d493d2743edd0c4fc2ef62162be7f8618441ac37/debugpy-1.8.20-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:c1178ae571aff42e61801a38b007af504ec8e05fde1c5c12e5a7efef21009642", size = 3088568, upload-time = "2026-01-29T23:03:31.467Z" }, + { url = "https://files.pythonhosted.org/packages/e8/60/3e08462ee3eccd10998853eb35947c416e446bfe2bc37dbb886b9044586c/debugpy-1.8.20-cp310-cp310-win32.whl", hash = "sha256:c29dd9d656c0fbd77906a6e6a82ae4881514aa3294b94c903ff99303e789b4a2", size = 5284399, upload-time = "2026-01-29T23:03:33.678Z" }, + { url = "https://files.pythonhosted.org/packages/72/43/09d49106e770fe558ced5e80df2e3c2ebee10e576eda155dcc5670473663/debugpy-1.8.20-cp310-cp310-win_amd64.whl", hash = "sha256:3ca85463f63b5dd0aa7aaa933d97cbc47c174896dcae8431695872969f981893", size = 5316388, upload-time = "2026-01-29T23:03:35.095Z" }, + { url = "https://files.pythonhosted.org/packages/51/56/c3baf5cbe4dd77427fd9aef99fcdade259ad128feeb8a786c246adb838e5/debugpy-1.8.20-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:eada6042ad88fa1571b74bd5402ee8b86eded7a8f7b827849761700aff171f1b", size = 2208318, upload-time = "2026-01-29T23:03:36.481Z" }, + { url = "https://files.pythonhosted.org/packages/9a/7d/4fa79a57a8e69fe0d9763e98d1110320f9ecd7f1f362572e3aafd7417c9d/debugpy-1.8.20-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:7de0b7dfeedc504421032afba845ae2a7bcc32ddfb07dae2c3ca5442f821c344", size = 3171493, upload-time = "2026-01-29T23:03:37.775Z" }, + { url = "https://files.pythonhosted.org/packages/7d/f2/1e8f8affe51e12a26f3a8a8a4277d6e60aa89d0a66512f63b1e799d424a4/debugpy-1.8.20-cp311-cp311-win32.whl", hash = "sha256:773e839380cf459caf73cc533ea45ec2737a5cc184cf1b3b796cd4fd98504fec", size = 5209240, upload-time = "2026-01-29T23:03:39.109Z" }, + { url = "https://files.pythonhosted.org/packages/d5/92/1cb532e88560cbee973396254b21bece8c5d7c2ece958a67afa08c9f10dc/debugpy-1.8.20-cp311-cp311-win_amd64.whl", hash = "sha256:1f7650546e0eded1902d0f6af28f787fa1f1dbdbc97ddabaf1cd963a405930cb", size = 5233481, upload-time = "2026-01-29T23:03:40.659Z" }, + { url = "https://files.pythonhosted.org/packages/14/57/7f34f4736bfb6e00f2e4c96351b07805d83c9a7b33d28580ae01374430f7/debugpy-1.8.20-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:4ae3135e2089905a916909ef31922b2d733d756f66d87345b3e5e52b7a55f13d", size = 2550686, upload-time = "2026-01-29T23:03:42.023Z" }, + { url = "https://files.pythonhosted.org/packages/ab/78/b193a3975ca34458f6f0e24aaf5c3e3da72f5401f6054c0dfd004b41726f/debugpy-1.8.20-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:88f47850a4284b88bd2bfee1f26132147d5d504e4e86c22485dfa44b97e19b4b", size = 4310588, upload-time = "2026-01-29T23:03:43.314Z" }, + { url = "https://files.pythonhosted.org/packages/c1/55/f14deb95eaf4f30f07ef4b90a8590fc05d9e04df85ee379712f6fb6736d7/debugpy-1.8.20-cp312-cp312-win32.whl", hash = "sha256:4057ac68f892064e5f98209ab582abfee3b543fb55d2e87610ddc133a954d390", size = 5331372, upload-time = "2026-01-29T23:03:45.526Z" }, + { url = "https://files.pythonhosted.org/packages/a1/39/2bef246368bd42f9bd7cba99844542b74b84dacbdbea0833e610f384fee8/debugpy-1.8.20-cp312-cp312-win_amd64.whl", hash = "sha256:a1a8f851e7cf171330679ef6997e9c579ef6dd33c9098458bd9986a0f4ca52e3", size = 5372835, upload-time = "2026-01-29T23:03:47.245Z" }, + { url = "https://files.pythonhosted.org/packages/15/e2/fc500524cc6f104a9d049abc85a0a8b3f0d14c0a39b9c140511c61e5b40b/debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a", size = 2539560, upload-time = "2026-01-29T23:03:48.738Z" }, + { url = "https://files.pythonhosted.org/packages/90/83/fb33dcea789ed6018f8da20c5a9bc9d82adc65c0c990faed43f7c955da46/debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf", size = 4293272, upload-time = "2026-01-29T23:03:50.169Z" }, + { url = "https://files.pythonhosted.org/packages/a6/25/b1e4a01bfb824d79a6af24b99ef291e24189080c93576dfd9b1a2815cd0f/debugpy-1.8.20-cp313-cp313-win32.whl", hash = "sha256:da11dea6447b2cadbf8ce2bec59ecea87cc18d2c574980f643f2d2dfe4862393", size = 5331208, upload-time = "2026-01-29T23:03:51.547Z" }, + { url = "https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl", hash = "sha256:eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7", size = 5372930, upload-time = "2026-01-29T23:03:53.585Z" }, + { url = "https://files.pythonhosted.org/packages/33/2e/f6cb9a8a13f5058f0a20fe09711a7b726232cd5a78c6a7c05b2ec726cff9/debugpy-1.8.20-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9c74df62fc064cd5e5eaca1353a3ef5a5d50da5eb8058fcef63106f7bebe6173", size = 2538066, upload-time = "2026-01-29T23:03:54.999Z" }, + { url = "https://files.pythonhosted.org/packages/c5/56/6ddca50b53624e1ca3ce1d1e49ff22db46c47ea5fb4c0cc5c9b90a616364/debugpy-1.8.20-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:077a7447589ee9bc1ff0cdf443566d0ecf540ac8aa7333b775ebcb8ce9f4ecad", size = 4269425, upload-time = "2026-01-29T23:03:56.518Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d9/d64199c14a0d4c476df46c82470a3ce45c8d183a6796cfb5e66533b3663c/debugpy-1.8.20-cp314-cp314-win32.whl", hash = "sha256:352036a99dd35053b37b7803f748efc456076f929c6a895556932eaf2d23b07f", size = 5331407, upload-time = "2026-01-29T23:03:58.481Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl", hash = "sha256:a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be", size = 5372521, upload-time = "2026-01-29T23:03:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7", size = 5337658, upload-time = "2026-01-29T23:04:17.404Z" }, ] [[package]] @@ -974,30 +974,30 @@ wheels = [ [[package]] name = "psutil" -version = "7.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/73/cb/09e5184fb5fc0358d110fc3ca7f6b1d033800734d34cac10f4136cfac10e/psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3", size = 490253, upload-time = "2025-12-29T08:26:00.169Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/77/8e/f0c242053a368c2aa89584ecd1b054a18683f13d6e5a318fc9ec36582c94/psutil-7.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d", size = 129624, upload-time = "2025-12-29T08:26:04.255Z" }, - { url = "https://files.pythonhosted.org/packages/26/97/a58a4968f8990617decee234258a2b4fc7cd9e35668387646c1963e69f26/psutil-7.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49", size = 130132, upload-time = "2025-12-29T08:26:06.228Z" }, - { url = "https://files.pythonhosted.org/packages/db/6d/ed44901e830739af5f72a85fa7ec5ff1edea7f81bfbf4875e409007149bd/psutil-7.2.1-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc", size = 180612, upload-time = "2025-12-29T08:26:08.276Z" }, - { url = "https://files.pythonhosted.org/packages/c7/65/b628f8459bca4efbfae50d4bf3feaab803de9a160b9d5f3bd9295a33f0c2/psutil-7.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf", size = 183201, upload-time = "2025-12-29T08:26:10.622Z" }, - { url = "https://files.pythonhosted.org/packages/fb/23/851cadc9764edcc18f0effe7d0bf69f727d4cf2442deb4a9f78d4e4f30f2/psutil-7.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f", size = 139081, upload-time = "2025-12-29T08:26:12.483Z" }, - { url = "https://files.pythonhosted.org/packages/59/82/d63e8494ec5758029f31c6cb06d7d161175d8281e91d011a4a441c8a43b5/psutil-7.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672", size = 134767, upload-time = "2025-12-29T08:26:14.528Z" }, - { url = "https://files.pythonhosted.org/packages/05/c2/5fb764bd61e40e1fe756a44bd4c21827228394c17414ade348e28f83cd79/psutil-7.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679", size = 129716, upload-time = "2025-12-29T08:26:16.017Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d2/935039c20e06f615d9ca6ca0ab756cf8408a19d298ffaa08666bc18dc805/psutil-7.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f", size = 130133, upload-time = "2025-12-29T08:26:18.009Z" }, - { url = "https://files.pythonhosted.org/packages/77/69/19f1eb0e01d24c2b3eacbc2f78d3b5add8a89bf0bb69465bc8d563cc33de/psutil-7.2.1-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129", size = 181518, upload-time = "2025-12-29T08:26:20.241Z" }, - { url = "https://files.pythonhosted.org/packages/e1/6d/7e18b1b4fa13ad370787626c95887b027656ad4829c156bb6569d02f3262/psutil-7.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a", size = 184348, upload-time = "2025-12-29T08:26:22.215Z" }, - { url = "https://files.pythonhosted.org/packages/98/60/1672114392dd879586d60dd97896325df47d9a130ac7401318005aab28ec/psutil-7.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79", size = 140400, upload-time = "2025-12-29T08:26:23.993Z" }, - { url = "https://files.pythonhosted.org/packages/fb/7b/d0e9d4513c46e46897b46bcfc410d51fc65735837ea57a25170f298326e6/psutil-7.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266", size = 135430, upload-time = "2025-12-29T08:26:25.999Z" }, - { url = "https://files.pythonhosted.org/packages/c5/cf/5180eb8c8bdf6a503c6919f1da28328bd1e6b3b1b5b9d5b01ae64f019616/psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42", size = 128137, upload-time = "2025-12-29T08:26:27.759Z" }, - { url = "https://files.pythonhosted.org/packages/c5/2c/78e4a789306a92ade5000da4f5de3255202c534acdadc3aac7b5458fadef/psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1", size = 128947, upload-time = "2025-12-29T08:26:29.548Z" }, - { url = "https://files.pythonhosted.org/packages/29/f8/40e01c350ad9a2b3cb4e6adbcc8a83b17ee50dd5792102b6142385937db5/psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8", size = 154694, upload-time = "2025-12-29T08:26:32.147Z" }, - { url = "https://files.pythonhosted.org/packages/06/e4/b751cdf839c011a9714a783f120e6a86b7494eb70044d7d81a25a5cd295f/psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6", size = 156136, upload-time = "2025-12-29T08:26:34.079Z" }, - { url = "https://files.pythonhosted.org/packages/44/ad/bbf6595a8134ee1e94a4487af3f132cef7fce43aef4a93b49912a48c3af7/psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8", size = 148108, upload-time = "2025-12-29T08:26:36.225Z" }, - { url = "https://files.pythonhosted.org/packages/1c/15/dd6fd869753ce82ff64dcbc18356093471a5a5adf4f77ed1f805d473d859/psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67", size = 147402, upload-time = "2025-12-29T08:26:39.21Z" }, - { url = "https://files.pythonhosted.org/packages/34/68/d9317542e3f2b180c4306e3f45d3c922d7e86d8ce39f941bb9e2e9d8599e/psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17", size = 136938, upload-time = "2025-12-29T08:26:41.036Z" }, - { url = "https://files.pythonhosted.org/packages/3e/73/2ce007f4198c80fcf2cb24c169884f833fe93fbc03d55d302627b094ee91/psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442", size = 133836, upload-time = "2025-12-29T08:26:43.086Z" }, +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, ] [[package]] @@ -1583,9 +1583,9 @@ wheels = [ [[package]] name = "wcwidth" -version = "0.4.0" +version = "0.5.3" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/98/0a/dc5110cc99c39df65bac29229c4b637a8304e0914850348d98974c8ecfff/wcwidth-0.4.0.tar.gz", hash = "sha256:46478e02cf7149ba150fb93c39880623ee7e5181c64eda167b6a1de51b7a7ba1", size = 237625, upload-time = "2026-01-26T02:35:58.844Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c2/62/a7c072fbfefb2980a00f99ca994279cb9ecf310cb2e6b2a4d2a28fe192b3/wcwidth-0.5.3.tar.gz", hash = "sha256:53123b7af053c74e9fe2e92ac810301f6139e64379031f7124574212fb3b4091", size = 157587, upload-time = "2026-01-31T03:52:10.92Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/f6/da704c5e77281d71723bffbd926b754c0efd57cbcd02e74c2ca374c14cef/wcwidth-0.4.0-py3-none-any.whl", hash = "sha256:8af2c81174b3aa17adf05058c543c267e4e5b6767a28e31a673a658c1d766783", size = 88216, upload-time = "2026-01-26T02:35:57.461Z" }, + { url = "https://files.pythonhosted.org/packages/3c/c1/d73f12f8cdb1891334a2ccf7389eed244d3941e74d80dd220badb937f3fb/wcwidth-0.5.3-py3-none-any.whl", hash = "sha256:d584eff31cd4753e1e5ff6c12e1edfdb324c995713f75d26c29807bb84bf649e", size = 92981, upload-time = "2026-01-31T03:52:09.14Z" }, ] From 20374e6c8093f324d527c24ce210b91dbb360203 Mon Sep 17 00:00:00 2001 From: Dylan Verheul Date: Sat, 31 Jan 2026 06:01:06 +0100 Subject: [PATCH 2/6] Fix tests --- tests/__init__.py | 2 +- tests/test_cli.py | 2 +- tests/test_converters.py | 2 +- tests/test_decoding.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/__init__.py b/tests/__init__.py index d4e2be4..34a91ab 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +1 @@ -# Tests for the EURING library +# Package marker for shared test helpers. diff --git a/tests/test_cli.py b/tests/test_cli.py index d89e677..8dd444a 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -7,7 +7,7 @@ from euring.coordinates import _lat_to_euring_coordinate, _lng_to_euring_coordinate from euring.fields import EURING_FIELDS from euring.main import app -from fixtures import _make_euring2000_plus_record_with_invalid_species, _make_euring2020_record_with_coords +from tests.fixtures import _make_euring2000_plus_record_with_invalid_species, _make_euring2020_record_with_coords def test_lookup_place_verbose_includes_details(): diff --git a/tests/test_converters.py b/tests/test_converters.py index 711e28f..797247a 100644 --- a/tests/test_converters.py +++ b/tests/test_converters.py @@ -8,7 +8,7 @@ from euring.converters import convert_euring_record from euring.coordinates import _lat_to_euring_coordinate, _lng_to_euring_coordinate from euring.fields import EURING_FIELDS -from fixtures import _make_euring2020_record_with_coords +from tests.fixtures import _make_euring2020_record_with_coords def _load_fixture(module_name: str, attr: str) -> str: diff --git a/tests/test_decoding.py b/tests/test_decoding.py index 4147b83..ce93a37 100644 --- a/tests/test_decoding.py +++ b/tests/test_decoding.py @@ -15,7 +15,7 @@ from euring.fields import EURING_FIELDS from euring.parsing import euring_decode_value from euring.types import TYPE_ALPHANUMERIC, TYPE_INTEGER -from fixtures import ( +from tests.fixtures import ( _make_euring2000_plus_record, _make_euring2000_plus_record_with_invalid_species, _make_euring2020_record_for_coords, From 6c87385145d2ee77f792ee9d8260ad50536196fc Mon Sep 17 00:00:00 2001 From: Dylan Verheul Date: Sat, 31 Jan 2026 06:04:31 +0100 Subject: [PATCH 3/6] Merge fixtures --- tests/fixtures.py | 123 ---------------------------------------------- 1 file changed, 123 deletions(-) delete mode 100644 tests/fixtures.py diff --git a/tests/fixtures.py b/tests/fixtures.py deleted file mode 100644 index 7bc989f..0000000 --- a/tests/fixtures.py +++ /dev/null @@ -1,123 +0,0 @@ -"""Shared test fixtures for EURING records.""" - -from euring.fields import EURING2000_FIELDS, EURING_FIELDS - -default_test_record_dict = { - "ringing_scheme": "GBB", - "primary_identification_method": "A0", - "identification_number": "1234567890", - "verification_of_the_metal_ring": "0", - "metal_ring_information": "1", - "other_marks_information": "ZZ", - "species_mentioned": "00010", - "species_concluded": "00010", - "manipulated": "N", - "moved_before_recovery": "0", - "catching_method": "M", - "catching_lures": "U", - "sex_mentioned": "U", - "sex_concluded": "U", - "age_mentioned": "2", - "age_concluded": "2", - "status": "U", - "brood_size": "99", - "pullus_age": "99", - "accuracy_of_pullus_age": "0", - "date": "01012024", - "accuracy_of_date": "0", - "time": "0000", - "place_code": "AB00", - "geographical_coordinates": "+0000000+0000000", - "accuracy_of_coordinates": "1", - "condition": "9", - "circumstances": "99", - "circumstances_presumed": "0", - "euring_code_identifier": "4", - "distance": "00000", - "direction": "000", - "elapsed_time": "00000", - # EURING2000 fields stop here. - "wing_length": "", - "third_primary": "", - "state_of_wing_point": "", - "mass": "", - "moult": "", - "plumage_code": "", - "hind_claw": "", - "bill_length": "", - "bill_method": "", - "total_head_length": "", - "tarsus": "", - "tarsus_method": "", - "tail_length": "", - "tail_difference": "", - "fat_score": "", - "fat_score_method": "", - "pectoral_muscle": "", - "brood_patch": "", - "primary_score": "", - "primary_moult": "", - "old_greater_coverts": "", - "alula": "", - "carpal_covert": "", - "sexing_method": "", - "place_name": "", - "remarks": "", - "reference": "", - # EURING2000+ fields stop here. - "latitude": "", - "longitude": "", - "current_place_code": "", - "more_other_marks": "", -} - - -def _field_index(key: str) -> int: - for index, field in enumerate(EURING_FIELDS): - if field.key == key: - return index - raise ValueError(f"Unknown key: {key}") - - -def _set_value(values: list[str], key: str, value: str) -> None: - values[_field_index(key)] = value - - -def _make_euring2000_plus_record(*, accuracy: str) -> str: - values = [default_test_record_dict[field.key] for field in EURING2000_FIELDS] - values[_field_index("accuracy_of_coordinates")] = accuracy - return "|".join(values) - - -def _make_euring2000_plus_record_with_invalid_species(*, accuracy: str = "1") -> str: - values = _make_euring2000_plus_record(accuracy=accuracy).split("|") - values[6] = "12ABC" - values[7] = "12ABC" - return "|".join(values) - - -def _make_euring2020_record_for_coords( - *, - geo_value: str, - lat_value: str, - lng_value: str, - accuracy: str = "1", -) -> str: - base = _make_euring2000_plus_record(accuracy=accuracy).split("|") - values = base + [""] * (len(EURING_FIELDS) - len(base)) - _set_value(values, "geographical_coordinates", geo_value) - _set_value(values, "latitude", lat_value) - _set_value(values, "longitude", lng_value) - return "|".join(values) - - -def _make_euring2020_record_with_coords() -> str: - values = [""] * len(EURING_FIELDS) - _set_value(values, "ringing_scheme", "GBB") - _set_value(values, "primary_identification_method", "A0") - _set_value(values, "identification_number", "1234567890") - _set_value(values, "place_code", "AB00") - _set_value(values, "accuracy_of_coordinates", "A") - _set_value(values, "latitude", "52.3760") - _set_value(values, "longitude", "4.9000") - return "|".join(values) From 2d9c70f6c9af442acd620ce4775d62efffe43364 Mon Sep 17 00:00:00 2001 From: Dylan Verheul Date: Sat, 31 Jan 2026 07:23:25 +0100 Subject: [PATCH 4/6] Fix record fixtures --- src/euring/fields.py | 13 +++++- src/euring/record.py | 2 +- tests/test_cli.py | 4 +- tests/test_decoding.py | 60 ++++++++++++++-------------- tests/test_format_input_and_hints.py | 2 +- 5 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/euring/fields.py b/src/euring/fields.py index 441ca4d..2458586 100644 --- a/src/euring/fields.py +++ b/src/euring/fields.py @@ -418,7 +418,18 @@ EuringField(name="More Other Marks", key="more_other_marks", euring_type=TYPE_ALPHABETIC, required=False), ] -# These are the field definitions per format as per the EURING Code Manual +# All keys +EURING_KEYS = [field.key for field in EURING_FIELDS] + +# Map keys to index +EURING_KEY_INDEX = {key: index for index, key in enumerate(EURING_KEYS)} + +# Fields per format (as per the EURING Code Manual) EURING2020_FIELDS = EURING_FIELDS # 64 fields EURING2000PLUS_FIELDS = EURING_FIELDS[:60] EURING2000_FIELDS = EURING_FIELDS[:33] + +# Keys per format +EURING2020_KEYS = [field.key for field in EURING2020_FIELDS] +EURING2000PLUS_KEYS = [field.key for field in EURING2000PLUS_FIELDS] +EURING2000_KEYS = [field.key for field in EURING2000_FIELDS] diff --git a/src/euring/record.py b/src/euring/record.py index ab47b16..77c4dca 100644 --- a/src/euring/record.py +++ b/src/euring/record.py @@ -410,7 +410,7 @@ def _apply_coordinate_downgrade( raise ValueError(f'Unsupported alphabetic accuracy code "{accuracy}".') values_by_key["accuracy_of_coordinates"] = mapped coords = values_by_key.get("geographical_coordinates", "") - if coords.strip(): + if coords.strip() and set(coords) != {"."}: return latitude = values_by_key.get("latitude", "") longitude = values_by_key.get("longitude", "") diff --git a/tests/test_cli.py b/tests/test_cli.py index 8dd444a..0662f36 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -7,7 +7,7 @@ from euring.coordinates import _lat_to_euring_coordinate, _lng_to_euring_coordinate from euring.fields import EURING_FIELDS from euring.main import app -from tests.fixtures import _make_euring2000_plus_record_with_invalid_species, _make_euring2020_record_with_coords +from tests.fixtures import _make_euring2000plus_record_with_invalid_species, _make_euring2020_record_with_coords def test_lookup_place_verbose_includes_details(): @@ -248,7 +248,7 @@ def test_decode_cli_invalid_species_format_reports_errors(): import json runner = CliRunner() - result = runner.invoke(app, ["decode", "--json", _make_euring2000_plus_record_with_invalid_species()]) + result = runner.invoke(app, ["decode", "--json", _make_euring2000plus_record_with_invalid_species()]) assert result.exit_code == 1 payload = json.loads(result.output) assert "errors" in payload diff --git a/tests/test_decoding.py b/tests/test_decoding.py index ce93a37..31aec6c 100644 --- a/tests/test_decoding.py +++ b/tests/test_decoding.py @@ -16,8 +16,8 @@ from euring.parsing import euring_decode_value from euring.types import TYPE_ALPHANUMERIC, TYPE_INTEGER from tests.fixtures import ( - _make_euring2000_plus_record, - _make_euring2000_plus_record_with_invalid_species, + _make_euring2000plus_record, + _make_euring2000plus_record_with_invalid_species, _make_euring2020_record_for_coords, ) @@ -25,13 +25,13 @@ class TestDecoding: def test_decode_minimal_record(self): # Very minimal EURING record for testing - record = EuringRecord.decode(_make_euring2000_plus_record(accuracy="1")) + record = EuringRecord.decode(_make_euring2000plus_record(accuracy_of_coordinates="1")) assert record.display_format == "EURING2000+" assert record.fields["ringing_scheme"]["value"] == "GBB" assert record.fields def test_decode_unknown_but_valid_ringing_scheme(self): - values = _make_euring2000_plus_record(accuracy="1").split("|") + values = _make_euring2000plus_record(accuracy_of_coordinates="1").split("|") values[0] = "ZZZ" record = EuringRecord.decode("|".join(values)) scheme_errors = [e for e in record.errors["fields"] if e.get("key") == "ringing_scheme"] @@ -40,12 +40,12 @@ def test_decode_unknown_but_valid_ringing_scheme(self): assert record.fields["ringing_scheme"]["description"].startswith("Unknown ringing scheme") def test_decode_euring2020_format(self): - record = EuringRecord.decode(_make_euring2000_plus_record(accuracy="A")) + record = EuringRecord.decode(_make_euring2000plus_record(accuracy_of_coordinates="A")) assert record.display_format == "EURING2020" - def test_decode_euring2020_format_rejects_2000_plus(self): + def test_decode_euring2020_format_rejects_2000plus(self): record = EuringRecord.decode( - _make_euring2000_plus_record(accuracy="A"), + _make_euring2000plus_record(accuracy_of_coordinates="A"), format="euring2000plus", ) assert record.errors["record"] or record.errors["fields"] @@ -83,7 +83,7 @@ def test_decode_value_with_parser(self): assert "parsed_value" in result def test_decode_euring2000plus_allows_short_elapsed_time(self): - record = _make_euring2000_plus_record(accuracy="1").split("|") + record = _make_euring2000plus_record(accuracy_of_coordinates="1").split("|") for index, field in enumerate(EURING_FIELDS): if field["key"] == "elapsed_time": record[index] = "1" @@ -94,7 +94,7 @@ def test_decode_euring2000plus_allows_short_elapsed_time(self): assert decoded.fields["elapsed_time"]["value"] == 1 def test_decode_euring2020_allows_short_distance(self): - record = _make_euring2000_plus_record(accuracy="A").split("|") + record = _make_euring2000plus_record(accuracy_of_coordinates="A").split("|") record += [""] * (len(EURING_FIELDS) - len(record)) for index, field in enumerate(EURING_FIELDS): if field["key"] == "distance": @@ -179,7 +179,7 @@ def test_decode_format_unknown(self): EuringRecord.decode("GBB", format="2000") def test_decode_format_conflict_pipe(self): - record = EuringRecord.decode(_make_euring2000_plus_record(accuracy="1"), format="euring2000") + record = EuringRecord.decode(_make_euring2000plus_record(accuracy_of_coordinates="1"), format="euring2000") assert record.errors["record"] or record.errors["fields"] def test_decode_format_conflict_fixed_width(self): @@ -196,7 +196,7 @@ def test_decode_format_conflict_fixed_width(self): assert record.errors["record"] or record.errors["fields"] def test_decode_invalid_species_format(self): - record = EuringRecord.decode(_make_euring2000_plus_record_with_invalid_species(accuracy="1")) + record = EuringRecord.decode(_make_euring2000plus_record_with_invalid_species(accuracy_of_coordinates="1")) fields = [error["field"] for error in record.errors["fields"]] assert "Species Mentioned" in fields assert "Species Concluded" in fields @@ -204,9 +204,9 @@ def test_decode_invalid_species_format(self): def test_decode_euring2020_rejects_geo_with_lat_long(self): record = EuringRecord.decode( _make_euring2020_record_for_coords( - geo_value="+0000000+0000000", - lat_value="1.0000", - lng_value="2.0000", + geographical_coordinates="+0000000+0000000", + latitude="1.0000", + longitude="2.0000", ) ) assert any(error["field"] == "Geographical Co-ordinates" for error in record.errors["fields"]) @@ -214,9 +214,9 @@ def test_decode_euring2020_rejects_geo_with_lat_long(self): def test_decode_euring2020_requires_longitude_with_latitude(self): record = EuringRecord.decode( _make_euring2020_record_for_coords( - geo_value="...............", - lat_value="1.0000", - lng_value="", + geographical_coordinates="...............", + latitude="1.0000", + longitude="", ) ) assert any(error["field"] == "Longitude" for error in record.errors["fields"]) @@ -224,9 +224,9 @@ def test_decode_euring2020_requires_longitude_with_latitude(self): def test_decode_euring2020_requires_latitude_with_longitude(self): record = EuringRecord.decode( _make_euring2020_record_for_coords( - geo_value="...............", - lat_value="", - lng_value="2.0000", + geographical_coordinates="...............", + latitude="", + longitude="2.0000", ) ) assert any(error["field"] == "Latitude" for error in record.errors["fields"]) @@ -234,9 +234,9 @@ def test_decode_euring2020_requires_latitude_with_longitude(self): def test_decode_euring2020_latitude_out_of_range(self): record = EuringRecord.decode( _make_euring2020_record_for_coords( - geo_value="...............", - lat_value="90.0001", - lng_value="2.0000", + geographical_coordinates="...............", + latitude="90.0001", + longitude="2.0000", ) ) assert any(error["field"] == "Latitude" for error in record.errors["fields"]) @@ -244,9 +244,9 @@ def test_decode_euring2020_latitude_out_of_range(self): def test_decode_euring2020_longitude_out_of_range(self): record = EuringRecord.decode( _make_euring2020_record_for_coords( - geo_value="...............", - lat_value="10.0000", - lng_value="180.0001", + geographical_coordinates="...............", + latitude="10.0000", + longitude="180.0001", ) ) assert any(error["field"] == "Longitude" for error in record.errors["fields"]) @@ -254,15 +254,15 @@ def test_decode_euring2020_longitude_out_of_range(self): def test_decode_euring2020_latitude_too_many_decimals(self): record = EuringRecord.decode( _make_euring2020_record_for_coords( - geo_value="...............", - lat_value="10.00001", - lng_value="2.0000", + geographical_coordinates="...............", + latitude="10.00001", + longitude="2.0000", ) ) assert any(error["field"] == "Latitude" for error in record.errors["fields"]) def test_decode_fields_returns_format(self): - record = EuringRecord.decode(_make_euring2000_plus_record(accuracy="1")) + record = EuringRecord.decode(_make_euring2000plus_record(accuracy_of_coordinates="1")) assert record.format == "euring2000plus" def test_decode_euring2000_fixture_records(self): diff --git a/tests/test_format_input_and_hints.py b/tests/test_format_input_and_hints.py index 9b06a64..1abb1c3 100644 --- a/tests/test_format_input_and_hints.py +++ b/tests/test_format_input_and_hints.py @@ -133,7 +133,7 @@ def test_format_hint_for_2000plus(): assert format_hint("2000plus") == "euring2000plus" -def test_format_hint_for_2000_plus_symbol(): +def test_format_hint_for_2000plus_symbol(): assert format_hint("2000+") == "euring2000plus" From 20fc0259e6849c8b74b9b6086bf13e59524bf6a5 Mon Sep 17 00:00:00 2001 From: Dylan Verheul Date: Sat, 31 Jan 2026 07:23:33 +0100 Subject: [PATCH 5/6] Fix record fixtures --- tests/fixtures/__init__.py | 130 +++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 tests/fixtures/__init__.py diff --git a/tests/fixtures/__init__.py b/tests/fixtures/__init__.py new file mode 100644 index 0000000..b8d4196 --- /dev/null +++ b/tests/fixtures/__init__.py @@ -0,0 +1,130 @@ +"""Shared test fixtures for EURING records.""" + +from euring.fields import ( + EURING2000_KEYS, + EURING2000PLUS_KEYS, + EURING2020_KEYS, +) +from euring.formats import FORMAT_EURING2000, FORMAT_EURING2000PLUS, FORMAT_EURING2020 + +DEFAULT_TEST_VALUES = { + # Default test data for a EURING record in key-value format + "ringing_scheme": "GBB", + "primary_identification_method": "A0", + "identification_number": "1234567890", + "verification_of_the_metal_ring": "0", + "metal_ring_information": "1", + "other_marks_information": "ZZ", + "species_mentioned": "00010", + "species_concluded": "00010", + "manipulated": "N", + "moved_before_recovery": "0", + "catching_method": "M", + "catching_lures": "U", + "sex_mentioned": "U", + "sex_concluded": "U", + "age_mentioned": "2", + "age_concluded": "2", + "status": "U", + "brood_size": "99", + "pullus_age": "99", + "accuracy_of_pullus_age": "0", + "date": "01012024", + "accuracy_of_date": "0", + "time": "0000", + "place_code": "AB00", + "geographical_coordinates": "+0000000+0000000", + "accuracy_of_coordinates": "1", + "condition": "9", + "circumstances": "99", + "circumstances_presumed": "0", + "euring_code_identifier": "4", + "distance": "00000", + "direction": "000", + "elapsed_time": "00000", + # EURING2000 fields stop here. + "wing_length": "", + "third_primary": "", + "state_of_wing_point": "", + "mass": "", + "moult": "", + "plumage_code": "", + "hind_claw": "", + "bill_length": "", + "bill_method": "", + "total_head_length": "", + "tarsus": "", + "tarsus_method": "", + "tail_length": "", + "tail_difference": "", + "fat_score": "", + "fat_score_method": "", + "pectoral_muscle": "", + "brood_patch": "", + "primary_score": "", + "primary_moult": "", + "old_greater_coverts": "", + "alula": "", + "carpal_covert": "", + "sexing_method": "", + "place_name": "", + "remarks": "", + "reference": "", + # EURING2000+ fields stop here. + "latitude": "", + "longitude": "", + "current_place_code": "", + "more_other_marks": "", +} + + +def _make_euring_record(data: dict, format: str) -> str: + if format == FORMAT_EURING2000: + keys = EURING2000_KEYS + separator = "" + elif format == FORMAT_EURING2000PLUS: + keys = EURING2000PLUS_KEYS + separator = "|" + elif format == FORMAT_EURING2020: + keys = EURING2020_KEYS + separator = "|" + else: + raise ValueError(f"Unknown format: {format}") + record_dict = {key: value for key, value in DEFAULT_TEST_VALUES.items() if key in keys} + for key, value in data.items(): + assert key in keys, f"Invalid key: {key}" + record_dict[key] = value + return separator.join(record_dict.values()) + + +def _make_euring2000_record(**kwargs) -> str: + return _make_euring_record(kwargs, format=FORMAT_EURING2000) + + +def _make_euring2000plus_record(**kwargs) -> str: + return _make_euring_record(kwargs, format=FORMAT_EURING2000PLUS) + + +def _make_euring2020_record(**kwargs) -> str: + return _make_euring_record(kwargs, format=FORMAT_EURING2020) + + +def _make_euring2000plus_record_with_invalid_species(*, accuracy_of_coordinates: str = "1") -> str: + return _make_euring2000plus_record( + accuracy_of_coordinates=accuracy_of_coordinates, + species_mentioned="12ABC", + species_concluded="12ABC", + ) + + +def _make_euring2020_record_for_coords(**kwargs) -> str: + return _make_euring2020_record(**kwargs) + + +def _make_euring2020_record_with_coords() -> str: + return _make_euring2020_record( + geographical_coordinates="." * 15, + accuracy_of_coordinates="A", + latitude="52.3760", + longitude="4.9000", + ) From 76f47828f4b568b559b9b925c43941f0f58f9626 Mon Sep 17 00:00:00 2001 From: Dylan Verheul Date: Sat, 31 Jan 2026 07:26:04 +0100 Subject: [PATCH 6/6] Remove obsolete comment --- tests/__init__.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/__init__.py b/tests/__init__.py index 34a91ab..e69de29 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -1 +0,0 @@ -# Package marker for shared test helpers.