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.
- pipseek-2.1.0/.github/workflows/ci.yml +24 -0
- pipseek-2.1.0/.github/workflows/index.yml +49 -0
- pipseek-2.1.0/.github/workflows/release.yml +66 -0
- pipseek-2.1.0/.gitignore +80 -0
- pipseek-2.1.0/CHANGELOG.md +50 -0
- pipseek-2.1.0/LICENSE +674 -0
- pipseek-2.1.0/PKG-INFO +324 -0
- pipseek-2.1.0/README.md +295 -0
- pipseek-2.1.0/assets/banner.png +0 -0
- pipseek-2.1.0/assets/demo.gif +0 -0
- pipseek-2.1.0/assets/how-it-works.svg +79 -0
- pipseek-2.1.0/assets/screenshots/cli-info-vulns.png +0 -0
- pipseek-2.1.0/assets/screenshots/cli-info.png +0 -0
- pipseek-2.1.0/assets/screenshots/cli-json.png +0 -0
- pipseek-2.1.0/assets/screenshots/cli-outdated.png +0 -0
- pipseek-2.1.0/assets/screenshots/cli-plain.png +0 -0
- pipseek-2.1.0/assets/screenshots/tui-details.png +0 -0
- pipseek-2.1.0/assets/screenshots/tui-search.png +0 -0
- pipseek-2.1.0/assets/screenshots/tui-sorted.png +0 -0
- pipseek-2.1.0/assets/screenshots/tui-typo.png +0 -0
- pipseek-2.1.0/assets/screenshots/tui-vulns.png +0 -0
- pipseek-2.1.0/pyproject.toml +58 -0
- pipseek-2.1.0/src/pipseek/__init__.py +3 -0
- pipseek-2.1.0/src/pipseek/__main__.py +4 -0
- pipseek-2.1.0/src/pipseek/build_index.py +240 -0
- pipseek-2.1.0/src/pipseek/cache.py +80 -0
- pipseek-2.1.0/src/pipseek/cli.py +217 -0
- pipseek-2.1.0/src/pipseek/data/popular.tsv.gz +0 -0
- pipseek-2.1.0/src/pipseek/env.py +116 -0
- pipseek-2.1.0/src/pipseek/index.py +440 -0
- pipseek-2.1.0/src/pipseek/outdated.py +101 -0
- pipseek-2.1.0/src/pipseek/pypi.py +279 -0
- pipseek-2.1.0/src/pipseek/render.py +222 -0
- pipseek-2.1.0/src/pipseek/search.py +91 -0
- pipseek-2.1.0/src/pipseek/tui.py +273 -0
- pipseek-2.1.0/src/pipseek/vulns.py +140 -0
- 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
|
pipseek-2.1.0/.gitignore
ADDED
|
@@ -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.
|