From 1f2c53dda73c63116974ee62fa59f2acf84b60d9 Mon Sep 17 00:00:00 2001 From: Kevin Date: Fri, 31 Jul 2026 09:32:54 +0000 Subject: [PATCH 1/2] refactor: replace black, isort and pylint with ruff Merges the linting and formatting dependency groups into a single ruff-only `linting` group, translates [tool.black]/[tool.isort]/ .pylintrc into [tool.ruff]/[tool.ruff.lint]/[tool.ruff.format], rewrites .pre-commit-config.yaml and the linting CI job, and auto-fixes/formats the codebase accordingly. Two pre-existing mixedCase public field names (zaehlertypSpezifikation, anzahlAblesungen) are left as-is with a scoped noqa since renaming a public BO4E field would be a breaking API change, not a tooling swap. Co-Authored-By: Claude Sonnet 5 --- .github/workflows/linting.yml | 4 +- .pre-commit-config.yaml | 15 +- .pylintrc | 537 ------------------ README.rst | 8 +- docs/contributing_guide.rst | 12 +- generate_or_validate_json_schemas.py | 23 +- pyproject.toml | 43 +- src/bo4e/__init__.py | 2 +- src/bo4e/bo/angebot.py | 10 +- src/bo4e/bo/ausschreibung.py | 10 +- src/bo4e/bo/bilanzierung.py | 40 +- src/bo4e/bo/buendelvertrag.py | 16 +- src/bo4e/bo/energiemenge.py | 4 +- src/bo4e/bo/fremdkosten.py | 2 +- src/bo4e/bo/geraet.py | 4 +- src/bo4e/bo/geschaeftsobjekt.py | 8 +- src/bo4e/bo/geschaeftspartner.py | 24 +- src/bo4e/bo/kosten.py | 4 +- src/bo4e/bo/lastgang.py | 6 +- src/bo4e/bo/lokationszuordnung.py | 14 +- src/bo4e/bo/marktlokation.py | 24 +- src/bo4e/bo/marktteilnehmer.py | 4 +- src/bo4e/bo/messlokation.py | 18 +- src/bo4e/bo/netzlokation.py | 14 +- src/bo4e/bo/person.py | 14 +- src/bo4e/bo/preisblatt.py | 4 +- src/bo4e/bo/preisblattdienstleistung.py | 6 +- src/bo4e/bo/preisblatthardware.py | 8 +- src/bo4e/bo/preisblattkonzessionsabgabe.py | 4 +- src/bo4e/bo/preisblattmessung.py | 8 +- src/bo4e/bo/preisblattnetznutzung.py | 4 +- src/bo4e/bo/rechnung.py | 32 +- src/bo4e/bo/region.py | 8 +- src/bo4e/bo/standorteigenschaften.py | 2 +- src/bo4e/bo/steuerbareressource.py | 10 +- src/bo4e/bo/tarif.py | 16 +- src/bo4e/bo/tarifinfo.py | 14 +- src/bo4e/bo/tarifkosten.py | 1 - src/bo4e/bo/tarifpreisblatt.py | 6 +- src/bo4e/bo/technischeressource.py | 16 +- src/bo4e/bo/vertrag.py | 14 +- src/bo4e/bo/zaehler.py | 16 +- src/bo4e/bo/zaehlzeitdefinition.py | 6 +- src/bo4e/bo/zeitreihe.py | 8 +- src/bo4e/com/adresse.py | 16 +- src/bo4e/com/angebotsposition.py | 3 +- src/bo4e/com/angebotsteil.py | 6 +- src/bo4e/com/angebotsvariante.py | 6 +- src/bo4e/com/aufabschlag.py | 8 +- src/bo4e/com/ausschreibungsdetail.py | 16 +- src/bo4e/com/ausschreibungslos.py | 12 +- src/bo4e/com/betrag.py | 2 +- src/bo4e/com/com.py | 10 +- src/bo4e/com/dienstleistung.py | 2 +- src/bo4e/com/einheitspreisposition.py | 2 +- src/bo4e/com/energieherkunft.py | 2 +- src/bo4e/com/energiemix.py | 22 +- src/bo4e/com/fremdkostenblock.py | 5 +- src/bo4e/com/fremdkostenposition.py | 14 +- src/bo4e/com/geokoordinaten.py | 6 +- src/bo4e/com/katasteradresse.py | 6 +- src/bo4e/com/konfigurationsprodukt.py | 6 +- src/bo4e/com/kontaktweg.py | 6 +- src/bo4e/com/konzessionsabgabe.py | 4 +- src/bo4e/com/kostenblock.py | 5 +- src/bo4e/com/kostenposition.py | 11 +- src/bo4e/com/lastprofil.py | 18 +- src/bo4e/com/lastvariablepreisposition.py | 4 +- src/bo4e/com/marktgebietinfo.py | 6 +- src/bo4e/com/menge.py | 2 +- src/bo4e/com/messwert.py | 2 +- src/bo4e/com/preis.py | 2 +- src/bo4e/com/preisgarantie.py | 2 +- src/bo4e/com/preisposition.py | 12 +- src/bo4e/com/preisstaffel.py | 11 +- src/bo4e/com/rechnungsposition.py | 6 +- src/bo4e/com/regionsoperation.py | 12 +- src/bo4e/com/regionspreis.py | 6 +- src/bo4e/com/relativepreisposition.py | 8 +- src/bo4e/com/sigmoidparameter.py | 10 +- src/bo4e/com/standorteigenschaftengas.py | 7 +- src/bo4e/com/standorteigenschaftenstrom.py | 8 +- src/bo4e/com/steuerbetrag.py | 6 +- src/bo4e/com/tagesparameter.py | 10 +- src/bo4e/com/tarifberechnungsparameter.py | 10 +- src/bo4e/com/tarifeinschraenkung.py | 10 +- src/bo4e/com/tarifpreis.py | 2 +- src/bo4e/com/tarifpreisposition.py | 2 +- src/bo4e/com/tarifpreiszeitscheibe.py | 8 +- src/bo4e/com/umschaltzeit.py | 6 +- src/bo4e/com/unterschrift.py | 8 +- src/bo4e/com/vertragskonditionen.py | 5 +- src/bo4e/com/vertragsteil.py | 7 +- src/bo4e/com/verwendungszweckpromarktrolle.py | 2 +- src/bo4e/com/vorauszahlung.py | 4 +- src/bo4e/com/zaehlwerk.py | 24 +- src/bo4e/com/zaehlzeitregister.py | 8 +- src/bo4e/com/zaehlzeitsaison.py | 6 +- src/bo4e/com/zaehlzeittagtyp.py | 2 +- src/bo4e/com/zahlungsinformation.py | 10 +- src/bo4e/com/zeitraum.py | 14 +- src/bo4e/com/zeitreihenwert.py | 2 +- src/bo4e/com/zeitvariablepreisposition.py | 4 +- src/bo4e/com/zustaendigkeit.py | 4 +- src/bo4e/zusatzattribut.py | 4 +- tests/serialization_helper.py | 8 +- tests/test_geschaeftspartner.py | 6 +- uv.lock | 210 +------ 108 files changed, 498 insertions(+), 1213 deletions(-) delete mode 100644 .pylintrc diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index ff1e9f078..d4c2649b2 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -24,8 +24,8 @@ jobs: - name: Run linting if: matrix.linter-env == 'linting' run: | - uv run pylint src/bo4e - uv run pylint generate_or_validate_json_schemas.py + uv run ruff check src/bo4e + uv run ruff check generate_or_validate_json_schemas.py - name: Run type_check if: matrix.linter-env == 'type_check' run: | diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index fa69a5fa0..226cfd0ff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -10,13 +10,10 @@ repos: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - - repo: https://github.com/psf/black - rev: 25.1.0 # Replace by any tag/version: https://github.com/psf/black/tags + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.16.1 # Replace by any tag/version: https://github.com/astral-sh/ruff-pre-commit/tags hooks: - - id: black - language_version: python3 # Should be a command that runs python3.6+ - - repo: https://github.com/pycqa/isort - rev: 9.0.0b1 - hooks: - - id: isort - name: isort (python) + - id: ruff-check + args: [--fix] + files: ^(src/bo4e|generate_or_validate_json_schemas\.py) + - id: ruff-format diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index 3606dd347..000000000 --- a/.pylintrc +++ /dev/null @@ -1,537 +0,0 @@ -[MASTER] - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code. -extension-pkg-allow-list= - -# A comma-separated list of package or module names from where C extensions may -# be loaded. Extensions are loading into the active Python interpreter and may -# run arbitrary code. (This is an alternative name to extension-pkg-allow-list -# for backward compatibility.) -extension-pkg-whitelist= - -# Specify a score threshold to be exceeded before program exits with error. -fail-under=10.0 - -# Files or directories to be skipped. They should be base names, not paths. -ignore=CVS - -# Files or directories matching the regex patterns are skipped. The regex -# matches against base names, not paths. -ignore-patterns= - -# Python code to execute, usually for sys.path manipulation such as -# pygtk.require(). -init-hook='import sys; sys.path.append(".")' - -# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the -# number of processors available to use. -jobs=1 - -# Control the amount of potential inferred values when inferring a single -# object. This can help the performance when dealing with large functions or -# complex, nested conditions. -limit-inference-results=100 - -# List of plugins (as comma separated values of python module names) to load, -# usually to register additional checkers. -#load-plugins= - -# Pickle collected data for later comparisons. -persistent=yes - -# Allow loading of arbitrary C extensions. Extensions are imported into the -# active Python interpreter and may run arbitrary code. -unsafe-load-any-extension=no - - -[MESSAGES CONTROL] - -# Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. -confidence= - -# Disable the message, report, category or checker with the given id(s). You -# can either give multiple identifiers separated by comma (,) or put this -# option multiple times (only on the command line, not in the configuration -# file where it should appear only once). You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if -# you want to run only the similarities checker, you can use "--disable=all -# --enable=similarities". If you want to run only the classes checker, but have -# no Warning level messages displayed, use "--disable=all --enable=classes -# --disable=W". -disable=raw-checker-failed, - bad-inline-option, - locally-disabled, - file-ignored, - suppressed-message, - useless-suppression, - deprecated-pragma, - use-symbolic-message-instead, - line-too-long - -# Enable the message, report, category or checker with the given id(s). You can -# either give multiple identifier separated by comma (,) or put this option -# multiple time (only on the command line, not in the configuration file where -# it should appear only once). See also the "--disable" option for examples. -enable=c-extension-no-member - - -[REPORTS] - -# Python expression which should return a score less than or equal to 10. You -# have access to the variables 'error', 'warning', 'refactor', and 'convention' -# which contain the number of messages in each category, as well as 'statement' -# which is the total number of statements analyzed. This score is used by the -# global evaluation report (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details. -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio). You can also give a reporter class, e.g. -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages. -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=sys.exit - - -[BASIC] - -# Naming style matching correct argument names. -argument-naming-style=snake_case - -# Regular expression matching correct argument names. Overrides argument- -# naming-style. -#argument-rgx= - -# Naming style matching correct attribute names. -attr-naming-style=snake_case - -# Regular expression matching correct attribute names. Overrides attr-naming- -# style. -#attr-rgx= - -# Bad variable names which should always be refused, separated by a comma. -bad-names=foo, - bar, - baz, - toto, - tutu, - tata - -# Bad variable names regexes, separated by a comma. If names match any regex, -# they will always be refused -bad-names-rgxs= - -# Naming style matching correct class attribute names. -class-attribute-naming-style=any - -# Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style. -#class-attribute-rgx= - -# Naming style matching correct class constant names. -class-const-naming-style=UPPER_CASE - -# Regular expression matching correct class constant names. Overrides class- -# const-naming-style. -#class-const-rgx= - -# Naming style matching correct class names. -class-naming-style=PascalCase - -# Regular expression matching correct class names. Overrides class-naming- -# style. -#class-rgx= - -# Naming style matching correct constant names. -const-naming-style=UPPER_CASE - -# Regular expression matching correct constant names. Overrides const-naming- -# style. -#const-rgx= - -# Minimum line length for functions/classes that require docstrings, shorter -# ones are exempt. -docstring-min-length=-1 - -# Naming style matching correct function names. -function-naming-style=snake_case - -# Regular expression matching correct function names. Overrides function- -# naming-style. -#function-rgx= - -# Good variable names which should always be accepted, separated by a comma. -good-names=i, - j, - k, - ex, - Run, - _ - -# Good variable names regexes, separated by a comma. If names match any regex, -# they will always be accepted -good-names-rgxs= - -# Include a hint for the correct naming format with invalid-name. -include-naming-hint=no - -# Naming style matching correct inline iteration names. -inlinevar-naming-style=any - -# Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style. -#inlinevar-rgx= - -# Naming style matching correct method names. -method-naming-style=snake_case - -# Regular expression matching correct method names. Overrides method-naming- -# style. -#method-rgx= - -# Naming style matching correct module names. -module-naming-style=snake_case - -# Regular expression matching correct module names. Overrides module-naming- -# style. -#module-rgx= - -# Colon-delimited sets of names that determine each other's naming style when -# the name regexes allow several styles. -name-group= - -# Regular expression which should only match function or class names that do -# not require a docstring. -no-docstring-rgx=^_ - -# List of decorators that produce properties, such as abc.abstractproperty. Add -# to this list to register other decorators that produce valid properties. -# These decorators are taken in consideration only for invalid-name. -property-classes=abc.abstractproperty - -# Naming style matching correct variable names. -variable-naming-style=snake_case - -# Regular expression matching correct variable names. Overrides variable- -# naming-style. -#variable-rgx= - - -[FORMAT] - -# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. -expected-line-ending-format= - -# Regexp for a line that is allowed to be longer than the limit. -ignore-long-lines=^\s*(# )??$ - -# Number of spaces of indent required inside a hanging or continued line. -indent-after-paren=4 - -# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 -# tab). -indent-string=' ' - -# Maximum number of characters on a single line. -max-line-length=120 - -# Maximum number of lines in a module. -max-module-lines=1000 - -# Allow the body of a class to be on the same line as the declaration if body -# contains single statement. -single-line-class-stmt=no - -# Allow the body of an if to be on the same line as the test if there is no -# else. -single-line-if-stmt=no - - -[LOGGING] - -# The type of string formatting that logging methods do. `old` means using % -# formatting, `new` is for `{}` formatting. -logging-format-style=old - -# Logging modules to check that the string format arguments are in logging -# function parameter format. -logging-modules=logging - - -[MISCELLANEOUS] - -# List of note tags to take in consideration, separated by a comma. -notes=FIXME, - XXX, - #TODO - -# Regular expression of note tags to take in consideration. -#notes-rgx= - - -[SIMILARITIES] - -# Ignore comments when computing similarities. -ignore-comments=yes - -# Ignore docstrings when computing similarities. -ignore-docstrings=yes - -# Ignore imports when computing similarities. -ignore-imports=yes - -# Minimum lines number of a similarity. -min-similarity-lines=4 - - -[SPELLING] - -# Limits count of emitted suggestions for spelling mistakes. -max-spelling-suggestions=4 - -# Spelling dictionary name. Available dictionaries: none. To make it work, -# install the 'python-enchant' package. -spelling-dict= - -# List of comma separated words that should be considered directives if they -# appear and the beginning of a comment and should not be checked. -spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: - -# List of comma separated words that should not be checked. -spelling-ignore-words= - -# A path to a file that contains the private dictionary; one word per line. -spelling-private-dict-file= - -# Tells whether to store unknown words to the private dictionary (see the -# --spelling-private-dict-file option) instead of raising a message. -spelling-store-unknown-words=no - - -[STRING] - -# This flag controls whether inconsistent-quotes generates a warning when the -# character used as a quote delimiter is used inconsistently within a module. -check-quote-consistency=no - -# This flag controls whether the implicit-str-concat should generate a warning -# on implicit string concatenation in sequences defined over several lines. -check-str-concat-over-line-jumps=no - - -[TYPECHECK] - -# List of decorators that produce context managers, such as -# contextlib.contextmanager. Add to this list to register other decorators that -# produce valid context managers. -contextmanager-decorators=contextlib.contextmanager - -# List of members which are set dynamically and missed by pylint inference -# system, and so shouldn't trigger E1101 when accessed. Python regular -# expressions are accepted. -generated-members= - -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - -# Tells whether to warn about missing members when the owner of the attribute -# is inferred to be None. -ignore-none=yes - -# This flag controls whether pylint should warn about no-member and similar -# checks whenever an opaque object is returned when inferring. The inference -# can return multiple potential results while evaluating a Python object, but -# some branches might not be evaluated, which results in partial inference. In -# that case, it might be useful to still emit no-member and other checks for -# the rest of the inferred objects. -ignore-on-opaque-inference=yes - -# List of class names for which member attributes should not be checked (useful -# for classes with dynamically set attributes). This supports the use of -# qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis). It -# supports qualified module names, as well as Unix pattern matching. -#ignored-modules= - -# Show a hint with possible names when a member name was not found. The aspect -# of finding the hint is based on edit distance. -missing-member-hint=yes - -# The minimum edit distance a name should have in order to be considered a -# similar match for a missing member name. -missing-member-hint-distance=1 - -# The total number of similar names that should be taken in consideration when -# showing a hint for a missing member. -missing-member-max-choices=1 - -# List of decorators that change the signature of a decorated function. -signature-mutators= - - -[VARIABLES] - -# List of additional names supposed to be defined in builtins. Remember that -# you should avoid defining new builtins when possible. -additional-builtins= - -# Tells whether unused global variables should be treated as a violation. -allow-global-unused-variables=yes - -# List of names allowed to shadow builtins -allowed-redefined-builtins= - -# List of strings which can identify a callback function by name. A callback -# name must start or end with one of those strings. -callbacks=cb_, - _cb - -# A regular expression matching the name of dummy variables (i.e. expected to -# not be used). -dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ - -# Argument names that match this expression will be ignored. Default to name -# with leading underscore. -ignored-argument-names=_.*|^ignored_|^unused_ - -# Tells whether we should check for unused import in __init__ files. -init-import=no - -# List of qualified module names which can have objects that can redefine -# builtins. -redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io - - -[CLASSES] - -# Warn about protected attribute access inside special methods -check-protected-access-in-special-methods=no - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp, - __post_init__ - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=cls - - -[DESIGN] - -# Maximum number of arguments for function / method. -max-args=5 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Maximum number of boolean expressions in an if statement (see R0916). -max-bool-expr=5 - -# Maximum number of branch for function / method body. -max-branches=12 - -# Maximum number of locals for function / method body. -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body. -max-returns=6 - -# Maximum number of statements in function / method body. -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - - -[IMPORTS] - -# List of modules that can be imported at any level, not just the top level -# one. -allow-any-import-level= - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma. -deprecated-modules=optparse,tkinter.tix - -# Output a graph (.gv or any supported image format) of external dependencies -# to the given file (report RP0402 must not be disabled). -ext-import-graph= - -# Output a graph (.gv or any supported image format) of all (i.e. internal and -# external) dependencies to the given file (report RP0402 must not be -# disabled). -import-graph= - -# Output a graph (.gv or any supported image format) of internal dependencies -# to the given file (report RP0402 must not be disabled). -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - -# Couples of modules and preferred modules, separated by a comma. -preferred-modules= - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "BaseException, Exception". -overgeneral-exceptions=builtins.BaseException, - builtins.Exception diff --git a/README.rst b/README.rst index 3525a5da0..c8db03516 100644 --- a/README.rst +++ b/README.rst @@ -13,8 +13,8 @@ BO4E .. |license| image:: https://img.shields.io/badge/License-MIT-blue.svg .. _license: https://github.com/Hochfrequenz/BO4E-python/blob/main/LICENSE.rst -.. |code style| image:: https://img.shields.io/badge/code%20style-black-000000.svg -.. _`code style`: https://github.com/psf/black +.. |code style| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json +.. _`code style`: https://github.com/astral-sh/ruff .. |PyPI pyversions| image:: https://img.shields.io/pypi/pyversions/bo4e.svg .. _`PyPI pyversions`: https://pypi.python.org/pypi/bo4e/ @@ -92,10 +92,10 @@ Die Entwicklungs-Abhängigkeiten sind in ``pyproject.toml`` unter ``[dependency- # Einzelne Prüfung ausführen uv run --group tests pytest - uv run --group linting pylint src/bo4e + uv run --group linting ruff check src/bo4e cd docs && uv run --group docs make html -Die verfügbaren Gruppen sind: ``tests``, ``coverage``, ``type_check``, ``linting``, ``formatting``, ``json_schemas``, ``docs`` und ``dev`` (Sammel-Gruppe, enthält alle anderen plus ``pre-commit``). +Die verfügbaren Gruppen sind: ``tests``, ``coverage``, ``type_check``, ``linting``, ``json_schemas``, ``docs`` und ``dev`` (Sammel-Gruppe, enthält alle anderen plus ``pre-commit``). Nutzung als Python Library ========================== diff --git a/docs/contributing_guide.rst b/docs/contributing_guide.rst index 7781d2a6f..09d0e6539 100644 --- a/docs/contributing_guide.rst +++ b/docs/contributing_guide.rst @@ -23,14 +23,14 @@ Dev dependencies live in ``pyproject.toml`` under ``[dependency-groups]`` (PEP 7 uv sync --group dev uv run pre-commit install - The ``dev`` group is a meta-group that pulls in every other group (``tests``, ``coverage``, ``type_check``, ``linting``, ``formatting``, ``docs``, ``json_schemas``) plus ``pre-commit``. + The ``dev`` group is a meta-group that pulls in every other group (``tests``, ``coverage``, ``type_check``, ``linting``, ``docs``, ``json_schemas``) plus ``pre-commit``. 3. Run individual checks with ``uv run --group ``, the same way CI does: .. code-block:: shell uv run --group tests pytest - uv run --group linting pylint src/bo4e + uv run --group linting ruff check src/bo4e uv run --group type_check mypy --show-error-codes src/bo4e cd docs && uv run --group docs make html @@ -46,8 +46,7 @@ General Rules ^^^^^^^^^^^^^ - We use (and enforce in the CI): - - black for formatting - - pylint for linting + - ruff for formatting and linting - mypy for static type checking - pytest for unittests - Sphinx and Plantuml (and kroki web service) for documentation @@ -66,8 +65,6 @@ All Enums inherit from ``bo4e.enum.StrEnum``. The latter is just a usual Enum wi .. code-block:: python - # pylint:disable=missing-module-docstring - from bo4e.enum.strenum import StrEnum class MyBo4eEnum(StrEnum): @@ -106,7 +103,6 @@ For data validation and de/serialization we use `pydantic dict[str, Any]: else: raise ValueError(f"Class {cls} is neither a pydantic BaseModel nor an enum.") if {"allOf", "$defs"} == set(schema_json_dict.keys()): - assert ( - len(schema_json_dict["allOf"]) == 1 - ), "Internal error: Assumed circular reference but structure is unexpected" + assert len(schema_json_dict["allOf"]) == 1, ( + "Internal error: Assumed circular reference but structure is unexpected" + ) # This is the case for schemas containing circular references reference_pattern = re.compile(r"^#/\$defs/(?P\w+)$") reference_match = reference_pattern.fullmatch(schema_json_dict["allOf"][0]["$ref"]) - assert ( - reference_match is not None - ), f"Internal Error: Reference string has unexpected format: {schema_json_dict['allOf'][0]['$ref']}" + assert reference_match is not None, ( + f"Internal Error: Reference string has unexpected format: {schema_json_dict['allOf'][0]['$ref']}" + ) schema_json_dict_to_merge = schema_json_dict["$defs"][reference_match.group("cls_name")] del schema_json_dict["allOf"] schema_json_dict.update(schema_json_dict_to_merge) @@ -176,9 +177,9 @@ def get_schema_json_dict(cls: Any) -> dict[str, Any]: # field points to the actual schema definition in the $defs field. reference_pattern = re.compile(r"^#/\$defs/(?P\w+)$") reference_match = reference_pattern.fullmatch(schema_json_dict["$ref"]) - assert ( - reference_match is not None - ), f"Internal Error: Reference string has unexpected format: {schema_json_dict['$ref']}" + assert reference_match is not None, ( + f"Internal Error: Reference string has unexpected format: {schema_json_dict['$ref']}" + ) schema_json_dict_to_merge = schema_json_dict["$defs"][reference_match.group("cls_name")] del schema_json_dict["$ref"] schema_json_dict.update(schema_json_dict_to_merge) @@ -191,7 +192,7 @@ def validate_schema(file_path: Path, schema_json_dict: dict[str, Any], name: str """ Validate the schema for a class """ - with open(file_path, "r", encoding="utf-8") as json_schema_file: + with open(file_path, encoding="utf-8") as json_schema_file: existing_schema = json.load(json_schema_file) if schema_json_dict != existing_schema: diff --git a/pyproject.toml b/pyproject.toml index d5cf32d8a..e93b45f74 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -56,16 +56,7 @@ type_check = [ {include-group = "json_schemas"}, ] linting = [ - # Pylint 4 dropped `suggestion-mode` from .pylintrc and tightened - # naming-style enforcement (rejects PARSABLE_CLASS_TYPE). The cap keeps - # the old behavior; bumping it is a separate migration. - "pylint", - {include-group = "docs"}, - {include-group = "json_schemas"}, -] -formatting = [ - "black", - "isort>=9.0.0b1", + "ruff", ] json_schemas = [ "click", @@ -85,13 +76,11 @@ dev = [ {include-group = "coverage"}, {include-group = "type_check"}, {include-group = "linting"}, - {include-group = "formatting"}, {include-group = "docs"}, "pre-commit", ] [tool.uv] -override-dependencies = ["isort>=9.0.0b1"] # Without this, a bare `uv sync`/`uv run` auto-installs the group literally # named `dev`, so CI's per-group jobs (linting, type_check, ...) would # silently also pull in everything else. @@ -131,9 +120,27 @@ exclude = ["/unittests"] only-include = ["src"] sources = ["src"] -[tool.black] +[tool.ruff] line-length = 120 -target_version = ["py38", "py39", "py310", "py311", "py312"] +target-version = "py310" +extend-exclude = ["*.md"] + +[tool.ruff.lint] +select = ["E", "W", "F", "I", "UP", "B", "N", "PL", "RUF"] +ignore = [ + "E501", # line-too-long: .pylintrc disabled this outright (long German docstrings) + "PLR0913", # too-many-arguments + "PLR0917", # too-many-positional-arguments + "PLR0912", # too-many-branches + "PLR0915", # too-many-statements + "PLR2004", # magic-value-comparison + "RUF001", # ambiguous-unicode-character-string (German docstrings/text) + "RUF002", # ambiguous-unicode-character-docstring + "RUF003", # ambiguous-unicode-character-comment +] + +[tool.ruff.lint.pep8-naming] +ignore-names = ["i", "j", "k", "ex", "Run", "_"] [tool.setuptools_scm] @@ -141,14 +148,6 @@ target_version = ["py38", "py39", "py310", "py311", "py312"] testpaths = "tests" markers = ["datafiles: load datafiles"] -[tool.pylint.'MESSAGES CONTROL'] -max-line-length = 120 - -[tool.isort] -line_length = 120 -profile = "black" -sort_reexports = true - [tool.mypy] plugins = ["pydantic.mypy"] follow_imports = "silent" diff --git a/src/bo4e/__init__.py b/src/bo4e/__init__.py index 5f86691fb..cfd217cc1 100644 --- a/src/bo4e/__init__.py +++ b/src/bo4e/__init__.py @@ -9,6 +9,7 @@ """ __all__ = [ + "COM", "AbgabeArt", "Abwicklungsmodell", "Adresse", @@ -36,7 +37,6 @@ "Bilanzierungsmethode", "BoTyp", "Buendelvertrag", - "COM", "ComTyp", "Dienstleistung", "Dienstleistungstyp", diff --git a/src/bo4e/bo/angebot.py b/src/bo4e/bo/angebot.py index f0c4cc142..b95bb7a6e 100644 --- a/src/bo4e/bo/angebot.py +++ b/src/bo4e/bo/angebot.py @@ -39,9 +39,9 @@ class Angebot(Geschaeftsobjekt): """ typ: Annotated[Literal[BoTyp.ANGEBOT], Field(alias="_typ")] = BoTyp.ANGEBOT - angebotsnummer: Optional[str] = None + angebotsnummer: str | None = None """Eindeutige Nummer des Angebotes""" - angebotsdatum: Optional[pydantic.AwareDatetime] = None + angebotsdatum: pydantic.AwareDatetime | None = None """Erstellungsdatum des Angebots""" sparte: Optional["Sparte"] = None """Sparte, für die das Angebot abgegeben wird (Strom/Gas)""" @@ -50,18 +50,18 @@ class Angebot(Geschaeftsobjekt): angebotsnehmer: Optional["Geschaeftspartner"] = None """Empfänger des Angebots""" - varianten: Optional[list["Angebotsvariante"]] = None + varianten: list["Angebotsvariante"] | None = None """ Eine oder mehrere Varianten des Angebots mit den Angebotsteilen; Ein Angebot besteht mindestens aus einer Variante. """ - anfragereferenz: Optional[str] = None + anfragereferenz: str | None = None """ Referenz auf eine Anfrage oder Ausschreibung; Kann dem Empfänger des Angebotes bei Zuordnung des Angebotes zur Anfrage bzw. Ausschreibung helfen. """ - bindefrist: Optional[pydantic.AwareDatetime] = None + bindefrist: pydantic.AwareDatetime | None = None """Bis zu diesem Zeitpunkt (Tag/Uhrzeit) inklusive gilt das Angebot""" unterzeichner_angebotsnehmer: Optional["Person"] = None """Person, die als Angebotsnehmer das Angebot angenommen hat""" diff --git a/src/bo4e/bo/ausschreibung.py b/src/bo4e/bo/ausschreibung.py index 38eedaa83..841b473af 100644 --- a/src/bo4e/bo/ausschreibung.py +++ b/src/bo4e/bo/ausschreibung.py @@ -37,15 +37,15 @@ class Ausschreibung(Geschaeftsobjekt): """ typ: Annotated[Literal[BoTyp.AUSSCHREIBUNG], Field(alias="_typ")] = BoTyp.AUSSCHREIBUNG - ausschreibungsnummer: Optional[str] = None + ausschreibungsnummer: str | None = None """Vom Herausgeber der Ausschreibung vergebene eindeutige Nummer""" ausschreibungstyp: Optional["Ausschreibungstyp"] = None """Aufzählung für die Typisierung von Ausschreibungen""" ausschreibungsstatus: Optional["Ausschreibungsstatus"] = None """Bezeichnungen für die Ausschreibungsphasen""" - ist_kostenpflichtig: Optional[bool] = None + ist_kostenpflichtig: bool | None = None """Kennzeichen, ob die Ausschreibung kostenpflichtig ist""" - veroeffentlichungszeitpunkt: Optional[pydantic.AwareDatetime] = None + veroeffentlichungszeitpunkt: pydantic.AwareDatetime | None = None """Gibt den Veröffentlichungszeitpunkt der Ausschreibung an""" ausschreibender: Optional["Geschaeftspartner"] = None """ @@ -62,10 +62,10 @@ class Ausschreibung(Geschaeftsobjekt): Diese Komponente wird zur Abbildung von Zeiträumen in Form von Dauern oder der Angabe von Start und Ende verwendet. Es muss daher entweder eine Dauer oder ein Zeitraum in Form von Start und Ende angegeben sein """ - lose: Optional[list["Ausschreibungslos"]] = None + lose: list["Ausschreibungslos"] | None = None """Die einzelnen Lose, aus denen sich die Ausschreibung zusammensetzt""" ausschreibungportal: Optional["Ausschreibungsportal"] = None """Aufzählung der unterstützten Ausschreibungsportale""" - webseite: Optional[str] = None + webseite: str | None = None """Internetseite, auf der die Ausschreibung veröffentlicht wurde (falls vorhanden)""" diff --git a/src/bo4e/bo/bilanzierung.py b/src/bo4e/bo/bilanzierung.py index 0fae18da9..4b2385f91 100644 --- a/src/bo4e/bo/bilanzierung.py +++ b/src/bo4e/bo/bilanzierung.py @@ -4,7 +4,7 @@ from datetime import datetime from decimal import Decimal -from typing import Annotated, Optional +from typing import Annotated from pydantic import Field @@ -35,17 +35,17 @@ class Bilanzierung(Geschaeftsobjekt): """ - typ: Annotated[Optional[BoTyp], Field(alias="_typ")] = BoTyp.BILANZIERUNG + typ: Annotated[BoTyp | None, Field(alias="_typ")] = BoTyp.BILANZIERUNG - marktlokations_id: Optional[str] = None #: ID der Marktlokation - lastprofil: Optional[list[Lastprofil]] = None #: Eine Liste der verwendeten Lastprofile (SLP, SLP/TLP, ALP etc.) - bilanzierungsbeginn: Optional[datetime] = None #: Inklusiver Start der Bilanzierung - bilanzierungsende: Optional[datetime] = None #: Exklusives Ende der Bilanzierung - bilanzkreis: Optional[str] = None #: Bilanzkreis - jahresverbrauchsprognose: Optional[Menge] = None #: Jahresverbrauchsprognose - temperatur_arbeit: Optional[Menge] = None #: Temperatur Arbeit - kundenwert: Optional[Menge] = None #: Kundenwert - verbrauchsaufteilung: Optional[Decimal] = None + marktlokations_id: str | None = None #: ID der Marktlokation + lastprofil: list[Lastprofil] | None = None #: Eine Liste der verwendeten Lastprofile (SLP, SLP/TLP, ALP etc.) + bilanzierungsbeginn: datetime | None = None #: Inklusiver Start der Bilanzierung + bilanzierungsende: datetime | None = None #: Exklusives Ende der Bilanzierung + bilanzkreis: str | None = None #: Bilanzkreis + jahresverbrauchsprognose: Menge | None = None #: Jahresverbrauchsprognose + temperatur_arbeit: Menge | None = None #: Temperatur Arbeit + kundenwert: Menge | None = None #: Kundenwert + verbrauchsaufteilung: Decimal | None = None """ Verbrauchsaufteilung in % zwischen SLP und TLP-Profil. @@ -56,26 +56,26 @@ class Bilanzierung(Geschaeftsobjekt): 3. [Gemessene Energiemenge der OBIS "nicht Schwachlast"] + [zu verlagernde Energiemenge] = [Ermittelte Energiemenge für nicht Schwachlast] """ - zeitreihentyp: Optional[Zeitreihentyp] = None #: Zeitreihentyp (SLS, TLS, etc.) - aggregationsverantwortung: Optional[Aggregationsverantwortung] = None #: Aggregationsverantwortung - prognosegrundlage: Optional[Prognosegrundlage] = None #: Prognosegrundlage - details_prognosegrundlage: Optional[list[Profiltyp]] = None + zeitreihentyp: Zeitreihentyp | None = None #: Zeitreihentyp (SLS, TLS, etc.) + aggregationsverantwortung: Aggregationsverantwortung | None = None #: Aggregationsverantwortung + prognosegrundlage: Prognosegrundlage | None = None #: Prognosegrundlage + details_prognosegrundlage: list[Profiltyp] | None = None """ Prognosegrundlage. Besteht der Bedarf ein tagesparameteräbhängiges Lastprofil mit gemeinsamer Messung anzugeben, so ist dies über die 2 -malige Wiederholung des CAV Segments mit der Angabe der Codes E02 und E14 möglich. """ - wahlrecht_prognosegrundlage: Optional[WahlrechtPrognosegrundlage] = None + wahlrecht_prognosegrundlage: WahlrechtPrognosegrundlage | None = None """ Wahlrecht der Prognosegrundlage. """ - fallgruppenzuordnung: Optional[Fallgruppenzuordnung] = None #: Fallgruppenzuordnung (für gas RLM) - prioritaet: Optional[int] = None #: Priorität des Bilanzkreises (für Gas) - grund_wahlrecht_prognosegrundlage: Optional[WahlrechtPrognosegrundlage] = None + fallgruppenzuordnung: Fallgruppenzuordnung | None = None #: Fallgruppenzuordnung (für gas RLM) + prioritaet: int | None = None #: Priorität des Bilanzkreises (für Gas) + grund_wahlrecht_prognosegrundlage: WahlrechtPrognosegrundlage | None = None """ Grund Wahlrecht der Prognosegrundlage. true=Wahlrecht beim Lieferanten vorhanden """ - abwicklungsmodell: Optional[Abwicklungsmodell] = None #: Abwicklungsmodell + abwicklungsmodell: Abwicklungsmodell | None = None #: Abwicklungsmodell diff --git a/src/bo4e/bo/buendelvertrag.py b/src/bo4e/bo/buendelvertrag.py index 87334c4be..4aed833f4 100644 --- a/src/bo4e/bo/buendelvertrag.py +++ b/src/bo4e/bo/buendelvertrag.py @@ -41,7 +41,7 @@ class Buendelvertrag(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.BUENDELVERTRAG], Field(alias="_typ")] = BoTyp.BUENDELVERTRAG # pylint: disable=duplicate-code - vertragsnummer: Optional[str] = None + vertragsnummer: str | None = None """Eine im Verwendungskontext eindeutige Nummer für den Vertrag""" vertragsart: Optional["Vertragsart"] = None """Hier ist festgelegt, um welche Art von Vertrag es sich handelt. Z.B. Netznutzungvertrag""" @@ -49,9 +49,9 @@ class Buendelvertrag(Geschaeftsobjekt): """Gibt den Status des Vertrages an""" sparte: Optional["Sparte"] = None """Unterscheidungsmöglichkeiten für die Sparte""" - vertragsbeginn: Optional[pydantic.AwareDatetime] = None + vertragsbeginn: pydantic.AwareDatetime | None = None """Gibt an, wann der Vertrag beginnt (inklusiv)""" - vertragsende: Optional[pydantic.AwareDatetime] = None + vertragsende: pydantic.AwareDatetime | None = None """Gibt an, wann der Vertrag (voraussichtlich) endet oder beendet wurde (exklusiv)""" vertragspartner1: Optional["Geschaeftspartner"] = None """ @@ -64,13 +64,13 @@ class Buendelvertrag(Geschaeftsobjekt): Beispiel "Vertrag zwischen Vertagspartner 1 und Vertragspartner 2" """ - einzelvertraege: Optional[list["Vertrag"]] = None + einzelvertraege: list["Vertrag"] | None = None """Die Liste mit den Einzelverträgen zu den Abnahmestellen""" - vertragskonditionen: Optional[list["Vertragskonditionen"]] = None + vertragskonditionen: list["Vertragskonditionen"] | None = None """Festlegungen zu Laufzeiten und Kündigungsfristen""" - unterzeichnervp1: Optional[list["Unterschrift"]] = None + unterzeichnervp1: list["Unterschrift"] | None = None """Unterzeichner des Vertragspartners1""" - unterzeichnervp2: Optional[list["Unterschrift"]] = None + unterzeichnervp2: list["Unterschrift"] | None = None """Unterzeichner des Vertragspartners2""" - beschreibung: Optional[str] = None + beschreibung: str | None = None """Beschreibung zum Vertrag""" diff --git a/src/bo4e/bo/energiemenge.py b/src/bo4e/bo/energiemenge.py index a1bbf9d77..0503850cc 100644 --- a/src/bo4e/bo/energiemenge.py +++ b/src/bo4e/bo/energiemenge.py @@ -34,9 +34,9 @@ class Energiemenge(Geschaeftsobjekt): """ typ: Annotated[Literal[BoTyp.ENERGIEMENGE], Field(alias="_typ")] = BoTyp.ENERGIEMENGE - obis_kennzahl: Optional[str] = None + obis_kennzahl: str | None = None """Die OBIS-Kennzahl der Energiemenge""" - beschreibung: Optional[str] = None + beschreibung: str | None = None """Ergänzende Beschreibung zur Energiemenge""" zeitraum: Optional["Zeitraum"] = None """Zeitraum, in dem die Energiemenge angefallen ist/gemessen wurde""" diff --git a/src/bo4e/bo/fremdkosten.py b/src/bo4e/bo/fremdkosten.py index 0e280e851..e14ff45c2 100644 --- a/src/bo4e/bo/fremdkosten.py +++ b/src/bo4e/bo/fremdkosten.py @@ -40,5 +40,5 @@ class Fremdkosten(Geschaeftsobjekt): """Für diesen Zeitraum wurden die Kosten ermittelt""" summe_kosten: Optional["Betrag"] = None """Die Gesamtsumme über alle Kostenblöcke und -positionen""" - kostenbloecke: Optional[list["Fremdkostenblock"]] = None + kostenbloecke: list["Fremdkostenblock"] | None = None """In Kostenblöcken werden Kostenpositionen zusammengefasst. Beispiele: Netzkosten, Umlagen, Steuern etc""" diff --git a/src/bo4e/bo/geraet.py b/src/bo4e/bo/geraet.py index b27ef0868..9c84439a2 100644 --- a/src/bo4e/bo/geraet.py +++ b/src/bo4e/bo/geraet.py @@ -34,9 +34,9 @@ class Geraet(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.GERAET], Field(alias="_typ")] = BoTyp.GERAET - geraetenummer: Optional[str] = None + geraetenummer: str | None = None """Die auf dem Gerät aufgedruckte Nummer, die vom MSB vergeben wird.""" - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Bezeichnung des Geräts""" geraeteklasse: Optional["Geraeteklasse"] = None """Die übergreifende Klasse eines Geräts, beispielsweise Wandler""" diff --git a/src/bo4e/bo/geschaeftsobjekt.py b/src/bo4e/bo/geschaeftsobjekt.py index 1b5ea648c..dc3cb6089 100644 --- a/src/bo4e/bo/geschaeftsobjekt.py +++ b/src/bo4e/bo/geschaeftsobjekt.py @@ -1,6 +1,6 @@ # pylint: disable=missing-module-docstring from decimal import Decimal -from typing import Annotated, Optional +from typing import Annotated from humps.main import camelize @@ -31,17 +31,17 @@ class Geschaeftsobjekt(BaseModel): # pragma: no cover """ # required attributes - version: Annotated[Optional[str], Field(alias="_version")] = __version__ + version: Annotated[str | None, Field(alias="_version")] = __version__ """ Version der BO-Struktur aka "fachliche Versionierung" """ - zusatz_attribute: Optional[list["ZusatzAttribut"]] = None + zusatz_attribute: list["ZusatzAttribut"] | None = None # zusatz_attribute is a list of ZusatzAttribut objects which are used to store additional information # Python internal: The field is not named '_id' because leading underscores are not allowed in pydantic field names. # NameError: Fields must not use names with leading underscores; e.g., use 'id' instead of '_id'. - id: Annotated[Optional[str], Field(alias="_id")] = None + id: Annotated[str | None, Field(alias="_id")] = None """ Eine generische ID, die für eigene Zwecke genutzt werden kann. Z.B. könnten hier UUIDs aus einer Datenbank stehen oder URLs zu einem Backend-System. diff --git a/src/bo4e/bo/geschaeftspartner.py b/src/bo4e/bo/geschaeftspartner.py index 0b705f3c1..da720e4be 100644 --- a/src/bo4e/bo/geschaeftspartner.py +++ b/src/bo4e/bo/geschaeftspartner.py @@ -41,44 +41,44 @@ class Geschaeftspartner(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.GESCHAEFTSPARTNER], Field(alias="_typ")] = BoTyp.GESCHAEFTSPARTNER anrede: Optional["Anrede"] = None """Mögliche Anrede der Person""" - individuelle_anrede: Optional[str] = None + individuelle_anrede: str | None = None """ Im Falle einer nicht standardisierten Anrede kann hier eine frei definierbare Anrede vorgegeben werden. Beispiel: "Vereinsgemeinschaft", "Pfarrer", "Hochwürdigster Herr Abt". """ titel: Optional["Titel"] = None """Möglicher Titel der Person""" - vorname: Optional[str] = None + vorname: str | None = None """Vorname der Person""" - nachname: Optional[str] = None + nachname: str | None = None """Nachname (Familienname) der Person""" - ansprechpartner: Optional[list["Person"]] = None + ansprechpartner: list["Person"] | None = None organisationstyp: Optional["Organisationstyp"] = None """ Kennzeichnung ob es sich um ein Gewerbe/Unternehmen, eine Privatperson oder eine andere Art von Organisation handelt. """ - organisationsname: Optional[str] = None + organisationsname: str | None = None """ Name der Firma, wenn Gewerbe oder andere Organisation. """ - kontaktwege: Optional[list["Kontaktweg"]] = None + kontaktwege: list["Kontaktweg"] | None = None """Kontaktwege des Geschäftspartners""" - geschaeftspartnerrollen: Optional[list["Geschaeftspartnerrolle"]] = None + geschaeftspartnerrollen: list["Geschaeftspartnerrolle"] | None = None """Rollen, die die Geschäftspartner inne haben (z.B. Interessent, Kunde)""" - handelsregisternummer: Optional[str] = None + handelsregisternummer: str | None = None """Handelsregisternummer des Geschäftspartners""" - amtsgericht: Optional[str] = None + amtsgericht: str | None = None """Amtsgericht bzw Handelsregistergericht, das die Handelsregisternummer herausgegeben hat""" - umsatzsteuer_id: Optional[str] = None + umsatzsteuer_id: str | None = None """ Die Steuer-ID des Geschäftspartners; Beispiel: "DE 813281825" """ - glaeubiger_id: Optional[str] = None + glaeubiger_id: str | None = None """ Die Gläubiger-ID welche im Zahlungsverkehr verwendet wird; Z.B. "DE 47116789" """ - website: Optional[str] = None + website: str | None = None """Internetseite des Marktpartners""" adresse: Optional["Adresse"] = None """Adresse des Geschäftspartners""" diff --git a/src/bo4e/bo/kosten.py b/src/bo4e/bo/kosten.py index 86ac2afff..aaf82f7c8 100644 --- a/src/bo4e/bo/kosten.py +++ b/src/bo4e/bo/kosten.py @@ -41,8 +41,8 @@ class Kosten(Geschaeftsobjekt): """Klasse der Kosten, beispielsweise Fremdkosten""" gueltigkeit: Optional["Zeitraum"] = None """Für diesen Zeitraum wurden die Kosten ermittelt""" - kostenbloecke: Optional[list["Kostenblock"]] = None + kostenbloecke: list["Kostenblock"] | None = None """In Kostenblöcken werden Kostenpositionen zusammengefasst. Beispiele: Netzkosten, Umlagen, Steuern etc""" - summe_kosten: Optional[list["Betrag"]] = None + summe_kosten: list["Betrag"] | None = None """Die Gesamtsumme über alle Kostenblöcke und -positionen""" diff --git a/src/bo4e/bo/lastgang.py b/src/bo4e/bo/lastgang.py index 2bb408e1f..5e31a8b68 100644 --- a/src/bo4e/bo/lastgang.py +++ b/src/bo4e/bo/lastgang.py @@ -48,10 +48,10 @@ class Lastgang(Geschaeftsobjekt): marktlokation: Optional["Marktlokation"] = None #:Marktlokation, zu der der Lastgang gehört messlokation: Optional["Messlokation"] = None - werte: Optional[list["Zeitreihenwert"]] = None + werte: list["Zeitreihenwert"] | None = None """Die im Lastgang enthaltenen Messwerte""" - version: Optional[str] = None + version: str | None = None """Versionsnummer des Lastgangs""" - obis_kennzahl: Optional[str] = None + obis_kennzahl: str | None = None """Die OBIS-Kennzahl für den Wert, die festlegt, welche Größe mit dem Stand gemeldet wird, z.B. '1-0:1.8.1'""" zeit_intervall_laenge: Optional["Menge"] diff --git a/src/bo4e/bo/lokationszuordnung.py b/src/bo4e/bo/lokationszuordnung.py index 963a470a8..4823d4604 100644 --- a/src/bo4e/bo/lokationszuordnung.py +++ b/src/bo4e/bo/lokationszuordnung.py @@ -35,19 +35,19 @@ class Lokationszuordnung(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.LOKATIONSZUORDNUNG], Field(alias="_typ")] = BoTyp.LOKATIONSZUORDNUNG - marktlokationen: Optional[list["Marktlokation"]] = None + marktlokationen: list["Marktlokation"] | None = None """Liste mit referenzierten Marktlokationen""" - messlokationen: Optional[list["Messlokation"]] = None + messlokationen: list["Messlokation"] | None = None """Liste mit referenzierten Messlokationen""" - netzlokationen: Optional[list["Netzlokation"]] = None + netzlokationen: list["Netzlokation"] | None = None """Liste mit referenzierten Netzlokationen""" - technische_ressourcen: Optional[list["TechnischeRessource"]] = None + technische_ressourcen: list["TechnischeRessource"] | None = None """Liste mit referenzierten technischen Ressourcen""" - steuerbare_ressourcen: Optional[list["SteuerbareRessource"]] = None + steuerbare_ressourcen: list["SteuerbareRessource"] | None = None """Liste mit referenzierten steuerbaren Ressourcen""" gueltigkeit: Optional["Zeitraum"] = None """Zeitraum der Gültigkeit""" - zuordnungstyp: Optional[str] = None + zuordnungstyp: str | None = None """Verknüpfungsrichtung z.B. Malo-Melo [TODO: Eventuell anderer Datentyp]""" - lokationsbuendelcode: Optional[str] = None + lokationsbuendelcode: str | None = None """Code, der angibt wie die Lokationsbündelstruktur zusammengesetzt ist (zu finden unter "Codeliste der Lokationsbündelstrukturen" auf https://www.edi-energy.de/index.php?id=38)""" diff --git a/src/bo4e/bo/marktlokation.py b/src/bo4e/bo/marktlokation.py index 3339d2289..2b8a755ff 100644 --- a/src/bo4e/bo/marktlokation.py +++ b/src/bo4e/bo/marktlokation.py @@ -48,7 +48,7 @@ class Marktlokation(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.MARKTLOKATION], Field(alias="_typ")] = BoTyp.MARKTLOKATION - marktlokations_id: Optional[str] = None + marktlokations_id: str | None = None """Identifikationsnummer einer Marktlokation, an der Energie entweder verbraucht, oder erzeugt wird.""" sparte: Optional["Sparte"] = None """Sparte der Marktlokation, z.B. Gas oder Strom""" @@ -69,11 +69,11 @@ class Marktlokation(Geschaeftsobjekt): """Der Netzbetreiber, an dessen Netz diese Marktlokation angeschlossen ist.""" gebietstyp: Optional["Gebiettyp"] = None """Typ des Netzgebietes, z.B. Verteilnetz""" - netzgebietsnr: Optional[str] = None + netzgebietsnr: str | None = None """Die ID des Gebietes in der ene't-Datenbank""" # todo: rename to "id" (see 2021-12-15 update) - bilanzierungsgebiet: Optional[str] = None + bilanzierungsgebiet: str | None = None """Bilanzierungsgebiet, dem das Netzgebiet zugeordnet ist - im Falle eines Strom Netzes""" - grundversorgercodenr: Optional[str] = None + grundversorgercodenr: str | None = None """Codenummer des Grundversorgers, der für diese Marktlokation zuständig ist""" gasqualitaet: Optional["Gasqualitaet"] = None """Die Gasqualität in diesem Netzgebiet. H-Gas oder L-Gas. Im Falle eines Gas-Netzes""" @@ -94,18 +94,18 @@ class Marktlokation(Geschaeftsobjekt): Flurstück erfolgen. """ - kundengruppen: Optional[list["Kundentyp"]] = None + kundengruppen: list["Kundentyp"] | None = None """Kundengruppen der Marktlokation""" - regelzone: Optional[str] = None + regelzone: str | None = None """für Strom. Code vom EIC, https://www.entsoe.eu/data/energy-identification-codes-eic/eic-approved-codes/""" - marktgebiet: Optional[str] = None + marktgebiet: str | None = None """für Gas. Code vom EIC, https://www.entsog.eu/data/data-portal/codes-list""" - zaehlwerke: Optional[list["Zaehlwerk"]] = None - verbrauchsmengen: Optional[list["Energiemenge"]] = None - zaehlwerke_der_beteiligten_marktrolle: Optional[list["Zaehlwerk"]] = None + zaehlwerke: list["Zaehlwerk"] | None = None + verbrauchsmengen: list["Energiemenge"] | None = None + zaehlwerke_der_beteiligten_marktrolle: list["Zaehlwerk"] | None = None - lokationszuordnungen: Optional[list["Lokationszuordnung"]] = None + lokationszuordnungen: list["Lokationszuordnung"] | None = None """Lokationszuordnung, um bspw. die zugehörigen Messlokationen anzugeben""" - lokationsbuendel_objektcode: Optional[str] = None + lokationsbuendel_objektcode: str | None = None """Lokationsbuendel Code, der die Funktion dieses BOs an der Lokationsbuendelstruktur beschreibt.""" diff --git a/src/bo4e/bo/marktteilnehmer.py b/src/bo4e/bo/marktteilnehmer.py index a62570cb0..fc397013b 100644 --- a/src/bo4e/bo/marktteilnehmer.py +++ b/src/bo4e/bo/marktteilnehmer.py @@ -36,13 +36,13 @@ class Marktteilnehmer(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.MARKTTEILNEHMER], Field(alias="_typ")] = BoTyp.MARKTTEILNEHMER marktrolle: Optional["Marktrolle"] = None """Gibt im Klartext die Bezeichnung der Marktrolle an""" - rollencodenummer: Optional[str] = None + rollencodenummer: str | None = None """Gibt die Codenummer der Marktrolle an""" rollencodetyp: Optional["Rollencodetyp"] = None """Gibt den Typ des Codes an""" sparte: Optional["Sparte"] = None """Sparte des Marktteilnehmers, z.B. Gas oder Strom""" - makoadresse: Optional[list[str]] = None + makoadresse: list[str] | None = None """Die 1:1-Kommunikationsadresse des Marktteilnehmers. Diese wird in der Marktkommunikation verwendet. Konkret kann dies eine eMail-Adresse oder ein AS4-Endpunkt sein.""" geschaeftspartner: Optional["Geschaeftspartner"] = None """Der zu diesem Marktteilnehmer gehörende Geschäftspartner""" diff --git a/src/bo4e/bo/messlokation.py b/src/bo4e/bo/messlokation.py index 6fb4d4f74..ee5e377d2 100644 --- a/src/bo4e/bo/messlokation.py +++ b/src/bo4e/bo/messlokation.py @@ -40,29 +40,29 @@ class Messlokation(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.MESSLOKATION], Field(alias="_typ")] = BoTyp.MESSLOKATION - messlokations_id: Optional[str] = None + messlokations_id: str | None = None """Die Messlokations-Identifikation; Das ist die frühere Zählpunktbezeichnung""" sparte: Optional["Sparte"] = None """Sparte der Messlokation, z.B. Gas oder Strom""" netzebene_messung: Optional["Netzebene"] = None """Spannungsebene der Messung""" - messgebietnr: Optional[str] = None + messgebietnr: str | None = None """Die Nummer des Messgebietes in der ene't-Datenbank""" - geraete: Optional[list["Geraet"]] = None + geraete: list["Geraet"] | None = None """Liste der Geräte, die zu dieser Messstelle gehört""" - messdienstleistung: Optional[list["Dienstleistung"]] = None + messdienstleistung: list["Dienstleistung"] | None = None """Liste der Messdienstleistungen, die zu dieser Messstelle gehört""" # todo: rename to plural - messlokationszaehler: Optional[list["Zaehler"]] = None + messlokationszaehler: list["Zaehler"] | None = None """Zähler, die zu dieser Messlokation gehören""" # only one of the following two optional codenr attributes can be set - grundzustaendiger_msb_codenr: Optional[str] = None + grundzustaendiger_msb_codenr: str | None = None """ Codenummer des grundzuständigen Messstellenbetreibers, der für diese Messlokation zuständig ist. (Dieser ist immer dann Messstellenbetreiber, wenn kein anderer MSB die Einrichtungen an der Messlokation betreibt.) """ - grundzustaendiger_msbim_codenr: Optional[str] = None + grundzustaendiger_msbim_codenr: str | None = None """ Codenummer des grundzuständigen Messstellenbetreibers für intelligente Messsysteme, der für diese Messlokation zuständig ist. @@ -84,7 +84,7 @@ class Messlokation(Geschaeftsobjekt): Alternativ zu einer postalischen Adresse und Geokoordinaten kann hier eine Ortsangabe mittels Gemarkung und Flurstück erfolgen. """ - lokationszuordnungen: Optional[list["Lokationszuordnung"]] = None + lokationszuordnungen: list["Lokationszuordnung"] | None = None """Lokationszuordnung, um bspw. die zugehörigen Marktlokationen anzugeben""" - lokationsbuendel_objektcode: Optional[str] = None + lokationsbuendel_objektcode: str | None = None """Lokationsbuendel Code, der die Funktion dieses BOs an der Lokationsbuendelstruktur beschreibt.""" diff --git a/src/bo4e/bo/netzlokation.py b/src/bo4e/bo/netzlokation.py index e4b7c7322..8ddfac2d1 100644 --- a/src/bo4e/bo/netzlokation.py +++ b/src/bo4e/bo/netzlokation.py @@ -38,25 +38,25 @@ class Netzlokation(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.NETZLOKATION], Field(alias="_typ")] = BoTyp.NETZLOKATION - netzlokations_id: Optional[str] = None + netzlokations_id: str | None = None """Identifikationsnummer einer Netzlokation, an der Energie entweder verbraucht, oder erzeugt wird""" sparte: Optional["Sparte"] = None """Sparte der Netzlokation, z.B. Gas oder Strom.""" netzanschlussleistung: Optional["Menge"] = None """Netzanschlussleistungsmenge der Netzlokation""" - grundzustaendiger_msb_codenr: Optional[str] = None + grundzustaendiger_msb_codenr: str | None = None """Codenummer des grundzuständigen Messstellenbetreibers, der für diese Netzlokation zuständig ist.""" - steuerkanal: Optional[bool] = None + steuerkanal: bool | None = None """Ob ein Steuerkanal der Netzlokation zugeordnet ist und somit die Netzlokation gesteuert werden kann.""" - obiskennzahl: Optional[str] = None + obiskennzahl: str | None = None """Die OBIS-Kennzahl für die Netzlokation""" verwendungszweck: Optional["VerwendungszweckProMarktrolle"] = None """Verwendungungszweck der Werte Netzlokation""" - konfigurationsprodukte: Optional[list["Konfigurationsprodukt"]] = None + konfigurationsprodukte: list["Konfigurationsprodukt"] | None = None """Produkt-Daten der Netzlokation""" eigenschaft_msb_lokation: Optional["Marktrolle"] = None """Eigenschaft des Messstellenbetreibers an der Lokation""" - lokationszuordnungen: Optional[list["Lokationszuordnung"]] = None + lokationszuordnungen: list["Lokationszuordnung"] | None = None """Lokationszuordnung, um bspw. die zugehörigen Messlokationen anzugeben""" - lokationsbuendel_objektcode: Optional[str] = None + lokationsbuendel_objektcode: str | None = None """Lokationsbuendel Code, der die Funktion dieses BOs an der Lokationsbuendelstruktur beschreibt.""" diff --git a/src/bo4e/bo/person.py b/src/bo4e/bo/person.py index 42178d583..22d1ea1e1 100644 --- a/src/bo4e/bo/person.py +++ b/src/bo4e/bo/person.py @@ -39,24 +39,24 @@ class Person(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.PERSON], Field(alias="_typ")] = BoTyp.PERSON anrede: Optional["Anrede"] = None """Mögliche Anrede der Person""" - individuelle_anrede: Optional[str] = None + individuelle_anrede: str | None = None """ Im Falle einer nicht standardisierten Anrede kann hier eine frei definierbare Anrede vorgegeben werden. Beispiel: "Vereinsgemeinschaft", "Pfarrer", "Hochwürdigster Herr Abt". """ titel: Optional["Titel"] = None """Möglicher Titel der Person""" - vorname: Optional[str] = None + vorname: str | None = None """Vorname der Person""" - nachname: Optional[str] = None + nachname: str | None = None """Nachname (Familienname) der Person""" - kontaktwege: Optional[list["Kontaktweg"]] = None + kontaktwege: list["Kontaktweg"] | None = None """Kontaktwege der Person""" - geburtsdatum: Optional[date] = None + geburtsdatum: date | None = None """Geburtsdatum der Person""" - kommentar: Optional[str] = None + kommentar: str | None = None """Weitere Informationen zur Person""" - zustaendigkeiten: Optional[list["Zustaendigkeit"]] = None + zustaendigkeiten: list["Zustaendigkeit"] | None = None """Liste der Abteilungen und Zuständigkeiten der Person""" adresse: Optional["Adresse"] = None """Adresse der Person, falls diese von der Adresse des Geschäftspartners abweicht""" diff --git a/src/bo4e/bo/preisblatt.py b/src/bo4e/bo/preisblatt.py index 6a8df3178..21dfc82e8 100644 --- a/src/bo4e/bo/preisblatt.py +++ b/src/bo4e/bo/preisblatt.py @@ -40,7 +40,7 @@ class Preisblatt(Geschaeftsobjekt): """ typ: Annotated[Literal[BoTyp.PREISBLATT], Field(alias="_typ")] = BoTyp.PREISBLATT - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Eine Bezeichnung für das Preisblatt""" sparte: Optional["Sparte"] = None """Preisblatt gilt für angegebene Sparte""" @@ -48,7 +48,7 @@ class Preisblatt(Geschaeftsobjekt): """Merkmal, das anzeigt, ob es sich um vorläufige oder endgültige Preise handelt""" gueltigkeit: Optional["Zeitraum"] = None """Der Zeitraum für den der Preis festgelegt ist""" - preispositionen: Optional[list["Preisposition"]] = None + preispositionen: list["Preisposition"] | None = None """Die einzelnen Positionen, die mit dem Preisblatt abgerechnet werden können. Z.B. Arbeitspreis, Grundpreis etc""" herausgeber: Optional["Marktteilnehmer"] = None """Der Netzbetreiber, der die Preise veröffentlicht hat""" diff --git a/src/bo4e/bo/preisblattdienstleistung.py b/src/bo4e/bo/preisblattdienstleistung.py index 29246233a..13f9098e2 100644 --- a/src/bo4e/bo/preisblattdienstleistung.py +++ b/src/bo4e/bo/preisblattdienstleistung.py @@ -33,9 +33,7 @@ class PreisblattDienstleistung(Preisblatt): """ - typ: Annotated[Literal[BoTyp.PREISBLATTDIENSTLEISTUNG], Field(alias="_typ")] = ( - BoTyp.PREISBLATTDIENSTLEISTUNG # type: ignore[assignment] - ) + typ: Annotated[Literal[BoTyp.PREISBLATTDIENSTLEISTUNG], Field(alias="_typ")] = BoTyp.PREISBLATTDIENSTLEISTUNG # type: ignore[assignment] # required attributes (additional to those of Preisblatt) bilanzierungsmethode: Optional["Bilanzierungsmethode"] = None """Die Preise gelten für Marktlokationen der angebebenen Bilanzierungsmethode""" @@ -45,5 +43,5 @@ class PreisblattDienstleistung(Preisblatt): geraetedetails: Optional["Geraet"] = None """Hier kann der Preis auf bestimmte Geräte eingegrenzt werden. Z.B. auf die Zählergröße""" - inklusive_dienstleistungen: Optional[list["Dienstleistungstyp"]] = None + inklusive_dienstleistungen: list["Dienstleistungstyp"] | None = None """Weitere Dienstleistungen, die im Preis enthalten sind""" diff --git a/src/bo4e/bo/preisblatthardware.py b/src/bo4e/bo/preisblatthardware.py index c3c9e0a66..7bd3c12c8 100644 --- a/src/bo4e/bo/preisblatthardware.py +++ b/src/bo4e/bo/preisblatthardware.py @@ -34,9 +34,7 @@ class PreisblattHardware(Preisblatt): """ - typ: Annotated[Literal[BoTyp.PREISBLATTHARDWARE], Field(alias="_typ")] = ( - BoTyp.PREISBLATTHARDWARE # type: ignore[assignment] - ) + typ: Annotated[Literal[BoTyp.PREISBLATTHARDWARE], Field(alias="_typ")] = BoTyp.PREISBLATTHARDWARE # type: ignore[assignment] # required attributes (additional to those of Preisblatt) bilanzierungsmethode: Optional["Bilanzierungsmethode"] = None """Die Preise gelten für Marktlokationen der angebebenen Bilanzierungsmethode""" @@ -46,8 +44,8 @@ class PreisblattHardware(Preisblatt): basisgeraet: Optional["Geraet"] = None """Der Preis betriftt das hier angegebene Gerät, z.B. ein Tarifschaltgerät""" - inklusive_dienstleistungen: Optional[list["Dienstleistungstyp"]] = None + inklusive_dienstleistungen: list["Dienstleistungstyp"] | None = None """Im Preis sind die hier angegebenen Dienstleistungen enthalten, z.B. Jährliche Ablesung""" - inklusive_geraete: Optional[list["Geraet"]] = None + inklusive_geraete: list["Geraet"] | None = None """Im Preis sind die hier angegebenen Geräte mit enthalten, z.B. ein Wandler""" diff --git a/src/bo4e/bo/preisblattkonzessionsabgabe.py b/src/bo4e/bo/preisblattkonzessionsabgabe.py index 964d39c2c..14abdb2bf 100644 --- a/src/bo4e/bo/preisblattkonzessionsabgabe.py +++ b/src/bo4e/bo/preisblattkonzessionsabgabe.py @@ -31,9 +31,7 @@ class PreisblattKonzessionsabgabe(Preisblatt): """ - typ: Annotated[Literal[BoTyp.PREISBLATTKONZESSIONSABGABE], Field(alias="_typ")] = ( - BoTyp.PREISBLATTKONZESSIONSABGABE # type: ignore[assignment] - ) + typ: Annotated[Literal[BoTyp.PREISBLATTKONZESSIONSABGABE], Field(alias="_typ")] = BoTyp.PREISBLATTKONZESSIONSABGABE # type: ignore[assignment] # required attributes (additional to those of Preisblatt) kundengruppe_k_a: Optional["KundengruppeKA"] = None """Kundegruppe anhand derer die Höhe der Konzessionabgabe festgelegt ist""" diff --git a/src/bo4e/bo/preisblattmessung.py b/src/bo4e/bo/preisblattmessung.py index d3b7846e5..6f189ed96 100644 --- a/src/bo4e/bo/preisblattmessung.py +++ b/src/bo4e/bo/preisblattmessung.py @@ -35,9 +35,7 @@ class PreisblattMessung(Preisblatt): """ - typ: Annotated[Literal[BoTyp.PREISBLATTMESSUNG], Field(alias="_typ")] = ( - BoTyp.PREISBLATTMESSUNG # type: ignore[assignment] - ) + typ: Annotated[Literal[BoTyp.PREISBLATTMESSUNG], Field(alias="_typ")] = BoTyp.PREISBLATTMESSUNG # type: ignore[assignment] # required attributes (additional to those of Preisblatt) bilanzierungsmethode: Optional["Bilanzierungsmethode"] = None """Die Preise gelten für Marktlokationen der angebebenen Bilanzierungsmethode""" @@ -47,8 +45,8 @@ class PreisblattMessung(Preisblatt): zaehler: Optional["Zaehler"] = None """Der Preis betrifft den hier angegebenen Zähler, z.B. einen Drehstromzähler""" - inklusive_dienstleistungen: Optional[list["Dienstleistungstyp"]] = None + inklusive_dienstleistungen: list["Dienstleistungstyp"] | None = None """Im Preis sind die hier angegebenen Dienstleistungen enthalten, z.B. Jährliche Ablesung""" - inklusive_geraete: Optional[list["Geraet"]] = None + inklusive_geraete: list["Geraet"] | None = None """Im Preis sind die hier angegebenen Geräte mit enthalten, z.B. ein Wandler""" diff --git a/src/bo4e/bo/preisblattnetznutzung.py b/src/bo4e/bo/preisblattnetznutzung.py index dceef99b1..c034ee633 100644 --- a/src/bo4e/bo/preisblattnetznutzung.py +++ b/src/bo4e/bo/preisblattnetznutzung.py @@ -33,9 +33,7 @@ class PreisblattNetznutzung(Preisblatt): """ - typ: Annotated[Literal[BoTyp.PREISBLATTNETZNUTZUNG], Field(alias="_typ")] = ( - BoTyp.PREISBLATTNETZNUTZUNG # type: ignore[assignment] - ) + typ: Annotated[Literal[BoTyp.PREISBLATTNETZNUTZUNG], Field(alias="_typ")] = BoTyp.PREISBLATTNETZNUTZUNG # type: ignore[assignment] # required attributes (additional to those of Preisblatt) bilanzierungsmethode: Optional["Bilanzierungsmethode"] = None """Die Preise gelten für Marktlokationen der angebebenen Bilanzierungsmethode""" diff --git a/src/bo4e/bo/rechnung.py b/src/bo4e/bo/rechnung.py index a3b15972f..85c38fa46 100644 --- a/src/bo4e/bo/rechnung.py +++ b/src/bo4e/bo/rechnung.py @@ -51,11 +51,11 @@ class Rechnung(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.RECHNUNG], Field(alias="_typ")] = BoTyp.RECHNUNG - rechnungsnummer: Optional[str] = None + rechnungsnummer: str | None = None """Eine im Verwendungskontext eindeutige Nummer für die Rechnung""" - rechnungsdatum: Optional[pydantic.AwareDatetime] = None + rechnungsdatum: pydantic.AwareDatetime | None = None """Ausstellungsdatum der Rechnung""" - faelligkeitsdatum: Optional[pydantic.AwareDatetime] = None + faelligkeitsdatum: pydantic.AwareDatetime | None = None """Zu diesem Datum ist die Zahlung fällig""" rechnungstyp: Optional["Rechnungstyp"] = None """Ein kontextbezogender Rechnungstyp, z.B. Netznutzungsrechnung""" @@ -77,23 +77,23 @@ class Rechnung(Geschaeftsobjekt): """Die Summe aus Netto- und Steuerbetrag""" zu_zahlen: Optional["Betrag"] = None """Der zu zahlende Betrag, der sich aus (gesamtbrutto - vorausbezahlt - rabattBrutto) ergibt""" - zaehler: Optional[list["Zaehler"]] = None + zaehler: list["Zaehler"] | None = None zukuenftiger_abschlag: Optional["Betrag"] = None - kaeuferreferenz: Optional[str] = None + kaeuferreferenz: str | None = None - rechnungspositionen: Optional[list["Rechnungsposition"]] = None + rechnungspositionen: list["Rechnungsposition"] | None = None """Die Rechnungspositionen""" - rechnungstitel: Optional[str] = None + rechnungstitel: str | None = None """Bezeichnung für die vorliegende Rechnung""" rechnungsstatus: Optional["Rechnungsstatus"] = None """Status der Rechnung zur Kennzeichnung des Bearbeitungsstandes""" - original_rechnungsnummer: Optional[str] = None + original_rechnungsnummer: str | None = None """Im Falle einer Stornorechnung (storno = true) steht hier die Rechnungsnummer der stornierten Rechnung""" - vorauszahlungen: Optional[list["Vorauszahlung"]] = None + vorauszahlungen: list["Vorauszahlung"] | None = None """Die Summe evtl. vorausgezahlter Beträge, z.B. Abschläge. Angabe als Bruttowert""" rabatt_netto: Optional["Betrag"] = None """Gesamtrabatt auf den Nettobetrag""" - steuerbetraege: Optional[list["Steuerbetrag"]] = None + steuerbetraege: list["Steuerbetrag"] | None = None """ Eine Liste mit Steuerbeträgen pro Steuerkennzeichen/Steuersatz; die Summe dieser Beträge ergibt den Wert für gesamtsteuer. @@ -104,11 +104,11 @@ class Rechnung(Geschaeftsobjekt): """Aus der INVOIC entnommen, befüllt wenn es sich um eine Netznutzungsrechnung handelt""" netznutzungrechnungstyp: Optional["NetznutzungRechnungstyp"] = None """Aus der INVOIC entnommen, befüllt wenn es sich um eine Netznutzungsrechnung handelt""" - ist_original: Optional[bool] = None + ist_original: bool | None = None """Kennzeichen, ob es sich um ein Original (true) oder eine Kopie handelt (false)""" - ist_simuliert: Optional[bool] = None + ist_simuliert: bool | None = None """Kennzeichen, ob es sich um eine simulierte Rechnung, z.B. zur Rechnungsprüfung handelt""" - ist_storno: Optional[bool] = None + ist_storno: bool | None = None """ Kennzeichnung, ob es sich um eine Stornorechnung handelt; im Falle "true" findet sich im Attribut "originalrechnungsnummer" die Nummer der Originalrechnung. @@ -117,9 +117,9 @@ class Rechnung(Geschaeftsobjekt): """Marktlokation, auf die sich die Rechnung bezieht""" messlokation: Optional["Messlokation"] = None """Messlokation, auf die sich die Rechnung bezieht""" - teilrechnungen: Optional[list["Rechnung"]] = None + teilrechnungen: list["Rechnung"] | None = None """Rechnungen, die durch diese Rechnung zusammengefasst werden""" - zahlungsinformationen: Optional[list["Zahlungsinformation"]] = None + zahlungsinformationen: list["Zahlungsinformation"] | None = None """Informationen wie eine Rechnung bezahlt werden soll""" vertrag: Optional["Vertrag"] = None """enthält Informationen über den der Rechnung zugrundeliegenden Vertrag für Rechnungen nach EnWG § 40""" @@ -139,5 +139,5 @@ class Rechnung(Geschaeftsobjekt): """ggf. auf einen Vergleichszeitraum hochgerechneter Verbrauch des vorherigen Jahres zu Vergleichszwecken mit dem aktuellen Jahr, gemäß EnWG § 40""" fremdkosten: Optional["Fremdkosten"] = None """Zur Ausweisung der in die Kalkulation eingeflossenen Preise gemäß EnWG § 40""" - referenzverbraeuche: Optional[list["Energiemenge"]] = None + referenzverbraeuche: list["Energiemenge"] | None = None """Verbräuche von Referenzkundengruppen gemäß EnWG § 40""" diff --git a/src/bo4e/bo/region.py b/src/bo4e/bo/region.py index e4f75bfa0..08e9cc88e 100644 --- a/src/bo4e/bo/region.py +++ b/src/bo4e/bo/region.py @@ -2,7 +2,7 @@ Contains Region class """ -from typing import TYPE_CHECKING, Annotated, Literal, Optional +from typing import TYPE_CHECKING, Annotated, Literal from pydantic import Field @@ -39,12 +39,12 @@ class Region(Geschaeftsobjekt): """ typ: Annotated[Literal[BoTyp.REGION], Field(alias="_typ")] = BoTyp.REGION - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Bezeichnung der Region""" - beschreibung: Optional[str] = None + beschreibung: str | None = None """Beschreibung der Region""" - regionsoperationen: Optional[list["Regionsoperation"]] = None + regionsoperationen: list["Regionsoperation"] | None = None """ Eine (unsortierte) Liste von Regionsoperationen. Die Sortierung wird durch das Feld `prioritaet` im COM `Regionsoperation` festgelegt. diff --git a/src/bo4e/bo/standorteigenschaften.py b/src/bo4e/bo/standorteigenschaften.py index 6a8a41ac6..a3c0e59ff 100644 --- a/src/bo4e/bo/standorteigenschaften.py +++ b/src/bo4e/bo/standorteigenschaften.py @@ -32,7 +32,7 @@ class Standorteigenschaften(Geschaeftsobjekt): """ typ: Annotated[Literal[BoTyp.STANDORTEIGENSCHAFTEN], Field(alias="_typ")] = BoTyp.STANDORTEIGENSCHAFTEN - eigenschaften_strom: Optional[list["StandorteigenschaftenStrom"]] = None + eigenschaften_strom: list["StandorteigenschaftenStrom"] | None = None """Eigenschaften zur Sparte Strom""" eigenschaften_gas: Optional["StandorteigenschaftenGas"] = None diff --git a/src/bo4e/bo/steuerbareressource.py b/src/bo4e/bo/steuerbareressource.py index dba02e934..71d631edf 100644 --- a/src/bo4e/bo/steuerbareressource.py +++ b/src/bo4e/bo/steuerbareressource.py @@ -35,17 +35,17 @@ class SteuerbareRessource(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.STEUERBARERESSOURCE], Field(alias="_typ")] = BoTyp.STEUERBARERESSOURCE - steuerbare_ressource_id: Optional[str] = None + steuerbare_ressource_id: str | None = None """Id der steuerbaren Ressource""" steuerkanal_leistungsbeschreibung: Optional["SteuerkanalLeistungsbeschreibung"] = None """Leistungsbeschreibung des Steuerkanals""" - zugeordnete_msb_codenummer: Optional[str] = None + zugeordnete_msb_codenummer: str | None = None """Angabe des Messstellenbetreibers, der der Steuerbaren Ressource zugeordnet ist.""" - konfigurationsprodukte: Optional[list["Konfigurationsprodukt"]] = None + konfigurationsprodukte: list["Konfigurationsprodukt"] | None = None """Produkt-Daten der Steuerbaren Ressource""" eigenschaft_msb_lokation: Optional["Marktrolle"] = None """Eigenschaft des Messstellenbetreibers an der Lokation""" - lokationszuordnungen: Optional[list["Lokationszuordnung"]] = None + lokationszuordnungen: list["Lokationszuordnung"] | None = None """Lokationszuordnung, um bspw. die zugehörigen Messlokationen anzugeben""" - lokationsbuendel_objektcode: Optional[str] = None + lokationsbuendel_objektcode: str | None = None """Lokationsbuendel Code, der die Funktion dieses BOs an der Lokationsbuendelstruktur beschreibt.""" diff --git a/src/bo4e/bo/tarif.py b/src/bo4e/bo/tarif.py index 51e4d44e3..9e9ea4b7d 100644 --- a/src/bo4e/bo/tarif.py +++ b/src/bo4e/bo/tarif.py @@ -63,21 +63,21 @@ class Tarif(Tarifinfo): typ: Annotated[Literal[BoTyp.TARIF], Field(alias="_typ")] = BoTyp.TARIF # type:ignore[assignment] - regionspreise: Optional[list["Regionspreis"]] = None + regionspreise: list["Regionspreis"] | None = None """ Enthält alle regions- und zeitaufgelösten Tarifpreise. Ausschließlich die `COM DynamischePreisposition` wird unter einem anderen Feld namens `dynamischePreisposition` angegeben. """ - dynamische_preisposition_quelle: Optional[str] = None + dynamische_preisposition_quelle: str | None = None """ Gibt die Bezugsquelle (z.B. Börsenindex) für den dynamischen Tarif an. Dieses Feld muss genau dann gesetzt werden, wenn es sich bei diesem Tarif um einen dynamischen Tarif handelt. """ - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Eine (beliebige) Bezeichnung für den Tarif.""" - beschreibung: Optional[str] = None + beschreibung: str | None = None """Eine (beliebige) Beschreibung für den Tarif.""" anbieter: Optional["Marktteilnehmer"] = None """Der Marktteilnehmer, der diesen Tarif anbietet, angeboten hat oder anbieten wird.""" @@ -88,15 +88,15 @@ class Tarif(Tarifinfo): """Der Zeitraum, in dem eine Belieferung (für diesen Tarif) möglich ist.""" vertragskonditionen: Optional["Vertragskonditionen"] """Vertragskonditionen für diesen Tarif.""" - website: Optional[str] + website: str | None """Internetseite, auf der der Tarif veröffentlicht ist.""" - energiemix: Optional[list["Energiemix"]] # type:ignore[assignment] + energiemix: list["Energiemix"] | None # type:ignore[assignment] """Der Energiemix mit einem Eintrag pro Gültigkeitsjahr (siehe `Energiemix.gueltigkeitsjahr`).""" - kundentypen: Optional[list["Kundentyp"]] + kundentypen: list["Kundentyp"] | None """Eine Liste an Kundentypen, für die dieser Tarif vorgesehen ist.""" tariftyp: Optional["Tariftyp"] """Der Tariftyp. Bsp.: Grundversorgung, Ersatzversorgung, etc.""" - tarifmerkmale: Optional[list["Tarifmerkmal"]] + tarifmerkmale: list["Tarifmerkmal"] | None """Eine Liste von Produktmerkmalen im Zusammenhang mit diesem Tarif.""" sparte: Optional["Sparte"] """Strom / Gas""" diff --git a/src/bo4e/bo/tarifinfo.py b/src/bo4e/bo/tarifinfo.py index a6bc8a080..a74716258 100644 --- a/src/bo4e/bo/tarifinfo.py +++ b/src/bo4e/bo/tarifinfo.py @@ -41,26 +41,26 @@ class Tarifinfo(Geschaeftsobjekt): """ typ: Annotated[Literal[BoTyp.TARIFINFO], Field(alias="_typ")] = BoTyp.TARIFINFO - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Name des Tarifs""" - anbietername: Optional[str] = None + anbietername: str | None = None """Der Name des Marktpartners, der den Tarif anbietet""" sparte: Optional["Sparte"] = None """Strom oder Gas, etc.""" - kundentypen: Optional[list["Kundentyp"]] = None + kundentypen: list["Kundentyp"] | None = None """Kundentypen für den der Tarif gilt, z.B. Privatkunden""" registeranzahl: Optional["Registeranzahl"] = None """Die Art des Tarifes, z.B. Eintarif oder Mehrtarif""" tariftyp: Optional["Tariftyp"] = None """Hinweis auf den Tariftyp, z.B. Grundversorgung oder Sondertarif""" - tarifmerkmale: Optional[list["Tarifmerkmal"]] = None + tarifmerkmale: list["Tarifmerkmal"] | None = None """Weitere Merkmale des Tarifs, z.B. Festpreis oder Vorkasse""" anbieter: Optional["Marktteilnehmer"] = None """Der Marktteilnehmer (Lieferant), der diesen Tarif anbietet""" - website: Optional[str] = None + website: str | None = None """Internetseite auf dem der Tarif zu finden ist""" - bemerkung: Optional[str] = None + bemerkung: str | None = None """Freitext""" zeitliche_gueltigkeit: Optional["Zeitraum"] = None @@ -69,7 +69,7 @@ class Tarifinfo(Geschaeftsobjekt): """Der Energiemix, der für diesen Tarif gilt""" vertragskonditionen: Optional["Vertragskonditionen"] = None """Mindestlaufzeiten und Kündigungsfristen zusammengefasst""" - anwendung_von: Optional[pydantic.AwareDatetime] = None + anwendung_von: pydantic.AwareDatetime | None = None """ Angabe des inklusiven Zeitpunkts, ab dem der Tarif bzw. der Preis angewendet und abgerechnet wird, z.B. "2021-07-20T18:31:48Z" diff --git a/src/bo4e/bo/tarifkosten.py b/src/bo4e/bo/tarifkosten.py index 6ea269cb2..5f5bc7bd4 100644 --- a/src/bo4e/bo/tarifkosten.py +++ b/src/bo4e/bo/tarifkosten.py @@ -11,7 +11,6 @@ from .tarifinfo import Tarifinfo if TYPE_CHECKING: - from .kosten import Kosten # pylint: disable=too-few-public-methods diff --git a/src/bo4e/bo/tarifpreisblatt.py b/src/bo4e/bo/tarifpreisblatt.py index d62323f7b..204f24cde 100644 --- a/src/bo4e/bo/tarifpreisblatt.py +++ b/src/bo4e/bo/tarifpreisblatt.py @@ -39,9 +39,9 @@ class Tarifpreisblatt(Tarifinfo): typ: Annotated[Literal[BoTyp.TARIFPREISBLATT], Field(alias="_typ")] = BoTyp.TARIFPREISBLATT # type: ignore[assignment] # required attributes (additional to those of Tarifinfo) - preisstand: Optional[pydantic.AwareDatetime] = None + preisstand: pydantic.AwareDatetime | None = None """Gibt an, wann der Preis zuletzt angepasst wurde""" - tarifpreise: Optional[list["Tarifpreisposition"]] = None + tarifpreise: list["Tarifpreisposition"] | None = None """Die festgelegten Preise, z.B. für Arbeitspreis, Grundpreis etc.""" berechnungsparameter: Optional["Tarifberechnungsparameter"] = None """Für die Berechnung der Kosten sind die hier abgebildeten Parameter heranzuziehen""" @@ -50,5 +50,5 @@ class Tarifpreisblatt(Tarifinfo): """Die Bedingungen und Einschränkungen unter denen ein Tarif angewendet werden kann""" preisgarantie: Optional["Preisgarantie"] = None """Festlegung von Garantien für bestimmte Preisanteile""" - tarif_auf_abschlaege: Optional[list["AufAbschlag"]] = None + tarif_auf_abschlaege: list["AufAbschlag"] | None = None """Auf- und Abschläge auf die Preise oder Kosten""" diff --git a/src/bo4e/bo/technischeressource.py b/src/bo4e/bo/technischeressource.py index 52d1896af..1fa866439 100644 --- a/src/bo4e/bo/technischeressource.py +++ b/src/bo4e/bo/technischeressource.py @@ -39,13 +39,13 @@ class TechnischeRessource(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.TECHNISCHERESSOURCE], Field(alias="_typ")] = BoTyp.TECHNISCHERESSOURCE - technische_ressource_id: Optional[str] = None + technische_ressource_id: str | None = None """Identifikationsnummer einer technischen Ressource""" - vorgelagerte_messlokation_id: Optional[str] = None + vorgelagerte_messlokation_id: str | None = None """Vorgelagerte Messlokation ID""" - zugeordnete_marktlokation_id: Optional[str] = None + zugeordnete_marktlokation_id: str | None = None """Referenz auf die der technischen Ressource zugeordneten Marktlokation""" - zugeordnete_steuerbare_ressource_id: Optional[str] = None + zugeordnete_steuerbare_ressource_id: str | None = None """Referenz auf die der technischen Ressource zugeordneten Steuerbaren Ressource""" nennleistungaufnahme: Optional["Menge"] = None """Nennleistung (Aufnahme)""" @@ -65,11 +65,11 @@ class TechnischeRessource(Geschaeftsobjekt): """Art der Erzeugung der Energie""" speicherart: Optional["Speicherart"] = None """Art des Speichers""" - lokationszuordnungen: Optional[list["Lokationszuordnung"]] = None + lokationszuordnungen: list["Lokationszuordnung"] | None = None """Lokationszuordnung, um bspw. die zugehörigen Messlokationen anzugeben""" - lokationsbuendel_objektcode: Optional[str] = None + lokationsbuendel_objektcode: str | None = None """Lokationsbuendel Code, der die Funktion dieses BOs an der Lokationsbuendelstruktur beschreibt.""" - ist_fernschaltbar: Optional[bool] = None + ist_fernschaltbar: bool | None = None """Fernschaltbarkeit""" - ist_unterbrechbar: Optional[bool] = None + ist_unterbrechbar: bool | None = None """Unterbrechbarkeit""" diff --git a/src/bo4e/bo/vertrag.py b/src/bo4e/bo/vertrag.py index 9d62ea617..d174f8fde 100644 --- a/src/bo4e/bo/vertrag.py +++ b/src/bo4e/bo/vertrag.py @@ -43,7 +43,7 @@ class Vertrag(Geschaeftsobjekt): typ: Annotated[Literal[BoTyp.VERTRAG], Field(alias="_typ")] = BoTyp.VERTRAG # pylint: disable=duplicate-code - vertragsnummer: Optional[str] = None + vertragsnummer: str | None = None """Eine im Verwendungskontext eindeutige Nummer für den Vertrag""" vertragsart: Optional["Vertragsart"] = None """Hier ist festgelegt, um welche Art von Vertrag es sich handelt.""" @@ -51,9 +51,9 @@ class Vertrag(Geschaeftsobjekt): """Gibt den Status des Vertrags an""" sparte: Optional["Sparte"] = None """Unterscheidungsmöglichkeiten für die Sparte""" - vertragsbeginn: Optional[pydantic.AwareDatetime] = None + vertragsbeginn: pydantic.AwareDatetime | None = None """Gibt an, wann der Vertrag beginnt (inklusiv)""" - vertragsende: Optional[pydantic.AwareDatetime] = None + vertragsende: pydantic.AwareDatetime | None = None """Gibt an, wann der Vertrag (voraussichtlich) endet oder beendet wurde (exklusiv)""" # todo: add von/bis validator vertragspartner1: Optional["Geschaeftspartner"] = None @@ -68,17 +68,17 @@ class Vertrag(Geschaeftsobjekt): In der Regel der Empfänger des Vertrags. Beispiel "Vertrag zwischen Vertragspartner 1 und Vertragspartner 2". """ - vertragsteile: Optional[list["Vertragsteil"]] = None + vertragsteile: list["Vertragsteil"] | None = None """ Der Vertragsteil wird dazu verwendet, eine vertragliche Leistung in Bezug zu einer Lokation (Markt- oder Messlokation) festzulegen. """ - beschreibung: Optional[str] = None + beschreibung: str | None = None """Beschreibung zum Vertrag""" vertragskonditionen: Optional["Vertragskonditionen"] = None """Festlegungen zu Laufzeiten und Kündigungsfristen""" - unterzeichnervp1: Optional[list["Unterschrift"]] = None + unterzeichnervp1: list["Unterschrift"] | None = None """Unterzeichner des Vertragspartners 1""" - unterzeichnervp2: Optional[list["Unterschrift"]] = None + unterzeichnervp2: list["Unterschrift"] | None = None """Unterzeichner des Vertragspartners 2""" diff --git a/src/bo4e/bo/zaehler.py b/src/bo4e/bo/zaehler.py index fc32675ab..6275b71ef 100644 --- a/src/bo4e/bo/zaehler.py +++ b/src/bo4e/bo/zaehler.py @@ -45,7 +45,7 @@ class Zaehler(Geschaeftsobjekt): """ typ: Annotated[Literal[BoTyp.ZAEHLER], Field(alias="_typ")] = BoTyp.ZAEHLER - zaehlernummer: Optional[str] = None + zaehlernummer: str | None = None """Nummerierung des Zählers,vergeben durch den Messstellenbetreiber""" sparte: Optional["Sparte"] = None """Strom oder Gas""" @@ -53,24 +53,24 @@ class Zaehler(Geschaeftsobjekt): """Spezifikation die Richtung des Zählers betreffend""" zaehlertyp: Optional["Zaehlertyp"] = None """Typisierung des Zählers""" - zaehlwerke: Optional[list["Zaehlwerk"]] = None + zaehlwerke: list["Zaehlwerk"] | None = None registeranzahl: Optional["Registeranzahl"] = None """Spezifikation bezüglich unterstützter Tarif""" - zaehlerkonstante: Optional[Decimal] = None + zaehlerkonstante: Decimal | None = None """Zählerkonstante auf dem Zähler""" - eichung_bis: Optional[pydantic.AwareDatetime] = None + eichung_bis: pydantic.AwareDatetime | None = None """Bis zu diesem Datum (exklusiv) ist der Zähler geeicht.""" - letzte_eichung: Optional[pydantic.AwareDatetime] = None + letzte_eichung: pydantic.AwareDatetime | None = None """Zu diesem Datum fand die letzte Eichprüfung des Zählers statt.""" zaehlerhersteller: Optional["Geschaeftspartner"] = None """Der Hersteller des Zählers""" - ist_fernauslesbar: Optional[bool] = None + ist_fernauslesbar: bool | None = None """Fernauslesung""" - zaehlertypSpezifikation: Optional["ZaehlertypSpezifikation"] = None + zaehlertypSpezifikation: Optional["ZaehlertypSpezifikation"] = None # noqa: N815 (pre-existing public field name) """Besondere Spezifikation des Zählers""" befestigungsart: Optional["Befestigungsart"] = None """Befestigungsart""" zaehlergroesse: Optional["Zaehlergroesse"] = None """Größe des Zählers""" - geraete: Optional[list["Geraet"]] = None + geraete: list["Geraet"] | None = None """Liste der Geräte, die zu diesem Zähler gehören, bspw. Smartmeter-Gateway""" diff --git a/src/bo4e/bo/zaehlzeitdefinition.py b/src/bo4e/bo/zaehlzeitdefinition.py index 48f7350e4..0141734b5 100644 --- a/src/bo4e/bo/zaehlzeitdefinition.py +++ b/src/bo4e/bo/zaehlzeitdefinition.py @@ -55,12 +55,12 @@ class Zaehlzeitdefinition(Geschaeftsobjekt): oder Lieferant). Identifiziert zusammen mit einer fachlichen Gültigkeit, welche Definition zu welchem Zeitpunkt gilt.""" - feiertagskalender: Optional[str] = None + feiertagskalender: str | None = None """Bezeichnung des Feiertagskalenders, nach dem `FEIERTAGS`-Tagtypen aufgelöst werden (z.B. "BDEW", landes- oder gemeindespezifische Kalender). Frei wählbare Zeichenkette, deren Bedeutung zwischen den Marktpartnern abgestimmt sein muss.""" - saisonprofil: Optional[str] = None + saisonprofil: str | None = None """Bezeichnung des Saisonprofils, das die Datumsgrenzen der in `saisons` referenzierten Saisons festlegt (z.B. "Sommer/Winter").""" - saisons: Optional[list["Zaehlzeitsaison"]] = None + saisons: list["Zaehlzeitsaison"] | None = None """Die Schaltschemata, gruppiert nach Saison.""" diff --git a/src/bo4e/bo/zeitreihe.py b/src/bo4e/bo/zeitreihe.py index 8b944851d..84b07a474 100644 --- a/src/bo4e/bo/zeitreihe.py +++ b/src/bo4e/bo/zeitreihe.py @@ -37,7 +37,7 @@ class Zeitreihe(Geschaeftsobjekt): """ typ: Annotated[Literal[BoTyp.ZEITREIHE], Field(alias="_typ")] = BoTyp.ZEITREIHE - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Bezeichnung für die Zeitreihe""" messgroesse: Optional["Messgroesse"] = None """Beschreibt, was gemessen wurde (z.B. Strom, Spannung, Wirkleistung, Scheinleistung)""" @@ -47,12 +47,12 @@ class Zeitreihe(Geschaeftsobjekt): """Medium, das gemessen wurde (z.B. Wasser, Dampf, Strom, Gas)""" einheit: Optional["Mengeneinheit"] = None """Alle Werte in der Tabelle haben die Einheit, die hier angegeben ist""" - werte: Optional[list["Zeitreihenwert"]] = None + werte: list["Zeitreihenwert"] | None = None """Hier liegen jeweils die Werte""" - beschreibung: Optional[str] = None + beschreibung: str | None = None """Beschreibt die Verwendung der Zeitreihe""" - version: Optional[str] = None + version: str | None = None """Version der Zeitreihe""" wertherkunft: Optional["Messwertstatus"] = None """Kennzeichnung, wie die Werte entstanden sind, z.B. ABGELESEN oder PROGNOSEWERT""" diff --git a/src/bo4e/com/adresse.py b/src/bo4e/com/adresse.py index 67c8b5198..0f4a586e8 100644 --- a/src/bo4e/com/adresse.py +++ b/src/bo4e/com/adresse.py @@ -30,34 +30,34 @@ class Adresse(COM): typ: Annotated[Literal[ComTyp.ADRESSE], Field(alias="_typ")] = ComTyp.ADRESSE - postleitzahl: Optional[str] = None + postleitzahl: str | None = None """ Die Postleitzahl; z.B: "41836" """ - ort: Optional[str] = None + ort: str | None = None """ Bezeichnung der Stadt; z.B. "Hückelhoven" """ - ortsteil: Optional[str] = None + ortsteil: str | None = None """ Bezeichnung des Ortsteils; z.B. "Mitte" """ - strasse: Optional[str] = None + strasse: str | None = None """ Bezeichnung der Straße; z.B. "Weserstraße" """ - hausnummer: Optional[str] = None + hausnummer: str | None = None """ Hausnummer inkl. Zusatz; z.B. "3", "4a" """ - postfach: Optional[str] = None + postfach: str | None = None """Im Falle einer Postfachadresse das Postfach; Damit werden Straße und Hausnummer nicht berücksichtigt""" - adresszusatz: Optional[str] = None + adresszusatz: str | None = None """ Zusatzhinweis zum Auffinden der Adresse, z.B. "3. Stock linke Wohnung" """ - co_ergaenzung: Optional[str] = None + co_ergaenzung: str | None = None """ Im Falle einer c/o-Adresse steht in diesem Attribut die Anrede. Z.B. "c/o Veronica Hauptmieterin" """ diff --git a/src/bo4e/com/angebotsposition.py b/src/bo4e/com/angebotsposition.py index b781dc2e7..908e00fde 100644 --- a/src/bo4e/com/angebotsposition.py +++ b/src/bo4e/com/angebotsposition.py @@ -11,7 +11,6 @@ from .com import COM if TYPE_CHECKING: - from .betrag import Betrag from .menge import Menge from .preis import Preis @@ -39,7 +38,7 @@ class Angebotsposition(COM): typ: Annotated[Literal[ComTyp.ANGEBOTSPOSITION], Field(alias="_typ")] = ComTyp.ANGEBOTSPOSITION - positionsbezeichnung: Optional[str] = None + positionsbezeichnung: str | None = None """Bezeichnung der jeweiligen Position des Angebotsteils""" positionspreis: Optional["Preis"] = None """Preis pro Einheit/Stückpreis des angebotenen Artikels.""" diff --git a/src/bo4e/com/angebotsteil.py b/src/bo4e/com/angebotsteil.py index e9c5ea3f5..127abd96c 100644 --- a/src/bo4e/com/angebotsteil.py +++ b/src/bo4e/com/angebotsteil.py @@ -41,12 +41,12 @@ class Angebotsteil(COM): typ: Annotated[Literal[ComTyp.ANGEBOTSTEIL], Field(alias="_typ")] = ComTyp.ANGEBOTSTEIL - positionen: Optional[list["Angebotsposition"]] = None + positionen: list["Angebotsposition"] | None = None """Einzelne Positionen, die zu diesem Angebotsteil gehören""" - anfrage_subreferenz: Optional[str] = None + anfrage_subreferenz: str | None = None """Identifizierung eines Subkapitels einer Anfrage, beispielsweise das Los einer Ausschreibung""" - lieferstellenangebotsteil: Optional[list["Marktlokation"]] = None + lieferstellenangebotsteil: list["Marktlokation"] | None = None """ Marktlokationen, für die dieses Angebotsteil gilt, falls vorhanden. Durch die Marktlokation ist auch die Lieferadresse festgelegt diff --git a/src/bo4e/com/angebotsvariante.py b/src/bo4e/com/angebotsvariante.py index e91b9cd81..82bfe0e90 100644 --- a/src/bo4e/com/angebotsvariante.py +++ b/src/bo4e/com/angebotsvariante.py @@ -39,13 +39,13 @@ class Angebotsvariante(COM): angebotsstatus: Optional["Angebotsstatus"] = None """Gibt den Status eines Angebotes an.""" - erstellungsdatum: Optional[pydantic.AwareDatetime] = None + erstellungsdatum: pydantic.AwareDatetime | None = None """Datum der Erstellung der Angebotsvariante""" - bindefrist: Optional[pydantic.AwareDatetime] = None + bindefrist: pydantic.AwareDatetime | None = None """Bis zu diesem Zeitpunkt gilt die Angebotsvariante""" - teile: Optional[list["Angebotsteil"]] = None + teile: list["Angebotsteil"] | None = None """ Angebotsteile werden im einfachsten Fall für eine Marktlokation oder Lieferstellenadresse erzeugt. Hier werden die Mengen und Gesamtkosten aller Angebotspositionen zusammengefasst. diff --git a/src/bo4e/com/aufabschlag.py b/src/bo4e/com/aufabschlag.py index ea072eaa9..0fb24282d 100644 --- a/src/bo4e/com/aufabschlag.py +++ b/src/bo4e/com/aufabschlag.py @@ -37,12 +37,12 @@ class AufAbschlag(COM): typ: Annotated[Literal[ComTyp.AUFABSCHLAG], Field(alias="_typ")] = ComTyp.AUFABSCHLAG - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Bezeichnung des Auf-/Abschlags""" - staffeln: Optional[list["Preisstaffel"]] = None + staffeln: list["Preisstaffel"] | None = None """Werte für die gestaffelten Auf/Abschläge.""" - beschreibung: Optional[str] = None + beschreibung: str | None = None """Beschreibung zum Auf-/Abschlag""" auf_abschlagstyp: Optional["AufAbschlagstyp"] = None """Typ des Aufabschlages (z.B. absolut oder prozentual).""" @@ -51,7 +51,7 @@ class AufAbschlag(COM): einheit: Optional["Waehrungseinheit"] = None """ Gibt an in welcher Währungseinheit der Auf/Abschlag berechnet wird. Euro oder Ct.. (Nur im Falle absoluter Aufschlagstypen). """ - website: Optional[str] = None + website: str | None = None """Internetseite, auf der die Informationen zum Auf-/Abschlag veröffentlicht sind.""" gueltigkeitszeitraum: Optional["Zeitraum"] = None """Internetseite, auf der die Informationen zum Auf-/Abschlag veröffentlicht sind.""" diff --git a/src/bo4e/com/ausschreibungsdetail.py b/src/bo4e/com/ausschreibungsdetail.py index 7c74df320..f19950063 100644 --- a/src/bo4e/com/ausschreibungsdetail.py +++ b/src/bo4e/com/ausschreibungsdetail.py @@ -36,29 +36,29 @@ class Ausschreibungsdetail(COM): typ: Annotated[Literal[ComTyp.AUSSCHREIBUNGSDETAIL], Field(alias="_typ")] = ComTyp.AUSSCHREIBUNGSDETAIL - marktlokations_id: Optional[str] = None + marktlokations_id: str | None = None """Identifikation einer ausgeschriebenen Marktlokation""" - netzebene_lieferung: Optional[str] = None + netzebene_lieferung: str | None = None """In der angegebenen Netzebene wird die Marktlokation versorgt, z.B. MSP für Mittelspannung""" - netzebene_messung: Optional[str] = None + netzebene_messung: str | None = None """In der angegebenen Netzebene wird die Lokation gemessen, z.B. NSP für Niederspannung""" marktlokationsadresse: Optional["Adresse"] = None """Die Adresse an der die Marktlokation sich befindet""" lieferzeitraum: Optional["Zeitraum"] = None """Angefragter Zeitraum für die ausgeschriebene Belieferung""" - netzbetreiber: Optional[str] = None + netzbetreiber: str | None = None """Bezeichnung des zuständigen Netzbetreibers, z.B. 'Stromnetz Hamburg GmbH'""" - kunde: Optional[str] = None + kunde: str | None = None """Bezeichnung des Kunden, der die Marktlokation nutzt""" - zaehlernummer: Optional[str] = None + zaehlernummer: str | None = None """Die Bezeichnung des Zählers an der Marktlokation""" - marktlokationsbezeichnung: Optional[str] = None + marktlokationsbezeichnung: str | None = None """Bezeichnung für die Lokation, z.B. 'Zentraler Einkauf, Hamburg'""" zaehlertechnik: Optional["Zaehlertyp"] = None """Spezifikation, um welche Zählertechnik es sich im vorliegenden Fall handelt, z.B. Leistungsmessung""" - ist_lastgang_vorhanden: Optional[bool] = None + ist_lastgang_vorhanden: bool | None = None """ Zeigt an, ob es zu der Marktlokation einen Lastgang gibt. Falls ja, kann dieser abgerufen werden und daraus die Verbrauchswerte ermittelt werden diff --git a/src/bo4e/com/ausschreibungslos.py b/src/bo4e/com/ausschreibungslos.py index 06f00bb37..a5cf58a58 100644 --- a/src/bo4e/com/ausschreibungslos.py +++ b/src/bo4e/com/ausschreibungslos.py @@ -38,9 +38,9 @@ class Ausschreibungslos(COM): typ: Annotated[Literal[ComTyp.AUSSCHREIBUNGSLOS], Field(alias="_typ")] = ComTyp.AUSSCHREIBUNGSLOS - losnummer: Optional[str] = None + losnummer: str | None = None """Laufende Nummer des Loses""" - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Bezeichnung der Ausschreibung""" preismodell: Optional["Preismodell"] = None """Bezeichnung der Preismodelle in Ausschreibungen für die Energielieferung""" @@ -51,18 +51,18 @@ class Ausschreibungslos(COM): """Aufzählung der Möglichkeiten zur Rechnungslegung in Ausschreibungen""" wunsch_vertragsform: Optional["Vertragsform"] = None """Aufzählung der Möglichkeiten zu Vertragsformen in Ausschreibungen""" - betreut_durch: Optional[str] = None + betreut_durch: str | None = None """Name des Lizenzpartners""" - anzahl_lieferstellen: Optional[int] = None + anzahl_lieferstellen: int | None = None """Anzahl der Lieferstellen in dieser Ausschreibung""" - lieferstellen: Optional[list["Ausschreibungsdetail"]] = None + lieferstellen: list["Ausschreibungsdetail"] | None = None """Die ausgeschriebenen Lieferstellen""" lieferzeitraum: Optional["Zeitraum"] = None """Zeitraum, für den die in diesem Los enthaltenen Lieferstellen beliefert werden sollen""" - bemerkung: Optional[str] = None + bemerkung: str | None = None """Bemerkung des Kunden zum Los""" gesamt_menge: Optional["Menge"] = None """Gibt den Gesamtjahresverbrauch (z.B. in kWh) aller in diesem Los enthaltenen Lieferstellen an""" diff --git a/src/bo4e/com/betrag.py b/src/bo4e/com/betrag.py index 855ca33e6..f0b64a1d2 100644 --- a/src/bo4e/com/betrag.py +++ b/src/bo4e/com/betrag.py @@ -35,7 +35,7 @@ class Betrag(COM): typ: Annotated[Literal[ComTyp.BETRAG], Field(alias="_typ")] = ComTyp.BETRAG - wert: Optional[Decimal] = None + wert: Decimal | None = None """Gibt den Betrag des Preises an.""" waehrung: Optional["Waehrungscode"] = None """Die entsprechende Waehrung""" diff --git a/src/bo4e/com/com.py b/src/bo4e/com/com.py index 030285616..7642d39cd 100644 --- a/src/bo4e/com/com.py +++ b/src/bo4e/com/com.py @@ -3,7 +3,7 @@ """ from decimal import Decimal -from typing import Annotated, Optional, Type, TypeVar +from typing import Annotated, TypeVar from humps.main import camelize @@ -32,20 +32,20 @@ class COM(BaseModel): """ - version: Annotated[Optional[str], Field(alias="_version")] = __version__ + version: Annotated[str | None, Field(alias="_version")] = __version__ """ Version der COM-Struktur aka "fachliche Versionierung" """ # Python internal: The field is not named '_id' because leading underscores are not allowed in pydantic field names. # NameError: Fields must not use names with leading underscores; e.g., use 'id' instead of '_id'. - id: Annotated[Optional[str], Field(alias="_id")] = None + id: Annotated[str | None, Field(alias="_id")] = None """ Eine generische ID, die für eigene Zwecke genutzt werden kann. Z.B. könnten hier UUIDs aus einer Datenbank stehen oder URLs zu einem Backend-System. """ - zusatz_attribute: Optional[list["ZusatzAttribut"]] = None + zusatz_attribute: list["ZusatzAttribut"] | None = None # pylint: disable=duplicate-code # basic configuration for pydantic's behaviour @@ -63,7 +63,7 @@ class COM(BaseModel): # pylint: disable=invalid-name # Any type derived from COM including those that do not directly inherit from COM -TCom = TypeVar("TCom", bound=Type[COM]) +TCom = TypeVar("TCom", bound=type[COM]) # todo: find out if this way of typing is correct diff --git a/src/bo4e/com/dienstleistung.py b/src/bo4e/com/dienstleistung.py index f814cc816..a2a500805 100644 --- a/src/bo4e/com/dienstleistung.py +++ b/src/bo4e/com/dienstleistung.py @@ -35,5 +35,5 @@ class Dienstleistung(COM): dienstleistungstyp: Optional["Dienstleistungstyp"] = None """Kennzeichnung der Dienstleistung""" - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Bezeichnung der Dienstleistung""" diff --git a/src/bo4e/com/einheitspreisposition.py b/src/bo4e/com/einheitspreisposition.py index 230f0ea18..7bafaf399 100644 --- a/src/bo4e/com/einheitspreisposition.py +++ b/src/bo4e/com/einheitspreisposition.py @@ -36,7 +36,7 @@ class EinheitsPreisposition(COM): typ: Annotated[Literal[ComTyp.EINHEITSPREISPOSITION], Field(alias="_typ")] = ComTyp.EINHEITSPREISPOSITION - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Eine (beliebige) Bezeichnung für die Preisposition.""" preisreferenz: Optional["Preisreferenz"] = None """ diff --git a/src/bo4e/com/energieherkunft.py b/src/bo4e/com/energieherkunft.py index fdfe2a643..9d3bb1ad8 100644 --- a/src/bo4e/com/energieherkunft.py +++ b/src/bo4e/com/energieherkunft.py @@ -39,5 +39,5 @@ class Energieherkunft(COM): erzeugungsart: Optional["Erzeugungsart"] = None """Art der Erzeugung der Energie.""" - anteil_prozent: Optional[Decimal] = None + anteil_prozent: Decimal | None = None """Prozentualer Anteil der jeweiligen Erzeugungsart.""" diff --git a/src/bo4e/com/energiemix.py b/src/bo4e/com/energiemix.py index 076378f53..5880269ed 100644 --- a/src/bo4e/com/energiemix.py +++ b/src/bo4e/com/energiemix.py @@ -37,28 +37,28 @@ class Energiemix(COM): typ: Annotated[Literal[ComTyp.ENERGIEMIX], Field(alias="_typ")] = ComTyp.ENERGIEMIX - energiemixnummer: Optional[int] = None + energiemixnummer: int | None = None """Eindeutige Nummer zur Identifizierung des Energiemixes""" energieart: Optional["Sparte"] = None """Strom oder Gas etc.""" - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Bezeichnung des Energiemix""" - gueltigkeitsjahr: Optional[int] = None + gueltigkeitsjahr: int | None = None """Jahr, für das der Energiemix gilt""" - anteil: Optional[list["Energieherkunft"]] = None + anteil: list["Energieherkunft"] | None = None """Anteile der jeweiligen Erzeugungsart""" - bemerkung: Optional[str] = None + bemerkung: str | None = None """Bemerkung zum Energiemix""" - co2_emission: Optional[Decimal] = None + co2_emission: Decimal | None = None """Höhe des erzeugten CO2-Ausstosses in g/kWh""" - atommuell: Optional[Decimal] = None + atommuell: Decimal | None = None """Höhe des erzeugten Atommülls in g/kWh""" - oekozertifikate: Optional[list["Oekozertifikat"]] = None + oekozertifikate: list["Oekozertifikat"] | None = None """Zertifikate für den Energiemix""" - oekolabel: Optional[list["Oekolabel"]] = None + oekolabel: list["Oekolabel"] | None = None """Ökolabel für den Energiemix""" - ist_in_oeko_top_ten: Optional[bool] = None + ist_in_oeko_top_ten: bool | None = None """Kennzeichen, ob der Versorger zu den Öko Top Ten gehört""" - website: Optional[str] = None + website: str | None = None """Internetseite, auf der die Strommixdaten veröffentlicht sind""" diff --git a/src/bo4e/com/fremdkostenblock.py b/src/bo4e/com/fremdkostenblock.py index ac649feae..3b9c702c3 100644 --- a/src/bo4e/com/fremdkostenblock.py +++ b/src/bo4e/com/fremdkostenblock.py @@ -11,7 +11,6 @@ from .com import COM if TYPE_CHECKING: - from .betrag import Betrag from .fremdkostenposition import Fremdkostenposition @@ -34,10 +33,10 @@ class Fremdkostenblock(COM): typ: Annotated[Literal[ComTyp.FREMDKOSTENBLOCK], Field(alias="_typ")] = ComTyp.FREMDKOSTENBLOCK - kostenblockbezeichnung: Optional[str] = None + kostenblockbezeichnung: str | None = None """Bezeichnung für einen Kostenblock. Z.B. Netzkosten, Messkosten, Umlagen, etc.""" - kostenpositionen: Optional[list["Fremdkostenposition"]] = None + kostenpositionen: list["Fremdkostenposition"] | None = None """ Hier sind die Details zu einer Kostenposition aufgeführt. Z.B.: Alliander Netz Heinsberg GmbH, 2018-02-01, 2019-01-01, Arbeitspreis HT, 3.660 kWh, diff --git a/src/bo4e/com/fremdkostenposition.py b/src/bo4e/com/fremdkostenposition.py index 6d050ebd6..d5a3b3f1c 100644 --- a/src/bo4e/com/fremdkostenposition.py +++ b/src/bo4e/com/fremdkostenposition.py @@ -2,7 +2,7 @@ Contains Fremdkostenposition """ -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -27,20 +27,18 @@ class Fremdkostenposition(Kostenposition): """ - typ: Annotated[Literal[ComTyp.FREMDKOSTENPOSITION], Field(alias="_typ")] = ( - ComTyp.FREMDKOSTENPOSITION # type:ignore[assignment] - ) + typ: Annotated[Literal[ComTyp.FREMDKOSTENPOSITION], Field(alias="_typ")] = ComTyp.FREMDKOSTENPOSITION # type:ignore[assignment] # optional attributes (additional to those from Kostenposition) - marktpartnername: Optional[str] = None + marktpartnername: str | None = None """Der Name des Marktpartners, der die Preise festlegt, bzw. die Kosten in Rechnung stellt""" - marktpartnercode: Optional[str] = None + marktpartnercode: str | None = None """Die Codenummer (z.B. BDEW-Codenummer) des Marktpartners, der die Preise festlegt / die Kosten in Rechnung stellt""" - gebietcode_eic: Optional[str] = None + gebietcode_eic: str | None = None """EIC-Code des Regel- oder Marktgebietes eingetragen. Z.B. '10YDE-EON------1' für die Regelzone TenneT""" # todo: see issue https://github.com/Hochfrequenz/BO4E-python/issues/147 for EIC validation - link_preisblatt: Optional[str] = None + link_preisblatt: str | None = None """Link zum veröffentlichten Preisblatt""" diff --git a/src/bo4e/com/geokoordinaten.py b/src/bo4e/com/geokoordinaten.py index 321e827d0..50067151a 100644 --- a/src/bo4e/com/geokoordinaten.py +++ b/src/bo4e/com/geokoordinaten.py @@ -3,7 +3,7 @@ """ from decimal import Decimal -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -30,5 +30,5 @@ class Geokoordinaten(COM): typ: Annotated[Literal[ComTyp.GEOKOORDINATEN], Field(alias="_typ")] = ComTyp.GEOKOORDINATEN - breitengrad: Optional[Decimal] = None - laengengrad: Optional[Decimal] = None + breitengrad: Decimal | None = None + laengengrad: Decimal | None = None diff --git a/src/bo4e/com/katasteradresse.py b/src/bo4e/com/katasteradresse.py index dc786a178..16d7c444a 100644 --- a/src/bo4e/com/katasteradresse.py +++ b/src/bo4e/com/katasteradresse.py @@ -2,7 +2,7 @@ Contains Katasteradresse class """ -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -29,5 +29,5 @@ class Katasteradresse(COM): typ: Annotated[Literal[ComTyp.KATASTERADRESSE], Field(alias="_typ")] = ComTyp.KATASTERADRESSE - gemarkung_flur: Optional[str] = None - flurstueck: Optional[str] = None + gemarkung_flur: str | None = None + flurstueck: str | None = None diff --git a/src/bo4e/com/konfigurationsprodukt.py b/src/bo4e/com/konfigurationsprodukt.py index 502af7dcd..0a51d7c56 100644 --- a/src/bo4e/com/konfigurationsprodukt.py +++ b/src/bo4e/com/konfigurationsprodukt.py @@ -33,7 +33,7 @@ class Konfigurationsprodukt(COM): typ: Annotated[Literal[ComTyp.KONFIGURATIONSPRODUKT], Field(alias="_typ")] = ComTyp.KONFIGURATIONSPRODUKT - produktcode: Optional[str] = None - leistungskurvendefinition: Optional[str] = None - schaltzeitdefinition: Optional[str] = None + produktcode: str | None = None + leistungskurvendefinition: str | None = None + schaltzeitdefinition: str | None = None marktpartner: Optional["Marktteilnehmer"] = None diff --git a/src/bo4e/com/kontaktweg.py b/src/bo4e/com/kontaktweg.py index 2120a2782..907c5dbf6 100644 --- a/src/bo4e/com/kontaktweg.py +++ b/src/bo4e/com/kontaktweg.py @@ -35,9 +35,9 @@ class Kontaktweg(COM): kontaktart: Optional["Kontaktart"] = None """Gibt die Kontaktart des Kontaktes an.""" - beschreibung: Optional[str] = None + beschreibung: str | None = None """Spezifikation, beispielsweise "Durchwahl", "Sammelnummer" etc.""" - kontaktwert: Optional[str] = None + kontaktwert: str | None = None """Die Nummer oder E-Mail-Adresse.""" - ist_bevorzugter_kontaktweg: Optional[bool] = None + ist_bevorzugter_kontaktweg: bool | None = None """Gibt an, ob es sich um den bevorzugten Kontaktweg handelt.""" diff --git a/src/bo4e/com/konzessionsabgabe.py b/src/bo4e/com/konzessionsabgabe.py index 7d50c4d57..86fff4053 100644 --- a/src/bo4e/com/konzessionsabgabe.py +++ b/src/bo4e/com/konzessionsabgabe.py @@ -37,8 +37,8 @@ class Konzessionsabgabe(COM): satz: Optional["AbgabeArt"] = None """Art der Abgabe""" - kosten: Optional[Decimal] = None + kosten: Decimal | None = None """Konzessionsabgabe in E/kWh""" - kategorie: Optional[str] = None + kategorie: str | None = None """Gebührenkategorie der Konzessionsabgabe""" diff --git a/src/bo4e/com/kostenblock.py b/src/bo4e/com/kostenblock.py index b799c1ce3..37b789021 100644 --- a/src/bo4e/com/kostenblock.py +++ b/src/bo4e/com/kostenblock.py @@ -11,7 +11,6 @@ from .com import COM if TYPE_CHECKING: - from .betrag import Betrag from .kostenposition import Kostenposition @@ -34,13 +33,13 @@ class Kostenblock(COM): typ: Annotated[Literal[ComTyp.KOSTENBLOCK], Field(alias="_typ")] = ComTyp.KOSTENBLOCK - kostenblockbezeichnung: Optional[str] = None + kostenblockbezeichnung: str | None = None """Bezeichnung für einen Kostenblock. Z.B. Netzkosten, Messkosten, Umlagen, etc.""" summe_kostenblock: Optional["Betrag"] = None """Die Summe aller Kostenpositionen dieses Blocks""" - kostenpositionen: Optional[list["Kostenposition"]] = None + kostenpositionen: list["Kostenposition"] | None = None """ Hier sind die Details zu einer Kostenposition aufgeführt. Z.B.: Alliander Netz Heinsberg GmbH, 01.02.2018, 31.12.2018, Arbeitspreis HT, 3.660 kWh, 5,8200 ct/kWh, 213,01 € diff --git a/src/bo4e/com/kostenposition.py b/src/bo4e/com/kostenposition.py index 945966396..b686b0d0d 100644 --- a/src/bo4e/com/kostenposition.py +++ b/src/bo4e/com/kostenposition.py @@ -12,7 +12,6 @@ from .com import COM if TYPE_CHECKING: - from .betrag import Betrag from .menge import Menge from .preis import Preis @@ -36,7 +35,7 @@ class Kostenposition(COM): typ: Annotated[Literal[ComTyp.KOSTENPOSITION], Field(alias="_typ")] = ComTyp.KOSTENPOSITION - positionstitel: Optional[str] = None + positionstitel: str | None = None """Ein Titel für die Zeile. Hier kann z.B. der Netzbetreiber eingetragen werden, wenn es sich um Netzkosten handelt.""" betrag_kostenposition: Optional["Betrag"] = None @@ -44,15 +43,15 @@ class Kostenposition(COM): """ # todo: validate above calculation, see https://github.com/Hochfrequenz/BO4E-python/issues/282 - artikelbezeichnung: Optional[str] = None + artikelbezeichnung: str | None = None """Bezeichnung für den Artikel für den die Kosten ermittelt wurden. Beispiel: Arbeitspreis HT""" einzelpreis: Optional["Preis"] = None """Der Preis für eine Einheit. Beispiele: 5,8200 ct/kWh oder 55 €/Jahr.""" - von: Optional[pydantic.AwareDatetime] = None + von: pydantic.AwareDatetime | None = None """inklusiver von-Zeitpunkt der Kostenzeitscheibe""" - bis: Optional[pydantic.AwareDatetime] = None + bis: pydantic.AwareDatetime | None = None """exklusiver bis-Zeitpunkt der Kostenzeitscheibe""" menge: Optional["Menge"] = None @@ -64,5 +63,5 @@ class Kostenposition(COM): wurden. Z.B. 138 Tage. """ - artikeldetail: Optional[str] = None + artikeldetail: str | None = None """Detaillierung des Artikels (optional). Beispiel: 'Drehstromzähler'""" diff --git a/src/bo4e/com/lastprofil.py b/src/bo4e/com/lastprofil.py index 9771eda78..924e12c1e 100644 --- a/src/bo4e/com/lastprofil.py +++ b/src/bo4e/com/lastprofil.py @@ -2,7 +2,7 @@ Contains class Lastprofil """ -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -28,12 +28,10 @@ class Lastprofil(COM): typ: Annotated[Literal[ComTyp.LASTPROFIL], Field(alias="_typ")] = ComTyp.LASTPROFIL - bezeichnung: Optional[str] = None #: Bezeichnung des Profils, durch DVGW bzw. den Netzbetreiber vergeben (z.B. H0) - profilschar: Optional[str] = ( - None #: Bezeichnung der Profilschar, durch DVGW bzw. den Netzbetreiber vergeben (z.B. H0) - ) - verfahren: Optional[Profilverfahren] = None #: Verfahren des Profils (analytisch oder synthetisch) - ist_einspeisung: Optional[bool] = None #: Einspeiseprofil: True/False - tagesparameter: Optional[Tagesparameter] = None #: Klimazone / Temperaturmessstelle - profilart: Optional[Profilart] = None #: Profilart des Lastprofils, e.g. ART_STANDARDLASTPROFIL - herausgeber: Optional[str] = None #: Herausgeber des Lastprofil-Codes, e.g. BDEW + bezeichnung: str | None = None #: Bezeichnung des Profils, durch DVGW bzw. den Netzbetreiber vergeben (z.B. H0) + profilschar: str | None = None #: Bezeichnung der Profilschar, durch DVGW bzw. den Netzbetreiber vergeben (z.B. H0) + verfahren: Profilverfahren | None = None #: Verfahren des Profils (analytisch oder synthetisch) + ist_einspeisung: bool | None = None #: Einspeiseprofil: True/False + tagesparameter: Tagesparameter | None = None #: Klimazone / Temperaturmessstelle + profilart: Profilart | None = None #: Profilart des Lastprofils, e.g. ART_STANDARDLASTPROFIL + herausgeber: str | None = None #: Herausgeber des Lastprofil-Codes, e.g. BDEW diff --git a/src/bo4e/com/lastvariablepreisposition.py b/src/bo4e/com/lastvariablepreisposition.py index cd1e20c24..987ece06b 100644 --- a/src/bo4e/com/lastvariablepreisposition.py +++ b/src/bo4e/com/lastvariablepreisposition.py @@ -36,7 +36,7 @@ class LastvariablePreisposition(COM): typ: Annotated[Literal[ComTyp.LASTVARIABLEPREISPOSITION], Field(alias="_typ")] = ComTyp.LASTVARIABLEPREISPOSITION - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Eine (beliebige) Bezeichnung für die Preisposition.""" preisreferenz: Optional["Preisreferenz"] = None """ @@ -51,5 +51,5 @@ class LastvariablePreisposition(COM): """Die Einheit, in denen die Staffelgrenzen in den Preisstaffeln angegeben sind.""" tarifkalkulationsmethode: Optional["Tarifkalkulationsmethode"] = None """Das Modell, das der Preisbildung zugrunde liegt""" - preisstaffeln: Optional[list["Preisstaffel"]] = None + preisstaffeln: list["Preisstaffel"] | None = None """Preisstaffeln, die zu dieser Preisposition gehören""" diff --git a/src/bo4e/com/marktgebietinfo.py b/src/bo4e/com/marktgebietinfo.py index cbbca784e..e9479c51d 100644 --- a/src/bo4e/com/marktgebietinfo.py +++ b/src/bo4e/com/marktgebietinfo.py @@ -2,7 +2,7 @@ Contains Marktgebietinfo class """ -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -29,7 +29,7 @@ class MarktgebietInfo(COM): typ: Annotated[Literal[ComTyp.MARKTGEBIETINFO], Field(alias="_typ")] = ComTyp.MARKTGEBIETINFO - marktgebiet: Optional[str] = None + marktgebiet: str | None = None """Der Name des Marktgebietes""" - marktgebietcode: Optional[str] = None + marktgebietcode: str | None = None """Die standardisierte Codenummer des Marktgebietes""" diff --git a/src/bo4e/com/menge.py b/src/bo4e/com/menge.py index 9ac22a94f..0550049f7 100644 --- a/src/bo4e/com/menge.py +++ b/src/bo4e/com/menge.py @@ -34,7 +34,7 @@ class Menge(COM): typ: Annotated[Literal[ComTyp.MENGE], Field(alias="_typ")] = ComTyp.MENGE - wert: Optional[Decimal] = None + wert: Decimal | None = None """Gibt den absoluten Wert der Menge an""" einheit: Optional["Mengeneinheit"] = None """Gibt die Einheit zum jeweiligen Wert an""" diff --git a/src/bo4e/com/messwert.py b/src/bo4e/com/messwert.py index 869dc85ac..5ea0efe8e 100644 --- a/src/bo4e/com/messwert.py +++ b/src/bo4e/com/messwert.py @@ -37,7 +37,7 @@ class Messwert(COM): """Gibt den Status des Messwerts an.""" messwertstatuszusatz: Optional["Messwertstatuszusatz"] = None """Gibt den Status Zusatz des Messwerts an.""" - zeitpunkt: Optional[pydantic.AwareDatetime] = None + zeitpunkt: pydantic.AwareDatetime | None = None """Gibt den Zeitpunkt des Messwerts an.""" wert: Optional["Menge"] = None """Gibt die gemessene Menge an.""" diff --git a/src/bo4e/com/preis.py b/src/bo4e/com/preis.py index 24868c060..f4abf486d 100644 --- a/src/bo4e/com/preis.py +++ b/src/bo4e/com/preis.py @@ -36,7 +36,7 @@ class Preis(COM): typ: Annotated[Literal[ComTyp.PREIS], Field(alias="_typ")] = ComTyp.PREIS - wert: Optional[Decimal] = None + wert: Decimal | None = None """Gibt die nominale Höhe des Preises an.""" einheit: Optional["Waehrungseinheit"] = None """Währungseinheit für den Preis, z.B. Euro oder Ct.""" diff --git a/src/bo4e/com/preisgarantie.py b/src/bo4e/com/preisgarantie.py index afefd613c..466097d22 100644 --- a/src/bo4e/com/preisgarantie.py +++ b/src/bo4e/com/preisgarantie.py @@ -40,5 +40,5 @@ class Preisgarantie(COM): oder als Laufzeit in Monaten. """ # optionale attributes - beschreibung: Optional[str] = None + beschreibung: str | None = None """Freitext zur Beschreibung der Preisgarantie.""" diff --git a/src/bo4e/com/preisposition.py b/src/bo4e/com/preisposition.py index e3504be8e..435b22d4f 100644 --- a/src/bo4e/com/preisposition.py +++ b/src/bo4e/com/preisposition.py @@ -45,14 +45,14 @@ class Preisposition(COM): berechnungsmethode: Optional["Kalkulationsmethode"] = None """Das Modell, das der Preisbildung zugrunde liegt""" leistungstyp: Optional["Leistungstyp"] = None - """Standardisierte Bezeichnung für die abgerechnete Leistungserbringung""" # - leistungsbezeichnung: Optional[str] = None + """Standardisierte Bezeichnung für die abgerechnete Leistungserbringung""" + leistungsbezeichnung: str | None = None """Bezeichnung für die in der Position abgebildete Leistungserbringung""" preiseinheit: Optional["Waehrungseinheit"] = None """Festlegung, mit welcher Preiseinheit abgerechnet wird, z.B. Ct. oder €""" bezugsgroesse: Optional["Mengeneinheit"] = None """Hier wird festgelegt, auf welche Bezugsgrösse sich der Preis bezieht, z.B. kWh oder Stück""" - preisstaffeln: Optional[list["Preisstaffel"]] = None + preisstaffeln: list["Preisstaffel"] | None = None """Preisstaffeln, die zu dieser Preisposition gehören""" zeitbasis: Optional["Mengeneinheit"] = None @@ -69,14 +69,14 @@ class Preisposition(COM): """ zonungsgroesse: Optional["Bemessungsgroesse"] = None """Mit der Menge der hier angegebenen Größe wird die Staffelung/Zonung durchgeführt. Z.B. Vollbenutzungsstunden""" - freimenge_blindarbeit: Optional[Decimal] = None + freimenge_blindarbeit: Decimal | None = None """Der Anteil der Menge der Blindarbeit in Prozent von der Wirkarbeit, für die keine Abrechnung erfolgt""" - freimenge_leistungsfaktor: Optional[Decimal] = None + freimenge_leistungsfaktor: Decimal | None = None """ Der cos phi (Verhältnis Wirkleistung/Scheinleistung) aus dem die Freimenge für die Blindarbeit berechnet wird als tan phi (Verhältnis Blindleistung/Wirkleistung) """ - gruppenartikel_id: Optional[str] = None + gruppenartikel_id: str | None = None """ Übergeordnete Gruppen-ID, die sich ggf. auf die Artikel-ID in der Preisstaffel bezieht """ diff --git a/src/bo4e/com/preisstaffel.py b/src/bo4e/com/preisstaffel.py index 9731b8f8c..37da8bd7b 100644 --- a/src/bo4e/com/preisstaffel.py +++ b/src/bo4e/com/preisstaffel.py @@ -12,7 +12,6 @@ from .com import COM if TYPE_CHECKING: - from .sigmoidparameter import Sigmoidparameter # pylint: disable=too-few-public-methods @@ -34,17 +33,17 @@ class Preisstaffel(COM): typ: Annotated[Literal[ComTyp.PREISSTAFFEL], Field(alias="_typ")] = ComTyp.PREISSTAFFEL - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Eine (beliebige) Bezeichnung für die Preisstaffel.""" - preis: Optional[Decimal] = None + preis: Decimal | None = None """Preis pro abgerechneter Mengeneinheit. Die Mengeneinheit wird durch das übergeordnete Objekt angegeben.""" - staffelgrenze_von: Optional[Decimal] = None + staffelgrenze_von: Decimal | None = None """ Inklusiver unterer Wert, ab dem die Staffel gilt (inklusiv). Grenzen werden bspw. wie folgt angegeben: `0 - 1000, 1001 - 2000, etc.` Werte zwischen den Grenzen (z.B. `1000,6`) rutschen in die obere Zone / Staffel. """ - staffelgrenze_bis: Optional[Decimal] = None + staffelgrenze_bis: Decimal | None = None """ Exklusiver oberer Wert, bis zu dem die Staffel gilt (inklusiv). Grenzen werden bspw. wie folgt angegeben: `0 - 1000, 1001 - 2000, etc.` @@ -52,7 +51,7 @@ class Preisstaffel(COM): """ sigmoidparameter: Optional["Sigmoidparameter"] = None """Parameter zur Berechnung des Preises anhand der Jahresmenge und weiterer netzbezogener Parameter""" - artikel_id: Optional[str] = None + artikel_id: str | None = None """ Standardisierte vom BDEW herausgegebene Liste, welche im Strommarkt die BDEW-Artikelnummer ablöst. """ diff --git a/src/bo4e/com/rechnungsposition.py b/src/bo4e/com/rechnungsposition.py index 52b85d0e2..b195513f9 100644 --- a/src/bo4e/com/rechnungsposition.py +++ b/src/bo4e/com/rechnungsposition.py @@ -38,13 +38,13 @@ class Rechnungsposition(COM): typ: Annotated[Literal[ComTyp.RECHNUNGSPOSITION], Field(alias="_typ")] = ComTyp.RECHNUNGSPOSITION - positionsnummer: Optional[int] = None + positionsnummer: int | None = None """Fortlaufende Nummer für die Rechnungsposition""" lieferungszeitraum: Optional["Zeitraum"] = None """Zeitraum der Lieferung für die abgerechnete Leistung""" - positionstext: Optional[str] = None + positionstext: str | None = None """Bezeichung für die abgerechnete Position""" positions_menge: Optional["Menge"] = None @@ -62,7 +62,7 @@ class Rechnungsposition(COM): artikelnummer: Optional["BDEWArtikelnummer"] = None """Kennzeichnung der Rechnungsposition mit der Standard-Artikelnummer des BDEW""" - artikel_id: Optional[str] = None + artikel_id: str | None = None """Standardisierte vom BDEW herausgegebene Liste, welche im Strommarkt die BDEW-Artikelnummer ablöst""" steuerbetrag: Optional["Steuerbetrag"] = None """Auf die Position entfallende Steuer, bestehend aus Steuersatz und Betrag""" diff --git a/src/bo4e/com/regionsoperation.py b/src/bo4e/com/regionsoperation.py index 87c8fce5f..a9c19aaf0 100644 --- a/src/bo4e/com/regionsoperation.py +++ b/src/bo4e/com/regionsoperation.py @@ -40,20 +40,20 @@ class Regionsoperation(COM): typ: Annotated[Literal[ComTyp.REGIONSOPERATION], Field(alias="_typ")] = ComTyp.REGIONSOPERATION regionsoperator: Optional["Operator"] = None - prioritaet: Optional[int] = None + prioritaet: int | None = None """ Priorität dieser Regionsoperation. Theoretisch sind Listen in JSON sortiert, jedoch ist eine solche Sortierung eventuell implementierungsbedingt fehleranfällig. Daher nutzen wir dieses Feld. angefangen bei 1 (höchste Priorität) und aufsteigend """ - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """(auch IDs und PLZ möglich)""" - bezeichnung2: Optional[str] = None + bezeichnung2: str | None = None """(TODO: bessere Benamung! geht vor allem um Postort: PLZ & Ort als Schnittmenge)""" - wert_von: Optional[str] = None + wert_von: str | None = None """(inklusiv)""" - wert_bis: Optional[str] = None + wert_bis: str | None = None """(inklusiv)""" - radius_in_km: Optional[Decimal] = None + radius_in_km: Decimal | None = None """(inklusiv)""" regionskriterium: Optional["Regionskriterium"] = None """(ehemals Regionskriteriumtyp)]""" diff --git a/src/bo4e/com/regionspreis.py b/src/bo4e/com/regionspreis.py index e7febe710..3e328a303 100644 --- a/src/bo4e/com/regionspreis.py +++ b/src/bo4e/com/regionspreis.py @@ -4,7 +4,7 @@ # pylint: disable=too-few-public-methods # pylint: disable=no-name-in-module -from typing import TYPE_CHECKING, Annotated, Literal, Optional +from typing import TYPE_CHECKING, Annotated, Literal from pydantic import Field @@ -34,12 +34,12 @@ class Regionspreis(COM): typ: Annotated[Literal[ComTyp.REGIONSPREIS], Field(alias="_typ")] = ComTyp.REGIONSPREIS - regionszeitscheiben: Optional[list["Regionszeitscheibe"]] = None + regionszeitscheiben: list["Regionszeitscheibe"] | None = None """ Eine Liste von mit Zeitscheiben versehenen Regionen. Die Zeitscheiben sollten sich nicht überschneiden. """ - tarifpreiszeitscheiben: Optional[list["Tarifpreiszeitscheibe"]] = None + tarifpreiszeitscheiben: list["Tarifpreiszeitscheibe"] | None = None """ Eine Liste von mit Zeitscheiben versehenen Tarifpreisen. Die Zeitscheiben sollten sich nicht überschneiden. diff --git a/src/bo4e/com/relativepreisposition.py b/src/bo4e/com/relativepreisposition.py index ab1189b5c..a606bf529 100644 --- a/src/bo4e/com/relativepreisposition.py +++ b/src/bo4e/com/relativepreisposition.py @@ -6,7 +6,7 @@ # pylint: disable=too-few-public-methods # pylint: disable=no-name-in-module -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -31,9 +31,9 @@ class RelativePreisposition(COM): typ: Annotated[Literal[ComTyp.RELATIVEPREISPOSITION], Field(alias="_typ")] = ComTyp.RELATIVEPREISPOSITION - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Eine (beliebige) Bezeichnung für die Preisposition.""" - id_referenz: Optional[str] = None + id_referenz: str | None = None """ Referenziert auf eine andere Preisposition. Die Referenz bezieht sich auf das technische Feld `_id`, da es sich hier um eine technische Lösung handelt @@ -41,7 +41,7 @@ class RelativePreisposition(COM): Das `_id` Feld der unterschiedlichen Preispositionen muss innerhalb einer `Tarifpreiszeitscheibe` entsprechend unique sein. """ - wert: Optional[Decimal] = None + wert: Decimal | None = None """ Der Modifikator in Prozent, der auf den Preis der referenzierten Preisposition angewendet wird. Der Wert wird multiplikativ angewendet. D.h. wenn bspw. ein Rabatt von 20% angewendet werden soll, muss der Wert diff --git a/src/bo4e/com/sigmoidparameter.py b/src/bo4e/com/sigmoidparameter.py index 464c16f6e..2ad9032b1 100644 --- a/src/bo4e/com/sigmoidparameter.py +++ b/src/bo4e/com/sigmoidparameter.py @@ -3,7 +3,7 @@ """ from decimal import Decimal -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -31,11 +31,11 @@ class Sigmoidparameter(COM): typ: Annotated[Literal[ComTyp.SIGMOIDPARAMETER], Field(alias="_typ")] = ComTyp.SIGMOIDPARAMETER - A: Optional[Decimal] = None + A: Decimal | None = None """Briefmarke Ortsverteilnetz (EUR/kWh)""" - B: Optional[Decimal] = None + B: Decimal | None = None """Wendepunkt für die bepreiste Menge (kW)""" - C: Optional[Decimal] = None + C: Decimal | None = None """Exponent (einheitenlos)""" - D: Optional[Decimal] = None + D: Decimal | None = None """Briefmarke Transportnetz (EUR/kWh)""" diff --git a/src/bo4e/com/standorteigenschaftengas.py b/src/bo4e/com/standorteigenschaftengas.py index 31bab7117..da636cc20 100644 --- a/src/bo4e/com/standorteigenschaftengas.py +++ b/src/bo4e/com/standorteigenschaftengas.py @@ -2,7 +2,7 @@ Contains StandorteigenschaftenGas class """ -from typing import TYPE_CHECKING, Annotated, Literal, Optional +from typing import TYPE_CHECKING, Annotated, Literal from pydantic import Field @@ -11,7 +11,6 @@ from .com import COM if TYPE_CHECKING: - from .marktgebietinfo import MarktgebietInfo # pylint: disable=too-few-public-methods @@ -33,7 +32,7 @@ class StandorteigenschaftenGas(COM): """ typ: Annotated[Literal[ComTyp.STANDORTEIGENSCHAFTENGAS], Field(alias="_typ")] = ComTyp.STANDORTEIGENSCHAFTENGAS - netzkontonummern: Optional[list[str]] = None + netzkontonummern: list[str] | None = None """Netzkontonummern der Gasnetze""" - marktgebiete: Optional[list["MarktgebietInfo"]] = None + marktgebiete: list["MarktgebietInfo"] | None = None """Die Informationen zu Marktgebieten in dem Netz.""" diff --git a/src/bo4e/com/standorteigenschaftenstrom.py b/src/bo4e/com/standorteigenschaftenstrom.py index e8aebeecf..4c49fad4d 100644 --- a/src/bo4e/com/standorteigenschaftenstrom.py +++ b/src/bo4e/com/standorteigenschaftenstrom.py @@ -2,7 +2,7 @@ Contains StandorteigenschaftenStrom class """ -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -28,13 +28,13 @@ class StandorteigenschaftenStrom(COM): """ typ: Annotated[Literal[ComTyp.STANDORTEIGENSCHAFTENSTROM], Field(alias="_typ")] = ComTyp.STANDORTEIGENSCHAFTENSTROM - bilanzierungsgebiet_eic: Optional[str] = None + bilanzierungsgebiet_eic: str | None = None """Die EIC-Nummer des Bilanzierungsgebietes""" # todo: use EIC validation: https://github.com/Hochfrequenz/BO4E-python/issues/147 - regelzone: Optional[str] = None + regelzone: str | None = None """Der Name der Regelzone""" - regelzone_eic: Optional[str] = None + regelzone_eic: str | None = None """De EIC-Nummer der Regelzone""" # todo: use EIC validation: https://github.com/Hochfrequenz/BO4E-python/issues/147 diff --git a/src/bo4e/com/steuerbetrag.py b/src/bo4e/com/steuerbetrag.py index 493db2ae1..f14d88d6f 100644 --- a/src/bo4e/com/steuerbetrag.py +++ b/src/bo4e/com/steuerbetrag.py @@ -37,11 +37,11 @@ class Steuerbetrag(COM): steuerart: Optional["Steuerart"] = None """Kennzeichnung der Steuerart, bzw. Verfahrens.""" - steuersatz: Optional[Decimal] = None + steuersatz: Decimal | None = None """Angabe des Steuersatzes in %""" - basiswert: Optional[Decimal] = None + basiswert: Decimal | None = None """Nettobetrag für den die Steuer berechnet wurde. Z.B. 100""" - steuerwert: Optional[Decimal] = None + steuerwert: Decimal | None = None """Aus dem Basiswert berechnete Steuer. Z.B. 19 (bei UST_19)""" waehrungscode: Optional["Waehrungscode"] = None """Währung. Z.B. Euro.""" diff --git a/src/bo4e/com/tagesparameter.py b/src/bo4e/com/tagesparameter.py index 95c6db601..1541203ff 100644 --- a/src/bo4e/com/tagesparameter.py +++ b/src/bo4e/com/tagesparameter.py @@ -2,7 +2,7 @@ Contains tagesparameter class """ -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -19,7 +19,7 @@ class Tagesparameter(COM): typ: Annotated[Literal[ComTyp.TAGESPARAMETER], Field(alias="_typ")] = ComTyp.TAGESPARAMETER - klimazone: Optional[str] = None #: Qualifier der Klimazone, e.g. 7624q - temperaturmessstelle: Optional[str] = None #: Qualifier der Temperaturmessstelle, e.g. 1234x - dienstanbieter: Optional[str] = None #: Dienstanbieter (bei Temperaturmessstellen), e.g. ZT1 - herausgeber: Optional[str] = None #: Herausgeber des Lastprofil-Codes, e.g. BDEW + klimazone: str | None = None #: Qualifier der Klimazone, e.g. 7624q + temperaturmessstelle: str | None = None #: Qualifier der Temperaturmessstelle, e.g. 1234x + dienstanbieter: str | None = None #: Dienstanbieter (bei Temperaturmessstellen), e.g. ZT1 + herausgeber: str | None = None #: Herausgeber des Lastprofil-Codes, e.g. BDEW diff --git a/src/bo4e/com/tarifberechnungsparameter.py b/src/bo4e/com/tarifberechnungsparameter.py index 5cd3d9bd2..5874974ae 100644 --- a/src/bo4e/com/tarifberechnungsparameter.py +++ b/src/bo4e/com/tarifberechnungsparameter.py @@ -41,10 +41,10 @@ class Tarifberechnungsparameter(COM): berechnungsmethode: Optional["Tarifkalkulationsmethode"] = None """Gibt an, wie die Einzelpreise des Tarifes zu verarbeiten sind""" - ist_messpreis_in_grundpreis_enthalten: Optional[bool] = None + ist_messpreis_in_grundpreis_enthalten: bool | None = None """True, falls der Messpreis im Grundpreis (GP) enthalten ist""" - ist_messpreis_zu_beruecksichtigen: Optional[bool] = None + ist_messpreis_zu_beruecksichtigen: bool | None = None """ True, falls bei der Bildung des Durchschnittspreises für die Höchst- und Mindestpreisbetrachtung der Messpreis mit berücksichtigt wird @@ -53,11 +53,11 @@ class Tarifberechnungsparameter(COM): messpreistyp: Optional["Messpreistyp"] = None """Typ des Messpreises""" - kw_inklusive: Optional[Decimal] = None + kw_inklusive: Decimal | None = None """Im Preis bereits eingeschlossene Leistung (für Gas)""" # todo: type decimal is most likely wrong: https://github.com/Hochfrequenz/BO4E-python/issues/327 - kw_weitere_mengen: Optional[Decimal] = None + kw_weitere_mengen: Decimal | None = None """Intervall, indem die über "kwInklusive" hinaus abgenommene Leistung kostenpflichtig wird (z.B. je 5 kW 20 EURO)""" # todo: type decimal is most likely wrong: https://github.com/Hochfrequenz/BO4E-python/issues/327 @@ -67,5 +67,5 @@ class Tarifberechnungsparameter(COM): """Höchstpreis für den Durchschnitts-Arbeitspreis HT""" mindestpreis: Optional["Preis"] = None """Mindestpreis für den Durchschnitts-Arbeitspreis""" - zusatzpreise: Optional[list["Tarifpreis"]] = None + zusatzpreise: list["Tarifpreis"] | None = None """Liste mit zusätzlichen Preisen, beispielsweise Messpreise und/oder Leistungspreise""" diff --git a/src/bo4e/com/tarifeinschraenkung.py b/src/bo4e/com/tarifeinschraenkung.py index 9f593ec72..c7d3c5e7d 100644 --- a/src/bo4e/com/tarifeinschraenkung.py +++ b/src/bo4e/com/tarifeinschraenkung.py @@ -2,7 +2,7 @@ Contains Tarifeinschraenkung """ -from typing import TYPE_CHECKING, Annotated, Literal, Optional +from typing import TYPE_CHECKING, Annotated, Literal from pydantic import Field @@ -34,13 +34,13 @@ class Tarifeinschraenkung(COM): typ: Annotated[Literal[ComTyp.TARIFEINSCHRAENKUNG], Field(alias="_typ")] = ComTyp.TARIFEINSCHRAENKUNG - zusatzprodukte: Optional[list[str]] = None + zusatzprodukte: list[str] | None = None """Weitere Produkte, die gemeinsam mit diesem Tarif bestellt werden können""" - voraussetzungen: Optional[list["Voraussetzungen"]] = None + voraussetzungen: list["Voraussetzungen"] | None = None """Voraussetzungen, die erfüllt sein müssen, damit dieser Tarif zur Anwendung kommen kann""" - einschraenkungzaehler: Optional[list["Geraet"]] = None + einschraenkungzaehler: list["Geraet"] | None = None """ Liste der Zähler/Geräte, die erforderlich sind, damit dieser Tarif zur Anwendung gelangen kann. (Falls keine Zähler angegeben sind, ist der Tarif nicht an das Vorhandensein bestimmter Zähler gebunden.) """ - einschraenkungleistung: Optional[list["Menge"]] = None + einschraenkungleistung: list["Menge"] | None = None """ Die vereinbarte Leistung, die (näherungsweise) abgenommen wird. Insbesondere Gastarife können daran gebunden sein, dass die Leistung einer vereinbarten Höhe entspricht. """ diff --git a/src/bo4e/com/tarifpreis.py b/src/bo4e/com/tarifpreis.py index be1eadeff..940979ea1 100644 --- a/src/bo4e/com/tarifpreis.py +++ b/src/bo4e/com/tarifpreis.py @@ -36,5 +36,5 @@ class Tarifpreis(Preis): preistyp: Optional["Preistyp"] = None """ Angabe des Preistypes (z.B. Grundpreis)""" - beschreibung: Optional[str] = None + beschreibung: str | None = None """ Beschreibung des Preises. Hier können z.B. Preisdetails angegeben sein, beispielsweise "Drehstromzähler".""" diff --git a/src/bo4e/com/tarifpreisposition.py b/src/bo4e/com/tarifpreisposition.py index e48bd82a0..e8d229ca6 100644 --- a/src/bo4e/com/tarifpreisposition.py +++ b/src/bo4e/com/tarifpreisposition.py @@ -41,7 +41,7 @@ class Tarifpreisposition(COM): """Einheit des Preises (z.B. EURO)""" bezugseinheit: Optional["Mengeneinheit"] = None """Größe, auf die sich die Einheit bezieht, beispielsweise kWh, Jahr""" - preisstaffeln: Optional[list["Preisstaffel"]] = None + preisstaffeln: list["Preisstaffel"] | None = None """Hier sind die Staffeln mit ihren Preisenangaben definiert""" mengeneinheitstaffel: Optional["Mengeneinheit"] = None diff --git a/src/bo4e/com/tarifpreiszeitscheibe.py b/src/bo4e/com/tarifpreiszeitscheibe.py index e71ded4ee..f187a6074 100644 --- a/src/bo4e/com/tarifpreiszeitscheibe.py +++ b/src/bo4e/com/tarifpreiszeitscheibe.py @@ -39,19 +39,19 @@ class Tarifpreiszeitscheibe(COM): zeitscheibengueltigkeit: Optional["Zeitraum"] = None """Gibt an für welchen Zeitraum dieser zusammengesetzte Tarifpreis gültig ist.""" - einheits_preispositionen: Optional[list["EinheitsPreisposition"]] = None + einheits_preispositionen: list["EinheitsPreisposition"] | None = None """Eine Liste von Einheits-Preispositionen.""" - zeitvariable_preispositionen: Optional[list["ZeitvariablePreisposition"]] = None + zeitvariable_preispositionen: list["ZeitvariablePreisposition"] | None = None """ Eine Liste von zeitvariablen Preispositionen. Dies können z.B. Preispositionen mit Zählzeitdefinitionen sein, um ein klassisches HT/NT Modell abzubilden. """ - lastvariable_preispositionen: Optional[list["LastvariablePreisposition"]] = None + lastvariable_preispositionen: list["LastvariablePreisposition"] | None = None """ Eine Liste von lastvariablen Preispositionen. Diese Preispositionen sind vorgesehen, um bspw. ein Staffel- oder Zonenmodell abzubilden. """ - relative_preispositionen: Optional[list["RelativePreisposition"]] = None + relative_preispositionen: list["RelativePreisposition"] | None = None """ Eine Liste von relativen Preispositionen. Diese Preispositionen modellieren prozentuale Modifikationen auf bestehende Preispositionen. diff --git a/src/bo4e/com/umschaltzeit.py b/src/bo4e/com/umschaltzeit.py index 7f4dbf9cb..be66f3ded 100644 --- a/src/bo4e/com/umschaltzeit.py +++ b/src/bo4e/com/umschaltzeit.py @@ -6,7 +6,7 @@ # pylint: disable=too-few-public-methods # pylint: disable=no-name-in-module -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -31,7 +31,7 @@ class Umschaltzeit(COM): typ: Annotated[Literal[ComTyp.UMSCHALTZEIT], Field(alias="_typ")] = ComTyp.UMSCHALTZEIT - umschaltzeit: Optional[time] = None + umschaltzeit: time | None = None """Definiert den Zeitpunkt ab dem auf das Register geschaltet wird, das im Feld `registercode` spezifiziert ist.""" - registercode: Optional[str] = None + registercode: str | None = None """Ein Code, der ein Register spezifiziert. Typischerweise eine 3-stellige Zeichenkette.""" diff --git a/src/bo4e/com/unterschrift.py b/src/bo4e/com/unterschrift.py index 4789d492d..a9555cbee 100644 --- a/src/bo4e/com/unterschrift.py +++ b/src/bo4e/com/unterschrift.py @@ -2,7 +2,7 @@ Contains Unterschrift class """ -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal import pydantic from pydantic import Field @@ -30,10 +30,10 @@ class Unterschrift(COM): typ: Annotated[Literal[ComTyp.UNTERSCHRIFT], Field(alias="_typ")] = ComTyp.UNTERSCHRIFT - name: Optional[str] = None + name: str | None = None """Name des Unterschreibers""" - ort: Optional[str] = None + ort: str | None = None """Ort, an dem die Unterschrift geleistet wird""" - datum: Optional[pydantic.AwareDatetime] = None + datum: pydantic.AwareDatetime | None = None """Datum der Unterschrift""" diff --git a/src/bo4e/com/vertragskonditionen.py b/src/bo4e/com/vertragskonditionen.py index acb852ca9..7b5e6b28c 100644 --- a/src/bo4e/com/vertragskonditionen.py +++ b/src/bo4e/com/vertragskonditionen.py @@ -12,7 +12,6 @@ from .com import COM if TYPE_CHECKING: - from .zeitraum import Zeitraum # pylint: disable=too-few-public-methods @@ -34,11 +33,11 @@ class Vertragskonditionen(COM): typ: Annotated[Literal[ComTyp.VERTRAGSKONDITIONEN], Field(alias="_typ")] = ComTyp.VERTRAGSKONDITIONEN - beschreibung: Optional[str] = None + beschreibung: str | None = None """ Freitext zur Beschreibung der Konditionen, z.B. "Standardkonditionen Gas" """ - anzahl_abschlaege: Optional[Decimal] = None + anzahl_abschlaege: Decimal | None = None """Anzahl der vereinbarten Abschläge pro Jahr, z.B. 12""" vertragslaufzeit: Optional["Zeitraum"] = None """Über diesen Zeitraum läuft der Vertrag""" diff --git a/src/bo4e/com/vertragsteil.py b/src/bo4e/com/vertragsteil.py index 9243df22c..d6323370b 100644 --- a/src/bo4e/com/vertragsteil.py +++ b/src/bo4e/com/vertragsteil.py @@ -12,7 +12,6 @@ from .com import COM if TYPE_CHECKING: - from .menge import Menge # pylint: disable=too-few-public-methods @@ -35,16 +34,16 @@ class Vertragsteil(COM): typ: Annotated[Literal[ComTyp.VERTRAGSTEIL], Field(alias="_typ")] = ComTyp.VERTRAGSTEIL - vertragsteilbeginn: Optional[pydantic.AwareDatetime] = None + vertragsteilbeginn: pydantic.AwareDatetime | None = None """ Start der Gültigkeit des Vertragsteils (inklusiv) """ - vertragsteilende: Optional[pydantic.AwareDatetime] = None + vertragsteilende: pydantic.AwareDatetime | None = None """ Ende der Gültigkeit des Vertragsteils (exklusiv) """ - lokation: Optional[str] = None + lokation: str | None = None """ Der Identifier für diejenigen Markt- oder Messlokation, die zu diesem Vertragsteil gehören. Verträge für mehrere Lokationen werden mit mehreren Vertragsteilen abgebildet diff --git a/src/bo4e/com/verwendungszweckpromarktrolle.py b/src/bo4e/com/verwendungszweckpromarktrolle.py index 935b054f3..8ec9a83c4 100644 --- a/src/bo4e/com/verwendungszweckpromarktrolle.py +++ b/src/bo4e/com/verwendungszweckpromarktrolle.py @@ -40,7 +40,7 @@ class VerwendungszweckProMarktrolle(COM): """ Marktrolle, für die die Daten relevant sind """ - Zwecke: Optional[list["Verwendungszweck"]] = None + Zwecke: list["Verwendungszweck"] | None = None """ Verwendungszwecke """ diff --git a/src/bo4e/com/vorauszahlung.py b/src/bo4e/com/vorauszahlung.py index 113ba7fd1..3ddb9840e 100644 --- a/src/bo4e/com/vorauszahlung.py +++ b/src/bo4e/com/vorauszahlung.py @@ -34,5 +34,5 @@ class Vorauszahlung(COM): typ: Annotated[Literal[ComTyp.VORAUSZAHLUNG], Field(alias="_typ")] = ComTyp.VORAUSZAHLUNG betrag: Optional["Betrag"] = None - datum: Optional[AwareDatetime] = None - referenz: Optional[str] = None + datum: AwareDatetime | None = None + referenz: str | None = None diff --git a/src/bo4e/com/zaehlwerk.py b/src/bo4e/com/zaehlwerk.py index 659fcb920..d3672a4cb 100644 --- a/src/bo4e/com/zaehlwerk.py +++ b/src/bo4e/com/zaehlwerk.py @@ -38,30 +38,30 @@ class Zaehlwerk(COM): typ: Annotated[Literal[ComTyp.ZAEHLWERK], Field(alias="_typ")] = ComTyp.ZAEHLWERK - zaehlwerk_id: Optional[str] = None + zaehlwerk_id: str | None = None """ Identifikation des Zählwerks (Registers) innerhalb des Zählers. Oftmals eine laufende Nummer hinter der Zählernummer. Z.B. 47110815_1 """ - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Zusätzliche Bezeichnung, z.B. Zählwerk_Wirkarbeit.""" richtung: Optional["Energierichtung"] = None """Die Energierichtung, Einspeisung oder Ausspeisung.""" - obis_kennzahl: Optional[str] = None + obis_kennzahl: str | None = None """ Die OBIS-Kennzahl für das Zählwerk, die festlegt, welche auf die gemessene Größe mit dem Stand gemeldet wird. Nur Zählwerkstände mit dieser OBIS-Kennzahl werden an diesem Zählwerk registriert. """ - wandlerfaktor: Optional[Decimal] = None + wandlerfaktor: Decimal | None = None """ Mit diesem Faktor wird eine Zählerstandsdifferenz multipliziert, um zum eigentlichen Verbrauch im Zeitraum zu kommen. """ einheit: Optional["Mengeneinheit"] = None """Die Einheit der gemessenen Größe, z.B. kWh""" - ist_schwachlastfaehig: Optional[bool] = None + ist_schwachlastfaehig: bool | None = None """Schwachlastfaehigkeit""" - verwendungszwecke: Optional[list["VerwendungszweckProMarktrolle"]] = None + verwendungszwecke: list["VerwendungszweckProMarktrolle"] | None = None """Verwendungungszweck der Werte Marktlokation""" verbrauchsart: Optional["Verbrauchsart"] = None """Stromverbrauchsart/Verbrauchsart Marktlokation""" @@ -69,17 +69,17 @@ class Zaehlwerk(COM): """Wärmenutzung Marktlokation""" konzessionsabgabe: Optional["Konzessionsabgabe"] = None """Konzessionsabgabe""" - ist_steuerbefreit: Optional[bool] = None + ist_steuerbefreit: bool | None = None """Steuerbefreiung""" - vorkommastelle: Optional[int] = None + vorkommastelle: int | None = None """Anzahl der Vorkommastellen""" - nachkommastelle: Optional[int] = None + nachkommastelle: int | None = None """Anzahl der Nachkommastellen""" - ist_abrechnungsrelevant: Optional[bool] = None + ist_abrechnungsrelevant: bool | None = None """Abrechnungsrelevant""" - anzahlAblesungen: Optional[int] = None + anzahlAblesungen: int | None = None # noqa: N815 (pre-existing public field name) """Anzahl Ablesungen pro Jahr""" zaehlzeitregister: Optional["Zaehlzeitregister"] = None """Erweiterte Definition der Zählzeit in Bezug auf ein Register""" - messwerte: Optional[list["Messwert"]] = None + messwerte: list["Messwert"] | None = None """Gemessene Werte des Zählwerks""" diff --git a/src/bo4e/com/zaehlzeitregister.py b/src/bo4e/com/zaehlzeitregister.py index f11e4df4d..48198a244 100644 --- a/src/bo4e/com/zaehlzeitregister.py +++ b/src/bo4e/com/zaehlzeitregister.py @@ -2,7 +2,7 @@ Contains Zaehlzeitregister class """ -from typing import Annotated, Literal, Optional +from typing import Annotated, Literal from pydantic import Field @@ -31,9 +31,9 @@ class Zaehlzeitregister(COM): typ: Annotated[Literal[ComTyp.ZAEHLZEITREGISTER], Field(alias="_typ")] = ComTyp.ZAEHLZEITREGISTER - zaehlzeit_definition: Optional[str] = None + zaehlzeit_definition: str | None = None """Zählzeitdefinition""" - zaehlzeit_register: Optional[str] = None + zaehlzeit_register: str | None = None """Zählzeitregister""" - ist_schwachlastfaehig: Optional[bool] = None + ist_schwachlastfaehig: bool | None = None """Schwachlastfaehigkeit""" diff --git a/src/bo4e/com/zaehlzeitsaison.py b/src/bo4e/com/zaehlzeitsaison.py index 1d587fcdb..692aa3fba 100644 --- a/src/bo4e/com/zaehlzeitsaison.py +++ b/src/bo4e/com/zaehlzeitsaison.py @@ -4,7 +4,7 @@ # pylint: disable=too-few-public-methods # pylint: disable=no-name-in-module -from typing import TYPE_CHECKING, Annotated, Literal, Optional +from typing import TYPE_CHECKING, Annotated, Literal from pydantic import Field @@ -37,10 +37,10 @@ class Zaehlzeitsaison(COM): typ: Annotated[Literal[ComTyp.ZAEHLZEITSAISON], Field(alias="_typ")] = ComTyp.ZAEHLZEITSAISON - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Bezeichnung der Saison (z.B. "Sommer", "Winter"). Muss zu einem Saisonabschnitt des in der übergeordneten `Zaehlzeitdefinition` referenzierten `saisonprofil` passen. Leer, wenn keine Saisonunterscheidung getroffen wird.""" - tagtypen: Optional[list["Zaehlzeittagtyp"]] = None + tagtypen: list["Zaehlzeittagtyp"] | None = None """Die Schaltschemata für die unterschiedlichen Tagtypen (z.B. Werktag, Wochenende, Feiertag) innerhalb dieser Saison.""" diff --git a/src/bo4e/com/zaehlzeittagtyp.py b/src/bo4e/com/zaehlzeittagtyp.py index d3ed4eb85..c606dd799 100644 --- a/src/bo4e/com/zaehlzeittagtyp.py +++ b/src/bo4e/com/zaehlzeittagtyp.py @@ -43,5 +43,5 @@ class Zaehlzeittagtyp(COM): tagtyp: Optional["Wiederholungstyp"] = None """An welchen Tagen das Schaltschema dieses Tagtyps gilt (z.B. `WERKTAGS`, `MONTAGS`, `FEIERTAGS`).""" - umschaltzeiten: Optional[list["Umschaltzeit"]] = None + umschaltzeiten: list["Umschaltzeit"] | None = None """Die Umschaltzeiten dieses Tagtyps. Sortiert ergibt sich daraus das Schaltschema für einen Tag.""" diff --git a/src/bo4e/com/zahlungsinformation.py b/src/bo4e/com/zahlungsinformation.py index 2f95805ea..a6110ee16 100644 --- a/src/bo4e/com/zahlungsinformation.py +++ b/src/bo4e/com/zahlungsinformation.py @@ -32,13 +32,13 @@ class Zahlungsinformation(COM): zahlungsart: Optional["Zahlungsart"] = None """Die Zahlungsart dieser Zahlungsinformation""" - iban: Optional[str] = None + iban: str | None = None """Eine IBAN-Nummer""" - bic: Optional[str] = None + bic: str | None = None """Eine BIC-Nummer""" - kontoinhaber: Optional[str] = None + kontoinhaber: str | None = None """Der Name des Kontoinhabers""" - betreff: Optional[str] = None + betreff: str | None = None """Eine konstante Betreffzeile für Überweisungen""" - sepa_referenz: Optional[str] = None + sepa_referenz: str | None = None """Eine SEPA-Referenz""" diff --git a/src/bo4e/com/zeitraum.py b/src/bo4e/com/zeitraum.py index 0aefde5f9..d914123f2 100644 --- a/src/bo4e/com/zeitraum.py +++ b/src/bo4e/com/zeitraum.py @@ -3,7 +3,7 @@ """ from datetime import date, time -from typing import TYPE_CHECKING, Annotated, Literal, Optional +from typing import TYPE_CHECKING, Annotated, Literal from pydantic import Field @@ -12,7 +12,7 @@ from .com import COM if TYPE_CHECKING: - from ..enum.mengeneinheit import Mengeneinheit + pass # pylint: disable=too-few-public-methods @@ -36,31 +36,31 @@ class Zeitraum(COM): typ: Annotated[Literal[ComTyp.ZEITRAUM], Field(alias="_typ")] = ComTyp.ZEITRAUM - startdatum: Optional[date] = None + startdatum: date | None = None """Startdatum des betrachteten Zeitraums ist **inklusiv**. Example: '2025-01-01' """ - enddatum: Optional[date] = None + enddatum: date | None = None """Enddatum des betrachteten Zeitraums ist **inklusiv**. Example: '2025-01-01' """ - startuhrzeit: Optional[time] = None + startuhrzeit: time | None = None """Startuhrzeit mit Zeitzone. Die angegebene Uhrzeit ist im betrachteten Zeitraum **inklusiv**. Example: '18:00:00+01:00' """ - enduhrzeit: Optional[time] = None + enduhrzeit: time | None = None """Enduhrzeit mit Zeitzone. Die angegebene Uhrzeit ist im betrachteten Zeitraum **exklusiv**. Example: '19:00:00+01:00' """ - dauer: Optional[str] = None + dauer: str | None = None """ Dauer in ISO 8601 Format. diff --git a/src/bo4e/com/zeitreihenwert.py b/src/bo4e/com/zeitreihenwert.py index 9fc32789d..757a6143f 100644 --- a/src/bo4e/com/zeitreihenwert.py +++ b/src/bo4e/com/zeitreihenwert.py @@ -36,7 +36,7 @@ class Zeitreihenwert(COM): zeitraum: Optional["Zeitraum"] = None """Zeitraum für das Messintervall""" - wert: Optional[Decimal] = None + wert: Decimal | None = None """Der in dem Zeitraum gültige Wert.""" status: Optional["Messwertstatus"] = None """Der Status gibt an, wie der Wert zu interpretieren ist, z.B. in Berechnungen.""" diff --git a/src/bo4e/com/zeitvariablepreisposition.py b/src/bo4e/com/zeitvariablepreisposition.py index 88e49a2b2..8910b0bf6 100644 --- a/src/bo4e/com/zeitvariablepreisposition.py +++ b/src/bo4e/com/zeitvariablepreisposition.py @@ -34,7 +34,7 @@ class ZeitvariablePreisposition(COM): typ: Annotated[Literal[ComTyp.ZEITVARIABLEPREISPOSITION], Field(alias="_typ")] = ComTyp.ZEITVARIABLEPREISPOSITION - bezeichnung: Optional[str] = None + bezeichnung: str | None = None """Eine (beliebige) Bezeichnung für die Preisposition.""" preisreferenz: Optional["Preisreferenz"] = None """ @@ -45,7 +45,7 @@ class ZeitvariablePreisposition(COM): """Der Preis für diese Position.""" zaehlzeitdefinition: Optional["Zaehlzeitdefinition"] = None """Die Zählzeitdefinition, deren Schaltschema bestimmt, wann diese Preisposition gilt.""" - zaehlzeitregister: Optional[str] = None + zaehlzeitregister: str | None = None """Der freie Register-Code (z.B. "HT", "NT", "ST", "SuperHT") innerhalb der referenzierten `zaehlzeitdefinition`, auf den sich diese Preisposition bezieht. Der Code sollte als `registercode` in mindestens einer `Umschaltzeit` der referenzierten Zählzeitdefinition diff --git a/src/bo4e/com/zustaendigkeit.py b/src/bo4e/com/zustaendigkeit.py index c8a9b8c72..3d7e9080f 100644 --- a/src/bo4e/com/zustaendigkeit.py +++ b/src/bo4e/com/zustaendigkeit.py @@ -37,7 +37,7 @@ class Zustaendigkeit(COM): Hier kann eine thematische Zuordnung des Ansprechpartners bzw. der Person angegeben werden """ - position: Optional[str] = None + position: str | None = None """Berufliche Rolle des Ansprechpartners/ der Person""" - abteilung: Optional[str] = None + abteilung: str | None = None """Abteilung, in der der Ansprechpartner/ die Person tätig ist""" diff --git a/src/bo4e/zusatzattribut.py b/src/bo4e/zusatzattribut.py index b2af1ab6c..e2af96db7 100644 --- a/src/bo4e/zusatzattribut.py +++ b/src/bo4e/zusatzattribut.py @@ -2,7 +2,7 @@ Contains ExterenzeReferenz class """ -from typing import Any, Optional +from typing import Any from pydantic import BaseModel @@ -27,5 +27,5 @@ class ZusatzAttribut(BaseModel): """ - name: Optional[str] = None #: Bezeichnung der externen Referenz (z.B. "microservice xyz" oder "SAP CRM GP-Nummer") + name: str | None = None #: Bezeichnung der externen Referenz (z.B. "microservice xyz" oder "SAP CRM GP-Nummer") wert: Any = None #: Wert der externen Referenz (z.B. "123456"; "4711") diff --git a/tests/serialization_helper.py b/tests/serialization_helper.py index 2892cdefa..4e03e2bb5 100644 --- a/tests/serialization_helper.py +++ b/tests/serialization_helper.py @@ -54,9 +54,9 @@ def _clear_pydantic_fields_set(object: BaseModel) -> None: # Check typ property for bo and com classes # the default value must be the corresponding enum value of the enum classes BoTyp or ComTyp if isinstance(serializable_object, (Geschaeftsobjekt, COM)): - assert hasattr( - serializable_object, "typ" - ), f"Missing 'typ' attribute in {serializable_object.__class__.__name__}" + assert hasattr(serializable_object, "typ"), ( + f"Missing 'typ' attribute in {serializable_object.__class__.__name__}" + ) assert serializable_object.typ is not None assert serializable_object.typ.value.lower() == serializable_object.__class__.__name__.lower(), ( @@ -67,7 +67,7 @@ def _clear_pydantic_fields_set(object: BaseModel) -> None: if expected_json_dict is not None: assert all([(k in json_string) for k in expected_json_dict.keys()]) assert actual_json_dict == expected_json_dict, ( - f"actual_json_dict != expected_json_dict\n\t" f"diff = {list(diff(expected_json_dict, actual_json_dict))}" + f"actual_json_dict != expected_json_dict\n\tdiff = {list(diff(expected_json_dict, actual_json_dict))}" ) # this (diff(...)) contains the difference between two dicts -> just for easier debugging diff --git a/tests/test_geschaeftspartner.py b/tests/test_geschaeftspartner.py index 786ad90af..1e6c9c3e7 100644 --- a/tests/test_geschaeftspartner.py +++ b/tests/test_geschaeftspartner.py @@ -53,7 +53,11 @@ class TestGeschaeftspartner: umsatzsteuer_id="AT12345", geschaeftspartnerrollen=[Geschaeftspartnerrolle.DIENSTLEISTER], adresse=Adresse( - postleitzahl="1014", ort="Wien 1", strasse="Ballhausplatz", hausnummer="2", landescode=Landescode.AT # type: ignore[attr-defined] + postleitzahl="1014", + ort="Wien 1", + strasse="Ballhausplatz", + hausnummer="2", + landescode=Landescode.AT, # type: ignore[attr-defined] ), ), id="Landescode!=DE, DE is default", diff --git a/uv.lock b/uv.lock index 216109bcf..b4b90b4b5 100644 --- a/uv.lock +++ b/uv.lock @@ -8,9 +8,6 @@ resolution-markers = [ "python_full_version < '3.11'", ] -[manifest] -overrides = [{ name = "isort", specifier = ">=9.0.0b1" }] - [[package]] name = "alabaster" version = "1.0.0" @@ -70,18 +67,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/66/40/c53deb2cd0c9b0fb636d24d9f40924cf2e65028e6b20b10cd5c1eeb2c730/ast_serialize-0.6.0-cp39-abi3-win_arm64.whl", hash = "sha256:ccd132fe8db56f61fe743b1f644d01b8d65b83248a8da506f3132bda86d6ed5e", size = 1072965, upload-time = "2026-06-30T20:02:54.097Z" }, ] -[[package]] -name = "astroid" -version = "4.0.4" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/07/63/0adf26577da5eff6eb7a177876c1cfa213856be9926a000f65c4add9692b/astroid-4.0.4.tar.gz", hash = "sha256:986fed8bcf79fb82c78b18a53352a0b287a73817d6dbcfba3162da36667c49a0", size = 406358, upload-time = "2026-02-07T23:35:07.509Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b0/cf/1c5f42b110e57bc5502eb80dbc3b03d256926062519224835ef08134f1f9/astroid-4.0.4-py3-none-any.whl", hash = "sha256:52f39653876c7dec3e3afd4c2696920e05c83832b9737afc21928f2d2eb7a753", size = 276445, upload-time = "2026-02-07T23:35:05.344Z" }, -] - [[package]] name = "babel" version = "2.18.0" @@ -91,50 +76,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, ] -[[package]] -name = "black" -version = "26.5.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "mypy-extensions" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "platformdirs" }, - { name = "pytokens" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions", marker = "python_full_version < '3.11'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/c0/37/5628dd55bf2b34257fc7603f0fe97c40e3aaf24265f416a9c85c95ca1436/black-26.5.1.tar.gz", hash = "sha256:dd321f668053961824bcc1be1cc1df748b2d7e4fa28086b08331e577b0100a73", size = 679439, upload-time = "2026-05-18T16:53:36.107Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/be/84/b3f55026206a9e8820a91503308075ca48eadc515e436731ca01dbe043b3/black-26.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9942db8888e06943c5dde66ca0037dcff82a2a4ec1ad0ada9e0d2ee9d9823893", size = 1987719, upload-time = "2026-05-18T17:05:02.757Z" }, - { url = "https://files.pythonhosted.org/packages/c6/34/7db312c5e5783d6e76cffd9d5ac8972a32badae4c6e3288dac0eed8d3bed/black-26.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:89c93167a74d3a75dfaa38a5c7cca015537d5820dd7f17d63267d674a61cae90", size = 1810083, upload-time = "2026-05-18T17:05:04.302Z" }, - { url = "https://files.pythonhosted.org/packages/33/e2/e0101e73c2c8727634e2efcb35e2b34bd23ad70dfa673789f5773a591b21/black-26.5.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22f2cd76d069cc54c71f10360744ba8983fbb616903b4304a85b734915c8e1b4", size = 1860633, upload-time = "2026-05-18T17:05:06.391Z" }, - { url = "https://files.pythonhosted.org/packages/b0/4c/e15c0c5b23cf3651035fe5addcce90e283af3548a3f91bb03d81b83106ab/black-26.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:87ed5c6f450580a2f6790bc7cbfb016dfc73bc750249762268a3695361315eef", size = 1477886, upload-time = "2026-05-18T17:05:07.96Z" }, - { url = "https://files.pythonhosted.org/packages/9f/3f/59d43ade98d2ce5c8dc34a4e46cbecd177e6d55d7d4092969c6003ccc655/black-26.5.1-cp310-cp310-win_arm64.whl", hash = "sha256:58b4bd92cf88aacf83d88479c8f9caee044b1ec55f2451a337354a7ea2590a22", size = 1277111, upload-time = "2026-05-18T17:05:09.473Z" }, - { url = "https://files.pythonhosted.org/packages/4b/96/3c3e09f09f44a37aac36b178a279cd19aa7001bd796187a7b162a294c81f/black-26.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:96ae2c733b2aabdd9986e2c5df628ff3473676cd1c5faded1ff496cf6d74083c", size = 1970639, upload-time = "2026-05-18T17:05:11.461Z" }, - { url = "https://files.pythonhosted.org/packages/83/ea/5ad117b9ee3ecd933c712bcbae610006e5b7cc9f41c526cd7ed3b6c4124c/black-26.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0e48b87e03bf109288e55cfceadcfa15ff5470aca2851a851950ed2926f450d7", size = 1792130, upload-time = "2026-05-18T17:05:12.983Z" }, - { url = "https://files.pythonhosted.org/packages/06/3a/7c448bc623fcdfa96672531beb5a616ea5e64f6975955254d7731ffb0ad9/black-26.5.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5119fa92ae61f786e8c3662fd60aece1d0a2dd5cca5d0c79417a95e7a4272a59", size = 1846134, upload-time = "2026-05-18T17:05:14.506Z" }, - { url = "https://files.pythonhosted.org/packages/a1/5b/0b39b3a5917f0657ac014ad2edb58c139553a478adfe7f817abf1622ff6e/black-26.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:30d3c14661f2792e9142cce3eeeb1cbc175b3eb5f733be0c8eeb99651e52b0c3", size = 1478883, upload-time = "2026-05-18T17:05:16.542Z" }, - { url = "https://files.pythonhosted.org/packages/4c/48/dc222692e0f95030db1bbfb6c857e76858bad09058221ea7aae815255327/black-26.5.1-cp311-cp311-win_arm64.whl", hash = "sha256:1ef92b76f7733f282fd096ea406200b5a286c42947412b0eaff3a74e3616cefe", size = 1277776, upload-time = "2026-05-18T17:05:18.029Z" }, - { url = "https://files.pythonhosted.org/packages/24/99/7744b906703228264ef73bdd534df88ec1ef3de45c4e78f6d31b9e32d0c9/black-26.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4ad6fa01f941920f54f2bbb35f3df7673428a0ef98a0b0840c2eaef3b110efa8", size = 2012518, upload-time = "2026-05-18T17:05:20.108Z" }, - { url = "https://files.pythonhosted.org/packages/b7/c0/c5a3b1636dfd09c42534f2b3cf33506814f6d3e066fb0879ffa16c1ae860/black-26.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3915f256e75a2d7cf88d8953d37f780455dc586cc72dee059c528fe77f581217", size = 1816016, upload-time = "2026-05-18T17:05:21.84Z" }, - { url = "https://files.pythonhosted.org/packages/1f/0e/36044316b65ca471d3bb6d3703fd06fb50c6b727c3562f6a5a3153634f88/black-26.5.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d98d4137277c75dfb898ec8d846c4fd68ba1e9cf77f95e2865c203dc18f4c3d", size = 1884150, upload-time = "2026-05-18T17:05:23.546Z" }, - { url = "https://files.pythonhosted.org/packages/b3/33/dafc5808c2af43672912111d7c3354af1615f7e2be3bed7a878461abbe4d/black-26.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:a1dca32d9f1784af512a13410ec204c6f7f0aa9797a111c42e1c03449821c264", size = 1486825, upload-time = "2026-05-18T17:05:25.004Z" }, - { url = "https://files.pythonhosted.org/packages/82/14/b965ee6ad2a311f28bdbf692def3ee9848d2ae289dab28b27657fcee3e78/black-26.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:1037d5ac7b7b310b2632ad867ec8d0e4c4819dcdb0b820f63135da746a24e418", size = 1288646, upload-time = "2026-05-18T17:05:26.477Z" }, - { url = "https://files.pythonhosted.org/packages/3f/5c/c384363980e11e25ca6b93205949bb331fbf35f4e0dbec376dfa6326cec8/black-26.5.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2b36cf2ddf5566e205f6535f782a62194a184d33e175b64ae8c40b1737522be3", size = 2009020, upload-time = "2026-05-18T17:05:28.132Z" }, - { url = "https://files.pythonhosted.org/packages/0b/df/9f31c5e0babbfed77d505fc5d120beb98b21b33feaeded3924ea941fe360/black-26.5.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1f7ea64ebfa01b50f693508fc39f875e264446d3b097088f84f203b9d09618a0", size = 1813335, upload-time = "2026-05-18T17:05:31.266Z" }, - { url = "https://files.pythonhosted.org/packages/fb/24/8e7b9a2fa61b0afd82209efe937557d180a1fa055bd7f6161eb9defc3719/black-26.5.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecb3e624844c798144e9bd986954e0adc81d8911a1f30f375e1252fe26e8c294", size = 1881614, upload-time = "2026-05-18T17:05:32.718Z" }, - { url = "https://files.pythonhosted.org/packages/49/ad/b4e0d9365ba8ac34f6bbab62a4b1b2dd5d618fac3fa1b8db968c844201b5/black-26.5.1-cp313-cp313-win_amd64.whl", hash = "sha256:e1a26503279b6b310669fb0b219c39e4820b77e8189fe80f522bb511f247db0a", size = 1488925, upload-time = "2026-05-18T17:05:34.259Z" }, - { url = "https://files.pythonhosted.org/packages/a1/4b/652b859bf5df88a751c30451b09338f7fd26a77d1271c666992f836b7711/black-26.5.1-cp313-cp313-win_arm64.whl", hash = "sha256:5c34b25da232ead53a6f335b76dbea124f4d152ad568b9080d6f944bc2b34b52", size = 1289883, upload-time = "2026-05-18T17:05:36.019Z" }, - { url = "https://files.pythonhosted.org/packages/a6/16/a8da8eb208c51c7f4ce74609a45d0dcc6d8a2141e45e81ee5289d1bb0d59/black-26.5.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e88976690a64b0af98312ca958415849cb42423423c5f2ee74af4b49a97a2168", size = 2004800, upload-time = "2026-05-18T17:05:38.182Z" }, - { url = "https://files.pythonhosted.org/packages/11/8a/a479296a19e383b70a725882a6cf3d786540601ff03cabbaaf1cce864c5a/black-26.5.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32d5ea7f6c8bdfa6e648326ebca1f02b0764e2a029edc6f8dce2627e19d468c3", size = 1815576, upload-time = "2026-05-18T17:05:40.309Z" }, - { url = "https://files.pythonhosted.org/packages/81/6b/cfaf3d39f25132c156a068f6b805576c9103a84086019507c70e1911ee7d/black-26.5.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea8d16dc41655aa113cd64665e7219446cd7e4ff2248d7178eaa905190c86b18", size = 1877927, upload-time = "2026-05-18T17:05:42.463Z" }, - { url = "https://files.pythonhosted.org/packages/66/76/302e313964bcff7e28df329d39f84f5270095730d85ff0acc260610a0d82/black-26.5.1-cp314-cp314-win_amd64.whl", hash = "sha256:577f21094ea469ef92ec1adaf2c9441a226d2144d01a5be2fa823cecf6543e50", size = 1511860, upload-time = "2026-05-18T17:05:43.943Z" }, - { url = "https://files.pythonhosted.org/packages/27/4e/a3827e35e0e567f9f9ee59e2a0ab979267dca98718f25547ca8c6733afd4/black-26.5.1-cp314-cp314-win_arm64.whl", hash = "sha256:ed1a20af114c301a0269bf01163d51dbef72737fd65f850001e7cbe7f3c7abae", size = 1316632, upload-time = "2026-05-18T17:05:45.521Z" }, - { url = "https://files.pythonhosted.org/packages/94/51/f975cae76d44274cc2868dc9040ac5d58d464784610234455b4e7b19c6ef/black-26.5.1-py3-none-any.whl", hash = "sha256:4ed7f7da04046d2e488437170797d3b4a4ad83906683bcb7dfc68b673bbce5e2", size = 213693, upload-time = "2026-05-18T16:53:33.964Z" }, -] - [[package]] name = "bo4e" source = { editable = "." } @@ -153,18 +94,16 @@ coverage = [ { name = "pytest-datafiles" }, ] dev = [ - { name = "black" }, { name = "click" }, { name = "coverage" }, { name = "dictdiffer" }, - { name = "isort" }, { name = "mypy" }, { name = "networkx-stubs" }, { name = "pre-commit" }, - { name = "pylint" }, { name = "pytest" }, { name = "pytest-datafiles" }, { name = "requests" }, + { name = "ruff" }, { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, @@ -179,21 +118,11 @@ docs = [ { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "sphinx-rtd-theme" }, ] -formatting = [ - { name = "black" }, - { name = "isort" }, -] json-schemas = [ { name = "click" }, ] linting = [ - { name = "click" }, - { name = "pylint" }, - { name = "requests" }, - { name = "sphinx", version = "8.1.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "sphinx", version = "9.0.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, - { name = "sphinx", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, - { name = "sphinx-rtd-theme" }, + { name = "ruff" }, ] tests = [ { name = "click" }, @@ -230,18 +159,16 @@ coverage = [ { name = "pytest-datafiles" }, ] dev = [ - { name = "black" }, { name = "click" }, { name = "coverage" }, { name = "dictdiffer" }, - { name = "isort", specifier = ">=9.0.0b1" }, { name = "mypy" }, { name = "networkx-stubs" }, { name = "pre-commit" }, - { name = "pylint" }, { name = "pytest" }, { name = "pytest-datafiles" }, { name = "requests" }, + { name = "ruff" }, { name = "sphinx" }, { name = "sphinx-rtd-theme" }, { name = "types-requests" }, @@ -252,18 +179,8 @@ docs = [ { name = "sphinx" }, { name = "sphinx-rtd-theme" }, ] -formatting = [ - { name = "black" }, - { name = "isort", specifier = ">=9.0.0b1" }, -] json-schemas = [{ name = "click" }] -linting = [ - { name = "click" }, - { name = "pylint" }, - { name = "requests" }, - { name = "sphinx" }, - { name = "sphinx-rtd-theme" }, -] +linting = [{ name = "ruff" }] tests = [ { name = "click" }, { name = "dictdiffer" }, @@ -532,15 +449,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9c/2f/7ff60ad2cafd7c970bea75da5f4a9b84b784f7340abcb5fc634d4cf5cd37/dictdiffer-0.10.0-py3-none-any.whl", hash = "sha256:6ca50f38f7c5ee27d52789eee095ae473d9e02e1aa7612cb3aaf25fcf081dbf6", size = 16060, upload-time = "2026-07-16T12:39:06.842Z" }, ] -[[package]] -name = "dill" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, -] - [[package]] name = "distlib" version = "0.4.1" @@ -642,15 +550,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/08/d0/bf18725b8d47f37858ff801f8e4d40c6982730a899725bdb6ded62199954/iso3166-2.1.1-py3-none-any.whl", hash = "sha256:263660b36f8471c42acd1ff673d28a3715edbce7d24b1550d0cf010f6816c47f", size = 9829, upload-time = "2022-07-12T04:07:55.54Z" }, ] -[[package]] -name = "isort" -version = "9.0.0b1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/22/aa148868386320a95c487e88f51589bc76cd4d3cce1236871f20f07bb7fe/isort-9.0.0b1.tar.gz", hash = "sha256:37b236e9ae52d933e7a8105690b69c476bed512ecdf9ef1b51ad6a5523bfd8a9", size = 635550, upload-time = "2026-07-12T20:29:16.124Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/47/89/39864d8ba08bf6d455db07e5130117256655d78c2e0913d8dc22af287fd1/isort-9.0.0b1-py3-none-any.whl", hash = "sha256:38bac32012b5def6c7cfa86db78e50efa782bd2033cd063b41a8fbc60986e5a4", size = 99048, upload-time = "2026-07-12T20:29:14.58Z" }, -] - [[package]] name = "jinja2" version = "3.1.6" @@ -835,15 +734,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] -[[package]] -name = "mccabe" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e7/ff/0ffefdcac38932a54d2b5eed4e0ba8a408f215002cd178ad1df0f2806ff8/mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", size = 9658, upload-time = "2022-01-24T01:14:51.113Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/27/1a/1f68f9ba0c207934b35b86a8ca3aad8395a3d6dd7921c0686e23853ff5a9/mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e", size = 7350, upload-time = "2022-01-24T01:14:49.62Z" }, -] - [[package]] name = "mypy" version = "2.3.0" @@ -1162,25 +1052,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9e/11/a1938340ecb32d71e47ad4914843775011e6e9da59ba1229f181fef3119e/pyhumps-3.8.0-py3-none-any.whl", hash = "sha256:060e1954d9069f428232a1adda165db0b9d8dfdce1d265d36df7fbff540acfd6", size = 6095, upload-time = "2022-10-21T10:38:58.231Z" }, ] -[[package]] -name = "pylint" -version = "4.0.6" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "astroid" }, - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "dill" }, - { name = "isort" }, - { name = "mccabe" }, - { name = "platformdirs" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "tomlkit" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7d/1d/3bb57f303701549550d74bf7ced2b07412be97125c167a0c9d216aa9f762/pylint-4.0.6.tar.gz", hash = "sha256:52f19191bee08bf103f9705ad1a0ece4aa5a0a4ef2bdcbd969375a1e6f6579d5", size = 1585588, upload-time = "2026-06-14T14:43:26.772Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ab/da/acb2e7d4dbd2dfb792d38c0d850481f29ad7049b356d23f56c687d35203b/pylint-4.0.6-py3-none-any.whl", hash = "sha256:d11a0e1fdb7b1cd46ec5d6fc78fee8b95f28695b2d6140e5809925f61e32ea54", size = 538389, upload-time = "2026-06-14T14:43:24.873Z" }, -] - [[package]] name = "pytest" version = "9.1.1" @@ -1211,45 +1082,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4b/23/88880d5dc36eac9696ad40823e37c1fdbfa81a67b9cfd0ed445b3ed7ec54/pytest_datafiles-3.0.1-py3-none-any.whl", hash = "sha256:c48f27a8afec03a482a10587ab5f5ab930ced4cbdeb2e3a2cbcc0323a51d22c7", size = 6357, upload-time = "2026-01-04T15:08:25.132Z" }, ] -[[package]] -name = "pytokens" -version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b6/34/b4e015b99031667a7b960f888889c5bd34ef585c85e1cb56a594b92836ac/pytokens-0.4.1.tar.gz", hash = "sha256:292052fe80923aae2260c073f822ceba21f3872ced9a68bb7953b348e561179a", size = 23015, upload-time = "2026-01-30T01:03:45.924Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/42/24/f206113e05cb8ef51b3850e7ef88f20da6f4bf932190ceb48bd3da103e10/pytokens-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a44ed93ea23415c54f3face3b65ef2b844d96aeb3455b8a69b3df6beab6acc5", size = 161522, upload-time = "2026-01-30T01:02:50.393Z" }, - { url = "https://files.pythonhosted.org/packages/d4/e9/06a6bf1b90c2ed81a9c7d2544232fe5d2891d1cd480e8a1809ca354a8eb2/pytokens-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:add8bf86b71a5d9fb5b89f023a80b791e04fba57960aa790cc6125f7f1d39dfe", size = 246945, upload-time = "2026-01-30T01:02:52.399Z" }, - { url = "https://files.pythonhosted.org/packages/69/66/f6fb1007a4c3d8b682d5d65b7c1fb33257587a5f782647091e3408abe0b8/pytokens-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:670d286910b531c7b7e3c0b453fd8156f250adb140146d234a82219459b9640c", size = 259525, upload-time = "2026-01-30T01:02:53.737Z" }, - { url = "https://files.pythonhosted.org/packages/04/92/086f89b4d622a18418bac74ab5db7f68cf0c21cf7cc92de6c7b919d76c88/pytokens-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e691d7f5186bd2842c14813f79f8884bb03f5995f0575272009982c5ac6c0f7", size = 262693, upload-time = "2026-01-30T01:02:54.871Z" }, - { url = "https://files.pythonhosted.org/packages/b4/7b/8b31c347cf94a3f900bdde750b2e9131575a61fdb620d3d3c75832262137/pytokens-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:27b83ad28825978742beef057bfe406ad6ed524b2d28c252c5de7b4a6dd48fa2", size = 103567, upload-time = "2026-01-30T01:02:56.414Z" }, - { url = "https://files.pythonhosted.org/packages/3d/92/790ebe03f07b57e53b10884c329b9a1a308648fc083a6d4a39a10a28c8fc/pytokens-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d70e77c55ae8380c91c0c18dea05951482e263982911fc7410b1ffd1dadd3440", size = 160864, upload-time = "2026-01-30T01:02:57.882Z" }, - { url = "https://files.pythonhosted.org/packages/13/25/a4f555281d975bfdd1eba731450e2fe3a95870274da73fb12c40aeae7625/pytokens-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a58d057208cb9075c144950d789511220b07636dd2e4708d5645d24de666bdc", size = 248565, upload-time = "2026-01-30T01:02:59.912Z" }, - { url = "https://files.pythonhosted.org/packages/17/50/bc0394b4ad5b1601be22fa43652173d47e4c9efbf0044c62e9a59b747c56/pytokens-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b49750419d300e2b5a3813cf229d4e5a4c728dae470bcc89867a9ad6f25a722d", size = 260824, upload-time = "2026-01-30T01:03:01.471Z" }, - { url = "https://files.pythonhosted.org/packages/4e/54/3e04f9d92a4be4fc6c80016bc396b923d2a6933ae94b5f557c939c460ee0/pytokens-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9907d61f15bf7261d7e775bd5d7ee4d2930e04424bab1972591918497623a16", size = 264075, upload-time = "2026-01-30T01:03:04.143Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1b/44b0326cb5470a4375f37988aea5d61b5cc52407143303015ebee94abfd6/pytokens-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee44d0f85b803321710f9239f335aafe16553b39106384cef8e6de40cb4ef2f6", size = 103323, upload-time = "2026-01-30T01:03:05.412Z" }, - { url = "https://files.pythonhosted.org/packages/41/5d/e44573011401fb82e9d51e97f1290ceb377800fb4eed650b96f4753b499c/pytokens-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:140709331e846b728475786df8aeb27d24f48cbcf7bcd449f8de75cae7a45083", size = 160663, upload-time = "2026-01-30T01:03:06.473Z" }, - { url = "https://files.pythonhosted.org/packages/f0/e6/5bbc3019f8e6f21d09c41f8b8654536117e5e211a85d89212d59cbdab381/pytokens-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d6c4268598f762bc8e91f5dbf2ab2f61f7b95bdc07953b602db879b3c8c18e1", size = 255626, upload-time = "2026-01-30T01:03:08.177Z" }, - { url = "https://files.pythonhosted.org/packages/bf/3c/2d5297d82286f6f3d92770289fd439956b201c0a4fc7e72efb9b2293758e/pytokens-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24afde1f53d95348b5a0eb19488661147285ca4dd7ed752bbc3e1c6242a304d1", size = 269779, upload-time = "2026-01-30T01:03:09.756Z" }, - { url = "https://files.pythonhosted.org/packages/20/01/7436e9ad693cebda0551203e0bf28f7669976c60ad07d6402098208476de/pytokens-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5ad948d085ed6c16413eb5fec6b3e02fa00dc29a2534f088d3302c47eb59adf9", size = 268076, upload-time = "2026-01-30T01:03:10.957Z" }, - { url = "https://files.pythonhosted.org/packages/2e/df/533c82a3c752ba13ae7ef238b7f8cdd272cf1475f03c63ac6cf3fcfb00b6/pytokens-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:3f901fe783e06e48e8cbdc82d631fca8f118333798193e026a50ce1b3757ea68", size = 103552, upload-time = "2026-01-30T01:03:12.066Z" }, - { url = "https://files.pythonhosted.org/packages/cb/dc/08b1a080372afda3cceb4f3c0a7ba2bde9d6a5241f1edb02a22a019ee147/pytokens-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8bdb9d0ce90cbf99c525e75a2fa415144fd570a1ba987380190e8b786bc6ef9b", size = 160720, upload-time = "2026-01-30T01:03:13.843Z" }, - { url = "https://files.pythonhosted.org/packages/64/0c/41ea22205da480837a700e395507e6a24425151dfb7ead73343d6e2d7ffe/pytokens-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5502408cab1cb18e128570f8d598981c68a50d0cbd7c61312a90507cd3a1276f", size = 254204, upload-time = "2026-01-30T01:03:14.886Z" }, - { url = "https://files.pythonhosted.org/packages/e0/d2/afe5c7f8607018beb99971489dbb846508f1b8f351fcefc225fcf4b2adc0/pytokens-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:29d1d8fb1030af4d231789959f21821ab6325e463f0503a61d204343c9b355d1", size = 268423, upload-time = "2026-01-30T01:03:15.936Z" }, - { url = "https://files.pythonhosted.org/packages/68/d4/00ffdbd370410c04e9591da9220a68dc1693ef7499173eb3e30d06e05ed1/pytokens-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:970b08dd6b86058b6dc07efe9e98414f5102974716232d10f32ff39701e841c4", size = 266859, upload-time = "2026-01-30T01:03:17.458Z" }, - { url = "https://files.pythonhosted.org/packages/a7/c9/c3161313b4ca0c601eeefabd3d3b576edaa9afdefd32da97210700e47652/pytokens-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:9bd7d7f544d362576be74f9d5901a22f317efc20046efe2034dced238cbbfe78", size = 103520, upload-time = "2026-01-30T01:03:18.652Z" }, - { url = "https://files.pythonhosted.org/packages/8f/a7/b470f672e6fc5fee0a01d9e75005a0e617e162381974213a945fcd274843/pytokens-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4a14d5f5fc78ce85e426aa159489e2d5961acf0e47575e08f35584009178e321", size = 160821, upload-time = "2026-01-30T01:03:19.684Z" }, - { url = "https://files.pythonhosted.org/packages/80/98/e83a36fe8d170c911f864bfded690d2542bfcfacb9c649d11a9e6eb9dc41/pytokens-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f50fd18543be72da51dd505e2ed20d2228c74e0464e4262e4899797803d7fa", size = 254263, upload-time = "2026-01-30T01:03:20.834Z" }, - { url = "https://files.pythonhosted.org/packages/0f/95/70d7041273890f9f97a24234c00b746e8da86df462620194cef1d411ddeb/pytokens-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc74c035f9bfca0255c1af77ddd2d6ae8419012805453e4b0e7513e17904545d", size = 268071, upload-time = "2026-01-30T01:03:21.888Z" }, - { url = "https://files.pythonhosted.org/packages/da/79/76e6d09ae19c99404656d7db9c35dfd20f2086f3eb6ecb496b5b31163bad/pytokens-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f66a6bbe741bd431f6d741e617e0f39ec7257ca1f89089593479347cc4d13324", size = 271716, upload-time = "2026-01-30T01:03:23.633Z" }, - { url = "https://files.pythonhosted.org/packages/79/37/482e55fa1602e0a7ff012661d8c946bafdc05e480ea5a32f4f7e336d4aa9/pytokens-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:b35d7e5ad269804f6697727702da3c517bb8a5228afa450ab0fa787732055fc9", size = 104539, upload-time = "2026-01-30T01:03:24.788Z" }, - { url = "https://files.pythonhosted.org/packages/30/e8/20e7db907c23f3d63b0be3b8a4fd1927f6da2395f5bcc7f72242bb963dfe/pytokens-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:8fcb9ba3709ff77e77f1c7022ff11d13553f3c30299a9fe246a166903e9091eb", size = 168474, upload-time = "2026-01-30T01:03:26.428Z" }, - { url = "https://files.pythonhosted.org/packages/d6/81/88a95ee9fafdd8f5f3452107748fd04c24930d500b9aba9738f3ade642cc/pytokens-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:79fc6b8699564e1f9b521582c35435f1bd32dd06822322ec44afdeba666d8cb3", size = 290473, upload-time = "2026-01-30T01:03:27.415Z" }, - { url = "https://files.pythonhosted.org/packages/cf/35/3aa899645e29b6375b4aed9f8d21df219e7c958c4c186b465e42ee0a06bf/pytokens-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d31b97b3de0f61571a124a00ffe9a81fb9939146c122c11060725bd5aea79975", size = 303485, upload-time = "2026-01-30T01:03:28.558Z" }, - { url = "https://files.pythonhosted.org/packages/52/a0/07907b6ff512674d9b201859f7d212298c44933633c946703a20c25e9d81/pytokens-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:967cf6e3fd4adf7de8fc73cd3043754ae79c36475c1c11d514fc72cf5490094a", size = 306698, upload-time = "2026-01-30T01:03:29.653Z" }, - { url = "https://files.pythonhosted.org/packages/39/2a/cbbf9250020a4a8dd53ba83a46c097b69e5eb49dd14e708f496f548c6612/pytokens-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:584c80c24b078eec1e227079d56dc22ff755e0ba8654d8383b2c549107528918", size = 116287, upload-time = "2026-01-30T01:03:30.912Z" }, - { url = "https://files.pythonhosted.org/packages/c6/78/397db326746f0a342855b81216ae1f0a32965deccfd7c830a2dbc66d2483/pytokens-0.4.1-py3-none-any.whl", hash = "sha256:26cef14744a8385f35d0e095dc8b3a7583f6c953c2e3d269c7f82484bf5ad2de", size = 13729, upload-time = "2026-01-30T01:03:45.029Z" }, -] - [[package]] name = "pyyaml" version = "6.0.3" @@ -1338,6 +1170,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/54/6f679c435d28e0a568d8e8a7c0a93a09010818634c3c3907fc98d8983770/roman_numerals-4.1.0-py3-none-any.whl", hash = "sha256:647ba99caddc2cc1e55a51e4360689115551bf4476d90e8162cf8c345fe233c7", size = 7676, upload-time = "2025-12-17T18:25:33.098Z" }, ] +[[package]] +name = "ruff" +version = "0.16.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/25/7113f6d5498888c5fb7db34081cba7d5971c4cb1bfb26819966eee68f003/ruff-0.16.1.tar.gz", hash = "sha256:fedad7c801dabd3fb9741d76aca39246e6ddd9ca446a015875207bf19f1e6bc7", size = 4877500, upload-time = "2026-07-30T19:37:01.379Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/bd/694da69368e0973de65df2ddc73ab18d43c469d5963d9b150911de6bc513/ruff-0.16.1-py3-none-linux_armv6l.whl", hash = "sha256:58edb313b88f0c5460a26adf5f39a37a3be789494a15e3e411e35fa78b89f9a0", size = 10839126, upload-time = "2026-07-30T19:36:13.697Z" }, + { url = "https://files.pythonhosted.org/packages/3f/f0/b626e5d5bd0dd9576263658ef12885e2288afd1029a48e26ffed65ec1ac1/ruff-0.16.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:fde5a99e2f97479af66edd6622c6d5a2a7592c77cf4153d9e4428f5eeb55b60c", size = 11070253, upload-time = "2026-07-30T19:36:17.14Z" }, + { url = "https://files.pythonhosted.org/packages/83/63/f40acfb6b35b88623e71684942b552c3edd96035f5d98f313815f7b277de/ruff-0.16.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e0d4c20532fca4f7fa609369161d968dd28f65d83dabbd61d8e9c7edbf7001f6", size = 10561425, upload-time = "2026-07-30T19:36:20.04Z" }, + { url = "https://files.pythonhosted.org/packages/aa/dd/14ec0e9c2b4d315547dd38765004b4863e354e1b52cb308272215d9f6f6d/ruff-0.16.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30affbcedf59ad5703d9c91f82266e02b47739f797e1a7b6e158e5526a6dae38", size = 10948879, upload-time = "2026-07-30T19:36:22.476Z" }, + { url = "https://files.pythonhosted.org/packages/33/e9/9d870cbae575030fdef595f04b4b97573c525b5497cce4f4498cf2f85446/ruff-0.16.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:24e9c631573cbca9d20f1283f8f479b2afa4a8503504822bd71a293889f16743", size = 10643691, upload-time = "2026-07-30T19:36:24.914Z" }, + { url = "https://files.pythonhosted.org/packages/c4/09/12743d544e2173f53ecd27217c65f90d2bc0f8424a66a60339e56bbc0457/ruff-0.16.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b41bdd48fb420987a9b5212e4957c26ad4abce401fa9ea9d4d85843727945f4f", size = 11435354, upload-time = "2026-07-30T19:36:28.447Z" }, + { url = "https://files.pythonhosted.org/packages/7f/89/a1652b2daee52083c9554a6333b678a8b01d0400f976827bb87857f9449a/ruff-0.16.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b0d1e1393b7648079e13669de1c1f4fde06d4583e84d8fd5c1551e0a77a2aa75", size = 12259033, upload-time = "2026-07-30T19:36:31.326Z" }, + { url = "https://files.pythonhosted.org/packages/16/96/ecdcb8c54ee7b123b487f807eb014e6e019155a0b81dfb669acd52f28ce3/ruff-0.16.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:07bf434b1c95f4e093be4532068ef4fcf00924eb2ade8796075980902d6fd54a", size = 11667981, upload-time = "2026-07-30T19:36:34.394Z" }, + { url = "https://files.pythonhosted.org/packages/cd/90/c52e12e0d862e9572f2a33aa227409143520abe53111e9a6babbac7b4af8/ruff-0.16.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39897739f112253ee4fdd2e8aa9a4f9ded99fb2be367d5f31dfa4ded6025584c", size = 11468183, upload-time = "2026-07-30T19:36:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6b/4ffb7ad1d83eb16cf8cbb3c8815d3f11c88460fd162d4b372a2059be1c2a/ruff-0.16.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:82ae3c0c0d74daf17b968a10b7b3bb3ef297ab7de0c1f749646b25e690ccb150", size = 11470071, upload-time = "2026-07-30T19:36:39.91Z" }, + { url = "https://files.pythonhosted.org/packages/9c/72/32ae7db4c0b5e32ab611787caa19d1546800676d79f7483b7100a3561bf4/ruff-0.16.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4d5f2ed10f8242d83fc08d521301089364e3375375705356f20c0e31606ef3ef", size = 10919503, upload-time = "2026-07-30T19:36:42.65Z" }, + { url = "https://files.pythonhosted.org/packages/f7/ca/3d901ba6ad6fc38da39c3448fc6c59ac945679293a17c3ceb6d6c1cba13e/ruff-0.16.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:a4665b309891f83f3e3c25447935f1213e9abbd4b5640af7a1f2def9f8d413c1", size = 10649861, upload-time = "2026-07-30T19:36:45.18Z" }, + { url = "https://files.pythonhosted.org/packages/92/79/894ef1ced26552d5f8c9cf6d85b0687840e1128c55aeab7b9c2d54a0d880/ruff-0.16.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26e9ca5c9bc3971f20d3cf18a957f52ffd6a5f6564ff15c4912a144dcac22494", size = 11148137, upload-time = "2026-07-30T19:36:47.936Z" }, + { url = "https://files.pythonhosted.org/packages/2d/69/3609a09fa1cb46cc28b762363e440a354204e5dff01bd0c8d7437874d6b9/ruff-0.16.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:67e1e1e3fa4f0c82f0e36d4cd61e661f6e7a6196cb1aa92fe0828fa7b8f257cd", size = 11559211, upload-time = "2026-07-30T19:36:50.448Z" }, + { url = "https://files.pythonhosted.org/packages/fc/8a/fb22af2fd78a736e241fabf67e30ce1799a64244026377a49e133af90762/ruff-0.16.1-py3-none-win32.whl", hash = "sha256:d31765e131295b8445caf301e3e8a85b34d1b9b211b4109b7ba457888b051806", size = 10838258, upload-time = "2026-07-30T19:36:53.298Z" }, + { url = "https://files.pythonhosted.org/packages/d4/35/e57fd9fb5d423961df087a00b12d42c0a830288dc2f3b45ecca299158b4f/ruff-0.16.1-py3-none-win_amd64.whl", hash = "sha256:09b05e8b90c2cb06ad63464350e7a45e8e44a2dfe52072ebfba6666ca8d3f596", size = 11961111, upload-time = "2026-07-30T19:36:56.107Z" }, + { url = "https://files.pythonhosted.org/packages/cb/46/240ea004bf6dc4feb40e9832f2205a476a47dd5b8a3f8211a5fc5f95e20e/ruff-0.16.1-py3-none-win_arm64.whl", hash = "sha256:dbaadaac38c70239f056d306b7476f246b0bf000fa6b3876402acbf5b227eaf8", size = 11309414, upload-time = "2026-07-30T19:36:58.79Z" }, +] + [[package]] name = "snowballstemmer" version = "3.1.1" @@ -1580,15 +1437,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] -[[package]] -name = "tomlkit" -version = "0.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/51/db/03eaf4331631ef6b27d6e3c9b68c54dc6f0d63d87201fed600cc409307fd/tomlkit-0.15.0.tar.gz", hash = "sha256:7d1a9ecba3086638211b13814ea79c90dd54dd11993564376f3aa92271f5c7a3", size = 161875, upload-time = "2026-05-10T07:38:22.245Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/43/8bd850ee71a191bf072e31302c73a66be413fecdd98fdcd111ecbcce13ca/tomlkit-0.15.0-py3-none-any.whl", hash = "sha256:4dbc8f0fc024412b57ced8757ac7461305126a648ff8c2c807fcb8e133a78738", size = 41328, upload-time = "2026-05-10T07:38:23.517Z" }, -] - [[package]] name = "types-requests" version = "2.33.0.20260712" From 8ae407eaff740e38993820d1854d3aa26e138140 Mon Sep 17 00:00:00 2001 From: Kevin Date: Fri, 31 Jul 2026 09:39:01 +0000 Subject: [PATCH 2/2] chore: drop dead TYPE_CHECKING block flagged by Copilot's review The only import in the block (Mengeneinheit) was already unused and got removed by ruff's autofix, leaving a no-op `if TYPE_CHECKING: pass`. Co-Authored-By: Claude Sonnet 5 --- src/bo4e/com/zeitraum.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/bo4e/com/zeitraum.py b/src/bo4e/com/zeitraum.py index d914123f2..24915906d 100644 --- a/src/bo4e/com/zeitraum.py +++ b/src/bo4e/com/zeitraum.py @@ -3,7 +3,7 @@ """ from datetime import date, time -from typing import TYPE_CHECKING, Annotated, Literal +from typing import Annotated, Literal from pydantic import Field @@ -11,9 +11,6 @@ from ..utils import postprocess_docstring from .com import COM -if TYPE_CHECKING: - pass - # pylint: disable=too-few-public-methods @postprocess_docstring