lib/pry-rails/commands.rb in pry-rails-0.2.2 vs lib/pry-rails/commands.rb in pry-rails-0.3.0
- old
+ new
@@ -1,205 +1,11 @@
-module PryRails
- Commands = Pry::CommandSet.new do
- create_command "show-routes", "Print out all defined routes in match order, with names." do
- group "Rails"
+# encoding: UTF-8
- def options(opt)
- opt.banner unindent <<-USAGE
- Usage: show-routes [-G]
+PryRails::Commands = Pry::CommandSet.new
- show-routes displays the current Rails app's routes.
- USAGE
+command_glob = File.expand_path('../commands/*.rb', __FILE__)
- opt.on :G, "grep", "Filter output by regular expression", :argument => true
- end
-
- def process
- Rails.application.reload_routes!
- all_routes = Rails.application.routes.routes
-
- all_routes = begin
- begin
- # rails 4
- require 'action_dispatch/routing/inspector'
- inspector = ActionDispatch::Routing::RoutesInspector.new
- rescue LoadError => e
- # rails 3.2
- require 'rails/application/route_inspector'
- inspector = Rails::Application::RouteInspector.new
- end
- inspector.format(all_routes)
- rescue LoadError => e
- # rails 3.0 and 3.1. cribbed from
- # https://github.com/rails/rails/blob/3-1-stable/railties/lib/rails/tasks/routes.rake
- routes = all_routes.collect do |route|
-
- reqs = route.requirements.dup
- reqs[:to] = route.app unless route.app.class.name.to_s =~ /^ActionDispatch::Routing/
- reqs = reqs.empty? ? "" : reqs.inspect
-
- {:name => route.name.to_s, :verb => route.verb.to_s, :path => route.path, :reqs => reqs}
- end
-
- # Skip the route if it's internal info route
- routes.reject! { |r| r[:path] =~ %r{/rails/info/properties|^/assets} }
-
- name_width = routes.map{ |r| r[:name].length }.max
- verb_width = routes.map{ |r| r[:verb].length }.max
- path_width = routes.map{ |r| r[:path].length }.max
-
- routes.map do |r|
- "#{r[:name].rjust(name_width)} #{r[:verb].ljust(verb_width)} #{r[:path].ljust(path_width)} #{r[:reqs]}"
- end
- end
-
- output.puts all_routes.grep(Regexp.new(opts[:G] || ".")).join "\n"
- end
- end
-
- create_command "show-models", "Print out all defined models, with attribrutes." do
- group "Rails"
-
- def options(opt)
- opt.banner unindent <<-USAGE
- Usage: show-models
-
- show-models displays the current Rails app's models.
- USAGE
-
- opt.on :G, "grep", "Color output red by regular expression", :argument => true
- end
-
- def process
- Rails.application.eager_load!
-
- if defined?(ActiveRecord::Base)
- models = ActiveRecord::Base.descendants.map do |mod|
- model_string = mod.to_s + "\n"
- if mod.table_exists?
- model_string << mod.columns.map { |col| " #{col.name}: #{col.type.to_s}" }.join("\n")
- else
- model_string << " Table doesn't exist"
- end
- mod.reflections.each do |model,ref|
- model_string << "\n #{ref.macro.to_s} #{model}"
- model_string << " through #{ref.options[:through]}" unless ref.options[:through].nil?
- end
- model_string
- end.join("\n")
- elsif defined?(Mongoid::Document)
- models = get_files.map do |path|
- mod = extract_class_name(path)
- model_string = "\033[1;34m#{mod.to_s}\033[0m\n"
- begin
- if mod.constantize.included_modules.include?(Mongoid::Document)
- model_string << mod.constantize.fields.values.sort_by(&:name).map { |col|
- " #{col.name}: \033[1;33m#{col.options[:type].to_s.downcase}\033[0m"
- }.join("\n")
- mod.constantize.relations.each do |model,ref|
- model_string << "\n #{kind_of_relation(ref.relation.to_s)} \033[1;34m#{model}\033[0m"
- model_string << ", autosave" if ref.options[:autosave]
- model_string << ", autobuild" if ref.options[:autobuild]
- model_string << ", validate" if ref.options[:validate]
- model_string << ", dependent-#{ref.options[:dependent]}" if ref.options[:dependent]
- end
- else
- model_string << " Collection doesn't exist"
- end
- model_string
-
- rescue Exception
- STDERR.puts "Warning: exception #{$!} raised while trying to load model class #{path}"
- end
- end.join("\n")
- end
-
- models.gsub!(Regexp.new(opts[:G] || ".", Regexp::IGNORECASE)) { |s| text.red(s) } unless opts[:G].nil?
- output.puts models
- end
-
- def get_files(prefix ='')
- Dir.glob(prefix << "app/models/**/*.rb")
- end
-
- def extract_class_name(filename)
- filename.split('/')[2..-1].collect { |i| i.camelize }.join('::').chomp(".rb")
- end
-
- def kind_of_relation(string)
- case string.gsub('Mongoid::Relations::', '')
- when 'Referenced::Many' then 'has_many'
- when 'Referenced::One' then 'has_one'
- when 'Referenced::In' then 'belongs_to'
- when 'Embedded::Many' then 'embeds_many'
- when 'Embedded::One' then 'embeds_one'
- when 'Embedded::In' then 'embedded_in'
- end
- end
- end
-
- create_command "show-middleware" do
- group "Rails"
-
- def options(opt)
- opt.banner unindent <<-USAGE
- Usage: show-middleware [-G]
-
- show-middleware shows the Rails app's middleware.
-
- If this pry REPL is attached to a Rails server, the entire middleware
- stack is displayed. Otherwise, only the middleware Rails knows about is
- printed.
- USAGE
-
- opt.on :G, "grep", "Filter output by regular expression", :argument => true
- end
-
- def process
- # assumes there is only one Rack::Server instance
- server = nil
- ObjectSpace.each_object(Rack::Server) do |object|
- server = object
- end
-
- middlewares = []
-
- if server
- stack = server.instance_variable_get("@wrapped_app")
- middlewares << stack.class.to_s
-
- while stack.instance_variable_defined?("@app") do
- stack = stack.instance_variable_get("@app")
- # Rails 3.0 uses the Application class rather than the application
- # instance itself, so we grab the instance.
- stack = Rails.application if stack == Rails.application.class
- middlewares << stack.class.to_s if stack != Rails.application
- end
- else
- middleware_names = Rails.application.middleware.map do |middleware|
- # After Rails 3.0, the middleware are wrapped in a special class
- # that responds to #name.
- if middleware.respond_to?(:name)
- middleware.name
- else
- middleware.inspect
- end
- end
- middlewares.concat middleware_names
- end
- middlewares << Rails.application.class.to_s
- print_middleware middlewares.grep(Regexp.new(opts[:G] || "."))
- end
-
- def print_middleware(middlewares)
- middlewares.each do |middleware|
- string = if middleware == Rails.application.class.to_s
- "run #{middleware}.routes"
- else
- "use #{middleware}"
- end
- output.puts string
- end
- end
- end
- end
+Dir[command_glob].each do |command|
+ require command
end
+
+Pry.commands.import PryRails::Commands