jsapi 0.9.2 → 1.1

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.
Files changed (61) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jsapi/controller/methods.rb +4 -2
  3. data/lib/jsapi/meta/callback/{model.rb → base.rb} +4 -6
  4. data/lib/jsapi/meta/callback/reference.rb +2 -7
  5. data/lib/jsapi/meta/callback.rb +3 -3
  6. data/lib/jsapi/meta/contact.rb +2 -2
  7. data/lib/jsapi/meta/defaults.rb +1 -1
  8. data/lib/jsapi/meta/definitions.rb +4 -6
  9. data/lib/jsapi/meta/example/{model.rb → base.rb} +5 -5
  10. data/lib/jsapi/meta/example/reference.rb +2 -7
  11. data/lib/jsapi/meta/example.rb +3 -3
  12. data/lib/jsapi/meta/external_documentation.rb +2 -2
  13. data/lib/jsapi/meta/header/{model.rb → base.rb} +3 -3
  14. data/lib/jsapi/meta/header/reference.rb +2 -7
  15. data/lib/jsapi/meta/header.rb +3 -3
  16. data/lib/jsapi/meta/info.rb +15 -7
  17. data/lib/jsapi/meta/license.rb +28 -5
  18. data/lib/jsapi/meta/link/{model.rb → base.rb} +2 -2
  19. data/lib/jsapi/meta/link/reference.rb +2 -7
  20. data/lib/jsapi/meta/link.rb +3 -3
  21. data/lib/jsapi/meta/{base → model}/attributes.rb +15 -18
  22. data/lib/jsapi/meta/{base/model.rb → model/base.rb} +2 -2
  23. data/lib/jsapi/meta/model/reference.rb +72 -0
  24. data/lib/jsapi/meta/{base → model}/type_caster.rb +1 -1
  25. data/lib/jsapi/meta/model.rb +6 -0
  26. data/lib/jsapi/meta/oauth_flow.rb +2 -2
  27. data/lib/jsapi/meta/openapi/extensions.rb +9 -25
  28. data/lib/jsapi/meta/openapi/version.rb +11 -0
  29. data/lib/jsapi/meta/openapi.rb +10 -0
  30. data/lib/jsapi/meta/operation.rb +15 -17
  31. data/lib/jsapi/meta/parameter/{model.rb → base.rb} +85 -68
  32. data/lib/jsapi/meta/parameter/reference.rb +4 -11
  33. data/lib/jsapi/meta/parameter.rb +3 -4
  34. data/lib/jsapi/meta/property.rb +6 -6
  35. data/lib/jsapi/meta/request_body/{model.rb → base.rb} +10 -8
  36. data/lib/jsapi/meta/request_body/reference.rb +2 -7
  37. data/lib/jsapi/meta/request_body.rb +3 -3
  38. data/lib/jsapi/meta/rescue_handler.rb +1 -1
  39. data/lib/jsapi/meta/response/{model.rb → base.rb} +10 -2
  40. data/lib/jsapi/meta/response/reference.rb +2 -10
  41. data/lib/jsapi/meta/response.rb +3 -3
  42. data/lib/jsapi/meta/schema/additional_properties.rb +2 -2
  43. data/lib/jsapi/meta/schema/array.rb +3 -5
  44. data/lib/jsapi/meta/schema/base.rb +10 -12
  45. data/lib/jsapi/meta/schema/conversion.rb +2 -2
  46. data/lib/jsapi/meta/schema/discriminator.rb +1 -1
  47. data/lib/jsapi/meta/schema/numeric.rb +3 -5
  48. data/lib/jsapi/meta/schema/object.rb +3 -5
  49. data/lib/jsapi/meta/schema/reference.rb +6 -6
  50. data/lib/jsapi/meta/schema/string.rb +3 -5
  51. data/lib/jsapi/meta/security_requirement.rb +3 -3
  52. data/lib/jsapi/meta/security_scheme/base.rb +1 -1
  53. data/lib/jsapi/meta/server.rb +2 -2
  54. data/lib/jsapi/meta/server_variable.rb +2 -2
  55. data/lib/jsapi/meta/tag.rb +2 -2
  56. data/lib/jsapi/meta.rb +1 -1
  57. data/lib/jsapi/version.rb +1 -1
  58. metadata +14 -15
  59. data/lib/jsapi/meta/base/reference.rb +0 -35
  60. data/lib/jsapi/meta/base.rb +0 -6
  61. data/lib/jsapi/meta/parameter/to_openapi.rb +0 -14
