zero-rails_openapi 1.3.3 → 1.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5b5be5f5f85b9f720f9fafaa70ba037879c336e0
4
- data.tar.gz: fc93ab5059ff2ff594e080e51cb349a9a1ffd64c
3
+ metadata.gz: cc28a19288b67c33764363217945eabe353cbe19
4
+ data.tar.gz: 383973acb33b8dbbf4e0706e3854aadd252709a1
5
5
  SHA512:
6
- metadata.gz: f0f37a9cb0e11cb4850819e6ed443c6f6b2386ec0f2b47878eb16b1a375e2c50fb8c6b0a2cea3446010eb3b07bc7d709f6aa74b0773d23e88962c3037222e734
7
- data.tar.gz: 0db4a7fdc0f13cb55b654ff1362d39a67c399ab5f8ffa0e40eabad9c3f4776042a77c2ac189af281de0208d274d441276c10aeb7fc2b4e486753cc2f0780cae0
6
+ metadata.gz: c599c44d70844213307c8c00e3aac227776df6446236fde17cb021468187ac286bebfae40a82bc316ce553511972b74d72c838f0453548762628b5ed676e4581
7
+ data.tar.gz: 9637974d052bfa81702bd379034454a5a85fa20b2a86f2f74f0f117585f03268a5b7f52563f9ddb69e2657519ade1ba9e20c4c8595efb4a5fb0b4d24d7283e18
data/.rubocop.yml ADDED
@@ -0,0 +1,91 @@
1
+ # This is the configuration used to check the rubocop source code.
2
+
3
+ #require: rbocop/cop/internal_affairs
4
+
5
+ AllCops:
6
+ # Include common Ruby source files.
7
+ Exclude:
8
+ - 'spec/**/*'
9
+ - 'zero-params_processor.gemspec'
10
+ - 'Gemfile'
11
+ - 'bin/**/*'
12
+ DisplayCopNames: true
13
+ TargetRubyVersion: 2.4
14
+ TargetRailsVersion: 5.1
15
+
16
+ Style/FrozenStringLiteralComment:
17
+ Enabled: false
18
+
19
+ Metrics/LineLength:
20
+ Max: 1200
21
+
22
+ Metrics/ClassLength:
23
+ Max: 1200
24
+
25
+ Metrics/MethodLength:
26
+ Max: 1200
27
+
28
+ Metrics/ModuleLength:
29
+ Max: 1200
30
+
31
+ Metrics/BlockLength:
32
+ Max: 1200
33
+
34
+ Style/Documentation:
35
+ Enabled: false
36
+
37
+ Layout/SpaceInsideBrackets:
38
+ Enabled: false
39
+
40
+ Layout/SpaceInsideHashLiteralBraces:
41
+ Enabled: false
42
+
43
+ Layout/SpaceInsidePercentLiteralDelimiters:
44
+ Enabled: false
45
+
46
+ Style/AsciiComments:
47
+ Enabled: false
48
+
49
+ Layout/IndentHash:
50
+ Enabled: false
51
+
52
+ Layout/AlignHash:
53
+ Enabled: false
54
+
55
+ Style/HashSyntax:
56
+ Enabled: false
57
+
58
+ Style/ClassAndModuleChildren:
59
+ Enabled: false
60
+
61
+ Layout/EmptyLines:
62
+ Enabled: false
63
+
64
+ Lint/UnneededSplatExpansion:
65
+ Enabled: false
66
+
67
+ #Style/StringLiterals:
68
+ # Enabled: true
69
+ # EnforcedStyle: double_quotes
70
+
71
+
72
+
73
+
74
+ Style/UnneededPercentQ:
75
+ Enabled: false
76
+
77
+ Style/RedundantSelf:
78
+ Enabled: false
79
+
80
+ Metrics/CyclomaticComplexity:
81
+ Enabled: false
82
+
83
+ Metrics/AbcSize:
84
+ Enabled: false
85
+
86
+ Metrics/PerceivedComplexity:
87
+ Enabled: false
88
+
89
+ # False positives
90
+ Layout/EmptyLineBetweenDefs:
91
+ Enabled: false
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- zero-rails_openapi (1.3.3)
4
+ zero-rails_openapi (1.4.0)
5
5
  activesupport (>= 3)
