miniprofiler 0.1.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. data/.gitignore +4 -0
  2. data/CHANGELOG +32 -0
  3. data/Gemfile +15 -0
  4. data/Gemfile.lock +64 -0
  5. data/README.md +110 -0
  6. data/Rakefile +40 -0
  7. data/autotest/discover.rb +2 -0
  8. data/lib/mini_profiler/body_add_proxy.rb +45 -0
  9. data/lib/mini_profiler/client_timer_struct.rb +76 -0
  10. data/lib/mini_profiler/config.rb +52 -0
  11. data/lib/mini_profiler/context.rb +10 -0
  12. data/lib/mini_profiler/page_timer_struct.rb +53 -0
  13. data/lib/mini_profiler/profiler.rb +405 -0
  14. data/lib/mini_profiler/profiling_methods.rb +73 -0
  15. data/lib/mini_profiler/request_timer_struct.rb +96 -0
  16. data/lib/mini_profiler/sql_timer_struct.rb +48 -0
  17. data/lib/mini_profiler/storage/abstract_store.rb +27 -0
  18. data/lib/mini_profiler/storage/file_store.rb +108 -0
  19. data/lib/mini_profiler/storage/memory_store.rb +68 -0
  20. data/lib/mini_profiler/storage/redis_store.rb +44 -0
  21. data/lib/mini_profiler/timer_struct.rb +31 -0
  22. data/lib/mini_profiler_rails/railtie.rb +84 -0
  23. data/lib/patches/sql_patches.rb +185 -0
  24. data/lib/rack-mini-profiler.rb +6 -0
  25. data/rack-mini-profiler.gemspec +23 -0
  26. data/spec/components/body_add_proxy_spec.rb +90 -0
  27. data/spec/components/client_timer_struct_spec.rb +165 -0
  28. data/spec/components/file_store_spec.rb +47 -0
  29. data/spec/components/memory_store_spec.rb +40 -0
  30. data/spec/components/page_timer_struct_spec.rb +33 -0
  31. data/spec/components/profiler_spec.rb +126 -0
  32. data/spec/components/redis_store_spec.rb +44 -0
  33. data/spec/components/request_timer_struct_spec.rb +148 -0
  34. data/spec/components/sql_timer_struct_spec.rb +63 -0
  35. data/spec/components/timer_struct_spec.rb +47 -0
  36. data/spec/fixtures/simple_client_request.yml +17 -0
  37. data/spec/fixtures/weird_client_request.yml +13 -0
  38. data/spec/integration/mini_profiler_spec.rb +142 -0
  39. data/spec/spec_helper.rb +31 -0
  40. data/spec/support/expand_each_to_matcher.rb +8 -0
  41. data/test_old/config.ru +41 -0
  42. metadata +155 -0
