parameters_schema 0.42 → 1.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 699ec439cfd577bce7294f3718e6a45b4e9d4652
4
- data.tar.gz: 6bc716b44313cc86c2b10ab393c6c9ad01c6dd9a
3
+ metadata.gz: ab3f9f1e20eec3092c2362e52e002e974c51b2ba
4
+ data.tar.gz: a9c817c713fa10529286f629d576d5eb09673879
5
5
  SHA512:
6
- metadata.gz: f538951c2a1732b9cfa90412069a53d5ad5e5907667ae0b262fdd25c018082fabfbe3b409c7c660663166145eb5e9eb88254eba89f169e8337bd35ff49226aad
7
- data.tar.gz: 2820f485ea953e8c629b6262b42db91ed6774f94509db1417eb85d5d537025c3eea1f1ccaae645d478ef3faaf86ed1746df579da52e33c4cc5e61a7bb70afad6
6
+ metadata.gz: 68980a8ff4bf48844160bc378a7f572fed2b25c49f6f35ef8f26e667c66dd8a6a0a0cf46559e0624afbe507da3a78c4c8d681540b4ac9ff977ab6ef4e4875a17
7
+ data.tar.gz: b90a54e7fee674a137305a0c958197b814756f4fe8bfe1fb1e49c95df31d433ca4b10bc2127e52679d50be3bb3a6af4bb3ee3d8c6edbacc85753695a3d46a108
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'http://rubygems.org'
2
-
3
- gem 'minitest'
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'minitest'
4
4
  gem 'activesupport'
