jsapi 0.8.0 → 0.9.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 (107) hide show
  1. checksums.yaml +4 -4
  2. data/lib/jsapi/configuration.rb +28 -0
  3. data/lib/jsapi/controller/methods.rb +1 -1
  4. data/lib/jsapi/dsl/base.rb +92 -0
  5. data/lib/jsapi/dsl/callback.rb +21 -0
  6. data/lib/jsapi/dsl/class_methods.rb +143 -16
  7. data/lib/jsapi/dsl/definitions.rb +173 -33
  8. data/lib/jsapi/dsl/examples.rb +30 -0
  9. data/lib/jsapi/dsl/operation.rb +60 -32
  10. data/lib/jsapi/dsl/parameter.rb +2 -2
  11. data/lib/jsapi/dsl/request_body.rb +2 -2
  12. data/lib/jsapi/dsl/response.rb +35 -11
  13. data/lib/jsapi/dsl/schema.rb +16 -16
  14. data/lib/jsapi/dsl.rb +4 -4
  15. data/lib/jsapi/meta/base/attributes.rb +21 -19
  16. data/lib/jsapi/meta/base/model.rb +15 -7
  17. data/lib/jsapi/meta/callback/model.rb +34 -0
  18. data/lib/jsapi/meta/callback/reference.rb +14 -0
  19. data/lib/jsapi/meta/callback.rb +19 -0
  20. data/lib/jsapi/meta/contact.rb +30 -0
  21. data/lib/jsapi/meta/defaults.rb +2 -2
  22. data/lib/jsapi/meta/definitions.rb +230 -124
  23. data/lib/jsapi/meta/example/model.rb +43 -0
  24. data/lib/jsapi/meta/example/reference.rb +14 -0
  25. data/lib/jsapi/meta/example.rb +19 -0
  26. data/lib/jsapi/meta/external_documentation.rb +25 -0
  27. data/lib/jsapi/meta/header/model.rb +81 -0
  28. data/lib/jsapi/meta/header/reference.rb +14 -0
  29. data/lib/jsapi/meta/header.rb +19 -0
  30. data/lib/jsapi/meta/info.rb +52 -0
  31. data/lib/jsapi/meta/license.rb +25 -0
  32. data/lib/jsapi/meta/link/model.rb +48 -0
  33. data/lib/jsapi/meta/link/reference.rb +14 -0
  34. data/lib/jsapi/meta/link.rb +19 -0
  35. data/lib/jsapi/meta/oauth_flow.rb +52 -0
  36. data/lib/jsapi/meta/openapi.rb +0 -28
  37. data/lib/jsapi/meta/operation.rb +19 -18
  38. data/lib/jsapi/meta/parameter/model.rb +6 -4
  39. data/lib/jsapi/meta/parameter/reference.rb +6 -4
  40. data/lib/jsapi/meta/parameter/to_openapi.rb +13 -0
  41. data/lib/jsapi/meta/parameter.rb +2 -1
  42. data/lib/jsapi/meta/property.rb +1 -1
  43. data/lib/jsapi/meta/request_body/model.rb +6 -5
  44. data/lib/jsapi/meta/request_body.rb +1 -1
  45. data/lib/jsapi/meta/response/model.rb +16 -13
  46. data/lib/jsapi/meta/response.rb +1 -1
  47. data/lib/jsapi/meta/schema/array.rb +1 -1
  48. data/lib/jsapi/meta/schema/base.rb +5 -5
  49. data/lib/jsapi/meta/schema/discriminator.rb +2 -2
  50. data/lib/jsapi/meta/schema/object.rb +3 -3
  51. data/lib/jsapi/meta/schema/reference.rb +1 -1
  52. data/lib/jsapi/meta/schema.rb +2 -2
  53. data/lib/jsapi/meta/security_requirement.rb +25 -0
  54. data/lib/jsapi/meta/security_scheme/api_key.rb +38 -0
  55. data/lib/jsapi/meta/security_scheme/base.rb +14 -0
  56. data/lib/jsapi/meta/security_scheme/http/basic.rb +34 -0
  57. data/lib/jsapi/meta/security_scheme/http/bearer.rb +36 -0
  58. data/lib/jsapi/meta/security_scheme/http/other.rb +36 -0
  59. data/lib/jsapi/meta/security_scheme/http.rb +29 -0
  60. data/lib/jsapi/meta/security_scheme/oauth2.rb +44 -0
  61. data/lib/jsapi/meta/security_scheme/open_id_connect.rb +32 -0
  62. data/lib/jsapi/meta/security_scheme.rb +49 -0
  63. data/lib/jsapi/meta/server.rb +34 -0
  64. data/lib/jsapi/meta/server_variable.rb +34 -0
  65. data/lib/jsapi/meta/tag.rb +34 -0
  66. data/lib/jsapi/meta.rb +15 -1
  67. data/lib/jsapi/model/base.rb +5 -5
  68. data/lib/jsapi/version.rb +1 -1
  69. data/lib/jsapi.rb +1 -1
  70. metadata +39 -42
  71. data/lib/jsapi/dsl/node.rb +0 -62
  72. data/lib/jsapi/dsl/openapi/callback.rb +0 -23
  73. data/lib/jsapi/dsl/openapi/callbacks.rb +0 -34
  74. data/lib/jsapi/dsl/openapi/examples.rb +0 -32
  75. data/lib/jsapi/dsl/openapi/root.rb +0 -126
  76. data/lib/jsapi/dsl/openapi.rb +0 -6
  77. data/lib/jsapi/meta/openapi/callback/model.rb +0 -34
  78. data/lib/jsapi/meta/openapi/callback/reference.rb +0 -16
  79. data/lib/jsapi/meta/openapi/callback.rb +0 -21
  80. data/lib/jsapi/meta/openapi/contact.rb +0 -32
  81. data/lib/jsapi/meta/openapi/example/model.rb +0 -44
  82. data/lib/jsapi/meta/openapi/example/reference.rb +0 -16
  83. data/lib/jsapi/meta/openapi/example.rb +0 -21
  84. data/lib/jsapi/meta/openapi/external_documentation.rb +0 -27
  85. data/lib/jsapi/meta/openapi/header/model.rb +0 -82
  86. data/lib/jsapi/meta/openapi/header/reference.rb +0 -16
  87. data/lib/jsapi/meta/openapi/header.rb +0 -21
  88. data/lib/jsapi/meta/openapi/info.rb +0 -54
  89. data/lib/jsapi/meta/openapi/license.rb +0 -27
  90. data/lib/jsapi/meta/openapi/link/model.rb +0 -50
  91. data/lib/jsapi/meta/openapi/link/reference.rb +0 -16
  92. data/lib/jsapi/meta/openapi/link.rb +0 -21
  93. data/lib/jsapi/meta/openapi/oauth_flow.rb +0 -52
  94. data/lib/jsapi/meta/openapi/root.rb +0 -132
  95. data/lib/jsapi/meta/openapi/security_requirement.rb +0 -27
  96. data/lib/jsapi/meta/openapi/security_scheme/api_key.rb +0 -40
  97. data/lib/jsapi/meta/openapi/security_scheme/base.rb +0 -16
  98. data/lib/jsapi/meta/openapi/security_scheme/http/basic.rb +0 -36
  99. data/lib/jsapi/meta/openapi/security_scheme/http/bearer.rb +0 -39
  100. data/lib/jsapi/meta/openapi/security_scheme/http/other.rb +0 -39
  101. data/lib/jsapi/meta/openapi/security_scheme/http.rb +0 -31
  102. data/lib/jsapi/meta/openapi/security_scheme/oauth2.rb +0 -46
  103. data/lib/jsapi/meta/openapi/security_scheme/open_id_connect.rb +0 -34
  104. data/lib/jsapi/meta/openapi/security_scheme.rb +0 -51
  105. data/lib/jsapi/meta/openapi/server.rb +0 -36
  106. data/lib/jsapi/meta/openapi/server_variable.rb +0 -36
  107. data/lib/jsapi/meta/openapi/tag.rb +0 -36
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module DSL
5
+ module Examples
6
+ # Specifies an example.
7
+ #
8
+ # example 'foo', value: 'bar'
9
+ #
10
+ # example 'foo'
11
+ #
12
+ # The default name is <code>'default'</code>.
13
+ def example(name_or_value = nil, **keywords, &block)
14
+ define('example', name_or_value&.inspect) do
15
+ if keywords.any? || block
16
+ # example 'foo', value: 'bar', ...
17
+ name = name_or_value
18
+ else
19
+ # example 'foo'
20
+ name = nil
21
+ keywords = { value: name_or_value }
22
+ end
23
+
24
+ example = @meta_model.add_example(name, keywords)
25
+ Base.new(example, &block) if block
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -2,9 +2,34 @@
2
2
 
