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.
- checksums.yaml +4 -4
- data/.autotest +3 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +141 -0
- data/LICENSE.txt +1 -1
- data/README.md +45 -13
- data/Rakefile +1 -1
- data/lib/rails_routes_analyzer.rb +7 -6
- data/lib/rails_routes_analyzer/action_analysis.rb +276 -0
- data/lib/rails_routes_analyzer/gem_manager.rb +52 -0
- data/lib/rails_routes_analyzer/parameter_handler.rb +41 -0
- data/lib/rails_routes_analyzer/rails_routes_analyzer.rb +69 -30
- data/lib/rails_routes_analyzer/railtie.rb +11 -0
- data/lib/rails_routes_analyzer/route_analysis.rb +104 -67
- data/lib/rails_routes_analyzer/route_call.rb +65 -0
- data/lib/rails_routes_analyzer/route_file_annotator.rb +117 -37
- data/lib/rails_routes_analyzer/route_interceptor.rb +12 -13
- data/lib/rails_routes_analyzer/route_issue.rb +4 -109
- data/lib/rails_routes_analyzer/route_issue/base.rb +68 -0
- data/lib/rails_routes_analyzer/route_issue/no_action.rb +37 -0
- data/lib/rails_routes_analyzer/route_issue/no_controller.rb +30 -0
- data/lib/rails_routes_analyzer/route_issue/resources.rb +133 -0
- data/lib/rails_routes_analyzer/route_line.rb +85 -0
- data/lib/rails_routes_analyzer/version.rb +1 -1
- data/lib/tasks/rails_routes_analyzer.rake +28 -50
- data/rails_routes_analyzer.gemspec +13 -4
- metadata +129 -18
@@ -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,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
|
-
|
6
|
-
|
7
|
-
only_only: !ENV['ONLY_ONLY'].nil?,
|
8
|
-
only_except: !ENV['ONLY_EXCEPT'].nil?)
|
4
|
+
RailsRoutesAnalyzer.routes_dead(ENV)
|
5
|
+
end
|
9
6
|
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
16
|
-
|
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
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
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
|
-
|
52
|
-
|
53
|
-
|
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 =
|
13
|
-
|
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.
|
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:
|
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-
|
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:
|
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:
|
83
|
+
version: 5.10.1
|
56
84
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
85
|
+
name: minitest-reporters
|
58
86
|
requirement: !ruby/object:Gem::Requirement
|
59
87
|
requirements:
|
60
88
|
- - "~>"
|
61
89
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
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:
|
97
|
+
version: 1.1.12
|
70
98
|
- !ruby/object:Gem::Dependency
|
71
|
-
name: minitest-
|
99
|
+
name: minitest-color
|
72
100
|
requirement: !ruby/object:Gem::Requirement
|
73
101
|
requirements:
|
74
102
|
- - "~>"
|
75
103
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
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:
|
111
|
+
version: 0.0.2
|
84
112
|
- !ruby/object:Gem::Dependency
|
85
|
-
name: minitest-
|
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
|
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
|
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
|
-
|
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:
|
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.
|
270
|
+
rubygems_version: 2.5.2
|
160
271
|
signing_key:
|
161
272
|
specification_version: 4
|
162
273
|
summary: Helps clean up rails routes
|