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.
Files changed (186) hide show
  1. leyline_code-0.8.1/.github/workflows/publish.yml +56 -0
  2. leyline_code-0.8.1/.github/workflows/test.yml +61 -0
  3. leyline_code-0.8.1/.gitignore +9 -0
  4. leyline_code-0.8.1/LICENSE +674 -0
  5. leyline_code-0.8.1/PKG-INFO +1325 -0
  6. leyline_code-0.8.1/README.md +1292 -0
  7. leyline_code-0.8.1/docs/quick-reference.md +122 -0
  8. leyline_code-0.8.1/pyproject.toml +49 -0
  9. leyline_code-0.8.1/skills/leyline-adversarial-review/SKILL.md +121 -0
  10. leyline_code-0.8.1/skills/leyline-ask/SKILL.md +57 -0
  11. leyline_code-0.8.1/skills/leyline-change-impact/SKILL.md +79 -0
  12. leyline_code-0.8.1/skills/leyline-explain-flow/SKILL.md +70 -0
  13. leyline_code-0.8.1/skills/leyline-explore-module/SKILL.md +55 -0
  14. leyline_code-0.8.1/skills/leyline-pr-review/SKILL.md +77 -0
  15. leyline_code-0.8.1/skills/leyline-quick-change/SKILL.md +63 -0
  16. leyline_code-0.8.1/skills/leyline-spec/SKILL.md +179 -0
  17. leyline_code-0.8.1/skills/leyline-tour/SKILL.md +46 -0
  18. leyline_code-0.8.1/src/leyline/__init__.py +3 -0
  19. leyline_code-0.8.1/src/leyline/adapters/__init__.py +19 -0
  20. leyline_code-0.8.1/src/leyline/adapters/csharp.py +1026 -0
  21. leyline_code-0.8.1/src/leyline/adapters/generic.py +844 -0
  22. leyline_code-0.8.1/src/leyline/adapters/python.py +929 -0
  23. leyline_code-0.8.1/src/leyline/adapters/typescript.py +1512 -0
  24. leyline_code-0.8.1/src/leyline/affected.py +509 -0
  25. leyline_code-0.8.1/src/leyline/agent_skills.py +311 -0
  26. leyline_code-0.8.1/src/leyline/change.py +500 -0
  27. leyline_code-0.8.1/src/leyline/channels.py +1782 -0
  28. leyline_code-0.8.1/src/leyline/cli.py +1029 -0
  29. leyline_code-0.8.1/src/leyline/cluster.py +149 -0
  30. leyline_code-0.8.1/src/leyline/context.py +531 -0
  31. leyline_code-0.8.1/src/leyline/coupling.py +485 -0
  32. leyline_code-0.8.1/src/leyline/coverage.py +376 -0
  33. leyline_code-0.8.1/src/leyline/diagrams.py +680 -0
  34. leyline_code-0.8.1/src/leyline/diff.py +1078 -0
  35. leyline_code-0.8.1/src/leyline/drift.py +747 -0
  36. leyline_code-0.8.1/src/leyline/exact.py +410 -0
  37. leyline_code-0.8.1/src/leyline/explain.py +973 -0
  38. leyline_code-0.8.1/src/leyline/export.py +673 -0
  39. leyline_code-0.8.1/src/leyline/fncoupling.py +328 -0
  40. leyline_code-0.8.1/src/leyline/formats.py +923 -0
  41. leyline_code-0.8.1/src/leyline/grade.py +207 -0
  42. leyline_code-0.8.1/src/leyline/incremental.py +931 -0
  43. leyline_code-0.8.1/src/leyline/indexer.py +3733 -0
  44. leyline_code-0.8.1/src/leyline/learnings.py +743 -0
  45. leyline_code-0.8.1/src/leyline/loop.py +584 -0
  46. leyline_code-0.8.1/src/leyline/model.py +142 -0
  47. leyline_code-0.8.1/src/leyline/outline.py +1066 -0
  48. leyline_code-0.8.1/src/leyline/packing.py +86 -0
  49. leyline_code-0.8.1/src/leyline/patterns.py +478 -0
  50. leyline_code-0.8.1/src/leyline/pr.py +1249 -0
  51. leyline_code-0.8.1/src/leyline/props.py +255 -0
  52. leyline_code-0.8.1/src/leyline/query.py +683 -0
  53. leyline_code-0.8.1/src/leyline/quick.py +853 -0
  54. leyline_code-0.8.1/src/leyline/related.py +266 -0
  55. leyline_code-0.8.1/src/leyline/removal.py +231 -0
  56. leyline_code-0.8.1/src/leyline/renames.py +231 -0
  57. leyline_code-0.8.1/src/leyline/rereview.py +375 -0
  58. leyline_code-0.8.1/src/leyline/roslyn_refs/Program.cs +179 -0
  59. leyline_code-0.8.1/src/leyline/roslyn_refs/RoslynRefs.csproj +16 -0
  60. leyline_code-0.8.1/src/leyline/rules.py +171 -0
  61. leyline_code-0.8.1/src/leyline/schema.sql +178 -0
  62. leyline_code-0.8.1/src/leyline/scip_pb2.py +97 -0
  63. leyline_code-0.8.1/src/leyline/server.py +1230 -0
  64. leyline_code-0.8.1/src/leyline/spec.py +1819 -0
  65. leyline_code-0.8.1/src/leyline/store.py +560 -0
  66. leyline_code-0.8.1/src/leyline/tours.py +352 -0
  67. leyline_code-0.8.1/src/leyline/verdicts.py +390 -0
  68. leyline_code-0.8.1/src/leyline/viewer/viewer.html +1622 -0
  69. leyline_code-0.8.1/tests/conftest.py +36 -0
  70. leyline_code-0.8.1/tests/fixture/App/App.csproj +4 -0
  71. leyline_code-0.8.1/tests/fixture/App/Checks.cs +28 -0
  72. leyline_code-0.8.1/tests/fixture/App/Program.cs +14 -0
  73. leyline_code-0.8.1/tests/fixture/Lib/Bus.cs +10 -0
  74. leyline_code-0.8.1/tests/fixture/Lib/Lib.csproj +1 -0
  75. leyline_code-0.8.1/tests/fixture/Lib/Program.cs +1 -0
  76. leyline_code-0.8.1/tests/fixture/Lib/Shapes.cs +27 -0
  77. leyline_code-0.8.1/tests/fixture/scripts/launch.py +7 -0
  78. leyline_code-0.8.1/tests/fixture/scripts/run.py +12 -0
  79. leyline_code-0.8.1/tests/fixture/scripts/util.py +14 -0
  80. leyline_code-0.8.1/tests/fixture2/cs/Mod/Boxes.cs +17 -0
  81. leyline_code-0.8.1/tests/fixture2/cs/Mod/Fluent.cs +32 -0
  82. leyline_code-0.8.1/tests/fixture2/cs/Mod/Hard.cs +14 -0
  83. leyline_code-0.8.1/tests/fixture2/cs/Mod/Made.cs +30 -0
  84. leyline_code-0.8.1/tests/fixture2/cs/Mod/Mod.csproj +1 -0
  85. leyline_code-0.8.1/tests/fixture2/cs/Mod/Reports.cs +8 -0
  86. leyline_code-0.8.1/tests/fixture2/cs/Mod/Runner.cs +24 -0
  87. leyline_code-0.8.1/tests/fixture2/cs/Mod/Shapes.cs +64 -0
  88. leyline_code-0.8.1/tests/fixture2/cs/Mod/State.cs +44 -0
  89. leyline_code-0.8.1/tests/fixture2/py/src/pkg/__init__.py +2 -0
  90. leyline_code-0.8.1/tests/fixture2/py/src/pkg/core.py +39 -0
  91. leyline_code-0.8.1/tests/fixture2/py/tests/conftest.py +14 -0
  92. leyline_code-0.8.1/tests/fixture2/py/tests/test_engine.py +26 -0
  93. leyline_code-0.8.1/tests/fixture2/py/web/app.py +20 -0
  94. leyline_code-0.8.1/tests/fixture2/py/web/client.py +6 -0
  95. leyline_code-0.8.1/tests/fixture3/package.json +1 -0
  96. leyline_code-0.8.1/tests/fixture3/pkg/app/package.json +1 -0
  97. leyline_code-0.8.1/tests/fixture3/pkg/app/src/main.test.ts +14 -0
  98. leyline_code-0.8.1/tests/fixture3/pkg/app/src/main.tsx +40 -0
  99. leyline_code-0.8.1/tests/fixture3/pkg/app/src/server.ts +7 -0
  100. leyline_code-0.8.1/tests/fixture3/pkg/core/package.json +1 -0
  101. leyline_code-0.8.1/tests/fixture3/pkg/core/src/graph.ts +41 -0
  102. leyline_code-0.8.1/tests/fixture3/pkg/core/src/ids.ts +15 -0
  103. leyline_code-0.8.1/tests/fixture3/pkg/core/src/index.ts +13 -0
  104. leyline_code-0.8.1/tests/fixture4/go/go.mod +2 -0
  105. leyline_code-0.8.1/tests/fixture4/go/main.go +23 -0
  106. leyline_code-0.8.1/tests/fixture4/go/main_test.go +9 -0
  107. leyline_code-0.8.1/tests/fixture4/go/shapes/shape.go +12 -0
  108. leyline_code-0.8.1/tests/fixture4/java/com/acme/App.java +23 -0
  109. leyline_code-0.8.1/tests/fixture4/java/com/acme/Counter.java +21 -0
  110. leyline_code-0.8.1/tests/fixture4/rs/Cargo.toml +3 -0
  111. leyline_code-0.8.1/tests/fixture4/rs/src/geo.rs +37 -0
  112. leyline_code-0.8.1/tests/fixture4/rs/src/main.rs +20 -0
  113. leyline_code-0.8.1/tests/fixture5/py/app.py +10 -0
  114. leyline_code-0.8.1/tests/fixture5/py/audit.py +10 -0
  115. leyline_code-0.8.1/tests/fixture5/py/client.py +9 -0
  116. leyline_code-0.8.1/tests/fixture5/py/consumer.py +19 -0
  117. leyline_code-0.8.1/tests/fixture5/py/container.py +21 -0
  118. leyline_code-0.8.1/tests/fixture5/py/db.py +15 -0
  119. leyline_code-0.8.1/tests/fixture5/py/migrations/0001_audit.py +2 -0
  120. leyline_code-0.8.1/tests/fixture5/py/models.py +25 -0
  121. leyline_code-0.8.1/tests/fixture5/py/tasks.py +8 -0
  122. leyline_code-0.8.1/tests/fixture5/py/tests/test_models.py +6 -0
  123. leyline_code-0.8.1/tests/fixture5/rpc/py/client.py +8 -0
  124. leyline_code-0.8.1/tests/fixture5/rpc/py/server.py +6 -0
  125. leyline_code-0.8.1/tests/fixture5/shop/Billing.cs +79 -0
  126. leyline_code-0.8.1/tests/fixture5/shop/OrderService.cs +49 -0
  127. leyline_code-0.8.1/tests/fixture5/shop/Program.cs +25 -0
  128. leyline_code-0.8.1/tests/fixture5/shop/Shop.csproj +6 -0
  129. leyline_code-0.8.1/tests/fixture5/shop/Store.cs +45 -0
  130. leyline_code-0.8.1/tests/fixture5/ts/events.ts +17 -0
  131. leyline_code-0.8.1/tests/fixture5/ts/nest.ts +28 -0
  132. leyline_code-0.8.1/tests/fixture5/ts/repo.ts +7 -0
  133. leyline_code-0.8.1/tests/fixture5/ts/subs.ts +11 -0
  134. leyline_code-0.8.1/tests/fixture6/tests/test_web.py +34 -0
  135. leyline_code-0.8.1/tests/fixture6/web/__init__.py +2 -0
  136. leyline_code-0.8.1/tests/fixture6/web/app.py +133 -0
  137. leyline_code-0.8.1/tests/fixture6/web/config.py +3 -0
  138. leyline_code-0.8.1/tests/fixture6/web/globals.py +3 -0
  139. leyline_code-0.8.1/tests/fixture_props/fastcheck_vitest_tap.txt +45 -0
  140. leyline_code-0.8.1/tests/fixture_props/fscheck_dotnet_test.txt +34 -0
  141. leyline_code-0.8.1/tests/fixture_props/hypothesis_6.100.txt +89 -0
  142. leyline_code-0.8.1/tests/fixture_props/hypothesis_6.168.txt +89 -0
  143. leyline_code-0.8.1/tests/fixture_ws/wsapp/pyproject.toml +4 -0
  144. leyline_code-0.8.1/tests/fixture_ws/wsapp/src/apppkg/__init__.py +0 -0
  145. leyline_code-0.8.1/tests/fixture_ws/wsapp/src/apppkg/main.py +24 -0
  146. leyline_code-0.8.1/tests/fixture_ws/wsapp/tests/test_main.py +5 -0
  147. leyline_code-0.8.1/tests/fixture_ws/wslib/pyproject.toml +3 -0
  148. leyline_code-0.8.1/tests/fixture_ws/wslib/src/libpkg/__init__.py +1 -0
  149. leyline_code-0.8.1/tests/fixture_ws/wslib/src/libpkg/core.py +22 -0
  150. leyline_code-0.8.1/tests/store_identity.py +26 -0
  151. leyline_code-0.8.1/tests/test_adapters.py +982 -0
  152. leyline_code-0.8.1/tests/test_before.py +180 -0
  153. leyline_code-0.8.1/tests/test_channels.py +199 -0
  154. leyline_code-0.8.1/tests/test_context.py +172 -0
  155. leyline_code-0.8.1/tests/test_coupling.py +187 -0
  156. leyline_code-0.8.1/tests/test_diagrams.py +244 -0
  157. leyline_code-0.8.1/tests/test_drift.py +223 -0
  158. leyline_code-0.8.1/tests/test_fixes.py +465 -0
  159. leyline_code-0.8.1/tests/test_flows_explain.py +314 -0
  160. leyline_code-0.8.1/tests/test_fncoupling.py +176 -0
  161. leyline_code-0.8.1/tests/test_formats.py +402 -0
  162. leyline_code-0.8.1/tests/test_handlers.py +184 -0
  163. leyline_code-0.8.1/tests/test_incremental.py +388 -0
  164. leyline_code-0.8.1/tests/test_index.py +1411 -0
  165. leyline_code-0.8.1/tests/test_learnings.py +379 -0
  166. leyline_code-0.8.1/tests/test_learnings_synonyms.py +92 -0
  167. leyline_code-0.8.1/tests/test_learnings_workspace.py +49 -0
  168. leyline_code-0.8.1/tests/test_memory.py +68 -0
  169. leyline_code-0.8.1/tests/test_outline.py +271 -0
  170. leyline_code-0.8.1/tests/test_pr.py +529 -0
  171. leyline_code-0.8.1/tests/test_props.py +342 -0
  172. leyline_code-0.8.1/tests/test_quick.py +261 -0
  173. leyline_code-0.8.1/tests/test_rereview.py +136 -0
  174. leyline_code-0.8.1/tests/test_resolve.py +379 -0
  175. leyline_code-0.8.1/tests/test_robust.py +413 -0
  176. leyline_code-0.8.1/tests/test_scenario_coverage.py +402 -0
  177. leyline_code-0.8.1/tests/test_security.py +558 -0
  178. leyline_code-0.8.1/tests/test_server.py +587 -0
  179. leyline_code-0.8.1/tests/test_shapes.py +478 -0
  180. leyline_code-0.8.1/tests/test_signalfix.py +341 -0
  181. leyline_code-0.8.1/tests/test_skills.py +180 -0
  182. leyline_code-0.8.1/tests/test_state.py +406 -0
  183. leyline_code-0.8.1/tests/test_surface.py +149 -0
  184. leyline_code-0.8.1/tests/test_trust.py +640 -0
  185. leyline_code-0.8.1/tests/test_verdicts.py +465 -0
  186. 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)
@@ -0,0 +1,9 @@
1
+ __pycache__/
2
+ *.egg-info/
3
+ .leyline/
4
+ *.db
5
+ dist/
6
+ .venv/
7
+
8
+ # accuracy-grade outputs (leyline grade, scratch runs)
9
+ /*.json