muxer 0.1.3 → 0.2.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: 9fdf620ee075fb5ecd4d369432354e23e1aeb303
4
- data.tar.gz: c86862b06e44353d5b23d6f5b151d03d4212af1b
3
+ metadata.gz: 8939fea35a80bfeef5db55769e7a33139fa6b56d
4
+ data.tar.gz: 25e24c9494a923b310fb3148711f0edb974535b5
5
5
  SHA512:
6
- metadata.gz: 44aecd28114fcd816ff56d3805ba3ed0fcf187f5e2ed526b5a5c8171c25574beb9037670765aaf6c1f11f952517c1678efcefa5f545feff8cc8f8d562e08bdc6
7
- data.tar.gz: 8bb309f0a9876ca7c0f2856f234271e41d6195752b0f6ff2970c7c53c730227ca37084713591ebca76180e03c2315a0547da2c29b5db13bb982b7bfc6c0510bd
6
+ metadata.gz: 2dc03106231b3d0878709abfd4fabec810bdf9a322b7636eb048430743dbccde95ab2ca026a0caebb92d6732d5a1ddca6ad46e6e91daa84ac87560ba7e807d6c
7
+ data.tar.gz: 2e627c3684ceddc10c56a7f6dd2e73be297d1a2e85c0b02eea69d00edc8dd902e84afb9ca40661210452cf97d5407679607155b0f17d5e849bae2d7e14fdc9a0
data/.travis.yml CHANGED
@@ -9,4 +9,8 @@ rvm:
9
9
  script: bundle exec rspec spec
10
10
  addons:
11
11
  code_climate:
12
- repo_token: 6aa82237af30a07e040f64f0a184915522cdeead2da8df84b3a634bc9f189064
12
+ repo_token: 6aa82237af30a07e040f64f0a184915522cdeead2da8df84b3a634bc9f189064
13
+ notifications:
14
+ email:
15
+ on_success: never
16
+ on_failure: change
@@ -7,10 +7,22 @@ module Muxer
7
7
  @timeout = nil
8
8
  end
9
9
 
10
- def add_url(url, timeout = nil)
10
+ def add_url(url, options = {})
11
+ options.keys.each do |key|
12
+ options[key.to_sym] = options.delete(key)
13
+ end
14
+ options = {timeout: nil, method: :get, params: {}}.merge(options)
15
+ timeout =
11
16
  request = Request.new
12
17
  request.url = url
13
- request.timeout = timeout if timeout
18
+ options.each do |key, val|
19
+ next unless request.respond_to? ("#{key}=".to_sym)
20
+ request.send("#{key}=".to_sym, val) if val
21
+ end
22
+ add_request request
23
+ end
24
+
25
+ def add_request(request)
14
26
  requests << request
15
27
  end
16
28
 
data/lib/muxer/request.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Muxer
2
2
  class Request
3
- attr_accessor :url, :timeout, :headers
3
+ attr_accessor :url, :timeout, :headers, :params
4
4
  attr_reader :method, :completed, :error
5
5
 
6
6
  alias_method :completed?, :completed
@@ -9,6 +9,7 @@ module Muxer
9
9
  @completed = false
10
10
  @timeout = 10
11
11
  @headers = {}
12
+ @params = {}
12
13
  @request = nil
13
14
  @error = nil
14
15
  end
@@ -24,8 +25,16 @@ module Muxer
24
25
  connect_timeout: timeout,
25
26
  inactivity_timeout: timeout,
26
27
  )
28
+ options = {
29
+ head: headers
30
+ }
31
+ if [:post, :put].include? method
32
+ options[:body] = params
33
+ else
34
+ options[:query] = params
35
+ end
27
36
  @request = http.public_send(method,
28
- head: headers,
37
+ options
29
38
  )
30
39
 
31
40
  @request.callback { @completed = true }
@@ -34,7 +43,9 @@ module Muxer
34
43
  end
35
44
 
36
45
  def response
37
- @request.response
46
+ if @request
47
+ @request.response
48
+ end
38
49
  end
39
50
  end
40
51
  end