3
3
  module Jsapi
4
4
  module DSL
5
- # Used to specify details of an operation.
6
- class Operation < Node
7
- include OpenAPI::Callbacks
5
+ # Used to define an API operation.
6
+ class Operation < Base
7
+
8
+ # Specifies a callback.
9
+ #
10
+ # callback 'foo' do
11
+ # operation '{$request.query.bar}'
12
+ # end
13
+ #
14
+ # Refers a resuable callback if the `:ref` keyword is specified.
15
+ #
16
+ # callback ref: 'foo'
17
+ #
18
+ # Refers the reusable callback object with the same name if neither any
19
+ # keywords nor a block is specified.
20
+ #
21
+ # callback 'foo'
22
+ #
23
+ # See Meta::Operation#callbacks for further information.
24
+ def callback(name = nil, **keywords, &block)
25
+ define('callback', name&.inspect) do
26
+ name = keywords[:ref] if name.nil?
27
+ keywords = { ref: name } unless keywords.any? || block
28
+
29
+ callback_model = @meta_model.add_callback(name, keywords)
30
+ Callback.new(callback_model, &block) if block
31
+ end
32
+ end
8
33
 
9
34
  ##
10
35
  # :method: deprecated
@@ -24,7 +49,7 @@ module Jsapi
24
49
  #