@@ -3,10 +3,10 @@
3
3
  module Jsapi
4
4
  module Meta
5
5
  # Represents an OAuth flow object.
6
- class OAuthFlow < Base::Model
6
+ class OAuthFlow < Model::Base
7
7
  include OpenAPI::Extensions
8
8
 
9
- class Scope < Base::Model
9
+ class Scope < Model::Base
10
10
  ##
11
11
  # :attr: description
12
12
  # The description of the scope.
@@ -4,35 +4,19 @@ module Jsapi
4
4
  module Meta
5
5
  module OpenAPI
6
6
  module Extensions
7
- ##
8
- # :attr: openapi_extensions
9
- # The \OpenAPI extensions.
10
-
11
- # Adds an \OpenAPI extension.
12
- #
13
- # Raises an +ArgumentError+ if +name+ is blank.
14
- def add_openapi_extension(name, value = nil)
15
- raise ArgumentError, "name can't be blank" if name.blank?
16
-
17
- openapi_extensions["x-#{name}".to_sym] = value
18
- end
19
-
20
- def openapi_extensions # :nodoc:
21
- @openapi_extensions ||= {}
22
- end
23
-
24
- def openapi_extensions=(extensions) # :nodoc:
25
- @openapi_extensions = {}
26
-
27
- extensions.each do |name, value|
28
- add_openapi_extension(name, value)
29
- end
7
+ def self.included(base) # :nodoc:
8
+ base.attribute :openapi_extensions, { String => String }
30
9
  end
31
10
 
32
11
  private
33
12
 
34
- def with_openapi_extensions(keywords = {}) # :nodoc:
35
- keywords.merge!(openapi_extensions)
13
+ def with_openapi_extensions(keywords = {})
14
+ keywords.merge!(
15
+ openapi_extensions.transform_keys do |key|
16
+ "x-#{key}".to_sym
17
+ end
18
+ ) if openapi_extensions.present?
19
+
36
20
  keywords.compact!
37
21
  keywords
38
22
  end
@@ -4,6 +4,8 @@ module Jsapi
4
4
  module Meta
5
5
  module OpenAPI
6
6
  class Version
7
+ include Comparable
8
+
7
9
  # Creates an \OpenAPI version from +version+.
8
10
  #
9
11
  # Raises an +ArgumentError+ if +version+ isn`t supported.
@@ -35,6 +37,15 @@ module Jsapi
35
37
  @minor == other.minor
36
38
  end
37
39
 
40
+ def <=>(other)
41
+ return unless other.is_a?(Version)
42
+
43
+ result = major <=> other.major
44
+ return result unless result.zero?
45
+
46
+ minor <=> other.minor
47
+ end
48
+
38
49
  def to_s # :nodoc:
39
50
  "#{major}.#{minor}"
40
51
  end
@@ -2,3 +2,13 @@
2
2
 
3
3
  require_relative 'openapi/extensions'
4
4
  require_relative 'openapi/version'
5
+
6
+ module Jsapi
7
+ module Meta
8
+ module OpenAPI
9
+ V2_0 = Version.new(2, 0)
10
+ V3_0 = Version.new(3, 0)
11
+ V3_1 = Version.new(3, 1)
12
+ end
13
+ end
14
+ end
@@ -3,7 +3,7 @@
3
3
  module Jsapi
4
4
  module Meta
5
5
  # Specifies an API operation.
6
- class Operation < Base::Model
6
+ class Operation < Model::Base
7
7
  include OpenAPI::Extensions
8
8
 
