explicit-parameters 0.0.3 → 0.1.0

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: 95d2d462b480a386d2b59bd71ae9619c09c7906b
4
- data.tar.gz: 81a74d049c309d8f2286a8b7f46e2567f765420d
3
+ metadata.gz: 9a6880bad37cdfc35abc3a08ffd8591df594dfa4
4
+ data.tar.gz: 4377837d9757eae083a2a20f41ff925066a39f11
5
5
  SHA512:
6
- metadata.gz: ac43195c730d525dc5c713cca9ca2332528204d785981e734a6668d916aa5d489f3f2f0914ed834a1baace08cb7003ef48690e38ea7eb10df2e99c3d4f39d874
7
- data.tar.gz: a837c8cc1181542b576dfc3363a2b45f6544b523c4718f144fc8466f57afcce46a9b140186a5a2cb6d5d5377efd0210c0e860eedc6517eb8ec0ad4754e255e0e
6
+ metadata.gz: 49b1ac6b9514b4d25351ef8028eec8e24a4468332b6457ddb540c0d46f3171e73a5d7a02fb60e1a8432bb6927eda3e4595c6078a2fa70b983213ae3480de9cb1
7
+ data.tar.gz: 8e4c49b64a93ef0e0a28d133ac749f15d48024c1c92eb2b128d73c9bdbfc87f29c7dd885ab9ec4645400a8e6f957f634d0dc4920b91e6eb5992308cf49385e56
@@ -33,7 +33,16 @@ module ExplicitParameters
33
33
  end
34
34
 
35
35
  def accepts(name, type = nil, options = {}, &block)
36
- type = define(name, &block) if block_given?
36
+ if block_given?
37
+ subtype = define(name, &block)
38
+ if type == Array
39
+ type = Array[subtype]
40
+ elsif type == nil
41
+ type = subtype
42
+ else
43
+ raise ArgumentError, "`type` argument can only be `nil` or `Array` when a block is provided"
44
+ end
45
+ end
37
46
  attribute(name, type, options.slice(:default, :required))
38
47
  validations = options.except(:default)
39
48
  validations[:coercion] = true
@@ -66,7 +75,11 @@ module ExplicitParameters
66
75
  end
67
76
 
68
77
  def validate_attribute_provided!(attribute_name, value)
69
- errors.add attribute_name, "is required" unless @original_attributes.key?(attribute_name.to_s)
78
+ if !@original_attributes.key?(attribute_name.to_s)
79
+ errors.add attribute_name, 'is required'
80
+ elsif attribute_set[attribute_name].type.primitive == Array && value == [].freeze
81
+ errors.add attribute_name, 'is required'
82
+ end
70
83
  end
71
84
 
72
85
  def validate_attribute_coercion!(attribute_name, value)
@@ -1,3 +1,3 @@
1
1
  module ExplicitParameters
2
- VERSION = '0.0.3'
2
+ VERSION = '0.1.0'
3
3
  end
@@ -89,4 +89,62 @@ RSpec.describe ExplicitParameters::Parameters do
89
89
  }.to raise_error(ExplicitParameters::InvalidParameters, message)
90
90
  end
91
91
  end
92
+
93
+ context 'with list of parameters' do
94
+ let :definition do
95
+ ExplicitParameters::Parameters.define(:nested) do
96
+ accepts :addresses, Array do
97
+ requires :street, String
98
+ requires :city, String
99
+ end
100
+ end
101
+ end
102
+
103
+ let :parameters do
104
+ {
105
+ 'addresses' => [
106
+ {
107
+ 'street' => '3575 St-Laurent',
108
+ 'city' => 'Montréal',
109
+ }
110
+ ]
111
+ }
112
+ end
113
+
114
+ it 'the exposed parameter is an Array' do
115
+ expect(params.addresses).to be_an Array
116
+ expect(params.addresses.size).to be == 1
117
+ end
118
+
119
+ it 'parses nested hashes' do
120
+ expect(params.addresses.first.street).to be == '3575 St-Laurent'
121
+ expect(params.addresses.first.city).to be == 'Montréal'
122
+ end
123
+
124
+ context 'when required' do
125
+ let :definition do
126
+ ExplicitParameters::Parameters.define(:nested) do
127
+ requires :addresses, Array do
128
+ requires :street, String
129
+ requires :city, String
130
+ end
131
+ end
132
+ end
133
+
134
+ it 'reports missing attributes' do
135
+ message = {errors: {addresses: ['is required']}}.to_json
136
+ expect {
137
+ definition.parse!({})
138
+ }.to raise_error(ExplicitParameters::InvalidParameters, message)
139
+ end
140
+
141
+ it 'considers empty arrays as missing' do
142
+ message = {errors: {addresses: ['is required']}}.to_json
143
+ expect {
144
+ params = definition.parse!({'addresses' => []})
145
+ p params.addresses
146
+ }.to raise_error(ExplicitParameters::InvalidParameters, message)
147
+ end
148
+ end
149
+ end
92
150
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: explicit-parameters
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-20 00:00:00.000000000 Z
11
+ date: 2015-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -138,7 +138,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
138
  version: '0'
139
139
  requirements: []
140
140
  rubyforge_project:
141
- rubygems_version: 2.4.3
141
+ rubygems_version: 2.4.6
142
142
  signing_key:
143
143
  specification_version: 4
144
144
  summary: Explicit parameters validation and casting for Rails APIs