r2-oas 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (136) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +12 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  4. data/.gitignore +12 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +7 -0
  7. data/.rubocop_todo.yml +224 -0
  8. data/.travis.yml +22 -0
  9. data/CHANGELOG.md +3 -0
  10. data/CODE_OF_CONDUCT.md +74 -0
  11. data/Gemfile +12 -0
  12. data/Gemfile.lock +207 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.ja.md +585 -0
  15. data/README.md +582 -0
  16. data/Rakefile +8 -0
  17. data/bin/console +12 -0
  18. data/bin/setup +8 -0
  19. data/docs/HOW_TO_ANALYZE_DOCS.md +875 -0
  20. data/docs/HOW_TO_CLEAN_DOCS.md +19 -0
  21. data/docs/HOW_TO_DEPLOY_SWAGGER_DOC.md +839 -0
  22. data/docs/HOW_TO_DISPLAY_PATHS_LIST.md +28 -0
  23. data/docs/HOW_TO_DISPLAY_PATHS_STATS.md +53 -0
  24. data/docs/HOW_TO_GENERATE_DOCS.md +256 -0
  25. data/docs/HOW_TO_MONITOR_SWAGGER_DOC.md +219 -0
  26. data/docs/HOW_TO_START_SWAGGER_EDITOR.md +218 -0
  27. data/docs/HOW_TO_START_SWAGGER_UI.md +262 -0
  28. data/docs/HOW_TO_USE_HOOK_WHEN_GENERATE_DOC.md +244 -0
  29. data/docs/HOW_TO_USE_SCHEMA_NAMESPACE.md +176 -0
  30. data/docs/HOW_TO_USE_TAG_NAMESPACE.md +176 -0
  31. data/docs/versions/v3.md +155 -0
  32. data/lib/r2-oas.rb +36 -0
  33. data/lib/r2-oas/app_configuration.rb +102 -0
  34. data/lib/r2-oas/app_configuration/server.rb +35 -0
  35. data/lib/r2-oas/app_configuration/swagger.rb +35 -0
  36. data/lib/r2-oas/app_configuration/swagger/editor.rb +47 -0
  37. data/lib/r2-oas/app_configuration/swagger/ui.rb +45 -0
  38. data/lib/r2-oas/app_configuration/tool.rb +31 -0
  39. data/lib/r2-oas/app_configuration/tool/paths/stats.rb +43 -0
  40. data/lib/r2-oas/base.rb +48 -0
  41. data/lib/r2-oas/configuration.rb +69 -0
  42. data/lib/r2-oas/configuration/paths_config.rb +44 -0
  43. data/lib/r2-oas/deploy/client.rb +43 -0
  44. data/lib/r2-oas/deploy/swagger-ui/dist/favicon-16x16.png +0 -0
  45. data/lib/r2-oas/deploy/swagger-ui/dist/favicon-32x32.png +0 -0
  46. data/lib/r2-oas/deploy/swagger-ui/dist/oauth2-redirect.html +68 -0
  47. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-bundle.js +134 -0
  48. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-bundle.js.map +1 -0
  49. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-standalone-preset.js +22 -0
  50. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-standalone-preset.js.map +1 -0
  51. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.css +4 -0
  52. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.css.map +1 -0
  53. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.js +9 -0
  54. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.js.map +1 -0
  55. data/lib/r2-oas/deploy/swagger-ui/index.html.erb +60 -0
  56. data/lib/r2-oas/errors.rb +7 -0
  57. data/lib/r2-oas/hooks/global_hook.rb +20 -0
  58. data/lib/r2-oas/hooks/hook.rb +77 -0
  59. data/lib/r2-oas/hooks/repository.rb +15 -0
  60. data/lib/r2-oas/logger/stdout_logger.rb +129 -0
  61. data/lib/r2-oas/pluggable_configuration.rb +33 -0
  62. data/lib/r2-oas/plugins/schema/v3/object/hookable_base_object.rb +100 -0
  63. data/lib/r2-oas/routing/adjustor.rb +44 -0
  64. data/lib/r2-oas/routing/base.rb +12 -0
  65. data/lib/r2-oas/routing/components/all.rb +5 -0
  66. data/lib/r2-oas/routing/components/base_component.rb +10 -0
  67. data/lib/r2-oas/routing/components/path_component.rb +67 -0
  68. data/lib/r2-oas/routing/components/request_component.rb +75 -0
  69. data/lib/r2-oas/routing/components/verb_component.rb +21 -0
  70. data/lib/r2-oas/routing/parser.rb +93 -0
  71. data/lib/r2-oas/schema/analyzer.rb +23 -0
  72. data/lib/r2-oas/schema/base.rb +11 -0
  73. data/lib/r2-oas/schema/cleaner.rb +23 -0
  74. data/lib/r2-oas/schema/editor.rb +120 -0
  75. data/lib/r2-oas/schema/generator.rb +23 -0
  76. data/lib/r2-oas/schema/manager/file/path_item_file_manager.rb +24 -0
  77. data/lib/r2-oas/schema/monitor.rb +52 -0
  78. data/lib/r2-oas/schema/squeezer.rb +23 -0
  79. data/lib/r2-oas/schema/ui.rb +74 -0
  80. data/lib/r2-oas/schema/v3/analyzer.rb +58 -0
  81. data/lib/r2-oas/schema/v3/analyzer/base_analyzer.rb +76 -0
  82. data/lib/r2-oas/schema/v3/analyzer/components/object_analyzer.rb +38 -0
  83. data/lib/r2-oas/schema/v3/analyzer/components_analyzer.rb +30 -0
  84. data/lib/r2-oas/schema/v3/analyzer/path_analyzer.rb +116 -0
  85. data/lib/r2-oas/schema/v3/analyzer/tag_analyzer.rb +38 -0
  86. data/lib/r2-oas/schema/v3/base.rb +28 -0
  87. data/lib/r2-oas/schema/v3/cleaner.rb +19 -0
  88. data/lib/r2-oas/schema/v3/cleaner/base_cleaner.rb +30 -0
  89. data/lib/r2-oas/schema/v3/cleaner/components_cleaner.rb +42 -0
  90. data/lib/r2-oas/schema/v3/generator.rb +28 -0
  91. data/lib/r2-oas/schema/v3/generator/base_generator.rb +88 -0
  92. data/lib/r2-oas/schema/v3/generator/components/object_generator.rb +83 -0
  93. data/lib/r2-oas/schema/v3/generator/components/request_body_generator.rb +45 -0
  94. data/lib/r2-oas/schema/v3/generator/components_generator.rb +38 -0
  95. data/lib/r2-oas/schema/v3/generator/doc_generator.rb +49 -0
  96. data/lib/r2-oas/schema/v3/generator/path_generator.rb +90 -0
  97. data/lib/r2-oas/schema/v3/generator/schema_generator.rb +78 -0
  98. data/lib/r2-oas/schema/v3/manager/diff/base_array_diff_manager.rb +60 -0
  99. data/lib/r2-oas/schema/v3/manager/diff/base_diff_manager.rb +29 -0
  100. data/lib/r2-oas/schema/v3/manager/diff/base_hash_diff_manager.rb +95 -0
  101. data/lib/r2-oas/schema/v3/manager/diff/components_diff_manager.rb +19 -0
  102. data/lib/r2-oas/schema/v3/manager/diff/tag_diff_manager.rb +17 -0
  103. data/lib/r2-oas/schema/v3/manager/file/base_file_manager.rb +60 -0
  104. data/lib/r2-oas/schema/v3/manager/file/components_file_manager.rb +22 -0
  105. data/lib/r2-oas/schema/v3/manager/file/include_ref_base_file_manager.rb +88 -0
  106. data/lib/r2-oas/schema/v3/manager/file/path_item_file_manager.rb +22 -0
  107. data/lib/r2-oas/schema/v3/manager/file_manager.rb +12 -0
  108. data/lib/r2-oas/schema/v3/manager/pathname_manager.rb +73 -0
  109. data/lib/r2-oas/schema/v3/object/base_object.rb +65 -0
  110. data/lib/r2-oas/schema/v3/object/components/request_body_object.rb +92 -0
  111. data/lib/r2-oas/schema/v3/object/components/schema_object.rb +55 -0
  112. data/lib/r2-oas/schema/v3/object/components_object.rb +81 -0
  113. data/lib/r2-oas/schema/v3/object/external_document_object.rb +19 -0
  114. data/lib/r2-oas/schema/v3/object/info_object.rb +34 -0
  115. data/lib/r2-oas/schema/v3/object/openapi_object.rb +58 -0
  116. data/lib/r2-oas/schema/v3/object/path_item_object.rb +167 -0
  117. data/lib/r2-oas/schema/v3/object/paths_object.rb +74 -0
  118. data/lib/r2-oas/schema/v3/object/public.rb +9 -0
  119. data/lib/r2-oas/schema/v3/object/server_object.rb +21 -0
  120. data/lib/r2-oas/schema/v3/object/tag_object.rb +36 -0
  121. data/lib/r2-oas/schema/v3/squeezer.rb +29 -0
  122. data/lib/r2-oas/schema/v3/squeezer/base_squeezer.rb +37 -0
  123. data/lib/r2-oas/schema/v3/squeezer/path_squeezer.rb +28 -0
  124. data/lib/r2-oas/schema/v3/squeezer/tag_squeezer.rb +19 -0
  125. data/lib/r2-oas/shared/all.rb +3 -0
  126. data/lib/r2-oas/shared/sortable.rb +23 -0
  127. data/lib/r2-oas/task.rb +11 -0
  128. data/lib/r2-oas/task_logging.rb +39 -0
  129. data/lib/r2-oas/tasks/common.rake +26 -0
  130. data/lib/r2-oas/tasks/main.rake +117 -0
  131. data/lib/r2-oas/tasks/tool.rake +79 -0
  132. data/lib/r2-oas/tool/paths/ls.rb +15 -0
  133. data/lib/r2-oas/tool/paths/stats.rb +84 -0
  134. data/lib/r2-oas/version.rb +5 -0
  135. data/r2-oas.gemspec +56 -0
  136. metadata +373 -0
