rung-cli 0.1.2__tar.gz → 0.1.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.
- {rung_cli-0.1.2 → rung_cli-0.1.3}/.claude-plugin/plugin.json +1 -1
- {rung_cli-0.1.2 → rung_cli-0.1.3}/CHANGELOG.md +13 -1
- {rung_cli-0.1.2 → rung_cli-0.1.3}/PKG-INFO +27 -3
- {rung_cli-0.1.2 → rung_cli-0.1.3}/README.md +26 -2
- {rung_cli-0.1.2 → rung_cli-0.1.3}/pyproject.toml +1 -1
- {rung_cli-0.1.2 → rung_cli-0.1.3}/skills/setup/SKILL.md +1 -1
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/__init__.py +1 -1
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/property.py +12 -6
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_property.py +4 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/uv.lock +1 -1
- {rung_cli-0.1.2 → rung_cli-0.1.3}/.claude-plugin/marketplace.json +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/.gitignore +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/CODE_OF_CONDUCT.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/CONTRIBUTING.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/LICENSE +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/SECURITY.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/docs/CONFIG.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/docs/DESIGN.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/docs/RECIPES.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/docs/RESEARCH.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/docs/ROADMAP.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/LAWS.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/README.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/leasequeue/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/leasequeue/drt.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/leasequeue/queue.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/rung.toml +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/lean/LeaseModel.lean +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/lean/Main.lean +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/lean/lake-manifest.json +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/lean/lakefile.toml +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/lean/lean-toolchain +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/tla/LeaseQueue.cfg +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/examples/lease-queue/spec/tla/LeaseQueue.tla +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/__main__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/agents/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/agents/hooks.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/agents/install.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/analysis/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/analysis/plan.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/analysis/report.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/analysis/survey.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/base.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/command.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/deps.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/findings.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/formal.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/presets.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/prove.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/registry.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/runner.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/scan.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/checks/shortcuts.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/common.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/draft.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/manage.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/run.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/commands/setup.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/cli/output.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/config.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/errors.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/git.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/laws.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/ledger.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/proc.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/core/redact.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/common.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/lean.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/providers.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/runtime.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/sandbox.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/drafting/tla.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/drt.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/lean.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/mutate.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/sarif.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/shortcuts.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/engines/tla.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/lean.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/property.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/rules.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/runtime.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/tla.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/src/rung/guides/verify.md +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/__init__.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/conftest.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/fixtures/sarif/gitleaks.sarif +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/fixtures/sarif/osv.sarif +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/fixtures/sarif/zizmor.sarif +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_agents_and_report.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_cli.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_config.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_deps.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_draft.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_drt.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_example_integration.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_gitutil.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_laws.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_lean.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_ledger.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_prove.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_release_consistency.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_review_regressions.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_sarif_and_findings.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_scan_checker.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_shortcuts.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_survey_and_agents.py +0 -0
- {rung_cli-0.1.2 → rung_cli-0.1.3}/tests/test_tla.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rung",
|
|
3
3
|
"description": "Set up Rung in a repository: record tests and security scans as checks, gate pull requests in CI, and teach coding agents the verification rules.",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.3",
|
|
5
5
|
"author": { "name": "CalQuity" },
|
|
6
6
|
"homepage": "https://github.com/CalQuity/rung",
|
|
7
7
|
"repository": "https://github.com/CalQuity/rung",
|
|
@@ -3,7 +3,19 @@
|
|
|
3
3
|
All notable changes to Rung. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
4
4
|
and versions follow the policy in [CONTRIBUTING.md](CONTRIBUTING.md#versioning).
|
|
5
5
|
|
|
6
|
-
## 0.1.
|
|
6
|
+
## 0.1.3 (2026-11-01)
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
- `rung draft property`: a plain `assert` the model wrote that fails on the real code is now a
|
|
10
|
+
finding for a person, not a broken test. Before, a failure without Hypothesis's "Falsifying
|
|
11
|
+
example" marker was sent back to the model to rewrite, up to four times, which could hide the bug
|
|
12
|
+
the tests had found. A mutant that stops the module compiling is still not counted as caught.
|
|
13
|
+
|
|
14
|
+
### Documentation
|
|
15
|
+
- The README describes the runtime verification kit: the drive script, the `FEATURES.md` feature
|
|
16
|
+
map, the project verification skill for coding agents, and the recordings each run leaves.
|
|
17
|
+
|
|
18
|
+
## 0.1.2 (2026-11-01)
|
|
7
19
|
|
|
8
20
|
The first release on PyPI, as `rung-cli`.
|
|
9
21
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: rung-cli
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: An opinionated verification ladder for software written with coding agents: architecture rules, runtime evidence, properties, TLA+ and Lean, and an evidence ledger that expires when code changes.
|
|
5
5
|
Project-URL: Homepage, https://github.com/CalQuity/rung
|
|
6
6
|
Project-URL: Documentation, https://github.com/CalQuity/rung/tree/main/docs
|
|
@@ -122,6 +122,30 @@ A refund never exceeds the original charge, even under concurrent retries.
|
|
|
122
122
|
`rung laws` shows whether each law currently **holds**: approved, enforced, and every enforcing
|
|
123
123
|
verdict fresh. Agents may propose laws; only people approve them.
|
|
124
124
|
|
|
125
|
+
## A verification kit for your running app
|
|
126
|
+
|
|
127
|
+
`rung draft runtime --intent "apply a coupon at checkout and see the total update"` gives your
|
|
128
|
+
project a verification kit, written by the model and registered as a check only once it has worked
|
|
129
|
+
against the real app:
|
|
130
|
+
|
|
131
|
+
- **`.rung/verify/drive.py`**, a script that starts the app on a free port, drives a feature the way
|
|
132
|
+
a user does (Playwright for web UIs, HTTP or CLI calls otherwise) and asserts on what a user would
|
|
133
|
+
see. It never calls internal functions or test-only endpoints.
|
|
134
|
+
- **`.rung/verify/FEATURES.md`**, a feature map: for each user-facing feature, how a user reaches it,
|
|
135
|
+
how the script drives it, what observable state proves it works, and the gotchas (seed data,
|
|
136
|
+
logins, flaky spots).
|
|
137
|
+
- **A project verification skill** (`.claude/skills/verify-<project>/`) that tells the project's
|
|
138
|
+
coding agents to drive the app after any user-facing change, extend the script and feature map
|
|
139
|
+
when they add a feature, and treat a failure as a product bug rather than weaken the script.
|
|
140
|
+
- **Recordings.** Every run writes its evidence to a fresh directory: a video of the browser session
|
|
141
|
+
(`--require .webm` demands one), screenshots, request and response logs, a transcript and a
|
|
142
|
+
structured `result.json`. Their hashes go into the verdict, which stays valid only while the code
|
|
143
|
+
it covers is unchanged.
|
|
144
|
+
|
|
145
|
+
Where a script cannot reach a feature (a login flow, a native app), an agent can drive it with its
|
|
146
|
+
own browser or computer-use tool and record it with `rung attest <check> <files> --by <tool>`. Such
|
|
147
|
+
evidence is recorded with who captured it and is never re-run, so it is weaker than a script.
|
|
148
|
+
|
|
125
149
|
## Property tests that are tested themselves
|
|
126
150
|
|
|
127
151
|
`rung draft property pricing.py --intent "a total is never negative and equals the discounted sum"`
|
|
@@ -171,7 +195,7 @@ jobs:
|
|
|
171
195
|
with:
|
|
172
196
|
fetch-depth: 0
|
|
173
197
|
persist-credentials: false
|
|
174
|
-
- uses: CalQuity/rung@v0.1.
|
|
198
|
+
- uses: CalQuity/rung@v0.1.3
|
|
175
199
|
```
|
|
176
200
|
|
|
177
201
|
The action runs the checks a pull request touches against its merge base. It keeps a single
|
|
@@ -186,7 +210,7 @@ To run the same check before every push, add Rung to `.pre-commit-config.yaml`:
|
|
|
186
210
|
|
|
187
211
|
```yaml
|
|
188
212
|
- repo: https://github.com/CalQuity/rung
|
|
189
|
-
rev: v0.1.
|
|
213
|
+
rev: v0.1.3
|
|
190
214
|
hooks:
|
|
191
215
|
- id: rung-check
|
|
192
216
|
```
|
|
@@ -104,6 +104,30 @@ A refund never exceeds the original charge, even under concurrent retries.
|
|
|
104
104
|
`rung laws` shows whether each law currently **holds**: approved, enforced, and every enforcing
|
|
105
105
|
verdict fresh. Agents may propose laws; only people approve them.
|
|
106
106
|
|
|
107
|
+
## A verification kit for your running app
|
|
108
|
+
|
|
109
|
+
`rung draft runtime --intent "apply a coupon at checkout and see the total update"` gives your
|
|
110
|
+
project a verification kit, written by the model and registered as a check only once it has worked
|
|
111
|
+
against the real app:
|
|
112
|
+
|
|
113
|
+
- **`.rung/verify/drive.py`**, a script that starts the app on a free port, drives a feature the way
|
|
114
|
+
a user does (Playwright for web UIs, HTTP or CLI calls otherwise) and asserts on what a user would
|
|
115
|
+
see. It never calls internal functions or test-only endpoints.
|
|
116
|
+
- **`.rung/verify/FEATURES.md`**, a feature map: for each user-facing feature, how a user reaches it,
|
|
117
|
+
how the script drives it, what observable state proves it works, and the gotchas (seed data,
|
|
118
|
+
logins, flaky spots).
|
|
119
|
+
- **A project verification skill** (`.claude/skills/verify-<project>/`) that tells the project's
|
|
120
|
+
coding agents to drive the app after any user-facing change, extend the script and feature map
|
|
121
|
+
when they add a feature, and treat a failure as a product bug rather than weaken the script.
|
|
122
|
+
- **Recordings.** Every run writes its evidence to a fresh directory: a video of the browser session
|
|
123
|
+
(`--require .webm` demands one), screenshots, request and response logs, a transcript and a
|
|
124
|
+
structured `result.json`. Their hashes go into the verdict, which stays valid only while the code
|
|
125
|
+
it covers is unchanged.
|
|
126
|
+
|
|
127
|
+
Where a script cannot reach a feature (a login flow, a native app), an agent can drive it with its
|
|
128
|
+
own browser or computer-use tool and record it with `rung attest <check> <files> --by <tool>`. Such
|
|
129
|
+
evidence is recorded with who captured it and is never re-run, so it is weaker than a script.
|
|
130
|
+
|
|
107
131
|
## Property tests that are tested themselves
|
|
108
132
|
|
|
109
133
|
`rung draft property pricing.py --intent "a total is never negative and equals the discounted sum"`
|
|
@@ -153,7 +177,7 @@ jobs:
|
|
|
153
177
|
with:
|
|
154
178
|
fetch-depth: 0
|
|
155
179
|
persist-credentials: false
|
|
156
|
-
- uses: CalQuity/rung@v0.1.
|
|
180
|
+
- uses: CalQuity/rung@v0.1.3
|
|
157
181
|
```
|
|
158
182
|
|
|
159
183
|
The action runs the checks a pull request touches against its merge base. It keeps a single
|
|
@@ -168,7 +192,7 @@ To run the same check before every push, add Rung to `.pre-commit-config.yaml`:
|
|
|
168
192
|
|
|
169
193
|
```yaml
|
|
170
194
|
- repo: https://github.com/CalQuity/rung
|
|
171
|
-
rev: v0.1.
|
|
195
|
+
rev: v0.1.3
|
|
172
196
|
hooks:
|
|
173
197
|
- id: rung-check
|
|
174
198
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "rung-cli"
|
|
3
|
-
version = "0.1.
|
|
3
|
+
version = "0.1.3"
|
|
4
4
|
description = "An opinionated verification ladder for software written with coding agents: architecture rules, runtime evidence, properties, TLA+ and Lean, and an evidence ledger that expires when code changes."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "Apache-2.0"
|
|
@@ -51,7 +51,11 @@ GOOD_ENOUGH = 0.5 # share of viable mutants a property file must catch
|
|
|
51
51
|
CANARY = "rung-canary-7f3a"
|
|
52
52
|
DRAFTS_DIR = Path(".rung") / "cache" / "drafts"
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
# A run that never got as far as running tests: a module that does not compile or import.
|
|
55
|
+
_BUILD_FAILED = re.compile(
|
|
56
|
+
r"Transform failed|Cannot find module|ERR_MODULE_NOT_FOUND|error TS\d+|SyntaxError: |ERROR collecting|"
|
|
57
|
+
r"ImportError while importing test module"
|
|
58
|
+
)
|
|
55
59
|
# Errors that mean the test's own code is broken, when the failure happens inside the test file.
|
|
56
60
|
_BROKEN = {"NameError", "ImportError", "ModuleNotFoundError", "SyntaxError", "IndentationError", "ReferenceError",
|
|
57
61
|
"AttributeError", "TypeError", "UnboundLocalError"} # fmt: skip
|
|
@@ -163,15 +167,17 @@ def passed_count(output: str) -> int:
|
|
|
163
167
|
|
|
164
168
|
|
|
165
169
|
def classify(returncode: int, output: str, sources: list[str], test_file: str) -> str:
|
|
166
|
-
"""pass, finding (a
|
|
170
|
+
"""pass, finding (a test failed on the code) or error (the test itself is broken, or ran nothing).
|
|
167
171
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
172
|
+
Exit status 1 means tests ran and failed. That is a finding, whether or not the failure came with
|
|
173
|
+
a generated example: a plain `assert` the model wrote can catch the bug just as well. The test is
|
|
174
|
+
broken instead when the run could not build or import, or when a non-assertion error (a typo, a
|
|
175
|
+
wrong call) is raised in the test file itself. An error raised in the code under test is always a
|
|
176
|
+
finding, even a `NameError`; anything Rung cannot place goes to a person as a finding.
|
|
171
177
|
"""
|
|
172
178
|
if returncode == 0:
|
|
173
179
|
return "pass" if passed_count(output) > 0 else "error"
|
|
174
|
-
if returncode != 1 or
|
|
180
|
+
if returncode != 1 or _BUILD_FAILED.search(output):
|
|
175
181
|
return "error"
|
|
176
182
|
py = _PY_LOCATION.findall(output)
|
|
177
183
|
js = _JS_LOCATION.findall(output)
|
|
@@ -95,6 +95,10 @@ def test_classify_separates_findings_from_broken_tests() -> None:
|
|
|
95
95
|
assert c(1, broken, ["pricing.ts"], "p.test.ts") == "error"
|
|
96
96
|
assert c(1, failed + " at total (src/pricing.ts:4:9)", ["pricing.ts"], "p.test.ts") == "finding"
|
|
97
97
|
assert c(2, "ERROR collecting", src, test) == "error"
|
|
98
|
+
# A plain assert the model wrote, failing on the real code, is a finding too (no generated example).
|
|
99
|
+
assert c(1, "E assert -1 == 0\ntest_p.py:12: AssertionError\n1 failed", src, test) == "finding"
|
|
100
|
+
# A mutant that stops the module compiling is not a caught bug.
|
|
101
|
+
assert c(1, "Transform failed with 1 error:\nsrc/pricing.ts:3:10", ["pricing.ts"], "p.test.ts") == "error"
|
|
98
102
|
|
|
99
103
|
|
|
100
104
|
def test_a_property_no_mutant_can_fail_is_sent_back_and_a_strong_one_is_kept(pricing: Path) -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|