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.
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,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'info_object'
4
+ require_relative 'paths_object'
5
+ require_relative 'path_item_object'
6
+ require_relative 'external_document_object'
7
+ require_relative 'components_object'
8
+ require_relative 'components/schema_object'
9
+ require_relative 'components/request_body_object'
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_object'
4
+
5
+ module R2OAS
6
+ module Schema
7
+ module V3
8
+ class ServerObject < BaseObject
9
+ def to_doc
10
+ server.data.each_with_object([]) do |server, result|
11
+ result.push(
12
+ 'url' => (server[:url]).to_s,
13
+ 'description' => (server[:description]).to_s
14
+ )
15
+ # Do not Server Variable Object
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_object'
4
+ require_relative 'path_item_object'
5
+
6
+ module R2OAS
7
+ module Schema
8
+ module V3
9
+ class TagObject < BaseObject
10
+ def initialize(tags_data, opts = {})
11
+ super(opts)
12
+ @tags_data = tags_data
13
+ end
14
+
15
+ def to_doc
16
+ @tags_data.each_with_object([]) do |tag_name, result|
17
+ result.push(create_doc(tag_name))
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def create_doc(tag_name)
24
+ {
25
+ 'name' => tag_name,
26
+ 'description' => "#{tag_name} description",
27
+ # External Docs Object
28
+ 'externalDocs' => {
29
+ 'description' => 'description',
30
+ 'url' => 'url'
31
+ }
32
+ }
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ module R2OAS
4
+ module Schema
5
+ module V3
6
+ class Store
7
+ attr_accessor :root_doc
8
+ attr_accessor :components_schema_name_list, :appended_components_schema_name_list
9
+ attr_accessor :components_request_body_name_list, :appended_components_request_body_name_list
10
+
11
+ def initialize(type = :obj)
12
+ @data = {}
13
+ @data['type'] = type
14
+ @data['data'] = {}
15
+ @root_doc = {}
16
+ @components_schema_name_list = []
17
+ @appended_components_schema_name_list = []
18
+ @components_request_body_name_list = []
19
+ @appended_components_request_body_name_list = []
20
+ end
21
+
22
+ def add(obj_type, key, value)
23
+ @data['data'][obj_type] ||= {}
24
+ # MEMO:
25
+ # Do not save the same thing in store by using unique contents for schema name
26
+ @data['data'][obj_type][key] ||= value
27
+ end
28
+
29
+ def gets(obj_type)
30
+ (@data['data'][obj_type] || {}).values.present? ? @data['data'][obj_type].values : []
31
+ end
32
+
33
+ class << self
34
+ extend Forwardable
35
+
36
+ def_delegators :instance, :add, :gets, :root_doc
37
+ def_delegators :instance, :components_schema_name_list, :appended_components_schema_name_list
38
+ def_delegators :instance, :components_request_body_name_list, :appended_components_request_body_name_list
39
+
40
+ def create(type = :obj)
41
+ instance(type)
42
+ end
43
+
44
+ private
45
+
46
+ def instance(type)
47
+ @instance ||= {}
48
+ @instance[type] ||= new(type)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'squeezer/base_squeezer'
4
+ require_relative 'squeezer/tag_squeezer'
5
+ require_relative 'squeezer/path_squeezer'
6
+
7
+ module R2OAS
8
+ module Schema
9
+ module V3
10
+ class Squeezer < BaseSqueezer
11
+ def squeeze_docs
12
+ except_paths_schema = @schema_data.except('paths', 'tags', 'components')
13
+ components_schemas = @schema_data.slice('components')
14
+
15
+ path_squeezer = PathSqueezer.new(@schema_data, many_paths_file_paths: many_paths_file_paths)
16
+ tag_squeezer = TagSqueezer.new(@schema_data, many_paths_file_paths: many_paths_file_paths)
17
+
18
+ # To make components merge after paths
19
+ slice_schemas = [
20
+ tag_squeezer.squeeze_docs,
21
+ path_squeezer.squeeze_docs,
22
+ components_schemas
23
+ ]
24
+ slice_schemas.each_with_object(except_paths_schema) { |slice_schema, result| result.deep_merge!(slice_schema) }
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module R2OAS
4
+ module Schema
5
+ module V3
6
+ class BaseSqueezer < Base
7
+ def initialize(schema_data, options = {})
8
+ super(options)
9
+ @schema_data = schema_data
10
+ @tag_names = create_tag_names
11
+ end
12
+
13
+ def squeeze_docs
14
+ raise NoImplementError, 'Please implement in inherited class.'
15
+ end
16
+
17
+ private
18
+
19
+ attr_accessor :many_paths_file_paths
20
+
21
+ def create_tag_names
22
+ many_paths_file_paths.each_with_object([]) do |unit_paths_path, result|
23
+ paths_from_local = YAML.load_file(unit_paths_path)
24
+
25
+ tag_name_from_path = if paths_from_local['paths'].values[0].values[0].is_a?(Array)
26
+ 'unknown'
27
+ else
28
+ paths_from_local['paths'].values[0].values[0]['tags'][0]
29
+ end
30
+
31
+ result.push(tag_name_from_path)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_squeezer'
4
+
5
+ module R2OAS
6
+ module Schema
7
+ module V3
8
+ class PathSqueezer < BaseSqueezer
9
+ VERB = %w[get put post delete options head patch trace].freeze
10
+ NOT_VERB = %w[$ref summary description servers parameters].freeze
11
+
12
+ def squeeze_docs
13
+ slice_paths_schema = @schema_data['paths'].each_with_object({}) do |(path, data_when_path), result|
14
+ data_when_path.each do |verb_or_not, data_when_verb_or_not|
15
+ if VERB.include?(verb_or_not)
16
+ include_tag_name = data_when_verb_or_not['tags'].first.in? @tag_names
17
+ result.deep_merge!(path.to_s => data_when_path) if include_tag_name
18
+ elsif NOT_VERB.include?(verb_or_not)
19
+ result.deep_merge!(path.to_s => data_when_path)
20
+ end
21
+ end
22
+ end
23
+ { 'paths' => slice_paths_schema }
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_squeezer'
4
+
5
+ module R2OAS
6
+ module Schema
7
+ module V3
8
+ class TagSqueezer < BaseSqueezer
9
+ def squeeze_docs
10
+ slice_tags_schema = @schema_data['tags'].each_with_object([]) do |tag, result|
11
+ eql_tag_name = tag['name'].in? @tag_names
12
+ result.push(tag) if eql_tag_name
13
+ end
14
+ { 'tags' => slice_tags_schema }
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'sortable'
4
+ require_relative 'callable'
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module R2OAS
4
+ module Callable
5
+ def deep_call(data, target, callback)
6
+ return data unless data.is_a?(Hash)
7
+
8
+ data.each do |key, value|
9
+ if key.eql? target
10
+ data[key] = callback.call(value)
11
+ else
12
+ data[key] = deep_call(value, target, callback)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module R2OAS
4
+ module Sortable
5
+ def deep_sort(data, target)
6
+ if data.is_a?(Hash)
7
+ data.each_with_object({}) do |(key, value), result|
8
+ result[key] = if key.eql? target
9
+ if value.is_a?(Hash)
10
+ Hash[value.sort]
11
+ else
12
+ value
13
+ end
14
+ else
15
+ deep_sort(value, target)
16
+ end
17
+ end
18
+ else
19
+ data
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,122 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'digest/sha1'
4
+ require 'zlib'
5
+
6
+ require 'r2-oas/schema/manager/file_manager'
7
+
8
+ module R2OAS
9
+ class Store
10
+ attr_accessor :data
11
+
12
+ def initialize(type, data = {})
13
+ if data.empty?
14
+ @data = {}
15
+ @type = type
16
+ @data['type'] = type
17
+ @data['data'] = {}
18
+ else
19
+ @type = type
20
+ @data = data
21
+ end
22
+ end
23
+
24
+ def add(key, value)
25
+ case @type
26
+ when :schema
27
+ sha1 = calc_sha1(key, value)
28
+
29
+ @data['data'][sha1] ||= {}
30
+ @data['data'][sha1]['key'] = key
31
+ @data['data'][sha1]['value'] = Zlib::Deflate.deflate(value)
32
+ end
33
+ end
34
+
35
+ def save
36
+ @data['data'].values.each do |value|
37
+ case @type
38
+ when :schema
39
+ save_path = value['key']
40
+ save_data = Zlib::Inflate.inflate(value['value'])
41
+ manager = Schema::FileManager.new(save_path, :full)
42
+ manager.save(save_data)
43
+ yield save_path
44
+ end
45
+ end
46
+ end
47
+
48
+ def dup_slice(*sha1s)
49
+ dup_store = Store.new(@type, @data.dup)
50
+ dup_data = dup_store.data['data']
51
+ dup_store.data['data'] = sha1s.each_with_object({}) { |sha1, data| data[sha1] = dup_data[sha1] if dup_store.key?(sha1) }
52
+ dup_store
53
+ end
54
+
55
+ def checksum?
56
+ @data['data'].each_with_object([]) do |(sha1, value), arr|
57
+ child_key = value['key']
58
+ child_value = Zlib::Inflate.inflate(value['value'])
59
+ arr.push(sha1.eql? calc_sha1(child_key, child_value))
60
+ end.all?
61
+ end
62
+
63
+ def key?(key)
64
+ @data['data']&.key?(key)
65
+ end
66
+
67
+ def exists?
68
+ !@data['data']&.empty?
69
+ end
70
+
71
+ def diff_from(local_store)
72
+ to_hash = adjust(values.to_h, 'after')
73
+ from_hash = adjust(local_store.send(:values).to_h, 'before')
74
+ analyze_data = to_hash.deep_merge(from_hash)
75
+ if block_given?
76
+ yield analyze_data
77
+ else
78
+ analyze_data
79
+ end
80
+ end
81
+
82
+ private
83
+
84
+ def calc_sha1(key, value)
85
+ Digest::SHA1.hexdigest("#{key}\0#{value}")
86
+ end
87
+
88
+ def values
89
+ arr = @data['data'].values
90
+ arr.each_with_object([]) do |el, result|
91
+ key = el['key']
92
+ value = el['value']
93
+ result.push([key, value])
94
+ end
95
+ end
96
+
97
+ def adjust(hash, direct)
98
+ hash.each_with_object({}) do |(key, value), result|
99
+ result[key] = { direct => {} }
100
+ result[key][direct] = YAML.safe_load(Zlib::Inflate.inflate(value))
101
+ result
102
+ end
103
+ end
104
+
105
+ class << self
106
+ extend Forwardable
107
+
108
+ def_delegators :instance, :add, :save, :dup_slice, :checksum?, :key?, :exists?, :diff_from
109
+
110
+ def create(type = :schema)
111
+ instance(type)
112
+ end
113
+
114
+ private
115
+
116
+ def instance(type)
117
+ @instance ||= {}
118
+ @instance[type] ||= new(type)
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'deprecation/instance_delegator'
4
+ require_relative 'deprecation/reporting'
5
+ require_relative 'deprecation/behavior'
6
+
7
+ module R2OAS
8
+ class Deprecation
9
+ include Singleton
10
+ # Be sure to follow the Singleton module
11
+ include InstanceDelegator
12
+ include Behavior
13
+ include Reporting
14
+
15
+ # The version number in which the deprecated behavior will be removed, by default.
16
+ attr_accessor :deprecation_horizon
17
+
18
+ def initialize(deprecation_horizon = '0.4.2', gem_name = 'r2-oas')
19
+ self.gem_name = gem_name
20
+ self.deprecation_horizon = deprecation_horizon
21
+ self.silenced = false
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ # MEMO:
4
+ # copy from https://github.com/rails/rails/blob/master/activesupport/lib/active_support/deprecation/behaviors.rb
5
+ module R2OAS
6
+ class Deprecation
7
+ class DeprecationError < StandardError; end
8
+
9
+ DEFAULT_BEHAVIORS = {
10
+ stderr: lambda { |message, _callstack, _deprecation_horizon, _gem_name|
11
+ $stderr.puts(message)
12
+ }
13
+ }.freeze
14
+
15
+ module Behavior
16
+ def behavior
17
+ @behavior ||= [DEFAULT_BEHAVIORS[:stderr]]
18
+ end
19
+ end
20
+ end
21
+ end