rails_routes_analyzer 1.0.4 → 2.0.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.
@@ -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