rack-bug 0.2.1 → 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.
Files changed (59) hide show
  1. data/History.txt +21 -0
  2. data/README.md +115 -0
  3. data/Rakefile +6 -19
  4. data/Thorfile +109 -0
  5. data/lib/rack/bug.rb +4 -2
  6. data/lib/rack/bug/filtered_backtrace.rb +38 -0
  7. data/lib/rack/bug/options.rb +4 -4
  8. data/lib/rack/bug/panel.rb +12 -12
  9. data/lib/rack/bug/panel_app.rb +8 -8
  10. data/lib/rack/bug/panels/active_record_panel.rb +11 -11
  11. data/lib/rack/bug/panels/active_record_panel/activerecord_extensions.rb +3 -3
  12. data/lib/rack/bug/panels/cache_panel.rb +1 -1
  13. data/lib/rack/bug/panels/cache_panel/memcache_extension.rb +4 -4
  14. data/lib/rack/bug/panels/cache_panel/panel_app.rb +11 -11
  15. data/lib/rack/bug/panels/cache_panel/stats.rb +20 -20
  16. data/lib/rack/bug/panels/log_panel.rb +27 -10
  17. data/lib/rack/bug/panels/log_panel/rails_extension.rb +2 -2
  18. data/lib/rack/bug/panels/memory_panel.rb +8 -8
  19. data/lib/rack/bug/panels/rails_info_panel.rb +5 -5
  20. data/lib/rack/bug/panels/redis_panel.rb +3 -3
  21. data/lib/rack/bug/panels/redis_panel/redis_extension.rb +3 -3
  22. data/lib/rack/bug/panels/redis_panel/stats.rb +17 -13
  23. data/lib/rack/bug/panels/request_variables_panel.rb +7 -7
  24. data/lib/rack/bug/panels/sphinx_panel.rb +44 -0
  25. data/lib/rack/bug/panels/sphinx_panel/sphinx_extension.rb +13 -0
  26. data/lib/rack/bug/panels/sphinx_panel/stats.rb +96 -0
  27. data/lib/rack/bug/panels/sql_panel.rb +1 -1
  28. data/lib/rack/bug/panels/sql_panel/panel_app.rb +7 -7
  29. data/lib/rack/bug/panels/sql_panel/query.rb +13 -23
  30. data/lib/rack/bug/panels/sql_panel/sql_extension.rb +2 -2
  31. data/lib/rack/bug/panels/templates_panel.rb +1 -1
  32. data/lib/rack/bug/panels/templates_panel/actionview_extension.rb +1 -1
  33. data/lib/rack/bug/panels/templates_panel/rendering.rb +14 -14
  34. data/lib/rack/bug/panels/templates_panel/trace.rb +8 -8
  35. data/lib/rack/bug/panels/timer_panel.rb +10 -10
  36. data/lib/rack/bug/params_signature.rb +18 -18
  37. data/lib/rack/bug/public/__rack_bug__/bookmarklet.js +7 -5
  38. data/lib/rack/bug/render.rb +16 -16
  39. data/lib/rack/bug/toolbar.rb +39 -33
  40. data/lib/rack/bug/views/panels/log.html.erb +4 -6
  41. data/lib/rack/bug/views/panels/redis.html.erb +14 -0
  42. data/lib/rack/bug/views/panels/sphinx.html.erb +32 -0
  43. data/rack-bug.gemspec +102 -97
  44. data/spec/fixtures/config.ru +3 -1
  45. data/spec/fixtures/sample_app.rb +7 -6
  46. data/spec/rack/bug/panels/active_record_panel_spec.rb +6 -6
  47. data/spec/rack/bug/panels/cache_panel_spec.rb +46 -46
  48. data/spec/rack/bug/panels/log_panel_spec.rb +8 -7
  49. data/spec/rack/bug/panels/memory_panel_spec.rb +6 -6
  50. data/spec/rack/bug/panels/rails_info_panel_spec.rb +5 -5
  51. data/spec/rack/bug/panels/redis_panel_spec.rb +31 -19
  52. data/spec/rack/bug/panels/sql_panel_spec.rb +45 -45
  53. data/spec/rack/bug/panels/templates_panel_spec.rb +18 -18
  54. data/spec/rack/bug/panels/timer_panel_spec.rb +12 -12
  55. data/spec/rack/toolbar_spec.rb +34 -28
  56. data/spec/spec_helper.rb +19 -9
  57. metadata +44 -13
  58. data/README.rdoc +0 -29
  59. data/VERSION +0 -1
