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.
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/.gitignore +7 -0
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/PKG-INFO +2 -2
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/pyproject.toml +2 -2
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/skilltest_pytest/__init__.py +20 -0
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/tests/test_plugin.py +26 -0
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/uv.lock +2 -2
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/README.md +0 -0
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/project.json +0 -0
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/skilltest_pytest/plugin.py +0 -0
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/tests/collected/deploy.skilltest.yaml +0 -0
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/tests/collected/deployer/SKILL.md +0 -0
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/tests/collected/greet.skilltest.yaml +0 -0
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/tests/collected/greeter/SKILL.md +0 -0
- {skilltest_pytest-0.7.0 → skilltest_pytest-0.9.0}/tests/conftest.py +0 -0
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
219
|
+
version = "0.9.0"
|
|
220
220
|
source = { editable = "../../sdks/python" }
|
|
221
221
|
dependencies = [
|
|
222
222
|
{ name = "pydantic" },
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|