Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions e2e_projects/hot_fork_basic/pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
[project]
name = "hf-calc"
version = "0.1.0"
requires-python = ">=3.10"

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.mutmut]
process_isolation = "hot-fork"

[tool.pytest.ini_options]
asyncio_default_fixture_loop_scope = "function"
14 changes: 14 additions & 0 deletions e2e_projects/hot_fork_basic/src/hf_calc/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
def add(a, b):
return a + b


def sub(a, b):
return a - b


def mul(a, b):
return a * b


def untested(x):
return x + 1
15 changes: 15 additions & 0 deletions e2e_projects/hot_fork_basic/tests/test_hf_calc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from hf_calc import add
from hf_calc import mul
from hf_calc import sub


def test_add():
assert add(1, 2) == 3


def test_sub():
assert sub(5, 2) == 3


def test_mul():
assert mul(3, 4) == 12
41 changes: 22 additions & 19 deletions src/mutmut/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,43 +2,46 @@

import importlib.metadata
import warnings
from collections import defaultdict

from mutmut.configuration import Config
from mutmut.configuration import config
from mutmut.configuration import reset_config
from mutmut.state import reset_state
from mutmut.state import state

__version__ = importlib.metadata.version("mutmut")


stats_time: float | None = None
duration_by_test: dict[str, float] = defaultdict(float)
tests_by_mangled_function_name: dict[str, set[str]] = defaultdict(set)

_stats: set[str] = set()
_covered_lines: dict[str, set[int]] | None = None
_DEPRECATED_STATE_ATTRS = frozenset(
{
"stats_time",
"duration_by_test",
"tests_by_mangled_function_name",
"_stats",
"_covered_lines",
}
)


def __getattr__(name: str) -> object:
match name:
case "config":
warnings.warn(
"mutmut.config is deprecated as of 3.4.1, use mutmut.configuration.Config.get() instead",
"mutmut.config is deprecated as of 3.4.1, use mutmut.configuration.config() instead",
FutureWarning,
stacklevel=2,
)
return config()
case name if name in _DEPRECATED_STATE_ATTRS:
warnings.warn(
f"mutmut.{name} is deprecated, use mutmut.state.state().{name} instead",
FutureWarning,
stacklevel=2,
)
return Config.get()
return getattr(state(), name)
case _:
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")


def _reset_globals() -> None:
global duration_by_test, stats_time, _stats, tests_by_mangled_function_name
global _covered_lines

duration_by_test.clear()
stats_time = None
Config.reset()
_stats = set()
tests_by_mangled_function_name = defaultdict(set)
_covered_lines = None
reset_config()
reset_state()
Loading