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,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_component'
4
+
5
+ module R2OAS
6
+ module Routing
7
+ class RequestComponent < BaseComponent
8
+ def initialize(request, is_route_engine)
9
+ super()
10
+ @request = request
11
+ @is_route_engine = is_route_engine
12
+ end
13
+
14
+ # e.x.) "tasks#index" => "task"
15
+ # e.x.) "RailsAdmin::Engine" => "rails_amin/engine"
16
+ def to_tag_name
17
+ tag_name = if @is_route_engine
18
+ @request.gsub('::', '/').underscore
19
+ else
20
+ @request.split('#').first.singularize
21
+ end
22
+
23
+ tag_name = tag_name.split('/').last unless use_tag_namespace
24
+
25
+ tag_name
26
+ end
27
+
28
+ def to_schema_name
29
+ if @is_route_engine
30
+ schema_name = @request.split('::').map(&:camelcase).join(ns_div)
31
+ else
32
+ # e.x.) @request = "api/v2/posts#index {:format=>:json}"
33
+ # e.x.) path = "api/v2/post"
34
+ path = @request.split('#').first.singularize
35
+ schema_name = path.split('/').map(&:camelcase).join(ns_div)
36
+ end
37
+
38
+ if use_schema_namespace
39
+ schema_name_only = schema_name.split(ns_div).last
40
+ namespace = adjust_namespace(schema_name.split(ns_div)[0..-2].join(ns_div))
41
+
42
+ if namespace.present?
43
+ [namespace, schema_name_only].join(ns_div)
44
+ else
45
+ schema_name_only
46
+ end
47
+ else
48
+ schema_name.split(ns_div).last
49
+ end
50
+ end
51
+
52
+ # e.x.) "tasks#index { :format => ":json" }"
53
+ def to_format_name
54
+ result = ''
55
+ @request.match(/{\:format=>:(?<format_name>.*)}/) do |md|
56
+ result = md[:format_name] if md[:format_name]
57
+ end
58
+ result
59
+ end
60
+
61
+ private
62
+
63
+ def adjust_namespace(namespace)
64
+ case namespace_type
65
+ when :dot
66
+ namespace.downcase
67
+ when :underbar
68
+ namespace
69
+ else
70
+ raise "Do not support #{namespace_type}"
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_component'
4
+
5
+ module R2OAS
6
+ module Routing
7
+ class VerbComponent < BaseComponent
8
+ def initialize(verb)
9
+ super()
10
+ @verb = verb
11
+ end
12
+
13
+ # e.x.) "" => ["get"]
14
+ # e.x.) "POST" => ["post"]
15
+ # e.x.) "GET|POST" => ["get","post"]
16
+ def verbs
17
+ (@verb.downcase.presence || 'get').split('|')
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'adjustor'
4
+ require_relative 'base'
5
+
6
+ module R2OAS
7
+ module Routing
8
+ class Parser
9
+ # routes should be Rails.application.routes.routes
10
+ def initialize(routes)
11
+ @_routes = routes
12
+ @_engines = {}
13
+ end
14
+
15
+ def routes_data
16
+ data = []
17
+ normalized_routes do |route_els|
18
+ data.push *route_els
19
+ end
20
+ data
21
+ end
22
+
23
+ def tags_data
24
+ data = []
25
+ normalized_routes do |route_els|
26
+ route_els.each do |route_el|
27
+ tag_name = route_el[:data][:tag_name]
28
+ data.push tag_name unless data.include?(tag_name)
29
+ end
30
+ end
31
+ data
32
+ end
33
+
34
+ def schemas_data
35
+ data = []
36
+ normalized_routes do |route_els|
37
+ route_els.each do |route_el|
38
+ schema_name = route_el[:data][:schema_name]
39
+ data.push schema_name unless data.include?(schema_name)
40
+ end
41
+ end
42
+ data
43
+ end
44
+
45
+ private
46
+
47
+ attr_accessor :_routes, :_engines
48
+
49
+ def normalized_routes(&block)
50
+ collect_routes(_routes).each_with_object([]) do |route_data, _arr|
51
+ routes_els = Adjustor.new(route_data).routes_els
52
+ block.call(routes_els) if block_given?
53
+ end
54
+ end
55
+
56
+ # copy from:
57
+ # https://github.com/rails/rails/blob/v4.2.1/actionpack/lib/action_dispatch/routing/inspector.rb#L114-L140
58
+ # https://github.com/rails/rails/blob/v5.2.3/actionpack/lib/action_dispatch/routing/inspector.rb
59
+ def collect_routes(routes)
60
+ result = routes.collect do |route|
61
+ ActionDispatch::Routing::RouteWrapper.new(route)
62
+ end.reject(&:internal?).collect do |route|
63
+ collect_engine_routes(route)
64
+
65
+ # delete json_regexp after copy
66
+ { route: route,
67
+ name: route.name,
68
+ verb: route.verb,
69
+ path: route.path,
70
+ reqs: route.reqs }
71
+ end
72
+
73
+ # Push Rails Engine Routes Data
74
+ _engines.each do |_engine_name, engine_route_data|
75
+ result.push(*engine_route_data)
76
+ end
77
+
78
+ result
79
+ end
80
+
81
+ # copy from:
82
+ # https://github.com/rails/rails/blob/v4.2.1/actionpack/lib/action_dispatch/routing/inspector.rb#L114-L140
83
+ def collect_engine_routes(route)
84
+ name = route.endpoint
85
+ return unless route.engine?
86
+ return if _engines[name]
87
+
88
+ routes = route.rack_app.routes
89
+ _engines[name] = collect_routes(routes.routes) if routes.is_a?(ActionDispatch::Routing::RouteSet)
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+ require 'r2-oas/schema/v3/analyzer'
5
+
6
+ module R2OAS
7
+ module Schema
8
+ class Analyzer
9
+ extend Forwardable
10
+
11
+ def_delegators :@analyzer, :analyze_docs
12
+
13
+ def initialize(before_schema_data, after_schema_data, options = {})
14
+ case ::R2OAS.version
15
+ when :v3
16
+ @analyzer = V3::Analyzer.new(before_schema_data, after_schema_data, options)
17
+ else
18
+ raise NoImplementError, "Do not support version: #{::R2OAS.version}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/base'
4
+
5
+ # Scope Rails
6
+ module R2OAS
7
+ module Schema
8
+ class Base < ::R2OAS::Base
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+ require 'r2-oas/schema/v3/builder'
5
+
6
+ module R2OAS
7
+ module Schema
8
+ class Builder
9
+ extend Forwardable
10
+
11
+ def_delegators :@builder, :build_docs, :oas_doc, :pure_oas_doc
12
+
13
+ def initialize(options = {})
14
+ case ::R2OAS.version
15
+ when :v3
16
+ @builder = V3::Builder.new(options)
17
+ else
18
+ raise NoImplementError, "Do not support version: #{::R2OAS.version}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+ require 'r2-oas/schema/v3/cleaner'
5
+
6
+ module R2OAS
7
+ module Schema
8
+ class Cleaner
9
+ extend Forwardable
10
+
11
+ def_delegators :@cleaner, :clean_docs
12
+
13
+ def initialize(options = {})
14
+ case ::R2OAS.version
15
+ when :v3
16
+ @cleaner = V3::Cleaner.new(options)
17
+ else
18
+ raise NoImplementError, "Do not support version: #{::R2OAS.version}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal:true
2
+
3
+ require 'docker'
4
+ require 'eventmachine'
5
+ require 'watir'
6
+ require 'tempfile'
7
+ require 'fileutils'
8
+ require 'forwardable'
9
+
10
+ # Can't use ActiveSupport::Autroload
11
+ # ThreadError: can't be called from trap context
12
+ require 'r2-oas/schema/analyzer'
13
+ require_relative 'base'
14
+
15
+ # Scope Rails
16
+ module R2OAS
17
+ module Schema
18
+ class Editor < Base
19
+ extend Forwardable
20
+
21
+ TMP_FILE_NAME = 'edited_schema'
22
+ ALERT_TEXT = 'Would you like to convert your JSON into YAML?'
23
+
24
+ attr_accessor :edited_schema
25
+
26
+ def initialize(before_schema_data, options)
27
+ super(options)
28
+ @editor = swagger.editor
29
+ @before_schema_data = before_schema_data
30
+ @schema_doc_from_local = YAML.load_file(doc_save_file_path).to_yaml
31
+ end
32
+
33
+ def start
34
+ EM.run do
35
+ container.start
36
+ open_browser_and_set_schema
37
+ ensure_save_tmp_schema_file
38
+ signal_trap('INT')
39
+ signal_trap('TERM')
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ attr_accessor :unit_paths_file_path
46
+ def_delegators :@editor, :storage_key, :image, :port, :url, :exposed_port
47
+
48
+ def signal_trap(command)
49
+ Signal.trap(command) do
50
+ if @browser.exists?
51
+ process_after_close_browser
52
+ container.stop
53
+ container.remove
54
+ logger.info "container id: #{container.id} removed"
55
+ else
56
+ process_after_close_browser
57
+ container.remove
58
+ logger.info "container id: #{container.id} removed"
59
+ end
60
+
61
+ EM.stop
62
+ end
63
+ end
64
+
65
+ def process_after_close_browser
66
+ fetch_edited_schema_from_browser
67
+
68
+ options = { type: :edited }
69
+ save_edited_schema
70
+ conv_after_schema_data = YAML.load(@after_schema_data)
71
+ analyzer = Analyzer.new(@before_schema_data, conv_after_schema_data, options)
72
+ analyzer.analyze_docs
73
+ end
74
+
75
+ # MEMO
76
+ # TargetRubyVersion is 2.7 and there is a warning
77
+ # Because it is necessary to support from ruby2.3 series where begin cannot be omitted
78
+ # rubocop:disable Style/RedundantBegin
79
+ def ensure_save_tmp_schema_file
80
+ EM.add_periodic_timer(interval_to_save_edited_tmp_schema) do
81
+ m = Mutex.new
82
+ return nil unless @browser.exists?
83
+
84
+ m.synchronize do
85
+ begin
86
+ save_after_fetch_local_strage
87
+ rescue Selenium::WebDriver::Error::UnexpectedAlertOpenError
88
+ alert = @browser.driver.switch_to.alert
89
+ if alert.text.eql?(ALERT_TEXT)
90
+ alert.accept && save_after_fetch_local_strage
91
+ end
92
+ end
93
+ end
94
+ end
95
+ end
96
+ # rubocop:enable Style/RedundantBegin
97
+
98
+ def save_after_fetch_local_strage
99
+ @after_schema_data = @browser.driver.local_storage[storage_key] || @after_schema_data
100
+ save_edited_schema
101
+ puts "\nwait for signal trap ..."
102
+ end
103
+
104
+ def fetch_edited_schema_from_browser
105
+ @after_schema_data = @browser.driver.local_storage[storage_key] if @browser.exists?
106
+ end
107
+
108
+ def save_edited_schema
109
+ File.write(doc_save_file_path, @after_schema_data)
110
+ end
111
+
112
+ def open_browser_and_set_schema
113
+ capabilities = { 'chromeOptions' => { 'w3c' => false } }
114
+ @browser ||= Watir::Browser.new(:chrome, capabilities)
115
+ @browser.goto(url)
116
+ if wait_for_loaded
117
+ # MEMO:
118
+ # Because it may not be updated
119
+ # Make sure that the launched local storage is updated reliably
120
+ Watir::Wait.until do
121
+ old_storage = @browser.driver.local_storage[storage_key].dup
122
+ @browser.driver.local_storage[storage_key] = new_storage = @schema_doc_from_local
123
+ old_storage != new_storage
124
+ end
125
+ @browser.refresh
126
+ end
127
+ end
128
+
129
+ def wait_for_loaded
130
+ Watir::Wait.until { @browser.body.present? }
131
+ end
132
+
133
+ def container
134
+ @container ||= Docker::Container.create(
135
+ 'Image' => image,
136
+ 'ExposedPorts' => { exposed_port => {} },
137
+ 'HostConfig' => {
138
+ 'PortBindings' => {
139
+ exposed_port => [{ 'HostPort' => port }]
140
+ }
141
+ }
142
+ )
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+ require 'r2-oas/schema/v3/generator'
5
+
6
+ module R2OAS
7
+ module Schema
8
+ class Generator
9
+ extend Forwardable
10
+
11
+ def_delegators :@generator, :generate_docs
12
+
13
+ def initialize(options = {})
14
+ case ::R2OAS.version
15
+ when :v3
16
+ @generator = V3::Generator.new(options)
17
+ else
18
+ raise NoImplementError, "Do not support version: #{::R2OAS.version}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end