@@ -0,0 +1,47 @@
1
+ require 'spec_helper'
2
+ require 'mini_profiler/timer_struct'
3
+
4
+ describe Rack::MiniProfiler::TimerStruct do
5
+
6
+ before do
7
+ @timer = Rack::MiniProfiler::TimerStruct.new('Mini' => 'Profiler')
8
+ end
9
+
10
+ it 'has the the Mini attribute' do
11
+ @timer['Mini'].should == 'Profiler'
12
+ end
13
+
14
+ it 'allows us to set any attribute we want' do
15
+ @timer['Hello'] = 'World'
16
+ @timer['Hello'].should == 'World'
17
+ end
18
+
19
+ describe 'to_json' do
20
+
21
+ before do
22
+ @timer['IceIce'] = 'Baby'
23
+ @json = @timer.to_json
24
+ end
25
+
26
+ it 'has a JSON value' do
27
+ @json.should_not be_nil
28
+ end
29
+
30
+ describe 'deserialized' do
31
+
32
+ before do
33
+ @deserialized = ::JSON.parse(@json)
34
+ end
35
+
36
+ it 'produces a hash' do
37
+ @deserialized.is_a?(Hash).should be_true
38
+ end
39
+
40
+ it 'has the element we added' do
41
+ @deserialized['IceIce'].should == 'Baby'
42
+ end
43
+ end
44
+
45
+ end
46
+
47
+ end
@@ -0,0 +1,17 @@
1
+ ---
2
+ rack.request.form_hash:
3
+ clientPerformance:
4
+ navigation:
5
+ redirectCount: 1
6
+ timing:
7
+ navigationStart: 1334245954
8
+ navigationEnd: 1334245970
9
+ simpleStart: 1334245955
10
+ simpleEnd: 1334245965
11
+ clientProbes:
12
+ 0:
13
+ d: 1334245970
14
+ n: bob.js
15
+ 1:
16
+ d: 1334245976
17
+ n: bob.js
@@ -0,0 +1,13 @@
1
+ ---
2
+ rack.request.form_hash:
3
+ clientPerformance:
4
+ navigation:
5
+ redirectCount: 99
6
+ timing:
7
+ navigationStart: 1334245954
8
+ navigationEnd: 1334245970
9
+ weirdStart: 1334245965
10
+ weirdEnd: 1334245955
11
+ previousStart: 1334245950
12
+ previousEnd: 1334245952
13
+ differentFormat: 1334245955
@@ -0,0 +1,142 @@
1
+ require 'spec_helper'
2
+ require 'rack-mini-profiler'
3
+ require 'rack/test'
4
+
5
+ describe Rack::MiniProfiler do
6
+ include Rack::Test::Methods
7
+
8
+ def app
9
+ @app ||= Rack::Builder.new {
10
+ use Rack::MiniProfiler
11
+ map '/path2/a' do
12
+ run lambda { |env| [200, {'Content-Type' => 'text/html'}, '<h1>path1</h1>'] }
13
+ end
14
+ map '/path1/a' do
15
+ run lambda { |env| [200, {'Content-Type' => 'text/html'}, '<h1>path2</h1>'] }
16
+ end
17
+ map '/post' do
18
+ run lambda { |env| [302, {'Content-Type' => 'text/html'}, '<h1>POST</h1>'] }
19
+ end
20
+ map '/html' do
21
+ run lambda { |env| [200, {'Content-Type' => 'text/html'}, '<h1>Hi</h1>'] }
22
+ end
23
+ map '/db' do
24
+ run lambda { |env|
25
+ ::Rack::MiniProfiler.record_sql("I want to be, in a db", 10)
26
+ [200, {'Content-Type' => 'text/html'}, '<h1>Hi+db</h1>']
27
+ }
28
+ end
29
+ map '/3ms' do
30
+ run lambda { |env|
31
+ sleep(0.003)
32
+ [200, {'Content-Type' => 'text/html'}, '<h1>Hi</h1>']
33
+ }
34
+ end
35
+ map '/whitelisted' do
36
+ run lambda { |env|
37
+ Rack::MiniProfiler.authorize_request
38
+ [200, {'Content-Type' => 'text/html'}, '<h1>path1</h1>']
39
+ }
40
+ end
41
+ }.to_app
42
+ end
43
+
44
+ before do
45
+ Rack::MiniProfiler.reset_config
46
+ end
47
+
48
+ describe 'with a valid request' do
49
+
50
+ before do
51
+ get '/html'
52
+ end
53
+
54
+ it 'returns 200' do
55
+ last_response.should be_ok
56
+ end
57
+
58
+ it 'has the X-MiniProfiler-Ids header' do
59
+ last_response.headers.has_key?('X-MiniProfiler-Ids').should be_true
60
+ end
61
+
62
+ it 'has only one X-MiniProfiler-Ids header' do
63
+ h = last_response.headers['X-MiniProfiler-Ids']
64
+ ids = ::JSON.parse(h)
65
+ ids.count.should == 1
66
+ end
67
+
68
+ it 'has the JS in the body' do
69
+ last_response.body.include?('MiniProfiler.init').should be_true
70
+ end
71
+
72
+ end
73
+
74
+ describe 'configuration' do
75
+ it "doesn't add MiniProfiler if the callback fails" do
76
+ Rack::MiniProfiler.config.pre_authorize_cb = lambda {|env| false }
77
+ get '/html'
78
+ last_response.headers.has_key?('X-MiniProfiler-Ids').should be_false
79
+ end
80
+
81
+ it "skips paths listed" do
82
+ Rack::MiniProfiler.config.skip_paths = ['/path/', '/path2/']
83
+ get '/path2/a'
84
+ last_response.headers.has_key?('X-MiniProfiler-Ids').should be_false
85
+ get '/path1/a'
86
+ last_response.headers.has_key?('X-MiniProfiler-Ids').should be_true
87
+ end
88
+ end
89
+
90
+ def load_prof(response)
91
+ id = response.headers['X-MiniProfiler-Ids']
92
+ id = ::JSON.parse(id)[0]
93
+ Rack::MiniProfiler.config.storage_instance.load(id)
94
+ end
95
+
96
+ describe 'special options' do
97
+ it "omits db backtrace if requested" do
98
+ get '/db?pp=no-backtrace'
99
+ prof = load_prof(last_response)
100
+ stack = prof["Root"]["SqlTimings"][0]["StackTraceSnippet"]
101
+ stack.should be_nil
102
+ end
103
+
104
+ end
105
+
106
+ describe 'POST followed by GET' do
107
+ it "should end up with 2 ids" do
108
+ post '/post'
109
+ get '/html'
110
+
111
+ ids = last_response.headers['X-MiniProfiler-Ids']
112
+ ::JSON.parse(ids).length.should == 2
113
+ end
114
+ end
115
+
116
+ describe 'sampling mode' do
117
+ it "should sample stack traces if requested" do
118
+ get '/3ms?pp=sample'
119
+ last_response["Content-Type"].should == 'text/plain'
120
+ end
121
+ end
122
+
123
+
124
+ describe 'authorization mode whitelist' do
125
+ before do
126
+ Rack::MiniProfiler.config.authorization_mode = :whitelist
127
+ end
128
+
129
+ it "should ban requests that are not whitelisted" do
130
+ get '/html'
131
+ last_response.headers['X-MiniProfiler-Ids'].should be_nil
132
+ end
133
+
134
+ it "should allow requests that are whitelisted" do
135
+ set_cookie("__profilin=stylin")
136
+ get '/whitelisted'
137
+ last_response.headers['X-MiniProfiler-Ids'].should_not be_nil
138
+ end
139
+ end
140
+
141
+
142
+ end
@@ -0,0 +1,31 @@
1
+ Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
2
+
3
+ RSpec.configure do |config|
4
+ config.color_enabled = true
5
+ end
6
+
7
+ class Time
8
+ class << self
9
+ unless method_defined? :old_new
10
+ alias_method :old_new, :new
11
+ alias_method :old_now, :now
12
+
13
+ def new
14
+ @now || old_new
15
+ end
16
+
17
+ def now
18
+ @now || old_now
19
+ end
20
+
21
+ def now=(v)
22
+ @now = v
23
+ end
24
+
25
+ def back_to_normal
26
+ @now = nil
27
+ end
28
+
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,8 @@
1
+ # This defines a matcher we can use to test the result of an each method on an object
2
+ RSpec::Matchers.define :expand_each_to do |expected|
3
+ match do |actual|
4
+ expanded = []
5
+ actual.each {|v| expanded << v}
6
+ expanded.should == expected
7
+ end
8
+ end
@@ -0,0 +1,41 @@
1
+ #! rackup -
2
+ #\ -w -p 8080
3
+ require 'active_support/inflector' # see https://code.google.com/p/ruby-sequel/issues/detail?id=329
4
+ require 'sequel'
5
+ require File.expand_path('../lib/rack-mini-profiler', File.dirname(__FILE__))
6
+
7
+ require 'logger'
8
+ use Rack::MiniProfiler
9
+ options = {}
10
+ options[:logger] = Logger.new(STDOUT)
11
+ DB = Sequel.connect("mysql2://sveg:svegsveg@localhost/sveg_development",
12
+ options)
13
+
14
+ app = proc do |env|
15
+ sleep(0.1)
16
+ env['profiler.mini'].benchmark(env, "sleep0.2") do
17
+ sleep(0.2)
18
+ end
19
+ env['profiler.mini'].benchmark(env, 'sleep0.1') do
20
+ sleep(0.1)
21
+ env['profiler.mini'].benchmark(env, 'sleep0.01') do
22
+ sleep(0.01)
23
+ env['profiler.mini'].benchmark(env, 'sleep0.001') do
24
+ sleep(0.001)
25
+ DB.fetch('SHOW TABLES') do |row|
26
+ puts row
27
+ end
28
+ end
29
+ env['profiler.mini'].benchmark(env, 'litl sql') do
30
+ DB.fetch('select * from auth_logins') do |row|
31
+ puts row
32
+ end
33
+ end
34
+ end
35
+ end
36
+ [ 200, {'Content-Type' => 'text/html'}, ["<h1>This is Rack::MiniProfiler test"] ]
37
+ end
38
+
39
+ puts "Rack::MiniProfiler test"
40
+ puts "http://localhost:8080/mini-profiler"
41
+ run app
metadata ADDED
@@ -0,0 +1,155 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: miniprofiler
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.7.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Aleks Totic
9
+ - Sam Saffron
10
+ - Robin Ward
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2012-07-20 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rack
18
+ requirement: &2152846940 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: 1.1.3
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *2152846940
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: &2152846480 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: *2152846480
38
+ - !ruby/object:Gem::Dependency
39
+ name: rack-test
40
+ requirement: &2152845720 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ type: :development
47
+ prerelease: false
48
+ version_requirements: *2152845720
49
+ - !ruby/object:Gem::Dependency
50
+ name: activerecord
51
+ requirement: &2152845140 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ version: '3.0'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *2152845140
60
+ description: Page loading speed displayed on every page. Optimize while you develop,
61
+ performance is a feature.
62
+ email: sam.saffron@gmail.com
63
+ executables: []
64
+ extensions: []
65
+ extra_rdoc_files:
66
+ - README.md
67
+ - CHANGELOG
68
+ files:
69
+ - .gitignore
70
+ - CHANGELOG
71
+ - Gemfile
72
+ - Gemfile.lock
73
+ - README.md
74
+ - Rakefile
75
+ - autotest/discover.rb
76
+ - lib/mini_profiler/body_add_proxy.rb
77
+ - lib/mini_profiler/client_timer_struct.rb
78
+ - lib/mini_profiler/config.rb
79
+ - lib/mini_profiler/context.rb
80
+ - lib/mini_profiler/page_timer_struct.rb
81
+ - lib/mini_profiler/profiler.rb
82
+ - lib/mini_profiler/profiling_methods.rb
83
+ - lib/mini_profiler/request_timer_struct.rb
84
+ - lib/mini_profiler/sql_timer_struct.rb
85
+ - lib/mini_profiler/storage/abstract_store.rb
86
+ - lib/mini_profiler/storage/file_store.rb
87
+ - lib/mini_profiler/storage/memory_store.rb
88
+ - lib/mini_profiler/storage/redis_store.rb
89
+ - lib/mini_profiler/timer_struct.rb
90
+ - lib/mini_profiler_rails/railtie.rb
91
+ - lib/patches/sql_patches.rb
92
+ - lib/rack-mini-profiler.rb
93
+ - rack-mini-profiler.gemspec
94
+ - spec/components/body_add_proxy_spec.rb
95
+ - spec/components/client_timer_struct_spec.rb
96
+ - spec/components/file_store_spec.rb
97
+ - spec/components/memory_store_spec.rb
98
+ - spec/components/page_timer_struct_spec.rb
99
+ - spec/components/profiler_spec.rb
100
+ - spec/components/redis_store_spec.rb
101
+ - spec/components/request_timer_struct_spec.rb
102
+ - spec/components/sql_timer_struct_spec.rb
103
+ - spec/components/timer_struct_spec.rb
104
+ - spec/fixtures/simple_client_request.yml
105
+ - spec/fixtures/weird_client_request.yml
106
+ - spec/integration/mini_profiler_spec.rb
107
+ - spec/spec_helper.rb
108
+ - spec/support/expand_each_to_matcher.rb
109
+ - test_old/config.ru
110
+ homepage: http://miniprofiler.com
111
+ licenses: []
112
+ post_install_message:
113
+ rdoc_options: []
114
+ require_paths:
115
+ - lib
116
+ required_ruby_version: !ruby/object:Gem::Requirement
117
+ none: false
118
+ requirements:
119
+ - - ! '>='
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ segments:
123
+ - 0
124
+ hash: 2154905342144575442
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ segments:
132
+ - 0
133
+ hash: 2154905342144575442
134
+ requirements: []
135
+ rubyforge_project:
136
+ rubygems_version: 1.8.17
137
+ signing_key:
138
+ specification_version: 3
139
+ summary: Profiles loading speed for rack applications.
140
+ test_files:
141
+ - spec/components/body_add_proxy_spec.rb
142
+ - spec/components/client_timer_struct_spec.rb
143
+ - spec/components/file_store_spec.rb
144
+ - spec/components/memory_store_spec.rb
145
+ - spec/components/page_timer_struct_spec.rb
146
+ - spec/components/profiler_spec.rb
147
+ - spec/components/redis_store_spec.rb
148
+ - spec/components/request_timer_struct_spec.rb
149
+ - spec/components/sql_timer_struct_spec.rb
150
+ - spec/components/timer_struct_spec.rb
151
+ - spec/fixtures/simple_client_request.yml
152
+ - spec/fixtures/weird_client_request.yml
153
+ - spec/integration/mini_profiler_spec.rb
154
+ - spec/spec_helper.rb
155
+ - spec/support/expand_each_to_matcher.rb