r2-oas 0.1.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/.github/ISSUE_TEMPLATE.md +12 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +12 -0
  4. data/.gitignore +12 -0
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +7 -0
  7. data/.rubocop_todo.yml +224 -0
  8. data/.travis.yml +22 -0
  9. data/CHANGELOG.md +3 -0
  10. data/CODE_OF_CONDUCT.md +74 -0
  11. data/Gemfile +12 -0
  12. data/Gemfile.lock +207 -0
  13. data/LICENSE.txt +21 -0
  14. data/README.ja.md +585 -0
  15. data/README.md +582 -0
  16. data/Rakefile +8 -0
  17. data/bin/console +12 -0
  18. data/bin/setup +8 -0
  19. data/docs/HOW_TO_ANALYZE_DOCS.md +875 -0
  20. data/docs/HOW_TO_CLEAN_DOCS.md +19 -0
  21. data/docs/HOW_TO_DEPLOY_SWAGGER_DOC.md +839 -0
  22. data/docs/HOW_TO_DISPLAY_PATHS_LIST.md +28 -0
  23. data/docs/HOW_TO_DISPLAY_PATHS_STATS.md +53 -0
  24. data/docs/HOW_TO_GENERATE_DOCS.md +256 -0
  25. data/docs/HOW_TO_MONITOR_SWAGGER_DOC.md +219 -0
  26. data/docs/HOW_TO_START_SWAGGER_EDITOR.md +218 -0
  27. data/docs/HOW_TO_START_SWAGGER_UI.md +262 -0
  28. data/docs/HOW_TO_USE_HOOK_WHEN_GENERATE_DOC.md +244 -0
  29. data/docs/HOW_TO_USE_SCHEMA_NAMESPACE.md +176 -0
  30. data/docs/HOW_TO_USE_TAG_NAMESPACE.md +176 -0
  31. data/docs/versions/v3.md +155 -0
  32. data/lib/r2-oas.rb +36 -0
  33. data/lib/r2-oas/app_configuration.rb +102 -0
  34. data/lib/r2-oas/app_configuration/server.rb +35 -0
  35. data/lib/r2-oas/app_configuration/swagger.rb +35 -0
  36. data/lib/r2-oas/app_configuration/swagger/editor.rb +47 -0
  37. data/lib/r2-oas/app_configuration/swagger/ui.rb +45 -0
  38. data/lib/r2-oas/app_configuration/tool.rb +31 -0
  39. data/lib/r2-oas/app_configuration/tool/paths/stats.rb +43 -0
  40. data/lib/r2-oas/base.rb +48 -0
  41. data/lib/r2-oas/configuration.rb +69 -0
  42. data/lib/r2-oas/configuration/paths_config.rb +44 -0
  43. data/lib/r2-oas/deploy/client.rb +43 -0
  44. data/lib/r2-oas/deploy/swagger-ui/dist/favicon-16x16.png +0 -0
  45. data/lib/r2-oas/deploy/swagger-ui/dist/favicon-32x32.png +0 -0
  46. data/lib/r2-oas/deploy/swagger-ui/dist/oauth2-redirect.html +68 -0
  47. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-bundle.js +134 -0
  48. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-bundle.js.map +1 -0
  49. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-standalone-preset.js +22 -0
  50. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui-standalone-preset.js.map +1 -0
  51. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.css +4 -0
  52. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.css.map +1 -0
  53. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.js +9 -0
  54. data/lib/r2-oas/deploy/swagger-ui/dist/swagger-ui.js.map +1 -0
  55. data/lib/r2-oas/deploy/swagger-ui/index.html.erb +60 -0
  56. data/lib/r2-oas/errors.rb +7 -0
  57. data/lib/r2-oas/hooks/global_hook.rb +20 -0
  58. data/lib/r2-oas/hooks/hook.rb +77 -0
  59. data/lib/r2-oas/hooks/repository.rb +15 -0
  60. data/lib/r2-oas/logger/stdout_logger.rb +129 -0
  61. data/lib/r2-oas/pluggable_configuration.rb +33 -0
  62. data/lib/r2-oas/plugins/schema/v3/object/hookable_base_object.rb +100 -0
  63. data/lib/r2-oas/routing/adjustor.rb +44 -0
  64. data/lib/r2-oas/routing/base.rb +12 -0
  65. data/lib/r2-oas/routing/components/all.rb +5 -0
  66. data/lib/r2-oas/routing/components/base_component.rb +10 -0
  67. data/lib/r2-oas/routing/components/path_component.rb +67 -0
  68. data/lib/r2-oas/routing/components/request_component.rb +75 -0
  69. data/lib/r2-oas/routing/components/verb_component.rb +21 -0
  70. data/lib/r2-oas/routing/parser.rb +93 -0
  71. data/lib/r2-oas/schema/analyzer.rb +23 -0
  72. data/lib/r2-oas/schema/base.rb +11 -0
  73. data/lib/r2-oas/schema/cleaner.rb +23 -0
  74. data/lib/r2-oas/schema/editor.rb +120 -0
  75. data/lib/r2-oas/schema/generator.rb +23 -0
  76. data/lib/r2-oas/schema/manager/file/path_item_file_manager.rb +24 -0
  77. data/lib/r2-oas/schema/monitor.rb +52 -0
  78. data/lib/r2-oas/schema/squeezer.rb +23 -0
  79. data/lib/r2-oas/schema/ui.rb +74 -0
  80. data/lib/r2-oas/schema/v3/analyzer.rb +58 -0
  81. data/lib/r2-oas/schema/v3/analyzer/base_analyzer.rb +76 -0
  82. data/lib/r2-oas/schema/v3/analyzer/components/object_analyzer.rb +38 -0
  83. data/lib/r2-oas/schema/v3/analyzer/components_analyzer.rb +30 -0
  84. data/lib/r2-oas/schema/v3/analyzer/path_analyzer.rb +116 -0
  85. data/lib/r2-oas/schema/v3/analyzer/tag_analyzer.rb +38 -0
  86. data/lib/r2-oas/schema/v3/base.rb +28 -0
  87. data/lib/r2-oas/schema/v3/cleaner.rb +19 -0
  88. data/lib/r2-oas/schema/v3/cleaner/base_cleaner.rb +30 -0
  89. data/lib/r2-oas/schema/v3/cleaner/components_cleaner.rb +42 -0
  90. data/lib/r2-oas/schema/v3/generator.rb +28 -0
  91. data/lib/r2-oas/schema/v3/generator/base_generator.rb +88 -0
  92. data/lib/r2-oas/schema/v3/generator/components/object_generator.rb +83 -0
  93. data/lib/r2-oas/schema/v3/generator/components/request_body_generator.rb +45 -0
  94. data/lib/r2-oas/schema/v3/generator/components_generator.rb +38 -0
  95. data/lib/r2-oas/schema/v3/generator/doc_generator.rb +49 -0
  96. data/lib/r2-oas/schema/v3/generator/path_generator.rb +90 -0
  97. data/lib/r2-oas/schema/v3/generator/schema_generator.rb +78 -0
  98. data/lib/r2-oas/schema/v3/manager/diff/base_array_diff_manager.rb +60 -0
  99. data/lib/r2-oas/schema/v3/manager/diff/base_diff_manager.rb +29 -0
  100. data/lib/r2-oas/schema/v3/manager/diff/base_hash_diff_manager.rb +95 -0
  101. data/lib/r2-oas/schema/v3/manager/diff/components_diff_manager.rb +19 -0
  102. data/lib/r2-oas/schema/v3/manager/diff/tag_diff_manager.rb +17 -0
  103. data/lib/r2-oas/schema/v3/manager/file/base_file_manager.rb +60 -0
  104. data/lib/r2-oas/schema/v3/manager/file/components_file_manager.rb +22 -0
  105. data/lib/r2-oas/schema/v3/manager/file/include_ref_base_file_manager.rb +88 -0
  106. data/lib/r2-oas/schema/v3/manager/file/path_item_file_manager.rb +22 -0
  107. data/lib/r2-oas/schema/v3/manager/file_manager.rb +12 -0
  108. data/lib/r2-oas/schema/v3/manager/pathname_manager.rb +73 -0
  109. data/lib/r2-oas/schema/v3/object/base_object.rb +65 -0
  110. data/lib/r2-oas/schema/v3/object/components/request_body_object.rb +92 -0
  111. data/lib/r2-oas/schema/v3/object/components/schema_object.rb +55 -0
  112. data/lib/r2-oas/schema/v3/object/components_object.rb +81 -0
  113. data/lib/r2-oas/schema/v3/object/external_document_object.rb +19 -0
  114. data/lib/r2-oas/schema/v3/object/info_object.rb +34 -0
  115. data/lib/r2-oas/schema/v3/object/openapi_object.rb +58 -0
  116. data/lib/r2-oas/schema/v3/object/path_item_object.rb +167 -0
  117. data/lib/r2-oas/schema/v3/object/paths_object.rb +74 -0
  118. data/lib/r2-oas/schema/v3/object/public.rb +9 -0
  119. data/lib/r2-oas/schema/v3/object/server_object.rb +21 -0
  120. data/lib/r2-oas/schema/v3/object/tag_object.rb +36 -0
  121. data/lib/r2-oas/schema/v3/squeezer.rb +29 -0
  122. data/lib/r2-oas/schema/v3/squeezer/base_squeezer.rb +37 -0
  123. data/lib/r2-oas/schema/v3/squeezer/path_squeezer.rb +28 -0
  124. data/lib/r2-oas/schema/v3/squeezer/tag_squeezer.rb +19 -0
  125. data/lib/r2-oas/shared/all.rb +3 -0
  126. data/lib/r2-oas/shared/sortable.rb +23 -0
  127. data/lib/r2-oas/task.rb +11 -0
  128. data/lib/r2-oas/task_logging.rb +39 -0
  129. data/lib/r2-oas/tasks/common.rake +26 -0
  130. data/lib/r2-oas/tasks/main.rake +117 -0
  131. data/lib/r2-oas/tasks/tool.rake +79 -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 +56 -0
  136. 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