rails_routes_analyzer 1.0.4 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,37 @@
1
+ require_relative 'base'
2
+
3
+ module RailsRoutesAnalyzer
4
+ module RouteIssue
5
+
6
+ class NoAction < Base
7
+
8
+ fields :missing_actions
9
+
10
+ def human_readable_error_message
11
+ messages = missing_actions.map do |action|
12
+ "`#{route_creation_method} :#{action}' call at #{file_location} there is no matching action in #{controller_class_name}"
13
+ end
14
+
15
+ return if messages.empty?
16
+
17
+ messages.size == 1 ? messages[0] : messages
18
+ end
19
+
20
+ def error_suggestion(has_present_actions:, num_controllers:)
21
+ actions = format_actions(missing_actions)
22
+ if has_present_actions
23
+ "remove case#{'s' if missing_actions.size > 1} for #{actions}"
24
+ else
25
+ "delete line, #{actions} matches nothing"
26
+ end.tap do |message|
27
+ message << " for controller #{controller_class_name}" if num_controllers > 1
28
+ end
29
+ end
30
+
31
+ def try_to_fix_line(_line)
32
+ '' # Delete
33
+ end
34
+ end
35
+
36
+ end
37
+ end
@@ -0,0 +1,30 @@
1
+ require_relative 'base'
2
+
3
+ module RailsRoutesAnalyzer
4
+ module RouteIssue
5
+
6
+ class NoController < Base
7
+
8
+ fields :error
9
+
10
+ def human_readable_error_message
11
+ "`#{route_creation_method}' call at #{file_location} there is no controller: #{controller_class_name} for '#{controller_name}' (actions: #{action_names.inspect})".tap do |msg|
12
+ msg << " error: #{error}" if error.present?
13
+ end
14
+ end
15
+
16
+ def error_suggestion(has_present_actions:, **)
17
+ if has_present_actions
18
+ "remove case for #{controller_class_name} as it doesn't exist"
19
+ else
20
+ "delete, #{controller_class_name} not found"
21
+ end
22
+ end
23
+
24
+ def try_to_fix_line(_line)
25
+ '' # Delete
26
+ end
27
+ end
28
+
29
+ end
30
+ end
@@ -0,0 +1,133 @@
1
+ require_relative 'base'
2
+
3
+ module RailsRoutesAnalyzer
4
+ module RouteIssue
5
+
6
+ class Resources < Base
7
+
8
+ fields :suggested_param
9
+
10
+ def human_readable_error_message
11
+ "`#{route_creation_method}' call at #{file_location} for #{controller_class_name} should use #{suggested_param}"
12
+ end
13
+
14
+ def error_suggestion(num_controllers:, **)
15
+ "use #{suggested_param}".tap do |message|
16
+ message << " only for #{controller_class_name}" if num_controllers > 1
17
+ end
18
+ end
19
+
20
+ def verbose_message
21
+ "This route currently covers unimplemented actions: #{format_actions(missing_actions.sort)}"
22
+ end
23
+
24
+ # This is horrible but just maybe works well enough most of the time to be useful.
25
+ RESOURCES_PARSE_REGEX = %r%
26
+ \A
27
+ (?<beginning> # contains the part that looks like: resources :some_things
28
+ \s*
29
+ resources?
30
+ \(?
31
+ \s*
32
+ :\w+ # the name of the resource as a symbol
33
+ )
34
+ (?<separator>,\s*)? # something optional that separates "resources :some_things" from its parameters
35
+ (?<params>.*?) # all the parameters whatever they might be, if present at all
36
+ (?<end>
37
+ \)?
38
+ (\s+(do|{))? # optional block, either " do" or " {"
39
+ [\t ]* # any whitespace, except linebreak (not sure why it's matched without 'm' modifier here)
40
+ (\#.*)? # an optional comment
41
+ )
42
+ $
43
+ %x
44
+
45
+ ONLY_EXCEPT_PARAM_REGEX = %r{
46
+ (
47
+ (:(?<key>only|except)\s*=>) # ":only =>" or ":except =>"
48
+ |
49
+ (?<key>only|except): # "only:" or "except:"
50
+ )
51
+ \s*
52
+ (
53
+ \[[^\]]*\] # anything between [ and ]
54
+ |
55
+ :\w+ # or a symbol
56
+ )
57
+ }x
58
+
59
+ RESOURCE_OTHER_PARAM_REGEX = %r{
60
+ (
61
+ (:(?<key>\w+)\s*=>)
62
+ |
63
+ (?<key>\w+):
64
+ )
65
+ \s*
66
+ (
67
+ \[[^\]]*\] # anything between [ and ]
68
+ |
69
+ :\w+ # or a symbol
70
+ |
71
+ '[^']*' # a limited single-quote string
72
+ |
73
+ "[^"]*" # a limited double-quote string
74
+ |
75
+ true
76
+ |
77
+ false
78
+ )
79
+ }x
80
+
81
+ def try_to_fix_line(line, suggestion: suggested_param)
82
+ self.class.try_to_fix_resources_line(line, suggestion)
83
+ end
84
+
85
+ def self.try_to_fix_resources_line(line, suggestion)
86
+ data = line.match(RESOURCES_PARSE_REGEX)
87
+ line_break = line[/$(.*)\z/m, 1]
88
+
89
+ return unless data
90
+
91
+ separator = data[:separator].presence || ', '
92
+
93
+ params = \
94
+ if [nil, ''].include?(data[:params])
95
+ suggestion
96
+ elsif (existing = data[:params][ONLY_EXCEPT_PARAM_REGEX]).present?
97
+ # We get here if the only/except parameter already exists and
98
+ # our only task is to replace it, should generally be ok.
99
+ data[:params].sub(existing, suggestion)
100
+ elsif does_params_look_like_a_safe_hash?(data[:params])
101
+ # If params looks like a hash it should be safe to append the suggestion
102
+ "#{data[:params]}, #{suggestion}"
103
+ elsif (match = data[:params].match(/\A(?<opening>\s*{\s*)(?<inner_data>.*?)(?<closing>\s*}\s*)\z/))
104
+ # If params looks like a safe hash between { and } then add they key inside the hash
105
+ if does_params_look_like_a_safe_hash?(match[:inner_data])
106
+ "#{match[:opening]}#{match[:inner_data]}, #{suggestion}#{match[:closing]}"
107
+ end
108
+ end
109
+
110
+ return unless params
111
+
112
+ "#{data[:beginning]}#{separator}#{params}#{data[:end]}#{line_break}"
113
+ end
114
+
115
+ # Check if the parameter string contains only a limited set of known
116
+ # resource hash keys in which case it should generally be safe to
117
+ # append only:/except: to it.
118
+ def self.does_params_look_like_a_safe_hash?(params)
119
+ return false if params =~ /[{}]/ # definitely can't handle: "resources :name, { key: val }"
120
+
121
+ # Replace all known "key: simple_value" pairs with 'X'
122
+ result = params.gsub(RESOURCE_OTHER_PARAM_REGEX, 'X')
123
+
124
+ # Remove all whitespace
125
+ result.gsub!(/\s/, '')
126
+
127
+ # check that the result string looks like: "X" or "X,X", "X,X,X" depending on how many parameters there were
128
+ result.split(',').uniq == %w(X)
129
+ end
130
+ end
131
+
132
+ end
133
+ end
@@ -0,0 +1,85 @@
1
+ module RailsRoutesAnalyzer
2
+
3
+ # Represents a single line in Rails routes file with all
4
+ # the collected information about that line.
5
+ class RouteLine
6
+
7
+ attr_reader :full_filename, :line_number, :records
8
+
9
+ def initialize(full_filename:, line_number:, records:)
10
+ @full_filename = full_filename
11
+ @line_number = line_number
12
+ @records = records
13
+ end
14
+
15
+ def file_location
16
+ @file_location ||= "#{full_filename}:#{line_number}"
17
+ end
18
+
19
+ def present_actions?
20
+ records.any?(&:present_actions?)
21
+ end
22
+
23
+ def issues
24
+ @issues ||= records.select(&:issue?)
25
+ end
26
+
27
+ def issues?
28
+ issues.any?
29
+ end
30
+
31
+ def annotate(line, try_to_fix:, allow_deleting:)
32
+ suggestions = combined_suggestions
33
+ if try_to_fix && !(fix_for_line = try_to_fix_line(line, allow_deleting: allow_deleting,
34
+ suggestion_comment: "# SUGGESTION #{suggestions}")).nil?
35
+ fix_for_line
36
+ else
37
+ add_suggestions_to(line, suggestions)
38
+ end
39
+ end
40
+
41
+ # Try to generate an automatic fix for the line, this does not
42
+ # apply to lines with multiple issues (iterations) as those
43
+ # will most likely require changes to the surrounding code.
44
+ def try_to_fix_line(line, allow_deleting:, suggestion_comment:)
45
+ has_one_issue = issues.size == 1
46
+ has_one_iteration = records.size == 1
47
+
48
+ return unless has_one_issue && has_one_iteration
49
+
50
+ fix = issues[0].try_to_fix_line(line)
51
+
52
+ return unless fix.present? || (fix == '' && allow_deleting && safely_deletable_line?(line))
53
+
54
+ fix.gsub(suggestion_comment, '').gsub(/\ +$/, '')
55
+ end
56
+
57
+ # Should avoid deleting lines that look like they might start a block because
58
+ # we're not smart enough to also be able to delete the end of that block.
59
+ def safely_deletable_line?(line)
60
+ line !~ /( do(\s|$)|{)/
61
+ end
62
+
63
+ def add_suggestions_to(line, suggestions)
64
+ line.sub(/( # SUGGESTION.*)?$/,
65
+ suggestions.present? ? " # SUGGESTION #{suggestions}" : "")
66
+ end
67
+
68
+ def all_controller_class_names
69
+ records.map(&:controller_class_name).uniq
70
+ end
71
+
72
+ def combined_suggestions
73
+ return unless issues?
74
+
75
+ context = {
76
+ has_present_actions: present_actions?,
77
+ num_controllers: all_controller_class_names.count,
78
+ }
79
+
80
+ issues.map { |issue| issue.suggestion(**context) }.flatten.join(', ')
81
+ end
82
+
83
+ end
84
+
85
+ end
@@ -1,3 +1,3 @@
1
1
  module RailsRoutesAnalyzer
2
- VERSION = "1.0.4"
2
+ VERSION = "2.0.0".freeze
3
3
  end
@@ -1,62 +1,40 @@
1
1
  namespace :routes do
2
-
3
- desc 'Scan for dead-end routes including bad map.resource(s) :only/:except parameters'
2
+ desc 'Scan for dead-end routes'
4
3
  task dead: :environment do
5
- analysis = RailsRoutesAnalyzer::RouteAnalysis.new(
6
- verbose: !ENV['VERBOSE'].nil?,
7
- only_only: !ENV['ONLY_ONLY'].nil?,
8
- only_except: !ENV['ONLY_EXCEPT'].nil?)
4
+ RailsRoutesAnalyzer.routes_dead(ENV)
5
+ end
9
6
 
10
- if analysis.issues.empty?
11
- puts "No route issues found"
12
- exit 0
7
+ namespace :dead do
8
+ desc "Output a routes file with suggested modifications in comments (doesn't change the original file)"
9
+ task annotate: :environment do
10
+ RailsRoutesAnalyzer.routes_dead_annotate(ENV)
13
11
  end
14
12
 
15
- analysis.issues.each do |issue|
16
- puts issue.human_readable
13
+ desc "Updates routes file(s) with suggestions for fixes in comments, requires unmodified git-controlled file(s)"
14
+ task :"annotate:inplace" => :environment do |_, args|
15
+ RailsRoutesAnalyzer.routes_dead_annotate_inplace(ENV, args.extras)
17
16
  end
18
- end
19
-
20
- desc "Output a routes file with suggested modifications in comments (NOTE: doesn't touch the original file)"
21
- task annotate_dead: :environment do
22
- annotator = RailsRoutesAnalyzer::RouteFileAnnotator.new
23
- annotator.annotate_routes_file(ENV['ANNOTATE'])
24
- end
25
-
26
- desc 'Scan for controller action methods that are missing a route (pass STRICT=1 to account for inherited actions)'
27
- task missing: :environment do
28
- analysis = RailsRoutesAnalyzer::RouteAnalysis.new
29
- implemented_routes = analysis.implemented_routes
30
- all_action_methods = RailsRoutesAnalyzer.get_all_action_methods(ignore_parent_provided: ENV['STRICT'].blank?)
31
-
32
- missing = all_action_methods.to_a - implemented_routes.to_a
33
17
 
34
- if missing.any?
35
- puts "NOTE Some gems, such as Devise, are expected to provide actions that have no matching"
36
- puts " routes in case a particular feature is not enabled, this is normal and expected."
37
- puts "NOTE If any non-action methods are reported please consider making those non-public"
38
- puts " or using another solution that would make #action_methods not return those."
39
- puts ""
40
-
41
- unused_controllers = Set.new(all_action_methods.to_a.map(&:first) - implemented_routes.to_a.map(&:first))
42
-
43
- if unused_controllers.any?
44
- puts "Controllers with no routes pointing to them:"
45
- unused_controllers.to_a.sort.each do |controller_name|
46
- puts " #{controller_name}"
47
- end
48
- puts ""
49
- end
18
+ desc "Outputs a routes file with simple fixes auto-applied others suggested in comments (doesn't change the original file)"
19
+ task fix: :environment do
20
+ RailsRoutesAnalyzer.routes_dead_fix(ENV)
21
+ end
50
22
 
51
- puts "Actions without a route:"
52
- missing.sort.each do |(controller_name, action_name)|
53
- unless unused_controllers.include?(controller_name)
54
- puts " #{controller_name}::#{action_name}"
55
- end
56
- end
57
- else
58
- puts "There are no actions without a route"
23
+ desc "Updates routes file(s) with simple fixes auto-applied others suggested in comments, requires unmodified git-controlled file(s)"
24
+ task :"fix:inplace" => :environment do |_, args|
25
+ RailsRoutesAnalyzer.routes_dead_fix_inplace(ENV, args.extras)
59
26
  end
60
27
  end
28
+ end
61
29
 
30
+ namespace :actions do
31
+ desc 'List application actions which have no routes mapped to them'
32
+ task missing_route: :environment do |_, args|
33
+ RailsRoutesAnalyzer.routes_actions_missing_route(ENV, args.extras)
34
+ end
35
+
36
+ desc 'List all actions provided by the application'
37
+ task list_all: :environment do |_, args|
38
+ RailsRoutesAnalyzer.routes_actions_list_all(ENV, args.extras)
39
+ end
62
40
  end
@@ -8,9 +8,10 @@ Gem::Specification.new do |spec|
8
8
  spec.version = RailsRoutesAnalyzer::VERSION
9
9
  spec.authors = ["Bear Metal OÜ", "Tarmo Tänav"]
10
10
  spec.email = ["tarmo@bearmetal.eu"]
11
+ spec.required_ruby_version = ">= 2.1.0"
11
12
 
12
- spec.summary = %q{Helps clean up rails routes}
13
- #spec.description = %q{}
13
+ spec.summary = "Helps clean up rails routes"
14
+ spec.description = "Tools to identify and in some cases automatically remove unused Rails routes.\nAlso includes a tool to find action methods without routes and list all action methods provided by the application."
14
15
  spec.homepage = "https://github.com/bear-metal/rails_routes_analyzer"
15
16
  spec.license = "MIT"
16
17
 
@@ -21,11 +22,19 @@ Gem::Specification.new do |spec|
21
22
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
23
  spec.require_paths = ["lib"]
23
24
 
25
+ spec.add_runtime_dependency "actionpack", ">= 3.2"
26
+ spec.add_runtime_dependency "git"
27
+
24
28
  spec.add_development_dependency "bundler", "~> 1.13"
25
29
  spec.add_development_dependency "rake", "~> 10.0"
26
- spec.add_development_dependency "minitest", "~> 5.0"
27
- spec.add_development_dependency "rails", "~> 5.0"
30
+ spec.add_development_dependency "minitest", "~> 5.10.1"
28
31
  spec.add_development_dependency "minitest-reporters", "~> 1.1.12"
29
32
  spec.add_development_dependency "minitest-color", "~> 0.0.2"
33
+ spec.add_development_dependency "minitest-focus"
34
+ spec.add_development_dependency "minitest-autotest"
35
+ spec.add_development_dependency "autotest-suffix"
30
36
  spec.add_development_dependency "byebug"
37
+ spec.add_development_dependency "pry"
38
+ spec.add_development_dependency "awesome_print"
39
+ spec.add_development_dependency "simplecov"
31
40
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_routes_analyzer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bear Metal OÜ
@@ -9,8 +9,36 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-11-23 00:00:00.000000000 Z
12
+ date: 2016-12-04 00:00:00.000000000 Z
13
13
  dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: actionpack
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ">="
19
+ - !ruby/object:Gem::Version
20
+ version: '3.2'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ version: '3.2'
28
+ - !ruby/object:Gem::Dependency
29
+ name: git
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
14
42
  - !ruby/object:Gem::Dependency
15
43
  name: bundler
16
44
  requirement: !ruby/object:Gem::Requirement
@@ -45,56 +73,84 @@ dependencies:
45
73
  requirements:
46
74
  - - "~>"
47
75
  - !ruby/object:Gem::Version
48
- version: '5.0'
76
+ version: 5.10.1
49
77
  type: :development
50
78
  prerelease: false
51
79
  version_requirements: !ruby/object:Gem::Requirement
52
80
  requirements:
53
81
  - - "~>"
54
82
  - !ruby/object:Gem::Version
55
- version: '5.0'
83
+ version: 5.10.1
56
84
  - !ruby/object:Gem::Dependency
57
- name: rails
85
+ name: minitest-reporters
58
86
  requirement: !ruby/object:Gem::Requirement
59
87
  requirements:
60
88
  - - "~>"
61
89
  - !ruby/object:Gem::Version
62
- version: '5.0'
90
+ version: 1.1.12
63
91
  type: :development
64
92
  prerelease: false
65
93
  version_requirements: !ruby/object:Gem::Requirement
66
94
  requirements:
67
95
  - - "~>"
68
96
  - !ruby/object:Gem::Version
69
- version: '5.0'
97
+ version: 1.1.12
70
98
  - !ruby/object:Gem::Dependency
71
- name: minitest-reporters
99
+ name: minitest-color
72
100
  requirement: !ruby/object:Gem::Requirement
73
101
  requirements:
74
102
  - - "~>"
75
103
  - !ruby/object:Gem::Version
76
- version: 1.1.12
104
+ version: 0.0.2
77
105
  type: :development
78
106
  prerelease: false
79
107
  version_requirements: !ruby/object:Gem::Requirement
80
108
  requirements:
81
109
  - - "~>"
82
110
  - !ruby/object:Gem::Version
83
- version: 1.1.12
111
+ version: 0.0.2
84
112
  - !ruby/object:Gem::Dependency
85
- name: minitest-color
113
+ name: minitest-focus
86
114
  requirement: !ruby/object:Gem::Requirement
87
115
  requirements:
88
- - - "~>"
116
+ - - ">="
89
117
  - !ruby/object:Gem::Version
90
- version: 0.0.2
118
+ version: '0'
91
119
  type: :development
92
120
  prerelease: false
93
121
  version_requirements: !ruby/object:Gem::Requirement
94
122
  requirements:
95
- - - "~>"
123
+ - - ">="
96
124
  - !ruby/object:Gem::Version
97
- version: 0.0.2
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: minitest-autotest
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ - !ruby/object:Gem::Dependency
141
+ name: autotest-suffix
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '0'
98
154
  - !ruby/object:Gem::Dependency
99
155
  name: byebug
100
156
  requirement: !ruby/object:Gem::Requirement
@@ -109,7 +165,51 @@ dependencies:
109
165
  - - ">="
110
166
  - !ruby/object:Gem::Version
111
167
  version: '0'
112
- description:
168
+ - !ruby/object:Gem::Dependency
169
+ name: pry
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ - !ruby/object:Gem::Dependency
183
+ name: awesome_print
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ type: :development
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ - !ruby/object:Gem::Dependency
197
+ name: simplecov
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ description: |-
211
+ Tools to identify and in some cases automatically remove unused Rails routes.
212
+ Also includes a tool to find action methods without routes and list all action methods provided by the application.
113
213
  email:
114
214
  - tarmo@bearmetal.eu
115
215
  executables: []
@@ -118,6 +218,7 @@ extra_rdoc_files: []
118
218
  files:
119
219
  - ".autotest"
120
220
  - ".gitignore"
221
+ - ".rubocop.yml"
121
222
  - ".travis.yml"
122
223
  - Gemfile
123
224
  - Gemfile_3.2
@@ -128,11 +229,21 @@ files:
128
229
  - bin/console
129
230
  - bin/setup
130
231
  - lib/rails_routes_analyzer.rb
232
+ - lib/rails_routes_analyzer/action_analysis.rb
233
+ - lib/rails_routes_analyzer/gem_manager.rb
234
+ - lib/rails_routes_analyzer/parameter_handler.rb
131
235
  - lib/rails_routes_analyzer/rails_routes_analyzer.rb
236
+ - lib/rails_routes_analyzer/railtie.rb
132
237
  - lib/rails_routes_analyzer/route_analysis.rb
238
+ - lib/rails_routes_analyzer/route_call.rb
133
239
  - lib/rails_routes_analyzer/route_file_annotator.rb
134
240
  - lib/rails_routes_analyzer/route_interceptor.rb
135
241
  - lib/rails_routes_analyzer/route_issue.rb
242
+ - lib/rails_routes_analyzer/route_issue/base.rb
243
+ - lib/rails_routes_analyzer/route_issue/no_action.rb
244
+ - lib/rails_routes_analyzer/route_issue/no_controller.rb
245
+ - lib/rails_routes_analyzer/route_issue/resources.rb
246
+ - lib/rails_routes_analyzer/route_line.rb
136
247
  - lib/rails_routes_analyzer/version.rb
137
248
  - lib/tasks/rails_routes_analyzer.rake
138
249
  - rails_routes_analyzer.gemspec
@@ -148,7 +259,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
148
259
  requirements:
149
260
  - - ">="
150
261
  - !ruby/object:Gem::Version
151
- version: '0'
262
+ version: 2.1.0
152
263
  required_rubygems_version: !ruby/object:Gem::Requirement
153
264
  requirements:
154
265
  - - ">="
@@ -156,7 +267,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
267
  version: '0'
157
268
  requirements: []
158
269
  rubyforge_project:
159
- rubygems_version: 2.4.5.1
270
+ rubygems_version: 2.5.2
160
271
  signing_key:
161
272
  specification_version: 4
162
273
  summary: Helps clean up rails routes