From 3489a086387853289b50cfc57e3fb5f1803d8c91 Mon Sep 17 00:00:00 2001 From: daniel Date: Wed, 26 Aug 2026 12:20:10 +0200 Subject: [PATCH] =?UTF-8?q?l=C3=A4nderkennungs-dict=20angelegt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functions/__init__.py | 1 + functions/laenderkennung.py | 51 ++++++++++++++++++++++++++++++++++++ tests/test_laenderkennung.py | 31 ++++++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 functions/laenderkennung.py create mode 100644 tests/test_laenderkennung.py diff --git a/functions/__init__.py b/functions/__init__.py index 45d063c..485334a 100644 --- a/functions/__init__.py +++ b/functions/__init__.py @@ -21,6 +21,7 @@ from .ly_metadata_wrapper import ( ) from .ly_style_wrapper import apply_style from .dialog_wrapper import ask_yes_no, ask_overwrite_append_cancel_custom, ask_ergaenzen_entfernen_ersetzen_abbrechen, ask_detailpruefung_oder_vg_laden +from .laenderkennung import get_laenderkennung, LAENDERKENNUNGEN from .message_wrapper import ( _get_message_bar, diff --git a/functions/laenderkennung.py b/functions/laenderkennung.py new file mode 100644 index 0000000..7323274 --- /dev/null +++ b/functions/laenderkennung.py @@ -0,0 +1,51 @@ +""" +sn_basis/functions/laenderkennung.py – ALKIS-Länderkennung je Plugin-Präfix. + +AGLB-länderspezifische Funktionen (z.B. Flurstückskennzeichen-Bildung) sollen +nicht hart auf Sachsen ("14") verdrahtet sein, sondern die Länderkennung über +dieses generische Mapping ermitteln. Für neue Bundesländer genügt ein weiterer +Eintrag in ``LAENDERKENNUNGEN`` – die aufrufende Logik bleibt unverändert. +""" + +#: Mapping von sn_*-Plugin-Präfix (ohne Unterstrich) auf die zweistellige +#: ALKIS-Länderkennung. Aktuell nur Sachsen befüllt; weitere Bundesländer +#: können hier ergänzt werden, sobald Schwesterplugins dafür existieren. +LAENDERKENNUNGEN: dict[str, str] = { + "sn": "14", # Sachsen +} + + +def get_laenderkennung(plugin_praefix: str | None = None) -> str: + """Ermittelt die ALKIS-Länderkennung für einen Plugin-Präfix. + + Parameters + ---------- + plugin_praefix : str, optional + Plugin-Präfix ohne Unterstrich, z.B. ``"sn"``. Wird kein Präfix + übergeben, wird er aus dem Package-Namen des aufrufenden Moduls + abgeleitet (``__name__`` des Aufrufers, erstes ``_``-Segment). + + Returns + ------- + str + Zweistellige Länderkennung, z.B. ``"14"``. + + Raises + ------ + KeyError + Wenn für den ermittelten Präfix keine Länderkennung hinterlegt ist. + """ + if not plugin_praefix: + import inspect + + frame = inspect.stack()[1] + caller_module = frame.frame.f_globals.get("__name__", "") + plugin_praefix = caller_module.split(".")[0].split("_")[0] + + plugin_praefix = plugin_praefix.lower() + if plugin_praefix not in LAENDERKENNUNGEN: + raise KeyError( + f"Keine Länderkennung für Plugin-Präfix '{plugin_praefix}' hinterlegt. " + f"Bekannte Präfixe: {sorted(LAENDERKENNUNGEN)}" + ) + return LAENDERKENNUNGEN[plugin_praefix] diff --git a/tests/test_laenderkennung.py b/tests/test_laenderkennung.py new file mode 100644 index 0000000..4d914d1 --- /dev/null +++ b/tests/test_laenderkennung.py @@ -0,0 +1,31 @@ +"""sn_basis/tests/test_laenderkennung.py + +Unit-Tests für :mod:`sn_basis.functions.laenderkennung`. +""" + +import unittest + +from sn_basis.functions.laenderkennung import get_laenderkennung, LAENDERKENNUNGEN + + +class TestGetLaenderkennung(unittest.TestCase): + def test_bekannter_praefix_gibt_kennung_zurueck(self): + self.assertEqual(get_laenderkennung("sn"), "14") + + def test_praefix_gross_klein_unabhaengig(self): + self.assertEqual(get_laenderkennung("SN"), "14") + + def test_unbekannter_praefix_wirft_keyerror(self): + with self.assertRaises(KeyError): + get_laenderkennung("xx") + + def test_ohne_argument_wird_aus_aufrufendem_modul_abgeleitet(self): + # __name__ dieses Testmoduls beginnt mit "sn_basis" -> Präfix "sn" + self.assertEqual(get_laenderkennung(), "14") + + def test_mapping_enthaelt_sachsen(self): + self.assertEqual(LAENDERKENNUNGEN.get("sn"), "14") + + +if __name__ == "__main__": + unittest.main() -- 2.54.0