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 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