pry-rails 0.2.2 → 0.3.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 +7 -0
- data/.gitignore +2 -1
- data/Appraisals +6 -2
- data/Appraisals-1.8 +14 -0
- data/Rakefile +31 -29
- data/Readme.md +13 -9
- data/lib/pry-rails.rb +2 -4
- data/lib/pry-rails/commands.rb +7 -201
- data/lib/pry-rails/commands/show_middleware.rb +67 -0
- data/lib/pry-rails/commands/show_models.rb +153 -0
- data/lib/pry-rails/commands/show_routes.rb +64 -0
- data/lib/pry-rails/console.rb +7 -0
- data/lib/pry-rails/railtie.rb +3 -1
- data/lib/pry-rails/version.rb +1 -1
- data/pry-rails.gemspec +3 -0
- data/spec/config/config.ru +1 -0
- data/spec/config/database.yml +6 -0
- data/spec/config/environment.rb +79 -0
- data/{test → spec/config}/routes.rb +1 -1
- data/spec/railtie_spec.rb +16 -0
- data/spec/show_middleware_spec.rb +14 -0
- data/spec/show_models_spec.rb +77 -0
- data/spec/show_routes_spec.rb +15 -0
- data/spec/spec_helper.rb +41 -0
- metadata +65 -26
- data/test/models/beer.rb +0 -3
- data/test/models/hacker.rb +0 -4
- data/test/models/pokemon.rb +0 -4
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: f1bf84b59262a2cae9e27ff70243ece0801883ac
|
4
|
+
data.tar.gz: 561db8abcdc9a12bcc24d4ac4bbb34c15bd1f672
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c86ae06eb7cbeb6ecd938e8680fe6c580b43f5457137ad9d5f9fa71298a3d9dc5a1185b1a3c784bc0fb65be10ff5558122dab59da4b5537d7908a5e3741e6ebb
|
7
|
+
data.tar.gz: 99719f8dbc4abc3b624ad052211b1f290a82dd506cf0846dc8715be2634a94414efe36263f1c010547a90b82820fee3a1a386b6f2425cc16b29b0351b58a622f
|
data/.gitignore
CHANGED
data/Appraisals
CHANGED
@@ -5,18 +5,22 @@ end
|
|
5
5
|
|
6
6
|
appraise "rails31" do
|
7
7
|
gem "rails", "3.1.6"
|
8
|
+
gem "mongoid"
|
8
9
|
gem "sqlite3"
|
9
10
|
end
|
10
11
|
|
11
12
|
appraise "rails32" do
|
12
13
|
gem "rails", "3.2.6"
|
14
|
+
gem "mongoid"
|
13
15
|
gem "sqlite3"
|
14
16
|
end
|
15
17
|
|
16
18
|
appraise "rails4" do
|
17
19
|
gem "rails",
|
18
20
|
:git => "git@github.com:rails/rails.git"
|
19
|
-
gem "
|
20
|
-
:git => "git@github.com:rails/
|
21
|
+
gem "activerecord-deprecated_finders",
|
22
|
+
:git => "git@github.com:rails/activerecord-deprecated_finders"
|
23
|
+
gem "journey",
|
24
|
+
:git => "git@github.com:rails/journey"
|
21
25
|
gem "sqlite3"
|
22
26
|
end
|
data/Appraisals-1.8
ADDED
data/Rakefile
CHANGED
@@ -1,43 +1,45 @@
|
|
1
1
|
require "rubygems"
|
2
2
|
require "bundler/setup"
|
3
3
|
require "bundler/gem_tasks"
|
4
|
+
require "rake/testtask"
|
4
5
|
require "appraisal"
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
rm_rf 'test/app'
|
12
|
-
system 'env BUNDLE_GEMFILE=gemfiles/rails30.gemfile bundle exec rails new test/app'
|
13
|
-
|
14
|
-
# Copy test routes file into place
|
15
|
-
cp 'test/routes.rb', 'test/app/config/routes.rb'
|
16
|
-
|
17
|
-
# Remove rjs line from environment, since it's gone in versions >= 3.1
|
18
|
-
env_contents = File.readlines('test/app/config/environments/development.rb')
|
19
|
-
File.open('test/app/config/environments/development.rb', 'w') do |f|
|
20
|
-
f.puts env_contents.reject { |l| l =~ /rjs/ }.join("\n")
|
7
|
+
if RUBY_VERSION =~ /^1.8/
|
8
|
+
class Appraisal::File
|
9
|
+
def path
|
10
|
+
'Appraisals-1.8'
|
11
|
+
end
|
21
12
|
end
|
13
|
+
end
|
22
14
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
system 'env BUNDLE_GEMFILE=../../gemfiles/rails30.gemfile bundle exec rails g model Hacker social_ability:integer'
|
27
|
-
system 'env BUNDLE_GEMFILE=../../gemfiles/rails30.gemfile bundle exec rails g model Beer name:string type:string rating:integer ibu:integer abv:integer'
|
28
|
-
system 'env BUNDLE_GEMFILE=../../gemfiles/rails30.gemfile bundle exec rake db:migrate'
|
29
|
-
|
30
|
-
# Replace generated models
|
31
|
-
cd '../..'
|
32
|
-
cp_r 'test/models', 'test/app/app/models'
|
15
|
+
Rake::TestTask.new do |t|
|
16
|
+
t.libs.concat %w(pry-rails spec)
|
17
|
+
t.pattern = "spec/*_spec.rb"
|
33
18
|
end
|
34
19
|
|
35
20
|
desc 'Start the Rails server'
|
36
|
-
task :server do
|
37
|
-
|
21
|
+
task :server => :development_env do
|
22
|
+
require 'rails/commands/server'
|
23
|
+
Rails::Server.start(
|
24
|
+
:server => 'WEBrick',
|
25
|
+
:environment => 'development',
|
26
|
+
:Host => '0.0.0.0',
|
27
|
+
:Port => 3000,
|
28
|
+
:config => 'config/config.ru'
|
29
|
+
)
|
38
30
|
end
|
39
31
|
|
40
32
|
desc 'Start the Rails console'
|
41
|
-
task :console do
|
42
|
-
|
33
|
+
task :console => :development_env do
|
34
|
+
require 'rails/commands/console'
|
35
|
+
Rails::Console.start(Rails.application)
|
36
|
+
end
|
37
|
+
|
38
|
+
task :development_env do
|
39
|
+
ENV['RAILS_ENV'] = 'development'
|
40
|
+
require File.expand_path('../spec/config/environment', __FILE__)
|
41
|
+
Dir.chdir(Rails.application.root)
|
43
42
|
end
|
43
|
+
|
44
|
+
# Must invoke indirectly, using `rake appraisal`.
|
45
|
+
task :default => [:test]
|
data/Readme.md
CHANGED
@@ -70,20 +70,24 @@ Pokemon
|
|
70
70
|
updated_at: datetime
|
71
71
|
belongs_to hacker
|
72
72
|
has_many beers through hacker
|
73
|
+
|
74
|
+
$ DISABLE_PRY_RAILS=1 rails console
|
75
|
+
irb(main):001:0>
|
73
76
|
```
|
74
77
|
|
75
|
-
# Developing
|
78
|
+
# Developing and Testing
|
76
79
|
|
77
|
-
To
|
78
|
-
`rake
|
80
|
+
To generate Gemfiles for Rails 3.0, 3.1, 3.2, and 4.0, run
|
81
|
+
`rake appraisal:gemfiles appraisal:install`.
|
79
82
|
|
80
|
-
|
81
|
-
|
83
|
+
You can then run the tests across all four versions with `rake appraisal`.
|
84
|
+
You can also manually run the Rails console and server with `rake
|
85
|
+
appraisal console` and `rake appraisal server`.
|
82
86
|
|
83
|
-
For a specific version of Rails,
|
84
|
-
|
85
|
-
appraisal:rails4`.
|
87
|
+
For a specific version of Rails, use `rake appraisal:rails30`, `rake
|
88
|
+
appraisal:rails31`, `rake appraisal:rails32`, or `rake appraisal:rails4`.
|
86
89
|
|
87
90
|
# Alternative
|
88
91
|
|
89
|
-
If you want to enable pry everywhere, make sure to check out
|
92
|
+
If you want to enable pry everywhere, make sure to check out
|
93
|
+
[pry everywhere](http://lucapette.com/pry/pry-everywhere/).
|
data/lib/pry-rails.rb
CHANGED
data/lib/pry-rails/commands.rb
CHANGED
@@ -1,205 +1,11 @@
|
|
1
|
-
|
2
|
-
Commands = Pry::CommandSet.new do
|
3
|
-
create_command "show-routes", "Print out all defined routes in match order, with names." do
|
4
|
-
group "Rails"
|
1
|
+
# encoding: UTF-8
|
5
2
|
|
6
|
-
|
7
|
-
opt.banner unindent <<-USAGE
|
8
|
-
Usage: show-routes [-G]
|
3
|
+
PryRails::Commands = Pry::CommandSet.new
|
9
4
|
|
10
|
-
|
11
|
-
USAGE
|
5
|
+
command_glob = File.expand_path('../commands/*.rb', __FILE__)
|
12
6
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
def process
|
17
|
-
Rails.application.reload_routes!
|
18
|
-
all_routes = Rails.application.routes.routes
|
19
|
-
|
20
|
-
all_routes = begin
|
21
|
-
begin
|
22
|
-
# rails 4
|
23
|
-
require 'action_dispatch/routing/inspector'
|
24
|
-
inspector = ActionDispatch::Routing::RoutesInspector.new
|
25
|
-
rescue LoadError => e
|
26
|
-
# rails 3.2
|
27
|
-
require 'rails/application/route_inspector'
|
28
|
-
inspector = Rails::Application::RouteInspector.new
|
29
|
-
end
|
30
|
-
inspector.format(all_routes)
|
31
|
-
rescue LoadError => e
|
32
|
-
# rails 3.0 and 3.1. cribbed from
|
33
|
-
# https://github.com/rails/rails/blob/3-1-stable/railties/lib/rails/tasks/routes.rake
|
34
|
-
routes = all_routes.collect do |route|
|
35
|
-
|
36
|
-
reqs = route.requirements.dup
|
37
|
-
reqs[:to] = route.app unless route.app.class.name.to_s =~ /^ActionDispatch::Routing/
|
38
|
-
reqs = reqs.empty? ? "" : reqs.inspect
|
39
|
-
|
40
|
-
{:name => route.name.to_s, :verb => route.verb.to_s, :path => route.path, :reqs => reqs}
|
41
|
-
end
|
42
|
-
|
43
|
-
# Skip the route if it's internal info route
|
44
|
-
routes.reject! { |r| r[:path] =~ %r{/rails/info/properties|^/assets} }
|
45
|
-
|
46
|
-
name_width = routes.map{ |r| r[:name].length }.max
|
47
|
-
verb_width = routes.map{ |r| r[:verb].length }.max
|
48
|
-
path_width = routes.map{ |r| r[:path].length }.max
|
49
|
-
|
50
|
-
routes.map do |r|
|
51
|
-
"#{r[:name].rjust(name_width)} #{r[:verb].ljust(verb_width)} #{r[:path].ljust(path_width)} #{r[:reqs]}"
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
output.puts all_routes.grep(Regexp.new(opts[:G] || ".")).join "\n"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
create_command "show-models", "Print out all defined models, with attribrutes." do
|
60
|
-
group "Rails"
|
61
|
-
|
62
|
-
def options(opt)
|
63
|
-
opt.banner unindent <<-USAGE
|
64
|
-
Usage: show-models
|
65
|
-
|
66
|
-
show-models displays the current Rails app's models.
|
67
|
-
USAGE
|
68
|
-
|
69
|
-
opt.on :G, "grep", "Color output red by regular expression", :argument => true
|
70
|
-
end
|
71
|
-
|
72
|
-
def process
|
73
|
-
Rails.application.eager_load!
|
74
|
-
|
75
|
-
if defined?(ActiveRecord::Base)
|
76
|
-
models = ActiveRecord::Base.descendants.map do |mod|
|
77
|
-
model_string = mod.to_s + "\n"
|
78
|
-
if mod.table_exists?
|
79
|
-
model_string << mod.columns.map { |col| " #{col.name}: #{col.type.to_s}" }.join("\n")
|
80
|
-
else
|
81
|
-
model_string << " Table doesn't exist"
|
82
|
-
end
|
83
|
-
mod.reflections.each do |model,ref|
|
84
|
-
model_string << "\n #{ref.macro.to_s} #{model}"
|
85
|
-
model_string << " through #{ref.options[:through]}" unless ref.options[:through].nil?
|
86
|
-
end
|
87
|
-
model_string
|
88
|
-
end.join("\n")
|
89
|
-
elsif defined?(Mongoid::Document)
|
90
|
-
models = get_files.map do |path|
|
91
|
-
mod = extract_class_name(path)
|
92
|
-
model_string = "\033[1;34m#{mod.to_s}\033[0m\n"
|
93
|
-
begin
|
94
|
-
if mod.constantize.included_modules.include?(Mongoid::Document)
|
95
|
-
model_string << mod.constantize.fields.values.sort_by(&:name).map { |col|
|
96
|
-
" #{col.name}: \033[1;33m#{col.options[:type].to_s.downcase}\033[0m"
|
97
|
-
}.join("\n")
|
98
|
-
mod.constantize.relations.each do |model,ref|
|
99
|
-
model_string << "\n #{kind_of_relation(ref.relation.to_s)} \033[1;34m#{model}\033[0m"
|
100
|
-
model_string << ", autosave" if ref.options[:autosave]
|
101
|
-
model_string << ", autobuild" if ref.options[:autobuild]
|
102
|
-
model_string << ", validate" if ref.options[:validate]
|
103
|
-
model_string << ", dependent-#{ref.options[:dependent]}" if ref.options[:dependent]
|
104
|
-
end
|
105
|
-
else
|
106
|
-
model_string << " Collection doesn't exist"
|
107
|
-
end
|
108
|
-
model_string
|
109
|
-
|
110
|
-
rescue Exception
|
111
|
-
STDERR.puts "Warning: exception #{$!} raised while trying to load model class #{path}"
|
112
|
-
end
|
113
|
-
end.join("\n")
|
114
|
-
end
|
115
|
-
|
116
|
-
models.gsub!(Regexp.new(opts[:G] || ".", Regexp::IGNORECASE)) { |s| text.red(s) } unless opts[:G].nil?
|
117
|
-
output.puts models
|
118
|
-
end
|
119
|
-
|
120
|
-
def get_files(prefix ='')
|
121
|
-
Dir.glob(prefix << "app/models/**/*.rb")
|
122
|
-
end
|
123
|
-
|
124
|
-
def extract_class_name(filename)
|
125
|
-
filename.split('/')[2..-1].collect { |i| i.camelize }.join('::').chomp(".rb")
|
126
|
-
end
|
127
|
-
|
128
|
-
def kind_of_relation(string)
|
129
|
-
case string.gsub('Mongoid::Relations::', '')
|
130
|
-
when 'Referenced::Many' then 'has_many'
|
131
|
-
when 'Referenced::One' then 'has_one'
|
132
|
-
when 'Referenced::In' then 'belongs_to'
|
133
|
-
when 'Embedded::Many' then 'embeds_many'
|
134
|
-
when 'Embedded::One' then 'embeds_one'
|
135
|
-
when 'Embedded::In' then 'embedded_in'
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
create_command "show-middleware" do
|
141
|
-
group "Rails"
|
142
|
-
|
143
|
-
def options(opt)
|
144
|
-
opt.banner unindent <<-USAGE
|
145
|
-
Usage: show-middleware [-G]
|
146
|
-
|
147
|
-
show-middleware shows the Rails app's middleware.
|
148
|
-
|
149
|
-
If this pry REPL is attached to a Rails server, the entire middleware
|
150
|
-
stack is displayed. Otherwise, only the middleware Rails knows about is
|
151
|
-
printed.
|
152
|
-
USAGE
|
153
|
-
|
154
|
-
opt.on :G, "grep", "Filter output by regular expression", :argument => true
|
155
|
-
end
|
156
|
-
|
157
|
-
def process
|
158
|
-
# assumes there is only one Rack::Server instance
|
159
|
-
server = nil
|
160
|
-
ObjectSpace.each_object(Rack::Server) do |object|
|
161
|
-
server = object
|
162
|
-
end
|
163
|
-
|
164
|
-
middlewares = []
|
165
|
-
|
166
|
-
if server
|
167
|
-
stack = server.instance_variable_get("@wrapped_app")
|
168
|
-
middlewares << stack.class.to_s
|
169
|
-
|
170
|
-
while stack.instance_variable_defined?("@app") do
|
171
|
-
stack = stack.instance_variable_get("@app")
|
172
|
-
# Rails 3.0 uses the Application class rather than the application
|
173
|
-
# instance itself, so we grab the instance.
|
174
|
-
stack = Rails.application if stack == Rails.application.class
|
175
|
-
middlewares << stack.class.to_s if stack != Rails.application
|
176
|
-
end
|
177
|
-
else
|
178
|
-
middleware_names = Rails.application.middleware.map do |middleware|
|
179
|
-
# After Rails 3.0, the middleware are wrapped in a special class
|
180
|
-
# that responds to #name.
|
181
|
-
if middleware.respond_to?(:name)
|
182
|
-
middleware.name
|
183
|
-
else
|
184
|
-
middleware.inspect
|
185
|
-
end
|
186
|
-
end
|
187
|
-
middlewares.concat middleware_names
|
188
|
-
end
|
189
|
-
middlewares << Rails.application.class.to_s
|
190
|
-
print_middleware middlewares.grep(Regexp.new(opts[:G] || "."))
|
191
|
-
end
|
192
|
-
|
193
|
-
def print_middleware(middlewares)
|
194
|
-
middlewares.each do |middleware|
|
195
|
-
string = if middleware == Rails.application.class.to_s
|
196
|
-
"run #{middleware}.routes"
|
197
|
-
else
|
198
|
-
"use #{middleware}"
|
199
|
-
end
|
200
|
-
output.puts string
|
201
|
-
end
|
202
|
-
end
|
203
|
-
end
|
204
|
-
end
|
7
|
+
Dir[command_glob].each do |command|
|
8
|
+
require command
|
205
9
|
end
|
10
|
+
|
11
|
+
Pry.commands.import PryRails::Commands
|
@@ -0,0 +1,67 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
PryRails::Commands.create_command "show-middleware" do
|
4
|
+
group "Rails"
|
5
|
+
description "Show all middleware (that Rails knows about)."
|
6
|
+
|
7
|
+
def options(opt)
|
8
|
+
opt.banner unindent <<-USAGE
|
9
|
+
Usage: show-middleware [-G]
|
10
|
+
|
11
|
+
show-middleware shows the Rails app's middleware.
|
12
|
+
|
13
|
+
If this pry REPL is attached to a Rails server, the entire middleware
|
14
|
+
stack is displayed. Otherwise, only the middleware Rails knows about is
|
15
|
+
printed.
|
16
|
+
USAGE
|
17
|
+
|
18
|
+
opt.on :G, "grep", "Filter output by regular expression", :argument => true
|
19
|
+
end
|
20
|
+
|
21
|
+
def process
|
22
|
+
# assumes there is only one Rack::Server instance
|
23
|
+
server = nil
|
24
|
+
ObjectSpace.each_object(Rack::Server) do |object|
|
25
|
+
server = object
|
26
|
+
end
|
27
|
+
|
28
|
+
middlewares = []
|
29
|
+
|
30
|
+
if server
|
31
|
+
stack = server.instance_variable_get("@wrapped_app")
|
32
|
+
middlewares << stack.class.to_s
|
33
|
+
|
34
|
+
while stack.instance_variable_defined?("@app") do
|
35
|
+
stack = stack.instance_variable_get("@app")
|
36
|
+
# Rails 3.0 uses the Application class rather than the application
|
37
|
+
# instance itself, so we grab the instance.
|
38
|
+
stack = Rails.application if stack == Rails.application.class
|
39
|
+
middlewares << stack.class.to_s if stack != Rails.application
|
40
|
+
end
|
41
|
+
else
|
42
|
+
middleware_names = Rails.application.middleware.map do |middleware|
|
43
|
+
# After Rails 3.0, the middleware are wrapped in a special class
|
44
|
+
# that responds to #name.
|
45
|
+
if middleware.respond_to?(:name)
|
46
|
+
middleware.name
|
47
|
+
else
|
48
|
+
middleware.inspect
|
49
|
+
end
|
50
|
+
end
|
51
|
+
middlewares.concat middleware_names
|
52
|
+
end
|
53
|
+
middlewares << Rails.application.class.to_s
|
54
|
+
print_middleware middlewares.grep(Regexp.new(opts[:G] || "."))
|
55
|
+
end
|
56
|
+
|
57
|
+
def print_middleware(middlewares)
|
58
|
+
middlewares.each do |middleware|
|
59
|
+
string = if middleware == Rails.application.class.to_s
|
60
|
+
"run #{middleware}.routes"
|
61
|
+
else
|
62
|
+
"use #{middleware}"
|
63
|
+
end
|
64
|
+
output.puts string
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
class PryRails::ShowModels < Pry::ClassCommand
|
4
|
+
match "show-models"
|
5
|
+
group "Rails"
|
6
|
+
description "Show all models."
|
7
|
+
|
8
|
+
def options(opt)
|
9
|
+
opt.banner unindent <<-USAGE
|
10
|
+
Usage: show-models
|
11
|
+
|
12
|
+
show-models displays the current Rails app's models.
|
13
|
+
USAGE
|
14
|
+
|
15
|
+
opt.on :G, "grep", "Filter output by regular expression", :argument => true
|
16
|
+
end
|
17
|
+
|
18
|
+
def process
|
19
|
+
Rails.application.eager_load!
|
20
|
+
|
21
|
+
display_activerecord_models
|
22
|
+
display_mongoid_models
|
23
|
+
end
|
24
|
+
|
25
|
+
def display_activerecord_models
|
26
|
+
return unless defined?(ActiveRecord::Base)
|
27
|
+
|
28
|
+
models = ActiveRecord::Base.descendants
|
29
|
+
|
30
|
+
models.sort_by(&:to_s).each do |model|
|
31
|
+
out = []
|
32
|
+
out.push format_model_name model
|
33
|
+
|
34
|
+
if model.table_exists?
|
35
|
+
model.columns.each do |column|
|
36
|
+
out.push format_column column.name, column.type
|
37
|
+
end
|
38
|
+
else
|
39
|
+
out.push format_error "Table doesn't exist"
|
40
|
+
end
|
41
|
+
|
42
|
+
reflections = model.reflections.sort_by do |other_model, reflection|
|
43
|
+
[reflection.macro.to_s, other_model.to_s]
|
44
|
+
end
|
45
|
+
|
46
|
+
reflections.each do |other_model, reflection|
|
47
|
+
options = []
|
48
|
+
|
49
|
+
if reflection.options[:through].present?
|
50
|
+
options << "through #{text.blue ":#{reflection.options[:through]}"}"
|
51
|
+
end
|
52
|
+
|
53
|
+
out.push format_association reflection.macro, other_model, options
|
54
|
+
end
|
55
|
+
|
56
|
+
print_unless_filtered out
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def display_mongoid_models
|
61
|
+
return unless defined?(Mongoid::Document)
|
62
|
+
|
63
|
+
models = []
|
64
|
+
|
65
|
+
ObjectSpace.each_object do |o|
|
66
|
+
is_model = false
|
67
|
+
|
68
|
+
begin
|
69
|
+
is_model = o.class == Class && o.ancestors.include?(Mongoid::Document)
|
70
|
+
rescue => e
|
71
|
+
# If it's a weird object, it's not what we want anyway.
|
72
|
+
end
|
73
|
+
|
74
|
+
models << o if is_model
|
75
|
+
end
|
76
|
+
|
77
|
+
models.sort_by(&:to_s).each do |model|
|
78
|
+
out = []
|
79
|
+
out.push format_model_name model
|
80
|
+
|
81
|
+
model.fields.values.sort_by(&:name).each do |column|
|
82
|
+
out.push format_column column.name, column.options[:type]
|
83
|
+
end
|
84
|
+
|
85
|
+
model.relations.each do |other_model, ref|
|
86
|
+
options = []
|
87
|
+
options << 'autosave' if ref.options[:autosave]
|
88
|
+
options << 'autobuild' if ref.options[:autobuild]
|
89
|
+
options << 'validate' if ref.options[:validate]
|
90
|
+
|
91
|
+
if ref.options[:dependent]
|
92
|
+
options << "dependent-#{ref.options[:dependent]}"
|
93
|
+
end
|
94
|
+
|
95
|
+
out.push format_association \
|
96
|
+
kind_of_relation(ref.relation), other_model, options
|
97
|
+
end
|
98
|
+
|
99
|
+
print_unless_filtered out
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def format_model_name(model)
|
104
|
+
text.bright_blue model
|
105
|
+
end
|
106
|
+
|
107
|
+
def format_column(name, type)
|
108
|
+
" #{name}: #{text.green type}"
|
109
|
+
end
|
110
|
+
|
111
|
+
def format_association(type, other, options = [])
|
112
|
+
options_string = (options.any?) ? " (#{options.join(', ')})" : ''
|
113
|
+
" #{type} #{text.blue ":#{other}"}#{options_string}"
|
114
|
+
end
|
115
|
+
|
116
|
+
def format_error(message)
|
117
|
+
" #{text.red message}"
|
118
|
+
end
|
119
|
+
|
120
|
+
def print_unless_filtered array_of_strings
|
121
|
+
result = array_of_strings.join("\n")
|
122
|
+
if opts.present?(:G)
|
123
|
+
return unless result =~ grep_regex
|
124
|
+
result = colorize_matches(result) # :(
|
125
|
+
end
|
126
|
+
output.puts result
|
127
|
+
end
|
128
|
+
|
129
|
+
def colorize_matches(string)
|
130
|
+
if Pry.color
|
131
|
+
string.to_s.gsub(grep_regex) { |s| "\e[7m#{s}\e[27m" }
|
132
|
+
else
|
133
|
+
string
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def grep_regex
|
138
|
+
@grep_regex ||= Regexp.new(opts[:G], Regexp::IGNORECASE)
|
139
|
+
end
|
140
|
+
|
141
|
+
def kind_of_relation(relation)
|
142
|
+
case relation.to_s.sub(/^Mongoid::Relations::/, '')
|
143
|
+
when 'Referenced::Many' then 'has_many'
|
144
|
+
when 'Referenced::One' then 'has_one'
|
145
|
+
when 'Referenced::In' then 'belongs_to'
|
146
|
+
when 'Embedded::Many' then 'embeds_many'
|
147
|
+
when 'Embedded::One' then 'embeds_one'
|
148
|
+
when 'Embedded::In' then 'embedded_in'
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
PryRails::Commands.add_command PryRails::ShowModels
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
PryRails::Commands.create_command "show-routes" do
|
4
|
+
group "Rails"
|
5
|
+
description "Show all routes in match order."
|
6
|
+
|
7
|
+
def options(opt)
|
8
|
+
opt.banner unindent <<-USAGE
|
9
|
+
Usage: show-routes [-G]
|
10
|
+
|
11
|
+
show-routes displays the current Rails app's routes.
|
12
|
+
USAGE
|
13
|
+
|
14
|
+
opt.on :G, "grep", "Filter output by regular expression", :argument => true
|
15
|
+
end
|
16
|
+
|
17
|
+
def process
|
18
|
+
Rails.application.reload_routes!
|
19
|
+
all_routes = Rails.application.routes.routes
|
20
|
+
|
21
|
+
formatted = case Rails.version.to_s
|
22
|
+
when /^4/
|
23
|
+
process_rails_4(all_routes)
|
24
|
+
when /^3\.2/
|
25
|
+
process_rails_3_2(all_routes)
|
26
|
+
else
|
27
|
+
process_rails_3_0_and_3_1(all_routes)
|
28
|
+
end
|
29
|
+
|
30
|
+
output.puts formatted.grep(Regexp.new(opts[:G] || ".")).join("\n")
|
31
|
+
end
|
32
|
+
|
33
|
+
# Cribbed from https://github.com/rails/rails/blob/3-1-stable/railties/lib/rails/tasks/routes.rake
|
34
|
+
def process_rails_3_0_and_3_1(all_routes)
|
35
|
+
routes = all_routes.collect do |route|
|
36
|
+
reqs = route.requirements.dup
|
37
|
+
reqs[:to] = route.app unless route.app.class.name.to_s =~ /^ActionDispatch::Routing/
|
38
|
+
reqs = reqs.empty? ? "" : reqs.inspect
|
39
|
+
|
40
|
+
{:name => route.name.to_s, :verb => route.verb.to_s, :path => route.path, :reqs => reqs}
|
41
|
+
end
|
42
|
+
|
43
|
+
# Skip the route if it's internal info route
|
44
|
+
routes.reject! { |r| r[:path] =~ %r{/rails/info/properties|^/assets} }
|
45
|
+
|
46
|
+
name_width = routes.map{ |r| r[:name].length }.max
|
47
|
+
verb_width = routes.map{ |r| r[:verb].length }.max
|
48
|
+
path_width = routes.map{ |r| r[:path].length }.max
|
49
|
+
|
50
|
+
routes.map do |r|
|
51
|
+
"#{r[:name].rjust(name_width)} #{r[:verb].ljust(verb_width)} #{r[:path].ljust(path_width)} #{r[:reqs]}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def process_rails_3_2(all_routes)
|
56
|
+
require 'rails/application/route_inspector'
|
57
|
+
Rails::Application::RouteInspector.new.format(all_routes)
|
58
|
+
end
|
59
|
+
|
60
|
+
def process_rails_4(all_routes)
|
61
|
+
require 'action_dispatch/routing/inspector'
|
62
|
+
ActionDispatch::Routing::RoutesInspector.new(all_routes).format(ActionDispatch::Routing::ConsoleFormatter.new).split(/\n/)
|
63
|
+
end
|
64
|
+
end
|
data/lib/pry-rails/railtie.rb
CHANGED
data/lib/pry-rails/version.rb
CHANGED
data/pry-rails.gemspec
CHANGED
@@ -9,6 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.email = ["robin@wenglewski.de"]
|
10
10
|
s.homepage = "https://github.com/rweng/pry-rails"
|
11
11
|
s.summary = %q{Use Pry as your rails console}
|
12
|
+
s.license = "MIT"
|
12
13
|
# s.description = %q{TODO: Write a gem description}
|
13
14
|
|
14
15
|
# s.rubyforge_project = "pry-rails"
|
@@ -20,4 +21,6 @@ Gem::Specification.new do |s|
|
|
20
21
|
|
21
22
|
s.add_dependency "pry", ">= 0.9.10"
|
22
23
|
s.add_development_dependency "appraisal"
|
24
|
+
s.add_development_dependency "minitest"
|
25
|
+
s.add_development_dependency "rr"
|
23
26
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
run Rails.application
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'rails'
|
2
|
+
require 'rails/all'
|
3
|
+
require 'active_support/core_ext'
|
4
|
+
|
5
|
+
require 'pry-rails'
|
6
|
+
|
7
|
+
# Initialize our test app
|
8
|
+
|
9
|
+
class TestApp < Rails::Application
|
10
|
+
config.active_support.deprecation = :log
|
11
|
+
config.eager_load = false
|
12
|
+
|
13
|
+
config.secret_token = 'a' * 100
|
14
|
+
|
15
|
+
config.root = File.expand_path('../..', __FILE__)
|
16
|
+
end
|
17
|
+
|
18
|
+
TestApp.initialize!
|
19
|
+
|
20
|
+
# Create in-memory database
|
21
|
+
|
22
|
+
ActiveRecord::Migration.verbose = false
|
23
|
+
|
24
|
+
ActiveRecord::Schema.define do
|
25
|
+
create_table :pokemons do |t|
|
26
|
+
t.string :name
|
27
|
+
t.binary :caught
|
28
|
+
t.string :species
|
29
|
+
t.string :abilities
|
30
|
+
end
|
31
|
+
|
32
|
+
create_table :hackers do |t|
|
33
|
+
t.integer :social_ability
|
34
|
+
end
|
35
|
+
|
36
|
+
create_table :beers do |t|
|
37
|
+
t.string :name
|
38
|
+
t.string :type
|
39
|
+
t.integer :rating
|
40
|
+
t.integer :ibu
|
41
|
+
t.integer :abv
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Define models
|
46
|
+
|
47
|
+
class Beer < ActiveRecord::Base
|
48
|
+
belongs_to :hacker
|
49
|
+
end
|
50
|
+
|
51
|
+
class Hacker < ActiveRecord::Base
|
52
|
+
has_many :pokemons
|
53
|
+
has_many :beers
|
54
|
+
end
|
55
|
+
|
56
|
+
class Pokemon < ActiveRecord::Base
|
57
|
+
belongs_to :hacker
|
58
|
+
has_many :beers, :through => :hacker
|
59
|
+
end
|
60
|
+
|
61
|
+
begin
|
62
|
+
require 'mongoid'
|
63
|
+
|
64
|
+
class Artist
|
65
|
+
include Mongoid::Document
|
66
|
+
|
67
|
+
field :name, :type => String
|
68
|
+
embeds_one :beer
|
69
|
+
embeds_many :instruments
|
70
|
+
end
|
71
|
+
|
72
|
+
class Instrument
|
73
|
+
include Mongoid::Document
|
74
|
+
|
75
|
+
field :name, :type => String
|
76
|
+
embedded_in :artist
|
77
|
+
end
|
78
|
+
rescue LoadError # Mongoid doesn't support Rails 3.0 or 4.0 or Ruby 1.8
|
79
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
require 'rails/commands/console'
|
5
|
+
|
6
|
+
describe PryRails::Railtie do
|
7
|
+
it 'should start Pry instead of IRB and make the helpers available' do
|
8
|
+
mock(Pry).start
|
9
|
+
Rails::Console.start(Rails.application)
|
10
|
+
assert RR.verify
|
11
|
+
|
12
|
+
%w(app helper reload!).each do |helper|
|
13
|
+
TOPLEVEL_BINDING.eval("respond_to?(:#{helper}, true)").must_equal true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe "show-middleware" do
|
6
|
+
it "should print a list of middleware" do
|
7
|
+
output = mock_pry('show-middleware', 'exit-all')
|
8
|
+
|
9
|
+
output.must_match %r{\Ause ActionDispatch::Static}
|
10
|
+
output.must_match %r{^use ActionDispatch::ShowExceptions$}
|
11
|
+
output.must_match %r{^run TestApp.routes\Z}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
@@ -0,0 +1,77 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe "show-models" do
|
6
|
+
it "should print a list of models" do
|
7
|
+
output = mock_pry('show-models', 'exit-all')
|
8
|
+
|
9
|
+
ar_models = <<MODELS
|
10
|
+
Beer
|
11
|
+
id: integer
|
12
|
+
name: string
|
13
|
+
type: string
|
14
|
+
rating: integer
|
15
|
+
ibu: integer
|
16
|
+
abv: integer
|
17
|
+
belongs_to :hacker
|
18
|
+
Hacker
|
19
|
+
id: integer
|
20
|
+
social_ability: integer
|
21
|
+
has_many :beers
|
22
|
+
has_many :pokemons
|
23
|
+
Pokemon
|
24
|
+
id: integer
|
25
|
+
name: string
|
26
|
+
caught: binary
|
27
|
+
species: string
|
28
|
+
abilities: string
|
29
|
+
belongs_to :hacker
|
30
|
+
has_many :beers (through :hacker)
|
31
|
+
MODELS
|
32
|
+
|
33
|
+
mongoid_models = <<MODELS
|
34
|
+
Artist
|
35
|
+
_id: Moped::BSON::ObjectId
|
36
|
+
name: String
|
37
|
+
embeds_one :beer (validate)
|
38
|
+
embeds_many :instruments (validate)
|
39
|
+
Instrument
|
40
|
+
_id: Moped::BSON::ObjectId
|
41
|
+
name: String
|
42
|
+
embedded_in :artist
|
43
|
+
MODELS
|
44
|
+
|
45
|
+
if defined?(Mongoid)
|
46
|
+
output.gsub! /^ *_type: String\n/, '' # mongoid 3.0 and 3.1 differ on this
|
47
|
+
output.must_equal [ar_models, mongoid_models].join
|
48
|
+
else
|
49
|
+
output.must_equal ar_models
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
it "should highlight the given phrase with --grep" do
|
54
|
+
begin
|
55
|
+
Pry.color = true
|
56
|
+
|
57
|
+
output = mock_pry('show-models --grep rating', 'exit-all')
|
58
|
+
|
59
|
+
output.must_include "Beer"
|
60
|
+
output.must_include "\e[7mrating\e[27m"
|
61
|
+
output.wont_include "Pokemon"
|
62
|
+
|
63
|
+
if defined?(Mongoid)
|
64
|
+
output.wont_include "Artist"
|
65
|
+
end
|
66
|
+
ensure
|
67
|
+
Pry.color = false
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
if defined?(Mongoid)
|
72
|
+
it "should also filter for mongoid" do
|
73
|
+
output = mock_pry('show-models --grep beer', 'exit-all')
|
74
|
+
output.must_include 'Artist'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# We can just have a smoke test for this one since it's mostly using built-in
|
4
|
+
# Rails functionality. Plus the output is a bit different between Rails
|
5
|
+
# versions, so that's annoying.
|
6
|
+
|
7
|
+
require 'spec_helper'
|
8
|
+
|
9
|
+
describe "show-routes" do
|
10
|
+
it "should print a list of routes" do
|
11
|
+
output = mock_pry('show-routes', 'exit-all')
|
12
|
+
|
13
|
+
output.must_match %r{^edit_pokemon GET /pokemon/edit}
|
14
|
+
end
|
15
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'minitest/spec'
|
2
|
+
require 'minitest/autorun'
|
3
|
+
|
4
|
+
require 'rr'
|
5
|
+
|
6
|
+
class MiniTest::Spec
|
7
|
+
include RR::Adapters::RRMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
require 'config/environment'
|
11
|
+
|
12
|
+
# Pry testing stuff (taken from Pry itself)
|
13
|
+
|
14
|
+
Pry.color = false
|
15
|
+
|
16
|
+
def redirect_pry_io(new_in, new_out = StringIO.new)
|
17
|
+
old_in = Pry.input
|
18
|
+
old_out = Pry.output
|
19
|
+
|
20
|
+
Pry.input = new_in
|
21
|
+
Pry.output = new_out
|
22
|
+
|
23
|
+
begin
|
24
|
+
yield
|
25
|
+
ensure
|
26
|
+
Pry.input = old_in
|
27
|
+
Pry.output = old_out
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def mock_pry(*args)
|
32
|
+
binding = args.first.is_a?(Binding) ? args.shift : binding()
|
33
|
+
input = StringIO.new(args.join("\n"))
|
34
|
+
output = StringIO.new
|
35
|
+
|
36
|
+
redirect_pry_io(input, output) do
|
37
|
+
Pry.start(binding, :hooks => Pry::Hooks.new)
|
38
|
+
end
|
39
|
+
|
40
|
+
output.string
|
41
|
+
end
|
metadata
CHANGED
@@ -1,46 +1,69 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pry-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Robin Wenglewski
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2013-05-07 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: pry
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 0.9.10
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 0.9.10
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: appraisal
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rr
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
44
67
|
- !ruby/object:Gem::Version
|
45
68
|
version: '0'
|
46
69
|
description:
|
@@ -52,45 +75,61 @@ extra_rdoc_files: []
|
|
52
75
|
files:
|
53
76
|
- .gitignore
|
54
77
|
- Appraisals
|
78
|
+
- Appraisals-1.8
|
55
79
|
- Gemfile
|
56
80
|
- LICENCE
|
57
81
|
- Rakefile
|
58
82
|
- Readme.md
|
59
83
|
- lib/pry-rails.rb
|
60
84
|
- lib/pry-rails/commands.rb
|
85
|
+
- lib/pry-rails/commands/show_middleware.rb
|
86
|
+
- lib/pry-rails/commands/show_models.rb
|
87
|
+
- lib/pry-rails/commands/show_routes.rb
|
88
|
+
- lib/pry-rails/console.rb
|
61
89
|
- lib/pry-rails/railtie.rb
|
62
90
|
- lib/pry-rails/version.rb
|
63
91
|
- pry-rails.gemspec
|
64
|
-
-
|
65
|
-
-
|
66
|
-
-
|
67
|
-
-
|
92
|
+
- spec/config/config.ru
|
93
|
+
- spec/config/database.yml
|
94
|
+
- spec/config/environment.rb
|
95
|
+
- spec/config/routes.rb
|
96
|
+
- spec/railtie_spec.rb
|
97
|
+
- spec/show_middleware_spec.rb
|
98
|
+
- spec/show_models_spec.rb
|
99
|
+
- spec/show_routes_spec.rb
|
100
|
+
- spec/spec_helper.rb
|
68
101
|
homepage: https://github.com/rweng/pry-rails
|
69
|
-
licenses:
|
102
|
+
licenses:
|
103
|
+
- MIT
|
104
|
+
metadata: {}
|
70
105
|
post_install_message:
|
71
106
|
rdoc_options: []
|
72
107
|
require_paths:
|
73
108
|
- lib
|
74
109
|
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
-
none: false
|
76
110
|
requirements:
|
77
|
-
- -
|
111
|
+
- - '>='
|
78
112
|
- !ruby/object:Gem::Version
|
79
113
|
version: '0'
|
80
114
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
115
|
requirements:
|
83
|
-
- -
|
116
|
+
- - '>='
|
84
117
|
- !ruby/object:Gem::Version
|
85
118
|
version: '0'
|
86
119
|
requirements: []
|
87
120
|
rubyforge_project:
|
88
|
-
rubygems_version:
|
121
|
+
rubygems_version: 2.0.3
|
89
122
|
signing_key:
|
90
|
-
specification_version:
|
123
|
+
specification_version: 4
|
91
124
|
summary: Use Pry as your rails console
|
92
125
|
test_files:
|
93
|
-
-
|
94
|
-
-
|
95
|
-
-
|
96
|
-
-
|
126
|
+
- spec/config/config.ru
|
127
|
+
- spec/config/database.yml
|
128
|
+
- spec/config/environment.rb
|
129
|
+
- spec/config/routes.rb
|
130
|
+
- spec/railtie_spec.rb
|
131
|
+
- spec/show_middleware_spec.rb
|
132
|
+
- spec/show_models_spec.rb
|
133
|
+
- spec/show_routes_spec.rb
|
134
|
+
- spec/spec_helper.rb
|
135
|
+
has_rdoc:
|
data/test/models/beer.rb
DELETED
data/test/models/hacker.rb
DELETED
data/test/models/pokemon.rb
DELETED