Fix all remaining resource warnings, refs #693

https://gistpreview.github.io/?0bb8e869b82f6ff0db647de755182502
This commit is contained in:
Simon Willison 2025-12-11 16:46:05 -08:00
commit dc9947a5e1
7 changed files with 110 additions and 61 deletions

View file

@ -9,7 +9,29 @@ import json
import os
import sys
from . import recipes
from typing import Dict, cast, BinaryIO, Iterable, Optional, Tuple, Type
from typing import Dict, cast, BinaryIO, Iterable, Iterator, Optional, Tuple, Type
class _CloseableIterator(Iterator[dict]):
"""Iterator wrapper that closes a file when iteration is complete."""
def __init__(self, iterator: Iterator[dict], closeable: io.IOBase):
self._iterator = iterator
self._closeable = closeable
def __iter__(self) -> "_CloseableIterator":
return self
def __next__(self) -> dict:
try:
return next(self._iterator)
except StopIteration:
self._closeable.close()
raise
def close(self) -> None:
self._closeable.close()
import click
@ -299,7 +321,8 @@ def rows_from_file(
reader = csv.DictReader(decoded_fp, dialect=dialect)
else:
reader = csv.DictReader(decoded_fp)
return _extra_key_strategy(reader, ignore_extras, extras_key), Format.CSV
rows = _extra_key_strategy(reader, ignore_extras, extras_key)
return _CloseableIterator(iter(rows), decoded_fp), Format.CSV
elif format == Format.TSV:
rows = rows_from_file(
fp, format=Format.CSV, dialect=csv.excel_tab, encoding=encoding