rails-route-checker 0.2.3 → 0.2.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 19d68dcbdd849a080cf1e5d99f1ae4a5835ad770
4
- data.tar.gz: eb811f79a36bdf90e44cc440549dd279cc1d8a73
2
+ SHA256:
3
+ metadata.gz: 83a8db628f8a08403d87c03eb0b33bd1b6de966761b4685d6e0d63b03f39cbb7
4
+ data.tar.gz: 4c26964a8ebc9494fbb17c20cee37ab71752c41830a53850a495a49c48d232f0
5
5
  SHA512:
6
- metadata.gz: 545ed87d3c89646a04cf3a7e7aee7b90ee48a16d33d7d8fce0699ec0c0ea01a211b2bd659dd5a85740a2c5ebeadd92cb017cfca426384fd09844700b4149d94c
7
- data.tar.gz: 75ea1b5e8b936cb03925fb4c79369e86b9be5643401adda5bc0878689c8f3f6a16494fd74dec7f63307e582b86bd31c083805ed575466b87fa5ba33e56e8b058
6
+ metadata.gz: 740e34c8e804283c61a8f5d38c0a08ef66d463c06780720bec0bb4cfa18ba4cdb6b2cab24ebf031c1c5fadfb0ac48639a95b25fc20013f65b8c689e1558518d9
7
+ data.tar.gz: f23cc07438b3cd24a1748ddb64124557066b36d0aceebaeb7e293323901991bafa8a7bc897ada5ec8172e7bb68a8574a67e769ba504f6fbe08b27261054e7f04
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,12 +12,7 @@ module RailsRouteChecker
10
12
  action = r.requirements[:action]
11
13
 
12
14
  next if options[:ignored_controllers].include?(controller)
13
-
14
- if controller_information.key?(controller)
15
- info = controller_information[controller]
16
- next if info[:actions].include?(action)
17
- next if info[:lookup_context] && info[:lookup_context].template_exists?("#{controller}/#{action}")
18
- end
15
+ next if controller_has_action?(controller, action)
19
16
 
