cl 1.1.5 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +17 -17
- data/cl.gemspec +30 -0
- data/lib/cl.rb +2 -0
- data/lib/cl/arg.rb +36 -3
- data/lib/cl/args.rb +34 -3
- data/lib/cl/cast.rb +2 -2
- data/lib/cl/cmd.rb +3 -3
- data/lib/cl/dsl.rb +1 -1
- data/lib/cl/errors.rb +8 -1
- data/lib/cl/help.rb +7 -1
- data/lib/cl/help/cmd.rb +1 -1
- data/lib/cl/help/cmds.rb +1 -1
- data/lib/cl/help/format.rb +3 -3
- data/lib/cl/help/usage.rb +7 -5
- data/lib/cl/opt.rb +1 -1
- data/lib/cl/opts.rb +13 -4
- data/lib/cl/parser.rb +9 -8
- data/lib/cl/parser/format.rb +1 -1
- data/lib/cl/runner/default.rb +5 -2
- data/lib/cl/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0e03ee27c161efccb0e06355598ab58c0ab9ef1
|
4
|
+
data.tar.gz: f4a43fff809f58600ac878a49f25167445b2ab52
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 64eb76490a49555dff4ad9af529d9dda88ada8f04bdf1667a66ed85753027891a4792efa9860c1d1c36d36a568b817c8282e2200f589fd7953019302e66ceb29
|
7
|
+
data.tar.gz: 5a967a02acef85622b2da4da3abcf012cece0b9c887e837cf50b9a4f64038d8d1565a3ff77f08c72560653d15bf4d62aad347298ab300f2aaf8e6ec20327cabf
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cl (1.1.
|
4
|
+
cl (1.1.5)
|
5
5
|
regstry (~> 1.0.3)
|
6
6
|
|
7
7
|
GEM
|
@@ -15,22 +15,22 @@ GEM
|
|
15
15
|
tins (~> 1.6)
|
16
16
|
diff-lcs (1.3)
|
17
17
|
docile (1.3.2)
|
18
|
-
json (2.
|
18
|
+
json (2.3.0)
|
19
19
|
memfs (1.0.0)
|
20
|
-
regstry (1.0.
|
21
|
-
rspec (3.
|
22
|
-
rspec-core (~> 3.
|
23
|
-
rspec-expectations (~> 3.
|
24
|
-
rspec-mocks (~> 3.
|
25
|
-
rspec-core (3.
|
26
|
-
rspec-support (~> 3.
|
27
|
-
rspec-expectations (3.
|
20
|
+
regstry (1.0.15)
|
21
|
+
rspec (3.9.0)
|
22
|
+
rspec-core (~> 3.9.0)
|
23
|
+
rspec-expectations (~> 3.9.0)
|
24
|
+
rspec-mocks (~> 3.9.0)
|
25
|
+
rspec-core (3.9.1)
|
26
|
+
rspec-support (~> 3.9.1)
|
27
|
+
rspec-expectations (3.9.0)
|
28
28
|
diff-lcs (>= 1.2.0, < 2.0)
|
29
|
-
rspec-support (~> 3.
|
30
|
-
rspec-mocks (3.
|
29
|
+
rspec-support (~> 3.9.0)
|
30
|
+
rspec-mocks (3.9.1)
|
31
31
|
diff-lcs (>= 1.2.0, < 2.0)
|
32
|
-
rspec-support (~> 3.
|
33
|
-
rspec-support (3.
|
32
|
+
rspec-support (~> 3.9.0)
|
33
|
+
rspec-support (3.9.2)
|
34
34
|
simplecov (0.16.1)
|
35
35
|
docile (~> 1.1)
|
36
36
|
json (>= 1.8, < 3)
|
@@ -38,8 +38,8 @@ GEM
|
|
38
38
|
simplecov-html (0.10.2)
|
39
39
|
term-ansicolor (1.7.1)
|
40
40
|
tins (~> 1.0)
|
41
|
-
thor (0.
|
42
|
-
tins (1.
|
41
|
+
thor (1.0.1)
|
42
|
+
tins (1.22.2)
|
43
43
|
|
44
44
|
PLATFORMS
|
45
45
|
ruby
|
@@ -51,4 +51,4 @@ DEPENDENCIES
|
|
51
51
|
rspec
|
52
52
|
|
53
53
|
BUNDLED WITH
|
54
|
-
2.0.
|
54
|
+
2.0.2
|
data/cl.gemspec
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
4
|
+
require 'cl/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = 'cl'
|
8
|
+
s.version = Cl::VERSION
|
9
|
+
s.authors = ['Sven Fuchs']
|
10
|
+
s.homepage = 'https://github.com/svenfuchs/cl'
|
11
|
+
s.licenses = ['MIT']
|
12
|
+
s.summary = 'Object-oriented OptionParser based CLI support'
|
13
|
+
s.description = <<-str.strip.gsub(/^ +/, '')
|
14
|
+
OptionParser based CLI support for rapid CLI development in an object-oriented
|
15
|
+
context.
|
16
|
+
|
17
|
+
This library wraps Ruby's OptionParser for parsing your options under the hood,
|
18
|
+
so you get all the goodness that the Ruby standard library provides.
|
19
|
+
|
20
|
+
On top of that it adds a rich and powerful DSL for defining, validating, and
|
21
|
+
normalizing options, as well as automatic and gorgeous help output (modeled
|
22
|
+
after `gem --help`).
|
23
|
+
str
|
24
|
+
|
25
|
+
s.files = Dir.glob('{examples/**/*,lib/**/*,[A-Z]*}')
|
26
|
+
s.platform = Gem::Platform::RUBY
|
27
|
+
s.require_path = 'lib'
|
28
|
+
|
29
|
+
s.add_dependency 'regstry', '~> 1.0.3'
|
30
|
+
end
|
data/lib/cl.rb
CHANGED
data/lib/cl/arg.rb
CHANGED
@@ -5,21 +5,50 @@ class Cl
|
|
5
5
|
include Cast
|
6
6
|
|
7
7
|
def define(const)
|
8
|
-
|
8
|
+
mod = Module.new
|
9
|
+
mod.send(:attr_accessor, name)
|
10
|
+
mod.class_eval "def #{name}?; #{name}.is_a?(Array) ? !#{name}.empty? : !!#{name} end"
|
11
|
+
const.include(mod)
|
9
12
|
end
|
10
13
|
|
11
14
|
def set(cmd, value)
|
12
|
-
|
15
|
+
value = cast(value)
|
16
|
+
unknown(value) if enum? && !known?(value)
|
17
|
+
cmd.send(:"#{name}=", value)
|
13
18
|
end
|
14
19
|
|
15
20
|
def type
|
16
21
|
opts[:type] || :string
|
17
22
|
end
|
18
23
|
|
24
|
+
def array?
|
25
|
+
type == :array
|
26
|
+
end
|
27
|
+
|
19
28
|
def description
|
20
29
|
opts[:description]
|
21
30
|
end
|
22
31
|
|
32
|
+
def enum
|
33
|
+
Array(opts[:enum])
|
34
|
+
end
|
35
|
+
|
36
|
+
def enum?
|
37
|
+
opts.key?(:enum)
|
38
|
+
end
|
39
|
+
|
40
|
+
def default
|
41
|
+
opts[:default]
|
42
|
+
end
|
43
|
+
|
44
|
+
def default?
|
45
|
+
opts.key?(:default)
|
46
|
+
end
|
47
|
+
|
48
|
+
def known?(value)
|
49
|
+
enum.include?(value)
|
50
|
+
end
|
51
|
+
|
23
52
|
def required?
|
24
53
|
!!opts[:required]
|
25
54
|
end
|
@@ -29,7 +58,11 @@ class Cl
|
|
29
58
|
end
|
30
59
|
|
31
60
|
def splat?
|
32
|
-
opts[:splat] &&
|
61
|
+
!!opts[:splat] && array?
|
62
|
+
end
|
63
|
+
|
64
|
+
def unknown(value)
|
65
|
+
raise UnknownArgumentValue.new(value, enum.join(', '))
|
33
66
|
end
|
34
67
|
|
35
68
|
def to_s
|
data/lib/cl/args.rb
CHANGED
@@ -14,10 +14,12 @@ class Cl
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def apply(cmd, values, opts)
|
17
|
-
return values if args.empty? || opts[:help]
|
18
17
|
values = splat(values) if splat?
|
18
|
+
values = default(values) if default?
|
19
19
|
validate(values)
|
20
|
-
|
20
|
+
return values if args.empty?
|
21
|
+
values = args.zip(values).map { |(arg, value)| arg.set(cmd, value) }.flatten(1) #.compact
|
22
|
+
compact_args(values)
|
21
23
|
end
|
22
24
|
|
23
25
|
def each(&block)
|
@@ -28,15 +30,28 @@ class Cl
|
|
28
30
|
self.args.index(*args, &block)
|
29
31
|
end
|
30
32
|
|
33
|
+
attr_writer :args
|
34
|
+
|
31
35
|
def args
|
32
36
|
@args ||= []
|
33
37
|
end
|
34
38
|
|
39
|
+
def clear
|
40
|
+
args.clear
|
41
|
+
end
|
42
|
+
|
43
|
+
def dup
|
44
|
+
args = super
|
45
|
+
args.args = args.args.dup
|
46
|
+
args
|
47
|
+
end
|
48
|
+
|
35
49
|
private
|
36
50
|
|
37
51
|
def validate(args)
|
52
|
+
# raise ArgumentError.new(:unknown_arg, arg) if unknown?(arg)
|
38
53
|
raise ArgumentError.new(:missing_args, args.size, required) if args.size < required
|
39
|
-
raise ArgumentError.new(:too_many_args, args.size, allowed) if args.size > allowed && !splat?
|
54
|
+
raise ArgumentError.new(:too_many_args, args.join(' '), args.size, allowed) if args.size > allowed && !splat?
|
40
55
|
end
|
41
56
|
|
42
57
|
def allowed
|
@@ -47,6 +62,10 @@ class Cl
|
|
47
62
|
any?(&:splat?)
|
48
63
|
end
|
49
64
|
|
65
|
+
def default?
|
66
|
+
any?(&:default?)
|
67
|
+
end
|
68
|
+
|
50
69
|
def required
|
51
70
|
select(&:required?).size
|
52
71
|
end
|
@@ -54,8 +73,20 @@ class Cl
|
|
54
73
|
def splat(values)
|
55
74
|
args.each.with_index.inject([]) do |group, (arg, ix)|
|
56
75
|
count = arg && arg.splat? ? [values.size - args.size + ix + 1] : []
|
76
|
+
count = 0 if count.first.to_i < 0
|
57
77
|
group << values.shift(*count)
|
58
78
|
end
|
59
79
|
end
|
80
|
+
|
81
|
+
def default(values)
|
82
|
+
args.each.with_index.inject([]) do |args, (arg, ix)|
|
83
|
+
args << (values[ix] || arg.default)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
def compact_args(args)
|
88
|
+
args = compact_args(args[0..-2]) while args.last.nil? && args.size > 0
|
89
|
+
args
|
90
|
+
end
|
60
91
|
end
|
61
92
|
end
|
data/lib/cl/cast.rb
CHANGED
data/lib/cl/cmd.rb
CHANGED
@@ -23,14 +23,14 @@ class Cl
|
|
23
23
|
if const.name
|
24
24
|
key = underscore(const.name.split('::').last)
|
25
25
|
key = [registry_key, key].compact.join(':') unless abstract?
|
26
|
+
const.register(key)
|
26
27
|
end
|
27
|
-
const.register key
|
28
28
|
const.define_singleton_method(:inherited, &inherited)
|
29
29
|
end
|
30
30
|
define_method(:inherited, &inherited)
|
31
31
|
|
32
32
|
def cmds
|
33
|
-
registry.values
|
33
|
+
registry.values.uniq
|
34
34
|
end
|
35
35
|
|
36
36
|
def parse(ctx, cmd, args)
|
@@ -55,7 +55,7 @@ class Cl
|
|
55
55
|
@ctx = ctx
|
56
56
|
args, opts = self.class.parse(ctx, self, args)
|
57
57
|
@opts = self.class.opts.apply(self, self.opts.merge(opts))
|
58
|
-
@args = self.class.args.apply(self, args, opts)
|
58
|
+
@args = self.class.args.apply(self, args, opts) unless help? && !is_a?(Help)
|
59
59
|
end
|
60
60
|
|
61
61
|
def opts
|
data/lib/cl/dsl.rb
CHANGED
@@ -18,7 +18,7 @@ class Cl
|
|
18
18
|
#
|
19
19
|
# See {Cl::Cmd::Dsl#arg} for more details.
|
20
20
|
def args(*args)
|
21
|
-
return @args ||= Args.new unless args.any?
|
21
|
+
return @args ||= superclass.respond_to?(:args) ? superclass.args.dup : Args.new unless args.any?
|
22
22
|
opts = args.last.is_a?(Hash) ? args.pop : {}
|
23
23
|
args.each { |arg| arg(arg, opts) }
|
24
24
|
end
|
data/lib/cl/errors.rb
CHANGED
@@ -5,8 +5,9 @@ class Cl
|
|
5
5
|
MSGS = {
|
6
6
|
unknown_cmd: 'Unknown command: %s',
|
7
7
|
unknown_option: 'Unknown option: %s',
|
8
|
+
unknown_arg: 'Unknown argument value: %s (known: %s)',
|
8
9
|
missing_args: 'Missing arguments (given: %s, required: %s)',
|
9
|
-
too_many_args: 'Too many arguments (given: %s, allowed: %s)',
|
10
|
+
too_many_args: 'Too many arguments: %s (given: %s, allowed: %s)',
|
10
11
|
wrong_type: 'Wrong argument type (given: %s, expected: %s)',
|
11
12
|
out_of_range: 'Out of range: %s',
|
12
13
|
invalid_format: 'Invalid format: %s',
|
@@ -91,6 +92,12 @@ class Cl
|
|
91
92
|
end
|
92
93
|
end
|
93
94
|
|
95
|
+
class UnknownArgumentValue < OptionError
|
96
|
+
def initialize(value, known)
|
97
|
+
super(:unknown_arg, value, known)
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
94
101
|
class UnknownValues < OptionError
|
95
102
|
include Suggest
|
96
103
|
|
data/lib/cl/help.rb
CHANGED
@@ -2,12 +2,18 @@ class Cl
|
|
2
2
|
class Help < Cl::Cmd
|
3
3
|
register :help
|
4
4
|
|
5
|
+
arg :args, splat: true
|
6
|
+
|
5
7
|
def run
|
6
8
|
ctx.puts help
|
7
9
|
end
|
8
10
|
|
9
11
|
def help
|
10
|
-
args.any? ? Cmd.new(ctx, cmd).format : Cmds.new(ctx, cmds).format
|
12
|
+
Array(args).any? ? Cmd.new(ctx, cmd).format : Cmds.new(ctx, cmds).format
|
13
|
+
end
|
14
|
+
|
15
|
+
def help?
|
16
|
+
true
|
11
17
|
end
|
12
18
|
|
13
19
|
private
|
data/lib/cl/help/cmd.rb
CHANGED
data/lib/cl/help/cmds.rb
CHANGED
data/lib/cl/help/format.rb
CHANGED
@@ -9,7 +9,7 @@ class Cl
|
|
9
9
|
def format
|
10
10
|
opts = []
|
11
11
|
opts << "type: #{type(obj)}" unless obj.type == :flag
|
12
|
-
opts << 'required
|
12
|
+
opts << 'required' if obj.required?
|
13
13
|
opts += Opt.new(obj).format if obj.is_a?(Cl::Opt)
|
14
14
|
opts = opts.join(', ')
|
15
15
|
opts = "(#{opts})" if obj.description && !opts.empty?
|
@@ -33,8 +33,8 @@ class Cl
|
|
33
33
|
opts << "default: #{format_default(opt)}" if opt.default?
|
34
34
|
opts << "known values: #{format_enum(opt)}" if opt.enum?
|
35
35
|
opts << "format: #{opt.format}" if opt.format?
|
36
|
-
opts << "
|
37
|
-
opts << "
|
36
|
+
opts << "downcases" if opt.downcase?
|
37
|
+
opts << "upcases" if opt.upcase?
|
38
38
|
opts << "min: #{opt.min}" if opt.min?
|
39
39
|
opts << "max: #{opt.max}" if opt.max?
|
40
40
|
opts << "e.g.: #{opt.example}" if opt.example?
|
data/lib/cl/help/usage.rb
CHANGED
@@ -2,7 +2,13 @@ class Cl
|
|
2
2
|
class Help
|
3
3
|
class Usage < Struct.new(:ctx, :cmd)
|
4
4
|
def format
|
5
|
-
|
5
|
+
cmd.registry_keys.map do |key|
|
6
|
+
line(key)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def line(key)
|
11
|
+
usage = [executable, key.to_s.gsub(':', ' ')]
|
6
12
|
usage += cmd.args.map(&:to_s) # { |arg| "[#{arg}]" }
|
7
13
|
usage << '[options]' if opts?
|
8
14
|
usage.join(' ')
|
@@ -12,10 +18,6 @@ class Cl
|
|
12
18
|
ctx.name
|
13
19
|
end
|
14
20
|
|
15
|
-
def name
|
16
|
-
cmd.registry_key.to_s.gsub(':', ' ')
|
17
|
-
end
|
18
|
-
|
19
21
|
def opts?
|
20
22
|
cmd.opts.any?
|
21
23
|
end
|
data/lib/cl/opt.rb
CHANGED
@@ -231,7 +231,7 @@ class Cl
|
|
231
231
|
|
232
232
|
class Validator < Struct.new(:strs, :opts)
|
233
233
|
SHORT = /^-\w( \w+)?$/
|
234
|
-
LONG = /^--[\w\-\[\]]+( \w
|
234
|
+
LONG = /^--[\w\-\[\]]+( \[?\w+\]?)?$/
|
235
235
|
|
236
236
|
MSGS = {
|
237
237
|
missing_strs: 'No option strings given. Pass one short -s and/or one --long option string.',
|
data/lib/cl/opts.rb
CHANGED
@@ -12,7 +12,7 @@ class Cl
|
|
12
12
|
|
13
13
|
opt = Opt.new(strs, opts, block)
|
14
14
|
opt.define(const)
|
15
|
-
|
15
|
+
insert(opt, const)
|
16
16
|
end
|
17
17
|
|
18
18
|
def apply(cmd, opts)
|
@@ -27,10 +27,11 @@ class Cl
|
|
27
27
|
opts
|
28
28
|
end
|
29
29
|
|
30
|
-
def
|
30
|
+
def insert(opt, const)
|
31
31
|
delete(opt)
|
32
|
-
|
33
|
-
|
32
|
+
return opts << opt if const == Cmd
|
33
|
+
ix = opts.index(const.superclass.opts.first)
|
34
|
+
opts.empty? ? opts << opt : opts.insert(ix.to_i, opt)
|
34
35
|
end
|
35
36
|
|
36
37
|
def [](key)
|
@@ -45,6 +46,10 @@ class Cl
|
|
45
46
|
opts.delete(opts.detect { |o| o.strs == opt.strs })
|
46
47
|
end
|
47
48
|
|
49
|
+
def first
|
50
|
+
opts.first
|
51
|
+
end
|
52
|
+
|
48
53
|
def to_a
|
49
54
|
opts
|
50
55
|
end
|
@@ -59,6 +64,10 @@ class Cl
|
|
59
64
|
map(&:deprecated).flatten.compact
|
60
65
|
end
|
61
66
|
|
67
|
+
def ==(other)
|
68
|
+
strs == other.strs
|
69
|
+
end
|
70
|
+
|
62
71
|
def dup
|
63
72
|
super.tap { |obj| obj.opts = opts.dup }
|
64
73
|
end
|
data/lib/cl/parser.rb
CHANGED
@@ -33,7 +33,8 @@ class Cl
|
|
33
33
|
|
34
34
|
def normalize(opts, args)
|
35
35
|
args = noize(opts, args)
|
36
|
-
dasherize(args)
|
36
|
+
# dasherize(args)
|
37
|
+
args
|
37
38
|
end
|
38
39
|
|
39
40
|
def noize(opts, args)
|
@@ -50,13 +51,13 @@ class Cl
|
|
50
51
|
end
|
51
52
|
end
|
52
53
|
|
53
|
-
DASHERIZE = /^--([^= ])*/
|
54
|
-
|
55
|
-
def dasherize(strs)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
end
|
54
|
+
# DASHERIZE = /^--([^= ])*/
|
55
|
+
#
|
56
|
+
# def dasherize(strs)
|
57
|
+
# strs.map do |str|
|
58
|
+
# str.is_a?(String) ? str.gsub(DASHERIZE) { |opt| opt.gsub('_', '-') } : str
|
59
|
+
# end
|
60
|
+
# end
|
60
61
|
|
61
62
|
def long?(str)
|
62
63
|
str.start_with?('--')
|
data/lib/cl/parser/format.rb
CHANGED
@@ -13,7 +13,7 @@ class Cl
|
|
13
13
|
strs = strs.map { |str| negated(str) }.flatten if flag?
|
14
14
|
strs = collect(strs, :dashed)
|
15
15
|
strs = collect(strs, :underscored)
|
16
|
-
strs = collect(strs, :valued) if flag?
|
16
|
+
strs = collect(strs, :valued) if flag? && Cl.flag_values
|
17
17
|
strs.uniq
|
18
18
|
end
|
19
19
|
|
data/lib/cl/runner/default.rb
CHANGED
@@ -7,6 +7,9 @@ class Cl
|
|
7
7
|
class Default
|
8
8
|
Runner.register :default, self
|
9
9
|
|
10
|
+
singleton_class.send(:attr_accessor, :run_method)
|
11
|
+
self.run_method = :run
|
12
|
+
|
10
13
|
extend Forwardable
|
11
14
|
include Merge, Suggest
|
12
15
|
|
@@ -20,7 +23,7 @@ class Cl
|
|
20
23
|
end
|
21
24
|
|
22
25
|
def run
|
23
|
-
cmd.help? ? help.run : cmd.
|
26
|
+
cmd.help? ? help.run : cmd.send(self.class.run_method)
|
24
27
|
rescue OptionParser::InvalidOption => e
|
25
28
|
raise UnknownOption.new(const, e.message)
|
26
29
|
end
|
@@ -30,7 +33,7 @@ class Cl
|
|
30
33
|
end
|
31
34
|
|
32
35
|
def help
|
33
|
-
Help.new(ctx, [cmd.registry_key])
|
36
|
+
cmd.is_a?(Help) ? cmd : Help.new(ctx, [cmd.registry_key])
|
34
37
|
end
|
35
38
|
|
36
39
|
def suggestions(args)
|
data/lib/cl/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sven Fuchs
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: regstry
|
@@ -45,6 +45,7 @@ files:
|
|
45
45
|
- MIT_LICENSE.md
|
46
46
|
- NOTES.md
|
47
47
|
- README.md
|
48
|
+
- cl.gemspec
|
48
49
|
- examples/README.md
|
49
50
|
- examples/_src/args/cast.erb.rb
|
50
51
|
- examples/_src/args/opts.erb.rb
|
@@ -171,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
171
172
|
version: '0'
|
172
173
|
requirements: []
|
173
174
|
rubyforge_project:
|
174
|
-
rubygems_version: 2.6.
|
175
|
+
rubygems_version: 2.6.11
|
175
176
|
signing_key:
|
176
177
|
specification_version: 4
|
177
178
|
summary: Object-oriented OptionParser based CLI support
|