File: show_middleware.rb

package info (click to toggle)
ruby-pry-rails 0.3.9-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 320 kB
  • sloc: ruby: 844; makefile: 4
file content (67 lines) | stat: -rw-r--r-- 2,027 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
class PryRails::ShowMiddleware < Pry::ClassCommand
  match 'show-middleware'
  group 'Rails'
  description 'Show all middleware (that Rails knows about).'
  banner <<-BANNER
    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.
  BANNER

  def options(opt)
    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

  PryRails::Commands.add_command(self)
end