jartify
jartify is a small toolkit for querying a JFrog Artifactory instance
from a terminal. It exposes two entry points:
| Command | Purpose |
|---|---|
jartify |
One-shot CLI: find a file, print version / filename / sha256 |
jartify-tui |
Textual TUI for interactive searching |
jartify-setup |
Interactive first-run: writes exports to .zshrc/.bashrc |
jartify-repos |
List visible repositories (filter by type / package type) |
jartify-locate |
Offline SQLite index + glob / fuzzy / substring search |
Both share the same ~/.local/etc/jartify/config.yaml and
$ARTIFACTORY_TOKEN env var (name is configurable).
Install
pip install jartify
Configure
Quickest: jartify-setup
jartify-setup
Prompts for URL, username, token (hidden), and the repository filter,
then writes a managed export block to your .zshrc or .bashrc:
# >>> jartify setup >>>
export ARTIFACTORY_URL="..."
export ARTIFACTORY_USER="..."
export ARTIFACTORY_TOKEN="..."
export ARTIFACTORY_REPOSITORIES="all"
# <<< jartify setup <<<
ARTIFACTORY_REPOSITORIES accepts three shapes:
| Value | Meaning |
|---|---|
all (any case) |
No filter — search every visible repo |
pypi-local,pypi-releases |
Comma-separated list |
["pypi-local","pypi-releases"] |
JSON array (handy for CI env files) |
The legacy singular ARTIFACTORY_REPOSITORY is still read as a
fallback with the same semantics.
Re-running updates the block in place (no duplicates). The rc file is
chmod'd to 600 since it now contains a token. Reload with
source ~/.zshrc (or open a new terminal).
Alternative: config file
Env vars take precedence, but ~/.local/etc/jartify/config.yaml works
too:
artifactory:
url: https://artifactory.example.com
repos: "" # optional comma-separated allowlist
authentication:
token_env: ARTIFACTORY_TOKEN # name of env var holding your token
# username: your.name # uncomment for basic auth instead of bearer
CLI usage
# Find all requests wheels and print version / filename / sha256:
jartify 'requests-*.whl'
# Restrict to specific repos (-R is a short alias):
jartify 'myapp-*.tar.gz' -R pypi-local -R pypi-releases
# Machine-readable output:
jartify 'myapp-*.whl' --json
Output:
VERSION FILENAME SHA256
------- ------------------------------------- ----------------------------------------------------------------
2.31.0 requests-2.31.0-py3-none-any.whl 4c491f82b8a8b4...
2.32.3 requests-2.32.3-py3-none-any.whl 70761cfe03c773...
Exit codes: 0 on at least one hit, 1 on no hits, 2 on config / auth errors.
jartify-locate (offline index)
For big Artifactory instances where you want fast, repeated searches without re-hitting the server:
# One-time (or periodic) scan via AQL — stores sha256 for every file.
jartify-locate --init
# Then search locally:
jartify-locate '*.json' # glob
jartify-locate requests # substring (no wildcards)
jartify-locate --fuzzy foojsn # subsequence match
jartify-locate --init -R pypi-local # refresh just one repo
jartify-locate --db # show index path + row count + last init
The index is stored at $XDG_DATA_HOME/jartify/locate.db
(defaults to ~/.local/share/jartify/locate.db). --init uses one
AQL request; some Artifactory instances restrict AQL to admins — if
you get a 403 on --init, that's why.
TUI usage
jartify-tui
Keys:
- Type a pattern → Enter runs the search.
- Ctrl+R focuses the Repo field. Comma-separate names to search multiple repos; leave blank to search all. Enter in the Repo field re-runs the last search with the new filter.
- Ctrl+F jumps back to the Search field.
- r repeats the last search, y copies the highlighted row's sha256, q quits.
Releasing
One-time: register the PyPI trusted publisher
PyPI has no API for this — the form is behind your login + 2FA. The helper script opens the right page and prints the values to type:
python scripts/register-pypi-publisher.py
It reads the project name from pyproject.toml and the GitLab
namespace/repo from git remote get-url origin, so there's nothing to
look up. In PyPI's "Add a new pending publisher" form, pick the GitLab
tab and paste the printed values.
Each release
Push to main with a bumped version in pyproject.toml. GitLab CI
runs python -m build, mints a short-lived PyPI token via OIDC
trusted publishing, and uploads with twine upload --skip-existing.
Pushes that do not bump the version are no-ops.
Metadata
Release files for jartify 0.1.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| jartify-0.1.9.tar.gz | 19.6 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jartify-0.1.9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 41.1 kB
Release files / jartify-0.1.9.tar.gz
| Download URL | jartify-0.1.9.tar.gz |
|---|---|
| Size | 19.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2859a54a293dbdaa88770cb0c5d0aa28c37011cfc734672187005755e4329297
|
|
BLAKE2b-256 checksum How to use checksums |
8fb043b27b1c3a4eec7d7b98dc8dce3d21123e1cd171fa54643bea24a5d3c6b3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Release files / jartify-0.1.9-py3-none-any.whl
| Download URL | jartify-0.1.9-py3-none-any.whl |
|---|---|
| Size | 21.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d07957d86f6dfadd8fba00cbe8c0296d4511862598293ba88c51e1d5314b38b8
|
|
BLAKE2b-256 checksum How to use checksums |
4acc5096c9d5b7947195a0cdc8fb0779965e09c5eeb86625d1b860c5e213ef53
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.12.15
|
Security for jartify 0.1.9
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.