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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 62d257b84cb30c253738ffe4485eac1a378d9443
4
- data.tar.gz: 804dfcd511a7c027f64d72eb62070f4c6698a058
3
+ metadata.gz: 5c7392029cd2bb252222f1f27c3040d6feb8ad6d
4
+ data.tar.gz: e93c54825807dc89e3772fd3221195f56d5aac0e
5
5
  SHA512:
6
- metadata.gz: 587cd1a5b4e437b1871dfbb890b1c333c9d427cd178f5af2dd3ef0b52de6eade49504ba460259eecd57e10ffefb8413bf8917f64f66f0ad82ccfdbdefd7e4493
7
- data.tar.gz: cf1a2c017ff9690c7245626a8609e56c4ec0a4d56cc102285913a7ac6132fa6a2090380cb1129b575175ded4aa7eadc0f61f77d47186f5ee2c4a6b5e86eee262
6
+ metadata.gz: f7f7900b48a6fec0843e12cadd3bed80bf769ac818f806af2aa2f2aad09fb05d8159ec6c2e9e38ff84cda55dacb8e7ec63f6a2d59f96dbb926675063d1771c8a
7
+ data.tar.gz: c6179c9bde78883ad9fa6927b52ad56c2e63af4a9cbbd31aa70b538b0e7136fb3f7ea51b292746876d6cdd67b39ba85c7db832acf4a5faf9a50fc87f13413d5d
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
1
+ # 0.4.0
2
+ - ApiHammer::Faraday::RequestLogger
3
+
1
4
  # 0.3.3
2
5
  - be a little lazier about initializing ActiveRecord::Base.finder_cache - only on first actual usage
3
6
 
@@ -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)} @ #{intense_magenta(now_s)}"
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
@@ -1,3 +1,3 @@
1
1
  module ApiHammer
2
- VERSION = "0.3.3"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -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.3.3
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-19 00:00:00.000000000 Z
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