Use `spack commands --format=bash` to generate shell completion (#14393)
This PR adds a `--format=bash` option to `spack commands` to
auto-generate the Bash programmable tab completion script. It can be
extended to work for other shells.
Progress:
- [x] Fix bug in superclass initialization in `ArgparseWriter`
- [x] Refactor `ArgparseWriter` (see below)
- [x] Ensure that output of old `--format` options remains the same
- [x] Add `ArgparseCompletionWriter` and `BashCompletionWriter`
- [x] Add `--aliases` option to add command aliases
- [x] Standardize positional argument names
- [x] Tests for `spack commands --format=bash` coverage
- [x] Tests to make sure `spack-completion.bash` stays up-to-date
- [x] Tests for `spack-completion.bash` coverage
- [x] Speed up `spack-completion.bash` by caching subroutine calls
This PR also necessitates a significant refactoring of
`ArgparseWriter`. Previously, `ArgparseWriter` was mostly a single
`_write` method which handled everything from extracting the information
we care about from the parser to formatting the output. Now, `_write`
only handles recursion, while the information extraction is split into a
separate `parse` method, and the formatting is handled by `format`. This
allows subclasses to completely redefine how the format will appear
without overriding all of `_write`.
Co-Authored-by:
Todd Gamblin <tgamblin@llnl.gov>
Showing
- .codecov.yml 0 additions, 1 deletion.codecov.yml
- .coveragerc 1 addition, 0 deletions.coveragerc
- lib/spack/llnl/util/argparsewriter.py 295 additions, 120 deletionslib/spack/llnl/util/argparsewriter.py
- lib/spack/spack/cmd/activate.py 2 additions, 5 deletionslib/spack/spack/cmd/activate.py
- lib/spack/spack/cmd/add.py 2 additions, 4 deletionslib/spack/spack/cmd/add.py
- lib/spack/spack/cmd/blame.py 4 additions, 4 deletionslib/spack/spack/cmd/blame.py
- lib/spack/spack/cmd/build_env.py 1 addition, 1 deletionlib/spack/spack/cmd/build_env.py
- lib/spack/spack/cmd/buildcache.py 13 additions, 19 deletionslib/spack/spack/cmd/buildcache.py
- lib/spack/spack/cmd/checksum.py 2 additions, 3 deletionslib/spack/spack/cmd/checksum.py
- lib/spack/spack/cmd/clean.py 2 additions, 5 deletionslib/spack/spack/cmd/clean.py
- lib/spack/spack/cmd/commands.py 108 additions, 17 deletionslib/spack/spack/cmd/commands.py
- lib/spack/spack/cmd/common/arguments.py 44 additions, 2 deletionslib/spack/spack/cmd/common/arguments.py
- lib/spack/spack/cmd/config.py 3 additions, 3 deletionslib/spack/spack/cmd/config.py
- lib/spack/spack/cmd/configure.py 5 additions, 8 deletionslib/spack/spack/cmd/configure.py
- lib/spack/spack/cmd/deactivate.py 2 additions, 4 deletionslib/spack/spack/cmd/deactivate.py
- lib/spack/spack/cmd/dependencies.py 1 addition, 4 deletionslib/spack/spack/cmd/dependencies.py
- lib/spack/spack/cmd/dependents.py 3 additions, 5 deletionslib/spack/spack/cmd/dependents.py
- lib/spack/spack/cmd/dev_build.py 2 additions, 5 deletionslib/spack/spack/cmd/dev_build.py
- lib/spack/spack/cmd/edit.py 2 additions, 3 deletionslib/spack/spack/cmd/edit.py
- lib/spack/spack/cmd/env.py 2 additions, 2 deletionslib/spack/spack/cmd/env.py
Loading
Please register or sign in to comment