Skip to main content

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
jartify-reset Delete the jartify-locate index (asks for confirmation)

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

# Same, but with a live progress bar (paginated AQL, 5000/page):
jartify-locate --init --status=progress

# Then search locally:
jartify-locate                       # list everything (respects --repo / --limit)
jartify-locate '*.json'              # glob
jartify-locate requests              # substring (no wildcards)
jartify-locate --fuzzy foojsn        # subsequence match
jartify-locate -R pypi-local         # all files in one repo
jartify-locate --init -R pypi-local  # refresh just one repo
jartify-locate --init --all          # scan every repo, ignoring env/config
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.13

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for jartify 0.1.13
File Size Uploaded Provenance
jartify-0.1.13.tar.gz 21.4 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for jartify 0.1.13
File Interpreter ABI Platform
jartify-0.1.13-py3-none-any.whl Python 3 none any Details

Total release size: 45.0 kB

Release files / jartify-0.1.13.tar.gz

Download URL jartify-0.1.13.tar.gz
Size 21.4 kB
Tags Source
SHA-256 checksum
How to use checksums
ce01dddeafe62f073585230ab3648d172932937e2448163c6fa0ed09a8cc7f30
BLAKE2b-256 checksum
How to use checksums
b1e538239ae13ce72e0e317fd170c676e8afa609221879becec645481142b4b8
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.13-py3-none-any.whl

Download URL jartify-0.1.13-py3-none-any.whl
Size 23.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
12f3259ee2583f7e6c6e5298dd206a866100a4921fa6e754e0aedf0a12fc4804
BLAKE2b-256 checksum
How to use checksums
0adc1493daa264a4bbbb583fc726b36ae3511314881137662a891bcc598b7404
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.13

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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page