grep_routes 0.0.1
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.
- 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
|