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,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/base'
4
+ require 'r2-oas/hooks/hook'
5
+ require_relative 'hookable'
6
+
7
+ module R2OAS
8
+ module Plugin
9
+ class Base < ::R2OAS::Base
10
+ extend ::R2OAS::Plugin::Hookable
11
+
12
+ class << self
13
+ attr_accessor :plugin_name, :type, :opts
14
+
15
+ def setup(&block)
16
+ return unless block_given?
17
+
18
+ callback = proc { |*args| block.call(*args) }
19
+ on(:setup, callback)
20
+ end
21
+
22
+ def teardown(&block)
23
+ return unless block_given?
24
+
25
+ callback = proc { |*args| block.call(*args) }
26
+ on(:teardown, callback)
27
+ end
28
+
29
+ def execute_setup(*args)
30
+ execute_hook(:setup, *args)
31
+ end
32
+
33
+ def execute_teardown(*args)
34
+ execute_hook(:teardown, *args)
35
+ end
36
+
37
+ def inherited(base)
38
+ super
39
+ base.opts = {}
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'hookable'
4
+ require 'r2-oas/errors'
5
+
6
+ module R2OAS
7
+ module Plugin
8
+ class Executor
9
+ extend ::R2OAS::Plugin::Hookable
10
+
11
+ def initialize(plugins, opts)
12
+ @plugins = plugins
13
+ @use_plugin = !!opts[:use_plugin]
14
+ end
15
+
16
+ def execute_transform_plugins(hook_method, *args)
17
+ return unless @use_plugin
18
+ return unless @plugins.present?
19
+
20
+ @plugin_map ||= self.class.plugin_map(@plugins)
21
+
22
+ self.class.execute_transform_plugins(@plugin_map, hook_method, *args)
23
+ end
24
+
25
+ class << self
26
+ attr_accessor :plugin_map
27
+
28
+ def execute_transform_plugins(plugin_map, hook_method, *args)
29
+ execute_plugins(plugin_map, :transform, hook_method, *args)
30
+ end
31
+
32
+ def execute_plugins(plugin_map, type, hook_method, *args)
33
+ return unless plugin_map.present?
34
+
35
+ plugins_info = plugin_map[type.to_sym][hook_method.to_sym]
36
+
37
+ return if plugins_info.nil?
38
+
39
+ plugins_info.each do |info|
40
+ opts = info[:plugin_opts]
41
+ klass = info[:plugin_klass]
42
+ klass.send(:opts=, opts) if opts.present?
43
+ klass.send(info[:execute_hook_method], *args)
44
+ end
45
+ end
46
+
47
+ # e.g.)
48
+ # {
49
+ # transform: {
50
+ # setup: [
51
+ # { plugin_name: 'r2oas-transform-plugin-sample1', plugin_klass: Sample1Plugin, hook_method: :setup },
52
+ # { plugin_name: 'r2oas-transform-plugin-sample2', plugin_klass: Sample2Plugin, hook_method: :setup },
53
+ # ],
54
+ # info: [
55
+ # { plugin_name: 'r2oas-transform-plugin-sample1', plugin_klass: Sample1Plugin, hook_method: :info },
56
+ # ]
57
+ # }
58
+ # }
59
+ #
60
+ def plugin_map(plugins)
61
+ @plugin_map ||= {}
62
+ return @plugin_map if @plugin_map.present?
63
+
64
+ @will_plugins = []
65
+
66
+ use_plugins_info = create_use_plugins_info(plugins)
67
+
68
+ loaded_plugins_hooks_map = hooks_map.each_with_object({}) do |(klass, repo), result|
69
+ # MEMO:
70
+ # klass may be DynamicSchema or Plugin or Other Class
71
+ next unless klass.respond_to?(:plugin_name)
72
+ # Plugins that are loaded but not used
73
+ next unless use_plugins_info.keys.include?(klass.plugin_name)
74
+
75
+ result[klass.plugin_name] = { klass: klass, repo: repo }
76
+ end
77
+
78
+ unknown_plugins = use_plugins_info.keys - loaded_plugins_hooks_map.keys
79
+
80
+ raise R2OAS::PluginLoadError, "The '#{unknown_plugins.join(', ')}' plugin doesn't exist or can't be loaded" if unknown_plugins.present?
81
+
82
+ loaded_plugins_hooks_map.each do |plugin_name, info|
83
+ plugin_klass = info[:klass]
84
+ repo = info[:repo]
85
+
86
+ repo.global_hooks_data.each do |hook_method, callbacks|
87
+ callbacks.each do
88
+ plugin_type = plugin_klass.type
89
+
90
+ data = {
91
+ plugin_name: plugin_name,
92
+ plugin_klass: plugin_klass,
93
+ plugin_opts: use_plugins_info[plugin_name],
94
+ execute_hook_method: "execute_#{hook_method}"
95
+ }
96
+
97
+ if @plugin_map[plugin_type].present?
98
+ if @plugin_map[plugin_type][hook_method].present?
99
+ @plugin_map[plugin_type][hook_method].push(data)
100
+ else
101
+ @plugin_map[plugin_type][hook_method] = [data]
102
+ end
103
+ else
104
+ @plugin_map[plugin_type] = {}
105
+ @plugin_map[plugin_type][hook_method] = [data]
106
+ end
107
+ end
108
+ end
109
+ end
110
+
111
+ @plugin_map
112
+ end
113
+
114
+ def create_use_plugins_info(plugins)
115
+ will_use_plugins = []
116
+ result = {}
117
+
118
+ plugins.each do |plugin_info|
119
+ case plugin_info
120
+ when Array
121
+ plugin_name = plugin_info[0]
122
+ plugin_opts = plugin_info[1]
123
+
124
+ raise PluginNameError, 'Missing plugin name' if plugin_name.blank?
125
+
126
+ result[plugin_name] = plugin_opts
127
+ when String
128
+ plugin_name = plugin_info
129
+ plugin_opts = nil
130
+
131
+ result[plugin_name] = plugin_opts
132
+ else
133
+ raise NoSupportError, "The plugin loading format '#{plugin_info.class}' is incorrect"
134
+ end
135
+
136
+ if will_use_plugins.include?(plugin_name)
137
+ raise PluginDuplicationError, "Plugin: duplicate '#{plugin_name}'"
138
+ else
139
+ will_use_plugins.push(plugin_name)
140
+ end
141
+ end
142
+
143
+ result
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/hooks/hook'
4
+
5
+ module R2OAS
6
+ module Plugin
7
+ module Hookable
8
+ def hooks_map
9
+ hook_klass.repository[:plugin]
10
+ end
11
+
12
+ def hooks
13
+ hooks_map[self].global_hooks_data
14
+ end
15
+
16
+ def hook_klass=(klass)
17
+ @@hook_klass = klass
18
+ end
19
+
20
+ def hook_klass
21
+ @@hook_klass
22
+ end
23
+
24
+ def on(on, callback, once = false)
25
+ hook_klass.on(on, callback, self, once)
26
+ end
27
+
28
+ # MEMO: Do not Use
29
+ def off(on, callback, once = false)
30
+ hook_klass.off(on, callback, self, once)
31
+ end
32
+
33
+ def execute_hook(on, *data)
34
+ hook_klass.execute_hook(on, *data, self)
35
+ end
36
+
37
+ def has_hook?(name)
38
+ hook_klass.has_hook?(name, self)
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'transform/transform'
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/plugin/transform/v3/transform'
4
+
5
+ R2OAS::Plugin::Transform = case ::R2OAS.version
6
+ when :v3
7
+ R2OAS::Plugin::V3::Transform
8
+ else
9
+ raise NoImplementError, "Do not support version: #{::R2OAS.version}"
10
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'visitable'
4
+ require 'r2-oas/plugin/base'
5
+
6
+ module R2OAS
7
+ module Plugin
8
+ module V3
9
+ class Transform < ::R2OAS::Plugin::Base
10
+ extend Visitable
11
+
12
+ def self.inherited(base)
13
+ super
14
+ self.hook_klass = ::R2OAS::Hooks::Hook.register(:plugin, base)
15
+ base.type = :transform
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/plugin/hookable'
4
+
5
+ module R2OAS
6
+ module Plugin
7
+ module V3
8
+ module Visitable
9
+ include R2OAS::Plugin::Hookable
10
+
11
+ SCHEMA_OBJECTS = %i[
12
+ info
13
+ path_item
14
+ external_document
15
+ components_schema
16
+ components_request_body
17
+ components_schema_name
18
+ components_schema_name_at_request_body
19
+ components_request_body_name
20
+ ].freeze
21
+
22
+ SCHEMA_OBJECTS.each do |schema_name|
23
+ define_method schema_name.to_s do |&block|
24
+ return if block.blank?
25
+
26
+ callback = proc { |*args| block.call(*args) }
27
+ on(schema_name, callback)
28
+ end
29
+
30
+ define_method "execute_#{schema_name}" do |*args|
31
+ execute_hook(schema_name, *args)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'r2-oas/configuration'
4
+ require 'r2-oas/errors'
5
+ require 'r2-oas/schema/v3/object/from_routes/public'
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base'
4
+ require_relative 'components/all'
5
+
6
+ module R2OAS
7
+ module Routing
8
+ class Adjustor < Base
9
+ VALID_KEYS = %i[route name verb path reqs].freeze
10
+
11
+ def initialize(route_data)
12
+ valid_route_data?(route_data)
13
+ @route_data = route_data
14
+ @route = route_data[:route]
15
+ @path_comp = PathComponent.new(route_data[:path])
16
+ @request_comp = RequestComponent.new(route_data[:reqs], @route.engine?)
17
+ @verb_comp = VerbComponent.new(route_data[:verb])
18
+ @verbs = @verb_comp.verbs
19
+ end
20
+
21
+ def routes_els
22
+ @verbs.each_with_object([]) do |verb, result|
23
+ route_el = {}
24
+ route_el[:path] = @path_comp.symbol_to_brace
25
+ route_el[:data] = {
26
+ verb: verb,
27
+ path: @path_comp.symbol_to_brace,
28
+ tag_name: @request_comp.to_tag_name,
29
+ schema_name: @request_comp.to_schema_name,
30
+ format_name: @request_comp.to_format_name,
31
+ required_parameters: @path_comp.path_parameters_data
32
+ }
33
+ result.push route_el
34
+ end
35
+ end
36
+
37
+ private
38
+
39
+ def valid_route_data?(route_data)
40
+ raise 'Invalid params' unless route_data.keys.eql?(VALID_KEYS)
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ # MEMO
4
+ # load this file before autoload ::R2OAS::Base
5
+ require 'r2-oas/base'
6
+
7
+ module R2OAS
8
+ module Routing
9
+ class Base < ::R2OAS::Base
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'path_component'
4
+ require_relative 'request_component'
5
+ require_relative 'verb_component'
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../base'
4
+
5
+ module R2OAS
6
+ module Routing
7
+ class BaseComponent < Base
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'base_component'
4
+
5
+ module R2OAS
6
+ module Routing
7
+ class PathComponent < BaseComponent
8
+ FORMAT_PATH_PARAMETER_REGEXP = /\(.+\)/.freeze
9
+ SYMBOL_PATH_PARAMETER_REGEXP = /:(.\w+)/.freeze
10
+ BRACE_PATH_PARAMETER_REGEXP = /\{(.\w+)\}/.freeze
11
+
12
+ def initialize(path)
13
+ super()
14
+ @path = path
15
+ end
16
+
17
+ def to_s
18
+ without_format.to_s
19
+ end
20
+
21
+ def symbol_to_brace
22
+ return without_format unless exist_path_parameters?
23
+
24
+ path_parameters.each_with_object(without_format) do |path_parameter, result|
25
+ result.gsub!(":#{path_parameter}", "{#{path_parameter}}")
26
+ end
27
+ end
28
+
29
+ def path_parameters_data
30
+ return {} unless exist_path_parameters?
31
+
32
+ path_parameters.each_with_object({}) do |path_parameter, data|
33
+ type = (path_parameter =~ /id/ ? 'integer' : 'string')
34
+ data.merge!(
35
+ "#{path_parameter}": {
36
+ type: type
37
+ }
38
+ )
39
+ end
40
+ end
41
+
42
+ def path_excluded_path_parameters
43
+ excluded_path_parameters = path_parameters.each_with_object(symbol_to_brace) do |path_parameter, result|
44
+ result.gsub!("{#{path_parameter}}", '')
45
+ end
46
+ excluded_path_parameters.split('/').delete_if(&:empty?).join('/')
47
+ end
48
+
49
+ def exist_path_parameters?
50
+ path_parameters.present?
51
+ end
52
+
53
+ def path_parameters
54
+ result = without_format.scan(SYMBOL_PATH_PARAMETER_REGEXP) + without_format.scan(BRACE_PATH_PARAMETER_REGEXP)
55
+ result.flatten
56
+ end
57
+
58
+ private
59
+
60
+ # e.x.) "/tasks(.:format)" => "/tasks"
61
+ # e.x.) "/:model_name/:id/show_in_app(.:format)" => "/{model_name}/{id}/show_in_app"
62
+ def without_format
63
+ @path.gsub(FORMAT_PATH_PARAMETER_REGEXP, '')
64
+ end
65
+ end
66
+ end
67
+ end