parameters_schema 1.0.1 → 1.0.2

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: ab3f9f1e20eec3092c2362e52e002e974c51b2ba
4
- data.tar.gz: a9c817c713fa10529286f629d576d5eb09673879
3
+ metadata.gz: 14b2e93c33b07b2beb454f9b604f4f77e96da0e6
4
+ data.tar.gz: 64bb0eaf552948ddb687625ece733d4f8a08fe38
5
5
  SHA512:
6
- metadata.gz: 68980a8ff4bf48844160bc378a7f572fed2b25c49f6f35ef8f26e667c66dd8a6a0a0cf46559e0624afbe507da3a78c4c8d681540b4ac9ff977ab6ef4e4875a17
7
- data.tar.gz: b90a54e7fee674a137305a0c958197b814756f4fe8bfe1fb1e49c95df31d433ca4b10bc2127e52679d50be3bb3a6af4bb3ee3d8c6edbacc85753695a3d46a108
6
+ metadata.gz: a2eb862ee2b536e377f0177b70ca983f6b618fab0222fe89bf423ae4228eef6f5db87e4d8cde5defec8814d7a5180e6997198abe0ed016b0b3037573ff5ccdbc
7
+ data.tar.gz: 269810eec92651bbd6701a9df474cbd394b87a1428f2e417091aef4896ddc409d8baf1f9a5c05096901e821441564667ad540475679a67e73c09657dead4e605
data/Gemfile CHANGED
@@ -1,4 +1,5 @@
1
1
  source 'http://rubygems.org'
2
2
 
3
+ gem 'rake'
3
4
  gem 'minitest'
4
- gem 'activesupport'
5
+ gem 'activesupport'
data/README.md CHANGED
@@ -1,10 +1,8 @@
1
1
  # Parameters Schema
2
2
 
3
- ## *"A strict API is the best kind of API."*
3
+ This gem is an alternative to **[strong_parameters](https://github.com/rails/strong_parameters)** to validate data at the controller level.
4
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:
5
+ For example, let's say you want your operation `create` to require a `Fixnum` parameter between `1` and `99`:
8
6
  ``` ruby
9
7
  class Api::PeopleController < Api::BaseController
10
8
  def create
@@ -12,7 +10,7 @@ class Api::PeopleController < Api::BaseController
12
10
  param :age, type: Fixnum, allow: (1..99)
13
11
  end
14
12
 
15
- # Do something with the validated parameters.
13
+ @person = Person.create!(validated_params)
16
14
  end
17
15
  end
18
16
  ```
@@ -20,30 +18,57 @@ end
20
18
  So when you use this controller:
21
19
  ``` ruby
22
20
  > app.post 'api/people', age: 12 # validated_params = { age: 12 }
23
- > app.post 'api/people', age: 100 # throws a ParameterSchema::InvalidParameters
21
+ > app.post 'api/people', age: 100 # throws a ParameterSchema::InvalidParameters
24
22
  ```
25
23
 
26
- ## Why use this gem instead of strong_parameters
24
+ ## Why use this gem instead of *strong_parameters*:
27
25
 
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 ;)
26
+ * You want more control over the parameters of your API, at the *type* and *format* level.
27
+ * You want a strict API that will only accept well-formed requests.
28
+ * You don't grasp the *strong_parameters* syntax and wants something more like a DSL.
29
+ * You want to validate data outside of Rails.
31
30
 
32
31
  ## Installation
33
32
 
34
- Add in your Gemfile:
33
+ Add in your `Gemfile`:
35
34
  ``` ruby
36
35
  gem 'parameters_schema'
37
36
  ```
38
37
 
39
- Add in your project:
38
+ Add in your project (not required for Rails):
40
39
  ``` ruby
41
40
  require 'parameters_schema'
42
41
  ```
43
42
 
43
+ ## Quick start
44
+
45
+ Read this then _Integrate with Rails_ if you want to use this gem quickly.
46
+
47
+ Let's take the example at the beginning of this README, with more details:
48
+
49
+ ``` ruby
50
+ class Api::PeopleController < Api::BaseController
51
+ def create
52
+ # 1. For each request, you define a schema (i.e. the parameters of the request).
53
+ schema = ParametersSchema::Schema.new do
54
+ param :age, type: Fixnum, allow: (1..99)
55
+ end
56
+
57
+ # 2. When a user makes a request, you validate it against the schema.
58
+ # - When the request is invalid, an exception is raised.
59
+ # - When the request is valid, you receive a sanitized hash.
60
+ validated_params = schema.validate!(params)
61
+
62
+ @person = Person.create!(validated_params)
63
+ end
64
+ end
65
+ ```
66
+
67
+ Now, _Integrate with Rails_ gives pointers on how to simplify all this.
68
+
44
69
  ## Schema
