rest_framework 1.0.0.beta1 → 1.0.0.beta2
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
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: acc3d4ff5a9d7669942f21eb7f3ecec06417c83322be936e1b862b1346e9bb14
|
4
|
+
data.tar.gz: 53ddfa6b5a46338b174ec67742d6019d5d005231eb492b0af30ed7232a2d22ce
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a93ccb739766ae11c9b0be6b52e60c698c72793cd109c1efbaf89eaac3f10b56a7bf11fd9e90b77ccc7c148aaa8436e51f73530f3ed3442f58ee93934fa37494
|
7
|
+
data.tar.gz: 616ebaac8b55a68a38fc8d29f6cedf764403990bc057bf9f6d8c92e672764a4f23189a3acca1e803b1d34df70731d28729744380cc90e9b7ec49f133c258d0de
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.0.
|
1
|
+
1.0.0.beta2
|
@@ -12,6 +12,7 @@ module RESTFramework::Mixins::BaseControllerMixin
|
|
12
12
|
description: nil,
|
13
13
|
version: nil,
|
14
14
|
inflect_acronyms: ["ID", "IDs", "REST", "API", "APIs"].freeze,
|
15
|
+
openapi_include_children: false,
|
15
16
|
|
16
17
|
# Options related to serialization.
|
17
18
|
rescue_unknown_format_with: :json,
|
@@ -69,6 +70,82 @@ module RESTFramework::Mixins::BaseControllerMixin
|
|
69
70
|
end
|
70
71
|
end
|
71
72
|
# :nocov:
|
73
|
+
|
74
|
+
def openapi_paths(routes, tag)
|
75
|
+
response_content_types = [
|
76
|
+
"text/html",
|
77
|
+
self.serialize_to_json ? "application/json" : nil,
|
78
|
+
self.serialize_to_xml ? "application/xml" : nil,
|
79
|
+
].compact
|
80
|
+
request_content_types = [
|
81
|
+
"application/json",
|
82
|
+
"application/xml",
|
83
|
+
"application/x-www-form-urlencoded",
|
84
|
+
"multipart/form-data",
|
85
|
+
]
|
86
|
+
|
87
|
+
return routes.group_by { |r| r[:concat_path] }.map { |concat_path, routes|
|
88
|
+
[
|
89
|
+
concat_path.gsub(/:([0-9A-Za-z_-]+)/, "{\\1}"),
|
90
|
+
routes.map { |route|
|
91
|
+
metadata = route[:route].defaults[:metadata] || {}
|
92
|
+
summary = metadata[:label].presence || self.label_for(route[:action])
|
93
|
+
description = metadata[:description].presence
|
94
|
+
remaining_metadata = metadata.except(:label, :description).presence
|
95
|
+
|
96
|
+
[
|
97
|
+
route[:verb].downcase,
|
98
|
+
{
|
99
|
+
tags: [tag],
|
100
|
+
summary: summary,
|
101
|
+
description: description,
|
102
|
+
responses: {
|
103
|
+
200 => {
|
104
|
+
content: response_content_types.map { |ct|
|
105
|
+
[ct, {}]
|
106
|
+
}.to_h,
|
107
|
+
description: "",
|
108
|
+
},
|
109
|
+
},
|
110
|
+
requestBody: route[:verb].in?(["GET", "DELETE", "OPTIONS", "TRACE"]) ? nil : {
|
111
|
+
content: request_content_types.map { |ct|
|
112
|
+
[ct, {}]
|
113
|
+
}.to_h,
|
114
|
+
},
|
115
|
+
"x-rrf-metadata": remaining_metadata,
|
116
|
+
}.compact,
|
117
|
+
]
|
118
|
+
}.to_h.merge(
|
119
|
+
{
|
120
|
+
parameters: routes.first[:route].required_parts.map { |p|
|
121
|
+
{
|
122
|
+
name: p,
|
123
|
+
in: "path",
|
124
|
+
required: true,
|
125
|
+
schema: {type: "integer"},
|
126
|
+
}
|
127
|
+
},
|
128
|
+
},
|
129
|
+
),
|
130
|
+
]
|
131
|
+
}.to_h
|
132
|
+
end
|
133
|
+
|
134
|
+
def openapi_document(request, route_group_name, routes)
|
135
|
+
server = request.base_url + request.original_fullpath.gsub(/\?.*/, "")
|
136
|
+
|
137
|
+
return {
|
138
|
+
openapi: "3.1.1",
|
139
|
+
info: {
|
140
|
+
title: self.get_title,
|
141
|
+
description: self.description,
|
142
|
+
version: self.version.to_s,
|
143
|
+
}.compact,
|
144
|
+
servers: [{url: server}],
|
145
|
+
paths: self.openapi_paths(routes, route_group_name),
|
146
|
+
tags: [{name: route_group_name, description: self.description}.compact],
|
147
|
+
}.compact
|
148
|
+
end
|
72
149
|
end
|
73
150
|
|
74
151
|
def self.included(base)
|
@@ -239,81 +316,36 @@ module RESTFramework::Mixins::BaseControllerMixin
|
|
239
316
|
end
|
240
317
|
end
|
241
318
|
|
242
|
-
#
|
319
|
+
# Compatibility alias for deprecated `api_response`.
|
243
320
|
alias_method :api_response, :render_api
|
244
321
|
|
245
|
-
def
|
246
|
-
|
247
|
-
|
248
|
-
self.class.serialize_to_json ? "application/json" : nil,
|
249
|
-
self.class.serialize_to_xml ? "application/xml" : nil,
|
250
|
-
].compact
|
251
|
-
request_content_types = [
|
252
|
-
"application/json",
|
253
|
-
"application/xml",
|
254
|
-
"application/x-www-form-urlencoded",
|
255
|
-
"multipart/form-data",
|
256
|
-
].compact
|
257
|
-
routes = self.route_groups.values[0]
|
258
|
-
server = request.base_url + request.original_fullpath.gsub(/\?.*/, "")
|
259
|
-
|
260
|
-
return {
|
261
|
-
openapi: "3.1.1",
|
262
|
-
info: {
|
263
|
-
title: self.class.get_title,
|
264
|
-
description: self.class.description,
|
265
|
-
version: self.class.version.to_s,
|
266
|
-
}.compact,
|
267
|
-
servers: [{url: server}],
|
268
|
-
paths: routes.group_by { |r| r[:concat_path] }.map { |concat_path, routes|
|
269
|
-
[
|
270
|
-
concat_path.gsub(/:([0-9A-Za-z_-]+)/, "{\\1}"),
|
271
|
-
routes.map { |route|
|
272
|
-
metadata = route[:route].defaults[:metadata] || {}
|
273
|
-
summary = metadata[:label].presence || self.class.label_for(route[:action])
|
274
|
-
description = metadata[:description].presence
|
275
|
-
remaining_metadata = metadata.except(:label, :description).presence
|
322
|
+
def openapi_document
|
323
|
+
first, *rest = self.route_groups.to_a
|
324
|
+
document = self.class.openapi_document(request, *first)
|
276
325
|
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
}.compact,
|
297
|
-
]
|
298
|
-
}.to_h.merge(
|
299
|
-
{
|
300
|
-
parameters: routes.first[:route].required_parts.map { |p|
|
301
|
-
{
|
302
|
-
name: p,
|
303
|
-
in: "path",
|
304
|
-
required: true,
|
305
|
-
schema: {type: "integer"},
|
306
|
-
}
|
307
|
-
},
|
308
|
-
},
|
309
|
-
),
|
310
|
-
]
|
311
|
-
}.to_h,
|
312
|
-
}.compact
|
326
|
+
if self.class.openapi_include_children
|
327
|
+
rest.each do |route_group_name, routes|
|
328
|
+
controller = "#{routes.first[:route].defaults[:controller]}_controller".camelize.constantize
|
329
|
+
child_document = controller.openapi_document(request, route_group_name, routes)
|
330
|
+
|
331
|
+
# Merge child paths and tags into the parent document.
|
332
|
+
document[:paths].merge!(child_document[:paths])
|
333
|
+
document[:tags] += child_document[:tags]
|
334
|
+
|
335
|
+
# If the child document has schemas, merge them into the parent document.
|
336
|
+
if schemas = child_document.dig(:components, :schemas) # rubocop:disable Style/Next
|
337
|
+
document[:components] ||= {}
|
338
|
+
document[:components][:schemas] ||= {}
|
339
|
+
document[:components][:schemas].merge!(schemas)
|
340
|
+
end
|
341
|
+
end
|
342
|
+
end
|
343
|
+
|
344
|
+
return document
|
313
345
|
end
|
314
346
|
|
315
347
|
def options
|
316
|
-
render_api(self.
|
348
|
+
render_api(self.openapi_document)
|
317
349
|
end
|
318
350
|
end
|
319
351
|
|
@@ -6,7 +6,7 @@ module RESTFramework::Mixins::BulkCreateModelMixin
|
|
6
6
|
# While bulk update/destroy are obvious because they create new router endpoints, bulk create
|
7
7
|
# overloads the existing collection `POST` endpoint, so we add a special key to the OpenAPI
|
8
8
|
# metadata to indicate bulk create is supported.
|
9
|
-
def
|
9
|
+
def openapi_document
|
10
10
|
return super.merge({"x-rrf-bulk-create": true})
|
11
11
|
end
|
12
12
|
|
@@ -339,6 +339,39 @@ module RESTFramework::Mixins::BaseModelControllerMixin
|
|
339
339
|
return @openapi_schema
|
340
340
|
end
|
341
341
|
|
342
|
+
def openapi_document(request, route_group_name, routes)
|
343
|
+
document = super
|
344
|
+
schema_name = routes[0][:controller].camelize.gsub("::", ".")
|
345
|
+
|
346
|
+
# Insert schema into the document.
|
347
|
+
document[:components] ||= {}
|
348
|
+
document[:components][:schemas] ||= {}
|
349
|
+
document[:components][:schemas][schema_name] = self.openapi_schema
|
350
|
+
|
351
|
+
# Reference schema for specific actions with a `requestBody`.
|
352
|
+
document[:paths].each do |_path, actions|
|
353
|
+
actions.each do |_method, action|
|
354
|
+
next unless action.is_a?(Hash)
|
355
|
+
|
356
|
+
injectables = [action.dig(:requestBody, :content), *action[:responses].values.map { |r|
|
357
|
+
r[:content]
|
358
|
+
}].compact
|
359
|
+
injectables.each do |i|
|
360
|
+
i.each do |_, v|
|
361
|
+
v[:schema] = {"$ref" => "#/components/schemas/#{schema_name}"}
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
return document.merge(
|
368
|
+
{
|
369
|
+
"x-rrf-primary_key" => self.get_model.primary_key,
|
370
|
+
"x-rrf-callbacks" => self._process_action_callbacks.as_json,
|
371
|
+
},
|
372
|
+
)
|
373
|
+
end
|
374
|
+
|
342
375
|
def setup_delegation
|
343
376
|
# Delegate extra actions.
|
344
377
|
self.extra_actions&.each do |action, config|
|
@@ -409,40 +442,6 @@ module RESTFramework::Mixins::BaseModelControllerMixin
|
|
409
442
|
return self.class.get_fields(input_fields: self.class.fields)
|
410
443
|
end
|
411
444
|
|
412
|
-
def openapi_metadata
|
413
|
-
data = super
|
414
|
-
routes = self.route_groups.values[0]
|
415
|
-
schema_name = routes[0][:controller].camelize.gsub("::", ".")
|
416
|
-
|
417
|
-
# Insert schema into metadata.
|
418
|
-
data[:components] ||= {}
|
419
|
-
data[:components][:schemas] ||= {}
|
420
|
-
data[:components][:schemas][schema_name] = self.class.openapi_schema
|
421
|
-
|
422
|
-
# Reference schema for specific actions with a `requestBody`.
|
423
|
-
data[:paths].each do |_path, actions|
|
424
|
-
actions.each do |_method, action|
|
425
|
-
next unless action.is_a?(Hash)
|
426
|
-
|
427
|
-
injectables = [action.dig(:requestBody, :content), *action[:responses].values.map { |r|
|
428
|
-
r[:content]
|
429
|
-
}].compact
|
430
|
-
injectables.each do |i|
|
431
|
-
i.each do |_, v|
|
432
|
-
v[:schema] = {"$ref" => "#/components/schemas/#{schema_name}"}
|
433
|
-
end
|
434
|
-
end
|
435
|
-
end
|
436
|
-
end
|
437
|
-
|
438
|
-
return data.merge(
|
439
|
-
{
|
440
|
-
"x-rrf-primary_key" => self.class.get_model.primary_key,
|
441
|
-
"x-rrf-callbacks" => self._process_action_callbacks.as_json,
|
442
|
-
},
|
443
|
-
)
|
444
|
-
end
|
445
|
-
|
446
445
|
# Get a hash of strong parameters for the current action.
|
447
446
|
def get_allowed_parameters
|
448
447
|
return @_get_allowed_parameters if defined?(@_get_allowed_parameters)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest_framework
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.
|
4
|
+
version: 1.0.0.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregory N. Schmit
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-12-
|
11
|
+
date: 2024-12-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|