apipie-bindings 0.0.9 → 0.0.10
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 +4 -4
- data/doc/release_notes.md +3 -0
- data/lib/apipie_bindings/action.rb +28 -8
- data/lib/apipie_bindings/api.rb +1 -1
- data/lib/apipie_bindings/exceptions.rb +9 -0
- data/lib/apipie_bindings/param.rb +7 -1
- data/lib/apipie_bindings/utilities.rb +18 -0
- data/lib/apipie_bindings/version.rb +1 -1
- data/test/unit/action_test.rb +14 -2
- data/test/unit/data/architecture.json +38 -0
- data/test/unit/resource_test.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ff423fb9cfff64a08d97f4a3709b25e03efa1289
|
4
|
+
data.tar.gz: 589750c97d73e14a76480b7f286652706fcb2871
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d98b130b8d4bfc3d0f8b8b55da47491ab310d0a3bc5a9bfc6486863d02153bcff05656584225a164e7b746b4f32dcf998fb5f38faf6e1d0faae3884878abd7f9
|
7
|
+
data.tar.gz: eefe52e4281fde2e644eb2be132d2f4045d9803966f8ab4016a8f2fb1b9adb158d75ac0e29c9e35ea24e803870ee694f433c16570726aa4add3f23b2fd075522
|
data/doc/release_notes.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
Release notes
|
2
2
|
=============
|
3
3
|
|
4
|
+
### 0.0.10 (2014-09-18)
|
5
|
+
* apipie-bindings should enforce required params, BZ 1116803 ([#6820](http://projects.theforeman.org/issues/6820))
|
6
|
+
|
4
7
|
### 0.0.9 (2014-08-29)
|
5
8
|
* Fixes RHBZ#1134954 - Log API errors that are re-risen with debug verbosity
|
6
9
|
* Add apidoc_cache_base_dir option to move all caches to another dir
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'apipie_bindings/utilities'
|
2
|
+
|
1
3
|
module ApipieBindings
|
2
4
|
|
3
5
|
class Action
|
@@ -56,16 +58,34 @@ module ApipieBindings
|
|
56
58
|
end
|
57
59
|
|
58
60
|
def validate!(params)
|
59
|
-
|
61
|
+
missing_params = missing_params(api_params_tree { |par| par.required? }, params_tree(params))
|
62
|
+
raise ApipieBindings::MissingArgumentsError.new(missing_params) unless missing_params.empty?
|
63
|
+
end
|
64
|
+
|
65
|
+
def api_params_tree(&block)
|
66
|
+
ApipieBindings::Utilities.params_hash_tree(self.params, &block)
|
67
|
+
end
|
60
68
|
|
61
|
-
|
62
|
-
|
69
|
+
def params_tree(params)
|
70
|
+
params.inject([]) do |tree, (key, val)|
|
71
|
+
subtree = val.is_a?(Hash) ? { key.to_s => params_tree(val) } : key.to_s
|
72
|
+
tree << subtree
|
73
|
+
tree
|
74
|
+
end
|
75
|
+
end
|
63
76
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
77
|
+
def missing_params(master, slave)
|
78
|
+
missing = []
|
79
|
+
master.each do |required_param|
|
80
|
+
if required_param.is_a?(Hash)
|
81
|
+
key = required_param.keys.first
|
82
|
+
slave_hash = slave.select { |p| p.is_a?(Hash) && p[key] }
|
83
|
+
missing << missing_params(required_param[key], slave_hash.first ? slave_hash.first[key] : [])
|
84
|
+
else
|
85
|
+
missing << required_param unless slave.include?(required_param)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
missing.flatten.sort
|
69
89
|
end
|
70
90
|
|
71
91
|
def to_s
|
data/lib/apipie_bindings/api.rb
CHANGED
@@ -148,7 +148,7 @@ module ApipieBindings
|
|
148
148
|
resource = resource(resource_name)
|
149
149
|
action = resource.action(action_name)
|
150
150
|
route = action.find_route(params)
|
151
|
-
|
151
|
+
action.validate!(params)
|
152
152
|
options[:fake_response] = find_match(fake_responses, resource_name, action_name, params) || action.examples.first if dry_run?
|
153
153
|
return http_call(
|
154
154
|
route.method,
|
@@ -3,4 +3,13 @@ module ApipieBindings
|
|
3
3
|
class ConfigurationError < StandardError; end
|
4
4
|
class DocLoadingError < StandardError; end
|
5
5
|
|
6
|
+
class MissingArgumentsError < StandardError
|
7
|
+
attr_reader :params
|
8
|
+
|
9
|
+
def initialize(params)
|
10
|
+
@params = params
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
6
15
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'apipie_bindings/utilities'
|
2
|
+
|
1
3
|
module ApipieBindings
|
2
4
|
|
3
5
|
class Param
|
@@ -11,10 +13,14 @@ module ApipieBindings
|
|
11
13
|
@params = params.map { |p| ApipieBindings::Param.new(p) }
|
12
14
|
@expected_type = param[:expected_type].to_sym
|
13
15
|
@description = param[:description].gsub(/<\/?[^>]+?>/, "")
|
14
|
-
@required = param[:required]
|
16
|
+
@required = param[:required] || @params.inject(false) { |req, par| req ||= par.required? }
|
15
17
|
@validator = param[:validator]
|
16
18
|
end
|
17
19
|
|
20
|
+
def tree(&block)
|
21
|
+
ApipieBindings::Utilities.params_hash_tree(@params, &block)
|
22
|
+
end
|
23
|
+
|
18
24
|
def required?
|
19
25
|
@required
|
20
26
|
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module ApipieBindings
|
2
|
+
|
3
|
+
module Utilities
|
4
|
+
|
5
|
+
def self.params_hash_tree(params_hash, &block)
|
6
|
+
block ||= lambda { |_| true }
|
7
|
+
params_hash.inject([]) do |tree, par|
|
8
|
+
if block.call(par)
|
9
|
+
subtree = par.expected_type == :hash ? { par.name => par.tree(&block) } : par.name
|
10
|
+
tree << subtree
|
11
|
+
end
|
12
|
+
tree
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
data/test/unit/action_test.rb
CHANGED
@@ -41,8 +41,20 @@ describe ApipieBindings::Action do
|
|
41
41
|
# incuded params in alphanumeric order.
|
42
42
|
|
43
43
|
|
44
|
-
it "should validate
|
45
|
-
|
44
|
+
it "should validate incorrect params" do
|
45
|
+
proc do
|
46
|
+
resource.action(:create).validate!({ :architecture => { :foo => "foo" } })
|
47
|
+
end.must_raise(ApipieBindings::MissingArgumentsError)
|
48
|
+
|
49
|
+
proc do
|
50
|
+
# completely different sub-hash; should still fail
|
51
|
+
resource.action(:create).validate!({ :organization => { :name => "acme" } })
|
52
|
+
end.must_raise(ApipieBindings::MissingArgumentsError)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should accept correct params" do
|
56
|
+
resource.action(:create).validate!({:architecture => { :name => 'i386' } })
|
57
|
+
resource.action(:create_unnested).validate!(:name => "i386")
|
46
58
|
end
|
47
59
|
|
48
60
|
it "should have name visible in puts" do
|
@@ -145,6 +145,44 @@
|
|
145
145
|
}
|
146
146
|
],
|
147
147
|
"see": []
|
148
|
+
},
|
149
|
+
{
|
150
|
+
"apis": [
|
151
|
+
{
|
152
|
+
"api_url": "/api/architectures",
|
153
|
+
"http_method": "POST",
|
154
|
+
"short_description": "create an architecture."
|
155
|
+
}
|
156
|
+
],
|
157
|
+
"doc_url": "/apidoc/v2/architectures/create",
|
158
|
+
"errors": [],
|
159
|
+
"examples" : [
|
160
|
+
"same as nested create"
|
161
|
+
],
|
162
|
+
"formats": null,
|
163
|
+
"full_description": "",
|
164
|
+
"name": "create_unnested",
|
165
|
+
"params":[
|
166
|
+
{
|
167
|
+
"allow_nil": false,
|
168
|
+
"description": "",
|
169
|
+
"expected_type": "string",
|
170
|
+
"full_name": "architecture[name]",
|
171
|
+
"name": "name",
|
172
|
+
"required": true,
|
173
|
+
"validator": "Must be String"
|
174
|
+
},
|
175
|
+
{
|
176
|
+
"allow_nil": false,
|
177
|
+
"description": "\n<p>Operatingsystem ID\u2019s</p>\n",
|
178
|
+
"expected_type": "array",
|
179
|
+
"full_name": "architecture[operatingsystem_ids]",
|
180
|
+
"name": "operatingsystem_ids",
|
181
|
+
"required": false,
|
182
|
+
"validator": "Must be Array"
|
183
|
+
}
|
184
|
+
],
|
185
|
+
"see": []
|
148
186
|
}
|
149
187
|
]
|
150
188
|
}
|
data/test/unit/resource_test.rb
CHANGED
@@ -6,7 +6,7 @@ describe ApipieBindings::Resource do
|
|
6
6
|
:apidoc_cache_name => 'architecture'}).resource(:architectures) }
|
7
7
|
|
8
8
|
it "should list actions" do
|
9
|
-
resource.actions.map(&:name).must_equal [:index, :show, :create]
|
9
|
+
resource.actions.map(&:name).must_equal [:index, :show, :create, :create_unnested]
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should test action existence" do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apipie-bindings
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Martin Bačovský
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json
|
@@ -214,6 +214,7 @@ files:
|
|
214
214
|
- lib/apipie_bindings/resource.rb
|
215
215
|
- lib/apipie_bindings/rest_client_oauth.rb
|
216
216
|
- lib/apipie_bindings/route.rb
|
217
|
+
- lib/apipie_bindings/utilities.rb
|
217
218
|
- lib/apipie_bindings/version.rb
|
218
219
|
- test/unit/action_test.rb
|
219
220
|
- test/unit/api_test.rb
|