pipseek 2.1.0__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 (37) hide show
  1. pipseek-2.1.0/.github/workflows/ci.yml +24 -0
  2. pipseek-2.1.0/.github/workflows/index.yml +49 -0
  3. pipseek-2.1.0/.github/workflows/release.yml +66 -0
  4. pipseek-2.1.0/.gitignore +80 -0
  5. pipseek-2.1.0/CHANGELOG.md +50 -0
  6. pipseek-2.1.0/LICENSE +674 -0
  7. pipseek-2.1.0/PKG-INFO +324 -0
  8. pipseek-2.1.0/README.md +295 -0
  9. pipseek-2.1.0/assets/banner.png +0 -0
  10. pipseek-2.1.0/assets/demo.gif +0 -0
  11. pipseek-2.1.0/assets/how-it-works.svg +79 -0
  12. pipseek-2.1.0/assets/screenshots/cli-info-vulns.png +0 -0
  13. pipseek-2.1.0/assets/screenshots/cli-info.png +0 -0
  14. pipseek-2.1.0/assets/screenshots/cli-json.png +0 -0
  15. pipseek-2.1.0/assets/screenshots/cli-outdated.png +0 -0
  16. pipseek-2.1.0/assets/screenshots/cli-plain.png +0 -0
  17. pipseek-2.1.0/assets/screenshots/tui-details.png +0 -0
  18. pipseek-2.1.0/assets/screenshots/tui-search.png +0 -0
  19. pipseek-2.1.0/assets/screenshots/tui-sorted.png +0 -0
  20. pipseek-2.1.0/assets/screenshots/tui-typo.png +0 -0
  21. pipseek-2.1.0/assets/screenshots/tui-vulns.png +0 -0
  22. pipseek-2.1.0/pyproject.toml +58 -0
  23. pipseek-2.1.0/src/pipseek/__init__.py +3 -0
  24. pipseek-2.1.0/src/pipseek/__main__.py +4 -0
  25. pipseek-2.1.0/src/pipseek/build_index.py +240 -0
  26. pipseek-2.1.0/src/pipseek/cache.py +80 -0
  27. pipseek-2.1.0/src/pipseek/cli.py +217 -0
  28. pipseek-2.1.0/src/pipseek/data/popular.tsv.gz +0 -0
  29. pipseek-2.1.0/src/pipseek/env.py +116 -0
  30. pipseek-2.1.0/src/pipseek/index.py +440 -0
  31. pipseek-2.1.0/src/pipseek/outdated.py +101 -0
  32. pipseek-2.1.0/src/pipseek/pypi.py +279 -0
  33. pipseek-2.1.0/src/pipseek/render.py +222 -0
  34. pipseek-2.1.0/src/pipseek/search.py +91 -0
  35. pipseek-2.1.0/src/pipseek/tui.py +273 -0
  36. pipseek-2.1.0/src/pipseek/vulns.py +140 -0
  37. pipseek-2.1.0/tests/test_pipseek.py +353 -0
