zero-rails_openapi 1.5.4 → 1.5.5
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/CHANGELOG.md +10 -0
- data/Gemfile.lock +1 -1
- data/README.md +59 -6
- data/README_zh.md +22 -8
- data/lib/oas_objs/callback_obj.rb +58 -0
- data/lib/oas_objs/schema_obj.rb +1 -1
- data/lib/open_api/dsl.rb +2 -1
- data/lib/open_api/dsl/api_info.rb +5 -1
- data/lib/open_api/dsl/common_dsl.rb +1 -0
- data/lib/open_api/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e530c334773b9ef483102a2cd2c829704ac41ab4
|
4
|
+
data.tar.gz: 2cabf4dc3335eeea103fbca8863c01ba46b9988a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1bee517abfc870ee6cac040f9a61cc03e724e9e240fdc3aa2b4a7ce217f99ed57724d00d00b00741a1694e75cba9e4368f554cdddddad6c6d407a607a3daba96
|
7
|
+
data.tar.gz: 73da6d4109dc89c1e079e83dac675099f203c83b00dad28e6da023a1cb1f97344feb0bb283d25e6f0a5ceff25c033cc2d703cac2f3d95240f986d329e420b9a5
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
|
3
3
|
## [Unreleased]
|
4
4
|
|
5
|
+
## [1.5.5] - 2018/2/21 - [view diff](https://github.com/zhandao/zero-rails_openapi/compare/v1.5.4...v1.5.5)
|
6
|
+
|
7
|
+
## Added
|
8
|
+
|
9
|
+
1. Callback Object has been supported. (issue [#12](#https://github.com/zhandao/zero-rails_openapi/issues/12) @austbot)
|
10
|
+
|
11
|
+
## Changed
|
12
|
+
|
13
|
+
1. `mk`'s parameter `eq` is changed to `get`. (dssl.rb)
|
14
|
+
|
5
15
|
## [1.5.4] - 2018/2/15 - [view diff](https://github.com/zhandao/zero-rails_openapi/compare/v1.5.3...v1.5.4)
|
6
16
|
|
7
17
|
Thanks to @austbot, fix - colorize fails at runtime.
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -4,8 +4,6 @@
|
|
4
4
|
[](https://travis-ci.org/zhandao/zero-rails_openapi)
|
5
5
|
[](https://codeclimate.com/github/zhandao/zero-rails_openapi/maintainability)
|
6
6
|
[](https://codeclimate.com/github/zhandao/zero-rails_openapi/test_coverage)
|
7
|
-
[](https://gitter.im/zero-rails_openapi/Lobby)
|
8
|
-
[](https://www.codetriage.com/zhandao/zero-rails_openapi)
|
9
7
|
|
10
8
|
Concise DSL for generating OpenAPI Specification 3 (**OAS3**, formerly Swagger3) JSON documentation for Rails application.
|
11
9
|
|
@@ -25,7 +23,20 @@
|
|
25
23
|
- [Configure](#configure)
|
26
24
|
- [Usage - DSL](#usage---dsl)
|
27
25
|
- [Basic DSL](#basic-dsl)
|
26
|
+
- [route_base](#1-route_base-optional-if-youre-writing-dsl-in-controller)
|
27
|
+
- [doc_tag](#2-doc_tag-optional)
|
28
|
+
- [components](#3-components-optional)
|
29
|
+
- [api_dry](#4-api_dry-optional)
|
30
|
+
- [api](#5-api-required)
|
28
31
|
- [DSL methods inside `api` and `api_dry`'s block](#dsl-methods-inside-api-and-api_drys-block)
|
32
|
+
- [this_api_is_invalid!](#1-this_api_is_invalid-its-aliases)
|
33
|
+
- [desc](#2-desc-description-for-the-current-api-and-its-inputs-parameters-and-request-body)
|
34
|
+
- [param family methods](#3-param-family-methods-oas---parameter-object)
|
35
|
+
- [request_body family methods](#4-request_body-family-methods-oas---request-body-object)
|
36
|
+
- [response family methods](#5-response-family-methods-oas---response-object)
|
37
|
+
- [callback](#6-callback-oas---callback-object)
|
38
|
+
- [Authentication and Authorization](#7-authentication-and-authorization)
|
39
|
+
- [server](#8-overriding-global-servers-by-server)
|
29
40
|
- [DSL methods inside `components`'s block](#dsl-methods-inside-componentss-block-code-source)
|
30
41
|
- [Run! - Generate JSON documentation file](#run---generate-json-documentation-file)
|
31
42
|
- [Use Swagger UI(very beautiful web page) to show your Documentation](#use-swagger-uivery-beautiful-web-page-to-show-your-documentation)
|
@@ -45,7 +56,7 @@
|
|
45
56
|
|
46
57
|
You can getting started from [swagger.io](https://swagger.io/docs/specification/basic-structure/)
|
47
58
|
|
48
|
-
**I suggest you should understand
|
59
|
+
**I suggest you should understand the basic structure of OAS3 at least.**
|
49
60
|
such as component (can help you reuse DSL code, when your apis are used with the
|
50
61
|
same data structure).
|
51
62
|
|
@@ -150,7 +161,8 @@
|
|
150
161
|
```
|
151
162
|
|
152
163
|
For more example, see [goods_doc.rb](documentation/examples/goods_doc.rb), and
|
153
|
-
[examples_controller.rb](documentation/examples/examples_controller.rb)
|
164
|
+
[examples_controller.rb](documentation/examples/examples_controller.rb),
|
165
|
+
or [HERE](https://github.com/zhandao/zero-rails/tree/master/app/_docs/v1).
|
154
166
|
|
155
167
|
### Basic DSL ([source code](lib/open_api/dsl.rb))
|
156
168
|
|
@@ -492,8 +504,47 @@
|
|
492
504
|
```
|
493
505
|
|
494
506
|
**practice:** Automatically generate responses based on the agreed error class. [AutoGenDoc](documentation/examples/auto_gen_doc.rb#L63)
|
507
|
+
|
508
|
+
### (6) Callback (OAS - [Callback Object](https://github.com/OAI/OpenAPI-Specification/blob/OpenAPI.next/versions/3.0.0.md#callback-object))
|
509
|
+
|
510
|
+
[About Callbacks](https://swagger.io/docs/specification/callbacks/)
|
511
|
+
> In OpenAPI 3 specs, you can define callbacks – asynchronous, out-of-band requests that your service will send to some other service in response to certain events. This helps you improve the workflow your API offers to clients.
|
512
|
+
A typical example of a callback is a subscription functionality ... you can define the format of the “subscription” operation as well as the format of callback messages and expected responses to these messages.
|
513
|
+
This description will simplify communication between different servers and will help you standardize use of webhooks in your API.
|
514
|
+
[Complete YAML Example](https://github.com/OAI/OpenAPI-Specification/blob/master/examples/v3.0/callback-example.yaml)
|
515
|
+
|
516
|
+
The structure of Callback Object:
|
517
|
+
```
|
518
|
+
callbacks:
|
519
|
+
Event1:
|
520
|
+
path1:
|
521
|
+
...
|
522
|
+
path2:
|
523
|
+
...
|
524
|
+
Event2:
|
525
|
+
...
|
526
|
+
```
|
527
|
+
|
528
|
+
To define callbacks, you can use `callback` method:
|
529
|
+
```ruby
|
530
|
+
# method signature
|
531
|
+
callback(event_name, http_method, callback_url, &block)
|
532
|
+
# usage
|
533
|
+
callback :myEvent, :post, 'localhost:3000/api/goods' do
|
534
|
+
query :name, String
|
535
|
+
data :token, String
|
536
|
+
response 200, 'success', :json, data: { name: String, description: String }
|
537
|
+
end
|
538
|
+
```
|
539
|
+
|
540
|
+
Use runtime expressions in callback_url:
|
541
|
+
```ruby
|
542
|
+
callback :myEvent, :post, '{body callback_addr}/api/goods/{query id}'
|
543
|
+
# the final URL will be: {$request.body#/callback_addr}/api/goods/{$request.query.id}
|
544
|
+
# Note: Other expressions outside "$request" are not supported yet
|
545
|
+
```
|
495
546
|
|
496
|
-
#### (
|
547
|
+
#### (7) Authentication and Authorization
|
497
548
|
|
498
549
|
First of all, please make sure that you have read one of the following documents:
|
499
550
|
[OpenApi Auth](https://swagger.io/docs/specification/authentication/)
|
@@ -551,7 +602,7 @@
|
|
551
602
|
auth :OAuth, scopes: %w[ read_example admin ]
|
552
603
|
```
|
553
604
|
|
554
|
-
#### (
|
605
|
+
#### (8) Overriding Global Servers by `server`
|
555
606
|
|
556
607
|
```ruby
|
557
608
|
# method signature
|
@@ -763,6 +814,8 @@
|
|
763
814
|
|
764
815
|
## Development
|
765
816
|
|
817
|
+
TODO ..
|
818
|
+
|
766
819
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
767
820
|
|
768
821
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
data/README_zh.md
CHANGED
@@ -28,17 +28,30 @@
|
|
28
28
|
- [配置](#configure)
|
29
29
|
- [DSL 介绍及用例](#usage---dsl)
|
30
30
|
- [基本的 DSL](#基本的-dsl)
|
31
|
+
- [route_base](#1-route_base-optional-if-youre-writing-dsl-in-controller)
|
32
|
+
- [doc_tag](#2-doc_tag-optional)
|
33
|
+
- [components](#3-components-optional)
|
34
|
+
- [api_dry](#4-api_dry-optional)
|
35
|
+
- [api](#5-api-required)
|
31
36
|
- [用于 `api` 和 `api_dry` 块内的 DSL(描述 API 的参数、响应等)](#dsl-methods-inside-api-and-api_drys-block)
|
37
|
+
- [this_api_is_invalid!](#1-this_api_is_invalid-its-aliases)
|
38
|
+
- [desc](#2-desc-description-for-the-current-api-and-its-inputs-parameters-and-request-body)
|
39
|
+
- [param family methods](#3-param-family-methods-oas---parameter-object)
|
40
|
+
- [request_body family methods](#4-request_body-family-methods-oas---request-body-object)
|
41
|
+
- [response family methods](#5-response-family-methods-oas---response-object)
|
42
|
+
- [callback](#6-callback-oas---callback-object)
|
43
|
+
- [Authentication and Authorization](#7-authentication-and-authorization)
|
44
|
+
- [server](#8-overriding-global-servers-by-server)
|
32
45
|
- [用于 `components` 块内的 DSL(描述可复用的组件)](#dsl-methods-inside-componentss-block-code-source)
|
33
46
|
- [执行文档生成](#run---generate-json-documentation-file)
|
34
47
|
- [使用 Swagger-UI 可视化所生成的文档](#use-swagger-uivery-beautiful-web-page-to-show-your-documentation)
|
35
48
|
- [技巧](#tricks)
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
49
|
+
- [将 DSL 写于他处,与控制器分离](#trick1---write-the-dsl-somewhere-else)
|
50
|
+
- [全局 DRY](#trick2---global-drying)
|
51
|
+
- [基于 enum 等信息自动生成参数描述](#trick3---auto-generate-description)
|
52
|
+
- [跳过或使用 DRY 时(`api_dry`)所定义的参数](#trick4---skip-or-use-parameters-define-in-api_dry)
|
53
|
+
- [基于 DB Schema 自动生成 response 的格式](#trick5---auto-generate-indexshow-actionss-response-types-based-on-db-schema)
|
54
|
+
- [定义组合的 Schema (one_of / all_of / any_of / not)](#trick6---combined-schema-one_of--all_of--any_of--not)
|
42
55
|
- [问题集](#troubleshooting)
|
43
56
|
- [有关 `OpenApi.docs` 和 `OpenApi.routes_index`](#about-openapidocs-and-openapiroutes_index)
|
44
57
|
|
@@ -145,8 +158,9 @@
|
|
145
158
|
end
|
146
159
|
```
|
147
160
|
|
148
|
-
|
149
|
-
[examples_controller.rb](documentation/examples/examples_controller.rb)
|
161
|
+
更多更详细的实例: [goods_doc.rb](documentation/examples/goods_doc.rb)、
|
162
|
+
[examples_controller.rb](documentation/examples/examples_controller.rb),以及
|
163
|
+
[这里](https://github.com/zhandao/zero-rails/tree/master/app/_docs/v1)。
|
150
164
|
|
151
165
|
### 基本的 DSL ([source code](lib/open_api/dsl.rb))
|
152
166
|
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'oas_objs/helpers'
|
2
|
+
|
3
|
+
module OpenApi
|
4
|
+
module DSL
|
5
|
+
# https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#callbackObject
|
6
|
+
class CallbackObj < Hash
|
7
|
+
include Helpers
|
8
|
+
|
9
|
+
attr_accessor :event_name, :http_method, :callback_url, :block
|
10
|
+
|
11
|
+
def initialize(event_name, http_method, callback_url, &block)
|
12
|
+
self.event_name = event_name
|
13
|
+
self.http_method = http_method
|
14
|
+
self.callback_url = callback_url
|
15
|
+
self.block = block
|
16
|
+
end
|
17
|
+
|
18
|
+
def process
|
19
|
+
{
|
20
|
+
self.event_name => {
|
21
|
+
processed_url => {
|
22
|
+
self.http_method.downcase.to_sym => processed_block
|
23
|
+
}
|
24
|
+
}
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
def processed_url
|
29
|
+
self.callback_url.gsub(/{[^{}]*}/) do |exp|
|
30
|
+
key_location, key_name = exp[1..-2].split
|
31
|
+
connector = key_location == 'body' ? '#/' : '.'
|
32
|
+
key_location = '$request.' + key_location
|
33
|
+
['{', key_location, connector, key_name, '}'].join
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def processed_block
|
38
|
+
api = ApiInfo.new.merge! parameters: [ ], requestBody: '', responses: { }
|
39
|
+
api.instance_exec(&(self.block || ->{ }))
|
40
|
+
api.process_objs
|
41
|
+
api.delete_if { |_, v| v.blank? }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
__END__
|
49
|
+
|
50
|
+
myEvent:
|
51
|
+
'{$request.body#/callbackUrl}':
|
52
|
+
post: # Method
|
53
|
+
requestBody: # Contents of the callback message
|
54
|
+
…
|
55
|
+
responses: # Expected responses
|
56
|
+
…
|
57
|
+
|
58
|
+
https://github.com/OAI/OpenAPI-Specification/blob/master/examples/v3.0/callback-example.yaml
|
data/lib/oas_objs/schema_obj.rb
CHANGED
@@ -41,7 +41,7 @@ module OpenApi
|
|
41
41
|
RefObj.new(:schema, t).process
|
42
42
|
elsif t.in? %w[ float double int32 int64 ]
|
43
43
|
{ type: t.match?('int') ? 'integer' : 'number', format: t }
|
44
|
-
elsif t.in? %w[ binary base64 ]
|
44
|
+
elsif t.in? %w[ binary base64 uri ]
|
45
45
|
{ type: 'string', format: t }
|
46
46
|
elsif t == 'file'
|
47
47
|
{ type: 'string', format: Config.file_format }
|
data/lib/open_api/dsl.rb
CHANGED
@@ -40,7 +40,8 @@ module OpenApi
|
|
40
40
|
|
41
41
|
api = ApiInfo.new(action_path, skip: Array(skip), use: Array(use))
|
42
42
|
.merge! description: '', summary: summary, operationId: action, tags: [@doc_tag],
|
43
|
-
parameters: [ ], requestBody: '', responses: { },
|
43
|
+
parameters: [ ], requestBody: '', responses: { }, callbacks: { },
|
44
|
+
links: { }, security: [ ], servers: [ ]
|
44
45
|
[action, :all].each { |blk_key| @zro_dry_blocks&.[](blk_key)&.each { |blk| api.instance_eval(&blk) } }
|
45
46
|
api.param_use = api.param_skip = [ ] # `skip` and `use` only affect `api_dry`'s blocks
|
46
47
|
api.instance_exec(&block) if block_given?
|
@@ -8,7 +8,7 @@ module OpenApi
|
|
8
8
|
|
9
9
|
attr_accessor :action_path, :param_skip, :param_use, :param_descs, :param_order
|
10
10
|
|
11
|
-
def initialize(action_path, skip: [ ], use: [ ])
|
11
|
+
def initialize(action_path = '', skip: [ ], use: [ ])
|
12
12
|
self.action_path = action_path
|
13
13
|
self.param_skip = skip
|
14
14
|
self.param_use = use
|
@@ -115,6 +115,10 @@ module OpenApi
|
|
115
115
|
alias auth security_require
|
116
116
|
alias need_auth security_require
|
117
117
|
|
118
|
+
def callback event_name, http_method, callback_url, &block
|
119
|
+
self[:callbacks].deep_merge! CallbackObj.new(event_name, http_method, callback_url, &block).process
|
120
|
+
end
|
121
|
+
|
118
122
|
def server url, desc: ''
|
119
123
|
self[:servers] << { url: url, description: desc }
|
120
124
|
end
|
data/lib/open_api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zero-rails_openapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- zhandao
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -137,6 +137,7 @@ files:
|
|
137
137
|
- documentation/examples/open_api.rb
|
138
138
|
- documentation/examples/output_example.json
|
139
139
|
- documentation/parameter.md
|
140
|
+
- lib/oas_objs/callback_obj.rb
|
140
141
|
- lib/oas_objs/combined_schema.rb
|
141
142
|
- lib/oas_objs/example_obj.rb
|
142
143
|
- lib/oas_objs/helpers.rb
|