traceroute 0.4.0 → 0.5.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/.gitignore +1 -0
- data/README.rdoc +9 -2
- data/Rakefile +8 -0
- data/lib/tasks/traceroute.rake +8 -28
- data/lib/traceroute.rb +53 -1
- data/test/app.rb +27 -0
- data/test/test_helper.rb +5 -0
- data/test/traceroute_test.rb +100 -0
- data/traceroute.gemspec +1 -2
- metadata +15 -10
- data/lib/traceroute/version.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 27509e75b8c7d78e3be8cabd152d8163c42dab05
|
4
|
+
data.tar.gz: 04b04e317cacc030b204c4a03d9d4673b51ffc76
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57a81990feedba666ccc07194640eb900fc8a705f26eef6119911691a02c685d01641dec81fe615f6ef895862aea7c46337aa1defd48924e87c2895b48b53a32
|
7
|
+
data.tar.gz: 0bc718b3c168f82c07e9206aa328c83f0f42375c22ecc9a127df6f3016d8ff0dc19669b87b475bb4d363b81ba02d703ea8a0f1384018a70119fe367cc6cd4fc5
|
data/.gitignore
CHANGED
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= Traceroute
|
2
2
|
|
3
|
-
A Rake task that helps you find dead routes and unused actions in your Rails 3
|
3
|
+
A Rake task that helps you find dead routes and unused actions in your Rails 3+ app.
|
4
4
|
|
5
5
|
|
6
6
|
== Features
|
@@ -10,7 +10,7 @@ This Rake task investigates your Rails application's routes definition, then sho
|
|
10
10
|
|
11
11
|
== Supported versions
|
12
12
|
|
13
|
-
* Ruby 1.8.7, 1.9.2, 1.9.3, 2.0, 2.1 (trunk)
|
13
|
+
* Ruby 1.8.7, 1.9.2, 1.9.3, 2.0, 2.1, 2.2 (trunk)
|
14
14
|
|
15
15
|
* Rails 3.0.x, 3.1.x, 3.2.x, 4.0.x, 4.1.x
|
16
16
|
|
@@ -29,6 +29,9 @@ Then bundle:
|
|
29
29
|
Just run the following command in your Rails app directory.
|
30
30
|
% rake traceroute
|
31
31
|
|
32
|
+
If you want the rake task to fail when errors are found.
|
33
|
+
|
34
|
+
% FAIL_ON_ERROR=1 rake traceroute
|
32
35
|
|
33
36
|
== What's gonna happen then?
|
34
37
|
|
@@ -75,6 +78,10 @@ OMG super helpful, isn't it?
|
|
75
78
|
A: I'm afraid you're using the wrong operating system.
|
76
79
|
|
77
80
|
|
81
|
+
== Notes
|
82
|
+
|
83
|
+
Routes prefix with `rails/` are ignored. These are generated by rails in development mode. We don't want to fail the build on these.
|
84
|
+
|
78
85
|
== Questions, Feedback
|
79
86
|
|
80
87
|
Feel free to message me on Github (amatsuda) or Twitter (@a_matsuda) ☇3☇3☇3
|
data/Rakefile
CHANGED
data/lib/tasks/traceroute.rake
CHANGED
@@ -1,35 +1,11 @@
|
|
1
1
|
desc 'Prints out unused routes and unreachable action methods'
|
2
2
|
task :traceroute => :environment do
|
3
|
-
Rails.application
|
4
|
-
|
5
|
-
::Rails::WelcomeController rescue NameError
|
6
|
-
::Rails::MailersController rescue NameError
|
7
|
-
Rails.application.reload_routes!
|
3
|
+
traceroute = Traceroute.new Rails.application
|
4
|
+
traceroute.load_everything!
|
8
5
|
|
9
|
-
|
6
|
+
defined_action_methods = traceroute.defined_action_methods
|
10
7
|
|
11
|
-
|
12
|
-
exclusion_regexp = %r{^#{Rails.application.config.assets.prefix}}
|
13
|
-
|
14
|
-
routes.reject! do |route|
|
15
|
-
path = (defined?(ActionDispatch::Journey::Route) || defined?(Journey::Route)) ? route.path.spec.to_s : route.path
|
16
|
-
path =~ exclusion_regexp
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
defined_action_methods = ActionController::Base.descendants.map do |controller|
|
21
|
-
controller.action_methods.reject {|a| (a =~ /\A(_conditional)?_callback_/) || (a == '_layout_from_proc')}.map do |action|
|
22
|
-
"#{controller.controller_path}##{action}"
|
23
|
-
end
|
24
|
-
end.flatten
|
25
|
-
|
26
|
-
routed_actions = routes.map do |r|
|
27
|
-
if r.requirements[:controller].blank? && r.requirements[:action].blank? && (r.path == '/:controller(/:action(/:id(.:format)))')
|
28
|
-
%Q["#{r.path}" This is a legacy wild controller route that's not recommended for RESTful applications.]
|
29
|
-
else
|
30
|
-
"#{r.requirements[:controller]}##{r.requirements[:action]}"
|
31
|
-
end
|
32
|
-
end
|
8
|
+
routed_actions = traceroute.routed_actions
|
33
9
|
|
34
10
|
unused_routes = routed_actions - defined_action_methods
|
35
11
|
unreachable_action_methods = defined_action_methods - routed_actions
|
@@ -38,4 +14,8 @@ task :traceroute => :environment do
|
|
38
14
|
unused_routes.each {|route| puts " #{route}"}
|
39
15
|
puts "Unreachable action methods (#{unreachable_action_methods.count}):"
|
40
16
|
unreachable_action_methods.each {|action| puts " #{action}"}
|
17
|
+
|
18
|
+
unless (unused_routes.empty? && unreachable_action_methods.empty?) || ENV['FAIL_ON_ERROR'].blank?
|
19
|
+
fail "Unused routes or unreachable action methods detected."
|
20
|
+
end
|
41
21
|
end
|
data/lib/traceroute.rb
CHANGED
@@ -1,7 +1,59 @@
|
|
1
|
-
|
1
|
+
class Traceroute
|
2
|
+
VERSION = Gem.loaded_specs['traceroute'].version.to_s
|
2
3
|
class Railtie < ::Rails::Railtie
|
3
4
|
rake_tasks do
|
4
5
|
load File.join(File.dirname(__FILE__), 'tasks/traceroute.rake')
|
5
6
|
end
|
6
7
|
end
|
8
|
+
|
9
|
+
def initialize(app)
|
10
|
+
@app = app
|
11
|
+
end
|
12
|
+
|
13
|
+
def load_everything!
|
14
|
+
@app.eager_load!
|
15
|
+
::Rails::InfoController rescue NameError
|
16
|
+
::Rails::WelcomeController rescue NameError
|
17
|
+
::Rails::MailersController rescue NameError
|
18
|
+
@app.reload_routes!
|
19
|
+
|
20
|
+
Rails::Engine.subclasses.each(&:eager_load!)
|
21
|
+
end
|
22
|
+
|
23
|
+
def defined_action_methods
|
24
|
+
ActionController::Base.descendants.map do |controller|
|
25
|
+
controller.action_methods.reject {|a| (a =~ /\A(_conditional)?_callback_/) || (a == '_layout_from_proc')}.map do |action|
|
26
|
+
"#{controller.controller_path}##{action}"
|
27
|
+
end
|
28
|
+
end.flatten.reject {|r| r.start_with? 'rails/'}
|
29
|
+
end
|
30
|
+
|
31
|
+
def routed_actions
|
32
|
+
routes.map do |r|
|
33
|
+
if r.requirements[:controller].blank? && r.requirements[:action].blank? && (r.path == '/:controller(/:action(/:id(.:format)))')
|
34
|
+
%Q["#{r.path}" This is a legacy wild controller route that's not recommended for RESTful applications.]
|
35
|
+
else
|
36
|
+
"#{r.requirements[:controller]}##{r.requirements[:action]}"
|
37
|
+
end
|
38
|
+
end.reject {|r| r.start_with? 'rails/'}
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
def routes
|
43
|
+
routes = @app.routes.routes.reject {|r| r.name.nil? && r.requirements.blank?}
|
44
|
+
|
45
|
+
routes.reject! {|r| r.app.is_a?(ActionDispatch::Routing::Mapper::Constraints) && r.app.app.respond_to?(:call)}
|
46
|
+
|
47
|
+
routes.reject! {|r| r.app.is_a?(ActionDispatch::Routing::Redirect)}
|
48
|
+
|
49
|
+
if @app.config.respond_to?(:assets)
|
50
|
+
exclusion_regexp = %r{^#{@app.config.assets.prefix}}
|
51
|
+
|
52
|
+
routes.reject! do |route|
|
53
|
+
path = (defined?(ActionDispatch::Journey::Route) || defined?(Journey::Route)) ? route.path.spec.to_s : route.path
|
54
|
+
path =~ exclusion_regexp
|
55
|
+
end
|
56
|
+
end
|
57
|
+
routes
|
58
|
+
end
|
7
59
|
end
|
data/test/app.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rails'
|
2
|
+
require 'action_controller/railtie'
|
3
|
+
|
4
|
+
require 'traceroute'
|
5
|
+
|
6
|
+
module DummyApp
|
7
|
+
class Application < Rails::Application
|
8
|
+
config.root = File.expand_path('..', __FILE__)
|
9
|
+
config.eager_load = false
|
10
|
+
config.secret_key_base = '1234567890'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
class ApplicationController < ActionController::Base; end
|
15
|
+
|
16
|
+
class UsersController < ApplicationController
|
17
|
+
def index; end
|
18
|
+
def index2; end
|
19
|
+
def show; end
|
20
|
+
end
|
21
|
+
|
22
|
+
module Admin; class ShopsController < ApplicationController
|
23
|
+
def index; end
|
24
|
+
def create; end
|
25
|
+
end; end
|
26
|
+
|
27
|
+
DummyApp::Application.initialize!
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,100 @@
|
|
1
|
+
require_relative 'test_helper'
|
2
|
+
|
3
|
+
class TracerouteTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
@traceroute = Traceroute.new Rails.application
|
6
|
+
@traceroute.load_everything!
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_defined_action_methods
|
10
|
+
assert_equal ['users#index', 'users#index2', 'users#show', 'admin/shops#index', 'admin/shops#create'], @traceroute.defined_action_methods
|
11
|
+
end
|
12
|
+
|
13
|
+
def test_routed_actions
|
14
|
+
assert_empty @traceroute.routed_actions
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class RoutedActionsTest < Minitest::Test
|
19
|
+
def setup
|
20
|
+
DummyApp::Application.routes.draw do
|
21
|
+
resources :users, :only => [:index, :show, :new, :create]
|
22
|
+
|
23
|
+
namespace :admin do
|
24
|
+
resources :shops, :only => :index
|
25
|
+
end
|
26
|
+
end
|
27
|
+
@traceroute = Traceroute.new Rails.application
|
28
|
+
end
|
29
|
+
|
30
|
+
def teardown
|
31
|
+
DummyApp::Application.routes.clear!
|
32
|
+
end
|
33
|
+
|
34
|
+
def test_routed_actions
|
35
|
+
assert_equal ['admin/shops#index', 'users#index', 'users#show', 'users#new', 'users#create'].sort, @traceroute.routed_actions.sort
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class TracerouteRakeTests < Minitest::Test
|
40
|
+
def setup
|
41
|
+
require 'rake'
|
42
|
+
load "./lib/tasks/traceroute.rake"
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_dont_fail_when_envvar_not_set
|
46
|
+
traceroute = Traceroute.new Rails.application
|
47
|
+
traceroute.load_everything!
|
48
|
+
|
49
|
+
ENV['FAIL_ON_ERROR'] = ""
|
50
|
+
Rake::Task[:traceroute].execute
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_rake_task_fails_when_unreachable_action_method_detected
|
54
|
+
traceroute = Traceroute.new Rails.application
|
55
|
+
traceroute.load_everything!
|
56
|
+
|
57
|
+
begin
|
58
|
+
ENV['FAIL_ON_ERROR']="1"
|
59
|
+
Rake::Task[:traceroute].execute
|
60
|
+
rescue => e
|
61
|
+
assert_includes e.message, "Unused routes or unreachable action methods detected."
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def test_rake_task_fails_when_unused_route_detected
|
66
|
+
DummyApp::Application.routes.draw do
|
67
|
+
resources :users, :only => [:index, :show, :new, :create] do
|
68
|
+
member do
|
69
|
+
get :index2
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
namespace :admin do
|
74
|
+
resources :shops, :only => [:index, :create]
|
75
|
+
end
|
76
|
+
|
77
|
+
namespace :rails do
|
78
|
+
resources :mailers, only: ["index"] do
|
79
|
+
member do
|
80
|
+
get :preview
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
traceroute = Traceroute.new Rails.application
|
87
|
+
|
88
|
+
begin
|
89
|
+
ENV['FAIL_ON_ERROR'] = "1"
|
90
|
+
Rake::Task[:traceroute].execute
|
91
|
+
rescue => e
|
92
|
+
assert_includes e.message, "Unused routes or unreachable action methods detected."
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def teardown
|
97
|
+
Rake::Task.clear
|
98
|
+
DummyApp::Application.routes.clear!
|
99
|
+
end
|
100
|
+
end
|
data/traceroute.gemspec
CHANGED
@@ -1,10 +1,9 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
$:.push File.expand_path("../lib", __FILE__)
|
3
|
-
require "traceroute/version"
|
4
3
|
|
5
4
|
Gem::Specification.new do |s|
|
6
5
|
s.name = "traceroute"
|
7
|
-
s.version =
|
6
|
+
s.version = '0.5.0'
|
8
7
|
s.platform = Gem::Platform::RUBY
|
9
8
|
s.authors = ['Akira Matsuda']
|
10
9
|
s.email = ['ronnie@dio.jp']
|
metadata
CHANGED
@@ -1,27 +1,27 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: traceroute
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Akira Matsuda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - '>='
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 3.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 3.0.0
|
27
27
|
description: This Rake task investigates the application's routes definition, then
|
@@ -33,13 +33,15 @@ extensions: []
|
|
33
33
|
extra_rdoc_files:
|
34
34
|
- README.rdoc
|
35
35
|
files:
|
36
|
-
-
|
36
|
+
- .gitignore
|
37
37
|
- Gemfile
|
38
38
|
- README.rdoc
|
39
39
|
- Rakefile
|
40
40
|
- lib/tasks/traceroute.rake
|
41
41
|
- lib/traceroute.rb
|
42
|
-
-
|
42
|
+
- test/app.rb
|
43
|
+
- test/test_helper.rb
|
44
|
+
- test/traceroute_test.rb
|
43
45
|
- traceroute.gemspec
|
44
46
|
homepage: https://github.com/amatsuda/traceroute
|
45
47
|
licenses:
|
@@ -51,19 +53,22 @@ require_paths:
|
|
51
53
|
- lib
|
52
54
|
required_ruby_version: !ruby/object:Gem::Requirement
|
53
55
|
requirements:
|
54
|
-
- -
|
56
|
+
- - '>='
|
55
57
|
- !ruby/object:Gem::Version
|
56
58
|
version: '0'
|
57
59
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
58
60
|
requirements:
|
59
|
-
- -
|
61
|
+
- - '>='
|
60
62
|
- !ruby/object:Gem::Version
|
61
63
|
version: '0'
|
62
64
|
requirements: []
|
63
65
|
rubyforge_project: traceroute
|
64
|
-
rubygems_version: 2.
|
66
|
+
rubygems_version: 2.4.5
|
65
67
|
signing_key:
|
66
68
|
specification_version: 4
|
67
69
|
summary: A Rake task that helps you find the dead routes and actions for your Rails
|
68
70
|
3 app
|
69
|
-
test_files:
|
71
|
+
test_files:
|
72
|
+
- test/app.rb
|
73
|
+
- test/test_helper.rb
|
74
|
+
- test/traceroute_test.rb
|
data/lib/traceroute/version.rb
DELETED