fix: clear all latent deprecation + resource warnings

Three real issues surfaced when running the suite with strict warnings:

1. src/core/format_standardize.py: ``datetime.utcfromtimestamp`` is
   deprecated in CPython 3.12 and slated for removal. Replace with
   ``datetime.fromtimestamp(ts, tz=timezone.utc)``. Output for the
   date-only format codes we use is byte-identical.

2. src/core/io.py: ``list_sheets`` leaked the openpyxl file handle by
   returning ``xl.sheet_names`` from an unclosed ``pd.ExcelFile``.
   Wrap in a ``with`` block so the FD closes deterministically — also
   prevents the Windows-only "file is locked" repro path.

3. tests/test_corpus.py: ``TestXlsxPollution.workbook`` fixture
   returned the bare ``pd.ExcelFile`` instead of yielding + closing.
   Convert to a yield-and-finally pattern so the class-scoped handle
   isn't leaked across the whole test file.

Also harden pytest.ini's warning policy: escalate
``ResourceWarning`` from ``src`` to an error, alongside the existing
``DeprecationWarning`` rule. Third-party warnings stay filtered — we
can't fix pandas/openpyxl/streamlit churn from here.

All 1916 tests pass under the strict filter; full and split runs
(``pytest``, ``pytest -m 'not gui'``, ``pytest -m gui``) all clean.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-13 16:28:48 +00:00
parent 070e3c9f06
commit b2c7b94fe9
4 changed files with 32 additions and 8 deletions

View File

@@ -204,8 +204,17 @@ class TestXlsxPollution:
@pytest.fixture(scope="class")
def workbook(self):
# ``ExcelFile`` is a context manager — using ``yield`` + close in
# a finally lets us share one open handle across the class while
# still closing it deterministically. Returning the object bare
# leaks the file descriptor and trips strict resource-warning
# filters under recent pytest versions.
path = TEST_DATA / "21_excel_pollution.xlsx"
return pd.ExcelFile(path, engine="openpyxl")
xl = pd.ExcelFile(path, engine="openpyxl")
try:
yield xl
finally:
xl.close()
def test_sheets_present(self, workbook):
names = set(workbook.sheet_names)