vagrant-devcommands 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +19 -0
- data/README.md +33 -8
- data/lib/vagrant/devcommands/command.rb +19 -15
- data/lib/vagrant/devcommands/commandfile.rb +1 -1
- data/lib/vagrant/devcommands/help_printer/command.rb +4 -4
- data/lib/vagrant/devcommands/internal_command/completion_data.rb +52 -0
- data/lib/vagrant/devcommands/internal_command/help.rb +2 -2
- data/lib/vagrant/devcommands/internal_spec.rb +9 -2
- data/lib/vagrant/devcommands/model/chain.rb +1 -1
- data/lib/vagrant/devcommands/model/command.rb +40 -26
- data/lib/vagrant/devcommands/registry.rb +39 -43
- data/lib/vagrant/devcommands/runner/command.rb +3 -1
- data/lib/vagrant/devcommands/runner/internal_command.rb +21 -6
- data/lib/vagrant/devcommands/util.rb +10 -9
- data/lib/vagrant/devcommands/version.rb +1 -1
- data/lib/vagrant/devcommands.rb +1 -0
- data/locales/en.yml +26 -19
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9050521052b96dc86341f385a13b9f7a86e9d9b7
|
4
|
+
data.tar.gz: f53326e688ccd00e6a60b6cca80996510cf5d253
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6153595b35c47a8f770d1a4dccdc3affe5fd816b5d8ee17c70922f13a1b19dde80ff2d38bf51f3eebee7222f728620cf3adcf09e83153100896e85465ca751fe
|
7
|
+
data.tar.gz: 3e684a23dcd43765a00283771f2106eec4b79940e534cfc5c2c534ea9355df6ab5913d7056995d8306bc6c23b8cf28122df276f29849211815ef70b223d2fc61
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,24 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## v0.10.0 (2017-07-02)
|
4
|
+
|
5
|
+
- Enhancements
|
6
|
+
- Command alternatives provided by the "did-you-mean" feature no longer
|
7
|
+
display the full command list (help)
|
8
|
+
- Depending on the internal scoring multiple alternative commands
|
9
|
+
will be presented instead of a full command list (help)
|
10
|
+
- Minimal data for shell completion is available via the internal
|
11
|
+
`completion-data` command
|
12
|
+
- Parameters can limit the values you are allowed to pass in
|
13
|
+
- Spaces in chain/command names are now officially disallowed. Those
|
14
|
+
would have always been broken anyways, but now there is a nice message
|
15
|
+
and the commands are excluded from the various listings
|
16
|
+
|
17
|
+
- Bug fixes
|
18
|
+
- Chain names can no longer conflict with internal commands like `help`
|
19
|
+
or `version`. The respective chain definitions are dropped and a warning
|
20
|
+
is issued
|
21
|
+
|
3
22
|
## v0.9.0 (2017-05-20)
|
4
23
|
|
5
24
|
- Enhancements
|
data/README.md
CHANGED
@@ -35,19 +35,22 @@ command 'with_options',
|
|
35
35
|
machine: :my_machine,
|
36
36
|
desc: 'executes "hostname" on the machine "my_machine"',
|
37
37
|
script: 'hostname',
|
38
|
-
usage: 'vagrant run
|
38
|
+
usage: 'vagrant run %<command>s',
|
39
39
|
help: <<-eoh
|
40
40
|
I am the help message for the command "with_options".
|
41
41
|
I get displayed when running "vagrant run help with_options".
|
42
42
|
|
43
43
|
The usage printed above the help can interpolate the name
|
44
|
-
of the command name using %{command}.
|
44
|
+
of the command name using either %{command} or %<command>s.
|
45
45
|
eoh
|
46
46
|
```
|
47
47
|
|
48
48
|
_Note_: If you are defining literal `%` (percent sign) in your commands you
|
49
49
|
have to escape them using a second `%`. For example `date "+%%Y-%%m-%%d"`.
|
50
50
|
|
51
|
+
_Note_: Spaces in command names are not supported. Definitions with spaces will
|
52
|
+
be ignored.
|
53
|
+
|
51
54
|
#### Commands with Parameters
|
52
55
|
|
53
56
|
Passing additional parameters to a command is (minimally) supported using an
|
@@ -70,8 +73,13 @@ command 'with_param',
|
|
70
73
|
|
71
74
|
# wrapped option value
|
72
75
|
p_wrapped: { wrap: "--and %s wrapped" }
|
76
|
+
|
77
|
+
# parameters with a limited set of allowed values
|
78
|
+
# the allowed values are checked prior to escaping/wrapping!
|
79
|
+
# optional parameters are only validated if given!
|
80
|
+
p_limited: { allowed: ['completely'] }
|
73
81
|
},
|
74
|
-
script: 'echo
|
82
|
+
script: 'echo %<p_mandatory>s %<p_default>s %<p_escaped>s %<p_optional>s %<p_wrapped>s %<p_limited>s'
|
75
83
|
```
|
76
84
|
|
77
85
|
This allows you to execute the following command:
|
@@ -83,12 +91,13 @@ vagrant run with_param --p_mandatory works
|
|
83
91
|
# will execute 'echo works always like a charm'
|
84
92
|
vagrant run with_param --p_mandatory works --p_optional "like a charm"
|
85
93
|
|
86
|
-
# will execute 'echo works sometimes like a charm --and is wrapped'
|
94
|
+
# will execute 'echo works sometimes like a charm --and is wrapped completely'
|
87
95
|
vagrant run with_param \
|
88
96
|
--p_mandatory works \
|
89
97
|
--p_default sometimes \
|
90
98
|
--p_optional "like a charm" \
|
91
99
|
--p_wrapped is
|
100
|
+
--p_limited completely
|
92
101
|
```
|
93
102
|
|
94
103
|
For now a command expecting one or more parameters will fail if the user does
|
@@ -110,7 +119,7 @@ command 'with_flags',
|
|
110
119
|
f_standard: { desc: "standard flag" },
|
111
120
|
f_valued: { value: "--f_modified" }
|
112
121
|
},
|
113
|
-
script: 'echo "flags:
|
122
|
+
script: 'echo "flags: %<f_standard>s"'
|
114
123
|
```
|
115
124
|
|
116
125
|
This definition allows the following executions:
|
@@ -157,7 +166,7 @@ ruby -e "require 'pathname'; puts Pathname.new(Dir.home).join('.vagrant.devcomma
|
|
157
166
|
|
158
167
|
Any commands defined there will silently be overwritten by a local definition.
|
159
168
|
|
160
|
-
###
|
169
|
+
### Chain Definitions
|
161
170
|
|
162
171
|
You can define command chains to execute multiple commands in order:
|
163
172
|
|
@@ -175,7 +184,7 @@ I am the help message for the chain "my_chain".
|
|
175
184
|
I get displayed when running "vagrant run help my_chain".
|
176
185
|
|
177
186
|
The usage printed above the help can interpolate the name
|
178
|
-
of the command name using
|
187
|
+
of the command name using %<command>s.
|
179
188
|
eoh
|
180
189
|
```
|
181
190
|
|
@@ -188,6 +197,9 @@ By default a chain breaks upon the first non-zero return value of any
|
|
188
197
|
configured command. To deactivate this behaviour you can set `:break_on_error`
|
189
198
|
to `false`. Any value other than `false` will stick to the default.
|
190
199
|
|
200
|
+
_Note_: Spaces in command names are not supported. Definitions with spaces will
|
201
|
+
be ignored.
|
202
|
+
|
191
203
|
#### Chain Definitions with Pre-Defined Parameters
|
192
204
|
|
193
205
|
If required you can modify the arguments given to each chain element by setting
|
@@ -196,7 +208,7 @@ additional/custom argv values for a single chain element:
|
|
196
208
|
```ruby
|
197
209
|
command 'chainecho',
|
198
210
|
parameters: { first: {}, second: {} },
|
199
|
-
script: 'echo
|
211
|
+
script: 'echo %<first>s %<second>s'
|
200
212
|
|
201
213
|
chain 'my_customized_chain',
|
202
214
|
commands: [
|
@@ -234,6 +246,7 @@ chain 'customized_chain_machine',
|
|
234
246
|
{ command: 'chainecho', machine: 'secondary' },
|
235
247
|
{ command: 'chainecho', machine: 'tertiary' }
|
236
248
|
]
|
249
|
+
```
|
237
250
|
|
238
251
|
Running the chain will execute the following commands:
|
239
252
|
|
@@ -272,6 +285,18 @@ installed plugin has a version below `1.3.3.7`.
|
|
272
285
|
Please be aware that returning from a global commandfile completely skips
|
273
286
|
evaluating a local one.
|
274
287
|
|
288
|
+
### Experimental: Shell Completion
|
289
|
+
|
290
|
+
Completion data for your shell is available via internal command:
|
291
|
+
|
292
|
+
```shell
|
293
|
+
# list commands
|
294
|
+
vagrant run completion-data
|
295
|
+
|
296
|
+
# list command flags/parameters
|
297
|
+
vagrant run completion-data my-command
|
298
|
+
```
|
299
|
+
|
275
300
|
|
276
301
|
## Notes for Windows Users
|
277
302
|
|
@@ -2,10 +2,6 @@ module VagrantPlugins
|
|
2
2
|
module DevCommands
|
3
3
|
# Defines the executable vagrant command
|
4
4
|
class Command < Vagrant.plugin(2, :command)
|
5
|
-
NAMESPACE_RUNNER = VagrantPlugins::DevCommands::Runner
|
6
|
-
MESSAGES = VagrantPlugins::DevCommands::Messages
|
7
|
-
UTIL = VagrantPlugins::DevCommands::Util
|
8
|
-
|
9
5
|
def self.synopsis
|
10
6
|
synopsis = VagrantPlugins::DevCommands::SYNOPSIS
|
11
7
|
|
@@ -43,8 +39,7 @@ module VagrantPlugins
|
|
43
39
|
def available?(command)
|
44
40
|
unless @registry.available?(command)
|
45
41
|
display_error("Invalid command \"#{command}\"!")
|
46
|
-
|
47
|
-
run_internal('help', ['--commands'])
|
42
|
+
display_alternatives(command)
|
48
43
|
end
|
49
44
|
|
50
45
|
@registry.available?(command)
|
@@ -53,13 +48,22 @@ module VagrantPlugins
|
|
53
48
|
def deprecated_box_config?
|
54
49
|
return unless @registry.commands.values.any?(&:deprecated_box_config)
|
55
50
|
|
56
|
-
|
51
|
+
Messages.deprecated_box_config(&@env.ui.method(:warn))
|
57
52
|
end
|
58
53
|
|
59
|
-
def
|
60
|
-
|
54
|
+
def display_alternatives(command)
|
55
|
+
alternatives = Util.did_you_mean(command, @registry)
|
56
|
+
alternatives = alternatives.select { |_k, v| v > 0.8 }
|
57
|
+
|
58
|
+
return false if alternatives.empty?
|
59
|
+
|
60
|
+
if alternatives.length == 1
|
61
|
+
display_error('Did you mean this?', true)
|
62
|
+
else
|
63
|
+
display_error('Did you mean one of these?', true)
|
64
|
+
end
|
61
65
|
|
62
|
-
display_error("
|
66
|
+
alternatives.sort.each { |k, _v| display_error(" #{k}") }
|
63
67
|
end
|
64
68
|
|
65
69
|
def display_error(msg, pre_ln = false, post_ln = false)
|
@@ -81,8 +85,8 @@ module VagrantPlugins
|
|
81
85
|
commandfile = Commandfile.new(@env)
|
82
86
|
|
83
87
|
unless commandfile.exist?
|
84
|
-
|
85
|
-
|
88
|
+
Messages.missing_commandfile(&@env.ui.method(:error))
|
89
|
+
Messages.pre_ln(:plugin_readme, &@env.ui.method(:info))
|
86
90
|
|
87
91
|
return false
|
88
92
|
end
|
@@ -105,7 +109,7 @@ module VagrantPlugins
|
|
105
109
|
end
|
106
110
|
|
107
111
|
def run_internal(command, args = nil)
|
108
|
-
runner =
|
112
|
+
runner = Runner::InternalCommand.new(
|
109
113
|
self, @argv, @env, @registry
|
110
114
|
)
|
111
115
|
|
@@ -122,9 +126,9 @@ module VagrantPlugins
|
|
122
126
|
|
123
127
|
def runner_for(command)
|
124
128
|
if @registry.valid_command?(command)
|
125
|
-
|
129
|
+
Runner::Command.new(self, @argv, @env, @registry)
|
126
130
|
else
|
127
|
-
|
131
|
+
Runner::Chain.new(self, @argv, @env, @registry)
|
128
132
|
end
|
129
133
|
end
|
130
134
|
end
|
@@ -20,7 +20,7 @@ module VagrantPlugins
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def arguments(arguments, title)
|
23
|
-
return if arguments.nil?
|
23
|
+
return if arguments.nil? || arguments.empty?
|
24
24
|
|
25
25
|
info("#{title}:", true)
|
26
26
|
arguments_body(arguments)
|
@@ -67,9 +67,9 @@ module VagrantPlugins
|
|
67
67
|
def usage_params(usage, command)
|
68
68
|
[
|
69
69
|
usage,
|
70
|
-
UTIL.collect_mandatory_params(command.parameters
|
71
|
-
UTIL.collect_optional_params(command.parameters
|
72
|
-
UTIL.collect_flags(command.flags
|
70
|
+
UTIL.collect_mandatory_params(command.parameters),
|
71
|
+
UTIL.collect_optional_params(command.parameters),
|
72
|
+
UTIL.collect_flags(command.flags)
|
73
73
|
].flatten.compact.join(' ').strip
|
74
74
|
end
|
75
75
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module VagrantPlugins
|
2
|
+
module DevCommands
|
3
|
+
module InternalCommand
|
4
|
+
# Internal "completion-data" command
|
5
|
+
class CompletionData
|
6
|
+
def initialize(env, registry)
|
7
|
+
@env = env
|
8
|
+
@registry = registry
|
9
|
+
end
|
10
|
+
|
11
|
+
def execute(argv)
|
12
|
+
return if @registry.commands.empty?
|
13
|
+
|
14
|
+
command = VagrantPlugins::DevCommands::Util.argv_command(argv, @env)
|
15
|
+
compdata =
|
16
|
+
if command.nil?
|
17
|
+
command_completion
|
18
|
+
else
|
19
|
+
argument_completion(command)
|
20
|
+
end
|
21
|
+
|
22
|
+
@env.ui.info(compdata, new_line: false)
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def argument_completion(command)
|
28
|
+
spec = registry_spec(command)
|
29
|
+
|
30
|
+
return '' if spec.nil?
|
31
|
+
|
32
|
+
(spec.flags.keys + spec.parameters.keys).sort.join(' ')
|
33
|
+
end
|
34
|
+
|
35
|
+
def command_completion
|
36
|
+
(
|
37
|
+
@registry.chains.keys +
|
38
|
+
@registry.commands.keys +
|
39
|
+
VagrantPlugins::DevCommands::Registry::RESERVED_COMMANDS
|
40
|
+
).sort.join(' ')
|
41
|
+
end
|
42
|
+
|
43
|
+
def registry_spec(name)
|
44
|
+
return nil if @registry.reserved_command?(name)
|
45
|
+
return @registry.commands[name] if @registry.valid_command?(name)
|
46
|
+
|
47
|
+
nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -46,7 +46,7 @@ module VagrantPlugins
|
|
46
46
|
internal_help_header(command)
|
47
47
|
info(internal_commands[command].help.strip, true)
|
48
48
|
|
49
|
-
message(:plugin_readme, true) if 'help'
|
49
|
+
message(:plugin_readme, true) if command == 'help'
|
50
50
|
end
|
51
51
|
|
52
52
|
def internal_help_header(command)
|
@@ -65,7 +65,7 @@ module VagrantPlugins
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def plugin_help(command)
|
68
|
-
message(:plugin_usage) unless '--commands'
|
68
|
+
message(:plugin_usage) unless command == '--commands'
|
69
69
|
|
70
70
|
pad_to = UTIL.max_pad([internal_commands,
|
71
71
|
@registry.commands,
|
@@ -4,17 +4,24 @@ module VagrantPlugins
|
|
4
4
|
class InternalSpec
|
5
5
|
I18N_KEY = 'vagrant_devcommands.internal'.freeze
|
6
6
|
|
7
|
+
COMPLETION_DATA = {
|
8
|
+
desc: I18n.t("#{I18N_KEY}.completion-data.desc"),
|
9
|
+
name: 'completion-data',
|
10
|
+
usage: 'vagrant run %<command>s',
|
11
|
+
help: I18n.t("#{I18N_KEY}.completion-data.help")
|
12
|
+
}.freeze
|
13
|
+
|
7
14
|
HELP = {
|
8
15
|
desc: I18n.t("#{I18N_KEY}.help.desc"),
|
9
16
|
name: 'help',
|
10
|
-
usage: 'vagrant run
|
17
|
+
usage: 'vagrant run %<command>s [command]',
|
11
18
|
help: I18n.t("#{I18N_KEY}.help.help")
|
12
19
|
}.freeze
|
13
20
|
|
14
21
|
VERSION = {
|
15
22
|
desc: I18n.t("#{I18N_KEY}.version.desc"),
|
16
23
|
name: 'version',
|
17
|
-
usage: 'vagrant run
|
24
|
+
usage: 'vagrant run %<command>s',
|
18
25
|
help: I18n.t("#{I18N_KEY}.version.help")
|
19
26
|
}.freeze
|
20
27
|
end
|
@@ -21,8 +21,8 @@ module VagrantPlugins
|
|
21
21
|
def initialize(spec)
|
22
22
|
@name = spec[:name]
|
23
23
|
|
24
|
-
@flags = spec[:flags]
|
25
|
-
@parameters = spec[:parameters]
|
24
|
+
@flags = spec[:flags] || {}
|
25
|
+
@parameters = spec[:parameters] || {}
|
26
26
|
@script = spec[:script]
|
27
27
|
|
28
28
|
@machine = spec[:machine] || spec[:box]
|
@@ -38,73 +38,87 @@ module VagrantPlugins
|
|
38
38
|
script = script.call if script.is_a?(Proc)
|
39
39
|
|
40
40
|
opts = {}
|
41
|
-
opts = parse_argv(argv)
|
41
|
+
opts = parse_argv(argv) unless @flags.empty? && @parameters.empty?
|
42
42
|
|
43
43
|
(script % opts).strip
|
44
44
|
end
|
45
45
|
|
46
46
|
private
|
47
47
|
|
48
|
-
def
|
49
|
-
|
48
|
+
def escape_parameters(params)
|
49
|
+
@parameters.each do |key, conf|
|
50
50
|
next if conf[:escape].nil?
|
51
51
|
|
52
52
|
conf[:escape].each do |char, with|
|
53
|
-
char
|
54
|
-
|
53
|
+
char = char.to_s unless char.is_a?(String)
|
54
|
+
params[key] = params[key].sub(char, "#{with}#{char}")
|
55
55
|
end
|
56
56
|
end
|
57
57
|
|
58
|
-
|
58
|
+
params
|
59
59
|
end
|
60
60
|
|
61
|
-
def
|
62
|
-
|
61
|
+
def parameters_with_defaults
|
62
|
+
params = {}
|
63
63
|
|
64
|
-
|
65
|
-
|
66
|
-
|
64
|
+
@parameters.each do |key, conf|
|
65
|
+
params[key] = '' if conf[:optional]
|
66
|
+
params[key] = conf[:default] unless conf[:default].nil?
|
67
67
|
end
|
68
68
|
|
69
|
-
|
69
|
+
params
|
70
70
|
end
|
71
71
|
|
72
72
|
# rubocop:disable Metrics/MethodLength
|
73
73
|
def parse_argv(argv)
|
74
|
-
|
74
|
+
params = parameters_with_defaults
|
75
75
|
|
76
76
|
OptionParser.new do |opts|
|
77
|
-
|
78
|
-
|
77
|
+
@flags.each do |key, conf|
|
78
|
+
params[key] = ''
|
79
79
|
|
80
80
|
opts.on("--#{key}", "Flag: #{key}") do
|
81
|
-
|
81
|
+
params[key] = conf[:value] || "--#{key}"
|
82
82
|
end
|
83
83
|
end
|
84
84
|
|
85
|
-
|
85
|
+
@parameters.each do |key, _conf|
|
86
86
|
opts.on("--#{key} OPTION", "Parameter: #{key}") do |o|
|
87
|
-
|
87
|
+
params[key] = o
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end.parse!(argv)
|
91
91
|
|
92
|
-
|
92
|
+
wrap_parameters(escape_parameters(validate_parameters(params)))
|
93
93
|
end
|
94
94
|
# rubocop:enable Metrics/MethodLength
|
95
95
|
|
96
|
-
def
|
97
|
-
|
96
|
+
def validate_parameters(params)
|
97
|
+
@parameters.each do |key, conf|
|
98
|
+
next if params[key].nil?
|
99
|
+
next if params[key] == '' && conf[:optional]
|
100
|
+
|
101
|
+
next if conf[:allowed].nil?
|
102
|
+
next if conf[:allowed].include?(params[key])
|
103
|
+
|
104
|
+
raise ArgumentError, "--#{key}=#{params[key]}"
|
105
|
+
end
|
106
|
+
|
107
|
+
params
|
108
|
+
end
|
109
|
+
|
110
|
+
def wrap_parameters(params)
|
111
|
+
@parameters.each do |key, conf|
|
98
112
|
next if conf[:wrap].nil?
|
99
113
|
|
100
114
|
if conf[:default].nil?
|
101
|
-
next if
|
115
|
+
next if params[key].nil? || params[key].empty?
|
102
116
|
end
|
103
117
|
|
104
|
-
|
118
|
+
params[key] = conf[:wrap] % params[key]
|
105
119
|
end
|
106
120
|
|
107
|
-
|
121
|
+
params
|
108
122
|
end
|
109
123
|
end
|
110
124
|
end
|
@@ -2,10 +2,8 @@ module VagrantPlugins
|
|
2
2
|
module DevCommands
|
3
3
|
# Vagrant command registry
|
4
4
|
class Registry
|
5
|
-
I18N_KEY
|
6
|
-
|
7
|
-
|
8
|
-
RESERVED_COMMANDS = %w[help version].freeze
|
5
|
+
I18N_KEY = 'vagrant_devcommands.registry'.freeze
|
6
|
+
RESERVED_COMMANDS = %w[completion-data help version].freeze
|
9
7
|
|
10
8
|
attr_accessor :chains
|
11
9
|
attr_accessor :commands
|
@@ -24,9 +22,9 @@ module VagrantPlugins
|
|
24
22
|
global = commandfile.path_global
|
25
23
|
local = commandfile.path
|
26
24
|
|
27
|
-
contents
|
28
|
-
contents += "\n" + global.read unless nil
|
29
|
-
contents += "\n" + local.read unless nil
|
25
|
+
contents = ''
|
26
|
+
contents += "\n" + global.read unless global.nil?
|
27
|
+
contents += "\n" + local.read unless local.nil?
|
30
28
|
|
31
29
|
instance_eval(contents)
|
32
30
|
resolve_naming_conflicts
|
@@ -50,63 +48,54 @@ module VagrantPlugins
|
|
50
48
|
def chain(name, options = nil)
|
51
49
|
options = {} unless options.is_a?(Hash)
|
52
50
|
options[:commands] = {} unless options.key?(:commands)
|
51
|
+
options[:name] = name
|
53
52
|
|
54
|
-
|
53
|
+
if options[:commands].empty?
|
54
|
+
return warn_def_ignored('chain_empty', name: name)
|
55
|
+
end
|
55
56
|
|
56
|
-
|
57
|
+
if name.include?(' ')
|
58
|
+
return warn_def_ignored('chain_name_space', name: name)
|
59
|
+
end
|
57
60
|
|
58
|
-
@chains[name] =
|
61
|
+
@chains[name] = Model::Chain.new(options)
|
59
62
|
end
|
60
63
|
|
64
|
+
# rubocop:disable Metrics/MethodLength
|
61
65
|
def command(name, options = nil)
|
62
|
-
|
63
|
-
|
64
|
-
|
66
|
+
if reserved_command?(name)
|
67
|
+
return warn_def_ignored('command_reserved', name: name)
|
68
|
+
end
|
65
69
|
|
66
|
-
|
70
|
+
if name.include?(' ')
|
71
|
+
return warn_def_ignored('command_name_space', name: name)
|
72
|
+
end
|
67
73
|
|
74
|
+
options = { script: options } unless options.is_a?(Hash)
|
68
75
|
options[:name] = name
|
69
76
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
def empty_chain_warning(name)
|
74
|
-
@env.ui.warn I18n.t("#{I18N_KEY}.empty_chain", name: name)
|
75
|
-
@env.ui.warn I18n.t("#{I18N_KEY}.def_ignored")
|
76
|
-
@env.ui.warn ''
|
77
|
-
end
|
78
|
-
|
79
|
-
def missing_chain_command_warning(chain, command)
|
80
|
-
i18n_args = { chain: chain, command: command }
|
81
|
-
|
82
|
-
@env.ui.warn I18n.t("#{I18N_KEY}.missing_command", i18n_args)
|
83
|
-
@env.ui.warn I18n.t("#{I18N_KEY}.def_ignored")
|
84
|
-
@env.ui.warn ''
|
85
|
-
end
|
77
|
+
unless valid_script?(options[:script])
|
78
|
+
return warn_def_ignored('command_no_script', name: name)
|
79
|
+
end
|
86
80
|
|
87
|
-
|
88
|
-
@env.ui.warn I18n.t("#{I18N_KEY}.reserved", name: name)
|
89
|
-
@env.ui.warn I18n.t("#{I18N_KEY}.def_ignored")
|
90
|
-
@env.ui.warn ''
|
81
|
+
@commands[name] = Model::Command.new(options)
|
91
82
|
end
|
83
|
+
# rubocop:enable Metrics/MethodLength
|
92
84
|
|
93
85
|
def resolve_naming_conflicts
|
94
86
|
@chains.keys.each do |chain|
|
95
|
-
next unless
|
87
|
+
next unless valid_command?(chain)
|
88
|
+
|
89
|
+
i18n_msg = 'conflict_command'
|
90
|
+
i18n_msg = 'conflict_internal' if reserved_command?(chain)
|
96
91
|
|
97
|
-
@env.ui.warn I18n.t("#{I18N_KEY}
|
92
|
+
@env.ui.warn I18n.t("#{I18N_KEY}.#{i18n_msg}", name: chain)
|
98
93
|
@env.ui.warn I18n.t("#{I18N_KEY}.chain_ignored")
|
99
94
|
|
100
95
|
@chains.delete(chain)
|
101
96
|
end
|
102
97
|
end
|
103
98
|
|
104
|
-
def script_warning(name)
|
105
|
-
@env.ui.warn I18n.t("#{I18N_KEY}.no_script", name: name)
|
106
|
-
@env.ui.warn I18n.t("#{I18N_KEY}.def_ignored")
|
107
|
-
@env.ui.warn ''
|
108
|
-
end
|
109
|
-
|
110
99
|
def valid_script?(script)
|
111
100
|
return true if script.is_a?(Proc)
|
112
101
|
|
@@ -122,7 +111,8 @@ module VagrantPlugins
|
|
122
111
|
next unless element.is_a?(Hash)
|
123
112
|
next if valid_command?(element[:command])
|
124
113
|
|
125
|
-
|
114
|
+
warn_def_ignored('chain_missing_command',
|
115
|
+
chain: chain, command: element)
|
126
116
|
|
127
117
|
@chains.delete(chain)
|
128
118
|
|
@@ -130,6 +120,12 @@ module VagrantPlugins
|
|
130
120
|
end
|
131
121
|
end
|
132
122
|
end
|
123
|
+
|
124
|
+
def warn_def_ignored(message, args)
|
125
|
+
@env.ui.warn I18n.t("#{I18N_KEY}.#{message}", args)
|
126
|
+
@env.ui.warn I18n.t("#{I18N_KEY}.def_ignored")
|
127
|
+
@env.ui.warn ''
|
128
|
+
end
|
133
129
|
end
|
134
130
|
end
|
135
131
|
end
|
@@ -49,8 +49,10 @@ module VagrantPlugins
|
|
49
49
|
|
50
50
|
def run_script(command, argv)
|
51
51
|
command.run_script(argv)
|
52
|
+
rescue ArgumentError => e
|
53
|
+
script_error(command.name, 'parameter_not_allowed', e.message)
|
52
54
|
rescue KeyError => e
|
53
|
-
param = e.message.match(/{(.+)}/).captures.first
|
55
|
+
param = e.message.match(/key[<{](.+)[}>]/).captures.first
|
54
56
|
|
55
57
|
script_error(command.name, 'missing_parameter', param)
|
56
58
|
rescue OptionParser::InvalidOption => e
|
@@ -9,8 +9,15 @@ module VagrantPlugins
|
|
9
9
|
UTIL = VagrantPlugins::DevCommands::Util
|
10
10
|
|
11
11
|
COMMANDS = {
|
12
|
-
'
|
13
|
-
|
12
|
+
'completion-data' => NAMESPACE_MODEL::Command.new(
|
13
|
+
NAMESPACE_SPEC::COMPLETION_DATA
|
14
|
+
),
|
15
|
+
'help' => NAMESPACE_MODEL::Command.new(
|
16
|
+
NAMESPACE_SPEC::HELP
|
17
|
+
),
|
18
|
+
'version' => NAMESPACE_MODEL::Command.new(
|
19
|
+
NAMESPACE_SPEC::VERSION
|
20
|
+
)
|
14
21
|
}.freeze
|
15
22
|
|
16
23
|
def initialize(plugin, argv, env, registry)
|
@@ -19,10 +26,7 @@ module VagrantPlugins
|
|
19
26
|
@env = env
|
20
27
|
@registry = registry
|
21
28
|
|
22
|
-
@internal =
|
23
|
-
'help' => NAMESPACE_CMD::Help.new(env, registry),
|
24
|
-
'version' => NAMESPACE_CMD::Version.new(env)
|
25
|
-
}
|
29
|
+
@internal = internal_commands
|
26
30
|
end
|
27
31
|
|
28
32
|
def run(command, args = nil)
|
@@ -33,6 +37,17 @@ module VagrantPlugins
|
|
33
37
|
|
34
38
|
private
|
35
39
|
|
40
|
+
def internal_commands
|
41
|
+
{
|
42
|
+
'completion-data' => NAMESPACE_CMD::CompletionData.new(
|
43
|
+
@env, @registry
|
44
|
+
),
|
45
|
+
|
46
|
+
'help' => NAMESPACE_CMD::Help.new(@env, @registry),
|
47
|
+
'version' => NAMESPACE_CMD::Version.new(@env)
|
48
|
+
}
|
49
|
+
end
|
50
|
+
|
36
51
|
def run_argv
|
37
52
|
argv = @argv.dup
|
38
53
|
|
@@ -2,15 +2,14 @@ module VagrantPlugins
|
|
2
2
|
module DevCommands
|
3
3
|
# Utility module
|
4
4
|
class Util
|
5
|
-
JARO_WINKLER = VagrantPlugins::DevCommands::Util::JaroWinkler
|
6
|
-
|
7
5
|
def self.argv_command(argv, env)
|
8
6
|
return nil if argv.empty?
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
8
|
+
if machine_name?(argv[0].to_s, env.machine_index) && argv.length > 1
|
9
|
+
argv[1].to_s
|
10
|
+
else
|
11
|
+
argv[0].to_s
|
12
|
+
end
|
14
13
|
end
|
15
14
|
|
16
15
|
def self.collect_flags(flags)
|
@@ -32,15 +31,17 @@ module VagrantPlugins
|
|
32
31
|
end
|
33
32
|
|
34
33
|
def self.did_you_mean(command, registry)
|
35
|
-
alternatives = registry.commands.keys +
|
34
|
+
alternatives = registry.commands.keys +
|
35
|
+
registry.chains.keys +
|
36
|
+
Registry::RESERVED_COMMANDS
|
36
37
|
distances = {}
|
37
38
|
|
38
39
|
alternatives.each do |alternative|
|
39
|
-
calculator =
|
40
|
+
calculator = Util::JaroWinkler.new(command, alternative)
|
40
41
|
distances[alternative] = calculator.distance
|
41
42
|
end
|
42
43
|
|
43
|
-
distances
|
44
|
+
distances
|
44
45
|
end
|
45
46
|
|
46
47
|
def self.machine_name?(name, machine_index)
|
data/lib/vagrant/devcommands.rb
CHANGED
@@ -16,6 +16,7 @@ require 'vagrant/devcommands/model/command'
|
|
16
16
|
|
17
17
|
require 'vagrant/devcommands/help_printer/chain'
|
18
18
|
require 'vagrant/devcommands/help_printer/command'
|
19
|
+
require 'vagrant/devcommands/internal_command/completion_data'
|
19
20
|
require 'vagrant/devcommands/internal_command/help'
|
20
21
|
require 'vagrant/devcommands/internal_command/version'
|
21
22
|
|
data/locales/en.yml
CHANGED
@@ -1,45 +1,52 @@
|
|
1
1
|
en:
|
2
2
|
vagrant_devcommands:
|
3
3
|
internal:
|
4
|
+
completion-data:
|
5
|
+
desc: provides shell completion data
|
6
|
+
help: Returns a list of all defined commands separated using spaces.
|
4
7
|
help:
|
5
|
-
desc:
|
8
|
+
desc: get some plugin help
|
6
9
|
help: |-
|
7
10
|
Display the help of the command given as the first argument if defined.
|
8
11
|
Just like this help for the help command!
|
9
|
-
usage: "Usage:
|
12
|
+
usage: "Usage: %<what>s"
|
10
13
|
version:
|
11
|
-
desc:
|
12
|
-
help:
|
14
|
+
desc: get currently installed plugin version
|
15
|
+
help: Displays the currently installed version of the plugin you are using right now.
|
13
16
|
|
14
17
|
message:
|
15
|
-
chain_no_help:
|
16
|
-
command_no_help:
|
18
|
+
chain_no_help: No detailed help for this chain available.
|
19
|
+
command_no_help: No detailed help for this command available.
|
17
20
|
deprecated_box_config: |-
|
18
21
|
At least one of your commands is configured with the deprecated
|
19
22
|
option ':box'. This option has been renamed to ':machine' and will
|
20
23
|
stop working in a future version. Please update your Commandfile.
|
21
|
-
missing_commandfile:
|
22
|
-
no_commands:
|
24
|
+
missing_commandfile: Missing Commandfile
|
25
|
+
no_commands: No commands defined!
|
23
26
|
plugin_readme: |-
|
24
27
|
For detailed plugin usage information please read
|
25
28
|
the README.md at the original source location:
|
26
29
|
>>> https://github.com/mneudert/vagrant-devcommands
|
27
30
|
A copy of this file should be locally available at:
|
28
|
-
>>>
|
31
|
+
>>> %<readme>s
|
29
32
|
plugin_usage: |-
|
30
33
|
Usage: vagrant run [machine] <command>
|
31
34
|
Help: vagrant run help <command>
|
32
35
|
|
33
36
|
registry:
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
chain_empty: "The chain '%<name>s' has no commands associated."
|
38
|
+
chain_ignored: Your chain definition will be ignored in favor of the command.
|
39
|
+
chain_missing_command: "The chain '%<chain>s' is using at least one unknown command ('%<command>s')."
|
40
|
+
chain_name_space: "The chain '%<name>s' contains spaces in it's name."
|
41
|
+
command_name_space: "The command '%<name>s' contains spaces in it's name."
|
42
|
+
command_no_script: "The command '%<name>s' has no script defined to execute."
|
43
|
+
command_reserved: "The command name '%<name>s' is reserved for internal usage."
|
44
|
+
conflict_command: "The name '%<name>s' is used for both a command and a chain."
|
45
|
+
conflict_internal: "The name '%<name>s' is used for both an internal command and a chain."
|
46
|
+
def_ignored: Your definition of it will be ignored.
|
41
47
|
|
42
48
|
runner:
|
43
|
-
invalid_parameter: "invalid parameter '
|
44
|
-
missing_parameter: "missing parameter '
|
45
|
-
|
49
|
+
invalid_parameter: "invalid parameter '%<detail>s'"
|
50
|
+
missing_parameter: "missing parameter '%<detail>s'"
|
51
|
+
parameter_not_allowed: "parameter value not allowed: '%<detail>s'"
|
52
|
+
script_error: "Could not execute '%<command>s': %<error>s"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-devcommands
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.10.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc Neudert
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coveralls
|
@@ -82,6 +82,7 @@ files:
|
|
82
82
|
- lib/vagrant/devcommands/commandfile.rb
|
83
83
|
- lib/vagrant/devcommands/help_printer/chain.rb
|
84
84
|
- lib/vagrant/devcommands/help_printer/command.rb
|
85
|
+
- lib/vagrant/devcommands/internal_command/completion_data.rb
|
85
86
|
- lib/vagrant/devcommands/internal_command/help.rb
|
86
87
|
- lib/vagrant/devcommands/internal_command/version.rb
|
87
88
|
- lib/vagrant/devcommands/internal_spec.rb
|
@@ -119,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
120
|
version: '0'
|
120
121
|
requirements: []
|
121
122
|
rubyforge_project:
|
122
|
-
rubygems_version: 2.
|
123
|
+
rubygems_version: 2.5.2
|
123
124
|
signing_key:
|
124
125
|
specification_version: 4
|
125
126
|
summary: Runs vagrant commands from a Commandfile
|