data/README.md CHANGED
@@ -1,286 +1,286 @@
1
- # Parameters Schema
2
-
3
- ## *"A strict API is the best kind of API."*
4
-
5
- In this line of thought, **[strong_parameters](https://github.com/rails/strong_parameters)** lacks some cool validations that this gem provide.
6
-
7
- For example, let's say you want your operation `create` to require a `Fixnum` parameter between 1 and 99. With strong_parameters, you're out of luck. With this gem, you simply write in your controller:
8
- ``` ruby
9
- class Api::PeopleController < Api::BaseController
10
- def create
11
- validated_params = validate_params params do
12
- param :age, type: Fixnum, allow: (1..99)
13
- end
14
-
15
- # Do something with the validated parameters.
16
- end
17
- end
18
- ```
19
-
20
- So when you use this controller:
21
- ``` ruby
22
- > app.post 'api/people', age: 12 # validated_params = { age: 12 }
23
- > app.post 'api/people', age: 100 # throws a ParameterSchema::InvalidParameters
24
- ```
25
-
26
- ## Why use this gem instead of strong_parameters
27
-
28
- * You prefer a procedural approach (via a DSL) over a declarative one.
29
- * You want more control over the parameters of your API, at the type and format level.
30
- * You want to do things differently, you fucking hipster.
31
-
32
- ## Installation
33
-
34
- Add in your Gemfile:
35
- ``` ruby
36
- gem 'parameters_schema'
37
- ```
38
-
39
- Add in your project:
40
- ``` ruby
41
- require 'parameters_schema'
42
- ```
43
-
44
- ## Schema
45
-
46
- The schema is the heart of this gem. It provides a simple DSL to express an operation's parameters.
47
-
48
- Creating a schema:
49
- ``` ruby
50
- schema = ParametersSchema::Schema.new do
51
- # Define parameters here...
52
- # ... but an empty schema is also valid.
53
- end
54
- ```
55
- Validating parameters against a schema:
56
- ``` ruby
57
- params = { potatoe: 'Eramosa' }
58
- schema.validate!(params)
59
- ```
60
-
61
- The minimal representation of a parameter is:
62
- ``` ruby
63
- param :potatoe
64
- ```
65
- This represents a `required` parameter of type `String` accepting any characters and which doesn't allow nil or empty values.
66
-
67
- The valid options for a parameter are:
68
- ``` ruby
69
- * required # Whether the parameter is required. Default: true.
70
- * type # The type of the parameter. Default: String.
71
- * allow # The allowed values of the parameter. Default: :any.
72
- * deny # The denied values of the parameter. Default: :none.
73
- * array # Whether the parameter is an array. Default: false.
74
- ```
75
-
76
- ### Parameter types
77
-
78
- The available types are:
79
- ``` ruby
80
- * String
81
- * Symbol
82
- * Fixnum
83
- * Float
84
- * Date
85
- * DateTime
86
- * Array # An array of :any types.
87
- * Hash # An object which members are not validated further.
88
- * :boolean # See options for accepted values.
89
- * :any # Accepts any value type.
90
- ```
91
-
92
- To accept more than one type, you can do:
93
- ``` ruby
94
- param :potatoe, type: [Boolean, String] # Accepts a boolean or string value.
95
- ```
96
-
97
- To accept an array of a specific type, you can do:
98
- ``` ruby
99
- param :potatoes, type: { Array => String } # Accepts an array of strings.
100
- ```
101
-
102
- To deeper refine the schema of an object, you pass a block to the parameter:
103
- ```
104
- param :potatoe do # Implicitly of type Hash
105
- param :variety
106
- param :origin
107
- end
108
- ```
109
-
110
- As you have seen above, a parameter can be of type `Array` but can also have the option `array`. Confusing, right? This option was introduced to simplify the `type` syntax. For example:
111
- ```
112
- param :potatoes, type: String, array: true # This is equivalent...
113
- param :potatoes, type: { Array => String } # ... to this.
114
- ```
115
-
116
- But this parameter truly shine with an array of objects:
117
- ```
118
- param :potatoes, array: true do
119
- param :variety
120
- param :origin
121
- end
122
-
123
- # This syntax is also valid but less sexy:
124
- param :potatoes, type: { Array => Hash } do
125
- param :variety
126
- param :origin
127
- end
128
- ```
129
-
130
- #### Gotchas
131
- * A `Float` value can be passed to a `Fixnum` parameter but will loose its precision.
132
- * Some types accepts more than one representation. Example: `Symbol` accepts any type that respond to `:to_sym`.
133
- * If you define multiple types (ex: `[Symbol, String]`), values are interpreted in this order. So the value `'a'` will be cast to `:a`.
134
- * Defining the type `{ Fixnum => Date }` doesn't make sense so it falls back to `Fixnum` (the key).
135
- * `{ Array => Array }` is accepted. It means a 2D array of `:any`.
136
- * `{ Array => Array => ... }` is not yet supported. Did I hear pull request?
137
-
138
- ### The `allow` and `deny` options
139
-
140
- By default, the value of a parameter can be any one in the spectrum of a type, with the exception of nil and empty. The `allow` and `deny` options can be used to further refine the accepted values.
141
-
142
- To accept nil or empty values:
143
- ``` ruby
144
- param :potatoe, allow: :nil
145
- # => accepts nil, 'Kennebec' but not ''.
146
-
147
- param :potatoe, allow: :empty
148
- # => accepts '', 'Kennebec' but not nil.
149
-
150
- param :potatoe, allow: [:nil, :empty]
151
- # => accepts nil, '' and 'Kennebec'
152
- ```
153
- Of course, this *nil* or *empty* restriction doesn't make sense for all the types so it will only be applied when it does.
154
-
155
- To accept predefined values:
156
- ``` ruby
157
- param :potatoe, allow: ['Superior', 'Ac Belmont', 'Eramosa'] # this is case-sensitive.
158
-
159
- # Gotcha: this will allow empty values even if you wanted to accept the value 'empty'. You can redefine keywords in the options.
160
- param :potatoe, type: Symbol, allow: [:superior, :ac_belmont, :empty]
161
- ```
162
-
163
- To accept a value matching a regex:
164
- ``` ruby
165
- param :potatoe, allow: /^[a-zA-Z]*$/
166
-
167
- # Gotcha: even though the regex above allows empty values, it must be explicitly stated:
168
- param :potatoe, allow: [:empty, /^[a-zA-Z]*$/]
169
- ```
170
-
171
- To accept a value in a range:
172
- ``` ruby
173
- param :potatoe, type: Fixnum, allow: (1..3)
174
- # => accepts 1, 2, 3 but will fail on any other value.
175
- ```
176
-
177
- The `deny` option is conceptually identical to `allow` but a value will fail the validation if a match is found:
178
- ``` ruby
179
- param :potatoe, type: Fixnum, deny: (1..3)
180
- # => accepts any value except 1, 2, 3.
181
- ```
182
-
183
- The options `allow` and `deny` are validated independently. So beware to not define `allow` and `deny` options that encompass all the possible values of the parameter!
184
-
185
- ## Exceptions
186
-
187
- When the validation fails, an instance of `ParametersSchema::InvalidParameters` is raised. This exception contains the attribute `errors` which is an hash of `{ key: error_code }` that you can work with.
188
-
189
- Simple case:
190
- ``` ruby
191
- ParametersSchema::Schema.new do
192
- param :potatoe
193
- end.validate!({})
194
-
195
- # => ParametersSchema::InvalidParameters
196
- # @errors = { potatoe: :missing }
197
- ```
198
-
199
- The validation process tries to accumulate as many errors as possible before raising the exception, so you can have a precise picture of what went wrong:
200
- ``` ruby
201
- ParametersSchema::Schema.new do
202
- param :potatoe do
203
- param :name
204
- param :type, allow: ['Atlantic']
205
- end
206
- end.validate!(potatoe: { type: 'Conestoga' })
207
-
208
- # => ParametersSchema::InvalidParameters
209
- # @errors = { potatoe: { name: :missing, type: :disallowed } }
210
- ```
211
-
212
- The possible error codes are (in the order the are validated):
213
- ``` ruby
214
- * :unknown # The parameter is provided but not defined in the schema.
215
- * :missing # The parameter is required but is missing.
216
- * :nil # The value cannot be nil but is nil.
217
- * :empty # The value cannot be empty but is empty.
218
- * :disallowed # The value has an invalid format (type/allow) other than nil/empty.
219
- ```
220
-
221
- ## Integrate with Rails
222
-
223
- This gem can be used outside of Rails but was created with Rails in mind. For example, the parameters `controller, action, format` are skipped by default (see Options section to override this behavior) and the parameters are defined in a `Hash`. However, this gem doesn't insinuate itself in your project so you must manually add it in your controllers or anywhere else that make sense to you. Here is a little recipe to add validation in your API pipeline:
224
-
225
- In the base controller of your API, add this **helper**:
226
- ``` ruby
227
- # Validate the parameters of an action, using a schema.
228
- # Returns the validated parameters and throw exceptions on invalid input.
229
- def validate_params(&parameters_schema)
230
- schema = ParametersSchema::Schema.new(parameters_schema)
231
- schema.validate!(params)
232
- end
233
- ```
234
- In the base controller of your API, add this **exception handler**:
235
- ``` ruby
236
- # Handle errors related to invalid parameters.
237
- rescue_from ParametersSchema::InvalidParameters do |e|
238
- # Do something with the exception (ex: log it).
239
-
240
- # Render the response.
241
- render json: ..., status: :bad_request
242
- end
243
- ```
244
-
245
- Now in any controller where you want to validate the parameters, you can do:
246
- ``` ruby
247
- def operation
248
- validated_params = validate_parameters do
249
- # ...
250
- end
251
- # ...
252
- end
253
- ```
254
-
255
- ## Options
256
-
257
- Options can be specified on the module `ParametersSchema::Options`. Example:
258
-
259
- ``` ruby
260
- ParametersSchema::Options.skip_parameters = [:internal_stuff]
261
- ```
262
-
263
- Available options:
264
- * `skip_parameters` an array of first-level parameters to skip. Default: `[:controller, :action, :format]`.
265
- * `empty_keyword` the keyword used to represent an empty value. Default: `:empty`.
266
- * `any_keyword` the keyword used to represent any value. Default: `:any`.
267
- * `none_keyword` the keyword used to represent no value. Default: `:none`.
268
- * `boolean_keyword` the keyword used to represent a boolean value. Default: `:boolean`.
269
- * `nil_keyword` the keyword used to represent a nil value. Default: `:nil`.
270
- * `boolean_true_values` the accepted boolean true values. Not case-sensitive. Default: `true`, `'t'`, `'true'`, `'1'`, `1`, `1.0`.
271
- * `boolean_false_values` the accepted boolean false values. Not case-sensitive. Default: `false`, `'f'`, `'false'`, `'0'`, `0`, `0.0`.
272
-
273
- ## Contribute
274
-
275
- Yes, please. Bug fixes, new features, refactoring, unit tests. Send your precious pull requests.
276
-
277
- ### Ideas
278
-
279
- * Array of arrays of ...
280
- * Min/Max for numeric values
281
- * More `allow` options
282
- * Better refine error codes
283
-
284
- ## License
285
-
286
- Parameters Schema is released under the [MIT License](http://www.opensource.org/licenses/MIT).
1
+ # Parameters Schema
2
+
3
+ ## *"A strict API is the best kind of API."*
4
+
5
+ In this line of thought, **[strong_parameters](https://github.com/rails/strong_parameters)** lacks a few awesome validations that this gem provide.
6
+
7
+ For example, let's say you want your operation `create` to require a `Fixnum` parameter between 1 and 99. With strong_parameters, you're out of luck. With this gem, you simply write in your controller:
8
+ ``` ruby
9
+ class Api::PeopleController < Api::BaseController
10
+ def create
11
+ validated_params = validate_params params do
12
+ param :age, type: Fixnum, allow: (1..99)
13
+ end
14
+
15
+ # Do something with the validated parameters.
16
+ end
17
+ end
18
+ ```
19
+
20
+ So when you use this controller:
21
+ ``` ruby
22
+ > app.post 'api/people', age: 12 # validated_params = { age: 12 }
23
+ > app.post 'api/people', age: 100 # throws a ParameterSchema::InvalidParameters
24
+ ```
25
+
26
+ ## Why use this gem instead of strong_parameters
27
+
28
+ * You prefer a procedural approach (via a DSL) over a declarative one.
29
+ * You want more control over the parameters of your API, at the type and format level.
30
+ * You want to do things differently, you darn hipster ;)
31
+
32
+ ## Installation
33
+
34
+ Add in your Gemfile:
35
+ ``` ruby
36
+ gem 'parameters_schema'
37
+ ```
38
+
39
+ Add in your project:
40
+ ``` ruby
41
+ require 'parameters_schema'
42
+ ```
43
+
44
+ ## Schema
45
+
46
+ The schema is the heart of this gem. It provides a simple DSL to express an operation's parameters.
47
+
48
+ Creating a schema:
49
+ ``` ruby
50
+ schema = ParametersSchema::Schema.new do
51
+ # Define parameters here...
52
+ # ... but an empty schema is also valid.
53
+ end
54
+ ```
55
+ Validating parameters against a schema:
56
+ ``` ruby
57
+ params = { potatoe: 'Eramosa' }
58
+ schema.validate!(params)
59
+ ```
60
+
61
+ The minimal representation of a parameter is:
62
+ ``` ruby
63
+ param :potatoe
64
+ ```
65
+ This represents a `required` parameter of type `String` accepting any characters and which doesn't allow nil or empty values.
66
+
67
+ The valid options for a parameter are:
68
+ ``` ruby
69
+ * required # Whether the parameter is required. Default: true.
70
+ * type # The type of the parameter. Default: String.
71
+ * allow # The allowed values of the parameter. Default: :any.
72
+ * deny # The denied values of the parameter. Default: :none.
73
+ * array # Whether the parameter is an array. Default: false.
74
+ ```
75
+
76
+ ### Parameter types
77
+
78
+ The available types are:
79
+ ``` ruby
80
+ * String
81
+ * Symbol
82
+ * Fixnum
83
+ * Float
84
+ * Date
85
+ * DateTime
86
+ * Array # An array of :any types.
87
+ * Hash # An object which members are not validated further.
88
+ * :boolean # See options for accepted values.
89
+ * :any # Accepts any value type.
90
+ ```
91
+
92
+ To accept more than one type, you can do:
93
+ ``` ruby
94
+ param :potatoe, type: [Boolean, String] # Accepts a boolean or string value.
95
+ ```
96
+
97
+ To accept an array of a specific type, you can do:
98
+ ``` ruby
99
+ param :potatoes, type: { Array => String } # Accepts an array of strings.
100
+ ```
101
+
102
+ To deeper refine the schema of an object, you pass a block to the parameter:
103
+ ``` ruby
104
+ param :potatoe do # Implicitly of type Hash
105
+ param :variety
106
+ param :origin
107
+ end
108
+ ```
109
+
110
+ As you have seen above, a parameter can be of type `Array` but can also have the option `array`. Confusing, right? This option was introduced to simplify the `type` syntax. For example:
111
+ ``` ruby
112
+ param :potatoes, type: String, array: true # This is equivalent...
113
+ param :potatoes, type: { Array => String } # ... to this.
114
+ ```
115
+
116
+ But this parameter truly shine with an array of objects:
117
+ ``` ruby
118
+ param :potatoes, array: true do
119
+ param :variety
120
+ param :origin
121
+ end
122
+
123
+ # This syntax is also valid but less sexy:
124
+ param :potatoes, type: { Array => Hash } do
125
+ param :variety
126
+ param :origin
127
+ end
128
+ ```
129
+
130
+ #### Gotchas
131
+ * A `Float` value can be passed to a `Fixnum` parameter but will loose its precision.
132
+ * Some types accepts more than one representation. Example: `Symbol` accepts any type that respond to `:to_sym`.
133
+ * If you define multiple types (ex: `[Symbol, String]`), values are interpreted in this order. So the value `'a'` will be cast to `:a`.
134
+ * Defining the type `{ Fixnum => Date }` doesn't make sense so it falls back to `Fixnum` (the key).
135
+ * `{ Array => Array }` is accepted. It means a 2D array of `:any`.
136
+ * `{ Array => Array => ... }` is not yet supported. Did I hear pull request?
137
+
138
+ ### The `allow` and `deny` options
139
+
140
+ By default, the value of a parameter can be any one in the spectrum of a type, with the exception of nil and empty. The `allow` and `deny` options can be used to further refine the accepted values.
141
+
142
+ To accept nil or empty values:
143
+ ``` ruby
144
+ param :potatoe, allow: :nil
145
+ # => accepts nil, 'Kennebec' but not ''.
146
+
147
+ param :potatoe, allow: :empty
148
+ # => accepts '', 'Kennebec' but not nil.
149
+
150
+ param :potatoe, allow: [:nil, :empty]
151
+ # => accepts nil, '' and 'Kennebec'
152
+ ```
153
+ Of course, this *nil* or *empty* restriction doesn't make sense for all the types so it will only be applied when it does.
154
+
155
+ To accept predefined values:
156
+ ``` ruby
157
+ param :potatoe, allow: ['Superior', 'Ac Belmont', 'Eramosa'] # this is case-sensitive.
158
+
159
+ # Gotcha: this will allow empty values even if you wanted to accept the value 'empty'. You can redefine keywords in the options.
160
+ param :potatoe, type: Symbol, allow: [:superior, :ac_belmont, :empty]
161
+ ```
162
+
163
+ To accept a value matching a regex:
164
+ ``` ruby
165
+ param :potatoe, allow: /^[a-zA-Z]*$/
166
+
167
+ # Gotcha: even though the regex above allows empty values, it must be explicitly stated:
168
+ param :potatoe, allow: [:empty, /^[a-zA-Z]*$/]
169
+ ```
170
+
171
+ To accept a value in a range:
172
+ ``` ruby
173
+ param :potatoe, type: Fixnum, allow: (1..3)
174
+ # => accepts 1, 2, 3 but will fail on any other value.
175
+ ```
176
+
177
+ The `deny` option is conceptually identical to `allow` but a value will fail the validation if a match is found:
178
+ ``` ruby
179
+ param :potatoe, type: Fixnum, deny: (1..3)
180
+ # => accepts any value except 1, 2, 3.
181
+ ```
182
+
183
+ The options `allow` and `deny` are validated independently. So beware to not define `allow` and `deny` options that encompass all the possible values of the parameter!
184
+
185
+ ## Exceptions
186
+
187
+ When the validation fails, an instance of `ParametersSchema::InvalidParameters` is raised. This exception contains the attribute `errors` which is an hash of `{ key: error_code }` that you can work with.
188
+
189
+ Simple case:
190
+ ``` ruby
191
+ ParametersSchema::Schema.new do
192
+ param :potatoe
193
+ end.validate!({})
194
+
195
+ # => ParametersSchema::InvalidParameters
196
+ # @errors = { potatoe: :missing }
197
+ ```
198
+
199
+ The validation process tries to accumulate as many errors as possible before raising the exception, so you can have a precise picture of what went wrong:
200
+ ``` ruby
201
+ ParametersSchema::Schema.new do
202
+ param :potatoe do
203
+ param :name
204
+ param :type, allow: ['Atlantic']
205
+ end
206
+ end.validate!(potatoe: { type: 'Conestoga' })
207
+
208
+ # => ParametersSchema::InvalidParameters
209
+ # @errors = { potatoe: { name: :missing, type: :disallowed } }
210
+ ```
211
+
212
+ The possible error codes are (in the order the are validated):
213
+ ``` ruby
214
+ * :unknown # The parameter is provided but not defined in the schema.
215
+ * :missing # The parameter is required but is missing.
216
+ * :nil # The value cannot be nil but is nil.
217
+ * :empty # The value cannot be empty but is empty.
218
+ * :disallowed # The value has an invalid format (type/allow) other than nil/empty.
219
+ ```
220
+
221
+ ## Integrate with Rails
222
+
223
+ This gem can be used outside of Rails but was created with Rails in mind. For example, the parameters `controller, action, format` are skipped by default (see Options section to override this behavior) and the parameters are defined in a `Hash`. However, this gem doesn't insinuate itself in your project so you must manually add it in your controllers or anywhere else that make sense to you. Here is a little recipe to add validation in your API pipeline:
224
+
225
+ In the base controller of your API, add this **helper**:
226
+ ``` ruby
227
+ # Validate the parameters of an action, using a schema.
228
+ # Returns the validated parameters and throw exceptions on invalid input.
229
+ def validate_params(&parameters_schema)
230
+ schema = ParametersSchema::Schema.new(&parameters_schema)
231
+ schema.validate!(params)
232
+ end
233
+ ```
234
+ In the base controller of your API, add this **exception handler**:
235
+ ``` ruby
236
+ # Handle errors related to invalid parameters.
237
+ rescue_from ParametersSchema::InvalidParameters do |e|
238
+ # Do something with the exception (ex: log it).
239
+
240
+ # Render the response.
241
+ render json: ..., status: :bad_request
242
+ end
243
+ ```
244
+
245
+ Now in any controller where you want to validate the parameters, you can do:
246
+ ``` ruby
247
+ def operation
248
+ validated_params = validate_params do
249
+ # ...
250
+ end
251
+ # ...
252
+ end
253
+ ```
254
+
255
+ ## Options
256
+
257
+ Options can be specified on the module `ParametersSchema::Options`. Example:
258
+
259
+ ``` ruby
260
+ ParametersSchema::Options.skip_parameters = [:internal_stuff]
261
+ ```
262
+
263
+ Available options:
264
+ * `skip_parameters` an array of first-level parameters to skip. Default: `[:controller, :action, :format]`.
265
+ * `empty_keyword` the keyword used to represent an empty value. Default: `:empty`.
266
+ * `any_keyword` the keyword used to represent any value. Default: `:any`.
267
+ * `none_keyword` the keyword used to represent no value. Default: `:none`.
268
+ * `boolean_keyword` the keyword used to represent a boolean value. Default: `:boolean`.
269
+ * `nil_keyword` the keyword used to represent a nil value. Default: `:nil`.
270
+ * `boolean_true_values` the accepted boolean true values. Not case-sensitive. Default: `true`, `'t'`, `'true'`, `'1'`, `1`, `1.0`.
271
+ * `boolean_false_values` the accepted boolean false values. Not case-sensitive. Default: `false`, `'f'`, `'false'`, `'0'`, `0`, `0.0`.
272
+
273
+ ## Contribute
274
+
275
+ Yes, please. Bug fixes, new features, refactoring, unit tests. Send your precious pull requests.
276
+
277
+ ### Ideas
278
+
279
+ * Array of arrays of ...
280
+ * Min/Max for numeric values
281
+ * More `allow` options
282
+ * Better refine error codes
283
+
284
+ ## License
285
+
286
+ Parameters Schema is released under the [MIT License](http://www.opensource.org/licenses/MIT).
data/Rakefile CHANGED
@@ -1,8 +1,8 @@
1
- require 'rake/testtask'
2
-
3
- Rake::TestTask.new do |t|
4
- t.libs << 'test'
5
- end
6
-
7
- desc 'Run tests'
1
+ require 'rake/testtask'
2
+
3
+ Rake::TestTask.new do |t|
4
+ t.libs << 'test'
5
+ end
6
+
7
+ desc 'Run tests'
8
8
  task default: :test
@@ -1,21 +1,21 @@
1
- class Object
2
- #
3
- # Check if object is numeric.
4
- # From http://stackoverflow.com/questions/5661466/test-if-string-is-a-number-in-ruby-on-rails
5
- #
6
- # p "1".numeric? # => true
7
- # p "1.2".numeric? # => true
8
- # p "5.4e-29".numeric? # => true
9
- # p "12e20".numeric? # => true
10
- # p "1a".numeric? # => false
11
- # p "1.2.3.4".numeric? # => false
12
- #
13
- def numeric?
14
- return true if self.kind_of?(Numeric)
15
- return true if self.to_s =~ /^\d+$/
16
- Float(self)
17
- true
18
- rescue
19
- false
20
- end
21
- end
1
+ class Object
2
+ #
3
+ # Check if object is numeric.
4
+ # From http://stackoverflow.com/questions/5661466/test-if-string-is-a-number-in-ruby-on-rails
5
+ #
6
+ # p "1".numeric? # => true
7
+ # p "1.2".numeric? # => true
8
+ # p "5.4e-29".numeric? # => true
9
+ # p "12e20".numeric? # => true
10
+ # p "1a".numeric? # => false
11
+ # p "1.2.3.4".numeric? # => false
12
+ #
13
+ def numeric?
14
+ return true if self.kind_of?(Numeric)
15
+ return true if self.to_s =~ /^\d+$/
16
+ Float(self)
17
+ true
18
+ rescue
19
+ false
20
+ end
21
+ end