optitron 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +34 -0
- data/README.rdoc +1 -4
- data/lib/optitron.rb +1 -0
- data/lib/optitron/class_dsl.rb +111 -27
- data/lib/optitron/cli.rb +6 -0
- data/lib/optitron/dsl.rb +13 -1
- data/lib/optitron/help.rb +3 -0
- data/lib/optitron/option.rb +2 -2
- data/lib/optitron/version.rb +1 -1
- data/optitron.gemspec +6 -0
- data/spec/cli_spec.rb +61 -0
- data/spec/option_spec.rb +26 -1
- data/spec/spec_helper.rb +15 -1
- metadata +100 -6
data/Gemfile.lock
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
optitron (0.0.9)
|
5
|
+
callsite (= 0.0.4)
|
6
|
+
ruby2ruby (= 1.2.4)
|
7
|
+
ruby_parser (>= 2.0)
|
8
|
+
sexp_processor (= 3.0.4)
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: http://rubygems.org/
|
12
|
+
specs:
|
13
|
+
callsite (0.0.4)
|
14
|
+
rake (0.8.7)
|
15
|
+
rspec (1.3.0)
|
16
|
+
ruby2ruby (1.2.4)
|
17
|
+
ruby_parser (~> 2.0)
|
18
|
+
sexp_processor (~> 3.0)
|
19
|
+
ruby_parser (2.0.4)
|
20
|
+
sexp_processor (~> 3.0)
|
21
|
+
sexp_processor (3.0.4)
|
22
|
+
|
23
|
+
PLATFORMS
|
24
|
+
ruby
|
25
|
+
|
26
|
+
DEPENDENCIES
|
27
|
+
bundler (>= 1.0.0.rc.3)
|
28
|
+
callsite (= 0.0.4)
|
29
|
+
optitron!
|
30
|
+
rake
|
31
|
+
rspec
|
32
|
+
ruby2ruby (= 1.2.4)
|
33
|
+
ruby_parser (>= 2.0)
|
34
|
+
sexp_processor (= 3.0.4)
|
data/README.rdoc
CHANGED
@@ -112,16 +112,13 @@ Now, try running it.
|
|
112
112
|
|
113
113
|
require 'optitron'
|
114
114
|
|
115
|
-
class Runner
|
116
|
-
include Optitron::ClassDsl
|
115
|
+
class Runner < Optitron::CLI
|
117
116
|
|
118
117
|
class_opt 'verbose'
|
119
118
|
use_help
|
120
119
|
|
121
120
|
desc "Install stuff"
|
122
121
|
opt 'force'
|
123
|
-
arg 'file'
|
124
|
-
arg 'source', :required => false
|
125
122
|
def install(file, source)
|
126
123
|
puts "install some things #{file} from #{source.inspect} #{params.inspect}"
|
127
124
|
end
|
data/lib/optitron.rb
CHANGED
data/lib/optitron/class_dsl.rb
CHANGED
@@ -1,10 +1,66 @@
|
|
1
|
+
require 'callsite'
|
2
|
+
require 'ruby2ruby'
|
3
|
+
require 'ruby_parser'
|
4
|
+
require 'sexp_processor'
|
5
|
+
|
1
6
|
class Optitron
|
7
|
+
|
8
|
+
class MethodArgs < SexpProcessor
|
9
|
+
attr_reader :method_map
|
10
|
+
def initialize(cls)
|
11
|
+
@cls = cls
|
12
|
+
@method_map = {}
|
13
|
+
super()
|
14
|
+
end
|
15
|
+
|
16
|
+
def process_class(exp)
|
17
|
+
exp.shift
|
18
|
+
@current_class = exp.first.to_sym
|
19
|
+
process(exp)
|
20
|
+
exp.clear
|
21
|
+
exp
|
22
|
+
end
|
23
|
+
|
24
|
+
def process_defn(exp)
|
25
|
+
exp.shift
|
26
|
+
@current_method = exp.shift
|
27
|
+
@ruby2ruby = Ruby2Ruby.new
|
28
|
+
process_args(exp.shift)
|
29
|
+
scope = exp.shift
|
30
|
+
exp
|
31
|
+
end
|
32
|
+
|
33
|
+
def process_args(exp)
|
34
|
+
exp.shift
|
35
|
+
arg_list = []
|
36
|
+
while !exp.empty?
|
37
|
+
t = exp.shift
|
38
|
+
case t
|
39
|
+
when Symbol
|
40
|
+
arg_list << if t.to_s[0] == ?*
|
41
|
+
[t.to_s[1, t.to_s.size].to_sym, :greedy]
|
42
|
+
else
|
43
|
+
[t, :required]
|
44
|
+
end
|
45
|
+
when Sexp
|
46
|
+
case t.shift
|
47
|
+
when :block
|
48
|
+
lasgn = t.shift
|
49
|
+
lasgn.shift
|
50
|
+
arg_list[-1].shift
|
51
|
+
arg_list[-1] << :optional
|
52
|
+
arg_list[-1] << @ruby2ruby.process(lasgn.last)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
@method_map[@current_method] = arg_list if @cls.name.to_sym == @current_class
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
2
60
|
module ClassDsl
|
3
61
|
|
4
62
|
def self.included(o)
|
5
|
-
o.
|
6
|
-
@@optitron_parser = Optitron::Parser.new
|
7
|
-
@@optitron_dsl = Optitron::Dsl.new(@@optitron_parser)
|
63
|
+
o.class_eval "
|
8
64
|
attr_accessor :params
|
9
65
|
class << self;
|
10
66
|
include ClassMethods
|
@@ -14,58 +70,86 @@ class Optitron
|
|
14
70
|
|
15
71
|
module ClassMethods
|
16
72
|
def method_added(m)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
73
|
+
if @last_desc
|
74
|
+
last_opts = @opts
|
75
|
+
@cmds ||= []
|
76
|
+
@cmds << [m.to_s, @last_desc, @opts ? @opts.dup : []]
|
77
|
+
@opts.clear if @opts
|
78
|
+
@args.clear if @args
|
79
|
+
end
|
22
80
|
end
|
23
|
-
|
81
|
+
def optitron_parser
|
82
|
+
send(:class_variable_set, :@@optitron_parser, Optitron::Parser.new) unless send(:class_variable_defined?, :@@optitron_parser)
|
83
|
+
send(:class_variable_get, :@@optitron_parser)
|
84
|
+
end
|
85
|
+
|
24
86
|
def optitron_dsl
|
25
|
-
|
87
|
+
send(:class_variable_set, :@@optitron_dsl, Optitron::Dsl.new(optitron_parser)) unless send(:class_variable_defined?, :@@optitron_dsl)
|
88
|
+
send(:class_variable_get, :@@optitron_dsl)
|
26
89
|
end
|
27
90
|
|
28
|
-
def
|
29
|
-
|
91
|
+
def method_args
|
92
|
+
send(:class_variable_get, :@@method_args)
|
93
|
+
end
|
94
|
+
|
95
|
+
def build_method_args(file)
|
96
|
+
unless self.send(:class_variable_defined?, :@@method_args)
|
97
|
+
parser = RubyParser.new
|
98
|
+
sexp = parser.process(File.read(file))
|
99
|
+
method_args = MethodArgs.new(self)
|
100
|
+
method_args.process(sexp)
|
101
|
+
self.send(:class_variable_set, :@@method_args, method_args.method_map)
|
102
|
+
end
|
103
|
+
send(:class_variable_get, :@@method_args)
|
30
104
|
end
|
31
105
|
|
32
106
|
def class_opt(name, desc = nil, opts = nil)
|
33
107
|
optitron_dsl.root.opt(name, desc, opts)
|
34
108
|
end
|
35
109
|
|
36
|
-
def
|
110
|
+
def dont_use_help
|
37
111
|
optitron_dsl.root.help
|
38
112
|
end
|
39
113
|
|
40
114
|
def desc(desc)
|
115
|
+
build_method_args(Callsite.parse(caller.first).filename)
|
41
116
|
@last_desc = desc
|
42
117
|
end
|
43
118
|
|
44
|
-
def arg(name, desc = nil, opts = nil)
|
45
|
-
@args ||= []
|
46
|
-
@args << [name, desc, opts]
|
47
|
-
end
|
48
|
-
|
49
119
|
def opt(name, desc = nil, opts = nil)
|
50
120
|
@opts ||= []
|
51
121
|
@opts << [name, desc, opts]
|
52
122
|
end
|
53
123
|
|
54
124
|
def build
|
55
|
-
@
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
125
|
+
unless @built
|
126
|
+
optitron_dsl.root.help
|
127
|
+
@cmds.each do |(cmd_name, cmd_desc, opts)|
|
128
|
+
args = method_args[cmd_name.to_sym]
|
129
|
+
arity = instance_method(cmd_name).arity
|
130
|
+
optitron_dsl.root.cmd(cmd_name, cmd_desc) do
|
131
|
+
opts.each { |o| opt *o }
|
132
|
+
args.each do |(arg_name, arg_type, arg_default)|
|
133
|
+
case arg_type
|
134
|
+
when :required
|
135
|
+
arg arg_name.to_s, :default => arg_default && eval(arg_default)
|
136
|
+
when :optional
|
137
|
+
arg arg_name.to_s, :default => arg_default && eval(arg_default), :required => false
|
138
|
+
when :greedy
|
139
|
+
arg arg_name.to_s, :default => arg_default && eval(arg_default), :type => :greedy
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
60
143
|
end
|
144
|
+
optitron_dsl.configure_options
|
145
|
+
@built = true
|
61
146
|
end
|
62
|
-
optitron_dsl.configure_options
|
63
147
|
end
|
64
148
|
|
65
|
-
def dispatch
|
149
|
+
def dispatch(args = ARGV, &blk)
|
66
150
|
build
|
67
|
-
optitron_parser.target = new
|
68
|
-
response = optitron_parser.parse(
|
151
|
+
optitron_parser.target = blk ? blk.call : new
|
152
|
+
response = optitron_parser.parse(args)
|
69
153
|
if response.valid?
|
70
154
|
optitron_parser.target.params = response.params
|
71
155
|
args = response.args
|
data/lib/optitron/cli.rb
ADDED
data/lib/optitron/dsl.rb
CHANGED
@@ -35,8 +35,8 @@ class Optitron
|
|
35
35
|
else
|
36
36
|
unclaimed_opts << opt_option
|
37
37
|
end
|
38
|
-
|
39
38
|
@target.options << opt_option
|
39
|
+
opt_option
|
40
40
|
end
|
41
41
|
|
42
42
|
def arg(name, description = nil, opts = nil)
|
@@ -61,6 +61,18 @@ class Optitron
|
|
61
61
|
@root_dsl = root_dsl
|
62
62
|
@target = command
|
63
63
|
end
|
64
|
+
|
65
|
+
def opt(name, description = nil, opts = nil)
|
66
|
+
o = super
|
67
|
+
o.parent_cmd = @target
|
68
|
+
o
|
69
|
+
end
|
70
|
+
|
71
|
+
def arg(name, description = nil, opts = nil)
|
72
|
+
a = super
|
73
|
+
a.parent_cmd = @target
|
74
|
+
a
|
75
|
+
end
|
64
76
|
end
|
65
77
|
|
66
78
|
class RootParserDsl < AbstractDsl
|
data/lib/optitron/help.rb
CHANGED
data/lib/optitron/option.rb
CHANGED
@@ -89,7 +89,7 @@ class Optitron
|
|
89
89
|
end
|
90
90
|
|
91
91
|
class Opt < Option
|
92
|
-
attr_accessor :short_name, :run
|
92
|
+
attr_accessor :short_name, :run, :parent_cmd
|
93
93
|
def initialize(name, desc = nil, opts = nil)
|
94
94
|
if desc.is_a?(Hash)
|
95
95
|
desc, opts = nil, desc
|
@@ -179,7 +179,7 @@ class Optitron
|
|
179
179
|
end
|
180
180
|
|
181
181
|
class Arg < Option
|
182
|
-
attr_accessor :greedy, :inclusion_test
|
182
|
+
attr_accessor :greedy, :inclusion_test, :parent_cmd
|
183
183
|
alias_method :greedy?, :greedy
|
184
184
|
def initialize(name = nil, desc = nil, opts = nil)
|
185
185
|
if desc.is_a?(Hash)
|
data/lib/optitron/version.rb
CHANGED
data/optitron.gemspec
CHANGED
@@ -15,7 +15,13 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.required_rubygems_version = ">= 1.3.6"
|
16
16
|
s.rubyforge_project = "optitron"
|
17
17
|
|
18
|
+
s.add_dependency "ruby_parser", ">= 2.0"
|
19
|
+
s.add_dependency "callsite", "= 0.0.4"
|
20
|
+
s.add_dependency "ruby2ruby", "= 1.2.4"
|
21
|
+
s.add_dependency "sexp_processor", "= 3.0.4"
|
18
22
|
s.add_development_dependency "bundler", ">= 1.0.0.rc.3"
|
23
|
+
s.add_development_dependency "rake"
|
24
|
+
s.add_development_dependency "rspec"
|
19
25
|
|
20
26
|
s.files = `git ls-files`.split("\n")
|
21
27
|
s.require_path = 'lib'
|
data/spec/cli_spec.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class CLIExample < Optitron::CLI
|
4
|
+
|
5
|
+
def a_method_we_didnt_describe
|
6
|
+
end
|
7
|
+
|
8
|
+
class_opt 'verbose'
|
9
|
+
|
10
|
+
desc "Use this"
|
11
|
+
opt 'use_opt'
|
12
|
+
def use
|
13
|
+
puts "using this"
|
14
|
+
end
|
15
|
+
|
16
|
+
desc "Use this too"
|
17
|
+
opt 'another_opt'
|
18
|
+
def use_too(one, two = 'three')
|
19
|
+
end
|
20
|
+
|
21
|
+
desc "Use this three"
|
22
|
+
opt 'another_opt_as_well', :default => 123
|
23
|
+
def use_greedy(one, *two)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class AnotherCLIExample < Optitron::CLI
|
28
|
+
|
29
|
+
def initialize(env)
|
30
|
+
@env = env
|
31
|
+
end
|
32
|
+
|
33
|
+
class_opt 'verbose'
|
34
|
+
|
35
|
+
desc "Use this too"
|
36
|
+
opt 'another_opt'
|
37
|
+
def use_too(one, two = 'three')
|
38
|
+
puts "using this too #{one} #{two} #{params['another_opt']} #{@env}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
describe "Optitron::Parser defaults" do
|
44
|
+
it "should generate the correct help" do
|
45
|
+
CLIExample.build
|
46
|
+
CLIExample.optitron_parser.help.strip.should == "Commands\n\nuse_greedy [one] [two1 two2 ...] # Use this three\n -A/--another_opt_as_well=[NUMERIC] \nuse_too [one] <required=\"three\"> # Use this too\n -a/--another_opt \nuse # Use this\n -u/--use_opt \n\nGlobal options\n\n-v/--verbose \n-?/--help # Print help message"
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should dispatch" do
|
50
|
+
capture(:stdout) { CLIExample.dispatch(%w(use))}.should == "using this\n"
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should generate the correct help" do
|
54
|
+
AnotherCLIExample.build
|
55
|
+
AnotherCLIExample.optitron_parser.help.strip.should == "Commands\n\nuse_too [one] <required=\"three\"> # Use this too\n -a/--another_opt \n\nGlobal options\n\n-v/--verbose \n-?/--help # Print help message"
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should dispatch with a custom initer" do
|
59
|
+
capture(:stdout) { AnotherCLIExample.dispatch(%w(use_too three four --another_opt)) { AnotherCLIExample.new("test") } }.should == "using this too three four true test\n"
|
60
|
+
end
|
61
|
+
end
|
data/spec/option_spec.rb
CHANGED
@@ -65,7 +65,32 @@ describe "Optitron::Parser options" do
|
|
65
65
|
it "should parse '-Vv --vicious=what'" do
|
66
66
|
response = @parser.parse(%w(-Vv --vicious=what))
|
67
67
|
response.valid?.should be_true
|
68
|
-
response.params
|
68
|
+
response.params.should == {"vicious"=>"what", "vendetta"=>true, "verbose"=>true}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "auto assingment of short names in cmd parsers" do
|
73
|
+
before(:each) do
|
74
|
+
@parser = Optitron.new {
|
75
|
+
cmd "one" do
|
76
|
+
opt "verbose"
|
77
|
+
end
|
78
|
+
cmd "two" do
|
79
|
+
opt "verbose"
|
80
|
+
end
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should parse 'one -v'" do
|
85
|
+
response = @parser.parse(%w(one -v))
|
86
|
+
response.valid?.should be_true
|
87
|
+
response.params.should == {'verbose' => true}
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should parse 'two -V'" do
|
91
|
+
response = @parser.parse(%w(two -V))
|
92
|
+
response.valid?.should be_true
|
93
|
+
response.params.should == {'verbose' => true}
|
69
94
|
end
|
70
95
|
end
|
71
96
|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,2 +1,16 @@
|
|
1
1
|
$LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
|
2
|
-
require 'optitron'
|
2
|
+
require 'optitron'
|
3
|
+
|
4
|
+
class Object
|
5
|
+
def capture(stream)
|
6
|
+
begin
|
7
|
+
stream = stream.to_s
|
8
|
+
eval "$#{stream} = StringIO.new"
|
9
|
+
yield
|
10
|
+
result = eval("$#{stream}").string
|
11
|
+
ensure
|
12
|
+
eval("$#{stream} = #{stream.upcase}")
|
13
|
+
end
|
14
|
+
result
|
15
|
+
end
|
16
|
+
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: optitron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 11
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 10
|
10
|
+
version: 0.0.10
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joshua Hull
|
@@ -15,13 +15,76 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-19 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
name:
|
22
|
+
name: ruby_parser
|
23
23
|
prerelease: false
|
24
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 2
|
32
|
+
- 0
|
33
|
+
version: "2.0"
|
34
|
+
type: :runtime
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: callsite
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - "="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 23
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
- 0
|
48
|
+
- 4
|
49
|
+
version: 0.0.4
|
50
|
+
type: :runtime
|
51
|
+
version_requirements: *id002
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
name: ruby2ruby
|
54
|
+
prerelease: false
|
55
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - "="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
hash: 23
|
61
|
+
segments:
|
62
|
+
- 1
|
63
|
+
- 2
|
64
|
+
- 4
|
65
|
+
version: 1.2.4
|
66
|
+
type: :runtime
|
67
|
+
version_requirements: *id003
|
68
|
+
- !ruby/object:Gem::Dependency
|
69
|
+
name: sexp_processor
|
70
|
+
prerelease: false
|
71
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - "="
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
hash: 15
|
77
|
+
segments:
|
78
|
+
- 3
|
79
|
+
- 0
|
80
|
+
- 4
|
81
|
+
version: 3.0.4
|
82
|
+
type: :runtime
|
83
|
+
version_requirements: *id004
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: bundler
|
86
|
+
prerelease: false
|
87
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
25
88
|
none: false
|
26
89
|
requirements:
|
27
90
|
- - ">="
|
@@ -35,7 +98,35 @@ dependencies:
|
|
35
98
|
- 3
|
36
99
|
version: 1.0.0.rc.3
|
37
100
|
type: :development
|
38
|
-
version_requirements: *
|
101
|
+
version_requirements: *id005
|
102
|
+
- !ruby/object:Gem::Dependency
|
103
|
+
name: rake
|
104
|
+
prerelease: false
|
105
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
106
|
+
none: false
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
hash: 3
|
111
|
+
segments:
|
112
|
+
- 0
|
113
|
+
version: "0"
|
114
|
+
type: :development
|
115
|
+
version_requirements: *id006
|
116
|
+
- !ruby/object:Gem::Dependency
|
117
|
+
name: rspec
|
118
|
+
prerelease: false
|
119
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
120
|
+
none: false
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
hash: 3
|
125
|
+
segments:
|
126
|
+
- 0
|
127
|
+
version: "0"
|
128
|
+
type: :development
|
129
|
+
version_requirements: *id007
|
39
130
|
description: Sensible options parsing
|
40
131
|
email:
|
41
132
|
- joshbuddy@gmail.com
|
@@ -48,10 +139,12 @@ extra_rdoc_files: []
|
|
48
139
|
files:
|
49
140
|
- .gitignore
|
50
141
|
- Gemfile
|
142
|
+
- Gemfile.lock
|
51
143
|
- README.rdoc
|
52
144
|
- Rakefile
|
53
145
|
- lib/optitron.rb
|
54
146
|
- lib/optitron/class_dsl.rb
|
147
|
+
- lib/optitron/cli.rb
|
55
148
|
- lib/optitron/dsl.rb
|
56
149
|
- lib/optitron/help.rb
|
57
150
|
- lib/optitron/option.rb
|
@@ -61,6 +154,7 @@ files:
|
|
61
154
|
- lib/optitron/version.rb
|
62
155
|
- optitron.gemspec
|
63
156
|
- spec/arg_spec.rb
|
157
|
+
- spec/cli_spec.rb
|
64
158
|
- spec/default_spec.rb
|
65
159
|
- spec/dispatch_spec.rb
|
66
160
|
- spec/errors_spec.rb
|