r2-oas 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/ISSUE_TEMPLATE.md +12 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.rubocop.yml +7 -0
- data/.rubocop_todo.yml +224 -0
- data/.travis.yml +22 -0
- data/CHANGELOG.md +3 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +207 -0
- data/LICENSE.txt +21 -0
- data/README.ja.md +585 -0
- data/README.md +582 -0
- data/Rakefile +8 -0
- data/bin/console +12 -0
- data/bin/setup +8 -0
- data/docs/HOW_TO_ANALYZE_DOCS.md +875 -0
- data/docs/HOW_TO_CLEAN_DOCS.md +19 -0
- data/docs/HOW_TO_DEPLOY_SWAGGER_DOC.md +839 -0
- data/docs/HOW_TO_DISPLAY_PATHS_LIST.md +28 -0
- data/docs/HOW_TO_DISPLAY_PATHS_STATS.md +53 -0
- data/docs/HOW_TO_GENERATE_DOCS.md +256 -0
- data/docs/HOW_TO_MONITOR_SWAGGER_DOC.md +219 -0
- data/docs/HOW_TO_START_SWAGGER_EDITOR.md +218 -0
- data/docs/HOW_TO_START_SWAGGER_UI.md +262 -0
- data/docs/HOW_TO_USE_HOOK_WHEN_GENERATE_DOC.md +244 -0
- data/docs/HOW_TO_USE_SCHEMA_NAMESPACE.md +176 -0
- data/docs/HOW_TO_USE_TAG_NAMESPACE.md +176 -0
- data/docs/versions/v3.md +155 -0
- data/lib/r2-oas.rb +36 -0
- data/lib/r2-oas/app_configuration.rb +102 -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 +69 -0
- data/lib/r2-oas/configuration/paths_config.rb +44 -0
- data/lib/r2-oas/deploy/client.rb +43 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/favicon-16x16.png +0 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/favicon-32x32.png +0 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/oauth2-redirect.html +68 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-bundle.js +134 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-bundle.js.map +1 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-standalone-preset.js +22 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-standalone-preset.js.map +1 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.css +4 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.css.map +1 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.js +9 -0
- data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.js.map +1 -0
- data/lib/r2-oas/deploy/swagger-ui/index.html.erb +60 -0
- data/lib/r2-oas/errors.rb +7 -0
- data/lib/r2-oas/hooks/global_hook.rb +20 -0
- data/lib/r2-oas/hooks/hook.rb +77 -0
- data/lib/r2-oas/hooks/repository.rb +15 -0
- data/lib/r2-oas/logger/stdout_logger.rb +129 -0
- data/lib/r2-oas/pluggable_configuration.rb +33 -0
- data/lib/r2-oas/plugins/schema/v3/object/hookable_base_object.rb +100 -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/cleaner.rb +23 -0
- data/lib/r2-oas/schema/editor.rb +120 -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/monitor.rb +52 -0
- data/lib/r2-oas/schema/squeezer.rb +23 -0
- data/lib/r2-oas/schema/ui.rb +74 -0
- data/lib/r2-oas/schema/v3/analyzer.rb +58 -0
- data/lib/r2-oas/schema/v3/analyzer/base_analyzer.rb +76 -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/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 +28 -0
- data/lib/r2-oas/schema/v3/generator/base_generator.rb +88 -0
- data/lib/r2-oas/schema/v3/generator/components/object_generator.rb +83 -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 +49 -0
- data/lib/r2-oas/schema/v3/generator/path_generator.rb +90 -0
- data/lib/r2-oas/schema/v3/generator/schema_generator.rb +78 -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 +60 -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 +88 -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 +73 -0
- data/lib/r2-oas/schema/v3/object/base_object.rb +65 -0
- data/lib/r2-oas/schema/v3/object/components/request_body_object.rb +92 -0
- data/lib/r2-oas/schema/v3/object/components/schema_object.rb +55 -0
- data/lib/r2-oas/schema/v3/object/components_object.rb +81 -0
- data/lib/r2-oas/schema/v3/object/external_document_object.rb +19 -0
- data/lib/r2-oas/schema/v3/object/info_object.rb +34 -0
- data/lib/r2-oas/schema/v3/object/openapi_object.rb +58 -0
- data/lib/r2-oas/schema/v3/object/path_item_object.rb +167 -0
- data/lib/r2-oas/schema/v3/object/paths_object.rb +74 -0
- data/lib/r2-oas/schema/v3/object/public.rb +9 -0
- data/lib/r2-oas/schema/v3/object/server_object.rb +21 -0
- data/lib/r2-oas/schema/v3/object/tag_object.rb +36 -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 +3 -0
- data/lib/r2-oas/shared/sortable.rb +23 -0
- data/lib/r2-oas/task.rb +11 -0
- data/lib/r2-oas/task_logging.rb +39 -0
- data/lib/r2-oas/tasks/common.rake +26 -0
- data/lib/r2-oas/tasks/main.rake +117 -0
- data/lib/r2-oas/tasks/tool.rake +79 -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 +56 -0
- metadata +373 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
require 'fileutils'
|
5
|
+
require_relative 'base_generator'
|
6
|
+
require_relative 'schema_generator'
|
7
|
+
|
8
|
+
module R2OAS
|
9
|
+
module Schema
|
10
|
+
module V3
|
11
|
+
class DocGenerator < BaseGenerator
|
12
|
+
attr_accessor :oas_doc
|
13
|
+
|
14
|
+
def initialize(options = {})
|
15
|
+
super
|
16
|
+
@schema_generator = SchemaGenerator.new(options)
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_docs
|
20
|
+
logger.info '[Generate OAS schema files] start'
|
21
|
+
@schema_generator.generate_docs unless skip_generate_docs
|
22
|
+
logger.info '[Generate OAS schema files] end'
|
23
|
+
logger.info '[Generate OAS docs from schema files] start'
|
24
|
+
generate_docs_from_schema_files
|
25
|
+
logger.info '[Generate OAS docs from schema files] end'
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def generate_docs_from_schema_files
|
31
|
+
result_before_squeeze = schema_files_paths.each_with_object({}) do |path, data|
|
32
|
+
yaml = YAML.load_file(path)
|
33
|
+
data.deep_merge!(yaml)
|
34
|
+
logger.info " Use schema file: \t#{path}"
|
35
|
+
end
|
36
|
+
|
37
|
+
result = if many_paths_file_paths.present?
|
38
|
+
Squeezer.new(result_before_squeeze, many_paths_file_paths: many_paths_file_paths).squeeze_docs
|
39
|
+
else
|
40
|
+
result_before_squeeze
|
41
|
+
end
|
42
|
+
|
43
|
+
@oas_doc = result
|
44
|
+
File.write(doc_save_file_path, result.to_yaml)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'forwardable'
|
4
|
+
require 'fileutils'
|
5
|
+
require_relative 'base_generator'
|
6
|
+
require 'r2-oas/schema/v3/manager/file/path_item_file_manager'
|
7
|
+
|
8
|
+
module R2OAS
|
9
|
+
module Schema
|
10
|
+
module V3
|
11
|
+
class PathGenerator < BaseGenerator
|
12
|
+
def initialize(schema_data = {}, options = {})
|
13
|
+
super(options)
|
14
|
+
sorted_schema_data = deep_sort(schema_data, 'paths')
|
15
|
+
@paths = sorted_schema_data['paths']
|
16
|
+
@glob_schema_paths = create_glob_paths_paths
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_docs
|
20
|
+
if paths_file_do_not_exists?
|
21
|
+
logger.info ' <From routes data>'
|
22
|
+
generate_docs_from_routes_data
|
23
|
+
else
|
24
|
+
logger.info ' <From schema files>'
|
25
|
+
generate_docs_from_schema_fiels
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
|
31
|
+
alias paths_files_paths schema_files_paths
|
32
|
+
alias paths_file_do_not_exists? schema_file_do_not_exists?
|
33
|
+
|
34
|
+
def generate_docs_from_schema_fiels
|
35
|
+
process_when_generate_docs do |save_file_path|
|
36
|
+
logger.info " Merge schema file: \t#{save_file_path}"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def generate_docs_from_routes_data
|
41
|
+
process_when_generate_docs do |save_file_path|
|
42
|
+
logger.info " Write schema file: \t#{save_file_path}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def process_when_generate_docs
|
47
|
+
logger.info ' <Update schema files (paths)>'
|
48
|
+
save_each_tags(@paths) do |tag_name, result|
|
49
|
+
relative_path = "paths/#{tag_name}"
|
50
|
+
path_item_file_manager = PathItemFileManager.new(relative_path, :relative)
|
51
|
+
|
52
|
+
path_item_file_manager.save(result.to_yaml) unless path_item_file_manager.skip_save?
|
53
|
+
|
54
|
+
yield path_item_file_manager.save_file_path if block_given?
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def create_glob_paths_paths
|
59
|
+
if many_paths_file_paths.present? && !skip_load_dot_paths
|
60
|
+
many_paths_file_paths
|
61
|
+
else
|
62
|
+
["#{schema_save_dir_path}/paths/**/**.yml"]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def unit_paths_data_group_by_tags(unit_paths_data)
|
67
|
+
unit_paths_data.each_with_object({}) do |(path, data_when_path), result|
|
68
|
+
data_when_path.each do |verb, data_when_verb|
|
69
|
+
tag_name = data_when_verb['tags'].first
|
70
|
+
result[tag_name] ||= {}
|
71
|
+
result[tag_name].deep_merge!(
|
72
|
+
'paths' => {
|
73
|
+
path => {
|
74
|
+
verb => data_when_verb
|
75
|
+
}
|
76
|
+
}
|
77
|
+
)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def save_each_tags(unit_paths_data)
|
83
|
+
unit_paths_data_group_by_tags(unit_paths_data).each do |tag_name, result|
|
84
|
+
yield [tag_name, result] if block_given?
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'fileutils'
|
4
|
+
require_relative 'base_generator'
|
5
|
+
require_relative 'path_generator'
|
6
|
+
require_relative 'components_generator'
|
7
|
+
require 'r2-oas/schema/v3/manager/file_manager'
|
8
|
+
|
9
|
+
module R2OAS
|
10
|
+
module Schema
|
11
|
+
module V3
|
12
|
+
class SchemaGenerator < BaseGenerator
|
13
|
+
def initialize(options = {})
|
14
|
+
super(options)
|
15
|
+
@docs = create_docs
|
16
|
+
@options = options
|
17
|
+
end
|
18
|
+
|
19
|
+
def generate_docs
|
20
|
+
if force_update_schema || schema_file_do_not_exists?
|
21
|
+
logger.info '<From routes data>'
|
22
|
+
generate_docs_from_routes_data
|
23
|
+
else
|
24
|
+
logger.info '<From schema files>'
|
25
|
+
generate_docs_from_schema_fiels
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def create_docs
|
30
|
+
if !skip_generate_docs
|
31
|
+
super
|
32
|
+
elsif skip_generate_docs && FileTest.exists?(doc_save_file_path)
|
33
|
+
YAML.load_file(doc_save_file_path)
|
34
|
+
else
|
35
|
+
{}
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def generate_docs_from_schema_fiels
|
42
|
+
process_when_generate_docs do |save_file_path|
|
43
|
+
logger.info " Merge schema file: \t#{save_file_path}"
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def generate_docs_from_routes_data
|
48
|
+
process_when_generate_docs do |save_file_path|
|
49
|
+
logger.info " Write schema file: \t#{save_file_path}"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def process_when_generate_docs
|
54
|
+
logger.info '<Update schema files>'
|
55
|
+
@docs.each do |field_name, data|
|
56
|
+
result = { field_name.to_s => data }
|
57
|
+
|
58
|
+
case field_name
|
59
|
+
when 'paths'
|
60
|
+
logger.info ' [Generate OAS schema files (paths)] start'
|
61
|
+
PathGenerator.new(result, @options).generate_docs
|
62
|
+
logger.info ' [Generate OAS schema files (paths)] end'
|
63
|
+
when 'components'
|
64
|
+
logger.info ' [Generate OAS schema files (components)] start'
|
65
|
+
ComponentsGenerator.new(result, @options).generate_docs
|
66
|
+
logger.info ' [Generate OAS schema files (components)] end'
|
67
|
+
else
|
68
|
+
file_manager = FileManager.new(field_name, :relative)
|
69
|
+
file_manager.save(result.to_yaml)
|
70
|
+
|
71
|
+
yield file_manager.save_file_path if block_given?
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base_diff_manager'
|
4
|
+
|
5
|
+
module R2OAS
|
6
|
+
module Schema
|
7
|
+
module V3
|
8
|
+
class BaseArrayDiffManager < BaseDiffManager
|
9
|
+
def initialize(before_schema_data, after_schema_data)
|
10
|
+
super
|
11
|
+
@major_category = 'base'
|
12
|
+
@judge_key = ''
|
13
|
+
end
|
14
|
+
|
15
|
+
def process_by_using_diff_data
|
16
|
+
before_data_at_major = @before_schema_data[@major_category]
|
17
|
+
after_data_at_major = @after_schema_data[@major_category]
|
18
|
+
after_schema_data_grouped_by = schema_data_grouped_by_judge_key(after_data_at_major)
|
19
|
+
|
20
|
+
result = before_data_at_major.map do |data|
|
21
|
+
judge_name = data[@judge_key]
|
22
|
+
if judge_name.in? after_schema_data_grouped_by.keys
|
23
|
+
after_schema_data_grouped_by[judge_name]
|
24
|
+
else
|
25
|
+
data
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
yield schema_data_at(result) if block_given?
|
30
|
+
end
|
31
|
+
|
32
|
+
def after_target_data
|
33
|
+
schema_data_at(@after_schema_data[@major_category])
|
34
|
+
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
def schema_data_grouped_by_judge_key(arr)
|
39
|
+
arr.each_with_object({}) do |data, result|
|
40
|
+
result.deep_merge!(data[@judge_key] => data)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def schema_data_at(data)
|
45
|
+
{
|
46
|
+
@major_category => data
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_boolean(diff)
|
51
|
+
if diff.present?
|
52
|
+
diff[@major_category].present?
|
53
|
+
else
|
54
|
+
false
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'easy_diff'
|
4
|
+
require 'r2-oas/schema/v3/base'
|
5
|
+
|
6
|
+
module R2OAS
|
7
|
+
module Schema
|
8
|
+
module V3
|
9
|
+
class BaseDiffManager < Base
|
10
|
+
include Sortable
|
11
|
+
|
12
|
+
def initialize(before_schema_data, after_schema_data)
|
13
|
+
@before_schema_data = before_schema_data
|
14
|
+
@after_schema_data = after_schema_data
|
15
|
+
end
|
16
|
+
|
17
|
+
def process_by_using_diff_data
|
18
|
+
raise NoImplementError, 'Please implement in inherited class.'
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def ensure_presence_or_blank(data)
|
24
|
+
data.present? ? data : {}
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base_diff_manager'
|
4
|
+
|
5
|
+
module R2OAS
|
6
|
+
module Schema
|
7
|
+
module V3
|
8
|
+
class BaseHashDiffManager < BaseDiffManager
|
9
|
+
include Sortable
|
10
|
+
|
11
|
+
def initialize(before_schema_data, after_schema_data)
|
12
|
+
super
|
13
|
+
@major_category = 'base'
|
14
|
+
@middle_category = 'middle'
|
15
|
+
end
|
16
|
+
|
17
|
+
def process_by_using_diff_data
|
18
|
+
before_target_data = sorted_target_data(@before_schema_data)
|
19
|
+
before_target_data_names = before_target_data.keys.uniq
|
20
|
+
after_target_data = sorted_target_data(@after_schema_data)
|
21
|
+
after_target_data_names = after_target_data.keys.uniq
|
22
|
+
target_names = (before_target_data_names + after_target_data_names).uniq
|
23
|
+
|
24
|
+
target_names.each do |target_name|
|
25
|
+
before_schema_data = schema_data_at(before_target_data, target_name)
|
26
|
+
after_schema_data = schema_data_at(after_target_data, target_name)
|
27
|
+
|
28
|
+
removed, added = before_schema_data.easy_diff(after_schema_data)
|
29
|
+
leftovers, = before_schema_data.easy_diff(removed)
|
30
|
+
|
31
|
+
is_removed = to_boolean(removed, target_name)
|
32
|
+
is_added = to_boolean(added, target_name)
|
33
|
+
is_leftovers = to_boolean(leftovers, target_name)
|
34
|
+
|
35
|
+
yield(target_name, is_removed, is_added, is_leftovers, after_schema_data) if block_given?
|
36
|
+
end
|
37
|
+
|
38
|
+
nil
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def normalized(data)
|
44
|
+
if data.present?
|
45
|
+
data
|
46
|
+
elsif @middle_category.present?
|
47
|
+
{ @major_category => { @middle_category => {} } }
|
48
|
+
else
|
49
|
+
{ @major_category => {} }
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def schema_data_at(data, key)
|
54
|
+
if @middle_category.present?
|
55
|
+
{
|
56
|
+
@major_category => {
|
57
|
+
@middle_category => {
|
58
|
+
key => data.fetch(key, nil)
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
else
|
63
|
+
{
|
64
|
+
@major_category => {
|
65
|
+
key => data.fetch(key, nil)
|
66
|
+
}
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def sorted_target_data(data)
|
72
|
+
data = ensure_presence_or_blank(data)
|
73
|
+
|
74
|
+
if @middle_category.present?
|
75
|
+
sorted_data = deep_sort(data[@major_category], @middle_category)
|
76
|
+
result = ensure_presence_or_blank(sorted_data[@middle_category])
|
77
|
+
else
|
78
|
+
sorted_data = deep_sort(data, @major_category)
|
79
|
+
result = ensure_presence_or_blank(sorted_data[@major_category])
|
80
|
+
end
|
81
|
+
|
82
|
+
result
|
83
|
+
end
|
84
|
+
|
85
|
+
def to_boolean(diff, target_name)
|
86
|
+
if diff.present?
|
87
|
+
diff.fetch(@major_category, nil)&.fetch(@middle_category, nil)&.fetch(target_name, nil).present?
|
88
|
+
else
|
89
|
+
false
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base_hash_diff_manager'
|
4
|
+
|
5
|
+
module R2OAS
|
6
|
+
module Schema
|
7
|
+
module V3
|
8
|
+
class ComponentsDiffManager < BaseHashDiffManager
|
9
|
+
def initialize(before_schema_data, after_schema_data, options = {})
|
10
|
+
super(before_schema_data, after_schema_data)
|
11
|
+
@major_category = 'components'
|
12
|
+
@middle_category = options[:middle_category]
|
13
|
+
@before_schema_data = normalized(before_schema_data)
|
14
|
+
@after_schema_data = normalized(after_schema_data)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'base_array_diff_manager'
|
4
|
+
|
5
|
+
module R2OAS
|
6
|
+
module Schema
|
7
|
+
module V3
|
8
|
+
class TagDiffManager < BaseArrayDiffManager
|
9
|
+
def initialize(before_schema_data, after_schema_data)
|
10
|
+
super
|
11
|
+
@major_category = 'tags'
|
12
|
+
@judge_key = 'name'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../pathname_manager'
|
4
|
+
require 'r2-oas/schema/v3/base'
|
5
|
+
|
6
|
+
module R2OAS
|
7
|
+
module Schema
|
8
|
+
module V3
|
9
|
+
class BaseFileManager < Base
|
10
|
+
attr_accessor :original_path
|
11
|
+
|
12
|
+
# e.x.) openapi_path = "#/components/schemas/Account"
|
13
|
+
def initialize(path, path_type = :full)
|
14
|
+
super()
|
15
|
+
@ext_name = :yml
|
16
|
+
@path_type = path_type
|
17
|
+
@original_path = path
|
18
|
+
@relative_save_file_path = PathnameManager.new(path, path_type).relative_save_file_path
|
19
|
+
end
|
20
|
+
|
21
|
+
def delete
|
22
|
+
File.delete(save_file_path) if FileTest.exists?(save_file_path)
|
23
|
+
end
|
24
|
+
|
25
|
+
def save(data)
|
26
|
+
File.write(save_file_path, data)
|
27
|
+
end
|
28
|
+
|
29
|
+
def save_after_deep_merge(data)
|
30
|
+
result = load_data.deep_merge(data)
|
31
|
+
save(result.to_yaml)
|
32
|
+
end
|
33
|
+
|
34
|
+
def save_file_path
|
35
|
+
File.expand_path(@relative_save_file_path).tap do |abs_path|
|
36
|
+
abs_dir = File.dirname(abs_path)
|
37
|
+
FileUtils.mkdir_p(abs_dir) unless FileTest.exists?(abs_dir)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def load_data
|
42
|
+
case @ext_name
|
43
|
+
when :yml
|
44
|
+
if FileTest.exists?(save_file_path)
|
45
|
+
YAML.load_file(save_file_path)
|
46
|
+
else
|
47
|
+
{}
|
48
|
+
end
|
49
|
+
else
|
50
|
+
raise NoSupportError, "Do not support @ext_name: #{@ext_name}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def descendants_paths
|
55
|
+
[]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|