@@ -0,0 +1,582 @@
1
+ # R2-OAS
2
+
3
+ [![Build Status](https://travis-ci.org/yukihirop/r2-oas.svg?branch=master)](https://travis-ci.org/yukihirop/r2-oas)
4
+ [![Coverage Status](https://coveralls.io/repos/github/yukihirop/r2-oas/badge.svg)](https://coveralls.io/github/yukihirop/r2-oas)
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/f8c3846f350bb412fd63/maintainability)](https://codeclimate.com/github/yukihirop/r2-oas/maintainability)
6
+
7
+ Generate api docment(OpenAPI) side only from `rails` routing.
8
+
9
+ Provides a rake command to help `generate` , `view` , and `edit` OpenAPI documents.
10
+
11
+ ```bash
12
+ bundle exec rake routes:oas:docs # generate
13
+ bundle exec rake routes:oas:ui # view
14
+ bundle exec rake routes:oas:editor # edit
15
+ bundle exec rake routes:oas:monitor # monitor
16
+ bundle exec rake routes:oas:dist # distribute
17
+ bundle exec rake routes:oas:clean # clean
18
+ bundle exec rake routes:oas:analyze # analyze
19
+ bundle exec rake routes:oas:deploy # deploy
20
+ ```
21
+
22
+ ## 💎 Installation
23
+
24
+ Add this line to your application's Gemfile:
25
+
26
+ ```ruby
27
+ group :development do
28
+ gem 'r2-oas'
29
+ end
30
+ ```
31
+
32
+ And then execute:
33
+
34
+ $ bundle
35
+
36
+ Or install it yourself as:
37
+
38
+ $ gem install r2-oas
39
+
40
+ ## 🔦 Requirements
41
+
42
+ If you want to view with `Swagger UI` or edit with `Swagger Editor`, This gem needs the following:
43
+
44
+ - [`swaggerapi/swagger-ui:latest` docker image](https://hub.docker.com/r/swaggerapi/swagger-ui/)
45
+ - [`swaggerapi/swagger-editor:latest` docker image](https://hub.docker.com/r/swaggerapi/swagger-editor/)
46
+ - [`chromedriver`](http://chromedriver.chromium.org/downloads)
47
+
48
+ If you do not have it download as below.
49
+
50
+ ```
51
+ $ docker pull swaggerapi/swagger-editor:latest
52
+ $ docker pull swaggerapi/swagger-ui:latest
53
+ $ brew cask install chromedriver
54
+ ```
55
+
56
+ ## 🚀 Tutorial
57
+
58
+ After requiring a gem,
59
+
60
+ ```bash
61
+ bundle exec routes:oas:docs
62
+ bundle exec routes:oas:editor
63
+ ```
64
+
65
+ ## 📖 Usage
66
+
67
+ All settings are optional. The initial value is as follows.
68
+
69
+ In your rails project, Write `config/environments/development.rb` like that:
70
+
71
+ ```ruby
72
+ # default setting
73
+ R2OAS.configure do |config|
74
+ config.version = :v3
75
+ config.root_dir_path = "./oas_docs"
76
+ config.schema_save_dir_name = "src"
77
+ config.doc_save_file_name = "oas_doc.yml"
78
+ config.force_update_schema = false
79
+ config.use_tag_namespace = true
80
+ config.use_schema_namespace = false
81
+ config.interval_to_save_edited_tmp_schema = 15
82
+ # :dot or :underbar
83
+ config.namespace_type = :underbar
84
+ config.deploy_dir_path = "./deploy_docs"
85
+
86
+ config.server.data = [
87
+ {
88
+ url: "http://localhost:3000",
89
+ description: "localhost"
90
+ }
91
+ ]
92
+
93
+ config.swagger.configure do |swagger|
94
+ swagger.ui.image = "swaggerapi/swagger-ui"
95
+ swagger.ui.port = "8080"
96
+ swagger.ui.exposed_port = "8080/tcp"
97
+ swagger.ui.volume = "/app/swagger.json"
98
+ swagger.editor.image = "swaggerapi/swagger-editor"
99
+ swagger.editor.port = "81"
100
+ swagger.editor.exposed_port = "8080/tcp"
101
+ end
102
+
103
+ config.use_object_classes = {
104
+ info_object: R2OAS::Schema::V3::InfoObject,
105
+ paths_object: R2OAS::Schema::V3::PathsObject,
106
+ path_item_object: R2OAS::Schema::V3::PathItemObject,
107
+ external_document_object: R2OAS::Schema::V3::ExternalDocumentObject,
108
+ components_object: R2OAS::Schema::V3::ComponentsObject,
109
+ components_schema_object: R2OAS::Schema::V3::Components::SchemaObject,
110
+ components_request_body_object: R2OAS::Schema::V3::Components::RequestBodyObject
111
+ }
112
+
113
+ config.http_statuses_when_http_method = {
114
+ get: {
115
+ default: %w(200 422),
116
+ path_parameter: %w(200 404 422)
117
+ },
118
+ post: {
119
+ default: %w(201 422),
120
+ path_parameter: %w(201 404 422)
121
+ },
122
+ patch: {
123
+ default: %w(204 422),
124
+ path_parameter: %w(204 404 422)
125
+ },
126
+ put: {
127
+ default: %w(204 422),
128
+ path_parameter: %w(204 404 422)
129
+ },
130
+ delete: {
131
+ default: %w(200 422),
132
+ path_parameter: %w(200 404 422)
133
+ }
134
+ }
135
+
136
+ config.http_methods_when_generate_request_body = %w[post patch put]
137
+
138
+ config.tool.paths_stats.configure do |paths_stats|
139
+ paths_stats.month_to_turn_to_warning_color = 3
140
+ paths_stats.warning_color = :red
141
+ paths_stats.table_title_color = :yellow
142
+ paths_stats.heading_color = :yellow
143
+ paths_stats.highlight_color = :magenta
144
+ end
145
+ end
146
+ ```
147
+
148
+ You can execute the following command in the root directory of rails.
149
+
150
+ ```bash
151
+ $ # Generate docs
152
+ $ bundle exec rake routes:oas:docs # Generate docs
153
+ $ PATHS_FILE="oas_docs/schema/paths/api/v1/task.yml" bundle exec rake routes:oas:docs # Generate docs by specify unit paths
154
+
155
+ $ # Start swagger editor
156
+ $ bundle exec rake routes:oas:editor # Start swagger editor
157
+ $ PATHS_FILE="oas_docs/schema/paths/api/v1/task.yml" bundle exec rake routes:oas:editor # Start swagger editor by specify unit paths
158
+ $ # Start swagger ui
159
+ $ bundle exec rake routes:oas:ui # Start swagger ui
160
+ $ PATHS_FILE="oas_docs/schema/paths/api/v1/task.yml" bundle exec rake routes:oas:ui # Start swagger ui by specify unit paths
161
+ $ # Monitor swagger document
162
+ $ bundle exec rake routes:oas:monitor # Monitor swagger document
163
+ $ PATHS_FILE="oas_docs/schema/paths/api/v1/task.yml" bundle exec rake routes:oas:monitor # Monitor swagger by specify unit paths
164
+
165
+ $ # Analyze docs
166
+ $ OAS_FILE="~/Desktop/swagger.yml" bundle exec rake routes:oas:analyze
167
+ $ # Clean docs
168
+ $ bundle exec rake routes:oas:clean
169
+ $ # Deploy docs
170
+ $ bundle exec rake routes:oas:deploy
171
+ $ # Distribute swagger document
172
+ $ bundle exec rake routes:oas:dist
173
+ $ # Distribute swagger document
174
+ $ PATHS_FILE="oas_docs/schema/paths/api/v1/task.yml" bundle exec rake routes:oas:dist # Distribute swagger document by specify unit paths
175
+
176
+ # Display paths list
177
+ $ bundle exec rake routes:oas:paths_ls
178
+ # Display paths stats
179
+ $ bundle exec rake routes:oas:paths_stats
180
+ ```
181
+
182
+ ## 📚 More Usage
183
+
184
+ - [How to generate docs](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_GENERATE_DOCS.md)
185
+ - [How to start swagger editor](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_START_SWAGGER_EDITOR.md)
186
+ - [How to start swagger ui](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_START_SWAGGER_UI.md)
187
+ - [How to monitor swagger document](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_MONITOR_SWAGGER_DOC.md)
188
+ - [How to analyze docs](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_ANALYZE_DOCS.md)
189
+ - [How to clean docs](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_CLEAN_DOCS.md)
190
+ - [How to deploy swagger doc](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_DEPLOY_SWAGGER_DOC.md)
191
+ - [How to use tag namespace](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_USE_TAG_NAMESPACE.md)
192
+ - [How to use schema namespace](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_USE_SCHEMA_NAMESPACE.md)
193
+ - [How to use hook when generate doc](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_USE_HOOK_WHEN_GENERATE_DOC.md)
194
+ - [How to display paths list](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_DISPLAY_PATHS_LIST.md)
195
+ - [How to display paths stats](https://github.com/yukihirop/r2-oas/blob/master/docs/HOW_TO_DISPLAY_PATHS_STATS.md)
196
+
197
+ ## ❤️ Support Rails Version
198
+
199
+ - Rails (>= 4.2.5.1)
200
+
201
+ ## ❤️ Support Ruby Version
202
+
203
+ - Ruby (>= 2.3.3p222 (2016-11-21 revision 56859) [x86_64-darwin18])
204
+
205
+ ## ❤️ Support Rouging
206
+
207
+ - Rails Engine Routing
208
+ - Rails Normal Routing
209
+
210
+ ## ❤️ Support OpenAPI Schema
211
+
212
+ |version|document|
213
+ |-------|--------|
214
+ |v3|[versions/v3.md](https://github.com/yukihirop/r2-oas/blob/master/docs/versions/v3.md)|
215
+
216
+ ## ❗️ Convention over Configuration (CoC)
217
+
218
+ - `tag name` represents `controller name` and determine `paths file name`.
219
+ - For example, If `controller name` is `Api::V1::UsersController`, `tag_name` is `api/v1/user`. and `paths file name` is `api/v1/user.yml`
220
+
221
+ - `_` of `components/{schemas,requestBodies, ...} name` convert `/` when save file.
222
+ - For example, If `components/schemas name` is `Api_V1_User`, `components/schemas file name` is `api/v1/user.yml`.
223
+ - `_` is supposed to be used to express `namespace`.
224
+ - format is `Namespace1_Namespace2_Model`.
225
+
226
+ - `.` of `components/{schemas,requestBodies, ...} name` convert `/` when save file.
227
+ - For example, If `components/schemas name` is `api.v1.User`, `components/schemas file name` is `api/v1/user.yml`.
228
+ - `.` is supposed to be used to express `namespace`.
229
+ - format is `namespace1.namespace2.Model`.
230
+
231
+ ## ⚙ Configure
232
+
233
+ we explain the options that can be set.
234
+
235
+ #### basic
236
+
237
+ |option|description|default|
238
+ |------|-----------|---|
239
+ |version|OpenAPI schema version| `:v3` |
240
+ |root_dir_path|Root directory for storing products.| `"./oas_docs"` |
241
+ |schema_save_dir_name|Directory name for storing swagger schemas|`"src"`|
242
+ |doc_save_file_name|File name for storing swagger doc|`"oas_doc.yml"`|
243
+ |force_update_schema|Force update schema from routes data|`false`|
244
+ |use_tag_namespace|Use namespace for tag name|`true`|
245
+ |use_schema_namespace|Use namespace for schema name|`true`|
246
+ |interval_to_save_edited_tmp_schema|Interval(sec) to save edited tmp schema|`15`|
247
+ |http_statuses_when_http_method|Determine the response to support for each HTTP method|omission...|
248
+ |http_methods_when_generate_request_body|HTTP methods when generate requestBody|`[post put patch]`|
249
+ |namespace_type|namespace for components(schemas/requestBodies) name| `underbar` |
250
+ |deploy_dir_path|deploy directory.|`"./deploy_docs"`|
251
+
252
+ #### server
253
+
254
+ |option|children option|description|default|
255
+ |------|---------------|-----------|-------|
256
+ |server|data|Server data (url, description) |[{ url: `http://localhost:3000`, description: `localhost` }] |
257
+
258
+ #### swagger
259
+
260
+ |option|children option|grandchild option|description|default|
261
+ |------|---------------|-----------------|-----------|-------|
262
+ |swagger|ui|image|Swagger UI Docker Image|`"swaggerapi/swagger-ui"`|
263
+ |swagger|ui|port|Swagger UI Port|`"8080"`|
264
+ |swagger|ui|exposed_port|Swagger UI Exposed Port|`"8080/tcp"`|
265
+ |swagger|ui|volume|Swagger UI Volume|`"/app/swagger.json"`|
266
+ |swagger|editor|image|Swagger Editor Docker Image|`"swaggerapi/swagger-editor"`|
267
+ |swagger|editor|port|Swagger Editor Port|`"8080"`|
268
+ |swagger|editor|exposed_port|Swagger Editor Exposed Port|`"8080/tcp"`|
269
+
270
+ #### hook
271
+
272
+ |option|description|default|
273
+ |------|-----------|-------|
274
+ |use_object_classes|Object class(hook class) to generate Openapi document|{ info_object: `R2OAS::Schema::V3::InfoObject`,<br>paths_object: `R2OAS::Schema::V3::PathsObject`,<br>path_item_object: `R2OAS::Schema::V3::PathItemObject`, external_document_object: `R2OAS::Schema::V3::ExternalDocumentObject`,<br> components_object: `R2OAS::Schema::V3::ComponentsObject`,<br> components_schema_object: `R2OAS::Schema::V3::Components::SchemaObject`, <br> components_request_body_object:`R2OAS::Schema::V3::Components::RequestBodyObject` }|
275
+
276
+ #### tool
277
+
278
+ |option|children option|grandchild option|description|default|
279
+ |------|---------------|-----------------|-----------|-------|
280
+ |tool|paths_stats|month_to_turn_to_warning_color|Elapsed month to issue a warning|`3`|
281
+ |tool|paths_stats|warning_color|Warning Color|`:red`|
282
+ |tool|paths_stats|table_title_color|Table Title Color|`:yellow`|
283
+ |tool|paths_stats|heading_color|Heading Color|`:yellow`|
284
+ |tool|paths_stats|highlight_color|Highlight Color|`:magenta`|
285
+
286
+ Please refer to [here](https://github.com/janlelis/paint) for the color.
287
+
288
+ ## Environment variables
289
+
290
+ We explain the environment variables that can be set.
291
+
292
+ |variable|description|default|
293
+ |--------|-----------|-------|
294
+ |PATHS_FILE|Specify one paths file path|`""`|
295
+ |OAS_FILE|Specify swagger file path to analyze|`""`|
296
+
297
+
298
+ ## .paths
299
+
300
+ Writing file paths in .paths will only read them.
301
+ You can comment out with `#`
302
+
303
+ `oas_docs/.paths`
304
+
305
+ ```
306
+ #account_user_role.yml # ignore
307
+ account.yml
308
+ account.yml # ignore
309
+ account.yml # ignore
310
+ ```
311
+
312
+ ## 💊 Life Cycle Methods (Hook Metohds)
313
+
314
+ Supported hook(life cycle methods) is like this:
315
+
316
+ - `before_create`
317
+ - `after_create`
318
+
319
+ Supported Hook class is like this:
320
+
321
+ - `R2OAS::Schema::V3::InfoObject`
322
+ - `R2OAS::Schema::V3::PathsObject`
323
+ - `R2OAS::Schema::V3::PathItemObject`
324
+ - `R2OAS::Schema::V3::ExternalDocumentObject`
325
+ - `R2OAS::Schema::V3::ComponentsObject`
326
+ - `R2OAS::Schema::V3::Components::SchemaObject`
327
+ - `R2OAS::Schema::V3::Components::RequestBodyObject`
328
+
329
+ By inheriting these classes, you can hook them at the time of document generation by writing like this:
330
+
331
+ #### case: InfoObject
332
+
333
+ ```ruby
334
+ class CustomInfoObject < R2OAS::Schema::V3::InfoObject
335
+ before_create do |doc|
336
+ # [Important] Please change doc destructively.
337
+ # [Important] To be able to use methods in Rails !
338
+ doc.merge!({
339
+ # Something ....
340
+ })
341
+ end
342
+
343
+ after_create do |doc, path|
344
+ # [Important] Please change doc destructively.
345
+ # [Important] To be able to use methods in Rails !
346
+ doc.merge!({
347
+ # Something ....
348
+ })
349
+ end
350
+ end
351
+ ```
352
+
353
+ #### case: PathsObject
354
+
355
+ ```ruby
356
+ class CustomPathsObject < R2OAS::Schema::V3::PathsObject
357
+ before_create do |doc|
358
+ # [Important] Please change doc destructively.
359
+ # [Important] To be able to use methods in Rails !
360
+ doc.merge!({
361
+ # Something ....
362
+ })
363
+ end
364
+
365
+ after_create do |doc|
366
+ # [Important] Please change doc destructively.
367
+ # [Important] To be able to use methods in Rails !
368
+ doc.merge!({
369
+ # Something ....
370
+ })
371
+ end
372
+ end
373
+ ```
374
+
375
+ #### case: PathItemObject
376
+
377
+ ```ruby
378
+ class CustomPathItemObject < R2OAS::Schema::V3::PathItemObject
379
+ before_create do |doc, path|
380
+ # [Important] Please change doc destructively.
381
+ # [Important] To be able to use methods in Rails !
382
+ doc.merge!({
383
+ # Something ....
384
+ })
385
+ end
386
+
387
+ after_create do |doc, schema_name|
388
+ # [Important] Please change doc destructively.
389
+ # [Important] To be able to use methods in Rails !
390
+ doc.merge!({
391
+ # Something ....
392
+ })
393
+ end
394
+ end
395
+ ```
396
+
397
+ #### case: ExternalDocumentObject
398
+
399
+ ```ruby
400
+ class CustomExternalDocumentObject < R2OAS::Schema::V3::ExternalDocumentObject
401
+ before_create do |doc|
402
+ # [Important] Please change doc destructively.
403
+ # [Important] To be able to use methods in Rails !
404
+ doc.merge!({
405
+ # Something ....
406
+ })
407
+ end
408
+
409
+ after_create do |doc|
410
+ # [Important] Please change doc destructively.
411
+ # [Important] To be able to use methods in Rails !
412
+ doc.merge!({
413
+ # Something ....
414
+ })
415
+ end
416
+ end
417
+ ```
418
+
419
+ #### case: ComponentsObject
420
+
421
+ ```ruby
422
+ class CustomComponentsObject < R2OAS::Schema::V3::ComponentsObject
423
+ before_create do |doc|
424
+ # [Important] Please change doc destructively.
425
+ # [Important] To be able to use methods in Rails !
426
+ doc.merge!({
427
+ # Something ....
428
+ })
429
+ end
430
+
431
+ after_create do |doc|
432
+ # [Important] Please change doc destructively.
433
+ # [Important] To be able to use methods in Rails !
434
+ doc.merge!({
435
+ # Something ....
436
+ })
437
+ end
438
+ end
439
+ ```
440
+
441
+ #### case: Components::SchemaObject
442
+
443
+ ```ruby
444
+ class CustomComponentsSchemaObject < R2OAS::Schema::V3::Components::SchemaObject
445
+ before_create do |doc, schema_name|
446
+ # [Important] Please change doc destructively.
447
+ # [Important] To be able to use methods in Rails !
448
+ doc.merge!({
449
+ # Something ....
450
+ })
451
+ end
452
+
453
+ after_create do |doc, schema_name|
454
+ # [Important] Please change doc destructively.
455
+ # [Important] To be able to use methods in Rails !
456
+ doc.merge!({
457
+ # Something ....
458
+ })
459
+ end
460
+ end
461
+ ```
462
+
463
+ If you want to determine the component schema name at runtime, like this:
464
+
465
+ ```ruby
466
+ class CustomComponentsSchemaObject < R2OAS::Schema::V3::Components::SchemaObject
467
+ def components_schema_name(doc, path_component, tag_name, verb, http_status, schema_name)
468
+ # [Important] Please return string.
469
+ # default
470
+ schema_name
471
+ end
472
+ end
473
+ ```
474
+
475
+ `path_component` is `R2OAS::Routing::PathComponent` instance.
476
+
477
+ ```ruby
478
+ module R2OAS
479
+ module Routing
480
+ class PathComponent < BaseComponent
481
+ def initialize(path)
482
+ def to_s
483
+ def symbol_to_brace
484
+ def path_parameters_data
485
+ def path_excluded_path_parameters
486
+ def exist_path_parameters?
487
+ def path_parameters
488
+ private
489
+ def without_format
490
+ ```
491
+
492
+ #### case: Components::RequestBodyObject
493
+
494
+ ```ruby
495
+ class CustomComponentsRequestBodyObject < R2OAS::Schema::V3::Components::RequestBodyObject
496
+ before_create do |doc, schema_name|
497
+ # [Important] Please change doc destructively.
498
+ # [Important] To be able to use methods in Rails !
499
+ doc.merge!({
500
+ # Something ....
501
+ })
502
+ end
503
+
504
+ after_create do |doc, schema_name|
505
+ # [Important] Please change doc destructively.
506
+ # [Important] To be able to use methods in Rails !
507
+ doc.merge!({
508
+ # Something ....
509
+ })
510
+ end
511
+ end
512
+ ```
513
+
514
+ If you want to determine the component schema name at runtime, like this:
515
+
516
+ ```ruby
517
+ class CustomComponentsRequestBodyObject < R2OAS::Schema::V3::Components::RequestBodyObject
518
+ def components_request_body_name(doc, path_component, tag_name, verb, schema_name)
519
+ # [Important] Please return string.
520
+ # default
521
+ schema_name
522
+ end
523
+
524
+ def components_schema_name(doc, path_component, tag_name, verb, schema_name)
525
+ # [Important] Please return string.
526
+ # default
527
+ schema_name
528
+ end
529
+ end
530
+ ```
531
+
532
+ And write this to the configuration.
533
+
534
+ ```ruby
535
+ # If only InfoObject and PathItemObject, use a custom class
536
+ R2OAS.configure do |config|
537
+ #
538
+ # omission ...
539
+ #
540
+ config.use_object_classes.merge!({
541
+ info_object: CustomInfoObject,
542
+ path_item_object: CustomPathItemObject
543
+ })
544
+ end
545
+ ```
546
+
547
+ This is the end.
548
+
549
+ ## 🔩 CORS
550
+
551
+ Use [rack-cors](https://github.com/cyu/rack-cors) to enable CORS.
552
+
553
+ ```ruby
554
+ require 'rack/cors'
555
+ use Rack::Cors do
556
+ allow do
557
+ origins '*'
558
+ resource '*', headers: :any, methods: [ :get, :post, :put, :delete, :options ]
559
+ end
560
+ end
561
+ ```
562
+
563
+ Alternatively you can set CORS headers in a `before` block.
564
+
565
+ ```ruby
566
+ before do
567
+ header['Access-Control-Allow-Origin'] = '*'
568
+ header['Access-Control-Request-Method'] = '*'
569
+ end
570
+ ```
571
+
572
+ ## 📝 License
573
+
574
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
575
+
576
+ ## 🤝 Contributing
577
+
578
+ 1. Fork it ( http://github.com/yukihirop/r2-oas/fork )
579
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
580
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
581
+ 4. Push to the branch (`git push origin my-new-feature`)
582
+ 5. Create new Pull Request