release-devkit 0.1.0__tar.gz → 0.1.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.
Files changed (31) hide show
  1. release_devkit-0.1.2/.gitattributes +1 -0
  2. {release_devkit-0.1.0 → release_devkit-0.1.2}/.github/workflows/ci.yml +3 -0
  3. {release_devkit-0.1.0 → release_devkit-0.1.2}/AGENTS.md +1 -1
  4. {release_devkit-0.1.0 → release_devkit-0.1.2}/PKG-INFO +2 -2
  5. {release_devkit-0.1.0 → release_devkit-0.1.2}/pyproject.toml +2 -2
  6. release_devkit-0.1.2/ruff.base.toml +198 -0
  7. release_devkit-0.1.2/ruff.toml +1 -0
  8. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/create_release.py +1 -1
  9. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/fetch_ci_artifacts.py +1 -1
  10. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/ledger.py +8 -11
  11. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/mirror_images.py +1 -1
  12. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/publish_dev.py +2 -2
  13. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/publish_packages.py +2 -2
  14. {release_devkit-0.1.0 → release_devkit-0.1.2}/uv.lock +16 -17
  15. release_devkit-0.1.0/ruff.toml +0 -80
  16. {release_devkit-0.1.0 → release_devkit-0.1.2}/.github/workflows/release.yml +0 -0
  17. {release_devkit-0.1.0 → release_devkit-0.1.2}/.gitignore +0 -0
  18. {release_devkit-0.1.0 → release_devkit-0.1.2}/CLAUDE.md +0 -0
  19. {release_devkit-0.1.0 → release_devkit-0.1.2}/LICENSE +0 -0
  20. {release_devkit-0.1.0 → release_devkit-0.1.2}/NOTICE +0 -0
  21. {release_devkit-0.1.0 → release_devkit-0.1.2}/README.md +0 -0
  22. {release_devkit-0.1.0 → release_devkit-0.1.2}/publish-config.json +0 -0
  23. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/__init__.py +0 -0
  24. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/config.py +0 -0
  25. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/ensure_release_pr.py +0 -0
  26. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/feeds.py +0 -0
  27. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/plan.py +0 -0
  28. {release_devkit-0.1.0 → release_devkit-0.1.2}/src/release_devkit/py.typed +0 -0
  29. {release_devkit-0.1.0 → release_devkit-0.1.2}/tests/test_config.py +0 -0
  30. {release_devkit-0.1.0 → release_devkit-0.1.2}/tests/test_feeds.py +0 -0
  31. {release_devkit-0.1.0 → release_devkit-0.1.2}/tests/test_plan.py +0 -0
@@ -0,0 +1 @@
1
+ ruff.base.toml -text
@@ -31,3 +31,6 @@ jobs:
31
31
 
32
32
  - name: Test
33
33
  run: uv run pytest
34
+
35
+ - name: Ruff config drift
36
+ run: uvx --from python-devkit==0.1.2 sync-ruff --check
@@ -6,7 +6,7 @@ The publication machinery for outernet-foundation repos: the publish pipeline, t
6
6
 
7
7
  The consumer owns everything declarative: package identities, paths, tag prefixes, registry mappings, compose files, and the CI workflow name live in a consumer-authored `publish-config.json`; every command here reads that file. Per-repo copies of this machinery are refused, as are per-ecosystem splits — the seam is internal: one `Feed` adapter per registry over the shared ledger/diff/versioning core.
8
8
 
