benry-cmdapp 0.2.0 → 1.0.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.
- checksums.yaml +4 -4
- data/CHANGES.md +6 -0
- data/README.md +1693 -852
- data/benry-cmdapp.gemspec +3 -3
- data/doc/benry-cmdapp.html +1582 -906
- data/lib/benry/cmdapp.rb +1894 -1060
- data/test/app_test.rb +882 -1078
- data/test/config_test.rb +71 -0
- data/test/context_test.rb +382 -0
- data/test/func_test.rb +302 -82
- data/test/help_test.rb +1054 -553
- data/test/metadata_test.rb +191 -0
- data/test/misc_test.rb +175 -0
- data/test/registry_test.rb +402 -0
- data/test/run_all.rb +4 -3
- data/test/scope_test.rb +1210 -0
- data/test/shared.rb +112 -49
- data/test/util_test.rb +154 -99
- metadata +17 -9
- data/test/action_test.rb +0 -1038
- data/test/index_test.rb +0 -185
@@ -0,0 +1,191 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
|
5
|
+
require_relative 'shared'
|
6
|
+
|
7
|
+
|
8
|
+
Oktest.scope do
|
9
|
+
|
10
|
+
|
11
|
+
topic Benry::CmdApp::BaseMetadata do
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
topic Benry::CmdApp::ActionMetadata do
|
17
|
+
|
18
|
+
topic '#hidden?()' do
|
19
|
+
|
20
|
+
spec "[!stied] returns true/false if `hidden:` kwarg provided." do
|
21
|
+
args = ["hello", "Hello", nil, MyAction, :hello]
|
22
|
+
md = Benry::CmdApp::ActionMetadata.new(*args, hidden: true)
|
23
|
+
ok {md.hidden?} == true
|
24
|
+
md = Benry::CmdApp::ActionMetadata.new(*args, hidden: false)
|
25
|
+
ok {md.hidden?} == false
|
26
|
+
end
|
27
|
+
|
28
|
+
spec "[!eumhz] returns true/false if method is private or not." do
|
29
|
+
args = ["hello", "Hello", nil, MyAction, :hello]
|
30
|
+
md = Benry::CmdApp::ActionMetadata.new(*args)
|
31
|
+
ok {md.hidden?} == false
|
32
|
+
MyAction.class_eval { private :hello }
|
33
|
+
at_end { MyAction.class_eval { public :hello } }
|
34
|
+
ok {md.hidden?} == true
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
topic '#option_empty?()' do
|
41
|
+
|
42
|
+
spec "[!14xgg] returns true if the action has no options." do
|
43
|
+
schema = Benry::CmdApp::ACTION_OPTION_SCHEMA_CLASS.new
|
44
|
+
args = ["hello", "Hello", schema, MyAction, :hello]
|
45
|
+
md = Benry::CmdApp::ActionMetadata.new(*args)
|
46
|
+
ok {md.option_empty?} == true
|
47
|
+
end
|
48
|
+
|
49
|
+
spec "[!dbtht] returns false if the action has at least one option." do
|
50
|
+
schema = Benry::CmdApp::ACTION_OPTION_SCHEMA_CLASS.new
|
51
|
+
schema.add(:verbose, "-v", "verbose")
|
52
|
+
args = ["hello", "Hello", schema, MyAction, :hello]
|
53
|
+
md = Benry::CmdApp::ActionMetadata.new(*args)
|
54
|
+
ok {md.option_empty?} == false
|
55
|
+
end
|
56
|
+
|
57
|
+
spec "[!wa315] considers hidden options if `all: true` passed." do
|
58
|
+
schema = Benry::CmdApp::ACTION_OPTION_SCHEMA_CLASS.new
|
59
|
+
schema.add(:debug, "-D", "debug", hidden: true)
|
60
|
+
args = ["hello", "Hello", schema, MyAction, :hello]
|
61
|
+
md = Benry::CmdApp::ActionMetadata.new(*args)
|
62
|
+
ok {md.option_empty?(all: false)} == true
|
63
|
+
ok {md.option_empty?(all: true)} == false
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
topic '#option_help()' do
|
70
|
+
|
71
|
+
before do
|
72
|
+
schema = Benry::CmdApp::ACTION_OPTION_SCHEMA_CLASS.new
|
73
|
+
schema.add(:lang, "-l <lang>", "language")
|
74
|
+
schema.add(:color, "--color[=<on|off>]", "color mode", type: TrueClass)
|
75
|
+
schema.add(:debug, "--debug", "debug mode", hidden: true)
|
76
|
+
args = ["hello", "Hello", schema, MyAction, :hello]
|
77
|
+
@metadata = Benry::CmdApp::ActionMetadata.new(*args)
|
78
|
+
end
|
79
|
+
|
80
|
+
spec "[!bpkwn] returns help message string of the action." do
|
81
|
+
ok {@metadata.option_help(" %-15s : %s")} == <<"END"
|
82
|
+
-l <lang> : language
|
83
|
+
--color[=<on|off>] : color mode
|
84
|
+
END
|
85
|
+
end
|
86
|
+
|
87
|
+
spec "[!76hni] includes hidden options in help message if `all:` is truthy." do
|
88
|
+
ok {@metadata.option_help(" %-15s : %s", all: true)} == <<"END"
|
89
|
+
-l <lang> : language
|
90
|
+
--color[=<on|off>] : color mode
|
91
|
+
--debug : debug mode
|
92
|
+
END
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
|
98
|
+
topic '#parse_options()' do
|
99
|
+
|
100
|
+
before do
|
101
|
+
schema = Benry::CmdApp::ACTION_OPTION_SCHEMA_CLASS.new
|
102
|
+
schema.add(:lang, "-l <lang>", "language")
|
103
|
+
schema.add(:color, "--color[=<on|off>]", "color mode", type: TrueClass)
|
104
|
+
schema.add(:debug, "--debug", "debug mode", hidden: true)
|
105
|
+
args = ["hello", "Hello", schema, MyAction, :hello]
|
106
|
+
@metadata = Benry::CmdApp::ActionMetadata.new(*args)
|
107
|
+
end
|
108
|
+
|
109
|
+
spec "[!gilca] returns parsed options." do
|
110
|
+
args = ["-len", "--color=on", "Alice"]
|
111
|
+
opts = @metadata.parse_options(args)
|
112
|
+
ok {opts} == {:lang=>"en", :color=>true}
|
113
|
+
ok {args} == ["Alice"]
|
114
|
+
end
|
115
|
+
|
116
|
+
spec "[!v34yk] raises OptionError if option has error." do
|
117
|
+
args = ["--lang=en", "--color=on", "Alice"]
|
118
|
+
pr = proc { @metadata.parse_options(args) }
|
119
|
+
ok {pr}.raise?(Benry::CmdApp::OptionError,
|
120
|
+
"--lang=en: Unknown long option.")
|
121
|
+
end
|
122
|
+
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
topic '#alias?()' do
|
127
|
+
|
128
|
+
spec "[!c1eq3] returns false which means that this is not an alias metadata." do
|
129
|
+
schema = Benry::CmdApp::ACTION_OPTION_SCHEMA_CLASS.new
|
130
|
+
args = ["hello", "Hello", schema, MyAction, :hello]
|
131
|
+
metadata = Benry::CmdApp::ActionMetadata.new(*args)
|
132
|
+
ok {metadata.alias?} == false
|
133
|
+
end
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
topic Benry::CmdApp::AliasMetadata do
|
142
|
+
|
143
|
+
|
144
|
+
topic '#initialize()' do
|
145
|
+
|
146
|
+
spec "[!qtb61] sets description string automatically." do
|
147
|
+
metadata = Benry::CmdApp::AliasMetadata.new("a9344", "hello", nil)
|
148
|
+
ok {metadata.desc} == "alias for 'hello'"
|
149
|
+
end
|
150
|
+
|
151
|
+
spec "[!kgic6] includes args value into description if provided." do
|
152
|
+
metadata = Benry::CmdApp::AliasMetadata.new("a1312", "hello", ["aa", "bb"])
|
153
|
+
ok {metadata.desc} == "alias for 'hello aa bb'"
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
topic '#alias?()' do
|
160
|
+
|
161
|
+
spec "[!c798o] returns true which means that this is an alias metadata." do
|
162
|
+
metadata = Benry::CmdApp::AliasMetadata.new("a2041", "hello", nil)
|
163
|
+
ok {metadata.alias?} == true
|
164
|
+
end
|
165
|
+
|
166
|
+
end
|
167
|
+
|
168
|
+
|
169
|
+
topic '#name_with_args()' do
|
170
|
+
|
171
|
+
spec "[!6kjuv] returns alias name if no args." do
|
172
|
+
metadata = Benry::CmdApp::AliasMetadata.new("a1549", "hello", nil)
|
173
|
+
ok {metadata.name_with_args} == "a1549"
|
174
|
+
metadata = Benry::CmdApp::AliasMetadata.new("a1549", "hello", [])
|
175
|
+
ok {metadata.name_with_args} == "a1549"
|
176
|
+
end
|
177
|
+
|
178
|
+
spec "[!d4xrb] returns alias name and args as combined." do
|
179
|
+
metadata = Benry::CmdApp::AliasMetadata.new("a1549", "hello", ["x"])
|
180
|
+
ok {metadata.name_with_args} == "a1549 (with 'x')"
|
181
|
+
metadata = Benry::CmdApp::AliasMetadata.new("a1549", "hello", ["x", "y"])
|
182
|
+
ok {metadata.name_with_args} == "a1549 (with 'x y')"
|
183
|
+
end
|
184
|
+
|
185
|
+
end
|
186
|
+
|
187
|
+
|
188
|
+
end
|
189
|
+
|
190
|
+
|
191
|
+
end
|
data/test/misc_test.rb
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
|
5
|
+
require_relative 'shared'
|
6
|
+
|
7
|
+
|
8
|
+
Oktest.scope do
|
9
|
+
|
10
|
+
|
11
|
+
topic Benry::CmdApp::BaseError do
|
12
|
+
|
13
|
+
|
14
|
+
topic '#should_report_backtrace?()' do
|
15
|
+
|
16
|
+
spec "[!oj9x3] returns true in base exception class to report backtrace." do
|
17
|
+
exc = Benry::CmdApp::BaseError.new("")
|
18
|
+
ok {exc.should_report_backtrace?()} == true
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
topic Benry::CmdApp::OptionError do
|
28
|
+
|
29
|
+
|
30
|
+
topic '#should_report_backtrace?()' do
|
31
|
+
|
32
|
+
spec "[!6qvnc] returns false in OptionError class because no need to report backtrace." do
|
33
|
+
exc = Benry::CmdApp::OptionError.new("")
|
34
|
+
ok {exc.should_report_backtrace?()} == false
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
topic Benry::CmdApp::CommandError do
|
44
|
+
|
45
|
+
|
46
|
+
topic '#should_report_backtrace?()' do
|
47
|
+
|
48
|
+
spec "[!o9xu2] returns false in ComamndError class because no need to report backtrace." do
|
49
|
+
exc = Benry::CmdApp::CommandError.new("")
|
50
|
+
ok {exc.should_report_backtrace?()} == false
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
topic Benry::CmdApp::ActionOptionSchema do
|
60
|
+
|
61
|
+
|
62
|
+
topic '#initialize()' do
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
topic Benry::CmdApp::OptionParser do
|
70
|
+
|
71
|
+
|
72
|
+
topic '#parse()' do
|
73
|
+
|
74
|
+
spec "[!iaawe] raises OptionError if option error found." do
|
75
|
+
schema = Benry::CmdApp::ActionOptionSchema.new()
|
76
|
+
schema.add(:help, "-h, --help", "help message")
|
77
|
+
parser = Benry::CmdApp::OptionParser.new(schema)
|
78
|
+
pr = proc { parser.parse(["-x", "foo"]) }
|
79
|
+
ok {pr}.raise?(Benry::CmdApp::OptionError,
|
80
|
+
"-x: Unknown option.")
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
|
88
|
+
topic Benry::CmdApp::OptionSet do
|
89
|
+
|
90
|
+
before do
|
91
|
+
@optset = Benry::CmdApp::OptionSet.new
|
92
|
+
@schema = Benry::CmdApp::OptionSchema.new
|
93
|
+
@schema.add(:user , "-u, --user=<user>" , "user name")
|
94
|
+
@schema.add(:email, "-e, --email=<email>", "email address")
|
95
|
+
@schema.add(:port , "-p, --port=<number>", "port number", type: Integer)
|
96
|
+
end
|
97
|
+
|
98
|
+
|
99
|
+
topic '#copy_from()' do
|
100
|
+
|
101
|
+
spec "[!d9udc] copy option items from schema." do
|
102
|
+
items = []
|
103
|
+
@schema.each {|item| items << item }
|
104
|
+
#
|
105
|
+
@optset.copy_from(@schema)
|
106
|
+
new_items = @optset.instance_variable_get(:@items)
|
107
|
+
ok {new_items}.length(3)
|
108
|
+
ok {new_items[0]} == items[0]
|
109
|
+
ok {new_items[1]} == items[1]
|
110
|
+
ok {new_items[2]} == items[2]
|
111
|
+
end
|
112
|
+
|
113
|
+
spec "[!v1ok3] returns self." do
|
114
|
+
ok {@optset.copy_from(@schema)}.same?(@optset)
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
topic '#copy_into()' do
|
121
|
+
|
122
|
+
spec "[!n00r1] copy option items into schema." do
|
123
|
+
@optset.copy_from(@schema)
|
124
|
+
new_schema = Benry::CmdApp::OptionSchema.new
|
125
|
+
@optset.copy_into(new_schema)
|
126
|
+
new_items = []
|
127
|
+
new_schema.each {|item| new_items << item }
|
128
|
+
items = @optset.instance_variable_get(:@items)
|
129
|
+
ok {new_items}.length(3)
|
130
|
+
ok {new_items[0]} == items[0]
|
131
|
+
ok {new_items[1]} == items[1]
|
132
|
+
ok {new_items[2]} == items[2]
|
133
|
+
end
|
134
|
+
|
135
|
+
spec "[!ynn1m] returns self." do
|
136
|
+
@optset.copy_from(@schema)
|
137
|
+
new_schema = Benry::CmdApp::OptionSchema.new
|
138
|
+
ok {@optset.copy_into(new_schema)}.same?(@optset)
|
139
|
+
end
|
140
|
+
|
141
|
+
end
|
142
|
+
|
143
|
+
|
144
|
+
topic '#select()' do
|
145
|
+
|
146
|
+
spec "[!mqkzf] creates new OptionSet object with filtered options." do
|
147
|
+
@optset.copy_from(@schema)
|
148
|
+
newone = @optset.select(:user, :email)
|
149
|
+
ok {newone}.is_a?(Benry::CmdApp::OptionSet)
|
150
|
+
items = newone.instance_variable_get(:@items)
|
151
|
+
ok {items}.length(2)
|
152
|
+
ok {items.collect(&:key).sort} == [:email, :user]
|
153
|
+
end
|
154
|
+
|
155
|
+
end
|
156
|
+
|
157
|
+
|
158
|
+
topic '#exclude()' do
|
159
|
+
|
160
|
+
spec "[!oey0q] creates new OptionSet object with remained options." do
|
161
|
+
@optset.copy_from(@schema)
|
162
|
+
newone = @optset.exclude(:user, :email)
|
163
|
+
ok {newone}.is_a?(Benry::CmdApp::OptionSet)
|
164
|
+
items = newone.instance_variable_get(:@items)
|
165
|
+
ok {items}.length(1)
|
166
|
+
ok {items.collect(&:key).sort} == [:port]
|
167
|
+
end
|
168
|
+
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
|
175
|
+
end
|