rebdhuhn
🇩🇪 Dieses Repository enthält ein Python-Paket namens rebdhuhn, das genutzt werden kann, um aus .docx-Dateien extrahierte maschinenlesbare Tabellen, die einen Entscheidungsbaum (EBD) modellieren, in echte Graphen zu konvertieren. Diese Entscheidungsbäume sind Teil eines regulatorischen Regelwerks für die deutsche Energiewirtschaft und kommen in der Eingangsprüfung der Marktkommunikation zum Einsatz.
🇬🇧 This repository contains the source code of the Python package rebdhuhn.
Rationale
Assume, that you scraped the Entscheidungsbaumdiagramm tables by EDI@Energy from their somewhat "digitized" PDF/DOCX files.
(To do so, you can use the package ebdamame.)
Also assume, that the result of your scraping is a rebdhuhn.models.EbdTable.
The package rebdhuhn contains logic to convert your scraped data into a graph.
This graph can then be exported e.g. as SVG and/or UML.
ebdamame and rebdhuhn combined are the core of our ebd_toolchain which scrapes EBD.docx files from the edi_energy_mirror and pushes them to machine_readable-entscheidungsbaumdiagramme.
How to use rebdhuhn?
Install the package from pypi:
pip install rebdhuhn
Create an Instance of EbdTable
EbdTable contains the raw data by BDEW in a machine-readable format.
Creating instances of EbdTable is out of scope for this package.
Ask Hochfrequenz for support on this topic.
In the following example we hard code the information.
from rebdhuhn.graph_conversion import convert_table_to_graph
from rebdhuhn.models import EbdCheckResult, EbdTable, EbdTableMetaData, EbdTableRow, EbdTableSubRow, EbdGraph
ebd_table: EbdTable # this is the result of scraping the docx file
ebd_table = EbdTable( # this data shouldn't be handwritten
metadata=EbdTableMetaData(
ebd_code="E_0003",
chapter="MaBiS",
section="7.39 AD: Bestellung der Aggregationsebene der Bilanzkreissummenzeitreihe auf Ebene der Regelzone",
ebd_name="Bestellung der Aggregationsebene RZ prüfen",
role="ÜNB",
),
rows=[
EbdTableRow(
step_number="1",
description="Erfolgt der Eingang der Bestellung fristgerecht?",
sub_rows=[
EbdTableSubRow(
check_result=EbdCheckResult(result=False, subsequent_step_number=None),
result_code="A01",
note="Fristüberschreitung",
),
EbdTableSubRow(
check_result=EbdCheckResult(result=True, subsequent_step_number="2"),
result_code=None,
note=None,
),
],
),
EbdTableRow(
step_number="2",
description="Erfolgt die Bestellung zum Monatsersten 00:00 Uhr?",
sub_rows=[
EbdTableSubRow(
check_result=EbdCheckResult(result=False, subsequent_step_number=None),
result_code="A02",
note="Gewählter Zeitpunkt nicht zulässig",
),
EbdTableSubRow(
check_result=EbdCheckResult(result=True, subsequent_step_number="Ende"),
result_code=None,
note=None,
),
],
),
],
)
assert isinstance(ebd_table, EbdTable)
ebd_graph = convert_table_to_graph(ebd_table)
assert isinstance(ebd_graph, EbdGraph)
Export as PlantUML
from rebdhuhn import convert_graph_to_plantuml
plantuml_code = convert_graph_to_plantuml(ebd_graph)
with open("e_0003.puml", "w+", encoding="utf-8") as uml_file:
uml_file.write(plantuml_code)
The file e_0003.puml now looks like this:
@startuml
...
if (<b>1: </b> Erfolgt der Eingang der Bestellung fristgerecht?) then (ja)
else (nein)
:A01;
note left
Fristüberschreitung
endnote
kill;
endif
if (<b>2: </b> Erfolgt die Bestellung zum Monatsersten 00:00 Uhr?) then (ja)
end
else (nein)
:A02;
note left
Gewählter Zeitpunkt nicht zulässig
endnote
kill;
endif
@enduml
Export the graph as SVG
To export the graph as SVG, you need a Kroki instance. You can either:
- Use the public instance at
https://kroki.io - Run a local instance via Docker:
docker run -p 8125:8000 yuzutech/kroki:0.24.1
Then use
from rebdhuhn import convert_plantuml_to_svg_kroki
from rebdhuhn.kroki import Kroki
kroki_client = Kroki()
svg_code = convert_plantuml_to_svg_kroki(plantuml_code, kroki_client)
with open("e_0003.svg", "w+", encoding="utf-8") as svg_file:
svg_file.write(svg_code)
Error Handling
rebdhuhn provides three base exception classes to help you distinguish between errors in different pipeline stages:
| Exception | Pipeline Stage | Description |
|---|---|---|
GraphConversionError |
table → graph | Errors during table-to-graph conversion. Affects both SVG and PlantUML. |
PlantumlConversionError |
graph → puml | Errors specific to PlantUML generation. |
SvgConversionError |
graph → dot → svg | Errors specific to SVG/DOT generation via Kroki. |
This allows you to handle PlantUML failures gracefully while still generating SVG output:
from rebdhuhn import (
convert_table_to_graph,
convert_graph_to_plantuml,
convert_graph_to_dot,
convert_dot_to_svg_kroki,
GraphConversionError,
PlantumlConversionError,
SvgConversionError,
)
from rebdhuhn.kroki import Kroki
# ebd_table is an instance of EbdTable (see above for how to create one)
kroki_client = Kroki() # requires a running Kroki instance
try:
graph = convert_table_to_graph(ebd_table)
except GraphConversionError:
# Table-to-graph conversion failed - neither SVG nor PlantUML will work
raise
# SVG generation (primary)
try:
dot_code = convert_graph_to_dot(graph)
svg = convert_dot_to_svg_kroki(dot_code, kroki_client)
except SvgConversionError:
print("SVG generation failed")
# PlantUML generation (secondary)
try:
puml_code = convert_graph_to_plantuml(graph)
except PlantumlConversionError:
print("PlantUML generation failed (non-critical)")
How to use this Repository on Your Machine (for development)
Please follow the instructions in our Python Template Repository . And for further information, see the uv documentation.
Running Tests
Tests use testcontainers to automatically start a Kroki instance when needed. Make sure Docker is installed and running. Tests that require Kroki will be skipped if Docker is not available.
Contribute
You are very welcome to contribute to this template repository by opening a pull request against the main branch.
Related Tools and Context
This repository is part of the Hochfrequenz Libraries and Tools for a truly digitized market communication.
Metadata
Release files for rebdhuhn 1.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| rebdhuhn-1.2.1.tar.gz | 159.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| rebdhuhn-1.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 220.1 kB
Release files / rebdhuhn-1.2.1.tar.gz
| Download URL | rebdhuhn-1.2.1.tar.gz |
|---|---|
| Size | 159.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c87bc289f38e274fa97c982cc84f1da5af74dee459a65df2fa7470a3737d2c50
|
|
BLAKE2b-256 checksum How to use checksums |
1f3d13b97d50271f9b009d0c2522d9c86e833884dff8c632e8c227029e8bbc6f
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / rebdhuhn-1.2.1-py3-none-any.whl
| Download URL | rebdhuhn-1.2.1-py3-none-any.whl |
|---|---|
| Size | 60.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
63b04bb2fd6878b01c2500a0756fadb0ebde1af6957ba01711dcbd63f4755f80
|
|
BLAKE2b-256 checksum How to use checksums |
e7d0f13875777a9518fb0ca55d0d1040a99f7a726d807715ab48bfa2733ee41b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for rebdhuhn 1.2.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.