provide-testkit 0.3.31__tar.gz → 0.4.2__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.
Files changed (117) hide show
  1. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/PKG-INFO +10 -10
  2. provide_testkit-0.4.2/VERSION +1 -0
  3. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/pyproject.toml +38 -16
  4. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/process/script_fixtures.py +1 -1
  5. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/cli.py +3 -1
  6. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/profiling/profiler.py +1 -1
  7. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide_testkit.egg-info/PKG-INFO +10 -10
  8. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide_testkit.egg-info/requires.txt +13 -9
  9. provide_testkit-0.3.31/VERSION +0 -1
  10. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/LICENSE +0 -0
  11. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/README.md +0 -0
  12. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/setup.cfg +0 -0
  13. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/__init__.py +0 -0
  14. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/__init__.py +0 -0
  15. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/__main__.py +0 -0
  16. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/_blocker.py +0 -0
  17. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/_early_init.py +0 -0
  18. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/_install_blocker.py +0 -0
  19. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/_install_pth.py +0 -0
  20. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/base/__init__.py +0 -0
  21. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/base/foundation.py +0 -0
  22. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/base/harness.py +0 -0
  23. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/base/minimal.py +0 -0
  24. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/chaos/__init__.py +0 -0
  25. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/chaos/concurrency_strategies.py +0 -0
  26. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/chaos/fixtures.py +0 -0
  27. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/chaos/io_strategies.py +0 -0
  28. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/chaos/strategies.py +0 -0
  29. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/chaos/time_strategies.py +0 -0
  30. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/cli/__init__.py +0 -0
  31. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/cli/runner.py +0 -0
  32. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/cli/testing.py +0 -0
  33. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/common/__init__.py +0 -0
  34. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/common/fixtures.py +0 -0
  35. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/conftest.py +0 -0
  36. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/crypto/__init__.py +0 -0
  37. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/crypto/fixtures.py +0 -0
  38. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/file/__init__.py +0 -0
  39. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/file/content_fixtures.py +0 -0
  40. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/file/directory_fixtures.py +0 -0
  41. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/file/fixtures.py +0 -0
  42. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/file/special_fixtures.py +0 -0
  43. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/file/temp.py +0 -0
  44. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/hub/__init__.py +0 -0
  45. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/hub/fixtures.py +0 -0
  46. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/logger/__init__.py +0 -0
  47. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/logger/hooks.py +0 -0
  48. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/logger/mocks.py +0 -0
  49. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/logger/reset.py +0 -0
  50. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/main.py +0 -0
  51. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/mocking/__init__.py +0 -0
  52. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/mocking/fixtures.py +0 -0
  53. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/mocking/time.py +0 -0
  54. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/process/__init__.py +0 -0
  55. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/process/async_fixtures.py +0 -0
  56. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/process/fixtures.py +0 -0
  57. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/process/script_assertions.py +0 -0
  58. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/process/subprocess_fixtures.py +0 -0
  59. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/process/system_fixtures.py +0 -0
  60. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/provide_testkit_init.pth +0 -0
  61. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/py.typed +0 -0
  62. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/pytest_plugin.py +0 -0
  63. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/__init__.py +0 -0
  64. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/artifacts.py +0 -0
  65. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/base.py +0 -0
  66. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/complexity/__init__.py +0 -0
  67. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/complexity/analyzer.py +0 -0
  68. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/complexity/fixture.py +0 -0
  69. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/coverage/__init__.py +0 -0
  70. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/coverage/fixture.py +0 -0
  71. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/coverage/reporter.py +0 -0
  72. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/coverage/tracker.py +0 -0
  73. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/decorators.py +0 -0
  74. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/documentation/__init__.py +0 -0
  75. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/documentation/checker.py +0 -0
  76. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/documentation/fixture.py +0 -0
  77. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/profiling/__init__.py +0 -0
  78. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/profiling/fixture.py +0 -0
  79. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/report.py +0 -0
  80. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/runner.py +0 -0
  81. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/security/__init__.py +0 -0
  82. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/security/fixture.py +0 -0
  83. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/security/gitleaks_scanner.py +0 -0
  84. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/security/pip_audit_scanner.py +0 -0
  85. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/security/safety_scanner.py +0 -0
  86. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/security/scanner.py +0 -0
  87. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/security/semgrep_scanner.py +0 -0
  88. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/quality/security/trufflehog_scanner.py +0 -0
  89. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/streams/__init__.py +0 -0
  90. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/streams/testing.py +0 -0
  91. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/threading/__init__.py +0 -0
  92. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/threading/basic_fixtures.py +0 -0
  93. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/threading/data_fixtures.py +0 -0
  94. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/threading/execution_fixtures.py +0 -0
  95. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/threading/fixtures.py +0 -0
  96. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/threading/sync_fixtures.py +0 -0
  97. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/time/__init__.py +0 -0
  98. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/time/classes.py +0 -0
  99. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/time/controlled.py +0 -0
  100. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/time/fixtures.py +0 -0
  101. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/time/freezing.py +0 -0
  102. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/time/measurement.py +0 -0
  103. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/time/mocking.py +0 -0
  104. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/time/rate_limiting.py +0 -0
  105. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/transport/__init__.py +0 -0
  106. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/transport/fixtures.py +0 -0
  107. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/utils/__init__.py +0 -0
  108. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/utils/environment.py +0 -0
  109. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide/testkit/utils/temp_env.py +0 -0
  110. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide_testkit.egg-info/SOURCES.txt +0 -0
  111. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide_testkit.egg-info/dependency_links.txt +0 -0
  112. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide_testkit.egg-info/entry_points.txt +0 -0
  113. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/src/provide_testkit.egg-info/top_level.txt +0 -0
  114. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/tests/test_async_fixtures.py +0 -0
  115. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/tests/test_early_init.py +0 -0
  116. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/tests/test_placeholder.py +0 -0
  117. {provide_testkit-0.3.31 → provide_testkit-0.4.2}/tests/test_pth_installation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: provide-testkit
