r2-oas 0.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.
Files changed (136) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +99 -0
  3. data/GEMSPEC.md +20 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.ja.md +271 -0
  6. data/README.md +271 -0
  7. data/lib/r2-oas.rb +35 -0
  8. data/lib/r2-oas/app_configuration.rb +121 -0
  9. data/lib/r2-oas/app_configuration/deprecation.rb +28 -0
  10. data/lib/r2-oas/app_configuration/server.rb +35 -0
  11. data/lib/r2-oas/app_configuration/swagger.rb +35 -0
  12. data/lib/r2-oas/app_configuration/swagger/editor.rb +47 -0
  13. data/lib/r2-oas/app_configuration/swagger/ui.rb +45 -0
  14. data/lib/r2-oas/app_configuration/tool.rb +31 -0
  15. data/lib/r2-oas/app_configuration/tool/paths/stats.rb +43 -0
  16. data/lib/r2-oas/base.rb +48 -0
  17. data/lib/r2-oas/configuration.rb +121 -0
  18. data/lib/r2-oas/configuration/paths_config.rb +44 -0
  19. data/lib/r2-oas/deploy/client.rb +70 -0
  20. data/lib/r2-oas/deploy/swagger-ui/index.html.erb +60 -0
  21. data/lib/r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object.rb +100 -0
  22. data/lib/r2-oas/errors.rb +13 -0
  23. data/lib/r2-oas/hooks/global_hook.rb +20 -0
  24. data/lib/r2-oas/hooks/hook.rb +79 -0
  25. data/lib/r2-oas/hooks/repository.rb +15 -0
  26. data/lib/r2-oas/lib/core_ext/hash/deep_merge.rb +44 -0
  27. data/lib/r2-oas/lib/core_ext/object/blank.rb +135 -0
  28. data/lib/r2-oas/lib/three-way-merge/twm.rb +83 -0
  29. data/lib/r2-oas/logger/stdout_logger.rb +129 -0
  30. data/lib/r2-oas/pluggable_configuration.rb +36 -0
  31. data/lib/r2-oas/plugin/base.rb +44 -0
  32. data/lib/r2-oas/plugin/executor.rb +148 -0
  33. data/lib/r2-oas/plugin/hookable.rb +42 -0
  34. data/lib/r2-oas/plugin/public.rb +3 -0
  35. data/lib/r2-oas/plugin/transform/transform.rb +10 -0
  36. data/lib/r2-oas/plugin/transform/v3/transform.rb +20 -0
  37. data/lib/r2-oas/plugin/transform/v3/visitable.rb +37 -0
  38. data/lib/r2-oas/public.rb +5 -0
  39. data/lib/r2-oas/routing/adjustor.rb +44 -0
  40. data/lib/r2-oas/routing/base.rb +12 -0
  41. data/lib/r2-oas/routing/components/all.rb +5 -0
  42. data/lib/r2-oas/routing/components/base_component.rb +10 -0
  43. data/lib/r2-oas/routing/components/path_component.rb +67 -0
  44. data/lib/r2-oas/routing/components/request_component.rb +75 -0
  45. data/lib/r2-oas/routing/components/verb_component.rb +21 -0
  46. data/lib/r2-oas/routing/parser.rb +93 -0
  47. data/lib/r2-oas/schema/analyzer.rb +23 -0
  48. data/lib/r2-oas/schema/base.rb +11 -0
  49. data/lib/r2-oas/schema/builder.rb +23 -0
  50. data/lib/r2-oas/schema/cleaner.rb +23 -0
  51. data/lib/r2-oas/schema/editor.rb +146 -0
  52. data/lib/r2-oas/schema/generator.rb +23 -0
  53. data/lib/r2-oas/schema/manager/file/path_item_file_manager.rb +24 -0
  54. data/lib/r2-oas/schema/manager/file_manager.rb +26 -0
  55. data/lib/r2-oas/schema/monitor.rb +52 -0
  56. data/lib/r2-oas/schema/squeezer.rb +23 -0
  57. data/lib/r2-oas/schema/ui.rb +73 -0
  58. data/lib/r2-oas/schema/v3/analyzer.rb +58 -0
  59. data/lib/r2-oas/schema/v3/analyzer/base_analyzer.rb +71 -0
  60. data/lib/r2-oas/schema/v3/analyzer/components/object_analyzer.rb +38 -0
  61. data/lib/r2-oas/schema/v3/analyzer/components_analyzer.rb +30 -0
  62. data/lib/r2-oas/schema/v3/analyzer/path_analyzer.rb +116 -0
  63. data/lib/r2-oas/schema/v3/analyzer/tag_analyzer.rb +38 -0
  64. data/lib/r2-oas/schema/v3/base.rb +28 -0
  65. data/lib/r2-oas/schema/v3/builder.rb +28 -0
  66. data/lib/r2-oas/schema/v3/builder/base_builder.rb +72 -0
  67. data/lib/r2-oas/schema/v3/builder/doc_builder.rb +51 -0
  68. data/lib/r2-oas/schema/v3/cleaner.rb +19 -0
  69. data/lib/r2-oas/schema/v3/cleaner/base_cleaner.rb +30 -0
  70. data/lib/r2-oas/schema/v3/cleaner/components_cleaner.rb +42 -0
  71. data/lib/r2-oas/schema/v3/generator.rb +24 -0
  72. data/lib/r2-oas/schema/v3/generator/base_generator.rb +122 -0
  73. data/lib/r2-oas/schema/v3/generator/components/object_generator.rb +64 -0
  74. data/lib/r2-oas/schema/v3/generator/components/request_body_generator.rb +45 -0
  75. data/lib/r2-oas/schema/v3/generator/components_generator.rb +38 -0
  76. data/lib/r2-oas/schema/v3/generator/doc_generator.rb +115 -0
  77. data/lib/r2-oas/schema/v3/generator/path_generator.rb +78 -0
  78. data/lib/r2-oas/schema/v3/generator/schema_generator.rb +58 -0
  79. data/lib/r2-oas/schema/v3/manager/diff/base_array_diff_manager.rb +60 -0
  80. data/lib/r2-oas/schema/v3/manager/diff/base_diff_manager.rb +29 -0
  81. data/lib/r2-oas/schema/v3/manager/diff/base_hash_diff_manager.rb +95 -0
  82. data/lib/r2-oas/schema/v3/manager/diff/components_diff_manager.rb +19 -0
  83. data/lib/r2-oas/schema/v3/manager/diff/tag_diff_manager.rb +17 -0
  84. data/lib/r2-oas/schema/v3/manager/file/base_file_manager.rb +66 -0
  85. data/lib/r2-oas/schema/v3/manager/file/components_file_manager.rb +22 -0
  86. data/lib/r2-oas/schema/v3/manager/file/include_ref_base_file_manager.rb +89 -0
  87. data/lib/r2-oas/schema/v3/manager/file/path_item_file_manager.rb +22 -0
  88. data/lib/r2-oas/schema/v3/manager/file_manager.rb +12 -0
  89. data/lib/r2-oas/schema/v3/manager/pathname_manager.rb +78 -0
  90. data/lib/r2-oas/schema/v3/object/from_files/base_object.rb +62 -0
  91. data/lib/r2-oas/schema/v3/object/from_files/components/request_body_object.rb +103 -0
  92. data/lib/r2-oas/schema/v3/object/from_files/components/schema_object.rb +102 -0
  93. data/lib/r2-oas/schema/v3/object/from_files/components_object.rb +46 -0
  94. data/lib/r2-oas/schema/v3/object/from_files/external_document_object.rb +23 -0
  95. data/lib/r2-oas/schema/v3/object/from_files/info_object.rb +23 -0
  96. data/lib/r2-oas/schema/v3/object/from_files/openapi_object.rb +61 -0
  97. data/lib/r2-oas/schema/v3/object/from_files/path_item_object.rb +110 -0
  98. data/lib/r2-oas/schema/v3/object/from_files/paths_object.rb +33 -0
  99. data/lib/r2-oas/schema/v3/object/from_files/utils/all.rb +4 -0
  100. data/lib/r2-oas/schema/v3/object/from_files/utils/deep_methods.rb +27 -0
  101. data/lib/r2-oas/schema/v3/object/from_files/utils/refs.rb +151 -0
  102. data/lib/r2-oas/schema/v3/object/from_routes/base_object.rb +75 -0
  103. data/lib/r2-oas/schema/v3/object/from_routes/components/request_body_object.rb +96 -0
  104. data/lib/r2-oas/schema/v3/object/from_routes/components/schema_object.rb +59 -0
  105. data/lib/r2-oas/schema/v3/object/from_routes/components_object.rb +81 -0
  106. data/lib/r2-oas/schema/v3/object/from_routes/external_document_object.rb +28 -0
  107. data/lib/r2-oas/schema/v3/object/from_routes/info_object.rb +43 -0
  108. data/lib/r2-oas/schema/v3/object/from_routes/openapi_object.rb +59 -0
  109. data/lib/r2-oas/schema/v3/object/from_routes/path_item_object.rb +175 -0
  110. data/lib/r2-oas/schema/v3/object/from_routes/paths_object.rb +77 -0
  111. data/lib/r2-oas/schema/v3/object/from_routes/public.rb +9 -0
  112. data/lib/r2-oas/schema/v3/object/from_routes/server_object.rb +21 -0
  113. data/lib/r2-oas/schema/v3/object/from_routes/tag_object.rb +37 -0
  114. data/lib/r2-oas/schema/v3/object/store.rb +54 -0
  115. data/lib/r2-oas/schema/v3/squeezer.rb +29 -0
  116. data/lib/r2-oas/schema/v3/squeezer/base_squeezer.rb +37 -0
  117. data/lib/r2-oas/schema/v3/squeezer/path_squeezer.rb +28 -0
  118. data/lib/r2-oas/schema/v3/squeezer/tag_squeezer.rb +19 -0
  119. data/lib/r2-oas/shared/all.rb +4 -0
  120. data/lib/r2-oas/shared/callable.rb +17 -0
  121. data/lib/r2-oas/shared/sortable.rb +23 -0
  122. data/lib/r2-oas/store.rb +122 -0
  123. data/lib/r2-oas/support/deprecation.rb +24 -0
  124. data/lib/r2-oas/support/deprecation/behavior.rb +21 -0
  125. data/lib/r2-oas/support/deprecation/instance_delegator.rb +42 -0
  126. data/lib/r2-oas/support/deprecation/reporting.rb +91 -0
  127. data/lib/r2-oas/task.rb +11 -0
  128. data/lib/r2-oas/task_logging.rb +41 -0
  129. data/lib/r2-oas/tasks/common.rake +25 -0
  130. data/lib/r2-oas/tasks/main.rake +132 -0
  131. data/lib/r2-oas/tasks/tool.rake +86 -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 +48 -0
  136. metadata +415 -0
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
4
+ require_relative 'components/schema_object'
5
+ require_relative 'components/request_body_object'
6
+
7
+ module R2OAS
8
+ module Schema
9
+ module V3
10
+ class ComponentsObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
11
+ def initialize(routes_data, opts = {})
12
+ super(opts)
13
+ @routes_data = routes_data
14
+ end
15
+
16
+ def create_doc
17
+ create_doc_for_components_schemas!
18
+ create_doc_for_components_request_bodies!
19
+ end
20
+
21
+ private
22
+
23
+ def create_doc_for_components_schemas!
24
+ result = components_schema_docs.each_with_object({}) do |(schema_name, components_schema_doc), docs|
25
+ docs[schema_name] = components_schema_doc
26
+ end
27
+ doc.merge!('schemas' => result)
28
+ end
29
+
30
+ def create_doc_for_components_request_bodies!
31
+ result = components_request_body_docs.each_with_object({}) do |(schema_name, components_request_body_doc), docs|
32
+ docs[schema_name] = components_request_body_doc
33
+ end
34
+ doc.merge!('requestBodies' => result)
35
+ end
36
+
37
+ # e.x.)
38
+ # [
39
+ # { path: "/tasks", data: {:verb=>"get", :path=>"/tasks", :tag_name=>"task" } },
40
+ # ]
41
+ def components_schema_docs
42
+ @routes_data.each_with_object({}) do |(route_el), data|
43
+ path = route_el[:path]
44
+ route_data = route_el[:data]
45
+
46
+ path_item_object = path_item_object_class.new(route_data, path, @opts)
47
+ path_item_object.http_statuses.each do |http_status|
48
+ components_schema_object = components_schema_object_class.new(route_data, path, @opts)
49
+ components_schema_doc = components_schema_object.to_doc
50
+ schema_name = components_schema_object.send(:_components_schema_name, http_status)
51
+
52
+ if data[schema_name].present?
53
+ data[schema_name].merge!(components_schema_doc)
54
+ else
55
+ data[schema_name] = components_schema_doc
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ def components_request_body_docs
62
+ @routes_data.each_with_object({}) do |(route_el), data|
63
+ path = route_el[:path]
64
+ route_data = route_el[:data]
65
+
66
+ components_request_body_object = components_request_body_object_class.new(route_data, path, @opts)
67
+ next unless components_request_body_object.generate?
68
+
69
+ components_request_body_doc = components_request_body_object.to_doc
70
+ schema_name = components_request_body_object.send(:_components_request_body_name)
71
+ if data[schema_name].present?
72
+ data[schema_name].merge!(components_request_body_doc)
73
+ else
74
+ data[schema_name] = components_request_body_doc
75
+ end
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
4
+
5
+ module R2OAS
6
+ module Schema
7
+ module V3
8
+ class ExternalDocumentObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
9
+ def to_doc
10
+ execute_before_create
11
+ create_doc
12
+ execute_after_create
13
+ doc
14
+ end
15
+
16
+ private
17
+
18
+ def create_doc
19
+ result = {
20
+ 'description' => '',
21
+ 'url' => ''
22
+ }
23
+ doc.merge!(result)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
4
+
5
+ module R2OAS
6
+ module Schema
7
+ module V3
8
+ class InfoObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
9
+ def to_doc
10
+ execute_before_create
11
+ create_doc
12
+ execute_after_create
13
+ doc
14
+ end
15
+
16
+ private
17
+
18
+ def create_doc
19
+ result = {
20
+ 'title' => 'OAS API Document Title',
21
+ 'description' => "This is a sample server Petstore server. You can find out more about
22
+ Swagger at [http://swagger.io](http://swagger.io) or on [irc.freenode.net,
23
+ #swagger](http://swagger.io/irc/). For this sample, you can use the api key
24
+ `special-key` to test the authorization filters.",
25
+ 'termsOfService' => 'http://swagger.io/terms/',
26
+ # Contact Object
27
+ 'contact' => {
28
+ 'name' => '',
29
+ 'url' => ''
30
+ },
31
+ # License Object
32
+ 'license' => {
33
+ 'name' => '',
34
+ 'url' => ''
35
+ },
36
+ 'version' => '1.0.0'
37
+ }
38
+ doc.merge!(result)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_object'
4
+ require_relative 'tag_object'
5
+ require_relative 'server_object'
6
+
7
+ module R2OAS
8
+ module Schema
9
+ module V3
10
+ class OpenapiObject < BaseObject
11
+ def initialize(routes_data, tags_data, schemas_data, opts = {})
12
+ super(opts)
13
+ @routes_data = routes_data
14
+ @tags_data = tags_data
15
+ @schemas_data = schemas_data
16
+ end
17
+
18
+ def to_doc
19
+ result = {
20
+ 'openapi' => '3.0.0',
21
+ 'info' => info_doc,
22
+ 'tags' => tags_doc,
23
+ 'paths' => paths_doc,
24
+ 'externalDocs' => external_docs_doc,
25
+ 'servers' => servers_doc,
26
+ 'components' => components_doc
27
+ }
28
+ result
29
+ end
30
+
31
+ private
32
+
33
+ def info_doc
34
+ info_object_class.new(@opts).to_doc
35
+ end
36
+
37
+ def tags_doc
38
+ TagObject.new(@tags_data, @opts).to_doc
39
+ end
40
+
41
+ def paths_doc
42
+ paths_object_class.new(@routes_data, @opts).to_doc
43
+ end
44
+
45
+ def external_docs_doc
46
+ external_document_object_class.new(@opts).to_doc
47
+ end
48
+
49
+ def servers_doc
50
+ ServerObject.new(@opts).to_doc
51
+ end
52
+
53
+ def components_doc
54
+ components_object_class.new(@routes_data, @opts).to_doc
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,175 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
5
+ require 'r2-oas/routing/components/path_component'
6
+
7
+ module R2OAS
8
+ module Schema
9
+ module V3
10
+ class PathItemObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
11
+ extend Forwardable
12
+ # reference
13
+ # https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#path-item-object
14
+ # Support Field Name: get, put, post, delete, patch
15
+ SUPPORT_FIELD_NAME = %w[get put post delete patch].freeze
16
+
17
+ def_delegators :@http_status_manager, :http_statuses
18
+
19
+ def initialize(route_data, path, opts = {})
20
+ super(opts)
21
+ @path_comp = Routing::PathComponent.new(path)
22
+ @path = @path_comp.symbol_to_brace
23
+ @route_data = route_data
24
+ @verb = route_data[:verb]
25
+ @tag_name = route_data[:tag_name]
26
+ @schema_name = route_data[:schema_name]
27
+ @required_parameters = route_data[:required_parameters]
28
+ @format_name = create_format_name
29
+ @http_status_manager = HttpStatusManager.new(@path, @verb, http_statuses_when_http_method)
30
+ @components_schema_object = components_schema_object_class.new(route_data, path, opts)
31
+ @components_request_body_object = components_request_body_object_class.new(route_data, path, opts)
32
+ support_field_name? if route_data.key?(:verb)
33
+ end
34
+
35
+ def to_doc
36
+ execute_before_create(@path)
37
+ create_doc
38
+ execute_after_create(@path)
39
+ doc
40
+ end
41
+
42
+ def create_doc
43
+ result = { @verb.to_s => data_when_verb }
44
+ attach_request_body!(result)
45
+ attach_media_type!(result)
46
+ attach_parameters!(result)
47
+ doc.merge!(result)
48
+ end
49
+
50
+ private
51
+
52
+ def data_when_verb
53
+ result = {
54
+ 'tags' => [@tag_name.to_s],
55
+ 'summary' => "#{@verb} summary",
56
+ 'description' => "#{@verb} description",
57
+ # Response Object
58
+ 'responses' => {},
59
+ 'deprecated' => false
60
+ }
61
+ result['responses'].deep_merge!(responses_when_http_status)
62
+ result
63
+ end
64
+
65
+ def responses_when_http_status
66
+ http_statuses.each_with_object({}) do |http_status, result|
67
+ if ignored_http_statuses_when_generate_component_schema.include?(http_status)
68
+ result.deep_merge!(
69
+ http_status => {
70
+ 'description' => "#{@tag_name} description"
71
+ }
72
+ )
73
+ else
74
+ result.deep_merge!(
75
+ http_status => {
76
+ 'description' => "#{@tag_name} description",
77
+ 'content' => {
78
+ 'application/json' => {
79
+ 'schema' => {
80
+ '$ref' => "#/components/schemas/#{_components_schema_name(http_status)}"
81
+ }
82
+ }
83
+ }
84
+ }
85
+ )
86
+ end
87
+ end
88
+ end
89
+
90
+ def _components_schema_name(http_status)
91
+ @components_schema_object.send(:_components_schema_name, http_status)
92
+ end
93
+
94
+ def _components_request_body_name
95
+ @components_request_body_object.send(:_components_request_body_name)
96
+ end
97
+
98
+ def create_format_name
99
+ format_name = @route_data[:format_name]
100
+ if format_name.blank?
101
+ ''
102
+ else
103
+ "application/#{format_name}"
104
+ end
105
+ end
106
+
107
+ def attach_request_body!(schema)
108
+ return schema unless @components_request_body_object.generate?
109
+
110
+ merge_schema = {
111
+ '$ref' => "#/components/requestBodies/#{_components_request_body_name}"
112
+ }
113
+ schema[@verb.to_s]['requestBody'] = {}
114
+ schema[@verb.to_s]['requestBody'].deep_merge!(merge_schema)
115
+ schema
116
+ end
117
+
118
+ def attach_media_type!(schema)
119
+ return schema if @format_name.blank?
120
+
121
+ merge_schema = {
122
+ '200' => {
123
+ 'description' => 'responses description',
124
+ 'content' => {
125
+ @format_name.to_s => {}
126
+ }
127
+ }
128
+ }
129
+ schema[@verb.to_s]['responses'].deep_merge!(merge_schema)
130
+ schema
131
+ end
132
+
133
+ def attach_parameters!(schema)
134
+ return schema if @required_parameters.blank?
135
+
136
+ content = @required_parameters.each_with_object([]) do |(parameter_name, parameter_data), result|
137
+ result.push(
138
+ 'name' => parameter_name.to_s,
139
+ 'in' => 'path',
140
+ 'description' => parameter_name.to_s,
141
+ 'required' => true,
142
+ 'schema' => {
143
+ 'type' => parameter_data[:type]
144
+ }
145
+ )
146
+ end
147
+
148
+ merge_schema = {
149
+ 'parameters' => content
150
+ }
151
+
152
+ schema[@verb.to_s].deep_merge!(merge_schema)
153
+ schema
154
+ end
155
+
156
+ def support_field_name?
157
+ raise "Invalid filed name #{field_name}" unless SUPPORT_FIELD_NAME.include?(@verb)
158
+ end
159
+
160
+ class HttpStatusManager
161
+ def initialize(path, verb, http_statuses_when_http_method)
162
+ @path_comp = Routing::PathComponent.new(path)
163
+ @verb = verb
164
+ @http_statuses_when_http_method = http_statuses_when_http_method
165
+ end
166
+
167
+ def http_statuses
168
+ key = @path_comp.exist_path_parameters? ? :path_parameter : :default
169
+ @http_statuses_when_http_method[@verb.to_sym][key]
170
+ end
171
+ end
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
4
+ require 'r2-oas/routing/components/path_component'
5
+
6
+ module R2OAS
7
+ module Schema
8
+ module V3
9
+ class PathsObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
10
+ def initialize(routes_data, opts = {})
11
+ super(opts)
12
+ @routes_data = routes_data
13
+ define_hookable_tmp_object_class
14
+ end
15
+
16
+ def create_doc
17
+ if unit_paths_file_path.present?
18
+ unit_paths_data = YAML.load_file(unit_paths_file_path)['paths']
19
+ result = unit_paths_data.each_with_object({}) do |(path, path_item_doc), docs|
20
+ docs[path] = HookableTmpObjectClass.new(path_item_doc, path, @opts).to_doc
21
+ end
22
+ else
23
+ result = path_item_docs.each_with_object({}) do |(path, path_item_doc), docs|
24
+ docs[path] = path_item_doc
25
+ end
26
+ end
27
+ doc.merge!(result)
28
+ end
29
+
30
+ private
31
+
32
+ def define_hookable_tmp_object_class
33
+ klass = Class.new(path_item_object_class) do |_c|
34
+ def initialize(data, path, opts = {})
35
+ super(opts)
36
+ @data = data
37
+ @path = path
38
+ @path_comp = Routing::PathComponent.new(path)
39
+ use_superclass_hook
40
+ end
41
+
42
+ def create_doc
43
+ doc.merge!(@data)
44
+ end
45
+
46
+ def to_doc
47
+ execute_before_create(@path)
48
+ create_doc
49
+ execute_after_create(@path)
50
+ execute_transform_plugins(:path_item, doc, @path_comp)
51
+ doc
52
+ end
53
+ end
54
+ Object.const_set(:HookableTmpObjectClass, klass) unless defined?(HookableTmpObjectClass)
55
+ end
56
+
57
+ def path_item_docs
58
+ # e.x.)
59
+ # [
60
+ # { path: "/tasks", data: {:verb=>"get", :path=>"/tasks", :tag_name=>"task" } },
61
+ # ]
62
+ @routes_data.each_with_object({}) do |(route_el), data|
63
+ path = route_el[:path]
64
+ route_data = route_el[:data]
65
+
66
+ path_item_doc = path_item_object_class.new(route_data, path, @opts).to_doc
67
+ if data[path].present?
68
+ data[path].merge!(path_item_doc)
69
+ else
70
+ data[path] = path_item_doc
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end