6
6
  rails (>= 3)
7
7
 
@@ -53,15 +53,17 @@ GEM
53
53
  erubi (1.7.0)
54
54
  globalid (0.4.1)
55
55
  activesupport (>= 4.2.0)
56
- i18n (0.9.1)
56
+ i18n (0.9.0)
57
57
  concurrent-ruby (~> 1.0)
58
58
  loofah (2.1.1)
59
59
  crass (~> 1.0.2)
60
60
  nokogiri (>= 1.5.9)
61
- mail (2.7.0)
62
- mini_mime (>= 0.1.1)
61
+ mail (2.6.6)
62
+ mime-types (>= 1.16, < 4)
63
63
  method_source (0.9.0)
64
- mini_mime (0.1.4)
64
+ mime-types (3.1)
65
+ mime-types-data (~> 3.2015)
66
+ mime-types-data (3.2016.0521)
65
67
  mini_portile2 (2.3.0)
66
68
  minitest (5.10.3)
67
69
  nio4r (2.1.0)
data/LICENSE.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  The MIT License (MIT)
2
2
 
3
- Copyright (c) 2017 will.huang
3
+ Copyright (c) 2017 zhandao
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -8,12 +8,9 @@
8
8
 
9
9
  ## Contributing
10
10
 
11
- **Hi, here is ZhanDao. This gem was completed when I learned Ruby less than three months,
12
- I'm not sure if it has problem, but it may have a lot to improve.
13
- I'm looking forward to your issues and PRs, thanks!**
14
-
15
- Currently, I think the most important TODO is the Unit Test (RSpec, I want is),
16
- but I dont have enough time now = ▽ =
11
+ **Hi, here is ZhanDao = =
12
+ I think it's a very useful tool when you want to write API document clearly.
13
+ I'm looking forward to your issue and PR, thanks!**
17
14
 
18
15
  ## Table of Contents
19
16
 
