commander-openflighthpc 2.0.1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +45 -138
  3. data/commander-openflighthpc.gemspec +2 -1
  4. data/lib/commander.rb +3 -4
  5. data/lib/commander/cli.rb +15 -76
  6. data/lib/commander/command.rb +81 -176
  7. data/lib/commander/error_handler.rb +62 -0
  8. data/lib/commander/help_formatters.rb +0 -4
  9. data/lib/commander/help_formatters/terminal.rb +0 -5
  10. data/lib/commander/help_formatters/terminal/command_help.erb +14 -6
  11. data/lib/commander/help_formatters/terminal/help.erb +12 -4
  12. data/lib/commander/runner.rb +92 -130
  13. data/lib/commander/version.rb +1 -1
  14. metadata +21 -46
  15. data/bin/commander +0 -104
  16. data/lib/commander/blank.rb +0 -7
  17. data/lib/commander/core_ext.rb +0 -2
  18. data/lib/commander/core_ext/array.rb +0 -24
  19. data/lib/commander/core_ext/object.rb +0 -8
  20. data/lib/commander/help_formatters/terminal/subcommand_help.erb +0 -23
  21. data/lib/commander/help_formatters/terminal_compact.rb +0 -11
  22. data/lib/commander/help_formatters/terminal_compact/command_help.erb +0 -26
  23. data/lib/commander/help_formatters/terminal_compact/help.erb +0 -29
  24. data/lib/commander/help_formatters/terminal_compact/subcommand_help.erb +0 -15
  25. data/lib/commander/import.rb +0 -5
  26. data/lib/commander/patches/decimal-integer.rb +0 -17
  27. data/lib/commander/patches/help_formatter_binding.rb +0 -15
  28. data/lib/commander/patches/implicit-short-tags.rb +0 -75
  29. data/lib/commander/patches/priority_sort.rb +0 -21
  30. data/lib/commander/patches/validate_inputs.rb +0 -79
  31. data/lib/commander/platform.rb +0 -7
  32. data/spec/command_spec.rb +0 -157
  33. data/spec/configure_spec.rb +0 -37
  34. data/spec/core_ext/array_spec.rb +0 -18
  35. data/spec/core_ext/object_spec.rb +0 -19
  36. data/spec/help_formatters/terminal_compact_spec.rb +0 -69
  37. data/spec/help_formatters/terminal_spec.rb +0 -67
  38. data/spec/methods_spec.rb +0 -61
  39. data/spec/patches/validate_inputs_spec.rb +0 -84
  40. data/spec/runner_spec.rb +0 -672
  41. data/spec/spec_helper.rb +0 -79
  42. data/spec/ui_spec.rb +0 -30
@@ -1,3 +1,3 @@
1
1
  module Commander
2
- VERSION = '2.0.1'.freeze
2
+ VERSION = '2.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: commander-openflighthpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.1
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alces Flight Ltd
@@ -10,22 +10,36 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2020-04-06 00:00:00.000000000 Z
13
+ date: 2020-07-30 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: highline
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - "~>"
19
+ - - ">"
20
20
  - !ruby/object:Gem::Version
21
21
  version: 1.7.2
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - "~>"
26
+ - - ">"
27
27
  - !ruby/object:Gem::Version
28
28
  version: 1.7.2
29
+ - !ruby/object:Gem::Dependency
30
+ name: slop
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '4.8'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '4.8'
29
43
  - !ruby/object:Gem::Dependency
30
44
  name: paint
31
45
  requirement: !ruby/object:Gem::Requirement
@@ -101,8 +115,7 @@ description: The complete solution for Ruby command-line executables. Commander
101
115
  HighLine), while providing many new features, and an elegant API.
102
116
  email:
103
117
  - flight@openflighthpc.org
104
- executables:
105
- - commander
118
+ executables: []
106
119
  extensions: []
107
120
  extra_rdoc_files: []
108
121
  files:
@@ -117,45 +130,18 @@ files:
117
130
  - Manifest
118
131
  - README.md
