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.
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.pre-commit-hooks.yaml +1 -1
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/CHANGELOG.md +17 -1
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/PKG-INFO +3 -3
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/README.en.md +2 -2
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/README.md +2 -2
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/__init__.py +1 -1
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/pyproject.toml +1 -1
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_action.py +27 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/ISSUE_TEMPLATE/false-positive.yml +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/ISSUE_TEMPLATE/missed-package.yml +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/ghostpkg-ignore.json +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/workflows/ci.yml +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/workflows/field.yml +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.github/workflows/publish.yml +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/.gitignore +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/2.0 +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/CONTRIBUTING.md +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/LICENSE +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/SECURITY.md +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/action.yml +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/assets/banner.html +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/assets/banner.png +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/assets/demo.gif +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/assets/make_demo.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/__main__.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/assess.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/cache.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/cli.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/data.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/discover.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/inspection.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/jslocks.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/manifests.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/policy.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/prose.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/registries.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/report.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/rules.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/ghostpkg/scanner.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/scripts/fieldtest.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_assess.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_cache.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_discover.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_field_findings.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_hostile_input.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_inspection.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_jslocks.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_lockfiles.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_manifests.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_mutation_gaps.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_not_a_package.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_policy.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_prose.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_registries.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_regressions.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_report.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_review_findings.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_stated_sources.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_trusted_scopes.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_versions.py +0 -0
- {ghostpkg-0.24.2 → ghostpkg-0.24.3}/tests/test_withdrawn.py +0 -0
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
221
|
+
rev: v0.24.3
|
|
222
222
|
hooks:
|
|
223
223
|
- id: ghostpkg
|
|
224
224
|
```
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "ghostpkg"
|
|
7
|
-
version = "0.24.
|
|
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
|
|
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
|
|
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
|