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