9
9
  ##
@@ -43,18 +43,18 @@ module Jsapi
43
43
 
44
44
  ##
45
45
  # :attr: model
46
- # The model class to access top-level parameters by. Model::Base by default.
47
- attribute :model, Class, default: Model::Base
46
+ # The model class to access top-level parameters by, Jsapi::Model::Base by default.
47
+ attribute :model, Class, default: Jsapi::Model::Base
48
48
 
49
49
  ##
50
50
  # :attr_reader: name
51
51
  # The name of the operation.
52
- attribute :name, read_only: true
52
+ attribute :name, accessors: %i[reader]
53
53
 
54
54
  ##
55
55
  # :attr: parameters
56
56
  # The parameters of the operation.
57
- attribute :parameters, { String => Parameter }
57
+ attribute :parameters, { String => Parameter }, accessors: %i[reader writer]
58
58
 
59
59
  ##
60
60
  # :attr: path
@@ -110,8 +110,6 @@ module Jsapi
110
110
  super(keywords)
111
111
  end
112
112
 
113
- undef add_parameter
114
-
115
113
  def add_parameter(name, keywords = {}) # :nodoc:
116
114
  (@parameters ||= {})[name.to_s] = Parameter.new(name, keywords)
117
115
  end
@@ -140,36 +138,36 @@ module Jsapi
140
138
  externalDocs: external_docs&.to_openapi,
141
139
  deprecated: deprecated?.presence,
142
140
  security: security_requirements.map(&:to_openapi).presence
143
- ).tap do |hash|
141
+ ).tap do |result|
144
142
  if version.major == 2
145
143
  if (consumes = consumes(definitions)).present?
146
- hash[:consumes] = [consumes]
144
+ result[:consumes] = [consumes]
147
145
  end
148
146
  if (produces = produces(definitions)).present?
149
- hash[:produces] = produces
147
+ result[:produces] = produces
150
148
  end
151
- hash[:schemes] = schemes if schemes.present?
149
+ result[:schemes] = schemes if schemes.present?
152
150
  elsif servers.present?
153
- hash[:servers] = servers.map(&:to_openapi)
151
+ result[:servers] = servers.map(&:to_openapi)
154
152
  end
155
153
  # Parameters (and request body)
156
- hash[:parameters] = parameters.values.flat_map do |parameter|
154
+ result[:parameters] = parameters.values.flat_map do |parameter|
157
155
  parameter.to_openapi_parameters(version, definitions)
158
156
  end
159
157
  if request_body
160
158
  if version.major == 2
161
- hash[:parameters] << request_body.resolve(definitions).to_openapi_parameter
159
+ result[:parameters] << request_body.resolve(definitions).to_openapi_parameter
162
160
  else
163
- hash[:request_body] = request_body.to_openapi(version)
161
+ result[:request_body] = request_body.to_openapi(version)
164
162
  end
165
163
  end
166
164
  # Responses
167
- hash[:responses] = responses.transform_values do |response|
165
+ result[:responses] = responses.transform_values do |response|
168
166
  response.to_openapi(version, definitions)
169
167
  end
170
168
  # Callbacks
171
169
  if callbacks.present? && version.major > 2
172
- hash[:callbacks] = callbacks.transform_values do |callback|
170
+ result[:callbacks] = callbacks.transform_values do |callback|
173
171
  callback.to_openapi(version, definitions)
174
172
  end
175
173
  end
@@ -4,9 +4,8 @@ module Jsapi
4
4
  module Meta
5
5
  module Parameter
6
6
  # Specifies a parameter.
7
- class Model < Base::Model
7
+ class Base < Model::Base
8
8
  include OpenAPI::Extensions
9
- include ToOpenAPI
10
9
 
11
10
  delegate_missing_to :schema
12
11
 
@@ -39,12 +38,12 @@ module Jsapi
39
38
  ##
40
39
  # :attr_reader: name
41
40
  # The name of the parameter.
42
- attribute :name, read_only: true
41
+ attribute :name, accessors: %i[reader]
43
42
 
