main 2.8.0 → 2.8.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/gemspec.rb +2 -2
- data/lib/main.rb +4 -4
- data/lib/main/base.rb +39 -39
- data/lib/main/parameter.rb +42 -36
- data/lib/main/softspoken.rb +1 -1
- data/lib/main/stdext.rb +3 -3
- data/lib/main/usage.rb +4 -4
- data/main-2.8.1.gem +0 -0
- data/samples/g.rb +10 -0
- data/test/main.rb +3 -3
- metadata +60 -53
- data/a.rb +0 -7
- data/test/main.rb.bak +0 -767
data/gemspec.rb
CHANGED
@@ -21,11 +21,10 @@ Gem::Specification::new do |spec|
|
|
21
21
|
spec.executables = shiteless[Dir::glob("bin/*")].map{|exe| File::basename exe}
|
22
22
|
|
23
23
|
spec.require_path = "lib"
|
24
|
-
spec.autorequire = lib
|
25
24
|
|
26
25
|
spec.has_rdoc = File::exist? "doc"
|
27
26
|
spec.test_suite_file = "test/#{ lib }.rb" if File::directory? "test"
|
28
|
-
spec.add_dependency '
|
27
|
+
spec.add_dependency 'fattr', '>= 1.0.3'
|
29
28
|
spec.add_dependency 'arrayfields', '>= 4.5.0'
|
30
29
|
|
31
30
|
spec.extensions << "extconf.rb" if File::exists? "extconf.rb"
|
@@ -33,4 +32,5 @@ Gem::Specification::new do |spec|
|
|
33
32
|
spec.author = "Ara T. Howard"
|
34
33
|
spec.email = "ara.t.howard@gmail.com"
|
35
34
|
spec.homepage = "http://codeforpeople.com/lib/ruby/#{ lib }/"
|
35
|
+
spec.rubyforge_project = 'codeforpeople'
|
36
36
|
end
|
data/lib/main.rb
CHANGED
@@ -28,12 +28,12 @@ module Main
|
|
28
28
|
42
|
29
29
|
end
|
30
30
|
|
31
|
-
require '
|
31
|
+
require 'fattr'
|
32
32
|
begin
|
33
|
-
version =
|
34
|
-
raise unless version[%r/^
|
33
|
+
version = Fattr.version
|
34
|
+
raise unless version[%r/^1\./]
|
35
35
|
rescue
|
36
|
-
abort "main requires
|
36
|
+
abort "main requires fattrs >= 1.0.3 - gem install fattr"
|
37
37
|
end
|
38
38
|
|
39
39
|
require 'arrayfields'
|
data/lib/main/base.rb
CHANGED
@@ -49,9 +49,9 @@ module Main
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
52
|
-
def self.
|
52
|
+
def self.inheritable_fattr name, &block
|
53
53
|
block ||= lambda{}
|
54
|
-
|
54
|
+
fattr( name ){
|
55
55
|
catch :value do
|
56
56
|
if parent?
|
57
57
|
value = parent.send name
|
@@ -68,34 +68,34 @@ module Main
|
|
68
68
|
}
|
69
69
|
end
|
70
70
|
|
71
|
-
#
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
# override a few
|
71
|
+
# fattrs
|
72
|
+
fattr( 'name' ){ File.basename $0 }
|
73
|
+
fattr( 'synopsis' ){ Usage.default_synopsis(self) }
|
74
|
+
fattr( 'description' )
|
75
|
+
fattr( 'usage' ){ Usage.default_usage self }
|
76
|
+
fattr( 'modes' ){ Mode.list }
|
77
|
+
fattr( 'mode_definitions' ){ Array.new }
|
78
|
+
fattr( 'mode_name' ){ 'main' }
|
79
|
+
fattr( 'parent' ){ nil }
|
80
|
+
fattr( 'children' ){ Set.new }
|
81
|
+
|
82
|
+
fattr( 'program' ){ File.basename $0 }
|
83
|
+
fattr( 'author' )
|
84
|
+
fattr( 'version' )
|
85
|
+
fattr( 'stdin' ){ $stdin }
|
86
|
+
fattr( 'stdout' ){ $stdout }
|
87
|
+
fattr( 'stderr' ){ $stderr }
|
88
|
+
fattr( 'logger' ){ stderr }
|
89
|
+
fattr( 'logger_level' ){ Logger::INFO }
|
90
|
+
fattr( 'exit_status' ){ EXIT_SUCCESS }
|
91
|
+
fattr( 'exit_success' ){ EXIT_SUCCESS }
|
92
|
+
fattr( 'exit_failure' ){ EXIT_FAILURE }
|
93
|
+
fattr( 'exit_warn' ){ EXIT_WARN }
|
94
|
+
inheritable_fattr( 'parameters' ){ Parameter::List[] }
|
95
|
+
inheritable_fattr( 'can_has_hash' ){ Hash.new }
|
96
|
+
inheritable_fattr( 'mixin_table' ){ Hash.new }
|
97
|
+
|
98
|
+
# override a few fattrs
|
99
99
|
def mode_name=(value)
|
100
100
|
@mode_name = Mode.new value
|
101
101
|
end
|
@@ -263,20 +263,20 @@ module Main
|
|
263
263
|
end
|
264
264
|
extend DSL
|
265
265
|
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
266
|
+
fattr 'argv'
|
267
|
+
fattr 'env'
|
268
|
+
fattr 'params'
|
269
|
+
fattr 'logger'
|
270
|
+
fattr 'stdin'
|
271
|
+
fattr 'stdout'
|
272
|
+
fattr 'stderr'
|
273
273
|
|
274
274
|
%w(
|
275
275
|
program name synopsis description author version
|
276
276
|
exit_status exit_success exit_failure exit_warn
|
277
277
|
logger_level
|
278
278
|
usage
|
279
|
-
).each{|a|
|
279
|
+
).each{|a| fattr(a){ self.class.send a}}
|
280
280
|
|
281
281
|
%w( parameters param ).each do |dst|
|
282
282
|
alias_method "#{ dst }", "params"
|
@@ -438,7 +438,7 @@ module Main
|
|
438
438
|
def modes
|
439
439
|
self.class.modes
|
440
440
|
end
|
441
|
-
|
441
|
+
fattr 'mode'
|
442
442
|
|
443
443
|
def help! status = 0
|
444
444
|
print usage.to_s
|
data/lib/main/parameter.rb
CHANGED
@@ -2,7 +2,7 @@ module Main
|
|
2
2
|
class Parameter
|
3
3
|
class Error < StandardError
|
4
4
|
include Softspoken
|
5
|
-
|
5
|
+
fattr 'wrapped'
|
6
6
|
end
|
7
7
|
class Arity < Error; end
|
8
8
|
class NotGiven < Arity; end
|
@@ -54,25 +54,25 @@ module Main
|
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
57
|
+
fattr 'type'
|
58
|
+
fattr 'names'
|
59
|
+
fattr 'abbreviations'
|
60
|
+
fattr 'argument'
|
61
|
+
fattr 'given'
|
62
|
+
fattr 'cast'
|
63
|
+
fattr 'validate'
|
64
|
+
fattr 'description'
|
65
|
+
fattr 'synopsis'
|
66
|
+
fattr('values'){ [] }
|
67
|
+
fattr('defaults'){ [] }
|
68
|
+
fattr('examples'){ [] }
|
69
|
+
|
70
|
+
fattr 'arity' => 1
|
71
|
+
fattr 'required' => false
|
72
|
+
|
73
|
+
fattr 'error_handler_before'
|
74
|
+
fattr 'error_handler_instead'
|
75
|
+
fattr 'error_handler_after'
|
76
76
|
|
77
77
|
def initialize name, *names, &block
|
78
78
|
@names = Cast.list_of_string name, *names
|
@@ -248,9 +248,9 @@ puts
|
|
248
248
|
end
|
249
249
|
|
250
250
|
class Argument < Parameter
|
251
|
-
|
251
|
+
fattr 'required' => true
|
252
252
|
|
253
|
-
|
253
|
+
fattr 'synopsis' do
|
254
254
|
label = name
|
255
255
|
op = required ? "->" : "~>"
|
256
256
|
value = defaults.size > 0 ? "#{ name }=#{ defaults.join ',' }" : name
|
@@ -260,10 +260,10 @@ puts
|
|
260
260
|
end
|
261
261
|
|
262
262
|
class Option < Parameter
|
263
|
-
|
264
|
-
|
263
|
+
fattr 'required' => false
|
264
|
+
fattr 'arity' => 0
|
265
265
|
|
266
|
-
|
266
|
+
fattr 'synopsis' do
|
267
267
|
long, *short = names
|
268
268
|
value = cast || name
|
269
269
|
rhs = argument ? (argument == :required ? "=#{ name }" : "=[#{ name }]") : nil
|
@@ -280,10 +280,10 @@ puts
|
|
280
280
|
end
|
281
281
|
|
282
282
|
class Keyword < Parameter
|
283
|
-
|
284
|
-
|
283
|
+
fattr 'required' => false
|
284
|
+
fattr 'argument' => :required
|
285
285
|
|
286
|
-
|
286
|
+
fattr 'synopsis' do
|
287
287
|
label = "#{ name }=#{ name }"
|
288
288
|
op = required ? "->" : "~>"
|
289
289
|
value = defaults.size > 0 ? "#{ name }=#{ defaults.join ',' }" : name
|
@@ -293,9 +293,9 @@ puts
|
|
293
293
|
end
|
294
294
|
|
295
295
|
class Environment < Parameter
|
296
|
-
|
296
|
+
fattr 'argument' => :required
|
297
297
|
|
298
|
-
|
298
|
+
fattr 'synopsis' do
|
299
299
|
label = "env[#{ name }]=#{ name }"
|
300
300
|
op = required ? "->" : "~>"
|
301
301
|
value = defaults.size > 0 ? "#{ name }=#{ defaults.join ',' }" : name
|
@@ -523,21 +523,21 @@ puts
|
|
523
523
|
@param = param
|
524
524
|
end
|
525
525
|
|
526
|
-
def
|
526
|
+
def fattr a = nil, &block
|
527
527
|
name = param.name
|
528
528
|
a ||= name
|
529
|
-
b =
|
530
|
-
Main.current.module_eval{
|
529
|
+
b = fattr_block_for name, &block
|
530
|
+
Main.current.module_eval{ fattr *a, &b }
|
531
531
|
end
|
532
|
+
alias_method 'attribute', 'fattr'
|
532
533
|
|
533
|
-
def
|
534
|
-
#block ||= lambda{|param| param.arity == 1 ? param.value : param.values}
|
534
|
+
def fattr_block_for name, &block
|
535
535
|
block ||= lambda{|param| param.arity.abs <= 1 ? param.value : param.values }
|
536
536
|
lambda{ block.call self.param[name] }
|
537
537
|
end
|
538
538
|
|
539
539
|
def attr *a, &b
|
540
|
-
|
540
|
+
fattr *a, &b
|
541
541
|
end
|
542
542
|
|
543
543
|
def example *list
|
@@ -663,6 +663,12 @@ puts
|
|
663
663
|
self.fields = []
|
664
664
|
extend BoundsCheck
|
665
665
|
end
|
666
|
+
|
667
|
+
def to_options
|
668
|
+
(hash = self.to_hash ).keys.each { |key| hash[key] = hash[key].value }
|
669
|
+
return hash
|
670
|
+
end
|
671
|
+
|
666
672
|
module BoundsCheck
|
667
673
|
def [] *a, &b
|
668
674
|
p = super
|
data/lib/main/softspoken.rb
CHANGED
data/lib/main/stdext.rb
CHANGED
@@ -13,7 +13,7 @@ module SaneAbort
|
|
13
13
|
def abort message = nil
|
14
14
|
if message
|
15
15
|
message = message.to_s
|
16
|
-
message.singleton_class{
|
16
|
+
message.singleton_class{ fattr 'abort' => true }
|
17
17
|
STDERR.puts message
|
18
18
|
end
|
19
19
|
exit 1
|
@@ -23,7 +23,7 @@ end
|
|
23
23
|
def abort message = nil
|
24
24
|
if message
|
25
25
|
message = message.to_s
|
26
|
-
message.singleton_class{
|
26
|
+
message.singleton_class{ fattr 'abort' => true }
|
27
27
|
STDERR.puts message
|
28
28
|
end
|
29
29
|
exit 1
|
@@ -31,7 +31,7 @@ end
|
|
31
31
|
def Process.abort message = nil
|
32
32
|
if message
|
33
33
|
message = message.to_s
|
34
|
-
message.singleton_class{
|
34
|
+
message.singleton_class{ fattr 'abort' => true }
|
35
35
|
STDERR.puts message
|
36
36
|
end
|
37
37
|
exit 1
|
data/lib/main/usage.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Main
|
2
2
|
class Usage < ::Array
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
fattr 'chunkname'
|
4
|
+
fattr 'upcase'
|
5
|
+
fattr 'eos'
|
6
6
|
|
7
7
|
def initialize opts={}
|
8
8
|
self.fields=[]
|
@@ -182,7 +182,7 @@ module Main
|
|
182
182
|
alias_method "default", "default_usage"
|
183
183
|
end
|
184
184
|
|
185
|
-
|
185
|
+
fattr "main"
|
186
186
|
|
187
187
|
def set_defaults!
|
188
188
|
usage = self
|
data/main-2.8.1.gem
ADDED
File without changes
|
data/samples/g.rb
ADDED
data/test/main.rb
CHANGED
metadata
CHANGED
@@ -1,35 +1,44 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.4
|
3
|
-
specification_version: 1
|
4
2
|
name: main
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 2.8.
|
7
|
-
date: 2007-12-23 00:00:00 -07:00
|
8
|
-
summary: main
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: ara.t.howard@gmail.com
|
12
|
-
homepage: http://codeforpeople.com/lib/ruby/main/
|
13
|
-
rubyforge_project:
|
14
|
-
description:
|
15
|
-
autorequire: main
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: false
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 2.8.1
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
7
|
- Ara T. Howard
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-07-11 00:00:00 -06:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: fattr
|
17
|
+
version_requirement:
|
18
|
+
version_requirements: !ruby/object:Gem::Requirement
|
19
|
+
requirements:
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.0.3
|
23
|
+
version:
|
24
|
+
- !ruby/object:Gem::Dependency
|
25
|
+
name: arrayfields
|
26
|
+
version_requirement:
|
27
|
+
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
version: 4.5.0
|
32
|
+
version:
|
33
|
+
description:
|
34
|
+
email: ara.t.howard@gmail.com
|
35
|
+
executables: []
|
36
|
+
|
37
|
+
extensions: []
|
38
|
+
|
39
|
+
extra_rdoc_files: []
|
40
|
+
|
31
41
|
files:
|
32
|
-
- a.rb
|
33
42
|
- gemspec.rb
|
34
43
|
- gen_readme.rb
|
35
44
|
- install.rb
|
@@ -47,6 +56,7 @@ files:
|
|
47
56
|
- lib/main/usage.rb
|
48
57
|
- lib/main/util.rb
|
49
58
|
- lib/main.rb
|
59
|
+
- main-2.8.1.gem
|
50
60
|
- README
|
51
61
|
- samples
|
52
62
|
- samples/a.rb
|
@@ -55,38 +65,35 @@ files:
|
|
55
65
|
- samples/d.rb
|
56
66
|
- samples/e.rb
|
57
67
|
- samples/f.rb
|
68
|
+
- samples/g.rb
|
58
69
|
- test
|
59
70
|
- test/main.rb
|
60
|
-
- test/main.rb.bak
|
61
71
|
- TODO
|
62
|
-
|
63
|
-
|
72
|
+
has_rdoc: false
|
73
|
+
homepage: http://codeforpeople.com/lib/ruby/main/
|
74
|
+
post_install_message:
|
64
75
|
rdoc_options: []
|
65
76
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
77
|
+
require_paths:
|
78
|
+
- lib
|
79
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: "0"
|
84
|
+
version:
|
85
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: "0"
|
90
|
+
version:
|
72
91
|
requirements: []
|
73
92
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 5.0.0
|
83
|
-
version:
|
84
|
-
- !ruby/object:Gem::Dependency
|
85
|
-
name: arrayfields
|
86
|
-
version_requirement:
|
87
|
-
version_requirements: !ruby/object:Gem::Version::Requirement
|
88
|
-
requirements:
|
89
|
-
- - ">="
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version: 4.5.0
|
92
|
-
version:
|
93
|
+
rubyforge_project: codeforpeople
|
94
|
+
rubygems_version: 1.0.1
|
95
|
+
signing_key:
|
96
|
+
specification_version: 2
|
97
|
+
summary: main
|
98
|
+
test_files:
|
99
|
+
- test/main.rb
|
data/a.rb
DELETED
data/test/main.rb.bak
DELETED
@@ -1,767 +0,0 @@
|
|
1
|
-
$:.unshift '.'
|
2
|
-
$:.unshift './lib'
|
3
|
-
$:.unshift '..'
|
4
|
-
$:.unshift '../lib'
|
5
|
-
|
6
|
-
require 'stringio'
|
7
|
-
require 'test/unit'
|
8
|
-
require 'main'
|
9
|
-
|
10
|
-
class T < Test::Unit::TestCase
|
11
|
-
attribute 'status'
|
12
|
-
attribute 'logger'
|
13
|
-
attribute 'error'
|
14
|
-
|
15
|
-
def setup
|
16
|
-
@status = nil
|
17
|
-
@logger = Logger.new StringIO.new
|
18
|
-
@error = nil
|
19
|
-
end
|
20
|
-
|
21
|
-
def teardown
|
22
|
-
end
|
23
|
-
|
24
|
-
def main argv=[], env={}, &b
|
25
|
-
at_exit{ exit! }
|
26
|
-
|
27
|
-
$VERBOSE=nil
|
28
|
-
ARGV.replace argv
|
29
|
-
ENV.clear
|
30
|
-
env.each{|k,v| ENV[k.to_s]=v.to_s}
|
31
|
-
|
32
|
-
this = self
|
33
|
-
|
34
|
-
klass = ::Main.create do
|
35
|
-
module_eval &b if b
|
36
|
-
|
37
|
-
define_method :handle_exception do |e|
|
38
|
-
if e.respond_to? :status
|
39
|
-
this.status = e.status
|
40
|
-
else
|
41
|
-
raise
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
define_method :handle_throw do |*a|
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
main = klass.new argv, env
|
50
|
-
|
51
|
-
main.logger = @logger
|
52
|
-
|
53
|
-
begin
|
54
|
-
main.run
|
55
|
-
ensure
|
56
|
-
this.status ||= main.exit_status
|
57
|
-
end
|
58
|
-
|
59
|
-
main
|
60
|
-
end
|
61
|
-
|
62
|
-
#
|
63
|
-
# basic test
|
64
|
-
#
|
65
|
-
def test_0000
|
66
|
-
assert_nothing_raised{
|
67
|
-
main{
|
68
|
-
def run() end
|
69
|
-
}
|
70
|
-
}
|
71
|
-
end
|
72
|
-
def test_0010
|
73
|
-
x = nil
|
74
|
-
assert_nothing_raised{
|
75
|
-
main{
|
76
|
-
define_method(:run){ x = 42 }
|
77
|
-
}
|
78
|
-
}
|
79
|
-
assert x == 42
|
80
|
-
end
|
81
|
-
#
|
82
|
-
# exit status
|
83
|
-
#
|
84
|
-
def test_0020
|
85
|
-
assert_nothing_raised{
|
86
|
-
main{
|
87
|
-
def run() end
|
88
|
-
}
|
89
|
-
}
|
90
|
-
assert status == 0
|
91
|
-
end
|
92
|
-
def test_0030
|
93
|
-
assert_nothing_raised{
|
94
|
-
main{
|
95
|
-
def run() exit 42 end
|
96
|
-
}
|
97
|
-
}
|
98
|
-
assert status == 42
|
99
|
-
end
|
100
|
-
def test_0040
|
101
|
-
assert_nothing_raised{
|
102
|
-
fork{
|
103
|
-
main{
|
104
|
-
def run() exit! 42 end
|
105
|
-
}
|
106
|
-
}
|
107
|
-
Process.wait
|
108
|
-
assert $?.exitstatus == 42
|
109
|
-
}
|
110
|
-
end
|
111
|
-
def test_0050
|
112
|
-
assert_nothing_raised{
|
113
|
-
main{
|
114
|
-
def run() exit 42 end
|
115
|
-
}
|
116
|
-
}
|
117
|
-
assert status == 42
|
118
|
-
end
|
119
|
-
def test_0060
|
120
|
-
assert_nothing_raised{
|
121
|
-
main{
|
122
|
-
def run() raise ArgumentError end
|
123
|
-
}
|
124
|
-
}
|
125
|
-
assert status == 1
|
126
|
-
end
|
127
|
-
def test_0060
|
128
|
-
assert_raises(RuntimeError){
|
129
|
-
main{
|
130
|
-
def run() exit_status 42; raise end
|
131
|
-
}
|
132
|
-
}
|
133
|
-
assert status == 42
|
134
|
-
end
|
135
|
-
def test_0070
|
136
|
-
assert_raises(ArgumentError){
|
137
|
-
main{
|
138
|
-
def run() exit_status 42; raise ArgumentError end
|
139
|
-
}
|
140
|
-
}
|
141
|
-
assert status == 42
|
142
|
-
end
|
143
|
-
#
|
144
|
-
# parameter parsing
|
145
|
-
#
|
146
|
-
def test_0080
|
147
|
-
p = nil
|
148
|
-
assert_raises(Main::Parameter::NotGiven){
|
149
|
-
main(){
|
150
|
-
argument 'foo'
|
151
|
-
define_method('run'){ }
|
152
|
-
}
|
153
|
-
}
|
154
|
-
end
|
155
|
-
def test_0090
|
156
|
-
p = nil
|
157
|
-
m = nil
|
158
|
-
argv = %w[ 42 ]
|
159
|
-
given = nil
|
160
|
-
assert_nothing_raised{
|
161
|
-
main(argv.dup){
|
162
|
-
argument 'foo'
|
163
|
-
define_method('run'){ m = self; p = param['foo'] }
|
164
|
-
}
|
165
|
-
}
|
166
|
-
assert p.value == argv.first
|
167
|
-
assert p.values == argv
|
168
|
-
assert p.given?
|
169
|
-
assert m.argv.empty?
|
170
|
-
end
|
171
|
-
def test_0100
|
172
|
-
p = nil
|
173
|
-
argv = %w[]
|
174
|
-
given = nil
|
175
|
-
assert_nothing_raised{
|
176
|
-
main(argv){
|
177
|
-
p = argument('foo'){ optional }
|
178
|
-
define_method('run'){ p = param['foo'] }
|
179
|
-
}
|
180
|
-
}
|
181
|
-
assert p.optional?
|
182
|
-
assert !p.required?
|
183
|
-
assert p.value == nil
|
184
|
-
assert p.values == []
|
185
|
-
assert !p.given?
|
186
|
-
end
|
187
|
-
def test_0101
|
188
|
-
p = nil
|
189
|
-
argv = %w[]
|
190
|
-
given = nil
|
191
|
-
assert_nothing_raised{
|
192
|
-
main(argv){
|
193
|
-
p = argument('foo'){ required false }
|
194
|
-
define_method('run'){ p = param['foo'] }
|
195
|
-
}
|
196
|
-
}
|
197
|
-
assert p.optional?
|
198
|
-
assert !p.required?
|
199
|
-
assert p.value == nil
|
200
|
-
assert p.values == []
|
201
|
-
assert !p.given?
|
202
|
-
end
|
203
|
-
def test_0110
|
204
|
-
p = nil
|
205
|
-
argv = %w[ --foo ]
|
206
|
-
assert_nothing_raised{
|
207
|
-
main(argv){
|
208
|
-
option('foo'){ required }
|
209
|
-
define_method('run'){ p = param['foo'] }
|
210
|
-
}
|
211
|
-
}
|
212
|
-
assert p.value == true
|
213
|
-
assert p.values ==[true]
|
214
|
-
assert p.given?
|
215
|
-
end
|
216
|
-
def test_0120
|
217
|
-
p = nil
|
218
|
-
argv = []
|
219
|
-
assert_nothing_raised{
|
220
|
-
main(argv){
|
221
|
-
option 'foo'
|
222
|
-
define_method('run'){ p = param['foo'] }
|
223
|
-
}
|
224
|
-
}
|
225
|
-
assert p.value == nil
|
226
|
-
assert p.values == []
|
227
|
-
assert !p.given?
|
228
|
-
end
|
229
|
-
def test_0130
|
230
|
-
p = nil
|
231
|
-
assert_nothing_raised{
|
232
|
-
main(%w[--foo=42]){
|
233
|
-
option('foo'){ required; argument_required }
|
234
|
-
define_method('run'){ p = param['foo']}
|
235
|
-
}
|
236
|
-
}
|
237
|
-
assert p.required?
|
238
|
-
assert p.argument_required?
|
239
|
-
assert !p.optional?
|
240
|
-
end
|
241
|
-
def test_0131
|
242
|
-
assert_raises(Main::Parameter::NotGiven){
|
243
|
-
main(){
|
244
|
-
option('foo'){ required; argument_required }
|
245
|
-
define_method('run'){}
|
246
|
-
}
|
247
|
-
}
|
248
|
-
end
|
249
|
-
def test_0140
|
250
|
-
assert_raises(Main::Parameter::MissingArgument){
|
251
|
-
main(['--foo']){
|
252
|
-
option('foo'){ required; argument_required }
|
253
|
-
define_method('run'){}
|
254
|
-
}
|
255
|
-
}
|
256
|
-
end
|
257
|
-
def test_0150
|
258
|
-
param = nil
|
259
|
-
assert_nothing_raised{
|
260
|
-
main(%w[--foo=42 --bar=42.0 --foobar=true --barfoo=false --uri=http://foo --x=s]){
|
261
|
-
option('foo'){
|
262
|
-
required
|
263
|
-
argument_required
|
264
|
-
cast :int
|
265
|
-
}
|
266
|
-
option('bar'){
|
267
|
-
argument_required
|
268
|
-
cast :float
|
269
|
-
}
|
270
|
-
option('foobar'){
|
271
|
-
argument_required
|
272
|
-
cast :bool
|
273
|
-
}
|
274
|
-
option('barfoo'){
|
275
|
-
argument_required
|
276
|
-
cast :string
|
277
|
-
}
|
278
|
-
option('uri'){
|
279
|
-
argument_required
|
280
|
-
cast :uri
|
281
|
-
}
|
282
|
-
option('x'){
|
283
|
-
argument_required
|
284
|
-
cast{|x| x.to_s.upcase}
|
285
|
-
}
|
286
|
-
define_method('run'){ param = params }
|
287
|
-
}
|
288
|
-
}
|
289
|
-
assert param['foo'].value == 42
|
290
|
-
assert param['bar'].value == 42.0
|
291
|
-
assert param['foobar'].value == true
|
292
|
-
assert param['barfoo'].value == 'false'
|
293
|
-
assert param['uri'].value == URI.parse('http://foo')
|
294
|
-
assert param['x'].value == 'S'
|
295
|
-
end
|
296
|
-
def test_0160
|
297
|
-
p = nil
|
298
|
-
assert_nothing_raised{
|
299
|
-
main(%w[--foo=42]){
|
300
|
-
option('foo'){
|
301
|
-
required
|
302
|
-
argument_required
|
303
|
-
cast :int
|
304
|
-
validate{|x| x == 42}
|
305
|
-
}
|
306
|
-
define_method('run'){ p = param['foo']}
|
307
|
-
}
|
308
|
-
}
|
309
|
-
assert p.value == 42
|
310
|
-
assert p.required?
|
311
|
-
assert p.argument_required?
|
312
|
-
assert !p.optional?
|
313
|
-
end
|
314
|
-
def test_0170
|
315
|
-
assert_raises(Main::Parameter::InValid){
|
316
|
-
main(%w[--foo=40]){
|
317
|
-
option('foo'){
|
318
|
-
required
|
319
|
-
argument_required
|
320
|
-
cast :int
|
321
|
-
validate{|x| x == 42}
|
322
|
-
}
|
323
|
-
define_method('run'){ }
|
324
|
-
}
|
325
|
-
}
|
326
|
-
end
|
327
|
-
def test_0180
|
328
|
-
assert_nothing_raised{
|
329
|
-
main(%w[--foo=42]){
|
330
|
-
option('--foo=foo'){
|
331
|
-
required
|
332
|
-
# argument_required
|
333
|
-
cast :int
|
334
|
-
validate{|x| x == 42}
|
335
|
-
}
|
336
|
-
define_method('run'){ }
|
337
|
-
}
|
338
|
-
}
|
339
|
-
end
|
340
|
-
def test_0190
|
341
|
-
assert_raises(Main::Parameter::MissingArgument){
|
342
|
-
main(%w[--foo]){
|
343
|
-
option('--foo=foo'){ }
|
344
|
-
define_method('run'){ }
|
345
|
-
}
|
346
|
-
}
|
347
|
-
end
|
348
|
-
def test_0200
|
349
|
-
p = nil
|
350
|
-
assert_nothing_raised{
|
351
|
-
main(%w[--foo]){
|
352
|
-
option('--foo=[foo]'){ }
|
353
|
-
define_method('run'){ p = param['foo'] }
|
354
|
-
}
|
355
|
-
}
|
356
|
-
assert p.value == true
|
357
|
-
end
|
358
|
-
def test_0210
|
359
|
-
p = nil
|
360
|
-
assert_nothing_raised{
|
361
|
-
main(%w[--foo=42]){
|
362
|
-
option('--foo=[foo]'){
|
363
|
-
cast :int
|
364
|
-
validate{|x| x == 42}
|
365
|
-
}
|
366
|
-
define_method('run'){ p = param['foo'] }
|
367
|
-
}
|
368
|
-
}
|
369
|
-
assert p.value == 42
|
370
|
-
end
|
371
|
-
def test_0220
|
372
|
-
p = nil
|
373
|
-
assert_nothing_raised{
|
374
|
-
main(%w[--foo=40 --foo=2]){
|
375
|
-
option('--foo=foo'){
|
376
|
-
arity 2
|
377
|
-
cast :int
|
378
|
-
validate{|x| x == 40 or x == 2}
|
379
|
-
}
|
380
|
-
define_method('run'){ p = param['foo'] }
|
381
|
-
}
|
382
|
-
}
|
383
|
-
assert p.value == 40
|
384
|
-
assert p.values == [40,2]
|
385
|
-
end
|
386
|
-
def test_0230
|
387
|
-
p = nil
|
388
|
-
assert_nothing_raised{
|
389
|
-
main(%w[foo=42]){
|
390
|
-
keyword('foo'){
|
391
|
-
cast :int
|
392
|
-
validate{|x| x == 42}
|
393
|
-
}
|
394
|
-
define_method('run'){ p = param['foo'] }
|
395
|
-
}
|
396
|
-
}
|
397
|
-
assert p.value == 42
|
398
|
-
end
|
399
|
-
def test_0240
|
400
|
-
foo = nil
|
401
|
-
bar = nil
|
402
|
-
assert_nothing_raised{
|
403
|
-
main(%w[foo= bar]){
|
404
|
-
keyword 'foo'
|
405
|
-
keyword 'bar'
|
406
|
-
define_method('run'){
|
407
|
-
foo = param['foo']
|
408
|
-
bar = param['bar']
|
409
|
-
}
|
410
|
-
}
|
411
|
-
}
|
412
|
-
assert foo.value == ''
|
413
|
-
assert bar.value == nil
|
414
|
-
end
|
415
|
-
def test_0250
|
416
|
-
foo = nil
|
417
|
-
bar = nil
|
418
|
-
assert_nothing_raised{
|
419
|
-
main(%w[foo=40 bar=2]){
|
420
|
-
keyword('foo'){
|
421
|
-
cast :int
|
422
|
-
}
|
423
|
-
keyword('bar'){
|
424
|
-
cast :int
|
425
|
-
}
|
426
|
-
define_method('run'){
|
427
|
-
foo = param['foo']
|
428
|
-
bar = param['bar']
|
429
|
-
}
|
430
|
-
}
|
431
|
-
}
|
432
|
-
assert foo.value == 40
|
433
|
-
assert bar.value == 2
|
434
|
-
end
|
435
|
-
def test_0260
|
436
|
-
foo = nil
|
437
|
-
bar = nil
|
438
|
-
foobar = nil
|
439
|
-
assert_nothing_raised{
|
440
|
-
main(%w[foo=40 --bar=2 foobar foo=42]){
|
441
|
-
kw('foo'){ cast :int; arity 2 }
|
442
|
-
opt('bar='){ cast :int }
|
443
|
-
arg 'foobar'
|
444
|
-
|
445
|
-
define_method('run'){
|
446
|
-
foo = param['foo']
|
447
|
-
bar = param['bar']
|
448
|
-
foobar = param['foobar']
|
449
|
-
}
|
450
|
-
}
|
451
|
-
}
|
452
|
-
assert foo.value == 40
|
453
|
-
assert foo.values == [40, 42]
|
454
|
-
assert bar.value == 2
|
455
|
-
assert foobar.value == 'foobar'
|
456
|
-
end
|
457
|
-
def test_0270
|
458
|
-
foo = nil
|
459
|
-
assert_nothing_raised{
|
460
|
-
main([], 'foo' => '42'){
|
461
|
-
env('foo'){ cast :int }
|
462
|
-
define_method('run'){
|
463
|
-
foo = param['foo']
|
464
|
-
}
|
465
|
-
}
|
466
|
-
}
|
467
|
-
assert foo.value == 42
|
468
|
-
end
|
469
|
-
#
|
470
|
-
# usage
|
471
|
-
#
|
472
|
-
def test_0280
|
473
|
-
assert_nothing_raised{
|
474
|
-
u = Main::Usage.new
|
475
|
-
}
|
476
|
-
end
|
477
|
-
def test_0290
|
478
|
-
assert_nothing_raised{
|
479
|
-
u = Main::Usage.default Main.create
|
480
|
-
}
|
481
|
-
end
|
482
|
-
def test_0300
|
483
|
-
assert_nothing_raised{
|
484
|
-
chunk = <<-txt
|
485
|
-
a
|
486
|
-
b
|
487
|
-
c
|
488
|
-
txt
|
489
|
-
assert Main::Util.unindent(chunk) == "a\nb\nc"
|
490
|
-
chunk = <<-txt
|
491
|
-
a
|
492
|
-
b
|
493
|
-
c
|
494
|
-
txt
|
495
|
-
assert Main::Util.unindent(chunk) == "a\n b\n c"
|
496
|
-
}
|
497
|
-
end
|
498
|
-
def test_0310
|
499
|
-
assert_nothing_raised{
|
500
|
-
u = Main::Usage.new
|
501
|
-
u[:name] = 'foobar'
|
502
|
-
assert u[:name] = 'foobar'
|
503
|
-
assert u['name'] = 'foobar'
|
504
|
-
}
|
505
|
-
end
|
506
|
-
def test_0320
|
507
|
-
assert_nothing_raised{
|
508
|
-
u = Main::Usage.new
|
509
|
-
u[:name] = 'foobar'
|
510
|
-
assert u[:name] == 'foobar'
|
511
|
-
assert u['name'] == 'foobar'
|
512
|
-
u[:name2] = 'barfoo'
|
513
|
-
assert u[:name] == 'foobar'
|
514
|
-
assert u['name'] == 'foobar'
|
515
|
-
assert u[:name2] == 'barfoo'
|
516
|
-
assert u['name2'] == 'barfoo'
|
517
|
-
u.delete_at :name
|
518
|
-
assert u[:name] == nil
|
519
|
-
assert u['name'] == nil
|
520
|
-
assert u[:name2] == 'barfoo'
|
521
|
-
assert u['name2'] == 'barfoo'
|
522
|
-
u.delete_at :name2
|
523
|
-
assert u[:name] == nil
|
524
|
-
assert u['name'] == nil
|
525
|
-
assert u[:name2] == nil
|
526
|
-
assert u['name2'] == nil
|
527
|
-
}
|
528
|
-
end
|
529
|
-
#
|
530
|
-
# io redirection
|
531
|
-
#
|
532
|
-
class ::Object
|
533
|
-
require 'tempfile'
|
534
|
-
def infile buf
|
535
|
-
t = Tempfile.new rand.to_s
|
536
|
-
t << buf
|
537
|
-
t.close
|
538
|
-
open t.path, 'r+'
|
539
|
-
end
|
540
|
-
def outfile
|
541
|
-
t = Tempfile.new rand.to_s
|
542
|
-
t.close
|
543
|
-
open t.path, 'w+'
|
544
|
-
end
|
545
|
-
end
|
546
|
-
def test_0330
|
547
|
-
s = "foo\nbar\n"
|
548
|
-
sio = StringIO.new s
|
549
|
-
$buf = nil
|
550
|
-
assert_nothing_raised{
|
551
|
-
main{
|
552
|
-
stdin sio
|
553
|
-
def run
|
554
|
-
$buf = STDIN.read
|
555
|
-
end
|
556
|
-
}
|
557
|
-
}
|
558
|
-
assert $buf == s
|
559
|
-
end
|
560
|
-
def test_0340
|
561
|
-
s = "foo\nbar\n"
|
562
|
-
$sio = StringIO.new s
|
563
|
-
$buf = nil
|
564
|
-
assert_nothing_raised{
|
565
|
-
main{
|
566
|
-
def run
|
567
|
-
self.stdin = $sio
|
568
|
-
$buf = STDIN.read
|
569
|
-
end
|
570
|
-
}
|
571
|
-
}
|
572
|
-
assert $buf == s
|
573
|
-
end
|
574
|
-
def test_0350
|
575
|
-
s = "foo\nbar\n"
|
576
|
-
$buf = nil
|
577
|
-
assert_nothing_raised{
|
578
|
-
main{
|
579
|
-
stdin infile(s)
|
580
|
-
def run
|
581
|
-
$buf = STDIN.read
|
582
|
-
end
|
583
|
-
}
|
584
|
-
}
|
585
|
-
assert $buf == s
|
586
|
-
end
|
587
|
-
def test_0360
|
588
|
-
sout = outfile
|
589
|
-
assert_nothing_raised{
|
590
|
-
main{
|
591
|
-
stdout sout
|
592
|
-
def run
|
593
|
-
puts 42
|
594
|
-
end
|
595
|
-
}
|
596
|
-
}
|
597
|
-
assert test(?e, sout.path)
|
598
|
-
assert IO.read(sout.path) == "42\n"
|
599
|
-
end
|
600
|
-
def test_0370
|
601
|
-
m = nil
|
602
|
-
assert_nothing_raised{
|
603
|
-
m = main{
|
604
|
-
stdout StringIO.new
|
605
|
-
def run
|
606
|
-
puts 42
|
607
|
-
end
|
608
|
-
}
|
609
|
-
}
|
610
|
-
assert m
|
611
|
-
assert_nothing_raised{ m.stdout.rewind }
|
612
|
-
assert m.stdout.read == "42\n"
|
613
|
-
end
|
614
|
-
#
|
615
|
-
# main ctor
|
616
|
-
#
|
617
|
-
def test_0380
|
618
|
-
argv = %w( a b c )
|
619
|
-
$argv = nil
|
620
|
-
assert_nothing_raised{
|
621
|
-
main(argv){
|
622
|
-
def run
|
623
|
-
$argv = @argv
|
624
|
-
end
|
625
|
-
}
|
626
|
-
}
|
627
|
-
assert argv == $argv
|
628
|
-
end
|
629
|
-
def test_0390
|
630
|
-
argv = %w( a b c )
|
631
|
-
env = {'key' => 'val', 'foo' => 'bar'}
|
632
|
-
$argv = nil
|
633
|
-
$env = nil
|
634
|
-
assert_nothing_raised{
|
635
|
-
main(argv, env){
|
636
|
-
def run
|
637
|
-
$argv = @argv
|
638
|
-
$env = @env
|
639
|
-
end
|
640
|
-
}
|
641
|
-
}
|
642
|
-
assert argv == $argv
|
643
|
-
end
|
644
|
-
|
645
|
-
#
|
646
|
-
# negative/globbing arity
|
647
|
-
#
|
648
|
-
def test_4000
|
649
|
-
m = nil
|
650
|
-
argv = %w( a b c )
|
651
|
-
assert_nothing_raised{
|
652
|
-
main(argv.dup) {
|
653
|
-
argument('zero_or_more'){ optional; arity -1 }
|
654
|
-
run{ m = self }
|
655
|
-
}
|
656
|
-
}
|
657
|
-
assert m.param['zero_or_more'].values == argv
|
658
|
-
end
|
659
|
-
def test_4010
|
660
|
-
m = nil
|
661
|
-
argv = %w( a b c )
|
662
|
-
assert_nothing_raised{
|
663
|
-
main(argv.dup) {
|
664
|
-
argument('zero_or_more'){ optional; arity '*' }
|
665
|
-
run{ m = self }
|
666
|
-
}
|
667
|
-
}
|
668
|
-
assert m.param['zero_or_more'].values == argv
|
669
|
-
end
|
670
|
-
def test_4020
|
671
|
-
m = nil
|
672
|
-
argv = %w( a b c )
|
673
|
-
assert_nothing_raised{
|
674
|
-
main(argv.dup) {
|
675
|
-
argument('one_or_more'){ arity -2 }
|
676
|
-
run{ m = self }
|
677
|
-
}
|
678
|
-
}
|
679
|
-
assert m.param['one_or_more'].values == argv
|
680
|
-
end
|
681
|
-
def test_4030
|
682
|
-
m = nil
|
683
|
-
argv = %w( a b c )
|
684
|
-
assert_nothing_raised{
|
685
|
-
main(argv.dup) {
|
686
|
-
argument('two_or_more'){ arity -3 }
|
687
|
-
run{ m = self }
|
688
|
-
}
|
689
|
-
}
|
690
|
-
assert m.param['two_or_more'].values == argv
|
691
|
-
end
|
692
|
-
def test_4040
|
693
|
-
m = nil
|
694
|
-
argv = %w()
|
695
|
-
assert_nothing_raised{
|
696
|
-
main(argv.dup) {
|
697
|
-
argument('zero_or_more'){ optional; arity -1 }
|
698
|
-
run{ m = self }
|
699
|
-
}
|
700
|
-
}
|
701
|
-
assert m.param['zero_or_more'].values == argv
|
702
|
-
end
|
703
|
-
def test_4050
|
704
|
-
m = nil
|
705
|
-
argv = %w()
|
706
|
-
assert_raises(Main::Parameter::NotGiven){
|
707
|
-
main(argv.dup) {
|
708
|
-
argument('one_or_more'){ arity -2 }
|
709
|
-
run{ m = self }
|
710
|
-
}
|
711
|
-
}
|
712
|
-
end
|
713
|
-
def test_4060
|
714
|
-
m = nil
|
715
|
-
argv = %w( a )
|
716
|
-
assert_raises(Main::Parameter::Arity){
|
717
|
-
main(argv.dup) {
|
718
|
-
argument('two_or_more'){ arity -3 }
|
719
|
-
run{ m = self }
|
720
|
-
}
|
721
|
-
}
|
722
|
-
end
|
723
|
-
def test_4070
|
724
|
-
m = nil
|
725
|
-
argv = %w( a )
|
726
|
-
assert_raises(Main::Parameter::Arity){
|
727
|
-
main(argv.dup) {
|
728
|
-
argument('two_or_more'){ arity -4 }
|
729
|
-
run{ m = self }
|
730
|
-
}
|
731
|
-
}
|
732
|
-
end
|
733
|
-
#
|
734
|
-
# sub-command/mode functionality
|
735
|
-
#
|
736
|
-
def test_4080
|
737
|
-
m = nil
|
738
|
-
argv = %w( a b )
|
739
|
-
assert_nothing_raised{
|
740
|
-
main(argv.dup) {
|
741
|
-
mode 'a' do
|
742
|
-
argument 'b'
|
743
|
-
run{ m = self }
|
744
|
-
end
|
745
|
-
}
|
746
|
-
}
|
747
|
-
assert m.param['b'].value == 'b'
|
748
|
-
end
|
749
|
-
def test_4090
|
750
|
-
m = nil
|
751
|
-
argv = %w( a b c )
|
752
|
-
assert_nothing_raised{
|
753
|
-
main(argv.dup) {
|
754
|
-
mode 'a' do
|
755
|
-
mode 'b' do
|
756
|
-
argument 'c'
|
757
|
-
run{ m = self }
|
758
|
-
end
|
759
|
-
end
|
760
|
-
}
|
761
|
-
}
|
762
|
-
assert m.param['c'].value == 'c'
|
763
|
-
end
|
764
|
-
|
765
|
-
end
|
766
|
-
|
767
|
-
|