mercenary 0.3.6 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.gitignore +1 -0
- data/.rubocop.yml +10 -0
- data/.rubocop_todo.yml +79 -0
- data/.travis.yml +6 -6
- data/Gemfile +3 -1
- data/History.markdown +18 -0
- data/LICENSE.txt +1 -1
- data/README.md +2 -3
- data/Rakefile +2 -0
- data/examples/help_dialogue.rb +16 -17
- data/examples/logging.rb +6 -10
- data/examples/trace.rb +5 -6
- data/lib/mercenary.rb +7 -5
- data/lib/mercenary/command.rb +14 -13
- data/lib/mercenary/option.rb +8 -6
- data/lib/mercenary/presenter.rb +17 -8
- data/lib/mercenary/program.rb +4 -2
- data/lib/mercenary/version.rb +3 -1
- data/mercenary.gemspec +13 -9
- data/script/cibuild +2 -1
- data/script/fmt +4 -0
- data/spec/command_spec.rb +5 -5
- data/spec/option_spec.rb +10 -9
- data/spec/presenter_spec.rb +13 -7
- data/spec/program_spec.rb +2 -2
- data/spec/spec_helper.rb +5 -3
- metadata +25 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 87a58db4aa958efbd3a0ffe819c56213857f57bb205d82b9794c58d68202a0d4
|
4
|
+
data.tar.gz: bee506d3c88e454f1ecbcc407a83217f456fa56b3b6d95e6a879f407719df51b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a2521dda60181328b8aeb2e2309a62216ce95b58f2fe5216dd98070aeb194c8b207510b2be6da610cc761b4d2ec413cb4c4a75e9088602de2309ee8a12b47a8
|
7
|
+
data.tar.gz: b79dc80683e108f6002c49e5c9733ee25c6494108b020c97c6153973abd396a7109121d1487649f7cabdbbfa488a2dd65cb55ae42d57029603117993377cd96f
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,79 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2020-01-18 15:09:24 +0100 using RuboCop version 0.71.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 2
|
10
|
+
Jekyll/NoPAllowed:
|
11
|
+
Exclude:
|
12
|
+
- 'examples/help_dialogue.rb'
|
13
|
+
|
14
|
+
# Offense count: 2
|
15
|
+
Jekyll/NoPutsAllowed:
|
16
|
+
Exclude:
|
17
|
+
- 'lib/mercenary/command.rb'
|
18
|
+
|
19
|
+
# Offense count: 4
|
20
|
+
# Configuration parameters: AllowSafeAssignment.
|
21
|
+
Lint/AssignmentInCondition:
|
22
|
+
Exclude:
|
23
|
+
- 'lib/mercenary/command.rb'
|
24
|
+
- 'lib/mercenary/option.rb'
|
25
|
+
- 'lib/mercenary/presenter.rb'
|
26
|
+
|
27
|
+
# Offense count: 2
|
28
|
+
Lint/DuplicateMethods:
|
29
|
+
Exclude:
|
30
|
+
- 'lib/mercenary/command.rb'
|
31
|
+
|
32
|
+
# Offense count: 1
|
33
|
+
# Configuration parameters: AllowComments.
|
34
|
+
Lint/HandleExceptions:
|
35
|
+
Exclude:
|
36
|
+
- 'lib/mercenary/option.rb'
|
37
|
+
|
38
|
+
# Offense count: 1
|
39
|
+
Lint/UselessAssignment:
|
40
|
+
Exclude:
|
41
|
+
- 'lib/mercenary/presenter.rb'
|
42
|
+
|
43
|
+
# Offense count: 1
|
44
|
+
Metrics/AbcSize:
|
45
|
+
Max: 25
|
46
|
+
|
47
|
+
# Offense count: 1
|
48
|
+
# Configuration parameters: CountComments, ExcludedMethods.
|
49
|
+
# ExcludedMethods: refine
|
50
|
+
Metrics/BlockLength:
|
51
|
+
Max: 28
|
52
|
+
|
53
|
+
# Offense count: 6
|
54
|
+
# Cop supports --auto-correct.
|
55
|
+
# Configuration parameters: AutoCorrect, AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
56
|
+
# URISchemes: http, https
|
57
|
+
Metrics/LineLength:
|
58
|
+
Max: 319
|
59
|
+
|
60
|
+
# Offense count: 1
|
61
|
+
# Configuration parameters: CountComments, ExcludedMethods.
|
62
|
+
Metrics/MethodLength:
|
63
|
+
Max: 24
|
64
|
+
|
65
|
+
# Offense count: 1
|
66
|
+
# Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist, MethodDefinitionMacros.
|
67
|
+
# NamePrefix: is_, has_, have_
|
68
|
+
# NamePrefixBlacklist: is_, has_, have_
|
69
|
+
# NameWhitelist: is_a?
|
70
|
+
# MethodDefinitionMacros: define_method, define_singleton_method
|
71
|
+
Naming/PredicateName:
|
72
|
+
Exclude:
|
73
|
+
- 'spec/**/*'
|
74
|
+
- 'lib/mercenary/command.rb'
|
75
|
+
|
76
|
+
# Offense count: 1
|
77
|
+
Style/MissingRespondToMissing:
|
78
|
+
Exclude:
|
79
|
+
- 'lib/mercenary/presenter.rb'
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/History.markdown
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
## 0.4.0 / 2020-01-18
|
2
|
+
|
3
|
+
### Major Enhancements
|
4
|
+
|
5
|
+
* Drop Ruby 2.3 support
|
6
|
+
|
7
|
+
### Minor Enhancements
|
8
|
+
|
9
|
+
* Remove parent command's flags from subcommand usage (#44)
|
10
|
+
|
11
|
+
### Development Fixes
|
12
|
+
|
13
|
+
* Adopt Jekyll's rubocop config for consistency
|
14
|
+
|
15
|
+
### Documentation
|
16
|
+
|
17
|
+
* fixes the readme (#52)
|
18
|
+
|
1
19
|
## 0.3.6 / 2016-04-07
|
2
20
|
|
3
21
|
### Bug Fixes
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -97,10 +97,9 @@ Fetches the program configuration hash.
|
|
97
97
|
|
98
98
|
#### `#new`
|
99
99
|
|
100
|
-
Create a new command. Accepts
|
100
|
+
Create a new command. Accepts one argument:
|
101
101
|
|
102
102
|
- `name` - the name of your command, as a symbol
|
103
|
-
- `parent` - (optional) the parent Command
|
104
103
|
|
105
104
|
#### `#version`
|
106
105
|
|
@@ -167,7 +166,7 @@ different class to create, e.g. `Array`, if you are expecting a particular class
|
|
167
166
|
in your code from this option's value. The description is also optional, but
|
168
167
|
it's highly recommended to include a description.
|
169
168
|
|
170
|
-
#### `#alias`
|
169
|
+
#### `#alias`
|
171
170
|
|
172
171
|
Specifies an alias for this command such that the alias may be used in place of
|
173
172
|
the command during execution. Accepts one argument:
|
data/Rakefile
CHANGED
data/examples/help_dialogue.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
|
4
|
+
$LOAD_PATH.unshift File.join(__dir__, "..", "lib")
|
4
5
|
|
5
6
|
require "mercenary"
|
6
7
|
|
@@ -9,23 +10,22 @@ require "mercenary"
|
|
9
10
|
# be output to STDOUT.
|
10
11
|
|
11
12
|
Mercenary.program(:help_dialogue) do |p|
|
12
|
-
|
13
13
|
p.version "2.0.1"
|
14
|
-
p.description
|
15
|
-
p.syntax
|
14
|
+
p.description "An example of the help dialogue in Mercenary"
|
15
|
+
p.syntax "help_dialogue <subcommand>"
|
16
16
|
|
17
17
|
p.command(:some_subcommand) do |c|
|
18
|
-
c.version
|
19
|
-
c.syntax
|
20
|
-
c.description
|
21
|
-
c.option
|
18
|
+
c.version "1.4.2"
|
19
|
+
c.syntax "some_subcommand <subcommand> [options]"
|
20
|
+
c.description "Some subcommand to do something"
|
21
|
+
c.option "an_option", "-o", "--option", "Some option"
|
22
22
|
c.alias(:blah)
|
23
23
|
|
24
24
|
c.command(:yet_another_sub) do |f|
|
25
|
-
f.syntax
|
26
|
-
f.description
|
27
|
-
f.option
|
28
|
-
f.option
|
25
|
+
f.syntax "yet_another_sub [options]"
|
26
|
+
f.description "Do amazing things"
|
27
|
+
f.option "blah", "-b", "--blah", "Trigger blah flag"
|
28
|
+
f.option "heh", "-H ARG", "--heh ARG", "Give a heh"
|
29
29
|
|
30
30
|
f.action do |args, options|
|
31
31
|
print "Args: "
|
@@ -37,10 +37,9 @@ Mercenary.program(:help_dialogue) do |p|
|
|
37
37
|
end
|
38
38
|
|
39
39
|
p.command(:another_subcommand) do |c|
|
40
|
-
c.syntax
|
41
|
-
c.description
|
42
|
-
c.option
|
43
|
-
c.option
|
40
|
+
c.syntax "another_subcommand <subcommand> [options]"
|
41
|
+
c.description "Another subcommand to do something different."
|
42
|
+
c.option "an_option", "-O", "--option", "Some option"
|
43
|
+
c.option "another_options", "--pluginzzz", "Set where the plugins should be found from"
|
44
44
|
end
|
45
|
-
|
46
45
|
end
|
data/examples/logging.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
|
4
|
+
$LOAD_PATH.unshift File.join(__dir__, "..", "lib")
|
4
5
|
|
5
6
|
require "mercenary"
|
6
7
|
|
@@ -9,18 +10,16 @@ require "mercenary"
|
|
9
10
|
# be output to STDOUT.
|
10
11
|
|
11
12
|
Mercenary.program(:logger_output) do |p|
|
12
|
-
|
13
13
|
p.version "5.2.6"
|
14
|
-
p.description
|
15
|
-
p.syntax
|
16
|
-
|
14
|
+
p.description "An example of turning on logging for Mercenary."
|
15
|
+
p.syntax "logger_output"
|
17
16
|
|
18
17
|
p.logger.info "The default log level is INFO. So this will output."
|
19
18
|
p.logger.debug "Since DEBUG is below INFO, this will not output."
|
20
19
|
|
21
20
|
p.logger(Logger::DEBUG)
|
22
21
|
p.logger.debug "Logger level now set to DEBUG. So everything will output."
|
23
|
-
|
22
|
+
|
24
23
|
p.logger.debug "Example of DEBUG level message."
|
25
24
|
p.logger.info "Example of INFO level message."
|
26
25
|
p.logger.warn "Example of WARN level message."
|
@@ -28,12 +27,9 @@ Mercenary.program(:logger_output) do |p|
|
|
28
27
|
p.logger.fatal "Example of FATAL level message."
|
29
28
|
p.logger.unknown "Example of UNKNOWN level message."
|
30
29
|
|
31
|
-
p.action do |
|
32
|
-
|
30
|
+
p.action do |_args, _options|
|
33
31
|
p.logger(Logger::INFO)
|
34
32
|
p.logger.debug "Logger level back to INFO. This line will not output."
|
35
33
|
p.logger.info "This INFO message will output."
|
36
|
-
|
37
34
|
end
|
38
|
-
|
39
35
|
end
|
data/examples/trace.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
|
-
|
4
|
+
$LOAD_PATH.unshift File.join(__dir__, "..", "lib")
|
4
5
|
|
5
6
|
require "mercenary"
|
6
7
|
|
@@ -9,13 +10,11 @@ require "mercenary"
|
|
9
10
|
# be output to STDOUT.
|
10
11
|
|
11
12
|
Mercenary.program(:trace) do |p|
|
12
|
-
|
13
13
|
p.version "2.0.1"
|
14
|
-
p.description
|
15
|
-
p.syntax
|
14
|
+
p.description "An example of traces in Mercenary"
|
15
|
+
p.syntax "trace <subcommand>"
|
16
16
|
|
17
17
|
p.action do |_, _|
|
18
|
-
raise ArgumentError
|
18
|
+
raise ArgumentError, "YOU DID SOMETHING TERRIBLE YOU BUFFOON"
|
19
19
|
end
|
20
|
-
|
21
20
|
end
|
data/lib/mercenary.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require File.expand_path("mercenary/version", __dir__)
|
2
4
|
require "optparse"
|
3
5
|
require "logger"
|
4
6
|
|
5
7
|
module Mercenary
|
6
|
-
autoload :Command, File.expand_path("
|
7
|
-
autoload :Option, File.expand_path("
|
8
|
-
autoload :Presenter, File.expand_path("
|
9
|
-
autoload :Program, File.expand_path("
|
8
|
+
autoload :Command, File.expand_path("mercenary/command", __dir__)
|
9
|
+
autoload :Option, File.expand_path("mercenary/option", __dir__)
|
10
|
+
autoload :Presenter, File.expand_path("mercenary/presenter", __dir__)
|
11
|
+
autoload :Program, File.expand_path("mercenary/program", __dir__)
|
10
12
|
|
11
13
|
# Public: Instantiate a new program and execute.
|
12
14
|
#
|
data/lib/mercenary/command.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: false
|
2
|
+
|
1
3
|
module Mercenary
|
2
4
|
class Command
|
3
5
|
attr_reader :name
|
@@ -47,9 +49,7 @@ module Mercenary
|
|
47
49
|
def syntax(syntax = nil)
|
48
50
|
@syntax = syntax if syntax
|
49
51
|
syntax_list = []
|
50
|
-
if parent
|
51
|
-
syntax_list << parent.syntax.to_s.gsub(/<[\w\s-]+>/, '').gsub(/\[[\w\s-]+\]/, '').strip
|
52
|
-
end
|
52
|
+
syntax_list << parent.syntax.to_s.gsub(%r!<[\w\s-]+>!, "").gsub(%r!\[[\w\s-]+\]!, "").strip if parent
|
53
53
|
syntax_list << (@syntax || name.to_s)
|
54
54
|
syntax_list.join(" ")
|
55
55
|
end
|
@@ -72,11 +72,11 @@ module Mercenary
|
|
72
72
|
# Returns the default command if there is one, `nil` otherwise
|
73
73
|
def default_command(command_name = nil)
|
74
74
|
if command_name
|
75
|
-
if commands.
|
75
|
+
if commands.key?(command_name)
|
76
76
|
@default_command = commands[command_name] if command_name
|
77
77
|
@default_command
|
78
78
|
else
|
79
|
-
raise ArgumentError
|
79
|
+
raise ArgumentError, "'#{command_name}' couldn't be found in this command's list of commands."
|
80
80
|
end
|
81
81
|
else
|
82
82
|
@default_command
|
@@ -133,11 +133,12 @@ module Mercenary
|
|
133
133
|
# level - the logger level (a Logger constant, see docs for more info)
|
134
134
|
#
|
135
135
|
# Returns the instance of Logger
|
136
|
+
|
136
137
|
def logger(level = nil)
|
137
138
|
unless @logger
|
138
139
|
@logger = Logger.new(STDOUT)
|
139
140
|
@logger.level = level || Logger::INFO
|
140
|
-
@logger.formatter = proc do |severity,
|
141
|
+
@logger.formatter = proc do |severity, _datetime, _progname, msg|
|
141
142
|
"#{identity} | " << "#{severity.downcase.capitalize}:".ljust(7) << " #{msg}\n"
|
142
143
|
end
|
143
144
|
end
|
@@ -189,15 +190,15 @@ module Mercenary
|
|
189
190
|
#
|
190
191
|
# Returns nothing
|
191
192
|
def add_default_options(opts)
|
192
|
-
option
|
193
|
-
option
|
194
|
-
option
|
193
|
+
option "show_help", "-h", "--help", "Show this message"
|
194
|
+
option "show_version", "-v", "--version", "Print the name and version"
|
195
|
+
option "show_backtrace", "-t", "--trace", "Show the full backtrace when an error occurs"
|
195
196
|
opts.on("-v", "--version", "Print the version") do
|
196
197
|
puts "#{name} #{version}"
|
197
198
|
exit(0)
|
198
199
|
end
|
199
200
|
|
200
|
-
opts.on(
|
201
|
+
opts.on("-t", "--trace", "Show full backtrace if an error occurs") do
|
201
202
|
@trace = true
|
202
203
|
end
|
203
204
|
|
@@ -228,7 +229,7 @@ module Mercenary
|
|
228
229
|
# Returns true if this command is the parent of a command of name
|
229
230
|
# 'sub_command' and false otherwise
|
230
231
|
def has_command?(sub_command)
|
231
|
-
commands.
|
232
|
+
commands.key?(sub_command)
|
232
233
|
end
|
233
234
|
|
234
235
|
# Public: Identify this command
|
@@ -242,7 +243,7 @@ module Mercenary
|
|
242
243
|
#
|
243
244
|
# Returns a string containing the name and version if it exists
|
244
245
|
def identity
|
245
|
-
"#{full_name} #{version
|
246
|
+
"#{full_name} #{version}".strip
|
246
247
|
end
|
247
248
|
|
248
249
|
# Public: Get the name of the current command plus that of
|
@@ -251,7 +252,7 @@ module Mercenary
|
|
251
252
|
# Returns the full name of the command
|
252
253
|
def full_name
|
253
254
|
the_name = []
|
254
|
-
the_name << parent.full_name if parent
|
255
|
+
the_name << parent.full_name if parent&.full_name
|
255
256
|
the_name << name
|
256
257
|
the_name.join(" ")
|
257
258
|
end
|
data/lib/mercenary/option.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Mercenary
|
2
4
|
class Option
|
3
5
|
attr_reader :config_key, :description, :short, :long, :return_type
|
@@ -11,10 +13,10 @@ module Mercenary
|
|
11
13
|
#
|
12
14
|
# Returns nothing
|
13
15
|
def initialize(config_key, info)
|
14
|
-
@config_key
|
16
|
+
@config_key = config_key
|
15
17
|
while arg = info.shift
|
16
18
|
begin
|
17
|
-
@return_type = Object.const_get(
|
19
|
+
@return_type = Object.const_get(arg.to_s)
|
18
20
|
next
|
19
21
|
rescue NameError
|
20
22
|
end
|
@@ -34,7 +36,7 @@ module Mercenary
|
|
34
36
|
#
|
35
37
|
# Returns the array which OptionParser#on wants
|
36
38
|
def for_option_parser
|
37
|
-
[short, long, return_type, description].flatten.reject{ |o| o.to_s.empty? }
|
39
|
+
[short, long, return_type, description].flatten.reject { |o| o.to_s.empty? }
|
38
40
|
end
|
39
41
|
|
40
42
|
# Public: Build a string representation of this option including the
|
@@ -51,8 +53,8 @@ module Mercenary
|
|
51
53
|
def formatted_switches
|
52
54
|
[
|
53
55
|
switches.first.rjust(10),
|
54
|
-
switches.last.ljust(13)
|
55
|
-
].join(", ").gsub(
|
56
|
+
switches.last.ljust(13),
|
57
|
+
].join(", ").gsub(%r! , !, " ").gsub(%r!, !, " ")
|
56
58
|
end
|
57
59
|
|
58
60
|
# Public: Hash based on the hash value of instance variables
|
@@ -70,6 +72,7 @@ module Mercenary
|
|
70
72
|
# Returns true if all the instance variables are equal, false otherwise
|
71
73
|
def eql?(other)
|
72
74
|
return false unless self.class.eql?(other.class)
|
75
|
+
|
73
76
|
instance_variables.map do |var|
|
74
77
|
instance_variable_get(var).eql?(other.instance_variable_get(var))
|
75
78
|
end.all?
|
@@ -82,6 +85,5 @@ module Mercenary
|
|
82
85
|
def switches
|
83
86
|
[short, long].map(&:to_s)
|
84
87
|
end
|
85
|
-
|
86
88
|
end
|
87
89
|
end
|
data/lib/mercenary/presenter.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Mercenary
|
2
4
|
class Presenter
|
3
5
|
attr_accessor :command
|
@@ -23,12 +25,16 @@ module Mercenary
|
|
23
25
|
# Returns the string representation of the options
|
24
26
|
def options_presentation
|
25
27
|
return nil unless command_options_presentation || parent_command_options_presentation
|
28
|
+
|
26
29
|
[command_options_presentation, parent_command_options_presentation].compact.join("\n")
|
27
30
|
end
|
28
31
|
|
29
32
|
def command_options_presentation
|
30
|
-
return nil
|
31
|
-
|
33
|
+
return nil if command.options.empty?
|
34
|
+
|
35
|
+
options = command.options
|
36
|
+
options -= command.parent.options if command.parent
|
37
|
+
options.map(&:to_s).join("\n")
|
32
38
|
end
|
33
39
|
|
34
40
|
# Public: Builds a string representation of the options for parent
|
@@ -37,6 +43,7 @@ module Mercenary
|
|
37
43
|
# Returns the string representation of the options for parent commands
|
38
44
|
def parent_command_options_presentation
|
39
45
|
return nil unless command.parent
|
46
|
+
|
40
47
|
Presenter.new(command.parent).options_presentation
|
41
48
|
end
|
42
49
|
|
@@ -44,7 +51,8 @@ module Mercenary
|
|
44
51
|
#
|
45
52
|
# Returns the string representation of the subcommands
|
46
53
|
def subcommands_presentation
|
47
|
-
return nil
|
54
|
+
return nil if command.commands.empty?
|
55
|
+
|
48
56
|
command.commands.values.uniq.map(&:summarize).join("\n")
|
49
57
|
end
|
50
58
|
|
@@ -52,7 +60,7 @@ module Mercenary
|
|
52
60
|
#
|
53
61
|
# Returns the command header as a String
|
54
62
|
def command_header
|
55
|
-
header =
|
63
|
+
header = command.identity.to_s
|
56
64
|
header << " -- #{command.description}" if command.description
|
57
65
|
header
|
58
66
|
end
|
@@ -83,11 +91,12 @@ module Mercenary
|
|
83
91
|
#
|
84
92
|
# Returns the value of whatever function is called
|
85
93
|
def method_missing(meth, *args, &block)
|
86
|
-
if meth.to_s =~
|
87
|
-
send("#{
|
94
|
+
if meth.to_s =~ %r!^print_(.+)$!
|
95
|
+
send("#{Regexp.last_match(1).downcase}_presentation")
|
88
96
|
else
|
89
|
-
|
90
|
-
|
97
|
+
# You *must* call super if you don't handle the method,
|
98
|
+
# otherwise you'll mess up Ruby's method lookup.
|
99
|
+
super
|
91
100
|
end
|
92
101
|
end
|
93
102
|
end
|
data/lib/mercenary/program.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Mercenary
|
2
4
|
class Program < Command
|
3
5
|
attr_reader :optparse
|
@@ -31,7 +33,7 @@ module Mercenary
|
|
31
33
|
@optparse.parse!(argv)
|
32
34
|
rescue OptionParser::InvalidOption => e
|
33
35
|
logger.error "Whoops, we can't understand your command."
|
34
|
-
logger.error
|
36
|
+
logger.error e.message.to_s
|
35
37
|
logger.error "Run your command again with the --help switch to see available options."
|
36
38
|
abort
|
37
39
|
end
|
@@ -40,7 +42,7 @@ module Mercenary
|
|
40
42
|
|
41
43
|
begin
|
42
44
|
cmd.execute(argv, @config)
|
43
|
-
rescue => e
|
45
|
+
rescue StandardError => e
|
44
46
|
if cmd.trace
|
45
47
|
raise e
|
46
48
|
else
|
data/lib/mercenary/version.rb
CHANGED
data/mercenary.gemspec
CHANGED
@@ -1,24 +1,28 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path("lib", __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
5
|
+
require "mercenary/version"
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
8
|
spec.name = "mercenary"
|
8
9
|
spec.version = Mercenary::VERSION
|
9
10
|
spec.authors = ["Tom Preston-Werner", "Parker Moore"]
|
10
11
|
spec.email = ["tom@mojombo.com", "parkrmoore@gmail.com"]
|
11
|
-
spec.description =
|
12
|
-
spec.summary =
|
12
|
+
spec.description = "Lightweight and flexible library for writing command-line apps in Ruby."
|
13
|
+
spec.summary = "Lightweight and flexible library for writing command-line apps in Ruby."
|
13
14
|
spec.homepage = "https://github.com/jekyll/mercenary"
|
14
15
|
spec.license = "MIT"
|
15
16
|
|
16
|
-
spec.files = `git ls-files`.split(
|
17
|
-
spec.executables = spec.files.grep(%r
|
18
|
-
spec.test_files = spec.files.grep(%r
|
17
|
+
spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
|
18
|
+
spec.executables = spec.files.grep(%r!^bin/!) { |f| File.basename(f) }
|
19
|
+
spec.test_files = spec.files.grep(%r!^(test|spec|features)/!)
|
19
20
|
spec.require_paths = ["lib"]
|
20
21
|
|
21
|
-
spec.
|
22
|
+
spec.required_ruby_version = ">= 2.4.0"
|
23
|
+
|
24
|
+
spec.add_development_dependency "bundler"
|
22
25
|
spec.add_development_dependency "rake"
|
23
26
|
spec.add_development_dependency "rspec", "~> 3.0"
|
27
|
+
spec.add_development_dependency "rubocop-jekyll", "~> 0.10.0"
|
24
28
|
end
|
data/script/cibuild
CHANGED
data/script/fmt
ADDED
data/spec/command_spec.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "spec_helper"
|
2
4
|
|
3
5
|
describe(Mercenary::Command) do
|
4
|
-
|
5
6
|
context "a basic command" do
|
6
7
|
let(:command) { Mercenary::Command.new(:my_name) }
|
7
8
|
let(:parent) { Mercenary::Command.new(:my_parent) }
|
@@ -17,7 +18,7 @@ describe(Mercenary::Command) do
|
|
17
18
|
)
|
18
19
|
end
|
19
20
|
let(:add_sub) do
|
20
|
-
|
21
|
+
proc do |c|
|
21
22
|
c.command(:sub_command) { |p| }
|
22
23
|
end
|
23
24
|
end
|
@@ -56,7 +57,7 @@ describe(Mercenary::Command) do
|
|
56
57
|
|
57
58
|
it "can set its options" do
|
58
59
|
name = "show_drafts"
|
59
|
-
opts
|
60
|
+
opts = ["--drafts", "Render posts in the _drafts folder"]
|
60
61
|
option = Mercenary::Option.new(name, opts)
|
61
62
|
command.option name, *opts
|
62
63
|
expect(command.options).to eql([option])
|
@@ -68,7 +69,7 @@ describe(Mercenary::Command) do
|
|
68
69
|
end
|
69
70
|
|
70
71
|
it "knows its identity" do
|
71
|
-
command_with_parent.version
|
72
|
+
command_with_parent.version "1.8.7"
|
72
73
|
expect(command_with_parent.identity).to eql("my_parent i_have_parent 1.8.7")
|
73
74
|
end
|
74
75
|
|
@@ -94,5 +95,4 @@ describe(Mercenary::Command) do
|
|
94
95
|
end
|
95
96
|
end
|
96
97
|
end
|
97
|
-
|
98
98
|
end
|
data/spec/option_spec.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
2
4
|
|
3
5
|
describe(Mercenary::Option) do
|
4
6
|
let(:config_key) { "largo" }
|
5
7
|
let(:description) { "This is a description" }
|
6
|
-
let(:switches) { [
|
8
|
+
let(:switches) { ["-l", "--largo"] }
|
7
9
|
let(:option) { described_class.new(config_key, [switches, description].flatten.reject(&:nil?)) }
|
8
10
|
|
9
11
|
it "knows its config key" do
|
@@ -27,20 +29,20 @@ describe(Mercenary::Option) do
|
|
27
29
|
end
|
28
30
|
|
29
31
|
it "compares itself with other options well" do
|
30
|
-
new_option = described_class.new(config_key, [
|
32
|
+
new_option = described_class.new(config_key, ["-l", "--largo", description])
|
31
33
|
expect(option.eql?(new_option)).to be(true)
|
32
34
|
expect(option.hash.eql?(new_option.hash)).to be(true)
|
33
35
|
end
|
34
36
|
|
35
37
|
it "has a custom #hash" do
|
36
|
-
expect(option.hash.to_s).to match(
|
38
|
+
expect(option.hash.to_s).to match(%r!\d+!)
|
37
39
|
end
|
38
40
|
|
39
41
|
context "with just the long switch" do
|
40
|
-
let(:switches) { [
|
42
|
+
let(:switches) { ["--largo"] }
|
41
43
|
|
42
44
|
it "adds an empty string in place of the short switch" do
|
43
|
-
expect(option.switches).to eql([
|
45
|
+
expect(option.switches).to eql(["", "--largo"])
|
44
46
|
end
|
45
47
|
|
46
48
|
it "sets its description properly" do
|
@@ -53,10 +55,10 @@ describe(Mercenary::Option) do
|
|
53
55
|
end
|
54
56
|
|
55
57
|
context "with just the short switch" do
|
56
|
-
let(:switches) { [
|
58
|
+
let(:switches) { ["-l"] }
|
57
59
|
|
58
60
|
it "adds an empty string in place of the long switch" do
|
59
|
-
expect(option.switches).to eql([
|
61
|
+
expect(option.switches).to eql(["-l", ""])
|
60
62
|
end
|
61
63
|
|
62
64
|
it "sets its description properly" do
|
@@ -79,5 +81,4 @@ describe(Mercenary::Option) do
|
|
79
81
|
expect(option.switches).to eql(switches)
|
80
82
|
end
|
81
83
|
end
|
82
|
-
|
83
84
|
end
|
data/spec/presenter_spec.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
2
4
|
|
3
5
|
describe(Mercenary::Presenter) do
|
4
6
|
let(:supercommand) { Mercenary::Command.new(:script_name) }
|
@@ -6,16 +8,20 @@ describe(Mercenary::Presenter) do
|
|
6
8
|
let(:presenter) { described_class.new(command) }
|
7
9
|
|
8
10
|
before(:each) do
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
command.
|
11
|
+
supercommand.option "version", "-v", "--version", "Show version"
|
12
|
+
supercommand.option "help", "-h", "--help", "Help!"
|
13
|
+
|
14
|
+
command.version "1.4.2"
|
15
|
+
command.description "Do all the things."
|
16
|
+
command.option "help", "-h", "--help", "Help!"
|
17
|
+
command.option "one", "-1", "--one", "The first option"
|
18
|
+
command.option "two", "-2", "--two", "The second option"
|
13
19
|
command.alias :cmd
|
14
20
|
supercommand.commands[command.name] = command
|
15
21
|
end
|
16
22
|
|
17
23
|
it "knows how to present the command" do
|
18
|
-
expect(presenter.command_presentation).to eql("script_name subcommand 1.4.2 -- Do all the things.\n\nUsage:\n\n script_name subcommand\n\nOptions:\n -1, --one The first option\n -2, --two The second option")
|
24
|
+
expect(presenter.command_presentation).to eql("script_name subcommand 1.4.2 -- Do all the things.\n\nUsage:\n\n script_name subcommand\n\nOptions:\n -1, --one The first option\n -2, --two The second option\n -v, --version Show version\n -h, --help Help!")
|
19
25
|
end
|
20
26
|
|
21
27
|
it "knows how to present the subcommands, without duplicates for aliases" do
|
@@ -27,7 +33,7 @@ describe(Mercenary::Presenter) do
|
|
27
33
|
end
|
28
34
|
|
29
35
|
it "knows how to present the options" do
|
30
|
-
expect(presenter.options_presentation).to eql(" -1, --one The first option\n -2, --two The second option")
|
36
|
+
expect(presenter.options_presentation).to eql(" -1, --one The first option\n -2, --two The second option\n -v, --version Show version\n -h, --help Help!")
|
31
37
|
end
|
32
38
|
|
33
39
|
it "allows you to say print_* instead of *_presentation" do
|
data/spec/program_spec.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "spec_helper"
|
2
4
|
|
3
5
|
describe(Mercenary::Program) do
|
4
|
-
|
5
6
|
context "a basic program" do
|
6
7
|
let(:program) { Mercenary::Program.new(:my_name) }
|
7
8
|
|
@@ -15,5 +16,4 @@ describe(Mercenary::Program) do
|
|
15
16
|
expect(program.version).to eq(version)
|
16
17
|
end
|
17
18
|
end
|
18
|
-
|
19
19
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path("../lib", __dir__)
|
2
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require
|
5
|
+
require "mercenary"
|
4
6
|
|
5
7
|
RSpec.configure do |config|
|
6
8
|
config.run_all_when_everything_filtered = true
|
@@ -10,5 +12,5 @@ RSpec.configure do |config|
|
|
10
12
|
# order dependency and want to debug it, you can fix the order by providing
|
11
13
|
# the seed, which is printed after each run.
|
12
14
|
# --seed 1234
|
13
|
-
config.order =
|
15
|
+
config.order = "random"
|
14
16
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mercenary
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tom Preston-Werner
|
@@ -9,22 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-01-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '0'
|
21
21
|
type: :development
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - "
|
25
|
+
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version: '
|
27
|
+
version: '0'
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: rake
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -53,6 +53,20 @@ dependencies:
|
|
53
53
|
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '3.0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: rubocop-jekyll
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - "~>"
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 0.10.0
|
63
|
+
type: :development
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - "~>"
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 0.10.0
|
56
70
|
description: Lightweight and flexible library for writing command-line apps in Ruby.
|
57
71
|
email:
|
58
72
|
- tom@mojombo.com
|
@@ -63,6 +77,8 @@ extra_rdoc_files: []
|
|
63
77
|
files:
|
64
78
|
- ".gitignore"
|
65
79
|
- ".rspec"
|
80
|
+
- ".rubocop.yml"
|
81
|
+
- ".rubocop_todo.yml"
|
66
82
|
- ".travis.yml"
|
67
83
|
- Gemfile
|
68
84
|
- History.markdown
|
@@ -83,6 +99,7 @@ files:
|
|
83
99
|
- script/cibuild
|
84
100
|
- script/console
|
85
101
|
- script/examples
|
102
|
+
- script/fmt
|
86
103
|
- spec/command_spec.rb
|
87
104
|
- spec/option_spec.rb
|
88
105
|
- spec/presenter_spec.rb
|
@@ -100,15 +117,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
100
117
|
requirements:
|
101
118
|
- - ">="
|
102
119
|
- !ruby/object:Gem::Version
|
103
|
-
version:
|
120
|
+
version: 2.4.0
|
104
121
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
105
122
|
requirements:
|
106
123
|
- - ">="
|
107
124
|
- !ruby/object:Gem::Version
|
108
125
|
version: '0'
|
109
126
|
requirements: []
|
110
|
-
|
111
|
-
rubygems_version: 2.5.1
|
127
|
+
rubygems_version: 3.0.6
|
112
128
|
signing_key:
|
113
129
|
specification_version: 4
|
114
130
|
summary: Lightweight and flexible library for writing command-line apps in Ruby.
|