44
43
  ##
45
44
  # :attr_reader: schema
46
45
  # The Schema of the parameter.
47
- attribute :schema, read_only: true
46
+ attribute :schema, accessors: %i[reader]
48
47
 
49
48
  # Creates a new parameter.
50
49
  #
@@ -63,25 +62,40 @@ module Jsapi
63
62
  @schema = Schema.new(keywords)
64
63
  end
65
64
 
66
- # Returns true if empty values are allowed as specified by \OpenAPI,
67
- # false otherwise.
65
+ # Returns true if empty values are allowed as specified by \OpenAPI, false otherwise.
68
66
  def allow_empty_value?
69
- schema.existence <= Existence::ALLOW_EMPTY && self.in != 'path'
67
+ schema.existence <= Existence::ALLOW_EMPTY && self.in == 'query'
70
68
  end
71
69
 
72
- # Returns true if it is required as specified by \JSON \Schema,
73
- # false otherwise.
70
+ # Returns true if it is required as specified by \JSON \Schema, false otherwise.
74
71
  def required?
75
72
  schema.existence > Existence::ALLOW_OMITTED || self.in == 'path'
76
73
  end
77
74
 
75
+ # Returns a hash representing the \OpenAPI parameter object.
76
+ def to_openapi(version, definitions)
77
+ version = OpenAPI::Version.from(version)
78
+ schema = self.schema.resolve(definitions)
79
+
80
+ openapi_parameter(
81
+ name,
82
+ schema,
83
+ version,
84
+ description: description,
85
+ required: required?,
86
+ deprecated: deprecated?,
87
+ allow_empty_value: allow_empty_value?,
88
+ examples: examples
89
+ )
90
+ end
91
+
78
92
  # Returns an array of hashes representing the \OpenAPI parameter objects.
79
93
  def to_openapi_parameters(version, definitions)
80
94
  version = OpenAPI::Version.from(version)
81
95
  schema = self.schema.resolve(definitions)
82
96
 
83
97
  if schema.object?
