graphiti-openapi 0.1.5 → 0.1.6
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/app/models/graphiti/open_api/endpoint.rb +1 -5
- data/app/models/graphiti/open_api/generator.rb +2 -1
- data/app/models/graphiti/open_api/resource.rb +43 -23
- data/config/openapi.yml +196 -2
- data/config/routes.rb +1 -1
- data/graphiti-openapi.gemspec +1 -1
- data/lib/graphiti/open_api/version.rb +1 -1
- data/lib/tasks/graphiti_openapi.rake +1 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2070008985f65464531c93f438aaa275db413c0d1daf0b933f6b86296063384a
|
4
|
+
data.tar.gz: 115f94a0a40844d56d46737be9e63880c81fe40e4273ec7df0aaeeceb0bbe4c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 58105cea097503a9ae1ba7669771a21f414c32bebbb0870bd17f824092349c5f88f19018cf0c9d305d8e2e303f2fe9f617e3a81044b59b731e26557b08cf007c
|
7
|
+
data.tar.gz: 0cf2572e4a4ba8e6600beac1271650fcca1897439e1a2e60d2a15161ca27941201c334bb5ecbd0b3a002fe38f73d267e7b596cf59a1a2c7496b564d0e4100399
|
@@ -17,10 +17,6 @@ module Graphiti::OpenAPI
|
|
17
17
|
attribute :schema, Types::Any
|
18
18
|
attribute :path, Types::Coercible::String
|
19
19
|
|
20
|
-
def path
|
21
|
-
__attributes__[:path].gsub(/^#{Regexp.escape(ApplicationResource.endpoint_namespace)}/, '')
|
22
|
-
end
|
23
|
-
|
24
20
|
def resource_path
|
25
21
|
File.join(path.to_s, "{id}")
|
26
22
|
end
|
@@ -63,7 +59,7 @@ module Graphiti::OpenAPI
|
|
63
59
|
actions.select(&:collection?)
|
64
60
|
end
|
65
61
|
|
66
|
-
memoize :
|
62
|
+
memoize :resource_path, :paths, :parameters, :resource, :resource_actions, :collection_actions
|
67
63
|
end
|
68
64
|
|
69
65
|
class Endpoints < Hash
|
@@ -77,7 +77,7 @@ module Graphiti::OpenAPI
|
|
77
77
|
private
|
78
78
|
|
79
79
|
def servers
|
80
|
-
[{url:
|
80
|
+
[{url: root_url, description: "#{Rails.env} server"}]
|
81
81
|
end
|
82
82
|
|
83
83
|
def root_url
|
@@ -160,6 +160,7 @@ module Graphiti::OpenAPI
|
|
160
160
|
|
161
161
|
# Use real resources in examples
|
162
162
|
defs[:resource] = {
|
163
|
+
type: :object,
|
163
164
|
oneOf: resources.values.map { |resource| {'$ref': "#/components/schemas/#{resource.type}_resource"} },
|
164
165
|
}
|
165
166
|
|
@@ -174,30 +174,50 @@ module Graphiti::OpenAPI
|
|
174
174
|
{
|
175
175
|
"#{type}_single" => {
|
176
176
|
type: :object,
|
177
|
-
|
178
|
-
{'$ref': "#/components/schemas
|
179
|
-
{
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
177
|
+
properties: {
|
178
|
+
data: {'$ref': "#/components/schemas/#{type}_resource"},
|
179
|
+
included: {
|
180
|
+
description: "To reduce the number of HTTP requests, servers **MAY** allow responses that include related resources along with the requested primary resources. Such responses are called \"compound documents\".",
|
181
|
+
type: "array",
|
182
|
+
items: {'$ref': "#/components/schemas/jsonapi_resource"},
|
183
|
+
uniqueItems: true
|
184
184
|
},
|
185
|
-
|
185
|
+
meta: {'$ref': "#/components/schemas/jsonapi_meta"},
|
186
|
+
links: {
|
187
|
+
description: "Link members related to the primary data.",
|
188
|
+
allOf: [
|
189
|
+
{"$ref": "#/components/schemas/jsonapi_links"},
|
190
|
+
{"$ref": "#/components/schemas/jsonapi_pagination"},
|
191
|
+
]
|
192
|
+
},
|
193
|
+
"jsonapi": {"$ref": "#/components/schemas/jsonapi_jsonapi"},
|
194
|
+
},
|
195
|
+
additionalProperties: false
|
186
196
|
},
|
187
197
|
"#{type}_collection" => {
|
188
198
|
type: :object,
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
+
properties: {
|
200
|
+
data: {
|
201
|
+
type: "array",
|
202
|
+
items: {'$ref': "#/components/schemas/#{type}_resource"},
|
203
|
+
},
|
204
|
+
included: {
|
205
|
+
description: "To reduce the number of HTTP requests, servers **MAY** allow responses that include related resources along with the requested primary resources. Such responses are called \"compound documents\".",
|
206
|
+
type: "array",
|
207
|
+
items: {'$ref': "#/components/schemas/jsonapi_resource"},
|
208
|
+
uniqueItems: true
|
199
209
|
},
|
200
|
-
|
210
|
+
meta: {'$ref': "#/components/schemas/jsonapi_meta"},
|
211
|
+
links: {
|
212
|
+
description: "Link members related to the primary data.",
|
213
|
+
allOf: [
|
214
|
+
{"$ref": "#/components/schemas/jsonapi_links"},
|
215
|
+
{"$ref": "#/components/schemas/jsonapi_pagination"},
|
216
|
+
]
|
217
|
+
},
|
218
|
+
"jsonapi": {"$ref": "#/components/schemas/jsonapi_jsonapi"},
|
219
|
+
},
|
220
|
+
additionalProperties: false
|
201
221
|
},
|
202
222
|
}
|
203
223
|
end
|
@@ -209,7 +229,7 @@ module Graphiti::OpenAPI
|
|
209
229
|
properties: {
|
210
230
|
data: {'$ref': "#/components/schemas/#{type}_resource"},
|
211
231
|
},
|
212
|
-
|
232
|
+
# xml: {name: :data},
|
213
233
|
},
|
214
234
|
}
|
215
235
|
end
|
@@ -252,7 +272,7 @@ module Graphiti::OpenAPI
|
|
252
272
|
description: "OK: #{human} resource",
|
253
273
|
content: {
|
254
274
|
"application/vnd.api+json" => {schema: {"$ref": "#/components/schemas/#{type}_single"}},
|
255
|
-
|
275
|
+
# "application/xml" => {schema: {"$ref": "#/components/schemas/#{type}_single"}},
|
256
276
|
},
|
257
277
|
links: link_refs,
|
258
278
|
},
|
@@ -260,14 +280,14 @@ module Graphiti::OpenAPI
|
|
260
280
|
description: "OK: #{plural_human} collection",
|
261
281
|
content: {
|
262
282
|
"application/vnd.api+json" => {schema: {"$ref": "#/components/schemas/#{type}_collection"}},
|
263
|
-
|
283
|
+
# "application/xml" => {schema: {"$ref": "#/components/schemas/#{type}_collection"}},
|
264
284
|
},
|
265
285
|
},
|
266
286
|
"#{type}_201" => {
|
267
287
|
description: "Created",
|
268
288
|
content: {
|
269
289
|
"application/vnd.api+json" => {schema: {"$ref": "#/components/schemas/#{type}_single"}},
|
270
|
-
|
290
|
+
# "application/xml" => {schema: {"$ref": "#/components/schemas/#{type}_single"}},
|
271
291
|
},
|
272
292
|
links: link_refs,
|
273
293
|
},
|
data/config/openapi.yml
CHANGED
@@ -9,13 +9,42 @@ info:
|
|
9
9
|
name: Developer Example
|
10
10
|
# url: 'https://developer.example.test/'
|
11
11
|
security:
|
12
|
-
-
|
12
|
+
- Basic: []
|
13
|
+
- BearerJWT: []
|
14
|
+
- OAuth2:
|
15
|
+
- manage
|
16
|
+
- read
|
17
|
+
write
|
18
|
+
- read
|
19
|
+
create
|
20
|
+
update
|
21
|
+
delete
|
13
22
|
components:
|
14
23
|
securitySchemes:
|
15
|
-
|
24
|
+
Basic:
|
25
|
+
type: http
|
26
|
+
scheme: basic
|
27
|
+
BearerJWT:
|
16
28
|
type: http
|
17
29
|
scheme: bearer
|
18
30
|
bearerFormat: JWT
|
31
|
+
OAuth2:
|
32
|
+
type: oauth2
|
33
|
+
description: |
|
34
|
+
[OAuth 2.0 protocol](http://oauth.net/2/)
|
35
|
+
See /oauth/requests
|
36
|
+
flows:
|
37
|
+
password:
|
38
|
+
tokenUrl: /oauth/token
|
39
|
+
scopes:
|
40
|
+
public: Grant read-only access to all public data
|
41
|
+
read: Grant read-only access to all your data
|
42
|
+
write: Grant write-only access to all your data except for the account and user info
|
43
|
+
create: Grant write-only access to create anything
|
44
|
+
update: Grant write-only access to update all your data
|
45
|
+
delete: Grant write-only access to delete any of your data
|
46
|
+
manage: Grant read and write access to all your data
|
47
|
+
profile: Grant read-only access to the account and user info only
|
19
48
|
responses:
|
20
49
|
'200':
|
21
50
|
description: OK
|
@@ -63,4 +92,169 @@ components:
|
|
63
92
|
application/vnd.api+json:
|
64
93
|
schema:
|
65
94
|
$ref: '#/components/schemas/jsonapi_failure'
|
95
|
+
schemas:
|
96
|
+
OAuth2Scope:
|
97
|
+
type: string
|
98
|
+
enum: [public, read, write, create, update, delete, manage]
|
99
|
+
default: public
|
100
|
+
OAuth2Scopes:
|
101
|
+
type: array
|
102
|
+
items:
|
103
|
+
$ref: "#/components/schemas/OAuth2Scope"
|
104
|
+
default: [public]
|
105
|
+
OAuth2GrantType:
|
106
|
+
type: string
|
107
|
+
enum: [password, authorization_code]
|
108
|
+
OAuth2TokenRequest:
|
109
|
+
type: object
|
110
|
+
required:
|
111
|
+
- grant_type
|
112
|
+
properties:
|
113
|
+
grant_type:
|
114
|
+
$ref: "#/components/schemas/OAuth2GrantType"
|
115
|
+
scope:
|
116
|
+
$ref: "#/components/schemas/OAuth2Scopes"
|
117
|
+
username:
|
118
|
+
description: (when `grant_type="password"`)
|
119
|
+
type: string
|
120
|
+
format: email
|
121
|
+
password:
|
122
|
+
description: (when `grant_type="password"`)
|
123
|
+
type: string
|
124
|
+
format: password
|
125
|
+
client_id:
|
126
|
+
description: (when `grant_type="authorization_code"`)
|
127
|
+
type: string
|
128
|
+
client_secret:
|
129
|
+
description: (when `grant_type="authorization_code"`)
|
130
|
+
type: string
|
131
|
+
code:
|
132
|
+
description: (when `grant_type="authorization_code"`)
|
133
|
+
type: string
|
134
|
+
redirect_uri:
|
135
|
+
description: (when `grant_type="authorization_code"`)
|
136
|
+
type: string
|
137
|
+
format: uri
|
138
|
+
default: "urn:ietf:wg:oauth:2.0:oob"
|
139
|
+
additionalProperties: false
|
140
|
+
OAuth2Response:
|
141
|
+
type: object
|
142
|
+
properties:
|
143
|
+
access_token:
|
144
|
+
type: string
|
145
|
+
example: "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjEsImlhdCI6MTU0ODU1OTMwNiwianRpIjoiZTc4MWZlYjUtNWYxNi00YzRlLWFjOWMtOTBlYTA2YWMwZWVjIiwiaW5mIjp7ImVtYWlsIjoiYWxleEBjZXJlYmVsby5zcGFjZSJ9fQ."
|
146
|
+
created_at:
|
147
|
+
type: integer
|
148
|
+
example: 1548559306
|
149
|
+
expires_in:
|
150
|
+
type: integer
|
151
|
+
example: 7200
|
152
|
+
scope:
|
153
|
+
type: string
|
154
|
+
example: "manage"
|
155
|
+
token_type:
|
156
|
+
type: string
|
157
|
+
enum: [Bearer]
|
158
|
+
|
159
|
+
examples:
|
160
|
+
OAuth2AuthorizationCodeRequest:
|
161
|
+
summary: Authorization Code Flow Request Body
|
162
|
+
value:
|
163
|
+
grant_type: authorization_code
|
164
|
+
code: "eyJhbGciOiJIUzUxMiJ9"
|
165
|
+
client_id: "123"
|
166
|
+
client_secret: "very-secret"
|
167
|
+
redirect_uri: "https://example.test/oauth/redirect"
|
168
|
+
OAuth2PasswordRequest:
|
169
|
+
summary: Resource Owner Password Credentials Flow Request Body
|
170
|
+
value:
|
171
|
+
grant_type: password
|
172
|
+
username: user@example.test
|
173
|
+
password: password
|
174
|
+
invalid_request:
|
175
|
+
summary: Missing required parameter
|
176
|
+
value:
|
177
|
+
error: invalid_request
|
178
|
+
error_description: The request is missing a required parameter, includes an unsupported parameter value, or is otherwise malformed.
|
179
|
+
authentication:
|
180
|
+
summary: Invalid credentials
|
181
|
+
value:
|
182
|
+
error: Invalid Email or password.
|
183
|
+
|
184
|
+
requestBodies:
|
185
|
+
OAuth2Request:
|
186
|
+
required: true
|
187
|
+
content:
|
188
|
+
application/x-www-form-urlencoded:
|
189
|
+
schema:
|
190
|
+
$ref: "#/components/schemas/OAuth2TokenRequest"
|
191
|
+
encoding:
|
192
|
+
scope:
|
193
|
+
style: spaceDelimited
|
194
|
+
explode: false
|
195
|
+
examples:
|
196
|
+
OAuth2AuthorizationCodeRequest:
|
197
|
+
$ref: "#/components/examples/OAuth2AuthorizationCodeRequest"
|
198
|
+
OAuth2PasswordRequest:
|
199
|
+
$ref: "#/components/examples/OAuth2PasswordRequest"
|
200
|
+
|
66
201
|
paths:
|
202
|
+
/oauth/token:
|
203
|
+
post:
|
204
|
+
operationId: getOAuth2Token
|
205
|
+
tags:
|
206
|
+
- OAuth2.0
|
207
|
+
description: REtrieve OAuth 2.0 AccessToken
|
208
|
+
requestBody:
|
209
|
+
$ref: "#/components/requestBodies/OAuth2Request"
|
210
|
+
responses:
|
211
|
+
'200':
|
212
|
+
description: OAuth 2.0 Access Token
|
213
|
+
content:
|
214
|
+
application/json:
|
215
|
+
schema:
|
216
|
+
$ref: "#/components/schemas/OAuth2Response"
|
217
|
+
'401':
|
218
|
+
description: Unauthorized
|
219
|
+
content:
|
220
|
+
application/json:
|
221
|
+
schema:
|
222
|
+
type: object
|
223
|
+
required:
|
224
|
+
- error
|
225
|
+
properties:
|
226
|
+
error:
|
227
|
+
type: string
|
228
|
+
error_description:
|
229
|
+
type: string
|
230
|
+
examples:
|
231
|
+
invalid_request:
|
232
|
+
$ref: "#/components/examples/invalid_request"
|
233
|
+
authentication:
|
234
|
+
$ref: "#/components/examples/authentication"
|
235
|
+
# /oauth/revoke:
|
236
|
+
# post:
|
237
|
+
# tags:
|
238
|
+
# - OAuth2.0
|
239
|
+
# description: |
|
240
|
+
# [OAuth 2.0 Token Revocation](http://tools.ietf.org/html/rfc7009)
|
241
|
+
# responses:
|
242
|
+
# /oauth/introspect:
|
243
|
+
# post:
|
244
|
+
# tags:
|
245
|
+
# - OAuth2.0
|
246
|
+
# description: |
|
247
|
+
# [OAuth 2.0 Token Introspection](http://tools.ietf.org/html/rfc7662)
|
248
|
+
# parameters:
|
249
|
+
# - name: token
|
250
|
+
# in: body
|
251
|
+
# required: true
|
252
|
+
# schema:
|
253
|
+
# type: string
|
254
|
+
# - name: token_type_hint
|
255
|
+
# in: body
|
256
|
+
# responses:
|
257
|
+
tags:
|
258
|
+
- name: OAuth2.0
|
259
|
+
description: |
|
260
|
+
[OAuth 2.0 protocol](http://oauth.net/2/)
|
data/config/routes.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Graphiti::OpenAPI::Engine.routes.draw do
|
2
2
|
resources :specifications, only: :index, defaults: {format: :html}
|
3
3
|
|
4
|
-
get "openapi.:format" => "specifications#index", defaults: {format: :json}
|
4
|
+
get "openapi.:format" => "specifications#index", defaults: {format: :json}, as: :openapi
|
5
5
|
root to: "specifications#index", defaults: {format: :html}
|
6
6
|
end
|
data/graphiti-openapi.gemspec
CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_runtime_dependency "activemodel"
|
30
30
|
spec.add_runtime_dependency "responders"
|
31
31
|
spec.add_runtime_dependency "kaminari"
|
32
|
-
spec.add_runtime_dependency "graphiti", "~> 1.0.
|
32
|
+
spec.add_runtime_dependency "graphiti", "~> 1.0.rc.7"
|
33
33
|
spec.add_runtime_dependency "dry-struct", "~> 0.6.0"
|
34
34
|
spec.add_runtime_dependency "transproc"
|
35
35
|
spec.add_runtime_dependency "webpacker"
|
@@ -14,6 +14,7 @@ namespace :graphiti do
|
|
14
14
|
system "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{installer_template}"
|
15
15
|
end
|
16
16
|
|
17
|
+
desc "Generate OpenAPI files in public/"
|
17
18
|
task generate: %W[environment #{jsonapi_schema}] do
|
18
19
|
generator = Graphiti::OpenAPI::Generator.new
|
19
20
|
api = Rails.root.join("public#{ApplicationResource.endpoint_namespace}")
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphiti-openapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Semyonov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-01-
|
11
|
+
date: 2019-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 1.0.
|
75
|
+
version: 1.0.rc.7
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 1.0.
|
82
|
+
version: 1.0.rc.7
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: dry-struct
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|