request-replay 0.5.0 → 0.6.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/.gitignore +1 -1
- data/CHANGES.md +7 -0
- data/README.md +8 -5
- data/Rakefile +5 -14
- data/lib/request-replay/middleware.rb +3 -3
- data/lib/request-replay.rb +14 -5
- data/request-replay.gemspec +7 -3
- data/task/gemgem.rb +150 -154
- data/test/test_basic.rb +23 -5
- metadata +17 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 74c29ee7f631fdfaaddd0bcde2083d204a7123b9
|
4
|
+
data.tar.gz: 9ea9ce6b5e376a5fb7ea32a898b996aed9696b73
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29ee655a7da33ac820fa14fe8e7af2f517135ff500790437b7cbfb2d2f4f71c188943e73ad834cfdcb723467bd91d56294d075df454b7c8744487c257202dc9b
|
7
|
+
data.tar.gz: 2de2ed416688b4b8d2cbc3a368cabf1b7b7f9587ee736b1ae0b2725bbcd4af4a0dc46059b1b595d7978ea97bcc0222631f7926072ce6e50fdf02a26c5bd6bba9
|
data/.gitignore
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
pkg
|
1
|
+
/pkg/
|
2
2
|
*.rbc
|
data/CHANGES.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# CHANGES
|
2
2
|
|
3
|
+
## request-replay 0.6.0 -- 2013-10-01
|
4
|
+
|
5
|
+
* Added :read_wait option for waiting for the remote server responding.
|
6
|
+
* Changed the API a bit. Now pass :add_headers for adding some extra
|
7
|
+
headers to the replaying request. Useful for passing another Host or
|
8
|
+
a special User-Agent.
|
9
|
+
|
3
10
|
## request-replay 0.5.0 -- 2013-09-04
|
4
11
|
|
5
12
|
* Birthday!
|
data/README.md
CHANGED
@@ -30,7 +30,9 @@ overwrite in the original request.
|
|
30
30
|
|
31
31
|
``` ruby
|
32
32
|
require 'request-replay'
|
33
|
-
use RequestReplay::Middleware, 'localhost:8080',
|
33
|
+
use RequestReplay::Middleware, 'localhost:8080',
|
34
|
+
:add_headers => {'Host' => 'example.com'},
|
35
|
+
:read_wait => 5
|
34
36
|
run lambda{ |env| [200, {}, [env.inspect]] }
|
35
37
|
```
|
36
38
|
|
@@ -39,17 +41,18 @@ It's effectively the same as:
|
|
39
41
|
``` ruby
|
40
42
|
require 'request-replay'
|
41
43
|
use Class.new{
|
42
|
-
def initialize app, host,
|
43
|
-
@app, @host, @
|
44
|
+
def initialize app, host, options={}
|
45
|
+
@app, @host, @options = app, host, options
|
44
46
|
end
|
45
47
|
|
46
48
|
def call env
|
47
49
|
# We don't want to read the socket in a thread, so create it in main
|
48
50
|
# thread, and send the data in a thread as we don't care the responses
|
49
|
-
Thread.new(RequestReplay.new(env, @host, @
|
51
|
+
Thread.new(RequestReplay.new(env, @host, @options), &:start)
|
50
52
|
@app.call(env)
|
51
53
|
end
|
52
|
-
}, 'localhost:8080', 'Host' => 'example.com'
|
54
|
+
}, 'localhost:8080', :add_headers => {'Host' => 'example.com'},
|
55
|
+
:read_wait => 5
|
53
56
|
run lambda{ |env| [200, {}, [env.inspect]] }
|
54
57
|
```
|
55
58
|
|
data/Rakefile
CHANGED
@@ -3,20 +3,11 @@ begin
|
|
3
3
|
require "#{dir = File.dirname(__FILE__)}/task/gemgem"
|
4
4
|
rescue LoadError
|
5
5
|
sh 'git submodule update --init'
|
6
|
-
exec Gem.ruby, '-S',
|
6
|
+
exec Gem.ruby, '-S', $PROGRAM_NAME, *ARGV
|
7
7
|
end
|
8
8
|
|
9
|
-
Gemgem.dir
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
task 'gem:spec' do
|
14
|
-
Gemgem.spec = Gemgem.create do |s|
|
15
|
-
s.name = 'request-replay'
|
16
|
-
s.version = '0.5.0'
|
17
|
-
|
18
|
-
%w[bacon rack].each{ |g| s.add_development_dependency(g) }
|
19
|
-
end
|
20
|
-
|
21
|
-
Gemgem.write
|
9
|
+
Gemgem.init(dir) do |s|
|
10
|
+
s.name = 'request-replay'
|
11
|
+
s.version = '0.6.0'
|
12
|
+
%w[bacon muack rack].each{ |g| s.add_development_dependency(g) }
|
22
13
|
end
|
@@ -2,14 +2,14 @@
|
|
2
2
|
require 'request-replay'
|
3
3
|
|
4
4
|
class RequestReplay::Middleware
|
5
|
-
def initialize app, host,
|
6
|
-
@app, @host, @
|
5
|
+
def initialize app, host, options={}
|
6
|
+
@app, @host, @options = app, host, options
|
7
7
|
end
|
8
8
|
|
9
9
|
def call env
|
10
10
|
# We don't want to read the socket in a thread, so create it in main
|
11
11
|
# thread, and send the data in a thread as we don't care the responses
|
12
|
-
Thread.new(RequestReplay.new(env, @host, @
|
12
|
+
Thread.new(RequestReplay.new(env, @host, @options), &:start)
|
13
13
|
@app.call(env)
|
14
14
|
end
|
15
15
|
end
|
data/lib/request-replay.rb
CHANGED
@@ -9,8 +9,8 @@ class RequestReplay
|
|
9
9
|
HTTP_VERSION = 'HTTP/1.1'
|
10
10
|
RACK_INPUT = 'rack.input'
|
11
11
|
|
12
|
-
def initialize env, host,
|
13
|
-
@env, (@host, @port), @
|
12
|
+
def initialize env, host, options={}
|
13
|
+
@env, (@host, @port), @options = env, host.split(':', 2), options
|
14
14
|
if env[RACK_INPUT]
|
15
15
|
env[RACK_INPUT].rewind
|
16
16
|
@buf = StringIO.new
|
@@ -19,10 +19,20 @@ class RequestReplay
|
|
19
19
|
end
|
20
20
|
end
|
21
21
|
|
22
|
+
def add_headers
|
23
|
+
@options[:add_headers] || {}
|
24
|
+
end
|
25
|
+
|
26
|
+
def read_wait
|
27
|
+
@options[:read_wait] && Float(@options[:read_wait])
|
28
|
+
end
|
29
|
+
|
22
30
|
def start
|
23
31
|
write_request
|
24
32
|
write_headers
|
25
33
|
write_payload
|
34
|
+
sock.close_write
|
35
|
+
IO.select([sock], [], [], read_wait) if read_wait
|
26
36
|
yield(sock) if block_given?
|
27
37
|
ensure
|
28
38
|
sock.close
|
@@ -42,7 +52,7 @@ class RequestReplay
|
|
42
52
|
end
|
43
53
|
|
44
54
|
def request
|
45
|
-
"#{@env['REQUEST_METHOD']} #{request_path} #{HTTP_VERSION}"
|
55
|
+
"#{@env['REQUEST_METHOD'] || 'GET'} #{request_path} #{HTTP_VERSION}"
|
46
56
|
end
|
47
57
|
|
48
58
|
def headers
|
@@ -61,8 +71,7 @@ class RequestReplay
|
|
61
71
|
r
|
62
72
|
}.merge('Content-Type' => @env['CONTENT_TYPE' ],
|
63
73
|
'Content-Length' => @env['CONTENT_LENGTH']).
|
64
|
-
merge(
|
65
|
-
select{ |_, v| v }
|
74
|
+
merge(add_headers).select{ |_, v| v }
|
66
75
|
end
|
67
76
|
|
68
77
|
def capitalize_headers header
|
data/request-replay.gemspec
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
# stub: request-replay 0.6.0 ruby lib
|
2
3
|
|
3
4
|
Gem::Specification.new do |s|
|
4
5
|
s.name = "request-replay"
|
5
|
-
s.version = "0.
|
6
|
+
s.version = "0.6.0"
|
6
7
|
|
7
8
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
9
|
s.authors = ["Lin Jen-Shin (godfat)"]
|
9
|
-
s.date = "2013-
|
10
|
+
s.date = "2013-10-01"
|
10
11
|
s.description = "Replay the request via Rack env"
|
11
12
|
s.email = ["godfat (XD) godfat.org"]
|
12
13
|
s.files = [
|
@@ -27,7 +28,7 @@ Gem::Specification.new do |s|
|
|
27
28
|
s.homepage = "https://github.com/godfat/request-replay"
|
28
29
|
s.licenses = ["Apache License 2.0"]
|
29
30
|
s.require_paths = ["lib"]
|
30
|
-
s.rubygems_version = "2.
|
31
|
+
s.rubygems_version = "2.1.5"
|
31
32
|
s.summary = "Replay the request via Rack env"
|
32
33
|
s.test_files = ["test/test_basic.rb"]
|
33
34
|
|
@@ -36,13 +37,16 @@ Gem::Specification.new do |s|
|
|
36
37
|
|
37
38
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
38
39
|
s.add_development_dependency(%q<bacon>, [">= 0"])
|
40
|
+
s.add_development_dependency(%q<muack>, [">= 0"])
|
39
41
|
s.add_development_dependency(%q<rack>, [">= 0"])
|
40
42
|
else
|
41
43
|
s.add_dependency(%q<bacon>, [">= 0"])
|
44
|
+
s.add_dependency(%q<muack>, [">= 0"])
|
42
45
|
s.add_dependency(%q<rack>, [">= 0"])
|
43
46
|
end
|
44
47
|
else
|
45
48
|
s.add_dependency(%q<bacon>, [">= 0"])
|
49
|
+
s.add_dependency(%q<muack>, [">= 0"])
|
46
50
|
s.add_dependency(%q<rack>, [">= 0"])
|
47
51
|
end
|
48
52
|
end
|
data/task/gemgem.rb
CHANGED
@@ -1,14 +1,26 @@
|
|
1
1
|
|
2
|
-
require 'pathname'
|
3
|
-
|
4
2
|
module Gemgem
|
5
3
|
class << self
|
6
|
-
attr_accessor :dir, :spec
|
4
|
+
attr_accessor :dir, :spec, :spec_create
|
7
5
|
end
|
8
6
|
|
9
7
|
module_function
|
8
|
+
def gem_tag ; "#{spec.name}-#{spec.version}" ; end
|
9
|
+
def gem_path ; "#{pkg_dir}/#{gem_tag}.gem" ; end
|
10
|
+
def spec_path ; "#{dir}/#{spec.name}.gemspec" ; end
|
11
|
+
def pkg_dir ; "#{dir}/pkg" ; end
|
12
|
+
def escaped_dir; @escaped_dir ||= Regexp.escape(dir); end
|
13
|
+
|
14
|
+
def init dir, &block
|
15
|
+
self.dir = dir
|
16
|
+
$LOAD_PATH.unshift("#{dir}/lib")
|
17
|
+
ENV['RUBYLIB'] = "#{dir}/lib:#{ENV['RUBYLIB']}"
|
18
|
+
ENV['PATH'] = "#{dir}/bin:#{ENV['PATH']}"
|
19
|
+
self.spec_create = block
|
20
|
+
end
|
21
|
+
|
10
22
|
def create
|
11
|
-
|
23
|
+
spec = Gem::Specification.new do |s|
|
12
24
|
s.authors = ['Lin Jen-Shin (godfat)']
|
13
25
|
s.email = ['godfat (XD) godfat.org']
|
14
26
|
|
@@ -16,163 +28,146 @@ module Gemgem
|
|
16
28
|
s.summary = description.first
|
17
29
|
s.license = readme['LICENSE'].sub(/.+\n\n/, '').lines.first.strip
|
18
30
|
|
19
|
-
s.
|
20
|
-
s.
|
21
|
-
s.
|
22
|
-
s.
|
23
|
-
|
24
|
-
|
25
|
-
}
|
26
|
-
spec
|
27
|
-
spec
|
31
|
+
s.date = Time.now.strftime('%Y-%m-%d')
|
32
|
+
s.files = gem_files
|
33
|
+
s.test_files = test_files
|
34
|
+
s.executables = bin_files
|
35
|
+
end
|
36
|
+
spec_create.call(spec)
|
37
|
+
spec.homepage = "https://github.com/godfat/#{spec.name}"
|
38
|
+
self.spec = spec
|
28
39
|
end
|
29
40
|
|
30
|
-
def
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
ps.inject('HEADER' => ps.first){ |r, s, i|
|
39
|
-
r[s[/\w+/]] = s
|
40
|
-
r
|
41
|
-
}
|
41
|
+
def write
|
42
|
+
File.open(spec_path, 'w'){ |f| f << split_lines(spec.to_ruby) }
|
43
|
+
end
|
44
|
+
|
45
|
+
def split_lines ruby
|
46
|
+
ruby.gsub(/(.+?)\s*=\s*\[(.+?)\]/){ |s|
|
47
|
+
if $2.index(',')
|
48
|
+
"#{$1} = [\n #{$2.split(',').map(&:strip).join(",\n ")}]"
|
42
49
|
else
|
43
|
-
|
50
|
+
s
|
44
51
|
end
|
52
|
+
}
|
45
53
|
end
|
46
54
|
|
47
|
-
def
|
48
|
-
|
55
|
+
def strip_path path
|
56
|
+
strip_home_path(strip_cwd_path(path))
|
49
57
|
end
|
50
58
|
|
51
|
-
def
|
52
|
-
path
|
53
|
-
File.exist?("#{Gemgem.dir}/#{name}")
|
54
|
-
}
|
55
|
-
@changes ||=
|
56
|
-
if path
|
57
|
-
date = '\d+{4}\-\d+{2}\-\d{2}'
|
58
|
-
File.read(path).match(
|
59
|
-
/([^\n]+#{date}\n\n(.+?))(?=\n\n[^\n]+#{date}\n|\Z)/m)[1]
|
60
|
-
else
|
61
|
-
''
|
62
|
-
end
|
59
|
+
def strip_home_path path
|
60
|
+
path.sub(ENV['HOME'], '~')
|
63
61
|
end
|
64
62
|
|
65
|
-
def
|
66
|
-
|
67
|
-
"##{readme['DESCRIPTION'][/[^\n]+\n\n[^\n]+/]}\n\n" \
|
68
|
-
"### CHANGES:\n\n" \
|
69
|
-
"###{changes}\n\n" \
|
70
|
-
"##{readme['INSTALLATION']}\n\n" +
|
71
|
-
if readme['SYNOPSIS'] then "##{readme['SYNOPSIS'][/[^\n]+\n\n[^\n]+/]}"
|
72
|
-
else '' end
|
63
|
+
def strip_cwd_path path
|
64
|
+
path.sub(Dir.pwd, '.')
|
73
65
|
end
|
74
66
|
|
75
|
-
def
|
76
|
-
|
77
|
-
gem 'kramdown'
|
78
|
-
|
79
|
-
IO.popen('kramdown', 'r+') do |md|
|
80
|
-
md.puts Gemgem.ann_md
|
81
|
-
md.close_write
|
82
|
-
require 'nokogiri'
|
83
|
-
html = Nokogiri::XML.parse("<gemgem>#{md.read}</gemgem>")
|
84
|
-
html.css('*').each{ |n| n.delete('id') }
|
85
|
-
html.root.children.to_html
|
86
|
-
end
|
67
|
+
def git *args
|
68
|
+
`git --git-dir=#{dir}/.git #{args.join(' ')}`
|
87
69
|
end
|
88
70
|
|
89
|
-
def
|
90
|
-
|
91
|
-
"#{readme['DESCRIPTION']}\n\n" \
|
92
|
-
"#{readme['INSTALLATION']}\n\n" +
|
93
|
-
if readme['SYNOPSIS'] then "##{readme['SYNOPSIS']}\n\n" else '' end +
|
94
|
-
"## CHANGES:\n\n" \
|
95
|
-
"##{changes}\n\n"
|
71
|
+
def sh_git *args
|
72
|
+
Rake.sh('git', "--git-dir=#{dir}/.git", *args)
|
96
73
|
end
|
97
74
|
|
98
|
-
def
|
99
|
-
|
75
|
+
def sh_gem *args
|
76
|
+
Rake.sh(Gem.ruby, '-S', 'gem', *args)
|
100
77
|
end
|
101
78
|
|
102
|
-
def
|
103
|
-
|
104
|
-
f << split_lines(spec.to_ruby) }
|
79
|
+
def glob path=dir
|
80
|
+
Dir.glob("#{path}/**/*", File::FNM_DOTMATCH)
|
105
81
|
end
|
106
82
|
|
107
|
-
def
|
108
|
-
|
109
|
-
if
|
110
|
-
|
83
|
+
def readme
|
84
|
+
@readme ||=
|
85
|
+
if (path = "#{Gemgem.dir}/README.md") && File.exist?(path)
|
86
|
+
ps = "##{File.read(path)}".
|
87
|
+
scan(/((#+)[^\n]+\n\n.+?(?=(\n\n\2[^#\n]+\n)|\Z))/m).map(&:first)
|
88
|
+
ps.inject('HEADER' => ps.first){ |r, s, i|
|
89
|
+
r[s[/\w+/]] = s
|
90
|
+
r
|
91
|
+
}
|
111
92
|
else
|
112
|
-
|
93
|
+
{}
|
113
94
|
end
|
114
|
-
|
95
|
+
end
|
96
|
+
|
97
|
+
def description
|
98
|
+
# JRuby String#lines is returning an enumerator
|
99
|
+
@description ||= (readme['DESCRIPTION']||'').sub(/.+\n\n/, '').lines.to_a
|
115
100
|
end
|
116
101
|
|
117
102
|
def all_files
|
118
|
-
@all_files ||=
|
119
|
-
|
120
|
-
|
103
|
+
@all_files ||= fold_files(glob).sort
|
104
|
+
end
|
105
|
+
|
106
|
+
def fold_files files
|
107
|
+
files.inject([]){ |r, path|
|
108
|
+
if File.file?(path) && path !~ %r{/\.git(/|$)} &&
|
109
|
+
(rpath = path[%r{^#{escaped_dir}/(.*$)}, 1])
|
110
|
+
r << rpath
|
111
|
+
elsif File.symlink?(path) # walk into symlinks...
|
112
|
+
r.concat(fold_files(glob(File.expand_path(path,
|
113
|
+
File.readlink(path)))))
|
121
114
|
else
|
122
|
-
|
115
|
+
r
|
123
116
|
end
|
124
|
-
}
|
117
|
+
}
|
125
118
|
end
|
126
119
|
|
127
120
|
def gem_files
|
128
|
-
@gem_files ||= all_files
|
121
|
+
@gem_files ||= all_files.reject{ |f|
|
122
|
+
f =~ ignored_pattern && !git_files.include?(f)
|
123
|
+
}
|
129
124
|
end
|
130
125
|
|
131
|
-
def
|
132
|
-
@
|
133
|
-
|
126
|
+
def test_files
|
127
|
+
@test_files ||= gem_files.grep(%r{^test/(.+?/)*test_.+?\.rb$})
|
128
|
+
end
|
129
|
+
|
130
|
+
def bin_files
|
131
|
+
@bin_files ||= gem_files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
134
132
|
end
|
135
133
|
|
136
134
|
def git_files
|
137
135
|
@git_files ||= if File.exist?("#{dir}/.git")
|
138
|
-
|
136
|
+
git('ls-files').split("\n")
|
139
137
|
else
|
140
138
|
[]
|
141
139
|
end
|
142
140
|
end
|
143
141
|
|
144
|
-
|
145
|
-
|
146
|
-
path.children.select(&:file?).map{|file| file.to_s[(dir.size+1)..-1]} +
|
147
|
-
path.children.select(&:directory?).map{|dir| find_files(dir)}.flatten
|
142
|
+
def ignored_files
|
143
|
+
@ignored_files ||= all_files.grep(ignored_pattern)
|
148
144
|
end
|
149
145
|
|
150
|
-
def
|
151
|
-
@
|
152
|
-
gitignore.split("\n").reject{ |pattern|
|
153
|
-
pattern.strip == ''
|
154
|
-
}).map{ |pattern| %r{^([^/]+/)*?#{Regexp.escape(pattern)}(/[^/]+)*?$} }
|
146
|
+
def ignored_pattern
|
147
|
+
@ignored_pattern ||= Regexp.new(expand_patterns(gitignore).join('|'))
|
155
148
|
end
|
156
149
|
|
157
150
|
def expand_patterns pathes
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
151
|
+
# http://git-scm.com/docs/gitignore
|
152
|
+
pathes.flat_map{ |path|
|
153
|
+
case path
|
154
|
+
when %r{\*}
|
155
|
+
Regexp.escape(path).gsub(/\\\*/, '[^/]*')
|
156
|
+
when %r{^/}
|
157
|
+
"^#{Regexp.escape(path[1..-1])}"
|
158
|
+
else # we didn't implement negative pattern for now
|
159
|
+
Regexp.escape(path)
|
166
160
|
end
|
167
|
-
}
|
161
|
+
}
|
168
162
|
end
|
169
163
|
|
170
164
|
def gitignore
|
171
|
-
if File.exist?(path = "#{dir}/.gitignore")
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
165
|
+
@gitignore ||= if File.exist?(path = "#{dir}/.gitignore")
|
166
|
+
File.read(path).lines.
|
167
|
+
reject{ |l| l == /^\s*(#|\s+$)/ }.map(&:strip)
|
168
|
+
else
|
169
|
+
[]
|
170
|
+
end
|
176
171
|
end
|
177
172
|
end
|
178
173
|
|
@@ -180,22 +175,37 @@ namespace :gem do
|
|
180
175
|
|
181
176
|
desc 'Install gem'
|
182
177
|
task :install => [:build] do
|
183
|
-
|
178
|
+
Gemgem.sh_gem('install', Gemgem.gem_path)
|
184
179
|
end
|
185
180
|
|
186
181
|
desc 'Build gem'
|
187
182
|
task :build => [:spec] do
|
188
|
-
|
189
|
-
|
190
|
-
|
183
|
+
require 'fileutils'
|
184
|
+
require 'rubygems/package'
|
185
|
+
gem = nil
|
186
|
+
Dir.chdir(Gemgem.dir) do
|
187
|
+
gem = Gem::Package.build(Gem::Specification.load(Gemgem.spec_path))
|
188
|
+
FileUtils.mkdir_p(Gemgem.pkg_dir)
|
189
|
+
FileUtils.mv(gem, Gemgem.pkg_dir) # gem is relative path, but might be ok
|
190
|
+
end
|
191
|
+
puts "\e[35mGem built: \e[33m" \
|
192
|
+
"#{Gemgem.strip_path("#{Gemgem.pkg_dir}/#{gem}")}\e[0m"
|
193
|
+
end
|
194
|
+
|
195
|
+
desc 'Generate gemspec'
|
196
|
+
task :spec do
|
197
|
+
Gemgem.create
|
198
|
+
Gemgem.write
|
191
199
|
end
|
192
200
|
|
193
201
|
desc 'Release gem'
|
194
202
|
task :release => [:spec, :check, :build] do
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
203
|
+
Gemgem.module_eval do
|
204
|
+
sh_git('tag', Gemgem.gem_tag)
|
205
|
+
sh_git('push')
|
206
|
+
sh_git('push', '--tags')
|
207
|
+
sh_gem('push', Gemgem.gem_path)
|
208
|
+
end
|
199
209
|
end
|
200
210
|
|
201
211
|
task :check do
|
@@ -218,51 +228,37 @@ end # of gem namespace
|
|
218
228
|
|
219
229
|
desc 'Run tests in memory'
|
220
230
|
task :test do
|
231
|
+
next if Gemgem.test_files.empty?
|
232
|
+
|
221
233
|
require 'bacon'
|
222
234
|
Bacon.extend(Bacon::TestUnitOutput)
|
223
235
|
Bacon.summary_on_exit
|
224
|
-
|
225
|
-
Dir['./test/**/test_*.rb'].each{ |file| require file[0..-4] }
|
226
|
-
end
|
227
|
-
|
228
|
-
desc 'Run tests with shell'
|
229
|
-
task 'test:shell', :RUBY_OPTS do |t, args|
|
230
|
-
files = Dir['test/**/test_*.rb'].join(' ')
|
231
|
-
|
232
|
-
cmd = [Gem.ruby, args[:RUBY_OPTS],
|
233
|
-
'-I', 'lib', '-S', 'bacon', '--quiet', files]
|
234
|
-
|
235
|
-
sh(cmd.compact.join(' '))
|
236
|
+
Gemgem.test_files.each{ |file| require "#{Gemgem.dir}/#{file[0..-4]}" }
|
236
237
|
end
|
237
238
|
|
238
|
-
desc '
|
239
|
-
task
|
240
|
-
|
241
|
-
end
|
239
|
+
desc 'Remove ignored files'
|
240
|
+
task :clean => ['gem:spec'] do
|
241
|
+
next if Gemgem.ignored_files.empty?
|
242
242
|
|
243
|
-
|
244
|
-
|
245
|
-
puts
|
246
|
-
|
243
|
+
require 'fileutils'
|
244
|
+
trash = File.expand_path("~/.Trash/#{Gemgem.spec.name}")
|
245
|
+
puts "Move the following files into:" \
|
246
|
+
" \e[35m#{Gemgem.strip_path(trash)}\e[33m"
|
247
247
|
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
248
|
+
Gemgem.ignored_files.each do |file|
|
249
|
+
from = "#{Gemgem.dir}/#{file}"
|
250
|
+
to = "#{trash}/#{File.dirname(file)}"
|
251
|
+
puts Gemgem.strip_path(from)
|
252
252
|
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
" --files #{Gemgem.spec.extra_rdoc_files.join(',')}")
|
257
|
-
end
|
253
|
+
FileUtils.mkdir_p(to)
|
254
|
+
FileUtils.mv(from, to)
|
255
|
+
end
|
258
256
|
|
259
|
-
|
260
|
-
task :clean => ['gem:spec'] do
|
261
|
-
trash = "~/.Trash/#{Gemgem.spec.name}/"
|
262
|
-
sh "mkdir -p #{trash}" unless File.exist?(File.expand_path(trash))
|
263
|
-
Gemgem.ignored_files.each{ |file| sh "mv #{file} #{trash}" }
|
257
|
+
print "\e[0m"
|
264
258
|
end
|
265
259
|
|
266
260
|
task :default do
|
267
|
-
|
261
|
+
# Is there a reliable way to do this in the current process?
|
262
|
+
# It failed miserably before between Rake versions...
|
263
|
+
exec "#{Gem.ruby} -S #{$PROGRAM_NAME} -f #{Rake.application.rakefile} -T"
|
268
264
|
end
|
data/test/test_basic.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
|
2
2
|
require 'bacon'
|
3
|
+
require 'muack'
|
3
4
|
|
4
5
|
Bacon.summary_on_exit
|
6
|
+
include Muack::API
|
5
7
|
|
6
8
|
module Kernel
|
7
9
|
def eq? rhs
|
@@ -17,7 +19,8 @@ describe RequestReplay do
|
|
17
19
|
port = 1024 + rand(2**16 - 1024)
|
18
20
|
serv = TCPServer.new('localhost', port)
|
19
21
|
hopt = "#{host}:#{port}"
|
20
|
-
env = {'
|
22
|
+
env = {'REQUEST_METHOD' => 'GET',
|
23
|
+
'PATH_INFO' => '/', 'QUERY_STRING' => 'q=1',
|
21
24
|
'HTTP_HOST' => 'localhost',
|
22
25
|
'HTTP_PORK' => 'BEEF' }
|
23
26
|
|
@@ -29,10 +32,11 @@ describe RequestReplay do
|
|
29
32
|
response.value.should.eq(expected)
|
30
33
|
end
|
31
34
|
|
32
|
-
request = lambda do |env1, headers={}|
|
33
|
-
Thread.new(RequestReplay.new(
|
34
|
-
|
35
|
-
|
35
|
+
request = lambda do |env1, headers={}, read_wait=nil|
|
36
|
+
Thread.new(RequestReplay.new(env.merge(env1), hopt,
|
37
|
+
:add_headers => headers,
|
38
|
+
:read_wait => read_wait)) do |replay|
|
39
|
+
replay.start(&:read)
|
36
40
|
end
|
37
41
|
end
|
38
42
|
|
@@ -59,6 +63,20 @@ PAYLOAD\r
|
|
59
63
|
HTTP
|
60
64
|
end
|
61
65
|
|
66
|
+
should 'read_wait' do
|
67
|
+
read_wait = 5
|
68
|
+
mock(IO).select(satisfy{ |rs| rs.size == 1 &&
|
69
|
+
rs[0].kind_of?(IO) },
|
70
|
+
[], [], read_wait)
|
71
|
+
|
72
|
+
verify[request[{}, {}, read_wait], <<-HTTP]
|
73
|
+
GET /?q=1 HTTP/1.1\r
|
74
|
+
Host: localhost\r
|
75
|
+
Pork: BEEF\r
|
76
|
+
\r
|
77
|
+
HTTP
|
78
|
+
end
|
79
|
+
|
62
80
|
describe RequestReplay::Middleware do
|
63
81
|
app = Rack::Builder.app do
|
64
82
|
use RequestReplay::Middleware, hopt
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: request-replay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lin Jen-Shin (godfat)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bacon
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - '>='
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: muack
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rack
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -79,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
79
93
|
version: '0'
|
80
94
|
requirements: []
|
81
95
|
rubyforge_project:
|
82
|
-
rubygems_version: 2.
|
96
|
+
rubygems_version: 2.1.5
|
83
97
|
signing_key:
|
84
98
|
specification_version: 4
|
85
99
|
summary: Replay the request via Rack env
|