r2-oas 0.3.4 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -1
  3. data/GEMSPEC.md +2 -2
  4. data/README.ja.md +54 -37
  5. data/README.md +50 -31
  6. data/lib/r2-oas.rb +3 -3
  7. data/lib/r2-oas/app_configuration.rb +16 -0
  8. data/lib/r2-oas/app_configuration/deprecation.rb +28 -0
  9. data/lib/r2-oas/configuration.rb +52 -0
  10. data/lib/r2-oas/deploy/client.rb +1 -1
  11. data/lib/r2-oas/{plugins/schema/v3/object → dynamic/schema/v3/object/from_routes}/hookable_base_object.rb +7 -7
  12. data/lib/r2-oas/errors.rb +5 -0
  13. data/lib/r2-oas/hooks/hook.rb +7 -5
  14. data/lib/r2-oas/pluggable_configuration.rb +8 -5
  15. data/lib/r2-oas/plugin/base.rb +44 -0
  16. data/lib/r2-oas/plugin/executor.rb +148 -0
  17. data/lib/r2-oas/plugin/hookable.rb +42 -0
  18. data/lib/r2-oas/plugin/public.rb +3 -0
  19. data/lib/r2-oas/plugin/transform/transform.rb +10 -0
  20. data/lib/r2-oas/plugin/transform/v3/transform.rb +20 -0
  21. data/lib/r2-oas/plugin/transform/v3/visitable.rb +37 -0
  22. data/lib/r2-oas/public.rb +5 -0
  23. data/lib/r2-oas/schema/base.rb +1 -1
  24. data/lib/r2-oas/schema/builder.rb +1 -1
  25. data/lib/r2-oas/schema/v3/analyzer/path_analyzer.rb +1 -1
  26. data/lib/r2-oas/schema/v3/builder.rb +1 -1
  27. data/lib/r2-oas/schema/v3/builder/base_builder.rb +14 -2
  28. data/lib/r2-oas/schema/v3/builder/doc_builder.rb +10 -2
  29. data/lib/r2-oas/schema/v3/generator/base_generator.rb +7 -2
  30. data/lib/r2-oas/schema/v3/generator/doc_generator.rb +1 -1
  31. data/lib/r2-oas/schema/v3/manager/file/include_ref_base_file_manager.rb +3 -2
  32. data/lib/r2-oas/schema/v3/object/from_files/base_object.rb +62 -0
  33. data/lib/r2-oas/schema/v3/object/from_files/components/request_body_object.rb +103 -0
  34. data/lib/r2-oas/schema/v3/object/from_files/components/schema_object.rb +102 -0
  35. data/lib/r2-oas/schema/v3/object/from_files/components_object.rb +46 -0
  36. data/lib/r2-oas/schema/v3/object/from_files/external_document_object.rb +23 -0
  37. data/lib/r2-oas/schema/v3/object/from_files/info_object.rb +23 -0
  38. data/lib/r2-oas/schema/v3/object/from_files/openapi_object.rb +61 -0
  39. data/lib/r2-oas/schema/v3/object/from_files/path_item_object.rb +110 -0
  40. data/lib/r2-oas/schema/v3/object/from_files/paths_object.rb +33 -0
  41. data/lib/r2-oas/schema/v3/object/from_files/utils/all.rb +4 -0
  42. data/lib/r2-oas/schema/v3/object/from_files/utils/deep_methods.rb +27 -0
  43. data/lib/r2-oas/schema/v3/object/from_files/utils/refs.rb +151 -0
  44. data/lib/r2-oas/schema/v3/object/{base_object.rb → from_routes/base_object.rb} +11 -1
  45. data/lib/r2-oas/schema/v3/object/{components → from_routes/components}/request_body_object.rb +23 -19
  46. data/lib/r2-oas/schema/v3/object/{components → from_routes/components}/schema_object.rb +16 -12
  47. data/lib/r2-oas/schema/v3/object/{components_object.rb → from_routes/components_object.rb} +11 -11
  48. data/lib/r2-oas/schema/v3/object/from_routes/external_document_object.rb +28 -0
  49. data/lib/r2-oas/schema/v3/object/{info_object.rb → from_routes/info_object.rb} +11 -2
  50. data/lib/r2-oas/schema/v3/object/{openapi_object.rb → from_routes/openapi_object.rb} +12 -11
  51. data/lib/r2-oas/schema/v3/object/{path_item_object.rb → from_routes/path_item_object.rb} +6 -6
  52. data/lib/r2-oas/schema/v3/object/{paths_object.rb → from_routes/paths_object.rb} +11 -8
  53. data/lib/r2-oas/schema/v3/object/{public.rb → from_routes/public.rb} +0 -0
  54. data/lib/r2-oas/schema/v3/object/{server_object.rb → from_routes/server_object.rb} +0 -0
  55. data/lib/r2-oas/schema/v3/object/{tag_object.rb → from_routes/tag_object.rb} +2 -1
  56. data/lib/r2-oas/schema/v3/object/store.rb +54 -0
  57. data/lib/r2-oas/shared/all.rb +1 -0
  58. data/lib/r2-oas/shared/callable.rb +17 -0
  59. data/lib/r2-oas/store.rb +20 -16
  60. data/lib/r2-oas/support/deprecation.rb +24 -0
  61. data/lib/r2-oas/support/deprecation/behavior.rb +21 -0
  62. data/lib/r2-oas/support/deprecation/instance_delegator.rb +42 -0
  63. data/lib/r2-oas/support/deprecation/reporting.rb +91 -0
  64. data/lib/r2-oas/task_logging.rb +3 -3
  65. data/lib/r2-oas/tasks/common.rake +1 -1
  66. data/lib/r2-oas/tasks/main.rake +31 -9
  67. data/lib/r2-oas/tasks/tool.rake +7 -4
  68. data/lib/r2-oas/version.rb +1 -1
  69. metadata +49 -22
  70. data/lib/r2-oas/schema/v3/object/external_document_object.rb +0 -19
