Skip to content

Commit 80a5901

Browse files
committed
Adding very basic logging, sql, templates panels
1 parent 84f1a1f commit 80a5901

16 files changed

+333
-19
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
coverage
2+
pkg

History.txt

Whitespace-only changes.

MIT-LICENSE.txt

Whitespace-only changes.

README README.rdoc

File renamed without changes.

Rakefile

+26
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
require "rubygems"
2+
require "rake/gempackagetask"
3+
require "rake/clean"
24
require "spec/rake/spectask"
35
require File.expand_path("./lib/rack/bug")
46

@@ -18,3 +20,27 @@ Spec::Rake::SpecTask.new(:rcov) do |t|
1820
end
1921
end
2022

23+
spec = Gem::Specification.new do |s|
24+
s.name = "rack-bug"
25+
s.version = Rack::Bug::VERSION
26+
s.author = "Bryan Helmkamp"
27+
s.email = "bryan" + "@" + "brynary.com"
28+
s.homepage = "http://github.com/brynary/rack-bug"
29+
s.summary = "Debugging toolbar for Rack applications implemented as middleware"
30+
s.description = s.summary
31+
s.files = %w[History.txt Rakefile README.rdoc] + Dir["lib/**/*"]
32+
33+
# rdoc
34+
s.has_rdoc = true
35+
s.extra_rdoc_files = %w(README.rdoc MIT-LICENSE.txt)
36+
end
37+
38+
Rake::GemPackageTask.new(spec) do |package|
39+
package.gem_spec = spec
40+
end
41+
42+
desc 'Install the package as a gem.'
43+
task :install => [:clean, :package] do
44+
gem = Dir['pkg/*.gem'].first
45+
sh "sudo gem install --no-rdoc --no-ri --local #{gem}"
46+
end

lib/rack/bug.rb

+5
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,15 @@
77
require "rack/bug/toolbar"
88
require "rack/bug/panels/timer_panel"
99
require "rack/bug/panels/env_panel"
10+
require "rack/bug/panels/sql_panel"
11+
require "rack/bug/panels/log_panel"
12+
require "rack/bug/panels/templates_panel"
1013

1114
module Rack
1215
module Bug
1316

17+
VERSION = "0.1.0"
18+
1419
class Middleware
1520

1621
def initialize(app)

lib/rack/bug/panel.rb

+4
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@ def call(env)
1919
return [status, headers, body]
2020
end
2121

22+
def has_content?
23+
true
24+
end
25+
2226
def before(env)
2327
end
2428

lib/rack/bug/panels/log_panel.rb

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
if defined?(Rails) && Rails.logger
2+
module LoggingExtensions
3+
def add(*args, &block)
4+
logged_message = super
5+
Rack::Bug::LogPanel.record(logged_message)
6+
return logged_message
7+
end
8+
end
9+
10+
Rails.logger.extend LoggingExtensions
11+
end
12+
13+
module Rack
14+
module Bug
15+
16+
class LogPanel < Panel
17+
18+
def self.record(message)
19+
return unless message
20+
Thread.current["rack.bug.logs"] ||= []
21+
Thread.current["rack.bug.logs"] << message
22+
end
23+
24+
def self.reset
25+
Thread.current["rack.bug.logs"] = []
26+
end
27+
28+
def self.logs
29+
Thread.current["rack.bug.logs"] || []
30+
end
31+
32+
def name
33+
"log"
34+
end
35+
36+
def heading
37+
"Log"
38+
end
39+
40+
def content
41+
@logs = self.class.logs
42+
@template = ERB.new ::File.read(::File.dirname(__FILE__) + "/../views/panels/log.html.erb")
43+
result = @template.result(binding)
44+
self.class.reset
45+
return result
46+
end
47+
48+
end
49+
50+
end
51+
end