25
50
  # See Meta::Operation#method for further information.
26
51
  def method(arg)
27
- _keyword(:method, arg)
52
+ keyword(:method, arg)
28
53
  end
29
54
 
30
55
  # Defines the model class to access top-level parameters by.
@@ -35,41 +60,41 @@ module Jsapi
35
60
  # end
36
61
  # end
37
62
  #
38
- # +klass+ can be any subclass of Model::Base. If block is given, an anonymous class
39
- # is created that inherits either from +klass+ or Model::Base.
63
+ # +klass+ can be any subclass of Model::Base. If block is given, an anonymous
64
+ # class is created that inherits either from +klass+ or Model::Base.
40
65
  def model(klass = nil, &block)
41
66
  if block
42
67
  klass = Class.new(klass || Model::Base)
43
68
  klass.class_eval(&block)
44
69
  end
45
- _meta_model.model = klass
70
+ @meta_model.model = klass
46
71
  end
47
72
 
48
- # Adds a parameter or a reference to a reusable parameter.
73
+ # Specifies a parameter
49
74
  #
50
- # # define a parameter
51
75
  # parameter 'foo', type: 'string'
52
76
  #
53
- # # define a nested parameter
54
77
  # parameter 'foo', type: 'object' do
55
78
  # property 'bar', type: 'string'
56
79
  # end
57
80
  #
58
- # # refer a reusable parameter
81
+ # Refers a resuable parameter if the `:ref` keyword is specified.
82
+ #
59
83
  # parameter ref: 'foo'
