skilltest-pytest 0.7.0__tar.gz → 0.9.0__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.
@@ -20,6 +20,13 @@ node_modules/
20
20
  /sdks/typescript/platforms/*/bin/
21
21
  /sdks/python/skilltest_sdk/_bin/
22
22
 
23
+ # screencomp: commit the digest baseline (shots/baseline/*.json) and the README
24
+ # images (docs/screenshots/*.svg + demo.gif), but not the regenerated capture
25
+ # trees (see screenshots/AGENTS.md).
26
+ /shots/current/
27
+ /shots/verify/
28
+ /shots/review/
29
+
23
30
  # Nx
24
31
  .nx/cache
25
32
  .nx/workspace-data
@@ -1,12 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skilltest-pytest
3
- Version: 0.7.0
3
+ Version: 0.9.0
4
4
  Summary: pytest integration for skilltest: auto-collect *.skilltest.yaml cases as pytest tests, built on skilltest-sdk.
5
5
  Author: Nick DeRobertis
6
6
  License-Expression: MIT
7
7
  Requires-Python: >=3.12
8
8
  Requires-Dist: pytest>=8
9
- Requires-Dist: skilltest-sdk==0.7.0
9
+ Requires-Dist: skilltest-sdk==0.9.0
10
10
  Description-Content-Type: text/markdown
11
11
 
12
12
  # skilltest-pytest
@@ -1,13 +1,13 @@
1
1
  [project]
2
2
  name = "skilltest-pytest"
3
- version = "0.7.0"
3
+ version = "0.9.0"
4
4
  description = "pytest integration for skilltest: auto-collect *.skilltest.yaml cases as pytest tests, built on skilltest-sdk."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12"
7
7
  license = "MIT"
8
8
  authors = [{ name = "Nick DeRobertis" }]
9
9
  dependencies = [
10
- "skilltest-sdk==0.7.0",
10
+ "skilltest-sdk==0.9.0",
11
11
  "pytest>=8",
12
12
  ]
13
13
 
@@ -35,11 +35,21 @@ from skilltest_sdk import (
35
35
  MockCall,
36
36
  MockRefEval,
37
37
  NumericDetail,
38
+ ProviderErrorKind,
38
39
  Report,
40
+ ReportError,
39
41
  SimulatedUser,
40
42
  SkillStream,
43
+ SkilltestAuthError,
41
44
  SkilltestError,
45
+ SkilltestModelNotFoundError,
46
+ SkilltestOverloadedError,
47
+ SkilltestProtocolError,
42
48
  SkilltestProviderError,
49
+ SkilltestQuotaError,
50
+ SkilltestRateLimitError,
51
+ SkilltestSpawnError,
52
+ SkilltestTimeoutError,
43
53
  SkilltestUsageError,
44
54
  StreamEvent,
45
55
  Summary,
@@ -89,12 +99,22 @@ __all__ = [
89
99
  "MockCall",
90
100
  "MockRefEval",
91
101
  "NumericDetail",
102
+ "ProviderErrorKind",
92
103
  "Report",
104
+ "ReportError",
93
105
  "SimulatedUser",
94
106
  "SkillStream",
107
+ "SkilltestAuthError",
95
108
  "SkilltestError",
96
109
  "SkilltestFailure",
110
+ "SkilltestModelNotFoundError",
111
+ "SkilltestOverloadedError",
112
+ "SkilltestProtocolError",
97
113
  "SkilltestProviderError",
114
+ "SkilltestQuotaError",
115
+ "SkilltestRateLimitError",
116
+ "SkilltestSpawnError",
117
+ "SkilltestTimeoutError",
98
118
  "SkilltestUsageError",
99
119
  "StreamEvent",
100
120
  "Summary",
@@ -158,6 +158,32 @@ def test_full_code_defined_case_surface_is_reexported(fixtures: Path) -> None:
158
158
  push.assert_called_once()
159
159
 
160
160
 
161
+ def test_provider_error_subclass_is_reexported_and_raised(
162
+ cases: Path, tmp_path: Path, monkeypatch: pytest.MonkeyPatch
163
+ ) -> None:
164
+ # The kind-specific error surface rides the one-dependency re-export, and a
165
+ # provider failure through the plugin's run_skill raises it — so a plugin
166
+ # user can `except SkilltestTimeoutError` without importing the SDK.
167
+ from skilltest_pytest import SkilltestProviderError, SkilltestTimeoutError
168
+
169
+ monkeypatch.delenv("SKILLTEST_PROVIDER", raising=False)
170
+ oh = tmp_path / "oneharness"
171
+ oh.write_text(
172
+ "#!/bin/sh\ncat >/dev/null\n"
173
+ 'printf \'%s\' \'{"results":[{"status":"timeout","stderr":"deadline"}]}\'\n'
174
+ )
175
+ oh.chmod(0o755)
176
+ cfg = tmp_path / "skilltest.yaml"
177
+ cfg.write_text(
178
+ f"provider:\n kind: oneharness\n bin: {oh}\n judge_harness: claude-code\n"
179
+ " timeout_secs: 5\nplatforms: [claude-code]\nmodels: [sonnet]\n"
180
+ )
181
+ with pytest.raises(SkilltestTimeoutError) as exc:
182
+ run_skill(cases / "greet_pass.yaml", config=cfg)
183
+ assert isinstance(exc.value, SkilltestProviderError)
184
+ assert exc.value.kind == "timeout"
185
+
186
+
161
187
  def test_mock_api_is_reexported_and_binds(cases: Path) -> None:
162
188
  # The mock/spy API rides the one-dependency re-export; code-level mocks
163
189
  # intercept and bind through the plugin's SDK exactly as through the SDK.
@@ -189,7 +189,7 @@ wheels = [
189
189
 
190
190
  [[package]]
191
191
  name = "skilltest-pytest"
192
- version = "0.7.0"
192
+ version = "0.9.0"
193
193
  source = { editable = "." }
194
194
  dependencies = [
195
195
  { name = "pytest" },
@@ -216,7 +216,7 @@ dev = [
216
216
 
217
217
  [[package]]
218
218
  name = "skilltest-sdk"
219
- version = "0.7.0"
219
+ version = "0.9.0"
220
220
  source = { editable = "../../sdks/python" }
221
221
  dependencies = [
222
222
  { name = "pydantic" },