Skip to content

Commit 265d4e8

Browse files
committed
Added neat log isolation so it didn't keep writing test logs into the repo dir
1 parent 7c0c852 commit 265d4e8

3 files changed

Lines changed: 31 additions & 37 deletions

File tree

tests/conftest.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import logging
2+
import pytest
3+
4+
5+
@pytest.fixture(autouse=True)
6+
def _isolate_neat_logging():
7+
"""
8+
Close and remove any FileHandlers attached to NEAT loggers before each test.
9+
Prevents 'ValueError: I/O operation on closed file' errors when a FileHandler
10+
from a previous test is still attached after its underlying file is closed.
11+
Propagation is left intact so caplog can capture NEAT log output.
12+
"""
13+
def _close_file_handlers(logger):
14+
for h in list(logger.handlers):
15+
if isinstance(h, logging.FileHandler):
16+
logger.removeHandler(h)
17+
try:
18+
h.close()
19+
except Exception:
20+
pass
21+
22+
for name, logger in list(logging.Logger.manager.loggerDict.items()):
23+
if (name == "neat" or name.startswith("neat.")) and isinstance(logger, logging.Logger):
24+
_close_file_handlers(logger)
25+
26+
yield
27+
28+
for name, logger in list(logging.Logger.manager.loggerDict.items()):
29+
if (name == "neat" or name.startswith("neat.")) and isinstance(logger, logging.Logger):
30+
_close_file_handlers(logger)

tests/test_cli/test_basic_cli.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ def test_basic_cli():
3636
stdout=subprocess.PIPE,
3737
stderr=subprocess.PIPE,
3838
text=True,
39+
cwd=str(td),
3940
)
4041
assert proc.returncode == 0, f"STDERR:\n{proc.stderr}"
4142
assert out.exists()

tests/test_read_simulator/test_options.py

Lines changed: 0 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
from neat.read_simulator.utils.options import Options
22

33
from pathlib import Path as _PathAlias
4-
import logging as _logging
54
import numpy as _np
65
import textwrap as _textwrap
76
import pytest as _pytest
@@ -11,42 +10,6 @@ def _project_root() -> _PathAlias:
1110
return _PathAlias(__file__).resolve().parents[2]
1211

1312

14-
@_pytest.fixture(autouse=True)
15-
def _isolate_neat_logging():
16-
"""
17-
Prevent flaky 'ValueError: I/O operation on closed file' logging errors under pytest.
18-
"""
19-
# Clear handlers on NEAT and all child loggers
20-
for name, logger in list(_logging.Logger.manager.loggerDict.items()):
21-
if name == "neat" or name.startswith("neat."):
22-
if isinstance(logger, _logging.Logger):
23-
for h in list(logger.handlers):
24-
logger.removeHandler(h)
25-
try:
26-
h.close()
27-
except Exception:
28-
pass
29-
logger.handlers.clear()
30-
logger.propagate = True # child loggers will propagate to 'neat'
31-
32-
neat_logger = _logging.getLogger("neat")
33-
neat_logger.handlers.clear()
34-
neat_logger.addHandler(_logging.NullHandler())
35-
neat_logger.propagate = False # stop at 'neat' (do not reach root)
36-
37-
yield
38-
39-
# Rremove NullHandler
40-
for h in list(neat_logger.handlers):
41-
neat_logger.removeHandler(h)
42-
try:
43-
h.close()
44-
except Exception:
45-
pass
46-
neat_logger.handlers.clear()
47-
neat_logger.propagate = True
48-
49-
5013
def test_basic_options():
5114
reference = _project_root() / "data" / "H1N1.fa"
5215
base_options = Options(reference)

0 commit comments

Comments
 (0)