tabry 0.2.6 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/tabry-generate-bash-complete +2 -3
- data/bin/tabry-generate-fish-complete +2 -3
- data/lib/tabry/cli/all_in_one.rb +16 -13
- data/lib/tabry/cli/arg_proxy.rb +1 -1
- data/lib/tabry/cli/builder.rb +2 -0
- data/lib/tabry/cli/util.rb +1 -1
- data/lib/tabry/config_builder/top_level_builder.rb +1 -0
- data/lib/tabry/config_loader.rb +2 -2
- data/lib/tabry/models/config_list.rb +5 -0
- data/lib/tabry/models/config_object.rb +17 -0
- data/lib/tabry/models/config_string_hash.rb +5 -0
- data/lib/tabry/models/include_arg.rb +3 -1
- data/lib/tabry/models/subs_list.rb +0 -1
- data/lib/tabry/options_finder.rb +38 -10
- data/lib/tabry/replty/builder.rb +1 -1
- data/lib/tabry/result.rb +18 -2
- data/lib/tabry/runner.rb +6 -1
- data/lib/tabry/shells/bash.rb +2 -2
- data/lib/tabry/shells/fish/wrapper.rb +4 -6
- data/lib/tabry/shells/fish.rb +4 -4
- data/lib/tabry/version.rb +3 -1
- data/spec/fixtures/vehicles.tabry +1 -1
- data/spec/fixtures/vehicles.yaml +1 -1
- data/spec/tabry/cli/all_in_one_spec.rb +7 -0
- data/spec/tabry/config_builder_spec.rb +5 -1
- data/spec/tabry/machine_spec.rb +1 -1
- data/spec/tabry/models/config_spec.rb +6 -0
- data/spec/tabry/models/dir_option_spec.rb +1 -1
- data/spec/tabry/models/file_option_spec.rb +1 -1
- data/spec/tabry/models/shell_option_spec.rb +1 -1
- data/spec/tabry/options_finder_spec.rb +5 -0
- data/spec/tabry/replty/builder_spec.rb +7 -5
- data/spec/tabry/runner_spec.rb +3 -1
- data/spec/tabry/shells/bash_spec.rb +4 -3
- data/tabry.gemspec +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb391cd439ebe097e13df65ff4a99f2911abd2d53b9c81e8283b8d5af94282b9
|
4
|
+
data.tar.gz: ed3bc83d0f19fa9efee82a7cc6ec5cbd37fd34f602cb9915b78fbeeb0e0ddea9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee6f71b46c334b5c2a50ed46c9d6a2930d9b39d3d9dac42ed158ba5b1f94a3b850d485794169e1794f72d54333813b1f10b6d816a557c36d8830ec126524ff74
|
7
|
+
data.tar.gz: fa871318216d9258fc5a9dcbe62ee9b7a9e52922cde2986a6d493025b721753b0b452b8f58ac5157925bfebcddee009289904c676a53ed6d00e2d6b6f4addf98
|
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require_relative "../lib/tabry/cli/all_in_one"
|
4
5
|
require_relative "../lib/tabry/shells/bash"
|
@@ -23,9 +24,7 @@ Tabry::CLI::AllInOne.run do
|
|
23
24
|
puts Tabry::Shells::Bash.generate(
|
24
25
|
args.command_name,
|
25
26
|
args.tabry_json_path,
|
26
|
-
uniq_fn_id: flags.uniq_fn_id
|
27
|
+
uniq_fn_id: flags.uniq_fn_id
|
27
28
|
)
|
28
29
|
end
|
29
30
|
end
|
30
|
-
|
31
|
-
|
@@ -1,4 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require_relative "../lib/tabry/cli/all_in_one"
|
4
5
|
require_relative "../lib/tabry/shells/fish"
|
@@ -23,9 +24,7 @@ Tabry::CLI::AllInOne.run do
|
|
23
24
|
puts Tabry::Shells::Fish.generate(
|
24
25
|
args.command_name,
|
25
26
|
args.tabry_json_path,
|
26
|
-
uniq_fn_id: flags.uniq_fn_id
|
27
|
+
uniq_fn_id: flags.uniq_fn_id
|
27
28
|
)
|
28
29
|
end
|
29
30
|
end
|
30
|
-
|
31
|
-
|
data/lib/tabry/cli/all_in_one.rb
CHANGED
@@ -45,6 +45,11 @@ module Tabry
|
|
45
45
|
|
46
46
|
def self.define_completion_methods(cli_class, config, cmd_name: nil)
|
47
47
|
cli_class.module_eval do
|
48
|
+
define_method :completion__json do
|
49
|
+
require "json"
|
50
|
+
# Result is flattened/includes squashed (ConfigList#to_a I think calls flatten), so remove the includes
|
51
|
+
puts config.as_json.except(:arg_includes, :option_includes).to_json
|
52
|
+
end
|
48
53
|
|
49
54
|
define_method :completion__bash do
|
50
55
|
require_relative "../shells/bash"
|
@@ -88,18 +93,16 @@ module Tabry
|
|
88
93
|
|
89
94
|
# If we recognize command is going to be a completion command, fast track and
|
90
95
|
# run completion now
|
91
|
-
if run_completion
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
Tabry::Bash::Wrapper.run(ARGV[1], ARGV[2], config: config)
|
100
|
-
end
|
101
|
-
exit
|
96
|
+
if run_completion && (ARGV.first == "completion")
|
97
|
+
fish_mode = ENV.fetch("TABRY_FISH_MODE", false)
|
98
|
+
if fish_mode
|
99
|
+
require_relative "../shells/fish/wrapper"
|
100
|
+
Tabry::Fish::Wrapper.run(ARGV[1], ARGV[2], config: config)
|
101
|
+
else
|
102
|
+
require_relative "../shells/bash/wrapper"
|
103
|
+
Tabry::Bash::Wrapper.run(ARGV[1], ARGV[2], config: config)
|
102
104
|
end
|
105
|
+
exit
|
103
106
|
end
|
104
107
|
|
105
108
|
# If we recognize there is a "completion" subcommand, add completion
|
@@ -111,8 +114,8 @@ module Tabry
|
|
111
114
|
Tabry::CLI::Builder.new(config, cli)
|
112
115
|
end
|
113
116
|
|
114
|
-
def self.run(
|
115
|
-
build(
|
117
|
+
def self.run(...)
|
118
|
+
build(...).run(ARGV)
|
116
119
|
end
|
117
120
|
end
|
118
121
|
end
|
data/lib/tabry/cli/arg_proxy.rb
CHANGED
data/lib/tabry/cli/builder.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require_relative "../runner"
|
4
4
|
require_relative "../util"
|
5
5
|
require_relative "internals"
|
6
|
+
require_relative "base"
|
6
7
|
|
7
8
|
# Responsible for building the CLI object, making a Runner to parse the
|
8
9
|
# arguments, and running the proper action method of the CLI object.
|
@@ -56,6 +57,7 @@ module Tabry
|
|
56
57
|
|
57
58
|
def instantiate_cli(klass, internals)
|
58
59
|
return klass unless klass.is_a?(Class)
|
60
|
+
raise "CLI class must inherit from Tabry::CLI::Base" unless klass < Tabry::CLI::Base
|
59
61
|
|
60
62
|
state = internals.state
|
61
63
|
klass.new(state.flags, state.args, internals.result.named_args, internals)
|
data/lib/tabry/cli/util.rb
CHANGED
@@ -23,6 +23,7 @@ module Tabry
|
|
23
23
|
def completion
|
24
24
|
sub :completion do
|
25
25
|
desc "Get tab completion shell config"
|
26
|
+
sub :json, "Get flattened tabry JSON config for command (experimental)"
|
26
27
|
sub :bash, "Get tab completion for bash or zsh"
|
27
28
|
sub :fish, "Get tab completion for fish"
|
28
29
|
arg :cmd_line, "(for internal usage, when used instead of subcommand) full command line for getting completion options"
|
data/lib/tabry/config_loader.rb
CHANGED
@@ -19,7 +19,7 @@ module Tabry
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def load
|
22
|
-
return load_from_file(name) if name =~
|
22
|
+
return load_from_file(name) if name =~ /json$/i || name =~ /\.ya?ml$/i
|
23
23
|
|
24
24
|
load_paths.each do |path|
|
25
25
|
EXTENSIONS.each do |extension|
|
@@ -48,7 +48,7 @@ module Tabry
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def load_from_file(filename)
|
51
|
-
if filename =~
|
51
|
+
if filename =~ /json$/
|
52
52
|
require "json"
|
53
53
|
Tabry::Models::Config.new(raw: JSON.parse(File.read(filename)))
|
54
54
|
elsif filename =~ /\.ya?ml$/
|
@@ -73,6 +73,23 @@ module Tabry
|
|
73
73
|
assert_of_class(key, val, [TrueClass, FalseClass])
|
74
74
|
val
|
75
75
|
end
|
76
|
+
|
77
|
+
def as_json
|
78
|
+
self.class::FIELDS.to_h do |k, _|
|
79
|
+
raw_val = send(k)
|
80
|
+
[k, ConfigObject.as_json(raw_val)]
|
81
|
+
end.compact
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.as_json(val)
|
85
|
+
if [ConfigObject, ConfigList, ConfigStringHash].any? { val.is_a?(_1) }
|
86
|
+
val.as_json
|
87
|
+
elsif val.is_a?(Array)
|
88
|
+
val.map { as_json(_1) }
|
89
|
+
else
|
90
|
+
val
|
91
|
+
end
|
92
|
+
end
|
76
93
|
end
|
77
94
|
end
|
78
95
|
end
|
data/lib/tabry/options_finder.rb
CHANGED
@@ -28,11 +28,45 @@ module Tabry
|
|
28
28
|
current_flag: result.state.current_flag
|
29
29
|
}.to_json
|
30
30
|
|
31
|
-
send(
|
31
|
+
send(
|
32
|
+
{ subcommand: :options_subcommand, flagarg: :options_flagarg }[state.mode],
|
33
|
+
token || ""
|
34
|
+
)
|
32
35
|
ensure
|
33
36
|
ENV["TABRY_AUTOCOMPLETE_STATE"] = before_env
|
34
37
|
end
|
35
38
|
|
39
|
+
# Descriptions of what is expected; particularly, argument names and descriptions
|
40
|
+
# returns an array, each can be one of three things:
|
41
|
+
# symbol :flag or :subcommand
|
42
|
+
# array [name, description]
|
43
|
+
# array [:flagarg, flag_description]
|
44
|
+
def summary_descriptions
|
45
|
+
send({
|
46
|
+
subcommand: :summary_descriptions_subcommand,
|
47
|
+
flagarg: :summary_descriptions_flagarg
|
48
|
+
}[state.mode])
|
49
|
+
end
|
50
|
+
|
51
|
+
def summary_descriptions_flagarg
|
52
|
+
result.current_flags_for_flagargs.map do |flag|
|
53
|
+
[:flagarg, flag.description]
|
54
|
+
end.compact
|
55
|
+
end
|
56
|
+
|
57
|
+
def summary_descriptions_subcommand
|
58
|
+
descriptions = []
|
59
|
+
if result.expected_arg
|
60
|
+
descriptions << [
|
61
|
+
result.expected_arg.title || result.expected_arg.name,
|
62
|
+
result.expected_arg.description
|
63
|
+
]
|
64
|
+
end
|
65
|
+
descriptions << :subcommand if options_subcommand_subs("").any?
|
66
|
+
descriptions << :flag if options_subcommand_flags("").any?
|
67
|
+
descriptions
|
68
|
+
end
|
69
|
+
|
36
70
|
private
|
37
71
|
|
38
72
|
def state
|
@@ -59,8 +93,8 @@ module Tabry
|
|
59
93
|
end
|
60
94
|
|
61
95
|
def options_flagarg(token)
|
62
|
-
result.
|
63
|
-
|
96
|
+
result.current_flags_for_flagargs.map do |flag|
|
97
|
+
flag.options&.options(token, params)
|
64
98
|
end.compact.flatten.uniq
|
65
99
|
end
|
66
100
|
|
@@ -84,13 +118,7 @@ module Tabry
|
|
84
118
|
end
|
85
119
|
|
86
120
|
def options_subcommand_args(token)
|
87
|
-
|
88
|
-
current_sub.args.varargs_arg
|
89
|
-
else
|
90
|
-
current_sub.args[state.args.length]
|
91
|
-
end
|
92
|
-
|
93
|
-
arg&.options&.options(token, params) || []
|
121
|
+
result.expected_arg&.options&.options(token, params) || []
|
94
122
|
end
|
95
123
|
end
|
96
124
|
end
|
data/lib/tabry/replty/builder.rb
CHANGED
data/lib/tabry/result.rb
CHANGED
@@ -24,7 +24,8 @@ module Tabry
|
|
24
24
|
def invalid_usage_reason
|
25
25
|
waiting_on_flag_arg? ||
|
26
26
|
wrong_number_of_args? ||
|
27
|
-
missing_required_flags?
|
27
|
+
missing_required_flags? ||
|
28
|
+
nil
|
28
29
|
end
|
29
30
|
|
30
31
|
def waiting_on_flag_arg?
|
@@ -81,7 +82,7 @@ module Tabry
|
|
81
82
|
return "missing required flag #{flag.name}"
|
82
83
|
end
|
83
84
|
end
|
84
|
-
|
85
|
+
false
|
85
86
|
end
|
86
87
|
|
87
88
|
def usage(cmd_name = nil)
|
@@ -110,5 +111,20 @@ module Tabry
|
|
110
111
|
end
|
111
112
|
end
|
112
113
|
end
|
114
|
+
|
115
|
+
def current_flags_for_flagargs
|
116
|
+
sub_stack.map do |sub|
|
117
|
+
flag = sub.flags[state.current_flag]
|
118
|
+
flag if flag&.arg
|
119
|
+
end.compact
|
120
|
+
end
|
121
|
+
|
122
|
+
def expected_arg
|
123
|
+
if current_sub.args.n_passed_in_varargs(state.args.length) > 0
|
124
|
+
current_sub.args.varargs_arg
|
125
|
+
else
|
126
|
+
current_sub.args[state.args.length]
|
127
|
+
end
|
128
|
+
end
|
113
129
|
end
|
114
130
|
end
|
data/lib/tabry/runner.rb
CHANGED
@@ -16,11 +16,16 @@ module Tabry
|
|
16
16
|
config
|
17
17
|
else
|
18
18
|
ConfigLoader.load(name: config)
|
19
|
+
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
22
23
|
def options(args, last = nil, params = {})
|
23
|
-
|
24
|
+
options_finder(args, params).options(last)
|
25
|
+
end
|
26
|
+
|
27
|
+
def options_finder(args, params = {})
|
28
|
+
Tabry::OptionsFinder.new(parse(args), params)
|
24
29
|
end
|
25
30
|
|
26
31
|
def parse(args)
|
data/lib/tabry/shells/bash.rb
CHANGED
@@ -45,8 +45,8 @@ module Tabry
|
|
45
45
|
File.expand_path("#{__dir__}/../../../")
|
46
46
|
end
|
47
47
|
|
48
|
-
def self.esc(
|
49
|
-
Shellwords.escape(
|
48
|
+
def self.esc(str)
|
49
|
+
Shellwords.escape(str)
|
50
50
|
end
|
51
51
|
|
52
52
|
def self.generate_internal(cmd_name:, import_path:, tabry_bash_executable:, tabry_bash_arg:, uniq_fn_id: nil)
|
@@ -14,7 +14,7 @@ module Tabry
|
|
14
14
|
|
15
15
|
def self.run(cmd_line, comp_point, config: nil)
|
16
16
|
cmd_name, args, last_arg = Tabry::ShellTokenizer.split_with_comppoint(cmd_line, comp_point)
|
17
|
-
opts = Tabry::Runner.new(config: config || cmd_name).options(args, last_arg, {descriptions: true})
|
17
|
+
opts = Tabry::Runner.new(config: config || cmd_name).options(args, last_arg, { descriptions: true })
|
18
18
|
|
19
19
|
if Tabry::Util.debug?
|
20
20
|
$stderr.puts
|
@@ -38,12 +38,10 @@ module Tabry
|
|
38
38
|
def self.format_description(description)
|
39
39
|
if description.nil?
|
40
40
|
""
|
41
|
+
elsif description.length > DESCRIPTION_MAX_LENGTH
|
42
|
+
"#{description[0..(DESCRIPTION_MAX_LENGTH - 3)]}..."
|
41
43
|
else
|
42
|
-
|
43
|
-
"#{description[0..(DESCRIPTION_MAX_LENGTH - 3)]}..."
|
44
|
-
else
|
45
|
-
description
|
46
|
-
end
|
44
|
+
description
|
47
45
|
end
|
48
46
|
end
|
49
47
|
end
|
data/lib/tabry/shells/fish.rb
CHANGED
@@ -33,7 +33,7 @@ module Tabry
|
|
33
33
|
cmd_name: cmd_name,
|
34
34
|
import_path: "",
|
35
35
|
tabry_fish_executable: File.expand_path($0),
|
36
|
-
tabry_fish_arg: "completion"
|
36
|
+
tabry_fish_arg: "completion"
|
37
37
|
)
|
38
38
|
end
|
39
39
|
|
@@ -41,8 +41,8 @@ module Tabry
|
|
41
41
|
File.expand_path("#{__dir__}/../../../")
|
42
42
|
end
|
43
43
|
|
44
|
-
def self.esc(
|
45
|
-
Shellwords.escape(
|
44
|
+
def self.esc(str)
|
45
|
+
Shellwords.escape(str)
|
46
46
|
end
|
47
47
|
|
48
48
|
def self.add_uniq_id(str, pattern, uniq_id)
|
@@ -65,7 +65,7 @@ module Tabry
|
|
65
65
|
|
66
66
|
script.gsub! "# TABRY_IMPORT_PATH_REPLACE (DO NOT REMOVE)", "set TABRY_IMPORTS_PATH #{esc import_path}"
|
67
67
|
script.gsub! "# TABRY_EXECUTABLE_REPLACE (DO NOT REMOVE)", "set TABRY_EXECUTABLE #{esc tabry_fish_executable}"
|
68
|
-
|
68
|
+
unless tabry_fish_arg.nil?
|
69
69
|
script.gsub! "# TABRY_ARG_REPLACE (DO NOT REMOVE)", "set TABRY_ARG #{esc tabry_fish_arg}"
|
70
70
|
end
|
71
71
|
|
data/lib/tabry/version.rb
CHANGED
data/spec/fixtures/vehicles.yaml
CHANGED
@@ -76,6 +76,13 @@ describe Tabry::CLI::AllInOne do
|
|
76
76
|
cli.run(["completion", "bash"])
|
77
77
|
end
|
78
78
|
|
79
|
+
it "creates a #completion__json method which generates tabry JSON" do
|
80
|
+
expect_any_instance_of(Kernel).to receive(:puts) do |_, json|
|
81
|
+
expect(JSON.parse(json)).to eq(JSON.parse(cli.runner.config.as_json.to_json))
|
82
|
+
end
|
83
|
+
cli.run(["completion", "json"])
|
84
|
+
end
|
85
|
+
|
79
86
|
it "creates a #completion method which generates options" do
|
80
87
|
expect(Tabry::Bash::Wrapper).to receive(:run).with("cmd line", "6", config: instance_of(Tabry::Models::Config))
|
81
88
|
cli.run(["completion", "cmd line", "6"])
|
@@ -31,7 +31,7 @@ describe Tabry::ConfigBuilder do
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
it "defines a 'completion' shortcut with 'completion' and
|
34
|
+
it "defines a 'completion' shortcut with 'completion' and completion__bash, __fish, __json subs" do
|
35
35
|
config = described_class.build do
|
36
36
|
completion
|
37
37
|
end
|
@@ -52,6 +52,10 @@ describe Tabry::ConfigBuilder do
|
|
52
52
|
}
|
53
53
|
],
|
54
54
|
"subs" => [
|
55
|
+
{
|
56
|
+
"description" => "Get flattened tabry JSON config for command (experimental)",
|
57
|
+
"name" => "json"
|
58
|
+
},
|
55
59
|
{
|
56
60
|
"description" => "Get tab completion for bash or zsh",
|
57
61
|
"name" => "bash"
|
data/spec/tabry/machine_spec.rb
CHANGED
@@ -22,7 +22,7 @@ describe Tabry::Machine do
|
|
22
22
|
pending unless expectation
|
23
23
|
result = described_class.run(config, tokens)
|
24
24
|
expectation.each do |key, val|
|
25
|
-
key =
|
25
|
+
key = "subcommand_stack" if key == "subs"
|
26
26
|
res = result.send(key.to_sym)
|
27
27
|
res = res.to_s if res.is_a?(Symbol)
|
28
28
|
expect(res).to eq(val)
|
@@ -33,6 +33,12 @@ describe Tabry::Models::Config do
|
|
33
33
|
}
|
34
34
|
end
|
35
35
|
|
36
|
+
describe "#as_json" do
|
37
|
+
it "returns the config as a hash" do
|
38
|
+
expect(subject.as_json).to eq(config_hash)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
36
42
|
describe "#dig_sub_array" do
|
37
43
|
it "returns the array of subcommands leading up to the specified subcommand" do
|
38
44
|
res = subject.dig_sub_array(%w[sub1 sub1.1])
|
@@ -8,7 +8,7 @@ describe Tabry::Models::DirOption do
|
|
8
8
|
described_class.new(root: double, raw: { "type" => "dir" })
|
9
9
|
end
|
10
10
|
|
11
|
-
# Handled by
|
11
|
+
# Handled by tabry-bash/tabry-bash.sh/shell, we just return a symbol to
|
12
12
|
# communicate to tabry-bash
|
13
13
|
it "returns a array with a symbol" do
|
14
14
|
expect(subject.options("whatever", {})).to eq([:directory])
|
@@ -8,7 +8,7 @@ describe Tabry::Models::FileOption do
|
|
8
8
|
described_class.new(root: double, raw: { "type" => "file" })
|
9
9
|
end
|
10
10
|
|
11
|
-
# Handled by
|
11
|
+
# Handled by tabry-bash/tabry-bash.sh/shell, we just return a symbol to
|
12
12
|
# communicate to tabry-bash
|
13
13
|
it "returns a array with a symbol" do
|
14
14
|
expect(subject.options("whatever", {})).to eq([:file])
|
@@ -14,6 +14,6 @@ describe Tabry::Models::ShellOption do
|
|
14
14
|
expect(subject.options("", {})).to match_array(%w[a a1 b])
|
15
15
|
expect(subject.options("a", {})).to match_array(%w[a a1])
|
16
16
|
expect(subject.options("a1", {})).to match_array(%w[a1])
|
17
|
-
expect(subject.options("a1 ", {})).to
|
17
|
+
expect(subject.options("a1 ", {})).to be_empty
|
18
18
|
end
|
19
19
|
end
|
@@ -4,6 +4,7 @@ require_relative "../../lib/tabry/config_loader"
|
|
4
4
|
require_relative "../../lib/tabry/options_finder"
|
5
5
|
require_relative "../../lib/tabry/result"
|
6
6
|
require_relative "../../lib/tabry/state"
|
7
|
+
require_relative "../../lib/tabry/util"
|
7
8
|
|
8
9
|
describe Tabry::OptionsFinder do
|
9
10
|
let(:config_fixture) { "#{__dir__}/../fixtures/vehicles.yaml" }
|
@@ -23,6 +24,10 @@ describe Tabry::OptionsFinder do
|
|
23
24
|
%w[car bike],
|
24
25
|
subs: %w[move go]
|
25
26
|
],
|
27
|
+
"lists options for varargs" => [
|
28
|
+
%w[car bike],
|
29
|
+
subs: %w[build],
|
30
|
+
],
|
26
31
|
"lists both possible args and subs if a subcommand can take either" => [
|
27
32
|
%w[x y z subsub],
|
28
33
|
subs: %w[sub-with-sub-or-arg]
|
@@ -1,6 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require_relative
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "../../../lib/tabry/replty/builder"
|
4
|
+
require_relative "../../../lib/tabry/replty/base"
|
5
|
+
require_relative "../../../lib/tabry/config_builder"
|
4
6
|
|
5
7
|
module Tabry
|
6
8
|
module Specs
|
@@ -21,8 +23,8 @@ module Tabry
|
|
21
23
|
end
|
22
24
|
|
23
25
|
describe Tabry::Replty::Builder do
|
24
|
-
it
|
25
|
-
conf = Tabry::ConfigBuilder.build do |
|
26
|
+
it "calls the repl method for the subcommand" do
|
27
|
+
conf = Tabry::ConfigBuilder.build do |_c|
|
26
28
|
sub :foo
|
27
29
|
sub :bar do
|
28
30
|
arg :waz
|
data/spec/tabry/runner_spec.rb
CHANGED
@@ -28,7 +28,9 @@ describe Tabry::Runner do
|
|
28
28
|
it "runs OptionsFinder" do
|
29
29
|
res = instance_double(Tabry::Result)
|
30
30
|
expect(subject).to receive(:parse).with(%w[foo bar]).and_return res
|
31
|
-
|
31
|
+
opts_finder = instance_double(Tabry::OptionsFinder)
|
32
|
+
expect(Tabry::OptionsFinder).to receive(:new).with(res, {}).and_return opts_finder
|
33
|
+
expect(opts_finder).to receive(:options).with("waz").and_return %w[a b c]
|
32
34
|
expect(subject.options(%w[foo bar], "waz")).to eq(%w[a b c])
|
33
35
|
end
|
34
36
|
end
|
@@ -5,6 +5,7 @@ require_relative "../../../lib/tabry/shells/bash"
|
|
5
5
|
describe Tabry::Shells::Bash do
|
6
6
|
describe ".generate_self" do
|
7
7
|
before { @backup, $0 = $0, "/bla/waz/abc" }
|
8
|
+
|
8
9
|
after { $0 = @backup }
|
9
10
|
|
10
11
|
it "tells bash to use the currently running command plus 'completion' to get completion options" do
|
@@ -19,7 +20,7 @@ describe Tabry::Shells::Bash do
|
|
19
20
|
end
|
20
21
|
|
21
22
|
it "defaults cmd_name to the basename of the currently running command" do
|
22
|
-
result = described_class.generate_self(cmd_name:
|
23
|
+
result = described_class.generate_self(cmd_name: "wombat")
|
23
24
|
expect(result).to match(
|
24
25
|
%r{^ *TABRY_IMPORTS_PATH='' _tabry_WOMBAT_completions_internal /bla/waz/abc completion$}
|
25
26
|
)
|
@@ -27,8 +28,8 @@ describe Tabry::Shells::Bash do
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
|
30
|
-
describe
|
31
|
-
it
|
31
|
+
describe ".generate" do
|
32
|
+
it "tells bash to use tabry-bash with a import path to get completion options" do
|
32
33
|
result = described_class.generate("my-cmd", "/path/to/mycmd.tabry")
|
33
34
|
expect(result).to include("TABRY_IMPORTS_PATH=/path/to/mycmd.tabry _tabry_MY_CMD_completions_internal /")
|
34
35
|
expect(result).to include("complete -F _tabry_MY_CMD_completions my-cmd\n")
|
data/tabry.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tabry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Evan Battaglia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry-byebug
|
@@ -265,7 +265,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
265
265
|
- !ruby/object:Gem::Version
|
266
266
|
version: '0'
|
267
267
|
requirements: []
|
268
|
-
rubygems_version: 3.
|
268
|
+
rubygems_version: 3.4.19
|
269
269
|
signing_key:
|
270
270
|
specification_version: 4
|
271
271
|
summary: Tab completion and CLIs extraordinaire
|