3
- Version: 0.3.31
3
+ Version: 0.4.2
4
4
  Summary: Testing utilities and fixtures for the provide ecosystem.
5
5
  Author-email: Tim Perkins <code@tim.life>
6
6
  Maintainer-email: "provide.io" <code@provide.io>
@@ -24,7 +24,7 @@ Classifier: Typing :: Typed
24
24
  Requires-Python: >=3.11
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
- Requires-Dist: provide-foundation>=0.3.29
27
+ Requires-Dist: provide-foundation>=0.4.0
28
28
  Requires-Dist: attrs>=25.4.0
29
29
  Requires-Dist: click>=8.3.1
30
30
  Requires-Dist: pytest>=9.0.2
@@ -44,7 +44,7 @@ Requires-Dist: mutmut; extra == "quality"
44
44
  Provides-Extra: typecheck
45
45
  Requires-Dist: mypy; extra == "typecheck"
46
46
  Requires-Dist: pyright; extra == "typecheck"
47
- Requires-Dist: pyre-check; extra == "typecheck"
47
+ Requires-Dist: pyre-check; sys_platform != "win32" and extra == "typecheck"
48
48
  Requires-Dist: pyre-extensions; extra == "typecheck"
49
49
  Requires-Dist: pyrefly; extra == "typecheck"
50
50
  Requires-Dist: ty; extra == "typecheck"
@@ -63,7 +63,7 @@ Requires-Dist: pytest-benchmark; extra == "advanced-testing"
63
63
  Requires-Dist: pytest-testmon; extra == "advanced-testing"
64
64
  Requires-Dist: pytest-json-report; extra == "advanced-testing"
65
65
  Provides-Extra: profiling
66
- Requires-Dist: memray; extra == "profiling"
66
+ Requires-Dist: memray; sys_platform != "win32" and extra == "profiling"
67
67
  Requires-Dist: viztracer; extra == "profiling"