data/lib/muxer/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Muxer
2
- VERSION = '0.1.3'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -0,0 +1,38 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://httpbin.org/post
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Server:
16
+ - nginx
17
+ Date:
18
+ - Wed, 15 Apr 2015 16:28:34 GMT
19
+ Content-Type:
20
+ - application/json
21
+ Content-Length:
22
+ - '326'
23
+ Connection:
24
+ - close
25
+ Access-Control-Allow-Origin:
26
+ - '*'
27
+ Access-Control-Allow-Credentials:
28
+ - 'true'
29
+ body:
30
+ encoding: UTF-8
31
+ string: "{\n \"args\": {}, \n \"data\": \"\", \n \"files\": {}, \n \"form\":
32
+ {}, \n \"headers\": {\n \"Content-Length\": \"0\", \n \"Content-Type\":
33
+ \"application/x-www-form-urlencoded\", \n \"Host\": \"httpbin.org\", \n
34
+ \ \"User-Agent\": \"EventMachine HttpClient\"\n }, \n \"json\": null,
35
+ \n \"origin\": \"72.92.31.249\", \n \"url\": \"https://httpbin.org/post\"\n}\n"
36
+ http_version:
37
+ recorded_at: Wed, 15 Apr 2015 16:28:37 GMT
38
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,38 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://httpbin.org/post
6
+ body:
7
+ encoding: US-ASCII
8
+ string: test=success
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Server:
16
+ - nginx
17
+ Date:
18
+ - Wed, 15 Apr 2015 16:28:34 GMT
19
+ Content-Type:
20
+ - application/json
21
+ Content-Length:
22
+ - '352'
23
+ Connection:
24
+ - close
25
+ Access-Control-Allow-Origin:
26
+ - '*'
27
+ Access-Control-Allow-Credentials:
28
+ - 'true'
29
+ body:
30
+ encoding: UTF-8
31
+ string: "{\n \"args\": {}, \n \"data\": \"\", \n \"files\": {}, \n \"form\":
32
+ {\n \"test\": \"success\"\n }, \n \"headers\": {\n \"Content-Length\":
33
+ \"12\", \n \"Content-Type\": \"application/x-www-form-urlencoded\", \n
34
+ \ \"Host\": \"httpbin.org\", \n \"User-Agent\": \"EventMachine HttpClient\"\n
35
+ \ }, \n \"json\": null, \n \"origin\": \"72.92.31.249\", \n \"url\": \"https://httpbin.org/post\"\n}\n"
36
+ http_version:
37
+ recorded_at: Wed, 15 Apr 2015 16:28:37 GMT
38
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,38 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: put
5
+ uri: https://httpbin.org/put
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Server:
16
+ - nginx
17
+ Date:
18
+ - Wed, 15 Apr 2015 16:28:34 GMT
19
+ Content-Type:
20
+ - application/json
21
+ Content-Length:
22
+ - '325'
23
+ Connection:
24
+ - close
25
+ Access-Control-Allow-Origin:
26
+ - '*'
27
+ Access-Control-Allow-Credentials:
28
+ - 'true'
29
+ body:
30
+ encoding: UTF-8
31
+ string: "{\n \"args\": {}, \n \"data\": \"\", \n \"files\": {}, \n \"form\":
32
+ {}, \n \"headers\": {\n \"Content-Length\": \"0\", \n \"Content-Type\":
33
+ \"application/x-www-form-urlencoded\", \n \"Host\": \"httpbin.org\", \n
34
+ \ \"User-Agent\": \"EventMachine HttpClient\"\n }, \n \"json\": null,
35
+ \n \"origin\": \"72.92.31.249\", \n \"url\": \"https://httpbin.org/put\"\n}\n"
36
+ http_version:
37
+ recorded_at: Wed, 15 Apr 2015 16:28:37 GMT
38
+ recorded_with: VCR 2.9.3
@@ -0,0 +1,38 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: put
5
+ uri: https://httpbin.org/put
6
+ body:
7
+ encoding: US-ASCII
8
+ string: test=success
9
+ headers: {}
10
+ response:
11
+ status:
12
+ code: 200
13
+ message: OK
14
+ headers:
15
+ Server:
16
+ - nginx
17
+ Date:
18
+ - Wed, 15 Apr 2015 16:28:34 GMT
19
+ Content-Type:
20
+ - application/json
21
+ Content-Length:
22
+ - '351'
23
+ Connection:
24
+ - close
25
+ Access-Control-Allow-Origin:
26
+ - '*'
27
+ Access-Control-Allow-Credentials:
28
+ - 'true'
29
+ body:
30
+ encoding: UTF-8
31
+ string: "{\n \"args\": {}, \n \"data\": \"\", \n \"files\": {}, \n \"form\":
32
+ {\n \"test\": \"success\"\n }, \n \"headers\": {\n \"Content-Length\":
33
+ \"12\", \n \"Content-Type\": \"application/x-www-form-urlencoded\", \n
34
+ \ \"Host\": \"httpbin.org\", \n \"User-Agent\": \"EventMachine HttpClient\"\n
35
+ \ }, \n \"json\": null, \n \"origin\": \"72.92.31.249\", \n \"url\": \"https://httpbin.org/put\"\n}\n"
36
+ http_version:
37
+ recorded_at: Wed, 15 Apr 2015 16:28:37 GMT
38
+ recorded_with: VCR 2.9.3
@@ -1,49 +1,68 @@
1
1
  require 'spec_helper'
