api_hammer 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -0
- data/lib/api_hammer/faraday/request_logger.rb +89 -0
- data/lib/api_hammer/request_logger.rb +1 -1
- data/lib/api_hammer/version.rb +1 -1
- data/test/faraday_request_logger_test.rb +44 -0
- metadata +19 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c7392029cd2bb252222f1f27c3040d6feb8ad6d
|
4
|
+
data.tar.gz: e93c54825807dc89e3772fd3221195f56d5aac0e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f7f7900b48a6fec0843e12cadd3bed80bf769ac818f806af2aa2f2aad09fb05d8159ec6c2e9e38ff84cda55dacb8e7ec63f6a2d59f96dbb926675063d1771c8a
|
7
|
+
data.tar.gz: c6179c9bde78883ad9fa6927b52ad56c2e63af4a9cbbd31aa70b538b0e7136fb3f7ea51b292746876d6cdd67b39ba85c7db832acf4a5faf9a50fc87f13413d5d
|
data/CHANGELOG.md
CHANGED
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'rack'
|
3
|
+
require 'term/ansicolor'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
if Faraday.respond_to?(:register_middleware)
|
7
|
+
Faraday.register_middleware(:request, :api_hammer_request_logger => proc { ApiHammer::Faraday::RequestLogger })
|
8
|
+
end
|
9
|
+
if Faraday::Request.respond_to?(:register_middleware)
|
10
|
+
Faraday::Request.register_middleware(:api_hammer_request_logger => proc { ApiHammer::Faraday::RequestLogger })
|
11
|
+
end
|
12
|
+
|
13
|
+
module ApiHammer
|
14
|
+
class Faraday
|
15
|
+
# Faraday middleware for logging.
|
16
|
+
#
|
17
|
+
# two lines:
|
18
|
+
#
|
19
|
+
# - an info line, colored prettily to show a brief summary of the request and response
|
20
|
+
# - a debug line of json to record all relevant info. this is a lot of stuff jammed into one line, not
|
21
|
+
# pretty, but informative.
|
22
|
+
class RequestLogger < ::Faraday::Middleware
|
23
|
+
include Term::ANSIColor
|
24
|
+
|
25
|
+
def initialize(app, logger, options={})
|
26
|
+
@app = app
|
27
|
+
@logger = logger
|
28
|
+
@options = options
|
29
|
+
end
|
30
|
+
|
31
|
+
def call(request_env)
|
32
|
+
began_at = Time.now
|
33
|
+
|
34
|
+
log_tags = Thread.current[:activesupport_tagged_logging_tags]
|
35
|
+
saved_log_tags = log_tags.dup if log_tags && log_tags.any?
|
36
|
+
|
37
|
+
request_body = request_env[:body].dup if request_env[:body]
|
38
|
+
|
39
|
+
@app.call(request_env).on_complete do |response_env|
|
40
|
+
now = Time.now
|
41
|
+
|
42
|
+
status_color = case response_env.status.to_i
|
43
|
+
when 200..299
|
44
|
+
:intense_green
|
45
|
+
when 400..499
|
46
|
+
:intense_yellow
|
47
|
+
when 500..599
|
48
|
+
:intense_red
|
49
|
+
else
|
50
|
+
:white
|
51
|
+
end
|
52
|
+
status_s = bold(send(status_color, response_env.status.to_s))
|
53
|
+
data = {
|
54
|
+
'request' => {
|
55
|
+
'method' => request_env[:method],
|
56
|
+
'uri' => request_env[:url].normalize.to_s,
|
57
|
+
'headers' => request_env.request_headers,
|
58
|
+
'body' => request_body,
|
59
|
+
}.reject{|k,v| v.nil? },
|
60
|
+
'response' => {
|
61
|
+
'status' => response_env.status,
|
62
|
+
'headers' => response_env.response_headers,
|
63
|
+
'body' => response_env.body,
|
64
|
+
}.reject{|k,v| v.nil? },
|
65
|
+
'processing' => {
|
66
|
+
'began_at' => began_at.utc.to_i,
|
67
|
+
'duration' => now - began_at,
|
68
|
+
'activesupport_tagged_logging_tags' => @log_tags,
|
69
|
+
}.reject{|k,v| v.nil? },
|
70
|
+
}
|
71
|
+
|
72
|
+
json_data = JSON.dump(data)
|
73
|
+
dolog = proc do
|
74
|
+
now_s = now.strftime('%Y-%m-%d %H:%M:%S %Z')
|
75
|
+
@logger.info "#{bold(intense_magenta('>'))} #{status_s} : #{bold(intense_magenta(request_env[:method].to_s.upcase))} #{intense_magenta(request_env[:url].normalize.to_s)} @ #{intense_magenta(now_s)}"
|
76
|
+
@logger.info json_data
|
77
|
+
end
|
78
|
+
|
79
|
+
# reapply log tags from the request if they are not applied
|
80
|
+
if @logger.respond_to?(:tagged) && saved_log_tags && Thread.current[:activesupport_tagged_logging_tags] != saved_log_tags
|
81
|
+
@logger.tagged(saved_log_tags, &dolog)
|
82
|
+
else
|
83
|
+
dolog.call
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -108,7 +108,7 @@ module ApiHammer
|
|
108
108
|
json_data = JSON.dump(data)
|
109
109
|
dolog = proc do
|
110
110
|
now_s = now.strftime('%Y-%m-%d %H:%M:%S %Z')
|
111
|
-
@logger.info "#{status_s} : #{bold(intense_cyan(request.request_method))} #{intense_cyan(request_uri.normalize)} @ #{
|
111
|
+
@logger.info "#{bold(intense_cyan('<'))} #{status_s} : #{bold(intense_cyan(request.request_method))} #{intense_cyan(request_uri.normalize)} @ #{intense_cyan(now_s)}"
|
112
112
|
@logger.info json_data
|
113
113
|
end
|
114
114
|
# do the logging with tags that applied to the request if appropriate
|
data/lib/api_hammer/version.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
proc { |p| $:.unshift(p) unless $:.any? { |lp| File.expand_path(lp) == p } }.call(File.expand_path('.', File.dirname(__FILE__)))
|
2
|
+
require 'helper'
|
3
|
+
require 'logger'
|
4
|
+
require 'stringio'
|
5
|
+
require 'api_hammer/faraday/request_logger'
|
6
|
+
|
7
|
+
describe ApiHammer::RequestLogger do
|
8
|
+
let(:logio) { StringIO.new }
|
9
|
+
let(:logger) { Logger.new(logio) }
|
10
|
+
|
11
|
+
it 'logs' do
|
12
|
+
conn = Faraday.new do |f|
|
13
|
+
f.use ApiHammer::Faraday::RequestLogger, logger
|
14
|
+
f.use Faraday::Adapter::Rack, proc { |env| [200, {}, []] }
|
15
|
+
end
|
16
|
+
conn.get '/'
|
17
|
+
assert_match(/200/, logio.string)
|
18
|
+
lines = logio.string.split("\n")
|
19
|
+
assert_equal(2, lines.size)
|
20
|
+
assert lines.last =~ /INFO -- : /
|
21
|
+
json_bit = $'
|
22
|
+
JSON.parse json_bit # should not raise
|
23
|
+
end
|
24
|
+
|
25
|
+
{200 => :intense_green, 400 => :intense_yellow, 500 => :intense_red, 300 => :white}.each do |status, color|
|
26
|
+
it "colors by #{status} status" do
|
27
|
+
conn = Faraday.new do |f|
|
28
|
+
f.use ApiHammer::Faraday::RequestLogger, logger
|
29
|
+
f.use Faraday::Adapter::Rack, proc { |env| [status, {}, []] }
|
30
|
+
end
|
31
|
+
conn.get '/'
|
32
|
+
assert(logio.string.include?(Term::ANSIColor.send(color, status.to_s)))
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'registers by name' do
|
37
|
+
conn = Faraday.new do |f|
|
38
|
+
f.request :api_hammer_request_logger, logger
|
39
|
+
f.use Faraday::Adapter::Rack, proc { |env| [200, {}, []] }
|
40
|
+
end
|
41
|
+
conn.get '/'
|
42
|
+
assert_match(/200/, logio.string)
|
43
|
+
end
|
44
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: api_hammer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ethan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-06-
|
11
|
+
date: 2014-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -108,6 +108,20 @@ dependencies:
|
|
108
108
|
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rack-test
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
111
125
|
- !ruby/object:Gem::Dependency
|
112
126
|
name: minitest
|
113
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -226,6 +240,7 @@ files:
|
|
226
240
|
- lib/api_hammer/active_record_cache_find_by.rb
|
227
241
|
- lib/api_hammer/check_required_params.rb
|
228
242
|
- lib/api_hammer/faraday/outputter.rb
|
243
|
+
- lib/api_hammer/faraday/request_logger.rb
|
229
244
|
- lib/api_hammer/halt.rb
|
230
245
|
- lib/api_hammer/public_instance_exec.rb
|
231
246
|
- lib/api_hammer/rails.rb
|
@@ -241,6 +256,7 @@ files:
|
|
241
256
|
- lib/api_hammer/weblink.rb
|
242
257
|
- test/active_record_cache_find_by_test.rb
|
243
258
|
- test/check_required_params_test.rb
|
259
|
+
- test/faraday_request_logger_test.rb
|
244
260
|
- test/halt_test.rb
|
245
261
|
- test/helper.rb
|
246
262
|
- test/public_instance_exec_test.rb
|
@@ -275,6 +291,7 @@ summary: an API tool
|
|
275
291
|
test_files:
|
276
292
|
- test/active_record_cache_find_by_test.rb
|
277
293
|
- test/check_required_params_test.rb
|
294
|
+
- test/faraday_request_logger_test.rb
|
278
295
|
- test/halt_test.rb
|
279
296
|
- test/helper.rb
|
280
297
|
- test/public_instance_exec_test.rb
|