68
68
  Provides-Extra: transport
69
69
  Requires-Dist: httpx>=0.28.1; extra == "transport"
@@ -123,17 +123,17 @@ Requires-Dist: bandit; extra == "security"
123
123
  Requires-Dist: safety; extra == "security"
124
124
  Requires-Dist: pip-audit; extra == "security"
125
125
  Provides-Extra: standard
126
- Requires-Dist: provide-testkit[crypto,process,quality,transport]; extra == "standard"
126
+ Requires-Dist: provide-testkit[crypto,process,quality,transport]>=0.4.0; extra == "standard"
127
127
  Provides-Extra: grpc-dev
128
- Requires-Dist: provide-testkit[grpc,standard,typecheck]; extra == "grpc-dev"
128
+ Requires-Dist: provide-testkit[grpc,standard,typecheck]>=0.4.0; extra == "grpc-dev"
129
129
  Provides-Extra: pyvider-dev
130
- Requires-Dist: provide-testkit[advanced-testing,build,grpc,profiling,security,standard,typecheck]; extra == "pyvider-dev"
130
+ Requires-Dist: provide-testkit[advanced-testing,build,grpc,profiling,security,standard,typecheck]>=0.4.0; extra == "pyvider-dev"
131
131
  Provides-Extra: all
132
- Requires-Dist: provide-testkit[advanced-testing,build,crypto,docs,fuzzing,grpc,process,profiling,quality,security,transport,typecheck,utils]; extra == "all"
132
+ Requires-Dist: provide-testkit[advanced-testing,build,crypto,docs,fuzzing,grpc,process,profiling,quality,security,transport,typecheck,utils]>=0.4.0; extra == "all"
133
133
  Provides-Extra: dev
134
- Requires-Dist: provide-testkit[advanced-testing,quality]; extra == "dev"
134
+ Requires-Dist: provide-testkit[advanced-testing,quality]>=0.4.0; extra == "dev"
135
135
  Provides-Extra: docs-standalone
136
- Requires-Dist: provide-testkit[docs]; extra == "docs-standalone"
136
+ Requires-Dist: provide-testkit[docs]>=0.4.0; extra == "docs-standalone"
137
137
  Dynamic: license-file
138
138
 
139
139
  # 🧪✅ Provide TestKit
@@ -0,0 +1 @@
1
+ 0.4.2
@@ -1,5 +1,8 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2026 provide.io llc. All rights reserved.
2
+ # SPDX-License-Identifier: Apache-2.0
3
+
1
4
  #
2
- # provide-testkit/pyproject.toml
5
+ # provide-testkit>=0.4.0/pyproject.toml
3
6
  #
4
7
  # Testing utilities and fixtures for the provide ecosystem.
5
8
  #
@@ -36,7 +39,7 @@ classifiers = [
36
39
  "Typing :: Typed",
37
40
  ]
