como 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. data/CHANGELOG.rdoc +12 -0
  2. data/README.rdoc +11 -5
  3. data/Rakefile +6 -1
  4. data/doc/Como/ArgsParseState.html +912 -0
  5. data/doc/Como/ComoCommon.html +305 -0
  6. data/doc/Como/MainOpt.html +636 -0
  7. data/doc/Como/MasterOpt.html +636 -0
  8. data/doc/Como/Opt/ErrorWithData.html +304 -0
  9. data/doc/Como/Opt/InvalidOption.html +158 -0
  10. data/doc/Como/Opt/MissingArgument.html +158 -0
  11. data/doc/Como/Opt.html +6098 -0
  12. data/doc/Como/RuleCheck.html +933 -0
  13. data/doc/Como/RuleDisplay.html +1193 -0
  14. data/doc/Como/Spec.html +1750 -0
  15. data/doc/Como.html +625 -0
  16. data/doc/_index.html +242 -0
  17. data/doc/class_list.html +53 -0
  18. data/doc/css/common.css +1 -0
  19. data/doc/css/full_list.css +57 -0
  20. data/doc/css/style.css +338 -0
  21. data/doc/file.CHANGELOG.html +90 -0
  22. data/doc/file.README.html +94 -0
  23. data/doc/file.como.html +1962 -0
  24. data/doc/file_list.html +58 -0
  25. data/doc/frames.html +28 -0
  26. data/doc/index.html +94 -0
  27. data/doc/js/app.js +214 -0
  28. data/doc/js/full_list.js +178 -0
  29. data/doc/js/jquery.js +4 -0
  30. data/doc/method_list.html +838 -0
  31. data/doc/top-level-namespace.html +112 -0
  32. data/lib/como.rb +1660 -661
  33. data/test/como_compatible +37 -0
  34. data/test/como_config +44 -0
  35. data/test/como_options +36 -0
  36. data/test/como_queries +44 -0
  37. data/test/como_rule_1 +28 -0
  38. data/test/como_rule_2 +28 -0
  39. data/test/como_subcmd +72 -0
  40. data/test/como_subcmd_config +88 -0
  41. data/test/golden/compatible.txt +438 -0
  42. data/test/golden/config.txt +319 -0
  43. data/test/golden/options.txt +438 -0
  44. data/test/golden/queries.txt +78 -0
  45. data/test/golden/rule_1.txt +454 -0
  46. data/test/golden/rule_2.txt +476 -0
  47. data/test/golden/subcmd.txt +360 -0
  48. data/test/golden/subcmd_config.txt +534 -0
  49. data/test/test_como.rb +22 -328
  50. data/test/test_compatible +28 -0
  51. data/test/test_config +12 -0
  52. data/test/test_options +28 -0
  53. data/test/test_queries +7 -0
  54. data/test/test_rule_1 +27 -0
  55. data/test/test_rule_2 +27 -0
  56. data/test/test_subcmd +30 -0
  57. data/test/test_subcmd_config +31 -0
  58. metadata +62 -6
