Skip to main content

Fast Bash completion artifacts for import-heavy argparse and argcomplete CLIs.

Project description

argcomplete-snapshot

PyPI Coverage

What

Generate fast Bash completion artifacts for import-heavy Python CLIs built with argparse and argcomplete.

Why

Default argcomplete runs the target Python CLI on every completion request. For SDK-backed CLIs that means paying for:

  • Python startup
  • heavy imports
  • parser construction
  • completion logic

That can easily turn <TAB> into a 200-600+ ms operation.

How

argcomplete-snapshot extracts a lightweight completion model once and writes shell-native cache artifacts:

  • snapshot-v1.json
  • completion-v1.bash
  • version-stamp

Steady-state completion stays in Bash. Python only runs when:

  • artifacts are missing
  • the CLI changed after upgrade
  • a maintainer explicitly routes a dynamic resolver through a fallback command

Why Not Just Use Something Else?

  • argcomplete: good dynamic behavior, but slow because it starts Python on every completion
  • shtab: fast for static completion scripts, but not built around lazy self-refresh after pip install -U ... or explicit dynamic fallback contracts

This package is for the middle ground:

  • your CLI is too heavy for default argcomplete
  • you still need more lifecycle support than a pure static script

Requirements

  • Python 3.13+
  • Bash 4+

Bash 4+ is required because the generated runtime uses associative arrays.

Dynamic resolvers require an explicit fallback command. They are not inferred automatically.

Install

Install from PyPI:

pip install argcomplete-snapshot

Install benchmark extras from a checkout:

pip install ".[bench]"

Usage

1. Build a lightweight parser

import argparse

from argcomplete_snapshot import CompletionKind, set_completion


def build_parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser(prog="mycli")
    parser.add_argument("--output", choices=["json", "yaml", "text"])

    profile = parser.add_argument("--profile")
    set_completion(profile, resolver="config_profiles")

    path = parser.add_argument("--path")
    set_completion(path, kind=CompletionKind.FILE)

    return parser

2. Generate artifacts

acs-refresh refresh \
  --factory mypackage.cli:build_parser \
  --cli-name mycli \
  --distribution mycli

3. Print the activation snippet

acs-refresh print-activation \
  --factory mypackage.cli:build_parser \
  --cli-name mycli \
  --distribution mycli

4. Add dynamic fallback only when needed

acs-refresh print-activation \
  --factory mypackage.cli:build_parser \
  --cli-name mycli \
  --distribution mycli \
  --fallback-command "mycli --resolver-fallback"

Use fallback only for genuinely dynamic completions. Static options and choices should stay on the Bash hot path.

Cache Layout

~/.cache/argcomplete-snapshot/<cli-name>/
  snapshot-v1.json
  completion-v1.bash
  version-stamp

Benchmarks

Results:

Hot path:

Hot path comparison

Spawned shell:

Spawned shell comparison

Current published medians:

Case argcomplete snapshot shtab
Static hot path 491.10 ms 1.77 ms 23.46 ms
Static spawned shell 647.65 ms 165.43 ms 95.86 ms

Read those numbers carefully:

  • hot path is the relevant steady-state completion metric
  • spawned shell includes shell startup and sourcing overhead
  • dynamic fallback cases are slower because they intentionally call runtime logic

Benchmark environment for the published results:

  • macOS 26.3.1
  • MacBook Pro MacBookPro17,1
  • 8 CPU cores (4 performance + 4 efficiency)
  • 16 GB memory
  • Python 3.13.12 under uv
  • benchmark fixtures simulate heavy CLIs by importing requests and sleeping for 200 ms
  • benchmark strategy uses 5 spawned-shell samples and 15 hot-path samples per case and implementation

Run locally:

make benchmark

Development

pip install -e ".[dev,bench]"
make check
make benchmark

Status

Early release.

Implemented:

  • typed snapshot model
  • argparse extraction
  • Bash artifact emission
  • lazy cache refresh
  • activation snippet generation
  • explicit dynamic fallback contract
  • benchmark fixtures and comparisons

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

argcomplete_snapshot-0.1.0.tar.gz (306.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

argcomplete_snapshot-0.1.0-py3-none-any.whl (14.7 kB view details)

Uploaded Python 3

File details

Details for the file argcomplete_snapshot-0.1.0.tar.gz.

File metadata

  • Download URL: argcomplete_snapshot-0.1.0.tar.gz
  • Upload date:
  • Size: 306.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for argcomplete_snapshot-0.1.0.tar.gz
Algorithm Hash digest
SHA256 44a58b1150df4ce717661457fd3348f9d5105d80b0f01c883d5f8e4b35c8d60d
MD5 969115eaf47272a4cc76b78da376bc20
BLAKE2b-256 516d0ef9e24405dcb988153ee436cd0ac062d8fef687207838accc49a13fb202

See more details on using hashes here.

Provenance

The following attestation bundles were made for argcomplete_snapshot-0.1.0.tar.gz:

Publisher: publish.yaml on zelnkup/argcomplete-snapshot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file argcomplete_snapshot-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for argcomplete_snapshot-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 15dd60407fbdcf45c6a6140f4e53f802c9d850ef692816cc831e960461c7efbf
MD5 de5dc91f14bbda4b302130986c7dab2d
BLAKE2b-256 b35209ca88e6d0549e4d6b5fc4a395d76f3454ff86ca0351157f9b23c4b652d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for argcomplete_snapshot-0.1.0-py3-none-any.whl:

Publisher: publish.yaml on zelnkup/argcomplete-snapshot

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page