zero-rails_openapi 1.3.3 → 1.4.0

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
  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).