45
70
 
46
- The schema is the heart of this gem. It provides a simple DSL to express an operation's parameters.
71
+ The schema is the heart of this gem. With a simple DSL, you define the parameters of a request.
47
72
 
48
73
  Creating a schema:
49
74
  ``` ruby
@@ -52,16 +77,18 @@ schema = ParametersSchema::Schema.new do
52
77
  # ... but an empty schema is also valid.
53
78
  end
54
79
  ```
80
+
55
81
  Validating parameters against a schema:
56
82
  ``` ruby
57
83
  params = { potatoe: 'Eramosa' }
58
- schema.validate!(params)
84
+ schema.validate!(params)
59
85
  ```
60
86
 
61
87
  The minimal representation of a parameter is:
62
88
  ``` ruby
63
89
  param :potatoe
64
90
  ```
91
+
65
92
  This represents a `required` parameter of type `String` accepting any characters and which doesn't allow nil or empty values.
66
93
 
67
94
  The valid options for a parameter are:
@@ -75,7 +102,7 @@ The valid options for a parameter are:
75
102
 
76
103
  ### Parameter types
77
104
 
78
- The available types are:
105
+ The available types are:
79
106
  ``` ruby
80
107
  * String
81
108
  * Symbol
@@ -137,9 +164,9 @@ end
137
164
 
138
165
  ### The `allow` and `deny` options
139
166
 
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.
167
+ 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
168
 
142
- To accept nil or empty values:
169
+ To accept `nil` or empty values:
143
170
  ``` ruby
144
171
  param :potatoe, allow: :nil
145
172
  # => accepts nil, 'Kennebec' but not ''.
@@ -150,7 +177,7 @@ param :potatoe, allow: :empty
150
177
  param :potatoe, allow: [:nil, :empty]
151
178
  # => accepts nil, '' and 'Kennebec'
152
179
  ```
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.
180
+ 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
181
 
155
182
  To accept predefined values:
156
183
  ``` ruby
@@ -220,12 +247,13 @@ The possible error codes are (in the order the are validated):
220
247
 
221
248
  ## Integrate with Rails
222
249
 
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:
250
+ This gem can be used outside of Rails but was created with Rails in mind. For example, the parameters `controller`, `action` and `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
251
 
225
252
  In the base controller of your API, add this **helper**:
226
253
  ``` ruby
227
254
  # Validate the parameters of an action, using a schema.
228
255
  # Returns the validated parameters and throw exceptions on invalid input.
256
+ # Note: this helper could be refined to cache the schemas.
229
257
  def validate_params(&parameters_schema)
230
258
  schema = ParametersSchema::Schema.new(&parameters_schema)
231
259
  schema.validate!(params)
@@ -274,10 +302,19 @@ Available options:
274
302
 
275
303
  Yes, please. Bug fixes, new features, refactoring, unit tests. Send your precious pull requests.
276
304
 
305
+ ### Developing this gem
306
+
307
+ 1. Fork this repository.
308
+ 2. Clone your fork.
309
+ 3. (Optional) Prepare it with `rbenv` or `RVM`. Ex: `echo 2.3.0 > .ruby-version`.
310
+ 4. `bundle install` to install the gems.
311
+ 5. `rake test` to launch the tests suite.
312
+ 6. Make your changes and send me pull requests.
313
+
277
314
  ### Ideas
278
315
 
279
316
  * Array of arrays of ...
280
- * Min/Max for numeric values
317
+ * `min` and `max` options for numeric values (instead of `allow: (min..max)`)
281
318
  * More `allow` options
282
319
  * Better refine error codes
283
320
 
@@ -12,7 +12,6 @@ class Object
12
12
  #
13
13
  def numeric?
14
14
  return true if self.kind_of?(Numeric)
15
- return true if self.to_s =~ /^\d+$/
16
15
  Float(self)
17
16
  true
18
17
  rescue
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: parameters_schema
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jodi Giordano
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-03 00:00:00.000000000 Z
11
+ date: 2016-02-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -69,7 +69,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
69
69
  version: '0'
70
70
  requirements: []
71
71
  rubyforge_project:
72
- rubygems_version: 2.4.6
72
+ rubygems_version: 2.5.1
73
73
  signing_key:
74
74
  specification_version: 4
75
75
  summary: Strict schema for request parameters