request_recorder 0.2.4 → 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.
data/Gemfile.lock CHANGED
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- request_recorder (0.2.4)
4
+ request_recorder (0.3.0)
5
5
  activerecord
6
+ logcast (>= 0.1.4)
6
7
  multi_json
7
8
  rack
8
9
 
@@ -31,6 +32,7 @@ GEM
31
32
  redis (~> 3.0.0)
32
33
  i18n (0.6.1)
33
34
  json (1.7.7)
35
+ logcast (0.1.4)
34
36
  multi_json (1.7.2)
35
37
  rack (1.5.2)
36
38
  rake (10.0.4)
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: /Users/mgrosser/code/tools/request_recorder
3
3
  specs:
4
- request_recorder (0.2.3)
4
+ request_recorder (0.2.4)
5
5
  activerecord
6
+ logcast (>= 0.1.4)
6
7
  multi_json
7
8
  rack
8
9
 
@@ -20,6 +21,7 @@ GEM
20
21
  fakeredis (0.4.2)
21
22
  redis (~> 3.0.0)
22
23
  json (1.7.7)
24
+ logcast (0.1.4)
23
25
  multi_json (1.7.2)
24
26
  rack (1.1.6)
25
27
  rake (10.0.4)
@@ -1,8 +1,9 @@
1
1
  PATH
2
2
  remote: /Users/mgrosser/code/tools/request_recorder
3
3
  specs:
4
- request_recorder (0.2.3)
4
+ request_recorder (0.2.4)
5
5
  activerecord
6
+ logcast (>= 0.1.4)
6
7
  multi_json
7
8
  rack
8
9
 
@@ -31,6 +32,7 @@ GEM
31
32
  redis (~> 3.0.0)
32
33
  i18n (0.6.1)
33
34
  json (1.7.7)
35
+ logcast (0.1.4)
34
36
  multi_json (1.7.2)
35
37
  rack (1.5.2)
36
38
  rake (10.0.4)
@@ -1,20 +1,19 @@
1
1
  require "stringio"
2
2
  require "rack/request"
3
3
  require "rack/response"
4
- require "request_recorder/repeater"
5
4
  require "request_recorder/frontend"
6
5
  require "active_record"
7
6
  require "rack"
8
7
  require "rack/body_proxy" if defined?(Rack.release) && Rack.release >= "1.5"
9
8
  require "base64"
10
9
  require "multi_json"
10
+ require "logcast/rails"
11
11
 
12
12
  module RequestRecorder
13
13
  class Middleware
14
14
  MARKER = "request_recorder"
15
15
  MAX_STEPS = 100
16
16
  SEPARATOR = "-"
17
- NEED_AUTOFLUSH = (ActiveRecord::VERSION::MAJOR == 2)
18
17
  AUTH = :frontend_auth
19
18
 
20
19
  def initialize(app, options={})
