rack-insight 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (126) hide show
  1. data/.gitignore +13 -0
  2. data/.rspec +1 -0
  3. data/.simplecov +4 -0
  4. data/.travis.yml +8 -0
  5. data/CHANGELOG +58 -0
  6. data/Gemfile +3 -0
  7. data/Gemfile.lock +82 -0
  8. data/LICENSE +24 -0
  9. data/README.md +189 -0
  10. data/Rakefile +27 -0
  11. data/TODO +7 -0
  12. data/lib/rack-insight.rb +1 -0
  13. data/lib/rack/insight.rb +19 -0
  14. data/lib/rack/insight/app.rb +198 -0
  15. data/lib/rack/insight/config.rb +30 -0
  16. data/lib/rack/insight/database.rb +193 -0
  17. data/lib/rack/insight/enable-button.rb +43 -0
  18. data/lib/rack/insight/filtered_backtrace.rb +45 -0
  19. data/lib/rack/insight/instrumentation.rb +9 -0
  20. data/lib/rack/insight/instrumentation/backstage.rb +10 -0
  21. data/lib/rack/insight/instrumentation/client.rb +20 -0
  22. data/lib/rack/insight/instrumentation/instrument.rb +109 -0
  23. data/lib/rack/insight/instrumentation/package-definition.rb +58 -0
  24. data/lib/rack/insight/instrumentation/probe-definition.rb +20 -0
  25. data/lib/rack/insight/instrumentation/probe.rb +196 -0
  26. data/lib/rack/insight/instrumentation/setup.rb +32 -0
  27. data/lib/rack/insight/logger.rb +53 -0
  28. data/lib/rack/insight/options.rb +116 -0
  29. data/lib/rack/insight/panel.rb +135 -0
  30. data/lib/rack/insight/panel_app.rb +31 -0
  31. data/lib/rack/insight/panels-content.rb +22 -0
  32. data/lib/rack/insight/panels-header.rb +18 -0
  33. data/lib/rack/insight/panels/active_record_panel.rb +46 -0
  34. data/lib/rack/insight/panels/active_resource_panel.rb +48 -0
  35. data/lib/rack/insight/panels/active_resource_panel/query.rb +27 -0
  36. data/lib/rack/insight/panels/cache_panel.rb +68 -0
  37. data/lib/rack/insight/panels/cache_panel/panel_app.rb +46 -0
  38. data/lib/rack/insight/panels/cache_panel/stats.rb +90 -0
  39. data/lib/rack/insight/panels/log_panel.rb +53 -0
  40. data/lib/rack/insight/panels/memory_panel.rb +36 -0
  41. data/lib/rack/insight/panels/mongo_panel.rb +41 -0
  42. data/lib/rack/insight/panels/mongo_panel/mongo_extension.rb +24 -0
  43. data/lib/rack/insight/panels/mongo_panel/stats.rb +46 -0
  44. data/lib/rack/insight/panels/rails_info_panel.rb +19 -0
  45. data/lib/rack/insight/panels/redis_panel.rb +42 -0
  46. data/lib/rack/insight/panels/redis_panel/redis_extension.rb +23 -0
  47. data/lib/rack/insight/panels/redis_panel/stats.rb +50 -0
  48. data/lib/rack/insight/panels/request_variables_panel.rb +70 -0
  49. data/lib/rack/insight/panels/speedtracer_panel.rb +89 -0
  50. data/lib/rack/insight/panels/speedtracer_panel/profiling.rb +29 -0
  51. data/lib/rack/insight/panels/speedtracer_panel/trace-app.rb +52 -0
  52. data/lib/rack/insight/panels/speedtracer_panel/tracer.rb +213 -0
  53. data/lib/rack/insight/panels/sphinx_panel.rb +41 -0
  54. data/lib/rack/insight/panels/sphinx_panel/stats.rb +94 -0
  55. data/lib/rack/insight/panels/sql_panel.rb +53 -0
  56. data/lib/rack/insight/panels/sql_panel/panel_app.rb +37 -0
  57. data/lib/rack/insight/panels/sql_panel/query.rb +94 -0
  58. data/lib/rack/insight/panels/templates_panel.rb +58 -0
  59. data/lib/rack/insight/panels/templates_panel/rendering.rb +81 -0
  60. data/lib/rack/insight/panels/timer_panel.rb +40 -0
  61. data/lib/rack/insight/params_signature.rb +61 -0
  62. data/lib/rack/insight/path-filter.rb +23 -0
  63. data/lib/rack/insight/public/__insight__/bookmarklet.html +10 -0
  64. data/lib/rack/insight/public/__insight__/bookmarklet.js +223 -0
  65. data/lib/rack/insight/public/__insight__/insight.css +235 -0
  66. data/lib/rack/insight/public/__insight__/insight.js +127 -0
  67. data/lib/rack/insight/public/__insight__/jquery-1.3.2.js +4376 -0
  68. data/lib/rack/insight/public/__insight__/jquery.tablesorter.min.js +1 -0
  69. data/lib/rack/insight/public/__insight__/spinner.gif +0 -0
  70. data/lib/rack/insight/rack_static_bug_avoider.rb +16 -0
  71. data/lib/rack/insight/redirect_interceptor.rb +25 -0
  72. data/lib/rack/insight/render.rb +72 -0
  73. data/lib/rack/insight/request-recorder.rb +22 -0
  74. data/lib/rack/insight/rspec_matchers.rb +33 -0
  75. data/lib/rack/insight/toolbar.rb +69 -0
  76. data/lib/rack/insight/version.rb +7 -0
  77. data/lib/rack/insight/views/enable-button.html.erb +21 -0
  78. data/lib/rack/insight/views/error.html.erb +17 -0
  79. data/lib/rack/insight/views/headers_fragment.html.erb +20 -0
  80. data/lib/rack/insight/views/panels/active_record.html.erb +17 -0
  81. data/lib/rack/insight/views/panels/active_resource.html.erb +47 -0
  82. data/lib/rack/insight/views/panels/cache.html.erb +93 -0
  83. data/lib/rack/insight/views/panels/execute_sql.html.erb +32 -0
  84. data/lib/rack/insight/views/panels/explain_sql.html.erb +32 -0
  85. data/lib/rack/insight/views/panels/log.html.erb +21 -0
  86. data/lib/rack/insight/views/panels/mongo.html.erb +32 -0
  87. data/lib/rack/insight/views/panels/profile_sql.html.erb +32 -0
  88. data/lib/rack/insight/views/panels/rails_info.html.erb +19 -0
  89. data/lib/rack/insight/views/panels/redis.html.erb +46 -0
  90. data/lib/rack/insight/views/panels/request_variables.html.erb +25 -0
  91. data/lib/rack/insight/views/panels/speedtracer/serverevent.html.erb +10 -0
  92. data/lib/rack/insight/views/panels/speedtracer/servertrace.html.erb +12 -0
  93. data/lib/rack/insight/views/panels/speedtracer/traces.html.erb +18 -0
  94. data/lib/rack/insight/views/panels/sphinx.html.erb +32 -0
  95. data/lib/rack/insight/views/panels/sql.html.erb +43 -0
  96. data/lib/rack/insight/views/panels/templates.html.erb +6 -0
  97. data/lib/rack/insight/views/panels/timer.html.erb +19 -0
  98. data/lib/rack/insight/views/panels/view_cache.html.erb +19 -0
  99. data/lib/rack/insight/views/redirect.html.erb +16 -0
  100. data/lib/rack/insight/views/request_fragment.html.erb +25 -0
  101. data/lib/rack/insight/views/toolbar.html.erb +29 -0
  102. data/rack-insight.gemspec +40 -0
  103. data/spec/custom_matchers.rb +0 -0
  104. data/spec/fixtures/config.ru +8 -0
  105. data/spec/fixtures/dummy_panel.rb +2 -0
  106. data/spec/fixtures/sample_app.rb +72 -0
  107. data/spec/fixtures/star_trek_panel.rb +1 -0
  108. data/spec/insight_spec.rb +163 -0
  109. data/spec/instrumentation_spec.rb +188 -0
  110. data/spec/rack/insight/config_spec.rb +20 -0
  111. data/spec/rack/insight/panels/active_record_panel_spec.rb +43 -0
  112. data/spec/rack/insight/panels/active_resource_panel_spec.rb +40 -0
  113. data/spec/rack/insight/panels/cache_panel_spec.rb +178 -0
  114. data/spec/rack/insight/panels/log_panel_spec.rb +44 -0
  115. data/spec/rack/insight/panels/memory_panel_spec.rb +21 -0
  116. data/spec/rack/insight/panels/mongo_panel_spec_pending.rb +52 -0
  117. data/spec/rack/insight/panels/rails_info_panel_spec.rb +29 -0
  118. data/spec/rack/insight/panels/redis_panel_spec.rb +67 -0
  119. data/spec/rack/insight/panels/speedtracer_panel_spec.rb +86 -0
  120. data/spec/rack/insight/panels/sql_panel_spec.rb +146 -0
  121. data/spec/rack/insight/panels/templates_panel_spec.rb +86 -0
  122. data/spec/rack/insight/panels/timer_panel_spec.rb +38 -0
  123. data/spec/rcov.opts +1 -0
  124. data/spec/spec.opts +1 -0
  125. data/spec/spec_helper.rb +111 -0
  126. metadata +380 -0
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ module Rack::Insight
4
+ describe "SpeedTracerPanel" do
5
+ before do
6
+ mock_constant("ActionView::Template")
7
+ reset_insight :panel_files => %w{speedtracer_panel}
8
+ end
9
+
10
+ describe "heading" do
11
+ it "lists traces" do
12
+ response = get_via_rack "/"
13
+ response.should have_heading("traces")
14
+ end
15
+ end
16
+
17
+ def mock_template(path)
18
+ template = stub("ActionView::Template")
19
+ template.stub!(:virtual_path => path)
20
+ template
21
+ end
22
+
23
+ describe "content", :pending => "time to build good Speedtracer tests" do
24
+ it "displays the template paths" do
25
+ app.before_return do
26
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/show"))
27
+ end
28
+ response = get_via_rack "/"
29
+ response.should contain("users/show")
30
+ end
31
+
32
+ it "displays the template children" do
33
+ app.before_return do
34
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/show")) do
35
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/toolbar"))
36
+ end
37
+ end
38
+ response = get_via_rack "/"
39
+ response.should have_selector("li", :content => "users/show") do |li|
40
+ li.should contain("users/toolbar")
41
+ end
42
+ end
43
+
44
+ context "for templates that rendered templates" do
45
+ it "displays the total time" do
46
+ app.before_return do
47
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/show")) do
48
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/toolbar"))
49
+ end
50
+ end
51
+
52
+ response = get_via_rack "/"
53
+ response.should have_selector("li", :content => "users/show") do |li|
54
+ li.should contain(TIME_MS_REGEXP)
55
+ end
56
+ end
57
+
58
+ it "displays the exclusive time" do
59
+ app.before_return do
60
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/show")) do
61
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/toolbar"))
62
+ end
63
+ end
64
+
65
+ response = get_via_rack "/"
66
+ response.should have_selector("li", :content => "users/show") do |li|
67
+ li.should contain(/\d\.\d{2} exclusive/)
68
+ end
69
+ end
70
+ end
71
+
72
+ context "for leaf templates" do
73
+ it "does not display the exclusive time" do
74
+ app.before_return do
75
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/show"))
76
+ end
77
+
78
+ response = get_via_rack "/"
79
+ response.should contain("users/show") do |li|
80
+ li.should_not contain("exclusive")
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,146 @@
1
+ require 'spec_helper'
2
+
3
+ module Rack::Insight
4
+ describe "SQLPanel" do
5
+ before do
6
+ mock_constant("ActiveRecord::ConnectionAdapters::MysqlAdapter")
7
+ reset_insight :panel_files => %w{sql_panel}
8
+ end
9
+
10
+ describe "heading" do
11
+ it "displays the total SQL query count" do
12
+ app.before_return do
13
+ mock_method_call("ActiveRecord::ConnectionAdapters::MysqlAdapter", "execute", ["SELECT NOW();"])
14
+ end
15
+ response = get_via_rack "/"
16
+ response.should have_heading("1 Queries")
17
+ end
18
+
19
+ it "displays the total SQL time" do
20
+ app.before_return do
21
+ mock_method_call("ActiveRecord::ConnectionAdapters::MysqlAdapter", "execute", ["SELECT NOW();"])
22
+ end
23
+ response = get_via_rack "/"
24
+ response.should have_heading(/Queries \(\d+\.\d{2}ms\)/)
25
+ end
26
+ end
27
+
28
+ describe "content" do
29
+ it "displays each executed SQL query" do
30
+ app.before_return do
31
+ mock_method_call("ActiveRecord::ConnectionAdapters::MysqlAdapter", "execute", ["SELECT NOW();"])
32
+ end
33
+ response = get_via_rack "/"
34
+ response.should have_row("#sql", "SELECT NOW();")
35
+ end
36
+
37
+ it "displays the time of each executed SQL query" do
38
+ app.before_return do
39
+ mock_method_call("ActiveRecord::ConnectionAdapters::MysqlAdapter", "execute", ["SELECT NOW();"])
40
+ end
41
+ response = get_via_rack "/"
42
+ response.should have_row("#sql", "SELECT NOW();", TIME_MS_REGEXP)
43
+ end
44
+ end
45
+
46
+ def stub_result(results = [[]])
47
+ columns = results.first
48
+ fields = columns.map { |c| stub("field", :name => c) }
49
+ rows = results[1..-1]
50
+
51
+ result = stub("result", :fetch_fields => fields)
52
+ result.stub!(:map).and_yield(rows)
53
+ return result
54
+ end
55
+
56
+ def expect_query(sql, results)
57
+ conn = stub("connection")
58
+ mock_constant("ActiveRecord::Base")
59
+ ActiveRecord::Base.stub!(:connection => conn)
60
+ conn.should_receive(:execute).with(sql).and_return(stub_result(results))
61
+ end
62
+
63
+ describe "sql/execute" do
64
+ it "displays the query results" do
65
+ app.insight_app.secret_key = "abc"
66
+ expect_query "SELECT username FROM users",
67
+ [["username"],
68
+ ["bryan"]]
69
+
70
+ response = get_via_rack "/__insight__/sql/execute", {:query => "SELECT username FROM users",
71
+ :hash => Digest::SHA1.hexdigest("abc:SELECT username FROM users")}, {:xhr => true}
72
+ response.should contain("SELECT username FROM users")
73
+ response.should be_ok
74
+ end
75
+
76
+ it "is forbidden when the hash is missing or wrong" do
77
+ app.insight_app.secret_key='abc'
78
+
79
+ lambda {
80
+ get_via_rack "/__insight__/sql/execute", {:query => "SELECT username FROM users",
81
+ :hash => "foobar"}, {:xhr => true}
82
+ }.should raise_error(SecurityError)
83
+ end
84
+
85
+ it "is not available when the insight.secret_key is nil" do
86
+ app.insight_app.secret_key = nil
87
+
88
+ lambda {
89
+ get_via_rack "/__insight__/sql/execute", {:query => "SELECT username FROM users",
90
+ :hash => "6f286f55b75716e5c91f16d77d09fa73b353ebc1"}, {:xhr => true}
91
+ }.should raise_error(SecurityError)
92
+ end
93
+
94
+ it "is not available when the insight.secret_key is an empty string" do
95
+ app.insight_app.secret_key = ""
96
+
97
+ lambda {
98
+ get_via_rack "/__insight__/sql/execute", {:query => "SELECT username FROM users",
99
+ :hash => "6f286f55b75716e5c91f16d77d09fa73b353ebc1"}, {:xhr => true}
100
+ }.should raise_error(SecurityError)
101
+ end
102
+ end
103
+
104
+ describe "sql/explain" do
105
+ it "displays the query explain plan" do
106
+ app.insight_app.secret_key = "abc"
107
+ expect_query "EXPLAIN SELECT username FROM users",
108
+ [["table"],
109
+ ["users"]]
110
+
111
+
112
+ response = get_via_rack "/__insight__/sql/explain", :query => "SELECT username FROM users",
113
+ :hash => Digest::SHA1.hexdigest("abc:SELECT username FROM users")
114
+ response.should contain("SELECT username FROM users")
115
+ response.should be_ok
116
+ end
117
+
118
+ it "is forbidden when the hash is missing or wrong" do
119
+ app.insight_app.secret_key='abc'
120
+
121
+ lambda {
122
+ get_via_rack "/__insight__/sql/explain", :query => "SELECT username FROM users",
123
+ :hash => "foobar"
124
+ }.should raise_error(SecurityError)
125
+ end
126
+
127
+ it "is not available when the insight.secret_key is nil" do
128
+ app.insight_app.secret_key=nil
129
+
130
+ lambda {
131
+ get_via_rack "/__insight__/sql/explain", :query => "SELECT username FROM users",
132
+ :hash => "6f286f55b75716e5c91f16d77d09fa73b353ebc1"
133
+ }.should raise_error(SecurityError)
134
+ end
135
+
136
+ it "is not available when the insight.secret_key is an empty string" do
137
+ app.insight_app.secret_key=""
138
+
139
+ lambda {
140
+ get_via_rack "/__insight__/sql/explain", :query => "SELECT username FROM users",
141
+ :hash => "6f286f55b75716e5c91f16d77d09fa73b353ebc1"
142
+ }.should raise_error(SecurityError)
143
+ end
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,86 @@
1
+ require 'spec_helper'
2
+
3
+ module Rack::Insight
4
+ describe "TemplatesPanel" do
5
+ before do
6
+ mock_constant("ActionView::Template")
7
+ reset_insight :panel_classes => [Rack::Insight::TemplatesPanel]
8
+ end
9
+
10
+ describe "heading" do
11
+ it "displays the total rendering time" do
12
+ response = get_via_rack "/"
13
+ response.should have_heading("Templates: 0.00ms")
14
+ end
15
+ end
16
+
17
+ def mock_template(path)
18
+ template = stub("ActionView::Template")
19
+ template.stub!(:virtual_path => path)
20
+ template
21
+ end
22
+
23
+ describe "content" do
24
+ it "displays the template paths" do
25
+ app.before_return do
26
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/show"))
27
+ end
28
+ response = get_via_rack "/"
29
+ response.should contain("users/show")
30
+ end
31
+
32
+ it "displays the template children" do
33
+ app.before_return do
34
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/show")) do
35
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/toolbar"))
36
+ end
37
+ end
38
+ response = get_via_rack "/"
39
+ response.should have_selector("li", :content => "users/show") do |li|
40
+ li.should contain("users/toolbar")
41
+ end
42
+ end
43
+
44
+ context "for templates that rendered templates" do
45
+ it "displays the total time" do
46
+ app.before_return do
47
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/show")) do
48
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/toolbar"))
49
+ end
50
+ end
51
+
52
+ response = get_via_rack "/"
53
+ response.should have_selector("li", :content => "users/show") do |li|
54
+ li.should contain(TIME_MS_REGEXP)
55
+ end
56
+ end
57
+
58
+ it "displays the exclusive time" do
59
+ app.before_return do
60
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/show")) do
61
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/toolbar"))
62
+ end
63
+ end
64
+
65
+ response = get_via_rack "/"
66
+ response.should have_selector("li", :content => "users/show") do |li|
67
+ li.should contain(/\d\.\d{2} exclusive/)
68
+ end
69
+ end
70
+ end
71
+
72
+ context "for leaf templates" do
73
+ it "does not display the exclusive time" do
74
+ app.before_return do
75
+ mock_method_call("ActionView::Template", :render, [], :instance, mock_template("users/show"))
76
+ end
77
+
78
+ response = get_via_rack "/"
79
+ response.should contain("users/show") do |li|
80
+ li.should_not contain("exclusive")
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,38 @@
1
+ require 'spec_helper'
2
+
3
+ module Rack::Insight
4
+ describe "TimerPanel" do
5
+ before do
6
+ reset_insight :panel_classes => [Rack::Insight::TimerPanel]
7
+ end
8
+
9
+ describe "heading" do
10
+ it "displays the elapsed time" do
11
+ response = get_via_rack "/"
12
+ response.should have_heading(TIME_MS_REGEXP)
13
+ end
14
+ end
15
+
16
+ describe "content" do
17
+ it "displays the user CPU time" do
18
+ response = get_via_rack "/"
19
+ response.should have_row("#timer", "User CPU time", TIME_MS_REGEXP)
20
+ end
21
+
22
+ it "displays the system CPU time" do
23
+ response = get_via_rack "/"
24
+ response.should have_row("#timer", "System CPU time", TIME_MS_REGEXP)
25
+ end
26
+
27
+ it "displays the total CPU time" do
28
+ response = get_via_rack "/"
29
+ response.should have_row("#timer", "Total CPU time", TIME_MS_REGEXP)
30
+ end
31
+
32
+ it "displays the elapsed time" do
33
+ response = get_via_rack "/"
34
+ response.should have_row("#timer", "Elapsed time", TIME_MS_REGEXP)
35
+ end
36
+ end
37
+ end
38
+ end
data/spec/rcov.opts ADDED
@@ -0,0 +1 @@
1
+ -x gems,spec\/
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -0,0 +1,111 @@
1
+ require "rubygems"
2
+ require "webrat"
3
+ require "rack/test"
4
+
5
+ RAILS_ENV = "test"
6
+
7
+ #$LOAD_PATH.unshift File.dirname(File.dirname(__FILE__)) + '/lib'
8
+ #$LOAD_PATH.unshift File.dirname(File.dirname(__FILE__))
9
+
10
+ require "rack-insight"
11
+ require "fixtures/sample_app"
12
+ require "fixtures/dummy_panel"
13
+ require "rack/insight/rspec_matchers"
14
+
15
+ RSpec.configure do |config|
16
+ config.treat_symbols_as_metadata_keys_with_true_values = true
17
+ config.run_all_when_everything_filtered = true
18
+ config.filter_run :focus
19
+
20
+ # Run specs in random order to surface order dependencies. If you find an
21
+ # order dependency and want to debug it, you can fix the order by providing
22
+ # the seed, which is printed after each run.
23
+ # --seed 1234
24
+ # TODO: Turn this on. Currently off because the specs bleed, and will randomly fail when run randomly.
25
+ #config.order = 'random'
26
+
27
+ TIME_MS_REGEXP = /\d+\.\d{2}ms/
28
+
29
+ config.include Rack::Test::Methods
30
+ config.include Webrat::Matchers
31
+ config.include Rack::Insight::RspecMatchers
32
+
33
+ config.before do
34
+ Thread.current["rack-insight.logger"] = Rack::Insight::Logger.new(Logger::FATAL, "")
35
+ @added_constants = []
36
+ end
37
+
38
+ config.after do
39
+ @added_constants.each do |parent, added|
40
+ parent.send :remove_const, added
41
+ end
42
+ @added_constants.clear
43
+ end
44
+
45
+ def reset_insight(options=nil)
46
+ system(*%w{rm -f rack-insight.sqlite})
47
+
48
+ Rack::Insight::Database.reset
49
+
50
+ app.prototype
51
+ app.insight_app.reset(options)
52
+
53
+ Rack::Insight.enable
54
+
55
+ set_cookie "rack-insight_enabled=1"
56
+ end
57
+
58
+ def reset_config(config_options = {:panel_load_paths => [File::join('rack', 'insight', 'panels')]})
59
+ Rack::Insight::Config.configure do |config|
60
+ # spec folder is in the load path during specs!
61
+ config[:panel_load_paths] = config_options[:panel_load_paths]
62
+ end
63
+ end
64
+
65
+ def app
66
+ SampleApp
67
+ end
68
+
69
+ def mock_constant(name)
70
+ parts = name.split("::")
71
+ klass = parts.pop
72
+ mod = parts.inject(Object) do |const, part|
73
+ begin
74
+ const.const_get(part)
75
+ rescue NameError
76
+ @added_constants << [const, part]
77
+ mod = Module.new
78
+ const.const_set(part.to_sym, mod)
79
+ mod
80
+ end
81
+ end
82
+ begin
83
+ mod.const_get(klass)
84
+ rescue NameError
85
+ mod.const_set(klass, Class.new)
86
+ end
87
+ end
88
+
89
+ def mock_method_call(context, method, args=[], kind=:instance, object=Object.new, &block)
90
+ mock_constant(context)
91
+
92
+ called_at = caller[0]
93
+ file, line, real_method = called_at.split(":")
94
+ called_at = [file,line,method].join(":")
95
+
96
+ block ||= proc {}
97
+
98
+ Rack::Insight::Instrumentation::Probe::ProbeRunner.probe_run(
99
+ object, context, kind, args, called_at, method, &block)
100
+ end
101
+
102
+ def rack_env(key, value)
103
+ @rack_env ||= {}
104
+ @rack_env[key] = value
105
+ end
106
+
107
+ def get_via_rack(uri, params = {}, env = {}, &block)
108
+ env = env.merge(@rack_env) if @rack_env
109
+ get(uri, params, env, &block)
110
+ end
111
+ end