@@ -4,22 +4,23 @@ module Rack::Bug
4
4
  describe LogPanel do
5
5
  before do
6
6
  LogPanel.reset
7
- header "rack-bug.panel_classes", [LogPanel]
7
+ rack_env "rack-bug.panel_classes", [LogPanel]
8
8
  end
9
-
9
+
10
10
  describe "heading" do
11
11
  it "displays 'Log'" do
12
- response = get "/"
12
+ response = get_via_rack "/"
13
13
  response.should have_heading("Log")
14
14
  end
15
15
  end
16
-
16
+
17
17
  describe "content" do
18
18
  it "displays recorded log lines" do
19
- LogPanel.record("This is a logged message")
20
- response = get "/"
19
+ LogPanel.record("This is a logged message", 0)
20
+ response = get_via_rack "/"
21
21
  response.should contain("This is a logged message")
22
+ response.should contain("DEBUG")
22
23
  end
23
24
  end
24
25
  end
25
- end
26
+ end
@@ -3,19 +3,19 @@ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
3
3
  module Rack::Bug
4
4
  describe MemoryPanel do
5
5
  before do
6
- header "rack-bug.panel_classes", [MemoryPanel]
6
+ rack_env "rack-bug.panel_classes", [MemoryPanel]
7
7
  end
8
-
8
+
9
9
  describe "heading" do
10
10
  it "displays the total memory" do
11
- response = get "/"
11
+ response = get_via_rack "/"
12
12
  response.should have_heading(/\d+ KB total/)
13
13
  end
14
-
14
+
15
15
  it "displays the memory change during the request" do
16
- response = get "/"
16
+ response = get_via_rack "/"
17
17
  response.should have_heading(/\d+ KB Δ/)
18
18
  end
19
19
  end
20
20
  end
21
- end
21
+ end
@@ -3,13 +3,13 @@ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
3
3
  module Rack::Bug
4
4
  describe RailsInfoPanel do
5
5
  before do
6
- header "rack-bug.panel_classes", [RailsInfoPanel]
6
+ rack_env "rack-bug.panel_classes", [RailsInfoPanel]
7
7
  end
8
-
8
+
9
9
  describe "heading" do
10
10
  it "displays the Rails version" do
11
11
  Rails.stub!(:version => "v2.3.0")
12
- response = get "/"
12
+ response = get_via_rack "/"
13
13
  response.should have_heading("Rails v2.3.0")
14
14
  end
15
15
  end
@@ -17,9 +17,9 @@ module Rack::Bug
17
17
  describe "content" do
18
18
  it "displays the Rails::Info properties" do
19
19
  Rails::Info.stub!(:properties => [["Name", "Value"]])
20
- response = get "/"
20
+ response = get_via_rack "/"
21
21
  response.should have_row("#rails_info", "Name", "Value")
22
22
  end
23
23
  end
24
24
  end
25
- end
25
+ end
@@ -5,53 +5,65 @@ module Rack::Bug
5
5
  describe RedisPanel do
6
6
  before do
7
7
  RedisPanel.reset
8
- header "rack-bug.panel_classes", [RedisPanel]
8
+ rack_env "rack-bug.panel_classes", [RedisPanel]
9
9
  end
10
-
10
+
11
11
  describe "heading" do
12
12
  it "displays the total redis time" do
13
- response = get "/"
13
+ response = get_via_rack "/"
14
14
  response.should have_heading("Redis: 0.00ms")
15
15
  end
16
16
  end
17
-
17
+
18
18
  describe "content" do
19
19
  describe "usage table" do
20
20
  it "displays the total number of redis calls" do
21
- RedisPanel.record(["get, user:1"]) { }
22
- response = get "/"
23
-
21
+ RedisPanel.record(["get, user:1"], Kernel.caller) { }
22
+ response = get_via_rack "/"
23
+
24
24
  # This causes a bus error:
25
25
  # response.should have_selector("th:content('Total Calls') + td", :content => "1")
26
26
 
27
27
  response.should have_row("#redis_usage", "Total Calls", "1")
28
28
  end
29
-
29
+
30
30
  it "displays the total redis time" do
31
- response = get "/"
31
+ response = get_via_rack "/"
32
32
  response.should have_row("#redis_usage", "Total Time", "0.00ms")
33
33
  end
34
34
  end
35
-
35
+
36
36
  describe "breakdown" do
37
37
  it "displays each redis operation" do
