rails-route-checker 0.2.1 → 0.2.6

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 03ed64e49d9050509ae5295e0316b36bd8adce8c
4
- data.tar.gz: b80c5b8fb5b74f8e1bde7d1a01be06181adec0c2
2
+ SHA256:
3
+ metadata.gz: 91a3036bc852166e6e8d63efc1f3d319932bba5f3bbd361c5dbb08994e7878ad
4
+ data.tar.gz: 77345a3517d9812ad4a9d8357ed3cc170c129a0a1641925e5fda4fb9dda65ec5
5
5
  SHA512:
6
- metadata.gz: 56169fb79ebacfde4bb198192315fb66b291f3d06691f8c53160568b45abe9d417063954bc7746403268de5770fca148c696285353b2acdcf93bedc7e25a6d9b
7
- data.tar.gz: c8a8c3f3427e635bc3bfa93a783cfd1de93bd773731e0f0b2f7b614cbb22e71325f7bb5d43f8d2b11f3d7b933e7d0c773191b37279bb9c75e931244959c505bb
6
+ metadata.gz: '019c96a2f0cd7b618f5356f11a11f6eabce34cbc0735d91d500b31e8082a0749f5047fdb6f4e1394025b4a19d993a48e5e7f9846f51de10319ec428f88f54791'
7
+ data.tar.gz: bdd94456a37c71846c2d878238e226097273728c69ac74b198533d9fa232e5893badd844209b34940b28a0b7a4dc4586a437db78fc48ab36f341f2f49f2934bd
data/Gemfile CHANGED
@@ -1,2 +1,4 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source 'https://rubygems.org'
2
4
  gemspec
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'rails-route-checker'
4
5
  require 'optparse'
@@ -24,6 +25,6 @@ end.parse!
24
25
 
25
26
  options[:config_file] = '.rails-route-checker.yml' if File.exist?('.rails-route-checker.yml') && !options[:config_file]
26
27
 
27
- rrc = RailsRouteChecker::Runner.new(options)
28
+ rrc = RailsRouteChecker::Runner.new(**options)
28
29
  puts rrc.output
29
30
  exit rrc.issues? ? 1 : 0
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'rails-route-checker/app_interface'
2
4
  require_relative 'rails-route-checker/config_file'
3
5
  require_relative 'rails-route-checker/loaded_app'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  class AppInterface
3
5
  def initialize(**opts)
@@ -10,7 +12,7 @@ module RailsRouteChecker
10
12
  action = r.requirements[:action]
11
13
 
12
14
  next if options[:ignored_controllers].include?(controller)
13
- next if controller_information.key?(controller) && controller_information[controller][:actions].include?(action)
15
+ next if controller_has_action?(controller, action)
14
16
 
