parameters 0.2.3 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. data/.gemtest +0 -0
  2. data/.gitignore +10 -0
  3. data/ChangeLog.md +7 -0
  4. data/LICENSE.txt +1 -2
  5. data/README.md +15 -14
  6. data/Rakefile +6 -5
  7. data/gemspec.yml +5 -4
  8. data/lib/parameters/class_methods.rb +61 -22
  9. data/lib/parameters/class_param.rb +23 -0
  10. data/lib/parameters/instance_param.rb +21 -1
  11. data/lib/parameters/param.rb +17 -337
  12. data/lib/parameters/parameters.rb +54 -62
  13. data/lib/parameters/types.rb +17 -0
  14. data/lib/parameters/types/array.rb +83 -0
  15. data/lib/parameters/types/boolean.rb +47 -0
  16. data/lib/parameters/types/class.rb +45 -0
  17. data/lib/parameters/types/date.rb +28 -0
  18. data/lib/parameters/types/date_time.rb +29 -0
  19. data/lib/parameters/types/float.rb +26 -0
  20. data/lib/parameters/types/hash.rb +98 -0
  21. data/lib/parameters/types/integer.rb +31 -0
  22. data/lib/parameters/types/object.rb +50 -0
  23. data/lib/parameters/types/proc.rb +35 -0
  24. data/lib/parameters/types/regexp.rb +26 -0
  25. data/lib/parameters/types/set.rb +28 -0
  26. data/lib/parameters/types/string.rb +22 -0
  27. data/lib/parameters/types/symbol.rb +26 -0
  28. data/lib/parameters/types/time.rb +33 -0
  29. data/lib/parameters/types/type.rb +65 -0
  30. data/lib/parameters/types/types.rb +96 -0
  31. data/lib/parameters/types/uri.rb +41 -0
  32. data/lib/parameters/version.rb +2 -1
  33. data/parameters.gemspec +124 -7
  34. data/spec/class_param_spec.rb +1 -199
  35. data/spec/instance_param_spec.rb +3 -205
  36. data/spec/parameters_spec.rb +81 -58
  37. data/spec/spec_helper.rb +1 -1
  38. data/spec/types/array_spec.rb +39 -0
  39. data/spec/types/boolean_spec.rb +42 -0
  40. data/spec/types/class_spec.rb +31 -0
  41. data/spec/types/date_spec.rb +20 -0
  42. data/spec/types/date_time_spec.rb +20 -0
  43. data/spec/types/float_spec.rb +12 -0
  44. data/spec/types/hash_spec.rb +71 -0
  45. data/spec/types/integer_spec.rb +18 -0
  46. data/spec/types/object_spec.rb +24 -0
  47. data/spec/types/proc_spec.rb +21 -0
  48. data/spec/types/regexp_spec.rb +12 -0
  49. data/spec/types/set_spec.rb +40 -0
  50. data/spec/types/string_spec.rb +12 -0
  51. data/spec/types/symbol_spec.rb +12 -0
  52. data/spec/types/time_spec.rb +25 -0
  53. data/spec/types/types_spec.rb +82 -0
  54. data/spec/types/uri_spec.rb +23 -0
  55. metadata +107 -90
