ghostpkg 0.24.2__tar.gz → 0.24.3__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 (63) hide show
  1. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.pre-commit-hooks.yaml +1 -1
  2. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/CHANGELOG.md +17 -1
  3. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/PKG-INFO +3 -3
  4. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/README.en.md +2 -2
  5. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/README.md +2 -2
  6. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/__init__.py +1 -1
  7. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/pyproject.toml +1 -1
  8. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_action.py +27 -0
  9. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  10. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  11. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/ISSUE_TEMPLATE/false-positive.yml +0 -0
  12. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/ISSUE_TEMPLATE/missed-package.yml +0 -0
  13. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/ghostpkg-ignore.json +0 -0
  14. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/workflows/ci.yml +0 -0
  15. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/workflows/field.yml +0 -0
  16. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/workflows/publish.yml +0 -0
  17. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.gitignore +0 -0
  18. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/2.0 +0 -0
  19. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/CONTRIBUTING.md +0 -0
  20. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/LICENSE +0 -0
  21. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/SECURITY.md +0 -0
  22. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/action.yml +0 -0
  23. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/assets/banner.html +0 -0
  24. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/assets/banner.png +0 -0
  25. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/assets/demo.gif +0 -0
  26. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/assets/make_demo.py +0 -0
  27. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/__main__.py +0 -0
  28. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/assess.py +0 -0
  29. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/cache.py +0 -0
  30. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/cli.py +0 -0
  31. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/data.py +0 -0
  32. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/discover.py +0 -0
  33. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/inspection.py +0 -0
  34. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/jslocks.py +0 -0
  35. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/manifests.py +0 -0
  36. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/policy.py +0 -0
  37. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/prose.py +0 -0
  38. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/registries.py +0 -0
  39. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/report.py +0 -0
  40. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/rules.py +0 -0
  41. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/scanner.py +0 -0
  42. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/scripts/fieldtest.py +0 -0
  43. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_assess.py +0 -0
  44. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_cache.py +0 -0
  45. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_discover.py +0 -0
  46. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_field_findings.py +0 -0
  47. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_hostile_input.py +0 -0
  48. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_inspection.py +0 -0
  49. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_jslocks.py +0 -0
  50. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_lockfiles.py +0 -0
  51. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_manifests.py +0 -0
  52. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_mutation_gaps.py +0 -0
  53. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_not_a_package.py +0 -0
  54. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_policy.py +0 -0
  55. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_prose.py +0 -0
  56. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_registries.py +0 -0
  57. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_regressions.py +0 -0
  58. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_report.py +0 -0
  59. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_review_findings.py +0 -0
  60. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_stated_sources.py +0 -0
  61. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_trusted_scopes.py +0 -0
  62. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_versions.py +0 -0
  63. {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_withdrawn.py +0 -0
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # repos:
4
4
  # - repo: https://github.com/M1rwana12/ghostpkg
5
- # rev: v0.24.0
5
+ # rev: v0.24.3
6
6
  # hooks:
7
7
  # - id: ghostpkg
8
8
  #
@@ -6,6 +6,21 @@ this project uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.24.3] - 2026-09-04
10
+
11
+ ### Fixed
12
+ - **The documented snippets pinned `@v0.24.0`, two releases behind.** Each
13
+ release script replaced the *previous* version string, so a snippet already
14
+ left on an older one was never touched again. The GitHub Marketplace listing
15
+ renders that snippet, so it told people to pin a version predating the fixes
16
+ it advertises.
17
+
18
+ Replacement is now by pattern rather than by exact previous string, and a
19
+ test fails if any documented pin disagrees with `__version__` -- with a
20
+ second test guarding against the patterns silently matching nothing.
21
+
22
+ 711 tests.
23
+
9
24
  ## [0.24.2] - 2026-09-04
10
25
 
11
26
  ### Changed
@@ -1015,7 +1030,8 @@ First release.
1015
1030
  - No corpus of hallucinated package names is shipped, following the decision of
1016
1031
  the USENIX'25 authors not to publish theirs.
1017
1032
 
1018
- [Unreleased]: https://github.com/M1rwana12/ghostpkg/compare/v0.24.2...HEAD
1033
+ [Unreleased]: https://github.com/M1rwana12/ghostpkg/compare/v0.24.3...HEAD
1034
+ [0.24.3]: https://github.com/M1rwana12/ghostpkg/releases/tag/v0.24.3
1019
1035
  [0.24.2]: https://github.com/M1rwana12/ghostpkg/releases/tag/v0.24.2
1020
1036
  [0.24.1]: https://github.com/M1rwana12/ghostpkg/releases/tag/v0.24.1
1021
1037
  [0.24.0]: https://github.com/M1rwana12/ghostpkg/releases/tag/v0.24.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: ghostpkg
3
- Version: 0.24.2
3
+ Version: 0.24.3
4
4
  Summary: Catch package names that do not exist before you install them
