option_list 1.0.3 → 1.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.
- checksums.yaml +8 -8
- data/{option_list.rb → lib/option_list.rb} +30 -14
- data/rakefile.rb +2 -2
- data/{option_list_test.rb → tests/option_list_test.rb} +24 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OWQxY2I0ZTM2NjM1OTBiZDU2MWNmZDk4MjcyMDQ1ZGUzYWQzNDcyMA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NDUyZWQxNmQ5MzMwZTkzZThhZTFjNzhjMTNmN2Y4ZmY1NDU2N2RmNQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ZGNhMjA2NjExMzNjNDAzNzdjNmZmODJkODg1NmQwZDYzOTg2MTkxNTFiMDUx
|
10
|
+
MmU1NGFkMTMzZGE1MjI1MzU3MWE2M2U3MzEwMDEwYWYyNDI0YmIzYjk4MGQx
|
11
|
+
NDM3NjEwNTEwYzkxY2YxNjY5MWJmZjc0NDY3NmU3MmMyZmE4NGU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZDViOTVkN2U5NjMyZDNlYjliZDdlODk2NTM2MzFiZTJmMDExOThjNzhhOTMw
|
14
|
+
MTM1Yjk5ZTEwNjBiYTE2NmQzNzRkYWI4OWIyM2JhNGIwMGY2NzRiNGE2Zjli
|
15
|
+
MGJmMjMyYjliNDAzNmVmYmY2MGM1MzBmMzg1ODE1NGEwMDgzZTM=
|
@@ -38,11 +38,15 @@ require 'set'
|
|
38
38
|
#\OptionList class itself, it is reasonable to assume that a function option
|
39
39
|
#handler could very easily end up embedded in such an environment. In fact, my
|
40
40
|
#first major test of the class ran into this exact issue.
|
41
|
+
#=== Version 1.1.0
|
42
|
+
#Added a default value of false to signify that no default exists for a
|
43
|
+
#mandatory parameter.
|
44
|
+
#Modified processing of array specs to avoid side effects in the parameters.
|
41
45
|
class OptionList
|
42
46
|
|
43
47
|
#The option list code version.
|
44
48
|
def self.version
|
45
|
-
'1.0
|
49
|
+
'1.1.0'
|
46
50
|
end
|
47
51
|
|
48
52
|
#The option list code version. This is a redirect to the class method.
|
@@ -60,8 +64,12 @@ class OptionList
|
|
60
64
|
#In this form of specification, the first element of the array is the
|
61
65
|
#category of the option, and the second and following entries are the
|
62
66
|
#allowed values for that category. The second element has a special role. It
|
63
|
-
#is the default value for the category.
|
64
|
-
|
67
|
+
#is the default value for the category. This value may be one of:
|
68
|
+
#* A symbol - The default symbolic value for this option.
|
69
|
+
#* nil - The default value is nil and this setting is optional.
|
70
|
+
#* false - There is no default value and this setting is mandatory.
|
71
|
+
#The symbols used in each category must be unique across
|
72
|
+
#all of the categories in the option list.
|
65
73
|
#==== Hash Specification
|
66
74
|
#Hash specifications are used to specify options that do not have a fixed set
|
67
75
|
#of possible values. In this form of specification, the hash key symbol is
|
@@ -89,6 +97,7 @@ class OptionList
|
|
89
97
|
#* ArgumentError for a number of invalid argument conditions.
|
90
98
|
def initialize(*option_specs, &select_block)
|
91
99
|
fAE "Missing option specifications." if option_specs.empty?
|
100
|
+
@mandatory = Array.new
|
92
101
|
@categories = Hash.new
|
93
102
|
@default = Hash.new
|
94
103
|
|
@@ -118,10 +127,9 @@ class OptionList
|
|
118
127
|
#Some examples:
|
119
128
|
# o = foo(:sedan, :turbo)
|
120
129
|
# o = foo({:style=>:sedan})
|
121
|
-
# o = foo(
|
122
|
-
# o = foo(:sedan, :turbo,
|
123
|
-
# o = foo(
|
124
|
-
# o = foo({:style=>:sedan}, {:page_len=>60})
|
130
|
+
# o = foo(page_len: 60)
|
131
|
+
# o = foo(:sedan, :turbo, page_len: 60)
|
132
|
+
# o = foo(style: :sedan, page_len: 60)
|
125
133
|
#=== Passing in option data:
|
126
134
|
#The caller of this method may pass these options in a number of ways:
|
127
135
|
#==== Array (via a splat)
|
@@ -144,6 +152,7 @@ class OptionList
|
|
144
152
|
#==== Hash
|
145
153
|
#Options may also be passed via a hash.
|
146
154
|
# test(34, 53, 76, 'hike!', {:history=>:history, :page_len=>55})
|
155
|
+
# test(34, 53, 76, 'hike!', history: :history, page_len: 55)
|
147
156
|
#==== Symbol
|
148
157
|
#If only a single option is required, it can be passed simply as:
|
149
158
|
# test(34, 53, 76, 'hike!', :history)
|
@@ -152,7 +161,7 @@ class OptionList
|
|
152
161
|
# with the splat operator. Note that if select is called with no arguments,
|
153
162
|
# all of the default values will be selected.
|
154
163
|
#==== Returns:
|
155
|
-
#An option value object
|
164
|
+
#An option value object which is a singleton subclass of the Hash class.
|
156
165
|
#==== Exceptions:
|
157
166
|
#* ArgumentError for a number of invalid argument conditions.
|
158
167
|
#==== Notes:
|
@@ -173,6 +182,10 @@ class OptionList
|
|
173
182
|
end
|
174
183
|
end
|
175
184
|
|
185
|
+
@mandatory.each do |cat|
|
186
|
+
fAE "Missing mandatory setting #{cat}" unless selected[cat]
|
187
|
+
end
|
188
|
+
|
176
189
|
@select_block.call(selected) unless @select_block.nil?
|
177
190
|
selected
|
178
191
|
end
|
@@ -187,14 +200,16 @@ class OptionList
|
|
187
200
|
#Process an array spec that lists all the valid values for an option. See
|
188
201
|
#the new method for more information on these specs.
|
189
202
|
def array_spec(spec)
|
190
|
-
cat = spec
|
203
|
+
cat = spec[0]
|
204
|
+
spec = spec[1...spec.length]
|
205
|
+
|
191
206
|
fAE "Found #{cat.class}, expected Symbol." unless cat.is_a?(Symbol)
|
192
207
|
fAE "Duplicate category: #{cat}" if @default.has_key?(cat)
|
193
208
|
fAE "Invalid number of entries for #{cat}." unless spec.length > 1
|
194
209
|
@default.define_singleton_method(cat) { self[cat] }
|
195
|
-
|
210
|
+
|
196
211
|
spec.each_with_index do |opt, index|
|
197
|
-
if opt
|
212
|
+
if opt
|
198
213
|
fAE "Found #{opt.class}, expected Symbol." unless opt.is_a?(Symbol)
|
199
214
|
fAE "Duplicate option: #{opt}" if @categories.has_key?(opt)
|
200
215
|
|
@@ -203,9 +218,10 @@ class OptionList
|
|
203
218
|
@default.define_singleton_method(qry) { self[cat] == opt }
|
204
219
|
@default[cat] = opt if index == 0
|
205
220
|
elsif index == 0
|
206
|
-
@default[cat] =
|
221
|
+
@default[cat] = opt
|
222
|
+
@mandatory << cat if opt == false
|
207
223
|
else
|
208
|
-
fAE "The
|
224
|
+
fAE "The values nil/false are only allowed as the default option."
|
209
225
|
end
|
210
226
|
end
|
211
227
|
end
|
@@ -222,7 +238,7 @@ class OptionList
|
|
222
238
|
@default.define_singleton_method(cat) { self[cat] }
|
223
239
|
@categories[cat] = value_entry
|
224
240
|
@default[cat] = value
|
225
|
-
end
|
241
|
+
end
|
226
242
|
end
|
227
243
|
|
228
244
|
#Process a symbolic option selection.
|
data/rakefile.rb
CHANGED
@@ -5,11 +5,11 @@ require 'rdoc/task'
|
|
5
5
|
RDoc::Task.new do |rdoc|
|
6
6
|
rdoc.rdoc_dir = "rdoc"
|
7
7
|
#rdoc.main = "option_list.rb"
|
8
|
-
rdoc.rdoc_files = ['option_list.rb', 'option_list_test.rb', 'license.txt']
|
8
|
+
rdoc.rdoc_files = ['lib/option_list.rb', 'tests/option_list_test.rb', 'license.txt']
|
9
9
|
rdoc.options << '--visibility' << 'private'
|
10
10
|
end
|
11
11
|
|
12
12
|
Rake::TestTask.new do |t|
|
13
|
-
t.test_files = ['option_list_test.rb']
|
13
|
+
t.test_files = ['tests/option_list_test.rb']
|
14
14
|
t.verbose = false
|
15
15
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#A formal testing frame for the option list class.
|
2
2
|
#Execute this file to perform the tests.
|
3
3
|
|
4
|
-
require_relative 'option_list'
|
4
|
+
require_relative '../lib/option_list'
|
5
5
|
require 'minitest/autorun'
|
6
6
|
|
7
7
|
class OptionTest
|
@@ -197,6 +197,29 @@ class OptionListTester < MiniTest::Unit::TestCase
|
|
197
197
|
assert(o.history.nil?)
|
198
198
|
end
|
199
199
|
|
200
|
+
def test_that_mandatory_parms_work
|
201
|
+
ol2 = OptionList.new([:history, false, :history, :nohistory])
|
202
|
+
|
203
|
+
o = ol2.select([:history])
|
204
|
+
assert(o.history?)
|
205
|
+
refute(o.nohistory?)
|
206
|
+
assert_equal(o.history, :history)
|
207
|
+
|
208
|
+
o = ol2.select([:nohistory])
|
209
|
+
assert(o.nohistory?)
|
210
|
+
refute(o.history?)
|
211
|
+
assert_equal(o.history, :nohistory)
|
212
|
+
|
213
|
+
assert_raises(ArgumentError) { ol2.select() }
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_that_it_does_not_munge_parms
|
217
|
+
parm1 = [:history, false, :history, :nohistory]
|
218
|
+
parm2 = parm1.clone
|
219
|
+
ol2 = OptionList.new(parm1)
|
220
|
+
assert_equal(parm1, parm2)
|
221
|
+
end
|
222
|
+
|
200
223
|
def test_that_the_select_block_works
|
201
224
|
ol3 = OptionList.new([:history, nil, :history, :nohistory],
|
202
225
|
fuel1: :matter, fuel2: :antimatter) do |opt|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: option_list
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Peter Camilleri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-11-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -45,18 +45,18 @@ extensions: []
|
|
45
45
|
extra_rdoc_files:
|
46
46
|
- license.txt
|
47
47
|
files:
|
48
|
-
- option_list.rb
|
49
|
-
- option_list_test.rb
|
48
|
+
- lib/option_list.rb
|
49
|
+
- tests/option_list_test.rb
|
50
50
|
- rakefile.rb
|
51
51
|
- license.txt
|
52
|
-
homepage: http://teuthida-technologies.com
|
52
|
+
homepage: http://teuthida-technologies.com/
|
53
53
|
licenses:
|
54
54
|
- MIT
|
55
55
|
metadata: {}
|
56
56
|
post_install_message:
|
57
57
|
rdoc_options: []
|
58
58
|
require_paths:
|
59
|
-
-
|
59
|
+
- lib
|
60
60
|
required_ruby_version: !ruby/object:Gem::Requirement
|
61
61
|
requirements:
|
62
62
|
- - ! '>='
|
@@ -74,4 +74,4 @@ signing_key:
|
|
74
74
|
specification_version: 4
|
75
75
|
summary: A unified handler for flexible function option parameters.
|
76
76
|
test_files:
|
77
|
-
- option_list_test.rb
|
77
|
+
- tests/option_list_test.rb
|