119
132
  - Rakefile
120
- - bin/commander
121
133
  - commander-openflighthpc.gemspec
122
134
  - lib/commander.rb
123
- - lib/commander/blank.rb
124
135
  - lib/commander/cli.rb
125
136
  - lib/commander/command.rb
126
- - lib/commander/core_ext.rb
127
- - lib/commander/core_ext/array.rb
128
- - lib/commander/core_ext/object.rb
137
+ - lib/commander/error_handler.rb
129
138
  - lib/commander/help_formatters.rb
130
139
  - lib/commander/help_formatters/base.rb
131
140
  - lib/commander/help_formatters/terminal.rb
132
141
  - lib/commander/help_formatters/terminal/command_help.erb
133
142
  - lib/commander/help_formatters/terminal/help.erb
134
- - lib/commander/help_formatters/terminal/subcommand_help.erb
135
- - lib/commander/help_formatters/terminal_compact.rb
136
- - lib/commander/help_formatters/terminal_compact/command_help.erb
137
- - lib/commander/help_formatters/terminal_compact/help.erb
138
- - lib/commander/help_formatters/terminal_compact/subcommand_help.erb
139
- - lib/commander/import.rb
140
- - lib/commander/patches/decimal-integer.rb
141
- - lib/commander/patches/help_formatter_binding.rb
142
- - lib/commander/patches/implicit-short-tags.rb
143
- - lib/commander/patches/priority_sort.rb
144
- - lib/commander/patches/validate_inputs.rb
145
- - lib/commander/platform.rb
146
143
  - lib/commander/runner.rb
147
144
  - lib/commander/version.rb
148
- - spec/command_spec.rb
149
- - spec/configure_spec.rb
150
- - spec/core_ext/array_spec.rb
151
- - spec/core_ext/object_spec.rb
152
- - spec/help_formatters/terminal_compact_spec.rb
153
- - spec/help_formatters/terminal_spec.rb
154
- - spec/methods_spec.rb
155
- - spec/patches/validate_inputs_spec.rb
156
- - spec/runner_spec.rb
157
- - spec/spec_helper.rb
158
- - spec/ui_spec.rb
159
145
  homepage: https://github.com/openflighthpc/commander-openflighthpc
160
146
  licenses:
161
147
  - MIT
@@ -179,15 +165,4 @@ rubygems_version: 3.0.3
179
165
  signing_key:
180
166
  specification_version: 4
181
167
  summary: The complete solution for Ruby command-line executables
