rack-mini-profiler 0.1.12.pre → 0.1.13.pre

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.

Potentially problematic release.


This version of rack-mini-profiler might be problematic. Click here for more details.

data/CHANGELOG CHANGED
@@ -52,3 +52,14 @@
52
52
 
53
53
  * 1.12.pre
54
54
  * Cap X-MiniProfiler-Ids at 10, otherwise the header can get killed
55
+
56
+ 3-September-2012 - Sam
57
+
58
+ * 1.13.pre
59
+ * pg gem prepared statements were not being logged correctly
60
+ * added setting config.backtrace_ignores = [] - an array of regexes that match on caller lines that get ignored
61
+ * added setting config.backtrace_includes = [] - an array of regexes that get included in the trace by default
62
+ * cleaned up the way client settings are stored
63
+ * made pp=full-backtrace "sticky"
64
+ * added pp=normal-backtrace to clear the "sticky" state
65
+ * change "pp=sample" to work with "caller" no need for stack trace gem
data/README.md CHANGED
@@ -87,7 +87,33 @@ In a Rails app, this can be done conveniently in an initializer such as config/i
87
87
 
88
88
  ## Rails 2.X support
89
89
 
90
- MiniProfiler uses [railtie](https://github.com/SamSaffron/MiniProfiler/blob/master/Ruby/lib/mini_profiler_rails/railtie.rb) to bootstrap itself. This will not be called in a Rails 2 app. You are going to need to hook it up manually. (TODO: document this - pull request please)
90
+ To get MiniProfiler working with Rails 2.3.X you need to do the initialization manually as well as monkey patch away an incompatibility between activesupport and json_pure.
91
+
92
+ Add the following code to your environment.rb (or just in a specific environment such as development.rb) for initialization and configuration of MiniProfiler.
93
+
94
+ ```ruby
95
+ # configure and initialize MiniProfiler
96
+ require 'rack-mini-profiler'
97
+ c = ::Rack::MiniProfiler.config
98
+ c.pre_authorize_cb = lambda { |env|
99
+ Rails.env.development? || Rails.env.production?
100
+ }
101
+ tmp = Rails.root.to_s + "/tmp/miniprofiler"
102
+ FileUtils.mkdir_p(tmp) unless File.exists?(tmp)
103
+ c.storage_options = {:path => tmp}
104
+ c.storage = ::Rack::MiniProfiler::FileStore
105
+ config.middleware.use(::Rack::MiniProfiler)
106
+ ::Rack::MiniProfiler.profile_method(ActionController::Base, :process) {|action| "Executing action: #{action}"}
107
+ ::Rack::MiniProfiler.profile_method(ActionView::Template, :render) {|x,y| "Rendering: #{@virtual_path}"}
108
+
109
+ # monkey patch away an activesupport and json_pure incompatability
110
+ # http://pivotallabs.com/users/alex/blog/articles/1332-monkey-patch-of-the-day-activesupport-vs-json-pure-vs-ruby-1-8
111
+ if JSON.const_defined?(:Pure)
112
+ class JSON::Pure::Generator::State
113
+ include ActiveSupport::CoreExtensions::Hash::Except
114
+ end
115
+ end
116
+ ```
91
117
 
92
118
  ## Available Options
93
119
 
@@ -58,7 +58,7 @@
58
58
  .profiler-results .profiler-popup .profiler-timings th,.profiler-results .profiler-popup .profiler-timings td{padding-left:6px;padding-right:6px;}
59
59
  .profiler-results .profiler-popup .profiler-timings th{font-size:95%;padding-bottom:3px;}
60
60
  .profiler-results .profiler-popup .profiler-timings .profiler-label{max-width:275px;}
61
- .profiler-results .profiler-queries{display:none;z-index:2147483643;position:absolute;overflow-y:auto;overflow-x:hidden;background-color:#fff;}.profiler-results .profiler-queries th{font-size:17px;}
61
+ .profiler-results .profiler-queries{display:none;z-index:2147483643;position:absolute;overflow-y:auto;overflow-x:auto;background-color:#fff;}.profiler-results .profiler-queries th{font-size:17px;}
62
62
  .profiler-results.profiler-min .profiler-result{display:none;}
63
63
  .profiler-results.profiler-min .profiler-controls span{display:none;}
64
64
  .profiler-results.profiler-min .profiler-controls .profiler-min-max{border-right:none;padding:0px;margin:0px;}
@@ -5,7 +5,8 @@ var MiniProfiler = (function ($) {
5
5
  container,
6
6
  controls,
7
7
  fetchedIds = [],
8
- fetchingIds = [] // so we never pull down a profiler twice
8
+ fetchingIds = [], // so we never pull down a profiler twice
9
+ ajaxStartTime
9
10
  ;
10
11
 
11
12
  var hasLocalStorage = function () {
@@ -73,15 +74,15 @@ var MiniProfiler = (function ($) {
73
74
  clientPerformance = null;
74
75
  clientProbes = null;
75
76
 
76
- if (id == options.currentId) {
77
-
78
- if (window.mPt) {
79
- clientProbes = mPt.t;
80
- for (j = 0; j < clientProbes.length; j++) {
81
- clientProbes[j].d = clientProbes[j].d.getTime();
82
- }
83
- mPt.t = [];
77
+ if (window.mPt) {
78
+ clientProbes = mPt.results();
79
+ for (j = 0; j < clientProbes.length; j++) {
80
+ clientProbes[j].d = clientProbes[j].d.getTime();
84
81
  }
82
+ mPt.flush();
83
+ }
84
+
85
+ if (id == options.currentId) {
85
86
 
86
87
  clientPerformance = getClientPerformance();
87
88
 
@@ -113,6 +114,9 @@ var MiniProfiler = (function ($) {
113
114
 
114
115
  }
115
116
  }
117
+ } else if (ajaxStartTime != null && clientProbes.length > 0) {
118
+ clientPerformance = { timing: { navigationStart: ajaxStartTime.getTime() } };
119
+ ajaxStartTime = null;
116
120
  }
117
121
 
118
122
  if ($.inArray(id, fetchedIds) < 0 && $.inArray(id, fetchingIds) < 0) {
@@ -449,6 +453,9 @@ var MiniProfiler = (function ($) {
449
453
  jQuery(document).ajaxComplete(jQueryAjaxComplete);
450
454
  }
451
455
 
456
+ if (jQuery(document).ajaxStart)
457
+ jQuery(document).ajaxStart(function () { ajaxStartTime = new Date(); });
458
+
452
459
  // fetch results after ASP Ajax calls
453
460
  if (typeof (Sys) != 'undefined' && typeof (Sys.WebForms) != 'undefined' && typeof (Sys.WebForms.PageRequestManager) != 'undefined') {
454
461
  // Get the instance of PageRequestManager.
@@ -359,7 +359,7 @@
359
359
  z-index:@zindex + 3;
360
360
  position:absolute;
361
361
  overflow-y:auto;
362
- overflow-x:hidden;
362
+ overflow-x:auto;
363
363
  background-color:#fff;
364
364
 
365
365
  th {
@@ -43,7 +43,7 @@
43
43
  {{if HasSqlTimings}}
44
44
  <td colspan="2" class="profiler-number profiler-percent-in-sql" title="${MiniProfiler.getSqlTimingsCount(Root)} queries spent ${MiniProfiler.formatDuration(DurationMillisecondsInSql)} ms of total request time">
45
45
  ${MiniProfiler.formatDuration(DurationMillisecondsInSql / DurationMilliseconds * 100)}
46
- <span class="profiler-unit">% in sql</span>
46
+ <span class="profiler-unit">% in qry</span>
47
47
  </td>
48
48
  {{/if}}
49
49
  </tr>
@@ -141,7 +141,7 @@
141
141
  <td class="profiler-duration {{if HasDuplicateSqlTimings}}profiler-warning{{/if}}" title="{{if HasDuplicateSqlTimings}}duplicate queries detected - {{/if}}${ExecutedReaders} reader, ${ExecutedScalars} scalar, ${ExecutedNonQueries} non-query statements executed">
142
142
  <a class="profiler-queries-show">
143
143
  {{if HasDuplicateSqlTimings}}<span class="profiler-nuclear">!</span>{{/if}}
144
- ${SqlTimings.length} <span class="profiler-unit">sql</span>
144
+ ${SqlTimings.length} <span class="profiler-unit">qry</span>
145
145
  </a>
146
146
  </td>
147
147
  <td class="profiler-duration" title="aggregate duration of all queries in this step (excludes children)">
@@ -0,0 +1,65 @@
1
+ module Rack
2
+ class MiniProfiler
3
+ class ClientSettings
4
+
5
+ COOKIE_NAME = "__profilin"
6
+
7
+ BACKTRACE_DEFAULT = nil
8
+ BACKTRACE_FULL = 1
9
+ BACKTRACE_NONE = 2
10
+
11
+ attr_accessor :disable_profiling
12
+ attr_accessor :backtrace_level
13
+
14
+
15
+ def initialize(env)
16
+ request = ::Rack::Request.new(env)
17
+ @cookie = request.cookies[COOKIE_NAME]
18
+ if @cookie
19
+ @cookie.split(",").map{|pair| pair.split("=")}.each do |k,v|
20
+ @orig_disable_profiling = @disable_profiling = (v=='t') if k == "dp"
21
+ @backtrace_level = v.to_i if k == "bt"
22
+ end
23
+ end
24
+
25
+ @backtrace_level = nil if !@backtrace_level.nil? && (@backtrace_level == 0 || @backtrace_level > BACKTRACE_NONE)
26
+ @orig_backtrace_level = @backtrace_level
27
+
28
+ end
29
+
30
+ def write!(headers)
31
+ if @orig_disable_profiling != @disable_profiling || @orig_backtrace_level != @backtrace_level || @cookie.nil?
32
+ settings = {"p" => "t" }
33
+ settings["dp"] = "t" if @disable_profiling
34
+ settings["bt"] = @backtrace_level if @backtrace_level
35
+ settings_string = settings.map{|k,v| "#{k}=#{v}"}.join(",")
36
+ Rack::Utils.set_cookie_header!(headers, COOKIE_NAME, :value => settings_string)
37
+ end
38
+ end
39
+
40
+ def discard_cookie!(headers)
41
+ Rack::Utils.delete_cookie_header!(headers, COOKIE_NAME)
42
+ end
43
+
44
+ def has_cookie?
45
+ !@cookie.nil?
46
+ end
47
+
48
+ def disable_profiling?
49
+ @disable_profiling
50
+ end
51
+
52
+ def backtrace_full?
53
+ @backtrace_level == BACKTRACE_FULL
54
+ end
55
+
56
+ def backtrace_default?
57
+ @backtrace_level == BACKTRACE_DEFAULT
58
+ end
59
+
60
+ def backtrace_none?
61
+ @backtrace_level == BACKTRACE_NONE
62
+ end
63
+ end
64
+ end
65
+ end
File without changes
@@ -13,7 +13,7 @@ module Rack
13
13
  end
14
14
 
15
15
  attr_accessor :auto_inject, :base_url_path, :pre_authorize_cb, :position,
16
- :backtrace_remove, :backtrace_filter, :skip_schema_queries,
16
+ :backtrace_remove, :backtrace_includes, :backtrace_ignores, :skip_schema_queries,
17
17
  :storage, :user_provider, :storage_instance, :storage_options, :skip_paths, :authorization_mode, :use_existing_jquery
18
18
 
19
19
  def self.default
File without changes
File without changes
@@ -13,6 +13,7 @@ require 'mini_profiler/storage/file_store'
13
13
  require 'mini_profiler/config'
14
14
  require 'mini_profiler/profiling_methods'
15
15
  require 'mini_profiler/context'
16
+ require 'mini_profiler/client_settings'
16
17
 
17
18
  module Rack
18
19
 
@@ -56,35 +57,6 @@ module Rack
56
57
  self.current.discard = true if current
57
58
  end
58
59
 
59
- # user has the mini profiler cookie, only used when config.authorization_mode == :whitelist
60
- def has_profiling_cookie?(env)
61
- env['HTTP_COOKIE'] && env['HTTP_COOKIE'].include?("__profilin=stylin")
62
- end
63
-
64
- # remove the mini profiler cookie, only used when config.authorization_mode == :whitelist
65
- def remove_profiling_cookie(headers)
66
- Rack::Utils.set_cookie_header!(headers, '__profilin', :value => 'notstylin', :path => '/')
67
- end
68
-
69
- def set_profiling_cookie(headers)
70
- Rack::Utils.set_cookie_header!(headers, '__profilin', :value => 'stylin', :path => '/')
71
- end
72
-
73
- # user has the mini profiler cookie, only used when config.authorization_mode == :whitelist
74
- def has_disable_profiling_cookie?(env)
75
- env['HTTP_COOKIE'] && env['HTTP_COOKIE'].include?("__profilin_disable=stylin")
76
- end
77
-
78
- # remove the mini profiler cookie, only used when config.authorization_mode == :whitelist
79
- def remove_disable_profiling_cookie(headers)
80
- #something is odd with delete_cookie_header
81
- Rack::Utils.set_cookie_header!(headers, '__profilin_disable', :value => 'notstylin', :path => '/')
82
- end
83
-
84
- def set_disable_profiling_cookie(headers)
85
- Rack::Utils.set_cookie_header!(headers, '__profilin_disable', :value => 'stylin', :path => '/')
86
- end
87
-
88
60
  def create_current(env={}, options={})
89
61
  # profiling the request
90
62
  self.current = Context.new
@@ -195,6 +167,9 @@ module Rack
195
167
 
196
168
 
197
169
  def call(env)
170
+
171
+ client_settings = ClientSettings.new(env)
172
+
198
173
  status = headers = body = nil
199
174
  query_string = env['QUERY_STRING']
200
175
  path = env['PATH_INFO']
@@ -203,12 +178,12 @@ module Rack
203
178
  (@config.skip_paths && @config.skip_paths.any?{ |p| path[0,p.length] == p}) ||
204
179
  query_string =~ /pp=skip/
205
180
 
206
- has_profiling_cookie = MiniProfiler.has_profiling_cookie?(env)
181
+ has_profiling_cookie = client_settings.has_cookie?
207
182
 
208
183
  if skip_it || (@config.authorization_mode == :whitelist && !has_profiling_cookie)
209
184
  status,headers,body = @app.call(env)
210
185
  if !skip_it && @config.authorization_mode == :whitelist && !has_profiling_cookie && MiniProfiler.request_authorized?
211
- MiniProfiler.set_profiling_cookie(headers)
186
+ client_settings.write!(headers)
212
187
  end
213
188
  return [status,headers,body]
214
189
  end
@@ -216,7 +191,7 @@ module Rack
216
191
  # handle all /mini-profiler requests here
217
192
  return serve_html(env) if path.start_with? @config.base_url_path
218
193
 
219
- has_disable_cookie = MiniProfiler.has_disable_profiling_cookie?(env)
194
+ has_disable_cookie = client_settings.disable_profiling?
220
195
  # manual session disable / enable
221
196
  if query_string =~ /pp=disable/ || has_disable_cookie
222
197
  skip_it = true
@@ -228,16 +203,23 @@ module Rack
228
203
 
229
204
  if skip_it
230
205
  status,headers,body = @app.call(env)
231
- MiniProfiler.set_disable_profiling_cookie(headers) unless has_disable_cookie
206
+ client_settings.disable_profiling = true
207
+ client_settings.write!(headers)
232
208
  return [status,headers,body]
233
209
  end
234
210
 
235
211
  MiniProfiler.create_current(env, @config)
236
212
  MiniProfiler.deauthorize_request if @config.authorization_mode == :whitelist
237
- if query_string =~ /pp=no-backtrace/
213
+ if query_string =~ /pp=normal-backtrace/
214
+ client_settings.backtrace_level = ClientSettings::BACKTRACE_DEFAULT
215
+ elsif query_string =~ /pp=no-backtrace/
238
216
  current.skip_backtrace = true
239
- elsif query_string =~ /pp=full-backtrace/
217
+ client_settings.backtrace_level = ClientSettings::BACKTRACE_NONE
218
+ elsif query_string =~ /pp=full-backtrace/ || client_settings.backtrace_full?
240
219
  current.full_backtrace = true
220
+ client_settings.backtrace_level = ClientSettings::BACKTRACE_FULL
221
+ elsif client_settings.backtrace_none?
222
+ current.skip_backtrace = true
241
223
  end
242
224
 
243
225
  done_sampling = false
@@ -249,17 +231,11 @@ module Rack
249
231
  t = Thread.current
250
232
  Thread.new {
251
233
  begin
252
- require 'stacktrace' rescue nil
253
- if !t.respond_to? :stacktrace
254
- missing_stacktrace = true
255
- quit_sampler = true
256
- return
257
- end
258
234
  i = 10000 # for sanity never grab more than 10k samples
259
235
  while i > 0
260
236
  break if done_sampling
261
237
  i -= 1
262
- backtraces << t.stacktrace
238
+ backtraces << t.backtrace
263
239
  sleep 0.001
264
240
  end
265
241
  ensure
@@ -272,9 +248,7 @@ module Rack
272
248
  start = Time.now
273
249
  begin
274
250
  status,headers,body = @app.call(env)
275
- if has_disable_cookie
276
- MiniProfiler.remove_disable_profiling_cookie(headers)
277
- end
251
+ client_settings.write!(headers)
278
252
  ensure
279
253
  if backtraces
280
254
  done_sampling = true
@@ -284,7 +258,7 @@ module Rack
284
258
 
285
259
  skip_it = current.discard
286
260
  if (config.authorization_mode == :whitelist && !MiniProfiler.request_authorized?)
287
- MiniProfiler.remove_profiling_cookie(headers)
261
+ client_settings.discard_cookie!(headers)
288
262
  skip_it = true
289
263
  end
290
264
 
@@ -298,7 +272,7 @@ module Rack
298
272
 
299
273
  if query_string =~ /pp=help/
300
274
  body.close if body.respond_to? :close
301
- return help
275
+ return help(nil, client_settings)
302
276
  end
303
277
 
304
278
  page_struct = current.page_struct
@@ -306,7 +280,7 @@ module Rack
306
280
 
307
281
  if backtraces
308
282
  body.close if body.respond_to? :close
309
- return help(:stacktrace) if missing_stacktrace
283
+ return help(:stacktrace, client_settings) if missing_stacktrace
310
284
  return analyze(backtraces, page_struct)
311
285
  end
312
286
 
@@ -317,6 +291,8 @@ module Rack
317
291
 
318
292
  # inject headers, script
319
293
  if status == 200
294
+
295
+ client_settings.write!(headers)
320
296
 
321
297
  # mini profiler is meddling with stuff, we can not cache cause we will get incorrect data
322
298
  # Rack::ETag has already inserted some nonesense in the chain
@@ -346,6 +322,7 @@ module Rack
346
322
  end
347
323
  end
348
324
 
325
+ client_settings.write!(headers)
349
326
  [status, headers, body]
350
327
  ensure
351
328
  # Make sure this always happens
@@ -373,16 +350,17 @@ module Rack
373
350
  [200, headers, [body]]
374
351
  end
375
352
 
376
- def help(category = nil)
353
+ def help(category = nil, client_settings)
377
354
  headers = {'Content-Type' => 'text/plain'}
378
355
  body = "Append the following to your query string:
379
356
 
380
357
  pp=help : display this screen
381
358
  pp=env : display the rack environment
382
359
  pp=skip : skip mini profiler for this request
383
- pp=no-backtrace : don't collect stack traces from all the SQL executed
384
- pp=full-backtrace : enable full backtrace for SQL executed
385
- pp=sample : sample stack traces and return a report isolating heavy usage (requires the stacktrace gem)
360
+ pp=no-backtrace #{"(*) " if client_settings.backtrace_none?}: don't collect stack traces from all the SQL executed (sticky, use pp=normal-backtrace to enable)
361
+ pp=normal-backtrace #{"(*) " if client_settings.backtrace_default?}: collect stack traces from all the SQL executed and filter normally
362
+ pp=full-backtrace #{"(*) " if client_settings.backtrace_full?}: enable full backtraces for SQL executed (use pp=normal-backtrace to disable)
363
+ pp=sample : sample stack traces and return a report isolating heavy usage (experimental)
386
364
  pp=disable : disable profiling for this session
387
365
  pp=enable : enable profiling for this session (if previously disabled)
388
366
  "
@@ -390,6 +368,7 @@ module Rack
390
368
  body = "pp=stacktrace requires the stacktrace gem - add gem 'stacktrace' to your Gemfile"
391
369
  end
392
370
 
371
+ client_settings.write!(headers)
393
372
  [200, headers, [body]]
394
373
  end
395
374
 
@@ -403,13 +382,12 @@ module Rack
403
382
  fulldump << "\n\n"
404
383
  distinct = {}
405
384
  trace.each do |frame|
406
- name = "#{frame.klass} #{frame.method}"
407
- unless distinct[name]
408
- distinct[name] = true
409
- seen[name] ||= 0
410
- seen[name] += 1
385
+ unless distinct[frame]
386
+ distinct[frame] = true
387
+ seen[frame] ||= 0
388
+ seen[frame] += 1
411
389
  end
412
- fulldump << name << "\n"
390
+ fulldump << frame << "\n"
413
391
  end
414
392
  end
415
393
 
@@ -9,7 +9,7 @@ module Rack
9
9
  end
10
10
 
11
11
  # perform a profiling step on given block
12
- def step(name)
12
+ def step(name, opts = nil)
13
13
  if current
14
14
  parent_timer = current.current_timer
15
15
  result = nil
@@ -20,7 +20,6 @@ module Rack
20
20
  current_timer.record_time
21
21
  current.current_timer = parent_timer
22
22
  end
23
- result
24
23
  else
25
24
  yield if block_given?
26
25
  end
File without changes
@@ -14,7 +14,17 @@ module Rack
14
14
  # Clean up the stack trace if there are options to do so
15
15
  Kernel.caller.each do |ln|
16
16
  ln.gsub!(Rack::MiniProfiler.config.backtrace_remove, '') if Rack::MiniProfiler.config.backtrace_remove and !full_backtrace
17
- if full_backtrace or Rack::MiniProfiler.config.backtrace_filter.nil? or ln =~ Rack::MiniProfiler.config.backtrace_filter
17
+ if full_backtrace or
18
+ (
19
+ (
20
+ Rack::MiniProfiler.config.backtrace_includes.nil? or
21
+ Rack::MiniProfiler.config.backtrace_includes.all?{|regex| ln =~ regex}
22
+ ) and
23
+ (
24
+ Rack::MiniProfiler.config.backtrace_ignores.nil? or
25
+ Rack::MiniProfiler.config.backtrace_ignores.all?{|regex| !(ln =~ regex)}
26
+ )
27
+ )
18
28
  stack_trace << ln << "\n"
19
29
  end
20
30
  end
File without changes
@@ -58,7 +58,6 @@ module Rack
58
58
  @timer_struct_cache.delete_if { |k, v| v['Root']['StartMilliseconds'] < expire_older_than }
59
59
  }
60
60
  end
61
-
62
61
  end
63
62
  end
64
63
  end
File without changes
@@ -31,7 +31,7 @@ module MiniProfilerRails
31
31
 
32
32
  # Quiet the SQL stack traces
33
33
  c.backtrace_remove = Rails.root.to_s + "/"
34
- c.backtrace_filter = /^\/?(app|config|lib|test)/
34
+ c.backtrace_includes = [/^\/?(app|config|lib|test)/]
35
35
  c.skip_schema_queries = Rails.env != 'production'
36
36
 
37
37
  # Install the Middleware
@@ -96,17 +96,18 @@ if SqlPatches.class_exists? "PG::Result"
96
96
  alias_method :prepare_without_profiling, :prepare
97
97
 
98
98
  def prepare(*args,&blk)
99
- current = ::Rack::MiniProfiler.current
100
- return prepare_without_profiling(*args,&blk) unless current
101
-
99
+ # we have no choice but to do this here,
100
+ # if we do the check for profiling first, our cache may miss critical stuff
101
+
102
102
  @prepare_map ||= {}
103
103
  @prepare_map[args[0]] = args[1]
104
-
105
104
  # dont leak more than 10k ever
106
- @prepare_map = {} if @prepare_map.length > 10000
105
+ @prepare_map = {} if @prepare_map.length > 1000
107
106
 
108
- prepare_without_profiling(*args,&blk)
107
+ current = ::Rack::MiniProfiler.current
108
+ return prepare_without_profiling(*args,&blk) unless current
109
109
 
110
+ prepare_without_profiling(*args,&blk)
110
111
  end
111
112
 
112
113
  def exec(*args,&blk)
File without changes
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "rack-mini-profiler"
3
- s.version = "0.1.12.pre"
3
+ s.version = "0.1.13.pre"
4
4
  s.summary = "Profiles loading speed for rack applications."
5
5
  s.authors = ["Aleks Totic","Sam Saffron", "Robin Ward"]
6
6
  s.description = "Page loading speed displayed on every page. Optimize while you develop, performance is a feature."
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-mini-profiler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.12.pre
4
+ version: 0.1.13.pre
5
5
  prerelease: 7
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2012-08-19 00:00:00.000000000 Z
14
+ date: 2012-09-03 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: rack
@@ -91,6 +91,7 @@ files:
91
91
  - lib/mini_profiler/request_timer_struct.rb
92
92
  - lib/mini_profiler/timer_struct.rb
93
93
  - lib/mini_profiler/page_timer_struct.rb
94
+ - lib/mini_profiler/client_settings.rb
94
95
  - lib/mini_profiler/context.rb
95
96
  - lib/mini_profiler/config.rb
96
97
  - lib/mini_profiler/profiling_methods.rb
@@ -130,7 +131,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
130
131
  version: '0'
131
132
  segments:
132
133
  - 0
133
- hash: -1045845709
134
+ hash: -879601329
134
135
  required_rubygems_version: !ruby/object:Gem::Requirement
135
136
  none: false
136
137
  requirements: