cmdopt 0.2.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.
Files changed (7) hide show
  1. data/MIT-LICENSE +21 -0
  2. data/README.txt +138 -0
  3. data/cmdopt.gemspec +34 -0
  4. data/lib/cmdopt.rb +256 -0
  5. data/setup.rb +1585 -0
  6. data/test/cmdopt_test.rb +377 -0
  7. metadata +66 -0
@@ -0,0 +1,377 @@
1
+ ###
2
+ ### $Release: 0.2.0 $
3
+ ### $Copyright: copyright(c) 2011 kuwata-lab.com all rights reserved $
4
+ ### $License: MIT License $
5
+ ###
6
+
7
+ require 'test/unit'
8
+ require 'section9/unittest'
9
+
10
+ require 'cmdopt'
11
+
12
+
13
+ ##
14
+ ## option definitions
15
+ ##
16
+ $cmdopt_parser = Cmdopt::Parser.new()
17
+ # short and long options
18
+ $cmdopt_parser.option("-h, --help", "show help")
19
+ # short option only, but specify attribute name
20
+ $cmdopt_parser.option("-v #version", "print version")
21
+ # validation example
22
+ $cmdopt_parser.option("-m, --mode=MODE", "set mode ('verbose' or 'quiet')")\
23
+ .validation {|val| val !~ /^(verbose|quiet)$/ and "'verbose' or 'quiet' expected." }
24
+ # action example
25
+ $cmdopt_parser.option(" --quiet", "quiet mode")\
26
+ .action {|val, opts| opts.mode = "quiet" }
27
+ # optional argument
28
+ $cmdopt_parser.option("-i, --indent[=N]", "indent (default 2)")\
29
+ .validation {|val| !(val == true || val =~ /^\d+$/) and "integer expected." }
30
+ # multiple option
31
+ $cmdopt_parser.option("-I PATH #paths", "include path (multiple OK)")\
32
+ .action {|val, opts| (opts.paths ||= []) << val }
33
+ # private option (not displayed in help message)
34
+ $cmdopt_parser.option("-D", nil)
35
+
36
+
37
+ class Cmdopt_Schema_TC < TC
38
+
39
+ def schema_
40
+ @schema_ ||= Cmdopt::Schema.new
41
+ end
42
+
43
+ def item_
44
+ @item_ ||= schema_.add("-m, --mode=MODE", "set mode")
45
+ end
46
+
47
+ describe "#add()" do
48
+ it "returns item object." do
49
+ verify_(item_).is_a?(Cmdopt::SchemaItem)
50
+ end
51
+ it "parses command-option definition." do
52
+ item = item_
53
+ verify_(item.short) == "m"
54
+ verify_(item.long) == "mode"
55
+ verify_(item.arg) == "MODE"
56
+ verify_(item.required) == true
57
+ verify_(item.attr) == "mode"
58
+ verify_(item.desc) == "set mode"
59
+ verify_(item.validator) == nil
60
+ end
61
+ it "sets default handler function." do
62
+ verify_(item_.handler).is_a?(Proc)
63
+ opts = Cmdopt::Options.new(:mode=>nil)
64
+ item_.handler.call("verbose", opts)
65
+ verify_(opts.mode) == "verbose"
66
+ end
67
+ it "register item object." do
68
+ item_ # don't remove this!
69
+ verify_(schema_.get('-m')).same?(item_)
70
+ verify_(schema_.get('--mode')).same?(item_)
71
+ end
72
+ it "throws error when option definition is invalid." do
73
+ pr = proc { schema_.add("-m MODE, --mode", "set mode") }
74
+ verify_(pr).raise?(ArgumentError, "'-m MODE, --mode': invalid option definition.")
75
+ end
76
+ it "recognizes '#name' as attribute name." do
77
+ item = schema_.add('-q #quiet', nil)
78
+ verify_(item.attr) == 'quiet'
79
+ verify_(item.short) == 'q'
80
+ verify_(item.long) == nil
81
+ #
82
+ item = schema_.add('-q value #quiet', nil)
83
+ verify_(item.attr) == 'quiet'
84
+ verify_(item.short) == 'q'
85
+ verify_(item.long) == nil
86
+ #
87
+ item = schema_.add('--silent #quiet', nil)
88
+ verify_(item.attr) == 'quiet'
89
+ verify_(item.short) == nil
90
+ verify_(item.long) == 'silent'
91
+ end
92
+ end
93
+
94
+ def parser_
95
+ @parser_ ||= $cmdopt_parser
96
+ end
97
+
98
+ describe "#help()" do
99
+ it "returns help message of command-line options." do
100
+ expected = [
101
+ " -h, --help : show help\n",
102
+ " -v : print version\n",
103
+ " -m, --mode=MODE : set mode ('verbose' or 'quiet')\n",
104
+ " --quiet : quiet mode\n",
105
+ " -i, --indent[=N] : indent (default 2)\n",
106
+ " -I PATH : include path (multiple OK)\n",
107
+ #" -D : enable debug mode\n",
108
+ ].join
109
+ verify_(parser_.schema.help(20)) == expected
110
+ verify_(parser_ .help(20)) == expected
111
+ end
112
+ it "takes width and indent arguments." do
113
+ expected = [
114
+ " -h, --help: show help\n",
115
+ " -v : print version\n",
116
+ " -m, --mode=MODE: set mode ('verbose' or 'quiet')\n",
117
+ " --quiet: quiet mode\n",
118
+ " -i, --indent[=N]: indent (default 2)\n",
119
+ " -I PATH : include path (multiple OK)\n",
120
+ #" -D : enable debug mode\n",
121
+ ].join
122
+ verify_(parser_.schema.help(10, " ")) == expected
123
+ verify_(parser_ .help(10, " ")) == expected
124
+ end
125
+ it "calculates width when not specified." do
126
+ expected = [
127
+ " -h, --help : show help\n",
128
+ " -v : print version\n",
129
+ " -m, --mode=MODE : set mode ('verbose' or 'quiet')\n",
130
+ " --quiet : quiet mode\n",
131
+ " -i, --indent[=N] : indent (default 2)\n",
132
+ " -I PATH : include path (multiple OK)\n",
133
+ #" -D : enable debug mode\n"
134
+ ].join
135
+ verify_(parser_.schema.help()) == expected
136
+ verify_(parser_ .help()) == expected
137
+ end
138
+ end
139
+
140
+ end
141
+
142
+
143
+ class Cmdopt_Builder_TC < TC
144
+
145
+ def item_
146
+ @item_ ||= Cmdopt::SchemaItem.new
147
+ end
148
+
149
+ def builder_
150
+ @builder_ ||= Cmdopt::Builder.new(item_)
151
+ end
152
+
153
+ describe "#get_item()" do
154
+ it "returns item object." do
155
+ verify_(builder_.get_item()).same?(item_)
156
+ end
157
+ end
158
+
159
+ describe "#validation()" do
160
+ it "sets validator function." do
161
+ builder_.validation {|va| "OK" }
162
+ verify_(builder_.get_item.validator.call(nil)) == "OK"
163
+ end
164
+ it "returns self." do
165
+ ret = builder_.validation {|val| "OK" }
166
+ verify_(ret).same?(builder_)
167
+ end
168
+ end
169
+
170
+ describe "#action()" do
171
+ it "sets handler function." do
172
+ builder_.action {|val, opts| "YES" }
173
+ verify_(builder_.get_item.handler.call(nil, {})) == "YES"
174
+ end
175
+ it "returns self." do
176
+ ret = builder_.action {|val, opts| "YES" }
177
+ verify_(ret).same?(builder_)
178
+ end
179
+ end
180
+
181
+ end
182
+
183
+
184
+ class Cmdopt_Parser_TC < TC
185
+
186
+ describe "#option()" do
187
+ it "registers option definition." do
188
+ parser = Cmdopt::Parser.new
189
+ parser.option("-h, --help", "show help")
190
+ item = parser.schema.get("-h")
191
+ verify_(item).is_a?(Cmdopt::SchemaItem)
192
+ verify_(item.short) == "h"
193
+ verify_(item.long) == "help"
194
+ verify_(item.desc) == "show help"
195
+ end
196
+ it "returns builder object." do
197
+ parser = Cmdopt::Parser.new
198
+ ret = parser.option("-h, --help", "show help")
199
+ verify_(ret).is_a?(Cmdopt::Builder)
200
+ end
201
+ end
202
+
203
+ describe "#help()" do
204
+ it "calls #schema.help()." do
205
+ parser = Cmdopt::Parser.new
206
+ rc = recorder()
207
+ rc.record_method(parser.schema, :help)
208
+ ret = parser.help(19, " ")
209
+ verify_(rc[0].name) == :help
210
+ verify_(rc[0].args) == [19, " "]
211
+ end
212
+ end
213
+
214
+ def parser_
215
+ @parser_ ||= $cmdopt_parser
216
+ end
217
+
218
+ describe "#parse()" do
219
+ it "parses args." do
220
+ args = ["-vmquiet", "--help", "foo", "bar"]
221
+ defaults = {:mode=>"verbose", :file=>"config.json"}
222
+ opts = parser_.parse(args, defaults)
223
+ verify_(opts).NOT.same?(defaults)
224
+ verify_(opts.help) == true
225
+ verify_(opts.version) == true
226
+ verify_(opts.mode) == "quiet" # overrided
227
+ verify_(opts.file) == "config.json" # not overrided
228
+ verify_(args) == ["foo", "bar"]
229
+ end
230
+ it "parses long options." do
231
+ # no argument
232
+ args = ["--quiet", "foo", "bar"]
233
+ opts = parser_.parse(args)
234
+ verify_(opts.mode) == "quiet"
235
+ verify_(args) == ["foo", "bar"]
236
+ # required argument
237
+ args = ["--mode=verbose", "foo", "bar"]
238
+ opts = parser_.parse(args)
239
+ verify_(opts.mode) == "verbose"
240
+ verify_(args) == ["foo", "bar"]
241
+ end
242
+ it "parses short options." do
243
+ args = ["-h", "-m", "quiet", "foo", "bar"]
244
+ opts = parser_.parse(args)
245
+ verify_(opts.help) == true # no argument
246
+ verify_(opts.mode) == "quiet" # required argument
247
+ verify_(args) == ["foo", "bar"];
248
+ end
249
+ it "short options can be conbined." do
250
+ args = ["-hmquiet", "foo", "bar"]
251
+ opts = parser_.parse(args)
252
+ verify_(opts.help) == true
253
+ verify_(opts.mode) == "quiet"
254
+ verify_(args) == ["foo", "bar"]
255
+ end
256
+ it "optional argument is available for short option." do
257
+ ## when optional argument is not passed
258
+ args = ["-i", "foo", "bar"]
259
+ opts = parser_.parse(args)
260
+ verify_(opts.indent) == true
261
+ verify_(args) == ["foo", "bar"]
262
+ ## when optional argument is passed
263
+ args = ["-i3", "foo", "bar"]
264
+ opts = parser_.parse(args)
265
+ verify_(opts.indent) == '3'
266
+ verify_(args) == ["foo", "bar"]
267
+ end
268
+ it "optional argument is available for long option." do
269
+ ## when optional argument is not passed
270
+ args = ["--indent", "foo", "bar"]
271
+ opts = parser_.parse(args)
272
+ verify_(opts.indent) == true
273
+ verify_(args) == ["foo", "bar"]
274
+ ## when optional argument is passed
275
+ args = ["--indent=3", "foo", "bar"]
276
+ opts = parser_.parse(args)
277
+ verify_(opts.indent) == '3'
278
+ verify_(args) == ["foo", "bar"]
279
+ end
280
+ it "throws error when unknown short option specified." do
281
+ args = ["-xD", "foo", "bar"]
282
+ pr = proc { parser_.parse(args, {}) }
283
+ verify_(pr).raise?(Cmdopt::ParseError, "-x: unknown option.")
284
+ end
285
+ it "throws error when unknown long option specified." do
286
+ ## when argument not passed
287
+ args = ["--SOS"]
288
+ pr = proc { parser_.parse(args) }
289
+ verify_(pr).raise?(Cmdopt::ParseError, "--SOS: unknown option.")
290
+ ## with argument passed
291
+ args = ["--sos=SOS"]
292
+ pr = proc { parser_.parse(args, {}) }
293
+ verify_(pr).raise?(Cmdopt::ParseError, "--sos=SOS: unknown option.")
294
+ end
295
+ it "calls handler function." do
296
+ args = ["--quiet", "foo", "bar"]
297
+ opts = parser_.parse(args)
298
+ verify_(opts.quiet) == nil
299
+ verify_(opts.mode) == "quiet"
300
+ ## multiple option
301
+ args = ["-Ipath1", "-Ipath2", "-Ipath3"]
302
+ opts = parser_.parse(args)
303
+ verify_(opts.paths) == ["path1", "path2", "path3"]
304
+ end
305
+ it "throws error when validator returns error message." do
306
+ ## when short option
307
+ args = ["-msilent", "foo", "bar"]
308
+ pr = proc { parser_.parse(args) }
309
+ verify_(pr).raise?(Cmdopt::ParseError, "-m silent: 'verbose' or 'quiet' expected.")
310
+ ## when short option (optional)
311
+ args = ["-i9.99", "foo", "bar"]
312
+ pr = proc { parser_.parse(args) }
313
+ verify_(pr).raise?(Cmdopt::ParseError, "-i9.99: integer expected.")
314
+ ## when long option
315
+ args = ["--indent=zero", "foo", "bar"]
316
+ pr = proc { parser_.parse(args) }
317
+ verify_(pr).raise?(Cmdopt::ParseError, "--indent=zero: integer expected.")
318
+ end
319
+ it "stop parsing when '--' found." do
320
+ args = ["-h", "--", "-m", "verbose"]
321
+ opts = parser_.parse(args)
322
+ verify_(args) == ["-m", "verbose"]
323
+ verify_(opts.help) == true
324
+ verify_(opts.mode) == nil
325
+ end
326
+ it "returns different object from defaults." do
327
+ args = ["-Dm", "verbose", "foo", "bar"]
328
+ defaults = {}
329
+ opts = parser_.parse(args, defaults)
330
+ verify_(opts).NOT.same? defaults
331
+ verify_(opts).NOT == defaults
332
+ verify_(defaults.empty?) == true
333
+ end
334
+ end
335
+
336
+ end
337
+
338
+
339
+ class Cmdopt_ParseError_TC < TC
340
+
341
+ def err_
342
+ @err ||= Cmdopt::ParseError.new("SOS")
343
+ end
344
+ it "subclass of Error" do
345
+ verify_(err_).is_a?(Exception)
346
+ end
347
+ it "#message is set." do
348
+ verify_(err_.message) == "SOS"
349
+ end
350
+
351
+ end
352
+
353
+
354
+ class Cmdopt_Options_TC < TC
355
+
356
+ def opts_
357
+ @opts_ ||= Cmdopt::Options.new(:indent=>2, :paths=>['path1'], :help=>true, :mode=>"verbose")
358
+ end
359
+
360
+ describe "#__init__()" do
361
+ it "takes keyword arguments." do
362
+ verify_(opts_.indent) == 2
363
+ verify_(opts_.paths) == ['path1']
364
+ verify_(opts_.help) == true
365
+ verify_(opts_.mode) == "verbose"
366
+ end
367
+ end
368
+
369
+ describe "#__repr__()" do
370
+ it "prints key and values in order of key." do
371
+ expected = %Q`<Cmdopt::Options help=true, indent=2, mode="verbose", paths=["path1"]>`
372
+ verify_(opts_.inspect) == expected
373
+ #verify_("Haruhi\nMikuru\nYuki\n") == "Haruhi\nMichiru\nYuki\n"
374
+ end
375
+ end
376
+
377
+ end
metadata ADDED
@@ -0,0 +1,66 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cmdopt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - makoto kuwata
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-12-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: section9-unittest
16
+ requirement: &2160150160 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: *2160150160
25
+ description: ! 'Cmdopt.rb is a command-line option parser.
26
+
27
+ It is easier to use than optparse.rb (which is a standard library of Ruby).
28
+
29
+ '
30
+ email: kwa(at)kuwata-lab.com
31
+ executables: []
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - README.txt
36
+ - MIT-LICENSE
37
+ - setup.rb
38
+ - cmdopt.gemspec
39
+ - lib/cmdopt.rb
40
+ - test/cmdopt_test.rb
41
+ homepage: https://bitbucket.org/kwatch/cmdopt/wiki/Cmdopt.rb
42
+ licenses: []
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ! '>='
51
+ - !ruby/object:Gem::Version
52
+ version: '0'
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project: cmdopt
61
+ rubygems_version: 1.8.11
62
+ signing_key:
63
+ specification_version: 3
64
+ summary: easy-to-use command option parser
65
+ test_files:
66
+ - test/cmdopt_test.rb