main 2.9.3 → 3.0.1
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/README +27 -11
- data/README.erb +5 -3
- data/Rakefile +3 -2
- data/TODO +1 -1
- data/a.rb +5 -0
- data/lib/main.rb +2 -15
- data/lib/main/dsl.rb +77 -0
- data/lib/main/factories.rb +17 -11
- data/lib/main/mode.rb +4 -2
- data/lib/main/parameter.rb +16 -13
- data/lib/main/program.rb +6 -0
- data/lib/main/program/class_methods.rb +260 -0
- data/lib/main/program/instance_methods.rb +253 -0
- data/lib/main/stdext.rb +18 -20
- data/main.gemspec +5 -4
- data/samples/e.rb +15 -6
- data/samples/f.rb +2 -0
- data/test/main.rb +78 -54
- metadata +29 -6
- data/lib/main/base.rb +0 -517
@@ -0,0 +1,253 @@
|
|
1
|
+
module Main
|
2
|
+
class Program
|
3
|
+
module InstanceMethods
|
4
|
+
# instance methods
|
5
|
+
#
|
6
|
+
fattr('main'){ self.class }
|
7
|
+
fattr('argv'){ main.argv }
|
8
|
+
fattr('env'){ main.env }
|
9
|
+
fattr('opts'){ main.opts }
|
10
|
+
fattr('stdin'){ main.stdin }
|
11
|
+
fattr('stdout'){ main.stdout }
|
12
|
+
fattr('stderr'){ main.stderr }
|
13
|
+
fattr('logger'){ main.logger }
|
14
|
+
fattr('params')
|
15
|
+
|
16
|
+
%w(
|
17
|
+
program name synopsis description author version
|
18
|
+
exit_status exit_success exit_failure exit_warn
|
19
|
+
logger_level
|
20
|
+
usage
|
21
|
+
).each{|a| fattr(a){ self.class.send a}}
|
22
|
+
|
23
|
+
alias_method 'status', 'exit_status'
|
24
|
+
alias_method 'status=', 'exit_status='
|
25
|
+
|
26
|
+
%w( parameters param ).each do |dst|
|
27
|
+
alias_method "#{ dst }", "params"
|
28
|
+
alias_method "#{ dst }=", "params="
|
29
|
+
alias_method "#{ dst }?", "params?"
|
30
|
+
end
|
31
|
+
|
32
|
+
%w( debug info warn fatal error ).each do |m|
|
33
|
+
module_eval <<-code
|
34
|
+
def #{ m } *a, &b
|
35
|
+
logger.#{ m } *a, &b
|
36
|
+
end
|
37
|
+
code
|
38
|
+
end
|
39
|
+
|
40
|
+
def pre_initialize() :hook end
|
41
|
+
def before_initialize() :hook end
|
42
|
+
def main_initialize()
|
43
|
+
setup_finalizers
|
44
|
+
setup_io_restoration
|
45
|
+
setup_io_redirection
|
46
|
+
setup_logging
|
47
|
+
end
|
48
|
+
def initialize() :hook end
|
49
|
+
def after_initialize() :hook end
|
50
|
+
def post_initialize() :hook end
|
51
|
+
|
52
|
+
def setup_finalizers
|
53
|
+
@finalizers = finalizers = []
|
54
|
+
ObjectSpace.define_finalizer(self) do
|
55
|
+
while((f = finalizers.pop)); f.call; end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def finalize
|
60
|
+
while((f = @finalizers.pop)); f.call; end
|
61
|
+
end
|
62
|
+
|
63
|
+
def setup_io_redirection
|
64
|
+
self.stdin = opts['stdin'] || opts[:stdin] || stdin
|
65
|
+
self.stdout = opts['stdout'] || opts[:stdout] || stdout
|
66
|
+
self.stderr = opts['stderr'] || opts[:stderr] || stderr
|
67
|
+
end
|
68
|
+
|
69
|
+
def setup_logging
|
70
|
+
log = self.class.logger || stderr
|
71
|
+
self.logger = log
|
72
|
+
end
|
73
|
+
undef_method 'logger='
|
74
|
+
def logger= log
|
75
|
+
unless(defined?(@logger) and @logger == log)
|
76
|
+
case log
|
77
|
+
when ::Logger, Logger
|
78
|
+
@logger = log
|
79
|
+
when IO, StringIO
|
80
|
+
@logger = Logger.new log
|
81
|
+
@logger.level = logger_level
|
82
|
+
else
|
83
|
+
@logger = Logger.new(*log)
|
84
|
+
@logger.level = logger_level
|
85
|
+
end
|
86
|
+
end
|
87
|
+
@logger
|
88
|
+
end
|
89
|
+
|
90
|
+
def setup_io_restoration
|
91
|
+
[STDIN, STDOUT, STDERR].each do |io|
|
92
|
+
dup = io.dup and @finalizers.push lambda{ io.reopen dup rescue nil }
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
undef_method 'stdin='
|
97
|
+
def stdin= io
|
98
|
+
unless(defined?(@stdin) and (@stdin == io))
|
99
|
+
@stdin =
|
100
|
+
if io.respond_to? 'read'
|
101
|
+
io
|
102
|
+
else
|
103
|
+
fd = open io.to_s, 'r+'
|
104
|
+
@finalizers.push lambda{ fd.close }
|
105
|
+
fd
|
106
|
+
end
|
107
|
+
begin
|
108
|
+
STDIN.reopen @stdin
|
109
|
+
rescue
|
110
|
+
$stdin = @stdin
|
111
|
+
::Object.const_set 'STDIN', @stdin
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
undef_method 'stdout='
|
117
|
+
def stdout= io
|
118
|
+
unless(defined?(@stdout) and (@stdout == io))
|
119
|
+
@stdout =
|
120
|
+
if io.respond_to? 'write'
|
121
|
+
io
|
122
|
+
else
|
123
|
+
fd = open io.to_s, 'w+'
|
124
|
+
@finalizers.push lambda{ fd.close }
|
125
|
+
fd
|
126
|
+
end
|
127
|
+
STDOUT.reopen @stdout rescue($stdout = @stdout)
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
undef_method 'stderr='
|
132
|
+
def stderr= io
|
133
|
+
unless(defined?(@stderr) and (@stderr == io))
|
134
|
+
@stderr =
|
135
|
+
if io.respond_to? 'write'
|
136
|
+
io
|
137
|
+
else
|
138
|
+
fd = open io.to_s, 'w+'
|
139
|
+
@finalizers.push lambda{ fd.close }
|
140
|
+
fd
|
141
|
+
end
|
142
|
+
STDERR.reopen @stderr rescue($stderr = @stderr)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def pre_parse_parameters() :hook end
|
147
|
+
def before_parse_parameters() :hook end
|
148
|
+
def parse_parameters
|
149
|
+
pre_parse_parameters
|
150
|
+
before_parse_parameters
|
151
|
+
|
152
|
+
self.class.parameters.parse(self)
|
153
|
+
@params = Parameter::Table.new
|
154
|
+
self.class.parameters.each{|p| @params[p.name.to_s] = p}
|
155
|
+
|
156
|
+
after_parse_parameters
|
157
|
+
post_parse_parameters
|
158
|
+
end
|
159
|
+
def after_parse_parameters() :hook end
|
160
|
+
def post_parse_parameters() :hook end
|
161
|
+
|
162
|
+
def pre_run() :hook end
|
163
|
+
def before_run() :hook end
|
164
|
+
def run
|
165
|
+
raise NotImplementedError, 'run not defined'
|
166
|
+
end
|
167
|
+
def after_run() :hook end
|
168
|
+
def post_run() :hook end
|
169
|
+
|
170
|
+
fattr 'mode'
|
171
|
+
def modes
|
172
|
+
self.class.modes
|
173
|
+
end
|
174
|
+
|
175
|
+
def help!(status = 0)
|
176
|
+
print usage.to_s
|
177
|
+
exit(status)
|
178
|
+
end
|
179
|
+
|
180
|
+
def help?
|
181
|
+
(params['help'] and params['help'].given?) or argv.first == 'help'
|
182
|
+
end
|
183
|
+
|
184
|
+
def abort(message = 'exit')
|
185
|
+
raise SystemExit.new(message)
|
186
|
+
end
|
187
|
+
|
188
|
+
def handle_exception(e)
|
189
|
+
if e.respond_to?(:error_handler_before)
|
190
|
+
fcall(e, :error_handler_before, self)
|
191
|
+
end
|
192
|
+
|
193
|
+
if e.respond_to?(:error_handler_instead)
|
194
|
+
fcall(e, :error_handler_instead, self)
|
195
|
+
else
|
196
|
+
if e.respond_to?(:status)
|
197
|
+
exit_status(( e.status ))
|
198
|
+
end
|
199
|
+
|
200
|
+
if Softspoken === e or SystemExit === e
|
201
|
+
quiet = ((SystemExit === e and e.message.respond_to?('abort')) or # see main/stdext.rb
|
202
|
+
(SystemExit === e and e.message == 'exit'))
|
203
|
+
stderr.puts e.message unless quiet
|
204
|
+
else
|
205
|
+
fatal{ e }
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
if e.respond_to?(:error_handler_after)
|
210
|
+
fcall(e, :error_handler_after, self)
|
211
|
+
end
|
212
|
+
|
213
|
+
exit_status(( exit_failure )) if exit_status == exit_success
|
214
|
+
exit_status(( Integer(exit_status) rescue(exit_status ? 0 : 1) ))
|
215
|
+
end
|
216
|
+
|
217
|
+
def handle_exit(status)
|
218
|
+
exit(( Integer(status) rescue 1 ))
|
219
|
+
end
|
220
|
+
|
221
|
+
def fcall(object, method, *argv, &block)
|
222
|
+
method = object.method(method)
|
223
|
+
arity = m.arity
|
224
|
+
if arity >= 0
|
225
|
+
argv = argv[0, arity]
|
226
|
+
else
|
227
|
+
arity = arity.abs - 1
|
228
|
+
argv = argv[0, arity] + argv[arity .. -1]
|
229
|
+
end
|
230
|
+
method.call(*argv, &block)
|
231
|
+
end
|
232
|
+
|
233
|
+
%w[ before instead after ].each do |which|
|
234
|
+
module_eval <<-code
|
235
|
+
def error_handler_#{ which } *argv, &block
|
236
|
+
block.call *argv
|
237
|
+
end
|
238
|
+
code
|
239
|
+
end
|
240
|
+
|
241
|
+
def instance_eval_block(*argv, &block)
|
242
|
+
singleton_class =
|
243
|
+
class << self
|
244
|
+
self
|
245
|
+
end
|
246
|
+
singleton_class.module_eval{ define_method('__instance_eval_block', &block) }
|
247
|
+
fcall(self, '__instance_eval_block', *argv, &block)
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
include InstanceMethods
|
252
|
+
end
|
253
|
+
end
|
data/lib/main/stdext.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
class Object
|
2
|
-
def singleton_class
|
3
|
-
|
2
|
+
def singleton_class(object = self, &block)
|
3
|
+
singleton_class =
|
4
4
|
class << object
|
5
5
|
self
|
6
6
|
end
|
7
|
-
block ?
|
7
|
+
block ? singleton_class.module_eval(&block) : singleton_class
|
8
8
|
end
|
9
|
-
|
10
9
|
end
|
11
10
|
|
12
|
-
module
|
13
|
-
|
11
|
+
module Kernel
|
12
|
+
private
|
13
|
+
undef_method 'abort'
|
14
|
+
def abort(message = nil)
|
14
15
|
if message
|
15
16
|
message = message.to_s
|
16
17
|
message.singleton_class{ fattr 'abort' => true }
|
@@ -20,19 +21,16 @@ module SaneAbort
|
|
20
21
|
end
|
21
22
|
end
|
22
23
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
message = message.to_s
|
34
|
-
message.singleton_class{ fattr 'abort' => true }
|
35
|
-
STDERR.puts message
|
24
|
+
module Process
|
25
|
+
class << Process
|
26
|
+
undef_method 'abort'
|
27
|
+
def abort(message = nil)
|
28
|
+
if message
|
29
|
+
message = message.to_s
|
30
|
+
message.singleton_class{ fattr 'abort' => true }
|
31
|
+
STDERR.puts message
|
32
|
+
end
|
33
|
+
exit 1
|
36
34
|
end
|
37
|
-
exit 1
|
38
35
|
end
|
36
|
+
end
|
data/main.gemspec
CHANGED
@@ -3,11 +3,12 @@
|
|
3
3
|
|
4
4
|
Gem::Specification::new do |spec|
|
5
5
|
spec.name = "main"
|
6
|
-
spec.
|
6
|
+
spec.description = 'a class factory and dsl for generating command line programs real quick'
|
7
|
+
spec.version = "3.0.1"
|
7
8
|
spec.platform = Gem::Platform::RUBY
|
8
9
|
spec.summary = "main"
|
9
10
|
|
10
|
-
spec.files = ["lib", "lib/main", "lib/main/
|
11
|
+
spec.files = ["a.rb", "lib", "lib/main", "lib/main/cast.rb", "lib/main/dsl.rb", "lib/main/factories.rb", "lib/main/getoptlong.rb", "lib/main/logger.rb", "lib/main/mode.rb", "lib/main/parameter.rb", "lib/main/program", "lib/main/program/class_methods.rb", "lib/main/program/instance_methods.rb", "lib/main/program.rb", "lib/main/softspoken.rb", "lib/main/stdext.rb", "lib/main/usage.rb", "lib/main/util.rb", "lib/main.rb", "main.gemspec", "Rakefile", "README", "README.erb", "samples", "samples/a.rb", "samples/b.rb", "samples/c.rb", "samples/d.rb", "samples/e.rb", "samples/f.rb", "samples/g.rb", "samples/h.rb", "test", "test/main.rb", "TODO"]
|
11
12
|
spec.executables = []
|
12
13
|
|
13
14
|
|
@@ -16,8 +17,8 @@ Gem::Specification::new do |spec|
|
|
16
17
|
|
17
18
|
spec.has_rdoc = true
|
18
19
|
spec.test_files = "test/main.rb"
|
19
|
-
|
20
|
-
|
20
|
+
spec.add_dependency 'fattr', '>= 1.0.3'
|
21
|
+
spec.add_dependency 'arrayfields', '>= 4.5.0'
|
21
22
|
|
22
23
|
spec.extensions.push(*[])
|
23
24
|
|
data/samples/e.rb
CHANGED
@@ -1,18 +1,27 @@
|
|
1
1
|
require 'main'
|
2
2
|
|
3
|
+
ARGV.replace %w( x y argument )
|
4
|
+
|
3
5
|
Main {
|
4
|
-
argument '
|
5
|
-
option '
|
6
|
+
argument 'argument'
|
7
|
+
option 'option'
|
6
8
|
|
7
|
-
def run() puts '
|
9
|
+
def run() puts 'run' end
|
8
10
|
|
9
11
|
mode 'a' do
|
10
12
|
option 'a-option'
|
13
|
+
def run() puts 'a-run' end
|
11
14
|
end
|
12
15
|
|
13
|
-
mode '
|
14
|
-
option '
|
16
|
+
mode 'x' do
|
17
|
+
option 'x-option'
|
18
|
+
|
19
|
+
def run() puts 'x-run' end
|
20
|
+
|
21
|
+
mode 'y' do
|
22
|
+
option 'y-option'
|
15
23
|
|
16
|
-
|
24
|
+
def run() puts 'y-run' end
|
25
|
+
end
|
17
26
|
end
|
18
27
|
}
|
data/samples/f.rb
CHANGED
data/test/main.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
$:.unshift
|
2
|
-
$:.unshift
|
3
|
-
$:.unshift
|
4
|
-
$:.unshift
|
1
|
+
$:.unshift('.')
|
2
|
+
$:.unshift('./lib')
|
3
|
+
$:.unshift('..')
|
4
|
+
$:.unshift('../lib')
|
5
5
|
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
6
|
+
require('stringio')
|
7
|
+
require('test/unit')
|
8
|
+
require('main')
|
9
9
|
|
10
10
|
|
11
11
|
class T < Test::Unit::TestCase
|
@@ -22,7 +22,7 @@ class T < Test::Unit::TestCase
|
|
22
22
|
def teardown
|
23
23
|
end
|
24
24
|
|
25
|
-
def main
|
25
|
+
def main(argv=[], env={}, &block)
|
26
26
|
at_exit{ exit! }
|
27
27
|
|
28
28
|
$VERBOSE=nil
|
@@ -30,32 +30,33 @@ class T < Test::Unit::TestCase
|
|
30
30
|
ENV.clear
|
31
31
|
env.each{|k,v| ENV[k.to_s]=v.to_s}
|
32
32
|
|
33
|
-
|
33
|
+
test = self
|
34
34
|
|
35
|
-
|
36
|
-
module_eval &b if b
|
35
|
+
factory = Main.factory(&block)
|
37
36
|
|
38
|
-
|
39
|
-
|
40
|
-
|
37
|
+
program = factory.build(argv, env)
|
38
|
+
|
39
|
+
main = program.new
|
40
|
+
|
41
|
+
program.evaluate do
|
42
|
+
define_method :handle_exception do |exception|
|
43
|
+
if exception.respond_to?(:status)
|
44
|
+
test.status = main.status = exception.status
|
41
45
|
else
|
42
|
-
|
46
|
+
test.status = main.status
|
47
|
+
raise(exception)
|
43
48
|
end
|
44
49
|
end
|
45
|
-
|
46
|
-
|
50
|
+
define_method :handle_exit do |status|
|
51
|
+
test.status = main.status = status
|
47
52
|
end
|
48
53
|
end
|
49
54
|
|
50
|
-
main =
|
55
|
+
main.logger = logger
|
51
56
|
|
52
|
-
main.
|
57
|
+
main.run
|
53
58
|
|
54
|
-
|
55
|
-
main.run
|
56
|
-
ensure
|
57
|
-
this.status ||= main.exit_status
|
58
|
-
end
|
59
|
+
test.status ||= main.exit_status
|
59
60
|
|
60
61
|
main
|
61
62
|
end
|
@@ -77,7 +78,7 @@ class T < Test::Unit::TestCase
|
|
77
78
|
define_method(:run){ x = 42 }
|
78
79
|
}
|
79
80
|
}
|
80
|
-
|
81
|
+
assert_equal 42, x
|
81
82
|
end
|
82
83
|
|
83
84
|
# exit status
|
@@ -88,7 +89,7 @@ class T < Test::Unit::TestCase
|
|
88
89
|
def run() end
|
89
90
|
}
|
90
91
|
}
|
91
|
-
|
92
|
+
assert_equal 0, status
|
92
93
|
end
|
93
94
|
def test_0030
|
94
95
|
assert_nothing_raised{
|
@@ -96,7 +97,7 @@ class T < Test::Unit::TestCase
|
|
96
97
|
def run() exit 42 end
|
97
98
|
}
|
98
99
|
}
|
99
|
-
|
100
|
+
assert_equal 42, status
|
100
101
|
end
|
101
102
|
def test_0040
|
102
103
|
assert_nothing_raised{
|
@@ -106,7 +107,7 @@ class T < Test::Unit::TestCase
|
|
106
107
|
}
|
107
108
|
}
|
108
109
|
Process.wait
|
109
|
-
|
110
|
+
assert_equal 42, $?.exitstatus
|
110
111
|
}
|
111
112
|
end
|
112
113
|
def test_0050
|
@@ -115,15 +116,7 @@ class T < Test::Unit::TestCase
|
|
115
116
|
def run() exit 42 end
|
116
117
|
}
|
117
118
|
}
|
118
|
-
|
119
|
-
end
|
120
|
-
def test_0060
|
121
|
-
assert_nothing_raised{
|
122
|
-
main{
|
123
|
-
def run() raise ArgumentError end
|
124
|
-
}
|
125
|
-
}
|
126
|
-
assert status == 1
|
119
|
+
assert_equal 42, status
|
127
120
|
end
|
128
121
|
def test_0060
|
129
122
|
assert_raises(RuntimeError){
|
@@ -131,7 +124,7 @@ class T < Test::Unit::TestCase
|
|
131
124
|
def run() exit_status 42; raise end
|
132
125
|
}
|
133
126
|
}
|
134
|
-
|
127
|
+
assert_equal 42, status
|
135
128
|
end
|
136
129
|
def test_0070
|
137
130
|
assert_raises(ArgumentError){
|
@@ -139,7 +132,7 @@ class T < Test::Unit::TestCase
|
|
139
132
|
def run() exit_status 42; raise ArgumentError end
|
140
133
|
}
|
141
134
|
}
|
142
|
-
|
135
|
+
assert_equal 42, status
|
143
136
|
end
|
144
137
|
|
145
138
|
# parameter parsing
|
@@ -439,9 +432,9 @@ class T < Test::Unit::TestCase
|
|
439
432
|
foobar = nil
|
440
433
|
assert_nothing_raised{
|
441
434
|
main(%w[foo=40 --bar=2 foobar foo=42]){
|
442
|
-
|
443
|
-
|
444
|
-
|
435
|
+
keyword('foo'){ cast :int; arity 2 }
|
436
|
+
option('bar='){ cast :int }
|
437
|
+
argument 'foobar'
|
445
438
|
|
446
439
|
define_method('run'){
|
447
440
|
foo = param['foo']
|
@@ -459,7 +452,7 @@ class T < Test::Unit::TestCase
|
|
459
452
|
foo = nil
|
460
453
|
assert_nothing_raised{
|
461
454
|
main([], 'foo' => '42'){
|
462
|
-
|
455
|
+
environment('foo'){ cast :int }
|
463
456
|
define_method('run'){
|
464
457
|
foo = param['foo']
|
465
458
|
}
|
@@ -488,7 +481,7 @@ class T < Test::Unit::TestCase
|
|
488
481
|
end
|
489
482
|
def test_0290
|
490
483
|
assert_nothing_raised{
|
491
|
-
u = Main::Usage.default
|
484
|
+
u = Main::Usage.default(Main.factory)
|
492
485
|
}
|
493
486
|
end
|
494
487
|
def test_0300
|
@@ -662,7 +655,7 @@ class T < Test::Unit::TestCase
|
|
662
655
|
argv = %w( a b c )
|
663
656
|
assert_nothing_raised{
|
664
657
|
main(argv.dup) {
|
665
|
-
argument('zero_or_more'){ arity
|
658
|
+
argument('zero_or_more'){ arity(-1) }
|
666
659
|
run{ m = self }
|
667
660
|
}
|
668
661
|
}
|
@@ -673,7 +666,7 @@ class T < Test::Unit::TestCase
|
|
673
666
|
argv = %w( a b c )
|
674
667
|
assert_nothing_raised{
|
675
668
|
main(argv.dup) {
|
676
|
-
argument('zero_or_more'){ arity
|
669
|
+
argument('zero_or_more'){ arity(-1) }
|
677
670
|
run{ m = self }
|
678
671
|
}
|
679
672
|
}
|
@@ -684,7 +677,7 @@ class T < Test::Unit::TestCase
|
|
684
677
|
argv = %w( a b c )
|
685
678
|
assert_nothing_raised{
|
686
679
|
main(argv.dup) {
|
687
|
-
argument('zero_or_more'){ arity
|
680
|
+
argument('zero_or_more'){ arity('*') }
|
688
681
|
run{ m = self }
|
689
682
|
}
|
690
683
|
}
|
@@ -695,7 +688,7 @@ class T < Test::Unit::TestCase
|
|
695
688
|
argv = %w( a b c )
|
696
689
|
assert_nothing_raised{
|
697
690
|
main(argv.dup) {
|
698
|
-
argument('one_or_more'){ arity
|
691
|
+
argument('one_or_more'){ arity(-2) }
|
699
692
|
run{ m = self }
|
700
693
|
}
|
701
694
|
}
|
@@ -706,7 +699,7 @@ class T < Test::Unit::TestCase
|
|
706
699
|
argv = %w( a b c )
|
707
700
|
assert_nothing_raised{
|
708
701
|
main(argv.dup) {
|
709
|
-
argument('two_or_more'){ arity
|
702
|
+
argument('two_or_more'){ arity(-3) }
|
710
703
|
run{ m = self }
|
711
704
|
}
|
712
705
|
}
|
@@ -717,7 +710,7 @@ class T < Test::Unit::TestCase
|
|
717
710
|
argv = %w()
|
718
711
|
assert_nothing_raised{
|
719
712
|
main(argv.dup) {
|
720
|
-
argument('zero_or_more'){ arity
|
713
|
+
argument('zero_or_more'){ arity(-1) }
|
721
714
|
run{ m = self }
|
722
715
|
}
|
723
716
|
}
|
@@ -728,7 +721,7 @@ class T < Test::Unit::TestCase
|
|
728
721
|
argv = %w()
|
729
722
|
assert_raises(Main::Parameter::NotGiven){
|
730
723
|
main(argv.dup) {
|
731
|
-
argument('one_or_more'){ arity
|
724
|
+
argument('one_or_more'){ arity(-2) }
|
732
725
|
run{ m = self }
|
733
726
|
}
|
734
727
|
}
|
@@ -738,7 +731,7 @@ class T < Test::Unit::TestCase
|
|
738
731
|
argv = %w( a )
|
739
732
|
assert_raises(Main::Parameter::Arity){
|
740
733
|
main(argv.dup) {
|
741
|
-
argument('two_or_more'){ arity
|
734
|
+
argument('two_or_more'){ arity(-3) }
|
742
735
|
run{ m = self }
|
743
736
|
}
|
744
737
|
}
|
@@ -748,7 +741,7 @@ class T < Test::Unit::TestCase
|
|
748
741
|
argv = %w( a )
|
749
742
|
assert_raises(Main::Parameter::Arity){
|
750
743
|
main(argv.dup) {
|
751
|
-
argument('two_or_more'){ arity
|
744
|
+
argument('two_or_more'){ arity(-4) }
|
752
745
|
run{ m = self }
|
753
746
|
}
|
754
747
|
}
|
@@ -767,6 +760,7 @@ class T < Test::Unit::TestCase
|
|
767
760
|
end
|
768
761
|
}
|
769
762
|
}
|
763
|
+
assert m, 'm.nil!'
|
770
764
|
assert m.param['b'].value == 'b'
|
771
765
|
end
|
772
766
|
def test_0490
|
@@ -782,8 +776,38 @@ class T < Test::Unit::TestCase
|
|
782
776
|
end
|
783
777
|
}
|
784
778
|
}
|
779
|
+
assert m, 'm.nil!'
|
785
780
|
assert m.param['c'].value == 'c'
|
786
781
|
end
|
782
|
+
def test_0491
|
783
|
+
m = nil
|
784
|
+
argv = %w(a b c)
|
785
|
+
count = Hash.new{|h,k| h[k] = 0}
|
786
|
+
assert_nothing_raised{
|
787
|
+
main(argv.dup) {
|
788
|
+
%w(
|
789
|
+
initialize
|
790
|
+
pre_initialize
|
791
|
+
before_initialize
|
792
|
+
post_initialize
|
793
|
+
after_initialize
|
794
|
+
).each do |method|
|
795
|
+
define_method(method){ count[method] += 1 }
|
796
|
+
end
|
797
|
+
mode 'a' do
|
798
|
+
mode 'b' do
|
799
|
+
mode 'c' do
|
800
|
+
run{ m = self }
|
801
|
+
end
|
802
|
+
end
|
803
|
+
end
|
804
|
+
}
|
805
|
+
}
|
806
|
+
assert m, 'm.nil!'
|
807
|
+
count.each do |key, val|
|
808
|
+
assert val==1, key
|
809
|
+
end
|
810
|
+
end
|
787
811
|
|
788
812
|
|
789
813
|
# parameter attr/fattr/attribute
|
@@ -832,7 +856,7 @@ class T < Test::Unit::TestCase
|
|
832
856
|
argvs.each do |argv|
|
833
857
|
assert_nothing_raised{
|
834
858
|
main(argv.dup) {
|
835
|
-
argument(name){ arity
|
859
|
+
argument(name){ arity(-1); attr }
|
836
860
|
run{ m = send(name) }
|
837
861
|
}
|
838
862
|
}
|