60
84
  #
61
- # Refers the reusable parameter with the same name if neither any keywords nor a
62
- # block is specified.
85
+ # Refers the reusable parameter with the same name if neither any keywords
86
+ # nor a block is specified.
63
87
  #
64
88
  # parameter 'foo'
65
89
  #
90
+ # See Meta::Operation#parameters for further information.
66
91
  def parameter(name = nil, **keywords, &block)
67
- _define('parameter', name&.inspect) do
92
+ define('parameter', name&.inspect) do
68
93
  name = keywords[:ref] if name.nil?
69
94
  keywords = { ref: name } unless keywords.any? || block
70
95
 
71
- parameter_model = _meta_model.add_parameter(name, keywords)
72
- _eval(parameter_model, Parameter, &block)
96
+ parameter_model = @meta_model.add_parameter(name, keywords)
97
+ Parameter.new(parameter_model, &block) if block
73
98
  end
74
99
  end
75
100
 
@@ -78,14 +103,14 @@ module Jsapi
78
103
  # :args: arg
79
104
  # Specifies the relative path of the operation.
80
105
 
81
- # Defines the request body or refers a reusable request body.
106
+ # Specifies the request body.
82
107
  #
83
- # # define a request body
84
108
  # request_body type: 'object' do
85
109
  # property 'foo', type: 'string'
86
110
  # end
87
111
  #
88
- # # refer a reusable request body
112
+ # Refers a resuable request body if the `:ref` keyword is specified.
113
+ #
89
114
  # request_body ref: 'foo'
90
115
  #
91
116
  # Refers the reusable request body with the same name if neither any
@@ -93,34 +118,37 @@ module Jsapi
93
118
  #
94
119
  # request_body 'foo'
95
120
  #
121
+ # See Meta::Operation#request_body for further information.
96
122
  def request_body(**keywords, &block)
97
- _define('request body') do
98
- _meta_model.request_body = keywords
99
- _eval(_meta_model.request_body, RequestBody, &block)
123
+ define('request body') do
124
+ @meta_model.request_body = keywords
125
+ RequestBody.new(@meta_model.request_body, &block) if block
100
126
  end
101
127
  end
102
128
 
103
- # Adds a response or a reference to a reusable response.
129
+ # Specifies a response.
104
130
  #
105
- # # define a response
106
131
  # response 200, type: 'object' do
107
132
  # property 'foo', type: 'string'
108
133
  # end
109
134
  #
110
- # # refer a reusable response
111
- # response 200, ref: 'foo'
112
- #
113
135
  # The default status is <code>"default"</code>.
114
136
  #
137
+ # Refers a resuable response if the `:ref` keyword is specified.
138
+ #
139
+ # response 200, ref: 'foo'
140
+ #
115
141
  # Refers the reusable response with the same name if neither any keywords
116
142
  # nor a block is specified.
117
143
  #
118
144
  # response 'foo'
119
145
  #
120
146
  # Raises an Error if name is specified together with keywords or a block.
147
+ #
148
+ # See Meta::Operation#responses for further information.
121
149
  def response(status_or_name = nil, name = nil, **keywords, &block)
122
- _define('response', status_or_name&.inspect) do
123
- raise Error, 'name cannot be specified together with keywords ' \
150
+ define('response', status_or_name&.inspect) do
151
+ raise Error, "name can't be specified together with keywords " \
124
152
  'or a block' if name && (keywords.any? || block)
125
153
 
126
154
  if keywords.any? || block
@@ -129,8 +157,8 @@ module Jsapi
129
157
  status = status_or_name if name
130
158
  keywords = { ref: name || status_or_name }
131
159
  end
132
- response_model = _meta_model.add_response(status, keywords)
133
- _eval(response_model, Response, &block)
160
+ response_model = @meta_model.add_response(status, keywords)
161
+ Response.new(response_model, &block) if block
134
162
  end
135
163
  end
