Repository navigation
(2 of 4) Add Tree: a read-only view of CLI's commands (if accepted, must be stack-merged onto #175) - #173
Open
kigster wants to merge 6 commits into
Open
(2 of 4) Add Tree: a read-only view of CLI's commands (if accepted, must be stack-merged onto #175)#173kigster wants to merge 6 commits into
kigster wants to merge 6 commits into
Conversation
Dry::CLI#call and Command.new take `kernel:`, defaulting to Kernel. Help, errors and typos stop the CLI by raising a private Halt, which #call turns into kernel.exit, so a kernel whose exit returns (as Aruba's does) still stops the CLI. A command's own `exit` goes through its kernel too. Dry::CLI::Launcher[registry] runs a CLI with the arguments, streams and kernel in the order Aruba's in-process launcher passes them, so a CLI can be tested in the same process with StringIO streams.
Registry#tree, Dry::CLI#tree and Dry::CLI::Tree.for return a live view of the registered commands, for gems that describe a CLI rather than run it: help screens, shell completion, documentation generators. Until now they could only walk CommandRegistry internals. Tree::Node#resolve shares its lookup with dispatch (CommandRegistry.lookup), so the command it finds is the one the CLI would run. Tree::Param is a frozen snapshot of an option or argument, including every declared key.
One expectation per example, no local variables, described_class for the type under test.
metadata, desc, default and aliases shared their arrays, hashes and strings with the Option declaration, so appending to metadata[:aliases] added a live switch to the CLI. Each is now a frozen copy.
tmp, args, i and numbered block parameters become child, arguments, index and named parameters. CommandRegistry.lookup also folds its two not-found branches into one; behavior is unchanged.
kigster:kig/auto-inject-compatibility
kigster:kig/auto-inject-compatibilitykigster:kig/auto-inject-compatibility
kigster:kig/auto-inject-compatibilitykigster:kig/auto-inject-compatibility)
kigster:kig/auto-inject-compatibility)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Proposal 2 of 4 in the dry-cli extension hooks series. This should stack on top of #175. As mentioned, I couldn't select a branch on a fork as the base, but perhaps the owners can.
Summary
A public, read-only, live view of the commands, replacing the
CommandRegistry/LookupResult/Nodeinternals that help completion gems walk today.Live: reads go to the registry, so commands and options added after
treewas taken are visible (needed for dynamic completion).Param#metadatacarries every declared key, so extensions read their own (i.e.,file: true).CommandRegistry,Option,Argumentstay@api private.Evidence
Before: dry-cli-autocomplete:
registry.get(path).children.reject { _2.hidden }; dry-cli-help:node.parent.aliases.filter_map { … }.After:
tree.walk(hidden: false)andnode.aliases.spec/unit/dry/cli/tree_spec.rb: 30 examples, including resolve-vs-dispatch parity over 10 command lines and liveness. Full suite 661 examples, 0 failures; rubocop clean.Merge Risk
Additive;
CommandRegistry#getis refactored but behaves identically (whole suite unchanged).Blast Radius
Believed to be small.
If merged, what changes in the futue:
Tree) that dry-cli would need to commit to keeping stable.