From e5ca7d62a33d7a25ba56172baa348ef162655fc4 Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Tue, 23 Jun 2026 17:08:32 +0200 Subject: [PATCH] fix: protect wb.close() with try/finally, strengthen width assertions, declare openpyxl dev dep #83 - I-1: Add explicit lower bounds to width assertions (>= 15 for autre, >= 40 for objet) - I-2: Wrap write_excel() and close() in try/finally to ensure cleanup even on exception - M-2: Add openpyxl to dev dependencies in pyproject.toml Co-Authored-By: Claude Sonnet 4.6 --- pyproject.toml | 1 + src/utils/table.py | 18 ++++++++++-------- tests/test_excel.py | 4 ++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index bbe0206..5ae6ab6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ dev = [ "webdriver-manager", "dash[testing]", "fastexcel", + "openpyxl", ] [tool.pytest.ini_options] diff --git a/src/utils/table.py b/src/utils/table.py index 4790410..1a96289 100644 --- a/src/utils/table.py +++ b/src/utils/table.py @@ -579,11 +579,13 @@ def write_styled_excel(df: pl.DataFrame, buffer, worksheet: str = "DECP") -> Non for col in df.columns } wb = xlsxwriter.Workbook(buffer, {"default_format_properties": {"text_wrap": True}}) - ws = wb.add_worksheet(worksheet) - df.write_excel( - workbook=wb, - worksheet=ws, - header_format=_EXCEL_HEADER_FORMAT, - column_widths=col_widths, - ) - wb.close() + try: + ws = wb.add_worksheet(worksheet) + df.write_excel( + workbook=wb, + worksheet=ws, + header_format=_EXCEL_HEADER_FORMAT, + column_widths=col_widths, + ) + finally: + wb.close() diff --git a/tests/test_excel.py b/tests/test_excel.py index 9f9b022..711c276 100644 --- a/tests/test_excel.py +++ b/tests/test_excel.py @@ -41,8 +41,8 @@ def test_write_styled_excel_known_column_wider_than_minimum(): ws = wb.active width_autre = ws.column_dimensions["A"].width # colonne 1 = "autre" width_objet = ws.column_dimensions["B"].width # colonne 2 = "objet" - assert width_autre > 0 - assert width_objet > width_autre + assert width_autre >= 15 # 132px minimum → ~18.9 chars xlsxwriter, borne basse 15 + assert width_objet >= 40 # 350px → ~50 chars xlsxwriter, borne basse 40 def test_write_styled_excel_custom_worksheet_name():