vagrant-devcommands 0.3.0 → 0.4.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ec61d0c70a777b0ee45eaa801f90259553d7d3a6
4
- data.tar.gz: b230c5d5e67753087b152e54ec38ca395b2bdc30
3
+ metadata.gz: 582303dc5434a37e980ebc5345eb39a75d229d8f
4
+ data.tar.gz: 110bdb1cda070d37745cdfd2cf44d16c74a9e3c8
5
5
  SHA512:
6
- metadata.gz: bc241b3fb2810f89b3145c21cceb1169a89ec75f035865088f365d74c72671baab996d057346945c10c03ab5dae4377347e9c857f3468d426ee72e6996eeb1f5
7
- data.tar.gz: d98282d205e143f5503582d251e52d66d12bf41abbf1a1b02136cfbf7849d1473a0b6f3a42cf4f0f6afacad3ac00d54a5d9edd0f05f0b6b0971715ab70bea1de
6
+ metadata.gz: 7b9110c730003d6bfaf764bf50017a839b2f35708a19e1f027469deb93ed1426fd8c7f83ec7dcafe2bd8ae5ea34b8580d61945baba2a3747b90ed9c32b1d53c5
7
+ data.tar.gz: 4c8f3c651c7673f5d08173b461b63da3a02a2c0d6b0757287c367a408b6630fc6f0530f65d911d869df7870381596c3d8e8552f88331560f069d4952a1c7da39
data/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## v0.4.0 (2015-12-13)
4
+
5
+ - Enhancements
6
+ - `vagrant run help` prints the plugin help (same as `vagrant run`)
7
+ - `vagrant run version` prints the currently used plugin version
8
+ - Commands can receive additional parameters from the command line
9
+
10
+ - Backwards incompatible changes
11
+ - Command names `help` and `version` are reserved for internal usage
12
+ - Depecrated command definer was removed
13
+
14
+ - Bug fixes
15
+ - Commands without a script display a message and are ignored
16
+
3
17
  ## v0.3.0 (2015-11-21)
4
18
 
5
19
  - Enhancements
data/README.md CHANGED
@@ -18,6 +18,25 @@ command 'with_options',
18
18
  script: 'hostname'