@@ -1,28 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'r2-oas/plugins/schema/v3/object/hookable_base_object'
3
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
4
4
  require 'r2-oas/schema/v3/manager/file/components_file_manager'
5
5
 
6
6
  module R2OAS
7
7
  module Schema
8
8
  module V3
9
9
  module Components
10
- class RequestBodyObject < R2OAS::Plugins::Schema::V3::HookableBaseObject
11
- def initialize(route_data, path)
12
- super()
10
+ class RequestBodyObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
11
+ def initialize(route_data, path, opts = {})
12
+ super(opts)
13
13
  @path_comp = Routing::PathComponent.new(path)
14
14
  @path = @path_comp.symbol_to_brace
15
15
  @route_data = route_data
16
16
  @verb = route_data[:verb]
17
17
  @tag_name = route_data[:tag_name]
18
18
  @schema_name = route_data[:schema_name]
19
+ # MEMO:
20
+ # Allow primitive types that cannot be passed by reference to be passed by reference
21
+ # This is Compromise
22
+ @ref = { schema_name: @schema_name, tag_name: @tag_name, verb: @verb }
19
23
  end
20
24
 
21
25
  def to_doc
22
26
  execute_before_create(@schema_name)
23
27
  create_doc do
24
28
  child_file_manager = ComponentsFileManager.new("#/components/schemas/#{_components_schema_name}", :ref)
25
- schema_object = components_schema_object_class.new(@route_data, @path)
29
+ schema_object = components_schema_object_class.new(@route_data, @path, @opts)
26
30
 
27
31
  unless child_file_manager.skip_save?
