apiture 0.2.3 → 0.2.4

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: 987570957cf2e6c779b9c3ccb5fa06a52f008ef8
4
- data.tar.gz: 058c845cfc7ae48422c7f1122c0eacc485099032
3
+ metadata.gz: 6e2623ed6a8ed5d4afb84de3468a2477c7d38d50
4
+ data.tar.gz: 8a5b0a97a0580bae322cbf5039ca6a680cc0f025
5
5
  SHA512:
6
- metadata.gz: 3efce36770c2060e613adf6c5491015ac85dcdf420b6a00a99c0dc76c7f4419c594b10c1d1b8acb5cd677c21a744d193c68776090f8e80b29c24294dac8cc72e
7
- data.tar.gz: b5fdd0338d28917d4c55982822386ad251f852a1cb1e7697b8313503bdf9515fa04d9b6bf544fe874970f83e9e3b2f523451520a725503bb7f148d4fcad6f487
6
+ metadata.gz: e7fd65d16903202142aa64920f1422f539c4c065ce4ef33533d0397e968a10667c870a408d83716dec25ffba25612208aee286cb3c516a4efe7e324f0f9b6243
7
+ data.tar.gz: 80634719998c8acdf7546472e8c280ecca41bc0037d99f83f4883c20293bb16962cd76a54d764560ce22dbb5be761bca94837f7ccfa5796839f230889adfedb9
@@ -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/data_model'
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
- data_models = self.data_models
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
- if schema.kind_of? String
153
- schema = data_models[parameter.schema]
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
- schema = DataModel.new(schema)
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[:schema] = schema
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 data_models
178
- @data_models ||= build_data_models
177
+ def definition_renderers
178
+ @definition_renderers ||= build_definition_renderers
179
179
  end
180
180
 
181
- def build_data_models
182
- specification.definitions.reduce({}) do |m, (name, definition)|
183
- m[name] = DataModel.new(definition)
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
- @schema = options[:schema]
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 @schema
25
- @schema.build(@name, env)
24
+ if @renderer
25
+ @renderer.render_parameter(@name, env)
26
26
  else
27
27
  context = env[:context]
28
28
  context.get_attribute(@name)
@@ -0,0 +1,17 @@
1
+ require 'apiture/swagger/node'
2
+
3
+ module Apiture
4
+ module Swagger
5
+ class ArrayDefinition < Node
6
+ attr_reader :id
7
+
8
+ attribute :items
9
+
10
+ def initialize(id)
11
+ super()
12
+ @id = id
13
+ end
14
+ end
15
+ end
16
+ end
17
+
@@ -0,0 +1,16 @@
1
+ module Apiture
2
+ module Swagger
3
+ class DefinitionReference < Node
4
+
5
+ attr_reader :ref
6
+
7
+ def initialize(ref)
8
+ @ref = ref
9
+ end
10
+
11
+ def definitionId
12
+ @ref.split('/').last
13
+ end
14
+ end
15
+ end
16
+ end
@@ -3,12 +3,13 @@ require 'apiture/swagger/property'
3
3
 
4
4
  module Apiture
5
5
  module Swagger
6
- class Definition < Node
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 = build_node(Definition, schema_json, trace: trace)
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 = build_node_hash(Definition, json, 'definitions') do |definition, def_json|
60
- build_schema_content(definition, def_json)
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 build_schema_content(definition, def_json)
68
- definition.properties = build_node_hash(Property, def_json, 'properties') do |prop, prop_json|
69
- prop.enum = prop_json["enum"]
70
- prop.items = prop_json["items"]
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
 
@@ -5,6 +5,8 @@ module Apiture
5
5
  class Property < DataTypeField
6
6
  attr_reader :id
7
7
 
8
+ attribute :definition
9
+
8
10
  def initialize(id)
9
11
  super()
10
12
  @id = id
@@ -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/definition'
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
@@ -1,3 +1,3 @@
1
1
  module Apiture
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
@@ -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 eq "NewStory"
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.items.count).to eq 1
91
- expect(attachments_prop.items["$ref"]).to eq '#/definitions/Attachment'
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::Definition
106
+ expect(request_param.schema.class).to eq Apiture::Swagger::ObjectDefinition
106
107
  end
108
+
107
109
  end
@@ -34,7 +34,9 @@
34
34
  "name": "story",
35
35
  "in": "body",
36
36
  "required": true,
37
- "schema": "NewStory"
37
+ "schema": {
38
+ "$ref": "#/definitions/NewStory"
39
+ }
38
40
  }
39
41
  ]
40
42
  }
@@ -31,7 +31,9 @@
31
31
  "name": "payload",
32
32
  "in": "body",
33
33
  "required": true,
34
- "schema": "Payload"
34
+ "schema": {
35
+ "$ref": "#/definitions/Payload"
36
+ }
35
37
  }
36
38
  ]
37
39
  }
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.3
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-15 00:00:00.000000000 Z
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/data_model.rb
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/definition.rb
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
@@ -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