hot_tub 0.2.1 → 0.2.2

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/.travis.yml CHANGED
@@ -5,7 +5,4 @@ rvm:
5
5
  - jruby-19mode
6
6
  - rbx-19mode
7
7
  - ruby-head
8
- - jruby-head
9
- matrix:
10
- allow_failures:
11
- - rvm: 1.9.2
8
+ - jruby-head
data/README.md CHANGED
@@ -13,7 +13,7 @@ There are a couple Ruby connection pooling libraries out there but HotTub differ
13
13
  * Set to expand pool under load that is eventually reaped back down to set size (never_block), can be disabled
14
14
  * Attempts to close clients/connections at_exit
15
15
 
16
- ### HotTub::Sessions
16
+ ### HotTub::Session
17
17
  * Thread safe
18
18
  * The same api as HotTub::Pool
19
19
  * Can be used with HotTub::Pool or any client library
@@ -61,7 +61,7 @@ Close and clean can be defined at initialization with lambdas, if they are not d
61
61
  pool = HotTub::Pool.new({:size => 10, :close => lambda {|clnt| clnt.close}}) { MyHttpLib.new }
62
62
  pool.run { |clnt| clnt.get(@@url,query).body }
63
63
 
64
- ## HotTub::Sessions Usage
64
+ ## HotTub::Session Usage
65
65
  HotTub::Sessions are a synchronized hash of clients/pools and are implemented similar HotTub::Pool.
66
66
  For example, Excon is thread safe but you set a single url at the client level so sessions
67
67
  are handy if you need to access multiple urls but would prefer a single object.
@@ -69,7 +69,7 @@ are handy if you need to access multiple urls but would prefer a single object.
69
69
  require 'hot_tub'
70
70
  require 'excon'
71
71
  # Our client block must accept the url argument
72
- sessions = HotTub::Sessions.new {|url| Excon.new(url) }
72
+ sessions = HotTub::Session.new {|url| Excon.new(url) }
73
73
 
74
74
  sessions.run("http://somewebservice.com") do |clnt|
75
75
  puts clnt.get(:query => {:some => 'stuff'}).response_header.status
@@ -81,16 +81,17 @@ are handy if you need to access multiple urls but would prefer a single object.
81
81
  puts clnt.get.response_header.status
82
82
  end
83
83
 
84
- ### HotTub::Sessions with HotTub::Pool
84
+ ### HotTub::Session with HotTub::Pool
85
85
  Suppose you have a client that is not thread safe, you can use HotTub::Pool with HotTub::Sessions to get what you need.
86
86
 
87
87
  require 'hot_tub'
88
88
  require "em-synchrony"
89
89
  require "em-synchrony/em-http"
90
- # Our client block must accept the url argument
91
90
 
