api_hammer 0.3.3 → 0.4.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.
- 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
|