weak_parameters 0.1.5 → 0.1.6

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: 59ff95fe3c0c70019f9928aec5497ade558f8931
4
- data.tar.gz: c89f0b1d89a105a945be5da03610b89ee6b6742b
3
+ metadata.gz: 7e14888d6ca91c30183114b9da6414fd06813b14
4
+ data.tar.gz: ddf56dcd3f9802d6fc82bbc4a0b26d3efb537a39
5
5
  SHA512:
6
- metadata.gz: 104f5d6733c9ada50db9c805329471d6042fd33004e2000a86e703b9f9ee6e8122a649633b5aeafed55eac18fcd3d7157b9a1e63c430143d169cf0d038603d03
7
- data.tar.gz: 07f767852ee08f96bcbbdf709b7d3438b8df3fbc7d1956535ca75e42e9bd538eff2cc7f2b0821576268458898fbb7758d2e036aa35a14254badb7a474cfcb0f2
6
+ metadata.gz: 2c4e91827ef9bc297a92475c07539dd46f7cf6bc8f3e47006fa090c04f877fca8563b1654640e117ea2ebb67a2775f379f80a92c8531e81c578e92492e5cc9c8
7
+ data.tar.gz: adb68ddf8264e3a4020eef3bac59673d5f79b1c7215ff73ab638e0223b032d96e6a78dff97b55a1ac3f2bdf5c64fbd9a74795e714a522b87dc9948dffc2d7a44
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ ## 0.1.6
2
+ * Support nested parameters (Thx @mzp)
3
+
1
4
  ## 0.1.5