@@ -154,27 +153,18 @@ module RequestRecorder
154
153
  string.gsub(/\e\[[\d;]+m/, "")
155
154
  end
156
155
 
157
- def capture_logging
158
- old = [
159
- ActiveRecord::Base.logger.instance_variable_get("@log"),
160
- (ActiveRecord::Base.logger.auto_flushing if NEED_AUTOFLUSH),
161
- ActiveRecord::Base.logger.level
162
- ]
163
-
156
+ def capture_logging(&block)
157
+ logger = ActiveRecord::Base.logger
164
158
  recorder = StringIO.new
165
- repeater = Repeater.new([recorder, old[0]])
159
+ debug_level(logger){ logger.subscribe(Logger.new(recorder), &block) }
160
+ recorder.string
161
+ end
166
162
 
167
- ActiveRecord::Base.logger.instance_variable_set("@log", repeater)
168
- ActiveRecord::Base.logger.auto_flushing = true if NEED_AUTOFLUSH
169
- ActiveRecord::Base.logger.level = Logger::DEBUG
163
+ def debug_level(logger)
164
+ old, logger.level = logger.level, Logger::DEBUG
170
165
  yield
171
- recorder.string
172
166
  ensure
173
- if old
174
- ActiveRecord::Base.logger.instance_variable_set("@log", old[0])
175
- ActiveRecord::Base.logger.auto_flushing = old[1] if NEED_AUTOFLUSH
176
- ActiveRecord::Base.logger.level = old[2]
177
- end
167
+ logger.level = old
178
168
  end
179
169
  end
180
170
  end
@@ -1,3 +1,3 @@
1
1
  module RequestRecorder
2
- VERSION = "0.2.4"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -12,4 +12,5 @@ Gem::Specification.new name, RequestRecorder::VERSION do |s|
12
12
  s.add_runtime_dependency "rack"
13
13
  s.add_runtime_dependency "multi_json"
14
14
  s.add_runtime_dependency "activerecord"
15
+ s.add_runtime_dependency "logcast", ">= 0.1.4"
15
16
  end
@@ -3,28 +3,27 @@ require "spec_helper"
3
3
  describe RequestRecorder do
4
4
  class FooError < RuntimeError;end
5
5
 
6
- let(:original_logger){ ActiveSupport::BufferedLogger.new("/dev/null").instance_variable_get("@log") }
7
- let(:activate_logger){ {"QUERY_STRING" => "request_recorder=10"} }
8
- let(:inner_app){ lambda{|env|
9
- Car.first
10
-
11
- (env["log"] || []).each { |line| ActiveRecord::Base.logger.info(line) }
12
-
13
- if env["raise"]
14
- # rails also logs errors
15
- ActiveRecord::Base.logger.error(env["raise"])
16
- raise FooError.new(env["raise"])
6
+ let(:activate_logger){{ "QUERY_STRING" => "request_recorder=10" }}
7
+ let(:middleware) { RequestRecorder::Middleware.new(inner_app, :store => RequestRecorder::RedisLogger.new(redis)) }
8
+ let(:inner_app) do
9
+ lambda do |env|
10
+ Car.first
11
+
12
+ (env["log"] || []).each { |line| ActiveRecord::Base.logger.info(line) }
13
+
14
+ if env["raise"]
15
+ # rails also logs errors
16
+ ActiveRecord::Base.logger.error(env["raise"])
17
+ raise FooError.new(env["raise"])
18
+ end
19
+ [200, {}, "assadasd"]
17
20
  end
18
- [200, {}, "assadasd"]
19
- } }
20
- let(:middleware){ RequestRecorder::Middleware.new(inner_app, :store => RequestRecorder::RedisLogger.new(redis)) }
21
+ end
21
22
  let(:redis){ FakeRedis::Redis.new }
22
23
  let(:redis_key){ RequestRecorder::RedisLogger::KEY }
23
24
  let(:existing_request_id){ redis.hset(redis_key, "123_456", "BEFORE") ; "123_456"}
24
25
 
25
26
  before do
26
- ActiveRecord::Base.logger.instance_variable_set("@log", original_logger)
27
- ActiveRecord::Base.logger.auto_flushing = 1000 if RequestRecorder::Middleware::NEED_AUTOFLUSH
28
27
  ActiveRecord::Base.logger.level = Logger::ERROR
29
28
  end
30
29
 
@@ -50,21 +49,6 @@ describe RequestRecorder do
50
49
  stored.values.last.should include "FooBarError"
51
50
  end
52
51
 
53
- it "still writes to the old log to keep us compliant with 'logging all requests'" do
54
- if ActiveRecord::VERSION::MAJOR == 2
55
- recorder = StringIO.new
56
- ActiveRecord::Base.logger.instance_variable_set("@log", recorder)
57
- middleware.call(activate_logger)
58
- recorder.string.should == stored.values.last
59
- else
60
- Tempfile.open("xx") do |f|
61
- ActiveRecord::Base.logger.instance_variable_set("@log", Logger.new(f.path))
62
- middleware.call(activate_logger)
63
- File.read(f.path).strip.should == stored.values.last.strip
64
- end
65
- end
66
- end
67
-
68
52
  it "starts with a given key" do
69
53
  middleware.call({"QUERY_STRING" => "request_recorder=10-abcdefg"})
70
54
  redis.hget(redis_key, "abcdefg").should include "SELECT"
@@ -120,9 +104,6 @@ describe RequestRecorder do
120
104
 
121
105
  it "restores the AR logger after executing" do
122
106
  middleware.call(activate_logger)
123
-
124
- ActiveRecord::Base.logger.instance_variable_get("@log").object_id.should == original_logger.object_id
125
- ActiveRecord::Base.logger.auto_flushing.should == 1000 if RequestRecorder::Middleware::NEED_AUTOFLUSH
126
107
  ActiveRecord::Base.logger.level.should == Logger::ERROR
127
108
  end
128
109
 
@@ -194,16 +175,6 @@ describe RequestRecorder do
194
175
  }