136
164
 
@@ -149,7 +177,7 @@ module Jsapi
149
177
  ##
150
178
  # :method: tags
151
179
  # :args: names
152
- # Specifies all of the tags at once.
180
+ # Specifies all tags at once.
153
181
  #
154
182
  # tags %w[foo bar]
155
183
  end
@@ -2,9 +2,9 @@
2
2
 
3
3
  module Jsapi
4
4
  module DSL
5
- # Used to specify details of a parameter.
5
+ # Used to define a parameter.
6
6
  class Parameter < Schema
7
- include OpenAPI::Examples
7
+ include Examples
8
8
 
9
9
  ##
10
10
  # :method: deprecated
@@ -2,9 +2,9 @@
2
2
 
3
3
  module Jsapi
4
4
  module DSL
5
- # Used to specify details of a request body.
5
+ # Used to define a request body.
6
6
  class RequestBody < Schema
7
- include OpenAPI::Examples
7
+ include Examples
8
8
 
9
9
  ##
10
10
  # :method: deprecated
@@ -2,9 +2,9 @@
2
2
 
3
3
  module Jsapi
4
4
  module DSL
5
- # Used to specify details of a response.
5
+ # Used to define a response.
6
6
  class Response < Schema
7
- include OpenAPI::Examples
7
+ include Examples
8
8
 
9
9
  ##
10
10
  # :method: deprecated
@@ -18,33 +18,57 @@ module Jsapi
18
18
  # :args: arg
19
19
  # Specifies the description of the response.
20
20
 
21
- # Defines a link or refers a reusable link object.
21
+ # Specifies an HTTP header of the response.
22
+ #
23
+ # header 'X-Foo', type: 'string'
24
+ #
25
+ # Refers a resuable header if the `:ref` keyword is specified.
26
+ #
27
+ # header ref: 'x_foo'
28
+ #
29
+ # Refers the reusable header with the same name if neither any keywords
30
+ # nor a block is specified.
31
+ #
32
+ # header 'x_foo'
33
+ #
34
+ # See Meta::Response::Model#headers for further information.
35
+ def header(name = nil, **keywords, &block)
36
+ define('header', name&.inspect) do
37
+ name = keywords[:ref] if name.nil?
38
+ keywords = { ref: name } unless keywords.any? || block
39
+
40
+ header_model = @meta_model.add_header(name, keywords)
41
+ Base.new(header_model, &block) if block
42
+ end
43
+ end
44
+
45
+ # Specifies a link.
22
46
  #
23
- # # define a link
24
47
  # link 'foo', operation_id: 'bar'
25
48
  #
26
- # # refer a reusable link
49
+ # Refers a reusable link if the `:ref` keyword is specified.
50
+ #
27
51
  # link ref: 'foo'
28
52
  #
29
- # Refers the reusable link object with the same name if neither any
30
- # keywords nor a block is specified.
53
+ # Refers the reusable link with the same name if neither any keywords
54
+ # nor a block is specified.
31
55
  #
32
56
  # link 'foo'
33
57
  #
34
58
  def link(name = nil, **keywords, &block)
35
- _define('link', name&.inspect) do
59
+ define('link', name&.inspect) do
36
60
  name = keywords[:ref] if name.nil?
37
61
  keywords = { ref: name } unless keywords.any? || block
38
62
 
39
- link_model = _meta_model.add_link(name, keywords)
40
- Node.new(link_model, &block) if block
63
+ link_model = @meta_model.add_link(name, keywords)
64
+ Base.new(link_model, &block) if block
41
65
  end
42
66
  end
43
67
 
44
68
  ##
45
69
  # :method: locale
46
70
  # :args: arg
47
- # Specifies the locale to be used when rendering a response.
71
+ # Specifies the locale to be used when producing a response.
48
72
  #
49
73
  # locale :en
50
74
  end
@@ -2,13 +2,13 @@
2
2
 
3
3
  module Jsapi
