From 51ec12505551854d02e0f4ce3d6dcffb8b248717 Mon Sep 17 00:00:00 2001 From: konstantin Date: Thu, 23 May 2024 15:46:32 +0200 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=A7=99=E2=80=8D=E2=99=80=EF=B8=8F=20I?= =?UTF-8?q?nitial=20Setup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 16 +- src/{mypackage => bamx}/__init__.py | 0 src/bamx/models/__init__.py | 1 + src/bamx/models/messageimplementationguide.py | 21 + src/{mypackage => bamx}/py.typed | 0 src/bamx/reader/__init__.py | 5 + src/bamx/reader/migreader.py | 53 + src/mypackage/mymodule.py | 23 - tox.ini | 4 +- unittests/example_files/README.md | 2 + ...HB_1.1c_Lesefassung_2023_12_12_ZPbXedn.xml | 2025 ++++++++++++++++ ...B_1.1d_Konsultationsfassung_2024_04_02.xml | 2027 +++++++++++++++++ ...UTILTS_MIG_1.1c_Lesefassung_2023_12_12.xml | 762 +++++++ ...G_1.1d_Konsultationsfassung_2024_04_02.xml | 760 ++++++ unittests/test_migreader.py | 54 + unittests/test_myclass.py | 11 - 16 files changed, 5720 insertions(+), 44 deletions(-) rename src/{mypackage => bamx}/__init__.py (100%) create mode 100644 src/bamx/models/__init__.py create mode 100644 src/bamx/models/messageimplementationguide.py rename src/{mypackage => bamx}/py.typed (100%) create mode 100644 src/bamx/reader/__init__.py create mode 100644 src/bamx/reader/migreader.py delete mode 100644 src/mypackage/mymodule.py create mode 100644 unittests/example_files/README.md create mode 100644 unittests/example_files/UTILTS_AHB_1.1c_Lesefassung_2023_12_12_ZPbXedn.xml create mode 100644 unittests/example_files/UTILTS_AHB_1.1d_Konsultationsfassung_2024_04_02.xml create mode 100644 unittests/example_files/UTILTS_MIG_1.1c_Lesefassung_2023_12_12.xml create mode 100644 unittests/example_files/UTILTS_MIG_1.1d_Konsultationsfassung_2024_04_02.xml create mode 100644 unittests/test_migreader.py delete mode 100644 unittests/test_myclass.py diff --git a/pyproject.toml b/pyproject.toml index 67de3ed..3499232 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,10 +1,10 @@ [project] -name = "your-favourite-package-name" -description = "Description of your package" +name = "bamx" +description = "Python interface XML documents for MIG and AHBs, published by BDEW " license = { text = "MIT" } requires-python = ">=3.11" -authors = [{ name = "your name", email = "your@email.address" }] -keywords = ["your", "important", "keywords"] +authors = [{ name = "Hochfrequenz Unternehmensberatung GmbH", email = "info+github@hochfrequenz.de" }] +keywords = ["BDEW", "XML", "AHB", "MIG", "Marktkommunikation"] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", @@ -20,8 +20,8 @@ dependencies = [] # add all the dependencies here dynamic = ["readme", "version"] [project.urls] -Changelog = "https://github.com/Hochfrequenz/python_template_repository/releases" -Homepage = "https://github.com/Hochfrequenz/python_template_repository" +Changelog = "https://github.com/Hochfrequenz/bdew_ahb_mig_xml-python/releases" +Homepage = "https://github.com/Hochfrequenz/bdew_ahb_mig_xml-python" [tool.black] line-length = 120 @@ -38,7 +38,7 @@ max-line-length = 120 truethy-bool = true [tool.mypy] -disable_error_code = ["no-untyped-def", "no-untyped-call"] +disable_error_code = [] [build-system] requires = ["hatchling>=1.8.0", "hatch-vcs", "hatch-fancy-pypi-readme"] @@ -52,7 +52,7 @@ fragments = [{ path = "README.md" }] source = "vcs" [tool.hatch.build.hooks.vcs] -version-file = "src/_your_package_version.py" +version-file = "src/_bamx_version.py" template = ''' version = "{version}" ''' diff --git a/src/mypackage/__init__.py b/src/bamx/__init__.py similarity index 100% rename from src/mypackage/__init__.py rename to src/bamx/__init__.py diff --git a/src/bamx/models/__init__.py b/src/bamx/models/__init__.py new file mode 100644 index 0000000..86391f1 --- /dev/null +++ b/src/bamx/models/__init__.py @@ -0,0 +1 @@ +"""contains model classes representing MIGs and AHBs""" diff --git a/src/bamx/models/messageimplementationguide.py b/src/bamx/models/messageimplementationguide.py new file mode 100644 index 0000000..b9dda80 --- /dev/null +++ b/src/bamx/models/messageimplementationguide.py @@ -0,0 +1,21 @@ +"""classes that represent MIGs""" + +from dataclasses import dataclass +from datetime import date + + +@dataclass(frozen=True, eq=True, order=True, unsafe_hash=True, kw_only=True) +class MessageImplementationGuide: + """ + message implementation guide (MIG) + """ + + veroeffentlichungsdatum: date + """ + publishing date + """ + autor: str + """author, most likely 'BDEW'""" + + versionsnummer: str + """e.g. '1.1c'""" diff --git a/src/mypackage/py.typed b/src/bamx/py.typed similarity index 100% rename from src/mypackage/py.typed rename to src/bamx/py.typed diff --git a/src/bamx/reader/__init__.py b/src/bamx/reader/__init__.py new file mode 100644 index 0000000..788e090 --- /dev/null +++ b/src/bamx/reader/__init__.py @@ -0,0 +1,5 @@ +"""classes for reading xml documents""" + +from .migreader import MigReader + +__all__ = ["MigReader"] diff --git a/src/bamx/reader/migreader.py b/src/bamx/reader/migreader.py new file mode 100644 index 0000000..a483592 --- /dev/null +++ b/src/bamx/reader/migreader.py @@ -0,0 +1,53 @@ +""" +This a docstring for the module. +""" + +import xml.etree.ElementTree as ET +from datetime import date, datetime +from pathlib import Path + +from bamx.models.messageimplementationguide import MessageImplementationGuide + + +class MigReader: + """ + Accesses information from an XML based message implementation guide + """ + + def __init__(self, xml_path: Path): + """ + initialize by providing the path to the XML file + """ + self._xml_path = xml_path + self._element_tree = ET.parse(self._xml_path) + + def get_publishing_date(self) -> date: + """ + returns the publishing date of the message implementation guide + """ + raw_value = self._element_tree.getroot().attrib["Veroeffentlichungsdatum"] # e.g. '24.10.2023' + result = datetime.strptime(raw_value, "%d.%m.%Y").date() + return result + + def get_author(self) -> str: + """ + returns the author of the message implementation guide + """ + return self._element_tree.getroot().attrib["Author"] + + def get_version(self) -> str: + """ + returns the version of the message implementation guide + """ + return self._element_tree.getroot().attrib["Versionsnummer"] + + def read(self) -> MessageImplementationGuide: + """ + read the entire file and convert it to a MessageImplementationGuid instance + """ + result = MessageImplementationGuide( + veroeffentlichungsdatum=self.get_publishing_date(), + autor=self.get_author(), + versionsnummer=self.get_version(), + ) + return result diff --git a/src/mypackage/mymodule.py b/src/mypackage/mymodule.py deleted file mode 100644 index 2afc797..0000000 --- a/src/mypackage/mymodule.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -This a docstring for the module. -""" - - -class MyClass: # pylint: disable=too-few-public-methods - """ - This is a docstring for the class. - """ - - def __init__(self): - """ - Initialize for the sake of initializing - """ - self.my_instance_var: str = "abc" - - def do_something(self) -> str: - """ - Actually does nothing. - :return: the value of an instance variable - """ - # this is a super long line with: 100 < line length <= 120 to demonstrate the purpose of pyproject.toml - return self.my_instance_var diff --git a/tox.ini b/tox.ini index 00db660..8483fb8 100644 --- a/tox.ini +++ b/tox.ini @@ -26,7 +26,7 @@ deps = # add your fixtures like e.g. pytest_datafiles here setenv = PYTHONPATH = {toxinidir}/src commands = - pylint mypackage + pylint bamx pylint unittests --rcfile=unittests/.pylintrc # add single files (ending with .py) or packages here @@ -37,7 +37,7 @@ deps = {[testenv:tests]deps} -r dev_requirements/requirements-type_check.txt commands = - mypy --show-error-codes src/mypackage --strict + mypy --show-error-codes src/bamx --strict mypy --show-error-codes unittests --strict # add single files (ending with .py) or packages here diff --git a/unittests/example_files/README.md b/unittests/example_files/README.md new file mode 100644 index 0000000..8f26be5 --- /dev/null +++ b/unittests/example_files/README.md @@ -0,0 +1,2 @@ +The files in this directory have been copied from [the BDEW website](https://www.bdew.de/service/anwendungshilfen/edienergy-xml-beispieldateien/). +The copyright remains with the BDEW. diff --git a/unittests/example_files/UTILTS_AHB_1.1c_Lesefassung_2023_12_12_ZPbXedn.xml b/unittests/example_files/UTILTS_AHB_1.1c_Lesefassung_2023_12_12_ZPbXedn.xml new file mode 100644 index 0000000..33523e8 --- /dev/null +++ b/unittests/example_files/UTILTS_AHB_1.1c_Lesefassung_2023_12_12_ZPbXedn.xml @@ -0,0 +1,2025 @@ + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1c + + + + + + + Z36 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + 172 + + + + + + + + + 157 + + + + 303 + + + + + + + Z23 + + + + + Z33 + Z34 + Z40 + Z41 + + + + + + + + Z13 + + + 25001 + + + + + + + + Z30 + + + + Z06 + Z07 + + + + + + + + Z36 + + + + + + Z23 + + + + + + + + Z27 + + + + + + Z84 + Z85 + Z86 + Z92 + Z47 + + + + + + + + + Z37 + + + + + + + + + Z19 + + + + + + + + Z23 + + + + + + + + + Z86 + + + + + + + Z69 + Z70 + Z80 + Z81 + Z82 + + + + + + + + + Z87 + + + + + + + Z71 + Z72 + + + + + + + + + Z16 + + + + + + + Z28 + + + + + + + + + + ZB2 + + + + + + + Z28 + + + + + + + + + + ZG6 + + + + + + + ZH6 + + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1c + + + + + + + Z36 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + + E01 + + + + + + E_0218 + + + + + + + + Z13 + + + 25002 + + + + + + + + + TN + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1c + + + + + + + Z36 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + + E01 + + + + + + E_0218 + + + + + + + + Z13 + + + 25003 + + + + + + + + + TN + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1c + + + + + + + Z81 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + Z09 + + + + + + + + + Z34 + + + + 303 + + + + + + + Z35 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + + Z13 + + + 25009 + + + + + + + + + AGI + + + + + + + + + Z74 + + + + + + Z45 + + + + 303 + 401 + + + + + + + + + + + + + + + + Z40 + + + + P1 + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1c + + + + + + + Z80 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + Z09 + + + + + + + + + Z34 + + + + 303 + + + + + + + Z35 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + + Z13 + + + 25008 + + + + + + + + + AGI + + + + + + + + + Z73 + + + + + + Z44 + + + + 303 + 401 + + + + + + + + + + + + + + + Z58 + + + + ZF4 + ZF5 + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1c + + + + + + + Z59 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + Z09 + + + + + + + + + Z34 + + + + 303 + + + + + + + Z35 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + + Z13 + + + 25005 + + + + + + + + + AGI + + + + + + + + + Z43 + + + + + + Z33 + + + + 303 + 401 + + + + + + + Z28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1c + + + + + + + Z79 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + + 157 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + Z36 + + + + + Z45 + Z46 + + + + + + + + Z13 + + + 25007 + + + + + + + + + AGI + + + + + + + + + Z70 + + + + + + Z53 + + + + + + + + + ZE0 + + + Z33 + Z34 + + + + + + + ZD5 + + + Z23 + Z24 + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1c + + + + + + + Z78 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + + 157 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + Z36 + + + + + Z45 + Z46 + + + + + + + + Z13 + + + 25006 + + + + + + + + + AGI + + + + + + + + + Z69 + + + + + + Z52 + + + + + + + + + ZE0 + + + Z33 + Z34 + + + + + + + ZD5 + + + Z23 + Z24 + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1c + + + + + + + Z60 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + + 157 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + Z36 + + + + + Z45 + Z46 + + + + + + + + Z13 + + + 25004 + + + + + + + + + AGI + + + + + + + + + Z42 + + + + + + Z39 + + + + + + + + + ZE0 + + + Z33 + Z34 + + + + + + + ZD5 + + + Z23 + Z24 + + + + + + + ZD4 + + + Z25 + Z26 + + + + + + + ZD7 + + + Z27 + Z28 + + + + + + + ZD3 + + + Z29 + Z30 + Z31 + Z32 + Z35 + + + + + + + + + + Z41 + + + + + + Z27 + + + + + + + + Z38 + + + + + + + + + + Z10 + + + + Z59 + Z60 + + + + + + + + + + + + + + + Nur MP-ID aus Sparte Strom + Wenn SG5 STS+Z23+Z34 (Formel muss beim Absender angefragt werden) in einem SG5 IDE vorhanden + Wenn SG5 STS+Z23+Z33 (Formel angefügt) vorhanden + Wenn das SG8 RFF+Z19 (Referenz auf eine Messlokation) in derselben SG8 SEQ+Z37 nicht vorhanden + Wenn das SG8 RFF+Z23 (Referenz auf Rechenschritt) in derselben SG8 SEQ+Z37 nicht vorhanden + Wenn in derselben SG8 SEQ+Z37 das SG8 RFF+Z19 (Referenz auf eine Messlokation) vorhanden + Rechenschrittidentifikator aus einem SG8 SEQ+Z37 (Bestandteil des Rechenschritts) DE1050 desselben SG5 IDE+24 + Der hier angegebene Rechenschrittidentifikator darf nicht identisch mit dem Rechenschrittidentifikator aus diesem SG8 SEQ+Z37 DE1050 sein + wenn vorhanden + Wenn in SG8 SEQ+Z37 SG9 CCI+++Z86 CAV+Z69/Z70 (Addition / Subtraktion) vorhanden, darf es in dem Vorgang beliebig viele weitere SG8 SEQ+Z37 mit identischem Rechenschrittidentifikator geben, die jedoch ausschließlich die Operatoren Z69/Z70 enthalten dürfen + Wenn in SG8 SEQ+Z37 SG9 CCI+++Z86 CAV+Z80/Z81 (Divisor / Dividend) vorhanden, muss in diesem Vorgang genau eine zweite SG8 SEQ+Z37 mit identischen Rechenschrittidentifikator vorhanden sein, sodass das eine SG8 SEQ+Z37 den Operator Z80 (Divisor) und das andere SG8 SEQ+Z37 den Operator Z81 (Dividend) enthält + Wenn in SG8 SEQ+Z37 SG9 CCI+++Z86 CAV+Z82 (Faktor) vorhanden, darf es in dem Vorgang beliebig viele weitere SG8 SEQ+Z37 mit identischem Rechenschrittidentifikator geben, die jedoch ausschließlich CAV+Z82 enthalten + Wenn in einem SG5 IDE+24 nur eine SEQ+Z37 mit einer SG8 RFF+Z19 (Messlokation) vorhanden ist + Der hier angegebene Code des Prüfschritt muss im EBD dem Cluster Zustimmung zugeordnet sein + Der hier angegebene Code des Prüfschritt muss im EBD dem Cluster Ablehnung zugeordnet sein + Wenn MP-ID in SG2 NAD+MR (Nachrichtenempfänger) in der Rolle LF + Wenn in dieser CAV+ZD3 der Wert im DE7110 mit Z32 (sonstiger Zählzeitdefinitionstyp) vorhanden ist + Wenn MP-ID in SG2 NAD+MS (Nachrichtenabsender) in der Rolle NB + Wenn SG5 STS+Z36+Z45 (Definitionen werden verwendet) vorhanden + Wenn MP-ID in SG2 NAD+MR (Nachrichtenempfänger) in der Rolle LF + sofern per ORDERS reklamiert + Wenn in SG9 CAV+ZD4+Z26 (keine Verwendung des Hochlastzeitfensters) vorhanden + Wenn in SG8 SEQ+Z43 DTM+Z33 (Zählzeitänderungszeitpunkt) im DE2379 der Code 303 vorhanden + Der Wert von CCYY in diesem DE muss genau um eins höher sein, als der Wert CCYY des SG5 DTM+Z34 (Gültigkeitsbeginn) DE2380 + Wenn im DE2379 dieses Segments der Code 303 vorhanden + Der Zeitpunkt in diesem DE muss ≥ dem Zeitpunkt aus dem DE2380 des Gültigkeitsbeginn der ausgerollten Definition (SG5 DTM+Z34) sein + Der Zeitpunkt in diesem DE muss ≤ dem Zeitpunkt aus dem DE2380 des Gültigkeitsende der ausgerollten Definition (SG5 DTM+Z35) sein + Wenn im DE2379 dieses Segments der Code 401 vorhanden + Wenn in SG8 SEQ+Z43 DTM+Z33 (Zählzeitänderungszeitpunkt) im DE2379 der Code 401 vorhanden + Wenn ein Gültigkeitsende bereits angegeben werden kann. + Wenn SG8 SEQ+Z42 (Zählzeitdefinition) vorhanden + Der in diesem Datenlement angegebene Code der Schaltzeitdefinition muss innerhalb eines Vorgangs (IDE) eindeutig sein. + Der in diesem Datenlement angegebene Code der Leistungskurvendefinition muss innerhalb eines Vorgangs (IDE) eindeutig sein. + Der in diesem Datenlement angegebene Code der Zählzeitdefinition muss innerhalb eines Vorgangs (IDE) eindeutig sein. + Wenn in SG8 SEQ+Z73 DTM+Z44 (Schaltzeitänderungszeitpunkt) im DE2379 der Code 303 vorhanden + Wenn in SG8 SEQ+Z73 DTM+Z44 (Schaltzeitänderungszeitpunkt) im DE2379 der Code 401 vorhanden + Wenn in SG8 SEQ+Z74 DTM+Z45 (Leistungskurvenänderungszeitpunkt) im DE2379 der Code 303 vorhanden + Wenn in SG8 SEQ+Z74 DTM+Z45 (Leistungskurvenänderungszeitpunkt) im DE2379 der Code 401 vorhanden + In jedem DE2379 dieses DTM-Segments innerhalb eines IDE+24 (Vorgangs) muss der gleiche Code angegeben werden + wenn Wert in diesem DE, an der Stelle CCYYMMDD ein Datum aus dem angegeben Zeitraum der Tabelle Kapitel 3.5 „Prozesszeitpunkt bei MESZ mit UTC“ ist + wenn Wert in diesem DE, an der Stelle CCYYMMDD ein Datum aus dem angegeben Zeitraum der Tabelle Kapitel 3.6 „Prozesszeitpunkt bei MEZ mit UTC“ ist + Das hier genannte Datum muss der Zeitpunkt sein, zu dem das Dokument erstellt wurde, oder ein Zeitpunkt, der davor liegt. + Hinweis: Zeitpunkt, ab dem die Berechnungsformel anzuwenden ist + Hinweis: Verwendung der ID der Marktlokation + Hinweis: Verwendung der ID der Messlokation + Hinweis: Wert aus BGM+Z55 DE1004 der ORDERS mit der die Reklamation einer Definition erfolgt ist + Hinweis: Jede ausgerollte Zählzeitdefinition ist in einem eigenen IDE anzugeben + Hinweis: Zeitpunkt, ab dem die Übersicht der Zählzeitdefinitionen gültig ist + Hinweis: Es ist die Zeit nach der deutschen gesetzlichen Zeit anzugeben + Hinweis: Zeitpunkt, ab dem die Übersicht der Schaltzeitdefinitionen gültig ist + Hinweis: Zeitpunkt, ab dem die Übersicht der Leistungskurvendefinition gültig ist + Hinweis: Für jeden Zählzeitänderungszeitpunkt (SG8 DTM+Z33) ist diese Sementgruppe einmal anzugeben + Hinweis: Der Zählzeitänderungszeitpunkt (SG8DTM+Z33) dieser SG8 darf in keiner anderen SG8 „Zählzeitdefinition“ wiederholt werden + Hinweis: Wenn der Code 303 im DE2379 des Zählzeitänderungszeitpunkt (SG8 DTM+Z33) genutzt wird, muss genau ein Wert im DE2380 des Zählzeitänderungszeitpunkt (SG8 DTM+Z33) identisch mit dem Wert aus DE2380 des Gültigkeitsbeginn der ausgerollten Definition (SG5 DTM+Z34) sein + Hinweis: Wenn der Code 401 im DE2379 des Zählzeitänderungszeitpunkt (SG8 DTM+Z33) genutzt wird, muss genau ein Wert = 0000 im DE2380 des Zählzeitänderungszeitpunkt (SG8 DTM+Z33) sein + Hinweis: Für jeden Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) ist diese Sementgruppe einmal anzugeben + Hinweis: Kein Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) darf mehrfach vorkommen + Hinweis: Wenn der Code 303 im DE2379 des Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) genutzt wird, muss genau ein Wert im DE2380 des Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) identisch mit dem Wert aus DE2380 des Gültigkeitsbeginn der ausgerollten Definition (SG5 DTM+Z34) sein + Hinweis: Wenn der Code 401 im DE2379 des Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) genutzt wird, muss genau ein Wert = 0000 im DE2380 des Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) sein + Hinweis: Für jeden Leistungskurvenänderungszeitpunkt (SG8 DTM+Z45) ist diese Sementgruppe einmal anzugeben + Hinweis: Kein Leistungskurvenänderungszeitpunkt (SG8 DTM+Z45) darf mehrfach vorkommen + Hinweis: Wenn der Code 303 im DE2379 des Leistungskurvenänderungszeitpunkt (SG8 DTM+Z45) genutzt wird, muss genau ein Wert im DE2380 des Leistungskurvenänderungszeitpunkt (SG8 DTM+Z45) identisch mit dem Wert aus DE2380 des Gültigkeitsbeginn der ausgerollten Definition (SG5 DTM+Z34) sein + Hinweis: Wenn der Code 401 im DE2379 des Leistungskurvenänderungszeitpunkt (SG8 DTM+Z45) + Hinweis: Jede ausgerollte Schaltzeitdefinition ist in einem eigenen IDE anzugeben + Hinweis: Jede ausgerollte Leistungskurvendefinition ist in einem eigenen IDE anzugeben + Hinweis: Es ist der Code einer Zählzeitdefinition anzugeben + Hinweis: Es ist der Code einer Schaltzeitdefinition anzugeben + Hinweis: Es ist der Code einer Leistungskurvendefinition anzugeben + Hinweis: Dieser Code ist anzugeben, wenn es sich um eine einmalig zu übermittelnde Definition handelt + Hinweis: Dieser Code ist anzugeben, wenn es sich um eine jährlich zu übermittelnde Definition handelt + Format: Wert kann mit maximal 6 Nachkommastellen angegeben werden + Format: Mögliche Werte: 1 bis 99999 + Format: Möglicher Wert: > 0 + Format: Möglicher Wert: ≠ 1 + Format: max. 2 Nachkommastellen + Format: ZZZ = +00 + Format: HHMM = 2200 + Format: HHMM = 2300 + Format: MMDDHHMM = 12312300 + Format: Marktlokations-ID + Format: Zählpunktbezeichnung + Format: Möglicher Wert: ≤ 100 + Format: HHMM ≥ 0000 + Format: HHMM ≤ 2359 + Format: Möglicher Wer: ≤ 1 + Segment ist bis zu viermal je SG9 CCI+Z27 anzugeben + Segment bzw. Segmentgruppe ist genau einmal anzugeben + Für jeden Code der Zählzeit aus SG8 SEQ+Z42 (Zählzeitdefinition) SG9 CCI+Z39 (Code der Zählzeitdefinition) sind mindestens zwei Register anzugeben, bei denen in dieser SG8 das SG8 RFF+Z27 mit diesem Code gefüllt ist + + + ([931] ∧ [932] [490]) ⊻ ([931] ∧ [933] [491]) + + + -- + + diff --git a/unittests/example_files/UTILTS_AHB_1.1d_Konsultationsfassung_2024_04_02.xml b/unittests/example_files/UTILTS_AHB_1.1d_Konsultationsfassung_2024_04_02.xml new file mode 100644 index 0000000..50bdca7 --- /dev/null +++ b/unittests/example_files/UTILTS_AHB_1.1d_Konsultationsfassung_2024_04_02.xml @@ -0,0 +1,2027 @@ + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1d + + + + + + + Z36 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + 172 + + + + + + + + + 157 + + + + 303 + + + + + + + Z23 + + + + + Z33 + Z34 + Z40 + Z41 + + + + + + + + Z13 + + + 25001 + + + + + + + + Z30 + + + + Z06 + Z07 + + + + + + + + Z36 + + + + + + Z23 + + + + + + + + + Z37 + + + + + + + + + Z19 + + + + + + + + Z23 + + + + + + + + + Z86 + + + + + + + Z69 + Z70 + Z80 + Z81 + Z82 + + + + + + + + + Z87 + + + + + + + Z71 + Z72 + + + + + + + + + Z16 + + + + + + + Z28 + + + + + + + + + + ZB2 + + + + + + + Z28 + + + + + + + + + + ZG6 + + + + + + + ZH6 + + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1d + + + + + + + Z36 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + + E01 + + + + + + E_0218 + + + + + + ACB + + + + + + + + + + + + + + Z13 + + + 25002 + + + + + + + + + TN + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1d + + + + + + + Z36 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + + E01 + + + + + + E_0218 + + + + + + + + Z13 + + + 25003 + + + + + + + + + TN + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1d + + + + + + + Z81 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + Z09 + + + + + + + + + Z34 + + + + 303 + + + + + + + Z35 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + + Z13 + + + 25009 + + + + + + + + + AGI + + + + + + + + + Z74 + + + + + + Z45 + + + + 303 + 401 + + + + + + + + + + + + + + + + Z40 + + + + P1 + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1d + + + + + + + Z80 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + Z09 + + + + + + + + + Z34 + + + + 303 + + + + + + + Z35 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + + Z13 + + + 25008 + + + + + + + + + AGI + + + + + + + + + Z73 + + + + + + Z44 + + + + 303 + 401 + + + + + + + + + + + + + + + Z58 + + + + ZF4 + ZF5 + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1d + + + + + + + Z59 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + Z09 + + + + + + + + + Z34 + + + + 303 + + + + + + + Z35 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + + Z13 + + + 25005 + + + + + + + + + AGI + + + + + + + + + Z43 + + + + + + Z33 + + + + 303 + 401 + + + + + + + Z28 + + + + + + + + + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1d + + + + + + + Z79 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + + 157 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + Z36 + + + + + Z45 + Z46 + + + + + + + + Z13 + + + 25007 + + + + + + + + + AGI + + + + + + + + + Z70 + + + + + + Z53 + + + + + + + + + ZE0 + + + Z33 + Z34 + + + + + + + ZD5 + + + Z23 + Z24 + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1d + + + + + + + Z78 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + + 157 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + Z36 + + + + + Z45 + Z46 + + + + + + + + Z13 + + + 25006 + + + + + + + + + AGI + + + + + + + + + Z69 + + + + + + Z52 + + + + + + + + + ZE0 + + + Z33 + Z34 + + + + + + + ZD5 + + + Z23 + Z24 + + + + + + + + + + + + + + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1d + + + + + + + Z60 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + + 157 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + Z36 + + + + + Z45 + Z46 + + + + + + + + Z13 + + + 25004 + + + + + + + + + AGI + + + + + + + + + Z42 + + + + + + Z39 + + + + + + + + + ZE0 + + + Z33 + Z34 + + + + + + + ZD5 + + + Z23 + Z24 + + + + + + + ZD4 + + + Z25 + Z26 + + + + + + + ZD7 + + + Z27 + Z28 + + + + + + + ZD3 + + + Z29 + Z30 + Z31 + Z32 + Z35 + + + + + + + + + + Z41 + + + + + + Z27 + + + + + + + + Z38 + + + + + + + + + + Z10 + + + + Z59 + Z60 + + + + + + + + + + + + + + + Nur MP-ID aus Sparte Strom + Wenn SG5 STS+Z23+Z34 (Formel muss beim Absender angefragt werden) in einem SG5 IDE vorhanden + Wenn SG5 STS+Z23+Z33 (Formel angefügt) vorhanden + Wenn in dieser SG5 das STS+E01++A99 (Ablehnung Sonstiges) vorhanden + Wenn das SG8 RFF+Z19 (Referenz auf eine Messlokation) in derselben SG8 SEQ+Z37 nicht vorhanden + Wenn das SG8 RFF+Z23 (Referenz auf Rechenschritt) in derselben SG8 SEQ+Z37 nicht vorhanden + Wenn in derselben SG8 SEQ+Z37 das SG8 RFF+Z19 (Referenz auf eine Messlokation) vorhanden + Rechenschrittidentifikator aus einem SG8 SEQ+Z37 (Bestandteil des Rechenschritts) DE1050 desselben SG5 IDE+24 + Der hier angegebene Rechenschrittidentifikator darf nicht identisch mit dem Rechenschrittidentifikator aus diesem SG8 SEQ+Z37 DE1050 sein + wenn vorhanden + Wenn in SG8 SEQ+Z37 SG9 CCI+++Z86 CAV+Z69/Z70 (Addition / Subtraktion) vorhanden, darf es in dem Vorgang beliebig viele weitere SG8 SEQ+Z37 mit identischem Rechenschrittidentifikator geben, die jedoch ausschließlich die Operatoren Z69/Z70 enthalten dürfen + Wenn in SG8 SEQ+Z37 SG9 CCI+++Z86 CAV+Z80/Z81 (Divisor / Dividend) vorhanden, muss in diesem Vorgang genau eine zweite SG8 SEQ+Z37 mit identischen Rechenschrittidentifikator vorhanden sein, sodass das eine SG8 SEQ+Z37 den Operator Z80 (Divisor) und das andere SG8 SEQ+Z37 den Operator Z81 (Dividend) enthält + Wenn in SG8 SEQ+Z37 SG9 CCI+++Z86 CAV+Z82 (Faktor) vorhanden, darf es in dem Vorgang beliebig viele weitere SG8 SEQ+Z37 mit identischem Rechenschrittidentifikator geben, die jedoch ausschließlich CAV+Z82 enthalten + Wenn in einem SG5 IDE+24 nur eine SEQ+Z37 mit einer SG8 RFF+Z19 (Messlokation) vorhanden ist + Der hier angegebene Code des Prüfschritt muss im EBD dem Cluster Zustimmung zugeordnet sein + Der hier angegebene Code des Prüfschritt muss im EBD dem Cluster Ablehnung zugeordnet sein + Wenn MP-ID in SG2 NAD+MR (Nachrichtenempfänger) in der Rolle LF + Wenn in dieser CAV+ZD3 der Wert im DE7110 mit Z32 (sonstiger Zählzeitdefinitionstyp) vorhanden ist + Wenn MP-ID in SG2 NAD+MS (Nachrichtenabsender) in der Rolle NB + Wenn SG5 STS+Z36+Z45 (Definitionen werden verwendet) vorhanden + Wenn MP-ID in SG2 NAD+MR (Nachrichtenempfänger) in der Rolle LF + sofern per ORDERS reklamiert + Wenn in SG9 CAV+ZD4+Z26 (keine Verwendung des Hochlastzeitfensters) vorhanden + Wenn in SG8 SEQ+Z43 DTM+Z33 (Zählzeitänderungszeitpunkt) im DE2379 der Code 303 vorhanden + Der Wert von CCYY in diesem DE muss genau um eins höher sein, als der Wert CCYY des SG5 DTM+Z34 (Gültigkeitsbeginn) DE2380 + Wenn im DE2379 dieses Segments der Code 303 vorhanden + Der Zeitpunkt in diesem DE muss ≥ dem Zeitpunkt aus dem DE2380 des Gültigkeitsbeginn der ausgerollten Definition (SG5 DTM+Z34) sein + Der Zeitpunkt in diesem DE muss ≤ dem Zeitpunkt aus dem DE2380 des Gültigkeitsende der ausgerollten Definition (SG5 DTM+Z35) sein + Wenn im DE2379 dieses Segments der Code 401 vorhanden + Wenn in SG8 SEQ+Z43 DTM+Z33 (Zählzeitänderungszeitpunkt) im DE2379 der Code 401 vorhanden + Wenn ein Gültigkeitsende bereits angegeben werden kann. + Wenn SG8 SEQ+Z42 (Zählzeitdefinition) vorhanden + Der in diesem Datenlement angegebene Code der Schaltzeitdefinition muss innerhalb eines Vorgangs (IDE) eindeutig sein. + Der in diesem Datenlement angegebene Code der Leistungskurvendefinition muss innerhalb eines Vorgangs (IDE) eindeutig sein. + Der in diesem Datenlement angegebene Code der Zählzeitdefinition muss innerhalb eines Vorgangs (IDE) eindeutig sein. + Wenn in SG8 SEQ+Z73 DTM+Z44 (Schaltzeitänderungszeitpunkt) im DE2379 der Code 303 vorhanden + Wenn in SG8 SEQ+Z73 DTM+Z44 (Schaltzeitänderungszeitpunkt) im DE2379 der Code 401 vorhanden + Wenn in SG8 SEQ+Z74 DTM+Z45 (Leistungskurvenänderungszeitpunkt) im DE2379 der Code 303 vorhanden + Wenn in SG8 SEQ+Z74 DTM+Z45 (Leistungskurvenänderungszeitpunkt) im DE2379 der Code 401 vorhanden + In jedem DE2379 dieses DTM-Segments innerhalb eines IDE+24 (Vorgangs) muss der gleiche Code angegeben werden + Wenn in SG5 LOC+172 DE3225 (Meldepunkt) die ID einer Marktlokation angegeben ist. + Wenn im DE3155 in demselben COM der Code EM vorhanden ist + Wenn im DE3155 in demselben COM der Code TE / FX / AJ / AL vorhanden ist + wenn Wert in diesem DE, an der Stelle CCYYMMDD ein Datum aus dem angegeben Zeitraum der Tabelle Kapitel 3.5 „Prozesszeitpunkt bei MESZ mit UTC“ ist + wenn Wert in diesem DE, an der Stelle CCYYMMDD ein Datum aus dem angegeben Zeitraum der Tabelle Kapitel 3.6 „Prozesszeitpunkt bei MEZ mit UTC“ ist + Das hier genannte Datum muss der Zeitpunkt sein, zu dem das Dokument erstellt wurde, oder ein Zeitpunkt, der davor liegt. + Hinweis: Zeitpunkt, ab dem die Berechnungsformel anzuwenden ist + Hinweis: Verwendung der ID der Marktlokation + Hinweis: Verwendung der ID der Messlokation + Hinweis: Wert aus BGM+Z55 DE1004 der ORDERS mit der die Reklamation einer Definition erfolgt ist + Hinweis: Jede ausgerollte Zählzeitdefinition ist in einem eigenen IDE anzugeben + Hinweis: Zeitpunkt, ab dem die Übersicht der Zählzeitdefinitionen gültig ist + Hinweis: Es ist die Zeit nach der deutschen gesetzlichen Zeit anzugeben + Hinweis: Zeitpunkt, ab dem die Übersicht der Schaltzeitdefinitionen gültig ist + Hinweis: Zeitpunkt, ab dem die Übersicht der Leistungskurvendefinition gültig ist + Hinweis: Für jeden Zählzeitänderungszeitpunkt (SG8 DTM+Z33) ist diese Sementgruppe einmal anzugeben + Hinweis: Der Zählzeitänderungszeitpunkt (SG8DTM+Z33) dieser SG8 darf in keiner anderen SG8 „Zählzeitdefinition“ wiederholt werden + Hinweis: Wenn der Code 303 im DE2379 des Zählzeitänderungszeitpunkt (SG8 DTM+Z33) genutzt wird, muss genau ein Wert im DE2380 des Zählzeitänderungszeitpunkt (SG8 DTM+Z33) identisch mit dem Wert aus DE2380 des Gültigkeitsbeginn der ausgerollten Definition (SG5 DTM+Z34) sein + Hinweis: Wenn der Code 401 im DE2379 des Zählzeitänderungszeitpunkt (SG8 DTM+Z33) genutzt wird, muss genau ein Wert = 0000 im DE2380 des Zählzeitänderungszeitpunkt (SG8 DTM+Z33) sein + Hinweis: Für jeden Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) ist diese Sementgruppe einmal anzugeben + Hinweis: Kein Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) darf mehrfach vorkommen + Hinweis: Wenn der Code 303 im DE2379 des Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) genutzt wird, muss genau ein Wert im DE2380 des Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) identisch mit dem Wert aus DE2380 des Gültigkeitsbeginn der ausgerollten Definition (SG5 DTM+Z34) sein + Hinweis: Wenn der Code 401 im DE2379 des Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) genutzt wird, muss genau ein Wert = 0000 im DE2380 des Schaltzeitänderungszeitpunkt (SG8 DTM+Z44) sein + Hinweis: Für jeden Leistungskurvenänderungszeitpunkt (SG8 DTM+Z45) ist diese Sementgruppe einmal anzugeben + Hinweis: Kein Leistungskurvenänderungszeitpunkt (SG8 DTM+Z45) darf mehrfach vorkommen + Hinweis: Wenn der Code 303 im DE2379 des Leistungskurvenänderungszeitpunkt (SG8 DTM+Z45) genutzt wird, muss genau ein Wert im DE2380 des Leistungskurvenänderungszeitpunkt (SG8 DTM+Z45) identisch mit dem Wert aus DE2380 des Gültigkeitsbeginn der ausgerollten Definition (SG5 DTM+Z34) sein + Hinweis: Wenn der Code 401 im DE2379 des Leistungskurvenänderungszeitpunkt (SG8 DTM+Z45) + Hinweis: Jede ausgerollte Schaltzeitdefinition ist in einem eigenen IDE anzugeben + Hinweis: Jede ausgerollte Leistungskurvendefinition ist in einem eigenen IDE anzugeben + Hinweis: Es ist der Code einer Zählzeitdefinition anzugeben + Hinweis: Es ist der Code einer Schaltzeitdefinition anzugeben + Hinweis: Es ist der Code einer Leistungskurvendefinition anzugeben + Hinweis: Dieser Code ist anzugeben, wenn es sich um eine einmalig zu übermittelnde Definition handelt + Hinweis: Dieser Code ist anzugeben, wenn es sich um eine jährlich zu übermittelnde Definition handelt + Hinweis: Verwendung der ID der Netzlokation + Hinweis: Es darf nur eine Information im DE3148 übermittelt werden + Format: Wert kann mit maximal 6 Nachkommastellen angegeben werden + Format: Mögliche Werte: 1 bis 99999 + Format: Möglicher Wert: > 0 + Format: Möglicher Wert: ≠ 1 + Format: max. 2 Nachkommastellen + Format: ZZZ = +00 + Format: HHMM = 2200 + Format: HHMM = 2300 + Format: Die Zeichenkette muss die Zeichen @ und . enthalten + Format: Die Zeichenkette muss mit dem Zeichen + beginnen und danach dürfen nur noch Ziffern folgen + Format: MMDDHHMM = 12312300 + Format: Marktlokations-ID + Format: Zählpunktbezeichnung + Format: Netzlokations-ID + Format: Möglicher Wert: ≤ 100 + Format: HHMM ≥ 0000 + Format: HHMM ≤ 2359 + Format: Möglicher Wer: ≤ 1 + Segment bzw. Segmentgruppe ist genau einmal anzugeben + Für jeden Code der Zählzeit aus SG8 SEQ+Z42 (Zählzeitdefinition) SG9 CCI+Z39 (Code der Zählzeitdefinition) sind mindestens zwei Register anzugeben, bei denen in dieser SG8 das SG8 RFF+Z27 mit diesem Code gefüllt ist + + + ([931] ∧ [932] [490]) ⊻ ([931] ∧ [933] [491]) + + + -- + + diff --git a/unittests/example_files/UTILTS_MIG_1.1c_Lesefassung_2023_12_12.xml b/unittests/example_files/UTILTS_MIG_1.1c_Lesefassung_2023_12_12.xml new file mode 100644 index 0000000..478fd81 --- /dev/null +++ b/unittests/example_files/UTILTS_MIG_1.1c_Lesefassung_2023_12_12.xml @@ -0,0 +1,762 @@ + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1c + + + + + + + Z36 + Z59 + Z60 + Z78 + Z79 + Z80 + Z81 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + 172 + + + + + + + + Z09 + + + + + + + + + 157 + + + + 303 + + + + + + + Z34 + + + + 303 + + + + + + + Z35 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + E01 + + + + + + + + + E_0218 + + + + + + + Z23 + + + + + Z33 + Z34 + Z40 + Z41 + + + + + + + Z36 + + + + + Z45 + Z46 + + + + + + + + Z13 + + + 25001 + 25002 + 25003 + 25004 + 25005 + 25006 + 25007 + 25008 + 25009 + + + + + + + + + AGI + + + + + + + + + + TN + + + + + + + + + Z30 + + + + + + + Z06 + Z07 + + + + + + + + Z36 + + + + + + Z23 + + + + + + + + Z27 + + + + + + Z84 + Z85 + Z86 + Z92 + Z47 + + + + + + + + + Z37 + + + + + + + + + Z19 + + + + + + + + Z23 + + + + + + + + + + + + + Z86 + + + + + + + Z69 + Z70 + Z80 + Z81 + Z82 + Z83 + + + + + + + + + + + + + Z87 + + + + + + + Z71 + Z72 + + + + + + + + + + + + + Z16 + + + + + + + Z28 + + + + + + + + + + + + + + + + ZB2 + + + + + + + Z28 + + + + + + + + + + + + + + + + ZG6 + + + + + + + ZH6 + + + + + + + + + + + + Z42 + Z43 + + + + + + Z33 + + + + 303 + 401 + + + + + + + Z28 + + + + + + + + Z39 + + + + + + + + + + + + ZE0 + + + + + Z33 + Z34 + + + + + + + ZD5 + + + + + Z23 + Z24 + + + + + + + ZD4 + + + + + Z25 + Z26 + + + + + + + ZD7 + + + + + Z27 + Z28 + + + + + + + ZD3 + + + + + Z29 + Z30 + Z31 + Z32 + Z35 + + + + + + + + + + Z41 + + + + + + Z27 + + + + + + + + Z38 + + + + + + + + + + + + + Z10 + + + + + + + Z59 + Z60 + + + + + + + + + + Z69 + Z73 + + + + + + + Z44 + + + + 303 + 401 + + + + + + + Z52 + + + + + + + + + + + + ZE0 + + + + + Z33 + Z34 + + + + + + + ZD5 + + + + + Z23 + Z24 + + + + + + + + + Z58 + + + + + + + + ZF4 + ZF5 + + + + + + + + + + Z70 + Z74 + + + + + + + Z45 + + + + 303 + 401 + + + + + + + Z53 + + + + + + + + + + + + ZE0 + + + + + Z33 + Z34 + + + + + + + ZD5 + + + + + Z23 + Z24 + + + + + + + + + + Z40 + + + + + P1 + + + + + + + + + + + + diff --git a/unittests/example_files/UTILTS_MIG_1.1d_Konsultationsfassung_2024_04_02.xml b/unittests/example_files/UTILTS_MIG_1.1d_Konsultationsfassung_2024_04_02.xml new file mode 100644 index 0000000..7c26e84 --- /dev/null +++ b/unittests/example_files/UTILTS_MIG_1.1d_Konsultationsfassung_2024_04_02.xml @@ -0,0 +1,760 @@ + + + + + + + UTILTS + + + D + + + 18A + + + UN + + + 1.1d + + + + + + + Z36 + Z59 + Z60 + Z78 + Z79 + Z80 + Z81 + + + + + + + + + + 137 + + + + 303 + + + + + + + MS + + + + + + 9 + 293 + + + + + + + IC + + + + + + + + + + + EM + FX + TE + AJ + AL + + + + + + + + MR + + + + + + 9 + 293 + + + + + + + + 24 + + + + + + + + 172 + + + + + + + + Z09 + + + + + + + + + 157 + + + + 303 + + + + + + + Z34 + + + + 303 + + + + + + + Z35 + + + + 303 + + + + + + + 293 + + + + 304 + + + + + + + E01 + + + + + + + + + E_0218 + + + + + + + Z23 + + + + + Z33 + Z34 + Z40 + Z41 + + + + + + + Z36 + + + + + Z45 + Z46 + + + + + + ACB + + + + + + + + + + + + + + + + + + Z13 + + + 25001 + 25002 + 25003 + 25004 + 25005 + 25006 + 25007 + 25008 + 25009 + + + + + + + + + AGI + + + + + + + + + + TN + + + + + + + + + Z30 + + + + + + + Z06 + Z07 + + + + + + + + Z36 + + + + + + Z23 + + + + + + + + + Z37 + + + + + + + + + Z19 + + + + + + + + Z23 + + + + + + + + + + + + + Z86 + + + + + + + Z69 + Z70 + Z80 + Z81 + Z82 + Z83 + + + + + + + + + + + + + Z87 + + + + + + + Z71 + Z72 + + + + + + + + + + + + + Z16 + + + + + + + Z28 + + + + + + + + + + + + + + + + ZB2 + + + + + + + Z28 + + + + + + + + + + + + + + + + ZG6 + + + + + + + ZH6 + + + + + + + + + + + + Z42 + Z43 + + + + + + Z33 + + + + 303 + 401 + + + + + + + Z28 + + + + + + + + Z39 + + + + + + + + + + + + ZE0 + + + + + Z33 + Z34 + + + + + + + ZD5 + + + + + Z23 + Z24 + + + + + + + ZD4 + + + + + Z25 + Z26 + + + + + + + ZD7 + + + + + Z27 + Z28 + + + + + + + ZD3 + + + + + Z29 + Z30 + Z31 + Z32 + Z35 + + + + + + + + + + Z41 + + + + + + Z27 + + + + + + + + Z38 + + + + + + + + + + + + + Z10 + + + + + + + Z59 + Z60 + + + + + + + + + + Z69 + Z73 + + + + + + + Z44 + + + + 303 + 401 + + + + + + + Z52 + + + + + + + + + + + + ZE0 + + + + + Z33 + Z34 + + + + + + + ZD5 + + + + + Z23 + Z24 + + + + + + + + + Z58 + + + + + + + + ZF4 + ZF5 + + + + + + + + + + Z70 + Z74 + + + + + + + Z45 + + + + 303 + 401 + + + + + + + Z53 + + + + + + + + + + + + ZE0 + + + + + Z33 + Z34 + + + + + + + ZD5 + + + + + Z23 + Z24 + + + + + + + + + + Z40 + + + + + P1 + + + + + + + + + + + + diff --git a/unittests/test_migreader.py b/unittests/test_migreader.py new file mode 100644 index 0000000..b6426c9 --- /dev/null +++ b/unittests/test_migreader.py @@ -0,0 +1,54 @@ +from datetime import date +from pathlib import Path + +import pytest + +from bamx.reader import MigReader + + +@pytest.mark.parametrize( + "mig_xml_file_path, expected_date", + [ + pytest.param( + Path(__file__).parent / "example_files" / "UTILTS_MIG_1.1c_Lesefassung_2023_12_12.xml", date(2023, 10, 24) + ), + pytest.param( + Path(__file__).parent / "example_files" / "UTILTS_MIG_1.1d_Konsultationsfassung_2024_04_02.xml", + date(2024, 4, 2), + ), + ], +) +def test_get_publishing_date(mig_xml_file_path: Path, expected_date: date) -> None: + reader = MigReader(mig_xml_file_path) + actual = reader.get_publishing_date() + assert actual == expected_date + + +@pytest.mark.parametrize( + "mig_xml_file_path, expected", + [ + pytest.param(Path(__file__).parent / "example_files" / "UTILTS_MIG_1.1c_Lesefassung_2023_12_12.xml", "BDEW"), + pytest.param( + Path(__file__).parent / "example_files" / "UTILTS_MIG_1.1d_Konsultationsfassung_2024_04_02.xml", "BDEW" + ), + ], +) +def test_get_author(mig_xml_file_path: Path, expected: str) -> None: + reader = MigReader(mig_xml_file_path) + actual = reader.get_author() + assert actual == expected + + +@pytest.mark.parametrize( + "mig_xml_file_path, expected", + [ + pytest.param(Path(__file__).parent / "example_files" / "UTILTS_MIG_1.1c_Lesefassung_2023_12_12.xml", "1.1c"), + pytest.param( + Path(__file__).parent / "example_files" / "UTILTS_MIG_1.1d_Konsultationsfassung_2024_04_02.xml", "1.1d" + ), + ], +) +def test_get_version(mig_xml_file_path: Path, expected: str) -> None: + reader = MigReader(mig_xml_file_path) + actual = reader.get_version() + assert actual == expected diff --git a/unittests/test_myclass.py b/unittests/test_myclass.py deleted file mode 100644 index 768a9e4..0000000 --- a/unittests/test_myclass.py +++ /dev/null @@ -1,11 +0,0 @@ -from mypackage.mymodule import MyClass - - -class TestMyClass: - """ - A class with pytest unit tests. - """ - - def test_something(self): - my_class = MyClass() - assert my_class.do_something() == "abc" From a12f4fa1233e2238704bd3765f47c9f0613daa3a Mon Sep 17 00:00:00 2001 From: konstantin Date: Thu, 23 May 2024 15:47:51 +0200 Subject: [PATCH 2/3] CI stuff --- .github/workflows/codeql-analysis.yml | 70 ----------------- .github/workflows/python-publish.yml | 103 +++++++++++++------------- 2 files changed, 51 insertions(+), 122 deletions(-) delete mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 27e6afb..0000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,70 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [main] - pull_request: - # The branches below must be a subset of the branches above - branches: [main] - schedule: - - cron: "29 14 * * 6" - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: ["python"] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] - # Learn more about CodeQL language support at https://git.io/codeql-language-support - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v3 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 6a3301d..f522a33 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -5,58 +5,57 @@ # This workflow uploads a Python Package using Twine when a release is created. # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries -# name: Upload Python Package +name: Upload Python Package -# on: -# release: -# types: [created, edited] +on: + release: + types: [ created, edited ] -# jobs: -# tests: -# if: startsWith(github.ref, 'refs/tags/v') -# runs-on: ${{ matrix.os }} -# strategy: -# matrix: -# python-version: ["3.12"] -# os: [ubuntu-latest] -# steps: -# - uses: actions/checkout@v4 -# - name: Set up Python ${{ matrix.python-version }} -# uses: actions/setup-python@v5 -# with: -# python-version: ${{ matrix.python-version }} -# - name: Install tox -# run: | -# python -m pip install --upgrade pip -# pip install tox -# - name: Run tox -# run: | -# tox - -# build-n-publish: -# name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI -# runs-on: ubuntu-latest -# # Specifying a GitHub environment, # Specifying a GitHub environment, which is strongly recommended by PyPI: https://docs.pypi.org/trusted-publishers/adding-a-publisher/ -# # you have to create an environment in your repository settings and add the environment name here -# environment: release -# permissions: -# # IMPORTANT: this permission is mandatory for trusted publishing -# id-token: write -# needs: tests -# steps: -# - uses: actions/checkout@v4 -# - name: Set up Python -# uses: actions/setup-python@v5 -# with: -# python-version: ${{ matrix.python-version }} -# - name: Install dependencies -# run: | -# python -m pip install --upgrade pip -# pip install -r dev_requirements/requirements-packaging.txt -# - name: Build wheel and source distributions -# run: | -# python -m build -# - name: Publish distribution 📦 to PyPI -# if: startsWith(github.ref, 'refs/tags/v') -# uses: pypa/gh-action-pypi-publish@release/v1 +jobs: + tests: + if: startsWith(github.ref, 'refs/tags/v') + runs-on: ${{ matrix.os }} + strategy: + matrix: + python-version: [ "3.12" ] + os: [ ubuntu-latest ] + steps: + - uses: actions/checkout@v4 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install tox + run: | + python -m pip install --upgrade pip + pip install tox + - name: Run tox + run: | + tox + build-n-publish: + name: Build and publish Python 🐍 distributions 📦 to PyPI and TestPyPI + runs-on: ubuntu-latest + # Specifying a GitHub environment, # Specifying a GitHub environment, which is strongly recommended by PyPI: https://docs.pypi.org/trusted-publishers/adding-a-publisher/ + # you have to create an environment in your repository settings and add the environment name here + environment: release + permissions: + # IMPORTANT: this permission is mandatory for trusted publishing + id-token: write + needs: tests + steps: + - uses: actions/checkout@v4 + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r dev_requirements/requirements-packaging.txt + - name: Build wheel and source distributions + run: | + python -m build + - name: Publish distribution 📦 to PyPI + if: startsWith(github.ref, 'refs/tags/v') + uses: pypa/gh-action-pypi-publish@release/v1 From 406d788710dbc8fada4486e2e2f2c2e3d123fa81 Mon Sep 17 00:00:00 2001 From: konstantin Date: Thu, 23 May 2024 15:50:10 +0200 Subject: [PATCH 3/3] spellcheck --- domain-specific-terms.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/domain-specific-terms.txt b/domain-specific-terms.txt index ee2a9a2..96ed511 100644 --- a/domain-specific-terms.txt +++ b/domain-specific-terms.txt @@ -1 +1,2 @@ # contains 1 lower case word per line which are ignored in the spell_check +autor