rack-spyup 0.0.2 → 0.1.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/.rspec +2 -0
- data/README.md +2 -0
- data/Rakefile +5 -0
- data/lib/rack/spyup.rb +25 -6
- data/lib/rack/spyup/configuration.rb +15 -0
- data/lib/rack/spyup/railtie.rb +27 -0
- data/lib/rack/spyup/version.rb +1 -1
- data/rack-spyup.gemspec +2 -0
- data/spec/lib/rack-spyup_spec.rb +150 -0
- data/spec/spec_helper.rb +36 -0
- data/wercker.yml +15 -0
- metadata +39 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 175c2c54f6ae21ef59b8775bda9aaf22f4eae6ed
|
4
|
+
data.tar.gz: 268aed09f1a0980a3b26fe1c068130f75ee032c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2a638629936907de7a34e93e75be8cfa742bc0919e2e8b895283788e6789582e56a9c74251110e4033ab87998371f5939c6a835dd95407611cd42ddbd9c76429
|
7
|
+
data.tar.gz: 2afe651048012d42ad6d60ad6c29e956f9b313aad16f2bd3f729b3964ea1812e6971d4adb91c262e34624c693e68712961c337f894a2478acf8d5a5501870a3c
|
data/.rspec
ADDED
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
Spying request and json response
|
4
4
|
|
5
|
+
[](https://app.wercker.com/project/bykey/badde83f7252323fde185c68212600ba)
|
6
|
+
|
5
7
|
## Installation
|
6
8
|
|
7
9
|
Add this line to your application's Gemfile:
|
data/Rakefile
CHANGED
data/lib/rack/spyup.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
require "rack/spyup/version"
|
2
|
+
require "rack/spyup/configuration"
|
2
3
|
require "logger"
|
3
4
|
|
4
5
|
module Rack
|
5
6
|
class SpyUp
|
6
|
-
def initialize(app, &
|
7
|
+
def initialize(app, &instance_configure)
|
7
8
|
@app = app
|
8
|
-
|
9
|
+
@colorize = true
|
10
|
+
@logger = self.class.config.logger
|
11
|
+
instance_configure.call(self) if block_given?
|
9
12
|
end
|
10
13
|
attr_reader :app
|
11
|
-
attr_accessor :logger
|
14
|
+
attr_accessor :logger, :colorize
|
12
15
|
|
13
16
|
def call(env)
|
14
17
|
return @app.call(env) if ignore_case?(env)
|
@@ -26,6 +29,16 @@ module Rack
|
|
26
29
|
return res.finish
|
27
30
|
end
|
28
31
|
|
32
|
+
class << self
|
33
|
+
def config(&global_configure)
|
34
|
+
@__config ||= Rack::SpyUp::Configuration.default
|
35
|
+
if block_given?
|
36
|
+
global_configure.call(@__config)
|
37
|
+
end
|
38
|
+
@__config
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
29
42
|
private
|
30
43
|
def ignore_case?(env)
|
31
44
|
# TODO more options to omit logging
|
@@ -102,9 +115,10 @@ Body:
|
|
102
115
|
end
|
103
116
|
|
104
117
|
def pretty_json(json)
|
105
|
-
|
106
|
-
|
107
|
-
|
118
|
+
formatted = JSON.pretty_unparse(JSON.parse(json))
|
119
|
+
formatted = CodeRay.scan(formatted, :json).terminal if colorize
|
120
|
+
|
121
|
+
formatted.gsub(/^/m, "\t")
|
108
122
|
end
|
109
123
|
|
110
124
|
def compose_response_headers(res)
|
@@ -117,15 +131,20 @@ Body:
|
|
117
131
|
end
|
118
132
|
|
119
133
|
def red(key)
|
134
|
+
return key unless colorize
|
120
135
|
"\e[31m#{key}\e[0m"
|
121
136
|
end
|
122
137
|
|
123
138
|
def cyan(value)
|
139
|
+
return value unless colorize
|
124
140
|
"\e[36m#{value}\e[0m"
|
125
141
|
end
|
126
142
|
|
127
143
|
def gray(value)
|
144
|
+
return value unless colorize
|
128
145
|
"\e[37m#{value}\e[0m"
|
129
146
|
end
|
130
147
|
end
|
131
148
|
end
|
149
|
+
|
150
|
+
require "rack/spyup/railtie" if defined?(Rails)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rack/spyup'
|
2
|
+
module Rack
|
3
|
+
class SpyUp
|
4
|
+
class Configuration
|
5
|
+
attr_accessor :enabled_environments, :logger
|
6
|
+
|
7
|
+
def self.default
|
8
|
+
new.tap do |config|
|
9
|
+
config.enabled_environments = %w(development)
|
10
|
+
config.logger = nil
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'rails/railtie'
|
2
|
+
require 'rack/spyup'
|
3
|
+
|
4
|
+
module Rack
|
5
|
+
class SpyUp
|
6
|
+
class Railtie < ::Rails::Railtie
|
7
|
+
config.rack_spyup = Rack::SpyUp.config
|
8
|
+
|
9
|
+
initializer "rack_spyup.initialize_middleware" do |app|
|
10
|
+
config = Rack::SpyUp.config
|
11
|
+
if Rails.env.to_s.in?(config.enabled_environments.map(&:to_s))
|
12
|
+
_logger = if config.logger && config.logger.respond_to?(:call)
|
13
|
+
config.logger.call()
|
14
|
+
elsif config.logger
|
15
|
+
config.logger
|
16
|
+
else
|
17
|
+
Rails.logger
|
18
|
+
end
|
19
|
+
|
20
|
+
app.middleware.insert 0, Rack::SpyUp do |mw|
|
21
|
+
mw.logger = _logger
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/rack/spyup/version.rb
CHANGED
data/rack-spyup.gemspec
CHANGED
@@ -24,4 +24,6 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency "bundler", "~> 1.3"
|
25
25
|
spec.add_development_dependency "rake"
|
26
26
|
spec.add_development_dependency "pry"
|
27
|
+
spec.add_development_dependency "rspec", "~> 2.14.0"
|
28
|
+
spec.add_development_dependency "rack-test"
|
27
29
|
end
|
@@ -0,0 +1,150 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'stringio'
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
describe Rack::SpyUp do
|
6
|
+
describe "should not smoke" do
|
7
|
+
before do
|
8
|
+
mock_app do
|
9
|
+
use Rack::SpyUp do |mw|
|
10
|
+
mw.logger = Logger.null_logger
|
11
|
+
end
|
12
|
+
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["OK"]]}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should be OK" do
|
17
|
+
expect {
|
18
|
+
get "/"
|
19
|
+
}.not_to raise_error
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should not affect response" do
|
23
|
+
get "/"
|
24
|
+
expect(last_response.body).to eq("OK")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "options" do
|
29
|
+
before do
|
30
|
+
@output = StringIO.new
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should contain colored log" do
|
34
|
+
_logger = Logger.new(@output)
|
35
|
+
mock_app do
|
36
|
+
use Rack::SpyUp do |mw|
|
37
|
+
mw.logger = _logger
|
38
|
+
end
|
39
|
+
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["OK"]]}
|
40
|
+
end
|
41
|
+
|
42
|
+
get "/hello"
|
43
|
+
@output.rewind
|
44
|
+
expect(@output.read).to match(/\e\[\d+m/)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should not contain colored log when configured" do
|
48
|
+
_logger = Logger.new(@output)
|
49
|
+
mock_app do
|
50
|
+
use Rack::SpyUp do |mw|
|
51
|
+
mw.logger = _logger
|
52
|
+
mw.colorize = false
|
53
|
+
end
|
54
|
+
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["OK"]]}
|
55
|
+
end
|
56
|
+
|
57
|
+
get "/hello"
|
58
|
+
@output.rewind
|
59
|
+
expect(@output.read).not_to match(/\e\[\d+m/)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe "should display request info" do
|
64
|
+
before do
|
65
|
+
@output = StringIO.new
|
66
|
+
_logger = Logger.new(@output)
|
67
|
+
|
68
|
+
mock_app do
|
69
|
+
use Rack::SpyUp do |mw|
|
70
|
+
mw.logger = _logger
|
71
|
+
mw.colorize = false
|
72
|
+
end
|
73
|
+
run lambda {|env| [200, {"Content-Type" => "text/html"}, ["OK"]]}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should print request info" do
|
78
|
+
header "Host", "udzura.example.jp"
|
79
|
+
get "/hello"
|
80
|
+
@output.rewind
|
81
|
+
expect(@output.read).to match(%r|GET http://udzura.example.jp/hello|)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should contain custom header info" do
|
85
|
+
header "X-Forwarder-For", "192.0.2.1,192.0.2.2"
|
86
|
+
header "X-Foobar", "true"
|
87
|
+
get "/"
|
88
|
+
@output.rewind
|
89
|
+
printed = @output.read
|
90
|
+
|
91
|
+
expect(printed).to match(/X-Forwarder-For: 192.0.2.1,192.0.2.2/)
|
92
|
+
expect(printed).to match(/X-Foobar: true/)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe "should display response info" do
|
97
|
+
before do
|
98
|
+
@output = StringIO.new
|
99
|
+
@logger = Logger.new(@output)
|
100
|
+
end
|
101
|
+
|
102
|
+
let(:body) do
|
103
|
+
{response: "OK"}.to_json
|
104
|
+
end
|
105
|
+
|
106
|
+
it "should print response info" do
|
107
|
+
_logger = @logger
|
108
|
+
_body = body
|
109
|
+
|
110
|
+
mock_app do
|
111
|
+
use Rack::SpyUp do |mw|
|
112
|
+
mw.logger = _logger
|
113
|
+
mw.colorize = false
|
114
|
+
end
|
115
|
+
run lambda {|env| [200, {"Content-Type" => "application/json"}, [_body]]}
|
116
|
+
end
|
117
|
+
|
118
|
+
get "/index.json"
|
119
|
+
@output.rewind
|
120
|
+
response = @output.read
|
121
|
+
|
122
|
+
expect(response).to match(/Content-Type: application\/json/)
|
123
|
+
expect(response).to match(/Content-Length: #{body.length}/)
|
124
|
+
expect(response).to match(/Body:\s+{\s+"response": "OK"\s+}/m)
|
125
|
+
end
|
126
|
+
|
127
|
+
it "should contain custom response info, such as header" do
|
128
|
+
_logger = @logger
|
129
|
+
_body = body
|
130
|
+
|
131
|
+
mock_app do
|
132
|
+
use Rack::SpyUp do |mw|
|
133
|
+
mw.logger = _logger
|
134
|
+
mw.colorize = false
|
135
|
+
end
|
136
|
+
run lambda {|env|
|
137
|
+
[200,
|
138
|
+
{"Content-Type" => "application/json",
|
139
|
+
"X-Powerd-By" => "PHP/4.1.10"},
|
140
|
+
[_body]]}
|
141
|
+
end
|
142
|
+
|
143
|
+
get "/index.json"
|
144
|
+
@output.rewind
|
145
|
+
response = @output.read
|
146
|
+
|
147
|
+
expect(response).to match(/X-Powerd-By: PHP\/4.1.10/)
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
|
+
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
|
+
# Require this file using `require "spec_helper"` to ensure that it is only
|
4
|
+
# loaded once.
|
5
|
+
#
|
6
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
7
|
+
require 'rack-spyup'
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
11
|
+
config.run_all_when_everything_filtered = true
|
12
|
+
# config.filter_run :focus
|
13
|
+
|
14
|
+
# Run specs in random order to surface order dependencies. If you find an
|
15
|
+
# order dependency and want to debug it, you can fix the order by providing
|
16
|
+
# the seed, which is printed after each run.
|
17
|
+
# --seed 1234
|
18
|
+
config.order = 'random'
|
19
|
+
|
20
|
+
require 'rack/test'
|
21
|
+
config.include Rack::Test::Methods
|
22
|
+
config.include Module.new {
|
23
|
+
def app
|
24
|
+
@app
|
25
|
+
end
|
26
|
+
|
27
|
+
def mock_app &builder
|
28
|
+
@app = Rack::Builder.new &builder
|
29
|
+
end
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
# extensions...
|
34
|
+
def Logger.null_logger
|
35
|
+
Logger.new(File.open(IO::NULL, 'w'))
|
36
|
+
end
|
data/wercker.yml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
box: wercker/ruby
|
2
|
+
# Build definition
|
3
|
+
# See the Ruby section on the wercker devcenter:
|
4
|
+
# http://devcenter.wercker.com/articles/languages/ruby.html
|
5
|
+
build:
|
6
|
+
# The steps that will be executed on build
|
7
|
+
steps:
|
8
|
+
# A step that executes `bundle install` command
|
9
|
+
- bundle-install
|
10
|
+
|
11
|
+
# A custom script step, name value is used in the UI
|
12
|
+
# and the code value contains the command that get executed
|
13
|
+
- script:
|
14
|
+
name: Running rake spec
|
15
|
+
code: bundle exec rake spec
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-spyup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Uchio KONDO
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-12-
|
11
|
+
date: 2013-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rack
|
@@ -80,6 +80,34 @@ dependencies:
|
|
80
80
|
- - '>='
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 2.14.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 2.14.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rack-test
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - '>='
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - '>='
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
83
111
|
description: Spying requests and responses with rack power
|
84
112
|
email:
|
85
113
|
- udzura@udzura.jp
|
@@ -89,6 +117,7 @@ extensions: []
|
|
89
117
|
extra_rdoc_files: []
|
90
118
|
files:
|
91
119
|
- .gitignore
|
120
|
+
- .rspec
|
92
121
|
- Gemfile
|
93
122
|
- LICENSE.txt
|
94
123
|
- README.md
|
@@ -100,8 +129,13 @@ files:
|
|
100
129
|
- examples/config.ru
|
101
130
|
- lib/rack-spyup.rb
|
102
131
|
- lib/rack/spyup.rb
|
132
|
+
- lib/rack/spyup/configuration.rb
|
133
|
+
- lib/rack/spyup/railtie.rb
|
103
134
|
- lib/rack/spyup/version.rb
|
104
135
|
- rack-spyup.gemspec
|
136
|
+
- spec/lib/rack-spyup_spec.rb
|
137
|
+
- spec/spec_helper.rb
|
138
|
+
- wercker.yml
|
105
139
|
homepage: https://github.com/udzura/rack-spyup
|
106
140
|
licenses:
|
107
141
|
- MIT
|
@@ -127,4 +161,6 @@ signing_key:
|
|
127
161
|
specification_version: 4
|
128
162
|
summary: Spying requests and responses with rack power, like json, msgpack, xml, and
|
129
163
|
so on...
|
130
|
-
test_files:
|
164
|
+
test_files:
|
165
|
+
- spec/lib/rack-spyup_spec.rb
|
166
|
+
- spec/spec_helper.rb
|