yurli 0.1.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.
- yurli-0.1.0/.agents/skills/dependency-maintenance/SKILL.md +29 -0
- yurli-0.1.0/.agents/skills/release/SKILL.md +27 -0
- yurli-0.1.0/.agents/skills/update-from-template/HISTORY.md +23 -0
- yurli-0.1.0/.agents/skills/update-from-template/SKILL.md +56 -0
- yurli-0.1.0/.gitattributes +2 -0
- yurli-0.1.0/.github/dependabot.yml +15 -0
- yurli-0.1.0/.github/rulesets/main-squash-only.json +32 -0
- yurli-0.1.0/.github/workflows/ci.yml +141 -0
- yurli-0.1.0/.github/workflows/docs-ci.yml +34 -0
- yurli-0.1.0/.github/workflows/publish.yml +44 -0
- yurli-0.1.0/.gitignore +29 -0
- yurli-0.1.0/.prettierignore +15 -0
- yurli-0.1.0/.prettierrc +4 -0
- yurli-0.1.0/.vale/styles/config/vocabularies/LocalProject/accept.txt +6 -0
- yurli-0.1.0/.vale.ini +14 -0
- yurli-0.1.0/AGENTS.md +35 -0
- yurli-0.1.0/CONTRIBUTING.md +106 -0
- yurli-0.1.0/LICENSE +21 -0
- yurli-0.1.0/PKG-INFO +58 -0
- yurli-0.1.0/README.md +41 -0
- yurli-0.1.0/package-lock.json +29 -0
- yurli-0.1.0/package.json +7 -0
- yurli-0.1.0/prek.toml +70 -0
- yurli-0.1.0/pyproject.toml +113 -0
- yurli-0.1.0/tests/__init__.py +0 -0
- yurli-0.1.0/tests/test_dummy.py +5 -0
- yurli-0.1.0/tools/env.sh +81 -0
- yurli-0.1.0/tools/formatters.sh +33 -0
- yurli-0.1.0/tools/linters.sh +41 -0
- yurli-0.1.0/uv.lock +359 -0
- yurli-0.1.0/yurli/__init__.py +0 -0
- yurli-0.1.0/yurli/dummy.py +6 -0
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dependency-maintenance
|
|
3
|
+
description: >-
|
|
4
|
+
Maintains Python and npm dependencies, developer tools, lockfiles, and prek hooks. Use
|
|
5
|
+
when adding, removing, or updating project dependencies, tool versions, or hook
|
|
6
|
+
revisions.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Dependency maintenance
|
|
10
|
+
|
|
11
|
+
Use the repository's declared dependency mechanisms and preserve consistency between
|
|
12
|
+
metadata, lockfiles, CI, and hooks.
|
|
13
|
+
|
|
14
|
+
- Manage Python dependencies with `uv` and declarations in `pyproject.toml`. Use
|
|
15
|
+
`uv add`, `uv remove`, or an intentional metadata edit followed by `uv lock`; commit
|
|
16
|
+
the resulting `uv.lock` changes.
|
|
17
|
+
- Manage npm dependencies through npm commands and `package.json`. Regenerate and commit
|
|
18
|
+
`package-lock.json`; use `npm ci` to install the locked set.
|
|
19
|
+
- When changing hook revisions in `prek.toml` or relevant Python tool versions, run the
|
|
20
|
+
configured `sync-with-uv` hook (`uv run prek run sync-with-uv`) and review any
|
|
21
|
+
resulting lockfile updates.
|
|
22
|
+
- Check that versions agree across CI workflow setup, dependency declarations,
|
|
23
|
+
`uv.lock`, `package-lock.json`, and `prek.toml` where applicable. Prefer the existing
|
|
24
|
+
dependency-management mechanisms over duplicating version information.
|
|
25
|
+
- Run relevant checks after changes. See `CONTRIBUTING.md` for `uv sync --locked`,
|
|
26
|
+
tests, `tools/linters.sh`, `tools/formatters.sh`, and `uv run prek run --all-files`.
|
|
27
|
+
|
|
28
|
+
Do not add dependencies or weaken checks unless the requested change requires it.
|
|
29
|
+
Document workflow changes in `CONTRIBUTING.md` or `README.md` as appropriate.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release
|
|
3
|
+
description: >-
|
|
4
|
+
Prepares and validates releases for this Python package template. Use when planning,
|
|
5
|
+
validating, or publishing a release, including version tags, distributions, GitHub
|
|
6
|
+
Releases, or PyPI trusted publishing.
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Release preparation and validation
|
|
10
|
+
|
|
11
|
+
This template derives package versions from Git history and tags through hatch-vcs.
|
|
12
|
+
Review the release workflow in `.github/workflows/publish.yml` and current packaging
|
|
13
|
+
configuration before preparing a release.
|
|
14
|
+
|
|
15
|
+
- Confirm the intended source commit and release version. Create a valid version tag
|
|
16
|
+
(optionally prefixed with `v`) only when explicitly authorized; the built package
|
|
17
|
+
version must match the tag after removing that prefix.
|
|
18
|
+
- Run the relevant tests and coverage checks documented in `CONTRIBUTING.md`, then build
|
|
19
|
+
distributions with `uv build`.
|
|
20
|
+
- Validate the distributions and confirm the version in package metadata matches the
|
|
21
|
+
intended tag. Follow the existing validation in `.github/workflows/publish.yml`.
|
|
22
|
+
- If the project publishes to PyPI, confirm its trusted publisher and `pypi` GitHub
|
|
23
|
+
environment are configured for the repository and workflow. This template may be
|
|
24
|
+
adapted for projects that do not publish to PyPI; skip PyPI steps for those projects.
|
|
25
|
+
- GitHub Release creation, tag creation, package upload, and other publishing are
|
|
26
|
+
external actions. Never create tags, publish releases, or upload packages without
|
|
27
|
+
explicit user authorization.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Template update history
|
|
2
|
+
|
|
3
|
+
Template-Source: `xozoid/python-template`
|
|
4
|
+
|
|
5
|
+
Template-Revision: `c9a5cf91408da939219746d426f7ad92fc49ec5f`
|
|
6
|
+
|
|
7
|
+
The revision is the full upstream template commit last fully applied to this project. It
|
|
8
|
+
is not a commit from the target repository. Adoption sets the initial revision to the
|
|
9
|
+
upstream commit used to create the project. During later updates, change this file only
|
|
10
|
+
after the applicable migration succeeds and validation passes.
|
|
11
|
+
|
|
12
|
+
## Skipped template changes
|
|
13
|
+
|
|
14
|
+
Record each intentional skip with the target template revision where it was first
|
|
15
|
+
skipped, affected path or behavior, a short description, and the reason. At each later
|
|
16
|
+
update, check whether changes touch or depend on a recorded skip. Review template
|
|
17
|
+
evolution from that skip revision through the new target revision; determine whether
|
|
18
|
+
later changes build on, replace, or invalidate the skipped change, and reconsider the
|
|
19
|
+
local adaptation accordingly. Do not treat a skip as permanent. After a successful
|
|
20
|
+
migration, update the entry with its current disposition or remove it if it is resolved
|
|
21
|
+
or no longer relevant.
|
|
22
|
+
|
|
23
|
+
- None recorded.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: update-from-template
|
|
3
|
+
description: >-
|
|
4
|
+
Updates a project adopted from xozoid/python-template while preserving
|
|
5
|
+
project-specific code, configuration, and intentional deviations.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Update from template
|
|
9
|
+
|
|
10
|
+
Read `.agents/skills/update-from-template/HISTORY.md` for the template source, last
|
|
11
|
+
applied revision, and persistent list of intentionally skipped changes. Keep that file
|
|
12
|
+
as the only template tracking record. Do not edit this `SKILL.md` during an update.
|
|
13
|
+
|
|
14
|
+
## Update workflow
|
|
15
|
+
|
|
16
|
+
1. Read the source and last applied full commit SHA from `HISTORY.md`. Resolve the
|
|
17
|
+
template repository's default branch and its current full commit SHA. Fetch the
|
|
18
|
+
upstream template and verify that the recorded revision exists there.
|
|
19
|
+
2. Compare the recorded revision with the current default-branch revision. If they are
|
|
20
|
+
identical, report that no update is needed and leave `HISTORY.md` unchanged. If the
|
|
21
|
+
target revision does not descend from the recorded revision, report divergence and
|
|
22
|
+
stop before applying changes.
|
|
23
|
+
3. Review the template changes between the recorded and target revisions. Compare the
|
|
24
|
+
affected files with the project, then apply relevant changes in context. Preserve
|
|
25
|
+
project-specific code, metadata, dependencies, configuration, CI customizations, and
|
|
26
|
+
intentional deviations. Never overwrite uncommitted changes or discard local edits.
|
|
27
|
+
4. For intentionally skipped changes, record the affected paths, the template revision
|
|
28
|
+
where each change was first skipped, a short description, and the reason in
|
|
29
|
+
`HISTORY.md`. During every later update, check whether new changes touch the same
|
|
30
|
+
paths or behavior, or depend on a skipped change. Review the template evolution from
|
|
31
|
+
the recorded skip revision through the new target revision to see whether later work
|
|
32
|
+
builds on, replaces, or invalidates the skip. Reconsider the local adaptation when
|
|
33
|
+
needed; do not treat a skip as a permanent instruction to ignore that area. Update
|
|
34
|
+
the history entry with the result after a successful migration.
|
|
35
|
+
5. Run relevant tests, linting, formatting, dependency locking, and pre-commit
|
|
36
|
+
synchronization checks. Review generated changes and resolve conflicts with the
|
|
37
|
+
project's conventions.
|
|
38
|
+
6. Only after the applicable migration is complete and checks succeed, update
|
|
39
|
+
`HISTORY.md` with the full target template SHA and any intentional skips. Do not
|
|
40
|
+
automatically commit changes unless the user explicitly requests a commit.
|
|
41
|
+
|
|
42
|
+
## Finding an initial revision
|
|
43
|
+
|
|
44
|
+
If the revision in `HISTORY.md` is unset or still contains a placeholder, compare the
|
|
45
|
+
project's initial state with the template's history and use file contents and timestamps
|
|
46
|
+
only as supporting evidence. Do not select a revision solely because it looks like the
|
|
47
|
+
closest match. If the origin cannot be identified confidently, describe the candidate
|
|
48
|
+
revisions and ask the user to confirm before updating.
|
|
49
|
+
|
|
50
|
+
## Report
|
|
51
|
+
|
|
52
|
+
Report the target template revision, applied changes, skipped changes and reasons,
|
|
53
|
+
conflicts, and validation results. State clearly when no update was needed or when
|
|
54
|
+
divergence or an ambiguous starting revision prevented an update. If a commit is
|
|
55
|
+
requested, use a clear summary. Update `HISTORY.md` only when a template migration has
|
|
56
|
+
completed successfully; leave it unchanged for a no-op, failed, or incomplete update.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: npm
|
|
4
|
+
directory: /
|
|
5
|
+
schedule:
|
|
6
|
+
interval: weekly
|
|
7
|
+
- package-ecosystem: github-actions
|
|
8
|
+
directory: /
|
|
9
|
+
schedule:
|
|
10
|
+
interval: weekly
|
|
11
|
+
- package-ecosystem: uv
|
|
12
|
+
directory: /
|
|
13
|
+
schedule:
|
|
14
|
+
interval: weekly
|
|
15
|
+
versioning-strategy: increase
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"bypass_actors": [],
|
|
3
|
+
"conditions": {
|
|
4
|
+
"ref_name": {
|
|
5
|
+
"exclude": [],
|
|
6
|
+
"include": ["refs/heads/main"]
|
|
7
|
+
}
|
|
8
|
+
},
|
|
9
|
+
"enforcement": "active",
|
|
10
|
+
"name": "Main - squash merges only",
|
|
11
|
+
"rules": [
|
|
12
|
+
{
|
|
13
|
+
"type": "deletion"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"type": "non_fast_forward"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"parameters": {
|
|
20
|
+
"allowed_merge_methods": ["squash"],
|
|
21
|
+
"dismiss_stale_reviews_on_push": false,
|
|
22
|
+
"require_extra_approval_for_unattributed_changes": true,
|
|
23
|
+
"require_last_push_approval": false,
|
|
24
|
+
"required_approving_review_count": 0,
|
|
25
|
+
"required_review_thread_resolution": true,
|
|
26
|
+
"required_reviewers": []
|
|
27
|
+
},
|
|
28
|
+
"type": "pull_request"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"target": "branch"
|
|
32
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
on:
|
|
3
|
+
workflow_call:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
jobs:
|
|
12
|
+
pytest:
|
|
13
|
+
runs-on: ubuntu-latest
|
|
14
|
+
strategy:
|
|
15
|
+
fail-fast: false
|
|
16
|
+
matrix:
|
|
17
|
+
python-version: ["3.12", "3.13", "3.14", "3.15"]
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v7
|
|
20
|
+
- uses: astral-sh/setup-uv@v7
|
|
21
|
+
with:
|
|
22
|
+
python-version: ${{ matrix.python-version }}
|
|
23
|
+
enable-cache: true
|
|
24
|
+
- run: uv sync --locked --no-default-groups --group test
|
|
25
|
+
- run: uv run --no-sync pytest
|
|
26
|
+
minimum-runtime-dependencies:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v7
|
|
30
|
+
- uses: astral-sh/setup-uv@v7
|
|
31
|
+
with:
|
|
32
|
+
python-version: "3.12"
|
|
33
|
+
enable-cache: true
|
|
34
|
+
- name: Resolve minimum runtime dependencies
|
|
35
|
+
run: |
|
|
36
|
+
uv venv --python 3.12 .venv-minimum
|
|
37
|
+
uv pip install --python .venv-minimum/bin/python --resolution lowest-direct .
|
|
38
|
+
uv pip freeze --python .venv-minimum/bin/python > /tmp/minimum-constraints.txt
|
|
39
|
+
- name: Install locked pytest
|
|
40
|
+
run: |
|
|
41
|
+
PYTEST_VERSION=$(python -c "
|
|
42
|
+
import tomllib
|
|
43
|
+
with open('uv.lock', 'rb') as f:
|
|
44
|
+
lock = tomllib.load(f)
|
|
45
|
+
print(next(p['version'] for p in lock['package'] if p['name'] == 'pytest'))
|
|
46
|
+
")
|
|
47
|
+
uv pip install --python .venv-minimum/bin/python --constraint /tmp/minimum-constraints.txt "pytest==$PYTEST_VERSION"
|
|
48
|
+
- name: Verify minimum dependencies were preserved
|
|
49
|
+
run: |
|
|
50
|
+
uv pip freeze --python .venv-minimum/bin/python > /tmp/after.txt
|
|
51
|
+
grep -Fxf /tmp/minimum-constraints.txt /tmp/after.txt | diff - /tmp/minimum-constraints.txt
|
|
52
|
+
- name: Run tests
|
|
53
|
+
run: .venv-minimum/bin/python -m pytest
|
|
54
|
+
ruff:
|
|
55
|
+
runs-on: ubuntu-latest
|
|
56
|
+
steps:
|
|
57
|
+
- uses: actions/checkout@v7
|
|
58
|
+
- uses: astral-sh/setup-uv@v7
|
|
59
|
+
with:
|
|
60
|
+
python-version: "3.15"
|
|
61
|
+
enable-cache: true
|
|
62
|
+
- run: uv sync --locked --no-default-groups --group lint
|
|
63
|
+
- run: uv run --no-sync ruff check .
|
|
64
|
+
types:
|
|
65
|
+
runs-on: ubuntu-latest
|
|
66
|
+
steps:
|
|
67
|
+
- uses: actions/checkout@v7
|
|
68
|
+
- uses: astral-sh/setup-uv@v7
|
|
69
|
+
with:
|
|
70
|
+
python-version: "3.15"
|
|
71
|
+
enable-cache: true
|
|
72
|
+
- run: uv sync --locked --no-default-groups --group types
|
|
73
|
+
- run: uv run --no-sync basedpyright
|
|
74
|
+
formatting:
|
|
75
|
+
runs-on: ubuntu-latest
|
|
76
|
+
steps:
|
|
77
|
+
- uses: actions/checkout@v7
|
|
78
|
+
- uses: astral-sh/setup-uv@v7
|
|
79
|
+
with:
|
|
80
|
+
python-version: "3.15"
|
|
81
|
+
enable-cache: true
|
|
82
|
+
- uses: actions/setup-node@v7
|
|
83
|
+
with:
|
|
84
|
+
node-version: 24
|
|
85
|
+
cache: npm
|
|
86
|
+
- run: uv sync --locked --no-default-groups --group format
|
|
87
|
+
- run: npm ci
|
|
88
|
+
- run: uv run --no-sync ruff format --check .
|
|
89
|
+
- run: npm exec --no -- prettier --check .
|
|
90
|
+
- run: uv run --no-sync taplo fmt --check '*.toml'
|
|
91
|
+
- run: uv run --no-sync prek run yamlfmt --all-files
|
|
92
|
+
sync-with-uv:
|
|
93
|
+
runs-on: ubuntu-latest
|
|
94
|
+
steps:
|
|
95
|
+
- uses: actions/checkout@v7
|
|
96
|
+
- uses: astral-sh/setup-uv@v7
|
|
97
|
+
- run: uv sync --locked --no-default-groups --only-group prek --no-install-project
|
|
98
|
+
- run: uv run --no-sync prek run --all-files sync-with-uv
|
|
99
|
+
- run: git diff --exit-code
|
|
100
|
+
spelling:
|
|
101
|
+
runs-on: ubuntu-latest
|
|
102
|
+
steps:
|
|
103
|
+
- uses: actions/checkout@v7
|
|
104
|
+
- uses: astral-sh/setup-uv@v7
|
|
105
|
+
with:
|
|
106
|
+
python-version: "3.15"
|
|
107
|
+
enable-cache: true
|
|
108
|
+
- run: uv sync --locked --no-default-groups --group spell
|
|
109
|
+
- run: uv run --no-sync codespell --skip=node_modules .
|
|
110
|
+
coverage:
|
|
111
|
+
runs-on: ubuntu-latest
|
|
112
|
+
steps:
|
|
113
|
+
- uses: actions/checkout@v7
|
|
114
|
+
- uses: astral-sh/setup-uv@v7
|
|
115
|
+
with:
|
|
116
|
+
python-version: "3.15"
|
|
117
|
+
enable-cache: true
|
|
118
|
+
- run: uv sync --locked --no-default-groups --group coverage
|
|
119
|
+
- run: uv run --no-sync coverage run -m pytest
|
|
120
|
+
- run: uv run --no-sync coverage report
|
|
121
|
+
- uses: actions/upload-artifact@v7
|
|
122
|
+
if: always()
|
|
123
|
+
with:
|
|
124
|
+
name: coverage-data
|
|
125
|
+
path: .coverage
|
|
126
|
+
build:
|
|
127
|
+
runs-on: ubuntu-latest
|
|
128
|
+
steps:
|
|
129
|
+
- uses: actions/checkout@v7
|
|
130
|
+
- uses: astral-sh/setup-uv@v7
|
|
131
|
+
with:
|
|
132
|
+
python-version: "3.15"
|
|
133
|
+
enable-cache: true
|
|
134
|
+
- run: uv build
|
|
135
|
+
- run: uv venv --no-project /tmp/wheel-test
|
|
136
|
+
- run: uv pip install --python /tmp/wheel-test/bin/python dist/*.whl
|
|
137
|
+
- name: Verify installed wheel import
|
|
138
|
+
run: |
|
|
139
|
+
tmpdir=$(mktemp -d)
|
|
140
|
+
cd "$tmpdir"
|
|
141
|
+
/tmp/wheel-test/bin/python -c "import yurli"
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: Docs CI
|
|
2
|
+
on:
|
|
3
|
+
pull_request:
|
|
4
|
+
branches: [main]
|
|
5
|
+
paths:
|
|
6
|
+
- README.md
|
|
7
|
+
- CONTRIBUTING.md
|
|
8
|
+
permissions:
|
|
9
|
+
contents: read
|
|
10
|
+
jobs:
|
|
11
|
+
vale:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v7
|
|
15
|
+
- name: Install Vale
|
|
16
|
+
env:
|
|
17
|
+
GH_TOKEN: ${{ github.token }}
|
|
18
|
+
run: |
|
|
19
|
+
url=$(gh api repos/vale-cli/vale/releases/latest \
|
|
20
|
+
--jq '.assets[] | select(.name | endswith("_Linux_64-bit.tar.gz")) | .browser_download_url')
|
|
21
|
+
curl -fsSL "$url" | sudo tar -xz -C /usr/local/bin vale
|
|
22
|
+
vale --version
|
|
23
|
+
- name: Sync Vale styles
|
|
24
|
+
run: |
|
|
25
|
+
attempt=0
|
|
26
|
+
until vale sync; do
|
|
27
|
+
attempt=$((attempt + 1))
|
|
28
|
+
if [ "$attempt" -ge 5 ]; then
|
|
29
|
+
exit 1
|
|
30
|
+
fi
|
|
31
|
+
sleep "$((attempt * 5))"
|
|
32
|
+
done
|
|
33
|
+
- name: Lint documentation
|
|
34
|
+
run: vale README.md CONTRIBUTING.md
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
on:
|
|
3
|
+
release:
|
|
4
|
+
types: [published]
|
|
5
|
+
permissions:
|
|
6
|
+
contents: read
|
|
7
|
+
jobs:
|
|
8
|
+
validate:
|
|
9
|
+
uses: ./.github/workflows/ci.yml
|
|
10
|
+
publish:
|
|
11
|
+
needs: validate
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
environment:
|
|
14
|
+
name: pypi
|
|
15
|
+
url: https://pypi.org/p/yurli
|
|
16
|
+
permissions:
|
|
17
|
+
id-token: write
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v7
|
|
20
|
+
with:
|
|
21
|
+
fetch-depth: 0
|
|
22
|
+
- uses: astral-sh/setup-uv@v7
|
|
23
|
+
with:
|
|
24
|
+
python-version: "3.15"
|
|
25
|
+
- run: uv build
|
|
26
|
+
- name: Verify release tag matches package version
|
|
27
|
+
env:
|
|
28
|
+
RELEASE_TAG: ${{ github.event.release.tag_name }}
|
|
29
|
+
run: |
|
|
30
|
+
python - <<'PY'
|
|
31
|
+
from email import message_from_bytes
|
|
32
|
+
from os import environ
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
from zipfile import ZipFile
|
|
35
|
+
|
|
36
|
+
wheel = next(Path("dist").glob("*.whl"))
|
|
37
|
+
with ZipFile(wheel) as archive:
|
|
38
|
+
metadata_path = next(path for path in archive.namelist() if path.endswith(".dist-info/METADATA"))
|
|
39
|
+
version = message_from_bytes(archive.read(metadata_path))["Version"]
|
|
40
|
+
tag = environ["RELEASE_TAG"]
|
|
41
|
+
if tag.removeprefix("v") != version:
|
|
42
|
+
raise SystemExit(f"Release tag {tag!r} does not match package version {version!r}")
|
|
43
|
+
PY
|
|
44
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
yurli-0.1.0/.gitignore
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Local environments and secrets
|
|
2
|
+
.venv/
|
|
3
|
+
.env*
|
|
4
|
+
|
|
5
|
+
# Python bytecode and caches
|
|
6
|
+
__pycache__/
|
|
7
|
+
*.py[cod]
|
|
8
|
+
.pytest_cache/
|
|
9
|
+
.ruff_cache/
|
|
10
|
+
.basedpyright/
|
|
11
|
+
|
|
12
|
+
# Vale's downloaded style packages and scratch data
|
|
13
|
+
.vale/styles/*
|
|
14
|
+
!.vale/styles/config
|
|
15
|
+
|
|
16
|
+
# Coverage output
|
|
17
|
+
.coverage
|
|
18
|
+
.coverage.*
|
|
19
|
+
coverage.xml
|
|
20
|
+
coverage.json
|
|
21
|
+
htmlcov/
|
|
22
|
+
|
|
23
|
+
# JavaScript dependencies
|
|
24
|
+
node_modules/
|
|
25
|
+
|
|
26
|
+
# Build and packaging output
|
|
27
|
+
dist/
|
|
28
|
+
build/
|
|
29
|
+
*.egg-info/
|
yurli-0.1.0/.prettierrc
ADDED
yurli-0.1.0/.vale.ini
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
StylesPath = .vale/styles
|
|
2
|
+
MinAlertLevel = error
|
|
3
|
+
Packages = Microsoft, proselint, write-good
|
|
4
|
+
Vocab = LocalProject
|
|
5
|
+
|
|
6
|
+
[*.{md,rst,adoc,txt}]
|
|
7
|
+
BasedOnStyles = Vale, Microsoft, proselint, write-good
|
|
8
|
+
|
|
9
|
+
# Agent instructions are operational text for coding agents, not user-facing prose.
|
|
10
|
+
[AGENTS.md]
|
|
11
|
+
BasedOnStyles = NONE
|
|
12
|
+
|
|
13
|
+
[.agents/skills/**]
|
|
14
|
+
BasedOnStyles = NONE
|
yurli-0.1.0/AGENTS.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Agent instructions
|
|
2
|
+
|
|
3
|
+
## Project structure
|
|
4
|
+
|
|
5
|
+
This repository is a Python package named `yurli`. The import package lives in `yurli/`,
|
|
6
|
+
tests live in `tests/`, project and tool configuration lives in `pyproject.toml`, and
|
|
7
|
+
GitHub Actions workflows live in `.github/workflows/`. Keep the established architecture
|
|
8
|
+
unless a change is explicitly requested. Prefer focused changes and avoid unnecessary
|
|
9
|
+
dependencies or abstractions.
|
|
10
|
+
|
|
11
|
+
## Tooling
|
|
12
|
+
|
|
13
|
+
- Use `uv` for Python dependencies and environments. `pyproject.toml` declares Hatchling
|
|
14
|
+
and `hatch-vcs`; package versions come from Git tags.
|
|
15
|
+
- Ruff handles Python linting, formatting, and import sorting. Its configuration is in
|
|
16
|
+
`pyproject.toml`.
|
|
17
|
+
- `basedpyright` runs in strict mode, configured in `pyproject.toml`.
|
|
18
|
+
- Tests use pytest. Coverage runs with branch measurement and enforces the configured
|
|
19
|
+
minimum in `pyproject.toml`.
|
|
20
|
+
- `tools/linters.sh`, `tools/formatters.sh`, and `tools/env.sh` provide the documented
|
|
21
|
+
local workflows. `prek.toml` defines hooks, including Ruff, basedpyright,
|
|
22
|
+
`sync-with-uv`, Vale, and Prettier.
|
|
23
|
+
- Vale is intentionally disabled for agent-facing instruction files through `.vale.ini`;
|
|
24
|
+
keep other writing checks active.
|
|
25
|
+
|
|
26
|
+
## Changes and checks
|
|
27
|
+
|
|
28
|
+
When modifying code, add or update focused tests for the changed behavior. Run relevant
|
|
29
|
+
checks after modifications, using the commands in `CONTRIBUTING.md` and the applicable
|
|
30
|
+
CI jobs in `.github/workflows/ci.yml`. Update documentation when workflows or
|
|
31
|
+
contributor instructions change. Never silently weaken linting, type checking, or
|
|
32
|
+
coverage requirements.
|
|
33
|
+
|
|
34
|
+
In your report, state which checks you actually ran, their results, any failures, and
|
|
35
|
+
any checks you could not run.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
## Environment and dependencies
|
|
4
|
+
|
|
5
|
+
Install Git, Python 3.12 or later, `uv`, Node.js 24 or later with npm, and Vale. Run
|
|
6
|
+
`tools/env.sh` from any directory in the repository to sync the locked Python
|
|
7
|
+
dependencies, install `prek` Git hooks, fetch Vale styles, run `npm ci`, and create
|
|
8
|
+
`.env` and `.env.leave` if they aren't present. The script installs Vale when needed
|
|
9
|
+
through a supported package manager. Use `tools/env.sh --upgrade` to upgrade Python
|
|
10
|
+
dependencies before setup.
|
|
11
|
+
|
|
12
|
+
Add Python development dependencies to the appropriate group in `pyproject.toml`
|
|
13
|
+
(`lint`, `spell`, `test`, `coverage`, `types`, `format`, `prek`, or the aggregate `dev`
|
|
14
|
+
group). Pin each development dependency to the exact version resolved in `uv.lock`, then
|
|
15
|
+
update and commit `uv.lock`:
|
|
16
|
+
|
|
17
|
+
```sh
|
|
18
|
+
uv add --dev package-name
|
|
19
|
+
uv lock
|
|
20
|
+
uv lock --check
|
|
21
|
+
uv sync --locked --all-groups
|
|
22
|
+
uv run --no-sync prek run --all-files sync-with-uv
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Use `uv add --group <group> package-name` for another dependency group, or edit the
|
|
26
|
+
project metadata and run `uv lock` when needed. Set the exact pin to the version
|
|
27
|
+
selected by the lockfile. Leave runtime dependencies in `[project.dependencies]`
|
|
28
|
+
unpinned. The `dev` group includes all groups for the complete local environment. The
|
|
29
|
+
`format` group includes `prek` for its `yamlfmt` hook; CI selects only the groups each
|
|
30
|
+
independent job needs. Update npm development dependencies with
|
|
31
|
+
`npm install --save-dev package-name` and commit both `package.json` and
|
|
32
|
+
`package-lock.json`. Dependabot also checks uv, npm, and GitHub Actions dependencies
|
|
33
|
+
weekly.
|
|
34
|
+
|
|
35
|
+
## Tests and checks
|
|
36
|
+
|
|
37
|
+
Run tests and coverage from the repository root:
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
uv run pytest
|
|
41
|
+
uv run coverage run -m pytest
|
|
42
|
+
uv run coverage report
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
The coverage report enforces the configured 85% minimum. `tools/linters.sh` runs Ruff,
|
|
46
|
+
`basedpyright`, `codespell`, and Vale (errors only). `tools/formatters.sh` runs Ruff
|
|
47
|
+
format, Prettier, `Taplo`, and `yamlfmt`. These scripts apply formatting changes; review
|
|
48
|
+
the resulting diff.
|
|
49
|
+
|
|
50
|
+
`uv run prek run --all-files` runs the configured hooks against all files. The hooks
|
|
51
|
+
include Ruff lint and format, `codespell`, `Taplo`, `basedpyright`, `yamlfmt`, standard
|
|
52
|
+
file checks, Vale, and Prettier. `tools/env.sh` installs the Git hooks so `prek` runs on
|
|
53
|
+
commits. The `sync-with-uv` hook keeps hook revisions aligned with Python packages in
|
|
54
|
+
`uv.lock`; run it after changing hook revisions or relevant dependencies, then review
|
|
55
|
+
and commit the lockfile changes.
|
|
56
|
+
|
|
57
|
+
Dependabot's weekly uv updates cover exact-pinned development dependencies. Its
|
|
58
|
+
`increase` versioning strategy advances the manifest constraint, while the uv updater
|
|
59
|
+
resolves and records the update in `uv.lock`. CI runs `sync-with-uv` on every pull
|
|
60
|
+
request, including Dependabot pull requests. It installs the `prek` group, runs the
|
|
61
|
+
hook, and fails if the hook would modify tracked files. If an update changes a tool
|
|
62
|
+
revision represented in `prek.toml`, run `uv run prek run --all-files sync-with-uv` and
|
|
63
|
+
commit the generated change with the lockfile update. Dependabot doesn't provide an
|
|
64
|
+
arbitrary post-update script in `dependabot.yml`; its
|
|
65
|
+
[options reference](https://docs.github.com/en/code-security/reference/supply-chain-security/dependabot-options-reference)
|
|
66
|
+
documents the supported update behavior.
|
|
67
|
+
|
|
68
|
+
## Agent instructions and skills
|
|
69
|
+
|
|
70
|
+
Persistent repository guidance lives in the root `AGENTS.md`. Focused, task-specific
|
|
71
|
+
Agent Skills live under `.agents/skills/`; each skill has a `SKILL.md` with metadata
|
|
72
|
+
that helps compatible agents discover when to use it. `AGENTS.md` describes project-wide
|
|
73
|
+
expectations, while skills provide checklists for particular tasks. Contributors can
|
|
74
|
+
extend or maintain skills by adding a narrowly scoped directory and a valid `SKILL.md`,
|
|
75
|
+
then updating its instructions when project workflows change. See the
|
|
76
|
+
[Agent Skills specification](https://agentskills.io/specification) for the format.
|
|
77
|
+
|
|
78
|
+
Projects created from this template should set the `Template-Revision` field in
|
|
79
|
+
`.agents/skills/update-from-template/HISTORY.md` to the full upstream commit SHA used at
|
|
80
|
+
adoption. For later updates, compare and migrate template changes while preserving local
|
|
81
|
+
customizations, run the relevant checks above, and update that history file only after
|
|
82
|
+
the migration succeeds. It also keeps the persistent record of intentionally skipped
|
|
83
|
+
changes; the skill instructions remain unchanged.
|
|
84
|
+
|
|
85
|
+
## Pull requests and CI
|
|
86
|
+
|
|
87
|
+
Open a pull request against `main`. CI keeps checks in separate jobs: pytest on Python
|
|
88
|
+
3.12 through 3.15, pytest against the lowest compatible runtime dependencies on Python
|
|
89
|
+
3.12, Ruff, `basedpyright`, formatting (Ruff, Prettier, `Taplo`, `yamlfmt`), spelling,
|
|
90
|
+
Vale, coverage, and build/import validation. Run the relevant local commands and ensure
|
|
91
|
+
CI passes. Update tests and documentation when behavior or contributor instructions
|
|
92
|
+
change.
|
|
93
|
+
|
|
94
|
+
## Releases
|
|
95
|
+
|
|
96
|
+
`hatch-vcs` reads the package version from Git tags. Create and publish a GitHub Release
|
|
97
|
+
with a version tag such as `1.2.3` or `v1.2.3`; the optional `v` is removed for
|
|
98
|
+
comparison with the package version. The published-release event starts
|
|
99
|
+
`.github/workflows/publish.yml`. It runs CI first, builds the distribution, verifies
|
|
100
|
+
that the release tag matches the built version, then publishes to PyPI through trusted
|
|
101
|
+
publishing.
|
|
102
|
+
|
|
103
|
+
Before releasing, ensure the tag resolves to the intended source commit, the matching
|
|
104
|
+
PyPI project exists, and trusted publishing is configured for this repository's `pypi`
|
|
105
|
+
GitHub environment. A tag that doesn't match the package version fails validation and
|
|
106
|
+
isn't published.
|
yurli-0.1.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Project Authors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|