19
19
  ```
20
20
 
21
+ #### Command Definition (parameters)
22
+
23
+ Passing additional parameters to a command is (minimally) supported using an
24
+ sprintf syntax:
25
+
26
+ ```ruby
27
+ command 'with_param', script: 'echo "%s"'
28
+ ```
29
+
30
+ This allows you to execute the following command:
31
+
32
+ ```shell
33
+ # will execute something like 'echo "works"'
34
+ vagrant run with_param works
35
+ ```
36
+
37
+ For now a command expecting one or more parameters will fail if the user does
38
+ not provide them. Any arguments exceeding the number used are silently
39
+ discarded.
21
40
 
22
41
  ### Command Listing
23
42
 
@@ -13,18 +13,13 @@ module VagrantPlugins
13
13
  end
14
14
 
15
15
  def execute
16
- command = @argv.last
17
- commandfile = Commandfile.new(@env)
18
-
19
- return display_error('Missing "Commandfile"') unless commandfile.exist?
16
+ return 127 unless read_commandfile
20
17
 
21
- @registry.read_commandfile(commandfile)
18
+ command = argv_command
22
19
 
23
- return display_help unless command
20
+ return 127 unless check_command(command)
24
21
 
25
- unless @registry.valid_command?(command)
26
- return display_error("Invalid command \"#{command}\"\n")
27
- end
22
+ return run_internal(command) if @registry.reserved_command?(command)
28
23
 
29
24
  run @registry.commands[command]
30
25
  end
@@ -33,41 +28,90 @@ module VagrantPlugins
33
28
 
34
29
  attr_accessor :registry
35
30
 
31
+ def check_command(command)
32
+ unless command
33
+ run_internal('help')
34
+ return false
35
+ end
36
+
37
+ unless @registry.valid_command?(command)
38
+ display_error("Invalid command \"#{command}\"\n")
39
+ return false
40
+ end
41
+
42
+ true
43
+ end
44
+
45
+ def argv_command
46
+ return nil unless @argv.length
47
+
48
+ command = @argv[0]
49
+ command = @argv[1] if @env.machine_index.include?(command)
50
+
51
+ command
52
+ end
53
+
36
54
  def display_error(msg)
37
- puts(msg) && display_help
55
+ puts(msg) && run_internal('help')
38
56
  end
39
57
 
40
- def display_help
41
- Help.display(@registry)
58
+ def read_commandfile
59
+ commandfile = Commandfile.new(@env)
42
60
 
43
- # return exit code
44
- 127
61
+ unless commandfile.exist?
62
+ display_error('Missing "Commandfile"')
63
+ return false
64
+ end
65
+
66
+ @registry.read_commandfile(commandfile)
67
+
68
+ true
45
69
  end
46
70
 
47
71
  def run(command)
48
- argv = run_argv(command)
72
+ argv = run_argv
73
+ box = run_box(command)
74
+ script = run_script(command[:script], argv)
49
75
 
50
- with_target_vms(argv, single_target: true) do |vm|
76
+ return 2 unless script
77
+
78
+ with_target_vms(box, single_target: true) do |vm|
51
79
  env = vm.action(:ssh_run,
52
80
  ssh_opts: { extra_args: ['-q'] },
53
- ssh_run_command: command[:script])
81
+ ssh_run_command: script)
54
82
 
55
83
  return env[:ssh_run_exit_status] || 0
56
84
  end
57
85
  end
58
86
 
59
- def run_argv(cmd)
87
+ def run_argv
60
88
  argv = @argv.dup
61
- argv.pop
62
-
63
- if cmd[:box] && argv.empty?
64
- argv.unshift(cmd[:box].to_s)
65
- elsif cmd[:box] && 1 == argv.size
66
- argv[0] = cmd[:box].to_s
67
- end
68
89
 
90
+ argv.shift if @env.machine_index.include?(argv[0])
91
+ argv.shift
69
92
  argv
70
93
  end
94
+
95
+ def run_box(cmd)
96
+ return cmd[:box] if cmd[:box]
97
+ return @argv[0] if @env.machine_index.include?(@argv[0])
98
+
99
+ nil
100
+ end
101
+
102
+ def run_internal(command)
103
+ Internal.new(@registry).run(command)
104
+ end
105
+
106
+ def run_script(script, argv)
107
+ script % argv
108
+ rescue ArgumentError
109
+ error = "Not enough parameters to execute \"command[:name]\"!"
110
+
111
+ display_error(error)
112
+
113
+ nil
114
+ end
71
115
  end
72
116
  end
73
117
  end
@@ -0,0 +1,55 @@
1
+ module VagrantPlugins
2
+ module DevCommands
3
+ # Handles internal commands and their execution.
4
+ class Internal
5
+ def initialize(registry)
6
+ @registry = registry
7
+ end
8
+
9
+ def run(command)
10
+ case command
11
+ when 'help'
12
+ print_help
13
+ when 'version'
14
+ print_version
15
+ end
16
+
17
+ 0
18
+ end
19
+
20
+ private
21
+
22
+ def print_help
23
+ if @registry.commands.empty?
24
+ puts 'No commands defined!'
25
+ return
26
+ end
27
+
28
+ display_help_header
29
+ display_help_commands
30
+ end
31
+
32
+ def display_help_commands
33
+ pad_to = @registry.commands.keys.map(&:length).max
34
+
35
+ @registry.commands.each do |name, command|
36
+ if command.key?(:desc)
37
+ puts " #{name.ljust(pad_to)} #{command[:desc]}"
38
+ else
39
+ puts " #{name}"
40
+ end
41
+ end
42
+ end
43
+
44
+ def display_help_header
45
+ puts 'Usage: vagrant run [box] <command>'
46
+ puts ''
47
+ puts 'Available commands:'
48
+ end
49
+
50
+ def print_version
51
+ puts "vagrant-devcommands, version #{VERSION}"
52
+ end
53
+ end
54
+ end
55
+ end
@@ -2,6 +2,8 @@ module VagrantPlugins
2
2
  module DevCommands
3
3
  # Vagrant command registry
4
4
  class Registry
5
+ RESERVED_COMMANDS = %w(help version)
6
+
5
7
  attr_accessor :commands
6
8
 
7
9
  def initialize
@@ -12,36 +14,39 @@ module VagrantPlugins
12
14
  contents = commandfile.path.read
13
15
 
14
16
  instance_eval(contents)
15
- append_legacy
17
+ end
18
+
19
+ def reserved_command?(command)
20
+ RESERVED_COMMANDS.include?(command)
16
21
  end
17
22
 
18
23
  def valid_command?(command)
19
- @commands.include? command
24
+ @commands.include?(command) || reserved_command?(command)
20
25
  end
21
26
 
22
27
  private
23
28
 
24
- def append_legacy
25
- unless Definer.commands.empty?
26
- puts "You are using a deprecated way of defining your commands.\n" \
27
- 'The methods you are using will be removed in an upcoming' \
28
- " release.\nPlease update your Commandfile!\n\nMore details: " \
29
- 'https://github.com/mneudert/vagrant-devcommands'
30
- end
29
+ def command(name, options)
30
+ return reserved_warning(name) if reserved_command?(name)
31
+
32
+ options = { script: options } if options.is_a?(String)
31
33
 
32
- Definer.commands.each do |name, options|
33
- next if @commands.include?(name)
34
+ return script_warning(name) unless options.key?(:script)
34
35
 
35
- command(name, options)
36
- end
36
+ @commands[name] = options
37
+ @commands[name][:name] = name
37
38
  end
38
39
 
39
- def command(name, options)
40
- if options.is_a?(String)
41
- @commands[name] = { script: options }
42
- else
43
- @commands[name] = options
44
- end
40
+ def script_warning(name)
41
+ puts "The command '#{name}' has no script defined to execute."
42
+ puts 'Your definition of it will be ignored.'
43
+ puts ''
44
+ end
45
+
46
+ def reserved_warning(name)
47
+ puts "The command name '#{name}' is reserved for internal usage."
48
+ puts 'Your definition of it will be ignored.'
49
+ puts ''
45
50
  end
46
51
  end
47
52
  end
@@ -1,6 +1,6 @@
1
1
  module VagrantPlugins
2
2
  # Defines the current plugin version
3
3
  module DevCommands
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
6
6
  end
@@ -2,10 +2,7 @@ require 'vagrant'
2
2
 
3
3
  require 'vagrant/devcommands/command'
4
4
  require 'vagrant/devcommands/commandfile'
5
- require 'vagrant/devcommands/definer'
6
- require 'vagrant/devcommands/help'
5
+ require 'vagrant/devcommands/internal'
7
6
  require 'vagrant/devcommands/plugin'
8
7
  require 'vagrant/devcommands/registry'
9
8
  require 'vagrant/devcommands/version'
10
-
11
- require 'vagrant/devcommands/_proxy'
metadata CHANGED
@@ -1,29 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vagrant-devcommands
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.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: 2015-11-21 00:00:00.000000000 Z
11
+ date: 2015-12-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 1.5.2
20
+ - - "<="
18
21
  - !ruby/object:Gem::Version
19
- version: '1.8'
22
+ version: 1.10.6
20
23
  type: :development
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
23
26
  requirements:
24
- - - "~>"
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: 1.5.2
30
+ - - "<="
25
31
  - !ruby/object:Gem::Version
26
- version: '1.8'
32
+ version: 1.10.6
27
33
  - !ruby/object:Gem::Dependency
28
34
  name: coveralls
29
35
  requirement: !ruby/object:Gem::Requirement
@@ -92,11 +98,9 @@ files:
92
98
  - LICENSE.txt
93
99
  - README.md
94
100
  - lib/vagrant/devcommands.rb
95
- - lib/vagrant/devcommands/_proxy.rb
96
101
  - lib/vagrant/devcommands/command.rb
97
102
  - lib/vagrant/devcommands/commandfile.rb
98
- - lib/vagrant/devcommands/definer.rb
99
- - lib/vagrant/devcommands/help.rb
103
+ - lib/vagrant/devcommands/internal.rb
100
104
  - lib/vagrant/devcommands/plugin.rb
101
105
  - lib/vagrant/devcommands/registry.rb
102
106
  - lib/vagrant/devcommands/version.rb
@@ -1,6 +0,0 @@
1
- # Proxy class to make Commandfile definitions more readable.
2
- class VagrantDevCommands
3
- def self.define(name, options)
4
- VagrantPlugins::DevCommands::Definer.define(name, options)
5
- end
6
- end
@@ -1,24 +0,0 @@
1
- module VagrantPlugins
2
- module DevCommands
3
- # Public interface to define and access commands.
4
- class Definer
5
- class << self; attr_accessor :commands end
6
-
7
- @commands = {}
8
-
9
- def self.define(name, options)
10
- if options.is_a?(String)
11
- @commands[name] = { script: options }
12
- else
13
- if options.include?(:command)
14
- options[:script] = options[:command]
15
-
16
- options.delete(:command)
17
- end
18
-
19
- @commands[name] = options
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,40 +0,0 @@
1
- module VagrantPlugins
2
- module DevCommands
3
- # Defines the help output
4
- #
5
- # Printed when running "vagrant run" without a command
6
- class Help
7
- def self.display(registry)
8
- if registry.commands.empty?
9
- puts 'No commands defined!'
10
- return
11
- end
12
-
13
- display_header
14
- display_commands(registry)
15
- end
16
-
17
- class << self
18
- private
19
-
20
- def display_commands(registry)
21
- pad_to = registry.commands.keys.map(&:length).max
22
-
23
- registry.commands.each do |name, command|
24
- if command.key?(:desc)
25
- puts " #{name.ljust(pad_to)} #{command[:desc]}"
26
- else
27
- puts " #{name}"
28
- end
29
- end
30
- end
31
-
32
- def display_header
33
- puts 'Usage: vagrant run [box] <command>'
34
- puts ''
35
- puts 'Available commands:'
36
- end
37
- end
38
- end
39
- end
40
- end