optitron 0.2.2 → 0.3.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.
- data/.gitignore +2 -1
- data/Gemfile.lock +9 -7
- data/lib/optitron/class_dsl.rb +17 -116
- data/lib/optitron/version.rb +1 -1
- data/optitron.gemspec +2 -3
- data/spec/cli_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- metadata +39 -56
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,16 +1,19 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
optitron (0.
|
4
|
+
optitron (0.3.0)
|
5
5
|
callsite (~> 0.0.4)
|
6
|
-
|
7
|
-
ruby_parser (~> 2.0)
|
8
|
-
sexp_processor (~> 3.0.4)
|
6
|
+
method-args (~> 0.1.0)
|
9
7
|
|
10
8
|
GEM
|
11
9
|
remote: http://rubygems.org/
|
12
10
|
specs:
|
13
11
|
callsite (0.0.4)
|
12
|
+
method-args (0.1.0)
|
13
|
+
ruby2ruby (~> 1.2.4)
|
14
|
+
ruby_parser (~> 2.0)
|
15
|
+
sexp_processor (~> 3.0.4)
|
16
|
+
phocus (1.1)
|
14
17
|
rake (0.8.7)
|
15
18
|
rspec (1.3.0)
|
16
19
|
ruby2ruby (1.2.5)
|
@@ -26,9 +29,8 @@ PLATFORMS
|
|
26
29
|
DEPENDENCIES
|
27
30
|
bundler (~> 1.0.0)
|
28
31
|
callsite (~> 0.0.4)
|
32
|
+
method-args (~> 0.1.0)
|
29
33
|
optitron!
|
34
|
+
phocus
|
30
35
|
rake
|
31
36
|
rspec
|
32
|
-
ruby2ruby (~> 1.2.4)
|
33
|
-
ruby_parser (~> 2.0)
|
34
|
-
sexp_processor (~> 3.0.4)
|
data/lib/optitron/class_dsl.rb
CHANGED
@@ -1,94 +1,8 @@
|
|
1
1
|
require 'callsite'
|
2
|
-
require '
|
3
|
-
require 'ruby_parser'
|
4
|
-
require 'sexp_processor'
|
2
|
+
require 'method_args'
|
5
3
|
|
6
4
|
class Optitron
|
7
5
|
|
8
|
-
class MethodArgs < SexpProcessor
|
9
|
-
attr_reader :method_map
|
10
|
-
def initialize(cls)
|
11
|
-
@cls = cls
|
12
|
-
@method_map = {}
|
13
|
-
@current_class = []
|
14
|
-
super()
|
15
|
-
end
|
16
|
-
|
17
|
-
def process_module(exp)
|
18
|
-
exp.shift
|
19
|
-
@current_class << exp.first.to_sym
|
20
|
-
process(exp)
|
21
|
-
@current_class.pop
|
22
|
-
exp.clear
|
23
|
-
exp
|
24
|
-
end
|
25
|
-
|
26
|
-
def process_class(exp)
|
27
|
-
exp.shift
|
28
|
-
current_class_size = @current_class.size
|
29
|
-
case exp.first
|
30
|
-
when Symbol
|
31
|
-
@current_class << exp.first.to_sym
|
32
|
-
process(exp)
|
33
|
-
else
|
34
|
-
if exp.first.first == :colon2
|
35
|
-
exp.first.shift
|
36
|
-
class_exp = exp.shift
|
37
|
-
class_exp[0, class_exp.size - 1].each do |const|
|
38
|
-
@current_class << const.last
|
39
|
-
end
|
40
|
-
@current_class << class_exp.last
|
41
|
-
else
|
42
|
-
raise
|
43
|
-
end
|
44
|
-
exp.shift
|
45
|
-
process(exp.first)
|
46
|
-
end
|
47
|
-
@current_class.slice!(current_class_size, @current_class.size)
|
48
|
-
exp.clear
|
49
|
-
exp
|
50
|
-
end
|
51
|
-
|
52
|
-
def process_defn(exp)
|
53
|
-
exp.shift
|
54
|
-
@current_method = exp.shift
|
55
|
-
@ruby2ruby = Ruby2Ruby.new
|
56
|
-
process_args(exp.shift)
|
57
|
-
scope = exp.shift
|
58
|
-
exp
|
59
|
-
end
|
60
|
-
|
61
|
-
def process_args(exp)
|
62
|
-
exp.shift
|
63
|
-
arg_list = []
|
64
|
-
while !exp.empty?
|
65
|
-
t = exp.shift
|
66
|
-
case t
|
67
|
-
when Symbol
|
68
|
-
arg_list << if t.to_s[0] == ?*
|
69
|
-
[t.to_s[1, t.to_s.size].to_sym, :greedy]
|
70
|
-
else
|
71
|
-
[t, :required]
|
72
|
-
end
|
73
|
-
when Sexp
|
74
|
-
case t.shift
|
75
|
-
when :block
|
76
|
-
lasgn = t.shift
|
77
|
-
lasgn.shift
|
78
|
-
name = lasgn.shift
|
79
|
-
sub_part = arg_list.find{|arg| arg.first == name}
|
80
|
-
sub_part.clear
|
81
|
-
sub_part << name
|
82
|
-
sub_part << :optional
|
83
|
-
sub_part << @ruby2ruby.process(lasgn.last)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
@cls
|
88
|
-
@method_map[@current_method] = arg_list if @cls.name == @current_class.map{|c| c.to_s}.join('::')
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
6
|
module ClassDsl
|
93
7
|
|
94
8
|
def self.included(o)
|
@@ -99,7 +13,6 @@ class Optitron
|
|
99
13
|
end"
|
100
14
|
end
|
101
15
|
|
102
|
-
|
103
16
|
module ClassMethods
|
104
17
|
def method_added(m)
|
105
18
|
if @last_desc
|
@@ -112,6 +25,7 @@ class Optitron
|
|
112
25
|
@last_group = nil
|
113
26
|
end
|
114
27
|
end
|
28
|
+
|
115
29
|
def optitron_parser
|
116
30
|
send(:class_variable_set, :@@optitron_parser, Optitron::Parser.new) unless send(:class_variable_defined?, :@@optitron_parser)
|
117
31
|
send(:class_variable_get, :@@optitron_parser)
|
@@ -122,21 +36,6 @@ class Optitron
|
|
122
36
|
send(:class_variable_get, :@@optitron_dsl)
|
123
37
|
end
|
124
38
|
|
125
|
-
def method_args
|
126
|
-
send(:class_variable_get, :@@method_args)
|
127
|
-
end
|
128
|
-
|
129
|
-
def build_method_args(file)
|
130
|
-
unless send(:class_variable_defined?, :@@method_args)
|
131
|
-
parser = RubyParser.new
|
132
|
-
sexp = parser.process(File.read(file))
|
133
|
-
method_args = MethodArgs.new(self)
|
134
|
-
method_args.process(sexp)
|
135
|
-
send(:class_variable_set, :@@method_args, method_args.method_map)
|
136
|
-
end
|
137
|
-
send(:class_variable_get, :@@method_args)
|
138
|
-
end
|
139
|
-
|
140
39
|
def class_opt(name, desc = nil, opts = nil)
|
141
40
|
optitron_dsl.root.opt(name, desc, opts)
|
142
41
|
end
|
@@ -146,7 +45,7 @@ class Optitron
|
|
146
45
|
end
|
147
46
|
|
148
47
|
def desc(desc)
|
149
|
-
|
48
|
+
MethodArgs.register(Callsite.parse(caller.first).filename)
|
150
49
|
@last_desc = desc
|
151
50
|
end
|
152
51
|
|
@@ -163,29 +62,32 @@ class Optitron
|
|
163
62
|
@arg_types = types
|
164
63
|
end
|
165
64
|
|
166
|
-
def build
|
65
|
+
def build(&blk)
|
167
66
|
unless @built
|
67
|
+
optitron_parser.target = blk ? blk.call : new
|
168
68
|
target = optitron_parser.target
|
169
69
|
optitron_dsl.root.help unless send(:class_variable_defined?, :@@suppress_help)
|
170
70
|
@cmds.each do |(cmd_name, cmd_desc, opts)|
|
171
|
-
|
172
|
-
arity = instance_method(cmd_name).arity
|
71
|
+
method = target.class.instance_method(cmd_name.to_sym).bind(target)
|
173
72
|
arg_types = @arg_types
|
174
73
|
optitron_dsl.root.cmd(cmd_name, cmd_desc) do
|
175
74
|
opts.each { |o| opt *o }
|
176
|
-
|
177
|
-
|
178
|
-
|
75
|
+
puts "!!! #{cmd_name.inspect}" if method.nil?
|
76
|
+
method.args.each do |arg|
|
77
|
+
possible_arg_type = arg.name.to_s[/_(string|hash|array|numeric|int|float)$/, 1]
|
78
|
+
arg_name = if possible_arg_type && (arg_types.nil? || !arg_types.first)
|
179
79
|
possible_arg_type = possible_arg_type.to_sym
|
180
|
-
|
80
|
+
arg.name.to_s[/^(.*)_(?:string|hash|array|numeric|int|float)$/, 1]
|
81
|
+
else
|
82
|
+
arg.name
|
181
83
|
end
|
182
|
-
arg_opts = { :default =>
|
183
|
-
case
|
84
|
+
arg_opts = { :default => arg.default_value, :type => arg_types && arg_types.shift || possible_arg_type }
|
85
|
+
case arg.type
|
184
86
|
when :required
|
185
87
|
arg arg_name.to_s, arg_opts
|
186
88
|
when :optional
|
187
89
|
arg arg_name.to_s, arg_opts.merge(:required => false)
|
188
|
-
when :
|
90
|
+
when :splat
|
189
91
|
arg arg_name.to_s, arg_opts.merge(:type => :greedy)
|
190
92
|
end
|
191
93
|
end
|
@@ -197,8 +99,7 @@ class Optitron
|
|
197
99
|
end
|
198
100
|
|
199
101
|
def dispatch(args = ARGV, &blk)
|
200
|
-
|
201
|
-
build
|
102
|
+
build(&blk)
|
202
103
|
response = optitron_parser.parse(args)
|
203
104
|
if response.valid?
|
204
105
|
optitron_parser.target.params = response.params
|
data/lib/optitron/version.rb
CHANGED
data/optitron.gemspec
CHANGED
@@ -15,13 +15,12 @@ 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
18
|
s.add_dependency "callsite", "~> 0.0.4"
|
20
|
-
s.add_dependency "
|
21
|
-
s.add_dependency "sexp_processor", "~> 3.0.4"
|
19
|
+
s.add_dependency "method-args", "~> 0.1.0"
|
22
20
|
s.add_development_dependency "bundler", "~> 1.0.0"
|
23
21
|
s.add_development_dependency "rake"
|
24
22
|
s.add_development_dependency "rspec"
|
23
|
+
s.add_development_dependency "phocus"
|
25
24
|
|
26
25
|
s.files = `git ls-files`.split("\n")
|
27
26
|
s.require_path = 'lib'
|
data/spec/cli_spec.rb
CHANGED
@@ -110,7 +110,7 @@ describe "Optitron::Parser defaults" do
|
|
110
110
|
end
|
111
111
|
|
112
112
|
it "should generate the correct help" do
|
113
|
-
AnotherCLIExample.build
|
113
|
+
AnotherCLIExample.build { AnotherCLIExample.new("test") }
|
114
114
|
AnotherCLIExample.optitron_parser.help.strip.should == "Commands\n\nuse_too [one] <two=\"three\"> # Use this too\n -a/--another_opt \n\nGlobal options\n\n-v/--verbose \n-?/--help # Print help message"
|
115
115
|
end
|
116
116
|
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 0.3.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Joshua Hull
|
@@ -15,28 +15,11 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date:
|
18
|
+
date: 2011-01-06 00:00:00 -08:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
|
-
|
23
|
-
prerelease: false
|
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
|
22
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
40
23
|
none: false
|
41
24
|
requirements:
|
42
25
|
- - ~>
|
@@ -47,44 +30,28 @@ dependencies:
|
|
47
30
|
- 0
|
48
31
|
- 4
|
49
32
|
version: 0.0.4
|
50
|
-
|
51
|
-
|
52
|
-
- !ruby/object:Gem::Dependency
|
53
|
-
name: ruby2ruby
|
33
|
+
requirement: *id001
|
34
|
+
name: callsite
|
54
35
|
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
36
|
type: :runtime
|
67
|
-
version_requirements: *id003
|
68
37
|
- !ruby/object:Gem::Dependency
|
69
|
-
|
70
|
-
prerelease: false
|
71
|
-
requirement: &id004 !ruby/object:Gem::Requirement
|
38
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
72
39
|
none: false
|
73
40
|
requirements:
|
74
41
|
- - ~>
|
75
42
|
- !ruby/object:Gem::Version
|
76
|
-
hash:
|
43
|
+
hash: 27
|
77
44
|
segments:
|
78
|
-
- 3
|
79
45
|
- 0
|
80
|
-
-
|
81
|
-
|
46
|
+
- 1
|
47
|
+
- 0
|
48
|
+
version: 0.1.0
|
49
|
+
requirement: *id002
|
50
|
+
name: method-args
|
51
|
+
prerelease: false
|
82
52
|
type: :runtime
|
83
|
-
version_requirements: *id004
|
84
53
|
- !ruby/object:Gem::Dependency
|
85
|
-
|
86
|
-
prerelease: false
|
87
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
54
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
88
55
|
none: false
|
89
56
|
requirements:
|
90
57
|
- - ~>
|
@@ -95,12 +62,12 @@ dependencies:
|
|
95
62
|
- 0
|
96
63
|
- 0
|
97
64
|
version: 1.0.0
|
65
|
+
requirement: *id003
|
66
|
+
name: bundler
|
67
|
+
prerelease: false
|
98
68
|
type: :development
|
99
|
-
version_requirements: *id005
|
100
69
|
- !ruby/object:Gem::Dependency
|
101
|
-
|
102
|
-
prerelease: false
|
103
|
-
requirement: &id006 !ruby/object:Gem::Requirement
|
70
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
104
71
|
none: false
|
105
72
|
requirements:
|
106
73
|
- - ">="
|
@@ -109,12 +76,26 @@ dependencies:
|
|
109
76
|
segments:
|
110
77
|
- 0
|
111
78
|
version: "0"
|
79
|
+
requirement: *id004
|
80
|
+
name: rake
|
81
|
+
prerelease: false
|
112
82
|
type: :development
|
113
|
-
version_requirements: *id006
|
114
83
|
- !ruby/object:Gem::Dependency
|
84
|
+
version_requirements: &id005 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
requirement: *id005
|
115
94
|
name: rspec
|
116
95
|
prerelease: false
|
117
|
-
|
96
|
+
type: :development
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
version_requirements: &id006 !ruby/object:Gem::Requirement
|
118
99
|
none: false
|
119
100
|
requirements:
|
120
101
|
- - ">="
|
@@ -123,8 +104,10 @@ dependencies:
|
|
123
104
|
segments:
|
124
105
|
- 0
|
125
106
|
version: "0"
|
107
|
+
requirement: *id006
|
108
|
+
name: phocus
|
109
|
+
prerelease: false
|
126
110
|
type: :development
|
127
|
-
version_requirements: *id007
|
128
111
|
description: Sensible options parsing
|
129
112
|
email:
|
130
113
|
- joshbuddy@gmail.com
|