4
4
  module DSL
5
- # Used to specify details of a schema.
6
- class Schema < Node
5
+ # Used to define a schema.
6
+ class Schema < Base
7
7
 
8
8
  # Includes all of the properties from +schemas+. Each argument must be the name of
9
9
  # a schema defined by ClassMethods#api_schema or Definitions#schema.
10
10
  def all_of(*schemas)
11
- schemas.each { |schema| _meta_model.add_all_of({ ref: schema }) }
11
+ schemas.each { |schema| @meta_model.add_all_of({ ref: schema }) }
12
12
  end
13
13
 
14
14
  ##
@@ -57,7 +57,7 @@ module Jsapi
57
57
  #
58
58
  # example 'foo'
59
59
  def example(example)
60
- _meta_model.add_example(example)
60
+ @meta_model.add_example(example)
61
61
  end
62
62
 
63
63
  ##
@@ -77,7 +77,7 @@ module Jsapi
77
77
  #
78
78
  # See Meta::Schema::String#format for further information.
79
79
  def format(format)
80
- _keyword(:format, format)
80
+ keyword(:format, format)
81
81
  end
82
82
 
83
83
  # Defines the kind of items that can be contained in an array.
@@ -88,12 +88,12 @@ module Jsapi
88
88
  #
89
89
  # Raises an Error if type is other than <code>"array"</code>.
90
90
  def items(**keywords, &block)
91
- unless _meta_model.respond_to?(:items=)
92
- raise Error, "items isn't supported for '#{_meta_model.type}'"
91
+ unless @meta_model.respond_to?(:items=)
92
+ raise Error, "items isn't supported for '#{@meta_model.type}'"
93
93
  end
94
94
 
95
- _meta_model.items = keywords
96
- Schema.new(_meta_model.items, &block) if block
95
+ @meta_model.items = keywords
96
+ Schema.new(@meta_model.items, &block) if block
97
97
  end
98
98
 
99
99
  ##
@@ -159,15 +159,15 @@ module Jsapi
159
159
  #
160
160
  # Raises an Error if type is other than <code>"object"</code>.
161
161
  def model(klass = nil, &block)
162
- unless _meta_model.respond_to?(:model=)
163
- raise Error, "model isn't supported for '#{_meta_model.type}'"
162
+ unless @meta_model.respond_to?(:model=)
163
+ raise Error, "model isn't supported for '#{@meta_model.type}'"
164
164
  end
165
165
 
166
166
  if block
167
167
  klass = Class.new(klass || Model::Base)
168
168
  klass.class_eval(&block)
169
169
  end
170
- _meta_model.model = klass
170
+ @meta_model.model = klass
171
171
  end
172
172
 
173
173
  ##
@@ -194,12 +194,12 @@ module Jsapi
194
194
  #
195
195
  # Raises an Error if type is other than <code>"object"</code>.
196
196
  def property(name, **keywords, &block)
197
- _define('property', name.inspect) do
198
- unless _meta_model.respond_to?(:add_property)
199
- raise Error, "property isn't supported for '#{_meta_model.type}'"
197
+ define('property', name.inspect) do
198
+ unless @meta_model.respond_to?(:add_property)
199
+ raise Error, "property isn't supported for '#{@meta_model.type}'"
200
200
  end
201
201
 
202
- property_model = _meta_model.add_property(name, keywords)
202
+ property_model = @meta_model.add_property(name, keywords)
203
203
  Schema.new(property_model, &block) if block
204
204
  end
205
205
  end
data/lib/jsapi/dsl.rb CHANGED
@@ -1,19 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'dsl/error'
4
- require_relative 'dsl/node'
5
- require_relative 'dsl/openapi'
4
+ require_relative 'dsl/base'
5
+ require_relative 'dsl/examples'
6
6
  require_relative 'dsl/schema'
7
7
  require_relative 'dsl/parameter'
8
8
  require_relative 'dsl/request_body'