91
+ # We ust tell HotTub::Session to use HotTub::Pool, pass any pool options in our
92
+ # options has, and our client block must accept the url argument
92
93
  EM.synchrony do {
93
- sessions = HotTub::Sessions.new {|url| HotTub::Pool.new(:size => 12) { EM::HttpRequest.new(url, :inactivity_timeout => 0) }}
94
+ sessions = HotTub::Session.new(:with_pool => true, :size => 12) {|url| EM::HttpRequest.new(url, :inactivity_timeout => 0) }
94
95
 
95
96
  sessions.run("http://somewebservice.com") do |clnt|
96
97
  puts clnt.get(:query => results).response_header.status
data/hot_tub.gemspec CHANGED
@@ -16,7 +16,7 @@ Gem::Specification.new do |s|
16
16
 
17
17
  s.add_development_dependency "rspec"
18
18
  s.add_development_dependency "sinatra"
19
- s.add_development_dependency "puma"
19
+ s.add_development_dependency "puma", "~> 2.0.0.b7"
20
20
  s.add_development_dependency "excon"
21
21
 
22
22
  s.files = `git ls-files`.split("\n")
@@ -19,8 +19,8 @@ module HotTub
19
19
  # end
20
20
  #
21
21
  # Example with Pool:
22
- #
23
- # sessions = HotTub::Pool.new(:size => 12) { EM::HttpRequest.new("http://somewebservice.com") }
22
+ # You can initialize a HotTub::Pool with each client by passing :with_pool as true and any pool options
23
+ # sessions = HotTub::Session.new(:with_pool => true, :size => 12) { EM::HttpRequest.new("http://somewebservice.com") }
24
24
  #
25
25
  # sessions.run("http://wwww.yahoo.com") do |conn|
26
26
  # p conn.head.response_header.status
@@ -30,6 +30,7 @@ module HotTub
30
30
  # p conn.head.response_header.status
31
31
  # end
32
32
  #
33
+ #
33
34
  def initialize(options={},&client_block)
34
35
  raise ArgumentError, "HotTub::Sessions requre a block on initialization that accepts a single argument" unless block_given?
35
36
  at_exit { close_all } # close connections at exit
@@ -45,7 +46,11 @@ module HotTub
45
46
  key = to_key(url)
46
47
  return @sessions[key] if @sessions[key]
47
48
  @mutex.synchronize do
48
- @sessions[key] = @client_block.call(url) if @sessions[key].nil?
49
+ if @options[:with_pool]
50
+ @sessions[key] = HotTub::Pool.new(@options) { @client_block.call(url) }
51
+ else
52
+ @sessions[key] = @client_block.call(url) if @sessions[key].nil?
53
+ end
49
54
  @sessions[key]
50
55
  end
51
56
  end
@@ -84,7 +89,7 @@ module HotTub
84
89
  else
85
90
  raise ArgumentError, "you must pass a string or a URI object"
86
91
  end
87
- "#{uri.scheme}-#{uri.host}"
92
+ "#{uri.scheme}://#{uri.host}:#{uri.port}"
88
93
  end
89
94
  end
90
95
  end
@@ -1,3 +1,3 @@
1
1
  module HotTub
2
- VERSION = "0.2.1"
2
+ VERSION = "0.2.2"
3
3
  end
@@ -35,4 +35,32 @@ module HotTub
35
35
  'http://127.0.0.1:9595' << path
36
36
  end
37
37
  end
38
+
39
+ class Server2 < Sinatra::Base
40
+
41
+ def self.run
42
+ @events = Puma::Events.new STDOUT, STDERR
43
+ @server = Puma::Server.new HotTub::Server.new, @events
44
+ @server.min_threads = 0
45
+ @server.max_threads = 20
46
+ @server.add_tcp_listener '127.0.0.1', 9393
47
+ @server.run
48
+ end
49
+
50
+ set :server, 'puma'
51
+ set :port, 9393
52
+
53
+
54
+ get '/quick' do
55
+ (Random.new.rand(0..999999).to_s)
56
+ end
57
+
58
+ def self.teardown
59
+ @server.stop(true) if @server
60
+ end
61
+
62
+ def self.url
63
+ 'http://127.0.0.1:9393/quick'
64
+ end
65
+ end
38
66
  end
data/spec/pool_spec.rb CHANGED
@@ -144,7 +144,7 @@ describe HotTub::Pool do
144
144
  pool.run{|connection| connection.get }
145
145
  end
146
146
  end
147
- sleep(0.01)
147
+ sleep(1)
148
148
  threads.each do |t|
149
149
  t.join
150
150
  end
@@ -155,12 +155,12 @@ describe HotTub::Pool do
155
155
  it "should not add connections to pool beyond specified size" do
156
156
  pool = HotTub::Pool.new({:size => 1, :never_block => false, :blocking_timeout => 10}) { MocClient.new }
157
157
  threads = []
158
- 3.times.each do
158
+ 2.times.each do
159
159
  threads << Thread.new do
160
160
  pool.run{|connection| connection.get }
161
161
  end
162
162
  end
163
- sleep(0.01)
163
+ sleep(1)
164
164
  threads.each do |t|
165
165
  t.join
166
166
  end
data/spec/session_spec.rb CHANGED
@@ -23,13 +23,13 @@ describe HotTub::Session do
23
23
  describe '#to_url' do
24
24
  context "passed URL string" do
25
25
  it "should return key with URI scheme-domain" do
26
- @sessions.send(:to_key,@url).should eql("#{@uri.scheme}-#{@uri.host}")
26
+ @sessions.send(:to_key,@url).should eql("#{@uri.scheme}://#{@uri.host}:#{@uri.port}")
27
27
  end
28
28
  end
29
29
 
30
30
  context "passed URI" do
31
31
  it "should return key with URI scheme-domain" do
32
- @sessions.send(:to_key,@uri).should eql("#{@uri.scheme}-#{@uri.host}")
32
+ @sessions.send(:to_key,@uri).should eql("#{@uri.scheme}://#{@uri.host}:#{@uri.port}")
33
33
  end
34
34
  end
35
35
 
@@ -68,35 +68,55 @@ describe HotTub::Session do
68
68
  it "should set key with URI scheme-domain" do
69
69
  @sessions.sessions(@url)
70
70
  sessions = @sessions.instance_variable_get(:@sessions)
71
- sessions["#{@uri.scheme}-#{@uri.host}"].should be_a(MocClient)
71
+ sessions["#{@uri.scheme}://#{@uri.host}:#{@uri.port}"].should be_a(MocClient)
72
72
  end
73
73
  end
74
74
  context "passed URI" do
75
75
  it "should set key with URI scheme-domain" do
76
76
  @sessions.sessions(@uri)
77
77
  sessions = @sessions.instance_variable_get(:@sessions)
78
- sessions["#{@uri.scheme}-#{@uri.host}"].should be_a(MocClient)
78
+ sessions["#{@uri.scheme}://#{@uri.host}:#{@uri.port}"].should be_a(MocClient)
79
+ end
80
+ end
81
+
82
+ context "with_pool" do
83
+ it "should initialize a new HotTub::Pool" do
84
+ session_with_pool = HotTub::Session.new({:with_pool => true}) { |url| MocClient.new(url) }
85
+ pool = session_with_pool.sessions(@url)
86
+ pool.should be_a(HotTub::Pool)
79
87
  end
80
88
  end
81
89
  end
82
90
 
83
91
  describe '#run' do
84
92
  it "should work" do
85
- @url = "https://www.somewebsite.com"
86
- @sessions = HotTub::Session.new { |url| MocClient.new(url) }
93
+ url = HotTub::Server.url
94
+ sessions = HotTub::Session.new { |url| Excon.new(url) }
87
95
  result = nil
88
- @sessions.run(@url) do |conn|
89
- result = conn.get
96
+ sessions.run(url) do |conn|
97
+ result = conn.get.status
98
+ end
99
+ result.should eql(200)
100
+ end
101
+
102
+ context "with_pool" do
103
+ it "should pass run to pool" do
104
+ url = HotTub::Server.url
105
+ session_with_pool = HotTub::Session.new({:with_pool => true}) { |url| Excon.new(url) }
106
+ result = nil
107
+ session_with_pool.run(url) do |conn|
108
+ result = conn.get.status
109
+ end
110
+ result.should eql(200)
90
111
  end
91
- result.should_not be_nil
92
112
  end
93
113
  end
94
114
 
95
115
  context 'threads' do
96
116
  it "should work" do
97
117
  url = HotTub::Server.url
98
- url2 = "http://www.yahoo.com/"
99
- session = HotTub::Session.new { |url| Excon.new(url)}
118
+ url2 = HotTub::Server2.url
119
+ session = HotTub::Session.new(:with_pool => true) { |url| Excon.new(url)}
100
120
  failed = false
101
121
  start_time = Time.now
102
122
  stop_time = nil
@@ -106,8 +126,8 @@ describe HotTub::Session do
106
126
  10.times.each do
107
127
  threads << Thread.new do
108
128
  # MocClient is not thread safe so lets initialize a new instance for each
109
- session.run(url) { |clnt| Thread.current[:result] = MocClient.new(url).get }
110
- session.run(url2) { |clnt| Thread.current[:result] = MocClient.new(url2).get }
129
+ session.run(url) { |clnt| Thread.current[:result] = clnt.get.status }
130
+ session.run(url2) { |clnt| Thread.current[:result] = clnt.get.status }
111
131
  end
112
132
  end
113
133
  threads.each do |t|
data/spec/spec_helper.rb CHANGED
@@ -15,8 +15,10 @@ HotTub.logger.level = Logger::ERROR
15
15
  RSpec.configure do |config|
16
16
  config.before(:suite) do
17
17
  HotTub::Server.run
18
+ HotTub::Server2.run
18
19
  end
19
20
  config.after(:suite) do
20
21
  HotTub::Server.teardown
22
+ HotTub::Server2.teardown
21
23
  end
22
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hot_tub
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-04-04 00:00:00.000000000 Z
12
+ date: 2013-04-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -48,17 +48,17 @@ dependencies:
48
48
  requirement: !ruby/object:Gem::Requirement
49
49
  none: false
50
50
  requirements:
51
- - - ! '>='
51
+ - - ~>
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: 2.0.0.b7
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
59
- - - ! '>='
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 2.0.0.b7
62
62
  - !ruby/object:Gem::Dependency
63
63
  name: excon
64
64
  requirement: !ruby/object:Gem::Requirement
@@ -116,7 +116,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
116
  version: '0'
117
117
  segments:
118
118
  - 0
119
- hash: -1949508601036359576
119
+ hash: -4288862352751305264
120
120
  required_rubygems_version: !ruby/object:Gem::Requirement
121
121
  none: false
122
122
  requirements:
@@ -125,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
125
  version: '0'
126
126
  segments:
127
127
  - 0
128
- hash: -1949508601036359576
128
+ hash: -4288862352751305264
129
129
  requirements: []
130
130
  rubyforge_project: hot_tub
131
131
  rubygems_version: 1.8.25