como 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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>