9
9
  require_relative 'dsl/response'
10
+ require_relative 'dsl/callback'
10
11
  require_relative 'dsl/operation'
11
12
  require_relative 'dsl/definitions'
12
13
  require_relative 'dsl/class_methods'
13
14
 
14
15
  module Jsapi
15
- # Provides class methods to define top-level API components.
16
- # See ClassMethods for details.
16
+ # The \DSL to define API components.
17
17
  module DSL
18
18
  def self.included(base) # :nodoc:
19
19
  base.extend(ClassMethods)
@@ -4,9 +4,11 @@ module Jsapi
4
4
  module Meta
5
5
  module Base
6
6
  module Attributes
7
+ DEFAULT_ARRAY = [].freeze
8
+ DEFAULT_HASH = {}.freeze
9
+
7
10
  # Defines an attribute.
8
11
  def attribute(name, type = Object,
9
- add_method: nil,
10
12
  default: nil,
11
13
  default_key: nil,
12
14
  keys: nil,
@@ -17,26 +19,20 @@ module Jsapi
17
19
 
18
20
  instance_variable_name = "@#{name}"
19
21
 
20
- # Attribute reader
21
- define_method(name) do
22
- value = instance_variable_get(instance_variable_name)
23
- value.nil? ? default : value
24
- end
25
-
26
22
  case type
27
23
  when Array
24
+ # General default
25
+ default ||= DEFAULT_ARRAY
26
+
28
27
  unless read_only
29
28
  singular_name = name.to_s.singularize
30
- add_method = "add_#{singular_name}" if add_method.nil?
29
+ add_method = "add_#{singular_name}"
31
30
 
32
31
  type_caster = TypeCaster.new(type.first, values: values, name: singular_name)
33
32
 
34
33
  # Attribute writer
35
34
  define_method("#{name}=") do |argument|
36
- if argument.nil?
37
- instance_variable_set(instance_variable_name, nil)
38
- else
39
- instance_variable_set(instance_variable_name, [])
35
+ instance_variable_set(instance_variable_name, []).tap do
40
36
  Array.wrap(argument).each { |element| send(add_method, element) }
41
37
  end
42
38
  end
@@ -59,24 +55,24 @@ module Jsapi
59
55
  key_type, value_type = type.first
60
56
  key_type_caster = TypeCaster.new(key_type, values: keys, name: 'key')
61
57
 
58
+ # General default
59
+ default ||= DEFAULT_HASH
60
+
62
61
  # Lookup method
63
62
  define_method(singular_name) do |key = nil|
64
63
  key = default_key if key.to_s.empty?
65
- send(name)&.[](key_type_caster.cast(key))
64
+ send(name)[key_type_caster.cast(key)]
66
65
  end
67
66
 
68
67
  unless read_only
69
- add_method = "add_#{singular_name}" if add_method.nil?
68
+ add_method = "add_#{singular_name}"
70
69
 
71
70
  value_type_caster = TypeCaster.new(value_type, values: values)
72
71
 
73
72
  # Attribute writer
74
73
  define_method("#{name}=") do |argument|
75
- if argument.nil?
76
- instance_variable_set(instance_variable_name, nil)
77
- else
78
- instance_variable_set(instance_variable_name, {})
79
- argument.each { |key, value| send(add_method, key, value) }
74
+ instance_variable_set(instance_variable_name, {}).tap do
75
+ Hash(argument).each { |key, value| send(add_method, key, value) }
80
76
  end
81
77
  end
82
78
 
@@ -123,6 +119,12 @@ module Jsapi
123
119
  end
124
120
  end
125
121
  end
122
+
123
+ # Attribute reader
124
+ define_method(name) do
125
+ value = instance_variable_get(instance_variable_name)
126
+ value.nil? ? default : value
127
+ end
126
128
  end
127
129
 
128
130
  def attribute_names
@@ -11,13 +11,7 @@ module Jsapi
11
11
  #
12
12
  # Raises an +ArgumentError+ if at least one keyword is not supported.
13
13
  def initialize(keywords = {})
14
- keywords.each do |key, value|
15
- if respond_to?(method = "#{key}=")
16
- public_send(method, value)
17
- else
18
- raise ArgumentError, "unsupported keyword: #{key}"
19
- end
20
- end
14
+ merge!(keywords)
21
15
  end
22
16
 
23
17
  def inspect(*attributes) # :nodoc:
@@ -30,6 +24,20 @@ module Jsapi
30
24
  }>"
