Conversation
| yield _Cell(table_column, docx_table_row.table) | ||
|
|
||
|
|
||
| _subsequent_step_pattern = re.compile(r"^(?P<bool>(?:ja)|(?:nein))\s*(?P<subsequent_step_number>(?:\d)|ende)?") |
There was a problem hiding this comment.
Müsste es nicht eher
| _subsequent_step_pattern = re.compile(r"^(?P<bool>(?:ja)|(?:nein))\s*(?P<subsequent_step_number>(?:\d)|ende)?") | |
| _subsequent_step_pattern = re.compile(r"^(?P<bool>(?:ja)|(?:nein))\s*(?P<subsequent_step_number>(?:\d+\*?)|Ende)?") |
sein? Zumindest hattest du (?:\d+\*?)|(Ende) als regex Validator in den EbdTable Feldern für die subsequent step number angegeben.
Edit: Hat der vorher beim ende überhaupt gematched? Der regex ist ja case-sensitive, wenn ich nicht irre und in den Tabellen ist Ende immer groß geschrieben?
There was a problem hiding this comment.
Hat der vorher beim ende überhaupt gematched?
er matched weiter unten gegen cell.text.lower() deswegen klappt das
There was a problem hiding this comment.
<-- jetzt dokumentiert
| if subsequent_step_number == "ende": | ||
| subsequent_step_number = "Ende" |
There was a problem hiding this comment.
Wenn ich das richtig sehe, ist Ende in den Tabellen immer groß geschrieben. Hab den regex oben angepasst, die Zeilen hier müssten also obsolet sein, oder?
| if subsequent_step_number == "ende": | |
| subsequent_step_number = "Ende" |
There was a problem hiding this comment.
der regex verwendet lowercase weil ich nicht ausschließen will, dass die leute manchmal "Ja" und manchmal "ja" schreiben. aber ich sehe, dass ein erklärender kommentar gut wäre.
| self._column_index_result_code: int | ||
| self._column_index_note: int | ||
| self._row_index_last_header: Literal[0, 1] # either 0 or 1 | ||
| for row_index in range(0, 2): # just check the first two rows in the constructor |
There was a problem hiding this comment.
Hier wäre vielleicht ein Kommentar ganz nett, dass es sich dabei um die Kopfzeilen der Tabelle handelt.
| break # because the prüfende rolle is always a full row with identical column cells | ||
| if table_cell.text == "Nr.": | ||
| self._column_index_step_number = column_index | ||
| self._row_index_last_header = row_index # type:ignore[assignment] |
There was a problem hiding this comment.
In welchem Fall kann _row_index_last_header denn 0 sein?
There was a problem hiding this comment.
wenn die erste row der tabelle nicht die Prüfende Rolle enthält: c606c61
| A class for tests of the entire package/library | ||
| """ | ||
|
|
||
| @pytest.mark.datafiles("./test_data/ebd20221128.docx") |
There was a problem hiding this comment.
| @pytest.mark.datafiles("./test_data/ebd20221128.docx") | |
| @pytest.mark.datafiles("./test_data") |
Wenn ich deine get_document Methode richtig verstanden habe, müsstest du den Dateinamen beim ersten Argument immer weglassen, oder?
There was a problem hiding this comment.
aber der datafiles marker braucht die angabe des vollen dateinamens. Die dort genannten Dateien werden dann in ein temporäres Verzeichnis kopiert, auf das man im code dann über datafiles/<dateiname> zugreifen kann.
| with open(docx_file_path, "rb") as docx_file: | ||
| source_stream = BytesIO(docx_file.read()) | ||
| # switched from StringIO to BytesIO because of: | ||
| # UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 605: character maps to <undefined> |
There was a problem hiding this comment.
ich gehe davon aus, dass du das encoding bei open angegeben hast oder?
open('readme.txt', encoding="utf-8")| opens and returns the document specified in the docx_file_path using python-docx | ||
| """ | ||
| # https://python-docx.readthedocs.io/en/latest/user/documents.html#opening-a-file-like-document | ||
| with open(docx_file_path, "rb") as docx_file: |
There was a problem hiding this comment.
müsste man noch den Fall abfangen, dass die Datei nicht da ist?
from pathlib import Path
p = Path.home()
print(p)
print(p.exists())There was a problem hiding this comment.
Ich muss den fall nicht abfangen. Es ist ok, wenn er mit einem FileNotFoundError stirbt. Den Fehler zu kaschieren bringt ja auch nichts
There was a problem hiding this comment.
joa, man könnte ihn mit einer schöneren Fehlermeldung aussteigen lassen. Aber ja, passt für mich
| @@ -1,3 +1,67 @@ | |||
| """ | |||
| src contains all your business logic | |||
| Contains high level functions to process .docx files | |||
There was a problem hiding this comment.
Sind die Funktionen hier in der __init__.py sinnvoll hinterlegt?
Bin mir selbst nie so ganz sicher, was man am besten in eine init Datei schreibt.
There was a problem hiding this comment.
mir auch nicht :D
| next_table_is_requested_table = paragraph.text.startswith(ebd_key) | ||
| if isinstance(table_or_paragraph, Table) and next_table_is_requested_table: |
There was a problem hiding this comment.
ich denke das übernehme ich für den kohlrahbi
| @@ -0,0 +1,128 @@ | |||
| """ | |||
| This a docstring for the module. | |||
There was a problem hiding this comment.
achso, wirklich? Das hätte ich jetzt nicht erwartet ;P
|
|
||
| class _EbdSubRowPosition(Enum): | ||
| """ | ||
| describes the position of a subrow in the Docx Table |
There was a problem hiding this comment.
kannst du hier ein Beispiel anfügen?
| if row_index == 0 and _is_pruefende_rolle_cell(table_cell): | ||
| role = table_cell.text.split(":")[1].strip() | ||
| break # because the prüfende rolle is always a full row with identical column cells | ||
| if table_cell.text == "Nr.": |
There was a problem hiding this comment.
willst du hier extra so streng sein oder wäre ein startswith auch in Ordnung?
There was a problem hiding this comment.
ich würde solange streng sein, bis es failed.
| converts docx tables to EbdTables | ||
| """ | ||
|
|
||
| def __init__(self, docx_table: Table, ebd_key: str, chapter: str, sub_chapter: str): |
There was a problem hiding this comment.
vielleicht wäre es hier sinnvoll auch eine classmethod zu verwenden, um eine Instanz von DocxTableConverter zu erstellen, die etwas unabhängiger ist von dem Datenmodell.
Vergleiche https://github.com/Hochfrequenz/kohlrahbi/blob/53cf14c10cf1b965281dd705ce52126d9a3f3f50/src/kohlrahbi/helper/elixir.py#L48-L52
There was a problem hiding this comment.
@hf-krechan kannst du dafür einen eigenen PR aufmachen? Ich sehe gerade den Nutzen noch nicht.
| sub_rows = [] | ||
| step_number = row_cells[self._column_index_step_number].text.strip() | ||
| description = row_cells[self._column_index_description].text.strip() | ||
| boolean_outcome, subsequent_step_number = _cell_to_bool(row_cells[self._column_index_check_result]) |
There was a problem hiding this comment.
wenn du oben einen besseren Namen für den boolean hast, wäre er hier auch angebracht ;)
There was a problem hiding this comment.
findest du boolean_outcome noch schlecht? oder soll ich es besser "ja"/"nein" nennen? mir fällt kein besserer name ein.
| @@ -0,0 +1,10 @@ | |||
| # Test Data (.docx) | |||
There was a problem hiding this comment.
das ist natürlich nun sehr praktisch, dass du nur spezifische EBDs aus den docx ziehst.
mmmh ich überlege mal ob mir das auch gelingt im Kohlrahbi 👍
Co-authored-by: Leon Haffmans <49658102+lord-haffi@users.noreply.github.com>
| self._column_index_result_code = column_index | ||
| elif table_cell.text == "Hinweis": | ||
| self._column_index_note = column_index | ||
| self._metadata = EbdTableMetaData(ebd_code=ebd_key, sub_chapter=sub_chapter, chapter=chapter, role=role) |
There was a problem hiding this comment.
wenn die erste row der tabelle nicht die Prüfende Rolle enthält: c606c61
In dem Fall ist die Variable role aber dann nicht gesetzt, oder? Der müsste hier ja dann eigentlich crashen, testest du den Fall ab?
There was a problem hiding this comment.
Ja das crasht dann. Fände ich aber ok, dann muss man sehen was der Grund ist.
Ich verstehe deinen Punkt: der Code erweckt den Eindruck er sei ganz flexibel und auf alle eventualitäten vorbereitet aber tatsächlich kann er nur den einen aktuell abgetesteten Fall handlen.
There was a problem hiding this comment.
In dem Fall ist die Variable role aber dann nicht gesetzt, oder?
#9 da isser, der fall :)
|
Der Rest lgtm |
No description provided.