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