puffing-billy 0.4.1 → 0.5.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 +7 -0
- data/Gemfile.lock +2 -2
- data/Guardfile +5 -5
- data/README.md +19 -1
- data/Rakefile +1 -1
- data/lib/billy.rb +17 -17
- data/lib/billy/cache.rb +30 -31
- data/lib/billy/config.rb +4 -2
- data/lib/billy/handlers/cache_handler.rb +5 -7
- data/lib/billy/handlers/handler.rb +2 -2
- data/lib/billy/handlers/proxy_handler.rb +16 -16
- data/lib/billy/handlers/request_handler.rb +6 -8
- data/lib/billy/handlers/stub_handler.rb +2 -2
- data/lib/billy/json_utils.rb +1 -2
- data/lib/billy/proxy_connection.rb +5 -5
- data/lib/billy/proxy_request_stub.rb +7 -7
- data/lib/billy/version.rb +1 -1
- data/lib/tasks/billy.rake +13 -15
- data/puffing-billy.gemspec +28 -28
- data/spec/features/examples/facebook_api_spec.rb +7 -7
- data/spec/features/examples/tumblr_api_spec.rb +6 -6
- data/spec/lib/billy/cache_spec.rb +14 -16
- data/spec/lib/billy/handlers/cache_handler_spec.rb +26 -24
- data/spec/lib/billy/handlers/handler_spec.rb +3 -3
- data/spec/lib/billy/handlers/proxy_handler_spec.rb +18 -16
- data/spec/lib/billy/handlers/request_handler_spec.rb +44 -42
- data/spec/lib/billy/handlers/stub_handler_spec.rb +14 -12
- data/spec/lib/billy/proxy_request_stub_spec.rb +55 -42
- data/spec/lib/billy/resource_utils_spec.rb +17 -17
- data/spec/lib/proxy_spec.rb +62 -70
- data/spec/spec_helper.rb +3 -3
- data/spec/support/test_server.rb +2 -2
- metadata +6 -6
@@ -4,31 +4,31 @@ describe Billy::JSONUtils do
|
|
4
4
|
describe 'sorting' do
|
5
5
|
describe '#sort_hash_keys' do
|
6
6
|
it 'sorts simple Hashes' do
|
7
|
-
data = {c: 'three',a: 'one',b: 'two'}
|
8
|
-
expected = {a: 'one',b: 'two',c: 'three'}
|
9
|
-
expect(Billy::JSONUtils
|
7
|
+
data = { c: 'three', a: 'one', b: 'two' }
|
8
|
+
expected = { a: 'one', b: 'two', c: 'three' }
|
9
|
+
expect(Billy::JSONUtils.sort_hash_keys(data)).to eq expected
|
10
10
|
end
|
11
11
|
|
12
12
|
it 'does not sort simple Arrays' do
|
13
|
-
data = [3,1,2,'two','three','one']
|
14
|
-
expect(Billy::JSONUtils
|
13
|
+
data = [3, 1, 2, 'two', 'three', 'one']
|
14
|
+
expect(Billy::JSONUtils.sort_hash_keys(data)).to eq data
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'does not sort multi-dimensional Arrays' do
|
18
|
-
data = [[3,2,1],[5,4,6],
|
19
|
-
expect(Billy::JSONUtils
|
18
|
+
data = [[3, 2, 1], [5, 4, 6], %w(b c a)]
|
19
|
+
expect(Billy::JSONUtils.sort_hash_keys(data)).to eq data
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'sorts multi-dimensional Hashes' do
|
23
|
-
data = {c: {l: 2,m: 3,k: 1},a: {f: 3,e: 2,d: 1},b: {i: 2,h: 1,j: 3}}
|
24
|
-
expected = {a: {d: 1,e: 2,f: 3},b: {h: 1,i: 2,j: 3},c: {k: 1,l: 2,m: 3}}
|
25
|
-
expect(Billy::JSONUtils
|
23
|
+
data = { c: { l: 2, m: 3, k: 1 }, a: { f: 3, e: 2, d: 1 }, b: { i: 2, h: 1, j: 3 } }
|
24
|
+
expected = { a: { d: 1, e: 2, f: 3 }, b: { h: 1, i: 2, j: 3 }, c: { k: 1, l: 2, m: 3 } }
|
25
|
+
expect(Billy::JSONUtils.sort_hash_keys(data)).to eq expected
|
26
26
|
end
|
27
27
|
|
28
28
|
it 'sorts abnormal data structures' do
|
29
|
-
data = {b: [
|
30
|
-
expected = {a: {d: 1,e: 2,f: 3},b: [
|
31
|
-
expect(Billy::JSONUtils
|
29
|
+
data = { b: [%w(b c a), { ab: 5, aa: 4, ac: 6 }, [3, 2, 1], { ba: true, bc: false, bb: nil }], a: { f: 3, e: 2, d: 1 } }
|
30
|
+
expected = { a: { d: 1, e: 2, f: 3 }, b: [%w(b c a), { aa: 4, ab: 5, ac: 6 }, [3, 2, 1], { ba: true, bb: nil, bc: false }] }
|
31
|
+
expect(Billy::JSONUtils.sort_hash_keys(data)).to eq expected
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -36,20 +36,20 @@ describe Billy::JSONUtils do
|
|
36
36
|
it 'sorts JSON' do
|
37
37
|
data = '{"c":"three","a":"one","b":"two"}'
|
38
38
|
expected = '{"a":"one","b":"two","c":"three"}'
|
39
|
-
expect(Billy::JSONUtils
|
39
|
+
expect(Billy::JSONUtils.sort_json(data)).to eq expected
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
44
|
describe 'json?' do
|
45
|
-
let(:json) { {a: '1'}.to_json }
|
45
|
+
let(:json) { { a: '1' }.to_json }
|
46
46
|
let(:non_json) { 'Not JSON.' }
|
47
47
|
|
48
48
|
it 'identifies JSON' do
|
49
|
-
expect(Billy::JSONUtils
|
49
|
+
expect(Billy::JSONUtils.json?(json)).to be true
|
50
50
|
end
|
51
51
|
it 'identifies non-JSON' do
|
52
|
-
expect(Billy::JSONUtils
|
52
|
+
expect(Billy::JSONUtils.json?(non_json)).to be false
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
data/spec/lib/proxy_spec.rb
CHANGED
@@ -8,11 +8,11 @@ shared_examples_for 'a proxy server' do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
it 'should proxy POST requests' do
|
11
|
-
expect(http.post('/echo', :
|
11
|
+
expect(http.post('/echo', foo: 'bar').body).to eql "POST /echo\nfoo=bar"
|
12
12
|
end
|
13
13
|
|
14
14
|
it 'should proxy PUT requests' do
|
15
|
-
expect(http.post('/echo', :
|
15
|
+
expect(http.post('/echo', foo: 'bar').body).to eql "POST /echo\nfoo=bar"
|
16
16
|
end
|
17
17
|
|
18
18
|
it 'should proxy HEAD requests' do
|
@@ -26,44 +26,43 @@ end
|
|
26
26
|
|
27
27
|
shared_examples_for 'a request stub' do
|
28
28
|
it 'should stub GET requests' do
|
29
|
-
proxy.stub("#{url}/foo")
|
30
|
-
and_return(:
|
29
|
+
proxy.stub("#{url}/foo")
|
30
|
+
.and_return(text: 'hello, GET!')
|
31
31
|
expect(http.get('/foo').body).to eql 'hello, GET!'
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'should stub GET response statuses' do
|
35
|
-
proxy.stub("#{url}/foo")
|
36
|
-
and_return(:
|
35
|
+
proxy.stub("#{url}/foo")
|
36
|
+
.and_return(code: 200)
|
37
37
|
expect(http.get('/foo').status).to eql 200
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'should stub POST requests' do
|
41
|
-
proxy.stub("#{url}/bar", :
|
42
|
-
and_return(:
|
43
|
-
expect(http.post('/bar', :
|
41
|
+
proxy.stub("#{url}/bar", method: :post)
|
42
|
+
.and_return(text: 'hello, POST!')
|
43
|
+
expect(http.post('/bar', foo: :bar).body).to eql 'hello, POST!'
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'should stub PUT requests' do
|
47
|
-
proxy.stub("#{url}/baz", :
|
48
|
-
and_return(:
|
49
|
-
expect(http.put('/baz', :
|
47
|
+
proxy.stub("#{url}/baz", method: :put)
|
48
|
+
.and_return(text: 'hello, PUT!')
|
49
|
+
expect(http.put('/baz', foo: :bar).body).to eql 'hello, PUT!'
|
50
50
|
end
|
51
51
|
|
52
52
|
it 'should stub HEAD requests' do
|
53
|
-
proxy.stub("#{url}/bap", :
|
54
|
-
and_return(:
|
53
|
+
proxy.stub("#{url}/bap", method: :head)
|
54
|
+
.and_return(headers: { 'HTTP-X-Hello' => 'hello, HEAD!' })
|
55
55
|
expect(http.head('/bap').headers['http-x-hello']).to eql 'hello, HEAD!'
|
56
56
|
end
|
57
57
|
|
58
58
|
it 'should stub DELETE requests' do
|
59
|
-
proxy.stub("#{url}/bam", :
|
60
|
-
and_return(:
|
59
|
+
proxy.stub("#{url}/bam", method: :delete)
|
60
|
+
.and_return(text: 'hello, DELETE!')
|
61
61
|
expect(http.delete('/bam').body).to eql 'hello, DELETE!'
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
65
|
shared_examples_for 'a cache' do
|
66
|
-
|
67
66
|
context 'whitelisted GET requests' do
|
68
67
|
it 'should not be cached' do
|
69
68
|
assert_noncached_url
|
@@ -93,7 +92,7 @@ shared_examples_for 'a cache' do
|
|
93
92
|
context 'with ports' do
|
94
93
|
before do
|
95
94
|
rack_app_url = URI(http.url_prefix)
|
96
|
-
Billy.config.whitelist = ["#{rack_app_url.host}:#{rack_app_url.port+1}"]
|
95
|
+
Billy.config.whitelist = ["#{rack_app_url.host}:#{rack_app_url.port + 1}"]
|
97
96
|
end
|
98
97
|
|
99
98
|
it 'should be cached' do
|
@@ -110,11 +109,11 @@ shared_examples_for 'a cache' do
|
|
110
109
|
it 'should be cached' do
|
111
110
|
r = http.get('/analytics?some_param=5')
|
112
111
|
expect(r.body).to eql 'GET /analytics'
|
113
|
-
expect
|
114
|
-
expect
|
112
|
+
expect do
|
113
|
+
expect do
|
115
114
|
r = http.get('/analytics?some_param=20')
|
116
|
-
|
117
|
-
|
115
|
+
end.to change { r.headers['HTTP-X-EchoCount'].to_i }.by(1)
|
116
|
+
end.to_not change { r.body }
|
118
117
|
end
|
119
118
|
end
|
120
119
|
|
@@ -128,11 +127,11 @@ shared_examples_for 'a cache' do
|
|
128
127
|
end
|
129
128
|
end
|
130
129
|
|
131
|
-
context
|
130
|
+
context 'cache persistence' do
|
132
131
|
let(:cache_path) { Billy.config.cache_path }
|
133
|
-
let(:cached_key) { proxy.cache.key('get',"#{url}/foo",
|
132
|
+
let(:cached_key) { proxy.cache.key('get', "#{url}/foo", '') }
|
134
133
|
let(:cached_file) do
|
135
|
-
f = cached_key +
|
134
|
+
f = cached_key + '.yml'
|
136
135
|
File.join(cache_path, f)
|
137
136
|
end
|
138
137
|
|
@@ -142,24 +141,24 @@ shared_examples_for 'a cache' do
|
|
142
141
|
end
|
143
142
|
|
144
143
|
after do
|
145
|
-
File.delete(cached_file) if File.
|
144
|
+
File.delete(cached_file) if File.exist?(cached_file)
|
146
145
|
end
|
147
146
|
|
148
|
-
context
|
147
|
+
context 'enabled' do
|
149
148
|
before { Billy.config.persist_cache = true }
|
150
149
|
|
151
150
|
it 'should persist' do
|
152
|
-
|
153
|
-
expect(File.
|
151
|
+
http.get('/foo')
|
152
|
+
expect(File.exist?(cached_file)).to be true
|
154
153
|
end
|
155
154
|
|
156
155
|
it 'should be read initially from persistent cache' do
|
157
156
|
File.open(cached_file, 'w') do |f|
|
158
157
|
cached = {
|
159
|
-
:
|
160
|
-
:
|
158
|
+
headers: {},
|
159
|
+
content: 'GET /foo cached'
|
161
160
|
}
|
162
|
-
f.write(cached.to_yaml(:
|
161
|
+
f.write(cached.to_yaml(Encoding: :Utf8))
|
163
162
|
end
|
164
163
|
|
165
164
|
r = http.get('/foo')
|
@@ -168,7 +167,7 @@ shared_examples_for 'a cache' do
|
|
168
167
|
|
169
168
|
context 'cache_request_headers requests' do
|
170
169
|
it 'should not be cached by default' do
|
171
|
-
|
170
|
+
http.get('/foo')
|
172
171
|
saved_cache = Billy.proxy.cache.fetch_from_persistence(cached_key)
|
173
172
|
expect(saved_cache.keys).not_to include :request_headers
|
174
173
|
end
|
@@ -179,7 +178,7 @@ shared_examples_for 'a cache' do
|
|
179
178
|
end
|
180
179
|
|
181
180
|
it 'should be cached' do
|
182
|
-
|
181
|
+
http.get('/foo')
|
183
182
|
saved_cache = Billy.proxy.cache.fetch_from_persistence(cached_key)
|
184
183
|
expect(saved_cache.keys).to include :request_headers
|
185
184
|
end
|
@@ -201,8 +200,8 @@ shared_examples_for 'a cache' do
|
|
201
200
|
before { Billy.config.non_whitelisted_requests_disabled = true }
|
202
201
|
|
203
202
|
it 'should raise error when disabled' do
|
204
|
-
#TODO: Suppress stderr output: https://gist.github.com/adamstegman/926858
|
205
|
-
expect{http.get('/foo')}.to raise_error(Faraday::Error::ConnectionFailed,
|
203
|
+
# TODO: Suppress stderr output: https://gist.github.com/adamstegman/926858
|
204
|
+
expect { http.get('/foo') }.to raise_error(Faraday::Error::ConnectionFailed, 'end of file reached')
|
206
205
|
end
|
207
206
|
end
|
208
207
|
|
@@ -215,7 +214,7 @@ shared_examples_for 'a cache' do
|
|
215
214
|
|
216
215
|
it 'should not cache non-successful response when enabled' do
|
217
216
|
http_error.get('/foo')
|
218
|
-
expect(File.
|
217
|
+
expect(File.exist?(cached_file)).to be false
|
219
218
|
end
|
220
219
|
|
221
220
|
it 'should cache successful response when enabled' do
|
@@ -238,22 +237,21 @@ shared_examples_for 'a cache' do
|
|
238
237
|
# 2) Restart the test servers if they aren't running
|
239
238
|
# 3) Change the test servers to start/stop for each test instead of before all
|
240
239
|
# 4) Remove the test server completely and rely on the server instantiated by the app
|
241
|
-
pending
|
240
|
+
pending 'Unable to test this without affecting the running test servers'
|
242
241
|
# If the 'pending' continues to execute the spec, 'skip' it to avoid EM errors.
|
243
242
|
# If 'pending' stops the test, 'skip' isn't defined but it won't hit this line.
|
244
|
-
skip
|
245
|
-
expect{http_error.get('/foo')}.to raise_error(Faraday::Error::ConnectionFailed)
|
243
|
+
skip 'Unable to test this without affecting the running test servers'
|
244
|
+
expect { http_error.get('/foo') }.to raise_error(Faraday::Error::ConnectionFailed)
|
246
245
|
end
|
247
246
|
end
|
248
|
-
|
249
247
|
end
|
250
248
|
|
251
|
-
context
|
249
|
+
context 'disabled' do
|
252
250
|
before { Billy.config.persist_cache = false }
|
253
251
|
|
254
252
|
it 'shouldnt persist' do
|
255
|
-
|
256
|
-
expect(File.
|
253
|
+
http.get('/foo')
|
254
|
+
expect(File.exist?(cached_file)).to be false
|
257
255
|
end
|
258
256
|
end
|
259
257
|
end
|
@@ -261,41 +259,39 @@ shared_examples_for 'a cache' do
|
|
261
259
|
def assert_noncached_url(url = '/foo')
|
262
260
|
r = http.get(url)
|
263
261
|
expect(r.body).to eql "GET #{url}"
|
264
|
-
expect
|
265
|
-
expect
|
262
|
+
expect do
|
263
|
+
expect do
|
266
264
|
r = http.get(url)
|
267
|
-
|
268
|
-
|
265
|
+
end.to change { r.headers['HTTP-X-EchoCount'].to_i }.by(1)
|
266
|
+
end.to_not change { r.body }
|
269
267
|
end
|
270
268
|
|
271
269
|
def assert_cached_url(url = '/foo')
|
272
270
|
r = http.get(url)
|
273
271
|
expect(r.body).to eql "GET #{url}"
|
274
|
-
expect
|
275
|
-
expect
|
272
|
+
expect do
|
273
|
+
expect do
|
276
274
|
r = http.get(url)
|
277
|
-
|
278
|
-
|
275
|
+
end.to_not change { r.headers['HTTP-X-EchoCount'] }
|
276
|
+
end.to_not change { r.body }
|
279
277
|
end
|
280
278
|
end
|
281
279
|
|
282
280
|
describe Billy::Proxy do
|
283
|
-
|
284
281
|
before do
|
285
282
|
# Adding non-valid Faraday options throw an error: https://github.com/arsduo/koala/pull/311
|
286
283
|
# Valid options: :request, :proxy, :ssl, :builder, :url, :parallel_manager, :params, :headers, :builder_class
|
287
284
|
faraday_options = {
|
288
|
-
:
|
289
|
-
:
|
285
|
+
proxy: { uri: proxy.url },
|
286
|
+
request: { timeout: 1.0 }
|
290
287
|
}
|
291
288
|
|
292
289
|
@http = Faraday.new @http_url, faraday_options
|
293
|
-
@https = Faraday.new @https_url, faraday_options.merge(:
|
290
|
+
@https = Faraday.new @https_url, faraday_options.merge(ssl: { verify: false })
|
294
291
|
@http_error = Faraday.new @error_url, faraday_options
|
295
292
|
end
|
296
293
|
|
297
294
|
context 'proxying' do
|
298
|
-
|
299
295
|
context 'HTTP' do
|
300
296
|
let!(:http) { @http }
|
301
297
|
it_should_behave_like 'a proxy server'
|
@@ -305,11 +301,9 @@ describe Billy::Proxy do
|
|
305
301
|
let!(:http) { @https }
|
306
302
|
it_should_behave_like 'a proxy server'
|
307
303
|
end
|
308
|
-
|
309
304
|
end
|
310
305
|
|
311
306
|
context 'stubbing' do
|
312
|
-
|
313
307
|
context 'HTTP' do
|
314
308
|
let!(:url) { @http_url }
|
315
309
|
let!(:http) { @http }
|
@@ -321,11 +315,9 @@ describe Billy::Proxy do
|
|
321
315
|
let!(:http) { @https }
|
322
316
|
it_should_behave_like 'a request stub'
|
323
317
|
end
|
324
|
-
|
325
318
|
end
|
326
319
|
|
327
320
|
context 'caching' do
|
328
|
-
|
329
321
|
it 'defaults to nil scope' do
|
330
322
|
expect(proxy.cache.scope).to be nil
|
331
323
|
end
|
@@ -350,7 +342,7 @@ describe Billy::Proxy do
|
|
350
342
|
let!(:http_error) { @http_error }
|
351
343
|
|
352
344
|
before do
|
353
|
-
proxy.cache.scope_to
|
345
|
+
proxy.cache.scope_to 'my_cache'
|
354
346
|
end
|
355
347
|
|
356
348
|
after do
|
@@ -360,7 +352,7 @@ describe Billy::Proxy do
|
|
360
352
|
it_should_behave_like 'a cache'
|
361
353
|
|
362
354
|
it 'uses the cache scope' do
|
363
|
-
expect(proxy.cache.scope).to eq(
|
355
|
+
expect(proxy.cache.scope).to eq('my_cache')
|
364
356
|
end
|
365
357
|
|
366
358
|
it 'can be reset to the default scope' do
|
@@ -369,21 +361,21 @@ describe Billy::Proxy do
|
|
369
361
|
end
|
370
362
|
|
371
363
|
it 'can execute a block against a cache scope' do
|
372
|
-
expect(proxy.cache.scope).to eq
|
373
|
-
proxy.cache.with_scope
|
374
|
-
expect(proxy.cache.scope).to eq
|
364
|
+
expect(proxy.cache.scope).to eq 'my_cache'
|
365
|
+
proxy.cache.with_scope 'another_cache' do
|
366
|
+
expect(proxy.cache.scope).to eq 'another_cache'
|
375
367
|
end
|
376
|
-
expect(proxy.cache.scope).to eq
|
368
|
+
expect(proxy.cache.scope).to eq 'my_cache'
|
377
369
|
end
|
378
370
|
|
379
371
|
it 'requires a block to be passed to with_scope' do
|
380
|
-
expect {proxy.cache.with_scope
|
372
|
+
expect { proxy.cache.with_scope 'some_scope' }.to raise_error ArgumentError
|
381
373
|
end
|
382
374
|
|
383
375
|
it 'should have different keys for the same request under a different scope' do
|
384
|
-
args = ['get',"#{url}/foo",
|
376
|
+
args = ['get', "#{url}/foo", '']
|
385
377
|
key = proxy.cache.key(*args)
|
386
|
-
proxy.cache.with_scope
|
378
|
+
proxy.cache.with_scope 'another_cache' do
|
387
379
|
expect(proxy.cache.key(*args)).to_not eq key
|
388
380
|
end
|
389
381
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
Dir[File.expand_path(
|
1
|
+
Dir[File.expand_path('../support/**/*.rb', __FILE__)].each { |f| require f }
|
2
2
|
|
3
3
|
require 'pry'
|
4
4
|
require 'billy/rspec'
|
5
5
|
require 'rack'
|
6
6
|
require 'logger'
|
7
7
|
|
8
|
-
Capybara.app = Rack::Directory.new(File.expand_path(
|
8
|
+
Capybara.app = Rack::Directory.new(File.expand_path('../../examples', __FILE__))
|
9
9
|
Capybara.javascript_driver = :poltergeist_billy
|
10
10
|
|
11
11
|
Billy.configure do |config|
|
12
|
-
config.logger = Logger.new(File.expand_path(
|
12
|
+
config.logger = Logger.new(File.expand_path('../../log/test.log', __FILE__))
|
13
13
|
end
|
14
14
|
|
15
15
|
RSpec.configure do |config|
|
data/spec/support/test_server.rb
CHANGED
@@ -62,8 +62,8 @@ module Billy
|
|
62
62
|
if ssl
|
63
63
|
http_server.ssl = true
|
64
64
|
http_server.ssl_options = {
|
65
|
-
:
|
66
|
-
:
|
65
|
+
private_key_file: File.expand_path('../../fixtures/test-server.key', __FILE__),
|
66
|
+
cert_chain_file: File.expand_path('../../fixtures/test-server.crt', __FILE__)
|
67
67
|
}
|
68
68
|
end
|
69
69
|
http_server.start
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: puffing-billy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Olly Smith
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -224,16 +224,16 @@ dependencies:
|
|
224
224
|
name: em-http-request
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
226
226
|
requirements:
|
227
|
-
- - "
|
227
|
+
- - "~>"
|
228
228
|
- !ruby/object:Gem::Version
|
229
|
-
version:
|
229
|
+
version: 1.1.0
|
230
230
|
type: :runtime
|
231
231
|
prerelease: false
|
232
232
|
version_requirements: !ruby/object:Gem::Requirement
|
233
233
|
requirements:
|
234
|
-
- - "
|
234
|
+
- - "~>"
|
235
235
|
- !ruby/object:Gem::Version
|
236
|
-
version:
|
236
|
+
version: 1.1.0
|
237
237
|
- !ruby/object:Gem::Dependency
|
238
238
|
name: eventmachine_httpserver
|
239
239
|
requirement: !ruby/object:Gem::Requirement
|