2
2
 
3
+ class Muxer::TestRequest < Muxer::Request
4
+ def test_timeout=(timeout)
5
+ @test_timeout = timeout
6
+ end
7
+
8
+ def test_timeout
9
+ @test_timeout ||= 0.0001
10
+ end
11
+
12
+ def process!
13
+ EM::Timer.new(test_timeout) do
14
+ @completed = true
15
+ end
16
+
17
+ return self
18
+ end
19
+
20
+ end
3
21
  RSpec.describe Muxer::Multiplexer do
22
+
23
+ def new_request(url, timeout = nil, test_timeout = nil)
24
+ request = Muxer::TestRequest.new
25
+ request.url = url
26
+ request.timeout = timeout if timeout
27
+ request.test_timeout = test_timeout if test_timeout
28
+ request
29
+ end
30
+
4
31
  let(:multiplexer) { Muxer::Multiplexer.new }
5
32
 
6
33
  it 'kills requests with a timeout' do
7
- VCR.use_cassette('muxer/multiplexer/with_a_timeout') do
8
- multiplexer.add_url('https://github.com//', 0.0001)
9
- response = multiplexer.execute
34
+ multiplexer.add_request(new_request('https://github.com/', 0.0001, 0.01))
35
+ response = multiplexer.execute
10
36
 
11
- expect(response[:succeeded].count).to eq(0)
12
- expect(response[:failed].count).to eq(1)
13
- end
37
+ expect(response[:succeeded].count).to eq(0)
38
+ expect(response[:failed].count).to eq(1)
14
39
  end
15
40
 
16
41
  it 'lets a request wait on the longer one' do
17
- VCR.use_cassette('muxer/multiplexer/with_one_timeout') do
18
- multiplexer.add_url('https://github.com/', 0.0001)
19
- multiplexer.add_url('https://codeclimate.com/', 2)
20
- response = multiplexer.execute
42
+ multiplexer.add_request(new_request('https://github.com/', 0.0001, 0.0002))
43
+ multiplexer.add_request(new_request('https://codeclimate.com/', 2, 0.002))
44
+ response = multiplexer.execute
21
45
 
22
- expect(response[:succeeded].count).to eq(2)
23
- expect(response[:failed].count).to eq(0)
24
- end
46
+ expect(response[:succeeded].count).to eq(2)
47
+ expect(response[:failed].count).to eq(0)
25
48
  end
26
49
 
27
50
  it 'kills requests with a global timeout' do
28
- VCR.use_cassette('muxer/multiplexer/with_a_global_timeout') do
29
- multiplexer.add_url('https://github.com/')
30
- multiplexer.timeout = 0.0001
31
- response = multiplexer.execute
51
+ multiplexer.add_request(new_request('https://github.com/', nil, 0.002))
52
+ multiplexer.timeout = 0.0001
53
+ response = multiplexer.execute
32
54
 
33
- expect(response[:succeeded].count).to eq(0)
34
- expect(response[:failed].count).to eq(1)
35
- end
55
+ expect(response[:succeeded].count).to eq(0)
56
+ expect(response[:failed].count).to eq(1)
36
57
  end
37
58
 
38
59
  it 'kills one of two requests with a global timeout' do
39
- VCR.use_cassette('muxer/multiplexer/with_global_timeout') do
40
- multiplexer.add_url('https://github.com/')
41
- multiplexer.add_url('https://www.google.com/')
42
- multiplexer.timeout = 0.2
43
- response = multiplexer.execute
44
-
45
- expect(response[:succeeded].count).to eq(1)
46
- expect(response[:failed].count).to eq(1)
47
- end
60
+ multiplexer.add_request(new_request('https://github.com/', nil, 1.0))
61
+ multiplexer.add_request(new_request('https://www.google.com/', nil, 0.00001))
62
+ multiplexer.timeout = 0.0001
63
+ response = multiplexer.execute
64
+
65
+ expect(response[:succeeded].count).to eq(1)
66
+ expect(response[:failed].count).to eq(1)
48
67
  end