84
- explode_object_parameter(
98
+ explode_parameter(
85
99
  name,
86
100
  schema,
87
101
  version,
@@ -90,35 +104,16 @@ module Jsapi
90
104
  deprecated: deprecated?
91
105
  )
92
106
  else
93
- parameter_name = schema.array? ? "#{name}[]" : name
94
107
  [
95
- with_openapi_extensions(
96
- if version.major == 2
97
- {
98
- name: parameter_name,
99
- in: self.in,
100
- description: description,
101
- required: required?.presence,
102
- allowEmptyValue: allow_empty_value?.presence,
103
- collectionFormat: ('multi' if schema.array?)
104
- }.merge(schema.to_openapi(version))
105
- else
106
- {
107
- name: parameter_name,
108
- in: self.in,
109
- description: description,
110
- required: required?.presence,
111
- allowEmptyValue: allow_empty_value?.presence,
112
- deprecated: deprecated?.presence,
113
- schema: schema.to_openapi(version),
114
- examples: examples.transform_values(&:to_openapi).presence
115
-
116
- # NOTE: collectionFormat is replaced by style and explode.
117
- # The default values for query parameters are:
118
- # - style: 'form'
119
- # - explode: true
120
- }
121
- end
108
+ openapi_parameter(
109
+ name,
110
+ schema,
111
+ version,
112
+ description: description,
113
+ required: required?,
114
+ deprecated: deprecated?,
115
+ allow_empty_value: allow_empty_value?,
116
+ examples: examples
122
117
  )
123
118
  ]
124
119
  end
@@ -126,16 +121,15 @@ module Jsapi
126
121
 
127
122
  private
128
123
 
129
- def explode_object_parameter(name, schema, version, definitions, **options)
124
+ def explode_parameter(name, schema, version, definitions, required:, deprecated:)
130
125
  schema.resolve_properties(definitions, context: :request).values.flat_map do |property|
131
126
  property_schema = property.schema.resolve(definitions)
132
127
  parameter_name = "#{name}[#{property.name}]"
133
-
134
- required = (property.required? && options[:required]).presence
135
- deprecated = (property.deprecated? || options[:deprecated]).presence
128
+ required = (required && property.required?).presence
129
+ deprecated = (deprecated || property.deprecated?).presence
136
130
 
137
131
  if property_schema.object?
138
- explode_object_parameter(
132
+ explode_parameter(
139
133
  parameter_name,
140
134
  property_schema,
141
135
  version,
@@ -144,37 +138,60 @@ module Jsapi
144
138
  deprecated: deprecated
145
139
  )
146
140
  else
147
- parameter_name = "#{parameter_name}[]" if property_schema.array?
148
- description = property_schema.description
149
- allow_empty_value = property.schema.existence <= Existence::ALLOW_EMPTY
150
141
  [
151
- with_openapi_extensions(
152
- if version.major == 2
153
- {
154
- name: parameter_name,
155
- in: self.in,
156
- description: description,
157
- required: required,
158
- allowEmptyValue: allow_empty_value.presence,
159
- collectionFormat: ('multi' if property_schema.array?)
160
- }.merge(property_schema.to_openapi(version))
161
- else
162
- {
163
- name: parameter_name,
164
- in: self.in,
165
- description: description,
166
- required: required,
167
- allowEmptyValue: allow_empty_value.presence,
168
- deprecated: deprecated,
169
- schema: property_schema.to_openapi(version).except(:deprecated),
170
- examples: examples.transform_values(&:to_openapi).presence
171
- }
172
- end
142
+ openapi_parameter(
143
+ parameter_name,
144
+ property_schema,
145
+ version,
146
+ description: property_schema.description,
147
+ required: required,
148
+ deprecated: deprecated,
149
+ allow_empty_value: property.schema.existence <= Existence::ALLOW_EMPTY
173
150
  )
174
151
  ]
175
152
  end
176
153
  end
177
154
  end
155
+
156
+ def openapi_parameter(name, schema, version,
157
+ allow_empty_value:,
158
+ deprecated:,
159
+ description:,
160
+ required:,
161
+ examples: nil)
162
+
163
+ name = schema.array? ? "#{name}[]" : name
164
+
165
+ with_openapi_extensions(
166
+ if version.major == 2
167
+ raise "OpenAPI 2.0 doesn't allow object parameters " \
168
+ "in #{self.in}" if schema.object?
169
+
170
+ {
171
+ name: name,
172
+ in: self.in,
173
+ description: description,
174
+ required: required.presence,
175
+ allowEmptyValue: allow_empty_value.presence,
176
+ collectionFormat: ('multi' if schema.array?)
177
+ }.merge(schema.to_openapi(version))
178
+ else
179
+ {
180
+ name: name,
181
+ in: self.in,
182
+ description: description,
183
+ required: required.presence,
184
+ allowEmptyValue: allow_empty_value.presence,
185
+ deprecated: deprecated.presence,
186
+ schema: schema.to_openapi(version).except(:deprecated),
187
+ examples: examples&.transform_values(&:to_openapi).presence
188
+
189
+ # NOTE: collectionFormat is replaced by 'style' and 'explode'.
190
+ # The default values are equal to 'multi'.
191
+ }
192
+ end
193
+ )
194
+ end
178
195
  end
179
196
  end
180
197
  end
@@ -3,14 +3,9 @@
3
3
  module Jsapi
4
4
  module Meta
5
5
  module Parameter
6
- # Specifies a parameter reference.
7
- class Reference < Base::Reference
8
- include ToOpenAPI
9
-
10
- # Returns an array of hashes. If the type of the referred parameter is
11
- # <code>"object"</code>, each hash represents an \OpenAPI parameter object.
12
- # Otherwise the array contains a single hash representing the \OpenAPI
13
- # reference object.
6
+ # Refers a reusable parameter.
7
+ class Reference < Model::Reference
8
+ # Returns an array of hashes representing the \OpenAPI parameter or reference objects.
14
9
  #
15
10
  # Raises a ReferenceError when the reference could not be resolved.
16
11
  def to_openapi_parameters(version, definitions)
@@ -22,9 +17,7 @@ module Jsapi
22
17
  parameter.to_openapi_parameters(version, definitions)
23
18
  else
24
19
  # Return an array containing the reference object
25
- path = version.major == 2 ? 'parameters' : 'components/parameters'
26
-
27
- [{ '$ref': "#/#{path}/#{ref}" }]
20
+ [to_openapi(version)]
28
21
  end
29
22
  end
30
23
  end
@@ -1,18 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'parameter/to_openapi'
4
- require_relative 'parameter/model'
3
+ require_relative 'parameter/base'
5
4
  require_relative 'parameter/reference'
6
5
 
7
6
  module Jsapi
8
7
  module Meta
9
8
  module Parameter
10
9
  class << self
11
- # Creates a Model or Reference.
10
+ # Creates a Base or Reference.
12
11
  def new(name, keywords = {})
13
12
  return Reference.new(keywords) if keywords.key?(:ref)
14
13
 
15
- Model.new(name, keywords)
14
+ Base.new(name, keywords)
16
15
  end
17
16
  end
18
17
  end
@@ -3,13 +3,13 @@
3
3
  module Jsapi
4
4
  module Meta
5
5
  # Specifies a property
6
- class Property < Base::Model
6
+ class Property < Model::Base
7
7
  delegate_missing_to :schema
8
8
 
9
9
  ##
10
10
  # :attr_reader: name
11
11
  # The name of the property.
12
- attribute :name, read_only: true
12
+ attribute :name, accessors: %i[reader]
13
13
 
14
14
  ##
15
15
  # :attr: read_only
@@ -18,7 +18,7 @@ module Jsapi
18
18
  ##
19
19
  # :attr_reader: schema
20
20
  # The Schema of the parameter.
21
- attribute :schema, read_only: true
21
+ attribute :schema, accessors: %i[reader]
22
22
 
23
23
  ##
24
24
  # :attr: source
@@ -60,9 +60,9 @@ module Jsapi
60
60
  def to_openapi(version, *)
61
61
  version = OpenAPI::Version.from(version)
62
62
 
63
- schema.to_openapi(version).tap do |hash|
64
- hash[:readOnly] = true if read_only?
65
- hash[:writeOnly] = true if write_only? && version.major > 2
63
+ schema.to_openapi(version).tap do |result|
64
+ result[:readOnly] = true if read_only?
65
+ result[:writeOnly] = true if write_only? && version.major > 2
66
66
  end
67
67
  end
68
68
  end
@@ -4,7 +4,7 @@ module Jsapi
4
4
  module Meta
5
5
  module RequestBody
6
6
  # Specifies a request body.
7
- class Model < Base::Model
7
+ class Base < Model::Base
8
8
  include OpenAPI::Extensions
9
9
 
10
10
  delegate_missing_to :schema
@@ -27,7 +27,7 @@ module Jsapi
27
27
  ##
28
28
  # :attr_reader: schema
29
29
  # The Schema of the request body.
30
- attribute :schema, read_only: true
30
+ attribute :schema, accessors: %i[reader]
31
31
 
32
32
  def initialize(keywords = {})
33
33
  keywords = keywords.dup
@@ -47,12 +47,14 @@ module Jsapi
47
47
 
48
48
  # Returns a hash representing the \OpenAPI 2.0 parameter object.
49
49
  def to_openapi_parameter
50
- {
51
- name: 'body',
52
- in: 'body',
53
- description: description,
54
- required: required?
55
- }.merge(schema.to_openapi('2.0')).merge(openapi_extensions).compact
50
+ with_openapi_extensions(
51
+ {
52
+ name: 'body',
53
+ in: 'body',
54
+ description: description,
55
+ required: required?
56
+ }.merge(schema.to_openapi(OpenAPI::V2_0))
57
+ )
56
58
  end
57
59
 
58
60
  # Returns a hash representing the \OpenAPI 3.x request body object.
@@ -3,13 +3,8 @@
3
3
  module Jsapi
4
4
  module Meta
5
5
  module RequestBody
6
- # Specifies a request body reference.
7
- class Reference < Base::Reference
8
- # Returns a hash representing the \OpenAPI reference object.
9
- def to_openapi(*)
10
- { '$ref': "#/components/requestBodies/#{ref}" }
11
- end
12
- end
6
+ # Refers a reusable request body.
7
+ class Reference < Model::Reference; end
13
8
  end
14
9
  end
15
10
  end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'request_body/model'
3
+ require_relative 'request_body/base'
4
4
  require_relative 'request_body/reference'
5
5
 
6
6
  module Jsapi
7
7
  module Meta
8
8
  module RequestBody
9
9
  class << self
10
- # Creates a Model or Reference.
10
+ # Creates a Base or Reference.
11
11
  def new(keywords = {})
12
12
  return Reference.new(keywords) if keywords.key?(:ref)
13
13
 
14
- Model.new(keywords)
14
+ Base.new(keywords)
15
15
  end
16
16
  end
17
17
  end
@@ -3,7 +3,7 @@
3
3
  module Jsapi
4
4
  module Meta
5
5
  # Maps an error class to a response status.
6
- class RescueHandler < Base::Model
6
+ class RescueHandler < Model::Base
7
7
  ##
8
8
  # :attr: error_class
9
9
  # The error class to be mapped.
@@ -4,9 +4,11 @@ module Jsapi
4
4
  module Meta
5
5
  module Response
6
6
  # Specifies a response.
7
- class Model < Base::Model
7
+ class Base < Model::Base
8
8
  include OpenAPI::Extensions
9
9
 
10
+ JSON_TYPE = %r{(^application/|^text/|\+)json$}.freeze # :nodoc:
11
+
10
12
  delegate_missing_to :schema
11
13
 
12
14
  ##
@@ -42,7 +44,7 @@ module Jsapi
42
44
  ##
43
45
  # :attr_reader: schema
44
46
  # The Schema of the response.
45
- attribute :schema, read_only: true
47
+ attribute :schema, accessors: %i[reader]
46
48
 
47
49
  def initialize(keywords = {})
48
50
  keywords = keywords.dup
@@ -58,6 +60,12 @@ module Jsapi
58
60
  @schema = Schema.new(keywords)
59
61
  end
60
62
 
63
+ # Returns true if content type is a JSON MIME type as specified by
64
+ # https://mimesniff.spec.whatwg.org/#json-mime-type.
65
+ def json_type?
66
+ content_type.match?(JSON_TYPE)
67
+ end
68
+
61
69
  # Returns a hash representing the \OpenAPI response object.
62
70
  def to_openapi(version, definitions)
63
71
  version = OpenAPI::Version.from(version)
@@ -3,16 +3,8 @@
3
3
  module Jsapi
4
4
  module Meta
5
5
  module Response
6
- # Specifies a response reference.
7
- class Reference < Base::Reference
8
- # Returns a hash representing the \OpenAPI reference object.
9
- def to_openapi(version, *)
10
- version = OpenAPI::Version.from(version)
11
- path = version.major == 2 ? 'responses' : 'components/responses'
12
-
13
- { '$ref': "#/#{path}/#{ref}" }
14
- end
15
- end
6
+ # Refers a reusable response.
7
+ class Reference < Model::Reference; end
16
8
  end
17
9
  end
18
10
  end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'response/model'
3
+ require_relative 'response/base'
4
4
  require_relative 'response/reference'
5
5
 
6
6
  module Jsapi
7
7
  module Meta
8
8
  module Response
9
9
  class << self
10
- # Creates a Model or Reference.
10
+ # Creates a Base or Reference.
11
11
  def new(keywords = {})
12
12
  return Reference.new(keywords) if keywords.key?(:ref)
13
13
 
14
- Model.new(keywords)
14
+ Base.new(keywords)
15
15
  end
16
16
  end
17
17
  end