2
5
  * Support `file` validator (#6)
3
6
 
data/README.md CHANGED
@@ -55,6 +55,7 @@ irb(main):005:0> app.post "/recipes", name: "alice", type: "bob"
55
55
  * integer
56
56
  * string
57
57
  * boolean (= 0, 1, false, true)
58
+ * file
58
59
 
59
60
  ### Avilable options
60
61
  * required
@@ -1,6 +1,6 @@
1
1
  module WeakParameters
2
2
  class BaseValidator
3
- attr_reader :controller, :key, :options, :block
3
+ attr_reader :controller, :options, :block
4
4
 
5
5
  def initialize(controller, key, options = {}, &block)
6
6
  @controller = controller
@@ -9,7 +9,8 @@ module WeakParameters
9
9
  @block = block
10
10
  end
11
11
 
12
- def validate
12
+ def validate(*path)
13
+ @path = path
13
14
  handle_failure unless valid?
14
15
  end
15
16
 
@@ -21,6 +22,10 @@ module WeakParameters
21
22
  self.class.name.split("::").last.sub(/Validator$/, "").underscore.to_sym
22
23
  end
23
24
 
25
+ def key
26
+ path[-1]
27
+ end
28
+
24
29
  private
25
30
 
26
31
  def valid?
@@ -57,8 +62,16 @@ module WeakParameters
57
62
  end
58
63
  end
59
64
 
65
+ # key array to validation target
66
+ def path
67
+ # Because @key becomes nil at ListValidator, I remove it from path.
68
+ (@path + [ @key ]).compact
69
+ end
70
+
60
71
  def params
61
- controller.params
72
+ path[0...-1].inject(controller.params) { |params, key|
73
+ params[key]
74
+ }
62
75
  end
63
76
 
64
77
  def value
@@ -0,0 +1,23 @@
1
+ module WeakParameters
2
+ class ListValidator < WeakParameters::ArrayValidator
3
+ attr_reader :validator
4
+ def initialize(controller, key, validator)
5
+ super controller, key, {}
6
+ @validator = validator
7
+ end
8
+
9
+ def validate(*args)
10
+ super
11
+
12
+ if valid? && exist?
13
+ value.each.with_index do |_, i|
14
+ validator.validate(*path, i)
15
+ end
16
+ end
17
+ end
18
+
19
+ def validators
20
+ [ validator ]
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,39 @@
1
+ module WeakParameters
2
+ class ObjectValidator < WeakParameters::HashValidator
3
+ attr_reader :validators
4
+ def initialize(controller, key, validators, options = {})
5
+ super controller, key, options
6
+ @validators = validators
7
+ end
8
+
9
+ def validate(*args)
10
+ super
11
+
12
+ if valid? && exist?
13
+ validators.each do |validator|
14
+ validator.validate(*path)
15
+ end
16
+ end
17
+ end
18
+
19
+ private
20
+
21
+ def valid?
22
+ case
23
+ when required? && nil?
24
+ false
25
+ when exist? && invalid_type?
26
+ false
27
+ when exist? && exceptional?
28
+ false
29
+ else
30
+ true
31
+ end
32
+ end
33
+
34
+ def error_message
35
+ keys = path.map { |k| "[#{k.inspect}]" }.join ''
36
+ "params#{keys} must be a valid Hash"
37
+ end
38
+ end
39
+ end
@@ -3,5 +3,9 @@ module WeakParameters
3
3
  def valid_type?
4
4
  value.is_a?(String)
5
5
  end
6
+
7
+ def error_message
8
+ "params[#{key.inspect}] must be a valid String"
9
+ end
6
10
  end
7
11
  end
@@ -17,6 +17,18 @@ module WeakParameters
17
17
 
18
18
  private
19
19
 
20
+ def with_validators(&block)
21
+ old_validators = @validators
22
+
23
+ begin
24
+ @validators = []
25
+ block.call
26
+ @validators
27
+ ensure
28
+ @validators = old_validators
29
+ end
30
+ end
31
+
20
32
  def params
21
33
  controller.params
22
34
  end
@@ -52,5 +64,15 @@ module WeakParameters
52
64
  def file(key, options = {}, &block)
53
65
  validators << WeakParameters::FileValidator.new(controller, key, options, &block)
54
66
  end
67
+
68
+ def object(key, options = {}, &block)
69
+ children = with_validators { instance_eval(&block) }
70
+ validators << WeakParameters::ObjectValidator.new(controller, key, children, options)
71
+ end
72
+
73
+ def list(key, type, options = {}, &block)
74
+ children = with_validators { send type, nil, options, &block }
75
+ validators << WeakParameters::ListValidator.new(controller, key, children.first)
76
+ end
55
77
  end
56
78
  end
@@ -1,3 +1,3 @@
1
1
  module WeakParameters
2
- VERSION = "0.1.5"
2
+ VERSION = "0.1.6"
3
3
  end
@@ -10,6 +10,8 @@ require "weak_parameters/float_validator"
10
10
  require "weak_parameters/hash_validator"
11
11
  require "weak_parameters/integer_validator"
12
12
  require "weak_parameters/string_validator"
13
+ require "weak_parameters/object_validator"
14
+ require "weak_parameters/list_validator"
13
15
  require "weak_parameters/controller"
14
16
  require "weak_parameters/validation_error"
15
17
  require "weak_parameters/validator"
@@ -13,6 +13,18 @@ class RecipesController < ApplicationController
13
13
  string :zip_code do |value|
14
14
  value =~ /\A\d{3}-\d{4}\z/
15
15
  end
16
+ object :nested, required: true do
17
+ integer :number, only: [0, 1]
18
+ end
19
+
20
+ list :numbers, :integer, description: 'some numbers'
21
+
22
+ object :body do
23
+ list :items, :object, description: 'some items' do
24
+ string :name
25
+ integer :price
26
+ end
27
+ end
16
28
  end
17
29
 
18
30
  def create
@@ -1,6 +1,6 @@
1
1
  require "spec_helper"
2
2
 
3
- describe "Recipes" do
3
+ describe "Recipes", type: :request do
4
4
  let(:params) do
5
5
  {
6
6
  object: [],
@@ -13,6 +13,16 @@ describe "Recipes" do
13
13
  attachment: Rack::Test::UploadedFile.new(__FILE__),
14
14
  zip_code: "123-4567",
15
15
  custom: 0,
16
+ nested: {
17
+ number: 0
18
+ },
19
+ numbers: [1, 2, 3],
20
+ body: {
21
+ items: [
22
+ { name: "foo", price: 100 },
23
+ { name: "bar", price: 100 }
24
+ ]
25
+ }
16
26
  }
17
27
  end
18
28
 
@@ -135,5 +145,35 @@ describe "Recipes" do
135
145
  response.status.should == 403
136
146
  end
137
147
  end
148
+
149
+ context "with wrong nested params" do
150
+ before do
151
+ params[:nested][:number] = true
152
+ end
153
+ include_examples "400"
154
+ end
155
+
156
+ context "with wrong repeated params" do
157
+ describe 'scalar' do
158
+ before do
159
+ params[:numbers] = 1
160
+ end
161
+ include_examples "400"
162
+ end
163
+
164
+ describe 'wrong type' do
165
+ before do
166
+ params[:numbers] = ["foo"]
167
+ end
168
+ include_examples "400"
169
+ end
170
+ end
171
+
172
+ context "with complex params" do
173
+ before do
174
+ params[:body][:items] << { price: "xxx" }
175
+ end
176
+ include_examples "400"
177
+ end
138
178
  end
139
179
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weak_parameters
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-11 00:00:00.000000000 Z
11
+ date: 2015-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -89,6 +89,8 @@ files:
89
89
  - lib/weak_parameters/float_validator.rb
90
90
  - lib/weak_parameters/hash_validator.rb
91
91
  - lib/weak_parameters/integer_validator.rb
92
+ - lib/weak_parameters/list_validator.rb
93
+ - lib/weak_parameters/object_validator.rb
92
94
  - lib/weak_parameters/string_validator.rb
93
95
  - lib/weak_parameters/validation_error.rb
94
96
  - lib/weak_parameters/validator.rb