31
25
  end
32
26
 
27
+ # Merges +keywords+ into the model.
28
+ #
29
+ # Raises an +ArgumentError+ if at least one keyword is not supported.
30
+ def merge!(keywords = {})
31
+ keywords.each do |key, value|
32
+ if respond_to?(method = "#{key}=")
33
+ public_send(method, value)
34
+ else
35
+ raise ArgumentError, "unsupported keyword: #{key}"
36
+ end
37
+ end
38
+ self
39
+ end
40
+
33
41
  # Returns false.
34
42
  def reference?
35
43
  false
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module Meta
5
+ class Operation < Base::Model; end
6
+
7
+ module Callback
8
+ # Specifies a callback object. Applies to \OpenAPI 3.0 and higher.
9
+ class Model < Base::Model
10
+ ##
11
+ # :attr: operations
12
+ attribute :operations, { String => Operation }
13
+
14
+ undef add_operation
15
+
16
+ # Adds a callback operation.
17
+ #
18
+ # Raises an +ArgumentError+ if +expression+ is blank.
19
+ def add_operation(expression, keywords = {})
20
+ raise ArgumentError, "expression can't be blank" if expression.blank?
21
+
22
+ (@operations ||= {})[expression.to_s] = Operation.new(nil, keywords)
23
+ end
24
+
25
+ # Returns a hash representing the \OpenAPI callback object.
26
+ def to_openapi(version, definitions)
27
+ operations.transform_values do |operation|
28
+ { operation.method => operation.to_openapi(version, definitions) }
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module Meta
5
+ module Callback
6
+ class Reference < Base::Reference
7
+ # Returns a hash representing the \OpenAPI reference object.
8
+ def to_openapi(*)
9
+ { '$ref': "#/components/callbacks/#{ref}" }
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'callback/model'
4
+ require_relative 'callback/reference'
5
+
6
+ module Jsapi
7
+ module Meta
8
+ module Callback
9
+ class << self
10
+ # Creates a Model or Reference.
11
+ def new(keywords = {})
12
+ return Reference.new(keywords) if keywords.key?(:ref)
13
+
14
+ Model.new(keywords)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jsapi
4
+ module Meta
5
+ # Specifies a contact object.
6
+ class Contact < Base::Model
7
+ include OpenAPI::Extensions
8
+
9
+ ##
10
+ # :attr: email
11
+ # The email address of the contact.
12
+ attribute :email, String
13
+
14
+ ##
15
+ # :attr: name
16
+ # The name of the contact.
17
+ attribute :name, String
18
+
19
+ ##
20
+ # :attr: url
21
+ # The URL of the contact.
22
+ attribute :url, String
23
+
24
+ # Returns a hash representing the \OpenAPI contact object.
25
+ def to_openapi(*)
26
+ with_openapi_extensions(name: name, url: url, email: email)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -5,12 +5,12 @@ module Jsapi
5
5
  # Holds the default values for a particular Schema type.
6
6
  class Defaults < Base::Model
7
7
  ##
8
- # :attr: read
8
+ # :attr: within_requests
9
9
  # The default value of parameters and properties when reading requests.
10
10
  attribute :within_requests
11
11
 
12
12
  ##
13
- # :attr: write
13
+ # :attr: within_responses
14
14
  # The default value of properties when writing responses.
15
15
  attribute :within_responses
16
16