38
41
  dependencies = [
39
- "provide-foundation>=0.3.29",
42
+ "provide-foundation>=0.4.0",
40
43
  "attrs>=25.4.0",
41
44
  "click>=8.3.1", # For CLI testing utilities - SHARED with Foundation
42
45
  # Core testing - minimum version constraints for stability
@@ -71,7 +74,10 @@ quality = [
71
74
  typecheck = [
72
75
  "mypy",
73
76
  "pyright",
74
- "pyre-check",
77
+ # pyre-check publishes no Windows wheel (MacOS and POSIX::Linux only) and
78
+ # pulls testslide, which is Linux-only, so `uv sync` tries to build both from
79
+ # source on Windows and fails.
80
+ "pyre-check; sys_platform != 'win32'",
75
81
  "pyre-extensions",
76
82
  "pyrefly",
77
83
  "ty",
@@ -96,7 +102,11 @@ advanced-testing = [
96
102
 
97
103
  # Performance profiling (no upper bounds - use latest)
98
104
  profiling = [
99
- "memray",
105
+ # memray is a POSIX profiler -- it declares MacOS and POSIX::Linux, publishes
106
+ # no Windows wheel, and its scikit-build-core/CMake build fails outright
107
+ # against Visual Studio. Installing this extra on Windows used to break the
108
+ # whole resolution rather than skip the profiler.
109
+ "memray; sys_platform != 'win32'",
100
110
  "viztracer",
101
111
  ]
102
112
 
@@ -202,28 +212,28 @@ security = [
202
212
 
203
213
  # Convenience groups
204
214
  standard = [
205
- "provide-testkit[quality,transport,crypto,process]",
215
+ "provide-testkit[quality,transport,crypto,process]>=0.4.0",
206
216
  ]
207
217
 
208
218
  grpc-dev = [
209
- "provide-testkit[standard,grpc,typecheck]",
219
+ "provide-testkit[standard,grpc,typecheck]>=0.4.0",
210
220
  ]
211
221
 
212
222
  pyvider-dev = [
213
- "provide-testkit[standard,advanced-testing,typecheck,grpc,build,profiling,security]",
223
+ "provide-testkit[standard,advanced-testing,typecheck,grpc,build,profiling,security]>=0.4.0",
214
224
  ]
215
225
 
216
226
  all = [
217
- "provide-testkit[quality,typecheck,advanced-testing,profiling,transport,crypto,process,grpc,build,docs,utils,security,fuzzing]",
227
+ "provide-testkit[quality,typecheck,advanced-testing,profiling,transport,crypto,process,grpc,build,docs,utils,security,fuzzing]>=0.4.0",
218
228
  ]
219
229
 
220
230
  dev = [
221
- "provide-testkit[quality,advanced-testing]",
231
+ "provide-testkit[quality,advanced-testing]>=0.4.0",
222
232
  ]
223
233
 
224
234
  # Self-referential docs for testkit itself
225
235
  docs-standalone = [
226
- "provide-testkit[docs]",
236
+ "provide-testkit[docs]>=0.4.0",
227
237
  ]
228
238
 
229
239
  [project.scripts]
@@ -240,10 +250,10 @@ dev = [
240
250
  "mkdocs-macros-plugin",
241
251
  "mkdocstrings",
242
252
  "mkdocstrings-python",
243
- "provide-testkit[quality,advanced-testing]",
253
+ "provide-testkit[quality,advanced-testing]>=0.4.0",
244
254
  ]
245
255
  docs = [
246
- # provide-foundry - install separately for docs builds
256
+ # provide-foundry>=0.4.0 - install separately for docs builds
247
257
  ]
248
258
 
249
259
  ################################################################################
@@ -267,7 +277,7 @@ version = {file = "VERSION"}
267
277
  ################################################################################
268
278
 
269
279
  [tool.pytest.ini_options]
270
- minversion = "7.0"
280
+ minversion = "0.4.0"
271
281
  addopts = "-ra -s --strict-markers --strict-config -m 'not memray'"
272
282
  # Parallel execution: pytest -n <workers> (range: 2-16, recommend: CPU cores or 8, max: 16 to avoid xdist hang)
273
283
  asyncio_mode = "auto"
@@ -281,7 +291,6 @@ markers = [
281
291
  "slow: marks tests as slow (deselect with '-m \"not slow\"')",
282
292
  "integration: marks tests as integration tests",
283
293
  "unit: marks tests as unit tests",
284
- "memray: marks tests as memray allocation profiling tests",
285
294
  ]
286
295
 
287
296
  ################################################################################
@@ -292,6 +301,8 @@ markers = [
292
301
  target-version = "py311"
293
302
  line-length = 111
294
303
  indent-width = 4
304
+ # ruff format touches Python code blocks embedded in Markdown; docs prose is not the formatter's to restyle.
305
+ extend-exclude = ["**/*.md"]
295
306
 
296
307
  [tool.ruff.lint]
297
308
  select = ["E", "F", "W", "I", "UP", "ANN", "B", "BLE", "C90", "PIE", "PLR", "S", "SIM", "PTH", "RUF"]
@@ -309,6 +320,7 @@ ignore = [
309
320
  "PLR0911", # too-many-return-statements (refactor later)
310
321
  "PLR0912", # too-many-branches (refactor later)
311
322
  "PLR0913", # too-many-arguments (common in config classes)
323
+ "PLR0917", # too-many-positional-arguments (same rationale as PLR0913)
312
324
  "PLR0915", # too-many-statements (refactor later)
313
325
  "PLR2004", # magic-value-comparison (too noisy)
314
326
  ]
@@ -341,13 +353,24 @@ warn_redundant_casts = true
341
353
  warn_unused_ignores = true
342
354
  show_error_codes = true
343
355
 
356
+ # memray ships without .pyi stubs; try/except import pattern handles absence.
357
+ [[tool.mypy.overrides]]
358
+ module = ["memray", "memray.*"]
359
+ ignore_missing_imports = true
360
+
361
+ # click.Path(path_type=Path) returns a generic _PathType typevar mypy can't
362
+ # narrow; the pattern appears 12+ times in this CLI module.
363
+ [[tool.mypy.overrides]]
364
+ module = ["provide.testkit.quality.cli"]
365
+ disable_error_code = ["type-var"]
366
+
344
367
  [tool.coverage.run]
345
368
  source = ["src"]
346
369
  branch = true
347
370
  parallel = true
348
371
 
349
372
  [tool.coverage.report]
350
- fail_under = 40
373
+ fail_under = 40 # TODO: Restore to 70 after adding tests for quality/, streams/, threading/ modules
351
374
  exclude_lines = [
352
375
  "pragma: no cover",
353
376
  "def __repr__",
@@ -370,7 +393,6 @@ exclude_dirs = [".venv", "tests", "workenv"]
370
393
 
371
394
  [tool.security]
372
395
  # Paths to exclude from secret scanning (TruffleHog, GitGuardian, Gitleaks)
373
- # Run: we security generate (via wrknv) to regenerate tool configs
374
396
  description = "Test fixtures with example credentials - intentionally committed"
375
397
  allowed_paths = [
376
398
  # Test EC private keys used for mTLS/crypto testing fixtures
@@ -15,7 +15,7 @@ from __future__ import annotations
15
15
  from collections.abc import Callable, Generator
16
16
  from pathlib import Path
17
17
  import shutil
18
- import subprocess
18
+ import subprocess # nosec
19
19
 
20
20
  import attrs
21
21
  import pytest
@@ -55,6 +55,7 @@ def quality_cli(ctx: click.Context) -> None:
55
55
  @click.option("--config", type=click.Path(exists=True, path_type=Path), help="Configuration file (JSON)")
56
56
  @click.option("--verbose", "-v", is_flag=True, help="Verbose output")
57
57
  def analyze_command(
58
+ *,
58
59
  path: Path,
59
60
  tool: tuple[str, ...],
60
61
  artifact_dir: Path,
@@ -126,6 +127,7 @@ def analyze_command(
126
127
  )
127
128
  @click.option("--verbose", "-v", is_flag=True, help="Verbose output")
128
129
  def gates_command(
130
+ *,
129
131
  path: Path,
130
132
  coverage: float | None,
131
133
  security: float | None,
@@ -235,7 +237,7 @@ def _print_detailed_results(results: Any) -> None:
235
237
  @click.option("--xml", is_flag=True, help="Generate XML report")
236
238
  @click.option("--verbose", "-v", is_flag=True, help="Verbose output")
237
239
  def coverage_command(
238
- path: Path, min_coverage: float, artifact_dir: Path, html: bool, xml: bool, verbose: bool
240
+ *, path: Path, min_coverage: float, artifact_dir: Path, html: bool, xml: bool, verbose: bool
239
241
  ) -> None:
240
242
  """Run coverage analysis on the given path."""
241
243
  try:
@@ -25,7 +25,7 @@ try:
25
25
  MEMRAY_AVAILABLE = True
26
26
  except ImportError:
27
27
  MEMRAY_AVAILABLE = False
28
- memray = None # type: ignore[assignment]
28
+ memray = None
29
29
 
30
30
  from ..base import QualityResult, QualityToolError
31
31
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: provide-testkit
3
- Version: 0.3.31
3
+ Version: 0.4.2
4
4
  Summary: Testing utilities and fixtures for the provide ecosystem.
5
5
  Author-email: Tim Perkins <code@tim.life>
6
6
  Maintainer-email: "provide.io" <code@provide.io>
@@ -24,7 +24,7 @@ Classifier: Typing :: Typed
24
24
  Requires-Python: >=3.11
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE
27
- Requires-Dist: provide-foundation>=0.3.29
27
+ Requires-Dist: provide-foundation>=0.4.0
28
28
  Requires-Dist: attrs>=25.4.0
29
29
  Requires-Dist: click>=8.3.1
30
30
  Requires-Dist: pytest>=9.0.2
@@ -44,7 +44,7 @@ Requires-Dist: mutmut; extra == "quality"
44
44
  Provides-Extra: typecheck
45
45
  Requires-Dist: mypy; extra == "typecheck"
46
46
  Requires-Dist: pyright; extra == "typecheck"
47
- Requires-Dist: pyre-check; extra == "typecheck"
47
+ Requires-Dist: pyre-check; sys_platform != "win32" and extra == "typecheck"
48
48
  Requires-Dist: pyre-extensions; extra == "typecheck"
49
49
  Requires-Dist: pyrefly; extra == "typecheck"
50
50
  Requires-Dist: ty; extra == "typecheck"
@@ -63,7 +63,7 @@ Requires-Dist: pytest-benchmark; extra == "advanced-testing"
63
63
  Requires-Dist: pytest-testmon; extra == "advanced-testing"
64
64
  Requires-Dist: pytest-json-report; extra == "advanced-testing"
65
65
  Provides-Extra: profiling
66
- Requires-Dist: memray; extra == "profiling"
66
+ Requires-Dist: memray; sys_platform != "win32" and extra == "profiling"
67
67
  Requires-Dist: viztracer; extra == "profiling"
68
68
  Provides-Extra: transport
69
69
  Requires-Dist: httpx>=0.28.1; extra == "transport"
@@ -123,17 +123,17 @@ Requires-Dist: bandit; extra == "security"
123
123
  Requires-Dist: safety; extra == "security"
124
124
  Requires-Dist: pip-audit; extra == "security"
125
125
  Provides-Extra: standard
126
- Requires-Dist: provide-testkit[crypto,process,quality,transport]; extra == "standard"
126
+ Requires-Dist: provide-testkit[crypto,process,quality,transport]>=0.4.0; extra == "standard"
127
127
  Provides-Extra: grpc-dev
128
- Requires-Dist: provide-testkit[grpc,standard,typecheck]; extra == "grpc-dev"
128
+ Requires-Dist: provide-testkit[grpc,standard,typecheck]>=0.4.0; extra == "grpc-dev"
129
129
  Provides-Extra: pyvider-dev
130
- Requires-Dist: provide-testkit[advanced-testing,build,grpc,profiling,security,standard,typecheck]; extra == "pyvider-dev"
130
+ Requires-Dist: provide-testkit[advanced-testing,build,grpc,profiling,security,standard,typecheck]>=0.4.0; extra == "pyvider-dev"
131
131
  Provides-Extra: all
132
- Requires-Dist: provide-testkit[advanced-testing,build,crypto,docs,fuzzing,grpc,process,profiling,quality,security,transport,typecheck,utils]; extra == "all"
132
+ Requires-Dist: provide-testkit[advanced-testing,build,crypto,docs,fuzzing,grpc,process,profiling,quality,security,transport,typecheck,utils]>=0.4.0; extra == "all"
133
133
  Provides-Extra: dev
134
- Requires-Dist: provide-testkit[advanced-testing,quality]; extra == "dev"
134
+ Requires-Dist: provide-testkit[advanced-testing,quality]>=0.4.0; extra == "dev"
135
135
  Provides-Extra: docs-standalone
136
- Requires-Dist: provide-testkit[docs]; extra == "docs-standalone"
136
+ Requires-Dist: provide-testkit[docs]>=0.4.0; extra == "docs-standalone"
137
137
  Dynamic: license-file
138
138
 
139
139
  # 🧪✅ Provide TestKit
@@ -1,4 +1,4 @@
1
- provide-foundation>=0.3.29
1
+ provide-foundation>=0.4.0
2
2
  attrs>=25.4.0
3
3
  click>=8.3.1
4
4
  pytest>=9.0.2
@@ -17,7 +17,7 @@ pytest-testmon
17
17
  pytest-json-report
18
18
 
19
19
  [all]
20
- provide-testkit[advanced-testing,build,crypto,docs,fuzzing,grpc,process,profiling,quality,security,transport,typecheck,utils]
20
+ provide-testkit[advanced-testing,build,crypto,docs,fuzzing,grpc,process,profiling,quality,security,transport,typecheck,utils]>=0.4.0
21
21
 
22
22
  [build]
23
23
  hatch
@@ -30,7 +30,7 @@ cryptography>=45.0.7
30
30
  types-cryptography
31
31
 
32
32
  [dev]
33
- provide-testkit[advanced-testing,quality]
33
+ provide-testkit[advanced-testing,quality]>=0.4.0
34
34
 
35
35
  [docs]
36
36
  mkdocs
@@ -60,7 +60,7 @@ watchdog
60
60
  pyyaml
61
61
 
62
62
  [docs-standalone]
63
- provide-testkit[docs]
63
+ provide-testkit[docs]>=0.4.0
64
64
 
65
65
  [fuzzing]
66
66
  pynguin
@@ -72,18 +72,20 @@ grpcio-tools
72
72
  grpcio-health-checking
73
73
 
74
74
  [grpc-dev]
75
- provide-testkit[grpc,standard,typecheck]
75
+ provide-testkit[grpc,standard,typecheck]>=0.4.0
76
76
 
77
77
  [process]
78
78
  psutil>=7.0.0
79
79
  setproctitle>=1.3.7
80
80
 
81
81
  [profiling]
82
- memray
83
82
  viztracer
84
83
 
84
+ [profiling:sys_platform != "win32"]
85
+ memray
86
+
85
87
  [pyvider-dev]
86
- provide-testkit[advanced-testing,build,grpc,profiling,security,standard,typecheck]
88
+ provide-testkit[advanced-testing,build,grpc,profiling,security,standard,typecheck]>=0.4.0
87
89
 
88
90
  [quality]
89
91
  ruff
@@ -100,7 +102,7 @@ safety
100
102
  pip-audit
101
103
 
102
104
  [standard]
103
- provide-testkit[crypto,process,quality,transport]
105
+ provide-testkit[crypto,process,quality,transport]>=0.4.0
104
106
 
105
107
  [transport]
106
108
  httpx>=0.28.1
@@ -110,7 +112,6 @@ h2
110
112
  [typecheck]
111
113
  mypy
112
114
  pyright
113
- pyre-check
114
115
  pyre-extensions
115
116
  pyrefly
116
117
  ty
@@ -122,6 +123,9 @@ types-click
122
123
  types-pyyaml
123
124
  types-psutil
124
125
 
126
+ [typecheck:sys_platform != "win32"]
127
+ pyre-check
128
+
125
129
  [utils]
126
130
  pyyaml
127
131
  reuse
@@ -1 +0,0 @@
1
- 0.3.31