mercenary 0.3.6 → 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 +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.
|