r2-oas 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +99 -0
- data/GEMSPEC.md +20 -0
- data/LICENSE.txt +21 -0
- data/README.ja.md +271 -0
- data/README.md +271 -0
- data/lib/r2-oas.rb +35 -0
- data/lib/r2-oas/app_configuration.rb +121 -0
- data/lib/r2-oas/app_configuration/deprecation.rb +28 -0
- data/lib/r2-oas/app_configuration/server.rb +35 -0
- data/lib/r2-oas/app_configuration/swagger.rb +35 -0
- data/lib/r2-oas/app_configuration/swagger/editor.rb +47 -0
- data/lib/r2-oas/app_configuration/swagger/ui.rb +45 -0
- data/lib/r2-oas/app_configuration/tool.rb +31 -0
- data/lib/r2-oas/app_configuration/tool/paths/stats.rb +43 -0
- data/lib/r2-oas/base.rb +48 -0
- data/lib/r2-oas/configuration.rb +121 -0
- data/lib/r2-oas/configuration/paths_config.rb +44 -0
- data/lib/r2-oas/deploy/client.rb +70 -0
- data/lib/r2-oas/deploy/swagger-ui/index.html.erb +60 -0
- data/lib/r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object.rb +100 -0
- data/lib/r2-oas/errors.rb +13 -0
- data/lib/r2-oas/hooks/global_hook.rb +20 -0
- data/lib/r2-oas/hooks/hook.rb +79 -0
- data/lib/r2-oas/hooks/repository.rb +15 -0
- data/lib/r2-oas/lib/core_ext/hash/deep_merge.rb +44 -0
- data/lib/r2-oas/lib/core_ext/object/blank.rb +135 -0
- data/lib/r2-oas/lib/three-way-merge/twm.rb +83 -0
- data/lib/r2-oas/logger/stdout_logger.rb +129 -0
- data/lib/r2-oas/pluggable_configuration.rb +36 -0
- data/lib/r2-oas/plugin/base.rb +44 -0
- data/lib/r2-oas/plugin/executor.rb +148 -0
- data/lib/r2-oas/plugin/hookable.rb +42 -0
- data/lib/r2-oas/plugin/public.rb +3 -0
- data/lib/r2-oas/plugin/transform/transform.rb +10 -0
- data/lib/r2-oas/plugin/transform/v3/transform.rb +20 -0
- data/lib/r2-oas/plugin/transform/v3/visitable.rb +37 -0
- data/lib/r2-oas/public.rb +5 -0
- data/lib/r2-oas/routing/adjustor.rb +44 -0
- data/lib/r2-oas/routing/base.rb +12 -0
- data/lib/r2-oas/routing/components/all.rb +5 -0
- data/lib/r2-oas/routing/components/base_component.rb +10 -0
- data/lib/r2-oas/routing/components/path_component.rb +67 -0
- data/lib/r2-oas/routing/components/request_component.rb +75 -0
- data/lib/r2-oas/routing/components/verb_component.rb +21 -0
- data/lib/r2-oas/routing/parser.rb +93 -0
- data/lib/r2-oas/schema/analyzer.rb +23 -0
- data/lib/r2-oas/schema/base.rb +11 -0
- data/lib/r2-oas/schema/builder.rb +23 -0
- data/lib/r2-oas/schema/cleaner.rb +23 -0
- data/lib/r2-oas/schema/editor.rb +146 -0
- data/lib/r2-oas/schema/generator.rb +23 -0
- data/lib/r2-oas/schema/manager/file/path_item_file_manager.rb +24 -0
- data/lib/r2-oas/schema/manager/file_manager.rb +26 -0
- data/lib/r2-oas/schema/monitor.rb +52 -0
- data/lib/r2-oas/schema/squeezer.rb +23 -0
- data/lib/r2-oas/schema/ui.rb +73 -0
- data/lib/r2-oas/schema/v3/analyzer.rb +58 -0
- data/lib/r2-oas/schema/v3/analyzer/base_analyzer.rb +71 -0
- data/lib/r2-oas/schema/v3/analyzer/components/object_analyzer.rb +38 -0
- data/lib/r2-oas/schema/v3/analyzer/components_analyzer.rb +30 -0
- data/lib/r2-oas/schema/v3/analyzer/path_analyzer.rb +116 -0
- data/lib/r2-oas/schema/v3/analyzer/tag_analyzer.rb +38 -0
- data/lib/r2-oas/schema/v3/base.rb +28 -0
- data/lib/r2-oas/schema/v3/builder.rb +28 -0
- data/lib/r2-oas/schema/v3/builder/base_builder.rb +72 -0
- data/lib/r2-oas/schema/v3/builder/doc_builder.rb +51 -0
- data/lib/r2-oas/schema/v3/cleaner.rb +19 -0
- data/lib/r2-oas/schema/v3/cleaner/base_cleaner.rb +30 -0
- data/lib/r2-oas/schema/v3/cleaner/components_cleaner.rb +42 -0
- data/lib/r2-oas/schema/v3/generator.rb +24 -0
- data/lib/r2-oas/schema/v3/generator/base_generator.rb +122 -0
- data/lib/r2-oas/schema/v3/generator/components/object_generator.rb +64 -0
- data/lib/r2-oas/schema/v3/generator/components/request_body_generator.rb +45 -0
- data/lib/r2-oas/schema/v3/generator/components_generator.rb +38 -0
- data/lib/r2-oas/schema/v3/generator/doc_generator.rb +115 -0
- data/lib/r2-oas/schema/v3/generator/path_generator.rb +78 -0
- data/lib/r2-oas/schema/v3/generator/schema_generator.rb +58 -0
- data/lib/r2-oas/schema/v3/manager/diff/base_array_diff_manager.rb +60 -0
- data/lib/r2-oas/schema/v3/manager/diff/base_diff_manager.rb +29 -0
- data/lib/r2-oas/schema/v3/manager/diff/base_hash_diff_manager.rb +95 -0
- data/lib/r2-oas/schema/v3/manager/diff/components_diff_manager.rb +19 -0
- data/lib/r2-oas/schema/v3/manager/diff/tag_diff_manager.rb +17 -0
- data/lib/r2-oas/schema/v3/manager/file/base_file_manager.rb +66 -0
- data/lib/r2-oas/schema/v3/manager/file/components_file_manager.rb +22 -0
- data/lib/r2-oas/schema/v3/manager/file/include_ref_base_file_manager.rb +89 -0
- data/lib/r2-oas/schema/v3/manager/file/path_item_file_manager.rb +22 -0
- data/lib/r2-oas/schema/v3/manager/file_manager.rb +12 -0
- data/lib/r2-oas/schema/v3/manager/pathname_manager.rb +78 -0
- data/lib/r2-oas/schema/v3/object/from_files/base_object.rb +62 -0
- data/lib/r2-oas/schema/v3/object/from_files/components/request_body_object.rb +103 -0
- data/lib/r2-oas/schema/v3/object/from_files/components/schema_object.rb +102 -0
- data/lib/r2-oas/schema/v3/object/from_files/components_object.rb +46 -0
- data/lib/r2-oas/schema/v3/object/from_files/external_document_object.rb +23 -0
- data/lib/r2-oas/schema/v3/object/from_files/info_object.rb +23 -0
- data/lib/r2-oas/schema/v3/object/from_files/openapi_object.rb +61 -0
- data/lib/r2-oas/schema/v3/object/from_files/path_item_object.rb +110 -0
- data/lib/r2-oas/schema/v3/object/from_files/paths_object.rb +33 -0
- data/lib/r2-oas/schema/v3/object/from_files/utils/all.rb +4 -0
- data/lib/r2-oas/schema/v3/object/from_files/utils/deep_methods.rb +27 -0
- data/lib/r2-oas/schema/v3/object/from_files/utils/refs.rb +151 -0
- data/lib/r2-oas/schema/v3/object/from_routes/base_object.rb +75 -0
- data/lib/r2-oas/schema/v3/object/from_routes/components/request_body_object.rb +96 -0
- data/lib/r2-oas/schema/v3/object/from_routes/components/schema_object.rb +59 -0
- data/lib/r2-oas/schema/v3/object/from_routes/components_object.rb +81 -0
- data/lib/r2-oas/schema/v3/object/from_routes/external_document_object.rb +28 -0
- data/lib/r2-oas/schema/v3/object/from_routes/info_object.rb +43 -0
- data/lib/r2-oas/schema/v3/object/from_routes/openapi_object.rb +59 -0
- data/lib/r2-oas/schema/v3/object/from_routes/path_item_object.rb +175 -0
- data/lib/r2-oas/schema/v3/object/from_routes/paths_object.rb +77 -0
- data/lib/r2-oas/schema/v3/object/from_routes/public.rb +9 -0
- data/lib/r2-oas/schema/v3/object/from_routes/server_object.rb +21 -0
- data/lib/r2-oas/schema/v3/object/from_routes/tag_object.rb +37 -0
- data/lib/r2-oas/schema/v3/object/store.rb +54 -0
- data/lib/r2-oas/schema/v3/squeezer.rb +29 -0
- data/lib/r2-oas/schema/v3/squeezer/base_squeezer.rb +37 -0
- data/lib/r2-oas/schema/v3/squeezer/path_squeezer.rb +28 -0
- data/lib/r2-oas/schema/v3/squeezer/tag_squeezer.rb +19 -0
- data/lib/r2-oas/shared/all.rb +4 -0
- data/lib/r2-oas/shared/callable.rb +17 -0
- data/lib/r2-oas/shared/sortable.rb +23 -0
- data/lib/r2-oas/store.rb +122 -0
- data/lib/r2-oas/support/deprecation.rb +24 -0
- data/lib/r2-oas/support/deprecation/behavior.rb +21 -0
- data/lib/r2-oas/support/deprecation/instance_delegator.rb +42 -0
- data/lib/r2-oas/support/deprecation/reporting.rb +91 -0
- data/lib/r2-oas/task.rb +11 -0
- data/lib/r2-oas/task_logging.rb +41 -0
- data/lib/r2-oas/tasks/common.rake +25 -0
- data/lib/r2-oas/tasks/main.rake +132 -0
- data/lib/r2-oas/tasks/tool.rake +86 -0
- data/lib/r2-oas/tool/paths/ls.rb +15 -0
- data/lib/r2-oas/tool/paths/stats.rb +84 -0
- data/lib/r2-oas/version.rb +5 -0
- data/r2-oas.gemspec +48 -0
- 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,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
|