ame 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,106 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ Expectations do
4
+ expect Enumerable do Ame::Arguments.new end
5
+
6
+ expect 0 do
7
+ Ame::Arguments.new.arity
8
+ end
9
+ expect 1 do
10
+ Ame::Arguments.new.argument(:a, 'd').arity
11
+ end
12
+ expect(-1) do
13
+ Ame::Arguments.new.argument(:a, 'd', :optional => true).arity
14
+ end
15
+ expect 2 do
16
+ Ame::Arguments.new.argument(:a, 'd').argument(:b, 'd').arity
17
+ end
18
+ expect(-2) do
19
+ Ame::Arguments.new.argument(:a, 'd').
20
+ argument(:b, 'd', :optional => true).arity
21
+ end
22
+ expect(-3) do
23
+ Ame::Arguments.new.argument(:a, 'd').
24
+ argument(:b, 'd').
25
+ argument(:c, 'd', :optional => true).arity
26
+ end
27
+ expect(-4) do
28
+ Ame::Arguments.new.argument(:a, 'd').
29
+ argument(:b, 'd').
30
+ splat(:c, 'd').arity
31
+ end
32
+ expect(-3) do
33
+ Ame::Arguments.new.argument(:a, 'd').
34
+ argument(:b, 'd').
35
+ splat(:c, 'd', :optional => true).arity
36
+ end
37
+ expect(-3) do
38
+ Ame::Arguments.new.argument(:a, 'd').
39
+ argument(:b, 'd').
40
+ argument(:c, 'd', :optional => true).
41
+ argument(:d, 'd', :optional => true).arity
42
+ end
43
+ expect(-3) do
44
+ Ame::Arguments.new.argument(:a, 'd').splat(:b, 'd').arity
45
+ end
46
+
47
+ expect ArgumentError.new('argument b must come before splat argument a') do
48
+ Ame::Arguments.new.splat(:a, 'd').argument(:b, 'd')
49
+ end
50
+
51
+ expect ArgumentError.new('optional argument a may not precede required argument b') do
52
+ Ame::Arguments.new.argument(:a, 'd', :optional => true).argument(:b, 'd')
53
+ end
54
+
55
+ expect ArgumentError.new('splat argument a already defined: b') do
56
+ Ame::Arguments.new.splat(:a, 'd').splat(:b, 'd')
57
+ end
58
+
59
+ expect ArgumentError.new('optional argument a may not precede required splat argument b') do
60
+ Ame::Arguments.new.argument(:a, 'd', :optional => true).splat(:b, 'd')
61
+ end
62
+
63
+ expect Ame::MissingArgument do
64
+ Ame::Arguments.new.argument(:a, 'd').process({}, [])
65
+ end
66
+
67
+ expect [] do
68
+ Ame::Arguments.new.process({}, [])
69
+ end
70
+
71
+ expect [1] do
72
+ Ame::Arguments.new.argument(:a, 'd', :type => Integer).process({}, %w[1])
73
+ end
74
+
75
+ expect [1, TrueClass] do
76
+ Ame::Arguments.new.argument(:a, 'd', :type => Integer).
77
+ argument(:b, 'd', :type => FalseClass).
78
+ process({}, %w[1 true])
79
+ end
80
+
81
+ expect Ame::MissingArgument do
82
+ Ame::Arguments.new.argument(:a, 'd', :type => Integer).
83
+ splat(:b, 'd').
84
+ process({}, %w[1])
85
+ end
86
+
87
+ expect [1, []] do
88
+ Ame::Arguments.new.argument(:a, 'd', :type => Integer).
89
+ splat(:b, 'd', :optional => true).
90
+ process({}, %w[1])
91
+ end
92
+
93
+ expect [1, [2, 3]] do
94
+ Ame::Arguments.new.argument(:a, 'd', :type => Integer).
95
+ splat(:b, 'd', :type => Integer).
96
+ process({}, %w[1 2 3])
97
+ end
98
+
99
+ expect Ame::Splat do
100
+ Ame::Arguments.new.splat(:a, 'd').splat
101
+ end
102
+
103
+ expect Ame::SuperfluousArgument do
104
+ Ame::Arguments.new.process({}, %w[1])
105
+ end
106
+ end
@@ -0,0 +1,163 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ Expectations do
4
+ expect output(%{Usage: help-console-test-1 [OPTIONS]... ARG1 ARG2 ARGN...
5
+ Method description
6
+
7
+ Arguments:
8
+ ARG1 Argument 1
9
+ ARG2 Argument 2
10
+ ARGN... Argument N
11
+
12
+ Options:
13
+ -a, --abc=ABC Abc description
14
+ --help Display help for this method
15
+ -v V description
16
+ --version Display version information
17
+ -x=LEVEL X description
18
+ }) do |io|
19
+ Class.new(Ame::Root) {
20
+ help Ame::Help::Console.new(io, false)
21
+
22
+ description 'Method description'
23
+ option :abc, 'Abc description', :aliases => :a, :type => String
24
+ option :v, 'V description'
25
+ option :x, 'X description', :type => String, :argument => 'level'
26
+ argument :arg1, 'Argument 1'
27
+ argument :arg2, 'Argument 2'
28
+ splat :argN, 'Argument N'
29
+ def help_console_test_1() end
30
+ }.process('help-console-test-1', %w[--help])
31
+ end
32
+
33
+ expect output(%{Usage: dispatch [OPTIONS]... METHOD [ARGUMENTS]...
34
+ Dispatch description
35
+
36
+ Arguments:
37
+ METHOD Method to run
38
+ [ARGUMENTS]... Arguments to pass to METHOD
39
+
40
+ Options:
41
+ --help Display help for this method
42
+ --version Display version information
43
+
44
+ Methods:
45
+ method-1 Method 1 does a
46
+ method-2 Method 2 does b
47
+ }) do |io|
48
+ Class.new(Ame::Root) {
49
+ help Ame::Help::Console.new(io, false)
50
+
51
+ dispatch Class.new(Ame::Class) {
52
+ basename 'dispatch'
53
+
54
+ description 'Dispatch description'
55
+ def initialize() end
56
+
57
+ description 'Method 1 does a'
58
+ def method_1() end
59
+
60
+ description 'Method 2 does b'
61
+ def method_2() end
62
+ }
63
+ }.process('dispatch', %w[--help])
64
+ end
65
+
66
+ expect output(%{Usage: dispatch-1 dispatch-2 [OPTIONS]... METHOD [ARGUMENTS]...
67
+ Dispatch 2 description
68
+
69
+ Arguments:
70
+ METHOD Method to run
71
+ [ARGUMENTS]... Arguments to pass to METHOD
72
+
73
+ Options:
74
+ --help Display help for this method
75
+
76
+ Methods:
77
+ method-1 Method 1 does a
78
+ method-2 Method 2 does b
79
+ }) do |io|
80
+ Class.new(Ame::Root) {
81
+ help Ame::Help::Console.new(io, false)
82
+
83
+ dispatch Class.new(Ame::Class) {
84
+ basename 'dispatch-1'
85
+
86
+ description 'Dispatch 1 description'
87
+ def initialize() end
88
+
89
+ dispatch Class.new(Ame::Class) {
90
+ basename 'dispatch-2'
91
+
92
+ description 'Dispatch 2 description'
93
+ def initialize() end
94
+
95
+ description 'Method 1 does a'
96
+ def method_1() end
97
+
98
+ description 'Method 2 does b'
99
+ def method_2() end
100
+ }
101
+ }
102
+ }.process('dispatch-1', %w[dispatch-2 --help])
103
+ end
104
+
105
+ expect output(%{Usage: dispatch [OPTIONS]... [METHOD] [ARGUMENTS]...
106
+ Dispatch description
107
+
108
+ Arguments:
109
+ [METHOD=method-1] Method to run
110
+ [ARGUMENTS]... Arguments to pass to METHOD
111
+
112
+ Options:
113
+ --help Display help for this method
114
+ --version Display version information
115
+
116
+ Methods:
117
+ method-1 Method 1 does a
118
+ method-2 Method 2 does b
119
+ }) do |io|
120
+ Class.new(Ame::Root) {
121
+ help Ame::Help::Console.new(io, false)
122
+
123
+ dispatch Class.new(Ame::Class) {
124
+ basename 'dispatch'
125
+
126
+ description 'Dispatch description'
127
+ def initialize() end
128
+
129
+ description 'Method 1 does a'
130
+ def method_1() end
131
+
132
+ description 'Method 2 does b'
133
+ def method_2() end
134
+ }, :default => 'method-1'
135
+ }.process('dispatch', %w[--help])
136
+ end
137
+
138
+ expect output(%{method 0.1.0\n}) do |io|
139
+ Class.new(Ame::Root) {
140
+ Version = '0.1.0'
141
+
142
+ help Ame::Help::Console.new(io)
143
+
144
+ description 'd'
145
+ def method() end
146
+ }.process 'method', %w[--version]
147
+ end
148
+
149
+ expect output("method: error message\n") do |io|
150
+ begin
151
+ Class.new(Ame::Root) {
152
+ help Ame::Help::Console.new(io, false)
153
+
154
+ description 'd'
155
+ def method()
156
+ raise 'error message'
157
+ end
158
+ }.process 'method', []
159
+ rescue RuntimeError => e
160
+ raise unless e.message == 'error message'
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,40 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ Expectations do
4
+ expect 'd' do Ame::Method.new(nil).description('d').description end
5
+
6
+ expect Ame::Method.new(nil).not.to.be.valid?
7
+
8
+ expect Ame::Method.new(nil).description('d').to.be.valid?
9
+
10
+ expect :name do Ame::Method.new(nil).description('d').define(:name).name end
11
+
12
+ expect mock.to.receive.method('b', 1, true, ['d', 'e', 'f'], {:a => true}).once do |o|
13
+ Ame::Method.new(o).
14
+ option(:a, 'd').
15
+ argument(:a, 'd').
16
+ argument(:b, 'd', :type => Integer).
17
+ argument(:c, 'd', :type => FalseClass).
18
+ splat(:d, 'd').
19
+ description('d').
20
+ define(:method).
21
+ process o, %w[b -a 1 on d e f]
22
+ end
23
+
24
+ expect mock.to.receive.method(1, false, [], {:a => 5}).once do |o|
25
+ Ame::Method.new(o).
26
+ option(:a, 'd', :default => 5).
27
+ argument(:b, 'd', :optional => true, :default => 1).
28
+ argument(:c, 'd', :optional => true, :default => false).
29
+ splat(:d, 'd', :optional => true).
30
+ description('d').
31
+ define(:method).
32
+ call o
33
+ end
34
+
35
+ expect Ame::Class.to.receive.help_for_method(Ame::Method) do |o|
36
+ catch Ame::AbortAllProcessing do
37
+ Ame::Method.new(o).description('d').define(:method).process o, %w[--help]
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,10 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ Expectations do
4
+ expect Enumerable do Ame::Methods.new end
5
+
6
+ expect Ame::Methods.new do |o| o << Ame::Method.new(nil) end
7
+
8
+ expect Ame::Method.new(nil) do |o| (Ame::Methods.new << o.define(:name))[:name] end
9
+ expect Ame::Method.new(nil) do |o| (Ame::Methods.new << o.define(:name))['name'] end
10
+ end
@@ -0,0 +1,75 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ Expectations do
4
+ expect Ame::Argument do
5
+ Ame::Option.new(:a, 'd')
6
+ end
7
+
8
+ expect ArgumentError do
9
+ Ame::Option.new(:a, 'd', :type => String, :optional => true)
10
+ end
11
+
12
+ expect Ame::Option.new(:a, 'd').to.be.optional?
13
+
14
+ expect Ame::Option.new(:a, 'd', :type => String).not.to.be.optional?
15
+
16
+ expect FalseClass do
17
+ Ame::Option.new(:a, 'd').default
18
+ end
19
+
20
+ expect TrueClass do
21
+ Ame::Option.new(:a, 'd').process({}, [], 'true')
22
+ end
23
+
24
+ expect FalseClass do
25
+ Ame::Option.new(:a, 'd').process({}, [], 'off')
26
+ end
27
+
28
+ expect 'string' do
29
+ Ame::Option.new(:a, 'd', :type => String).process({}, [], 'string')
30
+ end
31
+
32
+ expect 'a' do
33
+ Ame::Option.new(:a, 'd', :type => String).argument_name
34
+ end
35
+
36
+ expect 'b' do
37
+ Ame::Option.new(:a, 'd', :argument => 'b', :type => String).argument_name
38
+ end
39
+
40
+ expect ArgumentError do
41
+ Ame::Option.new(:a, 'd', :argument => 'a').argument_name
42
+ end
43
+
44
+ expect [:b] do
45
+ Ame::Option.new(:a, 'd', :aliases => :b).aliases
46
+ end
47
+
48
+ expect [:b, :c, :d] do
49
+ Ame::Option.new(:a, 'd', :aliases => [:b, :c, :d]).aliases
50
+ end
51
+
52
+ expect [:b, :c, :d] do
53
+ Ame::Option.new(:a, 'd', :alias => :b, :aliases => [:c, :d]).aliases
54
+ end
55
+
56
+ expect '-a' do
57
+ Ame::Option.new(:a, 'd').to_s
58
+ end
59
+
60
+ expect '--abc' do
61
+ Ame::Option.new(:abc, 'd').to_s
62
+ end
63
+
64
+ expect :a do
65
+ Ame::Option.new(:abc, 'd', :aliases => [:a, :b]).short
66
+ end
67
+
68
+ expect :abc do
69
+ Ame::Option.new(:a, 'd', :aliases => [:abc, :b]).long
70
+ end
71
+
72
+ expect Ame::Option.new(:a, 'd').not.to.be.ignored?
73
+
74
+ expect Ame::Option.new(:a, 'd', :ignore => true).to.be.ignored?
75
+ end
@@ -0,0 +1,136 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ Expectations do
4
+ expect Enumerable do
5
+ Ame::Options.new
6
+ end
7
+
8
+ expect [:a, :b] do
9
+ Ame::Options.new.option('a', 'd').option('b', 'd').map{ |o| o.name }
10
+ end
11
+
12
+ expect [:a, :b] do
13
+ Ame::Options.new.option(:a, 'd').option(:b, 'd').map{ |o| o.name }
14
+ end
15
+
16
+ expect ArgumentError do
17
+ Ame::Options.new.option(:a, 'd').option(:a, 'd')
18
+ end
19
+
20
+ expect Ame::Options.new.option(:a, 'd').to.include?('a')
21
+ expect Ame::Options.new.option(:a, 'd').to.include?(:a)
22
+
23
+ expect [{:a => 1, :b => 2}, []] do
24
+ Ame::Options.new.
25
+ option(:a, 'd', :default => 1).
26
+ option(:b, 'd', :default => 2).process([])
27
+ end
28
+
29
+ expect [{:a => 3, :b => 4}, []] do
30
+ Ame::Options.new.
31
+ option(:a, 'd', :default => 1).
32
+ option(:b, 'd', :default => 2).process(['-a=3', '-b=4'])
33
+ end
34
+
35
+ expect [{:a => 3, :b => 4}, []] do
36
+ Ame::Options.new.
37
+ option(:a, 'd', :default => 1).
38
+ option(:b, 'd', :default => 2).process(['-a', '3', '-b', '4'])
39
+ end
40
+
41
+ expect Ame::MalformedArgument do
42
+ Ame::Options.new.option(:a, 'd', :default => 1).process(['-a='])
43
+ end
44
+
45
+ expect Ame::MissingArgument do
46
+ Ame::Options.new.option(:a, 'd', :default => 1).process(['-a'])
47
+ end
48
+
49
+ expect Ame::UnrecognizedOption do
50
+ Ame::Options.new.option(:a, 'd', :default => 1).process(['-b'])
51
+ end
52
+
53
+ expect Ame::MalformedArgument do
54
+ Ame::Options.new.
55
+ option(:a, 'd', :default => 1).
56
+ option(:b, 'd').process(['-ab'])
57
+ end
58
+
59
+ expect Ame::MissingArgument do
60
+ Ame::Options.new.
61
+ option(:a, 'd').
62
+ option(:b, 'd', :default => 1).process(['-ab'])
63
+ end
64
+
65
+ expect [{:a => true, :b => 2}, []] do
66
+ Ame::Options.new.
67
+ option(:a, 'd').
68
+ option(:b, 'd', :default => 1).process(['-ab2'])
69
+ end
70
+
71
+ expect [{:a => true, :b => 2}, []] do
72
+ Ame::Options.new.
73
+ option(:a, 'd').
74
+ option(:b, 'd', :default => 1).process(['-ab', '2'])
75
+ end
76
+
77
+ expect [{:a => true, :b => true}, []] do
78
+ Ame::Options.new.
79
+ option(:a, 'd').
80
+ option(:b, 'd').process(['-ab'])
81
+ end
82
+
83
+ expect [{:a => true, :b => true}, []] do
84
+ Ame::Options.new.
85
+ option(:a, 'd').
86
+ option(:b, 'd').process(['-a', '-b'])
87
+ end
88
+
89
+ expect [{:a => true, :b => false}, ['-b']] do
90
+ Ame::Options.new.
91
+ option(:a, 'd').
92
+ option(:b, 'd').process(['-a', '--', '-b'])
93
+ end
94
+
95
+ expect [{:a => true, :b => true}, ['arg']] do
96
+ stub(ENV).include?{ false }
97
+ Ame::Options.new.
98
+ option(:a, 'd').
99
+ option(:b, 'd').process(['arg', '-a', '-b'])
100
+ end
101
+
102
+ expect [{:a => false, :b => false}, ['arg', '-a', '-b']] do
103
+ Ame::Options.new.
104
+ options_must_precede_arguments.
105
+ option(:a, 'd').
106
+ option(:b, 'd').process(['arg', '-a', '-b'])
107
+ end
108
+
109
+ expect [{:a => true}, []] do
110
+ Ame::Options.new.option(:a, 'd', :aliases => [:b]).process(['-b'])
111
+ end
112
+
113
+ expect [{:a => false}, []] do
114
+ Ame::Options.new.option(:a, 'd', :default => true).process(['-a'])
115
+ end
116
+
117
+ expect [{:abc => true}, []] do
118
+ Ame::Options.new.option(:abc, 'd').process(['--abc'])
119
+ end
120
+
121
+ expect [{:abc => 1}, []] do
122
+ Ame::Options.new.option(:abc, 'd', :type => Integer).process(['--abc=1'])
123
+ end
124
+
125
+ expect [{:abc => 1}, []] do
126
+ Ame::Options.new.option(:abc, 'd', :type => Integer).process(['--abc', '1'])
127
+ end
128
+
129
+ expect [{}, []] do
130
+ Ame::Options.new.option(:abc, 'd', :ignore => true).process(['--abc'])
131
+ end
132
+
133
+ expect [{:a => [1, 2, 3]}, []] do
134
+ Ame::Options.new.option(:a, 'd', :type => Ame::Types::Array[Integer]).process(%w[-a 1 -a 2 -a 3])
135
+ end
136
+ end