weak_parameters 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
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