pytest-fast 0.9.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,8 @@
1
+ Metadata-Version: 2.3
2
+ Name: pytest-fast
3
+ Version: 0.9.3
4
+ Summary: Resident forkserver-based pytest accelerator — collect once, fork warm workers, idempotently respawn on source/env change. POSIX only (uses forkserver).
5
+ Author: prostomarkeloff
6
+ Author-email: prostomarkeloff <prostomarkeloff@ohreally.me>
7
+ Requires-Dist: pytest>=8.0
8
+ Requires-Python: >=3.11
@@ -0,0 +1,80 @@
1
+ [project]
2
+ name = "pytest-fast"
3
+ version = "0.9.3"
4
+ description = "Resident forkserver-based pytest accelerator — collect once, fork warm workers, idempotently respawn on source/env change. POSIX only (uses forkserver)."
5
+ authors = [
6
+ { name = "prostomarkeloff", email = "prostomarkeloff@ohreally.me" }
7
+ ]
8
+ requires-python = ">=3.11"
9
+ dependencies = [
10
+ "pytest>=8.0",
11
+ ]
12
+
13
+ [project.scripts]
14
+ pytest-fast = "pytest_fast:main_cli"
15
+
16
+ # Auto-register as a pytest plugin so `pytest --fast` works without `-p pytest_fast`.
17
+ # The hooks are inert unless --fast is passed (like xdist without -n), and the daemon's
18
+ # own collection / worker protocol never invoke pytest_runtestloop, so there's no recursion.
19
+ [project.entry-points.pytest11]
20
+ pytest_fast = "pytest_fast"
21
+
22
+ [dependency-groups]
23
+ dev = [
24
+ "hypothesis>=6.155.2",
25
+ "pyinstrument>=5.0",
26
+ "pyright>=1.1.409",
27
+ "ruff>=0.15.14",
28
+ ]
29
+ xdist-parity = [
30
+ "pytest-xdist>=3.8.0",
31
+ ]
32
+
33
+ [build-system]
34
+ requires = ["uv_build>=0.8.1,<0.9.0"]
35
+ build-backend = "uv_build"
36
+
37
+ [tool.pytest.ini_options]
38
+ # The fuzz/stress layer is OPT-IN: a bare `pytest` (and the dogfood `make test-full`,
39
+ # which passes its own non-empty `-m` that wins over this default) skips both markers.
40
+ # The dedicated CI job re-includes them with `-m "fuzz or stress"` (a CLI `-m` overrides
41
+ # this addopts one). See tests/test_fuzz_*.py / tests/test_stress_daemon.py.
42
+ addopts = "-m 'not fuzz and not stress and not parity'"
43
+ markers = [
44
+ "fuzz: property-based / fuzz tests (Hypothesis); deterministic, safe, opt-in",
45
+ "stress: heavy stress / resource-exhaustion tests against a live daemon; opt-in",
46
+ "parity: differential tests (engine vs plain pytest vs xdist); opt-in, needs xdist-parity",
47
+ ]
48
+
49
+ [tool.ruff]
50
+ target-version = "py311"
51
+ line-length = 120
52
+ src = ["src", "tests"]
53
+
54
+ [tool.ruff.lint]
55
+ # Conservative ruleset: errors/warnings, pyflakes, pyupgrade, isort, bugbear, naming, comprehensions, simplify.
56
+ select = ["E", "F", "W", "I", "B", "UP", "N", "C4", "SIM", "RUF"]
57
+ ignore = [
58
+ # `_collect()` uses `except BaseException:` on purpose to surface forkserver-preload errors.
59
+ "BLE001",
60
+ # We use `assert` for invariants (config is not None) where mypy/pyright already enforces it.
61
+ "S101",
62
+ # Unicode ambiguity in technical writing (× for multiplication, – for ranges, → for flow).
63
+ # We intentionally use these in docstrings; they're not confusable in our context.
64
+ "RUF001",
65
+ "RUF002",
66
+ "RUF003",
67
+ ]
68
+
69
+ [tool.ruff.lint.per-file-ignores]
70
+ # Tests intentionally reach into `_*`-prefixed internals.
71
+ "tests/*" = ["SLF001"]
72
+
73
+ [tool.pyright]
74
+ include = ["src", "tests"]
75
+ pythonVersion = "3.11"
76
+ typeCheckingMode = "basic"
77
+ # We use `cast()` extensively for typeshed mismatches (multiprocessing context, pickle reply
78
+ # shapes). Basic mode is strict enough to catch real bugs without drowning in casts.
79
+ reportMissingImports = true
80
+ reportUnusedImport = true