vagrant-devcommands 0.11.1 → 0.12.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/CHANGELOG.md +12 -0
- data/README.md +39 -22
- data/lib/vagrant/devcommands.rb +1 -1
- data/lib/vagrant/devcommands/command.rb +0 -8
- data/lib/vagrant/devcommands/messages.rb +0 -5
- data/lib/vagrant/devcommands/model/command.rb +19 -8
- data/lib/vagrant/devcommands/registry.rb +67 -4
- data/lib/vagrant/devcommands/registry/messager.rb +10 -0
- data/lib/vagrant/devcommands/version.rb +1 -1
- data/locales/en.yml +2 -4
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: '08d7a51ae5cc5cc9d25df475e2724c86d040db68249141512a4b6b6a618919cd'
|
4
|
+
data.tar.gz: 362279f7c92feb9f9ecf0b90de497a99df5fb41f362713e28b92b1b94d167752
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43e5dd302ca02025014a022557176f2e590b7bd96b1f3a8c5db708320c5ec56960cfc7039b1f5b806b60185e93e6940b51ca7ce4009c150944e1a55f0f27e9aa
|
7
|
+
data.tar.gz: 37c8f76d57a861f730cddbeef9bafe5d053c3f85a07f37e3267a201ec057d72e3e82e3e7b27bf6ff5dd8526f7c85260918a095fe23816d90e4f794c88fe9f01b
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## v0.12.0 (2018-04-21)
|
4
|
+
|
5
|
+
- Enhancements
|
6
|
+
- Command parameters can define alias values to be replaced before escaping
|
7
|
+
- Commandfile entries with duplicate names will now issue a warning while
|
8
|
+
still discarding all previous definitions
|
9
|
+
- Commandfile entries with unknown options will issue a warning
|
10
|
+
|
11
|
+
- Backwards incompatible changes
|
12
|
+
- Support for the already deprecated configuration parameter `:box` has
|
13
|
+
been removed
|
14
|
+
|
3
15
|
## v0.11.1 (2017-10-04)
|
4
16
|
|
5
17
|
- Bug fixes
|
data/README.md
CHANGED
@@ -32,7 +32,7 @@ Add to a `Commandfile` besides your `Vagrantfile`:
|
|
32
32
|
command 'basic', 'hostname'
|
33
33
|
|
34
34
|
command 'with_options',
|
35
|
-
machine:
|
35
|
+
machine: 'my_machine',
|
36
36
|
desc: 'executes "hostname" on the machine "my_machine"',
|
37
37
|
script: 'hostname',
|
38
38
|
tty: true,
|
@@ -47,7 +47,7 @@ eoh
|
|
47
47
|
```
|
48
48
|
|
49
49
|
_Note_: If you are defining literal `%` (percent sign) in your commands you
|
50
|
-
have to escape them using a second `%`. For example `date
|
50
|
+
have to escape them using a second `%`. For example `date '+%%Y-%%m-%%d'`.
|
51
51
|
|
52
52
|
_Note_: Spaces in command names are not supported. Definitions with spaces will
|
53
53
|
be ignored.
|
@@ -64,10 +64,10 @@ sprintf syntax:
|
|
64
64
|
command 'with_param',
|
65
65
|
parameters: {
|
66
66
|
# mandatory parameter with a description
|
67
|
-
p_mandatory: { desc:
|
67
|
+
p_mandatory: { desc: 'mandatory parameter to do... stuff!' },
|
68
68
|
|
69
69
|
# parameter with default (implies optional)
|
70
|
-
p_default: { default:
|
70
|
+
p_default: { default: 'always' },
|
71
71
|
|
72
72
|
# parameter with escaping rule
|
73
73
|
p_escaped: { escape: { '*' => '\\' }},
|
@@ -76,7 +76,12 @@ command 'with_param',
|
|
76
76
|
p_optional: { optional: true },
|
77
77
|
|
78
78
|
# wrapped option value
|
79
|
-
p_wrapped: { wrap:
|
79
|
+
p_wrapped: { wrap: '--and %s wrapped' },
|
80
|
+
|
81
|
+
# parameters with aliased values
|
82
|
+
# the aliases are resolved prior to escaping/wrapping/allowance!
|
83
|
+
# aliases are resolved in order of definition (multiple can apply)
|
84
|
+
p_aliased: { aliases: { 'foo' => 'bar' }},
|
80
85
|
|
81
86
|
# parameters with a limited set of allowed values
|
82
87
|
# the allowed values are checked prior to escaping/wrapping!
|
@@ -89,17 +94,17 @@ command 'with_param',
|
|
89
94
|
This allows you to execute the following command:
|
90
95
|
|
91
96
|
```shell
|
92
|
-
# will execute 'echo works always'
|
97
|
+
# will execute 'echo "works always"'
|
93
98
|
vagrant run with_param --p_mandatory works
|
94
99
|
|
95
|
-
# will execute 'echo works always like a charm'
|
96
|
-
vagrant run with_param --p_mandatory works --p_optional
|
100
|
+
# will execute 'echo "works always like a charm"'
|
101
|
+
vagrant run with_param --p_mandatory works --p_optional 'like a charm'
|
97
102
|
|
98
|
-
# will execute 'echo works sometimes like a charm --and is wrapped completely'
|
103
|
+
# will execute 'echo "works sometimes like a charm --and is wrapped completely"'
|
99
104
|
vagrant run with_param \
|
100
105
|
--p_mandatory works \
|
101
106
|
--p_default sometimes \
|
102
|
-
--p_optional
|
107
|
+
--p_optional 'like a charm' \
|
103
108
|
--p_wrapped is
|
104
109
|
--p_limited completely
|
105
110
|
```
|
@@ -108,7 +113,7 @@ For now a command expecting one or more parameters will fail if the user does
|
|
108
113
|
not provide them. Any arguments exceeding the number used are silently
|
109
114
|
discarded.
|
110
115
|
|
111
|
-
Escaping rules are defined as `{
|
116
|
+
Escaping rules are defined as `{ 'char_to_escape' => 'char_to_use_as_escape' }`.
|
112
117
|
These are applied prior to interpolation into the command. Regular ruby escaping
|
113
118
|
rules apply.
|
114
119
|
|
@@ -120,8 +125,8 @@ for later command interpolation:
|
|
120
125
|
```ruby
|
121
126
|
command 'with_flags',
|
122
127
|
flags: {
|
123
|
-
f_standard: { desc:
|
124
|
-
f_valued: { value:
|
128
|
+
f_standard: { desc: 'standard flag' },
|
129
|
+
f_valued: { value: '--f_modified' }
|
125
130
|
},
|
126
131
|
script: 'echo "flags: %<f_standard>s"'
|
127
132
|
```
|
@@ -139,7 +144,7 @@ vagrant run with_flags --f_standard
|
|
139
144
|
vagrant run with_flags --f_valued
|
140
145
|
```
|
141
146
|
|
142
|
-
By default a flag gets interpolated as
|
147
|
+
By default a flag gets interpolated as `--#{flagname}`. If a value is defined
|
143
148
|
this value will be interpolated unmodified.
|
144
149
|
|
145
150
|
#### Commands defined by Lambda/Proc
|
@@ -154,7 +159,19 @@ command 'from_proc', script: proc { 'echo "proc works"' }
|
|
154
159
|
|
155
160
|
These will be evaluated when running the command.
|
156
161
|
|
157
|
-
Every rule from regular scripts (parameters, escaping
|
162
|
+
Every rule from regular scripts (parameters, escaping `%`, ...) still apply.
|
163
|
+
|
164
|
+
#### Commands with a TTY ("interactive")
|
165
|
+
|
166
|
+
If you have a command that expects some sort of interaction with the user you
|
167
|
+
may need to set the `tty` option for a command:
|
168
|
+
|
169
|
+
```ruby
|
170
|
+
command 'interactive', tty: true
|
171
|
+
```
|
172
|
+
|
173
|
+
This allows full interaction with programs like `irb` or `mysql`.
|
174
|
+
|
158
175
|
|
159
176
|
### Global Command Definitions
|
160
177
|
|
@@ -222,11 +239,11 @@ chain 'my_customized_chain',
|
|
222
239
|
Running the chain will execute the following commands:
|
223
240
|
|
224
241
|
```shell
|
225
|
-
> vagrant run my_customized_chain --first=
|
242
|
+
> vagrant run my_customized_chain --first='initial' --second='initial'
|
226
243
|
|
227
|
-
vagrant run chainecho --first=
|
228
|
-
vagrant run chainecho --first=
|
229
|
-
vagrant run chainecho --first=
|
244
|
+
vagrant run chainecho --first='param' --second='initial'
|
245
|
+
vagrant run chainecho --first='initial' --second='initial'
|
246
|
+
vagrant run chainecho --first='param' --second='param'
|
230
247
|
```
|
231
248
|
|
232
249
|
By default every command will be executed using the machine defined by the
|
@@ -286,7 +303,7 @@ installed plugin has a version below `1.3.3.7`.
|
|
286
303
|
Please be aware that returning from a global commandfile completely skips
|
287
304
|
evaluating a local one.
|
288
305
|
|
289
|
-
###
|
306
|
+
### Command Alias Definitions
|
290
307
|
|
291
308
|
For commands you want to keep generic but often call with a specific set of
|
292
309
|
parameter values you can define an alias:
|
@@ -340,9 +357,9 @@ a sigil notation like the following:
|
|
340
357
|
```ruby
|
341
358
|
command 'long_running_task',
|
342
359
|
script: %(cd /path/to/somewhere \
|
343
|
-
&& echo
|
360
|
+
&& echo 'starting long running task' \
|
344
361
|
&& ./long_running_task.sh \
|
345
|
-
&& echo
|
362
|
+
&& echo 'finished long running task')
|
346
363
|
```
|
347
364
|
|
348
365
|
Using a quote delimited command definition might otherwise result in not that
|
data/lib/vagrant/devcommands.rb
CHANGED
@@ -19,8 +19,6 @@ module VagrantPlugins
|
|
19
19
|
def execute
|
20
20
|
return 127 unless read_commandfile
|
21
21
|
|
22
|
-
deprecated_box_config?
|
23
|
-
|
24
22
|
command = Util.argv_command(@argv, @env)
|
25
23
|
|
26
24
|
return 127 unless non_empty?(command)
|
@@ -47,12 +45,6 @@ module VagrantPlugins
|
|
47
45
|
@registry.available?(command)
|
48
46
|
end
|
49
47
|
|
50
|
-
def deprecated_box_config?
|
51
|
-
return unless @registry.commands.values.any?(&:deprecated_box_config)
|
52
|
-
|
53
|
-
Messages.deprecated_box_config(&@env.ui.method(:warn))
|
54
|
-
end
|
55
|
-
|
56
48
|
def display_alternatives(command)
|
57
49
|
alternatives = Util.did_you_mean(command, @registry)
|
58
50
|
alternatives = alternatives.select { |_k, v| v > 0.8 }
|
@@ -18,11 +18,6 @@ module VagrantPlugins
|
|
18
18
|
out.call I18n.t("#{I18N_KEY}.command_no_help")
|
19
19
|
end
|
20
20
|
|
21
|
-
def self.deprecated_box_config(&out)
|
22
|
-
out.call I18n.t("#{I18N_KEY}.deprecated_box_config")
|
23
|
-
out.call ''
|
24
|
-
end
|
25
|
-
|
26
21
|
def self.missing_commandfile(&out)
|
27
22
|
out.call I18n.t("#{I18N_KEY}.missing_commandfile")
|
28
23
|
end
|
@@ -17,9 +17,6 @@ module VagrantPlugins
|
|
17
17
|
attr_reader :help
|
18
18
|
attr_reader :usage
|
19
19
|
|
20
|
-
attr_reader :deprecated_box_config
|
21
|
-
|
22
|
-
# rubocop:disable Metrics/AbcSize
|
23
20
|
def initialize(spec)
|
24
21
|
@name = spec[:name]
|
25
22
|
|
@@ -28,14 +25,11 @@ module VagrantPlugins
|
|
28
25
|
@script = spec[:script]
|
29
26
|
@tty = spec[:tty] == true
|
30
27
|
|
31
|
-
@machine = spec[:machine]
|
28
|
+
@machine = spec[:machine]
|
32
29
|
@desc = spec[:desc]
|
33
30
|
@help = spec[:help]
|
34
31
|
@usage = spec[:usage]
|
35
|
-
|
36
|
-
@deprecated_box_config = spec.key?(:box)
|
37
32
|
end
|
38
|
-
# rubocop:enable Metrics/AbcSize
|
39
33
|
|
40
34
|
def run_script(argv)
|
41
35
|
script = @script
|
@@ -93,10 +87,27 @@ module VagrantPlugins
|
|
93
87
|
end
|
94
88
|
end.parse!(argv)
|
95
89
|
|
96
|
-
|
90
|
+
params = unalias_parameters(params)
|
91
|
+
params = validate_parameters(params)
|
92
|
+
params = escape_parameters(params)
|
93
|
+
params = wrap_parameters(params)
|
94
|
+
params
|
97
95
|
end
|
98
96
|
# rubocop:enable Metrics/MethodLength
|
99
97
|
|
98
|
+
def unalias_parameters(params)
|
99
|
+
@parameters.each do |key, conf|
|
100
|
+
next if params[key].nil?
|
101
|
+
next if conf[:aliases].nil?
|
102
|
+
|
103
|
+
conf[:aliases].each do |input, output|
|
104
|
+
params[key] = params[key] == input ? output : params[key]
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
params
|
109
|
+
end
|
110
|
+
|
100
111
|
def validate_parameters(params)
|
101
112
|
@parameters.each do |key, conf|
|
102
113
|
next if params[key].nil?
|
@@ -15,6 +15,12 @@ module VagrantPlugins
|
|
15
15
|
@chains = {}
|
16
16
|
@commands = {}
|
17
17
|
@command_aliases = {}
|
18
|
+
|
19
|
+
@duplicates = {
|
20
|
+
'chains' => [],
|
21
|
+
'commands' => [],
|
22
|
+
'command_aliases' => []
|
23
|
+
}
|
18
24
|
end
|
19
25
|
|
20
26
|
def available?(name)
|
@@ -46,12 +52,54 @@ module VagrantPlugins
|
|
46
52
|
|
47
53
|
private
|
48
54
|
|
55
|
+
def check_model(model, entry)
|
56
|
+
speccheck_model(model, entry)
|
57
|
+
dupcheck_model(model)
|
58
|
+
end
|
59
|
+
|
60
|
+
def dupcheck_model(model)
|
61
|
+
type = model_attr(model)
|
62
|
+
type_attr = "@#{type}"
|
63
|
+
type_entries = instance_variable_get(type_attr)
|
64
|
+
|
65
|
+
return unless type_entries[model.name]
|
66
|
+
return if @duplicates[type].include?(model.name)
|
67
|
+
|
68
|
+
@messager.def_duplicate(what: model_name(model), name: model.name)
|
69
|
+
@duplicates[type] << model.name
|
70
|
+
end
|
71
|
+
|
72
|
+
def model_attr(model)
|
73
|
+
case model
|
74
|
+
when Model::Chain
|
75
|
+
'chains'
|
76
|
+
when Model::Command
|
77
|
+
'commands'
|
78
|
+
when Model::CommandAlias
|
79
|
+
'command_aliases'
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def model_name(model)
|
84
|
+
case model
|
85
|
+
when Model::Chain
|
86
|
+
'chain'
|
87
|
+
when Model::Command
|
88
|
+
'command'
|
89
|
+
when Model::CommandAlias
|
90
|
+
'command alias'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
49
94
|
def register(commandfile_entries)
|
50
95
|
modeler = Commandfile::Modeler.new
|
51
96
|
|
52
97
|
commandfile_entries.each do |entry|
|
53
98
|
begin
|
54
|
-
|
99
|
+
model = modeler.model(entry)
|
100
|
+
|
101
|
+
check_model(model, entry)
|
102
|
+
register_model(model)
|
55
103
|
rescue ArgumentError => e
|
56
104
|
@messager.def_ignored(e.message, name: entry[:name])
|
57
105
|
end
|
@@ -59,9 +107,24 @@ module VagrantPlugins
|
|
59
107
|
end
|
60
108
|
|
61
109
|
def register_model(model)
|
62
|
-
|
63
|
-
|
64
|
-
|
110
|
+
type = model_attr(model)
|
111
|
+
type_attr = "@#{type}"
|
112
|
+
type_entries = instance_variable_get(type_attr)
|
113
|
+
|
114
|
+
type_entries[model.name] = model
|
115
|
+
|
116
|
+
instance_variable_set(type_attr, type_entries)
|
117
|
+
end
|
118
|
+
|
119
|
+
def speccheck_model(model, spec)
|
120
|
+
return unless spec[:options].is_a?(Hash)
|
121
|
+
|
122
|
+
model_attrs = model.instance_variables
|
123
|
+
spec_attrs = spec[:options].keys.map { |k| :"@#{k}" }
|
124
|
+
|
125
|
+
return if (spec_attrs - model_attrs).empty?
|
126
|
+
|
127
|
+
@messager.unknown_options(what: model_name(model), name: model.name)
|
65
128
|
end
|
66
129
|
end
|
67
130
|
end
|
@@ -19,11 +19,21 @@ module VagrantPlugins
|
|
19
19
|
@env.ui.warn I18n.t("#{I18N_KEY}.command_alias_ignored")
|
20
20
|
end
|
21
21
|
|
22
|
+
def def_duplicate(args)
|
23
|
+
@env.ui.warn I18n.t("#{I18N_KEY}.def_duplicate", args)
|
24
|
+
@env.ui.warn ''
|
25
|
+
end
|
26
|
+
|
22
27
|
def def_ignored(message, args)
|
23
28
|
@env.ui.warn I18n.t("#{I18N_KEY}.#{message}", args)
|
24
29
|
@env.ui.warn I18n.t("#{I18N_KEY}.def_ignored")
|
25
30
|
@env.ui.warn ''
|
26
31
|
end
|
32
|
+
|
33
|
+
def unknown_options(args)
|
34
|
+
@env.ui.warn I18n.t("#{I18N_KEY}.unknown_options", args)
|
35
|
+
@env.ui.warn ''
|
36
|
+
end
|
27
37
|
end
|
28
38
|
end
|
29
39
|
end
|
data/locales/en.yml
CHANGED
@@ -29,10 +29,6 @@ en:
|
|
29
29
|
chain_no_help: No detailed help for this chain available.
|
30
30
|
command_alias_no_help: No detailed help for this command alias available.
|
31
31
|
command_no_help: No detailed help for this command available.
|
32
|
-
deprecated_box_config: |-
|
33
|
-
At least one of your commands is configured with the deprecated
|
34
|
-
option ':box'. This option has been renamed to ':machine' and will
|
35
|
-
stop working in a future version. Please update your Commandfile.
|
36
32
|
missing_commandfile: Missing Commandfile
|
37
33
|
no_commands: No commands defined!
|
38
34
|
plugin_readme: |-
|
@@ -61,6 +57,8 @@ en:
|
|
61
57
|
command_no_script: "The command '%<name>s' has no script defined to execute."
|
62
58
|
command_reserved: "The command name '%<name>s' is reserved for internal usage."
|
63
59
|
def_ignored: Your definition of it will be ignored.
|
60
|
+
def_duplicate: "The %<what>s name '%<name>s' is used more than once. Only the last definition will be available."
|
61
|
+
unknown_options: "The %<what>s '%<name>s' is defined with at least one unknown option."
|
64
62
|
|
65
63
|
runner:
|
66
64
|
invalid_parameter: "invalid parameter '%<detail>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.12.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:
|
11
|
+
date: 2018-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coveralls
|
@@ -44,28 +44,28 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
47
|
+
version: '3.7'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
54
|
+
version: '3.7'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rubocop
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '0.
|
61
|
+
version: '0.55'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '0.
|
68
|
+
version: '0.55'
|
69
69
|
description: Vagrant plugin to run commands specified in a Commandfile inside one
|
70
70
|
of your vagrant boxes
|
71
71
|
email:
|
@@ -128,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
128
128
|
version: '0'
|
129
129
|
requirements: []
|
130
130
|
rubyforge_project:
|
131
|
-
rubygems_version: 2.6
|
131
|
+
rubygems_version: 2.7.6
|
132
132
|
signing_key:
|
133
133
|
specification_version: 4
|
134
134
|
summary: Runs vagrant commands from a Commandfile
|