r2-oas 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
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,64 @@
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/components_file_manager'
7
+
8
+ module R2OAS
9
+ module Schema
10
+ module V3
11
+ module Components
12
+ class ObjectGenerator < BaseGenerator
13
+ def initialize(schema_data = {}, options = {})
14
+ super(options.except(:middle_category))
15
+ @major_category = 'components'
16
+ @middle_category = options[:middle_category]
17
+ sorted_schema_data = deep_sort(schema_data, @middle_category)
18
+ @components_objects = sorted_schema_data[@middle_category]
19
+ @glob_schema_paths = create_glob_components_objects_paths
20
+ end
21
+
22
+ def generate_docs
23
+ logger.info ' <From routes data>'
24
+ generate_docs_from_routes_data
25
+ end
26
+
27
+ private
28
+
29
+ alias components_objects_files_paths schema_files_paths
30
+
31
+ def generate_docs_from_routes_data
32
+ process_when_generate_docs do |save_file_path|
33
+ logger.info " Add schema file into store: \t#{save_file_path}"
34
+ end
35
+ end
36
+
37
+ def process_when_generate_docs
38
+ logger.info " <Update Components schema files (#{@major_category}/#{@middle_category})>"
39
+ @components_objects&.each do |schema_name, data|
40
+ result = {
41
+ @major_category => {
42
+ @middle_category => { schema_name.to_s => data }
43
+ }
44
+ }
45
+
46
+ relative_path = "#{@major_category}/#{@middle_category}/#{schema_name}"
47
+ file_manager = ComponentsFileManager.build(relative_path, :relative)
48
+ save_file_path = file_manager.save_file_path(type: :relative)
49
+ store.add(save_file_path, result.to_yaml)
50
+
51
+ yield save_file_path if block_given?
52
+ end
53
+ end
54
+
55
+ def create_glob_components_objects_paths
56
+ many_components_file_paths.select do |file_path|
57
+ file_path.include? "#{schema_save_dir_path}/#{@major_category}/#{@middle_category}"
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+ require 'fileutils'
5
+ require_relative 'object_generator'
6
+ require 'r2-oas/schema/v3/manager/file/components_file_manager'
7
+
8
+ module R2OAS
9
+ module Schema
10
+ module V3
11
+ module Components
12
+ class RequestBodyGenerator < ObjectGenerator
13
+ private
14
+
15
+ # override
16
+ def process_when_generate_docs
17
+ logger.info " <Update Components schema files (#{@major_category}/#{@middle_category})>"
18
+ @components_objects&.each do |schema_name, data|
19
+ result = {
20
+ @major_category => {
21
+ @middle_category => { schema_name.to_s => data.slice('content') }
22
+ }
23
+ }
24
+
25
+ relative_path = "#{@major_category}/#{@middle_category}/#{schema_name}"
26
+ file_manager = ComponentsFileManager.build(relative_path, :relative)
27
+ save_file_path = file_manager.save_file_path(type: :relative)
28
+ store.add(save_file_path, result.to_yaml)
29
+
30
+ if data.key?('has_one') && data['has_one']['type'].eql?('schema')
31
+ original_path = data['has_one']['original_path']
32
+ file_manager = ComponentsFileManager.new(original_path, :ref)
33
+ result = data['has_one']['data']
34
+ save_file_path = file_manager.save_file_path(type: :relative)
35
+ store.add(save_file_path, result.to_yaml)
36
+ end
37
+
38
+ yield save_file_path if block_given?
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_generator'
4
+ require_relative 'components/object_generator'
5
+ require_relative 'components/request_body_generator'
6
+
7
+ module R2OAS
8
+ module Schema
9
+ module V3
10
+ class ComponentsGenerator < BaseGenerator
11
+ def initialize(schema_data = {}, options = {})
12
+ super(options)
13
+ @components = schema_data['components'] || scehma_data[:components]
14
+ @options = options
15
+ end
16
+
17
+ def generate_docs
18
+ support_components_objects.each do |object_name|
19
+ generator_class(object_name).new(@components, @options.merge(
20
+ middle_category: object_name
21
+ )).generate_docs
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ def generator_class(object_name)
28
+ case object_name
29
+ when 'requestBodies'
30
+ Components::RequestBodyGenerator
31
+ else
32
+ Components::ObjectGenerator
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'fileutils'
5
+ require 'r2-oas/errors'
6
+ require 'r2-oas/lib/three-way-merge/twm'
7
+ require 'r2-oas/schema/v3/manager/file_manager'
8
+ require_relative 'base_generator'
9
+ require_relative 'schema_generator'
10
+
11
+ module R2OAS
12
+ module Schema
13
+ module V3
14
+ class DocGenerator < BaseGenerator
15
+ def initialize(options = {})
16
+ super
17
+ @schema_generator = SchemaGenerator.new(options)
18
+ end
19
+
20
+ def generate_docs
21
+ logger.info '[Generate OAS schema files] start'
22
+ @schema_generator.generate_docs
23
+ save_schemas_from_store
24
+ logger.info '[Generate OAS schema files] end'
25
+ end
26
+
27
+ private
28
+
29
+ def save_schemas_from_store
30
+ local_store = ::R2OAS::Store.new(cache_docs)
31
+
32
+ # Check checksum
33
+ unless local_store.checksum?
34
+ raise R2OAS::ChecksumError, <<-ERR
35
+
36
+ Invalid file: #{relative_cahe_docs_path}
37
+ Please delete #{relative_cahe_docs_path} and execute the following command again.
38
+
39
+ CACHE_DOCS=true bundle exec rake routes:oas:docs
40
+ ERR
41
+ end
42
+
43
+ save_diff_schemas_from(local_store)
44
+ end
45
+
46
+ def save_diff_schemas_from(local_store)
47
+ local_sha1s = local_store.data['data'].keys
48
+ global_sha1s = store.data['data'].keys
49
+
50
+ # Maake diff sha1s
51
+ new_sha1s, after_sha1s, before_sha1s = nil
52
+ if exists_cache?
53
+ after_sha1s = global_sha1s - local_sha1s
54
+ before_sha1s = local_sha1s - global_sha1s
55
+ else
56
+ new_sha1s = global_sha1s - local_sha1s
57
+ end
58
+
59
+ # Make diff store
60
+ new_store = store.dup_slice(*new_sha1s)
61
+ after_store = store.dup_slice(*after_sha1s)
62
+ before_store = local_store.dup_slice(*before_sha1s)
63
+
64
+ is_exists_cache = exists_cache?
65
+ if is_exists_cache || schema_file_do_not_exists?
66
+ unless is_create_cache
67
+ # First try
68
+ if new_store&.exists?
69
+ new_store.save do |save_path|
70
+ logger.info " Write schema file: \t#{save_path}"
71
+ end
72
+ end
73
+
74
+ # Change routing
75
+ after_store.diff_from(before_store) do |analyze_data|
76
+ analyze_data.each do |file_path, data|
77
+ left = data['after']
78
+ orig = data['before']
79
+ right = FileManager.new(file_path, :full).load_data
80
+ merged3 = Twm.yaml_merge(left, orig, right)
81
+ analyzer = Analyzer.new({}, merged3, type: :edited)
82
+ analyzer.analyze_docs
83
+ end
84
+ end
85
+
86
+ # TODO: Fix Bugs
87
+ # Delete paths/unknown.yml
88
+ file_manager = FileManager.new(unknown_paths_path, :full)
89
+ file_manager.delete
90
+ end
91
+ else
92
+ unless is_create_cache || is_exists_cache
93
+ raise NoFileExistsError, <<-ERR
94
+
95
+ Can't find the file #{relative_cahe_docs_path}
96
+ Please execute the following command to create #{relative_cahe_docs_path}
97
+
98
+ CACHE_DOCS=true bundle exec rake routes:oas:docs
99
+ ERR
100
+ end
101
+ end
102
+
103
+ # Save docs cache
104
+ deflated_cache_docs = Zlib::Deflate.deflate(Marshal.dump(store.data))
105
+ IO.binwrite(abs_cache_docs_path, deflated_cache_docs)
106
+ if is_exists_cache
107
+ logger.info "[Generate OAS docs] Update cache at #{relative_cahe_docs_path}"
108
+ else
109
+ logger.info "[Generate OAS docs] Create cache at #{relative_cahe_docs_path}"
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
115
+ end
@@ -0,0 +1,78 @@
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
+ logger.info ' <From routes data>'
21
+ generate_docs_from_routes_data
22
+ end
23
+
24
+ private
25
+
26
+ alias paths_files_paths schema_files_paths
27
+
28
+ def generate_docs_from_routes_data
29
+ process_when_generate_docs do |save_file_path|
30
+ logger.info " Add schema file into store: \t#{save_file_path}"
31
+ end
32
+ end
33
+
34
+ def process_when_generate_docs
35
+ logger.info ' <Update schema files (paths)>'
36
+ save_each_tags(@paths) do |tag_name, result|
37
+ relative_path = "paths/#{tag_name}"
38
+ file_manager = PathItemFileManager.new(relative_path, :relative)
39
+ save_file_path = file_manager.save_file_path(type: :relative)
40
+ store.add(save_file_path, result.to_yaml)
41
+
42
+ yield save_file_path if block_given?
43
+ end
44
+ end
45
+
46
+ def create_glob_paths_paths
47
+ if many_paths_file_paths.present? && !skip_load_dot_paths
48
+ many_paths_file_paths
49
+ else
50
+ ["#{schema_save_dir_path}/paths/**/**.yml"]
51
+ end
52
+ end
53
+
54
+ def unit_paths_data_group_by_tags(unit_paths_data)
55
+ unit_paths_data.each_with_object({}) do |(path, data_when_path), result|
56
+ data_when_path.each do |verb, data_when_verb|
57
+ tag_name = data_when_verb['tags'].first
58
+ result[tag_name] ||= {}
59
+ result[tag_name].deep_merge!(
60
+ 'paths' => {
61
+ path => {
62
+ verb => data_when_verb
63
+ }
64
+ }
65
+ )
66
+ end
67
+ end
68
+ end
69
+
70
+ def save_each_tags(unit_paths_data)
71
+ unit_paths_data_group_by_tags(unit_paths_data).each do |tag_name, result|
72
+ yield [tag_name, result] if block_given?
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,58 @@
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
+ logger.info '<From routes data>'
21
+ generate_docs_from_routes_data
22
+ end
23
+
24
+ private
25
+
26
+ def generate_docs_from_routes_data
27
+ process_when_generate_docs do |save_file_path|
28
+ logger.info " Add schema file into store: \t#{save_file_path}"
29
+ end
30
+ end
31
+
32
+ def process_when_generate_docs
33
+ logger.info '<Update schema files>'
34
+ @docs.each do |field_name, data|
35
+ result = { field_name.to_s => data }
36
+
37
+ case field_name
38
+ when 'paths'
39
+ logger.info ' [Generate OAS schema files (paths)] start'
40
+ PathGenerator.new(result, @options).generate_docs
41
+ logger.info ' [Generate OAS schema files (paths)] end'
42
+ when 'components'
43
+ logger.info ' [Generate OAS schema files (components)] start'
44
+ ComponentsGenerator.new(result, @options).generate_docs
45
+ logger.info ' [Generate OAS schema files (components)] end'
46
+ else
47
+ file_manager = FileManager.new(field_name, :relative)
48
+ save_file_path = file_manager.save_file_path(type: :relative)
49
+ store.add(save_file_path, result.to_yaml)
50
+
51
+ yield file_manager.save_file_path(type: :relative) if block_given?
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
58
+ 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