20
17
  {
21
18
  controller: controller,
@@ -42,6 +39,16 @@ module RailsRouteChecker
42
39
  end
43
40
  end
44
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
+
45
52
  def generate_undef_view_path_calls
46
53
  generate_undef_view_path_calls_erb + generate_undef_view_path_calls_haml
47
54
  end
@@ -59,6 +66,7 @@ module RailsRouteChecker
59
66
  filter = lambda do |path_or_url|
60
67
  return false if match_in_whitelist?(filename, path_or_url)
61
68
  return false if match_defined_in_view?(controller, path_or_url)
69
+
62
70
  true
63
71
  end
64
72
 
@@ -85,6 +93,7 @@ module RailsRouteChecker
85
93
  filter = lambda do |path_or_url|
86
94
  return false if match_in_whitelist?(filename, path_or_url)
87
95
  return false if match_defined_in_view?(controller, path_or_url)
96
+
88
97
  true
89
98
  end
90
99
 
@@ -105,6 +114,7 @@ module RailsRouteChecker
105
114
  filter = lambda do |path_or_url|
106
115
  return false if match_in_whitelist?(filename, path_or_url)
107
116
  return false if match_defined_in_ruby?(controller, path_or_url)
117
+
108
118
  return true
109
119
  end
110
120
 
@@ -115,18 +125,21 @@ module RailsRouteChecker
115
125
  def match_in_whitelist?(filename, path_or_url)
116
126
  possible_route_name = path_or_url.sub(/_(?:url|path)$/, '')
117
127
  return true if options[:ignored_paths].include?(possible_route_name)
128
+
118
129
  (options[:ignored_path_whitelist][filename] || []).include?(path_or_url)
119
130
  end
120
131
 
121
132
  def match_defined_in_view?(controller, path_or_url)
122
133
  possible_route_name = path_or_url.sub(/_(?:url|path)$/, '')
123
134
  return true if loaded_app.all_route_names.include?(possible_route_name)
135
+
124
136
  controller && controller[:helpers].include?(path_or_url)
125
137
  end
126
138
 
127
139
  def match_defined_in_ruby?(controller, path_or_url)
128
140
  possible_route_name = path_or_url.sub(/_(?:url|path)$/, '')
129
141
  return true if loaded_app.all_route_names.include?(possible_route_name)
142
+
130
143
  controller && controller[:instance_methods].include?(path_or_url)
131
144
  end
132
145
 
@@ -137,6 +150,7 @@ module RailsRouteChecker
137
150
  while possible_controller_path.any?
138
151
  controller_name = possible_controller_path.join('/')
139
152
  return controller_information[controller_name] if controller_exists?(controller_name)
153
+
140
154
  possible_controller_path = possible_controller_path[0..-2]
141
155
  end
142
156
  controller_information['application']
@@ -145,12 +159,14 @@ module RailsRouteChecker
145
159
  def controller_from_ruby_file(filename)
146
160
  controller_name = (filename.match(%r{app/controllers/(.*)_controller.rb}) || [])[1]
147
161
  return controller_information[controller_name] if controller_exists?(controller_name)
162
+
148
163
  controller_information['application']
149
164
  end
150
165
 
151
166
  def controller_exists?(controller_name)
152
167
  return false unless controller_name
153
- File.exists?("app/controllers/#{controller_name}_controller.rb")
168
+
169
+ File.exist?("app/controllers/#{controller_name}_controller.rb")
154
170
  end
155
171
  end
156
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,18 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module RailsRouteChecker
2
4
  class LoadedApp
3
5
  def initialize
4
- @app = suppress_output do
5
- app_base_path = Dir.pwd
6
+ app_base_path = Dir.pwd
7
+ suppress_output do
6
8
  require_relative "#{app_base_path}/config/boot"
7
- require_relative "#{Dir.pwd}/config/environment"
9
+ end
8
10
 
9
- a = Rails.application
10
- a.eager_load!
11
+ begin
12
+ suppress_output do
13
+ require_relative "#{Dir.pwd}/config/environment"
14
+ end
15
+ rescue Exception => e
16
+ puts "Requiring your config/environment.rb file failed."
17
+ puts "This means that something raised while trying to start Rails."
18
+ puts ""
19
+ puts e.backtrace
20
+ raise(e)
21
+ end
22
+
23
+ suppress_output do
24
+ @app = Rails.application
25
+ @app.eager_load!
11
26
  attempt_to_load_default_controllers
12
- a.reload_routes!
27
+ @app.reload_routes!
13
28
  Rails::Engine.subclasses.each(&:eager_load!)
14
-
15
- a
16
29
  end
17
30
  end
18
31
 
@@ -23,7 +36,7 @@ module RailsRouteChecker
23
36
  reject_route?(r)
24
37
  end.uniq
25
38
 
26
- return @routes unless @app.config.respond_to?(:assets)
39
+ return @routes unless app.config.respond_to?(:assets)
27
40
 
28
41
  use_spec = defined?(ActionDispatch::Journey::Route) || defined?(Journey::Route)
29
42
  @routes.reject do |route|
@@ -40,18 +53,13 @@ module RailsRouteChecker
40
53
  @controller_information ||= ActionController::Base.descendants.map do |controller|
41
54
  next if controller.controller_path.start_with?('rails/')
42
55
 
43
- instance_methods = (controller.instance_methods.map(&:to_s) + controller.private_instance_methods.map(&:to_s))
44
- lookup_context = ActionView::LookupContext.new(
45
- controller._view_paths, {}, controller._prefixes
46
- ) if controller.instance_methods.include?(:default_render)
47
-
48
56
  [
49
57
  controller.controller_path,
50
58
  {
51
59
  helpers: controller.helpers.methods.map(&:to_s),
52
60
  actions: controller.action_methods.to_a,
53
- instance_methods: instance_methods.compact.uniq,
54
- lookup_context: lookup_context
61
+ instance_methods: instance_methods(controller),
62
+ lookup_context: lookup_context(controller)
55
63
  }
56
64
  ]
57
65
  end.compact.to_h
@@ -61,6 +69,16 @@ module RailsRouteChecker
61
69
 
62
70
  attr_reader :app
63
71
 
72
+ def lookup_context(controller)
73
+ return nil unless controller.instance_methods.include?(:default_render)
74
+
75
+ ActionView::LookupContext.new(controller._view_paths, {}, controller._prefixes)
76
+ end
77
+
78
+ def instance_methods(controller)
79
+ (controller.instance_methods.map(&:to_s) + controller.private_instance_methods.map(&:to_s)).compact.uniq
80
+ end
81
+
64
82
  def suppress_output
65
83
  begin
66
84
  original_stderr = $stderr.clone
@@ -80,7 +98,7 @@ module RailsRouteChecker
80
98
  end
81
99
 
82
100
  def attempt_to_load_default_controllers
83
- # rubocop:disable Lint/HandleExceptions
101
+ # rubocop:disable Lint/SuppressedException
84
102
  begin
85
103
  ::Rails::InfoController
86
104
  rescue NameError # ignored
@@ -93,7 +111,7 @@ module RailsRouteChecker
93
111
  ::Rails::MailersController
94
112
  rescue NameError # ignored
95
113
  end
96
- # rubocop:enable Lint/HandleExceptions
114
+ # rubocop:enable Lint/SuppressedException
97
115
  end
98
116
 
99
117
  def reject_route?(route)
@@ -106,6 +124,7 @@ module RailsRouteChecker
106
124
  action = route.requirements[:action]
107
125
  return true unless controller && action
108
126
  return true if controller.start_with?('rails/')
127
+
109
128
  false
110
129
  end
111
130
  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', '~> 5.2' 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 > 0
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.3'.freeze
4
+ VERSION = '0.2.8'
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.3
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dave Allie
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-15 00:00:00.000000000 Z
11
+ date: 2020-11-26 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.8
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