49
68
  end
data/spec/muxer_spec.rb CHANGED
@@ -42,5 +42,59 @@ RSpec.describe Muxer, "execute" do
42
42
  end
43
43
  end
44
44
 
45
+ it 'can make a POST' do
46
+ VCR.use_cassette('muxer/post/can') do
47
+ response = Muxer.execute do |muxer|
48
+ muxer.add_url 'https://httpbin.org/post', method: :post
49
+ end
50
+ expect(response[:succeeded]).to be_kind_of(Array)
51
+ expect(response[:succeeded].count).to eq(1)
52
+
53
+ response_body = JSON.parse(response[:succeeded][0].response)
54
+ expect(response_body['form']).to eq({})
55
+ end
56
+ end
57
+
58
+ it 'can make a POST with params' do
59
+ VCR.use_cassette('muxer/post/with_params') do
60
+ response = Muxer.execute do |muxer|
61
+ muxer.add_url 'https://httpbin.org/post', method: :post, params: {test: :success}
62
+ end
63
+ expect(response[:succeeded]).to be_kind_of(Array)
64
+ expect(response[:succeeded].count).to eq(1)
65
+
66
+ response_body = JSON.parse(response[:succeeded][0].response)
67
+ expect(response_body['form']).to be_kind_of(Hash)
68
+ expect(response_body['form']['test']).to eq('success')
69
+ end
70
+ end
71
+
72
+ it 'can make a PUT' do
73
+ VCR.use_cassette('muxer/put/can') do
74
+ response = Muxer.execute do |muxer|
75
+ muxer.add_url 'https://httpbin.org/put', method: :put
76
+ end
77
+ expect(response[:succeeded]).to be_kind_of(Array)
78
+ expect(response[:succeeded].count).to eq(1)
79
+
80
+ response_body = JSON.parse(response[:succeeded][0].response)
81
+ expect(response_body['form']).to eq({})
82
+ end
83
+ end
84
+
85
+ it 'can make a PUT with params' do
86
+ VCR.use_cassette('muxer/put/with_params') do
87
+ response = Muxer.execute do |muxer|
88
+ muxer.add_url 'https://httpbin.org/put', method: :put, params: {test: :success}
89
+ end
90
+ expect(response[:succeeded]).to be_kind_of(Array)
91
+ expect(response[:succeeded].count).to eq(1)
92
+
93
+ response_body = JSON.parse(response[:succeeded][0].response)
94
+ expect(response_body['form']).to be_kind_of(Hash)
95
+ expect(response_body['form']['test']).to eq('success')
96
+ end
97
+ end
98
+
45
99
 
46
100
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: muxer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chris MacNaughton
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-07 00:00:00.000000000 Z
11
+ date: 2015-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eventmachine
@@ -160,6 +160,10 @@ files:
160
160
  - spec/cassettes/muxer/makes_a_web_request.yml
161
161
  - spec/cassettes/muxer/makes_multiple_web_requests.yml
162
162
  - spec/cassettes/muxer/multiplexer/with_global_timeout.yml
163
+ - spec/cassettes/muxer/post/can.yml
164
+ - spec/cassettes/muxer/post/with_params.yml
165
+ - spec/cassettes/muxer/put/can.yml
166
+ - spec/cassettes/muxer/put/with_params.yml
163
167
  - spec/muxer/multiplexer_spec.rb
164
168
  - spec/muxer/request_spec.rb
165
169
  - spec/muxer_spec.rb
@@ -193,6 +197,10 @@ test_files:
193
197
  - spec/cassettes/muxer/makes_a_web_request.yml
194
198
  - spec/cassettes/muxer/makes_multiple_web_requests.yml
195
199
  - spec/cassettes/muxer/multiplexer/with_global_timeout.yml
200
+ - spec/cassettes/muxer/post/can.yml
201
+ - spec/cassettes/muxer/post/with_params.yml
202
+ - spec/cassettes/muxer/put/can.yml
203
+ - spec/cassettes/muxer/put/with_params.yml
196
204
  - spec/muxer/multiplexer_spec.rb
197
205
  - spec/muxer/request_spec.rb
198
206
  - spec/muxer_spec.rb