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