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.
- checksums.yaml +4 -4
- data/lib/jsapi/configuration.rb +28 -0
- data/lib/jsapi/controller/methods.rb +1 -1
- data/lib/jsapi/dsl/base.rb +92 -0
- data/lib/jsapi/dsl/callback.rb +21 -0
- data/lib/jsapi/dsl/class_methods.rb +143 -16
- data/lib/jsapi/dsl/definitions.rb +173 -33
- data/lib/jsapi/dsl/examples.rb +30 -0
- data/lib/jsapi/dsl/operation.rb +60 -32
- data/lib/jsapi/dsl/parameter.rb +2 -2
- data/lib/jsapi/dsl/request_body.rb +2 -2
- data/lib/jsapi/dsl/response.rb +35 -11
- data/lib/jsapi/dsl/schema.rb +16 -16
- data/lib/jsapi/dsl.rb +4 -4
- data/lib/jsapi/meta/base/attributes.rb +21 -19
- data/lib/jsapi/meta/base/model.rb +15 -7
- data/lib/jsapi/meta/callback/model.rb +34 -0
- data/lib/jsapi/meta/callback/reference.rb +14 -0
- data/lib/jsapi/meta/callback.rb +19 -0
- data/lib/jsapi/meta/contact.rb +30 -0
- data/lib/jsapi/meta/defaults.rb +2 -2
- data/lib/jsapi/meta/definitions.rb +230 -124
- data/lib/jsapi/meta/example/model.rb +43 -0
- data/lib/jsapi/meta/example/reference.rb +14 -0
- data/lib/jsapi/meta/example.rb +19 -0
- data/lib/jsapi/meta/external_documentation.rb +25 -0
- data/lib/jsapi/meta/header/model.rb +81 -0
- data/lib/jsapi/meta/header/reference.rb +14 -0
- data/lib/jsapi/meta/header.rb +19 -0
- data/lib/jsapi/meta/info.rb +52 -0
- data/lib/jsapi/meta/license.rb +25 -0
- data/lib/jsapi/meta/link/model.rb +48 -0
- data/lib/jsapi/meta/link/reference.rb +14 -0
- data/lib/jsapi/meta/link.rb +19 -0
- data/lib/jsapi/meta/oauth_flow.rb +52 -0
- data/lib/jsapi/meta/openapi.rb +0 -28
- data/lib/jsapi/meta/operation.rb +19 -18
- data/lib/jsapi/meta/parameter/model.rb +6 -4
- data/lib/jsapi/meta/parameter/reference.rb +6 -4
- data/lib/jsapi/meta/parameter/to_openapi.rb +13 -0
- data/lib/jsapi/meta/parameter.rb +2 -1
- data/lib/jsapi/meta/property.rb +1 -1
- data/lib/jsapi/meta/request_body/model.rb +6 -5
- data/lib/jsapi/meta/request_body.rb +1 -1
- data/lib/jsapi/meta/response/model.rb +16 -13
- data/lib/jsapi/meta/response.rb +1 -1
- data/lib/jsapi/meta/schema/array.rb +1 -1
- data/lib/jsapi/meta/schema/base.rb +5 -5
- data/lib/jsapi/meta/schema/discriminator.rb +2 -2
- data/lib/jsapi/meta/schema/object.rb +3 -3
- data/lib/jsapi/meta/schema/reference.rb +1 -1
- data/lib/jsapi/meta/schema.rb +2 -2
- data/lib/jsapi/meta/security_requirement.rb +25 -0
- data/lib/jsapi/meta/security_scheme/api_key.rb +38 -0
- data/lib/jsapi/meta/security_scheme/base.rb +14 -0
- data/lib/jsapi/meta/security_scheme/http/basic.rb +34 -0
- data/lib/jsapi/meta/security_scheme/http/bearer.rb +36 -0
- data/lib/jsapi/meta/security_scheme/http/other.rb +36 -0
- data/lib/jsapi/meta/security_scheme/http.rb +29 -0
- data/lib/jsapi/meta/security_scheme/oauth2.rb +44 -0
- data/lib/jsapi/meta/security_scheme/open_id_connect.rb +32 -0
- data/lib/jsapi/meta/security_scheme.rb +49 -0
- data/lib/jsapi/meta/server.rb +34 -0
- data/lib/jsapi/meta/server_variable.rb +34 -0
- data/lib/jsapi/meta/tag.rb +34 -0
- data/lib/jsapi/meta.rb +15 -1
- data/lib/jsapi/model/base.rb +5 -5
- data/lib/jsapi/version.rb +1 -1
- data/lib/jsapi.rb +1 -1
- metadata +39 -42
- data/lib/jsapi/dsl/node.rb +0 -62
- data/lib/jsapi/dsl/openapi/callback.rb +0 -23
- data/lib/jsapi/dsl/openapi/callbacks.rb +0 -34
- data/lib/jsapi/dsl/openapi/examples.rb +0 -32
- data/lib/jsapi/dsl/openapi/root.rb +0 -126
- data/lib/jsapi/dsl/openapi.rb +0 -6
- data/lib/jsapi/meta/openapi/callback/model.rb +0 -34
- data/lib/jsapi/meta/openapi/callback/reference.rb +0 -16
- data/lib/jsapi/meta/openapi/callback.rb +0 -21
- data/lib/jsapi/meta/openapi/contact.rb +0 -32
- data/lib/jsapi/meta/openapi/example/model.rb +0 -44
- data/lib/jsapi/meta/openapi/example/reference.rb +0 -16
- data/lib/jsapi/meta/openapi/example.rb +0 -21
- data/lib/jsapi/meta/openapi/external_documentation.rb +0 -27
- data/lib/jsapi/meta/openapi/header/model.rb +0 -82
- data/lib/jsapi/meta/openapi/header/reference.rb +0 -16
- data/lib/jsapi/meta/openapi/header.rb +0 -21
- data/lib/jsapi/meta/openapi/info.rb +0 -54
- data/lib/jsapi/meta/openapi/license.rb +0 -27
- data/lib/jsapi/meta/openapi/link/model.rb +0 -50
- data/lib/jsapi/meta/openapi/link/reference.rb +0 -16
- data/lib/jsapi/meta/openapi/link.rb +0 -21
- data/lib/jsapi/meta/openapi/oauth_flow.rb +0 -52
- data/lib/jsapi/meta/openapi/root.rb +0 -132
- data/lib/jsapi/meta/openapi/security_requirement.rb +0 -27
- data/lib/jsapi/meta/openapi/security_scheme/api_key.rb +0 -40
- data/lib/jsapi/meta/openapi/security_scheme/base.rb +0 -16
- data/lib/jsapi/meta/openapi/security_scheme/http/basic.rb +0 -36
- data/lib/jsapi/meta/openapi/security_scheme/http/bearer.rb +0 -39
- data/lib/jsapi/meta/openapi/security_scheme/http/other.rb +0 -39
- data/lib/jsapi/meta/openapi/security_scheme/http.rb +0 -31
- data/lib/jsapi/meta/openapi/security_scheme/oauth2.rb +0 -46
- data/lib/jsapi/meta/openapi/security_scheme/open_id_connect.rb +0 -34
- data/lib/jsapi/meta/openapi/security_scheme.rb +0 -51
- data/lib/jsapi/meta/openapi/server.rb +0 -36
- data/lib/jsapi/meta/openapi/server_variable.rb +0 -36
- 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
|
data/lib/jsapi/dsl/operation.rb
CHANGED
@@ -2,9 +2,34 @@
|
|
2
2
|
|
3
3
|
module Jsapi
|
4
4
|
module DSL
|
5
|
-
# Used to
|
6
|
-
class Operation <
|
7
|
-
|
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
|
-
|
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
|
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
|
-
|
70
|
+
@meta_model.model = klass
|
46
71
|
end
|
47
72
|
|
48
|
-
#
|
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
|
-
#
|
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
|
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
|
-
|
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 =
|
72
|
-
|
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
|
-
#
|
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
|
-
#
|
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
|
-
|
98
|
-
|
99
|
-
|
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
|
-
#
|
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
|
-
|
123
|
-
raise Error,
|
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 =
|
133
|
-
|
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
|
180
|
+
# Specifies all tags at once.
|
153
181
|
#
|
154
182
|
# tags %w[foo bar]
|
155
183
|
end
|
data/lib/jsapi/dsl/parameter.rb
CHANGED
data/lib/jsapi/dsl/response.rb
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
module Jsapi
|
4
4
|
module DSL
|
5
|
-
# Used to
|
5
|
+
# Used to define a response.
|
6
6
|
class Response < Schema
|
7
|
-
include
|
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
|
-
#
|
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
|
-
#
|
49
|
+
# Refers a reusable link if the `:ref` keyword is specified.
|
50
|
+
#
|
27
51
|
# link ref: 'foo'
|
28
52
|
#
|
29
|
-
# Refers the reusable link
|
30
|
-
#
|
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
|
-
|
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 =
|
40
|
-
|
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
|
71
|
+
# Specifies the locale to be used when producing a response.
|
48
72
|
#
|
49
73
|
# locale :en
|
50
74
|
end
|
data/lib/jsapi/dsl/schema.rb
CHANGED
@@ -2,13 +2,13 @@
|
|
2
2
|
|
3
3
|
module Jsapi
|
4
4
|
module DSL
|
5
|
-
# Used to
|
6
|
-
class Schema <
|
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|
|
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
|
-
|
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
|
-
|
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
|
92
|
-
raise Error, "items isn't supported for '#{
|
91
|
+
unless @meta_model.respond_to?(:items=)
|
92
|
+
raise Error, "items isn't supported for '#{@meta_model.type}'"
|
93
93
|
end
|
94
94
|
|
95
|
-
|
96
|
-
Schema.new(
|
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
|
163
|
-
raise Error, "model isn't supported for '#{
|
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
|
-
|
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
|
-
|
198
|
-
unless
|
199
|
-
raise Error, "property isn't supported for '#{
|
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 =
|
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/
|
5
|
-
require_relative 'dsl/
|
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
|
-
#
|
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}"
|
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
|
-
|
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)
|
64
|
+
send(name)[key_type_caster.cast(key)]
|
66
65
|
end
|
67
66
|
|
68
67
|
unless read_only
|
69
|
-
add_method = "add_#{singular_name}"
|
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
|
-
|
76
|
-
|
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
|
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
|
data/lib/jsapi/meta/defaults.rb
CHANGED
@@ -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:
|
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:
|
13
|
+
# :attr: within_responses
|
14
14
|
# The default value of properties when writing responses.
|
15
15
|
attribute :within_responses
|
16
16
|
|