28
32
  result = {
@@ -45,20 +49,6 @@ module R2OAS
45
49
  doc
46
50
  end
47
51
 
48
- def create_doc
49
- file_manager = ComponentsFileManager.new("#/components/schemas/#{_components_schema_name}", :ref)
50
- doc.deep_merge!(
51
- 'content' => {
52
- 'application/json' => {
53
- 'schema' => {
54
- '$ref' => file_manager.original_path
55
- }
56
- }
57
- }
58
- )
59
- yield if block_given?
60
- end
61
-
62
52
  # MEMO:
63
53
  # please override in inherited class.
64
54
  def components_schema_name(_doc, _path_component, _tag_name, _verb, schema_name)
@@ -78,6 +68,20 @@ module R2OAS
78
68
 
79
69
  private
80
70
 
71
+ def create_doc
72
+ file_manager = ComponentsFileManager.new("#/components/schemas/#{_components_schema_name}", :ref)
73
+ doc.deep_merge!(
74
+ 'content' => {
75
+ 'application/json' => {
76
+ 'schema' => {
77
+ '$ref' => file_manager.original_path
78
+ }
79
+ }
80
+ }
81
+ )
82
+ yield if block_given?
83
+ end
84
+
81
85
  def _components_schema_name
82
86
  components_schema_name(doc, @path_comp, @tag_name, @verb, @schema_name)
83
87
  end
@@ -1,20 +1,24 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'r2-oas/plugins/schema/v3/object/hookable_base_object'
3
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
4
4
 
5
5
  module R2OAS
6
6
  module Schema
7
7
  module V3
8
8
  module Components
9
- class SchemaObject < R2OAS::Plugins::Schema::V3::HookableBaseObject
10
- def initialize(route_data, path)
11
- super()
9
+ class SchemaObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
10
+ def initialize(route_data, path, opts = {})
11
+ super(opts)
12
12
  @path_comp = Routing::PathComponent.new(path)
13
13
  @path = @path_comp.symbol_to_brace
14
14
  @route_data = route_data
15
15
  @verb = route_data[:verb]
16
16
  @tag_name = route_data[:tag_name]
17
17
  @schema_name = route_data[:schema_name]
18
+ # MEMO:
19
+ # Allow primitive types that cannot be passed by reference to be passed by reference
20
+ # This is Compromise
21
+ @ref = { schema_name: @schema_name, tag_name: @tag_name, verb: @verb }
18
22
  end
19
23
 
20
24
  def to_doc
@@ -24,6 +28,14 @@ module R2OAS
24
28
  doc
25
29
  end
26
30
 
31
+ # MEMO:
32
+ # please override in inherited class.
33
+ def components_schema_name(_doc, _path_component, _tag_name, _verb, _http_status, schema_name)
34
+ schema_name
35
+ end
36
+
37
+ private
38
+
27
39
  def create_doc
28
40
  result = {
29
41
  'type' => 'object',
@@ -37,14 +49,6 @@ module R2OAS
37
49
  doc.merge!(result)
38
50
  end
39
51
 
40
- # MEMO:
41
- # please override in inherited class.
42
- def components_schema_name(_doc, _path_component, _tag_name, _verb, _http_status, schema_name)
43
- schema_name
44
- end
45
-
46
- private
47
-
48
52
  def _components_schema_name(http_status)
49
53
  components_schema_name(doc, @path_comp, @tag_name, @verb, http_status, @schema_name)
50
54
  end
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'r2-oas/plugins/schema/v3/object/hookable_base_object'
3
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
4
4
  require_relative 'components/schema_object'
5
5
  require_relative 'components/request_body_object'
6
6
 
7
7
  module R2OAS
8
8
  module Schema
9
9
  module V3
10
- class ComponentsObject < R2OAS::Plugins::Schema::V3::HookableBaseObject
11
- def initialize(routes_data)
12
- super()
10
+ class ComponentsObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
11
+ def initialize(routes_data, opts = {})
12
+ super(opts)
13
13
  @routes_data = routes_data
14
14
  end
15
15
 
@@ -40,12 +40,12 @@ module R2OAS
40
40
  # ]
41
41
  def components_schema_docs
42
42
  @routes_data.each_with_object({}) do |(route_el), data|
43
- path = route_el[:path]
44
- route_data = route_el[:data]
43
+ path = route_el[:path]
44
+ route_data = route_el[:data]
45
45
 
46
- path_item_object = path_item_object_class.new(route_data, path)
46
+ path_item_object = path_item_object_class.new(route_data, path, @opts)
47
47
  path_item_object.http_statuses.each do |http_status|
48
- components_schema_object = components_schema_object_class.new(route_data, path)
48
+ components_schema_object = components_schema_object_class.new(route_data, path, @opts)
49
49
  components_schema_doc = components_schema_object.to_doc
50
50
  schema_name = components_schema_object.send(:_components_schema_name, http_status)
51
51
 
@@ -60,10 +60,10 @@ module R2OAS
60
60
 
61
61
  def components_request_body_docs
62
62
  @routes_data.each_with_object({}) do |(route_el), data|
63
- path = route_el[:path]
64
- route_data = route_el[:data]
63
+ path = route_el[:path]
64
+ route_data = route_el[:data]
65
65
 
66
- components_request_body_object = components_request_body_object_class.new(route_data, path)
66
+ components_request_body_object = components_request_body_object_class.new(route_data, path, @opts)
67
67
  next unless components_request_body_object.generate?
68
68
 
69
69
  components_request_body_doc = components_request_body_object.to_doc
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
4
+
5
+ module R2OAS
6
+ module Schema
7
+ module V3
8
+ class ExternalDocumentObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
9
+ def to_doc
10
+ execute_before_create
11
+ create_doc
12
+ execute_after_create
13
+ doc
14
+ end
15
+
16
+ private
17
+
18
+ def create_doc
19
+ result = {
20
+ 'description' => '',
21
+ 'url' => ''
22
+ }
23
+ doc.merge!(result)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -1,11 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'r2-oas/plugins/schema/v3/object/hookable_base_object'
3
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
4
4
 
5
5
  module R2OAS
6
6
  module Schema
7
7
  module V3
8
- class InfoObject < R2OAS::Plugins::Schema::V3::HookableBaseObject
8
+ class InfoObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
9
+ def to_doc
10
+ execute_before_create
11
+ create_doc
12
+ execute_after_create
13
+ doc
14
+ end
15
+
16
+ private
17
+
9
18
  def create_doc
10
19
  result = {
11
20
  'title' => 'OAS API Document Title',
@@ -8,15 +8,15 @@ module R2OAS
8
8
  module Schema
9
9
  module V3
10
10
  class OpenapiObject < BaseObject
11
- def initialize(routes_data, tags_data, schemas_data)
12
- super()
13
- @routes_data = routes_data
14
- @tags_data = tags_data
11
+ def initialize(routes_data, tags_data, schemas_data, opts = {})
12
+ super(opts)
13
+ @routes_data = routes_data
14
+ @tags_data = tags_data
15
15
  @schemas_data = schemas_data
16
16
  end
17
17
 
18
18
  def to_doc
19
- {
19
+ result = {
20
20
  'openapi' => '3.0.0',
21
21
  'info' => info_doc,
22
22
  'tags' => tags_doc,
@@ -25,32 +25,33 @@ module R2OAS
25
25
  'servers' => servers_doc,
26
26
  'components' => components_doc
27
27
  }
28
+ result
28
29
  end
29
30
 
30
31
  private
31
32
 
32
33
  def info_doc
33
- info_object_class.new.to_doc
34
+ info_object_class.new(@opts).to_doc
34
35
  end
35
36
 
36
37
  def tags_doc
37
- TagObject.new(@tags_data).to_doc
38
+ TagObject.new(@tags_data, @opts).to_doc
38
39
  end
39
40
 
40
41
  def paths_doc
41
- paths_object_class.new(@routes_data).to_doc
42
+ paths_object_class.new(@routes_data, @opts).to_doc
42
43
  end
43
44
 
44
45
  def external_docs_doc
45
- external_document_object_class.new.to_doc
46
+ external_document_object_class.new(@opts).to_doc
46
47
  end
47
48
 
48
49
  def servers_doc
49
- ServerObject.new.to_doc
50
+ ServerObject.new(@opts).to_doc
50
51
  end
51
52
 
52
53
  def components_doc
53
- components_object_class.new(@routes_data).to_doc
54
+ components_object_class.new(@routes_data, @opts).to_doc
54
55
  end
55
56
  end
56
57
  end
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'forwardable'
4
- require 'r2-oas/plugins/schema/v3/object/hookable_base_object'
4
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
5
5
  require 'r2-oas/routing/components/path_component'
6
6
 
7
7
  module R2OAS
8
8
  module Schema
9
9
  module V3
10
- class PathItemObject < R2OAS::Plugins::Schema::V3::HookableBaseObject
10
+ class PathItemObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
11
11
  extend Forwardable
12
12
  # reference
13
13
  # https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.0.md#path-item-object
@@ -16,8 +16,8 @@ module R2OAS
16
16
 
17
17
  def_delegators :@http_status_manager, :http_statuses
18
18
 
19
- def initialize(route_data, path)
20
- super()
19
+ def initialize(route_data, path, opts = {})
20
+ super(opts)
21
21
  @path_comp = Routing::PathComponent.new(path)
22
22
  @path = @path_comp.symbol_to_brace
23
23
  @route_data = route_data
@@ -27,8 +27,8 @@ module R2OAS
27
27
  @required_parameters = route_data[:required_parameters]
28
28
  @format_name = create_format_name
29
29
  @http_status_manager = HttpStatusManager.new(@path, @verb, http_statuses_when_http_method)
30
- @components_schema_object = components_schema_object_class.new(route_data, path)
31
- @components_request_body_object = components_request_body_object_class.new(route_data, path)
30
+ @components_schema_object = components_schema_object_class.new(route_data, path, opts)
31
+ @components_request_body_object = components_request_body_object_class.new(route_data, path, opts)
32
32
  support_field_name? if route_data.key?(:verb)
33
33
  end
34
34
 
@@ -1,13 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'r2-oas/plugins/schema/v3/object/hookable_base_object'
3
+ require 'r2-oas/dynamic/schema/v3/object/from_routes/hookable_base_object'
4
+ require 'r2-oas/routing/components/path_component'
4
5
 
5
6
  module R2OAS
6
7
  module Schema
7
8
  module V3
8
- class PathsObject < R2OAS::Plugins::Schema::V3::HookableBaseObject
9
- def initialize(routes_data)
10
- super()
9
+ class PathsObject < R2OAS::Dynamic::Schema::V3::HookableBaseObject
10
+ def initialize(routes_data, opts = {})
11
+ super(opts)
11
12
  @routes_data = routes_data
12
13
  define_hookable_tmp_object_class
13
14
  end
@@ -16,7 +17,7 @@ module R2OAS
16
17
  if unit_paths_file_path.present?
17
18
  unit_paths_data = YAML.load_file(unit_paths_file_path)['paths']
18
19
  result = unit_paths_data.each_with_object({}) do |(path, path_item_doc), docs|
19
- docs[path] = HookableTmpObjectClass.new(path_item_doc, path).to_doc
20
+ docs[path] = HookableTmpObjectClass.new(path_item_doc, path, @opts).to_doc
20
21
  end
21
22
  else
22
23
  result = path_item_docs.each_with_object({}) do |(path, path_item_doc), docs|
@@ -30,10 +31,11 @@ module R2OAS
30
31
 
31
32
  def define_hookable_tmp_object_class
32
33
  klass = Class.new(path_item_object_class) do |_c|
33
- def initialize(data, path)
34
- super
34
+ def initialize(data, path, opts = {})
35
+ super(opts)
35
36
  @data = data
36
37
  @path = path
38
+ @path_comp = Routing::PathComponent.new(path)
37
39
  use_superclass_hook
38
40
  end
39
41
 
@@ -45,6 +47,7 @@ module R2OAS
45
47
  execute_before_create(@path)
46
48
  create_doc
47
49
  execute_after_create(@path)
50
+ execute_transform_plugins(:path_item, doc, @path_comp)
48
51
  doc
49
52
  end
50
53
  end
@@ -60,7 +63,7 @@ module R2OAS
60
63
  path = route_el[:path]
61
64
  route_data = route_el[:data]
62
65
 
63
- path_item_doc = path_item_object_class.new(route_data, path).to_doc
66
+ path_item_doc = path_item_object_class.new(route_data, path, @opts).to_doc
64
67
  if data[path].present?
65
68
  data[path].merge!(path_item_doc)
66
69
  else
@@ -7,7 +7,8 @@ module R2OAS
7
7
  module Schema
8
8
  module V3
9
9
  class TagObject < BaseObject
10
- def initialize(tags_data)
10
+ def initialize(tags_data, opts = {})
11
+ super(opts)
11
12
  @tags_data = tags_data
12
13
  end
13
14
 
@@ -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