tickr_client 1.0.0 → 1.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.
- data/README.md +3 -3
- data/VERSION +1 -1
- data/lib/tickr_client.rb +9 -3
- data/spec/tickr_client_spec.rb +36 -49
- data/tickr_client.gemspec +1 -1
- metadata +2 -2
data/README.md
CHANGED
@@ -14,9 +14,9 @@ makes no guarantee about sequentiality.
|
|
14
14
|
|
15
15
|
$tickr = TickrClient.new(
|
16
16
|
servers: [
|
17
|
-
{host: '192.168.1.1', port: 8080},
|
18
|
-
{host: '192.168.1.2', port: 8080},
|
19
|
-
{host: '192.168.1.3', port: 8080}
|
17
|
+
{host: '192.168.1.1', port: 8080, http_auth_password: 'lockd0wn'},
|
18
|
+
{host: '192.168.1.2', port: 8080, http_auth_password: 'lockd0wn'},
|
19
|
+
{host: '192.168.1.3', port: 8080, http_auth_password: 'lockd0wn'}
|
20
20
|
],
|
21
21
|
timeout: 1000, # Try next host after 1 second.
|
22
22
|
cache_size: 100, # Keep up to 100 tickets (unique IDs) at the ready.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.1.0
|
data/lib/tickr_client.rb
CHANGED
@@ -39,10 +39,16 @@ class TickrClient
|
|
39
39
|
|
40
40
|
def fetch_tickets_from_server(index)
|
41
41
|
new_ticket_group = begin
|
42
|
-
uri = URI("http://#{servers[index][:host]}:#{servers[index][:port]}/tickets/create/#{replenish_capacity}")
|
43
|
-
|
44
|
-
|
42
|
+
uri = URI.parse("http://#{servers[index][:host]}:#{servers[index][:port]}/tickets/create/#{replenish_capacity}")
|
43
|
+
request = Net::HTTP::Get.new(uri.request_uri)
|
44
|
+
if servers[index][:http_auth_password] && servers[index][:http_auth_password] != ''
|
45
|
+
request.basic_auth '', servers[index][:http_auth_password]
|
45
46
|
end
|
47
|
+
|
48
|
+
response = Timeout::timeout(timeout / 1000.0) do
|
49
|
+
Net::HTTP.new(uri.host, uri.port).start{|http| http.request(request)}
|
50
|
+
end
|
51
|
+
JSON.parse(response.body)
|
46
52
|
rescue Timeout::Error
|
47
53
|
return false
|
48
54
|
end
|
data/spec/tickr_client_spec.rb
CHANGED
@@ -5,18 +5,26 @@ require File.join(File.dirname(__FILE__), '..', 'lib', 'tickr_client')
|
|
5
5
|
require 'json'
|
6
6
|
|
7
7
|
describe TickrClient do
|
8
|
+
def create_client(num_servers = 4, http_password = nil, client_opts = {})
|
9
|
+
client_opts[:cache_size] ||= 10
|
10
|
+
ports = (8080..(8080 + num_servers - 1))
|
11
|
+
ports.each do |port|
|
12
|
+
FakeWeb.register_uri :get, "http://#{":#{http_password}@" if http_password}127.0.0.1:#{port}/tickets/create/#{client_opts[:cache_size]}", body: {'first' => 1, 'increment' => 1, 'count' => 5}.to_json
|
13
|
+
end
|
14
|
+
TickrClient.new(
|
15
|
+
client_opts.merge(servers: ports.inject([]) {|servers, port| servers.push({host: '127.0.0.1', port: port, http_auth_password: http_password})})
|
16
|
+
)
|
17
|
+
end
|
18
|
+
|
8
19
|
after do
|
9
20
|
# Make sure threads finish before we fail based on expectations
|
10
21
|
Thread.list.each {|t| t.join unless t == Thread.current}
|
11
22
|
end
|
12
|
-
def get_client(opts = {})
|
13
|
-
TickrClient.new(
|
14
|
-
{servers: [{host: '127.0.0.1', port: 8080}, {host: '127.0.0.1', port: 8081}]}.merge(opts)
|
15
|
-
)
|
16
|
-
end
|
17
23
|
describe '#initialize' do
|
18
24
|
it 'sets configurable instance variables' do
|
19
|
-
|
25
|
+
(8080..8081).each do |port|
|
26
|
+
FakeWeb.register_uri :get, "http://127.0.0.1:#{port}/tickets/create/500", body: {'first' => 1, 'increment' => 1, 'count' => 5}.to_json
|
27
|
+
end
|
20
28
|
client = TickrClient.new(
|
21
29
|
servers: [{host: '127.0.0.1', port: 8080}, {host: '127.0.0.1', port: 8081}],
|
22
30
|
timeout: 150,
|
@@ -30,7 +38,10 @@ describe TickrClient do
|
|
30
38
|
client.replenish_cache_at.should == 100
|
31
39
|
end
|
32
40
|
it 'applies sensible defaults' do
|
33
|
-
|
41
|
+
(8080..8081).each do |port|
|
42
|
+
FakeWeb.register_uri :get, "http://127.0.0.1:#{port}/tickets/create/100", body: {'first' => 1, 'increment' => 1, 'count' => 5}.to_json
|
43
|
+
end
|
44
|
+
|
34
45
|
client = TickrClient.new(
|
35
46
|
servers: [{host: '127.0.0.1', port: 8080}, {host: '127.0.0.1', port: 8081}]
|
36
47
|
)
|
@@ -44,22 +55,26 @@ describe TickrClient do
|
|
44
55
|
servers: [{host: '127.0.0.1', port: 8080}, {host: '127.0.0.1', port: 8081}]
|
45
56
|
)
|
46
57
|
end
|
58
|
+
it 'supports http authentication enabled' do
|
59
|
+
# Notice that there is no register_uri set for a non-http authed request.
|
60
|
+
# Therefore if a non-http authed request is made, it will bomb.
|
61
|
+
FakeWeb.register_uri :get, 'http://:password@127.0.0.1:8080/tickets/create/100', body: {'first' => 1, 'increment' => 1, 'count' => 5}.to_json
|
62
|
+
TickrClient.new(
|
63
|
+
servers: [{host: '127.0.0.1', port: 8080, http_auth_password: 'password'}]
|
64
|
+
)
|
65
|
+
end
|
47
66
|
end
|
48
67
|
|
49
68
|
describe '#get_ticket' do
|
50
69
|
it 'loads ticket from cache and removes it from the cache' do
|
51
|
-
|
52
|
-
client = get_client
|
53
|
-
|
70
|
+
client = create_client(1, nil, cache_size: 4, replenish_cache_at: 2)
|
54
71
|
client.send(:tickets=, [1, 2, 3, 4])
|
55
72
|
client.get_ticket.should == 1
|
56
73
|
client.send(:tickets).should == [2, 3, 4]
|
57
74
|
end
|
58
75
|
|
59
76
|
it 'asynchronously fetches more tickets after falling below the replenesh_cache_at threshold' do
|
60
|
-
|
61
|
-
|
62
|
-
client = get_client(cache_size: 10, replenesh_cache_at: 2)
|
77
|
+
client = create_client(2, nil, cache_size: 10, replenesh_cache_at: 2)
|
63
78
|
client.send(:tickets=, [5, 6, 7])
|
64
79
|
client.should_receive :fetch_tickets_async
|
65
80
|
client.get_ticket
|
@@ -68,16 +83,8 @@ describe TickrClient do
|
|
68
83
|
|
69
84
|
describe 'private instance methods' do
|
70
85
|
describe '#fetch_tickets' do
|
71
|
-
it 'fetches tickets from servers one at a time' do
|
72
|
-
|
73
|
-
client = TickrClient.new(
|
74
|
-
servers: [
|
75
|
-
{host: '127.0.0.1', port: 8080},
|
76
|
-
{host: '127.0.0.1', port: 8081},
|
77
|
-
{host: '127.0.0.1', port: 8082},
|
78
|
-
{host: '127.0.0.1', port: 8083}
|
79
|
-
]
|
80
|
-
)
|
86
|
+
it 'fetches tickets from servers one at a time until it succeeds' do
|
87
|
+
client = create_client(4)
|
81
88
|
Thread.list.each {|t| t.join unless t == Thread.current}
|
82
89
|
|
83
90
|
client.send(:next_server_index=, 0)
|
@@ -91,13 +98,7 @@ describe TickrClient do
|
|
91
98
|
|
92
99
|
describe '#fetch_tickets_async' do
|
93
100
|
it 'fetches tickets in a separate thread' do
|
94
|
-
|
95
|
-
client = TickrClient.new(
|
96
|
-
servers: [
|
97
|
-
{host: '127.0.0.1', port: 8080}
|
98
|
-
],
|
99
|
-
cache_size: 10
|
100
|
-
)
|
101
|
+
client = create_client(1, nil, cache_size: 10)
|
101
102
|
client.send(:tickets=, [1, 2])
|
102
103
|
FakeWeb.register_uri :get, 'http://127.0.0.1:8080/tickets/create/8', body: {'first' => 5, 'increment' => 1, 'count' => 8}.to_json
|
103
104
|
|
@@ -110,23 +111,13 @@ describe TickrClient do
|
|
110
111
|
|
111
112
|
describe '#fetch_tickets_from_server' do
|
112
113
|
it 'returns false on timeout error' do
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
Net::HTTP.should_receive(:get).and_raise(Timeout::Error)
|
114
|
+
client = create_client(2)
|
115
|
+
Net::HTTP.should_receive(:new).and_raise(Timeout::Error)
|
117
116
|
client.send(:fetch_tickets_from_server, 0).should be_false
|
118
117
|
end
|
119
118
|
|
120
119
|
it 'adds tickets to array and returns true' do
|
121
|
-
|
122
|
-
client = TickrClient.new(
|
123
|
-
servers: [
|
124
|
-
{host: '127.0.0.1', port: 8080},
|
125
|
-
{host: '127.0.0.1', port: 8081},
|
126
|
-
{host: '127.0.0.1', port: 8082}
|
127
|
-
],
|
128
|
-
cache_size: 10
|
129
|
-
)
|
120
|
+
client = create_client(3, nil, cache_size: 10)
|
130
121
|
client.send(:tickets=, [1, 2])
|
131
122
|
client.send(:next_server_index=, 1)
|
132
123
|
|
@@ -139,9 +130,7 @@ describe TickrClient do
|
|
139
130
|
|
140
131
|
describe '#replenish_capacity' do
|
141
132
|
it 'is the difference between the cache size and the number of tickets' do
|
142
|
-
|
143
|
-
|
144
|
-
client = get_client(cache_size: 10)
|
133
|
+
client = create_client(2, nil, cache_size: 10)
|
145
134
|
client.send(:tickets=, [5, 6, 7])
|
146
135
|
client.send(:replenish_capacity).should == 7
|
147
136
|
end
|
@@ -149,9 +138,7 @@ describe TickrClient do
|
|
149
138
|
|
150
139
|
describe '#create_tickets_from_ticket_group' do
|
151
140
|
it 'should create an array of tickets' do
|
152
|
-
|
153
|
-
|
154
|
-
client = get_client
|
141
|
+
client = create_client(2)
|
155
142
|
tickets = client.send(:create_tickets_from_ticket_group, {'first' => 100, 'increment' => 100, 'count' => 5})
|
156
143
|
tickets.should == [100, 200, 300, 400, 500]
|
157
144
|
end
|
data/tickr_client.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tickr_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -177,7 +177,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
177
177
|
version: '0'
|
178
178
|
segments:
|
179
179
|
- 0
|
180
|
-
hash:
|
180
|
+
hash: 130854216530279690
|
181
181
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
182
182
|
none: false
|
183
183
|
requirements:
|