38
- RedisPanel.record(["get, user:1"]) { }
39
- response = get "/"
38
+ RedisPanel.record(["get, user:1"], Kernel.caller) { }
39
+ response = get_via_rack "/"
40
40
  response.should have_row("#redis_breakdown", "get")
41
41
  end
42
-
42
+
43
43
  it "displays the time for redis call" do
44
- RedisPanel.record(["get, user:1"]) { }
45
- response = get "/"
44
+ RedisPanel.record(["get, user:1"], Kernel.caller) { }
45
+ response = get_via_rack "/"
46
46
  response.should have_row("#redis_breakdown", "user:1", TIME_MS_REGEXP)
47
47
  end
48
-
48
+
49
49
  it "displays the arguments for each redis call" do
50
- RedisPanel.record(["get, user:1"]) { }
51
- response = get "/"
50
+ RedisPanel.record(["get, user:1"], Kernel.caller) { }
51
+ response = get_via_rack "/"
52
52
  response.should have_row("#redis_breakdown", "user:1", "get")
53
53
  end
54
+
55
+ it "displays a link to show the backtrace when it's available" do
56
+ RedisPanel.record(["get, user:1"], Kernel.caller) { }
57
+ response = get_via_rack "/"
58
+ response.should have_row("#redis_breakdown", "user:1", "Show Backtrace")
59
+ end
60
+
61
+ it "does not display a link to show the backtrace when it's not available" do
62
+ RedisPanel.record(["get, user:1"], []) { }
63
+ response = get_via_rack "/"
64
+ response.should_not contain("Show Backtrace")
65
+ end
54
66
  end
55
67
  end
56
68
  end
57
- end
69
+ end
@@ -4,133 +4,133 @@ module Rack::Bug
4
4
  describe SQLPanel do
5
5
  before do
6
6
  SQLPanel.reset
7
- header "rack-bug.panel_classes", [SQLPanel]
7
+ rack_env "rack-bug.panel_classes", [SQLPanel]
8
8
  end
9
-
9
+
10
10
  describe "heading" do
11
11
  it "displays the total SQL query count" do
12
12
  SQLPanel.record("SELECT NOW();") { }
13
- response = get "/"
13
+ response = get_via_rack "/"
14
14
  response.should have_heading("1 Queries")
15
15
  end
16
-
16
+
17
17
  it "displays the total SQL time" do
18
18
  SQLPanel.record("SELECT NOW();") { }
19
- response = get "/"
19
+ response = get_via_rack "/"
20
20
  response.should have_heading(/Queries \(\d+\.\d{2}ms\)/)
21
21
  end
22
22
  end
23
-
23
+
24
24
  describe "content" do
25
25
  it "displays each executed SQL query" do
26
26
  SQLPanel.record("SELECT NOW();") { }
27
- response = get "/"
27
+ response = get_via_rack "/"
28
28
  response.should have_row("#sql", "SELECT NOW();")
29
29
  end
30
-
30
+
31
31
  it "displays the time of each executed SQL query" do
32
32
  SQLPanel.record("SELECT NOW();") { }
33
- response = get "/"
33
+ response = get_via_rack "/"
34
34
  response.should have_row("#sql", "SELECT NOW();", TIME_MS_REGEXP)
35
35
  end
36
36
  end
37
-
37
+
38
38
  def stub_result(results = [[]])
39
39
  columns = results.first
40
40
  fields = columns.map { |c| stub("field", :name => c) }
41
41
  rows = results[1..-1]
42
-
42
+
43
43
  result = stub("result", :fetch_fields => fields)
44
44
  result.stub!(:each).and_yield(*rows)
45
45
  return result
46
46
  end
47
-
47
+
48
48
  def expect_query(sql, results)
49
49
  conn = stub("connection")
50
50
  ActiveRecord::Base.stub!(:connection => conn)
51
51
  conn.should_receive(:execute).with(sql).and_return(stub_result(results))
52
52
  end
53
-
53
+
54
54
  describe "execute_sql" do
55
55
  it "displays the query results" do
56
- header "rack-bug.secret_key", "abc"
56
+ rack_env "rack-bug.secret_key", "abc"
57
57
  expect_query "SELECT username FROM users",
58
58
  [["username"],
59
59
  ["bryan"]]
60
-
61
- response = get "/__rack_bug__/execute_sql", :query => "SELECT username FROM users",
60
+
61
+ response = get_via_rack "/__rack_bug__/execute_sql", :query => "SELECT username FROM users",
62
62
  :hash => "6f286f55b75716e5c91f16d77d09fa73b353ebc1"
