grep_routes 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.rvmrc +1 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +52 -0
- data/README.md +26 -0
- data/Rakefile +10 -0
- data/bin/grep_routes +15 -0
- data/grep_routes.gemspec +21 -0
- data/lib/grep_routes.rb +129 -0
- data/spec/basic_routes_spec.rb +36 -0
- data/spec/fixtures/routes.rb +63 -0
- data/spec/fixtures/routes_with_rack_mounts.rb +19 -0
- data/spec/spec_helper.rb +6 -0
- data/spec/with_rack_mounts_spec.rb +20 -0
- metadata +97 -0
data/.rvmrc
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
rvm 1.9.3@grep_routes
|
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
grep_routes (0.0.0)
|
5
|
+
actionpack (~> 3.1.3)
|
6
|
+
activesupport (~> 3.1.3)
|
7
|
+
|
8
|
+
GEM
|
9
|
+
remote: http://rubygems.org/
|
10
|
+
specs:
|
11
|
+
actionpack (3.1.3)
|
12
|
+
activemodel (= 3.1.3)
|
13
|
+
activesupport (= 3.1.3)
|
14
|
+
builder (~> 3.0.0)
|
15
|
+
erubis (~> 2.7.0)
|
16
|
+
i18n (~> 0.6)
|
17
|
+
rack (~> 1.3.5)
|
18
|
+
rack-cache (~> 1.1)
|
19
|
+
rack-mount (~> 0.8.2)
|
20
|
+
rack-test (~> 0.6.1)
|
21
|
+
sprockets (~> 2.0.3)
|
22
|
+
activemodel (3.1.3)
|
23
|
+
activesupport (= 3.1.3)
|
24
|
+
builder (~> 3.0.0)
|
25
|
+
i18n (~> 0.6)
|
26
|
+
activesupport (3.1.3)
|
27
|
+
multi_json (~> 1.0)
|
28
|
+
builder (3.0.0)
|
29
|
+
erubis (2.7.0)
|
30
|
+
hike (1.2.1)
|
31
|
+
i18n (0.6.0)
|
32
|
+
minitest (2.11.2)
|
33
|
+
multi_json (1.1.0)
|
34
|
+
rack (1.3.6)
|
35
|
+
rack-cache (1.1)
|
36
|
+
rack (>= 0.4)
|
37
|
+
rack-mount (0.8.3)
|
38
|
+
rack (>= 1.0.0)
|
39
|
+
rack-test (0.6.1)
|
40
|
+
rack (>= 1.0)
|
41
|
+
sprockets (2.0.3)
|
42
|
+
hike (~> 1.2)
|
43
|
+
rack (~> 1.0)
|
44
|
+
tilt (~> 1.1, != 1.3.0)
|
45
|
+
tilt (1.3.3)
|
46
|
+
|
47
|
+
PLATFORMS
|
48
|
+
ruby
|
49
|
+
|
50
|
+
DEPENDENCIES
|
51
|
+
grep_routes!
|
52
|
+
minitest (~> 2.11.2)
|
data/README.md
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Grep Routes
|
2
|
+
===========
|
3
|
+
Running `rake routes` is super slow and a waste of time.
|
4
|
+
|
5
|
+
`grep_routes` is similar to `rake routes | grep someroute` but way faster.
|
6
|
+
|
7
|
+
Install
|
8
|
+
-------
|
9
|
+
|
10
|
+
gem install grep_routes
|
11
|
+
|
12
|
+
Usage
|
13
|
+
-----
|
14
|
+
All commands should be run from the root of your Rails3 project.
|
15
|
+
|
16
|
+
Show all your routes:
|
17
|
+
|
18
|
+
grep_routes
|
19
|
+
|
20
|
+
Grep through your routes:
|
21
|
+
|
22
|
+
grep_routes privacy_policy
|
23
|
+
|
24
|
+
Grep through your routes using regex:
|
25
|
+
|
26
|
+
grep_routes "(privacy_policy|terms|\w+_id)"
|
data/Rakefile
ADDED
data/bin/grep_routes
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'rubygems'
|
3
|
+
$:.unshift File.expand_path('../../lib/', __FILE__)
|
4
|
+
require "grep_routes"
|
5
|
+
|
6
|
+
path = './config/routes.rb'
|
7
|
+
path = './spec/fixtures/routes.rb'
|
8
|
+
|
9
|
+
gr = GrepRoutes.new(path)
|
10
|
+
gr.eval_routes
|
11
|
+
|
12
|
+
# filter
|
13
|
+
gr.filter_routes(ARGV[0]) if ARGV.any?
|
14
|
+
|
15
|
+
$stdout.puts gr.formatted_routes
|
data/grep_routes.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "grep_routes"
|
5
|
+
s.version = "0.0.1"
|
6
|
+
s.authors = ["Tyler Montgomery"]
|
7
|
+
s.email = ["tyler.a.montgomery@gmail.com"]
|
8
|
+
s.homepage = "http://github.com/ubermajestix/grep_routes"
|
9
|
+
s.summary = %q{Fast Routes for Rails}
|
10
|
+
s.description = %q{Greppin in ur routes}
|
11
|
+
|
12
|
+
s.files = `git ls-files`.split("\n")
|
13
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
14
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
15
|
+
s.require_paths = ["lib"]
|
16
|
+
|
17
|
+
s.add_dependency "activesupport" , "~> 3.1.3"
|
18
|
+
s.add_dependency "actionpack" , "~> 3.1.3"
|
19
|
+
|
20
|
+
s.add_development_dependency "minitest", "~> 2.11.2"
|
21
|
+
end
|
data/lib/grep_routes.rb
ADDED
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'active_support/core_ext/hash/reverse_merge'
|
3
|
+
require 'active_support/core_ext/enumerable'
|
4
|
+
require 'action_dispatch'
|
5
|
+
|
6
|
+
class GrepRoutes
|
7
|
+
class Rails
|
8
|
+
def self.env
|
9
|
+
@_env ||= ActiveSupport::StringInquirer.new(ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_reader :path_to_routes_file
|
14
|
+
attr_reader :route_file
|
15
|
+
attr_reader :class_name
|
16
|
+
attr_reader :pattern
|
17
|
+
|
18
|
+
def initialize(path_to_routes_file)
|
19
|
+
@path_to_routes_file = path_to_routes_file
|
20
|
+
@route_file = File.read(path_to_routes_file)
|
21
|
+
@class_name = route_file.match(/(\w+)::Application\.routes\.draw/)[1]
|
22
|
+
self.init_rails_class
|
23
|
+
self.init_rack_apps
|
24
|
+
end
|
25
|
+
|
26
|
+
# To make this fast we don't load your rails app or any of your gems.
|
27
|
+
# Instead we build YourRailsApp::Application class and define one method on it.
|
28
|
+
# The #routes method is almost the same as what Rails provides and once we eval
|
29
|
+
# the routes file, it will be filled up with your routes.
|
30
|
+
def init_rails_class
|
31
|
+
rails_app.module_eval do
|
32
|
+
self.const_set('Application', Class.new) unless self.const_defined?('Application')
|
33
|
+
self.const_get('Application', Class.new).class_eval do
|
34
|
+
def self.routes
|
35
|
+
@routes ||= ActionDispatch::Routing::RouteSet.new
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def rails_app
|
42
|
+
Object.const_set(class_name,Module.new) unless Object.const_defined?(class_name)
|
43
|
+
Object.const_get(class_name,Module.new)
|
44
|
+
end
|
45
|
+
|
46
|
+
# If there are any mounted Rack apps in your routes, we'll have to grab their
|
47
|
+
# classes and define #call on them so they look like Rack apps to the router.
|
48
|
+
#
|
49
|
+
# Only the last class needs to have #call defined on it but all the objects
|
50
|
+
# "above" it need to be defined as Modules - basically we define the object
|
51
|
+
# heirarchy.
|
52
|
+
def init_rack_apps
|
53
|
+
rack_apps = route_file.scan(/mount (.+?\s+)/).flatten.map(&:strip)
|
54
|
+
rack_apps.each do |class_name|
|
55
|
+
objects = class_name.split("::")
|
56
|
+
rack_class = objects.pop
|
57
|
+
last_object = Object
|
58
|
+
objects.each do |obj|
|
59
|
+
last_object.const_set(obj, Module.new) unless last_object.const_defined?(obj)
|
60
|
+
last_object = last_object.const_get(obj)
|
61
|
+
end
|
62
|
+
make_rackapp(last_object, rack_class)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def make_rackapp(mod, obj)
|
67
|
+
mod.const_set(obj,Class.new) unless mod.const_defined?(obj)
|
68
|
+
mod.const_get(obj,Class.new).class_eval do
|
69
|
+
def self.call
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# This evals the routes file. After this method is called the RouteSet will
|
75
|
+
# have all of our routes inside it.
|
76
|
+
def eval_routes
|
77
|
+
eval(route_file)
|
78
|
+
end
|
79
|
+
|
80
|
+
# A shortcut to the RouteSet we defined in init_rails_class.
|
81
|
+
def route_set
|
82
|
+
rails_app.const_get('Application', Class.new).routes
|
83
|
+
end
|
84
|
+
|
85
|
+
# Returns an Array of Hashes to make it easier to reference parts of the route.
|
86
|
+
# This is stolen from the Rail's routes rake task.
|
87
|
+
def routes
|
88
|
+
return @routes if @routes
|
89
|
+
|
90
|
+
@routes = route_set.routes.collect do |route|
|
91
|
+
reqs = route.requirements.dup
|
92
|
+
reqs[:to] = route.app unless route.app.class.name.to_s =~ /^ActionDispatch::Routing/
|
93
|
+
reqs = reqs.empty? ? "" : reqs.inspect
|
94
|
+
{:name => route.name.to_s, :verb => route.verb.to_s, :path => route.path, :reqs => reqs}
|
95
|
+
end
|
96
|
+
# Skip the route if it's internal info route
|
97
|
+
@routes.reject! { |r| r[:path] =~ %r{/rails/info/properties|^/assets} }
|
98
|
+
return @routes
|
99
|
+
end
|
100
|
+
|
101
|
+
# This method filters the routes by matching the basic route string that will
|
102
|
+
# outputted against a string or regex.
|
103
|
+
#
|
104
|
+
# You should call this method before formatted_routes so that the offsets will
|
105
|
+
# only apply to the filtered routes. Otherwise you'll have really weird output
|
106
|
+
# like when you run `rake routes | grep somepattern`.
|
107
|
+
def filter_routes(pattern)
|
108
|
+
@pattern = Regexp.new pattern
|
109
|
+
@routes = routes.select{|r| "#{r[:name]} #{r[:verb]} #{r[:path]} #{r[:reqs]}".match pattern}
|
110
|
+
@routes
|
111
|
+
end
|
112
|
+
|
113
|
+
# This formats the route as an Array of Strings.
|
114
|
+
# This is stolen from the Rail's routes rake task.
|
115
|
+
def formatted_routes
|
116
|
+
name_width = routes.map{ |r| r[:name].length }.max
|
117
|
+
verb_width = routes.map{ |r| r[:verb].length }.max
|
118
|
+
path_width = routes.map{ |r| r[:path].length }.max
|
119
|
+
routes.collect do |r|
|
120
|
+
string = "#{r[:name].rjust(name_width)} #{r[:verb].ljust(verb_width)} #{r[:path].ljust(path_width)} #{r[:reqs]}"
|
121
|
+
string.gsub(pattern){|s| "\e[35m#{$1}\e[0m"} if pattern
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
def print
|
126
|
+
puts formatted_routes
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GrepRoutes do
|
4
|
+
subject do
|
5
|
+
GrepRoutes.new('spec/fixtures/routes.rb')
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should set the path to the routes file as an instance var" do
|
9
|
+
subject.path_to_routes_file.must_equal 'spec/fixtures/routes.rb'
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should define the rails application class from the routes file" do
|
13
|
+
subject.rails_app.to_s.must_equal 'SomeRailsApp'
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should have a shortcut to the RouteSet" do
|
17
|
+
subject.route_set.must_be_kind_of ActionDispatch::Routing::RouteSet
|
18
|
+
end
|
19
|
+
|
20
|
+
it "there should be routes after we eval the routes file" do
|
21
|
+
subject.eval_routes
|
22
|
+
subject.route_set.routes.wont_be_empty
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should filter routes" do
|
26
|
+
subject.eval_routes
|
27
|
+
subject.filter_routes('privacy')
|
28
|
+
subject.routes.length.must_equal 1
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should filter routes using a regex" do
|
32
|
+
subject.eval_routes
|
33
|
+
subject.filter_routes('(privacy|terms)')
|
34
|
+
subject.routes.length.must_equal 2
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# This is psuedo-real routes file that has lots of fun stuff like scopes and
|
2
|
+
# namespaces, resources and named routes as well as conditional logic based on
|
3
|
+
# the Rails.env.
|
4
|
+
SomeRailsApp::Application.routes.draw do
|
5
|
+
|
6
|
+
resource :user_session, only: [ :create, :new, :destroy ]
|
7
|
+
|
8
|
+
|
9
|
+
namespace :admin do
|
10
|
+
|
11
|
+
resources :companies do
|
12
|
+
end
|
13
|
+
|
14
|
+
resources :employees, only: [:index] do
|
15
|
+
member do
|
16
|
+
put :revoke_access
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
resources :vacation do
|
22
|
+
get :home
|
23
|
+
get :store
|
24
|
+
member do
|
25
|
+
get :discussion
|
26
|
+
end
|
27
|
+
match 'profile_edit' => 'profiles#edit'
|
28
|
+
match 'profile_update' => 'profiles#update'
|
29
|
+
get :settings
|
30
|
+
post :settings
|
31
|
+
end
|
32
|
+
|
33
|
+
resources :subscriptions, :only => [:index, :update]
|
34
|
+
|
35
|
+
match 'login' => 'user_sessions#new'
|
36
|
+
match 'logout' => 'user_sessions#destroy'
|
37
|
+
match 'home' => 'companies#home'
|
38
|
+
match 'forgot_password' => 'password_resets#new'
|
39
|
+
match 'activate/:token' => 'activation#new', as: 'activate_account'
|
40
|
+
|
41
|
+
scope ':nickname/:slug', as: 'customer' do
|
42
|
+
match '/' => 'customer#show'
|
43
|
+
match '/settings' => 'customer#settings'
|
44
|
+
match '/ask_for_password' => 'customer#ask_for_password'
|
45
|
+
match '/submit_password' => 'customer#submit_password', coditions: {method: :post}
|
46
|
+
scope ':segment_slug', as: 'segment' do
|
47
|
+
match 'photos/:id' => 'photos#show', :as => "photo_show"
|
48
|
+
match 'posts/:id' => 'posts#show', :as => "post_show"
|
49
|
+
match 'videos/:id' => 'videos#show', :as => "video_show"
|
50
|
+
match 'details/:id' => 'triptrackers#show', :as => "detail_show"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
match 'privacy' => 'welcome#privacy'
|
55
|
+
match 'terms' => 'welcome#terms'
|
56
|
+
|
57
|
+
root to: 'welcome#index'
|
58
|
+
|
59
|
+
# if development, the url is concourse.dev, otherwise it's www. for production, and enviroment_name. for anything else
|
60
|
+
default_url_options host: Rails.env.development? ? 'yoursite.dev': Rails.env.production? ? "www.example.com" : "#{ Rails.env }.example.com"
|
61
|
+
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
YourApp::Application.routes.draw do
|
2
|
+
|
3
|
+
resources :users, only: [:update]
|
4
|
+
|
5
|
+
match '/facebook/:action' => 'facebook', as: 'facebook'
|
6
|
+
|
7
|
+
if Rails.env.development?
|
8
|
+
# These are little Rack apps we defined somewhere in our Rails app.
|
9
|
+
# For our purposes here, we don't care what they do, we just have to define
|
10
|
+
# #call on them to statisfy the router.
|
11
|
+
#
|
12
|
+
# See the mail_view gem for previewing your mailer views in the browser.
|
13
|
+
mount Preview::ErrorMailer => 'mail_view/error_mailer'
|
14
|
+
mount Preview::UserMailer => 'mail_view/user_mailer'
|
15
|
+
mount Preview::StoreMailer => 'mail_view/store_mailer'
|
16
|
+
mount Preview::BrandMailer => 'mail_view/brand_mailer'
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GrepRoutes do
|
4
|
+
|
5
|
+
subject do
|
6
|
+
GrepRoutes.new('spec/fixtures/routes_with_rack_mounts.rb')
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should handle mounted Rack apps" do
|
10
|
+
subject.init_rack_apps
|
11
|
+
subject.eval_routes
|
12
|
+
subject.routes.length.must_equal 6
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should print the rack app routes" do
|
16
|
+
subject.init_rack_apps
|
17
|
+
subject.eval_routes
|
18
|
+
subject.print
|
19
|
+
end
|
20
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: grep_routes
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Tyler Montgomery
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-02-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: activesupport
|
16
|
+
requirement: &70298229753960 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 3.1.3
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70298229753960
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: actionpack
|
27
|
+
requirement: &70298229753480 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ~>
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 3.1.3
|
33
|
+
type: :runtime
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70298229753480
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: minitest
|
38
|
+
requirement: &70298229752960 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ~>
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 2.11.2
|
44
|
+
type: :development
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70298229752960
|
47
|
+
description: Greppin in ur routes
|
48
|
+
email:
|
49
|
+
- tyler.a.montgomery@gmail.com
|
50
|
+
executables:
|
51
|
+
- grep_routes
|
52
|
+
extensions: []
|
53
|
+
extra_rdoc_files: []
|
54
|
+
files:
|
55
|
+
- .rvmrc
|
56
|
+
- Gemfile
|
57
|
+
- Gemfile.lock
|
58
|
+
- README.md
|
59
|
+
- Rakefile
|
60
|
+
- bin/grep_routes
|
61
|
+
- grep_routes.gemspec
|
62
|
+
- lib/grep_routes.rb
|
63
|
+
- spec/basic_routes_spec.rb
|
64
|
+
- spec/fixtures/routes.rb
|
65
|
+
- spec/fixtures/routes_with_rack_mounts.rb
|
66
|
+
- spec/spec_helper.rb
|
67
|
+
- spec/with_rack_mounts_spec.rb
|
68
|
+
homepage: http://github.com/ubermajestix/grep_routes
|
69
|
+
licenses: []
|
70
|
+
post_install_message:
|
71
|
+
rdoc_options: []
|
72
|
+
require_paths:
|
73
|
+
- lib
|
74
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
requirements: []
|
87
|
+
rubyforge_project:
|
88
|
+
rubygems_version: 1.8.5
|
89
|
+
signing_key:
|
90
|
+
specification_version: 3
|
91
|
+
summary: Fast Routes for Rails
|
92
|
+
test_files:
|
93
|
+
- spec/basic_routes_spec.rb
|
94
|
+
- spec/fixtures/routes.rb
|
95
|
+
- spec/fixtures/routes_with_rack_mounts.rb
|
96
|
+
- spec/spec_helper.rb
|
97
|
+
- spec/with_rack_mounts_spec.rb
|