@@ -0,0 +1,1962 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII" />
6
+ <title>
7
+ File: como
8
+
9
+ &mdash; Documentation by YARD 0.8.6.1
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="css/style.css" type="text/css" charset="utf-8" />
14
+
15
+ <link rel="stylesheet" href="css/common.css" type="text/css" charset="utf-8" />
16
+
17
+ <script type="text/javascript" charset="utf-8">
18
+ hasFrames = window.top.frames.main ? true : false;
19
+ relpath = '';
20
+ framesUrl = "frames.html#!" + escape(window.location.href);
21
+ </script>
22
+
23
+
24
+ <script type="text/javascript" charset="utf-8" src="js/jquery.js"></script>
25
+
26
+ <script type="text/javascript" charset="utf-8" src="js/app.js"></script>
27
+
28
+
29
+ </head>
30
+ <body>
31
+ <div id="header">
32
+ <div id="menu">
33
+
34
+ <a href="_index.html">Index</a> &raquo;
35
+ <span class="title">File: como</span>
36
+
37
+
38
+ <div class="noframes"><span class="title">(</span><a href="." target="_top">no frames</a><span class="title">)</span></div>
39
+ </div>
40
+
41
+ <div id="search">
42
+
43
+ <a class="full_list_link" id="class_list_link"
44
+ href="class_list.html">
45
+ Class List
46
+ </a>
47
+
48
+ <a class="full_list_link" id="method_list_link"
49
+ href="method_list.html">
50
+ Method List
51
+ </a>
52
+
53
+ <a class="full_list_link" id="file_list_link"
54
+ href="file_list.html">
55
+ File List
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <iframe id="search_frame"></iframe>
63
+
64
+ <div id="content"><div id='filecontents'><pre class="code ruby"><span class='comment'># = Como
65
+ </span><span class='comment'>#
66
+ </span><span class='comment'># == Introduction
67
+ </span><span class='comment'>#
68
+ </span><span class='comment'># Como provides low manifest command line option parsing and
69
+ </span><span class='comment'># deployment. The command line options are described in compact table
70
+ </span><span class='comment'># format and option values are stored to conveniently named
71
+ </span><span class='comment'># properties. Como provides the command usage information based on the
72
+ </span><span class='comment'># option table (+ generic program info) automatically. Como supports
73
+ </span><span class='comment'># also subcommands and checking for option combinations using a simple
74
+ </span><span class='comment'># DSL.
75
+ </span><span class='comment'>#
76
+ </span><span class='comment'>#
77
+ </span><span class='comment'>#
78
+ </span><span class='comment'># == Usage Examples
79
+ </span><span class='comment'>#
80
+ </span><span class='comment'># === Simple example
81
+ </span><span class='comment'>#
82
+ </span><span class='comment'># Below is a small example program (&quot;como_simple&quot;) that demonstrates
83
+ </span><span class='comment'># typical usage.
84
+ </span><span class='comment'>#
85
+ </span><span class='comment'># ==== Program listing
86
+ </span><span class='comment'>#
87
+ </span><span class='comment'># require &quot;como&quot;
88
+ </span><span class='comment'># include Como
89
+ </span><span class='comment'>#
90
+ </span><span class='comment'># # Define command line arguments:
91
+ </span><span class='comment'># Spec.command( &quot;como_simple&quot;, &quot;Programmer&quot;, &quot;2013&quot;,
92
+ </span><span class='comment'># [
93
+ </span><span class='comment'># [ :single, &quot;file&quot;, &quot;-f&quot;, &quot;File argument.&quot; ],
94
+ </span><span class='comment'># [ :switch, &quot;debug&quot;, &quot;-d&quot;, &quot;Enable debugging.&quot; ],
95
+ </span><span class='comment'># ] )
96
+ </span><span class='comment'>#
97
+ </span><span class='comment'># puts &quot; File option: #{Opt['file'].value}&quot;
98
+ </span><span class='comment'># puts &quot; Debugging selected!&quot; if Opt['debug'].given
99
+ </span><span class='comment'>#
100
+ </span><span class='comment'># &quot;Spec.defineCheckHelp&quot; method takes 4 arguments:
101
+ </span><span class='comment'># [progname] Name of the program (or command).
102
+ </span><span class='comment'># [author] Author of the program.
103
+ </span><span class='comment'># [year] Year (or any date) for the program.
104
+ </span><span class='comment'># [option table] Description of the command options in format with 4
105
+ </span><span class='comment'># entries in each sub-array.
106
+ </span><span class='comment'>#
107
+ </span><span class='comment'># Help is added silenty by default:
108
+ </span><span class='comment'># [ :silent, &quot;help&quot;, &quot;-h&quot;, &quot;Display usage info.&quot; ],
109
+ </span><span class='comment'>#
110
+ </span><span class='comment'># Each option table entry is an Array of 4 values: type, name,
111
+ </span><span class='comment'># mnemonic, doc. Three different types are present in the example:
112
+ </span><span class='comment'># [:silent] Silent is left out from the &quot;usage&quot; printout (see
113
+ </span><span class='comment'># below). Also &quot;help&quot; is reserved as special option name to
114
+ </span><span class='comment'># designate command line Usage Help.
115
+ </span><span class='comment'># [:single] Single means that the option requires one argument (and only one).
116
+ </span><span class='comment'># [:switch] Switch is an optional flag (default value is false).
117
+ </span><span class='comment'>#
118
+ </span><span class='comment'># Option name is used to reference the option value from Opt class.
119
+ </span><span class='comment'># The command line option values are stored to Opt class
120
+ </span><span class='comment'># automatically. For example the file option value is returned by
121
+ </span><span class='comment'># executing &quot;Opt['file'].value&quot;. The option name also doubles as
122
+ </span><span class='comment'># long option, i.e. one could use &quot;--file &lt;filename&gt;&quot; on the command
123
+ </span><span class='comment'># line.
124
+ </span><span class='comment'>#
125
+ </span><span class='comment'># Existence of optional options can be tested using the &quot;given&quot;
126
+ </span><span class='comment'># method. For example &quot;Opt['debug'].given&quot; would return &quot;true&quot; if
127
+ </span><span class='comment'># &quot;-d&quot; was given on the command line.
128
+ </span><span class='comment'>#
129
+ </span><span class='comment'># ==== Example executions
130
+ </span><span class='comment'>#
131
+ </span><span class='comment'># Normal behavior would be achieved by executing:
132
+ </span><span class='comment'># shell&gt; como_simple -f example -d
133
+ </span><span class='comment'>#
134
+ </span><span class='comment'># The program would execute with the following output:
135
+ </span><span class='comment'># File option: example
136
+ </span><span class='comment'># Debugging selected!
137
+ </span><span class='comment'>#
138
+ </span><span class='comment'># Same output would be achieved with:
139
+ </span><span class='comment'># shell&gt; como_simple --file example --debug
140
+ </span><span class='comment'>#
141
+ </span><span class='comment'># Since option name doubles as long option.
142
+ </span><span class='comment'>#
143
+ </span><span class='comment'># Como includes certain &quot;extra&quot; behavior out-of-box. For example
144
+ </span><span class='comment'># given the command:
145
+ </span><span class='comment'># shell&gt; como_simple
146
+ </span><span class='comment'>#
147
+ </span><span class='comment'># The following is displayed on the screen:
148
+ </span><span class='comment'>#
149
+ </span><span class='comment'># como_simple error: Option &quot;-f&quot; missing for &quot;como_simple&quot;...
150
+ </span><span class='comment'>#
151
+ </span><span class='comment'># Usage:
152
+ </span><span class='comment'># como_simple -f &lt;file&gt; [-d]
153
+ </span><span class='comment'>#
154
+ </span><span class='comment'># -f File argument.
155
+ </span><span class='comment'># -d Enable debugging.
156
+ </span><span class='comment'>#
157
+ </span><span class='comment'>#
158
+ </span><span class='comment'># Copyright (c) 2013 by Programmer
159
+ </span><span class='comment'>#
160
+ </span><span class='comment'>#
161
+ </span><span class='comment'># Missing option error is displayed since &quot;file&quot; is a mandatory
162
+ </span><span class='comment'># option. The error message is followed by &quot;usage&quot; display (Usage
163
+ </span><span class='comment'># Help).
164
+ </span><span class='comment'>#
165
+ </span><span class='comment'># Given the command:
166
+ </span><span class='comment'># shell&gt; como_simple -h
167
+ </span><span class='comment'>#
168
+ </span><span class='comment'># would display the same &quot;usage&quot; screen except without the error
169
+ </span><span class='comment'># line. Documentation string is taken from the specification to
170
+ </span><span class='comment'># &quot;usage&quot; display. The &quot;help&quot; option is added automatically to the
171
+ </span><span class='comment'># specification.
172
+ </span><span class='comment'>#
173
+ </span><span class='comment'>#
174
+ </span><span class='comment'>#
175
+ </span><span class='comment'># === Subcmd example
176
+ </span><span class='comment'>#
177
+ </span><span class='comment'>#
178
+ </span><span class='comment'>#
179
+ </span><span class='comment'>#
180
+ </span><span class='comment'>#
181
+ </span><span class='comment'>#
182
+ </span><span class='comment'># == Option specification
183
+ </span><span class='comment'>#
184
+ </span><span class='comment'># === Overview
185
+ </span><span class='comment'>#
186
+ </span><span class='comment'>#
187
+ </span><span class='comment'>#
188
+ </span><span class='comment'># === Option types
189
+ </span><span class='comment'>#
190
+ </span><span class='comment'># The following types can be defined for the command line options:
191
+ </span><span class='comment'># [:switch] Single switch option (no arguments).
192
+ </span><span class='comment'># [:single] Mandatory single argument option.
193
+ </span><span class='comment'># [:multi] Mandatory multiple argument option. Option values in
194
+ </span><span class='comment'># array.
195
+ </span><span class='comment'># [:opt_single] Optional single argument option.
196
+ </span><span class='comment'># [:opt_multi] Optional multiple argument option. Option values in array.
197
+ </span><span class='comment'># [:opt_any] Optional multiple argument option (also none accepted).
198
+ </span><span class='comment'># Option values in array.
199
+ </span><span class='comment'># [:default] Default option (no switch associated). Any name and
200
+ </span><span class='comment'># option String value can be supplied to the spec, since
201
+ </span><span class='comment'># only the document string is used. Default option is
202
+ </span><span class='comment'># referred with &quot;nil&quot;.
203
+ </span><span class='comment'># [:exclusive] Option that does not coexist with other options.
204
+ </span><span class='comment'># [:silent] Option that does not coexist with other options and is not
205
+ </span><span class='comment'># displayed as an option in &quot;usage&quot; display. In effect a
206
+ </span><span class='comment'># sub-option of :exclusive.
207
+ </span><span class='comment'>#
208
+ </span><span class='comment'># TODO: multi note about termination.
209
+ </span><span class='comment'># TODO: leaving out short option.
210
+ </span><span class='comment'>#
211
+ </span><span class='comment'># === TODO: Change header: Specification method options
212
+ </span><span class='comment'>#
213
+ </span><span class='comment'># The common method for specifying the options is to use
214
+ </span><span class='comment'># &quot;Spec.defineCheckHelp&quot;. Method invocation includes definition
215
+ </span><span class='comment'># of the options, parsing the command line, checking for missing
216
+ </span><span class='comment'># mandatory options, and it will automatically display &quot;usage&quot; if
217
+ </span><span class='comment'># &quot;help&quot; option is given.
218
+ </span><span class='comment'>#
219
+ </span><span class='comment'># Automatic &quot;help&quot; option processing can be avoided using
220
+ </span><span class='comment'># &quot;Spec.defineCheck&quot; instead.
221
+ </span><span class='comment'>#
222
+ </span><span class='comment'># TODO: How options are inherited, program vs subcmd.
223
+ </span><span class='comment'>#
224
+ </span><span class='comment'># Both methods above accept additional parameters passed in a
225
+ </span><span class='comment'># Hash. The usable hash keys:
226
+ </span>
227
+ <span class='comment'># [:autohelp] Add help option automatically (default: true). Custom
228
+ </span><span class='comment'># help option can be provided and it can be made also
229
+ </span><span class='comment'># visible to user.
230
+ </span><span class='comment'># [:rulehelp] Include RuleCheck help to Usage Help (default: false).
231
+ </span><span class='comment'># [:header] Header lines before standard usage printout.
232
+ </span><span class='comment'># [:footer] Footer lines after standard usage printout.
233
+ </span><span class='comment'># [:subcheck] TODO
234
+ </span><span class='comment'># [:check] Check for missing arguments (default: true).
235
+ </span><span class='comment'># [:tab] TODO (default: 12).
236
+ </span><span class='comment'># [:help_exit] Exit program if help displayed (default: true).
237
+ </span><span class='comment'># [:error_exit] Exit program if error in options (default: true).
238
+ </span><span class='comment'>#
239
+ </span><span class='comment'>#
240
+ </span><span class='comment'>#
241
+ </span><span class='comment'># == Option referencing
242
+ </span><span class='comment'>#
243
+ </span><span class='comment'># Opt class includes the parsed option values. All options can be
244
+ </span><span class='comment'># tested whether they are specified on the command line using
245
+ </span><span class='comment'># &quot;Opt['name'].given&quot;. The &quot;given&quot; method takes optionally a block
246
+ </span><span class='comment'># argument. When block argument is used, the block is supplied with
247
+ </span><span class='comment'># option value and the block is executed if the option has been
248
+ </span><span class='comment'># set.
249
+ </span><span class='comment'>#
250
+ </span><span class='comment'># &quot;Opt['name'].value&quot; returns the provided option value. For
251
+ </span><span class='comment'># &quot;:switch&quot; type it is true/false value and for the other types a
252
+ </span><span class='comment'># String or an Array of Strings.
253
+ </span><span class='comment'>#
254
+ </span><span class='comment'># If an option takes multiple arguments, the value for the option is
255
+ </span><span class='comment'># an Array. The values can be iterated simply by:
256
+ </span><span class='comment'># Opt['files'].value.each do |val|
257
+ </span><span class='comment'># puts val
258
+ </span><span class='comment'># end
259
+ </span><span class='comment'>#
260
+ </span><span class='comment'># Short syntax for value referencing is performed with unary operator
261
+ </span><span class='comment'># &quot;~&quot;. Thus
262
+ </span><span class='comment'># Opt['files'].value
263
+ </span><span class='comment'># is equal to
264
+ </span><span class='comment'># ~Opt['files']
265
+ </span><span class='comment'>#
266
+ </span><span class='comment'># Sometimes it is convenient for the program to use an option to
267
+ </span><span class='comment'># include multiple parameter settings. These settings can be parsed
268
+ </span><span class='comment'># and mapped to a Hash. Como performs automatic conversion to numeric
269
+ </span><span class='comment'># values if possible. For example with option:
270
+ </span><span class='comment'># --set rounds=10 length=5
271
+ </span><span class='comment'># Como can be used extract the parameter values with the &quot;params&quot; method:
272
+ </span><span class='comment'># Opt['set'].params
273
+ </span><span class='comment'># And a Hash is returned:
274
+ </span><span class='comment'># { 'rounds' =&gt; 10, 'length' =&gt; 5 }
275
+ </span><span class='comment'>#
276
+ </span><span class='comment'># With &quot;:opt_any&quot; type, the user should first check if the option was given:
277
+ </span><span class='comment'># Opt['many_files_or_none'].given
278
+ </span><span class='comment'># Then check how many arguments where given:
279
+ </span><span class='comment'># Opt['many_files_or_none'].value.length
280
+ </span><span class='comment'># And finally decide what to do.
281
+ </span><span class='comment'>#
282
+ </span><span class='comment'># If the user gives the &quot;--&quot; option (double-dash), the arguments after
283
+ </span><span class='comment'># that option is returned as an Array with &quot;Opt.external&quot;. TODO:
284
+ </span><span class='comment'># silent to terminate multi options.
285
+ </span><span class='comment'>#
286
+ </span><span class='comment'>#
287
+ </span><span class='comment'>#
288
+ </span><span class='comment'># == Customization
289
+ </span><span class='comment'>#
290
+ </span><span class='comment'># If the default behavior is not satisfactory, changes can be
291
+ </span><span class='comment'># implemented simply by overloading the existing functions. Some
292
+ </span><span class='comment'># knowledge of the internal workings of Como is required though.
293
+ </span><span class='comment'>#
294
+ </span><span class='comment'>#
295
+ </span><span class='comment'># == Additional checks
296
+ </span><span class='comment'>#
297
+ </span><span class='comment'># Sometimes the options have to be used in combination to make sense
298
+ </span><span class='comment'># for the program. Como provides a facility to create relations
299
+ </span><span class='comment'># between options. Consider the following options spec:
300
+ </span><span class='comment'># Spec.defineCheckHelp( &quot;como_fulltest&quot;, &quot;Programmer&quot;, &quot;2013&quot;,
301
+ </span><span class='comment'># [
302
+ </span><span class='comment'># [ :silent, &quot;help&quot;, &quot;-h&quot;, &quot;Display usage info.&quot; ],
303
+ </span><span class='comment'># [ :single, &quot;file&quot;, &quot;-f&quot;, &quot;File argument.&quot; ],
304
+ </span><span class='comment'># [ :switch, &quot;o1&quot;, &quot;-o1&quot;, &quot;o1&quot; ],
305
+ </span><span class='comment'># [ :opt_single, &quot;o2&quot;, &quot;-o2&quot;, &quot;o2&quot; ],
306
+ </span><span class='comment'># [ :opt_single, &quot;o3&quot;, &quot;-o3&quot;, &quot;o3&quot; ],
307
+ </span><span class='comment'># [ :opt_multi, &quot;o4&quot;, &quot;-o4&quot;, &quot;o4&quot; ],
308
+ </span><span class='comment'># [ :opt_any, &quot;o5&quot;, &quot;-o5&quot;, &quot;o5&quot; ],
309
+ </span><span class='comment'># [ :switch, &quot;debug&quot;, &quot;-d&quot;, &quot;Enable debugging.&quot; ],
310
+ </span><span class='comment'># ] )
311
+ </span><span class='comment'>#
312
+ </span><span class='comment'># Spec.checkRule do
313
+ </span><span class='comment'># all( 'file',
314
+ </span><span class='comment'># one(
315
+ </span><span class='comment'># all( 'o1', 'o2' ),
316
+ </span><span class='comment'># one( 'o3', 'o4', 'o5' )
317
+ </span><span class='comment'># )
318
+ </span><span class='comment'># )
319
+ </span><span class='comment'># end
320
+ </span><span class='comment'>#
321
+ </span><span class='comment'># This spec includes multiple optional options (&quot;o?&quot;). The
322
+ </span><span class='comment'># &quot;Spec.checkRule&quot; method accepts a block where option rule
323
+ </span><span class='comment'># check DSL (Domain Specific Language) is used. The rule specifies
324
+ </span><span class='comment'># that the &quot;file&quot; option has to be used in combination with some other
325
+ </span><span class='comment'># options. These are &quot;all( 'o1', 'o2' )&quot; or &quot;one( 'o3', 'o4', 'o5' )&quot;,
326
+ </span><span class='comment'># i.e. either both &quot;o1&quot; and &quot;o2&quot;, or one of [&quot;o3&quot;,&quot;o4&quot;,&quot;o5]. The
327
+ </span><span class='comment'># checker will validate this rule and error if for example the command
328
+ </span><span class='comment'># line reads:
329
+ </span><span class='comment'># shell&gt; como_fulltest --file myfile -o3 black -o5
330
+ </span><span class='comment'>#
331
+ </span><span class='comment'># The following rules can be used (in combination):
332
+ </span><span class='comment'># [all] All options in the list.
333
+ </span><span class='comment'># [one] One and only one from the list.
334
+ </span><span class='comment'># [any] At least one of the list is given.
335
+ </span><span class='comment'># [none] No options are required.
336
+ </span><span class='comment'># [inv] Logical negation for existence.
337
+ </span><span class='comment'># [incr] Incremental options in order i.e. have to have previous to
338
+ </span><span class='comment'># have later.
339
+ </span><span class='comment'># [follow] Incremental options in order i.e. have to have all later if
340
+ </span><span class='comment'># had first.
341
+ </span>
342
+ <span class='kw'>module</span> <span class='const'>Como</span>
343
+
344
+
345
+ <span class='comment'># IO stream options for Como classes.
346
+ </span> <span class='kw'>class</span> <span class='const'>ComoCommon</span>
347
+
348
+ <span class='comment'># Default value for display output.
349
+ </span> <span class='cvar'>@@io</span> <span class='op'>=</span> <span class='const'>STDOUT</span>
350
+
351
+ <span class='comment'># Set @@io.
352
+ </span> <span class='kw'>def</span> <span class='const'>ComoCommon</span><span class='period'>.</span><span class='id identifier rubyid_setIo'>setIo</span><span class='lparen'>(</span> <span class='id identifier rubyid_io'>io</span> <span class='rparen'>)</span>
353
+ <span class='cvar'>@@io</span> <span class='op'>=</span> <span class='id identifier rubyid_io'>io</span>
354
+ <span class='kw'>end</span>
355
+
356
+ <span class='comment'># Get @@io.
357
+ </span> <span class='kw'>def</span> <span class='const'>ComoCommon</span><span class='period'>.</span><span class='id identifier rubyid_getIo'>getIo</span>
358
+ <span class='cvar'>@@io</span>
359
+ <span class='kw'>end</span>
360
+ <span class='kw'>end</span>
361
+
362
+
363
+ <span class='comment'># User interface for Como.
364
+ </span> <span class='kw'>class</span> <span class='const'>Spec</span> <span class='op'>&lt;</span> <span class='const'>ComoCommon</span>
365
+
366
+ <span class='comment'># Create specification for program with subcmds.
367
+ </span> <span class='comment'>#
368
+ </span> <span class='comment'># @param author [String] Program author.
369
+ </span> <span class='comment'># @param year [String] Year (or dates) for program.
370
+ </span> <span class='comment'># @yield defs [] Subcmd definitions.
371
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_program'>program</span><span class='lparen'>(</span> <span class='id identifier rubyid_author'>author</span><span class='comma'>,</span> <span class='id identifier rubyid_year'>year</span><span class='comma'>,</span> <span class='id identifier rubyid_config'>config</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_defs'>defs</span> <span class='rparen'>)</span>
372
+ <span class='kw'>if</span> <span class='id identifier rubyid_config'>config</span>
373
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_configOverlay'>configOverlay</span><span class='lparen'>(</span> <span class='id identifier rubyid_config'>config</span> <span class='rparen'>)</span>
374
+ <span class='kw'>end</span>
375
+ <span class='id identifier rubyid_spec'>spec</span> <span class='op'>=</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='id identifier rubyid_author'>author</span><span class='comma'>,</span> <span class='id identifier rubyid_year'>year</span> <span class='rparen'>)</span>
376
+ <span class='id identifier rubyid_spec'>spec</span><span class='period'>.</span><span class='id identifier rubyid_instance_eval'>instance_eval</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_defs'>defs</span> <span class='rparen'>)</span>
377
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_check'>check</span><span class='lparen'>(</span> <span class='const'>ArgsParseState</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='cvar'>@@argv</span> <span class='rparen'>)</span> <span class='rparen'>)</span>
378
+ <span class='kw'>end</span>
379
+
380
+
381
+ <span class='comment'># The primary entry point to Como. Defines the command
382
+ </span> <span class='comment'># switches and parses the command line. Performs &quot;usage&quot;
383
+ </span> <span class='comment'># display if &quot;help&quot; was selected.
384
+ </span> <span class='comment'>#
385
+ </span> <span class='comment'># @param prog [String] Program (i.e. command) name.
386
+ </span> <span class='comment'># @param author [String] Author of the program.
387
+ </span> <span class='comment'># @param year [String] Year (or dates) for program.
388
+ </span> <span class='comment'># @param defs [Array&lt;Array&gt;] Option definitions.
389
+ </span> <span class='comment'># @param config [Hash] Option definition's behavioral config
390
+ </span> <span class='comment'># (changes @@config defaults).
391
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_command'>command</span><span class='lparen'>(</span> <span class='id identifier rubyid_prog'>prog</span><span class='comma'>,</span> <span class='id identifier rubyid_author'>author</span><span class='comma'>,</span> <span class='id identifier rubyid_year'>year</span><span class='comma'>,</span> <span class='id identifier rubyid_defs'>defs</span><span class='comma'>,</span> <span class='id identifier rubyid_config'>config</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span> <span class='rparen'>)</span>
392
+ <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_defineCheck'>defineCheck</span><span class='lparen'>(</span> <span class='id identifier rubyid_prog'>prog</span><span class='comma'>,</span> <span class='id identifier rubyid_author'>author</span><span class='comma'>,</span> <span class='id identifier rubyid_year'>year</span><span class='comma'>,</span> <span class='id identifier rubyid_defs'>defs</span><span class='comma'>,</span> <span class='id identifier rubyid_config'>config</span> <span class='rparen'>)</span>
393
+ <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_usage'>usage</span> <span class='kw'>if</span> <span class='const'>Opt</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>help</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span>
394
+ <span class='kw'>end</span>
395
+
396
+ <span class='comment'># Alias to Spec.command.
397
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_defineCheckHelp'>defineCheckHelp</span><span class='lparen'>(</span> <span class='id identifier rubyid_prog'>prog</span><span class='comma'>,</span> <span class='id identifier rubyid_author'>author</span><span class='comma'>,</span> <span class='id identifier rubyid_year'>year</span><span class='comma'>,</span> <span class='id identifier rubyid_defs'>defs</span><span class='comma'>,</span> <span class='id identifier rubyid_config'>config</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span> <span class='rparen'>)</span>
398
+ <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_command'>command</span><span class='lparen'>(</span> <span class='id identifier rubyid_prog'>prog</span><span class='comma'>,</span> <span class='id identifier rubyid_author'>author</span><span class='comma'>,</span> <span class='id identifier rubyid_year'>year</span><span class='comma'>,</span> <span class='id identifier rubyid_defs'>defs</span><span class='comma'>,</span> <span class='id identifier rubyid_config'>config</span> <span class='rparen'>)</span>
399
+ <span class='kw'>end</span>
400
+
401
+ <span class='comment'># Same as &quot;defineCheckHelp&quot; except without automatic &quot;help&quot;
402
+ </span> <span class='comment'># option processing.
403
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_defineCheck'>defineCheck</span><span class='lparen'>(</span> <span class='id identifier rubyid_prog'>prog</span><span class='comma'>,</span> <span class='id identifier rubyid_author'>author</span><span class='comma'>,</span> <span class='id identifier rubyid_year'>year</span><span class='comma'>,</span> <span class='id identifier rubyid_defs'>defs</span><span class='comma'>,</span> <span class='id identifier rubyid_config'>config</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span> <span class='rparen'>)</span>
404
+ <span class='id identifier rubyid_spec'>spec</span> <span class='op'>=</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='id identifier rubyid_author'>author</span><span class='comma'>,</span> <span class='id identifier rubyid_year'>year</span> <span class='rparen'>)</span>
405
+ <span class='id identifier rubyid_spec'>spec</span><span class='period'>.</span><span class='id identifier rubyid_subcmd'>subcmd</span><span class='lparen'>(</span> <span class='id identifier rubyid_prog'>prog</span><span class='comma'>,</span> <span class='id identifier rubyid_defs'>defs</span><span class='comma'>,</span> <span class='id identifier rubyid_config'>config</span> <span class='rparen'>)</span>
406
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_check'>check</span><span class='lparen'>(</span> <span class='const'>ArgsParseState</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='cvar'>@@argv</span> <span class='rparen'>)</span> <span class='rparen'>)</span>
407
+ <span class='kw'>end</span>
408
+
409
+
410
+ <span class='comment'># Create Spec object that can handle subcmd definitions.
411
+ </span> <span class='comment'>#
412
+ </span> <span class='comment'># @param author [String] Program author.
413
+ </span> <span class='comment'># @param year [String] Year (or dates) for program.
414
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span> <span class='id identifier rubyid_author'>author</span><span class='comma'>,</span> <span class='id identifier rubyid_year'>year</span> <span class='rparen'>)</span>
415
+ <span class='ivar'>@author</span> <span class='op'>=</span> <span class='id identifier rubyid_author'>author</span>
416
+ <span class='ivar'>@year</span> <span class='op'>=</span> <span class='id identifier rubyid_year'>year</span>
417
+
418
+ <span class='const'>Spec</span><span class='period'>.</span><span class='const'>ArgCheck</span><span class='lparen'>(</span> <span class='id identifier rubyid_author'>author</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span> <span class='op'>==</span> <span class='const'>String</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Author name is not a String</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
419
+ <span class='const'>Spec</span><span class='period'>.</span><span class='const'>ArgCheck</span><span class='lparen'>(</span> <span class='id identifier rubyid_year'>year</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span> <span class='op'>==</span> <span class='const'>String</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Year is not a String</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
420
+ <span class='kw'>end</span>
421
+
422
+
423
+ <span class='comment'># Define subcommand options.
424
+ </span> <span class='comment'>#
425
+ </span> <span class='comment'># @param cmd [String] Subcmd name.
426
+ </span> <span class='comment'># @param defs [Array&lt;Array&gt;] Option definition table.
427
+ </span> <span class='comment'># @param config [] Configuration options.
428
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_subcmd'>subcmd</span><span class='lparen'>(</span> <span class='id identifier rubyid_cmd'>cmd</span><span class='comma'>,</span> <span class='id identifier rubyid_defs'>defs</span><span class='comma'>,</span> <span class='id identifier rubyid_config'>config</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span> <span class='rparen'>)</span>
429
+
430
+ <span class='kw'>unless</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span>
431
+
432
+ <span class='id identifier rubyid_master'>master</span> <span class='op'>=</span> <span class='const'>MasterOpt</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='ivar'>@author</span><span class='comma'>,</span> <span class='ivar'>@year</span><span class='comma'>,</span>
433
+ <span class='id identifier rubyid_cmd'>cmd</span><span class='comma'>,</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='symbol'>:subcmd</span><span class='comma'>,</span> <span class='kw'>nil</span> <span class='rparen'>)</span>
434
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_setMaster'>setMaster</span><span class='lparen'>(</span> <span class='id identifier rubyid_master'>master</span> <span class='rparen'>)</span>
435
+ <span class='id identifier rubyid_subcmd'>subcmd</span> <span class='op'>=</span> <span class='id identifier rubyid_master'>master</span>
436
+
437
+ <span class='kw'>else</span>
438
+
439
+ <span class='id identifier rubyid_subcmd'>subcmd</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_findOpt'>findOpt</span><span class='lparen'>(</span> <span class='id identifier rubyid_cmd'>cmd</span> <span class='rparen'>)</span>
440
+
441
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_setSubcmd'>setSubcmd</span><span class='lparen'>(</span> <span class='id identifier rubyid_subcmd'>subcmd</span> <span class='rparen'>)</span>
442
+
443
+ <span class='const'>Spec</span><span class='period'>.</span><span class='const'>ArgCheck</span><span class='lparen'>(</span> <span class='kw'>false</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Subcommand \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_cmd'>cmd</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot; not defined.</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span> <span class='kw'>unless</span> <span class='id identifier rubyid_subcmd'>subcmd</span>
444
+
445
+ <span class='kw'>end</span>
446
+
447
+ <span class='comment'># Overlay user config on top of default.
448
+ </span> <span class='id identifier rubyid_subcmd'>subcmd</span><span class='period'>.</span><span class='id identifier rubyid_applyConfig'>applyConfig</span><span class='lparen'>(</span> <span class='id identifier rubyid_config'>config</span> <span class='rparen'>)</span>
449
+
450
+ <span class='kw'>if</span> <span class='id identifier rubyid_subcmd'>subcmd</span><span class='period'>.</span><span class='id identifier rubyid_config'>config</span><span class='lbracket'>[</span> <span class='symbol'>:autohelp</span> <span class='rbracket'>]</span>
451
+ <span class='comment'># Automatically add the help option.
452
+ </span> <span class='id identifier rubyid_defs'>defs</span><span class='period'>.</span><span class='id identifier rubyid_insert'>insert</span><span class='lparen'>(</span> <span class='int'>0</span><span class='comma'>,</span> <span class='lbracket'>[</span> <span class='symbol'>:silent</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>help</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>-h</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Display usage info.</span><span class='tstring_end'>&quot;</span></span> <span class='rbracket'>]</span> <span class='rparen'>)</span>
453
+ <span class='kw'>end</span>
454
+
455
+ <span class='id identifier rubyid_subcmd'>subcmd</span><span class='period'>.</span><span class='id identifier rubyid_setSubopt'>setSubopt</span><span class='lparen'>(</span> <span class='op'>*</span><span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_specify'>specify</span><span class='lparen'>(</span> <span class='id identifier rubyid_defs'>defs</span> <span class='rparen'>)</span> <span class='rparen'>)</span>
456
+ <span class='id identifier rubyid_subcmd'>subcmd</span>
457
+
458
+ <span class='kw'>end</span>
459
+
460
+
461
+ <span class='comment'># Specify and check options spec.
462
+ </span> <span class='comment'>#
463
+ </span> <span class='comment'># @param table [Array&lt;Array&gt;] Option definition table.
464
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_specify'>specify</span><span class='lparen'>(</span> <span class='id identifier rubyid_table'>table</span> <span class='rparen'>)</span>
465
+
466
+ <span class='id identifier rubyid_options'>options</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
467
+ <span class='id identifier rubyid_subcmds'>subcmds</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
468
+
469
+ <span class='comment'># Type checks for valid user input.
470
+ </span> <span class='const'>Spec</span><span class='period'>.</span><span class='const'>ArgCheck</span><span class='lparen'>(</span> <span class='id identifier rubyid_table'>table</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span> <span class='op'>==</span> <span class='const'>Array</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Option table is not an Array</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
471
+
472
+ <span class='id identifier rubyid_table'>table</span><span class='period'>.</span><span class='id identifier rubyid_each_index'>each_index</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_idx'>idx</span><span class='op'>|</span>
473
+
474
+ <span class='id identifier rubyid_i'>i</span> <span class='op'>=</span> <span class='id identifier rubyid_table'>table</span><span class='lbracket'>[</span> <span class='id identifier rubyid_idx'>idx</span> <span class='rbracket'>]</span>
475
+
476
+ <span class='const'>Spec</span><span class='period'>.</span><span class='const'>ArgCheck</span><span class='lparen'>(</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span> <span class='op'>==</span> <span class='const'>Array</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Option table entry is not an Array</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
477
+
478
+ <span class='kw'>if</span> <span class='id identifier rubyid_i'>i</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='symbol'>:default</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span> <span class='op'>==</span> <span class='int'>2</span>
479
+
480
+ <span class='comment'># Add 2 dummy entries for :default type if needed.
481
+ </span> <span class='id identifier rubyid_table'>table</span><span class='lbracket'>[</span> <span class='id identifier rubyid_idx'>idx</span> <span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbracket'>[</span> <span class='id identifier rubyid_i'>i</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='id identifier rubyid_i'>i</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span> <span class='rbracket'>]</span>
482
+
483
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_i'>i</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='symbol'>:subcmd</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span> <span class='op'>==</span> <span class='int'>3</span>
484
+
485
+ <span class='comment'># Add 1 dummy entry for :subcmd type if needed.
486
+ </span> <span class='id identifier rubyid_table'>table</span><span class='lbracket'>[</span> <span class='id identifier rubyid_idx'>idx</span> <span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbracket'>[</span> <span class='id identifier rubyid_i'>i</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_i'>i</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='id identifier rubyid_i'>i</span><span class='lbracket'>[</span><span class='int'>2</span><span class='rbracket'>]</span> <span class='rbracket'>]</span>
487
+ <span class='kw'>end</span>
488
+
489
+ <span class='const'>Spec</span><span class='period'>.</span><span class='const'>ArgCheck</span><span class='lparen'>(</span> <span class='id identifier rubyid_table'>table</span><span class='lbracket'>[</span> <span class='id identifier rubyid_idx'>idx</span> <span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span> <span class='op'>==</span> <span class='int'>4</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Option table entry length not 4</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
490
+ <span class='kw'>end</span>
491
+
492
+
493
+ <span class='id identifier rubyid_table'>table</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_e'>e</span><span class='op'>|</span>
494
+
495
+ <span class='kw'>if</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='symbol'>:subcmd</span>
496
+
497
+ <span class='id identifier rubyid_subcmds'>subcmds</span><span class='lbracket'>[</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span> <span class='rbracket'>]</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_subcmd'>subcmd</span><span class='lparen'>(</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>3</span><span class='rbracket'>]</span> <span class='rparen'>)</span>
498
+
499
+ <span class='kw'>else</span>
500
+
501
+ <span class='id identifier rubyid_option'>option</span> <span class='op'>=</span> <span class='kw'>nil</span>
502
+
503
+ <span class='kw'>case</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span>
504
+
505
+ <span class='kw'>when</span> <span class='symbol'>:switch</span>
506
+ <span class='id identifier rubyid_option'>option</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_switch'>switch</span><span class='lparen'>(</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>2</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>3</span><span class='rbracket'>]</span> <span class='rparen'>)</span>
507
+
508
+ <span class='kw'>when</span> <span class='symbol'>:exclusive</span>
509
+ <span class='id identifier rubyid_option'>option</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_exclusive'>exclusive</span><span class='lparen'>(</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>2</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>3</span><span class='rbracket'>]</span> <span class='rparen'>)</span>
510
+
511
+ <span class='kw'>when</span> <span class='symbol'>:silent</span>
512
+ <span class='id identifier rubyid_option'>option</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_exclusive'>exclusive</span><span class='lparen'>(</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>2</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>3</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='kw'>true</span> <span class='rparen'>)</span>
513
+
514
+ <span class='kw'>when</span> <span class='symbol'>:single</span><span class='comma'>,</span> <span class='symbol'>:multi</span><span class='comma'>,</span> <span class='symbol'>:opt_single</span><span class='comma'>,</span> <span class='symbol'>:opt_multi</span><span class='comma'>,</span> <span class='symbol'>:opt_any</span>
515
+ <span class='id identifier rubyid_option'>option</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_full'>full</span><span class='lparen'>(</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>1</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>2</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span><span class='comma'>,</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>3</span><span class='rbracket'>]</span> <span class='rparen'>)</span>
516
+
517
+ <span class='kw'>when</span> <span class='symbol'>:default</span>
518
+ <span class='id identifier rubyid_option'>option</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_defaultOpt'>defaultOpt</span><span class='lparen'>(</span> <span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>3</span><span class='rbracket'>]</span> <span class='rparen'>)</span>
519
+
520
+ <span class='kw'>else</span>
521
+ <span class='id identifier rubyid_raise'>raise</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Unknown option type: \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot;...</span><span class='tstring_end'>&quot;</span></span>
522
+ <span class='kw'>end</span>
523
+
524
+ <span class='id identifier rubyid_options'>options</span><span class='lbracket'>[</span> <span class='id identifier rubyid_option'>option</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span> <span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_option'>option</span>
525
+
526
+ <span class='kw'>end</span>
527
+
528
+ <span class='kw'>end</span>
529
+
530
+ <span class='lbracket'>[</span> <span class='id identifier rubyid_options'>options</span><span class='period'>.</span><span class='id identifier rubyid_values'>values</span><span class='comma'>,</span> <span class='id identifier rubyid_subcmds'>subcmds</span><span class='period'>.</span><span class='id identifier rubyid_values'>values</span> <span class='rbracket'>]</span>
531
+ <span class='kw'>end</span>
532
+
533
+
534
+ <span class='comment'># Command line options source.
535
+ </span> <span class='cvar'>@@argv</span> <span class='op'>=</span> <span class='const'>ARGV</span>
536
+
537
+ <span class='comment'># Set command line options source, i.e. @@argv (default: ARGV).
538
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_setArgv'>setArgv</span><span class='lparen'>(</span> <span class='id identifier rubyid_newArgv'>newArgv</span> <span class='rparen'>)</span>
539
+ <span class='cvar'>@@argv</span> <span class='op'>=</span> <span class='id identifier rubyid_newArgv'>newArgv</span>
540
+ <span class='kw'>end</span>
541
+
542
+ <span class='comment'># Display program usage (and optionally exit).
543
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_usage'>usage</span>
544
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_usage'>usage</span>
545
+ <span class='kw'>end</span>
546
+
547
+ <span class='comment'># Set optional header for &quot;usage&quot;.
548
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_setUsageHeader'>setUsageHeader</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
549
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_setUsageHeader'>setUsageHeader</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
550
+ <span class='kw'>end</span>
551
+
552
+
553
+ <span class='comment'># Set optional footer for &quot;usage&quot;.
554
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_setUsageFooter'>setUsageFooter</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
555
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_setUsageFooter'>setUsageFooter</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
556
+ <span class='kw'>end</span>
557
+
558
+
559
+ <span class='comment'># Check option combination rules.
560
+ </span> <span class='comment'>#
561
+ </span> <span class='comment'># @param opt [String] Opt name to which rules are set. If not
562
+ </span> <span class='comment'># given, Opt.current is used.
563
+ </span> <span class='comment'># @param rule [Proc] Rules to check.
564
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_checkRule'>checkRule</span><span class='lparen'>(</span> <span class='id identifier rubyid_opt'>opt</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
565
+ <span class='kw'>if</span> <span class='id identifier rubyid_opt'>opt</span>
566
+ <span class='id identifier rubyid_opt'>opt</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='lbracket'>[</span> <span class='id identifier rubyid_opt'>opt</span> <span class='rbracket'>]</span>
567
+ <span class='kw'>else</span>
568
+ <span class='id identifier rubyid_opt'>opt</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span>
569
+ <span class='kw'>end</span>
570
+ <span class='id identifier rubyid_opt'>opt</span><span class='period'>.</span><span class='id identifier rubyid_setRuleCheck'>setRuleCheck</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
571
+ <span class='id identifier rubyid_opt'>opt</span><span class='period'>.</span><span class='id identifier rubyid_checkRule'>checkRule</span>
572
+ <span class='kw'>end</span>
573
+
574
+
575
+ <span class='comment'># Check option combination rules.
576
+ </span> <span class='comment'>#
577
+ </span> <span class='comment'># @param opt [String] Opt name to which rules are set. If not
578
+ </span> <span class='comment'># given, Opt.current is used.
579
+ </span> <span class='comment'># @param rule [Proc] Rules to check.
580
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_checkRule'>checkRule</span><span class='lparen'>(</span> <span class='id identifier rubyid_opt'>opt</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
581
+ <span class='kw'>if</span> <span class='id identifier rubyid_opt'>opt</span>
582
+ <span class='id identifier rubyid_opt'>opt</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='lbracket'>[</span> <span class='id identifier rubyid_opt'>opt</span> <span class='rbracket'>]</span>
583
+ <span class='kw'>else</span>
584
+ <span class='id identifier rubyid_opt'>opt</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span>
585
+ <span class='kw'>end</span>
586
+ <span class='id identifier rubyid_opt'>opt</span><span class='period'>.</span><span class='id identifier rubyid_setRuleCheck'>setRuleCheck</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
587
+ <span class='kw'>end</span>
588
+
589
+ <span class='comment'># Additional option check.
590
+ </span> <span class='comment'># @param opt [String] Option name.
591
+ </span> <span class='comment'># @param error [String] Error string for false return values (from check).
592
+ </span> <span class='comment'># @param check [Proc] Checker proc run for the option. Either
593
+ </span> <span class='comment'># return false or generate an exception when errors found.
594
+ </span> <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='id identifier rubyid_checkAlso'>checkAlso</span><span class='lparen'>(</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='id identifier rubyid_error'>error</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_check'>check</span> <span class='rparen'>)</span>
595
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_checkAlso'>checkAlso</span><span class='lparen'>(</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='id identifier rubyid_error'>error</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_check'>check</span> <span class='rparen'>)</span>
596
+ <span class='kw'>end</span>
597
+
598
+
599
+ <span class='id identifier rubyid_private'>private</span>
600
+
601
+ <span class='kw'>def</span> <span class='const'>Spec</span><span class='period'>.</span><span class='const'>ArgCheck</span><span class='lparen'>(</span> <span class='id identifier rubyid_cond'>cond</span><span class='comma'>,</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
602
+ <span class='id identifier rubyid_raise'>raise</span><span class='lparen'>(</span> <span class='const'>ArgumentError</span><span class='comma'>,</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span> <span class='kw'>unless</span> <span class='id identifier rubyid_cond'>cond</span>
603
+ <span class='kw'>end</span>
604
+
605
+
606
+ <span class='kw'>end</span>
607
+
608
+
609
+
610
+
611
+ <span class='comment'># Opt includes all options spec information and parsed options
612
+ </span> <span class='comment'># and their values. Option instance is accessed with
613
+ </span> <span class='comment'># &quot;Opt['name']&quot;. The option status (Opt instance) can be
614
+ </span> <span class='comment'># queried with for example &quot;given&quot; and &quot;value&quot; methods.
615
+ </span> <span class='kw'>class</span> <span class='const'>Opt</span> <span class='op'>&lt;</span> <span class='const'>ComoCommon</span>
616
+
617
+
618
+ <span class='comment'># Create exception with capability to pass arbitrary data
619
+ </span> <span class='kw'>class</span> <span class='const'>ErrorWithData</span> <span class='op'>&lt;</span> <span class='const'>StandardError</span>
620
+ <span class='id identifier rubyid_attr_reader'>attr_reader</span> <span class='symbol'>:data</span>
621
+ <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span> <span class='id identifier rubyid_message'>message</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='id identifier rubyid_data'>data</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='rparen'>)</span>
622
+ <span class='kw'>super</span><span class='lparen'>(</span> <span class='id identifier rubyid_message'>message</span> <span class='rparen'>)</span>
623
+ <span class='ivar'>@data</span> <span class='op'>=</span> <span class='id identifier rubyid_data'>data</span>
624
+ <span class='kw'>end</span>
625
+ <span class='kw'>end</span>
626
+
627
+
628
+ <span class='comment'># Missing argument exception.
629
+ </span> <span class='kw'>class</span> <span class='const'>MissingArgument</span> <span class='op'>&lt;</span> <span class='const'>ErrorWithData</span><span class='semicolon'>;</span> <span class='kw'>end</span>
630
+
631
+ <span class='comment'># Invalid (non-existing) option exception.
632
+ </span> <span class='kw'>class</span> <span class='const'>InvalidOption</span> <span class='op'>&lt;</span> <span class='const'>ErrorWithData</span><span class='semicolon'>;</span> <span class='kw'>end</span>
633
+
634
+
635
+
636
+ <span class='comment'># ------------------------------------------------------------
637
+ </span> <span class='comment'># Option specification:
638
+ </span>
639
+
640
+ <span class='comment'># Program i.e. highest level subcommand.
641
+ </span> <span class='cvar'>@@master</span> <span class='op'>=</span> <span class='kw'>nil</span>
642
+
643
+ <span class='comment'># List of parsed option specs and option values.
644
+ </span> <span class='cvar'>@@opts</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
645
+
646
+ <span class='comment'># Current subcommand recorded.
647
+ </span> <span class='cvar'>@@subcmd</span> <span class='op'>=</span> <span class='kw'>nil</span>
648
+
649
+
650
+ <span class='comment'># Set of default configs for printout.
651
+ </span> <span class='cvar'>@@config</span> <span class='op'>=</span> <span class='lbrace'>{</span>
652
+ <span class='symbol'>:autohelp</span> <span class='op'>=&gt;</span> <span class='kw'>true</span><span class='comma'>,</span>
653
+ <span class='symbol'>:rulehelp</span> <span class='op'>=&gt;</span> <span class='kw'>false</span><span class='comma'>,</span>
654
+ <span class='symbol'>:header</span> <span class='op'>=&gt;</span> <span class='kw'>nil</span><span class='comma'>,</span>
655
+ <span class='symbol'>:footer</span> <span class='op'>=&gt;</span> <span class='kw'>nil</span><span class='comma'>,</span>
656
+ <span class='symbol'>:subcheck</span> <span class='op'>=&gt;</span> <span class='kw'>true</span><span class='comma'>,</span>
657
+ <span class='symbol'>:check</span> <span class='op'>=&gt;</span> <span class='kw'>true</span><span class='comma'>,</span>
658
+ <span class='symbol'>:tab</span> <span class='op'>=&gt;</span> <span class='int'>12</span><span class='comma'>,</span>
659
+ <span class='symbol'>:help_exit</span> <span class='op'>=&gt;</span> <span class='kw'>true</span><span class='comma'>,</span>
660
+ <span class='symbol'>:error_exit</span> <span class='op'>=&gt;</span> <span class='kw'>true</span><span class='comma'>,</span>
661
+ <span class='rbrace'>}</span>
662
+
663
+
664
+ <span class='comment'># Set master option.
665
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_setMaster'>setMaster</span><span class='lparen'>(</span> <span class='id identifier rubyid_master'>master</span> <span class='rparen'>)</span>
666
+ <span class='cvar'>@@master</span> <span class='op'>=</span> <span class='id identifier rubyid_master'>master</span>
667
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_setSubcmd'>setSubcmd</span><span class='lparen'>(</span> <span class='id identifier rubyid_master'>master</span> <span class='rparen'>)</span>
668
+ <span class='kw'>end</span>
669
+
670
+ <span class='comment'># Get master option.
671
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span>
672
+ <span class='cvar'>@@master</span>
673
+ <span class='kw'>end</span>
674
+
675
+
676
+ <span class='comment'># Add option to options list.
677
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_addOpt'>addOpt</span><span class='lparen'>(</span> <span class='id identifier rubyid_opt'>opt</span> <span class='rparen'>)</span>
678
+ <span class='cvar'>@@opts</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span> <span class='id identifier rubyid_opt'>opt</span>
679
+ <span class='kw'>end</span>
680
+
681
+
682
+ <span class='comment'># Set current subcmd.
683
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_setSubcmd'>setSubcmd</span><span class='lparen'>(</span> <span class='id identifier rubyid_opt'>opt</span> <span class='rparen'>)</span>
684
+ <span class='cvar'>@@subcmd</span> <span class='op'>=</span> <span class='id identifier rubyid_opt'>opt</span>
685
+ <span class='kw'>end</span>
686
+
687
+
688
+ <span class='comment'># Current subcmd processed.
689
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_current'>current</span>
690
+ <span class='cvar'>@@subcmd</span>
691
+ <span class='kw'>end</span>
692
+
693
+
694
+ <span class='comment'># Find option by name.
695
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_findOpt'>findOpt</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span> <span class='rparen'>)</span>
696
+ <span class='id identifier rubyid_idx'>idx</span> <span class='op'>=</span> <span class='cvar'>@@opts</span><span class='period'>.</span><span class='id identifier rubyid_index'>index</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span> <span class='op'>==</span> <span class='id identifier rubyid_name'>name</span> <span class='kw'>end</span>
697
+ <span class='kw'>if</span> <span class='id identifier rubyid_idx'>idx</span>
698
+ <span class='cvar'>@@opts</span><span class='lbracket'>[</span> <span class='id identifier rubyid_idx'>idx</span> <span class='rbracket'>]</span>
699
+ <span class='kw'>else</span>
700
+ <span class='kw'>nil</span>
701
+ <span class='kw'>end</span>
702
+ <span class='kw'>end</span>
703
+
704
+
705
+ <span class='comment'># Reset &quot;dynamic&quot; class members.
706
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_reset'>reset</span>
707
+ <span class='cvar'>@@opts</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
708
+ <span class='kw'>end</span>
709
+
710
+
711
+ <span class='comment'># Select option object by name. Master is searched first and
712
+ </span> <span class='comment'># then the flattened list of all options.
713
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='op'>[]</span><span class='lparen'>(</span><span class='id identifier rubyid_str'>str</span><span class='rparen'>)</span>
714
+
715
+ <span class='comment'># Search Master first.
716
+ </span> <span class='id identifier rubyid_ret'>ret</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_argByName'>argByName</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
717
+
718
+ <span class='kw'>unless</span> <span class='id identifier rubyid_ret'>ret</span>
719
+ <span class='id identifier rubyid_ret'>ret</span> <span class='op'>=</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_findOpt'>findOpt</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
720
+ <span class='kw'>unless</span> <span class='id identifier rubyid_ret'>ret</span>
721
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>RuntimeError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Option \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_str'>str</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot; does not exist...</span><span class='tstring_end'>&quot;</span></span>
722
+ <span class='kw'>end</span>
723
+ <span class='kw'>end</span>
724
+
725
+ <span class='id identifier rubyid_ret'>ret</span>
726
+ <span class='kw'>end</span>
727
+
728
+
729
+ <span class='comment'># Return program name.
730
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_progname'>progname</span>
731
+ <span class='cvar'>@@master</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span>
732
+ <span class='kw'>end</span>
733
+
734
+
735
+ <span class='comment'># Return program year.
736
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_year'>year</span>
737
+ <span class='cvar'>@@master</span><span class='period'>.</span><span class='id identifier rubyid_year'>year</span>
738
+ <span class='kw'>end</span>
739
+
740
+
741
+ <span class='comment'># Return author.
742
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_author'>author</span>
743
+ <span class='cvar'>@@master</span><span class='period'>.</span><span class='id identifier rubyid_author'>author</span>
744
+ <span class='kw'>end</span>
745
+
746
+
747
+ <span class='comment'># Return arguments (options) that are specified as command
748
+ </span> <span class='comment'># external (i.e. after '--').
749
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_external'>external</span>
750
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_external'>external</span>
751
+ <span class='kw'>end</span>
752
+
753
+
754
+ <span class='comment'># Return arguments (options) that have no switch.
755
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_default'>default</span>
756
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_default'>default</span>
757
+ <span class='kw'>end</span>
758
+
759
+
760
+ <span class='comment'># Create option spec.
761
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_full'>full</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='id identifier rubyid_type'>type</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>No doc.</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
762
+ <span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='id identifier rubyid_type'>type</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span> <span class='rparen'>)</span>
763
+ <span class='kw'>end</span>
764
+
765
+ <span class='comment'># Create sub-command option spec.
766
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_subcmd'>subcmd</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>No doc.</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
767
+ <span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='symbol'>:subcmd</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span><span class='comma'>,</span> <span class='kw'>false</span> <span class='rparen'>)</span>
768
+ <span class='kw'>end</span>
769
+
770
+ <span class='comment'># Create switch option spec.
771
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_switch'>switch</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>No doc.</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
772
+ <span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='symbol'>:switch</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span><span class='comma'>,</span> <span class='kw'>false</span> <span class='rparen'>)</span>
773
+ <span class='kw'>end</span>
774
+
775
+ <span class='comment'># Create exclusive option spec.
776
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_exclusive'>exclusive</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>No doc.</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='id identifier rubyid_silent'>silent</span> <span class='op'>=</span> <span class='kw'>false</span> <span class='rparen'>)</span>
777
+ <span class='id identifier rubyid_o'>o</span> <span class='op'>=</span> <span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='symbol'>:exclusive</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span><span class='comma'>,</span> <span class='kw'>false</span> <span class='rparen'>)</span>
778
+ <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_silent'>silent</span> <span class='op'>=</span> <span class='id identifier rubyid_silent'>silent</span>
779
+ <span class='id identifier rubyid_o'>o</span>
780
+ <span class='kw'>end</span>
781
+
782
+ <span class='comment'># Create default option spec, no switch.
783
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_defaultOpt'>defaultOpt</span><span class='lparen'>(</span> <span class='id identifier rubyid_doc'>doc</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>No doc.</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
784
+ <span class='comment'>#new( nil, &quot;&lt;args&gt;&quot;, :default, doc, [] )
785
+ </span> <span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&lt;default&gt;</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&lt;args&gt;</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='symbol'>:default</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span><span class='comma'>,</span> <span class='lbracket'>[</span><span class='rbracket'>]</span> <span class='rparen'>)</span>
786
+ <span class='kw'>end</span>
787
+
788
+ <span class='comment'># Options iterator for all options.
789
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_blk'>blk</span> <span class='rparen'>)</span>
790
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='op'>&amp;</span><span class='id identifier rubyid_blk'>blk</span>
791
+ <span class='kw'>end</span>
792
+
793
+ <span class='comment'># Options iterator for given options.
794
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_each_given'>each_given</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_blk'>blk</span> <span class='rparen'>)</span>
795
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_each_given'>each_given</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_blk'>blk</span> <span class='rparen'>)</span>
796
+ <span class='kw'>end</span>
797
+
798
+ <span class='comment'># Overlay Opt default configuration options.
799
+ </span> <span class='kw'>def</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_configOverlay'>configOverlay</span><span class='lparen'>(</span> <span class='id identifier rubyid_config'>config</span> <span class='rparen'>)</span>
800
+ <span class='cvar'>@@config</span><span class='period'>.</span><span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span> <span class='id identifier rubyid_config'>config</span> <span class='rparen'>)</span>
801
+ <span class='kw'>end</span>
802
+
803
+
804
+ <span class='comment'># ------------------------------------------------------------
805
+ </span> <span class='comment'># Opt properties:
806
+ </span>
807
+
808
+ <span class='comment'># Subcommand parent (i.e. host).
809
+ </span> <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:parent</span>
810
+
811
+
812
+ <span class='comment'># Option name.
813
+ </span> <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:name</span>
814
+
815
+ <span class='comment'># Short option string.
816
+ </span> <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:opt</span>
817
+
818
+ <span class='comment'># Long option string.
819
+ </span> <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:longOpt</span>
820
+
821
+ <span class='comment'># Option type.
822
+ </span> <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:type</span>
823
+
824
+ <span class='comment'># Option value.
825
+ </span> <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:value</span>
826
+
827
+ <span class='comment'># Option documentation string.
828
+ </span> <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:doc</span>
829
+
830
+ <span class='comment'># Is option specified?
831
+ </span> <span class='id identifier rubyid_attr_writer'>attr_writer</span> <span class='symbol'>:given</span>
832
+
833
+ <span class='comment'># Is option hidden (usage).
834
+ </span> <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:silent</span>
835
+
836
+ <span class='comment'># List of suboptions.
837
+ </span> <span class='id identifier rubyid_attr_reader'>attr_reader</span> <span class='symbol'>:subopt</span>
838
+
839
+ <span class='comment'># List of subcommands.
840
+ </span> <span class='id identifier rubyid_attr_reader'>attr_reader</span> <span class='symbol'>:subcmd</span>
841
+
842
+ <span class='comment'># Opt configuration.
843
+ </span> <span class='id identifier rubyid_attr_reader'>attr_reader</span> <span class='symbol'>:config</span>
844
+
845
+ <span class='comment'># Opt rules.
846
+ </span> <span class='id identifier rubyid_attr_reader'>attr_reader</span> <span class='symbol'>:rules</span>
847
+
848
+
849
+ <span class='comment'># Create Opt object:
850
+ </span> <span class='comment'># [name] Option name string.
851
+ </span> <span class='comment'># [opt] Switch string.
852
+ </span> <span class='comment'># [type] Option type. One of:
853
+ </span> <span class='comment'># * :switch
854
+ </span> <span class='comment'># * :single
855
+ </span> <span class='comment'># * :multi
856
+ </span> <span class='comment'># * :opt_single
857
+ </span> <span class='comment'># * :opt_multi
858
+ </span> <span class='comment'># * :opt_any
859
+ </span> <span class='comment'># * :default
860
+ </span> <span class='comment'># * :exclusive
861
+ </span> <span class='comment'># * :silent
862
+ </span> <span class='comment'># [doc] Option documentation.
863
+ </span> <span class='comment'># [value] Default value.
864
+ </span>
865
+ <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='id identifier rubyid_type'>type</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='rparen'>)</span>
866
+ <span class='ivar'>@parent</span> <span class='op'>=</span> <span class='kw'>nil</span>
867
+ <span class='ivar'>@name</span> <span class='op'>=</span> <span class='id identifier rubyid_name'>name</span>
868
+ <span class='ivar'>@opt</span> <span class='op'>=</span> <span class='id identifier rubyid_opt'>opt</span>
869
+ <span class='ivar'>@longOpt</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>--</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_name'>name</span><span class='rbrace'>}</span><span class='tstring_end'>&quot;</span></span>
870
+ <span class='ivar'>@type</span> <span class='op'>=</span> <span class='id identifier rubyid_type'>type</span>
871
+ <span class='ivar'>@value</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
872
+ <span class='ivar'>@doc</span> <span class='op'>=</span> <span class='id identifier rubyid_doc'>doc</span>
873
+ <span class='ivar'>@silent</span> <span class='op'>=</span> <span class='kw'>false</span>
874
+ <span class='comment'># Whether option was set or not.
875
+ </span> <span class='ivar'>@given</span> <span class='op'>=</span> <span class='kw'>false</span>
876
+ <span class='ivar'>@subopt</span> <span class='op'>=</span> <span class='kw'>nil</span>
877
+ <span class='ivar'>@subcmd</span> <span class='op'>=</span> <span class='kw'>nil</span>
878
+ <span class='ivar'>@rules</span> <span class='op'>=</span> <span class='kw'>nil</span>
879
+
880
+ <span class='ivar'>@config</span> <span class='op'>=</span> <span class='cvar'>@@config</span><span class='period'>.</span><span class='id identifier rubyid_dup'>dup</span>
881
+
882
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_addOpt'>addOpt</span><span class='lparen'>(</span> <span class='kw'>self</span> <span class='rparen'>)</span>
883
+ <span class='kw'>end</span>
884
+
885
+
886
+ <span class='comment'># Set subcommand suboptions.
887
+ </span> <span class='comment'>#
888
+ </span> <span class='comment'># @param opts [Array&lt;Opt&gt;]
889
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_setSubopt'>setSubopt</span><span class='lparen'>(</span> <span class='id identifier rubyid_opts'>opts</span><span class='comma'>,</span> <span class='id identifier rubyid_subs'>subs</span> <span class='rparen'>)</span>
890
+ <span class='id identifier rubyid_opts'>opts</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
891
+ <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_parent'>parent</span> <span class='op'>=</span> <span class='kw'>self</span>
892
+ <span class='kw'>end</span>
893
+
894
+ <span class='id identifier rubyid_subs'>subs</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
895
+ <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_parent'>parent</span> <span class='op'>=</span> <span class='kw'>self</span>
896
+ <span class='kw'>end</span>
897
+
898
+ <span class='ivar'>@subopt</span> <span class='op'>=</span> <span class='id identifier rubyid_opts'>opts</span>
899
+ <span class='ivar'>@subcmd</span> <span class='op'>=</span> <span class='id identifier rubyid_subs'>subs</span>
900
+ <span class='kw'>end</span>
901
+
902
+
903
+ <span class='comment'># Merge config to base config.
904
+ </span> <span class='comment'>#
905
+ </span> <span class='comment'># @param config [Hash] Configuration Hash to merge.
906
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_applyConfig'>applyConfig</span><span class='lparen'>(</span> <span class='id identifier rubyid_config'>config</span> <span class='rparen'>)</span>
907
+ <span class='ivar'>@config</span><span class='period'>.</span><span class='id identifier rubyid_merge!'>merge!</span><span class='lparen'>(</span> <span class='id identifier rubyid_config'>config</span> <span class='rparen'>)</span>
908
+ <span class='kw'>end</span>
909
+
910
+
911
+ <span class='comment'># Set rule checks for the option.
912
+ </span> <span class='comment'>#
913
+ </span> <span class='comment'># @param rule [Proc] Rule to check after command line parsing.
914
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_setRuleCheck'>setRuleCheck</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
915
+ <span class='ivar'>@rules</span> <span class='op'>=</span> <span class='id identifier rubyid_rule'>rule</span>
916
+ <span class='kw'>end</span>
917
+
918
+
919
+ <span class='comment'># ------------------------------------------------------------
920
+ </span> <span class='comment'># Command line parsing and checking:
921
+ </span>
922
+ <span class='comment'># Check provided args.
923
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_check'>check</span><span class='lparen'>(</span> <span class='id identifier rubyid_argsState'>argsState</span> <span class='rparen'>)</span>
924
+
925
+ <span class='comment'># Start at top.
926
+ </span> <span class='id identifier rubyid_top'>top</span> <span class='op'>=</span> <span class='kw'>self</span>
927
+
928
+ <span class='kw'>begin</span>
929
+
930
+ <span class='comment'># Parse and check for invalid arguments.
931
+ </span> <span class='kw'>begin</span>
932
+ <span class='id identifier rubyid_top'>top</span> <span class='op'>=</span> <span class='id identifier rubyid_top'>top</span><span class='period'>.</span><span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span> <span class='id identifier rubyid_argsState'>argsState</span><span class='comma'>,</span> <span class='id identifier rubyid_top'>top</span><span class='period'>.</span><span class='id identifier rubyid_config'>config</span><span class='lbracket'>[</span> <span class='symbol'>:check</span> <span class='rbracket'>]</span> <span class='rparen'>)</span>
933
+ <span class='kw'>end</span> <span class='kw'>while</span><span class='lparen'>(</span> <span class='id identifier rubyid_top'>top</span> <span class='rparen'>)</span>
934
+
935
+ <span class='comment'># Check for any missing valid arguments.
936
+ </span> <span class='id identifier rubyid_checkMissing'>checkMissing</span>
937
+
938
+ <span class='kw'>rescue</span> <span class='const'>Opt</span><span class='op'>::</span><span class='const'>MissingArgument</span><span class='comma'>,</span> <span class='const'>Opt</span><span class='op'>::</span><span class='const'>InvalidOption</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_err'>err</span>
939
+
940
+ <span class='cvar'>@@io</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span>
941
+
942
+ <span class='id identifier rubyid_error'>error</span><span class='lparen'>(</span> <span class='id identifier rubyid_err'>err</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span> <span class='rparen'>)</span>
943
+
944
+ <span class='comment'># Display subcmd specific usage info.
945
+ </span> <span class='id identifier rubyid_err'>err</span><span class='period'>.</span><span class='id identifier rubyid_data'>data</span><span class='period'>.</span><span class='id identifier rubyid_usage'>usage</span>
946
+
947
+ <span class='id identifier rubyid_exit'>exit</span><span class='lparen'>(</span> <span class='int'>1</span> <span class='rparen'>)</span> <span class='kw'>if</span> <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_config'>config</span><span class='lbracket'>[</span> <span class='symbol'>:error_exit</span> <span class='rbracket'>]</span>
948
+
949
+ <span class='kw'>end</span>
950
+
951
+ <span class='comment'># Revert back to top after hierarchy travelsal.
952
+ </span> <span class='id identifier rubyid_usageIfHelp'>usageIfHelp</span>
953
+
954
+ <span class='comment'># Check rules.
955
+ </span> <span class='id identifier rubyid_cur'>cur</span> <span class='op'>=</span> <span class='kw'>self</span>
956
+ <span class='kw'>while</span> <span class='id identifier rubyid_cur'>cur</span>
957
+ <span class='id identifier rubyid_cur'>cur</span><span class='period'>.</span><span class='id identifier rubyid_checkRule'>checkRule</span>
958
+ <span class='id identifier rubyid_cur'>cur</span> <span class='op'>=</span> <span class='id identifier rubyid_cur'>cur</span><span class='period'>.</span><span class='id identifier rubyid_givenSubcmd'>givenSubcmd</span>
959
+ <span class='kw'>end</span>
960
+
961
+ <span class='kw'>self</span>
962
+ <span class='kw'>end</span>
963
+
964
+
965
+
966
+ <span class='comment'># Parse cmdline options from args.
967
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_parse'>parse</span><span class='lparen'>(</span> <span class='id identifier rubyid_args'>args</span><span class='comma'>,</span> <span class='id identifier rubyid_checkInvalids'>checkInvalids</span> <span class='op'>=</span> <span class='kw'>true</span> <span class='rparen'>)</span>
968
+
969
+ <span class='kw'>while</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span>
970
+
971
+ <span class='comment'>#puts &quot;Opt.parse (#{@name}): #{args.get}&quot;
972
+ </span>
973
+ <span class='kw'>if</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_isOptTerm'>isOptTerm</span>
974
+
975
+ <span class='comment'># Rest of the args do not belong to this program.
976
+ </span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_next'>next</span>
977
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_master'>master</span><span class='period'>.</span><span class='id identifier rubyid_external'>external</span> <span class='op'>=</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_rest'>rest</span>
978
+ <span class='kw'>break</span>
979
+
980
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_isOpt'>isOpt</span>
981
+
982
+ <span class='id identifier rubyid_o'>o</span> <span class='op'>=</span> <span class='id identifier rubyid_findOpt'>findOpt</span><span class='lparen'>(</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span> <span class='rparen'>)</span>
983
+
984
+ <span class='kw'>if</span> <span class='op'>!</span><span class='id identifier rubyid_o'>o</span>
985
+ <span class='kw'>if</span> <span class='id identifier rubyid_checkInvalids'>checkInvalids</span>
986
+ <span class='id identifier rubyid_raise'>raise</span> \
987
+ <span class='const'>InvalidOption</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Unknown option \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot;...</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
988
+ <span class='kw'>self</span> <span class='rparen'>)</span>
989
+ <span class='kw'>else</span>
990
+ <span class='id identifier rubyid_o'>o</span> <span class='op'>=</span> <span class='id identifier rubyid_findOpt'>findOpt</span><span class='lparen'>(</span> <span class='kw'>nil</span> <span class='rparen'>)</span>
991
+ <span class='kw'>if</span> <span class='op'>!</span><span class='id identifier rubyid_o'>o</span>
992
+ <span class='id identifier rubyid_raise'>raise</span> \
993
+ <span class='const'>InvalidOption</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
994
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>No default option specified for \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot;...</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
995
+ <span class='kw'>self</span> <span class='rparen'>)</span>
996
+ <span class='kw'>else</span>
997
+ <span class='comment'># Default option.
998
+ </span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_toValue'>toValue</span>
999
+ <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_next'>next</span>
1000
+ <span class='kw'>end</span>
1001
+ <span class='kw'>end</span>
1002
+
1003
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_o'>o</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_hasArg'>hasArg</span>
1004
+
1005
+ <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_next'>next</span>
1006
+
1007
+ <span class='kw'>if</span> <span class='lparen'>(</span> <span class='op'>!</span><span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span> <span class='op'>||</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_isOpt'>isOpt</span> <span class='rparen'>)</span> <span class='op'>&amp;&amp;</span>
1008
+ <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_type'>type</span> <span class='op'>!=</span> <span class='symbol'>:opt_any</span>
1009
+
1010
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>MissingArgument</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
1011
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>No argument given for \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_opt'>opt</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot;...</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
1012
+ <span class='kw'>self</span> <span class='rparen'>)</span>
1013
+
1014
+ <span class='kw'>else</span>
1015
+
1016
+ <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_hasMany'>hasMany</span>
1017
+
1018
+ <span class='comment'># Get all argument for multi-option.
1019
+ </span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_value'>value</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span> <span class='kw'>if</span> <span class='op'>!</span><span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span>
1020
+ <span class='kw'>while</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span> <span class='op'>&amp;&amp;</span> <span class='op'>!</span><span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_isOpt'>isOpt</span>
1021
+ <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_toValue'>toValue</span>
1022
+ <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_next'>next</span>
1023
+ <span class='kw'>end</span>
1024
+
1025
+ <span class='kw'>else</span>
1026
+
1027
+ <span class='comment'># Get one argument for single-option.
1028
+ </span>
1029
+ <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span>
1030
+ <span class='id identifier rubyid_raise'>raise</span> \
1031
+ <span class='const'>InvalidOption</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
1032
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Too many arguments for option (\&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot;)...</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
1033
+ <span class='kw'>self</span> <span class='rparen'>)</span>
1034
+ <span class='kw'>else</span>
1035
+ <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_value'>value</span> <span class='op'>=</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_toValue'>toValue</span>
1036
+ <span class='kw'>end</span>
1037
+ <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_next'>next</span>
1038
+ <span class='kw'>end</span>
1039
+ <span class='kw'>end</span>
1040
+
1041
+ <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span> <span class='op'>=</span> <span class='kw'>true</span>
1042
+
1043
+ <span class='kw'>else</span>
1044
+
1045
+ <span class='kw'>if</span> <span class='op'>!</span><span class='id identifier rubyid_o'>o</span>
1046
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>InvalidOption</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>No valid options specified...</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
1047
+ <span class='kw'>self</span> <span class='rparen'>)</span>
1048
+ <span class='kw'>else</span>
1049
+ <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_value'>value</span> <span class='op'>=</span> <span class='op'>!</span><span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_value'>value</span> <span class='kw'>if</span> <span class='op'>!</span><span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span>
1050
+ <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span> <span class='op'>=</span> <span class='kw'>true</span>
1051
+ <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_next'>next</span>
1052
+ <span class='kw'>end</span>
1053
+ <span class='kw'>end</span>
1054
+
1055
+ <span class='kw'>else</span>
1056
+
1057
+ <span class='comment'># Subcmd or default. Check for Subcmd first.
1058
+ </span>
1059
+ <span class='comment'># Search for Subcmd.
1060
+ </span> <span class='id identifier rubyid_o'>o</span> <span class='op'>=</span> <span class='id identifier rubyid_findOpt'>findOpt</span><span class='lparen'>(</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span> <span class='rparen'>)</span>
1061
+
1062
+ <span class='kw'>if</span> <span class='op'>!</span><span class='id identifier rubyid_o'>o</span>
1063
+
1064
+ <span class='comment'># Search for default option.
1065
+ </span> <span class='id identifier rubyid_o'>o</span> <span class='op'>=</span> <span class='id identifier rubyid_findOpt'>findOpt</span><span class='lparen'>(</span> <span class='kw'>nil</span> <span class='rparen'>)</span>
1066
+ <span class='kw'>if</span> <span class='op'>!</span><span class='id identifier rubyid_o'>o</span>
1067
+ <span class='id identifier rubyid_raise'>raise</span> \
1068
+ <span class='const'>InvalidOption</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
1069
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>No default option specified for \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_get'>get</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot;...</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
1070
+ <span class='kw'>self</span> <span class='rparen'>)</span>
1071
+ <span class='kw'>else</span>
1072
+ <span class='comment'># Default option.
1073
+ </span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span> <span class='op'>=</span> <span class='kw'>true</span>
1074
+ <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_value'>value</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_toValue'>toValue</span>
1075
+ <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_next'>next</span>
1076
+ <span class='kw'>end</span>
1077
+
1078
+ <span class='kw'>else</span>
1079
+
1080
+ <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span> <span class='op'>=</span> <span class='kw'>true</span>
1081
+ <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_next'>next</span>
1082
+ <span class='kw'>return</span> <span class='id identifier rubyid_o'>o</span>
1083
+
1084
+ <span class='kw'>end</span>
1085
+
1086
+ <span class='kw'>end</span>
1087
+ <span class='kw'>end</span>
1088
+
1089
+ <span class='kw'>nil</span>
1090
+ <span class='kw'>end</span>
1091
+
1092
+
1093
+ <span class='comment'># Check for any non-given required arguments recursively
1094
+ </span> <span class='comment'># through hierarchy of subcommands. MissingArgument Exception
1095
+ </span> <span class='comment'># is generated if argument is missing.
1096
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_checkMissing'>checkMissing</span>
1097
+
1098
+ <span class='comment'># Full cmd name.
1099
+ </span> <span class='id identifier rubyid_cmd'>cmd</span> <span class='op'>=</span> <span class='lparen'>(</span> <span class='id identifier rubyid_getParents'>getParents</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span> <span class='kw'>end</span> <span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'> </span><span class='tstring_end'>'</span></span> <span class='rparen'>)</span>
1100
+
1101
+ <span class='comment'># Check for any exclusive args first.
1102
+ </span> <span class='ivar'>@subopt</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1103
+ <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_type'>type</span> <span class='op'>==</span> <span class='symbol'>:exclusive</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span>
1104
+ <span class='kw'>return</span>
1105
+ <span class='kw'>end</span>
1106
+ <span class='kw'>end</span>
1107
+
1108
+
1109
+ <span class='comment'># Check for required arguments for this level before
1110
+ </span> <span class='comment'># subcmds.
1111
+ </span> <span class='ivar'>@subopt</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1112
+ <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_isRequired'>isRequired</span>
1113
+ <span class='kw'>unless</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span>
1114
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>MissingArgument</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
1115
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Option \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_opt'>opt</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot; missing for \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_cmd'>cmd</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot;...</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
1116
+ <span class='kw'>self</span> <span class='rparen'>)</span>
1117
+ <span class='kw'>end</span>
1118
+ <span class='kw'>end</span>
1119
+ <span class='kw'>end</span>
1120
+
1121
+ <span class='kw'>if</span> <span class='ivar'>@config</span><span class='lbracket'>[</span> <span class='symbol'>:subcheck</span> <span class='rbracket'>]</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_hasSubcmd'>hasSubcmd</span>
1122
+ <span class='comment'># Compulsory Subcommand checking enabled.
1123
+ </span> <span class='id identifier rubyid_subcmdGiven'>subcmdGiven</span> <span class='op'>=</span> <span class='kw'>false</span>
1124
+ <span class='kw'>else</span>
1125
+ <span class='id identifier rubyid_subcmdGiven'>subcmdGiven</span> <span class='op'>=</span> <span class='kw'>true</span>
1126
+ <span class='kw'>end</span>
1127
+
1128
+ <span class='comment'># Check for any subcmd args.
1129
+ </span> <span class='id identifier rubyid_sub'>sub</span> <span class='op'>=</span> <span class='id identifier rubyid_givenSubcmd'>givenSubcmd</span>
1130
+ <span class='kw'>if</span> <span class='id identifier rubyid_sub'>sub</span>
1131
+ <span class='id identifier rubyid_subcmdGiven'>subcmdGiven</span> <span class='op'>=</span> <span class='kw'>true</span>
1132
+ <span class='comment'># Use recursion to examine the next level.
1133
+ </span> <span class='kw'>return</span> <span class='id identifier rubyid_sub'>sub</span><span class='period'>.</span><span class='id identifier rubyid_checkMissing'>checkMissing</span>
1134
+ <span class='kw'>end</span>
1135
+
1136
+ <span class='comment'># If no subcmds are given, issue error.
1137
+ </span> <span class='id identifier rubyid_raise'>raise</span> <span class='const'>MissingArgument</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span>
1138
+ <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Subcommand required for \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_cmd'>cmd</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot;...</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span>
1139
+ <span class='kw'>self</span> <span class='rparen'>)</span> <span class='kw'>unless</span> <span class='id identifier rubyid_subcmdGiven'>subcmdGiven</span>
1140
+
1141
+ <span class='kw'>end</span>
1142
+
1143
+
1144
+
1145
+ <span class='comment'># Check option combination rules.
1146
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_checkRule'>checkRule</span>
1147
+
1148
+ <span class='kw'>return</span> <span class='kw'>unless</span> <span class='ivar'>@rules</span>
1149
+
1150
+ <span class='kw'>begin</span>
1151
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>Opt</span><span class='op'>::</span><span class='const'>InvalidOption</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Option combination mismatch!</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='kw'>self</span> <span class='rparen'>)</span> <span class='kw'>unless</span>
1152
+ <span class='const'>RuleCheck</span><span class='period'>.</span><span class='id identifier rubyid_check'>check</span><span class='lparen'>(</span> <span class='kw'>self</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='ivar'>@rules</span> <span class='rparen'>)</span>
1153
+
1154
+ <span class='kw'>rescue</span> <span class='const'>Opt</span><span class='op'>::</span><span class='const'>MissingArgument</span><span class='comma'>,</span> <span class='const'>Opt</span><span class='op'>::</span><span class='const'>InvalidOption</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_err'>err</span>
1155
+ <span class='cvar'>@@io</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span>
1156
+ <span class='id identifier rubyid_error'>error</span><span class='lparen'>(</span> <span class='id identifier rubyid_err'>err</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span> <span class='rparen'>)</span>
1157
+
1158
+ <span class='id identifier rubyid_usage'>usage</span><span class='lparen'>(</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='kw'>true</span> <span class='rparen'>)</span>
1159
+
1160
+ <span class='comment'># Included in
1161
+ </span><span class='comment'># # Display the possible combination:
1162
+ </span><span class='comment'># @@io.puts &quot;\n Option combinations:\n\n&quot;
1163
+ </span><span class='comment'># RuleDisplay.print( &amp;@rules )
1164
+ </span>
1165
+ <span class='kw'>end</span>
1166
+ <span class='kw'>end</span>
1167
+
1168
+
1169
+ <span class='comment'># Additional option check.
1170
+ </span> <span class='comment'># @param opt [String] Option name.
1171
+ </span> <span class='comment'># @param error [String] Error string for false return values (from check).
1172
+ </span> <span class='comment'># @param check [Proc] Checker proc run for the option. Either
1173
+ </span> <span class='comment'># return false or generate an exception when errors found.
1174
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_checkAlso'>checkAlso</span><span class='lparen'>(</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='id identifier rubyid_error'>error</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_check'>check</span> <span class='rparen'>)</span>
1175
+ <span class='kw'>begin</span>
1176
+ <span class='kw'>if</span> <span class='kw'>self</span><span class='lbracket'>[</span><span class='id identifier rubyid_opt'>opt</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_evalCheck'>evalCheck</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_check'>check</span> <span class='rparen'>)</span> <span class='op'>!=</span> <span class='kw'>true</span>
1177
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>Opt</span><span class='op'>::</span><span class='const'>InvalidOption</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='id identifier rubyid_error'>error</span><span class='comma'>,</span> <span class='kw'>self</span> <span class='rparen'>)</span>
1178
+ <span class='kw'>end</span>
1179
+ <span class='kw'>rescue</span> <span class='const'>Opt</span><span class='op'>::</span><span class='const'>MissingArgument</span><span class='comma'>,</span> <span class='const'>Opt</span><span class='op'>::</span><span class='const'>InvalidOption</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_err'>err</span>
1180
+ <span class='cvar'>@@io</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span>
1181
+ <span class='id identifier rubyid_error'>error</span><span class='lparen'>(</span> <span class='id identifier rubyid_err'>err</span><span class='period'>.</span><span class='id identifier rubyid_to_s'>to_s</span> <span class='rparen'>)</span>
1182
+ <span class='id identifier rubyid_err'>err</span><span class='period'>.</span><span class='id identifier rubyid_data'>data</span><span class='period'>.</span><span class='id identifier rubyid_usage'>usage</span>
1183
+ <span class='id identifier rubyid_exit'>exit</span><span class='lparen'>(</span> <span class='int'>1</span> <span class='rparen'>)</span>
1184
+ <span class='kw'>end</span>
1185
+ <span class='kw'>end</span>
1186
+
1187
+
1188
+
1189
+
1190
+ <span class='comment'># ------------------------------------------------------------
1191
+ </span> <span class='comment'># Opt query user interface:
1192
+ </span>
1193
+ <span class='comment'># Select option object by name operator.
1194
+ </span> <span class='kw'>def</span> <span class='op'>[]</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1195
+ <span class='id identifier rubyid_ret'>ret</span> <span class='op'>=</span> <span class='id identifier rubyid_argByName'>argByName</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1196
+ <span class='kw'>unless</span> <span class='id identifier rubyid_ret'>ret</span>
1197
+ <span class='id identifier rubyid_raise'>raise</span> <span class='const'>RuntimeError</span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Subopt \&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_str'>str</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot; does not exist for \&quot;</span><span class='embexpr_beg'>#{</span><span class='ivar'>@name</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot;!</span><span class='tstring_end'>&quot;</span></span>
1198
+ <span class='kw'>end</span>
1199
+ <span class='id identifier rubyid_ret'>ret</span>
1200
+ <span class='kw'>end</span>
1201
+
1202
+
1203
+ <span class='comment'># All subcommand options, options and subcommands.
1204
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_suball'>suball</span>
1205
+ <span class='ivar'>@subopt</span> <span class='op'>+</span> <span class='ivar'>@subcmd</span>
1206
+ <span class='kw'>end</span>
1207
+
1208
+
1209
+ <span class='comment'># Options list iterator.
1210
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_each'>each</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_blk'>blk</span> <span class='rparen'>)</span>
1211
+ <span class='id identifier rubyid_suball'>suball</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1212
+ <span class='kw'>yield</span> <span class='id identifier rubyid_o'>o</span>
1213
+ <span class='kw'>end</span>
1214
+ <span class='kw'>end</span>
1215
+
1216
+
1217
+ <span class='comment'># Options iterator for given options.
1218
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_each_given'>each_given</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_blk'>blk</span> <span class='rparen'>)</span>
1219
+ <span class='id identifier rubyid_suball'>suball</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1220
+ <span class='kw'>yield</span> <span class='id identifier rubyid_o'>o</span> <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span>
1221
+ <span class='kw'>end</span>
1222
+ <span class='kw'>end</span>
1223
+
1224
+
1225
+ <span class='comment'># Number of given options.
1226
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_givenCount'>givenCount</span>
1227
+ <span class='id identifier rubyid_cnt'>cnt</span> <span class='op'>=</span> <span class='int'>0</span>
1228
+ <span class='id identifier rubyid_each_given'>each_given</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
1229
+ <span class='id identifier rubyid_cnt'>cnt</span> <span class='op'>+=</span> <span class='int'>1</span>
1230
+ <span class='kw'>end</span>
1231
+ <span class='id identifier rubyid_cnt'>cnt</span>
1232
+ <span class='kw'>end</span>
1233
+
1234
+
1235
+ <span class='comment'># Short syntax for value reference. Example: &quot;~Opt['file']&quot;.
1236
+ </span> <span class='kw'>def</span> <span class='op'>~</span><span class='lparen'>(</span><span class='rparen'>)</span>
1237
+ <span class='ivar'>@value</span>
1238
+ <span class='kw'>end</span>
1239
+
1240
+
1241
+ <span class='comment'># Return option value if given otherwise the default.
1242
+ </span> <span class='comment'># Example usage: fileName = Opt[&quot;file&quot;].apply( &quot;no_name.txt&quot; )
1243
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_apply'>apply</span><span class='lparen'>(</span> <span class='id identifier rubyid_default'>default</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='rparen'>)</span>
1244
+ <span class='kw'>if</span> <span class='id identifier rubyid_given'>given</span>
1245
+ <span class='id identifier rubyid_value'>value</span>
1246
+ <span class='kw'>else</span>
1247
+ <span class='id identifier rubyid_default'>default</span>
1248
+ <span class='kw'>end</span>
1249
+ <span class='kw'>end</span>
1250
+
1251
+
1252
+ <span class='comment'># Returns true if option is given, and block is not
1253
+ </span> <span class='comment'># present. When block is present, the block is executed (with
1254
+ </span> <span class='comment'># value as parameter) if option has been given.
1255
+ </span> <span class='comment'>#
1256
+ </span> <span class='comment'># @param yieldOpt [Boolean] Pass Opt to block instead of its
1257
+ </span> <span class='comment'># value.
1258
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_given'>given</span><span class='lparen'>(</span> <span class='id identifier rubyid_yieldOpt'>yieldOpt</span> <span class='op'>=</span> <span class='kw'>false</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_prog'>prog</span> <span class='rparen'>)</span>
1259
+ <span class='kw'>if</span> <span class='id identifier rubyid_block_given?'>block_given?</span>
1260
+ <span class='kw'>if</span> <span class='ivar'>@given</span>
1261
+ <span class='kw'>if</span> <span class='id identifier rubyid_yieldOpt'>yieldOpt</span>
1262
+ <span class='kw'>yield</span><span class='lparen'>(</span> <span class='kw'>self</span> <span class='rparen'>)</span>
1263
+ <span class='kw'>else</span>
1264
+ <span class='kw'>yield</span><span class='lparen'>(</span> <span class='ivar'>@value</span> <span class='rparen'>)</span>
1265
+ <span class='kw'>end</span>
1266
+ <span class='kw'>else</span>
1267
+ <span class='kw'>false</span>
1268
+ <span class='kw'>end</span>
1269
+ <span class='kw'>else</span>
1270
+ <span class='ivar'>@given</span>
1271
+ <span class='kw'>end</span>
1272
+ <span class='kw'>end</span>
1273
+
1274
+
1275
+ <span class='comment'># Alias for given.
1276
+ </span> <span class='kw'>alias</span> <span class='id identifier rubyid_given?'>given?</span> <span class='id identifier rubyid_given'>given</span>
1277
+
1278
+
1279
+ <span class='comment'># Return the selected subcommand.
1280
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_givenSubcmd'>givenSubcmd</span>
1281
+ <span class='lparen'>(</span> <span class='ivar'>@subcmd</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span> <span class='kw'>end</span> <span class='rparen'>)</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span>
1282
+ <span class='kw'>end</span>
1283
+
1284
+
1285
+ <span class='comment'># Returns Hash of option value parameters. Example command
1286
+ </span> <span class='comment'># line content:
1287
+ </span> <span class='comment'># -p rounds=10 length=5
1288
+ </span> <span class='comment'># Option value content in this case would be (Array of param
1289
+ </span> <span class='comment'># settings):
1290
+ </span> <span class='comment'># [ &quot;rounds=10&quot;, &quot;length=5&quot; ]
1291
+ </span> <span class='comment'># @return [Hash] Parameter settings included in the option.
1292
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_params'>params</span>
1293
+ <span class='id identifier rubyid_map'>map</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
1294
+ <span class='ivar'>@value</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
1295
+ <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span> <span class='op'>=</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_split'>split</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>=</span><span class='tstring_end'>'</span></span><span class='rparen'>)</span>
1296
+ <span class='id identifier rubyid_value'>value</span> <span class='op'>=</span> <span class='id identifier rubyid_str_to_num'>str_to_num</span><span class='lparen'>(</span> <span class='id identifier rubyid_value'>value</span> <span class='rparen'>)</span>
1297
+ <span class='id identifier rubyid_map'>map</span><span class='lbracket'>[</span> <span class='id identifier rubyid_name'>name</span> <span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_value'>value</span>
1298
+ <span class='kw'>end</span>
1299
+ <span class='id identifier rubyid_map'>map</span>
1300
+ <span class='kw'>end</span>
1301
+
1302
+
1303
+ <span class='comment'># Return default options.
1304
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_default'>default</span>
1305
+ <span class='id identifier rubyid_argByName'>argByName</span><span class='lparen'>(</span> <span class='kw'>nil</span> <span class='rparen'>)</span>
1306
+ <span class='kw'>end</span>
1307
+
1308
+
1309
+ <span class='comment'># Select option object by name.
1310
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_argByName'>argByName</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1311
+ <span class='kw'>if</span> <span class='id identifier rubyid_str'>str</span> <span class='op'>==</span> <span class='kw'>nil</span>
1312
+ <span class='ivar'>@subopt</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1313
+ <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_type'>type</span> <span class='op'>==</span> <span class='symbol'>:default</span>
1314
+ <span class='kw'>return</span> <span class='id identifier rubyid_o'>o</span>
1315
+ <span class='kw'>end</span>
1316
+ <span class='kw'>end</span>
1317
+ <span class='kw'>nil</span>
1318
+ <span class='kw'>else</span>
1319
+ <span class='id identifier rubyid_suball'>suball</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1320
+ <span class='kw'>if</span> <span class='id identifier rubyid_str'>str</span> <span class='op'>==</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span>
1321
+ <span class='kw'>return</span> <span class='id identifier rubyid_o'>o</span>
1322
+ <span class='kw'>end</span>
1323
+ <span class='kw'>end</span>
1324
+ <span class='kw'>nil</span>
1325
+ <span class='kw'>end</span>
1326
+ <span class='kw'>end</span>
1327
+
1328
+
1329
+ <span class='comment'># Select option object by name/opt/longOpt.
1330
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_argById'>argById</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1331
+ <span class='kw'>if</span> <span class='id identifier rubyid_str'>str</span> <span class='op'>==</span> <span class='kw'>nil</span>
1332
+ <span class='ivar'>@subopt</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1333
+ <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_type'>type</span> <span class='op'>==</span> <span class='symbol'>:default</span>
1334
+ <span class='kw'>return</span> <span class='id identifier rubyid_o'>o</span>
1335
+ <span class='kw'>end</span>
1336
+ <span class='kw'>end</span>
1337
+ <span class='kw'>nil</span>
1338
+ <span class='kw'>else</span>
1339
+ <span class='id identifier rubyid_suball'>suball</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1340
+ <span class='kw'>if</span> <span class='id identifier rubyid_str'>str</span> <span class='op'>==</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span> <span class='op'>||</span> <span class='id identifier rubyid_str'>str</span> <span class='op'>==</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_opt'>opt</span> <span class='op'>||</span> <span class='id identifier rubyid_str'>str</span> <span class='op'>==</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_longOpt'>longOpt</span>
1341
+ <span class='kw'>return</span> <span class='id identifier rubyid_o'>o</span>
1342
+ <span class='kw'>end</span>
1343
+ <span class='kw'>end</span>
1344
+ <span class='kw'>nil</span>
1345
+ <span class='kw'>end</span>
1346
+ <span class='kw'>end</span>
1347
+
1348
+
1349
+ <span class='comment'># Option requires argument?
1350
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_hasArg'>hasArg</span>
1351
+ <span class='kw'>case</span> <span class='ivar'>@type</span>
1352
+ <span class='kw'>when</span> <span class='symbol'>:single</span><span class='comma'>,</span> <span class='symbol'>:multi</span><span class='comma'>,</span> <span class='symbol'>:opt_single</span><span class='comma'>,</span> <span class='symbol'>:opt_multi</span><span class='comma'>,</span> <span class='symbol'>:opt_any</span><span class='semicolon'>;</span> <span class='kw'>true</span>
1353
+ <span class='kw'>else</span> <span class='kw'>false</span>
1354
+ <span class='kw'>end</span>
1355
+ <span class='kw'>end</span>
1356
+
1357
+
1358
+ <span class='comment'># Option requires many arguments?
1359
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_hasMany'>hasMany</span>
1360
+ <span class='kw'>case</span> <span class='ivar'>@type</span>
1361
+ <span class='kw'>when</span> <span class='symbol'>:multi</span><span class='comma'>,</span> <span class='symbol'>:opt_multi</span><span class='comma'>,</span> <span class='symbol'>:opt_any</span><span class='semicolon'>;</span> <span class='kw'>true</span>
1362
+ <span class='kw'>else</span> <span class='kw'>false</span>
1363
+ <span class='kw'>end</span>
1364
+ <span class='kw'>end</span>
1365
+
1366
+
1367
+ <span class='comment'># Is mandatory argument?
1368
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_isRequired'>isRequired</span>
1369
+ <span class='kw'>case</span> <span class='ivar'>@type</span>
1370
+ <span class='kw'>when</span> <span class='symbol'>:single</span><span class='comma'>,</span> <span class='symbol'>:multi</span><span class='semicolon'>;</span> <span class='kw'>true</span>
1371
+ <span class='kw'>else</span> <span class='kw'>false</span>
1372
+ <span class='kw'>end</span>
1373
+ <span class='kw'>end</span>
1374
+
1375
+
1376
+ <span class='comment'># Test if option is silent.
1377
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_silent?'>silent?</span>
1378
+ <span class='ivar'>@silent</span>
1379
+ <span class='kw'>end</span>
1380
+
1381
+
1382
+ <span class='comment'># Test if option is of switch type.
1383
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_isSwitch'>isSwitch</span>
1384
+ <span class='kw'>case</span> <span class='ivar'>@type</span>
1385
+ <span class='kw'>when</span> <span class='symbol'>:switch</span><span class='comma'>,</span> <span class='symbol'>:exclusive</span><span class='comma'>,</span> <span class='symbol'>:default</span><span class='semicolon'>;</span> <span class='kw'>true</span>
1386
+ <span class='kw'>else</span> <span class='kw'>false</span>
1387
+ <span class='kw'>end</span>
1388
+ <span class='kw'>end</span>
1389
+
1390
+
1391
+ <span class='comment'># ------------------------------------------------------------
1392
+ </span> <span class='comment'># Opt &quot;Usage Help&quot; user interface:
1393
+ </span>
1394
+ <span class='comment'># Set optional header for &quot;usage&quot;.
1395
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_setUsageHeader'>setUsageHeader</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1396
+ <span class='ivar'>@config</span><span class='lbracket'>[</span> <span class='symbol'>:header</span> <span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_str'>str</span>
1397
+ <span class='kw'>end</span>
1398
+
1399
+
1400
+ <span class='comment'># Set optional footer for &quot;usage&quot;.
1401
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_setUsageFooter'>setUsageFooter</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1402
+ <span class='ivar'>@config</span><span class='lbracket'>[</span> <span class='symbol'>:footer</span> <span class='rbracket'>]</span> <span class='op'>=</span> <span class='id identifier rubyid_str'>str</span>
1403
+ <span class='kw'>end</span>
1404
+
1405
+
1406
+ <span class='comment'># Display program usage (and optionally exit).
1407
+ </span> <span class='comment'>#
1408
+ </span> <span class='comment'># @param doExit [NilClass,Boolean] Exit program after help
1409
+ </span> <span class='comment'># display. Default to help_exit config if nil.
1410
+ </span> <span class='comment'># @param ruleHelp [NilClass,Boolean] Include rule help to help
1411
+ </span> <span class='comment'># display. Deault to rulehelp config if nil.
1412
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_usage'>usage</span><span class='lparen'>(</span> <span class='id identifier rubyid_doExit'>doExit</span> <span class='op'>=</span> <span class='kw'>nil</span><span class='comma'>,</span> <span class='id identifier rubyid_ruleHelp'>ruleHelp</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='rparen'>)</span>
1413
+
1414
+ <span class='id identifier rubyid_doExit'>doExit</span> <span class='op'>=</span> <span class='ivar'>@config</span><span class='lbracket'>[</span> <span class='symbol'>:help_exit</span> <span class='rbracket'>]</span> <span class='kw'>if</span> <span class='id identifier rubyid_doExit'>doExit</span> <span class='op'>==</span> <span class='kw'>nil</span>
1415
+ <span class='id identifier rubyid_ruleHelp'>ruleHelp</span> <span class='op'>=</span> <span class='ivar'>@config</span><span class='lbracket'>[</span> <span class='symbol'>:rulehelp</span> <span class='rbracket'>]</span> <span class='kw'>if</span> <span class='id identifier rubyid_ruleHelp'>ruleHelp</span> <span class='op'>==</span> <span class='kw'>nil</span>
1416
+
1417
+ <span class='cvar'>@@io</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='id identifier rubyid_usageNormal'>usageNormal</span>
1418
+
1419
+ <span class='kw'>if</span> <span class='id identifier rubyid_ruleHelp'>ruleHelp</span>
1420
+ <span class='cvar'>@@io</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\n Option Combinations:</span><span class='tstring_end'>&quot;</span></span>
1421
+ <span class='cvar'>@@io</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='const'>RuleDisplay</span><span class='period'>.</span><span class='id identifier rubyid_print'>print</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='ivar'>@rules</span> <span class='rparen'>)</span>
1422
+ <span class='kw'>end</span>
1423
+
1424
+ <span class='id identifier rubyid_exit'>exit</span><span class='lparen'>(</span> <span class='int'>1</span> <span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_doExit'>doExit</span>
1425
+ <span class='kw'>end</span>
1426
+
1427
+
1428
+ <span class='comment'># Display program usage (and optionally exit).
1429
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_usageIfHelp'>usageIfHelp</span>
1430
+ <span class='kw'>if</span> <span class='kw'>self</span><span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>help</span><span class='tstring_end'>'</span></span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span>
1431
+ <span class='id identifier rubyid_usage'>usage</span>
1432
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_hasSubcmd'>hasSubcmd</span>
1433
+ <span class='id identifier rubyid_givenSubcmd'>givenSubcmd</span><span class='period'>.</span><span class='id identifier rubyid_usageIfHelp'>usageIfHelp</span>
1434
+ <span class='kw'>end</span>
1435
+ <span class='kw'>end</span>
1436
+
1437
+
1438
+ <span class='comment'># Usage printout for command.
1439
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_usageCommand'>usageCommand</span>
1440
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_end'>&quot;</span></span>
1441
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>
1442
+ Subcommand \&quot;</span><span class='embexpr_beg'>#{</span><span class='ivar'>@name</span><span class='rbrace'>}</span><span class='tstring_content'>\&quot; usage:
1443
+ </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_fullCommand'>fullCommand</span><span class='rbrace'>}</span><span class='tstring_content'> </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_cmdline'>cmdline</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'> </span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='rbrace'>}</span><span class='tstring_content'>
1444
+
1445
+ </span><span class='tstring_end'>&quot;</span></span>
1446
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='id identifier rubyid_suboptDoc'>suboptDoc</span>
1447
+
1448
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\n</span><span class='tstring_end'>&quot;</span></span>
1449
+ <span class='kw'>end</span>
1450
+
1451
+ <span class='comment'># Usage info for Opt:s.
1452
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_usageNormal'>usageNormal</span>
1453
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_end'>&quot;</span></span>
1454
+
1455
+ <span class='kw'>if</span> <span class='ivar'>@config</span><span class='lbracket'>[</span> <span class='symbol'>:header</span> <span class='rbracket'>]</span>
1456
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\n</span><span class='tstring_end'>&quot;</span></span>
1457
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='ivar'>@config</span><span class='lbracket'>[</span> <span class='symbol'>:header</span> <span class='rbracket'>]</span>
1458
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\n</span><span class='tstring_end'>&quot;</span></span>
1459
+ <span class='kw'>end</span>
1460
+
1461
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='id identifier rubyid_usageCommand'>usageCommand</span>
1462
+
1463
+ <span class='kw'>if</span> <span class='ivar'>@config</span><span class='lbracket'>[</span> <span class='symbol'>:footer</span> <span class='rbracket'>]</span>
1464
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='ivar'>@config</span><span class='lbracket'>[</span> <span class='symbol'>:footer</span> <span class='rbracket'>]</span>
1465
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\n</span><span class='tstring_end'>&quot;</span></span>
1466
+ <span class='kw'>end</span>
1467
+
1468
+ <span class='id identifier rubyid_str'>str</span>
1469
+ <span class='kw'>end</span>
1470
+
1471
+
1472
+ <span class='comment'># Return cmdline usage strings for options in an Array.
1473
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_cmdline'>cmdline</span>
1474
+ <span class='id identifier rubyid_opts'>opts</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1475
+
1476
+ <span class='ivar'>@subopt</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1477
+
1478
+ <span class='kw'>next</span> <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_silent?'>silent?</span>
1479
+
1480
+ <span class='id identifier rubyid_prural'>prural</span> <span class='op'>=</span> <span class='kw'>nil</span>
1481
+ <span class='kw'>case</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_type'>type</span>
1482
+ <span class='kw'>when</span> <span class='symbol'>:multi</span><span class='comma'>,</span> <span class='symbol'>:opt_multi</span><span class='semicolon'>;</span> <span class='id identifier rubyid_prural'>prural</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>+</span><span class='tstring_end'>&quot;</span></span>
1483
+ <span class='kw'>when</span> <span class='symbol'>:opt_any</span><span class='semicolon'>;</span> <span class='id identifier rubyid_prural'>prural</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>*</span><span class='tstring_end'>&quot;</span></span>
1484
+ <span class='kw'>else</span> <span class='id identifier rubyid_prural'>prural</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_end'>&quot;</span></span>
1485
+ <span class='kw'>end</span>
1486
+
1487
+
1488
+ <span class='kw'>if</span> <span class='op'>!</span><span class='lparen'>(</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_isSwitch'>isSwitch</span> <span class='rparen'>)</span>
1489
+ <span class='id identifier rubyid_name'>name</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'> &lt;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='rbrace'>}</span><span class='tstring_content'>&gt;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_prural'>prural</span><span class='rbrace'>}</span><span class='tstring_end'>&quot;</span></span>
1490
+ <span class='kw'>else</span>
1491
+ <span class='id identifier rubyid_name'>name</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_end'>&quot;</span></span>
1492
+ <span class='kw'>end</span>
1493
+
1494
+ <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_opt'>opt</span> <span class='op'>==</span> <span class='kw'>nil</span>
1495
+ <span class='id identifier rubyid_opt'>opt</span> <span class='op'>=</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_longOpt'>longOpt</span>
1496
+ <span class='kw'>else</span>
1497
+ <span class='id identifier rubyid_opt'>opt</span> <span class='op'>=</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_opt'>opt</span>
1498
+ <span class='kw'>end</span>
1499
+
1500
+ <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_isRequired'>isRequired</span>
1501
+ <span class='id identifier rubyid_opts'>opts</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_opt'>opt</span><span class='rbrace'>}</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_name'>name</span><span class='rbrace'>}</span><span class='tstring_end'>&quot;</span></span>
1502
+ <span class='kw'>else</span>
1503
+ <span class='id identifier rubyid_opts'>opts</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>[</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_opt'>opt</span><span class='rbrace'>}</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_name'>name</span><span class='rbrace'>}</span><span class='tstring_content'>]</span><span class='tstring_end'>&quot;</span></span>
1504
+ <span class='kw'>end</span>
1505
+ <span class='kw'>end</span>
1506
+
1507
+
1508
+ <span class='kw'>if</span> <span class='id identifier rubyid_hasSubcmd'>hasSubcmd</span>
1509
+ <span class='id identifier rubyid_opts'>opts</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>&lt;&lt;subcommand&gt;&gt;</span><span class='tstring_end'>&quot;</span></span>
1510
+ <span class='kw'>end</span>
1511
+
1512
+ <span class='id identifier rubyid_opts'>opts</span>
1513
+
1514
+ <span class='kw'>end</span>
1515
+
1516
+
1517
+ <span class='comment'># Return document strings for options.
1518
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_suboptDoc'>suboptDoc</span>
1519
+
1520
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_end'>&quot;</span></span>
1521
+ <span class='id identifier rubyid_format'>format</span> <span class='op'>=</span> <span class='const'>Proc</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_s'>s</span><span class='comma'>,</span><span class='id identifier rubyid_d'>d</span><span class='op'>|</span> <span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'> %-</span><span class='embexpr_beg'>#{</span><span class='ivar'>@config</span><span class='lbracket'>[</span> <span class='symbol'>:tab</span> <span class='rbracket'>]</span><span class='rbrace'>}</span><span class='tstring_content'>s%s\n</span><span class='tstring_end'>&quot;</span></span> <span class='op'>%</span> <span class='lbracket'>[</span> <span class='id identifier rubyid_s'>s</span><span class='comma'>,</span> <span class='id identifier rubyid_d'>d</span> <span class='rbracket'>]</span> <span class='rparen'>)</span> <span class='kw'>end</span>
1522
+
1523
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_call'>call</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Options:</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_hasSubcmd'>hasSubcmd</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_hasVisibleOptions'>hasVisibleOptions</span>
1524
+
1525
+ <span class='ivar'>@subopt</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1526
+ <span class='kw'>next</span> <span class='kw'>if</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_silent?'>silent?</span>
1527
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_call'>call</span><span class='lparen'>(</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_opt'>opt</span> <span class='op'>?</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_opt'>opt</span> <span class='op'>:</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_longOpt'>longOpt</span><span class='comma'>,</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_doc'>doc</span> <span class='rparen'>)</span>
1528
+ <span class='kw'>end</span>
1529
+
1530
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\n</span><span class='tstring_end'>&quot;</span></span> <span class='op'>+</span> <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_call'>call</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Subcommands:</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_hasSubcmd'>hasSubcmd</span>
1531
+
1532
+ <span class='ivar'>@subcmd</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_o'>o</span><span class='op'>|</span>
1533
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='id identifier rubyid_format'>format</span><span class='period'>.</span><span class='id identifier rubyid_call'>call</span><span class='lparen'>(</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_o'>o</span><span class='period'>.</span><span class='id identifier rubyid_doc'>doc</span> <span class='rparen'>)</span>
1534
+ <span class='kw'>end</span>
1535
+
1536
+ <span class='id identifier rubyid_str'>str</span>
1537
+ <span class='kw'>end</span>
1538
+
1539
+
1540
+ <span class='comment'># Find option object by option str.
1541
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_findOpt'>findOpt</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1542
+ <span class='kw'>if</span> <span class='id identifier rubyid_str'>str</span> <span class='op'>==</span> <span class='kw'>nil</span>
1543
+ <span class='lparen'>(</span> <span class='id identifier rubyid_suball'>suball</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_type'>type</span> <span class='op'>==</span> <span class='symbol'>:default</span> <span class='rbrace'>}</span> <span class='rparen'>)</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span>
1544
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_str'>str</span><span class='lbracket'>[</span><span class='int'>0</span><span class='op'>..</span><span class='int'>1</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>--</span><span class='tstring_end'>&quot;</span></span>
1545
+ <span class='lparen'>(</span> <span class='id identifier rubyid_suball'>suball</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_longOpt'>longOpt</span> <span class='op'>==</span> <span class='id identifier rubyid_str'>str</span> <span class='rbrace'>}</span> <span class='rparen'>)</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span>
1546
+ <span class='kw'>elsif</span> <span class='id identifier rubyid_str'>str</span><span class='lbracket'>[</span><span class='int'>0</span><span class='op'>..</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='op'>!=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>-</span><span class='tstring_end'>&quot;</span></span>
1547
+ <span class='lparen'>(</span> <span class='id identifier rubyid_suball'>suball</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span> <span class='op'>==</span> <span class='id identifier rubyid_str'>str</span> <span class='rbrace'>}</span> <span class='rparen'>)</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span>
1548
+ <span class='kw'>else</span>
1549
+ <span class='lparen'>(</span> <span class='id identifier rubyid_suball'>suball</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_opt'>opt</span> <span class='op'>==</span> <span class='id identifier rubyid_str'>str</span> <span class='rbrace'>}</span> <span class='rparen'>)</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span>
1550
+ <span class='kw'>end</span>
1551
+ <span class='kw'>end</span>
1552
+
1553
+
1554
+ <span class='comment'># Como error printout.
1555
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_error'>error</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1556
+ <span class='cvar'>@@io</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='embexpr_beg'>#{</span><span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_progname'>progname</span><span class='rbrace'>}</span><span class='tstring_content'> error: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_str'>str</span><span class='rbrace'>}</span><span class='tstring_end'>&quot;</span></span>
1557
+ <span class='kw'>end</span>
1558
+
1559
+
1560
+
1561
+
1562
+ <span class='comment'># ------------------------------------------------------------
1563
+ </span> <span class='comment'># Internal methods:
1564
+ </span>
1565
+ <span class='id identifier rubyid_private'>private</span>
1566
+
1567
+
1568
+ <span class='comment'># Convert string to number if possible. The order of checks:
1569
+ </span> <span class='comment'># integer, float, and no-conversion.
1570
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_str_to_num'>str_to_num</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1571
+ <span class='kw'>begin</span> <span class='kw'>return</span> <span class='const'>Integer</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span><span class='semicolon'>;</span> <span class='kw'>rescue</span> <span class='semicolon'>;</span> <span class='kw'>end</span>
1572
+ <span class='kw'>begin</span> <span class='kw'>return</span> <span class='const'>Float</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span><span class='semicolon'>;</span> <span class='kw'>rescue</span> <span class='semicolon'>;</span> <span class='kw'>end</span>
1573
+ <span class='id identifier rubyid_str'>str</span>
1574
+ <span class='kw'>end</span>
1575
+
1576
+
1577
+ <span class='comment'># Return list of parents.
1578
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_getParents'>getParents</span>
1579
+ <span class='id identifier rubyid_list'>list</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1580
+ <span class='id identifier rubyid_cur'>cur</span> <span class='op'>=</span> <span class='kw'>self</span>
1581
+ <span class='kw'>begin</span>
1582
+ <span class='id identifier rubyid_list'>list</span><span class='period'>.</span><span class='id identifier rubyid_push'>push</span> <span class='id identifier rubyid_cur'>cur</span>
1583
+ <span class='id identifier rubyid_cur'>cur</span> <span class='op'>=</span> <span class='id identifier rubyid_cur'>cur</span><span class='period'>.</span><span class='id identifier rubyid_parent'>parent</span>
1584
+ <span class='kw'>end</span> <span class='kw'>while</span> <span class='id identifier rubyid_cur'>cur</span>
1585
+
1586
+ <span class='id identifier rubyid_list'>list</span><span class='period'>.</span><span class='id identifier rubyid_reverse'>reverse</span>
1587
+ <span class='kw'>end</span>
1588
+
1589
+
1590
+ <span class='comment'># Full command name.
1591
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_fullCommand'>fullCommand</span>
1592
+ <span class='lparen'>(</span> <span class='id identifier rubyid_getParents'>getParents</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_name'>name</span> <span class='kw'>end</span> <span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'> </span><span class='tstring_end'>'</span></span> <span class='rparen'>)</span>
1593
+ <span class='kw'>end</span>
1594
+
1595
+
1596
+ <span class='comment'># Test if option is of subcmd type.
1597
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_isSubcmd'>isSubcmd</span>
1598
+ <span class='ivar'>@type</span> <span class='op'>==</span> <span class='symbol'>:subcmd</span>
1599
+ <span class='kw'>end</span>
1600
+
1601
+
1602
+ <span class='comment'># Test if option is of subcmd type.
1603
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_hasVisibleOptions'>hasVisibleOptions</span>
1604
+ <span class='comment'># Count non-silent options.
1605
+ </span> <span class='lparen'>(</span> <span class='ivar'>@subopt</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span> <span class='op'>!</span><span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_silent?'>silent?</span> <span class='kw'>end</span> <span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span> <span class='op'>&gt;</span> <span class='int'>0</span>
1606
+ <span class='kw'>end</span>
1607
+
1608
+
1609
+ <span class='comment'># Test if option is of subcmd type.
1610
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_hasSubcmd'>hasSubcmd</span>
1611
+ <span class='op'>!</span><span class='ivar'>@subcmd</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span>
1612
+ <span class='kw'>end</span>
1613
+
1614
+
1615
+ <span class='comment'># Custom check for the option. User has to know some Como
1616
+ </span> <span class='comment'># internals.
1617
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_evalCheck'>evalCheck</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_check'>check</span> <span class='rparen'>)</span>
1618
+ <span class='id identifier rubyid_instance_eval'>instance_eval</span> <span class='op'>&amp;</span><span class='id identifier rubyid_check'>check</span>
1619
+ <span class='kw'>end</span>
1620
+
1621
+ <span class='kw'>end</span>
1622
+
1623
+
1624
+
1625
+ <span class='comment'># Specialized Opt class for program (i.e. highest level
1626
+ </span> <span class='comment'># subcommand).
1627
+ </span> <span class='kw'>class</span> <span class='const'>MasterOpt</span> <span class='op'>&lt;</span> <span class='const'>Opt</span>
1628
+
1629
+ <span class='comment'># Program external arguments:
1630
+ </span> <span class='id identifier rubyid_attr_accessor'>attr_accessor</span> <span class='symbol'>:external</span>
1631
+
1632
+ <span class='comment'># Program author and year (date).
1633
+ </span> <span class='id identifier rubyid_attr_reader'>attr_reader</span> <span class='symbol'>:author</span><span class='comma'>,</span> <span class='symbol'>:year</span>
1634
+
1635
+
1636
+ <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span> <span class='id identifier rubyid_author'>author</span><span class='comma'>,</span> <span class='id identifier rubyid_year'>year</span><span class='comma'>,</span>
1637
+ <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='id identifier rubyid_type'>type</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='rparen'>)</span>
1638
+ <span class='ivar'>@author</span> <span class='op'>=</span> <span class='id identifier rubyid_author'>author</span>
1639
+ <span class='ivar'>@year</span> <span class='op'>=</span> <span class='id identifier rubyid_year'>year</span>
1640
+ <span class='ivar'>@external</span> <span class='op'>=</span> <span class='kw'>nil</span>
1641
+ <span class='kw'>super</span><span class='lparen'>(</span> <span class='id identifier rubyid_name'>name</span><span class='comma'>,</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='id identifier rubyid_type'>type</span><span class='comma'>,</span> <span class='id identifier rubyid_doc'>doc</span><span class='comma'>,</span> <span class='id identifier rubyid_value'>value</span> <span class='op'>=</span> <span class='kw'>nil</span> <span class='rparen'>)</span>
1642
+
1643
+ <span class='comment'># # Set of default configs for printout.
1644
+ </span><span class='comment'># @config = {
1645
+ </span><span class='comment'># :header =&gt; nil,
1646
+ </span><span class='comment'># :footer =&gt; nil,
1647
+ </span><span class='comment'># :subcheck =&gt; true,
1648
+ </span><span class='comment'># :check =&gt; true,
1649
+ </span><span class='comment'># :tab =&gt; 12,
1650
+ </span><span class='comment'># :help_exit =&gt; true,
1651
+ </span><span class='comment'># :error_exit =&gt; true,
1652
+ </span><span class='comment'># }
1653
+ </span> <span class='kw'>end</span>
1654
+
1655
+
1656
+ <span class='comment'># Full command name.
1657
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_fullCommand'>fullCommand</span>
1658
+ <span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_progname'>progname</span>
1659
+ <span class='kw'>end</span>
1660
+
1661
+
1662
+ <span class='comment'># Usage printout for command.
1663
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_usageCommand'>usageCommand</span>
1664
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>
1665
+ Usage:
1666
+ </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_fullCommand'>fullCommand</span><span class='rbrace'>}</span><span class='tstring_content'> </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_cmdline'>cmdline</span><span class='period'>.</span><span class='id identifier rubyid_join'>join</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'> </span><span class='tstring_end'>&quot;</span></span><span class='rparen'>)</span><span class='rbrace'>}</span><span class='tstring_content'>
1667
+
1668
+ </span><span class='tstring_end'>&quot;</span></span>
1669
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='id identifier rubyid_suboptDoc'>suboptDoc</span>
1670
+
1671
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>+=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>
1672
+
1673
+ Copyright (c) </span><span class='embexpr_beg'>#{</span><span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_year'>year</span><span class='rbrace'>}</span><span class='tstring_content'> by </span><span class='embexpr_beg'>#{</span><span class='const'>Opt</span><span class='period'>.</span><span class='id identifier rubyid_author'>author</span><span class='rbrace'>}</span><span class='tstring_content'>
1674
+
1675
+ </span><span class='tstring_end'>&quot;</span></span>
1676
+ <span class='kw'>end</span>
1677
+
1678
+ <span class='kw'>end</span>
1679
+
1680
+
1681
+ <span class='comment'># Command argument parsing state.
1682
+ </span> <span class='kw'>class</span> <span class='const'>ArgsParseState</span>
1683
+
1684
+ <span class='comment'># @param list [Array&lt;String&gt;] List of Command Line Arguments (default:
1685
+ </span> <span class='comment'># ARGV).
1686
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span> <span class='id identifier rubyid_list'>list</span> <span class='rparen'>)</span>
1687
+ <span class='id identifier rubyid_set'>set</span><span class='lparen'>(</span> <span class='id identifier rubyid_list'>list</span> <span class='rparen'>)</span>
1688
+ <span class='ivar'>@idx</span> <span class='op'>=</span> <span class='int'>0</span>
1689
+ <span class='kw'>end</span>
1690
+
1691
+ <span class='comment'># Set list of arguments.
1692
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_set'>set</span><span class='lparen'>(</span> <span class='id identifier rubyid_list'>list</span> <span class='rparen'>)</span>
1693
+ <span class='ivar'>@args</span> <span class='op'>=</span> <span class='id identifier rubyid_list'>list</span>
1694
+ <span class='kw'>end</span>
1695
+
1696
+ <span class='comment'># Step to next argument.
1697
+ </span> <span class='kw'>def</span> <span class='kw'>next</span>
1698
+ <span class='ivar'>@idx</span> <span class='op'>+=</span> <span class='int'>1</span>
1699
+ <span class='kw'>end</span>
1700
+
1701
+ <span class='comment'># Step to previous argument.
1702
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_prev'>prev</span>
1703
+ <span class='ivar'>@idx</span> <span class='op'>-=</span> <span class='int'>1</span>
1704
+ <span class='kw'>end</span>
1705
+
1706
+ <span class='comment'># Get current argument.
1707
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_get'>get</span><span class='lparen'>(</span> <span class='id identifier rubyid_idx'>idx</span> <span class='op'>=</span> <span class='ivar'>@idx</span> <span class='rparen'>)</span>
1708
+ <span class='ivar'>@args</span><span class='lbracket'>[</span> <span class='id identifier rubyid_idx'>idx</span> <span class='rbracket'>]</span>
1709
+ <span class='kw'>end</span>
1710
+
1711
+ <span class='comment'># Get last argument.
1712
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_last'>last</span><span class='lparen'>(</span> <span class='id identifier rubyid_idx'>idx</span> <span class='op'>=</span> <span class='ivar'>@idx</span> <span class='rparen'>)</span>
1713
+ <span class='id identifier rubyid_idx'>idx</span> <span class='op'>==</span> <span class='lparen'>(</span> <span class='ivar'>@args</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span><span class='op'>-</span><span class='int'>1</span> <span class='rparen'>)</span>
1714
+ <span class='kw'>end</span>
1715
+
1716
+ <span class='comment'># Get rest of the arguments.
1717
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_rest'>rest</span><span class='lparen'>(</span> <span class='id identifier rubyid_idx'>idx</span> <span class='op'>=</span> <span class='ivar'>@idx</span> <span class='rparen'>)</span>
1718
+ <span class='ivar'>@args</span><span class='lbracket'>[</span> <span class='id identifier rubyid_idx'>idx</span><span class='op'>..</span><span class='op'>-</span><span class='int'>1</span> <span class='rbracket'>]</span>
1719
+ <span class='kw'>end</span>
1720
+
1721
+ <span class='comment'># Parser at argument list end?
1722
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_done?'>done?</span>
1723
+ <span class='ivar'>@idx</span> <span class='op'>&gt;=</span> <span class='ivar'>@list</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span>
1724
+ <span class='kw'>end</span>
1725
+
1726
+
1727
+ <span class='comment'># Test whether str is an option.
1728
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_isOpt'>isOpt</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='op'>=</span> <span class='id identifier rubyid_get'>get</span> <span class='rparen'>)</span>
1729
+ <span class='id identifier rubyid_str'>str</span><span class='lbracket'>[</span><span class='int'>0</span><span class='op'>..</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>-</span><span class='tstring_end'>&quot;</span></span>
1730
+ <span class='kw'>end</span>
1731
+
1732
+ <span class='comment'># Test whether str is an option list terminator.
1733
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_isOptTerm'>isOptTerm</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='op'>=</span> <span class='id identifier rubyid_get'>get</span> <span class='rparen'>)</span>
1734
+ <span class='id identifier rubyid_str'>str</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>--</span><span class='tstring_end'>&quot;</span></span>
1735
+ <span class='kw'>end</span>
1736
+
1737
+ <span class='comment'># Format value string if escaped.
1738
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_toValue'>toValue</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='op'>=</span> <span class='id identifier rubyid_get'>get</span> <span class='rparen'>)</span>
1739
+ <span class='kw'>if</span> <span class='id identifier rubyid_str'>str</span><span class='lbracket'>[</span><span class='int'>0</span><span class='op'>..</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>\\</span><span class='tstring_end'>&quot;</span></span>
1740
+ <span class='id identifier rubyid_str'>str</span><span class='lbracket'>[</span><span class='int'>1</span><span class='op'>..</span><span class='op'>-</span><span class='int'>1</span><span class='rbracket'>]</span>
1741
+ <span class='kw'>else</span>
1742
+ <span class='id identifier rubyid_str'>str</span>
1743
+ <span class='kw'>end</span>
1744
+ <span class='kw'>end</span>
1745
+
1746
+ <span class='kw'>end</span>
1747
+
1748
+
1749
+
1750
+ <span class='comment'># Set of methods which represent option combination checking.
1751
+ </span> <span class='comment'># In effect this is a meta language (DSL) for option
1752
+ </span> <span class='comment'># combinations.
1753
+ </span> <span class='comment'>#
1754
+ </span> <span class='comment'># Example:
1755
+ </span> <span class='comment'># RuleCheck.check( opt ) do
1756
+ </span> <span class='comment'># one(
1757
+ </span> <span class='comment'># incr( &quot;gcov&quot;, &quot;exclude&quot;, &quot;refreshed&quot; ),
1758
+ </span> <span class='comment'># &quot;manifest&quot;,
1759
+ </span> <span class='comment'># &quot;pairs&quot;,
1760
+ </span> <span class='comment'># &quot;files&quot;
1761
+ </span> <span class='comment'># )
1762
+ </span> <span class='comment'># end
1763
+ </span> <span class='kw'>class</span> <span class='const'>RuleCheck</span>
1764
+
1765
+ <span class='kw'>def</span> <span class='const'>RuleCheck</span><span class='period'>.</span><span class='id identifier rubyid_check'>check</span><span class='lparen'>(</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
1766
+ <span class='id identifier rubyid_rc'>rc</span> <span class='op'>=</span> <span class='const'>RuleCheck</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='id identifier rubyid_opt'>opt</span> <span class='rparen'>)</span>
1767
+ <span class='id identifier rubyid_rc'>rc</span><span class='period'>.</span><span class='id identifier rubyid_instance_eval'>instance_eval</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
1768
+ <span class='kw'>end</span>
1769
+
1770
+ <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span> <span class='id identifier rubyid_opt'>opt</span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
1771
+ <span class='ivar'>@opt</span> <span class='op'>=</span> <span class='id identifier rubyid_opt'>opt</span>
1772
+ <span class='kw'>end</span>
1773
+
1774
+
1775
+ <span class='comment'># Get given count.
1776
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_getScore'>getScore</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1777
+ <span class='id identifier rubyid_score'>score</span> <span class='op'>=</span> <span class='int'>0</span>
1778
+ <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
1779
+ <span class='kw'>if</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span> <span class='op'>==</span> <span class='const'>TrueClass</span> <span class='op'>||</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span> <span class='op'>==</span> <span class='const'>FalseClass</span>
1780
+ <span class='id identifier rubyid_score'>score</span> <span class='op'>+=</span> <span class='int'>1</span> <span class='kw'>if</span> <span class='id identifier rubyid_i'>i</span>
1781
+ <span class='kw'>else</span>
1782
+ <span class='id identifier rubyid_score'>score</span> <span class='op'>+=</span> <span class='int'>1</span> <span class='kw'>if</span> <span class='ivar'>@opt</span><span class='period'>.</span><span class='id identifier rubyid_argById'>argById</span><span class='lparen'>(</span><span class='id identifier rubyid_i'>i</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_given'>given</span>
1783
+ <span class='kw'>end</span>
1784
+ <span class='kw'>end</span>
1785
+ <span class='id identifier rubyid_score'>score</span>
1786
+ <span class='kw'>end</span>
1787
+
1788
+ <span class='comment'># Special condition when no options are given.
1789
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_none'>none</span>
1790
+ <span class='ivar'>@opt</span><span class='period'>.</span><span class='id identifier rubyid_givenCount'>givenCount</span> <span class='op'>==</span> <span class='int'>0</span>
1791
+ <span class='kw'>end</span>
1792
+
1793
+ <span class='comment'># Incremental options in order i.e. have to have previous
1794
+ </span> <span class='comment'># to have later.
1795
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_incr'>incr</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1796
+ <span class='id identifier rubyid_had'>had</span> <span class='op'>=</span> <span class='int'>0</span>
1797
+ <span class='id identifier rubyid_add'>add</span> <span class='op'>=</span> <span class='kw'>true</span>
1798
+ <span class='id identifier rubyid_scoreAll'>scoreAll</span> <span class='op'>=</span> <span class='int'>0</span>
1799
+ <span class='id identifier rubyid_i'>i</span> <span class='op'>=</span> <span class='int'>0</span>
1800
+ <span class='kw'>while</span> <span class='id identifier rubyid_args'>args</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span>
1801
+ <span class='id identifier rubyid_score'>score</span> <span class='op'>=</span> <span class='id identifier rubyid_getScore'>getScore</span><span class='lparen'>(</span> <span class='id identifier rubyid_args'>args</span><span class='lbracket'>[</span><span class='id identifier rubyid_i'>i</span><span class='rbracket'>]</span> <span class='rparen'>)</span>
1802
+ <span class='id identifier rubyid_had'>had</span> <span class='op'>+=</span> <span class='int'>1</span> <span class='kw'>if</span> <span class='lparen'>(</span> <span class='id identifier rubyid_score'>score</span> <span class='op'>==</span> <span class='int'>1</span> <span class='rparen'>)</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_add'>add</span>
1803
+ <span class='id identifier rubyid_add'>add</span> <span class='op'>=</span> <span class='kw'>false</span> <span class='kw'>if</span> <span class='lparen'>(</span> <span class='id identifier rubyid_score'>score</span> <span class='op'>==</span> <span class='int'>0</span> <span class='rparen'>)</span>
1804
+ <span class='id identifier rubyid_scoreAll'>scoreAll</span> <span class='op'>+=</span> <span class='id identifier rubyid_score'>score</span>
1805
+ <span class='id identifier rubyid_i'>i</span> <span class='op'>+=</span> <span class='int'>1</span>
1806
+ <span class='kw'>end</span>
1807
+
1808
+ <span class='lparen'>(</span> <span class='id identifier rubyid_had'>had</span> <span class='op'>==</span> <span class='id identifier rubyid_scoreAll'>scoreAll</span> <span class='op'>&amp;&amp;</span> <span class='id identifier rubyid_had'>had</span> <span class='op'>&gt;</span> <span class='int'>0</span> <span class='rparen'>)</span>
1809
+ <span class='kw'>end</span>
1810
+
1811
+ <span class='comment'># Incremental options in order i.e. have to have all later
1812
+ </span> <span class='comment'># if had first.
1813
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_follow'>follow</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1814
+ <span class='kw'>if</span> <span class='id identifier rubyid_getScore'>getScore</span><span class='lparen'>(</span> <span class='id identifier rubyid_args'>args</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span> <span class='rparen'>)</span>
1815
+ <span class='id identifier rubyid_getScore'>getScore</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span> <span class='op'>==</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span>
1816
+ <span class='kw'>else</span>
1817
+ <span class='kw'>true</span>
1818
+ <span class='kw'>end</span>
1819
+ <span class='kw'>end</span>
1820
+
1821
+ <span class='comment'># One of list given.
1822
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_one'>one</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1823
+ <span class='id identifier rubyid_getScore'>getScore</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span> <span class='op'>==</span> <span class='int'>1</span>
1824
+ <span class='kw'>end</span>
1825
+
1826
+ <span class='comment'># At least one is given.
1827
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_any'>any</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1828
+ <span class='id identifier rubyid_getScore'>getScore</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span> <span class='op'>&gt;</span> <span class='int'>0</span>
1829
+ <span class='kw'>end</span>
1830
+
1831
+ <span class='comment'># All are given.
1832
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_all'>all</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1833
+ <span class='id identifier rubyid_getScore'>getScore</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span> <span class='op'>==</span> <span class='id identifier rubyid_args'>args</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span>
1834
+ <span class='kw'>end</span>
1835
+
1836
+ <span class='comment'># Logical inversion.
1837
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_inv'>inv</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1838
+ <span class='id identifier rubyid_getScore'>getScore</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span> <span class='op'>==</span> <span class='int'>0</span>
1839
+ <span class='kw'>end</span>
1840
+ <span class='kw'>end</span>
1841
+
1842
+
1843
+
1844
+ <span class='comment'># Display utility for RuleCheck. Usage model.
1845
+ </span> <span class='comment'>#
1846
+ </span> <span class='comment'># RuleDisplay.new.evalAndDisplay( &amp;rule )
1847
+ </span> <span class='comment'>#
1848
+ </span> <span class='comment'># Example expansion of options:
1849
+ </span> <span class='comment'>#
1850
+ </span> <span class='comment'># |--# One of:
1851
+ </span> <span class='comment'># | |--# Adding in order:
1852
+ </span> <span class='comment'># | | |--&lt;gcov&gt;
1853
+ </span> <span class='comment'># | | |--&lt;exclude&gt;
1854
+ </span> <span class='comment'># | | |--&lt;refreshed&gt;
1855
+ </span> <span class='comment'># | |--&lt;manifest&gt;
1856
+ </span> <span class='comment'># | |--&lt;pairs&gt;
1857
+ </span> <span class='comment'># | |--&lt;files&gt;
1858
+ </span> <span class='comment'>#
1859
+ </span> <span class='kw'>class</span> <span class='const'>RuleDisplay</span> <span class='op'>&lt;</span> <span class='const'>ComoCommon</span>
1860
+
1861
+ <span class='comment'># Eval rules to get an nested array and then display it.
1862
+ </span> <span class='kw'>def</span> <span class='const'>RuleDisplay</span><span class='period'>.</span><span class='id identifier rubyid_print'>print</span><span class='lparen'>(</span> <span class='id identifier rubyid_prefixStr'>prefixStr</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'> </span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
1863
+ <span class='id identifier rubyid_rd'>rd</span> <span class='op'>=</span> <span class='const'>RuleDisplay</span><span class='period'>.</span><span class='id identifier rubyid_new'>new</span><span class='lparen'>(</span> <span class='id identifier rubyid_prefixStr'>prefixStr</span> <span class='rparen'>)</span>
1864
+ <span class='id identifier rubyid_rd'>rd</span><span class='period'>.</span><span class='id identifier rubyid_evalAndDisplay'>evalAndDisplay</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
1865
+ <span class='kw'>end</span>
1866
+
1867
+ <span class='kw'>def</span> <span class='id identifier rubyid_initialize'>initialize</span><span class='lparen'>(</span> <span class='id identifier rubyid_prefixStr'>prefixStr</span> <span class='rparen'>)</span>
1868
+ <span class='comment'># Prefix string for lines. Rules add/rm from it.
1869
+ </span> <span class='ivar'>@prefixStr</span> <span class='op'>=</span> <span class='id identifier rubyid_prefixStr'>prefixStr</span>
1870
+ <span class='kw'>end</span>
1871
+
1872
+ <span class='kw'>def</span> <span class='id identifier rubyid_evalAndDisplay'>evalAndDisplay</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span>
1873
+ <span class='id identifier rubyid_printRule'>printRule</span><span class='lparen'>(</span> <span class='id identifier rubyid_instance_eval'>instance_eval</span><span class='lparen'>(</span> <span class='op'>&amp;</span><span class='id identifier rubyid_rule'>rule</span> <span class='rparen'>)</span> <span class='rparen'>)</span>
1874
+ <span class='kw'>end</span>
1875
+
1876
+ <span class='comment'># Increase prefix string.
1877
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_addPrefix'>addPrefix</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1878
+ <span class='ivar'>@prefixStr</span> <span class='op'>+=</span> <span class='id identifier rubyid_str'>str</span>
1879
+ <span class='kw'>end</span>
1880
+
1881
+ <span class='comment'># Remove from prefix (either str or length ).
1882
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_rmPrefix'>rmPrefix</span><span class='lparen'>(</span> <span class='id identifier rubyid_item'>item</span> <span class='rparen'>)</span>
1883
+ <span class='kw'>if</span> <span class='id identifier rubyid_item'>item</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span> <span class='op'>==</span> <span class='const'>String</span>
1884
+ <span class='id identifier rubyid_cnt'>cnt</span> <span class='op'>=</span> <span class='id identifier rubyid_item'>item</span><span class='period'>.</span><span class='id identifier rubyid_length'>length</span>
1885
+ <span class='kw'>else</span>
1886
+ <span class='id identifier rubyid_cnt'>cnt</span> <span class='op'>=</span> <span class='id identifier rubyid_item'>item</span>
1887
+ <span class='kw'>end</span>
1888
+ <span class='ivar'>@prefixStr</span> <span class='op'>=</span> <span class='ivar'>@prefixStr</span><span class='lbracket'>[</span><span class='int'>0</span><span class='op'>..</span><span class='op'>-</span><span class='lparen'>(</span><span class='id identifier rubyid_cnt'>cnt</span><span class='op'>+</span><span class='int'>1</span><span class='rparen'>)</span><span class='rbracket'>]</span>
1889
+ <span class='kw'>end</span>
1890
+
1891
+ <span class='comment'># Print prefix + str.
1892
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_p'>p</span><span class='lparen'>(</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1893
+ <span class='cvar'>@@io</span><span class='period'>.</span><span class='id identifier rubyid_puts'>puts</span><span class='lparen'>(</span> <span class='ivar'>@prefixStr</span> <span class='op'>+</span> <span class='id identifier rubyid_str'>str</span> <span class='rparen'>)</span>
1894
+ <span class='kw'>end</span>
1895
+
1896
+ <span class='comment'># Recursively go through the nested array of rule items and
1897
+ </span> <span class='comment'># print out rules.
1898
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_printRule'>printRule</span><span class='lparen'>(</span> <span class='id identifier rubyid_arr'>arr</span> <span class='rparen'>)</span>
1899
+ <span class='id identifier rubyid_p'>p</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>|--# </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_arr'>arr</span><span class='lbracket'>[</span><span class='int'>0</span><span class='rbracket'>]</span><span class='rbrace'>}</span><span class='tstring_content'>:</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
1900
+ <span class='id identifier rubyid_item'>item</span> <span class='op'>=</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>| </span><span class='tstring_end'>&quot;</span></span>
1901
+ <span class='id identifier rubyid_addPrefix'>addPrefix</span><span class='lparen'>(</span> <span class='id identifier rubyid_item'>item</span> <span class='rparen'>)</span>
1902
+
1903
+ <span class='id identifier rubyid_arr'>arr</span><span class='lbracket'>[</span><span class='int'>1</span><span class='op'>..</span><span class='op'>-</span><span class='int'>1</span><span class='rbracket'>]</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_i'>i</span><span class='op'>|</span>
1904
+ <span class='kw'>if</span> <span class='id identifier rubyid_i'>i</span><span class='period'>.</span><span class='id identifier rubyid_class'>class</span> <span class='op'>==</span> <span class='const'>Array</span>
1905
+ <span class='id identifier rubyid_printRule'>printRule</span><span class='lparen'>(</span> <span class='id identifier rubyid_i'>i</span> <span class='rparen'>)</span>
1906
+ <span class='kw'>else</span>
1907
+ <span class='id identifier rubyid_p'>p</span><span class='lparen'>(</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>|--&lt;</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_i'>i</span><span class='rbrace'>}</span><span class='tstring_content'>&gt;</span><span class='tstring_end'>&quot;</span></span> <span class='rparen'>)</span>
1908
+ <span class='kw'>end</span>
1909
+ <span class='kw'>end</span>
1910
+ <span class='id identifier rubyid_rmPrefix'>rmPrefix</span><span class='lparen'>(</span> <span class='id identifier rubyid_item'>item</span> <span class='rparen'>)</span>
1911
+ <span class='kw'>end</span>
1912
+
1913
+ <span class='comment'># Special condition where no arguments are given.
1914
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_none'>none</span>
1915
+ <span class='lbracket'>[</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>NONE</span><span class='tstring_end'>&quot;</span></span> <span class='rbracket'>]</span>
1916
+ <span class='kw'>end</span>
1917
+
1918
+ <span class='comment'># Incremental options in order i.e. have to have previous
1919
+ </span> <span class='comment'># to have later.
1920
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_incr'>incr</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1921
+ <span class='lbracket'>[</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Adding in order</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rbracket'>]</span>
1922
+ <span class='kw'>end</span>
1923
+
1924
+ <span class='comment'># Incremental options in order i.e. have to have all later
1925
+ </span> <span class='comment'># if had first.
1926
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_follow'>follow</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1927
+ <span class='lbracket'>[</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>If first then rest</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rbracket'>]</span>
1928
+ <span class='kw'>end</span>
1929
+
1930
+ <span class='comment'># One of list given.
1931
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_one'>one</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1932
+ <span class='lbracket'>[</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>One of</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rbracket'>]</span>
1933
+ <span class='kw'>end</span>
1934
+
1935
+ <span class='comment'># At least one is given.
1936
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_any'>any</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1937
+ <span class='lbracket'>[</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>One or more of</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rbracket'>]</span>
1938
+ <span class='kw'>end</span>
1939
+
1940
+ <span class='comment'># All are given.
1941
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_all'>all</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1942
+ <span class='lbracket'>[</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>All of</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rbracket'>]</span>
1943
+ <span class='kw'>end</span>
1944
+
1945
+ <span class='comment'># Logical inversion.
1946
+ </span> <span class='kw'>def</span> <span class='id identifier rubyid_inv'>inv</span><span class='lparen'>(</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rparen'>)</span>
1947
+ <span class='lbracket'>[</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Not</span><span class='tstring_end'>&quot;</span></span><span class='comma'>,</span> <span class='op'>*</span><span class='id identifier rubyid_args'>args</span> <span class='rbracket'>]</span>
1948
+ <span class='kw'>end</span>
1949
+
1950
+ <span class='kw'>end</span>
1951
+
1952
+
1953
+ <span class='kw'>end</span></pre></div></div>
1954
+
1955
+ <div id="footer">
1956
+ Generated on Wed Nov 27 11:34:25 2013 by
1957
+ <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
1958
+ 0.8.6.1 (ruby-1.9.3).
1959
+ </div>
1960
+
1961
+ </body>
1962
+ </html>