182
- test_files:
183
- - spec/command_spec.rb
184
- - spec/configure_spec.rb
185
- - spec/core_ext/array_spec.rb
186
- - spec/core_ext/object_spec.rb
187
- - spec/help_formatters/terminal_compact_spec.rb
188
- - spec/help_formatters/terminal_spec.rb
189
- - spec/methods_spec.rb
190
- - spec/patches/validate_inputs_spec.rb
191
- - spec/runner_spec.rb
192
- - spec/spec_helper.rb
193
- - spec/ui_spec.rb
168
+ test_files: []
@@ -1,104 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'rubygems'
4
- require 'commander/import'
5
-
6
- program :name, 'commander'
7
- program :version, Commander::VERSION
8
- program :description, 'Commander utility program.'
9
-
10
- command :init do |c|
11
- c.syntax = 'commander init [option] <file>'
12
- c.summary = 'Initialize a commander template'
13
- c.description = 'Initialize an empty <file> with a commander template,
14
- allowing very quick creation of commander executables.'
15
- c.example 'Create a new classic style template file.', 'commander init bin/my_executable'
16
- c.example 'Create a new modular style template file.', 'commander init --modular bin/my_executable'
17
- c.option '-m', '--modular', 'Initialize a modular style template'
18
- c.action do |args, options|
19
- file = args.shift || abort('file argument required.')
20
- name = ask 'Machine name of program: '
21
- description = ask 'Describe your program: '
22
- commands = ask_for_array 'List the commands you wish to create: '
23
- begin
24
- if options.modular
25
- File.open(file, 'w') do |f|
26
- f.write <<-"...".gsub!(/^ {10}/, '')
27
- #!/usr/bin/env ruby
28
-
29
- require 'rubygems'
30
- require 'commander'
31
-
32
- class MyApplication
33
- include Commander::Methods
34
- # include whatever modules you need
35
-
36
- def run
37
- program :name, '#{name}'
38
- program :version, '0.0.1'
39
- program :description, '#{description}'
40
-
41
- ...
42
- commands.each do |command|
43
- f.write <<-"...".gsub!(/^ {12}/, '')
44
- command :#{command} do |c|
45
- c.syntax = '#{name} #{command} [options]'
46
- c.summary = ''
47
- c.description = ''
48
- c.example 'description', 'command example'
49
- c.option '--some-switch', 'Some switch that does something'
50
- c.action do |args, options|
51
- # Do something or c.when_called #{name.capitalize}::Commands::#{command.capitalize}
52
- end
53
- end
54
-
55
- ...
56
- end
57
- f.write <<-"...".gsub!(/^ {12}/, '')
58
- run!
59
- end
60
- end
61
-
62
- MyApplication.new.run if $0 == __FILE__
63
- ...
64
- end
65
-
66
- File.chmod(0755, file)
67
- say "Initialized modular template in #{file}"
68
- else
69
- File.open(file, 'w') do |f|
70
- f.write <<-"...".gsub!(/^ {10}/, '')
71
- #!/usr/bin/env ruby
72
-
73
- require 'rubygems'
74
- require 'commander/import'
75
-
76
- program :name, '#{name}'
77
- program :version, '0.0.1'
78
- program :description, '#{description}'
79
-
80
- ...
81
- commands.each do |command|
82
- f.write <<-"...".gsub!(/^ {12}/, '')
83
- command :#{command} do |c|
84
- c.syntax = '#{name} #{command} [options]'
85
- c.summary = ''
86
- c.description = ''
87
- c.example 'description', 'command example'
88
- c.option '--some-switch', 'Some switch that does something'
89
- c.action do |args, options|
90
- # Do something or c.when_called #{name.capitalize}::Commands::#{command.capitalize}
91
- end
92
- end
93
-
94
- ...
95
- end
96
- end
97
- File.chmod 0755, file
98
- say "Initialized template in #{file}"
99
- end
100
- rescue => e
101
- abort e
102
- end
103
- end
104
- end
@@ -1,7 +0,0 @@
1
- module Blank
2
- def self.included(base)
3
- base.class_eval do
4
- instance_methods.each { |m| undef_method m unless m =~ /^__|object_id/ }
5
- end
6
- end
7
- end
@@ -1,2 +0,0 @@
1
- require 'commander/core_ext/array'
2
- require 'commander/core_ext/object'
@@ -1,24 +0,0 @@
1
- class Array
2
- ##
3
- # Split _string_ into an array. Used in
4
- # conjunction with Highline's #ask, or #ask_for_array
5
- # methods, which must respond to #parse.
6
- #
7
- # This method allows escaping of whitespace. For example
8
- # the arguments foo bar\ baz will become ['foo', 'bar baz']
9
- #
10
- # === Example
11
- #
12
- # # ask invokes Array#parse
13
- # list = ask 'Favorite cookies:', Array
14
- #
15
- # # or use ask_for_CLASS
16
- # list = ask_for_array 'Favorite cookies: '
17
- #
18
-
19
- def self.parse(string)
20
- # Using reverse + lookahead to work around Ruby 1.8's lack of lookbehind
21
- # TODO: simplify now that we don't support Ruby 1.8
22
- string.reverse.split(/\s(?!\\)/).reverse.map { |s| s.reverse.gsub('\\ ', ' ') }
23
- end
24
- end
@@ -1,8 +0,0 @@
1
- class Object
2
- ##
3
- # Return the current binding.
4
-
5
- def get_binding
6
- binding
7
- end
8
- end
@@ -1,23 +0,0 @@
1
- <% if !cmd.syntax %>
2
- <%= $terminal.color "NAME", :bold %>:
3
-
4
- <%= cmd.name %>
5
- <% else -%>
6
- <%= $terminal.color "SYNOPSIS", :bold %>:
7
-
8
- <%= cmd.syntax -%>
9
-
10
- <% end -%>
11
-
12
- <%= $terminal.color "DESCRIPTION", :bold %>:
13
-
14
- <%= Commander::HelpFormatter.indent 4, (cmd.description || cmd.summary || 'No description.') -%>
15
-
16
-
17
- <%= $terminal.color "SUBCOMMANDS", :bold %>:
18
- <% @commands.values.sort.map { |c| [c.name, c] }.each do |name, command| -%>
19
- <% unless alias? name %>
20
- <%= "%-#{max_command_length}s %s" % [command.name, command.summary || command.description] -%>
21
- <% end -%>
22
- <% end %>
23
-
@@ -1,11 +0,0 @@
1
- require 'erb'
2
-
3
- module Commander
4
- module HelpFormatter
5
- class TerminalCompact < Terminal
6
- def template(name)
7
- ERB.new(File.read(File.join(File.dirname(__FILE__), 'terminal_compact', "#{name}.erb")), nil, '-')
8
- end
9
- end
10
- end
11
- end
@@ -1,26 +0,0 @@
1
- <%= @name %>
2
- <% if @syntax -%>
3
-
4
- Usage: <%= @syntax %>
5
- <% end -%>
6
- <% if @description || @summary -%>
7
-
8
- <%= @description || @summary %>
9
- <% end -%>
10
- <% unless @examples.empty? -%>
11
-
12
- Examples:
13
- <% for description, command in @examples -%>
14
-
15
- # <%= description %>
16
- <%= command %>
17
- <% end -%>
18
- <% end -%>
19
- <% unless @options.empty? -%>
20
-
21
- Options:
22
- <% for option in @options -%>
23
- <%= "%-20s %s" % [option[:switches].join(', '), option[:description]] %><% if option[:default] %> <%= option[:default] %><% end %>
24
- <% end -%>
25
- <% end -%>
26
-
@@ -1,29 +0,0 @@
1
- <%= program :name %>
2
-
3
- <%= program :description %>
4
-
5
- Commands:
6
- <% for name, command in @help_commands.sort -%>
7
- <% unless alias? name -%>
8
- <%= "%-#{max_command_length}s %s" % [command.name, command.summary || command.description] %>
9
- <% end -%>
10
- <% end -%>
11
- <% unless @aliases.empty? %>
12
- Aliases:
13
- <% for alias_name, args in @aliases.sort -%>
14
- <%= "%-#{max_aliases_length}s %s %s" % [alias_name, command(alias_name).name, args.join(' ')] %>
15
- <% end -%>
16
- <% end %>
17
- <% unless @help_options.empty? -%>
18
- Global Options:
19
- <% for option in @help_options -%>
20
- <%= "%-20s %s" % [option[:switches].join(', '), option[:description]] -%>
21
- <% end -%>
22
- <% end -%>
23
- <% if program :help -%>
24
- <% for title, body in program(:help) %>
25
- <%= title %>:
26
- <%= body %>
27
- <% end %>
28
- <% end -%>
29
-
@@ -1,15 +0,0 @@
1
- <%= cmd.name %>
2
- <% if cmd.syntax -%>
3
-
4
- Usage: <%= cmd.syntax %>
5
- <% end -%>
6
- <% if cmd.description || cmd.summary -%>
7
-
8
- <%= cmd.description || cmd.summary %>
9
- <% end -%>
10
-
11
- <% @commands.values.sort.map { |c| [c.name, c] }.each do |name, command| -%>
12
- <% unless alias? name -%>
13
- <%= "%-#{max_command_length}s %s" % [command.name, command.summary || command.description] %>
14
- <% end -%>
15
- <% end -%>
@@ -1,5 +0,0 @@
1
- require 'commander'
2
-
3
- extend Commander::CLI
4
-
5
- at_exit { run!(ARGV) }
@@ -1,17 +0,0 @@
1
- # Patches the underling OptionParser DecimalInteger type so that it doesn't
2
- # convert numbers starting with a '0' as if they are an Octal number
3
- module Commander
4
- module Patches
5
- module DecimalInteger
6
- decimal = '\d+(?:_\d+)*'
7
- DecimalInteger = /\A[-+]?#{decimal}\z/io
8
- ::OptionParser::accept(DecimalInteger, DecimalInteger) {|s,|
9
- begin
10
- Integer(s, 10)
11
- rescue ArgumentError
12
- raise ::OptionParser::InvalidArgument, s
13
- end if s
14
- }
15
- end
16
- end
17
- end
@@ -1,15 +0,0 @@
1
- module Commander
2
- module Patches
3
- module HelpFormatterBinding
4
- def get_binding(additional = {})
5
- bnd = @target.instance_eval { binding }.tap do |bind|
6
- decorate_binding(bind)
7
- end
8
- additional.each do |k, v|
9
- bnd.local_variable_set(k, v)
10
- end
11
- bnd
12
- end
13
- end
14
- end
15
- end
@@ -1,75 +0,0 @@
1
- # Patches the underling ruby OptionParser to prevent it from automatically
2
- # generating short tags for options
3
- module Commander
4
- module Patches
5
- module ImplicitShortTags
6
- def parse_in_order(argv = default_argv, setter = nil, &nonopt) # :nodoc:
7
- opt, arg, val, rest = nil
8
- nonopt ||= proc {|a| throw :terminate, a}
9
- argv.unshift(arg) if arg = catch(:terminate) {
10
- while arg = argv.shift
11
- case arg
12
- # long option
13
- when /\A--([^=]*)(?:=(.*))?/m
14
- opt, rest = $1, $2
15
- opt.tr!('_', '-')
16
- begin
17
- sw, = complete(:long, opt, true)
18
- rescue ::OptionParser::ParseError
19
- raise $!.set_option(arg, true)
20
- end
21
- begin
22
- opt, cb, val = sw.parse(rest, argv) {|*exc| raise(*exc)}
23
- val = cb.call(val) if cb
24
- setter.call(sw.switch_name, val) if setter
25
- rescue ::OptionParser::ParseError
26
- raise $!.set_option(arg, rest)
27
- end
28
-
29
- # short option
30
- when /\A-(.)((=).*|.+)?/m
31
- eq, rest, opt = $3, $2, $1
32
- has_arg, val = eq, rest
33
- begin
34
- sw, = search(:short, opt)
35
- unless sw
36
- sw, = complete(:short, opt)
37
- # short option matched.
38
- val = arg.sub(/\A-/, '')
39
- has_arg = true
40
- end
41
- rescue ::OptionParser::ParseError
42
- raise $!.set_option(arg, true)
43
- end
44
- begin
45
- opt, cb, val = sw.parse(val, argv) {|*exc| raise(*exc) if eq}
46
- raise InvalidOption, arg if has_arg and !eq and arg == "-#{opt}"
47
- argv.unshift(opt) if opt and (!rest or (opt = opt.sub(/\A-*/, '-')) != '-')
48
- val = cb.call(val) if cb
49
- setter.call(sw.switch_name, val) if setter
50
- rescue ::OptionParser::ParseError
51
- raise $!.set_option(arg, arg.length > 2)
52
- end
53
-
54
- # non-option argument
55
- else
56
- catch(:prune) do
57
- visit(:each_option) do |sw0|
58
- sw = sw0
59
- sw.block.call(arg) if ::OptionParser::Switch === sw and sw.match_nonswitch?(arg)
60
- end
61
- nonopt.call(arg)
62
- end
63
- end
64
- end
65
-
66
- nil
67
- }
68
-
69
- visit(:search, :short, nil) {|sw| sw.block.call(*argv) if !sw.pattern}
70
-
71
- argv
72
- end
73
- end
74
- end
75
- end