verkit 0.3.1__tar.gz → 0.3.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.
- {verkit-0.3.1 → verkit-0.3.2}/.gitignore +2 -0
- {verkit-0.3.1 → verkit-0.3.2}/PKG-INFO +19 -3
- {verkit-0.3.1 → verkit-0.3.2}/README.md +18 -2
- verkit-0.3.2/llms.txt +22 -0
- {verkit-0.3.1 → verkit-0.3.2}/pyproject.toml +4 -1
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/agent.py +13 -5
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/agent_guide.md +27 -3
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/cli.py +26 -3
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/inspector.py +108 -4
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/promoter.py +12 -6
- {verkit-0.3.1 → verkit-0.3.2}/tests/test_agent.py +8 -0
- {verkit-0.3.1 → verkit-0.3.2}/tests/test_inspector.py +11 -1
- verkit-0.3.2/tests/test_promoter.py +37 -0
- verkit-0.3.2/uv.lock +290 -0
- verkit-0.3.1/llms.txt +0 -15
- verkit-0.3.1/tests/test_promoter.py +0 -7
- verkit-0.3.1/uv.lock +0 -80
- {verkit-0.3.1 → verkit-0.3.2}/.github/workflows/ci.yml +0 -0
- {verkit-0.3.1 → verkit-0.3.2}/.github/workflows/publish.yml +0 -0
- {verkit-0.3.1 → verkit-0.3.2}/AGENTS.md +0 -0
- {verkit-0.3.1 → verkit-0.3.2}/CLAUDE.md +0 -0
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/__init__.py +0 -0
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/keys.py +0 -0
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/py.typed +0 -0
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/tagger.py +0 -0
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/theme.json +0 -0
- {verkit-0.3.1 → verkit-0.3.2}/src/verkit/theme.py +0 -0
- {verkit-0.3.1 → verkit-0.3.2}/tests/test_theme.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: verkit
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.2
|
|
4
4
|
Summary: Polyglot project version inspector, promoter, tagger, and release workflow engine
|
|
5
5
|
Author: Mark Stouffer
|
|
6
6
|
License: MIT
|
|
@@ -40,9 +40,23 @@ uv add verkit
|
|
|
40
40
|
## CLI Usage
|
|
41
41
|
|
|
42
42
|
### Inspect version info
|
|
43
|
-
Inspect current
|
|
43
|
+
Inspect current running version, PyPI version, and local project version:
|
|
44
44
|
```bash
|
|
45
45
|
verkit inspect
|
|
46
|
+
# or alias:
|
|
47
|
+
verkit version
|
|
48
|
+
# or flag:
|
|
49
|
+
verkit --version
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### Self-upgrade / Sync to local dev checkout
|
|
53
|
+
Sync active virtualenv to local `~/repos/verkit` dev source (or upgrade from PyPI):
|
|
54
|
+
```bash
|
|
55
|
+
verkit self-up
|
|
56
|
+
# or
|
|
57
|
+
verkit version up
|
|
58
|
+
# or force latest from PyPI:
|
|
59
|
+
verkit self-up --pypi
|
|
46
60
|
```
|
|
47
61
|
|
|
48
62
|
### Promote version
|
|
@@ -128,7 +142,9 @@ $theme = Invoke-RestMethod `
|
|
|
128
142
|
## For AI Agents
|
|
129
143
|
|
|
130
144
|
Projects that depend on `verkit` should follow its conventions: vim-style
|
|
131
|
-
navigation (`from verkit.keys import VIM_BINDINGS`), the shared theme,
|
|
145
|
+
navigation (`from verkit.keys import VIM_BINDINGS`), the shared theme, the
|
|
146
|
+
visual style rules (no borders — prefer color and formatting; no buttons —
|
|
147
|
+
prefer keyboard-driven design with `BINDINGS` shown in the `Footer`), and a
|
|
132
148
|
`mise`-only local dev override (PyPI release everywhere else).
|
|
133
149
|
|
|
134
150
|
```bash
|
|
@@ -30,9 +30,23 @@ uv add verkit
|
|
|
30
30
|
## CLI Usage
|
|
31
31
|
|
|
32
32
|
### Inspect version info
|
|
33
|
-
Inspect current
|
|
33
|
+
Inspect current running version, PyPI version, and local project version:
|
|
34
34
|
```bash
|
|
35
35
|
verkit inspect
|
|
36
|
+
# or alias:
|
|
37
|
+
verkit version
|
|
38
|
+
# or flag:
|
|
39
|
+
verkit --version
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Self-upgrade / Sync to local dev checkout
|
|
43
|
+
Sync active virtualenv to local `~/repos/verkit` dev source (or upgrade from PyPI):
|
|
44
|
+
```bash
|
|
45
|
+
verkit self-up
|
|
46
|
+
# or
|
|
47
|
+
verkit version up
|
|
48
|
+
# or force latest from PyPI:
|
|
49
|
+
verkit self-up --pypi
|
|
36
50
|
```
|
|
37
51
|
|
|
38
52
|
### Promote version
|
|
@@ -118,7 +132,9 @@ $theme = Invoke-RestMethod `
|
|
|
118
132
|
## For AI Agents
|
|
119
133
|
|
|
120
134
|
Projects that depend on `verkit` should follow its conventions: vim-style
|
|
121
|
-
navigation (`from verkit.keys import VIM_BINDINGS`), the shared theme,
|
|
135
|
+
navigation (`from verkit.keys import VIM_BINDINGS`), the shared theme, the
|
|
136
|
+
visual style rules (no borders — prefer color and formatting; no buttons —
|
|
137
|
+
prefer keyboard-driven design with `BINDINGS` shown in the `Footer`), and a
|
|
122
138
|
`mise`-only local dev override (PyPI release everywhere else).
|
|
123
139
|
|
|
124
140
|
```bash
|
verkit-0.3.2/llms.txt
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# verkit
|
|
2
|
+
|
|
3
|
+
> Polyglot project version inspector, promoter, tagger and release CLI, plus the shared Rich theme and vim-style Textual key conventions for the author's Python TUIs. If your project depends on verkit, read the conventions guide first.
|
|
4
|
+
|
|
5
|
+
## Dev vs. Released Verkit (mise standard)
|
|
6
|
+
- **Local machine with `~/repos/verkit`**: run the local dev source in development (`uv pip install -e ~/repos/verkit`).
|
|
7
|
+
- **Everywhere else (CI, Docker, end-users)**: install the published package from PyPI (`pyproject.toml` declares a plain dependency `"verkit"`). Never add path/editable dependencies to `pyproject.toml`.
|
|
8
|
+
- **Mise template**: Run `verkit init-agent --mise` in a consumer project to write `mise.toml` which sets `VERKIT_DEV = "~/repos/verkit"` and overrides `mise run install` to install local editable source if present.
|
|
9
|
+
- **Inspect**: Run `verkit inspect` (or `verkit version`) to display whether the running verkit is from local dev source or PyPI.
|
|
10
|
+
- **Self-update**: Run `verkit self-up` (or `verkit version up`) to sync/upgrade verkit in the active venv.
|
|
11
|
+
|
|
12
|
+
## Agent guidance
|
|
13
|
+
- [Conventions guide](https://raw.githubusercontent.com/bizkite-co/verkit/main/src/verkit/agent_guide.md): vim navigation, theme, style rules (no borders — color and formatting instead; no buttons — keyboard-driven BINDINGS + Footer), mise dev-vs-PyPI rule. Also `verkit conventions [--json]`.
|
|
14
|
+
- [AGENTS.md](https://raw.githubusercontent.com/bizkite-co/verkit/main/AGENTS.md): working on verkit itself.
|
|
15
|
+
|
|
16
|
+
## Code
|
|
17
|
+
- [keys.py](https://raw.githubusercontent.com/bizkite-co/verkit/main/src/verkit/keys.py): `VIM_BINDINGS` for Textual `BINDINGS`.
|
|
18
|
+
- [theme.py](https://raw.githubusercontent.com/bizkite-co/verkit/main/src/verkit/theme.py): shared Rich theme.
|
|
19
|
+
- [theme.json](https://raw.githubusercontent.com/bizkite-co/verkit/main/src/verkit/theme.json): theme for non-Python consumers.
|
|
20
|
+
|
|
21
|
+
## Optional
|
|
22
|
+
- [README](https://raw.githubusercontent.com/bizkite-co/verkit/main/README.md): CLI and API usage.
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "verkit"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.2"
|
|
8
8
|
description = "Polyglot project version inspector, promoter, tagger, and release workflow engine"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -19,6 +19,9 @@ dependencies = [
|
|
|
19
19
|
[project.scripts]
|
|
20
20
|
verkit = "verkit.cli:main"
|
|
21
21
|
|
|
22
|
+
[dependency-groups]
|
|
23
|
+
dev = ["pytest"]
|
|
24
|
+
|
|
22
25
|
[tool.pytest.ini_options]
|
|
23
26
|
testpaths = ["tests"]
|
|
24
27
|
pythonpath = ["src"]
|
|
@@ -13,11 +13,13 @@ MARKER = "<!-- verkit:agent-guide -->"
|
|
|
13
13
|
SNIPPET = f"""{MARKER}
|
|
14
14
|
## verkit conventions
|
|
15
15
|
|
|
16
|
-
This project depends on `verkit`. Before touching TUI, theme, or
|
|
17
|
-
code, run `verkit conventions` (or read `verkit/agent_guide.md` in
|
|
18
|
-
installed package). Key rules: vim-style navigation via
|
|
19
|
-
`verkit.keys.VIM_BINDINGS`, shared theme via `verkit.theme`,
|
|
20
|
-
|
|
16
|
+
This project depends on `verkit`. Before touching TUI, theme, style, or
|
|
17
|
+
dev-setup code, run `verkit conventions` (or read `verkit/agent_guide.md` in
|
|
18
|
+
the installed package). Key rules: vim-style navigation via
|
|
19
|
+
`verkit.keys.VIM_BINDINGS`, shared theme via `verkit.theme`, no borders (color
|
|
20
|
+
and formatting instead), no buttons (keyboard-driven `BINDINGS` + `Footer`
|
|
21
|
+
instead), and local verkit dev override through `mise` only (never in
|
|
22
|
+
`pyproject.toml`).
|
|
21
23
|
"""
|
|
22
24
|
|
|
23
25
|
MISE_TEMPLATE = """# Generated by `verkit init-agent --mise`.
|
|
@@ -46,6 +48,12 @@ def conventions_json() -> str:
|
|
|
46
48
|
],
|
|
47
49
|
"import": "from verkit.keys import VIM_BINDINGS",
|
|
48
50
|
"theme_import": "from verkit.theme import DEFAULT as theme",
|
|
51
|
+
"style_rules": {
|
|
52
|
+
"borders": "never; borderless tables (box=None) and theme.panel_box "
|
|
53
|
+
"only — structure with color, weight, and whitespace",
|
|
54
|
+
"buttons": "never; keyboard-driven design — every action in BINDINGS "
|
|
55
|
+
"(from verkit.keys import VIM_BINDINGS), shown in the Footer",
|
|
56
|
+
},
|
|
49
57
|
"dev_override": "mise.toml only; never pyproject.toml",
|
|
50
58
|
"guide": guide_text(),
|
|
51
59
|
},
|
|
@@ -40,7 +40,30 @@ from verkit.theme import DEFAULT as theme
|
|
|
40
40
|
|
|
41
41
|
Machine-readable mirror for non-Python consumers: `theme.json` in the package.
|
|
42
42
|
|
|
43
|
-
## 3.
|
|
43
|
+
## 3. Visual style: color and formatting, not borders; keys, not buttons
|
|
44
|
+
|
|
45
|
+
**Never draw borders.** Do not frame content with boxes — structure output with
|
|
46
|
+
color, weight, and whitespace instead:
|
|
47
|
+
|
|
48
|
+
- Tables are borderless: `box=None` with a subtle header band
|
|
49
|
+
(`theme.header_style`, `on grey23`) and `theme.table_padding` — exactly what
|
|
50
|
+
`verkit.theme.DEFAULT` yields. Never pass a visible `box=` to a `Table`.
|
|
51
|
+
- Avoid `Panel` entirely. If a container is genuinely unavoidable, use
|
|
52
|
+
`theme.panel_box` (Rich `MINIMAL`) and nothing heavier.
|
|
53
|
+
- Emphasize and group with theme styles (bold/dim/italic, foreground and
|
|
54
|
+
background color, indentation, blank lines, `console.rule`). No ASCII-art
|
|
55
|
+
frames (`+---+`) and no heavy Rich `box.*` constants.
|
|
56
|
+
|
|
57
|
+
**Never use buttons.** Design keyboard-first; there are no click-only actions:
|
|
58
|
+
|
|
59
|
+
- Every action is a key binding: build `App.BINDINGS` (or widget `BINDINGS`)
|
|
60
|
+
from `VIM_BINDINGS` (section 1) plus app-specific keys, and display them in
|
|
61
|
+
the `Footer`.
|
|
62
|
+
- Prompt with keys, not widgets: "press `s` to save", never a `Save` button
|
|
63
|
+
(`from textual.widgets import Button` is a lint-grade violation).
|
|
64
|
+
- Mouse support may exist incidentally, but no feature may require a click.
|
|
65
|
+
|
|
66
|
+
## 4. Dev vs. released verkit (mise)
|
|
44
67
|
|
|
45
68
|
Rule: **in the local checkout, run the local verkit source; everywhere else
|
|
46
69
|
(CI, Docker, end users) install the latest release from PyPI.**
|
|
@@ -51,11 +74,12 @@ Rule: **in the local checkout, run the local verkit source; everywhere else
|
|
|
51
74
|
the local verkit checkout does not exist. Generate it with
|
|
52
75
|
`verkit init-agent --mise`. It sets `VERKIT_DEV` (default
|
|
53
76
|
`~/repos/verkit`) and installs it editable after `uv sync`.
|
|
54
|
-
- Use `mise run install` (
|
|
77
|
+
- Use `mise run install` (or `verkit self-up`), and run tools with
|
|
55
78
|
`UV_NO_SYNC=1` (set by the mise template) so uv does not replace the
|
|
56
79
|
editable install with the PyPI release.
|
|
80
|
+
- Inspect whether running source is dev or PyPI via `verkit inspect` (or `verkit version`).
|
|
57
81
|
|
|
58
|
-
##
|
|
82
|
+
## 5. Agent-friendly CLI
|
|
59
83
|
|
|
60
84
|
- `verkit conventions [--json]` prints this guide (or structured JSON).
|
|
61
85
|
- `verkit init-agent [--mise] [--dir PATH]` adds a pointer to this guide in the
|
|
@@ -5,7 +5,7 @@ from pathlib import Path
|
|
|
5
5
|
from rich.console import Console
|
|
6
6
|
|
|
7
7
|
from verkit.agent import conventions_json, guide_text, init_agent
|
|
8
|
-
from verkit.inspector import display_version_info
|
|
8
|
+
from verkit.inspector import display_version_info, get_installed_version, self_up
|
|
9
9
|
from verkit.promoter import promote_version
|
|
10
10
|
from verkit.tagger import release_version, tag_version
|
|
11
11
|
|
|
@@ -15,11 +15,23 @@ def main():
|
|
|
15
15
|
prog="verkit",
|
|
16
16
|
description="Polyglot project version inspector, promoter, tagger, and release workflow tool",
|
|
17
17
|
)
|
|
18
|
+
parser.add_argument(
|
|
19
|
+
"-v", "--version", action="store_true", help="Show version and exit"
|
|
20
|
+
)
|
|
18
21
|
subparsers = parser.add_subparsers(dest="command", help="Subcommand to run")
|
|
19
22
|
|
|
20
|
-
# verkit inspect
|
|
23
|
+
# verkit inspect / verkit version [up]
|
|
21
24
|
subparsers.add_parser("inspect", help="Inspect working tree and HEAD version")
|
|
22
25
|
|
|
26
|
+
ver_p = subparsers.add_parser("version", help="Show version info (alias for inspect)")
|
|
27
|
+
ver_sub = ver_p.add_subparsers(dest="version_action")
|
|
28
|
+
ver_up = ver_sub.add_parser("up", help="Upgrade verkit (to local dev if present, else PyPI)")
|
|
29
|
+
ver_up.add_argument("--pypi", action="store_true", help="Force upgrade from PyPI even if local dev checkout exists")
|
|
30
|
+
|
|
31
|
+
# verkit self-up [--pypi]
|
|
32
|
+
selfup_p = subparsers.add_parser("self-up", help="Upgrade verkit (to local dev if present, else PyPI)")
|
|
33
|
+
selfup_p.add_argument("--pypi", action="store_true", help="Force upgrade from PyPI even if local dev checkout exists")
|
|
34
|
+
|
|
23
35
|
# verkit promote <major|minor|patch>
|
|
24
36
|
promote_p = subparsers.add_parser("promote", help="Bump version and commit/amend")
|
|
25
37
|
promote_p.add_argument("part", choices=["major", "minor", "patch"])
|
|
@@ -61,10 +73,21 @@ def main():
|
|
|
61
73
|
args = parser.parse_args()
|
|
62
74
|
console = Console()
|
|
63
75
|
|
|
64
|
-
if
|
|
76
|
+
if args.version:
|
|
77
|
+
console.print(f"verkit {get_installed_version('verkit')}")
|
|
78
|
+
return
|
|
79
|
+
|
|
80
|
+
if not args.command or args.command in ("inspect", "version"):
|
|
81
|
+
if getattr(args, "version_action", None) == "up":
|
|
82
|
+
self_up(console, pypi=getattr(args, "pypi", False))
|
|
83
|
+
return
|
|
65
84
|
display_version_info(console, "verkit")
|
|
66
85
|
return
|
|
67
86
|
|
|
87
|
+
if args.command == "self-up":
|
|
88
|
+
self_up(console, pypi=getattr(args, "pypi", False))
|
|
89
|
+
return
|
|
90
|
+
|
|
68
91
|
try:
|
|
69
92
|
if args.command == "conventions":
|
|
70
93
|
print(conventions_json() if args.json else guide_text())
|
|
@@ -3,6 +3,7 @@ import json
|
|
|
3
3
|
import os
|
|
4
4
|
import re
|
|
5
5
|
import subprocess
|
|
6
|
+
import sys
|
|
6
7
|
import urllib.request
|
|
7
8
|
from dataclasses import dataclass
|
|
8
9
|
from pathlib import Path
|
|
@@ -19,6 +20,91 @@ def get_installed_version(package_name: str) -> str:
|
|
|
19
20
|
return "unknown"
|
|
20
21
|
|
|
21
22
|
|
|
23
|
+
def get_package_origin(package_name: str) -> dict:
|
|
24
|
+
"""Determine whether the package is running as editable dev checkout or from PyPI."""
|
|
25
|
+
try:
|
|
26
|
+
dist = importlib.metadata.distribution(package_name)
|
|
27
|
+
direct_url_raw = dist.read_text("direct_url.json")
|
|
28
|
+
if direct_url_raw:
|
|
29
|
+
data = json.loads(direct_url_raw)
|
|
30
|
+
url = data.get("url", "")
|
|
31
|
+
editable = bool(data.get("dir_info", {}).get("editable", False))
|
|
32
|
+
path_str = url.removeprefix("file://")
|
|
33
|
+
return {
|
|
34
|
+
"is_editable": editable,
|
|
35
|
+
"url": url,
|
|
36
|
+
"path": path_str,
|
|
37
|
+
"source": "local-dev" if editable else "wheel",
|
|
38
|
+
}
|
|
39
|
+
except Exception:
|
|
40
|
+
pass
|
|
41
|
+
|
|
42
|
+
try:
|
|
43
|
+
import sys
|
|
44
|
+
|
|
45
|
+
mod = sys.modules.get(package_name)
|
|
46
|
+
if mod and getattr(mod, "__file__", None):
|
|
47
|
+
f = str(mod.__file__)
|
|
48
|
+
if "site-packages" not in f:
|
|
49
|
+
return {
|
|
50
|
+
"is_editable": True,
|
|
51
|
+
"url": f"file://{f}",
|
|
52
|
+
"path": f,
|
|
53
|
+
"source": "local-dev",
|
|
54
|
+
}
|
|
55
|
+
except Exception:
|
|
56
|
+
pass
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
"is_editable": False,
|
|
60
|
+
"url": "",
|
|
61
|
+
"path": "",
|
|
62
|
+
"source": "pypi",
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def self_up(console: Console, *, pypi: bool = False) -> None:
|
|
67
|
+
"""Sync/upgrade verkit in the active environment.
|
|
68
|
+
|
|
69
|
+
If ~/repos/verkit (or $VERKIT_DEV) exists and not --pypi:
|
|
70
|
+
Installs the local dev checkout in editable mode.
|
|
71
|
+
Else:
|
|
72
|
+
Upgrades to the latest release from PyPI.
|
|
73
|
+
"""
|
|
74
|
+
dev_path = Path(os.environ.get("VERKIT_DEV", Path.home() / "repos" / "verkit"))
|
|
75
|
+
|
|
76
|
+
if not pypi and dev_path.is_dir():
|
|
77
|
+
console.print(f"[blue]Installing local dev checkout from {dev_path}...[/blue]")
|
|
78
|
+
res = subprocess.run(
|
|
79
|
+
["uv", "pip", "install", "-e", str(dev_path)],
|
|
80
|
+
capture_output=True,
|
|
81
|
+
text=True,
|
|
82
|
+
check=False,
|
|
83
|
+
)
|
|
84
|
+
if res.returncode != 0:
|
|
85
|
+
console.print(
|
|
86
|
+
f"[red]Failed to install local checkout: {res.stderr or res.stdout}[/red]"
|
|
87
|
+
)
|
|
88
|
+
sys.exit(1)
|
|
89
|
+
console.print(
|
|
90
|
+
f"[bold green]Successfully installed verkit from local checkout: {dev_path}[/bold green]"
|
|
91
|
+
)
|
|
92
|
+
else:
|
|
93
|
+
console.print("[blue]Upgrading verkit from PyPI...[/blue]")
|
|
94
|
+
res = subprocess.run(
|
|
95
|
+
["uv", "pip", "install", "--upgrade", "verkit"],
|
|
96
|
+
capture_output=True,
|
|
97
|
+
text=True,
|
|
98
|
+
check=False,
|
|
99
|
+
)
|
|
100
|
+
if res.returncode != 0:
|
|
101
|
+
console.print(
|
|
102
|
+
f"[red]Failed to upgrade verkit from PyPI: {res.stderr or res.stdout}[/red]"
|
|
103
|
+
)
|
|
104
|
+
sys.exit(1)
|
|
105
|
+
console.print("[bold green]Successfully upgraded verkit from PyPI.[/bold green]")
|
|
106
|
+
|
|
107
|
+
|
|
22
108
|
def get_latest_pypi_version(package_name: str, timeout: int = 4) -> Optional[str]:
|
|
23
109
|
"""Fetch the latest version of a package from PyPI."""
|
|
24
110
|
url = f"https://pypi.org/pypi/{package_name}/json"
|
|
@@ -38,14 +124,25 @@ def display_version_info(
|
|
|
38
124
|
):
|
|
39
125
|
"""Display running, PyPI, and local project version information."""
|
|
40
126
|
tool_v = get_installed_version(package_name)
|
|
41
|
-
|
|
127
|
+
origin = get_package_origin(package_name)
|
|
128
|
+
|
|
129
|
+
if origin["is_editable"]:
|
|
130
|
+
src_desc = origin["path"] or origin["url"]
|
|
131
|
+
console.print(
|
|
132
|
+
f"[bold blue]Running version:[/bold blue] {tool_v} "
|
|
133
|
+
f"[bold green](local dev checkout: {src_desc})[/bold green]"
|
|
134
|
+
)
|
|
135
|
+
else:
|
|
136
|
+
console.print(
|
|
137
|
+
f"[bold blue]Running version:[/bold blue] {tool_v} [dim](PyPI release)[/dim]"
|
|
138
|
+
)
|
|
42
139
|
|
|
43
140
|
latest_v = get_latest_pypi_version(package_name)
|
|
44
141
|
if latest_v:
|
|
45
|
-
if latest_v != tool_v:
|
|
142
|
+
if latest_v != tool_v and not origin["is_editable"]:
|
|
46
143
|
console.print(f"[bold yellow]Latest PyPI version:[/bold yellow] {latest_v}")
|
|
47
|
-
|
|
48
|
-
|
|
144
|
+
cmd = upgrade_cmd or "verkit self-up --pypi"
|
|
145
|
+
console.print(f"[dim]Run [bold]{cmd}[/bold] to upgrade.[/dim]")
|
|
49
146
|
else:
|
|
50
147
|
console.print(f"[dim]Latest PyPI version:[/dim] {latest_v} (up to date)")
|
|
51
148
|
|
|
@@ -58,6 +155,13 @@ def display_version_info(
|
|
|
58
155
|
except Exception:
|
|
59
156
|
pass
|
|
60
157
|
|
|
158
|
+
dev_path = Path(os.environ.get("VERKIT_DEV", Path.home() / "repos" / package_name))
|
|
159
|
+
if not origin["is_editable"] and dev_path.is_dir():
|
|
160
|
+
console.print(
|
|
161
|
+
f"[dim]Note: Local dev checkout exists at {dev_path}. "
|
|
162
|
+
"Run [bold]mise run install[/bold] or [bold]verkit self-up[/bold] to use local dev source.[/dim]"
|
|
163
|
+
)
|
|
164
|
+
|
|
61
165
|
|
|
62
166
|
@dataclass
|
|
63
167
|
class VersionInfo:
|
|
@@ -77,16 +77,22 @@ def _can_amend_version_safely(git_root: Path) -> Tuple[bool, str]:
|
|
|
77
77
|
|
|
78
78
|
def _stage_version_files(git_root: Path, project_root: Path) -> List[str]:
|
|
79
79
|
staged: List[str] = []
|
|
80
|
+
found_any = False
|
|
80
81
|
for name in _VERSION_FILES:
|
|
81
82
|
target = project_root / name
|
|
82
83
|
if target.exists():
|
|
84
|
+
found_any = True
|
|
83
85
|
res = _git("add", str(target), cwd=git_root)
|
|
84
|
-
if res.returncode
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
if res.returncode != 0:
|
|
87
|
+
err = (res.stderr or res.stdout or "").strip()
|
|
88
|
+
raise RuntimeError(f"Failed to stage {name}: {err}")
|
|
89
|
+
try:
|
|
90
|
+
rel = str(target.relative_to(git_root))
|
|
91
|
+
except ValueError:
|
|
92
|
+
rel = name
|
|
93
|
+
staged.append(rel)
|
|
94
|
+
if not found_any:
|
|
95
|
+
raise RuntimeError("No version files found to stage after bump.")
|
|
90
96
|
return staged
|
|
91
97
|
|
|
92
98
|
|
|
@@ -9,6 +9,13 @@ def test_guide_mentions_bindings_and_mise():
|
|
|
9
9
|
assert "VIM_BINDINGS" in g and "mise" in g
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
def test_guide_style_rules():
|
|
13
|
+
g = guide_text()
|
|
14
|
+
assert "Never draw borders" in g and "borderless" in g
|
|
15
|
+
assert "Never use buttons" in g and "Button" in g
|
|
16
|
+
assert "Footer" in g
|
|
17
|
+
|
|
18
|
+
|
|
12
19
|
def test_bindings_shape_and_vim_keys():
|
|
13
20
|
assert all(len(b) == 3 for b in VIM_BINDINGS)
|
|
14
21
|
assert {"j", "k", "h", "l"} <= {b[0] for b in VIM_BINDINGS}
|
|
@@ -17,6 +24,7 @@ def test_bindings_shape_and_vim_keys():
|
|
|
17
24
|
def test_json_output():
|
|
18
25
|
data = json.loads(conventions_json())
|
|
19
26
|
assert data["vim_bindings"][0]["key"] == "j"
|
|
27
|
+
assert "borders" in data["style_rules"] and "buttons" in data["style_rules"]
|
|
20
28
|
|
|
21
29
|
|
|
22
30
|
def test_init_agent_idempotent_and_no_clobber(tmp_path):
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from verkit.inspector import inspect_project
|
|
1
|
+
from verkit.inspector import get_package_origin, inspect_project
|
|
2
2
|
|
|
3
3
|
def test_inspect_python_project(tmp_path):
|
|
4
4
|
pyproject = tmp_path / "pyproject.toml"
|
|
@@ -18,3 +18,13 @@ def test_inspect_unknown_project(tmp_path):
|
|
|
18
18
|
info = inspect_project(tmp_path)
|
|
19
19
|
assert info.version == "unknown"
|
|
20
20
|
assert info.source is None
|
|
21
|
+
|
|
22
|
+
def test_get_package_origin_unknown():
|
|
23
|
+
origin = get_package_origin("nonexistent_package_xyz123")
|
|
24
|
+
assert origin["is_editable"] is False
|
|
25
|
+
assert origin["source"] == "pypi"
|
|
26
|
+
|
|
27
|
+
def test_get_package_origin_verkit():
|
|
28
|
+
origin = get_package_origin("verkit")
|
|
29
|
+
assert isinstance(origin["is_editable"], bool)
|
|
30
|
+
assert origin["source"] in ("local-dev", "wheel", "pypi")
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import subprocess
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from verkit.promoter import _increment_semver, _stage_version_files
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def test_increment_semver():
|
|
9
|
+
assert _increment_semver("0.1.0", "patch") == "0.1.1"
|
|
10
|
+
assert _increment_semver("0.1.0", "minor") == "0.2.0"
|
|
11
|
+
assert _increment_semver("0.1.0", "major") == "1.0.0"
|
|
12
|
+
assert _increment_semver("1.2.3-rc1", "patch") == "1.2.4-rc1"
|
|
13
|
+
|
|
14
|
+
def test_stage_version_files_success(tmp_path):
|
|
15
|
+
subprocess.run(["git", "init"], cwd=tmp_path, check=True, capture_output=True)
|
|
16
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
17
|
+
pyproject.write_text('[project]\nversion = "0.1.0"\n')
|
|
18
|
+
staged = _stage_version_files(tmp_path, tmp_path)
|
|
19
|
+
assert staged == ["pyproject.toml"]
|
|
20
|
+
|
|
21
|
+
def test_stage_version_files_no_files(tmp_path):
|
|
22
|
+
subprocess.run(["git", "init"], cwd=tmp_path, check=True, capture_output=True)
|
|
23
|
+
with pytest.raises(RuntimeError, match="No version files found"):
|
|
24
|
+
_stage_version_files(tmp_path, tmp_path)
|
|
25
|
+
|
|
26
|
+
def test_stage_version_files_git_error(tmp_path, monkeypatch):
|
|
27
|
+
subprocess.run(["git", "init"], cwd=tmp_path, check=True, capture_output=True)
|
|
28
|
+
pyproject = tmp_path / "pyproject.toml"
|
|
29
|
+
pyproject.write_text('[project]\nversion = "0.1.0"\n')
|
|
30
|
+
|
|
31
|
+
# Create index.lock to simulate lock error
|
|
32
|
+
lock = tmp_path / ".git" / "index.lock"
|
|
33
|
+
lock.write_text("")
|
|
34
|
+
|
|
35
|
+
with pytest.raises(RuntimeError, match="Failed to stage pyproject.toml"):
|
|
36
|
+
_stage_version_files(tmp_path, tmp_path)
|
|
37
|
+
|
verkit-0.3.2/uv.lock
ADDED
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
version = 1
|
|
2
|
+
revision = 5
|
|
3
|
+
requires-python = ">=3.9"
|
|
4
|
+
resolution-markers = [
|
|
5
|
+
"python_full_version >= '3.10'",
|
|
6
|
+
"python_full_version < '3.10'",
|
|
7
|
+
]
|
|
8
|
+
|
|
9
|
+
[[package]]
|
|
10
|
+
name = "colorama"
|
|
11
|
+
version = "0.4.6"
|
|
12
|
+
source = { registry = "https://pypi.org/simple" }
|
|
13
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" }
|
|
14
|
+
wheels = [
|
|
15
|
+
{ url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" },
|
|
16
|
+
]
|
|
17
|
+
|
|
18
|
+
[[package]]
|
|
19
|
+
name = "exceptiongroup"
|
|
20
|
+
version = "1.3.1"
|
|
21
|
+
source = { registry = "https://pypi.org/simple" }
|
|
22
|
+
dependencies = [
|
|
23
|
+
{ name = "typing-extensions" },
|
|
24
|
+
]
|
|
25
|
+
sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" }
|
|
26
|
+
wheels = [
|
|
27
|
+
{ url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" },
|
|
28
|
+
]
|
|
29
|
+
|
|
30
|
+
[[package]]
|
|
31
|
+
name = "iniconfig"
|
|
32
|
+
version = "2.1.0"
|
|
33
|
+
source = { registry = "https://pypi.org/simple" }
|
|
34
|
+
resolution-markers = [
|
|
35
|
+
"python_full_version < '3.10'",
|
|
36
|
+
]
|
|
37
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f2/97/ebf4da567aa6827c909642694d71c9fcf53e5b504f2d96afea02718862f3/iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7", size = 4793, upload-time = "2025-03-19T20:09:59.721Z" }
|
|
38
|
+
wheels = [
|
|
39
|
+
{ url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" },
|
|
40
|
+
]
|
|
41
|
+
|
|
42
|
+
[[package]]
|
|
43
|
+
name = "iniconfig"
|
|
44
|
+
version = "2.3.1"
|
|
45
|
+
source = { registry = "https://pypi.org/simple" }
|
|
46
|
+
resolution-markers = [
|
|
47
|
+
"python_full_version >= '3.10'",
|
|
48
|
+
]
|
|
49
|
+
sdist = { url = "https://files.pythonhosted.org/packages/01/e1/2069291243c926a2ff1cd706c7f3eeb9b62144bf60f77c9fb9ff2fb26bd3/iniconfig-2.3.1.tar.gz", hash = "sha256:67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960", size = 21209, upload-time = "2026-10-06T22:48:38.076Z" }
|
|
50
|
+
wheels = [
|
|
51
|
+
{ url = "https://files.pythonhosted.org/packages/56/43/4ca9e49d27a1fcf6bece6f6aec0ea46bb9112489b93d4b688fb415457bdb/iniconfig-2.3.1-py3-none-any.whl", hash = "sha256:9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7", size = 7552, upload-time = "2026-10-06T22:48:36.959Z" },
|
|
52
|
+
]
|
|
53
|
+
|
|
54
|
+
[[package]]
|
|
55
|
+
name = "markdown-it-py"
|
|
56
|
+
version = "3.0.0"
|
|
57
|
+
source = { registry = "https://pypi.org/simple" }
|
|
58
|
+
resolution-markers = [
|
|
59
|
+
"python_full_version < '3.10'",
|
|
60
|
+
]
|
|
61
|
+
dependencies = [
|
|
62
|
+
{ name = "mdurl" },
|
|
63
|
+
]
|
|
64
|
+
sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" }
|
|
65
|
+
wheels = [
|
|
66
|
+
{ url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" },
|
|
67
|
+
]
|
|
68
|
+
|
|
69
|
+
[[package]]
|
|
70
|
+
name = "markdown-it-py"
|
|
71
|
+
version = "4.2.0"
|
|
72
|
+
source = { registry = "https://pypi.org/simple" }
|
|
73
|
+
resolution-markers = [
|
|
74
|
+
"python_full_version >= '3.10'",
|
|
75
|
+
]
|
|
76
|
+
dependencies = [
|
|
77
|
+
{ name = "mdurl" },
|
|
78
|
+
]
|
|
79
|
+
sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
|
|
80
|
+
wheels = [
|
|
81
|
+
{ url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
|
|
82
|
+
]
|
|
83
|
+
|
|
84
|
+
[[package]]
|
|
85
|
+
name = "mdurl"
|
|
86
|
+
version = "0.1.2"
|
|
87
|
+
source = { registry = "https://pypi.org/simple" }
|
|
88
|
+
sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
|
|
89
|
+
wheels = [
|
|
90
|
+
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
[[package]]
|
|
94
|
+
name = "packaging"
|
|
95
|
+
version = "26.3"
|
|
96
|
+
source = { registry = "https://pypi.org/simple" }
|
|
97
|
+
sdist = { url = "https://files.pythonhosted.org/packages/7d/fa/3944b40b07da9ce895c0e6303a5ab7d53da063554f534556b134a54d6093/packaging-26.3.tar.gz", hash = "sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79", size = 313412, upload-time = "2026-08-04T18:15:28.737Z" }
|
|
98
|
+
wheels = [
|
|
99
|
+
{ url = "https://files.pythonhosted.org/packages/63/34/ba1c580383c9eada3711951fef0795c80b829a078d72188184bcab9dd527/packaging-26.3-py3-none-any.whl", hash = "sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c", size = 129956, upload-time = "2026-08-04T18:15:27.159Z" },
|
|
100
|
+
]
|
|
101
|
+
|
|
102
|
+
[[package]]
|
|
103
|
+
name = "pluggy"
|
|
104
|
+
version = "1.6.0"
|
|
105
|
+
source = { registry = "https://pypi.org/simple" }
|
|
106
|
+
resolution-markers = [
|
|
107
|
+
"python_full_version < '3.10'",
|
|
108
|
+
]
|
|
109
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" }
|
|
110
|
+
wheels = [
|
|
111
|
+
{ url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" },
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
[[package]]
|
|
115
|
+
name = "pluggy"
|
|
116
|
+
version = "1.7.0"
|
|
117
|
+
source = { registry = "https://pypi.org/simple" }
|
|
118
|
+
resolution-markers = [
|
|
119
|
+
"python_full_version >= '3.10'",
|
|
120
|
+
]
|
|
121
|
+
sdist = { url = "https://files.pythonhosted.org/packages/bf/db/7fc19e6f2dc92a966727031389fc2e08b558f0f25eb7403c1119ad4713cd/pluggy-1.7.0.tar.gz", hash = "sha256:d1eaa46ebb595891b860ab086b4d09c8588af65ebd4361b8e8f4bb8920b90ba8", size = 123304, upload-time = "2026-10-15T09:50:58.343Z" }
|
|
122
|
+
wheels = [
|
|
123
|
+
{ url = "https://files.pythonhosted.org/packages/40/9e/2b38731e0fc536806f16490e1a12d7f0dc2a1235aa8cc07bcc75416a7daa/pluggy-1.7.0-py3-none-any.whl", hash = "sha256:7dd7b0d8832ba3cb632c306926ded123429211b83641b35dc5c41ad2d34f9bec", size = 27082, upload-time = "2026-10-15T09:50:56.808Z" },
|
|
124
|
+
]
|
|
125
|
+
|
|
126
|
+
[[package]]
|
|
127
|
+
name = "pygments"
|
|
128
|
+
version = "2.20.0"
|
|
129
|
+
source = { registry = "https://pypi.org/simple" }
|
|
130
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
|
|
131
|
+
wheels = [
|
|
132
|
+
{ url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
[[package]]
|
|
136
|
+
name = "pytest"
|
|
137
|
+
version = "8.4.2"
|
|
138
|
+
source = { registry = "https://pypi.org/simple" }
|
|
139
|
+
resolution-markers = [
|
|
140
|
+
"python_full_version < '3.10'",
|
|
141
|
+
]
|
|
142
|
+
dependencies = [
|
|
143
|
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
144
|
+
{ name = "exceptiongroup" },
|
|
145
|
+
{ name = "iniconfig", version = "2.1.0", source = { registry = "https://pypi.org/simple" } },
|
|
146
|
+
{ name = "packaging" },
|
|
147
|
+
{ name = "pluggy", version = "1.6.0", source = { registry = "https://pypi.org/simple" } },
|
|
148
|
+
{ name = "pygments" },
|
|
149
|
+
{ name = "tomli" },
|
|
150
|
+
]
|
|
151
|
+
sdist = { url = "https://files.pythonhosted.org/packages/a3/5c/00a0e072241553e1a7496d638deababa67c5058571567b92a7eaa258397c/pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01", size = 1519618, upload-time = "2025-09-04T14:34:22.711Z" }
|
|
152
|
+
wheels = [
|
|
153
|
+
{ url = "https://files.pythonhosted.org/packages/a8/a4/20da314d277121d6534b3a980b29035dcd51e6744bd79075a6ce8fa4eb8d/pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79", size = 365750, upload-time = "2025-09-04T14:34:20.226Z" },
|
|
154
|
+
]
|
|
155
|
+
|
|
156
|
+
[[package]]
|
|
157
|
+
name = "pytest"
|
|
158
|
+
version = "9.2.0"
|
|
159
|
+
source = { registry = "https://pypi.org/simple" }
|
|
160
|
+
resolution-markers = [
|
|
161
|
+
"python_full_version >= '3.10'",
|
|
162
|
+
]
|
|
163
|
+
dependencies = [
|
|
164
|
+
{ name = "colorama", marker = "sys_platform == 'win32'" },
|
|
165
|
+
{ name = "exceptiongroup", marker = "python_full_version < '3.11'" },
|
|
166
|
+
{ name = "iniconfig", version = "2.3.1", source = { registry = "https://pypi.org/simple" } },
|
|
167
|
+
{ name = "packaging" },
|
|
168
|
+
{ name = "pluggy", version = "1.7.0", source = { registry = "https://pypi.org/simple" } },
|
|
169
|
+
{ name = "pygments" },
|
|
170
|
+
{ name = "tomli", marker = "python_full_version < '3.11'" },
|
|
171
|
+
]
|
|
172
|
+
sdist = { url = "https://files.pythonhosted.org/packages/79/42/bb4641652e58dedeac2ec51abc1f8cae4fee4ec63899a0999016229a0f2a/pytest-9.2.0.tar.gz", hash = "sha256:97c4f3b1f3c7414aa36465e09b8220f1d03627993bd51b1282e193753c80557b", size = 1797555, upload-time = "2026-10-27T21:30:20.728Z" }
|
|
173
|
+
wheels = [
|
|
174
|
+
{ url = "https://files.pythonhosted.org/packages/51/39/1f5d8c8877a0fa327db959c19341d4be61660de1ab6b7391f9eb805bcd67/pytest-9.2.0-py3-none-any.whl", hash = "sha256:07acdcf88ec174f907dc01af70bf52d49b014bbab03faeeade31c96b18c2e588", size = 411776, upload-time = "2026-10-27T21:30:19.131Z" },
|
|
175
|
+
]
|
|
176
|
+
|
|
177
|
+
[[package]]
|
|
178
|
+
name = "rich"
|
|
179
|
+
version = "15.0.0"
|
|
180
|
+
source = { registry = "https://pypi.org/simple" }
|
|
181
|
+
dependencies = [
|
|
182
|
+
{ name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
|
|
183
|
+
{ name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
|
|
184
|
+
{ name = "pygments" },
|
|
185
|
+
]
|
|
186
|
+
sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
|
|
187
|
+
wheels = [
|
|
188
|
+
{ url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
|
|
189
|
+
]
|
|
190
|
+
|
|
191
|
+
[[package]]
|
|
192
|
+
name = "tomli"
|
|
193
|
+
version = "2.5.0"
|
|
194
|
+
source = { registry = "https://pypi.org/simple" }
|
|
195
|
+
sdist = { url = "https://files.pythonhosted.org/packages/b0/78/9ad63712633ed3ab5cc1a648d863d7e7da371e9425e209555a0fe711b695/tomli-2.5.0.tar.gz", hash = "sha256:264507556cd8b8c8e7c6ee037cdf443a463f03f4c958e57195e3d369711b8ff6", size = 17662, upload-time = "2026-10-07T12:23:37.892Z" }
|
|
196
|
+
wheels = [
|
|
197
|
+
{ url = "https://files.pythonhosted.org/packages/22/a6/ab99b60ee52acd949684febabc3005d0045d0f66bebd9cdebd67372d26dd/tomli-2.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4dc1c1781f2f716de763d1e9a7b34c6a894e167e291c7c5d16c72f7a9538545", size = 163901, upload-time = "2026-10-07T12:22:15.601Z" },
|
|
198
|
+
{ url = "https://files.pythonhosted.org/packages/bc/00/ee01b7ed4579180fff07142d290257f25ba786f23f3ec6005f620933c2f5/tomli-2.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:eff8babca5a7999bc137acbc7482a8b7e17ffca5075ab41f5d770ab408c7bfef", size = 163756, upload-time = "2026-10-07T12:22:16.957Z" },
|
|
199
|
+
{ url = "https://files.pythonhosted.org/packages/72/c2/4efebf65372f6583185f79799312109dddb61102d47e5c33dcfd1a297aca/tomli-2.5.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:86665cee9c4835b7a7f1e8ec2c719b5258d4dc782887aded5a8ae7352a96843b", size = 268038, upload-time = "2026-10-07T12:22:18.135Z" },
|
|
200
|
+
{ url = "https://files.pythonhosted.org/packages/53/07/5850468e925d898abb36038666f9c333a94d2a223e802a8ba5b6d319d23f/tomli-2.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e369fd63331746182360977b1892bfc215476a30d61612d732425311639f56", size = 276422, upload-time = "2026-10-07T12:22:19.567Z" },
|
|
201
|
+
{ url = "https://files.pythonhosted.org/packages/b4/87/f293984cdcf83c054196d4fd3dad44fc68ae55b4b8c44bc76cef360c3150/tomli-2.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ad1ea345759240d6463efa0ed1c704402752e49aa21476620738d74d72d8aa1", size = 272616, upload-time = "2026-10-07T12:22:20.794Z" },
|
|
202
|
+
{ url = "https://files.pythonhosted.org/packages/ce/ce/db582886b3c1219d3fec93ebd669332482e5aee7a91e0f7838d84f2d1759/tomli-2.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:96243987194634bd411066ce40c952e108f86af04db533ecd8ac3ff2a85b1885", size = 276593, upload-time = "2026-10-07T12:22:22.12Z" },
|
|
203
|
+
{ url = "https://files.pythonhosted.org/packages/bf/72/7619b87dea4261fc27dd7b54c4461c129c1f7d9bb7ba3aec89c797a431b8/tomli-2.5.0-cp311-cp311-win32.whl", hash = "sha256:610b27d99f28ec5f191c7064a48f3ddb179a1fe6ca73d571483ae859f57b605e", size = 101830, upload-time = "2026-10-07T12:22:23.651Z" },
|
|
204
|
+
{ url = "https://files.pythonhosted.org/packages/1e/74/220106da34502304b6751a2a9b8a9fbca6c3fd47e737a2e2e3da7c61c9db/tomli-2.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:c804ae44fe7b4bab5da295e4f980a1ff04670bca9d23fe0a4e887e08ebd741a8", size = 112742, upload-time = "2026-10-07T12:22:24.972Z" },
|
|
205
|
+
{ url = "https://files.pythonhosted.org/packages/27/99/7d9c8b41837a7773613e169504147375c157a290167aa59ad74a085f521f/tomli-2.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:cfac177ebd6236003846ea339981f71457cb6eb748f23381eb257e45092e3980", size = 109332, upload-time = "2026-10-07T12:22:26.117Z" },
|
|
206
|
+
{ url = "https://files.pythonhosted.org/packages/52/ed/7baa86f87493646a594de388c7c1c40a39dd0461f7e9c0359cbeefc91fe8/tomli-2.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1f4a40d03fb9f63424f0979855bdeaf44dd7696b8d59501822c10ed30ba532df", size = 164854, upload-time = "2026-10-07T12:22:27.444Z" },
|
|
207
|
+
{ url = "https://files.pythonhosted.org/packages/a5/b1/44c0341f2224397855723c7a8a39f718ea6fcbcc3dacc66e5aeca0f334e3/tomli-2.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9ebf8d19b17bd0daeb7b7dec81a946a439b753942fd0210d6e96c532249eea6b", size = 164074, upload-time = "2026-10-07T12:22:28.679Z" },
|
|
208
|
+
{ url = "https://files.pythonhosted.org/packages/23/04/e2d5b7d3fba47adedb23de616c16d428ea076c79a3d8e1d95d649ffe197e/tomli-2.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf0b5e8e0f68ebb494356e577c06c139161efd8d3b9050f93b39b7c26cc54ff0", size = 274274, upload-time = "2026-10-07T12:22:29.804Z" },
|
|
209
|
+
{ url = "https://files.pythonhosted.org/packages/43/90/6090e706ff27a6f89f4a40578e3324b95c3cd8c4150868aabf33a8f414c3/tomli-2.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cf74416bdc94ae458b14e37286c1073081850ac8459a00d0c5efef5d44294c6", size = 286435, upload-time = "2026-10-07T12:22:31.297Z" },
|
|
210
|
+
{ url = "https://files.pythonhosted.org/packages/0a/9e/a2c40768df16c408f22430afb0a73e9d7e5f79c950884954649d1146b74d/tomli-2.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:61ea1ebe1e55a34ea8199cc8dbff398d35027b82271c8ac4802fd3a1fd5b1bcc", size = 278119, upload-time = "2026-10-07T12:22:32.601Z" },
|
|
211
|
+
{ url = "https://files.pythonhosted.org/packages/12/25/3c0cb485b98e9cfac495629b1c93c87ccf0b72fbe9d2689fd8fe62c6d5a3/tomli-2.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed53f7e89bb04f6d9e8e7799112360b0c4d5cbff067de0814c98c37c39b920f7", size = 286177, upload-time = "2026-10-07T12:22:33.745Z" },
|
|
212
|
+
{ url = "https://files.pythonhosted.org/packages/77/8b/0144c65f0e37e51c18d04ae15c21b19431c165002d0131fe9aa8b0b8b1e8/tomli-2.5.0-cp312-cp312-win32.whl", hash = "sha256:e7ad033e27a516a233bea839cdb77b80146facb3b4f40bf02cd0cac165cdd5c2", size = 102760, upload-time = "2026-10-07T12:22:34.887Z" },
|
|
213
|
+
{ url = "https://files.pythonhosted.org/packages/de/32/5d6d8f42fc9a05fce69354e00ff256484192f5f2fc9a2165718fa0de61ec/tomli-2.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:bd05de8c1698f8413dd7d869492693a0bf2211543b787ac78cd5e7536af1a6d7", size = 112722, upload-time = "2026-10-07T12:22:36.162Z" },
|
|
214
|
+
{ url = "https://files.pythonhosted.org/packages/30/65/df18032218db0fb9b769fb23c8039a051f15c811993995ea04c350273a32/tomli-2.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:069435bd5480429b98c5e5afb02ab21c219b6f0064680671c6dc0d46817346ea", size = 109534, upload-time = "2026-10-07T12:22:37.296Z" },
|
|
215
|
+
{ url = "https://files.pythonhosted.org/packages/42/e5/51736d70da209350969e15aca5c5ab6e2ce1ea87a0a892a6c13aec172a86/tomli-2.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:943276cf269e0071948d9ff697159c1735e623c1151d88abb09b74659ef0cbea", size = 163328, upload-time = "2026-10-07T12:22:38.373Z" },
|
|
216
|
+
{ url = "https://files.pythonhosted.org/packages/ec/55/086f80dab4ab497602644274e6dea7ec5dd0b4e262e443a8ad3bb7edee2d/tomli-2.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:463b16086865b97facd8d0b3fb4cb7c544e3f58d2a69dc3113d6db9653fdb043", size = 162246, upload-time = "2026-10-07T12:22:39.673Z" },
|
|
217
|
+
{ url = "https://files.pythonhosted.org/packages/aa/eb/3ecc94459f3635c92321f4e7bde571323fdb2267c50e19e3188a281eae3b/tomli-2.5.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1245a6638fc4bb0a60af38a7d45413db34a13842027c77597c712c998c62fdf0", size = 272655, upload-time = "2026-10-07T12:22:41.08Z" },
|
|
218
|
+
{ url = "https://files.pythonhosted.org/packages/c0/d7/494fd1f0c37a621f1ad9975c2efadb523e8101f144ed6edb2e7fe64738f2/tomli-2.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d8bac3d603c97e6854424e5b2b5b741bdbde387e09f162fb0446812b4a8362b", size = 283595, upload-time = "2026-10-07T12:22:42.222Z" },
|
|
219
|
+
{ url = "https://files.pythonhosted.org/packages/70/51/bb8d62b1317e6640866f6949b2d5855e5300f2c99d46de1cd245570bba65/tomli-2.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:21e4cae4114aba25aa0d4f85cdf486d290fb35c0954d7bba536248da64d43066", size = 276253, upload-time = "2026-10-07T12:22:43.625Z" },
|
|
220
|
+
{ url = "https://files.pythonhosted.org/packages/66/f4/f46bd7f0763cd47de2db697dca9257c6a4adfd1a93b018cc75c8190ed5a8/tomli-2.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bbaefc84548d754be821bba7c4141c4787dda182f9e77f2f87b71213529efa7b", size = 283582, upload-time = "2026-10-07T12:22:44.983Z" },
|
|
221
|
+
{ url = "https://files.pythonhosted.org/packages/ac/03/70f2bcb2923a6db37818d917e124270a7f4cfd38ea576f5aa753a91c0ef5/tomli-2.5.0-cp313-cp313-win32.whl", hash = "sha256:abdbf6313b8d9efe157edeb7ab6eae4de064b1300ad31abf73755154b30abe68", size = 102628, upload-time = "2026-10-07T12:22:46.508Z" },
|
|
222
|
+
{ url = "https://files.pythonhosted.org/packages/dc/98/d52024bb5b0ff68b4f0d276d867f634c84a67319a7e9f6b7708a37742333/tomli-2.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:fd4dc129784e0c5335bd4e61dfcc4487499a013419e655cf2da1d091b7e0efdc", size = 113301, upload-time = "2026-10-07T12:22:47.647Z" },
|
|
223
|
+
{ url = "https://files.pythonhosted.org/packages/6f/f2/540db3a70572a8c23a28aba3e9c358ce0ffffbafc990905c1343aa265b31/tomli-2.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:69491c143d2fe063046e0301e62a810bed338fa4d1ce0fd870c27dc1e09b0d84", size = 109744, upload-time = "2026-10-07T12:22:48.925Z" },
|
|
224
|
+
{ url = "https://files.pythonhosted.org/packages/e4/49/caf6b307766eb9567664a8707e9d6be5fcc0e8903f18781c6677a60d80c7/tomli-2.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d3182ee2d887e507bd67319a0a61105d1dd33facc111329559a233b772c1a105", size = 162899, upload-time = "2026-10-07T12:22:50.088Z" },
|
|
225
|
+
{ url = "https://files.pythonhosted.org/packages/d3/c8/68cfce773a2733a49c74f99d627fb461bd990756860099eac25617889585/tomli-2.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:521345fd1f19d45b8df87657aaa38b6f2ca3800059fadf428e7ebf479a383646", size = 162080, upload-time = "2026-10-07T12:22:51.558Z" },
|
|
226
|
+
{ url = "https://files.pythonhosted.org/packages/7e/b2/e5bb8651fdad593f670501a7d718b1a7f73f064d44dea15e04c04dfef45d/tomli-2.5.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e95c7614e705bfe2b04b27aa124adec59752d15813df37e2156747cab3a006b", size = 273380, upload-time = "2026-10-07T12:22:52.918Z" },
|
|
227
|
+
{ url = "https://files.pythonhosted.org/packages/8d/d2/9e2d7f8b1dfe0e2b34c245986ebd55c4c553ea4ce6c47c443b332673253f/tomli-2.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ac2027d37c3afbdf4bdd377f2676f6f1d2122a5be1f1137b49dced590b37e75", size = 283228, upload-time = "2026-10-07T12:22:54.173Z" },
|
|
228
|
+
{ url = "https://files.pythonhosted.org/packages/ba/df/ec7b876b7b1a2718bd74a3743c076fff565b04029ba33e8f61fac262739f/tomli-2.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c414be4ed9d3cac80c42e348fa5a956117d1a48227f48026e31f59cb4a7671eb", size = 277189, upload-time = "2026-10-07T12:22:55.342Z" },
|
|
229
|
+
{ url = "https://files.pythonhosted.org/packages/7d/7b/e192d9eed0b9cb80da799f4d77052297fb9a2c3cc9b19f571f56ea88add6/tomli-2.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9b03d7dc168353b4132965bde20feceabaa470e570c6f59660dfae59b1f9eeb3", size = 283632, upload-time = "2026-10-07T12:22:56.735Z" },
|
|
230
|
+
{ url = "https://files.pythonhosted.org/packages/84/50/ff94454e75461d75623e47401ed323d65c10aab8fe9033242c20cd2fdf32/tomli-2.5.0-cp314-cp314-win32.whl", hash = "sha256:6f041843c4d3a37245c0c056fd955b186bf8b1fb85690cbe40b81230891dc34b", size = 103535, upload-time = "2026-10-07T12:22:58.084Z" },
|
|
231
|
+
{ url = "https://files.pythonhosted.org/packages/54/0b/bdacf05f963bd6026ebf6eeb0beda847d1d60e03e440725c64a4e08a0afd/tomli-2.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:f4b653094e18f9031102d3a1da5c729c8f222d85225b18037dac621695e46e1a", size = 114621, upload-time = "2026-10-07T12:22:59.2Z" },
|
|
232
|
+
{ url = "https://files.pythonhosted.org/packages/61/99/53f438fa6ae4f9d4ed0ddde3e7242b3bdc34b48c8f9948b72b9e9b127676/tomli-2.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:3f89d10c1ff6a38d992c27fc8a4816af71a909e08a40ec66934240b1e74347c3", size = 111572, upload-time = "2026-10-07T12:23:00.479Z" },
|
|
233
|
+
{ url = "https://files.pythonhosted.org/packages/b9/20/1f88f19427d380a40e90a770e087489eaafe4aeee070ae88ed2bbec00acd/tomli-2.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:e9e15b4a6c7dd6b85b5fbab29488a73f1f70de516942308daa266bf0e0aeb0d4", size = 171814, upload-time = "2026-10-07T12:23:01.914Z" },
|
|
234
|
+
{ url = "https://files.pythonhosted.org/packages/d0/56/cbe5079c9f9a54b9b3e27fc82f08f3cb36edee75561679f53d2380c801d6/tomli-2.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e12bbcd32897272fb05929110362ae9ff4c1b9bb26bd9e971e71dcd3275b4c3d", size = 171324, upload-time = "2026-10-07T12:23:03.18Z" },
|
|
235
|
+
{ url = "https://files.pythonhosted.org/packages/2b/30/1d53fd3b0f1cb3ba542e345ec32c26aefdddc4e829e4f3429af8a4f27782/tomli-2.5.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:20aa36de8f2cf87237143bc1fa1aae8d6612c09118f4da21c6a684db5dd1f6f9", size = 297441, upload-time = "2026-10-07T12:23:04.345Z" },
|
|
236
|
+
{ url = "https://files.pythonhosted.org/packages/66/d9/0800acb6a111686f764c1b91ef15cc42a20a66a46013bb42220f1d2c61c1/tomli-2.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22185fad8a1e622f064e78008018a0dd3323550dcb479cb7a1d296888d74024f", size = 307476, upload-time = "2026-10-07T12:23:05.671Z" },
|
|
237
|
+
{ url = "https://files.pythonhosted.org/packages/e8/63/30a8f3cd51b5bec37f04744bad0b0dc6160df84aad4f27b0e9283d66f221/tomli-2.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:984012f71908165449a951de2050d52f276bfe3aa5d5f570f63ddad814370374", size = 296113, upload-time = "2026-10-07T12:23:07.202Z" },
|
|
238
|
+
{ url = "https://files.pythonhosted.org/packages/ab/18/0b9ffc597e69c5a1e20a7823cb60d54b39a9f54e91edcb8574f022186758/tomli-2.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f79203b3965b4000e91808aaa7c040206093f2b8bf86f455982f2274c9ccf442", size = 307725, upload-time = "2026-10-07T12:23:08.508Z" },
|
|
239
|
+
{ url = "https://files.pythonhosted.org/packages/ab/c7/18f8baae0b5607a60e8e19b4a7fedee43a8ff6458e3896dcbbadeeac9c22/tomli-2.5.0-cp314-cp314t-win32.whl", hash = "sha256:91294a9fb94a75542f6e46e4a2ae709bd8d9b51134098cae5cf3bea5478b6d03", size = 108546, upload-time = "2026-10-07T12:23:09.956Z" },
|
|
240
|
+
{ url = "https://files.pythonhosted.org/packages/72/34/4cca9739254130627bde87500b3f2b512154fe2f278efa7e2a5e10ad4bcb/tomli-2.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f15e3e0b835a6d68b10c86bf80a3149780498d6911c93c3ffd1861d19f9200f1", size = 117814, upload-time = "2026-10-07T12:23:11.486Z" },
|
|
241
|
+
{ url = "https://files.pythonhosted.org/packages/7d/fb/afa530d47dd80a78fce43beac6bc6e00f84558eafcffbc6f37b21e80d056/tomli-2.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:6664b7ae7af7294256c53960a6103077f4914cec8ff98479c352f622c6f6b2f0", size = 115188, upload-time = "2026-10-07T12:23:12.728Z" },
|
|
242
|
+
{ url = "https://files.pythonhosted.org/packages/66/98/316fdc00f8c0939e6fe50461dd343c162d3ad51d1286eb25b7db54361d50/tomli-2.5.0-cp315-cp315-macosx_10_15_x86_64.whl", hash = "sha256:a525685c2f97da40762b8695eb7aa0af4c8344ca1905c73e4e29cb04d34607dc", size = 162775, upload-time = "2026-10-07T12:23:13.941Z" },
|
|
243
|
+
{ url = "https://files.pythonhosted.org/packages/c5/22/7b10fa5bb01c9539f53f69b619361b19350acc73657772ea7ac70ba309a8/tomli-2.5.0-cp315-cp315-macosx_11_0_arm64.whl", hash = "sha256:9dbb18c1cfb2f6517942fc9314437f66aa06d94436ffb1f06102ef3572f35276", size = 161406, upload-time = "2026-10-07T12:23:15.215Z" },
|
|
244
|
+
{ url = "https://files.pythonhosted.org/packages/9c/e7/1a069d86dfd20f1f84f71c63faed9f83c1d890bc06c27d82dc7d888fb573/tomli-2.5.0-cp315-cp315-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:752e8b1aa6a4367ef8bf6a1a1e005540f7ed055ba36d7193796812ca5404eb52", size = 273855, upload-time = "2026-10-07T12:23:16.471Z" },
|
|
245
|
+
{ url = "https://files.pythonhosted.org/packages/ae/83/d1ef43d1687d092ab9c235455c76e6e709483b346b056f086095c7c263a5/tomli-2.5.0-cp315-cp315-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c47300f9bf791808f77d82747691c4bb09cb14bdf3060cca99b42cdc4361d5a7", size = 284910, upload-time = "2026-10-07T12:23:18.166Z" },
|
|
246
|
+
{ url = "https://files.pythonhosted.org/packages/cc/05/f4d9cf7de61822ece0c3873f30d291e324911c71a378b8bfe5ced13fd9f5/tomli-2.5.0-cp315-cp315-musllinux_1_2_aarch64.whl", hash = "sha256:19b0dd8749f4ea2f112c5fcfb3c5248390c899d7e2e173f1d91abee1fa0ff391", size = 277723, upload-time = "2026-10-07T12:23:19.355Z" },
|
|
247
|
+
{ url = "https://files.pythonhosted.org/packages/42/28/78262493141fa543151cf005760c3cb01d09fc28a11f993c05109902cb8c/tomli-2.5.0-cp315-cp315-musllinux_1_2_x86_64.whl", hash = "sha256:57b1c3b01fab802e2899bc3d168dca320e14165e2fd9fd584760fb4ca5826859", size = 285115, upload-time = "2026-10-07T12:23:20.698Z" },
|
|
248
|
+
{ url = "https://files.pythonhosted.org/packages/1a/b9/e1dab9a30bcb677b5cc5cee810609cfd64f24306a3055767dd3fda00b1e0/tomli-2.5.0-cp315-cp315-win32.whl", hash = "sha256:667e521b37a6c5ccaa044202c235b530f90177ffe2cd4a64ecc213c7dd535feb", size = 103475, upload-time = "2026-10-07T12:23:21.941Z" },
|
|
249
|
+
{ url = "https://files.pythonhosted.org/packages/4c/bd/31a3790c11d6ea95fcf5e6022ac0f8d0543c9b61120b730fc481bd43d3b4/tomli-2.5.0-cp315-cp315-win_amd64.whl", hash = "sha256:d747252933c8a65ef6bd8da0fbb7ce28a90eb6119d8cd00772cd528aa07b68d5", size = 114589, upload-time = "2026-10-07T12:23:23.098Z" },
|
|
250
|
+
{ url = "https://files.pythonhosted.org/packages/47/a2/4f6310fa699364f0e3af7ee3af88dddd9af066d33e716a0265bbe2b3ea84/tomli-2.5.0-cp315-cp315-win_arm64.whl", hash = "sha256:75dbcde8751b0a960aa3de173aa5e894d590755c6d7758b7e774c06f1dc3cbdd", size = 111493, upload-time = "2026-10-07T12:23:24.233Z" },
|
|
251
|
+
{ url = "https://files.pythonhosted.org/packages/68/14/00853f0b396d8971107ae1921bb5b322fdee1650d2f16bf06c20adb532e5/tomli-2.5.0-cp315-cp315t-macosx_10_15_x86_64.whl", hash = "sha256:2419c2a189551987b59d80e63ec355671283336f41c6b9b89462df679c7d0c57", size = 171380, upload-time = "2026-10-07T12:23:25.512Z" },
|
|
252
|
+
{ url = "https://files.pythonhosted.org/packages/89/ad/fa6949321dadee46b27363974fb197b94c911c3b0f7a5fd26d7dc18fc2a0/tomli-2.5.0-cp315-cp315t-macosx_11_0_arm64.whl", hash = "sha256:0dc598040da8d42cf20f0be588ed7004f46db12a0ac6c32e03a59dccedaaadcd", size = 170553, upload-time = "2026-10-07T12:23:26.855Z" },
|
|
253
|
+
{ url = "https://files.pythonhosted.org/packages/53/aa/3056c919eb3e084df3752b2cf5f865dcc04af0b27dba2f66d7b28af4633a/tomli-2.5.0-cp315-cp315t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49096930c8d886c9bbdab62d2d0d17ce823ddeea522309a190b36245d5b49e01", size = 294428, upload-time = "2026-10-07T12:23:28.132Z" },
|
|
254
|
+
{ url = "https://files.pythonhosted.org/packages/96/b2/faeeb5d8769ea3832021d73e892c8391eae7b4b4f8b55a789127bd8b18a9/tomli-2.5.0-cp315-cp315t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8ade5023067f99fe72b88accd30d0ea05a158e9e32a11f124e731ea9695313f", size = 304909, upload-time = "2026-10-07T12:23:29.381Z" },
|
|
255
|
+
{ url = "https://files.pythonhosted.org/packages/f6/52/f094c09e73fb654b621716d019acb5d29bdfd1be01df80c281d552bda48d/tomli-2.5.0-cp315-cp315t-musllinux_1_2_aarch64.whl", hash = "sha256:b69564772b5c8f22ea5f498dff08cfa825045b4d4c4400529000bdf818aa3b2a", size = 293220, upload-time = "2026-10-07T12:23:30.608Z" },
|
|
256
|
+
{ url = "https://files.pythonhosted.org/packages/86/f5/0c30541078ca4b505ce3bd76ed931facbfec524dd018535d691d1af0a6d2/tomli-2.5.0-cp315-cp315t-musllinux_1_2_x86_64.whl", hash = "sha256:8ff3a2ca028c7eee0c777f9a092038d0a594a9fa04e215f929a22c329e2cb142", size = 305705, upload-time = "2026-10-07T12:23:32.181Z" },
|
|
257
|
+
{ url = "https://files.pythonhosted.org/packages/05/74/590e7d19d6a118fc5cc5704ff358e21d95b8573f6b9443b1519f29ca8825/tomli-2.5.0-cp315-cp315t-win32.whl", hash = "sha256:62fc1bc8eb03e3a9cadfca713d65614ed8e09d974a283295ffe3a831976b4dc5", size = 108432, upload-time = "2026-10-07T12:23:33.496Z" },
|
|
258
|
+
{ url = "https://files.pythonhosted.org/packages/1c/b8/63a75cfb27a17c38550e44025d3a6e7be64516fd8608a3b75703bf37d81b/tomli-2.5.0-cp315-cp315t-win_amd64.whl", hash = "sha256:f3fcbc57b1791fa6cbe5d8434179d51de12be1a4811469529f47f6e7487a2571", size = 117281, upload-time = "2026-10-07T12:23:34.648Z" },
|
|
259
|
+
{ url = "https://files.pythonhosted.org/packages/72/01/e8c1debb2173973372934c68fc8e46170ab60ef23ed4592dff4dec6e8993/tomli-2.5.0-cp315-cp315t-win_arm64.whl", hash = "sha256:d2ba24db8a9376921b5e87b4762b9adb0f3f1deaea68f2b8b0bb2c11efb9c3e7", size = 115069, upload-time = "2026-10-07T12:23:35.77Z" },
|
|
260
|
+
{ url = "https://files.pythonhosted.org/packages/60/3f/3e3f8fd0919249b0200c80fbc4f9a1e70be19f9883da71dfb7f8b9ab8aca/tomli-2.5.0-py3-none-any.whl", hash = "sha256:32a7b79ac57a2e83670ce329ccf675798bc5a2094783a63676866b70503f2e2b", size = 14765, upload-time = "2026-10-07T12:23:36.875Z" },
|
|
261
|
+
]
|
|
262
|
+
|
|
263
|
+
[[package]]
|
|
264
|
+
name = "typing-extensions"
|
|
265
|
+
version = "4.16.0"
|
|
266
|
+
source = { registry = "https://pypi.org/simple" }
|
|
267
|
+
sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" }
|
|
268
|
+
wheels = [
|
|
269
|
+
{ url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" },
|
|
270
|
+
]
|
|
271
|
+
|
|
272
|
+
[[package]]
|
|
273
|
+
name = "verkit"
|
|
274
|
+
version = "0.3.2"
|
|
275
|
+
source = { editable = "." }
|
|
276
|
+
dependencies = [
|
|
277
|
+
{ name = "rich" },
|
|
278
|
+
]
|
|
279
|
+
|
|
280
|
+
[package.dev-dependencies]
|
|
281
|
+
dev = [
|
|
282
|
+
{ name = "pytest", version = "8.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
|
|
283
|
+
{ name = "pytest", version = "9.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
|
|
284
|
+
]
|
|
285
|
+
|
|
286
|
+
[package.metadata]
|
|
287
|
+
requires-dist = [{ name = "rich", specifier = ">=10.0.0" }]
|
|
288
|
+
|
|
289
|
+
[package.metadata.requires-dev]
|
|
290
|
+
dev = [{ name = "pytest" }]
|
verkit-0.3.1/llms.txt
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
# verkit
|
|
2
|
-
|
|
3
|
-
> Polyglot project version inspector, promoter, tagger and release CLI, plus the shared Rich theme and vim-style Textual key conventions for the author's Python TUIs. If your project depends on verkit, read the conventions guide first.
|
|
4
|
-
|
|
5
|
-
## Agent guidance
|
|
6
|
-
- [Conventions guide](https://raw.githubusercontent.com/bizkite-co/verkit/main/src/verkit/agent_guide.md): vim navigation, theme, mise dev-vs-PyPI rule. Also `verkit conventions [--json]`.
|
|
7
|
-
- [AGENTS.md](https://raw.githubusercontent.com/bizkite-co/verkit/main/AGENTS.md): working on verkit itself.
|
|
8
|
-
|
|
9
|
-
## Code
|
|
10
|
-
- [keys.py](https://raw.githubusercontent.com/bizkite-co/verkit/main/src/verkit/keys.py): `VIM_BINDINGS` for Textual `BINDINGS`.
|
|
11
|
-
- [theme.py](https://raw.githubusercontent.com/bizkite-co/verkit/main/src/verkit/theme.py): shared Rich theme.
|
|
12
|
-
- [theme.json](https://raw.githubusercontent.com/bizkite-co/verkit/main/src/verkit/theme.json): theme for non-Python consumers.
|
|
13
|
-
|
|
14
|
-
## Optional
|
|
15
|
-
- [README](https://raw.githubusercontent.com/bizkite-co/verkit/main/README.md): CLI and API usage.
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
from verkit.promoter import _increment_semver
|
|
2
|
-
|
|
3
|
-
def test_increment_semver():
|
|
4
|
-
assert _increment_semver("0.1.0", "patch") == "0.1.1"
|
|
5
|
-
assert _increment_semver("0.1.0", "minor") == "0.2.0"
|
|
6
|
-
assert _increment_semver("0.1.0", "major") == "1.0.0"
|
|
7
|
-
assert _increment_semver("1.2.3-rc1", "patch") == "1.2.4-rc1"
|
verkit-0.3.1/uv.lock
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
version = 1
|
|
2
|
-
revision = 3
|
|
3
|
-
requires-python = ">=3.9"
|
|
4
|
-
resolution-markers = [
|
|
5
|
-
"python_full_version >= '3.10'",
|
|
6
|
-
"python_full_version < '3.10'",
|
|
7
|
-
]
|
|
8
|
-
|
|
9
|
-
[[package]]
|
|
10
|
-
name = "markdown-it-py"
|
|
11
|
-
version = "3.0.0"
|
|
12
|
-
source = { registry = "https://pypi.org/simple" }
|
|
13
|
-
resolution-markers = [
|
|
14
|
-
"python_full_version < '3.10'",
|
|
15
|
-
]
|
|
16
|
-
dependencies = [
|
|
17
|
-
{ name = "mdurl" },
|
|
18
|
-
]
|
|
19
|
-
sdist = { url = "https://files.pythonhosted.org/packages/38/71/3b932df36c1a044d397a1f92d1cf91ee0a503d91e470cbd670aa66b07ed0/markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb", size = 74596, upload-time = "2023-06-03T06:41:14.443Z" }
|
|
20
|
-
wheels = [
|
|
21
|
-
{ url = "https://files.pythonhosted.org/packages/42/d7/1ec15b46af6af88f19b8e5ffea08fa375d433c998b8a7639e76935c14f1f/markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1", size = 87528, upload-time = "2023-06-03T06:41:11.019Z" },
|
|
22
|
-
]
|
|
23
|
-
|
|
24
|
-
[[package]]
|
|
25
|
-
name = "markdown-it-py"
|
|
26
|
-
version = "4.2.0"
|
|
27
|
-
source = { registry = "https://pypi.org/simple" }
|
|
28
|
-
resolution-markers = [
|
|
29
|
-
"python_full_version >= '3.10'",
|
|
30
|
-
]
|
|
31
|
-
dependencies = [
|
|
32
|
-
{ name = "mdurl" },
|
|
33
|
-
]
|
|
34
|
-
sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" }
|
|
35
|
-
wheels = [
|
|
36
|
-
{ url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" },
|
|
37
|
-
]
|
|
38
|
-
|
|
39
|
-
[[package]]
|
|
40
|
-
name = "mdurl"
|
|
41
|
-
version = "0.1.2"
|
|
42
|
-
source = { registry = "https://pypi.org/simple" }
|
|
43
|
-
sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" }
|
|
44
|
-
wheels = [
|
|
45
|
-
{ url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" },
|
|
46
|
-
]
|
|
47
|
-
|
|
48
|
-
[[package]]
|
|
49
|
-
name = "pygments"
|
|
50
|
-
version = "2.20.0"
|
|
51
|
-
source = { registry = "https://pypi.org/simple" }
|
|
52
|
-
sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" }
|
|
53
|
-
wheels = [
|
|
54
|
-
{ url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" },
|
|
55
|
-
]
|
|
56
|
-
|
|
57
|
-
[[package]]
|
|
58
|
-
name = "rich"
|
|
59
|
-
version = "15.0.0"
|
|
60
|
-
source = { registry = "https://pypi.org/simple" }
|
|
61
|
-
dependencies = [
|
|
62
|
-
{ name = "markdown-it-py", version = "3.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.10'" },
|
|
63
|
-
{ name = "markdown-it-py", version = "4.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.10'" },
|
|
64
|
-
{ name = "pygments" },
|
|
65
|
-
]
|
|
66
|
-
sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" }
|
|
67
|
-
wheels = [
|
|
68
|
-
{ url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" },
|
|
69
|
-
]
|
|
70
|
-
|
|
71
|
-
[[package]]
|
|
72
|
-
name = "verkit"
|
|
73
|
-
version = "0.3.1"
|
|
74
|
-
source = { editable = "." }
|
|
75
|
-
dependencies = [
|
|
76
|
-
{ name = "rich" },
|
|
77
|
-
]
|
|
78
|
-
|
|
79
|
-
[package.metadata]
|
|
80
|
-
requires-dist = [{ name = "rich", specifier = ">=10.0.0" }]
|
|
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
|