Class: Harbor::Contrib::Debug

Inherits:
Object
  • Object
show all
Defined in:
lib/harbor/contrib/debug.rb

Overview

USAGE: Add the following code to your config.ru, just before ‘run’

if ENV['ENVIRONMENT'] == 'development'
  require "harbor/contrib/debug"
  DataObjects::Postgres.logger = Logging::Logger.root
  use Harbor::Contrib::Debug
end

Defined Under Namespace

Classes: LogAppender

Constant Summary collapse

@@template =
"{{jquery}}\n<style type=\"text/css\" media=\"screen\">\n\n  body:last-child { margin-bottom: 60px; }\n\n  #logger {\n    position: fixed; bottom: 0; font-family: \"Lucida Grande\"; z-index: 99000;\n    width: 100%;\n  }\n\n  #logger ul {\n    margin: 0; padding: 0; list-style: none; overflow: auto;\n    width: 293px;\n    margin: 0 auto;\n    -webkit-border-top-right-radius: 5px;\n    -webkit-border-top-left-radius: 5px;\n    -moz-border-radius-topright: 5px;\n    -moz-border-radius-topleft: 5px;\n    -webkit-box-shadow: 0 0 10px #222;\n    -moz-box-shadow: 0 0 10px #222;\n  }\n\n  #logger > div {\n    -webkit-border-top-right-radius: 5px;\n    -webkit-border-top-left-radius: 5px;\n    -moz-border-radius-topright: 5px;\n    -moz-border-radius-topleft: 5px;\n    background-color: #222;\n    padding: 10px;\n    height: 200px;\n    margin: 0 20px;\n  }\n\n  #logger > div div {\n    overflow: auto;\n    height: 200px;\n  }\n\n  #logger p { margin: 0; color: #eee; padding: 10px; line-height: 14px; font-size: 12px; font-family: monaco; border-bottom: 1px solid #555; }\n\n  #logger ul li:first-of-type a {\n    -webkit-border-top-left-radius: 5px;\n    -moz-border-radius-topleft: 5px;\n  }\n  #logger ul li:last-of-type a {\n    -webkit-border-top-right-radius: 5px;\n    -moz-border-radius-topright: 5px;\n  }\n\n  #logger ul li { float: left; border-right: 1px solid #111; }\n  #logger ul li:last-of-type { border: 0; }\n  #logger ul li a {\n    padding: 6px 10px; display: block; text-decoration: none; width: 77px; text-align: center; font-weight: bold;\n    text-shadow: 1px 1px 1px #222; font-size: 14px; font-family: \"Lucida Grande\";\n    line-height: 14px; border: 0;\n  }\n  #logger ul li a:hover, #logger ul li a.selected { text-shadow: 1px 1px 1px #444; }\n  #logger ul li a span { display: block; font-size: 9px; line-height: 14px; text-transform: uppercase; text-align: center; }\n  #logger .load_time a {\n    color: #fff;\n    background-color: #c62;\n    background-image: -webkit-gradient(\n      linear,\n      left top,\n      left bottom,\n      color-stop(0.0, #e72),\n      color-stop(0.5, #a62),\n      color-stop(0.51, #a51)\n    );\n  }\n  #logger .queries a {\n    color: #fff;\n    background-color: #248;\n    background-image: -webkit-gradient(\n      linear,\n      left top,\n      left bottom,\n      color-stop(0.0, #47b),\n      color-stop(0.5, #349),\n      color-stop(0.51, #248)\n    );\n  }\n  #logger .messages a {\n    color: #fff;\n    background-color: #482;\n    background-image: -webkit-gradient(\n      linear,\n      left top,\n      left bottom,\n      color-stop(0.0, #7b4),\n      color-stop(0.5, #493),\n      color-stop(0.51, #482)\n    );\n  }\n  {}\n</style>\n\n<div id=\"logger\">\n  <ul>\n    <li class=\"load_time\"><a href=\"#\">{{load_time}}<span>seconds</span></a></li>\n    <li class=\"queries\"><a href=\"#\">{{query_count}}<span>queries</span></a></li>\n    <li class=\"messages\"><a href=\"#\">{{message_count}}<span>messages</span></a></li>\n  </ul>\n\n  <div style=\"display: none\">\n    {{queries}}\n    {{messages}}\n</div>\n\n</div>\n<script type=\"text/javascript\" charset=\"utf-8\">\n  var _body = document.body;\n  var _html = $(\"html\").get(0);\n  $(window).keyup(function(event) {\n    if ( event.which == 76 && (event.target == _body || event.target == _html) ) {\n      $(\"#logger\").slideToggle();\n    }\n  });\n  $(\"#logger li a\").click(function() {\n    var info = $(\"#logger div.\" + $(this).parent().attr(\"class\"));\n    if ( info.get(0) ) {\n      if ( (siblings = info.siblings(\"div:visible\")).get(0) ) {\n        siblings.hide();          \n        info.toggle();\n      }\n      else {\n        if ( info.css(\"display\") == \"block\" ) {\n          $(\"#logger > div\").slideToggle(function() {\n            info.hide();\n          });\n        }\n        else {\n          info.show();\n          $(\"#logger > div\").slideToggle();\n        }\n      }\n    }\n    else {\n      $(\"#logger > div:visible\").slideToggle(function() {\n        $(\"#logger > div div\").hide();\n      });\n    }\n    return false;\n  });\n</script>\n"

Instance Method Summary collapse

Constructor Details

#initialize(app) ⇒ Debug

Returns a new instance of Debug.



13
14
15
16
# File 'lib/harbor/contrib/debug.rb', line 13

def initialize(app)
  @app = app
  @levels = %w(DEBUG INFO WARN ERROR FATAL)
end

Instance Method Details

#call(env) ⇒ Object



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
# File 'lib/harbor/contrib/debug.rb', line 18

def call(env)
  start_time = Time.now
  status, headers, body = @app.call(env)
  load_time = Time.now - start_time

  appenders = Logging::Logger.root.instance_variable_get(:@appenders)
  logger = appenders.find { |appender| appender.name == "harbor_debug_messages" }
  messages = logger.messages.dup
  logger.messages.clear

  return [status, headers, body] unless (headers["Content-Type"] =~ /html/) && body.is_a?(String)

  debugger = @@template.dup

  if body["jquery"]
    debugger.gsub!("{{jquery}}", "")
  else
    debugger.gsub!("{{jquery}}", '<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>')
  end

  debugger.gsub!("{{load_time}}", "%2.2f" % load_time)

  queries = messages.map do |level, message|
    ("<p>[#{@levels[level]}] " + message.gsub("<", "&lt;") + "</p>") if message =~ /^\(/
  end.compact

  messages = messages.map do |level, message|
    ("<p>[#{@levels[level]}] " + message.gsub("<", "&lt;") + "</p>") if message !~ /^\(/
  end.compact

  debugger.gsub!("{{query_count}}", "%s" % queries.size)
  debugger.gsub!("{{message_count}}", "%s" % messages.size)

  if messages.any?
    debugger.gsub!("{{messages}}", '<div class="messages" style="display: none">' + messages.join("\n") + '</div>')
  else
    debugger.gsub!("{{messages}}", "")
  end

  if queries.any?
    debugger.gsub!("{{queries}}", '<div class="queries" style="display: none">' + queries.join("\n") + '</div>')
  else
    debugger.gsub!("{{queries}}", "")
  end

  body.gsub!("</body>", debugger + "</body>")
  headers["Content-Length"] = body.length.to_s

  [status, headers, body]
end