63
63
  response.should contain("SELECT username FROM users")
64
64
  response.should be_ok
65
65
  end
66
-
66
+
67
67
  it "is forbidden when the hash is missing or wrong" do
68
- header "rack-bug.secret_key", 'abc'
69
-
68
+ rack_env "rack-bug.secret_key", 'abc'
69
+
70
70
  lambda {
71
- get "/__rack_bug__/execute_sql", :query => "SELECT username FROM users",
71
+ get_via_rack "/__rack_bug__/execute_sql", :query => "SELECT username FROM users",
72
72
  :hash => "foobar"
73
73
  }.should raise_error(SecurityError)
74
74
  end
75
-
75
+
76
76
  it "is not available when the rack-bug.secret_key is nil" do
77
- header "rack-bug.secret_key", nil
78
-
77
+ rack_env "rack-bug.secret_key", nil
78
+
79
79
  lambda {
80
- get "/__rack_bug__/execute_sql", :query => "SELECT username FROM users",
80
+ get_via_rack "/__rack_bug__/execute_sql", :query => "SELECT username FROM users",
81
81
  :hash => "6f286f55b75716e5c91f16d77d09fa73b353ebc1"
82
82
  }.should raise_error(SecurityError)
83
83
  end
84
-
84
+
85
85
  it "is not available when the rack-bug.secret_key is an empty string" do
86
- header "rack-bug.secret_key", ""
87
-
86
+ rack_env "rack-bug.secret_key", ""
87
+
88
88
  lambda {
89
- get "/__rack_bug__/execute_sql", :query => "SELECT username FROM users",
89
+ get_via_rack "/__rack_bug__/execute_sql", :query => "SELECT username FROM users",
90
90
  :hash => "6f286f55b75716e5c91f16d77d09fa73b353ebc1"
91
91
  }.should raise_error(SecurityError)
92
92
  end
93
93
  end
94
-
94
+
95
95
  describe "explain_sql" do
96
96
  it "displays the query explain plan" do
97
- header "rack-bug.secret_key", "abc"
97
+ rack_env "rack-bug.secret_key", "abc"
98
98
  expect_query "EXPLAIN SELECT username FROM users",
99
99
  [["table"],
100
100
  ["users"]]
101
-
102
- response = get "/__rack_bug__/explain_sql", :query => "SELECT username FROM users",
101
+
102
+ response = get_via_rack "/__rack_bug__/explain_sql", :query => "SELECT username FROM users",
103
103
  :hash => "6f286f55b75716e5c91f16d77d09fa73b353ebc1"
104
104
  response.should contain("SELECT username FROM users")
105
105
  response.should be_ok
106
106
  end
107
-
107
+
108
108
  it "is forbidden when the hash is missing or wrong" do
109
- header "rack-bug.secret_key", 'abc'
110
-
109
+ rack_env "rack-bug.secret_key", 'abc'
110
+
111
111
  lambda {
112
- get "/__rack_bug__/explain_sql", :query => "SELECT username FROM users",
112
+ get_via_rack "/__rack_bug__/explain_sql", :query => "SELECT username FROM users",
113
113
  :hash => "foobar"
114
114
  }.should raise_error(SecurityError)
115
115
  end
116
-
116
+
117
117
  it "is not available when the rack-bug.secret_key is nil" do
118
- header "rack-bug.secret_key", nil
119
-
118
+ rack_env "rack-bug.secret_key", nil
119
+
120
120
  lambda {
121
- get "/__rack_bug__/explain_sql", :query => "SELECT username FROM users",
121
+ get_via_rack "/__rack_bug__/explain_sql", :query => "SELECT username FROM users",
122
122
  :hash => "6f286f55b75716e5c91f16d77d09fa73b353ebc1"
123
123
  }.should raise_error(SecurityError)
124
124
  end
125
-
125
+
126
126
  it "is not available when the rack-bug.secret_key is an empty string" do
127
- header "rack-bug.secret_key", ""
128
-
127
+ rack_env "rack-bug.secret_key", ""
128
+
129
129
  lambda {
130
- get "/__rack_bug__/explain_sql", :query => "SELECT username FROM users",
130
+ get_via_rack "/__rack_bug__/explain_sql", :query => "SELECT username FROM users",
131
131
  :hash => "6f286f55b75716e5c91f16d77d09fa73b353ebc1"
132
132
  }.should raise_error(SecurityError)
133
133
  end
134
134
  end