@@ -0,0 +1,24 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+
8
+ jobs:
9
+ test:
10
+ runs-on: ${{ matrix.os }}
11
+ strategy:
12
+ fail-fast: false
13
+ matrix:
14
+ os: [ubuntu-latest, macos-latest, windows-latest]
15
+ python: ["3.9", "3.13"]
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: ${{ matrix.python }}
21
+ - run: python -m pip install -e ".[dev]"
22
+ - run: ruff check src tests
23
+ - run: pytest -q
24
+ - run: pipseek --version
@@ -0,0 +1,49 @@
1
+ name: Search index
2
+
3
+ # Rebuilds the full PyPI search index (names, summaries, keywords) and publishes it as the
4
+ # `pypi-index.tsv.gz` asset on the `index` release, which pipseek clients download.
5
+ # Incremental: only projects that changed since the last run are re-fetched.
6
+
7
+ on:
8
+ schedule:
9
+ - cron: "17 6 * * *"
10
+ workflow_dispatch:
11
+
12
+ permissions:
13
+ contents: write
14
+
15
+ concurrency:
16
+ group: search-index
17
+ cancel-in-progress: false
18
+
19
+ jobs:
20
+ build:
21
+ runs-on: ubuntu-latest
22
+ timeout-minutes: 340
23
+ env:
24
+ GH_TOKEN: ${{ github.token }}
25
+ steps:
26
+ - uses: actions/checkout@v4
27
+ - uses: actions/setup-python@v5
28
+ with:
29
+ python-version: "3.13"
30
+ - run: python -m pip install -e .
31
+
32
+ - name: Download previous index
33
+ run: |
34
+ gh release download index --pattern pypi-index.tsv.gz --dir prev || echo "No previous index"
35
+ ls -la prev || true
36
+
37
+ - name: Build index
38
+ run: |
39
+ PREV=""
40
+ if [ -f prev/pypi-index.tsv.gz ]; then PREV="--previous prev/pypi-index.tsv.gz"; fi
41
+ python -m pipseek.build_index $PREV --out pypi-index.tsv.gz --time-budget 18000 --concurrency 32
42
+
43
+ - name: Publish
44
+ run: |
45
+ if ! gh release view index >/dev/null 2>&1; then
46
+ gh release create index --title "Search index" --latest=false \
47
+ --notes "Prebuilt PyPI search index used by pipseek. Updated daily by the Search index workflow."
48
+ fi
49
+ gh release upload index pypi-index.tsv.gz --clobber
@@ -0,0 +1,66 @@
1
+ name: Release
2
+
3
+ # Push a tag like v2.1.0 to publish that version to PyPI and create a GitHub release.
4
+ # PyPI uses Trusted Publishing (OIDC), so no API token is stored in this repo.
5
+
6
+ on:
7
+ push:
8
+ tags: ["v*"]
9
+
10
+ permissions:
11
+ contents: read
12
+
13
+ jobs:
14
+ build:
15
+ runs-on: ubuntu-latest
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+ - uses: actions/setup-python@v5
19
+ with:
20
+ python-version: "3.13"
21
+ - name: Check the tag matches the package version
22
+ run: |
23
+ VERSION=$(python -c "import re;print(re.search(r'__version__ = \"(.+?)\"', open('src/pipseek/__init__.py').read()).group(1))")
24
+ test "v$VERSION" = "$GITHUB_REF_NAME" || { echo "Tag $GITHUB_REF_NAME does not match version $VERSION"; exit 1; }
25
+ - run: python -m pip install build twine
26
+ - run: python -m build
27
+ - run: python -m twine check --strict dist/*
28
+ - uses: actions/upload-artifact@v4
29
+ with:
30
+ name: dist
31
+ path: dist/
32
+
33
+ pypi:
34
+ needs: build
35
+ runs-on: ubuntu-latest
36
+ environment:
37
+ name: pypi
38
+ url: https://pypi.org/project/pipseek/
39
+ permissions:
40
+ id-token: write
41
+ steps:
42
+ - uses: actions/download-artifact@v4
43
+ with:
44
+ name: dist
45
+ path: dist/
46
+ - uses: pypa/gh-action-pypi-publish@release/v1
47
+
48
+ github-release:
49
+ needs: pypi
50
+ runs-on: ubuntu-latest
51
+ permissions:
52
+ contents: write
53
+ env:
54
+ GH_TOKEN: ${{ github.token }}
55
+ steps:
56
+ - uses: actions/checkout@v4
57
+ - uses: actions/download-artifact@v4
58
+ with:
59
+ name: dist
60
+ path: dist/
61
+ - name: Release notes from CHANGELOG.md
62
+ run: |
63
+ VERSION="${GITHUB_REF_NAME#v}"
64
+ awk -v v="## $VERSION" '$0 ~ "^"v {on=1; next} on && /^## / {exit} on' CHANGELOG.md > notes.md
65
+ cat notes.md
66
+ - run: gh release create "$GITHUB_REF_NAME" dist/* --title "pipseek $GITHUB_REF_NAME" --notes-file notes.md --verify-tag
@@ -0,0 +1,80 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ env/
8
+ build/
9
+ develop-eggs/
10
+ dist/
11
+ downloads/
12
+ eggs/
13
+ .eggs/
14
+ lib/
15
+ lib64/
16
+ parts/
17
+ sdist/
18
+ var/
19
+ wheels/
20
+ *.egg-info/
21
+ .installed.cfg
22
+ *.egg
23
+
24
+ # Nuitka build files
25
+ *.build/
26
+ *.dist/
27
+ *.onefile-build/
28
+ *.cmd
29
+ pipseek.bin
30
+ pipseek.exe
31
+ pipseek-linux
32
+ pipseek-windows.exe
33
+ pipseek-macos
34
+
35
+ # Virtual Environment
36
+ venv/
37
+ ENV/
38
+ env/
39
+ .env/
40
+ .venv/
41
+
42
+ # IDE
43
+ .idea/
44
+ .vscode/
45
+ *.swp
46
+ *.swo
47
+ *~
48
+
49
+ # Build and Release Scripts
50
+ setup.sh
51
+ release.sh
52
+
53
+ # OS specific
54
+ .DS_Store
55
+ .DS_Store?
56
+ ._*
57
+ .Spotlight-V100
58
+ .Trashes
59
+ ehthumbs.db
60
+ Thumbs.db
61
+
62
+ # Logs
63
+ *.log
64
+ pip-log.txt
65
+ pip-delete-this-directory.txt
66
+
67
+ # Unit test / coverage reports
68
+ htmlcov/
69
+ .tox/
70
+ .coverage
71
+ .coverage.*
72
+ .cache
73
+ nosetests.xml
74
+ coverage.xml
75
+ *.cover
76
+ .hypothesis/
77
+
78
+ # Tooling caches
79
+ .pytest_cache/
80
+ .ruff_cache/
@@ -0,0 +1,50 @@
1
+ # Changelog
2
+
3
+ ## 2.1.0 (2026-11)
4
+
5
+ ### Security
6
+
7
+ - Known vulnerabilities from OSV.dev (free, no key) for the latest version and for the version you have installed: severity, CVE and the version that fixes each one. Duplicate advisories (GHSA, PYSEC and CVE ids for the same problem) are merged.
8
+ - A red badge in the detail pane and a flag in the results when your installed version is affected.
9
+ - `pipseek --outdated` checks your whole environment for outdated and vulnerable packages, worst first, and ends with the upgrade command (vulnerable packages first when the list is long). `--all` lists every package, `--json` gives structured output, and `--strict` exits with status 1 when something installed is vulnerable, for CI.
10
+ - On an OS-managed ("externally managed") system Python, pipseek no longer suggests `pip install` commands or installs with the `i` key.
11
+
12
+ ### Other
13
+
14
+ - Fix versions prefer final releases over release candidates.
15
+ - Releases are published to PyPI from GitHub Actions with Trusted Publishing, so no API token is stored anywhere.
16
+ - The README now uses absolute image links, so it renders on PyPI too.
17
+
18
+ ## 2.0.0 (2026-11)
19
+
20
+ A ground-up rewrite. Written with AI coding agents (Claude), directed, reviewed and tested by [OhMyBahGosh](https://github.com/ohmybahgosh).
21
+
22
+ ### Search
23
+
24
+ - Replaced scraping of `pypi.org/search` with a self-hosted search index built from PyPI's official Simple and JSON APIs. v1 got past PyPI's bot challenge to scrape the search page; v2 doesn't touch that page at all, so it can't break when the challenge changes.
25
+ - Searches project summaries and keywords, not just names, through a local SQLite FTS5 database.
26
+ - Ranking blends name matches, BM25 relevance and 30-day download counts. Tuned against the full index of about 930,000 projects so that empty placeholder packages named after a search term no longer outrank Django or tqdm.
27
+ - "Did you mean?" suggestions for typos.
28
+ - A daily GitHub Action rebuilds the index incrementally, re-fetching only projects whose PyPI serial changed, and publishes it on the `index` release.
29
+ - Summaries for the 15,000 most popular projects ship inside the package as a fallback. When pipseek only has the fallback, it tries for the full index again every day instead of every week.
30
+
31
+ ### Interface
32
+
33
+ - New Textual TUI: search box, results list, a detail pane that follows the cursor, five sort orders, paging, clipboard copy, browser shortcuts and one-key install or upgrade.
34
+ - `--plain`, `--json` and `--info` modes for scripts. Piped output switches to plain mode automatically.
35
+ - Installed and update-available badges for your active environment, even when pipseek itself runs from pipx or uv.
36
+
37
+ ### Data
38
+
39
+ - Stars, forks, open issues and the OpenSSF Scorecard come from deps.dev, which needs no API key and covers GitHub, GitLab and Bitbucket. This replaced the GitHub API and its 60-requests-an-hour limit; `GITHUB_TOKEN` is no longer used. `--no-github` is now `--no-stats` (the old name still works).
40
+ - Release dates, authors and licenses now handle the many ways packages fill in (or leave out) their metadata.
41
+
42
+ ### Packaging and quality
43
+
44
+ - Installable with pipx, uv or pip, with a real `pipseek` command, replacing the loose `pipseek.py` script.
45
+ - pytest suite and ruff linting, run in CI on Linux, macOS and Windows with Python 3.9 and 3.13.
46
+ - Fixed before release: the plain-table mode crashed on start after an option was renamed. Caught by running it on a real desktop, and now covered by a test.
47
+
48
+ ## 1.0.0 (2025)
49
+
50
+ - The original single-file script: scraped PyPI's search page (solving its proof-of-work challenge, based on [work by Long0x0](https://github.com/victorgarric/pip_search/issues/44#issuecomment-2565442916)) and showed results in a Textual app.