weasel_diesel 1.2.1 → 1.2.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 +7 -0
- data/.travis.yml +2 -5
- data/CHANGELOG.md +3 -0
- data/README.md +4 -0
- data/lib/json_response_verification.rb +108 -79
- data/lib/params.rb +51 -22
- data/lib/params_verification.rb +30 -28
- data/lib/response.rb +3 -3
- data/lib/weasel_diesel/version.rb +1 -1
- data/lib/weasel_diesel.rb +2 -2
- data/spec/json_response_description_spec.rb +33 -1
- data/spec/json_response_verification_spec.rb +45 -20
- data/spec/params_verification_spec.rb +24 -10
- data/spec/test_services.rb +4 -0
- data/spec/wd_params_spec.rb +22 -6
- metadata +17 -35
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 76695321f4c49f270788ffc3743ed2ca1668c774
|
4
|
+
data.tar.gz: 567a24d4bac5544bb3d7d89df0fea271afa273b0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9fc1388dc4e52f7ec91b518f26319d85e4b14f92bf586f036cc53e920ee9017cbffeda361b4b0c786aa06d5fde37f79ba01df0fabbc2ae4e68c4be4688277377
|
7
|
+
data.tar.gz: be2eb8217e849bb8b4bdd9b2fe818d4c1ca7928750da35271f707f797636ec8a18722e51c2c83962e10660cb55c45aa6ef7603fa443d89488024c77875af0af5
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -196,6 +196,10 @@ service.params do |param|
|
|
196
196
|
user.boolean :mailing_list, :default => true, :doc => "is the user subscribed to the ML?"
|
197
197
|
user.array :skills, :in => %w{ruby js cooking}
|
198
198
|
end
|
199
|
+
|
200
|
+
service.params.namespace :attachment, :null => true do |attachment|
|
201
|
+
attachment.string :url, :required => true
|
202
|
+
end
|
199
203
|
```
|
200
204
|
|
201
205
|
|
@@ -1,109 +1,138 @@
|
|
1
|
-
#
|
1
|
+
# Include this module in WeaselDiesel
|
2
2
|
# to add response verification methods.
|
3
3
|
#
|
4
4
|
module JSONResponseVerification
|
5
5
|
|
6
|
-
#
|
6
|
+
# Verifies the parsed body of a JSON response against the service's response description.
|
7
7
|
#
|
8
8
|
# @return [Array<TrueClass, FalseClass, Array<String>>] True/false and an array of errors.
|
9
|
-
def
|
10
|
-
errors = []
|
11
|
-
|
12
|
-
response.nodes.each do |node|
|
13
|
-
if node.name
|
14
|
-
# Verify that the named node exists in the hash
|
15
|
-
unless hash.has_key?(node.name.to_s)
|
16
|
-
errors << json_response_error(node, hash)
|
17
|
-
return [false, errors]
|
18
|
-
end
|
19
|
-
end
|
20
|
-
errors += validate_hash_against_template_node(hash, node)
|
21
|
-
end
|
22
|
-
|
9
|
+
def verify(parsed_json_body)
|
10
|
+
errors = [verify_element(parsed_json_body, response.nodes.first)]
|
11
|
+
errors.flatten!
|
23
12
|
[errors.empty?, errors]
|
24
13
|
end
|
25
14
|
|
15
|
+
alias :validate_hash_response :verify # backguard compatibility
|
16
|
+
|
26
17
|
private
|
27
18
|
|
28
|
-
# Recursively validates
|
19
|
+
# Recursively validates an element found when parsing a JSON.
|
29
20
|
#
|
30
|
-
# @param [Hash
|
31
|
-
# @param [WDSL::Response::Element]
|
32
|
-
# @param [TrueClass, FalseClass]
|
33
|
-
#
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
errors << json_response_error(node, hash)
|
40
|
-
return errors
|
41
|
-
end
|
42
|
-
|
43
|
-
if node.name && !nested
|
44
|
-
if hash.has_key?(node.name.to_s)
|
45
|
-
subhash = hash[node.name.to_s]
|
21
|
+
# @param [Hash, Array, nil] el parsed JSON to be verified.
|
22
|
+
# @param [WDSL::Response::Element] expected the reference element defined in the response description.
|
23
|
+
# @param [TrueClass, FalseClass] verify_namespace if the nesting must be verified.
|
24
|
+
# @return [Arrays<String>] errors the list of errors encountered while verifying.
|
25
|
+
def verify_element(el, expected, verify_namespace=true)
|
26
|
+
if expected.name && verify_namespace
|
27
|
+
if verified_namespace?(el, expected.name)
|
28
|
+
el = el[expected.name.to_s]
|
29
|
+
verify_namespace = false
|
46
30
|
else
|
47
|
-
|
31
|
+
return something_is_missing_error(expected)
|
48
32
|
end
|
33
|
+
else
|
34
|
+
verify_namespace = true
|
49
35
|
end
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
subhash.each do |obj|
|
55
|
-
validate_hash_against_template_node(obj, node, true, errors, true)
|
56
|
-
end
|
36
|
+
if el.nil?
|
37
|
+
something_is_missing_error(expected)
|
38
|
+
elsif el.is_a?(Array)
|
39
|
+
verify_array(el, expected, verify_namespace)
|
57
40
|
else
|
58
|
-
|
59
|
-
if !array_item && !subhash.has_key?(prop.name.to_s) && (prop.opts && prop.respond_to?(:opts) && !prop.opts[:null])
|
60
|
-
errors << json_response_error(prop, subhash)
|
61
|
-
end
|
62
|
-
errors << json_response_error(prop, subhash, true) unless valid_hash_type?(subhash, prop)
|
63
|
-
end
|
64
|
-
|
65
|
-
node.objects.each do |obj|
|
66
|
-
# recursive call
|
67
|
-
validate_hash_against_template_node(subhash[obj.name.to_s], obj, true, errors)
|
68
|
-
end if node.objects
|
41
|
+
verify_object(el, expected, verify_namespace)
|
69
42
|
end
|
43
|
+
end
|
70
44
|
|
71
|
-
|
45
|
+
# Verifies hash corresponding to a JSON response against a given namespace
|
46
|
+
#
|
47
|
+
# @param [Array] array array to be verified.
|
48
|
+
# @param [WDSL::Response::Element] expected the reference element defined in the response description.
|
49
|
+
# @return [TrueClass, FalseClass] if the nesting name found is correct.
|
50
|
+
def verified_namespace?(hash, expected_name)
|
51
|
+
hash.respond_to?(:has_key?) && hash.has_key?(expected_name.to_s)
|
52
|
+
end
|
53
|
+
|
54
|
+
# Validates an array found when parsing a JSON.
|
55
|
+
#
|
56
|
+
# @param [Array] array array to be verified.
|
57
|
+
# @param [WDSL::Response::Element] expected the reference element defined in the response description.
|
58
|
+
# @return [Arrays<String>] errors the list of errors encountered while verifying.
|
59
|
+
def verify_array(array, expected, verify_nesting)
|
60
|
+
return wrong_type_error(array, expected.name, expected.type) unless expected.is_a?(WeaselDiesel::Response::Vector)
|
61
|
+
expected = expected.elements && expected.elements.any? ? expected.elements.first : expected
|
62
|
+
array.map{ |el| verify_element(el, expected, verify_nesting) }
|
72
63
|
end
|
73
64
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
65
|
+
# Validates a hash corresponding to a JSON object.
|
66
|
+
#
|
67
|
+
# @param [Hash] hash hash to be verified.
|
68
|
+
# @param [WDSL::Response::Element] expected the reference element defined in the response description.
|
69
|
+
# @return [Arrays<String>] errors the list of errors encountered while verifying.
|
70
|
+
def verify_object(hash, expected, verify_nesting)
|
71
|
+
[verify_attributes(hash, expected)] + [verify_objects(hash, expected)]
|
72
|
+
end
|
73
|
+
|
74
|
+
# Validates the objects found in a hash corresponding to a JSON object.
|
75
|
+
#
|
76
|
+
# @param [Hash] hash hash representing a JSON object whose internal objects will be verified.
|
77
|
+
# @param [WDSL::Response::Element] expected the reference element defined in the response description.
|
78
|
+
# @return [Arrays<String>] errors the list of errors encountered while verifying.
|
79
|
+
def verify_objects(hash, expected)
|
80
|
+
return [] unless expected.objects
|
81
|
+
expected.objects.map do |expected|
|
82
|
+
found = hash[expected.name.to_s]
|
83
|
+
null_allowed = expected.respond_to?(:opts) && expected.opts[:null]
|
84
|
+
if found.nil?
|
85
|
+
null_allowed ? [] : something_is_missing_error(expected)
|
86
|
+
else
|
87
|
+
verify_element(found, expected, false) # don't verify nesting
|
81
88
|
end
|
82
|
-
error
|
83
|
-
else
|
84
|
-
"#{el_or_attr.name || el_or_attr.inspect} is missing in #{hash.inspect}"
|
85
89
|
end
|
86
90
|
end
|
87
91
|
|
88
|
-
|
89
|
-
|
90
|
-
|
92
|
+
# Validates the attributes found in a hash corresponding to a JSON object.
|
93
|
+
#
|
94
|
+
# @param [Hash] hash hash whose attributes will be verified.
|
95
|
+
# @param [WDSL::Response::Element] expected the reference element defined in the response description.
|
96
|
+
# @return [Arrays<String>] errors the list of errors encountered while verifying.
|
97
|
+
def verify_attributes(hash, expected)
|
98
|
+
return [] unless expected.attributes
|
99
|
+
expected.attributes.map{ |a| verify_attribute_value(hash[a.name.to_s], a) }
|
100
|
+
end
|
91
101
|
|
92
|
-
|
93
|
-
|
94
|
-
|
102
|
+
# Validates a value against a found in a hash corresponding to a JSON object.
|
103
|
+
#
|
104
|
+
# @param [value] value value to be verified.
|
105
|
+
# @param [WDSL::Response::Attribute] expected the reference element defined in the response description.
|
106
|
+
# @return [Arrays<String>] errors the list of errors encountered while verifying.
|
107
|
+
def verify_attribute_value(value, attribute)
|
108
|
+
null_allowed = attribute.respond_to?(:opts) && !!attribute.opts[:null]
|
109
|
+
if value.nil?
|
110
|
+
null_allowed ? [] : wrong_type_error(value, attribute.name, attribute.type)
|
111
|
+
else
|
112
|
+
type = attribute.type
|
113
|
+
return [] if type.to_sym == :string
|
114
|
+
rule = ParamsVerification.type_validations[attribute.type.to_sym]
|
115
|
+
puts "Don't know how to validate attributes of type #{type}" if rule.nil?
|
116
|
+
(rule.nil? || value.to_s =~ rule) ? [] : wrong_type_error(value, attribute.name, attribute.type)
|
95
117
|
end
|
96
|
-
|
97
|
-
type = prop_template.type
|
98
|
-
return true if type.nil?
|
118
|
+
end
|
99
119
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
120
|
+
# Returns an error message reporting that an expected data hasn't been found in the JSON response.
|
121
|
+
#
|
122
|
+
# @param [WDSL::Response::Element, WDSL::Response::Attribute] expected missing data.
|
123
|
+
# @return [String] error message
|
124
|
+
def something_is_missing_error(expected)
|
125
|
+
"#{expected.name || 'top level'} Node/Object/Element is missing"
|
126
|
+
end
|
105
127
|
|
106
|
-
|
128
|
+
# Returns an error message reporting that a value doesn't correspond to an expected data type.
|
129
|
+
#
|
130
|
+
# @param [value] value which doesn't correspond to the expected type.
|
131
|
+
# @param [data_name] data_name name of the data containing the value.
|
132
|
+
# @param [expected_type] expected type.
|
133
|
+
# @return [String] error message
|
134
|
+
def wrong_type_error(value, data_name, expected_type)
|
135
|
+
"#{data_name} was of wrong type, expected #{expected_type} and the value was #{value}"
|
107
136
|
end
|
108
137
|
|
109
|
-
end
|
138
|
+
end
|
data/lib/params.rb
CHANGED
@@ -5,7 +5,30 @@ class WeaselDiesel
|
|
5
5
|
# @see WeaselDiesel#params
|
6
6
|
#
|
7
7
|
# @api public
|
8
|
-
class Params
|
8
|
+
class Params
|
9
|
+
|
10
|
+
# Namespaces have a name, and options.
|
11
|
+
#
|
12
|
+
# @api public
|
13
|
+
class Namespace
|
14
|
+
# @return [Symbol, String] name The name of the namespace.
|
15
|
+
# @api public
|
16
|
+
attr_reader :name
|
17
|
+
|
18
|
+
# @return [Boolean] :null Can this namespace be null?
|
19
|
+
# @api public
|
20
|
+
attr_reader :null
|
21
|
+
|
22
|
+
# @param [Symbol, String] name
|
23
|
+
# The namespace's name
|
24
|
+
# @param [Hash] opts The namespace options
|
25
|
+
# @option opts [Boolean] :null Can this value be null?
|
26
|
+
# @api public
|
27
|
+
def initialize(name, opts={})
|
28
|
+
@name = name
|
29
|
+
@null = opts[:null] || false
|
30
|
+
end
|
31
|
+
end # of Namespace
|
9
32
|
|
10
33
|
# Params usually have a few rules used to validate requests.
|
11
34
|
# Rules are not usually initialized directly but instead via
|
@@ -31,17 +54,17 @@ class WeaselDiesel
|
|
31
54
|
# @api public
|
32
55
|
attr_reader :options
|
33
56
|
|
34
|
-
# @param [Symbol, String] name
|
57
|
+
# @param [Symbol, String] name
|
35
58
|
# The param's name
|
36
59
|
# @param [Hash] opts The rule options
|
37
60
|
# @option opts [Symbol] :in A list of acceptable values.
|
38
61
|
# @option opts [Symbol] :options A list of acceptable values.
|
39
62
|
# @option opts [Symbol] :default The default value of the param.
|
40
|
-
# @option
|
41
|
-
# @option
|
42
|
-
# @option
|
43
|
-
# @option
|
44
|
-
# @option
|
63
|
+
# @option opts [Symbol] :min_value The minimum acceptable value.
|
64
|
+
# @option opts [Symbol] :max_value The maximum acceptable value.
|
65
|
+
# @option opts [Symbol] :min_length The minimum acceptable string length.
|
66
|
+
# @option opts [Symbol] :max_length The maximum acceptable string length.
|
67
|
+
# @option opts [Boolean] :null Can this value be null?
|
45
68
|
# @option opts [Symbol] :doc Documentation for the param.
|
46
69
|
# @api public
|
47
70
|
def initialize(name, opts = {})
|
@@ -51,7 +74,7 @@ class WeaselDiesel
|
|
51
74
|
|
52
75
|
# The namespace used if any
|
53
76
|
#
|
54
|
-
# @return [NilClass,
|
77
|
+
# @return [NilClass, WeaselDiesel::Params::Namespace]
|
55
78
|
# @api public
|
56
79
|
def namespace
|
57
80
|
@options[:space_name]
|
@@ -76,7 +99,7 @@ class WeaselDiesel
|
|
76
99
|
|
77
100
|
# The namespace used if any
|
78
101
|
#
|
79
|
-
# @return [
|
102
|
+
# @return [NilClass, WeaselDiesel::Params::Namespace]
|
80
103
|
# @api public
|
81
104
|
attr_reader :space_name
|
82
105
|
|
@@ -126,7 +149,7 @@ class WeaselDiesel
|
|
126
149
|
# service.param.string :type, :in => LeaderboardType.names, :default => LeaderboardType::LIFETIME
|
127
150
|
#
|
128
151
|
# @api public
|
129
|
-
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
152
|
+
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
130
153
|
# List of optional or required param rules depending on the new param rule type
|
131
154
|
def string(name, options={})
|
132
155
|
param(:string, name, options)
|
@@ -143,7 +166,7 @@ class WeaselDiesel
|
|
143
166
|
# service.param.string :type, :in => LeaderboardType.names, :default => LeaderboardType::LIFETIME
|
144
167
|
#
|
145
168
|
# @api public
|
146
|
-
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
169
|
+
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
147
170
|
# List of optional or required param rules depending on the new param rule type
|
148
171
|
def integer(name, options={})
|
149
172
|
param(:integer, name, options)
|
@@ -160,7 +183,7 @@ class WeaselDiesel
|
|
160
183
|
# service.param.string :type, :in => LeaderboardType.names, :default => LeaderboardType::LIFETIME
|
161
184
|
#
|
162
185
|
# @api public
|
163
|
-
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
186
|
+
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
164
187
|
# List of optional or required param rules depending on the new param rule type
|
165
188
|
def float(name, options={})
|
166
189
|
param(:float, name, options)
|
@@ -177,7 +200,7 @@ class WeaselDiesel
|
|
177
200
|
# service.param.string :type, :in => LeaderboardType.names, :default => LeaderboardType::LIFETIME
|
178
201
|
#
|
179
202
|
# @api public
|
180
|
-
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
203
|
+
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
181
204
|
# List of optional or required param rules depending on the new param rule type
|
182
205
|
def decimal(name, options={})
|
183
206
|
param(:decimal, name, options)
|
@@ -194,7 +217,7 @@ class WeaselDiesel
|
|
194
217
|
# service.param.string :type, :in => LeaderboardType.names, :default => LeaderboardType::LIFETIME
|
195
218
|
#
|
196
219
|
# @api public
|
197
|
-
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
220
|
+
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
198
221
|
# List of optional or required param rules depending on the new param rule type
|
199
222
|
def boolean(name, options={})
|
200
223
|
param(:boolean, name, options)
|
@@ -211,7 +234,7 @@ class WeaselDiesel
|
|
211
234
|
# service.param.string :type, :in => LeaderboardType.names, :default => LeaderboardType::LIFETIME
|
212
235
|
#
|
213
236
|
# @api public
|
214
|
-
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
237
|
+
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
215
238
|
# List of optional or required param rules depending on the new param rule type
|
216
239
|
def datetime(name, options={})
|
217
240
|
param(:datetime, name, options)
|
@@ -228,7 +251,7 @@ class WeaselDiesel
|
|
228
251
|
# service.param.string :type, :in => LeaderboardType.names, :default => LeaderboardType::LIFETIME
|
229
252
|
#
|
230
253
|
# @api public
|
231
|
-
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
254
|
+
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
232
255
|
# List of optional or required param rules depending on the new param rule type
|
233
256
|
def text(name, options={})
|
234
257
|
param(:text, name, options)
|
@@ -245,7 +268,7 @@ class WeaselDiesel
|
|
245
268
|
# service.param.string :type, :in => LeaderboardType.names, :default => LeaderboardType::LIFETIME
|
246
269
|
#
|
247
270
|
# @api public
|
248
|
-
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
271
|
+
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
249
272
|
# List of optional or required param rules depending on the new param rule type
|
250
273
|
def binary(name, options={})
|
251
274
|
param(:binary, name, options)
|
@@ -262,7 +285,7 @@ class WeaselDiesel
|
|
262
285
|
# service.param.string :type, :in => LeaderboardType.names, :default => LeaderboardType::LIFETIME
|
263
286
|
#
|
264
287
|
# @api public
|
265
|
-
# @return [Array<WeaselDiesel::Params::Rule>]
|
288
|
+
# @return [Array<WeaselDiesel::Params::Rule>]
|
266
289
|
# List of optional or required param rules depending on the new param rule type
|
267
290
|
def array(name, options={})
|
268
291
|
param(:array, name, options)
|
@@ -279,7 +302,7 @@ class WeaselDiesel
|
|
279
302
|
# service.param.string :type, :in => LeaderboardType.names, :default => LeaderboardType::LIFETIME
|
280
303
|
#
|
281
304
|
# @api public
|
282
|
-
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
305
|
+
# @return [Arrays<WeaselDiesel::Params::Rule>]
|
283
306
|
# List of optional or required param rules depending on the new param rule type
|
284
307
|
def file(name, options={})
|
285
308
|
param(:file, name, options)
|
@@ -358,11 +381,16 @@ class WeaselDiesel
|
|
358
381
|
|
359
382
|
# Defines a namespaced param
|
360
383
|
#
|
384
|
+
# @param [Symbol, String] name
|
385
|
+
# The name of the namespace
|
386
|
+
# @param [Hash] opts
|
387
|
+
# A hash representing the namespace settings
|
388
|
+
#
|
361
389
|
# @yield [Params] the newly created namespaced param
|
362
390
|
# @return [Array<WeaselDiesel::Params>] the list of all the namespaced params
|
363
391
|
# @api public
|
364
|
-
def namespace(name)
|
365
|
-
params = Params.new(:space_name => name)
|
392
|
+
def namespace(name, opts={})
|
393
|
+
params = Params.new(:space_name => Namespace.new(name, :null => opts[:null]))
|
366
394
|
yield(params) if block_given?
|
367
395
|
namespaced_params << params unless namespaced_params.include?(params)
|
368
396
|
end
|
@@ -382,9 +410,10 @@ class WeaselDiesel
|
|
382
410
|
# @api public
|
383
411
|
def param_names
|
384
412
|
first_level_expected_params = (list_required + list_optional).map{|rule| rule.name.to_s}
|
385
|
-
first_level_expected_params += namespaced_params.map{|r| r.space_name.to_s}
|
413
|
+
first_level_expected_params += namespaced_params.map{|r| r.space_name.name.to_s}
|
386
414
|
first_level_expected_params
|
387
415
|
end
|
388
416
|
|
389
417
|
end # of Params
|
418
|
+
|
390
419
|
end
|
data/lib/params_verification.rb
CHANGED
@@ -7,14 +7,14 @@ require 'erb' # used to sanitize the error message and avoid XSS attacks
|
|
7
7
|
#
|
8
8
|
# @api public
|
9
9
|
module ParamsVerification
|
10
|
-
|
10
|
+
|
11
11
|
class ParamError < StandardError; end #:nodoc
|
12
12
|
class NoParamsDefined < ParamError; end #:nodoc
|
13
13
|
class MissingParam < ParamError; end #:nodoc
|
14
14
|
class UnexpectedParam < ParamError; end #:nodoc
|
15
15
|
class InvalidParamType < ParamError; end #:nodoc
|
16
16
|
class InvalidParamValue < ParamError; end #:nodoc
|
17
|
-
|
17
|
+
|
18
18
|
# An array of validation regular expressions.
|
19
19
|
# The array gets cached but can be accessed via the symbol key.
|
20
20
|
#
|
@@ -29,12 +29,12 @@ module ParamsVerification
|
|
29
29
|
#:array => /,/
|
30
30
|
}
|
31
31
|
end
|
32
|
-
|
32
|
+
|
33
33
|
# Validation against each required WeaselDiesel::Params::Rule
|
34
34
|
# and returns the potentially modified params (with default values)
|
35
|
-
#
|
35
|
+
#
|
36
36
|
# @param [Hash] params The params to verify (incoming request params)
|
37
|
-
# @param [WeaselDiesel::Params] service_params A Playco service param compatible object listing required and optional params
|
37
|
+
# @param [WeaselDiesel::Params] service_params A Playco service param compatible object listing required and optional params
|
38
38
|
# @param [Boolean] ignore_unexpected Flag letting the validation know if unexpected params should be ignored
|
39
39
|
#
|
40
40
|
# @return [Hash]
|
@@ -42,53 +42,55 @@ module ParamsVerification
|
|
42
42
|
#
|
43
43
|
# @example Validate request params against a service's defined param rules
|
44
44
|
# ParamsVerification.validate!(request.params, @service.defined_params)
|
45
|
-
#
|
45
|
+
#
|
46
46
|
# @api public
|
47
47
|
def self.validate!(params, service_params, ignore_unexpected=false)
|
48
|
-
|
48
|
+
|
49
49
|
# Verify that no garbage params are passed, if they are, an exception is raised.
|
50
50
|
# only the first level is checked at this point
|
51
51
|
unless ignore_unexpected
|
52
52
|
unexpected_params?(params, service_params.param_names)
|
53
53
|
end
|
54
|
-
|
54
|
+
|
55
55
|
# dupe the params so we don't modify the passed value
|
56
56
|
updated_params = params.dup
|
57
57
|
# Required param verification
|
58
58
|
service_params.list_required.each do |rule|
|
59
59
|
updated_params = validate_required_rule(rule, updated_params)
|
60
60
|
end
|
61
|
-
|
61
|
+
|
62
62
|
# Set optional defaults if any optional
|
63
63
|
service_params.list_optional.each do |rule|
|
64
64
|
updated_params = validate_optional_rule(rule, updated_params)
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
# check the namespaced params
|
68
68
|
service_params.namespaced_params.each do |param|
|
69
|
-
param.
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
69
|
+
unless param.space_name.null && updated_params[param.space_name.name.to_s].nil?
|
70
|
+
param.list_required.each do |rule|
|
71
|
+
updated_params = validate_required_rule(rule, updated_params, param.space_name.name.to_s)
|
72
|
+
end
|
73
|
+
param.list_optional.each do |rule|
|
74
|
+
updated_params = validate_optional_rule(rule, updated_params, param.space_name.name.to_s)
|
75
|
+
end
|
74
76
|
end
|
75
77
|
end
|
76
|
-
|
78
|
+
|
77
79
|
# verify nested params, only 1 level deep tho
|
78
80
|
params.each_pair do |key, value|
|
79
81
|
if value.is_a?(Hash)
|
80
|
-
namespaced = service_params.namespaced_params.find{|np| np.space_name.to_s == key.to_s}
|
82
|
+
namespaced = service_params.namespaced_params.find{|np| np.space_name.name.to_s == key.to_s}
|
81
83
|
raise UnexpectedParam, "Request included unexpected parameter: #{ERB::Util.html_escape(key)}" if namespaced.nil?
|
82
84
|
unexpected_params?(params[key], namespaced.param_names)
|
83
85
|
end
|
84
86
|
end
|
85
|
-
|
87
|
+
|
86
88
|
updated_params
|
87
89
|
end
|
88
|
-
|
89
|
-
|
90
|
+
|
91
|
+
|
90
92
|
private
|
91
|
-
|
93
|
+
|
92
94
|
# Validates a required rule against a list of params passed.
|
93
95
|
#
|
94
96
|
#
|
@@ -131,7 +133,7 @@ module ParamsVerification
|
|
131
133
|
# @param [String] namespace An optional namespace
|
132
134
|
#
|
133
135
|
# @return [Hash] The potentially modified params
|
134
|
-
#
|
136
|
+
#
|
135
137
|
# @api private
|
136
138
|
def self.validate_optional_rule(rule, params, namespace=nil)
|
137
139
|
param_name = rule.name.to_s
|
@@ -169,7 +171,7 @@ module ParamsVerification
|
|
169
171
|
# @param [Hash] params The params that might need to be updated.
|
170
172
|
# @param [String, Symbol] namespace The optional namespace used to access the `param_value`
|
171
173
|
#
|
172
|
-
# @return [Array<Object, Hash>] An array containing the param value and
|
174
|
+
# @return [Array<Object, Hash>] An array containing the param value and
|
173
175
|
# a hash representing the potentially modified params after going through the filter.
|
174
176
|
#
|
175
177
|
def self.validate_and_cast_type(param_value, param_name, rule_type, params, namespace=nil)
|
@@ -267,8 +269,8 @@ module ParamsVerification
|
|
267
269
|
end
|
268
270
|
end
|
269
271
|
end
|
270
|
-
|
271
|
-
|
272
|
+
|
273
|
+
|
272
274
|
def self.unexpected_params?(params, param_names)
|
273
275
|
# Raise an exception unless no unexpected params were found
|
274
276
|
unexpected_keys = (params.keys - param_names)
|
@@ -276,8 +278,8 @@ module ParamsVerification
|
|
276
278
|
raise UnexpectedParam, "Request included unexpected parameter(s): #{unexpected_keys.map{|k| ERB::Util.html_escape(k)}.join(', ')}"
|
277
279
|
end
|
278
280
|
end
|
279
|
-
|
280
|
-
|
281
|
+
|
282
|
+
|
281
283
|
def self.type_cast_value(type, value)
|
282
284
|
return value if value == nil
|
283
285
|
case type
|
@@ -311,7 +313,7 @@ module ParamsVerification
|
|
311
313
|
value
|
312
314
|
end
|
313
315
|
end
|
314
|
-
|
316
|
+
|
315
317
|
# Checks that the value's type matches the expected type for a given param. If a nil value is passed
|
316
318
|
# the verification is skipped.
|
317
319
|
#
|
data/lib/response.rb
CHANGED
@@ -34,7 +34,7 @@ class WeaselDiesel
|
|
34
34
|
# @param [String, Symbol] name the name of the element.
|
35
35
|
# @param [Hash] opts the element options.
|
36
36
|
# @see Vector#initialize
|
37
|
-
def array(name, type=nil)
|
37
|
+
def array(name=nil, type=nil)
|
38
38
|
vector = Vector.new(name, type)
|
39
39
|
yield(vector) if block_given?
|
40
40
|
@arrays << vector
|
@@ -101,7 +101,7 @@ class WeaselDiesel
|
|
101
101
|
end
|
102
102
|
|
103
103
|
# The Response element class describing each element of a service response.
|
104
|
-
# Instances are usually not
|
104
|
+
# Instances are usually not instantiated directly but via the Response#element accessor.
|
105
105
|
#
|
106
106
|
# @see WeaselDiesel::Response#element
|
107
107
|
# @api public
|
@@ -273,7 +273,7 @@ class WeaselDiesel
|
|
273
273
|
#
|
274
274
|
# @param [Symbol, String] name the name of the element.
|
275
275
|
# @param [Hash] opts the options for the newly created element.
|
276
|
-
def object(name, opts={}, &block)
|
276
|
+
def object(name=nil, opts={}, &block)
|
277
277
|
element(opts.merge(:name => name), &block)
|
278
278
|
end
|
279
279
|
|
data/lib/weasel_diesel.rb
CHANGED
@@ -366,8 +366,8 @@ class WeaselDiesel
|
|
366
366
|
# and in the documentation block.
|
367
367
|
# @api private
|
368
368
|
def sync_input_param_doc
|
369
|
-
defined_params.namespaced_params.each do |prms|
|
370
|
-
doc.namespace(prms.space_name) do |ns|
|
369
|
+
defined_params.namespaced_params.each do |prms|
|
370
|
+
doc.namespace(prms.space_name.name) do |ns|
|
371
371
|
prms.list_optional.each do |rule|
|
372
372
|
ns.param(rule.name, rule.options[:doc]) if rule.options[:doc]
|
373
373
|
end
|
@@ -176,7 +176,7 @@ describe "WeaselDiesel anonymous JSON object response description" do
|
|
176
176
|
@response = @service.response
|
177
177
|
end
|
178
178
|
|
179
|
-
it "should have a properly structured
|
179
|
+
it "should have a properly structured response" do
|
180
180
|
top_object = @service.response.elements.first
|
181
181
|
top_object.should_not be_nil
|
182
182
|
name_node = top_object.properties.find{|o| o.name == :name}
|
@@ -185,3 +185,35 @@ describe "WeaselDiesel anonymous JSON object response description" do
|
|
185
185
|
end
|
186
186
|
|
187
187
|
end
|
188
|
+
|
189
|
+
|
190
|
+
describe "WeaselDiesel top level array response description" do
|
191
|
+
|
192
|
+
=begin
|
193
|
+
'[ { "name":"Bob" }, { "name": "Judy" } ]'
|
194
|
+
=end
|
195
|
+
|
196
|
+
before :all do
|
197
|
+
@service = describe_service 'tl_array' do |service|
|
198
|
+
service.formats :json
|
199
|
+
service.response do |response|
|
200
|
+
# anonymous array response
|
201
|
+
response.array do |arr|
|
202
|
+
arr.object do |node|
|
203
|
+
node.string :name
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
it "should have a properly structured response" do
|
211
|
+
top_object = @service.response.nodes.first
|
212
|
+
top_object.should_not be_nil
|
213
|
+
top_object.should be_an_instance_of(WeaselDiesel::Response::Vector)
|
214
|
+
top_object.elements.first.should_not be_nil
|
215
|
+
top_object.elements.first.attributes.first.name.should eq(:name)
|
216
|
+
top_object.elements.first.attributes.first.type.should eq(:string)
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
@@ -73,16 +73,28 @@ describe "JSON response verification" do
|
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
76
|
+
@top_level_array_service = describe_service "tl_array#{__LINE__}" do |service|
|
77
|
+
service.formats :json
|
78
|
+
service.response do |response|
|
79
|
+
# anonymous array response
|
80
|
+
response.array do |arr|
|
81
|
+
arr.object do |node|
|
82
|
+
node.string :name
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
76
88
|
end
|
77
89
|
|
78
90
|
|
79
91
|
def valid_response(namespaced=true)
|
80
|
-
response = {
|
81
|
-
"id" => 1,
|
92
|
+
response = {
|
93
|
+
"id" => 1,
|
82
94
|
"name" => "matt",
|
83
|
-
"created_at" => "2011-09-22T16:32:46-07:00",
|
95
|
+
"created_at" => "2011-09-22T16:32:46-07:00",
|
84
96
|
"creds" => { "id" => 42, "price" => 2010.07, "enabled" => false }
|
85
|
-
}
|
97
|
+
}
|
86
98
|
namespaced ? {"user" => response} : response
|
87
99
|
end
|
88
100
|
|
@@ -120,9 +132,12 @@ describe "JSON response verification" do
|
|
120
132
|
}
|
121
133
|
end
|
122
134
|
|
135
|
+
def valid_top_level_array_response
|
136
|
+
[ { "name" => "Bob" }, { "name" => "Judy" } ]
|
137
|
+
end
|
123
138
|
|
124
139
|
it "should validate the response" do
|
125
|
-
valid, errors = @service.
|
140
|
+
valid, errors = @service.verify(valid_response)
|
126
141
|
errors.should == []
|
127
142
|
valid.should be_true
|
128
143
|
errors.should be_empty
|
@@ -131,7 +146,7 @@ describe "JSON response verification" do
|
|
131
146
|
it "should detect that the response is missing the top level object" do
|
132
147
|
response = valid_response
|
133
148
|
response.delete("user")
|
134
|
-
valid, errors = @service.
|
149
|
+
valid, errors = @service.verify(response)
|
135
150
|
valid.should be_false
|
136
151
|
errors.should_not be_empty
|
137
152
|
end
|
@@ -139,7 +154,7 @@ describe "JSON response verification" do
|
|
139
154
|
it "should detect that a property integer type is wrong" do
|
140
155
|
response = valid_response
|
141
156
|
response["user"]["id"] = 'test'
|
142
|
-
valid, errors = @service.
|
157
|
+
valid, errors = @service.verify(response)
|
143
158
|
valid.should be_false
|
144
159
|
errors.should_not be_empty
|
145
160
|
errors.first.should match(/id/)
|
@@ -149,7 +164,7 @@ describe "JSON response verification" do
|
|
149
164
|
it "should detect that an integer attribute value is nil" do
|
150
165
|
response = valid_response
|
151
166
|
response["user"]["id"] = nil
|
152
|
-
valid, errors = @service.
|
167
|
+
valid, errors = @service.verify(response)
|
153
168
|
valid.should be_false
|
154
169
|
errors.should_not be_empty
|
155
170
|
errors.first.should match(/id/)
|
@@ -159,38 +174,36 @@ describe "JSON response verification" do
|
|
159
174
|
it "should detect that a string attribute value is nil [bug]" do
|
160
175
|
response = valid_response
|
161
176
|
response["user"]["name"] = nil
|
162
|
-
valid, errors = @service.
|
177
|
+
valid, errors = @service.verify(response)
|
163
178
|
valid.should be_false
|
164
179
|
errors.should_not be_empty
|
165
180
|
errors.first.should match(/name/)
|
166
181
|
errors.first.should match(/wrong type/)
|
167
182
|
end
|
168
183
|
|
169
|
-
|
170
184
|
it "should detect that a nested object is missing" do
|
171
185
|
response = valid_response
|
172
186
|
response["user"].delete("creds")
|
173
|
-
valid, errors = @service.
|
187
|
+
valid, errors = @service.verify(response)
|
174
188
|
valid.should be_false
|
175
189
|
errors.first.should match(/creds/)
|
176
190
|
errors.first.should match(/missing/)
|
177
191
|
end
|
178
192
|
|
179
193
|
it "should validate non namespaced responses" do
|
180
|
-
valid, errors = @second_service.
|
194
|
+
valid, errors = @second_service.verify(valid_response(false))
|
181
195
|
valid.should be_true
|
182
196
|
end
|
183
197
|
|
184
198
|
it "should validate nil attributes if marked as nullable" do
|
185
199
|
response = valid_response(false)
|
186
200
|
response["name"] = nil
|
187
|
-
valid, errors = @second_service.
|
201
|
+
valid, errors = @second_service.verify(response)
|
188
202
|
valid.should be_true
|
189
203
|
end
|
190
204
|
|
191
|
-
|
192
205
|
it "should validate array items" do
|
193
|
-
valid, errors = @third_service.
|
206
|
+
valid, errors = @third_service.verify(valid_array_response)
|
194
207
|
valid.should be_true
|
195
208
|
errors.should be_empty
|
196
209
|
end
|
@@ -198,28 +211,40 @@ describe "JSON response verification" do
|
|
198
211
|
it "should validate an empty array" do
|
199
212
|
response = valid_array_response
|
200
213
|
response["users"] = []
|
201
|
-
valid, errors = @third_service.
|
214
|
+
valid, errors = @third_service.verify(response)
|
202
215
|
valid.should be_true
|
203
216
|
end
|
204
217
|
|
205
218
|
it "should catch error in an array item" do
|
206
219
|
response = valid_array_response
|
207
220
|
response["users"][1]["id"] = 'test'
|
208
|
-
valid, errors = @third_service.
|
221
|
+
valid, errors = @third_service.verify(response)
|
209
222
|
valid.should be_false
|
210
223
|
errors.should_not be_empty
|
211
224
|
end
|
212
225
|
|
213
226
|
it "should validate nested arrays" do
|
214
|
-
valid, errors = @forth_service.
|
227
|
+
valid, errors = @forth_service.verify(valid_nested_array_response)
|
215
228
|
valid.should be_true
|
216
229
|
end
|
217
230
|
|
218
|
-
|
219
231
|
it "should respect optional properties" do
|
220
|
-
valid, errors = @optional_prop_service.
|
232
|
+
valid, errors = @optional_prop_service.verify({})
|
221
233
|
valid.should be_true
|
222
234
|
end
|
223
235
|
|
236
|
+
it "should validate the response" do
|
237
|
+
valid, errors = @service.verify(valid_response)
|
238
|
+
errors.should == []
|
239
|
+
valid.should be_true
|
240
|
+
errors.should be_empty
|
241
|
+
end
|
242
|
+
|
243
|
+
it "should validated a top level array" do
|
244
|
+
valid, errors = @top_level_array_service.verify(valid_top_level_array_response)
|
245
|
+
errors.should == []
|
246
|
+
valid.should be_true
|
247
|
+
errors.should be_empty
|
248
|
+
end
|
224
249
|
|
225
250
|
end
|
@@ -1,24 +1,24 @@
|
|
1
1
|
require_relative "spec_helper"
|
2
2
|
|
3
3
|
describe ParamsVerification do
|
4
|
-
|
4
|
+
|
5
5
|
before :all do
|
6
6
|
@service = WSList.find(:get, '/services/test.xml')
|
7
7
|
@service.should_not be_nil
|
8
|
-
@valid_params = {'framework' => 'RSpec', 'version' => '1.02', 'user' => {'id' => '123', 'groups' => 'manager,developer', 'skills' => 'java,ruby'}}
|
8
|
+
@valid_params = {'framework' => 'RSpec', 'version' => '1.02', 'options' => nil, 'user' => {'id' => '123', 'groups' => 'manager,developer', 'skills' => 'java,ruby'}}
|
9
9
|
end
|
10
10
|
|
11
11
|
def copy(params)
|
12
12
|
Marshal.load( Marshal.dump(params) )
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
it "should validate valid params" do
|
16
16
|
params = copy(@valid_params)
|
17
17
|
lambda{ ParamsVerification.validate!(params, @service.defined_params) }.should_not raise_exception
|
18
18
|
params['name'] = 'Mattetti'
|
19
19
|
lambda{ ParamsVerification.validate!(params, @service.defined_params) }.should_not raise_exception
|
20
20
|
end
|
21
|
-
|
21
|
+
|
22
22
|
it "should return the params" do
|
23
23
|
params = copy(@valid_params)
|
24
24
|
returned_params = ParamsVerification.validate!(params, @service.defined_params)
|
@@ -31,7 +31,7 @@ describe ParamsVerification do
|
|
31
31
|
returned_params = ParamsVerification.validate!(params, @service.defined_params)
|
32
32
|
returned_params.has_key?('name').should be_false
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
it "should return array in the params" do
|
36
36
|
params = copy(@valid_params)
|
37
37
|
returned_params = ParamsVerification.validate!(params, @service.defined_params)
|
@@ -79,7 +79,21 @@ describe ParamsVerification do
|
|
79
79
|
returned_params = ParamsVerification.validate!(params, @service.defined_params)
|
80
80
|
returned_params['user']['mailing_list'].should be_true
|
81
81
|
end
|
82
|
-
|
82
|
+
|
83
|
+
it "should verify child param rules if namespace is not null, but it nullable" do
|
84
|
+
params = copy(@valid_params)
|
85
|
+
params['options'] = {'verbose' => 'true'}
|
86
|
+
returned_params = ParamsVerification.validate!(params, @service.defined_params)
|
87
|
+
returned_params['options']['verbose'].should be_true
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should skip child param rules if namespace is null" do
|
91
|
+
params = copy(@valid_params)
|
92
|
+
params['options'].should be_nil
|
93
|
+
returned_params = ParamsVerification.validate!(params, @service.defined_params)
|
94
|
+
returned_params['options'].should be_nil
|
95
|
+
end
|
96
|
+
|
83
97
|
it "should raise an exception when a required param is missing" do
|
84
98
|
params = copy(@valid_params)
|
85
99
|
params.delete('framework')
|
@@ -99,13 +113,13 @@ describe ParamsVerification do
|
|
99
113
|
params = {'seq' => "a b c d e g"}
|
100
114
|
lambda{ ParamsVerification.validate!(params, service.defined_params) }.should_not raise_exception(ParamsVerification::InvalidParamType)
|
101
115
|
end
|
102
|
-
|
116
|
+
|
103
117
|
it "should raise an exception when a param is of the wrong type" do
|
104
118
|
params = copy(@valid_params)
|
105
119
|
params['user']['id'] = 'abc'
|
106
120
|
lambda{ ParamsVerification.validate!(params, @service.defined_params) }.should raise_exception(ParamsVerification::InvalidParamType)
|
107
121
|
end
|
108
|
-
|
122
|
+
|
109
123
|
it "should raise an exception when a param is under the min_value" do
|
110
124
|
params = copy(@valid_params)
|
111
125
|
params['num'] = '1'
|
@@ -131,7 +145,7 @@ describe ParamsVerification do
|
|
131
145
|
params['name'] = "Whether 'tis nobler in the mind to suffer The slings and arrows of outrageous fortune"
|
132
146
|
lambda{ ParamsVerification.validate!(params, @service.defined_params) }.should raise_exception(ParamsVerification::InvalidParamValue)
|
133
147
|
end
|
134
|
-
|
148
|
+
|
135
149
|
it "should raise an exception when a param isn't in the param option list" do
|
136
150
|
params = copy(@valid_params)
|
137
151
|
params['alpha'] = 'z'
|
@@ -186,7 +200,7 @@ describe ParamsVerification do
|
|
186
200
|
params['version'] = ''
|
187
201
|
lambda{ ParamsVerification.validate!(params, @service.defined_params) }.should raise_exception(ParamsVerification::InvalidParamValue)
|
188
202
|
end
|
189
|
-
|
203
|
+
|
190
204
|
it "should allow optional null integer params" do
|
191
205
|
service = WeaselDiesel.new("spec")
|
192
206
|
service.params do |p|
|
data/spec/test_services.rb
CHANGED
@@ -31,6 +31,10 @@ describe_service "services/test.xml" do |service|
|
|
31
31
|
user.array :skills, :in => %w{ruby java networking}
|
32
32
|
end
|
33
33
|
|
34
|
+
service.params.namespace :options, :null => true do |option|
|
35
|
+
option.boolean :verbose, :default => false, :required => :true
|
36
|
+
end
|
37
|
+
|
34
38
|
# the response contains a list of player creation ratings each object in the list
|
35
39
|
|
36
40
|
=begin
|
data/spec/wd_params_spec.rb
CHANGED
@@ -10,8 +10,8 @@ describe WeaselDiesel::Params do
|
|
10
10
|
|
11
11
|
it "should have the possibility to have a space name" do
|
12
12
|
@sparams.should respond_to(:space_name)
|
13
|
-
service_params = WeaselDiesel::Params.new(:space_name => 'spec_test')
|
14
|
-
service_params.space_name.should == 'spec_test'
|
13
|
+
service_params = WeaselDiesel::Params.new(:space_name => WeaselDiesel::Params::Namespace.new('spec_test'))
|
14
|
+
service_params.space_name.name.should == 'spec_test'
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should have a list of required param rules" do
|
@@ -26,8 +26,9 @@ describe WeaselDiesel::Params do
|
|
26
26
|
|
27
27
|
it "should have a list of namespaced param rules" do
|
28
28
|
@sparams.namespaced_params.should be_an_instance_of(Array)
|
29
|
-
@sparams.namespaced_params.length.should ==
|
30
|
-
@sparams.namespaced_params.first.space_name.should == :user
|
29
|
+
@sparams.namespaced_params.length.should == 2
|
30
|
+
@sparams.namespaced_params.first.space_name.name.should == :user
|
31
|
+
@sparams.namespaced_params[1].space_name.name.should == :options
|
31
32
|
end
|
32
33
|
|
33
34
|
it "should allow to define namespaced param" do
|
@@ -38,7 +39,7 @@ describe WeaselDiesel::Params do
|
|
38
39
|
end
|
39
40
|
end
|
40
41
|
service.params.namespaced_params.should_not be_empty
|
41
|
-
ns = service.params.namespaced_params.find{|ns| ns.space_name == :preference}
|
42
|
+
ns = service.params.namespaced_params.find{|ns| ns.space_name.name == :preference}
|
42
43
|
ns.should_not be_nil
|
43
44
|
ns.list_optional.first.name.should == "Ze id."
|
44
45
|
end
|
@@ -51,7 +52,7 @@ describe WeaselDiesel::Params do
|
|
51
52
|
end
|
52
53
|
end
|
53
54
|
service.params.namespaced_params.should_not be_empty
|
54
|
-
ns = service.params.namespaced_params.find{|ns| ns.space_name == :preference}
|
55
|
+
ns = service.params.namespaced_params.find{|ns| ns.space_name.name == :preference}
|
55
56
|
ns.should_not be_nil
|
56
57
|
ns.list_optional.first.name.should == "Ze id."
|
57
58
|
end
|
@@ -73,4 +74,19 @@ describe WeaselDiesel::Params do
|
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
77
|
+
describe WeaselDiesel::Params::Namespace do
|
78
|
+
before :all do
|
79
|
+
@namespace = @sparams.namespaced_params.first.space_name
|
80
|
+
@namespace.should_not be_nil
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should have a name" do
|
84
|
+
@namespace.name.should == :user
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should have a null attribute" do
|
88
|
+
@namespace.null.should be_false
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
76
92
|
end
|
metadata
CHANGED
@@ -1,94 +1,83 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weasel_diesel
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.2
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Matt Aimonetti
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-08-24 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rspec
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rack-test
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: yard
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: sinatra
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: rake
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - '>='
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
83
|
description: Ruby DSL describing Web Services without implementation details.
|
@@ -134,33 +123,26 @@ files:
|
|
134
123
|
- weasel_diesel.gemspec
|
135
124
|
homepage: https://github.com/mattetti/Weasel-Diesel
|
136
125
|
licenses: []
|
126
|
+
metadata: {}
|
137
127
|
post_install_message:
|
138
128
|
rdoc_options: []
|
139
129
|
require_paths:
|
140
130
|
- lib
|
141
131
|
required_ruby_version: !ruby/object:Gem::Requirement
|
142
|
-
none: false
|
143
132
|
requirements:
|
144
|
-
- -
|
133
|
+
- - '>='
|
145
134
|
- !ruby/object:Gem::Version
|
146
135
|
version: '0'
|
147
|
-
segments:
|
148
|
-
- 0
|
149
|
-
hash: 1325572656893606813
|
150
136
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
151
|
-
none: false
|
152
137
|
requirements:
|
153
|
-
- -
|
138
|
+
- - '>='
|
154
139
|
- !ruby/object:Gem::Version
|
155
140
|
version: '0'
|
156
|
-
segments:
|
157
|
-
- 0
|
158
|
-
hash: 1325572656893606813
|
159
141
|
requirements: []
|
160
142
|
rubyforge_project: wsdsl
|
161
|
-
rubygems_version:
|
143
|
+
rubygems_version: 2.0.3
|
162
144
|
signing_key:
|
163
|
-
specification_version:
|
145
|
+
specification_version: 4
|
164
146
|
summary: Web Service DSL
|
165
147
|
test_files:
|
166
148
|
- spec/hello_world_controller.rb
|