195
176
  end
196
177
 
197
- it "removes header length above max" do
198
- status, headers, body = middleware.call(
199
- "QUERY_STRING" => "request_recorder=10-xxx",
200
- "success" => true,
201
- "log" => Array.new(20).fill(("a" * 100))
202
- )
203
- headers["X-ChromeLogger-Data"].size.should be_within(200).of(1700)
204
- decode(headers)["rows"].inspect.should include '"Removed:", "12", "lines"' # tells users that something was removed
205
- end
206
-
207
178
  it "does not log without frontend_auth" do
208
179
  status, headers, body = middleware.call("QUERY_STRING" => "request_recorder=10-xxx")
209
180
  headers["X-ChromeLogger-Data"].should == nil
data/spec/spec_helper.rb CHANGED
@@ -1,13 +1,13 @@
1
- require "request_recorder"
2
- require "request_recorder/redis_logger"
3
- require "request_recorder/cache_logger"
4
-
5
1
  require "active_record"
6
2
  require "fakeredis"
7
3
  require "tempfile"
8
4
 
9
5
  ActiveRecord::Base.logger = ActiveSupport::BufferedLogger.new("/dev/null")
10
6
 
7
+ require "request_recorder"
8
+ require "request_recorder/redis_logger"
9
+ require "request_recorder/cache_logger"
10
+
11
11
  # connect
12
12
  ActiveRecord::Base.establish_connection(
13
13
  :adapter => "sqlite3",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: request_recorder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-17 00:00:00.000000000 Z
12
+ date: 2013-04-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -59,6 +59,22 @@ dependencies:
59
59
  - - ! '>='
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: logcast
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 0.1.4
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: 0.1.4
62
78
  description:
63
79
  email: michael@grosser.it
64
80
  executables: []
@@ -80,7 +96,6 @@ files:
80
96
  - lib/request_recorder/frontend.rb
81
97
  - lib/request_recorder/middleware.rb
82
98
  - lib/request_recorder/redis_logger.rb
83
- - lib/request_recorder/repeater.rb
84
99
  - lib/request_recorder/version.rb
85
100
  - request_recorder.gemspec
86
101
  - spec/request_recorder/cache_logger_spec.rb
@@ -104,7 +119,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
104
119
  version: '0'
105
120
  segments:
106
121
  - 0
107
- hash: 2258445014574956169
122
+ hash: 1116155128447744450
108
123
  required_rubygems_version: !ruby/object:Gem::Requirement
109
124
  none: false
110
125
  requirements:
@@ -113,7 +128,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
113
128
  version: '0'
114
129
  segments:
115
130
  - 0
116
- hash: 2258445014574956169
131
+ hash: 1116155128447744450
117
132
  requirements: []
118
133
  rubyforge_project:
119
134
  rubygems_version: 1.8.25
@@ -1,31 +0,0 @@
1
- module RequestRecorder
2
- class Repeater
3
- def initialize(targets)
4
- @targets = targets
5
- end
6
-
7
- # Rails 2
8
- def write(*args)
9
- @targets.each{|t| t.write(*args) }
10
- end
11
-
12
- # Rails 3
13
- def add(*args)
14
- @targets.each do |t|
15
- if t.respond_to?(:add)
16
- t.add(*args)
17
- else
18
- t.write("#{args[1]}\n")
19
- end
20
- end
21
- end
22
-
23
- def level=(x)
24
- @targets.each{|t| t.level = x if t.respond_to?(:level=) }
25
- end
26
-
27
- def level
28
- @targets.detect{|t| t.respond_to?(:level) }.level
29
- end
30
- end
31
- end