@@ -21,6 +18,8 @@
21
18
  - [Installation](#installation)
22
19
  - [Configure](#configure)
23
20
  - [Usage - DSL](#usage---dsl)
21
+ - [DSL methods inside `open_api` and `api_dry`'s block](#dsl-methods-inside-open_api-and-api_drys-block)
22
+ - [DSL methods inside `components`'s block](#dsl-methods-inside-componentss-block-code-source-ctrlinfoobj-)
24
23
  - [Usage - Generate JSON documentation file](#usage---generate-json-documentation-file)
25
24
  - [Usage - Use Swagger UI(very beautiful web page) to show your Documentation](#usage---use-swagger-uivery-beautiful-web-page-to-show-your-documentation)
26
25
  - [Tricks](#tricks)
@@ -28,8 +27,10 @@
28
27
  - [Global DRYing](#trick2---global-drying)
29
28
  - [Auto generate description](#trick3---auto-generate-description)
30
29
  - [Skip or Use parameters define in api_dry](#trick4---skip-or-use-parameters-define-in-api_dry)
31
- - [Atuo Generate index/show Actions's Responses Based on DB Schema](#trick5---auto-generate-indexshow-actionss-responses-based-on-db-schema)
30
+ - [Atuo Generate index/show Actions's Responses Based on DB Schema](#trick5---auto-generate-indexshow-actionss-response-types-based-on-db-schema)
31
+ - [Combined Schema (oneOf / allOf / anyOf / not)]()
32
32
  - [Troubleshooting](#troubleshooting)
33
+ - [About `OpenApi.docs` and `OpenApi.paths_index`]()
33
34
 
34
35
  ## About OAS
35
36
 
@@ -73,7 +74,7 @@
73
74
  # [REQUIRED] The output location where .json doc file will be written to.
74
75
  c.file_output_path = 'public/open_api'
75
76
 
76
- c.register_docs = {
77
+ c.open_api_docs = {
77
78
  homepage_api: {
78
79
  # [REQUIRED] ZRO will scan all the descendants of root_controller, then generate their docs.
79
80
  root_controller: Api::V1::BaseController,
@@ -105,14 +106,15 @@
105
106
 
106
107
  OpenApi::Config.tap do |c|
107
108
  c.instance_eval do
108
- api :homepage_api, root_controller: ApiDoc
109
+ open_api :homepage_api, root_controller: ApiDoc
109
110
  info version: '1.0.0', title: 'Homepage APIs'
110
111
  end
111
112
  end
112
113
  ```
113
114
 
114
- For more detailed configuration: [open_api.rb](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/examples/open_api.rb)
115
- See all the settings you can configure: [config.rb](https://github.com/zhandao/zero-rails_openapi/blob/master/lib/open_api/config.rb)
115
+ For more detailed configuration: [open_api.rb](documentation/examples/open_api.rb)
116
+ See all the settings you can configure: [config.rb](lib/open_api/config.rb)
117
+ See all the Config DSL: [config_dsl.rb](lib/open_api/config_dsl.rb)
116
118
 
117
119
  ## Usage - DSL
118
120
 
@@ -131,17 +133,17 @@
131
133
 
132
134
  ```ruby
133
135
  class Api::V1::ExamplesController < Api::V1::BaseController
134
- open_api :index, 'GET list' do
136
+ api :index, 'GET list' do
135
137
  query :page, Integer#, desc: 'page, greater than 1', range: { ge: 1 }, dft: 1
136
138
  query :rows, Integer#, desc: 'per page', range: { ge: 1 }, default: 10
137
139
  end
138
140
  end
139
141
  ```
140
142
 
141
- For more example, see [goods_doc.rb](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/examples/goods_doc.rb), and
142
- [examples_controller.rb](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/examples/examples_controller.rb)
143
+ For more example, see [goods_doc.rb](documentation/examples/goods_doc.rb), and
144
+ [examples_controller.rb](documentation/examples/examples_controller.rb)
143
145
 
144
- ### DSL methods of controller ([source code](https://github.com/zhandao/zero-rails_openapi/blob/master/lib/open_api/dsl.rb))
146
+ ### DSL methods of controller ([source code](lib/open_api/dsl.rb))
145
147
 
146
148
  #### (1) `ctrl_path` (controller path) [optional]
147
149
 
@@ -182,7 +184,7 @@
182
184
  end
183
185
 
184
186
  # to use component
185
- open_api :action, 'summary' do
187
+ api :action, 'summary' do
186
188
  query :doge, :DogSchema # to use a Schema component
187
189
  param_ref :UidQuery # to use a Parameter component
188
190
  response_ref :BadRqResp # to use a Response component
@@ -210,29 +212,29 @@
210
212
 
211
213
  As you think, the block will be executed to each specified API(action) **firstly**.
212
214
 
213
- #### (5) `open_api` [required]
215
+ #### (5) `api` [required]
214
216
 
215
217
  Define the specified API (controller action, in the following example is index).
216
218
 
217
219
  ```ruby
218
220
  # method signature
219
- open_api(action, summary = '', builder: nil, skip: [ ], use: [ ], &block)
221
+ api(action, summary = '', builder: nil, skip: [ ], use: [ ], &block)
220
222
  # usage
221
- open_api :index, '(SUMMARY) this api blah blah ...', builder: :index # block ...
223
+ api :index, '(SUMMARY) this api blah blah ...', builder: :index # block ...
222
224
  ```
223
225
  If you pass `builder`, and `generate_jbuilder_file` is set to `true` (in your initializer),
224
226
  ZRO will generate JBuilder file by using specified template called `index`.
225
- About template settings, see: [open_api.rb](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/examples/open_api.rb)
227
+ About template settings, see: [open_api.rb](documentation/examples/open_api.rb)
226
228
 
227
229
  `use` and `skip` options: to use or skip the parameters defined in `api_dry`.
228
230
 
229
231
  ```ruby
230
- open_api :show, 'summary', use: [:id] # => it will only take :id from DRYed result.
232
+ api :show, 'summary', use: [:id] # => it will only take :id from DRYed result.
231
233
  ```
232
234
 
233
- ### DSL methods inside [open_api]() and [api_dry]()'s block
235
+ ### DSL methods inside [api]() and [api_dry]()'s block
234
236
 
235
- [source code](https://github.com/zhandao/zero-rails_openapi/blob/master/lib/open_api/dsl_inside_block.rb), ApiInfoObj
237
+ [source code](lib/open_api/dsl/api_info_obj.rb)
236
238
 
237
239
  These following methods in the block describe the specified API action: description, valid?,
238
240
  parameters, request body, responses, securities, servers.
@@ -304,15 +306,26 @@
304
306
  param_ref :IdPath, :NameQuery, :TokenHeader
305
307
 
306
308
 
307
- # method signature
308
- header(param_name, schema_type, schema_hash = { })
309
- header!(param_name, schema_type, schema_hash = { })
310
- query!(param_name, schema_type, schema_hash = { })
311
- # usage
309
+ ### method signature
310
+ header(param_name, schema_type = nil, one_of: nil, all_of: nil, any_of: nil, not: nil, **schema_hash)
311
+ header!(param_name, schema_type = nil, one_of: nil, all_of: nil, any_of: nil, not: nil, **schema_hash)
312
+ query!(param_name, schema_type = nil, one_of: nil, all_of: nil, any_of: nil, not: nil, **schema_hash)
313
+ # ...
314
+ ### usage
312
315
  header! 'Token', String
313
316
  query! :readed, Boolean, must_be: true, default: false
314
317
  # The same effect as above, but not simple
315
- param :query, :readed, Boolean, :req, must_be: true, default: false
318
+ param :query, :readed, Boolean, :req, must_be: true, default: false
319
+ #
320
+ # When schema_type is a Object
321
+ # (describe by hash, key means prop's name, value means prop's schema_type)
322
+ query :good, { name: String, price: Float, spec: { size: String, weight: Integer } }, desc: 'good info'
323
+ # Or you can use `type:` to sign the schema_type, maybe this is clearer for describing object
324
+ query :good, type: { name: String, price: Float, spec: { size: String, weight: Integer } }, desc: 'good info'
325
+ #
326
+ query :good_name, type: String # It's also OK, but some superfluous
327
+ query :good_name, String # recommended
328
+ # About Combined Schema (`one_of` ..), see the link below.
316
329
 
317
330
 
318
331
  # method signature
@@ -340,8 +353,10 @@
340
353
  :wrong_input => [ -1, '' ]
341
354
  }
342
355
  ```
356
+
357
+ [This trick show you how to define combined schema (by using `one_of` ..)]()
343
358
 
344
- [**>> More About `param` DSL <<**](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/parameter.md)
359
+ [**>> More About `param` DSL <<**](documentation/parameter.md)
345
360
 
346
361
  #### (4) `request_body` family methods (OAS - [Request Body Object](https://github.com/OAI/OpenAPI-Specification/blob/OpenAPI.next/versions/3.0.0.md#requestBodyObject))
347
362
 
@@ -408,7 +423,7 @@
408
423
  1. **Notice:** Each API should only declare a request body
409
424
  That is, all of the above methods you can only choose one of them.
410
425
  (But **multiple media types** will be supported in the future).
411
- 2. `media_type`: we provide some [mapping](https://github.com/zhandao/zero-rails_openapi/blob/master/lib/oas_objs/media_type_obj.rb) from symbols to real media-types.
426
+ 2. `media_type`: we provide some [mapping](lib/oas_objs/media_type_obj.rb) from symbols to real media-types.
412
427
  3. `schema_hash`: as above (see param).
413
428
  **One thing that should be noted is: when use Hash writing, `scham_type` is writed in schema_hash using key :type.**
414
429
  4. `exp_by` and `examples`: for the above example, the following has the same effect:
@@ -427,6 +442,7 @@
427
442
  response_ref
428
443
  default_response or dft_resp
429
444
  error_response, other_response, oth_resp, error, err_resp # response's aliases, should be used in the error response context.
445
+ merge_to_resp
430
446
  ```
431
447
 
432
448
  ```ruby
@@ -439,15 +455,87 @@
439
455
  response_ref(code_compkey_hash)
440
456
  # usage
441
457
  response_ref 700 => :AResp, 800 => :BResp
458
+
459
+ # method signature
460
+ merge_to_resp(code, by:)
461
+ # usage
462
+ merge_to_resp 200, by: {
463
+ data: {
464
+ type: String
465
+ }
466
+ }
467
+ ```
468
+
469
+ **practice:** Combined with wrong class, automatically generate error responses. [AutoGenDoc](documentation/examples/auto_gen_doc.rb#L63)
470
+
471
+ #### (6) Authentication and Authorization
472
+
473
+ First of all, please make sure that you have read one of the following documents:
474
+ [OpenApi Auth](https://swagger.io/docs/specification/authentication/)
475
+ or [securitySchemeObject](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#securitySchemeObject)
476
+
477
+ ##### Define Security Scheme
478
+
479
+ Use these DSL in your initializer or `components` block:
442
480
  ```
481
+ security_scheme # alias `auth_scheme`
482
+ base_auth # will call `security_scheme`
483
+ bearer_auth # will call `security_scheme`
484
+ api_key # will call `security_scheme`
485
+ ```
486
+ It's very simple to use (if you understand the above document)
487
+ ```ruby
488
+ # method signature
489
+ security_scheme(scheme_name, other_info)
490
+ # usage
491
+ security_scheme :BasicAuth, { type: 'http', scheme: 'basic', desc: 'basic auth' }
443
492
 
444
- **practice:** Combined with wrong class, automatically generate error responses. [AutoGenDoc](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/examples/auto_gen_doc.rb#L63)
493
+ # method signature
494
+ base_auth(scheme_name, other_info = { })
495
+ bearer_auth(scheme_name, format = 'JWT', other_info = { })
496
+ api_key(scheme_name, field:, in:, **other_info)
497
+ # usage
498
+ base_auth :BasicAuth, desc: 'basic auth' # the same effect as ↑↑↑
499
+ bearer_auth :Token
500
+ api_key :ApiKeyAuth, field: 'X-API-Key', in: 'header', desc: 'pass api key to header'
501
+ ```
502
+
503
+ ##### Apply Security
445
504
 
446
- #### (6) `security`: TODO
505
+ ```
506
+ # In initializer
507
+ # Global effectiveness
508
+ global_security_require
509
+ global_security # alias
510
+ global_auth # alias
511
+
512
+ # In `api`'s block
513
+ # Only valid for the current controller
514
+ security_require
515
+ security # alias
516
+ auth # alias
517
+ need_auth # alias
518
+ ```
519
+ Name is different, signature and usage is similar.
520
+ ```ruby
521
+ # method signature
522
+ security_require(scheme_name, scopes: [ ])
523
+ # usage
524
+ global_auth :Token
525
+ need_auth :Token
526
+ auth :OAuth, scopes: %w[ read_example admin ]
527
+ ```
447
528
 
448
- #### (7) `server`: TODO
529
+ #### (7) Overriding Global Servers by `server`
449
530
 
450
- ### DSL methods inside [components]()'block ([code source](https://github.com/zhandao/zero-rails_openapi/blob/master/lib/open_api/dsl_inside_block.rb):: CtrlInfoObj )
531
+ ```ruby
532
+ # method signature
533
+ server(url, desc)
534
+ # usage
535
+ server 'http://localhost:3000', 'local'
536
+ ```
537
+
538
+ ### DSL methods inside [components]()'s block ([code source](lib/open_api/dsl/ctrl_info_obj.rb):: CtrlInfoObj )
451
539
 
452
540
  (Here corresponds to OAS [Components Object](https://github.com/OAI/OpenAPI-Specification/blob/OpenAPI.next/versions/3.0.0.md#componentsObject))
453
541
 
@@ -469,18 +557,20 @@
469
557
  # method signature
470
558
  schema(component_key, type, schema_hash)
471
559
  # usage
472
- schema :Dog => [ String, desc: 'dogee' ]
560
+ schema :Dog => [ String, desc: 'dogee' ] # <= schema_type is `String`
473
561
  # advance usage
474
- schema :Dog => [{
475
- id!: Integer,
476
- name: { type: String, must_be: 'name', desc: 'name' }
477
- }, # <= this hash is schema type[1]
478
- dft: { id: 1, name: 'pet' },
479
- desc: 'dogee']
562
+ schema :Dog => [
563
+ {
564
+ id!: Integer,
565
+ name: { type: String, must_be: 'name', desc: 'name' }
566
+ }, # <= this hash is schema type[1]
567
+ dft: { id: 1, name: 'pet' },
568
+ desc: 'dogee'
569
+ ]
480
570
  # or (unrecommended)
481
571
  schema :Dog, { id!: Integer, name: String }, dft: { id: 1, name: 'pet' }, desc: 'dogee'
482
572
  ```
483
- [1] see: [Type](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/parameter.md#type)
573
+ [1] see: [Type](documentation/parameter.md#type-schema_type)
484
574
 
485
575
  ## Usage - Generate JSON Documentation File
486
576
 
@@ -491,7 +581,7 @@
491
581
  OpenApi.write_docs generate_files: !Rails.env.production?
492
582
 
493
583
  # or run directly in console
494
- OpenApi.write_docs
584
+ OpenApi.write_docs # will generate json doc files
495
585
  ```
496
586
 
497
587
  Then the JSON files will be written to the directories you set. (Each API a file.)
@@ -500,8 +590,7 @@
500
590
 
501
591
  Download [Swagger UI](https://github.com/swagger-api/swagger-ui) (version >= 2.3.0 support the OAS3)
502
592
  to your project,
503
- modify the default JSON file path(url) in the index.html
504
- (window.onload >> SwaggerUIBundle >> url).
593
+ change the default JSON file path(url) in index.html.
505
594
  In order to use it, you may have to enable CORS, [see](https://github.com/swagger-api/swagger-ui#cors-support)
506
595
 
507
596
  ## Tricks
@@ -528,7 +617,7 @@
528
617
  class V1::ExamplesDoc < ApiDoc
529
618
  ctrl_path 'api/v1/examples'
530
619
 
531
- open_api :index do
620
+ api :index do
532
621
  # ...
533
622
  end
534
623
  end
@@ -540,7 +629,7 @@
540
629
 
541
630
  Method `api_dry` is for DRY but its scope is limited to the current controller.
542
631
 
543
- I have no idea of best practices, But you can look at this [file](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/examples/auto_gen_doc.rb).
632
+ I have no idea of best practices, But you can look at this [file](documentation/examples/auto_gen_doc.rb).
544
633
  The implementation of the file is: do `api_dry` when inherits the base controller inside `inherited` method.
545
634
 
546
635
  You can use `sort` to specify the order of parameters.
@@ -572,30 +661,68 @@
572
661
  'only offline': :offline,
573
662
  'expensive goods': :get,
574
663
  'cheap goods': :borrow,
575
- }
664
+ }
576
665
  ```
577
- Read this [file](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/examples/auto_gen_desc.rb) to learn more.
666
+ Read this [file](documentation/examples/auto_gen_desc.rb) to learn more.
578
667
 
579
668
  ### Trick4 - Skip or Use parameters define in api_dry
580
669
 
581
- Pass `skip: []` and `use: []` to `open_api` like following code:
670
+ Pass `skip: []` and `use: []` to `api` like following code:
582
671
  ```ruby
583
- open_api :index, 'desc', builder: :index, skip: [ :Token ]
672
+ api :index, 'desc', builder: :index, skip: [ :Token ]
584
673
  ```
585
674
 
586
- Look at this [file](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/examples/goods_doc.rb) to learn more.
675
+ Look at this [file](documentation/examples/goods_doc.rb) to learn more.
587
676
 
588
677
  ### Trick5 - Auto Generate index/show Actions's Response-Types Based on DB Schema
589
678
 
590
679
  Use method `load_schema` in `api_dry`.
591
680
 
592
- See this [file](https://github.com/zhandao/zero-rails_openapi/blob/master/documentation/examples/auto_gen_doc.rb#L51) for uasge information.
681
+ See this [file](documentation/examples/auto_gen_doc.rb#L51) for uasge information.
682
+
683
+ ### Trick6 - Combined Schema (oneOf / allOf / anyOf / not)
593
684
 
685
+ ```ruby
686
+ query :combination, one_of: [ :GoodSchema, String, { type: Integer, desc: 'integer input'}]
687
+
688
+ form '', data: {
689
+ :combination_in_form => { any_of: [ Integer, String ] }
690
+ }
691
+
692
+ schema :PetSchema => [ not: [ Integer, Boolean ] ]
693
+ ```
694
+
695
+ OAS: [link1](https://swagger.io/docs/specification/data-models/oneof-anyof-allof-not/),
696
+ [link2](https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#schemaObject)
594
697
 
595
698
  ## Troubleshooting
596
699
 
597
700
  - **You wrote document of the current API, but not find in the generated json file?**
598
701
  Check your routing settings.
702
+ - **Undefine method `match?`**
703
+ Monkey patches for `String` and `Symbol`:
704
+ ```ruby
705
+ class String # Symbol
706
+ def match?(pattern); !match(pattern).nil? end
707
+ end
708
+ ```
709
+ - **Report error when require `routes.rb`?***
710
+ 1. Run `rails routes`.
711
+ 2. Copy the output to a file, for example `config/routes.txt`.
712
+ ignore the file `config/routes.txt`.
713
+ 3. Put `c.rails_routes_file = 'config/routes.txt'` to your ZRO config.
714
+
715
+
716
+ ## About `OpenApi.docs` and `OpenApi.paths_index`
717
+
718
+ After `OpenApi.write_docs`, the above two module variables will be generated.
719
+
720
+ `OpenApi.docs`: A Hash with API names as keys, and documents of each APIs as values.
721
+ documents are instances of ActiveSupport::HashWithIndifferentAccess.
722
+
723
+ `OpenApi.paths_index`: Inverted index of controller path to API name mappings.
724
+ Like: `{ 'api/v1/examples' => :homepage_api }`
725
+ It's useful when you want to look up a document based on a controller and do something.
599
726
 
600
727
  ## Development
601
728
 
@@ -609,4 +736,4 @@
609
736
 
610
737
  ## Code of Conduct
611
738
 
612
- Everyone interacting in the Zero-OpenApi project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/zhandao/zero-rails_openapi/blob/master/CODE_OF_CONDUCT.md).
739
+ Everyone interacting in the Zero-OpenApi project’s codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](CODE_OF_CONDUCT.md).