Skip to content

Commit 85aa5fc

Browse files
committed
fix: add more isolation from os-module mocking
1 parent 9a36d33 commit 85aa5fc

File tree

6 files changed

+20
-3
lines changed

6 files changed

+20
-3
lines changed

CHANGES.rst

+5
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,14 @@ Unreleased
2727
statements changed how they traced. This affected whether people saw the
2828
fix for `issue 1880`_.
2929

30+
- fix: isolate our code more from mocking in the os module that in rare cases
31+
can cause `bizarre behavior <pytest-cov-666_>`_.
32+
3033
- refactor: some code unreachable code paths in parser.py were changed to
3134
asserts. If you encounter any of these, please let me know!
3235

36+
.. _pytest-cov-666: https://github.com/pytest-dev/pytest-cov/issues/666
37+
3338

3439
.. start-releases
3540

coverage/core.py

+3
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
from coverage import env
1313
from coverage.disposition import FileDisposition
1414
from coverage.exceptions import ConfigError
15+
from coverage.misc import isolate_module
1516
from coverage.pytracer import PyTracer
1617
from coverage.sysmon import SysMonitor
1718
from coverage.types import (
@@ -21,6 +22,8 @@
2122
)
2223

2324

25+
os = isolate_module(os)
26+
2427
try:
2528
# Use the C extension code when we can, for speed.
2629
from coverage.tracer import CTracer, CFileDisposition

coverage/inorout.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import inspect
1010
import itertools
1111
import os
12+
import os.path
1213
import platform
1314
import re
1415
import sys
@@ -26,7 +27,7 @@
2627
from coverage.exceptions import CoverageException, PluginError
2728
from coverage.files import TreeMatcher, GlobMatcher, ModuleMatcher
2829
from coverage.files import prep_patterns, find_python_files, canonical_filename
29-
from coverage.misc import sys_modules_saved
30+
from coverage.misc import isolate_module, sys_modules_saved
3031
from coverage.python import source_for_file, source_for_morf
3132
from coverage.types import TFileDisposition, TMorf, TWarnFn, TDebugCtl
3233

@@ -57,6 +58,8 @@
5758
pass
5859

5960

61+
os = isolate_module(os)
62+
6063
def canonical_path(morf: TMorf, directory: bool = False) -> str:
6164
"""Return the canonical path of the module or file `morf`.
6265

coverage/parser.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,12 @@
2323
from coverage.bytecode import code_objects
2424
from coverage.debug import short_stack
2525
from coverage.exceptions import NoSource, NotPython
26-
from coverage.misc import nice_pair
26+
from coverage.misc import isolate_module, nice_pair
2727
from coverage.phystokens import generate_tokens
2828
from coverage.types import TArc, TLineNo
2929

30+
os = isolate_module(os)
31+
3032

3133
class PythonParser:
3234
"""Parse code to find executable lines, excluded lines, etc.

coverage/sysmon.py

+3
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
)
2424

2525
from coverage.debug import short_filename, short_stack
26+
from coverage.misc import isolate_module
2627
from coverage.types import (
2728
AnyCallable,
2829
TArc,
@@ -36,6 +37,8 @@
3637
TWarnFn,
3738
)
3839

40+
os = isolate_module(os)
41+
3942
# pylint: disable=unused-argument
4043

4144
LOG = False

coverage/tomlconfig.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,10 @@
1313

1414
from coverage import env
1515
from coverage.exceptions import ConfigError
16-
from coverage.misc import import_third_party, substitute_variables
16+
from coverage.misc import import_third_party, isolate_module, substitute_variables
1717
from coverage.types import TConfigSectionOut, TConfigValueOut
1818

19+
os = isolate_module(os)
1920

2021
if env.PYVERSION >= (3, 11, 0, "alpha", 7):
2122
import tomllib # pylint: disable=import-error

0 commit comments

Comments
 (0)