15
17
  {
16
18
  controller: controller,
@@ -37,22 +39,34 @@ module RailsRouteChecker
37
39
  end
38
40
  end
39
41
 
42
+ def controller_has_action?(controller, action)
43
+ return false unless controller_information.key?(controller)
44
+
45
+ info = controller_information[controller]
46
+ return true if info[:actions].include?(action)
47
+ return true if info[:lookup_context]&.template_exists?("#{controller}/#{action}")
48
+
49
+ false
50
+ end
51
+
40
52
  def generate_undef_view_path_calls
41
53
  generate_undef_view_path_calls_erb + generate_undef_view_path_calls_haml
42
54
  end
43
55
 
44
56
  def generate_undef_view_path_calls_erb
45
- files = `find app -type f -iregex '.*\\.erb'`.split("\n")
57
+ files = Dir['app/**/*.erb']
46
58
  return [] if files.none?
47
59
 
48
60
  RailsRouteChecker::Parsers::Loader.load_parser(:erb)
49
61
 
50
62
  files.map do |filename|
51
63
  controller = controller_from_view_file(filename)
64
+ next unless controller # controller will be nil if it's an ignored controller
52
65
 
53
66
  filter = lambda do |path_or_url|
54
67
  return false if match_in_whitelist?(filename, path_or_url)
55
68
  return false if match_defined_in_view?(controller, path_or_url)
69
+
56
70
  true
57
71
  end
58
72
 
@@ -61,7 +75,7 @@ module RailsRouteChecker
61
75
  end
62
76
 
63
77
  def generate_undef_view_path_calls_haml
64
- files = `find app -type f -iregex '.*\\.haml'`.split("\n")
78
+ files = Dir['app/**/*.haml']
65
79
  return [] if files.none?
66
80
 
67
81
  unless RailsRouteChecker::Parsers::Loader.haml_available?
@@ -74,10 +88,12 @@ module RailsRouteChecker
74
88
 
75
89
  files.map do |filename|
76
90
  controller = controller_from_view_file(filename)
91
+ next unless controller # controller will be nil if it's an ignored controller
77
92
 
78
93
  filter = lambda do |path_or_url|
79
94
  return false if match_in_whitelist?(filename, path_or_url)
80
95
  return false if match_defined_in_view?(controller, path_or_url)
96
+
81
97
  true
82
98
  end
83
99
 
@@ -86,7 +102,7 @@ module RailsRouteChecker
86
102
  end
87
103
 
88
104
  def generate_undef_controller_path_calls
89
- files = `find app/controllers -type f -iregex '.*\\.rb'`.split("\n")
105
+ files = Dir['app/controllers/**/*.rb']
90
106
  return [] if files.none?
91
107
 
92
108
  RailsRouteChecker::Parsers::Loader.load_parser(:ruby)
@@ -98,6 +114,7 @@ module RailsRouteChecker
98
114
  filter = lambda do |path_or_url|
99
115
  return false if match_in_whitelist?(filename, path_or_url)
100
116
  return false if match_defined_in_ruby?(controller, path_or_url)
117
+
101
118
  return true
102
119
  end
103
120
 
@@ -108,18 +125,21 @@ module RailsRouteChecker
108
125
  def match_in_whitelist?(filename, path_or_url)
109
126
  possible_route_name = path_or_url.sub(/_(?:url|path)$/, '')
110
127
  return true if options[:ignored_paths].include?(possible_route_name)
128
+
111
129
  (options[:ignored_path_whitelist][filename] || []).include?(path_or_url)
112
130
  end
113
131
 
114
132
  def match_defined_in_view?(controller, path_or_url)
115
133
  possible_route_name = path_or_url.sub(/_(?:url|path)$/, '')
116
134
  return true if loaded_app.all_route_names.include?(possible_route_name)
135
+
117
136
  controller && controller[:helpers].include?(path_or_url)
118
137
  end
119
138
 
120
139
  def match_defined_in_ruby?(controller, path_or_url)
121
140
  possible_route_name = path_or_url.sub(/_(?:url|path)$/, '')
122
141
  return true if loaded_app.all_route_names.include?(possible_route_name)
142
+
123
143
  controller && controller[:instance_methods].include?(path_or_url)
124
144
  end
125
145
 
@@ -127,20 +147,26 @@ module RailsRouteChecker
127
147
  split_path = filename.split('/')
128
148
  possible_controller_path = split_path[(split_path.index('app') + 2)..-2]
129
149
 
130
- controller = nil
131
- while controller.nil? && possible_controller_path.any?
132
- if controller_information.include?(possible_controller_path.join('/'))
133
- controller = controller_information[possible_controller_path.join('/')]
134
- else
135
- possible_controller_path = possible_controller_path[0..-2]
136
- end
150
+ while possible_controller_path.any?
151
+ controller_name = possible_controller_path.join('/')
152
+ return controller_information[controller_name] if controller_exists?(controller_name)
153
+
154
+ possible_controller_path = possible_controller_path[0..-2]
137
155
  end
138
- controller || controller_information['application']
156
+ controller_information['application']
139
157
  end
140
158
 
141
159
  def controller_from_ruby_file(filename)
142
- controller_name = (filename.match(%r{app/controllers/(.*)_controller.rb}) || [])[1] || 'application'
143
- controller_information[controller_name]
160
+ controller_name = (filename.match(%r{app/controllers/(.*)_controller.rb}) || [])[1]
161
+ return controller_information[controller_name] if controller_exists?(controller_name)
162
+
163
+ controller_information['application']
164
+ end
165
+
166
+ def controller_exists?(controller_name)
167
+ return false unless controller_name
168
+
169
+ File.exist?("app/controllers/#{controller_name}_controller.rb")
144
170
  end
145
171
  end
146
172
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  class ConfigFile
3
5
  def initialize(filename)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  class LoadedApp
3
5
  def initialize
@@ -40,14 +42,13 @@ module RailsRouteChecker
40
42
  @controller_information ||= ActionController::Base.descendants.map do |controller|
41
43
  next if controller.controller_path.start_with?('rails/')
42
44
 
43
- instance_methods = (controller.instance_methods.map(&:to_s) + controller.private_instance_methods.map(&:to_s))
44
-
45
45
  [
46
46
  controller.controller_path,
47
47
  {
48
48
  helpers: controller.helpers.methods.map(&:to_s),
49
49
  actions: controller.action_methods.to_a,
50
- instance_methods: instance_methods.compact.uniq
50
+ instance_methods: instance_methods(controller),
51
+ lookup_context: lookup_context(controller)
51
52
  }
52
53
  ]
53
54
  end.compact.to_h
@@ -57,6 +58,16 @@ module RailsRouteChecker
57
58
 
58
59
  attr_reader :app
59
60
 
61
+ def lookup_context(controller)
62
+ return nil unless controller.instance_methods.include?(:default_render)
63
+
64
+ ActionView::LookupContext.new(controller._view_paths, {}, controller._prefixes)
65
+ end
66
+
67
+ def instance_methods(controller)
68
+ (controller.instance_methods.map(&:to_s) + controller.private_instance_methods.map(&:to_s)).compact.uniq
69
+ end
70
+
60
71
  def suppress_output
61
72
  begin
62
73
  original_stderr = $stderr.clone
@@ -76,7 +87,7 @@ module RailsRouteChecker
76
87
  end
77
88
 
78
89
  def attempt_to_load_default_controllers
79
- # rubocop:disable Lint/HandleExceptions
90
+ # rubocop:disable Lint/SuppressedException
80
91
  begin
81
92
  ::Rails::InfoController
82
93
  rescue NameError # ignored
@@ -89,7 +100,7 @@ module RailsRouteChecker
89
100
  ::Rails::MailersController
90
101
  rescue NameError # ignored
91
102
  end
92
- # rubocop:enable Lint/HandleExceptions
103
+ # rubocop:enable Lint/SuppressedException
93
104
  end
94
105
 
95
106
  def reject_route?(route)
@@ -102,6 +113,7 @@ module RailsRouteChecker
102
113
  action = route.requirements[:action]
103
114
  return true unless controller && action
104
115
  return true if controller.start_with?('rails/')
116
+
105
117
  false
106
118
  end
107
119
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  module Parsers
3
5
  module ErbParser
@@ -5,23 +7,7 @@ module RailsRouteChecker
5
7
  def run(filename, **opts)
6
8
  file_source = opts[:source] || File.read(filename)
7
9
 
8
- next_ruby_source_line_num = 1
9
- ruby_source = ''
10
- source_map = {}
11
-
12
- file_source.split("\n").each_with_index do |line, line_num|
13
- ruby_lines = process_line(line)
14
- next unless ruby_lines.any?
15
-
16
- ruby_source += ruby_lines.join("\n") + "\n"
17
- ruby_lines.length.times do |i|
18
- source_map[next_ruby_source_line_num + i] = line_num + 1
19
- end
20
- next_ruby_source_line_num += ruby_lines.length
21
- end
22
-
23
- opts[:source] = ruby_source
24
- opts[:source_map] = source_map
10
+ opts.merge!(process_file(file_source))
25
11
 
26
12
  RailsRouteChecker::Parsers::RubyParser.run(filename, **opts)
27
13
  end
@@ -46,6 +32,28 @@ module RailsRouteChecker
46
32
  end
47
33
  ruby_lines
48
34
  end
35
+
36
+ def process_file(source)
37
+ next_ruby_source_line_num = 1
38
+ ruby_source = ''
39
+ source_map = {}
40
+
41
+ source.split("\n").each_with_index do |line, line_num|
42
+ ruby_lines = process_line(line)
43
+ next unless ruby_lines.any?
44
+
45
+ ruby_source += ruby_lines.join("\n") + "\n"
46
+ ruby_lines.length.times do |i|
47
+ source_map[next_ruby_source_line_num + i] = line_num + 1
48
+ end
49
+ next_ruby_source_line_num += ruby_lines.length
50
+ end
51
+
52
+ {
53
+ source: ruby_source,
54
+ source_map: source_map
55
+ }
56
+ end
49
57
  end
50
58
  end
51
59
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'haml_parser/document'
2
4
  require_relative 'haml_parser/tree/node'
3
5
  require_relative 'haml_parser/tree/filter_node'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  module Parsers
3
5
  module HamlParser
@@ -9,9 +11,10 @@ module RailsRouteChecker
9
11
  @source_lines = @source.split(/\r\n|\r|\n/)
10
12
 
11
13
  version = Gem::Version.new(Haml::VERSION).approximate_recommendation
14
+ options = Haml::Options.new
12
15
  original_tree = case version
13
- when '~> 4.0', '~> 4.1' then Haml::Parser.new(@source, Haml::Options.new).parse
14
- when '~> 5.0' then Haml::Parser.new(options).call(@source)
16
+ when '~> 4.0', '~> 4.1' then Haml::Parser.new(@source, options).parse
17
+ when '~> 5.0', '~> 5.1' then Haml::Parser.new(options).call(@source)
15
18
  else raise "Cannot handle Haml version: #{version}"
16
19
  end
17
20
 
@@ -21,9 +24,7 @@ module RailsRouteChecker
21
24
  private
22
25
 
23
26
  def process_tree(original_tree)
24
- if Gem::Requirement.new('~> 4.0.0').satisfied_by?(Gem.loaded_specs['haml'].version)
25
- original_tree.children.pop
26
- end
27
+ original_tree.children.pop if Gem::Requirement.new('~> 4.0.0').satisfied_by?(Gem.loaded_specs['haml'].version)
27
28
 
28
29
  convert_tree(original_tree)
29
30
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  module Parsers
3
5
  module HamlParser
@@ -53,6 +55,7 @@ module RailsRouteChecker
53
55
  yield
54
56
 
55
57
  return unless start_block
58
+
56
59
  @indent_level -= 1
57
60
  add_line('end', node)
58
61
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  module Parsers
3
5
  module HamlParser
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  module Parsers
3
5
  module HamlParser
@@ -68,7 +70,7 @@ module RailsRouteChecker
68
70
  next_sibling = siblings.next(self)
69
71
  return next_sibling if next_sibling
70
72
 
71
- parent.successor if parent
73
+ parent&.successor
72
74
  end
73
75
 
74
76
  def next_node
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  module Parsers
3
5
  module HamlParser
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  module Parsers
3
5
  module HamlParser
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  module Parsers
3
5
  module HamlParser
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  module Parsers
3
5
  module HamlParser
@@ -18,7 +20,7 @@ module RailsRouteChecker
18
20
  end
19
21
 
20
22
  def attributes_source
21
- @attr_source ||=
23
+ @attr_source ||= # rubocop:disable Naming/MemoizedInstanceVariableName
22
24
  begin
23
25
  _explicit_tag, static_attrs, rest =
24
26
  source_code.scan(/\A\s*(%[-:\w]+)?([-:\w\.\#]*)(.*)/m)[0]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  module Parsers
3
5
  module Loader
@@ -21,6 +23,7 @@ module RailsRouteChecker
21
23
 
22
24
  def haml_available?
23
25
  return @haml_available if defined?(@haml_available)
26
+
24
27
  @haml_available = gem_installed?('haml')
25
28
  end
26
29
 
@@ -46,6 +49,7 @@ module RailsRouteChecker
46
49
  def if_unloaded(parser)
47
50
  @loaded_parsers ||= {}
48
51
  return false if @loaded_parsers[parser]
52
+
49
53
  yield
50
54
  @loaded_parsers[parser] = true
51
55
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ripper'
2
4
 
3
5
  module RailsRouteChecker
@@ -6,15 +8,16 @@ module RailsRouteChecker
6
8
  class << self
7
9
  def run(filename, **opts)
8
10
  file_source = opts[:source] || File.read(filename)
11
+ process_file(filename, file_source, opts)
12
+ end
9
13
 
10
- items = []
14
+ private
11
15
 
12
- deep_iterator(Ripper.sexp(file_source)) do |item, extra_data|
13
- scope = extra_data[:scope]
14
- next unless %i[vcall fcall].include?(scope[-2])
15
- next unless scope[-1] == :@ident
16
- next unless item.end_with?('_path', '_url')
16
+ def process_file(filename, source, opts)
17
+ items = []
17
18
 
19
+ deep_iterator(Ripper.sexp(source)) do |item, extra_data|
20
+ next unless item_is_url_call?(item, extra_data)
18
21
  next if opts[:filter].respond_to?(:call) && !opts[:filter].call(item)
19
22
 
20
23
  line = extra_data[:position][0]
@@ -26,30 +29,43 @@ module RailsRouteChecker
26
29
  items
27
30
  end
28
31
 
29
- private
32
+ def item_is_url_call?(item, extra_data)
33
+ scope = extra_data[:scope]
34
+ return false unless %i[vcall fcall].include?(scope[-2])
35
+ return false unless scope[-1] == :@ident
36
+ return false unless item.end_with?('_path', '_url')
37
+
38
+ true
39
+ end
30
40
 
31
41
  def deep_iterator(list, current_scope = [], current_line_num = [], &block)
32
- if list.is_a?(Array)
33
- if list[0].is_a?(Symbol)
34
- current_scope << list[0]
35
-
36
- if list[-1].is_a?(Array) && list[-1].length == 2 && list[-1].all? { |item| item.is_a?(Integer) }
37
- current_line_num = list[-1]
38
- list = list[0..-2]
39
- end
40
-
41
- list[1..-1].each do |item|
42
- deep_iterator(item, current_scope, current_line_num, &block)
43
- end
44
- current_scope.pop
45
- else
46
- list.each do |item|
47
- deep_iterator(item, current_scope, current_line_num, &block)
48
- end
42
+ return deep_iterate_array(list, current_scope, current_line_num, &block) if list.is_a?(Array)
43
+
44
+ yield(list, { scope: current_scope, position: current_line_num }) unless list.nil?
45
+ end
46
+
47
+ def deep_iterate_array(list, current_scope, current_line_num, &block)
48
+ unless list[0].is_a?(Symbol)
49
+ list.each do |item|
50
+ deep_iterator(item, current_scope, current_line_num, &block)
49
51
  end
50
- elsif !list.nil?
51
- yield(list, { scope: current_scope, position: current_line_num })
52
+ return
53
+ end
54
+
55
+ current_scope << list[0]
56
+
57
+ last_list_item = list[-1]
58
+ if last_list_item.is_a?(Array) &&
59
+ last_list_item.length == 2 &&
60
+ last_list_item.all? { |item| item.is_a?(Integer) }
61
+ current_line_num = last_list_item
62
+ list = list[0..-2]
63
+ end
64
+
65
+ list[1..-1].each do |item|
66
+ deep_iterator(item, current_scope, current_line_num, &block)
52
67
  end
68
+ current_scope.pop
53
69
  end
54
70
  end
55
71
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  class Runner
3
5
  def initialize(**opts)
@@ -14,7 +16,7 @@ module RailsRouteChecker
14
16
  end
15
17
 
16
18
  def issues?
17
- issues.values.flatten(1).count > 1
19
+ issues.values.flatten(1).count.positive?
18
20
  end
19
21
 
20
22
  def output
@@ -31,7 +33,7 @@ module RailsRouteChecker
31
33
  private
32
34
 
33
35
  def app_interface
34
- @app_interface ||= RailsRouteChecker::AppInterface.new(@options)
36
+ @app_interface ||= RailsRouteChecker::AppInterface.new(**@options)
35
37
  end
36
38
 
37
39
  def missing_actions_output
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
- VERSION = '0.2.1'.freeze
4
+ VERSION = '0.2.6'
3
5
  end
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
 
2
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'rails-route-checker/version'
5
6
 
@@ -22,7 +23,7 @@ Gem::Specification.new do |spec|
22
23
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
24
  spec.require_paths = ['lib']
24
25
 
25
- spec.add_development_dependency 'bundler', '~> 1.15'
26
- spec.add_development_dependency 'rake', '~> 10.0'
27
- spec.add_development_dependency 'rubocop', '~> 0.51'
26
+ spec.add_development_dependency 'bundler', '~> 2.1'
27
+ spec.add_development_dependency 'rake', '~> 13.0'
28
+ spec.add_development_dependency 'rubocop', '~> 0.86'
28
29
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-route-checker
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dave Allie
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-12 00:00:00.000000000 Z
11
+ date: 2020-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.15'
19
+ version: '2.1'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.15'
26
+ version: '2.1'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '13.0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '10.0'
40
+ version: '13.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rubocop
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.51'
47
+ version: '0.86'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '0.51'
54
+ version: '0.86'
55
55
  description: A linting tool that helps you find any routes defined in your routes.rb
56
56
  file that don't have a corresponding controller action, and find any _path or _url
57
57
  calls that don't have a corresponding route in the routes.rb file.
@@ -102,8 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  requirements: []
105
- rubyforge_project:
106
- rubygems_version: 2.6.12
105
+ rubygems_version: 3.1.2
107
106
  signing_key:
108
107
  specification_version: 4
109
108
  summary: A linting tool for your Rails routes