File without changes
@@ -0,0 +1,10 @@
1
+ doc
2
+ pkg
3
+ tmp/*
4
+ .DS_Store
5
+ .bundle
6
+ .yardoc
7
+ *.db
8
+ *.log
9
+ *.swp
10
+ *~
@@ -1,3 +1,10 @@
1
+ ### 0.3.0 / 2011-12-13
2
+
3
+ * Added {Parameters::ClassMethods#set_param}.
4
+ * Added {Parameters#set_param}.
5
+ * Added {Parameters::Types}.
6
+ * Improved the type coercion logic (via {Parameters::Types}).
7
+
1
8
  ### 0.2.3 / 2010-10-27
2
9
 
3
10
  * Have parameter reader/writer class-methods search down the ancestory
@@ -1,5 +1,5 @@
1
1
 
2
- Copyright (c) 2008-2010 Hal Brodigan
2
+ Copyright (c) 2008-2011 Hal Brodigan
3
3
 
4
4
  Permission is hereby granted, free of charge, to any person obtaining
5
5
  a copy of this software and associated documentation files (the
@@ -19,4 +19,3 @@ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19
19
  CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20
20
  TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21
21
  SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
-
data/README.md CHANGED
@@ -1,8 +1,9 @@
1
1
  # Parameters
2
2
 
3
- * [parameters.rubyforge.org](http://parameters.rubyforge.org/)
4
- * [github.com/postmodern/parameters](http://github.com/postmodern/parameters/)
5
- * Postmodern (postmodern.mod3 at gmail.com)
3
+ * [Source](http://github.com/postmodern/parameters)
4
+ * [Issues](http://github.com/postmodern/parameters/issues)
5
+ * [Documentation](http://rubydoc.info/gems/parameters/frames)
6
+ * [Email](mailto:postmodern.mod3 at gmail.com)
6
7
 
7
8
  ## Description
8
9
 
@@ -21,6 +22,8 @@ have configurable default values.
21
22
 
22
23
  ## Examples
23
24
 
25
+ require 'parameters'
26
+
24
27
  class Octagon
25
28
 
26
29
  include Parameters
@@ -42,28 +45,26 @@ have configurable default values.
42
45
  # URI, Regexp, DateTime, Date, Symbol, String, Integer, Float
43
46
  # and true (for boolean types).
44
47
  #
45
- parameter :radius,
46
- :type => Float,
47
- :description => 'The radius of the Octagon'
48
+ parameter :radius, :type => Float,
49
+ :description => 'The radius of the Octagon'
48
50
 
49
51
  #
50
52
  # A parameter with a lambda for a default value
51
53
  #
52
- parameter :opacity,
53
- :default => lambda { rand },
54
- :description => 'The opacity of the Octagon'
54
+ parameter :opacity, :default => lambda { rand },
55
+ :description => 'The opacity of the Octagon'
55
56
 
56
57
  end
57
58
 
58
59
  # Create an object with default values for all parameters
59
60
  oct = Octagon.new
60
- oct.x # => 0
61
- oct.y # => 0.5
61
+ oct.x # => 0
62
+ oct.y # => 0.5
62
63
  oct.opacity # => 0.25
63
64
 
64
65
  # Create an object with the given parameter values.
65
66
  oct = Octagon.new(:radius => 10)
66
- oct.radius # => 10
67
+ oct.radius # => 10
67
68
  oct.opacity # => 0.7
68
69
 
69
70
  # Set parameter values of a class
@@ -73,7 +74,7 @@ have configurable default values.
73
74
  # Create an object with parameter defaulte values inherited from the
74
75
  # class parameters
75
76
  oct = Octagon.new
76
- oct.radius # => 33
77
+ oct.radius # => 33
77
78
  oct.opacity # => 0.3
78
79
 
79
80
  # Coerce data from the command-line into the given parameter type
@@ -82,7 +83,7 @@ have configurable default values.
82
83
 
83
84
  ## Install
84
85
 
85
- $ sudo gem install parameters
86
+ $ gem install parameters
86
87
 
87
88
  ## License
88
89
 
data/Rakefile CHANGED
@@ -2,17 +2,17 @@ require 'rubygems'
2
2
  require 'rake'
3
3
 
4
4
  begin
5
- gem 'ore-tasks', '~> 0.1.2'
5
+ gem 'ore-tasks', '~> 0.4'
6
6
  require 'ore/tasks'
7
7
 
8
8
  Ore::Tasks.new
9
9
  rescue LoadError => e
10
- STDERR.puts e.message
11
- STDERR.puts "Run `gem install ore-tasks` to install 'ore/tasks'."
10
+ warn e.message
11
+ warn "Run `gem install ore-tasks` to install 'ore/tasks'."
12
12
  end
13
13
 
14
14
  begin
15
- gem 'rspec', '~> 2.0.0'
15
+ gem 'rspec', '~> 2.4'
16
16
  require 'rspec/core/rake_task'
17
17
 
18
18
  RSpec::Core::RakeTask.new
@@ -21,10 +21,11 @@ rescue LoadError => e
21
21
  abort "Please run `gem install rspec` to install RSpec."
22
22
  end
23
23
  end
24
+ task :test => :spec
24
25
  task :default => :spec
25
26
 
26
27
  begin
27
- gem 'yard', '~> 0.6.0'
28
+ gem 'yard', '~> 0.7'
28
29
  require 'yard'
29
30
 
30
31
  YARD::Rake::YardocTask.new
@@ -10,8 +10,9 @@ email: postmodern.mod3@gmail.com
10
10
  homepage: http://github.com/postmodern/parameters
11
11
  has_yard: true
12
12
 
13
+ required_ruby_version: ">= 1.8.7"
14
+
13
15
  development_dependencies:
14
- ore: ~> 0.2.0
15
- ore-tasks: ~> 0.1.2
16
- rspec: ~> 2.0.0
17
- yard: ~> 0.6.0
16
+ ore-tasks: ~> 0.4
17
+ rspec: ~> 2.4
18
+ yard: ~> 0.7
@@ -29,11 +29,13 @@ module Parameters
29
29
  def params=(values)
30
30
  values.each do |name,value|
31
31
  if has_param?(name)
32
- if (value.kind_of?(Parameters::ClassParam) || value.kind_of?(Parameters::InstanceParam))
33
- value = value.value
34
- end
35
-
36
- get_param(name).value = value
32
+ get_param(name).value = case value
33
+ when Parameters::ClassParam,
34
+ Parameters::InstanceParam
35
+ value.value
36
+ else
37
+ value
38
+ end
37
39
  end
38
40
  end
39
41
  end
@@ -65,14 +67,6 @@ module Parameters
65
67
  def parameter(name,options={})
66
68
  name = name.to_sym
67
69
 
68
- # add the parameter to the class params list
69
- params[name] = Parameters::ClassParam.new(
70
- name,
71
- options[:type],
72
- options[:description],
73
- options[:default]
74
- )
75
-
76
70
  # define the reader class method for the parameter
77
71
  meta_def(name) do
78
72
  get_param(name).value
@@ -85,6 +79,37 @@ module Parameters
85
79
 
86
80
  # define the getter/setter instance methods for the parameter
87
81
  attr_accessor(name)
82
+
83
+ # create the new parameter
84
+ new_param = Parameters::ClassParam.new(
85
+ name,
86
+ options[:type],
87
+ options[:description],
88
+ options[:default]
89
+ )
90
+
91
+ # add the parameter to the class params list
92
+ params[name] = new_param
93
+ return new_param
94
+ end
95
+
96
+ #
97
+ # Determines if a class parameter exists with the given name.
98
+ #
99
+ # @return [Boolean]
100
+ # Specifies whether or not there is a class parameter with the
101
+ # specified name.
102
+ #
103
+ def has_param?(name)
104
+ name = name.to_sym
105
+
106
+ ancestors.each do |ancestor|
107
+ if ancestor.included_modules.include?(Parameters)
108
+ return true if ancestor.params.has_key?(name)
109
+ end
110
+ end
111
+
112
+ return false
88
113
  end
89
114
 
90
115
  #
@@ -94,10 +119,10 @@ module Parameters
94
119
  # The class parameter name to search for.
95
120
  #
96
121
  # @return [ClassParam]
97
- # The class parameter with the matching _name_.
122
+ # The class parameter with the matching name.
98
123
  #
99
124
  # @raise [ParamNotFound]
100
- # No class parameter with the specified _name_ could be found.
125
+ # No class parameter with the specified name could be found.
101
126
  #
102
127
  def get_param(name)
103
128
  name = name.to_sym
@@ -110,24 +135,38 @@ module Parameters
110
135
  end
111
136
  end
112
137
 
113
- raise(Parameters::ParamNotFound,"parameter #{name.to_s.dump} was not found in class #{self.name.dump}",caller)
138
+ raise(Parameters::ParamNotFound,"parameter #{name.to_s.dump} was not found in class #{self}")
114
139
  end
115
140
 
116
141
  #
117
- # @return [Boolean]
118
- # Specifies whether or not there is a class parameter with the
119
- # specified _name_.
142
+ # Sets a class parameter.
120
143
  #
121
- def has_param?(name)
144
+ # @param [Symbol, String] name
145
+ # The name of the class parameter.
146
+ #
147
+ # @param [Object] value
148
+ # The new value for the class parameter.
149
+ #
150
+ # @return [Object]
151
+ # The new value of the class parameter.
152
+ #
153
+ # @raise [ParamNotfound]
154
+ # No class parameter with the specified name could be found.
155
+ #
156
+ # @since 0.3.0
157
+ #
158
+ def set_param(name,value)
122
159
  name = name.to_sym
123
160
 
124
161
  ancestors.each do |ancestor|
125
162
  if ancestor.included_modules.include?(Parameters)
126
- return true if ancestor.params.has_key?(name)
163
+ if ancestor.params.has_key?(name)
164
+ return ancestor.params[name].set(value)
165
+ end
127
166
  end
128
167
  end
129
168
 
130
- return false
169
+ raise(Parameters::ParamNotFound,"parameter #{name.to_s.dump} was not found in class #{self}")
131
170
  end
132
171
 
133
172
  #
@@ -42,6 +42,29 @@ module Parameters
42
42
  @value = coerce(new_value)
43
43
  end
44
44
 
45
+ #
46
+ # Creates an instance parameter from the class param.
47
+ #
48
+ # @param [Object] object
49
+ # The object the instance parameter should be connected to.
50
+ #
51
+ # @return [InstanceParam]
52
+ # The new instance parameter.
53
+ #
54
+ # @since 0.3.0
55
+ #
56
+ # @api semipublic
57
+ #
58
+ def to_instance(object)
59
+ InstanceParam.new(
60
+ object,
61
+ @name,
62
+ @type,
63
+ @description,
64
+ @value
65
+ )
66
+ end
67
+
45
68
  #
46
69
  # @return [String]
47
70
  # The representation of the class param.
@@ -22,10 +22,30 @@ module Parameters
22
22
  # @param [String, nil] description
23
23
  # The description of the instance parameter.
24
24
  #
25
- def initialize(object,name,type=nil,description=nil)
25
+ # @param [Object] value
26
+ # The initial value for the instance parameter.
27
+ #
28
+ def initialize(object,name,type=nil,description=nil,value=nil)
26
29
  super(name,type,description)
27
30
 
28
31
  @object = object
32
+
33
+ if (self.value.nil? && value)
34
+ self.value = case value
35
+ when Proc
36
+ if value.arity > 0
37
+ value.call(@object)
38
+ else
39
+ value.call()
40
+ end
41
+ else
42
+ begin
43
+ value.clone
44
+ rescue TypeError
45
+ value
46
+ end
47
+ end
48
+ end
29
49
  end
30
50
 
31
51
  #
@@ -1,6 +1,4 @@
1
- require 'set'
2
- require 'uri'
3
- require 'date'
1
+ require 'parameters/types'
4
2
 
5
3
  module Parameters
6
4
  class Param
@@ -28,79 +26,26 @@ module Parameters
28
26
  #
29
27
  def initialize(name,type=nil,description=nil)
30
28
  @name = name.to_sym
31
- @type = type
29
+ @type = case type
30
+ when Types::Type
31
+ type
32
+ when Class
33
+ if type < Types::Type
34
+ type
35
+ else
36
+ Types[type]
37
+ end
38
+ else
39
+ Types[type]
40
+ end
41
+
32
42
  @description = description
33
43
  end
34
44
 
35
45
  protected
36
46
 
37
- # Type classes and their coercion methods
38
- TYPE_COERSION = {
39
- Hash => :coerce_hash,
40
- Set => :coerce_set,
41
- Array => :coerce_array,
42
- URI => :coerce_uri,
43
- Regexp => :coerce_regexp,
44
- DateTime => :coerce_date,
45
- Date => :coerce_date,
46
- Symbol => :coerce_symbol,
47
- String => :coerce_string,
48
- Integer => :coerce_integer,
49
- Float => :coerce_float,
50
- true => :coerce_boolean
51
- }
52
-
53
- #
54
- # Coerces a given value into a specific type.
55
- #
56
- # @param [Class, Proc] type
57
- # The type to coerce the value into. If a Proc is given, it will be
58
- # called with the value to coerce.
59
- #
60
- # @param [Object] value
61
- # The value to coerce.
62
- #
63
- # @return [Object]
64
- # The coerced value.
65
- #
66
- # @since 0.2.0
67
- #
68
- def coerce_type(type,value)
69
- if value.nil?
70
- nil
71
- elsif type.kind_of?(Hash)
72
- key_type, value_type = type.entries.first
73
- new_hash = {}
74
-
75
- coerce_hash(Hash,value).each do |key,value|
76
- key = coerce_type(key_type,key)
77
- value = coerce_type(value_type,value)
78
-
79
- new_hash[key] = value
80
- end
81
-
82
- return new_hash
83
- elsif type.kind_of?(Set)
84
- coerce_array(Array,value).map { |element|
85
- coerce_type(type.entries.first,element)
86
- }.to_set
87
- elsif type.kind_of?(Array)
88
- coerce_array(Array,value).map do |element|
89
- coerce_type(type.entries.first,element)
90
- end
91
- elsif type.kind_of?(Proc)
92
- type.call(value)
93
- elsif (method_name = TYPE_COERSION[type])
94
- self.send(method_name,type,value)
95
- elsif (type.nil? || type == Object)
96
- value
97
- else
98
- type.new(value)
99
- end
100
- end
101
-
102
47
  #
103
- # Coerces a given value into the `type` of the param.
48
+ # Coerces the value into the param type.
104
49
  #
105
50
  # @param [Object] value
106
51
  # The value to coerce.
@@ -108,276 +53,11 @@ module Parameters
108
53
  # @return [Object]
109
54
  # The coerced value.
110
55
  #
111
- # @since 0.2.0
112
- #
113
56
  def coerce(value)
114
- coerce_type(@type,value)
115
- end
116
-
117
- #
118
- # Coerces a given value into a `Hash`.
119
- #
120
- # @param [Hash{Class => Class}] type
121
- # An optional `Set` containing the type to coerce the keys and values
122
- # of the given value to.
123
- #
124
- # @param [Hash, #to_hash, Object] value
125
- # The value to coerce into a `Hash`.
126
- #
127
- # @return [Hash]
128
- # The coerced value.
129
- #
130
- # @since 0.2.1
131
- #
132
- def coerce_hash(type,value)
133
- if value.kind_of?(Hash)
57
+ if @type === value
134
58
  value
135
- elsif value.kind_of?(Array)
136
- Hash[*value]
137
- elsif value.respond_to?(:to_hash)
138
- value.to_hash
139
- else
140
- {value => true}
141
- end
142
- end
143
-
144
- #
145
- # Coerces a given value into a `Set`.
146
- #
147
- # @param [Set[Class]] type
148
- # An optional `Set` containing the type to coerce the elements
149
- # of the given value to.
150
- #
151
- # @param [Enumerable, Object] value
152
- # The value to coerce into a `Set`.
153
- #
154
- # @return [Set]
155
- # The coerced value.
156
- #
157
- # @since 0.2.0
158
- #
159
- def coerce_set(type,value)
160
- if value.kind_of?(Set)
161
- value
162
- elsif (value.kind_of?(Enumerable) || value.respond_to?(:to_set))
163
- value.to_set
164
- else
165
- Set[value]
166
- end
167
- end
168
-
169
- #
170
- # Coerces a given value into an `Array`.
171
- #
172
- # @param [Array[Class]] type
173
- # An optional `Array` containing the type to coerce the elements
174
- # of the given value to.
175
- #
176
- # @param [Enumerable, Object] value
177
- # The value to coerce into an `Array`.
178
- #
179
- # @return [Array]
180
- # The coerced value.
181
- #
182
- # @since 0.2.0
183
- #
184
- def coerce_array(type,value)
185
- if value.kind_of?(Array)
186
- value
187
- elsif (value.kind_of?(Enumerable) || value.respond_to?(:to_a))
188
- value.to_a
189
- else
190
- [value]
191
- end
192
- end
193
-
194
- #
195
- # Coerces a given value into a `URI`.
196
- #
197
- # @param [Class] type
198
- # The `URI` type to coerce to.
199
- #
200
- # @param [URI::Generic, #to_s] value
201
- # The value to coerce into a `URI`.
202
- #
203
- # @return [URI::Generic]
204
- # The coerced value.
205
- #
206
- # @since 0.2.0
207
- #
208
- def coerce_uri(type,value)
209
- if value.kind_of?(type)
210
- value
211
- else
212
- URI.parse(value.to_s)
213
- end
214
- end
215
-
216
- #
217
- # Coerces a given value into a `Regexp`.
218
- #
219
- # @param [Class] type
220
- # The `Regexp` type to coerce to.
221
- #
222
- # @param [Regexp, #to_s] value
223
- # The value to coerce into a `Regexp`.
224
- #
225
- # @return [Regexp]
226
- # The coerced value.
227
- #
228
- # @since 0.2.0
229
- #
230
- def coerce_regexp(type,value)
231
- if value.kind_of?(Regexp)
232
- value
233
- else
234
- Regexp.new(value.to_s)
235
- end
236
- end
237
-
238
- #
239
- # Coerces a given value into a `Symbol`.
240
- #
241
- # @param [Class] type
242
- # The `Symbol` class.
243
- #
244
- # @param [#to_s] value
245
- # The value to coerce.
246
- #
247
- # @return [Symbol]
248
- # The coerced value.
249
- #
250
- # @since 0.2.0
251
- #
252
- def coerce_symbol(type,value)
253
- if value.kind_of?(type)
254
- value
255
- else
256
- value.to_s.to_sym
257
- end
258
- end
259
-
260
- #
261
- # Coerces a given value into a `String`.
262
- #
263
- # @param [Class] type
264
- # The `String` class.
265
- #
266
- # @param [#to_s] value
267
- # The value to coerce into a `String`.
268
- #
269
- # @return [String]
270
- # The coerced value.
271
- #
272
- # @since 0.2.0
273
- #
274
- def coerce_string(type,value)
275
- if value.kind_of?(type)
276
- value
277
- else
278
- value.to_s
279
- end
280
- end
281
-
282
- #
283
- # Coerces a given value into an `Integer`.
284
- #
285
- # @param [Class]
286
- # The Integer class.
287
- #
288
- # @param [String, #to_i] value
289
- # The value to coerce into an `Integer`.
290
- #
291
- # @return [Integer]
292
- # The coerced value.
293
- #
294
- # @since 0.2.0
295
- #
296
- def coerce_integer(type,value)
297
- if value.kind_of?(type)
298
- value
299
- elsif value.kind_of?(String)
300
- base = if value[0..1] == '0x'
301
- 16
302
- elsif value[0..0] == '0'
303
- 8
304
- else
305
- 10
306
- end
307
-
308
- value.to_i(base)
309
- elsif value.respond_to?(:to_i)
310
- value.to_i
311
- else
312
- 0
313
- end
314
- end
315
-
316
- #
317
- # Coerces a given value into a `Float`.
318
- #
319
- # @param [Class] type
320
- # The `Float` class.
321
- #
322
- # @param [String, #to_f] value
323
- # The value to coerce into a `Float`.
324
- #
325
- # @return [Float]
326
- # The coerced value.
327
- #
328
- # @since 0.2.0
329
- #
330
- def coerce_float(type,value)
331
- if value.kind_of?(type)
332
- value
333
- elsif (value.kind_of?(String) || value.respond_to?(:to_f))
334
- value.to_f
335
- else
336
- 0.0
337
- end
338
- end
339
-
340
- #
341
- # Coerces a given value into a `DateTime` or `Date`.
342
- #
343
- # @param [Class] type
344
- # The `DateTime` or `Date` class.
345
- #
346
- # @param [#to_s] value
347
- # The value to coerce into either a `Date` or `DateTime` object.
348
- #
349
- # @return [DateTime, Date]
350
- # The coerced value.
351
- #
352
- # @since 0.2.0
353
- #
354
- def coerce_date(type,value)
355
- if value.kind_of?(type)
356
- value
357
- else
358
- type.parse(value.to_s)
359
- end
360
- end
361
-
362
- #
363
- # Coerces a given value into either a `true` or `false` value.
364
- #
365
- # @param [true] type
366
- #
367
- # @param [TrueClass, FalseClass, String, Symbol] value
368
- # The value to coerce into either a `true` or `false` value.
369
- #
370
- # @return [TrueClass, FalseClass]
371
- # The coerced value.
372
- #
373
- # @since 0.2.0
374
- #
375
- def coerce_boolean(type,value)
376
- case value
377
- when FalseClass, NilClass, 'false', :false
378
- false
379
59
  else
380
- true
60
+ @type.coerce(value)
381
61
  end
382
62
  end
383
63