5
5
  Project-URL: Homepage, https://github.com/m1rwana12/ghostpkg
6
6
  Project-URL: Issues, https://github.com/m1rwana12/ghostpkg/issues
@@ -445,7 +445,7 @@ length, and only applies to packages young enough to plausibly be a squat.
445
445
  ### In CI
446
446
 
447
447
  ```yaml
448
- - uses: M1rwana12/ghostpkg@v0.24.0
448
+ - uses: M1rwana12/ghostpkg@v0.24.3
449
449
  ```
450
450
 
451
451
  That is the whole step. It searches the checkout, skips `node_modules` and
@@ -476,7 +476,7 @@ Or without the action, if you prefer:
476
476
  ```yaml
477
477
  repos:
478
478
  - repo: https://github.com/M1rwana12/ghostpkg
479
- rev: v0.24.0
479
+ rev: v0.24.3
480
480
  hooks:
481
481
  - id: ghostpkg
482
482
  ```
@@ -397,7 +397,7 @@ length, and only applies to packages young enough to plausibly be a squat.
397
397
  ### In CI
398
398
 
399
399
  ```yaml
400
- - uses: M1rwana12/ghostpkg@v0.24.0
400
+ - uses: M1rwana12/ghostpkg@v0.24.3
401
401
  ```
402
402
 
403
403
  That is the whole step. It searches the checkout, skips `node_modules` and
@@ -428,7 +428,7 @@ Or without the action, if you prefer:
428
428
  ```yaml
429
429
  repos:
430
430
  - repo: https://github.com/M1rwana12/ghostpkg
431
- rev: v0.24.0
431
+ rev: v0.24.3
432
432
  hooks:
433
433
  - id: ghostpkg
434
434
  ```
@@ -194,7 +194,7 @@ ghostpkg scan ../інший-проєкт
194
194
  ### У CI
195
195
 
196
196
  ```yaml
197
- - uses: M1rwana12/ghostpkg@v0.24.0
197
+ - uses: M1rwana12/ghostpkg@v0.24.3
198
198
  ```
199
199
 
200
200
  Це весь крок. Він шукає маніфести в чекауті, обходить `node_modules` і подібні
@@ -218,7 +218,7 @@ ghostpkg scan ../інший-проєкт
218
218
  ```yaml
219
219
  repos:
220
220
  - repo: https://github.com/M1rwana12/ghostpkg
221
- rev: v0.24.0
221
+ rev: v0.24.3
222
222
  hooks:
223
223
  - id: ghostpkg
224
224
  ```
@@ -1,6 +1,6 @@
1
1
  """ghostpkg -- catch package names that do not exist before you install them."""
2
2
 
3
- __version__ = "0.24.2"
3
+ __version__ = "0.24.3"
4
4
 
5
5
  from .assess import Finding, Verdict, assess
6
6
  from .registries import PackageFacts, RegistryError, fetch
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "ghostpkg"
7
- version = "0.24.2"
7
+ version = "0.24.3"
8
8
  description = "Catch package names that do not exist before you install them"
9
9
  readme = "README.en.md" # English page for PyPI; the repo main page is Ukrainian
10
10
  requires-python = ">=3.9"
@@ -189,3 +189,30 @@ class TestTheHookIsWellFormed:
189
189
  )
190
190
  def test_unrelated_files_are_not_matched(self, path):
191
191
  assert not re.search(hook()["files"], path)
192
+
193
+
194
+ class TestTheDocumentedVersionIsTheRealOne:
195
+ """Every release script replaced the *previous* version string, so a
196
+ snippet left on an older one was never touched again. `README.md` sat on
197
+ `@v0.24.0` through two releases, and the GitHub Marketplace renders that
198
+ snippet -- so the listing told people to pin a version that predates the
199
+ fixes it advertises."""
200
+
201
+ @pytest.mark.parametrize(
202
+ "path", ["README.md", "README.en.md", ".pre-commit-hooks.yaml"]
203
+ )
204
+ def test_every_pinned_version_matches_the_package(self, path):
205
+ from ghostpkg import __version__
206
+
207
+ text = read(ROOT / path)
208
+ pinned = set(re.findall(r"M1rwana12/ghostpkg@v([0-9.]+)", text))
209
+ pinned |= set(re.findall(r"rev: v([0-9.]+)", text))
210
+ assert pinned <= {__version__}, f"{path} pins {pinned}, package is {__version__}"
211
+
212
+ def test_at_least_one_snippet_is_pinned(self):
213
+ """A guard on the guard: if the patterns stop matching, the test above
214
+ passes for the wrong reason."""
215
+ from ghostpkg import __version__
216
+
217
+ text = read(ROOT / "README.en.md") + read(ROOT / "README.md")
218
+ assert f"M1rwana12/ghostpkg@v{__version__}" in text
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
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