135
135
  end
136
- end
136
+ end
@@ -4,63 +4,63 @@ module Rack::Bug
4
4
  describe TemplatesPanel do
5
5
  before do
6
6
  TemplatesPanel.reset
7
- header "rack-bug.panel_classes", [TemplatesPanel]
7
+ rack_env "rack-bug.panel_classes", [TemplatesPanel]
8
8
  end
9
-
9
+
10
10
  describe "heading" do
11
11
  it "displays the total rendering time" do
12
- response = get "/"
12
+ response = get_via_rack "/"
13
13
  response.should have_heading("Templates: 0.00ms")
14
14
  end
15
15
  end
16
-
16
+
17
17
  describe "content" do
18
18
  it "displays the template paths" do
19
19
  TemplatesPanel.record("users/show") { }
20
- response = get "/"
20
+ response = get_via_rack "/"
21
21
  response.should contain("users/show")
22
22
  end
23
-
23
+
24
24
  it "displays the template children" do
25
25
  TemplatesPanel.record("users/show") do
26
26
  TemplatesPanel.record("users/toolbar") { }
27
27
  end
28
-
29
- response = get "/"
28
+
29
+ response = get_via_rack "/"
30
30
  response.should have_selector("li", :content => "users/show") do |li|
31
31
  li.should contain("users/toolbar")
32
32
  end
33
33
  end
34
-
34
+
35
35
  context "for templates that rendered templates" do
36
36
  it "displays the total time" do
37
37
  TemplatesPanel.record("users/show") do
38
38
  TemplatesPanel.record("users/toolbar") { }
39
39
  end
40
-
41
- response = get "/"
40
+
41
+ response = get_via_rack "/"
42
42
  response.should have_selector("li", :content => "users/show") do |li|
43
43
  li.should contain(TIME_MS_REGEXP)
44
44
  end
45
45
  end
46
-
46
+
47
47
  it "displays the exclusive time" do
48
48
  TemplatesPanel.record("users/show") do
49
49
  TemplatesPanel.record("users/toolbar") { }
50
50
  end
51
-
52
- response = get "/"
51
+
52
+ response = get_via_rack "/"
53
53
  response.should have_selector("li", :content => "users/show") do |li|
54
54
  li.should contain(/\d\.\d{2} exclusive/)
55
55
  end
56
56
  end
57
57
  end
58
-
58
+
59
59
  context "for leaf templates" do
60
60
  it "does not display the exclusive time" do
61
61
  TemplatesPanel.record("users/show") { }
62
-
63
- response = get "/"
62
+
63
+ response = get_via_rack "/"
64
64
  response.should contain("users/show") do |li|
65
65
  li.should_not contain("exclusive")
66
66
  end
@@ -68,4 +68,4 @@ module Rack::Bug
68
68
  end
69
69
  end
70
70
  end
71
- end
71
+ end
@@ -3,36 +3,36 @@ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
3
3
  module Rack::Bug
4
4
  describe TimerPanel do
5
5
  before do
6
- header "rack-bug.panel_classes", [TimerPanel]
6
+ rack_env "rack-bug.panel_classes", [TimerPanel]
7
7
  end
8
-
8
+
9
9
  describe "heading" do
10
10
  it "displays the elapsed time" do
11
- response = get "/"
11
+ response = get_via_rack "/"
12
12
  response.should have_heading(TIME_MS_REGEXP)
13
13
  end
14
14
  end
15
-
15
+
16
16
  describe "content" do
17
17
  it "displays the user CPU time" do
18
- response = get "/"
18
+ response = get_via_rack "/"
19
19
  response.should have_row("#timer", "User CPU time", TIME_MS_REGEXP)
20
20
  end
21
-
21
+
22
22
  it "displays the system CPU time" do
23
- response = get "/"
23
+ response = get_via_rack "/"
24
24
  response.should have_row("#timer", "System CPU time", TIME_MS_REGEXP)
25
25
  end
26
-
26
+
27
27
  it "displays the total CPU time" do
28
- response = get "/"
28
+ response = get_via_rack "/"
29
29
  response.should have_row("#timer", "Total CPU time", TIME_MS_REGEXP)
30
30
  end
31
-
31
+
32
32
  it "displays the elapsed time" do
33
- response = get "/"
33
+ response = get_via_rack "/"
34
34
  response.should have_row("#timer", "Elapsed time", TIME_MS_REGEXP)
35
35
  end
36
36
  end
37
37
  end
38
- end
38
+ end