ninja-model 0.4.2 → 0.5.1
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/.gitignore +19 -0
- data/Rakefile +0 -7
- data/autotest/discover.rb +1 -0
- data/lib/ninja_model.rb +22 -26
- data/lib/ninja_model/adapters.rb +33 -43
- data/lib/ninja_model/adapters/abstract_adapter.rb +2 -10
- data/lib/ninja_model/adapters/adapter_manager.rb +17 -10
- data/lib/ninja_model/adapters/adapter_pool.rb +15 -17
- data/lib/ninja_model/adapters/adapter_specification.rb +3 -3
- data/lib/ninja_model/associations.rb +25 -106
- data/lib/ninja_model/associations/association_proxy.rb +119 -1
- data/lib/ninja_model/associations/belongs_to_association.rb +5 -1
- data/lib/ninja_model/attribute.rb +130 -0
- data/lib/ninja_model/{attributes.rb → attribute_methods.rb} +21 -42
- data/lib/ninja_model/base.rb +23 -20
- data/lib/ninja_model/callbacks.rb +2 -11
- data/lib/ninja_model/identity.rb +6 -11
- data/lib/ninja_model/persistence.rb +15 -30
- data/lib/ninja_model/predicate.rb +4 -4
- data/lib/ninja_model/rails_ext/active_record.rb +187 -0
- data/lib/ninja_model/railtie.rb +14 -8
- data/lib/ninja_model/reflection.rb +7 -14
- data/lib/ninja_model/relation.rb +5 -3
- data/lib/ninja_model/relation/finder_methods.rb +4 -8
- data/lib/ninja_model/relation/spawn_methods.rb +1 -1
- data/lib/ninja_model/validation.rb +6 -23
- data/lib/ninja_model/version.rb +1 -1
- data/ninja-model.gemspec +28 -0
- data/spec/ninja_model/adapters/abstract_adapter_spec.rb +45 -0
- data/spec/ninja_model/adapters/adapter_manager_spec.rb +69 -0
- data/spec/ninja_model/adapters/adapter_pool_spec.rb +210 -48
- data/spec/ninja_model/adapters_spec.rb +77 -0
- data/spec/ninja_model/attribute_methods_spec.rb +95 -0
- data/spec/ninja_model/attribute_spec.rb +129 -0
- data/spec/ninja_model/base_spec.rb +4 -52
- data/spec/ninja_model/identity_spec.rb +16 -32
- data/spec/ninja_model/persistence_spec.rb +130 -4
- data/spec/ninja_model/predicate_spec.rb +40 -6
- data/spec/ninja_model/query_methods_spec.rb +76 -74
- data/spec/ninja_model/reflection_spec.rb +63 -0
- data/spec/ninja_model/relation_spec.rb +213 -20
- data/spec/ninja_model/symbol_spec.rb +19 -0
- data/spec/ninja_model/validation_spec.rb +18 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/support/matchers/convert.rb +30 -0
- metadata +85 -63
- data/lib/ninja_model/associations/active_record_proxy.rb +0 -53
- data/lib/ninja_model/associations/ninja_model_proxy.rb +0 -46
- data/lib/ninja_model/configuration.rb +0 -20
- data/lib/ninja_model/errors.rb +0 -5
- data/lib/ninja_model/log_subscriber.rb +0 -18
- data/lib/ninja_model/scoping.rb +0 -50
- data/spec/ninja_model/attributes_spec.rb +0 -85
- data/spec/ninja_model/scoping_spec.rb +0 -40
@@ -29,7 +29,7 @@ module NinjaModel
|
|
29
29
|
end
|
30
30
|
merged_relation.predicates = merged_predicates
|
31
31
|
|
32
|
-
Relation::SINGLE_VALUE_ATTRS.
|
32
|
+
Relation::SINGLE_VALUE_ATTRS.each do |method|
|
33
33
|
value = r.send(:"#{method}_value")
|
34
34
|
merged_relation.send(:"#{method}_value=", value) unless value.nil?
|
35
35
|
end
|
@@ -1,13 +1,14 @@
|
|
1
|
-
require 'active_model'
|
2
|
-
|
3
1
|
module NinjaModel
|
4
|
-
|
5
|
-
extend ActiveSupport::Concern
|
2
|
+
class Base
|
6
3
|
include ActiveModel::Validations
|
4
|
+
define_model_callbacks :validation
|
5
|
+
end
|
6
|
+
|
7
|
+
module Validation
|
7
8
|
|
8
9
|
def save(options={})
|
9
10
|
run_callbacks :validation do
|
10
|
-
|
11
|
+
valid?(options.is_a?(Hash) ? options[:context] : nil) ? super : false
|
11
12
|
end
|
12
13
|
end
|
13
14
|
|
@@ -16,23 +17,5 @@ module NinjaModel
|
|
16
17
|
output = super(context)
|
17
18
|
errors.empty? && output
|
18
19
|
end
|
19
|
-
|
20
|
-
protected
|
21
|
-
|
22
|
-
def perform_validations(options={})
|
23
|
-
perform_validation = case options
|
24
|
-
when Hash
|
25
|
-
options[:validate] != false
|
26
|
-
else
|
27
|
-
ActiveSupport::Deprecation.warn "save(#{options}) is deprecated, please give save(:validate => #{options}) instead", caller
|
28
|
-
options
|
29
|
-
end
|
30
|
-
|
31
|
-
if perform_validation
|
32
|
-
valid?(options.is_a?(Hash) ? options[:context] : nil)
|
33
|
-
else
|
34
|
-
true
|
35
|
-
end
|
36
|
-
end
|
37
20
|
end
|
38
21
|
end
|
data/lib/ninja_model/version.rb
CHANGED
data/ninja-model.gemspec
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "ninja_model/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = %q{ninja-model}
|
7
|
+
s.version = NinjaModel::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.author = %q{Josh Williams}
|
10
|
+
s.email = %q{theprime@codingprime.com}
|
11
|
+
s.homepage = %q{http://github.com/t3hpr1m3/ninja-model.git}
|
12
|
+
s.summary = %q{Pseudo-ORM for Ruby}
|
13
|
+
s.description = %q{Pseudo-ORM for Ruby/Rails with an ActiveRecord-like interface}
|
14
|
+
|
15
|
+
s.rubyforge_project = s.name
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n") - ["Gemfile.lock"]
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_dependency 'activerecord', '~> 3.0.3'
|
22
|
+
|
23
|
+
s.add_development_dependency 'rspec', '~> 2.2.0'
|
24
|
+
s.add_development_dependency 'mocha', '~> 0.9.8'
|
25
|
+
s.add_development_dependency 'rcov', '~> 0.9.9'
|
26
|
+
s.add_development_dependency 'nokogiri', '~> 1.4.4'
|
27
|
+
s.add_development_dependency 'autotest', '~> 4.4.6'
|
28
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe NinjaModel::Adapters::AbstractAdapter do
|
4
|
+
subject { NinjaModel::Adapters::AbstractAdapter.new({}) }
|
5
|
+
it { should respond_to(:reconnect!) }
|
6
|
+
it { should respond_to(:disconnect!) }
|
7
|
+
it { should respond_to(:reset!) }
|
8
|
+
it { should respond_to(:verify!) }
|
9
|
+
it { should respond_to(:create) }
|
10
|
+
it { should respond_to(:read) }
|
11
|
+
it { should respond_to(:update) }
|
12
|
+
it { should respond_to(:destroy) }
|
13
|
+
its(:adapter_name) { should eql('Abstract') }
|
14
|
+
its(:persistent_connection?) { should be_true }
|
15
|
+
its(:active?) { should be_false }
|
16
|
+
specify { subject.create({}).should be_false }
|
17
|
+
specify { subject.read({}).should be_nil }
|
18
|
+
specify { subject.update({}).should be_false }
|
19
|
+
specify { subject.destroy({}).should be_false }
|
20
|
+
|
21
|
+
it 'should be active after reconnect' do
|
22
|
+
subject.reconnect!
|
23
|
+
subject.active?.should be_true
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'verify!' do
|
27
|
+
it 'should call reconnect! when inactive' do
|
28
|
+
subject.stubs(:active?).returns(false)
|
29
|
+
subject.expects(:reconnect!)
|
30
|
+
subject.verify!
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should not call reconnect! when active' do
|
34
|
+
subject.stubs(:active?).returns(true)
|
35
|
+
subject.expects(:reconnect!).never
|
36
|
+
subject.verify!
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'should be inactive after disconnect' do
|
41
|
+
subject.reconnect!
|
42
|
+
subject.disconnect!
|
43
|
+
subject.active?.should be_false
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe NinjaModel::Adapters::AdapterManager do
|
4
|
+
class DummyAdapter < NinjaModel::Adapters::AbstractAdapter; end
|
5
|
+
class TestModel < NinjaModel::Base; end
|
6
|
+
class ChildModel < TestModel; end
|
7
|
+
|
8
|
+
before {
|
9
|
+
@manager = NinjaModel::Adapters::AdapterManager.new
|
10
|
+
@manager.class.register_adapter_class(:dummy, DummyAdapter)
|
11
|
+
}
|
12
|
+
subject { @manager }
|
13
|
+
|
14
|
+
it 'should remember registered adapters' do
|
15
|
+
subject.class.registered?(:dummy).should be_true
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'creating an adapter' do
|
19
|
+
before { @manager.create_adapter('TestModel', NinjaModel::Adapters::AdapterSpecification.new({}, :dummy)) }
|
20
|
+
it 'should add the adapter to the pool' do
|
21
|
+
@manager.retrieve_adapter_pool(TestModel).spec.name.should eql(:dummy)
|
22
|
+
end
|
23
|
+
it 'should return the adapter for descendent classes' do
|
24
|
+
@manager.retrieve_adapter_pool(ChildModel).spec.name.should eql(:dummy)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe 'removing an adapter' do
|
29
|
+
before {
|
30
|
+
@spec = NinjaModel::Adapters::AdapterSpecification.new({:foo => 'bar'}, :dummy)
|
31
|
+
@manager.create_adapter('TestModel', @spec)
|
32
|
+
}
|
33
|
+
it 'should remove the adapter from the pool' do
|
34
|
+
@manager.remove_adapter(TestModel)
|
35
|
+
@manager.retrieve_adapter_pool(TestModel).should be_nil
|
36
|
+
end
|
37
|
+
it 'should cause retrieve_adapter to raise an error' do
|
38
|
+
@manager.remove_adapter(TestModel)
|
39
|
+
lambda { @manager.retrieve_adapter(TestModel) }.should raise_error(StandardError)
|
40
|
+
end
|
41
|
+
it 'should return the spec that created it' do
|
42
|
+
@manager.remove_adapter(TestModel).should eql({:foo => 'bar'})
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'release_active_adapters!' do
|
47
|
+
before {
|
48
|
+
@spec = NinjaModel::Adapters::AdapterSpecification.new({:foo => 'bar'}, :dummy)
|
49
|
+
@manager.create_adapter('TestModel', @spec)
|
50
|
+
}
|
51
|
+
it 'should call release_instance on all pools' do
|
52
|
+
@pool = @manager.adapter_pools['TestModel']
|
53
|
+
@pool.expects(:release_instance)
|
54
|
+
@manager.release_active_adapters!
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
describe 'release_all_adapters!' do
|
59
|
+
before {
|
60
|
+
@spec = NinjaModel::Adapters::AdapterSpecification.new({:foo => 'bar'}, :dummy)
|
61
|
+
@manager.create_adapter('TestModel', @spec)
|
62
|
+
}
|
63
|
+
it 'should call shutdown! on all pools' do
|
64
|
+
@pool = @manager.adapter_pools['TestModel']
|
65
|
+
@pool.expects(:shutdown!)
|
66
|
+
@manager.release_all_adapters!
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -1,72 +1,234 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'ninja_model'
|
3
2
|
|
4
3
|
describe NinjaModel::Adapters::AdapterPool do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
class DummyAdapter < NinjaModel::Adapters::AbstractAdapter; end
|
5
|
+
before {
|
6
|
+
@spec = NinjaModel::Adapters::AdapterSpecification.new({}, :dummy)
|
7
|
+
NinjaModel::Base.register_adapter(:dummy, DummyAdapter)
|
8
|
+
@pool = NinjaModel::Adapters::AdapterPool.new(@spec)
|
9
|
+
}
|
10
|
+
subject { @pool }
|
11
|
+
its(:spec) { should eql(@spec) }
|
12
|
+
its(:instances) { should be_empty }
|
13
|
+
its(:connected?) { should be_false }
|
14
|
+
its(:current_instance_id) { should eql(Thread.current.object_id) }
|
10
15
|
|
11
|
-
|
12
|
-
|
16
|
+
describe 'obtaining an adapter instance' do
|
17
|
+
it 'should store the instance for a given thread' do
|
18
|
+
subject.instance
|
19
|
+
subject.expects(:checkout).never
|
20
|
+
subject.instance
|
13
21
|
end
|
22
|
+
end
|
14
23
|
|
15
|
-
|
16
|
-
|
17
|
-
|
24
|
+
describe 'releasing an adapter instance' do
|
25
|
+
it 'should call checkout when obtaining another instance' do
|
26
|
+
subject.expects(:checkout).twice
|
27
|
+
subject.instance
|
28
|
+
subject.release_instance
|
29
|
+
subject.instance
|
18
30
|
end
|
19
|
-
Thread.stubs(:current).returns(@thread)
|
20
|
-
NinjaModel::Base.stubs(:dummy_adapter).returns(@adapter)
|
21
31
|
end
|
22
32
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
33
|
+
describe 'with_instance' do
|
34
|
+
it 'should yield an instance' do
|
35
|
+
@inst = nil
|
36
|
+
subject.with_instance do |inst|
|
37
|
+
@inst = inst
|
38
|
+
end
|
39
|
+
@inst.should be_kind_of(DummyAdapter)
|
40
|
+
end
|
41
|
+
it 'should release the instance when complete' do
|
42
|
+
subject.expects(:release_instance).with(subject.send :current_instance_id)
|
43
|
+
subject.with_instance do |inst|
|
44
|
+
end
|
45
|
+
end
|
27
46
|
end
|
28
47
|
|
29
|
-
|
30
|
-
|
31
|
-
|
48
|
+
describe 'shutdown!' do
|
49
|
+
it 'should checkin all assigned instances' do
|
50
|
+
@inst = subject.instance
|
51
|
+
subject.expects(:checkin).with(@inst)
|
52
|
+
subject.shutdown!
|
53
|
+
end
|
54
|
+
it 'should call disconnect on all instances' do
|
55
|
+
@inst = subject.instance
|
56
|
+
@inst.expects(:disconnect!)
|
57
|
+
subject.shutdown!
|
58
|
+
end
|
32
59
|
end
|
33
60
|
|
34
|
-
|
35
|
-
|
61
|
+
describe 'clear_stale_cached_instances!' do
|
62
|
+
it 'should reap any instances for dead threads' do
|
63
|
+
@thread = mock('Thread') do
|
64
|
+
stubs(:object_id).returns(Thread.current.object_id)
|
65
|
+
stubs(:alive?).returns(false)
|
66
|
+
end
|
67
|
+
Thread.stubs(:list).returns([@thread])
|
68
|
+
@inst = subject.instance
|
69
|
+
subject.expects(:checkin).with(@inst)
|
70
|
+
subject.send :clear_stale_cached_instances!
|
71
|
+
end
|
72
|
+
it 'should not reap instances for live threads' do
|
73
|
+
@thread = mock('Thread') do
|
74
|
+
stubs(:object_id).returns(Thread.current.object_id)
|
75
|
+
stubs(:alive?).returns(true)
|
76
|
+
end
|
77
|
+
Thread.stubs(:list).returns([@thread])
|
78
|
+
@inst = subject.instance
|
79
|
+
subject.expects(:checkin).with(@inst).never
|
80
|
+
subject.send :clear_stale_cached_instances!
|
81
|
+
end
|
36
82
|
end
|
37
83
|
|
38
|
-
describe '
|
39
|
-
|
40
|
-
|
84
|
+
describe 'checkout' do
|
85
|
+
subject { NinjaModel::Adapters::AdapterPool.new(@spec) }
|
86
|
+
context 'with no current instances' do
|
87
|
+
it 'should checkout a new instance' do
|
88
|
+
subject.expects(:checkout_new_instance).returns('foo')
|
89
|
+
subject.send(:checkout)
|
90
|
+
end
|
91
|
+
it 'should store the instance' do
|
92
|
+
subject.send(:checkout)
|
93
|
+
subject.instances.count.should eql(1)
|
94
|
+
end
|
41
95
|
end
|
42
96
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
97
|
+
context 'with 1 existing instance' do
|
98
|
+
context 'that is already assigned' do
|
99
|
+
it 'should checkout a new instance' do
|
100
|
+
threads = []
|
101
|
+
subject.expects(:new_instance).twice.returns(NinjaModel::Adapters::AdapterManager.registered[subject.spec.name].new(subject.spec.config))
|
102
|
+
2.times do |idx|
|
103
|
+
threads << Thread.new do
|
104
|
+
subject.send(:checkout)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
threads.each { |t| t.join }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
context 'that is not assigned' do
|
111
|
+
it 'should checkout the existing instance' do
|
112
|
+
subject.expects(:checkout_existing_instance).returns('existing')
|
113
|
+
subject.instance
|
114
|
+
subject.release_instance
|
115
|
+
subject.instances.count.should eql(1)
|
116
|
+
subject.send(:checkout)
|
117
|
+
end
|
118
|
+
end
|
47
119
|
end
|
48
120
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
121
|
+
context 'with the maximum number of instances' do
|
122
|
+
context 'with an available instance' do
|
123
|
+
it 'should successfully check out an instance' do
|
124
|
+
subject.instance
|
125
|
+
threads = []
|
126
|
+
4.times do |idx|
|
127
|
+
threads << Thread.new do
|
128
|
+
subject.instance
|
129
|
+
end
|
130
|
+
end
|
131
|
+
threads.each { |t| t.join }
|
132
|
+
subject.release_instance
|
133
|
+
subject.send(:checkout).should_not be_nil
|
134
|
+
end
|
135
|
+
end
|
56
136
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
137
|
+
context 'with no available instances' do
|
138
|
+
it 'should raise a ConnectionTimeoutError' do
|
139
|
+
threads = []
|
140
|
+
5.times do |idx|
|
141
|
+
threads << Thread.new do
|
142
|
+
subject.instance
|
143
|
+
end
|
144
|
+
end
|
145
|
+
threads.each { |t| t.join }
|
146
|
+
subject.stubs(:clear_stale_cached_instances!)
|
147
|
+
lambda { subject.instance }.should raise_error(NinjaModel::ConnectionTimeoutError)
|
148
|
+
end
|
149
|
+
end
|
64
150
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
151
|
+
context 'with instances that can be reaped' do
|
152
|
+
it 'should return an existing instance' do
|
153
|
+
threads = []
|
154
|
+
5.times do |idx|
|
155
|
+
threads << Thread.new do
|
156
|
+
subject.instance
|
157
|
+
end
|
158
|
+
end
|
159
|
+
threads.each { |t| t.join }
|
160
|
+
subject.expects(:checkout_existing_instance).returns('foo')
|
161
|
+
subject.instance
|
162
|
+
end
|
163
|
+
end
|
70
164
|
end
|
165
|
+
|
71
166
|
end
|
167
|
+
# before(:each) do
|
168
|
+
# @spec = mock('AdapterSpecification') do
|
169
|
+
# stubs(:adapter_method).returns(:dummy_adapter)
|
170
|
+
# stubs(:config)
|
171
|
+
# end
|
172
|
+
#
|
173
|
+
# @adapter = mock('AbstractAdapter') do
|
174
|
+
# stubs(:verify!)
|
175
|
+
# end
|
176
|
+
#
|
177
|
+
# @pool = NinjaModel::Adapters::AdapterPool.new(@spec)
|
178
|
+
# @thread = mock('thread') do
|
179
|
+
# stubs('object_id').returns(123)
|
180
|
+
# end
|
181
|
+
# Thread.stubs(:current).returns(@thread)
|
182
|
+
# NinjaModel::Base.stubs(:dummy_adapter).returns(@adapter)
|
183
|
+
# end
|
184
|
+
#
|
185
|
+
# it 'should properly respond to connected?' do
|
186
|
+
# @pool.connected?.should be_false
|
187
|
+
# @pool.instance
|
188
|
+
# @pool.connected?.should be_true
|
189
|
+
# end
|
190
|
+
#
|
191
|
+
# it 'should initialize from an AdapterSpecification' do
|
192
|
+
# spec = mock('AdapterSpecification')
|
193
|
+
# NinjaModel::Adapters::AdapterPool.new(spec).spec.should eql(spec)
|
194
|
+
# end
|
195
|
+
#
|
196
|
+
# it 'should return a valid instance_id' do
|
197
|
+
# (@pool.send :current_instance_id).should eql(@thread.object_id)
|
198
|
+
# end
|
199
|
+
#
|
200
|
+
# describe 'when creating an instance' do
|
201
|
+
# it 'should create a valid instance' do
|
202
|
+
# (@pool.send :new_instance).should eql(@adapter)
|
203
|
+
# end
|
204
|
+
#
|
205
|
+
# it 'should store the instance' do
|
206
|
+
# @pool.stubs(:new_instance).returns(@adapter)
|
207
|
+
# @pool.instance
|
208
|
+
# @pool.instances.should include(@adapter)
|
209
|
+
# end
|
210
|
+
#
|
211
|
+
# it 'should assign the instance to the current_thread' do
|
212
|
+
# @pool.stubs(:new_instance).returns(@adapter)
|
213
|
+
# @pool.instance
|
214
|
+
# @pool.stubs(:checkout).returns("new_instance")
|
215
|
+
# @pool.instance.should_not eql("new_instance")
|
216
|
+
# @pool.instance.should eql(@adapter)
|
217
|
+
# end
|
218
|
+
#
|
219
|
+
# it 'should reuse an unallocated instance' do
|
220
|
+
# @pool.stubs(:current_instance_id).returns(123)
|
221
|
+
# inst = @pool.instance
|
222
|
+
# @pool.release_instance(123)
|
223
|
+
# @pool.instance.should eql(inst)
|
224
|
+
# end
|
225
|
+
# end
|
226
|
+
#
|
227
|
+
# it 'should properly allocate/deallocate instances' do
|
228
|
+
# @pool.stubs(:current_instance_id).returns(123)
|
229
|
+
# @pool.expects(:checkout).returns(@adapter)
|
230
|
+
# @pool.expects(:checkin)
|
231
|
+
# @pool.with_instance do |instance|
|
232
|
+
# end
|
233
|
+
# end
|
72
234
|
end
|