9
- The package is `release-devkit` (src-layout under `src/release_devkit/`; import `release_devkit`). Name history: `pubpkg` was unclaimable (PyPI's registrar rejects names merely similar to existing ones; nothing ever carried it), so `release-kit` was the first live PyPI identity — then the repo renamed to `release-devkit` (2026-09-21, member of the `-devkit` family): fresh tag ledger starting at `0.1.0`, with a terminal `release-kit` ≤0.1.0 deprecation release pointing here. Runtime dependencies: `bashrun` (all shell-outs), `docker-devkit` (`compute_service_shas`, `collect_repo_references`), `unity-devkit` (`ci_step`, runner setup), `pydantic`/`pydantic-settings` (config + CI env), `typer` (CLIs) — all from PyPI.
9
+ The package is `release-devkit` (src-layout under `src/release_devkit/`; import `release_devkit`). Name history: `pubpkg` was unclaimable (PyPI's registrar rejects names merely similar to existing ones; nothing ever carried it), so `release-kit` was the first live PyPI identity — then the repo renamed to `release-devkit` (2026-09-21, member of the `-devkit` family): fresh tag ledger starting at `0.1.0`, with a terminal `release-kit` ≤0.1.0 deprecation release pointing here. Runtime dependencies: `bashrun` (all shell-outs), `docker-devkit` (`compute_service_shas`, `collect_repo_references`), `ci-devkit` (`ci_step`, runner setup, git-tag ledger), `pydantic`/`pydantic-settings` (config + CI env), `typer` (CLIs) — all from PyPI.
10
10
 
11
11
  ## Self-publication
12
12
 
@@ -1,13 +1,13 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: release-devkit
3
- Version: 0.1.0
3
+ Version: 0.1.2
4
4
  Summary: Publication machinery: per-package tag ledger, path-diff change detection, ephemeral version patching, and per-registry feed adapters (nuget, npm/UPM) driven by a declarative consumer-owned config
5
5
  License-File: LICENSE
6
6
  License-File: NOTICE
7
7
  Requires-Python: >=3.13
8
8
  Requires-Dist: bashrun>=0.1.0
9
+ Requires-Dist: ci-devkit>=0.1.0
9
10
  Requires-Dist: docker-devkit>=0.1.0
10
11
  Requires-Dist: pydantic-settings>=2.9.1
11
12
  Requires-Dist: pydantic>=2.11.7
12
13
  Requires-Dist: typer>=0.17.4
13
- Requires-Dist: unity-devkit>=0.1.0
@@ -1,12 +1,12 @@
1
1
  [project]
2
2
  name = "release-devkit"
3
- version = "0.1.0"
3
+ version = "0.1.2"
4
4
  description = "Publication machinery: per-package tag ledger, path-diff change detection, ephemeral version patching, and per-registry feed adapters (nuget, npm/UPM) driven by a declarative consumer-owned config"
5
5
  requires-python = ">=3.13"
6
6
  dependencies = [
7
7
  "bashrun>=0.1.0",
8
8
  "docker-devkit>=0.1.0",
9
- "unity-devkit>=0.1.0",
9
+ "ci-devkit>=0.1.0",
10
10
  "pydantic>=2.11.7",
11
11
  "pydantic-settings>=2.9.1",
12
12
  "typer>=0.17.4",
@@ -0,0 +1,198 @@
1
+ # Org-canonical ruff configuration, hosted in python-devkit.
2
+ # Consuming repos carry this file verbatim as ruff.base.toml, written by the
3
+ # sync-ruff verb (uvx --from python-devkit sync-ruff) and drift-gated in CI.
4
+ # Never edit a synced copy: change this canonical, release python-devkit, and
5
+ # re-run sync-ruff in each consuming repo.
6
+ target-version = "py313"
7
+ line-length = 120
8
+ preview = true
9
+ required-version = ">=0.14.11"
10
+
11
+ [lint]
12
+ select = ["ALL"]
13
+ ignore = [
14
+ # ── Temporarily ignored (inline noqas exist for these rules but are redundant
15
+ # while the rules are globally ignored — RUF100 suppresses the "unused noqa" warning
16
+ # until we un-ignore each ticket's rules)
17
+ "RUF100",
18
+
19
+ # ── Permanently ignored ──────────────────────────────────────────────
20
+ # Type annotations — basedpyright strict mode handles this
21
+ "ANN",
22
+ # EM101 (string literal in exception) — the msg = ... indirection adds verbosity without benefit
23
+ "EM101",
24
+ # TRY003 (raise vanilla args) — requires custom exception class for every raise site;
25
+ # the real problem (interpolation) is caught by EM102/EM103
26
+ "TRY003",
27
+ # A003 (class attribute shadowing) — class attributes via self.x never conflict with builtins
28
+ "A003",
29
+ # Function complexity counting — C901 already covers structural complexity;
30
+ # these counting rules are largely redundant
31
+ "PLR0911",
32
+ "PLR0912",
33
+ "PLR0913",
34
+ "PLR0914",
35
+ "PLR0915",
36
+ "PLR0917",
37
+
38
+ # ── Temporarily ignored (will enable when conventions are established) ─
39
+ # Docstrings — project policy is "no docstrings" for now
40
+ "D",
41
+ # Copyright notices — not yet established
42
+ "CPY",
43
+ # Docstring formatting — blocked on D
44
+ "DOC",
45
+ # TODO/FIXME comment formatting
46
+ "TD",
47
+ "FIX",
48
+
49
+ # The "Ticket N" blocks below are the transitional cleanup slices tracked
50
+ # by PLE-248 (Enforce the deferred ruff rules):
51
+ # https://linear.app/plerionplatforms/issue/PLE-248
52
+ # Ticket 3 (T201, print → logging) is tracked by PLE-336:
53
+ # https://linear.app/plerionplatforms/issue/PLE-336
54
+ # Lifting a rule = remove it here in python-devkit's canonical config,
55
+ # release, and run sync-ruff in every consuming repo.
56
+
57
+ # ── Ticket 1: Auto-fix formatting & type modernization ───────────────
58
+ # Zero risk. Purely mechanical, all auto-fixable via ruff --fix.
59
+ "COM812", # missing trailing commas
60
+ "I001", # import sorting
61
+ "ISC003", # explicit string concatenation
62
+ "RUF031", # parenthesized tuple in subscript
63
+ "TC001", # move import into TYPE_CHECKING block
64
+ "TC002", # move third-party import into TYPE_CHECKING block
65
+ "TC003", # move stdlib import into TYPE_CHECKING block
66
+ "TC006", # move typing import into TYPE_CHECKING block (PEP 695)
67
+ "TC008", # move import into TYPE_CHECKING block (quoted annotation)
68
+ "UP006", # use X instead of typing.X
69
+ "UP007", # use X | Y instead of Union
70
+ "UP011", # unnecessary parentheses to functools.lru_cache
71
+ "UP015", # unnecessary open mode parameters
72
+ "UP017", # use datetime.UTC alias
73
+ "UP034", # extraneous parentheses
74
+ "UP035", # deprecated import (use collections.abc, etc.)
75
+ "UP040", # use PEP 695 type alias
76
+ "UP042", # use PEP 695 type parameters
77
+ "UP045", # use X | None instead of Optional
78
+
79
+ # ── Ticket 2: Auto-fix code simplifications ──────────────────────────
80
+ # Very low risk. Auto-fixable with trivial semantic changes.
81
+ "C401", # unnecessary generator — use set/dict comprehension
82
+ "C416", # unnecessary comprehension — use list/dict
83
+ "ERA001", # commented-out code
84
+ "FURB101", # read-text can replace open+read
85
+ "FURB103", # write-text can replace open+write
86
+ "FURB110", # use ternary instead of try/except for default
87
+ "FURB113", # use list.extend instead of repeated append
88
+ "FURB118", # use operator module instead of lambda
89
+ "LOG004", # use __name__ as logger name
90
+ "PERF401", # use list comprehension instead of manual append
91
+ "PIE810", # unnecessary spread of single-element starred
92
+ "PLC0207", # use a single __all__ definition
93
+ "PLC1901", # compare to empty string using falsy check
94
+ "PLR1711", # useless return at end of function
95
+ "PLR6104", # use augmented assignment
96
+ "PLR6201", # use a set literal for membership test
97
+ "PLW1510", # subprocess.run without explicit check= argument
98
+ "PLW1514", # open without explicit encoding
99
+ "PT001", # use @pytest.fixture over @pytest.fixture()
100
+ "PT018", # composite assertion — split into multiple asserts
101
+ "PTH101", # os.chmod → Path.chmod
102
+ "PTH111", # os.path.expanduser → Path.expanduser
103
+ "PTH112", # os.path.isdir → Path.is_dir
104
+ "PTH118", # os.path.join → Path /
105
+ "PTH123", # open() → Path.open()
106
+ "PTH201", # pathlib.Path(".")
107
+ "RET501", # unnecessary explicit return None
108
+ "RET504", # unnecessary assignment before return
109
+ "RET505", # unnecessary else after return
110
+ "RET506", # unnecessary else after raise
111
+ "RET507", # unnecessary else after continue
112
+ "RSE102", # unnecessary parentheses on raised exception
113
+ "RUF005", # consider spread operator instead of concatenation
114
+ "RUF010", # use explicit conversion flag in f-string
115
+ "RUF015", # prefer next() over single-element slice
116
+ "RUF029", # function is declared async but has no await
117
+ "RUF052", # local variable is assigned but never used (underscore prefix)
118
+ "RUF056", # unnecessary default value for keyword argument
119
+ "SIM102", # collapsible if statements
120
+ "SIM105", # use contextlib.suppress instead of try/except/pass
121
+ "SIM115", # use context manager for opening files
122
+ "SIM117", # use single with statement for multiple context managers
123
+ "SIM118", # use key in dict instead of key in dict.keys()
124
+ "TID252", # prefer absolute imports over relative
125
+
126
+ # ── Ticket 3: print → logging ────────────────────────────────────────
127
+ # All code should use logging, including CLI scripts.
128
+ "T201", # print found
129
+
130
+ # ── Ticket 4: Exception message interpolation ────────────────────────
131
+ # Remove f-strings from exception messages — use string literals.
132
+ "EM102", # f-string in exception message
133
+
134
+ # ── Ticket 5: Missing __init__.py + shebangs ─────────────────────────
135
+ # Add __init__.py to installable packages; remove vestigial shebangs.
136
+ "INP001", # implicit namespace package — add __init__.py
137
+ "EXE001", # shebang present but file not executable
138
+
139
+ # ── Ticket 6: Type ignore specificity ────────────────────────────────
140
+ # Replace blanket type: ignore with specific error codes.
141
+ "PGH003", # blanket type: ignore
142
+
143
+ # ── Ticket 7: Boolean trap refactoring ───────────────────────────────
144
+ # Change function signatures — callers must update too.
145
+ "FBT001", # boolean positional argument
146
+ "FBT002", # boolean default value in function definition
147
+ "FBT003", # boolean positional value in call
148
+
149
+ # ── Ticket 8: Exception handling patterns ────────────────────────────
150
+ # Behavioral changes to error handling.
151
+ "B020", # loop variable overwritten by except
152
+ "B903", # generator should use yield from
153
+ "B904", # raise without from inside except
154
+ "B905", # zip() without strict= parameter
155
+ "BLE001", # blind except Exception
156
+ "S101", # assert outside tests
157
+ "TRY002", # create custom exception class
158
+ "TRY300", # try/except/return — move return into else
159
+
160
+ # ── Ticket 9: Complexity, naming & refactoring ───────────────────────
161
+ # Structural changes requiring judgment.
162
+ "A001", # builtin shadowing (dir, bytes)
163
+ "ARG001", # unused function argument
164
+ "ARG002", # unused method argument
165
+ "C901", # function too complex
166
+ "E501", # line too long
167
+ "N802", # function name should be lowercase
168
+ "N806", # variable in function should be lowercase
169
+ "N815", # mixed-case variable in class scope
170
+ "N818", # exception name should end in Error
171
+ "PLC0415", # import not at top level
172
+ "PLE0704", # bare raise not inside except handler
173
+ "PLR1702", # too many nested blocks
174
+ "PLR2004", # magic value used in comparison
175
+ "PLR6301", # method could be function or static method
176
+ "PLW0603", # global statement
177
+ "PLW2901", # loop variable overwritten
178
+ "RUF001", # ambiguous unicode — replace with ASCII
179
+ "RUF003", # ambiguous unicode in comment
180
+ "S106", # possible hardcoded password
181
+ "S108", # probable insecure temp file/dir usage
182
+ "S110", # try/except/pass on broad exception
183
+ "S202", # use of tarfile.extractall
184
+ # S404/S603: prerequisite — bash.py needs env, stderr=STDOUT merge, and no-raise-with-capture
185
+ # before context_sha.py, deptry_check.py, test_context_sha.py, list_debug_targets.py can migrate
186
+ "S404", # suspicious subprocess import
187
+ "S603", # subprocess call with non-literal
188
+ "S606", # starting process without shell
189
+ "S607", # starting process with partial path
190
+ ]
191
+
192
+ [lint.per-file-ignores]
193
+ # Tests use assert as the standard pytest mechanism; fixtures take arguments
194
+ # that pytest consumes implicitly; pytest-style test classes need no self use
195
+ "**/tests/**" = ["S101", "ARG001", "ARG002", "PLR6301"]
196
+
197
+ [lint.flake8-builtins]
198
+ ignorelist = ["id", "map"]
@@ -0,0 +1 @@
1
+ extend = "ruff.base.toml"
@@ -10,7 +10,7 @@ import typer
10
10
  from bashrun import bash, bash_output
11
11
  from pydantic_settings import BaseSettings
12
12
  from docker_devkit.context_sha import compute_service_shas
13
- from unity_devkit.ci_step import ci_step
13
+ from ci_devkit.ci_step import ci_step
14
14
 
15
15
  from .config import PublishConfig, load_config
16
16
  from .ledger import GitLedger
@@ -7,7 +7,7 @@ from typing import Annotated
7
7
  import typer
8
8
  from bashrun import bash, bash_output
9
9
  from pydantic_settings import BaseSettings
10
- from unity_devkit.ci_step import ci_step
10
+ from ci_devkit.ci_step import ci_step
11
11
 
12
12
  from .config import load_config
13
13
 
@@ -1,7 +1,11 @@
1
1
  import re
2
2
  from pathlib import Path
3
3
 
4
- from bashrun import bash, bash_check, bash_output
4
+ from ci_devkit.git_tags import (
5
+ create_and_push_tag as push_tag,
6
+ has_changes_since_tag,
7
+ list_tag_versions,
8
+ )
5
9
 
6
10
  # Prerelease-suffixed tags (e.g. 1.0.6-preview) are not stable-ledger versions: the stable flow
7
11
  # must never compute a next version from one. Dev-channel versions never enter the tag space.
@@ -14,20 +18,13 @@ def is_stable_version(version: str) -> bool:
14
18
 
15
19
  class GitLedger:
16
20
  def latest_version(self, prefix: str) -> str | None:
17
- output = bash_output(f'git tag --list "{prefix}*" --sort=-v:refname').strip()
18
- if not output:
19
- return None
20
- for tag in output.splitlines():
21
- version = tag[len(prefix) :]
21
+ for version in list_tag_versions(prefix):
22
22
  if is_stable_version(version):
23
23
  return version
24
24
  return None
25
25
 
26
26
  def has_changes_since(self, tag: str | None, path: Path) -> bool:
27
- if tag is None:
28
- return True
29
- return not bash_check(f"git diff --quiet {tag} HEAD -- {path}")
27
+ return has_changes_since_tag(tag, path)
30
28
 
31
29
  def create_and_push_tag(self, tag: str) -> None:
32
- bash(f"git tag {tag}")
33
- bash(f"git push origin {tag}")
30
+ push_tag(tag)
@@ -7,7 +7,7 @@ from typing import Annotated
7
7
  import typer
8
8
  from bashrun import bash
9
9
  from docker_devkit.image_refs import collect_repo_references
10
- from unity_devkit.ci_step import ci_step
10
+ from ci_devkit.ci_step import ci_step
11
11
 
12
12
  from .config import load_config
13
13
 
@@ -5,8 +5,8 @@ from typing import Annotated
5
5
 
6
6
  import typer
7
7
  from pydantic_settings import BaseSettings
8
- from unity_devkit.ci_step import ci_step
9
- from unity_devkit.setup import configure_git, free_disk_space, install_dotnet, install_node
8
+ from ci_devkit.ci_step import ci_step
9
+ from ci_devkit.setup import configure_git, free_disk_space, install_dotnet, install_node
10
10
 
11
11
  from .config import load_config, select_packages
12
12
  from .feeds import DEV_VERSION_FORMATS, NPM_DEV_DIST_TAG, PublishRequest, build_feeds
@@ -5,8 +5,8 @@ from typing import Annotated
5
5
 
6
6
  import typer
7
7
  from pydantic_settings import BaseSettings
8
- from unity_devkit.ci_step import ci_step
9
- from unity_devkit.setup import configure_git, free_disk_space, install_dotnet, install_node
8
+ from ci_devkit.ci_step import ci_step
9
+ from ci_devkit.setup import configure_git, free_disk_space, install_dotnet, install_node
10
10
 
11
11
  from .config import load_config, select_packages
12
12
  from .feeds import PublishRequest, build_feeds
@@ -41,6 +41,20 @@ wheels = [
41
41
  { url = "https://files.pythonhosted.org/packages/be/9a/749dd28f3defde3690e0280131f9461e4100c43c117f9363798f6dedbb91/bashrun-0.1.0-py3-none-any.whl", hash = "sha256:80f87924f88336460890d669aa1abb6fb8c389b675fdb41ac8d2b6861d4ebddb", size = 7634, upload-time = "2026-09-21T01:47:56.233Z" },
42
42
  ]
43
43
 
44
+ [[package]]
45
+ name = "ci-devkit"
46
+ version = "0.1.0"
47
+ source = { registry = "https://pypi.org/simple" }
48
+ dependencies = [
49
+ { name = "bashrun" },
50
+ { name = "pydantic" },
51
+ { name = "pydantic-settings" },
52
+ ]
53
+ sdist = { url = "https://files.pythonhosted.org/packages/9c/58/e0c1f17fbcf6e7adcc4192d5d0a4300be2b0d0ffd055ff746f0116ad587a/ci_devkit-0.1.0.tar.gz", hash = "sha256:ac1a463effe9a2760ea6d18301d6938c6a47d07cee9d8e14bae0c2d20ab0f377", size = 38920, upload-time = "2026-09-21T22:54:14.99Z" }
54
+ wheels = [
55
+ { url = "https://files.pythonhosted.org/packages/c3/b3/ee5474174a4d8e9626eb0cbac234ea99908ed3988cc8b807fc8f4a2680a6/ci_devkit-0.1.0-py3-none-any.whl", hash = "sha256:3df3faf0821ffc1c32403f0af5b6b1ceb312d4912cae5b58aaf97b20c251874d", size = 26289, upload-time = "2026-09-21T22:54:13.759Z" },
56
+ ]
57
+
44
58
  [[package]]
45
59
  name = "colorama"
46
60
  version = "0.4.6"
@@ -301,11 +315,11 @@ version = "0.0.0.dev0"
301
315
  source = { editable = "." }
302
316
  dependencies = [
303
317
  { name = "bashrun" },
318
+ { name = "ci-devkit" },
304
319
  { name = "docker-devkit" },
305
320
  { name = "pydantic" },
306
321
  { name = "pydantic-settings" },
307
322
  { name = "typer" },
308
- { name = "unity-devkit" },
309
323
  ]
310
324
 
311
325
  [package.dev-dependencies]
@@ -318,11 +332,11 @@ dev = [
318
332
  [package.metadata]
319
333
  requires-dist = [
320
334
  { name = "bashrun", specifier = ">=0.1.0" },
335
+ { name = "ci-devkit", specifier = ">=0.1.0" },
321
336
  { name = "docker-devkit", specifier = ">=0.1.0" },
322
337
  { name = "pydantic", specifier = ">=2.11.7" },
323
338
  { name = "pydantic-settings", specifier = ">=2.9.1" },
324
339
  { name = "typer", specifier = ">=0.17.4" },
325
- { name = "unity-devkit", specifier = ">=0.1.0" },
326
340
  ]
327
341
 
328
342
  [package.metadata.requires-dev]
@@ -414,18 +428,3 @@ sdist = { url = "https://files.pythonhosted.org/packages/a3/26/b09b8010994eccc3c
414
428
  wheels = [
415
429
  { url = "https://files.pythonhosted.org/packages/67/81/4add07e5172b7ac40d8ed5ff580409a7801a4fe26d529bdd915401dabfbe/typing_inspection-0.4.4-py3-none-any.whl", hash = "sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147", size = 14750, upload-time = "2026-08-12T12:37:24.648Z" },
416
430
  ]
417
-
418
- [[package]]
419
- name = "unity-devkit"
420
- version = "0.1.0"
421
- source = { registry = "https://pypi.org/simple" }
422
- dependencies = [
423
- { name = "bashrun" },
424
- { name = "pydantic" },
425
- { name = "pydantic-settings" },
426
- { name = "typer" },
427
- ]
428
- sdist = { url = "https://files.pythonhosted.org/packages/6d/04/0a44e72ea2d4d9ecfacdaaadc45e3bf287c9b77232ff5a6a3f97d73a65f0/unity_devkit-0.1.0.tar.gz", hash = "sha256:5c0d607d7ff66216f037bf0276683cbda4d6b2553480761fbd175c9029fc8de0", size = 50144, upload-time = "2026-09-21T22:17:36.414Z" }
429
- wheels = [
430
- { url = "https://files.pythonhosted.org/packages/e4/f9/75c751b4a5e6ef485c912b456da3685ec80a47a08a69082d2912cda166db/unity_devkit-0.1.0-py3-none-any.whl", hash = "sha256:72f84a3560bf795f335634b8c67420d648c6df3fd2432d954dbb0c7104546a21", size = 38841, upload-time = "2026-09-21T22:17:35.41Z" },
431
- ]
@@ -1,80 +0,0 @@
1
- target-version = "py313"
2
- line-length = 120
3
- preview = true
4
-
5
- [lint]
6
- select = ["ALL"]
7
- ignore = [
8
- # ── Permanent ─────────────────────────────────────────────────────────
9
- # Type annotations — basedpyright strict mode handles this
10
- "ANN",
11
- # No docstrings, no copyright headers
12
- "D",
13
- "DOC",
14
- "CPY",
15
- # TODO/FIXME comment formatting
16
- "TD",
17
- "FIX",
18
- # Exception message ergonomics — literal-indirection and custom-class churn without benefit
19
- "raw-string-in-exception",
20
- "f-string-in-exception",
21
- "raise-vanilla-args",
22
- # Class attribute names never conflict with builtins via self.x
23
- "builtin-attribute-shadowing",
24
- # Function-size counters — C901 already covers structural complexity
25
- "too-many-return-statements",
26
- "too-many-branches",
27
- "too-many-arguments",
28
- "too-many-locals",
29
- "too-many-statements",
30
- "too-many-positional-arguments",
31
- # Typer's Option/Argument in argument defaults is its standard API pattern
32
- "function-call-in-default-argument",
33
- # Boolean parameters read fine as keyword-only flags here
34
- "boolean-type-hint-positional-argument",
35
- "boolean-default-value-positional-argument",
36
- "boolean-positional-value-in-call",
37
- # Relative imports are the intra-package convention
38
- "relative-imports",
39
- # Formatter-owned; enforced by `ruff format`
40
- "missing-trailing-comma",
41
- "unsorted-imports",
42
- # Magic values in comparisons are readable in this CLI
43
- "magic-value-comparison",
44
- # The formatter owns wrapping; long string literals and URLs stay on one line
45
- "line-too-long",
46
- # src-layout tests need no __init__.py
47
- "implicit-namespace-package",
48
- # Runtime-used typing imports stay at module level
49
- "typing-only-first-party-import",
50
- "typing-only-third-party-import",
51
- "typing-only-standard-library-import",
52
- # Small literal tuples read fine in membership tests
53
- "literal-membership",
54
- # Feed and ledger adapters are classes so they satisfy their Protocols and can carry
55
- # per-instance auth state (e.g. NuGetFeed's api key); not every adapter uses `self`
56
- "no-self-use",
57
-
58
- # ── Deferred to PLE-248 — Enforce the deferred ruff rules
59
- # https://linear.app/plerionplatforms/issue/PLE-248
60
- # Mirrors placeframe's root ruff.toml transitional Ticket-N blocks; lifting
61
- # a rule here should happen alongside lifting it from placeframe's ruff.toml.
62
- "complex-structure", # function too complex — Ticket 9
63
- "too-many-nested-blocks", # too many nested blocks — Ticket 9
64
-
65
- # ── Deferred to PLE-336 — Replace print() with structured logging
66
- # https://linear.app/plerionplatforms/issue/PLE-336
67
- "print", # print found
68
- ]
69
-
70
- [lint.per-file-ignores]
71
- "tests/**" = ["assert", "suspicious-subprocess-import", "start-process-with-partial-path", "no-self-use", "unused-method-argument"]
72
- # feeds.py catches subprocess.CalledProcessError raised by bashrun — the stdlib type, no way around the import
73
- "src/release_devkit/feeds.py" = ["suspicious-subprocess-import"]
74
- # config.py declares the default CI-runner scratch path shared by fetch-ci-artifacts and create-release
75
- "src/release_devkit/config.py" = ["hardcoded-temp-file"]
76
- # tests assert that same default
77
- "tests/test_config.py" = ["hardcoded-temp-file"]
78
-
79
- [lint.flake8-builtins]
80
- ignorelist = ["id", "map"]
File without changes
File without changes
File without changes
File without changes