apiture 0.2.3 → 0.2.4
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/lib/apiture/api_builder.rb +17 -15
- data/lib/apiture/definition_value_renderer.rb +42 -0
- data/lib/apiture/middleware/set_parameter_base.rb +3 -3
- data/lib/apiture/swagger/array_definition.rb +17 -0
- data/lib/apiture/swagger/definition_reference.rb +16 -0
- data/lib/apiture/swagger/{definition.rb → object_definition.rb} +2 -1
- data/lib/apiture/swagger/parser.rb +29 -8
- data/lib/apiture/swagger/property.rb +2 -0
- data/lib/apiture/swagger/specification.rb +3 -1
- data/lib/apiture/version.rb +1 -1
- data/spec/apiture/swagger/parser_spec.rb +6 -4
- data/spec/files/pivotal_tracker.json +3 -1
- data/spec/files/slack.json +3 -1
- metadata +6 -4
- data/lib/apiture/data_model.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e2623ed6a8ed5d4afb84de3468a2477c7d38d50
|
4
|
+
data.tar.gz: 8a5b0a97a0580bae322cbf5039ca6a680cc0f025
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7fd65d16903202142aa64920f1422f539c4c065ce4ef33533d0397e968a10667c870a408d83716dec25ffba25612208aee286cb3c516a4efe7e324f0f9b6243
|
7
|
+
data.tar.gz: 80634719998c8acdf7546472e8c280ecca41bc0037d99f83f4883c20293bb16962cd76a54d764560ce22dbb5be761bca94837f7ccfa5796839f230889adfedb9
|
data/lib/apiture/api_builder.rb
CHANGED
@@ -2,7 +2,7 @@ require 'apiture/version'
|
|
2
2
|
require 'apiture/api_error'
|
3
3
|
require 'apiture/utils/inflections'
|
4
4
|
require 'apiture/api_base'
|
5
|
-
require 'apiture/
|
5
|
+
require 'apiture/definition_value_renderer'
|
6
6
|
require 'apiture/uri'
|
7
7
|
|
8
8
|
require 'apiture/middleware/debug'
|
@@ -63,8 +63,7 @@ module Apiture
|
|
63
63
|
|
64
64
|
def build_endpoints
|
65
65
|
spec = specification
|
66
|
-
|
67
|
-
|
66
|
+
definitions = self.definition_renderers
|
68
67
|
spec.paths.map do |path, path_model|
|
69
68
|
path_model.operations_map.map do |(method, operation)|
|
70
69
|
endpoint_name = underscore(operation.operation_id)
|
@@ -149,15 +148,16 @@ module Apiture
|
|
149
148
|
middleware_opts = {name: parameter.name}
|
150
149
|
if parameter.schema?
|
151
150
|
schema = parameter.schema
|
152
|
-
|
153
|
-
|
151
|
+
renderer = nil
|
152
|
+
if schema.kind_of? Swagger::DefinitionReference
|
153
|
+
renderer = definitions[schema.definitionId]
|
154
|
+
unless renderer
|
155
|
+
raise APIError, "Unspecified schema: #{parameter.schema}; parameter=#{parameter.name}"
|
156
|
+
end
|
154
157
|
else
|
155
|
-
|
156
|
-
end
|
157
|
-
unless schema
|
158
|
-
raise APIError, "Unspecified schema: #{parameter.schema}; parameter=#{parameter.name}"
|
158
|
+
renderer = DefinitionValueRenderer.new(schema, definitions)
|
159
159
|
end
|
160
|
-
middleware_opts[:
|
160
|
+
middleware_opts[:renderer] = renderer
|
161
161
|
end
|
162
162
|
if spec.extensions[:version_parameter] && spec.extensions[:version_parameter]["name"] == parameter.name
|
163
163
|
middleware_opts[:default] = spec.extensions[:version_parameter]["version"]
|
@@ -174,15 +174,17 @@ module Apiture
|
|
174
174
|
end.flatten.compact
|
175
175
|
end
|
176
176
|
|
177
|
-
def
|
178
|
-
@
|
177
|
+
def definition_renderers
|
178
|
+
@definition_renderers ||= build_definition_renderers
|
179
179
|
end
|
180
180
|
|
181
|
-
def
|
182
|
-
|
183
|
-
|
181
|
+
def build_definition_renderers
|
182
|
+
definitions = {}
|
183
|
+
specification.definitions.reduce(definitions) do |m, (name, definition)|
|
184
|
+
m[name] = DefinitionValueRenderer.new(definition, definitions)
|
184
185
|
m
|
185
186
|
end
|
187
|
+
definitions
|
186
188
|
end
|
187
189
|
|
188
190
|
def create_class_name(name)
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Apiture
|
2
|
+
|
3
|
+
class DefinitionValueRenderer
|
4
|
+
|
5
|
+
def initialize(definition, all_definitions)
|
6
|
+
@definition = definition
|
7
|
+
@all_definitions = all_definitions
|
8
|
+
end
|
9
|
+
|
10
|
+
def render_parameter(parameter_name, env)
|
11
|
+
context = env[:context]
|
12
|
+
h = context.get_attribute(parameter_name)
|
13
|
+
return nil unless h
|
14
|
+
render(h)
|
15
|
+
end
|
16
|
+
|
17
|
+
def render(data)
|
18
|
+
if @definition.kind_of? Swagger::ObjectDefinition
|
19
|
+
render_object_def(data)
|
20
|
+
elsif @definition.kind_of? Swagger::ArrayDefinition
|
21
|
+
render_array_def(data)
|
22
|
+
else
|
23
|
+
raise Apiture::APIError, "Unsupported definition: #{@definition}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def render_object_def(hash)
|
28
|
+
@definition.properties.reduce({}) do |memo, (name, _)|
|
29
|
+
name = name.to_sym
|
30
|
+
if hash[name]
|
31
|
+
memo[name] = hash[name]
|
32
|
+
end
|
33
|
+
memo
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def render_array_def(array)
|
38
|
+
array.dup
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -5,7 +5,7 @@ module Apiture
|
|
5
5
|
def initialize(app, options)
|
6
6
|
@app = app
|
7
7
|
@name = options[:name]
|
8
|
-
@
|
8
|
+
@renderer = options[:renderer]
|
9
9
|
@default = options[:default]
|
10
10
|
end
|
11
11
|
|
@@ -21,8 +21,8 @@ module Apiture
|
|
21
21
|
protected
|
22
22
|
|
23
23
|
def find_parameter_value(env)
|
24
|
-
if @
|
25
|
-
@
|
24
|
+
if @renderer
|
25
|
+
@renderer.render_parameter(@name, env)
|
26
26
|
else
|
27
27
|
context = env[:context]
|
28
28
|
context.get_attribute(@name)
|
@@ -3,12 +3,13 @@ require 'apiture/swagger/property'
|
|
3
3
|
|
4
4
|
module Apiture
|
5
5
|
module Swagger
|
6
|
-
class
|
6
|
+
class ObjectDefinition < Node
|
7
7
|
attr_reader :id
|
8
8
|
|
9
9
|
attribute :required
|
10
10
|
attribute :discriminator
|
11
11
|
|
12
|
+
hash :items
|
12
13
|
hash :properties
|
13
14
|
|
14
15
|
def initialize(id = "<Inline>")
|
@@ -12,6 +12,11 @@ module Apiture
|
|
12
12
|
class Parser
|
13
13
|
include Apiture::Utils::Inflections
|
14
14
|
|
15
|
+
TYPE = 'type'.freeze
|
16
|
+
ARRAY = 'array'.freeze
|
17
|
+
DEFINITIONS = 'definitions'.freeze
|
18
|
+
REF = '$ref'.freeze
|
19
|
+
|
15
20
|
def parse_json(spec)
|
16
21
|
build_specification(MultiJson.load(spec))
|
17
22
|
end
|
@@ -42,8 +47,7 @@ module Apiture
|
|
42
47
|
if param_json["schema"] && param_json["schema"].kind_of?(Hash)
|
43
48
|
trace.unshift("schema")
|
44
49
|
schema_json = param_json["schema"]
|
45
|
-
param.schema =
|
46
|
-
build_schema_content(param.schema, schema_json)
|
50
|
+
param.schema = build_definition_types(schema_json, "<Inline>", trace: trace)
|
47
51
|
trace.shift
|
48
52
|
end
|
49
53
|
trace.shift
|
@@ -56,18 +60,35 @@ module Apiture
|
|
56
60
|
end
|
57
61
|
trace.shift
|
58
62
|
end
|
59
|
-
specification.definitions =
|
60
|
-
|
63
|
+
specification.definitions = (json[DEFINITIONS] || {}).reduce({}) do |memo, (id, def_json)|
|
64
|
+
memo[id] = build_definition_types(def_json, id)
|
65
|
+
memo
|
61
66
|
end
|
62
67
|
specification
|
63
68
|
end
|
64
69
|
|
65
70
|
protected
|
66
71
|
|
67
|
-
def
|
68
|
-
|
69
|
-
|
70
|
-
|
72
|
+
def build_definition_types(def_json, id, options = {})
|
73
|
+
if definition_type = def_json[TYPE]
|
74
|
+
if definition_type == ARRAY
|
75
|
+
def_node = build_node(ArrayDefinition, def_json, constructor_args: [id], trace: options[:trace])
|
76
|
+
def_node.items = build_definition_types(def_json["items"], "<Inline>", options) if def_json["items"]
|
77
|
+
def_node
|
78
|
+
else
|
79
|
+
def_node = build_node(ObjectDefinition, def_json, constructor_args: [id], trace: options[:trace])
|
80
|
+
def_node.properties = build_node_hash(Property, def_json, 'properties') do |prop, prop_json|
|
81
|
+
prop.enum = prop_json["enum"]
|
82
|
+
if [:object, :array].include?(prop.type)
|
83
|
+
prop.definition = build_definition_types(prop_json, "<Inline>", options)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
def_node
|
87
|
+
end
|
88
|
+
elsif def_ref = def_json[REF]
|
89
|
+
DefinitionReference.new(def_ref)
|
90
|
+
else
|
91
|
+
def_json
|
71
92
|
end
|
72
93
|
end
|
73
94
|
|
@@ -3,7 +3,9 @@ require 'apiture/swagger/external_docs'
|
|
3
3
|
require 'apiture/swagger/security'
|
4
4
|
require 'apiture/swagger/security_definition'
|
5
5
|
require 'apiture/swagger/path'
|
6
|
-
require 'apiture/swagger/
|
6
|
+
require 'apiture/swagger/object_definition'
|
7
|
+
require 'apiture/swagger/array_definition'
|
8
|
+
require 'apiture/swagger/definition_reference'
|
7
9
|
# require 'apiture/swagger/response'
|
8
10
|
|
9
11
|
module Apiture
|
data/lib/apiture/version.rb
CHANGED
@@ -53,7 +53,8 @@ describe Apiture::Swagger::Parser do
|
|
53
53
|
expect(param2.in).to eq :body
|
54
54
|
expect(param2.name).to eq "story"
|
55
55
|
expect(param2).to be_required
|
56
|
-
expect(param2.schema).to
|
56
|
+
expect(param2.schema).to be_kind_of Apiture::Swagger::DefinitionReference
|
57
|
+
expect(param2.schema.ref).to eq "#/definitions/NewStory"
|
57
58
|
|
58
59
|
expect(specification.definitions.count).to eq 1
|
59
60
|
|
@@ -87,8 +88,8 @@ describe Apiture::Swagger::Parser do
|
|
87
88
|
|
88
89
|
attachments_prop = payload.properties['attachments']
|
89
90
|
expect(attachments_prop.type).to eq :array
|
90
|
-
expect(attachments_prop.
|
91
|
-
expect(attachments_prop.items
|
91
|
+
expect(attachments_prop.definition).to be_kind_of Apiture::Swagger::ArrayDefinition
|
92
|
+
expect(attachments_prop.definition.items).to be_kind_of Apiture::Swagger::DefinitionReference
|
92
93
|
end
|
93
94
|
|
94
95
|
it "should parse a swagger specification with operation specific security" do
|
@@ -102,6 +103,7 @@ describe Apiture::Swagger::Parser do
|
|
102
103
|
op = specification.paths["/messages/send.json"].post
|
103
104
|
request_param = op.parameters.first
|
104
105
|
expect(specification.consumes).to include "application/json"
|
105
|
-
expect(request_param.schema.class).to eq Apiture::Swagger::
|
106
|
+
expect(request_param.schema.class).to eq Apiture::Swagger::ObjectDefinition
|
106
107
|
end
|
108
|
+
|
107
109
|
end
|
data/spec/files/slack.json
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apiture
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Calvin Yu
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07
|
11
|
+
date: 2016-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -142,7 +142,7 @@ files:
|
|
142
142
|
- lib/apiture/api_builder.rb
|
143
143
|
- lib/apiture/api_error.rb
|
144
144
|
- lib/apiture/api_group.rb
|
145
|
-
- lib/apiture/
|
145
|
+
- lib/apiture/definition_value_renderer.rb
|
146
146
|
- lib/apiture/endpoint.rb
|
147
147
|
- lib/apiture/middleware/auth/api_key.rb
|
148
148
|
- lib/apiture/middleware/auth/basic.rb
|
@@ -158,11 +158,13 @@ files:
|
|
158
158
|
- lib/apiture/middleware_builder.rb
|
159
159
|
- lib/apiture/middleware_stack.rb
|
160
160
|
- lib/apiture/request_context.rb
|
161
|
+
- lib/apiture/swagger/array_definition.rb
|
161
162
|
- lib/apiture/swagger/data_type_field.rb
|
162
|
-
- lib/apiture/swagger/
|
163
|
+
- lib/apiture/swagger/definition_reference.rb
|
163
164
|
- lib/apiture/swagger/external_docs.rb
|
164
165
|
- lib/apiture/swagger/info.rb
|
165
166
|
- lib/apiture/swagger/node.rb
|
167
|
+
- lib/apiture/swagger/object_definition.rb
|
166
168
|
- lib/apiture/swagger/operation.rb
|
167
169
|
- lib/apiture/swagger/parameter.rb
|
168
170
|
- lib/apiture/swagger/parser.rb
|
data/lib/apiture/data_model.rb
DELETED
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'multi_json'
|
2
|
-
|
3
|
-
module Apiture
|
4
|
-
class DataModel
|
5
|
-
attr_reader :definition
|
6
|
-
|
7
|
-
def initialize(definition)
|
8
|
-
@definition = definition
|
9
|
-
end
|
10
|
-
|
11
|
-
def build(parameter_name, env)
|
12
|
-
context = env[:context]
|
13
|
-
h = context.get_attribute(parameter_name)
|
14
|
-
return nil unless h
|
15
|
-
|
16
|
-
json = definition.properties.reduce({}) do |m, (name, _)|
|
17
|
-
name = name.to_sym
|
18
|
-
m[name] = h[name] if h[name]; m
|
19
|
-
end
|
20
|
-
|
21
|
-
json
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|