lib/rack/bug/panels/sql_panel.rb

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
if defined?(ActiveRecord)
2+
ActiveRecord::ConnectionAdapters::AbstractAdapter.class_eval do
3+
def log_with_rack_bug(sql, name, &block)
4+
start_time = Time.now
5+
result = log_without_rack_bug(sql, name, &block)
6+
Rack::Bug::SQLPanel.record_query(sql, Time.now - start_time)
7+
return result
8+
end
9+
10+
alias_method_chain :log, :rack_bug
11+
end
12+
end
13+
14+
module Rack
15+
module Bug
16+
17+
class SQLPanel < Panel
18+
19+
class Query
20+
attr_reader :sql
21+
22+
def initialize(sql, time)
23+
@sql = sql
24+
@time = time
25+
end
26+
27+
def time
28+
"%.1fms" % (@time * 1_000)
29+
end
30+
end
31+
32+
def self.record_query(sql, time)
33+
Thread.current["queries"] ||= []
34+
Thread.current["queries"] << Query.new(sql, time)
35+
end
36+
37+
def self.reset_queries
38+
Thread.current["queries"] = []
39+
end
40+
41+
def self.queries
42+
Thread.current["queries"] || []
43+
end
44+
45+
def name
46+
"sql"
47+
end
48+
49+
def heading
50+
"SQL"
51+
end
52+
53+
def content
54+
@queries = self.class.queries
55+
@template = ERB.new ::File.read(::File.dirname(__FILE__) + "/../views/panels/sql.html.erb")
56+
result = @template.result(binding)
57+
self.class.reset_queries
58+
return result
59+
end
60+
61+
end
62+
63+
end
64+
end
+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
if defined?(ActionView) && defined?(ActionView::Template)
2+
ActionView::Template.class_eval do
3+
4+
def render_template_with_rack_test(*args, &block)
5+
result = render_template_without_rack_test(*args, &block)
6+
Rack::Bug::TemplatesPanel.record(path_without_format_and_extension)
7+
return result
8+
end
9+
10+
alias_method_chain :render_template, :rack_test
11+
end
12+
end
13+
14+
module Rack
15+
module Bug
16+
17+
class TemplatesPanel < Panel
18+
19+
def self.record(template)
20+
Thread.current["rack.bug.templates"] ||= []
21+
Thread.current["rack.bug.templates"] << template
22+
end
23+
24+
def self.reset
25+
Thread.current["rack.bug.templates"] = []
26+
end
27+
28+
def self.templates
29+
Thread.current["rack.bug.templates"] || []
30+
end
31+
32+
def name
33+
"templates"
34+
end
35+
36+
def heading
37+
"Templates"
38+
end
39+
40+
def content
41+
@templates = self.class.templates
42+
@template = ERB.new ::File.read(::File.dirname(__FILE__) + "/../views/panels/templates.html.erb")
43+
result = @template.result(binding)
44+
self.class.reset
45+
return result
46+
end
47+
48+
end
49+
50+
end
51+
end
+69-13
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,71 @@
1-
jQuery(function() {
2-
jQuery("#rack_bug ul.panels li a").click(function () {
3-
current = $('#rack_bug #' + this.className);
4-
5-
if (current.is(':visible')) {
6-
$('.panelContent').hide();
7-
current.hide();
8-
} else {
9-
$('.panelContent').hide();
10-
current.show();
1+
// jQuery(function() {
2+
// jQuery("#rack_bug ul.panels li a").click(function () {
3+
// current = $('#rack_bug #' + this.className);
4+
//
5+
// if (current.is(':visible')) {
6+
// $('.panelContent').hide();
7+
// current.hide();
8+
// } else {
9+
// $('.panelContent').hide();
10+
// current.show();
11+
// }
12+
//
13+
// return false;
14+
// });
15+
// });
16+
17+
var _$ = window.$;
18+
jQuery.noConflict();
19+
jQuery(function($) {
20+
$.rackBug = function(data, klass) {
21+
$.rackBug.init();
22+
}
23+
$.extend($.rackBug, {
24+
init: function() {
25+
var current = null;
26+
$('#rack_bug ul.panels li a').click(function() {
27+
current = $('#rack_bug #' + this.className);
28+
29+
if (current.is(':visible')) {
30+
$(document).trigger('close.rackBug');
31+
} else {
32+
$('#rack_bug .panel_content').hide();
33+
current.show();
34+
$.rackBug.open();
35+
}
36+
return false;
37+
});
38+
$('#rack_bug a.close').click(function() {
39+
$(document).trigger('close.rackBug');
40+
return false;
41+
});
42+
},
43+
open: function() {
44+
$(document).bind('keydown.rackBug', function(e) {
45+
if (e.keyCode == 27) {
46+
$.rackBug.close();
47+
}
48+
});
49+
},
50+
toggle_content: function(elem) {
51+
if (elem.is(':visible')) {
52+
elem.hide();
53+
} else {
54+
elem.show();
55+
}
56+
},
57+
close: function() {
58+
$(document).trigger('close.rackBug');
59+
return false;
1160
}
12-
13-
return false;
1461
});
15-
});
62+
$(document).bind('close.rackBug', function() {
63+
$(document).unbind('keydown.rackBug');
64+
$('.panel_content').hide();
65+
});
66+
});
67+
68+
jQuery(function() {
69+
jQuery.rackBug();
70+
});
71+
$ = _$;

lib/rack/bug/toolbar.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ def builder
2828
end
2929

3030
def panel_classes
31-
[TimerPanel, EnvPanel]
31+
[TimerPanel, EnvPanel, SQLPanel, LogPanel, TemplatesPanel]
3232
end
3333

3434
def inject_into(response)

lib/rack/bug/views/bug.html.erb

+12-5
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,24 @@
1616

1717
<% @panels.each do |panel| %>
1818
<li>
19-
<a href="#" class="<%= panel.name %>">
19+
<% if panel.has_content? %>
20+
<a href="#" class="<%= panel.name %>">
21+
<%= panel.heading %>
22+
</a>
23+
<% else %>
2024
<%= panel.heading %>
21-
</a>
25+
<% end %>
2226
</li>
2327
<% end %>
2428
</ul>
2529
</div>
2630

2731
<% @panels.each do |panel| %>
28-
<div class="panel_content" id="<%= panel.name %>">
29-
<%= panel.content %>
30-
</div>
32+
<% if panel.has_content? %>
33+
<div class="panel_content" id="<%= panel.name %>">
34+
<a href="" class="close">Close</a>
35+
<%= panel.content %>
36+
</div>
37+
<% end %>
3138
<% end %>
3239
</div>
+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<h3>Log Messages</h3>
2+
<table>
3+
<thead>
4+
<tr>
5+
<th>Level</th>
6+
<th>Time</th>
7+
<th>Message</th>
8+
<th>Location</th>
9+
</tr>
10+
</thead>
11+
<tbody>
12+
<% i = 1 %>
13+
<% @logs.each do |log| %>
14+
<tr class="<%= i % 2 == 0 ? "even" : "odd" %>">
15+
<td></td>
16+
<td></td>
17+
<td><%= log.gsub(/\e\[[;\d]+m/, "") %></td>
18+
<td></td>
19+
</tr>
20+
<% i += 1 %>
21+
<% end %>
22+
</tbody>
23+
</table>

0 commit comments

Comments
 (0)