leyline-code 0.8.1__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.
- leyline_code-0.8.1/.github/workflows/publish.yml +56 -0
- leyline_code-0.8.1/.github/workflows/test.yml +61 -0
- leyline_code-0.8.1/.gitignore +9 -0
- leyline_code-0.8.1/LICENSE +674 -0
- leyline_code-0.8.1/PKG-INFO +1325 -0
- leyline_code-0.8.1/README.md +1292 -0
- leyline_code-0.8.1/docs/quick-reference.md +122 -0
- leyline_code-0.8.1/pyproject.toml +49 -0
- leyline_code-0.8.1/skills/leyline-adversarial-review/SKILL.md +121 -0
- leyline_code-0.8.1/skills/leyline-ask/SKILL.md +57 -0
- leyline_code-0.8.1/skills/leyline-change-impact/SKILL.md +79 -0
- leyline_code-0.8.1/skills/leyline-explain-flow/SKILL.md +70 -0
- leyline_code-0.8.1/skills/leyline-explore-module/SKILL.md +55 -0
- leyline_code-0.8.1/skills/leyline-pr-review/SKILL.md +77 -0
- leyline_code-0.8.1/skills/leyline-quick-change/SKILL.md +63 -0
- leyline_code-0.8.1/skills/leyline-spec/SKILL.md +179 -0
- leyline_code-0.8.1/skills/leyline-tour/SKILL.md +46 -0
- leyline_code-0.8.1/src/leyline/__init__.py +3 -0
- leyline_code-0.8.1/src/leyline/adapters/__init__.py +19 -0
- leyline_code-0.8.1/src/leyline/adapters/csharp.py +1026 -0
- leyline_code-0.8.1/src/leyline/adapters/generic.py +844 -0
- leyline_code-0.8.1/src/leyline/adapters/python.py +929 -0
- leyline_code-0.8.1/src/leyline/adapters/typescript.py +1512 -0
- leyline_code-0.8.1/src/leyline/affected.py +509 -0
- leyline_code-0.8.1/src/leyline/agent_skills.py +311 -0
- leyline_code-0.8.1/src/leyline/change.py +500 -0
- leyline_code-0.8.1/src/leyline/channels.py +1782 -0
- leyline_code-0.8.1/src/leyline/cli.py +1029 -0
- leyline_code-0.8.1/src/leyline/cluster.py +149 -0
- leyline_code-0.8.1/src/leyline/context.py +531 -0
- leyline_code-0.8.1/src/leyline/coupling.py +485 -0
- leyline_code-0.8.1/src/leyline/coverage.py +376 -0
- leyline_code-0.8.1/src/leyline/diagrams.py +680 -0
- leyline_code-0.8.1/src/leyline/diff.py +1078 -0
- leyline_code-0.8.1/src/leyline/drift.py +747 -0
- leyline_code-0.8.1/src/leyline/exact.py +410 -0
- leyline_code-0.8.1/src/leyline/explain.py +973 -0
- leyline_code-0.8.1/src/leyline/export.py +673 -0
- leyline_code-0.8.1/src/leyline/fncoupling.py +328 -0
- leyline_code-0.8.1/src/leyline/formats.py +923 -0
- leyline_code-0.8.1/src/leyline/grade.py +207 -0
- leyline_code-0.8.1/src/leyline/incremental.py +931 -0
- leyline_code-0.8.1/src/leyline/indexer.py +3733 -0
- leyline_code-0.8.1/src/leyline/learnings.py +743 -0
- leyline_code-0.8.1/src/leyline/loop.py +584 -0
- leyline_code-0.8.1/src/leyline/model.py +142 -0
- leyline_code-0.8.1/src/leyline/outline.py +1066 -0
- leyline_code-0.8.1/src/leyline/packing.py +86 -0
- leyline_code-0.8.1/src/leyline/patterns.py +478 -0
- leyline_code-0.8.1/src/leyline/pr.py +1249 -0
- leyline_code-0.8.1/src/leyline/props.py +255 -0
- leyline_code-0.8.1/src/leyline/query.py +683 -0
- leyline_code-0.8.1/src/leyline/quick.py +853 -0
- leyline_code-0.8.1/src/leyline/related.py +266 -0
- leyline_code-0.8.1/src/leyline/removal.py +231 -0
- leyline_code-0.8.1/src/leyline/renames.py +231 -0
- leyline_code-0.8.1/src/leyline/rereview.py +375 -0
- leyline_code-0.8.1/src/leyline/roslyn_refs/Program.cs +179 -0
- leyline_code-0.8.1/src/leyline/roslyn_refs/RoslynRefs.csproj +16 -0
- leyline_code-0.8.1/src/leyline/rules.py +171 -0
- leyline_code-0.8.1/src/leyline/schema.sql +178 -0
- leyline_code-0.8.1/src/leyline/scip_pb2.py +97 -0
- leyline_code-0.8.1/src/leyline/server.py +1230 -0
- leyline_code-0.8.1/src/leyline/spec.py +1819 -0
- leyline_code-0.8.1/src/leyline/store.py +560 -0
- leyline_code-0.8.1/src/leyline/tours.py +352 -0
- leyline_code-0.8.1/src/leyline/verdicts.py +390 -0
- leyline_code-0.8.1/src/leyline/viewer/viewer.html +1622 -0
- leyline_code-0.8.1/tests/conftest.py +36 -0
- leyline_code-0.8.1/tests/fixture/App/App.csproj +4 -0
- leyline_code-0.8.1/tests/fixture/App/Checks.cs +28 -0
- leyline_code-0.8.1/tests/fixture/App/Program.cs +14 -0
- leyline_code-0.8.1/tests/fixture/Lib/Bus.cs +10 -0
- leyline_code-0.8.1/tests/fixture/Lib/Lib.csproj +1 -0
- leyline_code-0.8.1/tests/fixture/Lib/Program.cs +1 -0
- leyline_code-0.8.1/tests/fixture/Lib/Shapes.cs +27 -0
- leyline_code-0.8.1/tests/fixture/scripts/launch.py +7 -0
- leyline_code-0.8.1/tests/fixture/scripts/run.py +12 -0
- leyline_code-0.8.1/tests/fixture/scripts/util.py +14 -0
- leyline_code-0.8.1/tests/fixture2/cs/Mod/Boxes.cs +17 -0
- leyline_code-0.8.1/tests/fixture2/cs/Mod/Fluent.cs +32 -0
- leyline_code-0.8.1/tests/fixture2/cs/Mod/Hard.cs +14 -0
- leyline_code-0.8.1/tests/fixture2/cs/Mod/Made.cs +30 -0
- leyline_code-0.8.1/tests/fixture2/cs/Mod/Mod.csproj +1 -0
- leyline_code-0.8.1/tests/fixture2/cs/Mod/Reports.cs +8 -0
- leyline_code-0.8.1/tests/fixture2/cs/Mod/Runner.cs +24 -0
- leyline_code-0.8.1/tests/fixture2/cs/Mod/Shapes.cs +64 -0
- leyline_code-0.8.1/tests/fixture2/cs/Mod/State.cs +44 -0
- leyline_code-0.8.1/tests/fixture2/py/src/pkg/__init__.py +2 -0
- leyline_code-0.8.1/tests/fixture2/py/src/pkg/core.py +39 -0
- leyline_code-0.8.1/tests/fixture2/py/tests/conftest.py +14 -0
- leyline_code-0.8.1/tests/fixture2/py/tests/test_engine.py +26 -0
- leyline_code-0.8.1/tests/fixture2/py/web/app.py +20 -0
- leyline_code-0.8.1/tests/fixture2/py/web/client.py +6 -0
- leyline_code-0.8.1/tests/fixture3/package.json +1 -0
- leyline_code-0.8.1/tests/fixture3/pkg/app/package.json +1 -0
- leyline_code-0.8.1/tests/fixture3/pkg/app/src/main.test.ts +14 -0
- leyline_code-0.8.1/tests/fixture3/pkg/app/src/main.tsx +40 -0
- leyline_code-0.8.1/tests/fixture3/pkg/app/src/server.ts +7 -0
- leyline_code-0.8.1/tests/fixture3/pkg/core/package.json +1 -0
- leyline_code-0.8.1/tests/fixture3/pkg/core/src/graph.ts +41 -0
- leyline_code-0.8.1/tests/fixture3/pkg/core/src/ids.ts +15 -0
- leyline_code-0.8.1/tests/fixture3/pkg/core/src/index.ts +13 -0
- leyline_code-0.8.1/tests/fixture4/go/go.mod +2 -0
- leyline_code-0.8.1/tests/fixture4/go/main.go +23 -0
- leyline_code-0.8.1/tests/fixture4/go/main_test.go +9 -0
- leyline_code-0.8.1/tests/fixture4/go/shapes/shape.go +12 -0
- leyline_code-0.8.1/tests/fixture4/java/com/acme/App.java +23 -0
- leyline_code-0.8.1/tests/fixture4/java/com/acme/Counter.java +21 -0
- leyline_code-0.8.1/tests/fixture4/rs/Cargo.toml +3 -0
- leyline_code-0.8.1/tests/fixture4/rs/src/geo.rs +37 -0
- leyline_code-0.8.1/tests/fixture4/rs/src/main.rs +20 -0
- leyline_code-0.8.1/tests/fixture5/py/app.py +10 -0
- leyline_code-0.8.1/tests/fixture5/py/audit.py +10 -0
- leyline_code-0.8.1/tests/fixture5/py/client.py +9 -0
- leyline_code-0.8.1/tests/fixture5/py/consumer.py +19 -0
- leyline_code-0.8.1/tests/fixture5/py/container.py +21 -0
- leyline_code-0.8.1/tests/fixture5/py/db.py +15 -0
- leyline_code-0.8.1/tests/fixture5/py/migrations/0001_audit.py +2 -0
- leyline_code-0.8.1/tests/fixture5/py/models.py +25 -0
- leyline_code-0.8.1/tests/fixture5/py/tasks.py +8 -0
- leyline_code-0.8.1/tests/fixture5/py/tests/test_models.py +6 -0
- leyline_code-0.8.1/tests/fixture5/rpc/py/client.py +8 -0
- leyline_code-0.8.1/tests/fixture5/rpc/py/server.py +6 -0
- leyline_code-0.8.1/tests/fixture5/shop/Billing.cs +79 -0
- leyline_code-0.8.1/tests/fixture5/shop/OrderService.cs +49 -0
- leyline_code-0.8.1/tests/fixture5/shop/Program.cs +25 -0
- leyline_code-0.8.1/tests/fixture5/shop/Shop.csproj +6 -0
- leyline_code-0.8.1/tests/fixture5/shop/Store.cs +45 -0
- leyline_code-0.8.1/tests/fixture5/ts/events.ts +17 -0
- leyline_code-0.8.1/tests/fixture5/ts/nest.ts +28 -0
- leyline_code-0.8.1/tests/fixture5/ts/repo.ts +7 -0
- leyline_code-0.8.1/tests/fixture5/ts/subs.ts +11 -0
- leyline_code-0.8.1/tests/fixture6/tests/test_web.py +34 -0
- leyline_code-0.8.1/tests/fixture6/web/__init__.py +2 -0
- leyline_code-0.8.1/tests/fixture6/web/app.py +133 -0
- leyline_code-0.8.1/tests/fixture6/web/config.py +3 -0
- leyline_code-0.8.1/tests/fixture6/web/globals.py +3 -0
- leyline_code-0.8.1/tests/fixture_props/fastcheck_vitest_tap.txt +45 -0
- leyline_code-0.8.1/tests/fixture_props/fscheck_dotnet_test.txt +34 -0
- leyline_code-0.8.1/tests/fixture_props/hypothesis_6.100.txt +89 -0
- leyline_code-0.8.1/tests/fixture_props/hypothesis_6.168.txt +89 -0
- leyline_code-0.8.1/tests/fixture_ws/wsapp/pyproject.toml +4 -0
- leyline_code-0.8.1/tests/fixture_ws/wsapp/src/apppkg/__init__.py +0 -0
- leyline_code-0.8.1/tests/fixture_ws/wsapp/src/apppkg/main.py +24 -0
- leyline_code-0.8.1/tests/fixture_ws/wsapp/tests/test_main.py +5 -0
- leyline_code-0.8.1/tests/fixture_ws/wslib/pyproject.toml +3 -0
- leyline_code-0.8.1/tests/fixture_ws/wslib/src/libpkg/__init__.py +1 -0
- leyline_code-0.8.1/tests/fixture_ws/wslib/src/libpkg/core.py +22 -0
- leyline_code-0.8.1/tests/store_identity.py +26 -0
- leyline_code-0.8.1/tests/test_adapters.py +982 -0
- leyline_code-0.8.1/tests/test_before.py +180 -0
- leyline_code-0.8.1/tests/test_channels.py +199 -0
- leyline_code-0.8.1/tests/test_context.py +172 -0
- leyline_code-0.8.1/tests/test_coupling.py +187 -0
- leyline_code-0.8.1/tests/test_diagrams.py +244 -0
- leyline_code-0.8.1/tests/test_drift.py +223 -0
- leyline_code-0.8.1/tests/test_fixes.py +465 -0
- leyline_code-0.8.1/tests/test_flows_explain.py +314 -0
- leyline_code-0.8.1/tests/test_fncoupling.py +176 -0
- leyline_code-0.8.1/tests/test_formats.py +402 -0
- leyline_code-0.8.1/tests/test_handlers.py +184 -0
- leyline_code-0.8.1/tests/test_incremental.py +388 -0
- leyline_code-0.8.1/tests/test_index.py +1411 -0
- leyline_code-0.8.1/tests/test_learnings.py +379 -0
- leyline_code-0.8.1/tests/test_learnings_synonyms.py +92 -0
- leyline_code-0.8.1/tests/test_learnings_workspace.py +49 -0
- leyline_code-0.8.1/tests/test_memory.py +68 -0
- leyline_code-0.8.1/tests/test_outline.py +271 -0
- leyline_code-0.8.1/tests/test_pr.py +529 -0
- leyline_code-0.8.1/tests/test_props.py +342 -0
- leyline_code-0.8.1/tests/test_quick.py +261 -0
- leyline_code-0.8.1/tests/test_rereview.py +136 -0
- leyline_code-0.8.1/tests/test_resolve.py +379 -0
- leyline_code-0.8.1/tests/test_robust.py +413 -0
- leyline_code-0.8.1/tests/test_scenario_coverage.py +402 -0
- leyline_code-0.8.1/tests/test_security.py +558 -0
- leyline_code-0.8.1/tests/test_server.py +587 -0
- leyline_code-0.8.1/tests/test_shapes.py +478 -0
- leyline_code-0.8.1/tests/test_signalfix.py +341 -0
- leyline_code-0.8.1/tests/test_skills.py +180 -0
- leyline_code-0.8.1/tests/test_state.py +406 -0
- leyline_code-0.8.1/tests/test_surface.py +149 -0
- leyline_code-0.8.1/tests/test_trust.py +640 -0
- leyline_code-0.8.1/tests/test_verdicts.py +465 -0
- leyline_code-0.8.1/tests/test_viewer.py +201 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# Publish to PyPI when a version tag (v0.3.0) is pushed.
|
|
2
|
+
# No token is stored anywhere: PyPI trusts this workflow in Orbitope/leyline through trusted publishing,
|
|
3
|
+
# and the `pypi` environment makes the last step wait for a person to approve it in GitHub.
|
|
4
|
+
name: publish
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
tags: ["v*"]
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
contents: read
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
test:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v4
|
|
18
|
+
- uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.12"
|
|
21
|
+
# The generic-adapter tests need the extra grammars, as in test.yml. Ubuntu has a wheel for each of them.
|
|
22
|
+
- run: pip install -e ".[scip,languages]" pytest
|
|
23
|
+
- run: python -m pytest -q
|
|
24
|
+
|
|
25
|
+
build:
|
|
26
|
+
needs: test
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@v4
|
|
30
|
+
- uses: actions/setup-python@v5
|
|
31
|
+
with:
|
|
32
|
+
python-version: "3.12"
|
|
33
|
+
- name: The tag must match the version in pyproject.toml
|
|
34
|
+
run: |
|
|
35
|
+
version=$(python -c "import tomllib; print(tomllib.load(open('pyproject.toml','rb'))['project']['version'])")
|
|
36
|
+
test "v$version" = "$GITHUB_REF_NAME" || { echo "tag $GITHUB_REF_NAME does not match version $version"; exit 1; }
|
|
37
|
+
- run: pip install build twine
|
|
38
|
+
- run: python -m build
|
|
39
|
+
- run: twine check dist/*
|
|
40
|
+
- uses: actions/upload-artifact@v4
|
|
41
|
+
with:
|
|
42
|
+
name: dist
|
|
43
|
+
path: dist/
|
|
44
|
+
|
|
45
|
+
publish:
|
|
46
|
+
needs: build
|
|
47
|
+
runs-on: ubuntu-latest
|
|
48
|
+
environment: pypi
|
|
49
|
+
permissions:
|
|
50
|
+
id-token: write # what trusted publishing uses instead of a password
|
|
51
|
+
steps:
|
|
52
|
+
- uses: actions/download-artifact@v4
|
|
53
|
+
with:
|
|
54
|
+
name: dist
|
|
55
|
+
path: dist/
|
|
56
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Run the tests on every push and pull request, on the three systems people run Leyline on, at the oldest and the
|
|
2
|
+
# newest Python it supports. Tests that need the .NET SDK or a browser skip themselves where those are missing.
|
|
3
|
+
name: test
|
|
4
|
+
|
|
5
|
+
on:
|
|
6
|
+
push:
|
|
7
|
+
pull_request:
|
|
8
|
+
|
|
9
|
+
permissions:
|
|
10
|
+
contents: read
|
|
11
|
+
|
|
12
|
+
concurrency:
|
|
13
|
+
group: test-${{ github.ref }}
|
|
14
|
+
cancel-in-progress: true
|
|
15
|
+
|
|
16
|
+
jobs:
|
|
17
|
+
test:
|
|
18
|
+
strategy:
|
|
19
|
+
fail-fast: false
|
|
20
|
+
matrix:
|
|
21
|
+
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
22
|
+
python: ["3.10", "3.13"]
|
|
23
|
+
runs-on: ${{ matrix.os }}
|
|
24
|
+
timeout-minutes: 30
|
|
25
|
+
steps:
|
|
26
|
+
# The fixtures are compared line by line; a Windows checkout would otherwise turn their line endings to CRLF.
|
|
27
|
+
- run: git config --global core.autocrlf false
|
|
28
|
+
- uses: actions/checkout@v4
|
|
29
|
+
- uses: actions/setup-python@v5
|
|
30
|
+
with:
|
|
31
|
+
python-version: ${{ matrix.python }}
|
|
32
|
+
- run: python -m pip install -e ".[scip]" pytest
|
|
33
|
+
# More grammars widen what the generic-adapter tests cover. Not every grammar has a wheel for every system
|
|
34
|
+
# and Python, so a failure here only narrows the run.
|
|
35
|
+
- run: python -m pip install -e ".[languages]"
|
|
36
|
+
continue-on-error: true
|
|
37
|
+
# Python runs the tests and keeps their output, so the same steps work on every system's shell.
|
|
38
|
+
- name: Run the tests
|
|
39
|
+
shell: python
|
|
40
|
+
run: |
|
|
41
|
+
import subprocess, sys
|
|
42
|
+
with open("pytest-output.txt", "w", encoding="utf-8") as out:
|
|
43
|
+
proc = subprocess.Popen([sys.executable, "-X", "faulthandler", "-m", "pytest", "-v", "-rfE", "--tb=line",
|
|
44
|
+
"-p", "no:cacheprovider"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
|
|
45
|
+
text=True, encoding="utf-8", errors="replace")
|
|
46
|
+
for line in proc.stdout:
|
|
47
|
+
sys.stdout.write(line)
|
|
48
|
+
out.write(line)
|
|
49
|
+
out.flush()
|
|
50
|
+
sys.exit(proc.wait())
|
|
51
|
+
# The failures as annotations, so they can be read without the full log.
|
|
52
|
+
- name: Name the failures
|
|
53
|
+
if: failure()
|
|
54
|
+
continue-on-error: true
|
|
55
|
+
shell: python
|
|
56
|
+
run: |
|
|
57
|
+
lines = open("pytest-output.txt", encoding="utf-8", errors="replace").read().splitlines()
|
|
58
|
+
for line in [l for l in lines if l.startswith(("FAILED ", "ERROR "))][:40]:
|
|
59
|
+
print("::error::" + line)
|
|
60
|
+
for line in lines[-25:]:
|
|
61
|
+
print("::notice::" + line)
|