dm-core 0.9.5 → 0.9.6
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/Manifest.txt +3 -0
- data/lib/dm-core.rb +14 -20
- data/lib/dm-core/adapters.rb +18 -0
- data/lib/dm-core/adapters/abstract_adapter.rb +17 -10
- data/lib/dm-core/adapters/data_objects_adapter.rb +17 -22
- data/lib/dm-core/adapters/in_memory_adapter.rb +87 -0
- data/lib/dm-core/adapters/mysql_adapter.rb +1 -1
- data/lib/dm-core/adapters/postgres_adapter.rb +2 -2
- data/lib/dm-core/adapters/sqlite3_adapter.rb +1 -1
- data/lib/dm-core/associations.rb +3 -2
- data/lib/dm-core/associations/many_to_many.rb +3 -3
- data/lib/dm-core/associations/one_to_many.rb +10 -2
- data/lib/dm-core/associations/relationship.rb +20 -16
- data/lib/dm-core/auto_migrations.rb +5 -4
- data/lib/dm-core/collection.rb +10 -6
- data/lib/dm-core/dependency_queue.rb +2 -1
- data/lib/dm-core/identity_map.rb +3 -6
- data/lib/dm-core/model.rb +48 -27
- data/lib/dm-core/property.rb +57 -37
- data/lib/dm-core/property_set.rb +29 -22
- data/lib/dm-core/query.rb +57 -49
- data/lib/dm-core/repository.rb +3 -3
- data/lib/dm-core/resource.rb +17 -15
- data/lib/dm-core/scope.rb +7 -7
- data/lib/dm-core/support/kernel.rb +6 -2
- data/lib/dm-core/transaction.rb +7 -7
- data/lib/dm-core/version.rb +1 -1
- data/script/performance.rb +114 -22
- data/spec/integration/association_spec.rb +31 -2
- data/spec/integration/association_through_spec.rb +2 -0
- data/spec/integration/associations/many_to_many_spec.rb +152 -0
- data/spec/integration/associations/one_to_many_spec.rb +40 -3
- data/spec/integration/dependency_queue_spec.rb +0 -12
- data/spec/integration/postgres_adapter_spec.rb +1 -1
- data/spec/integration/property_spec.rb +3 -3
- data/spec/integration/query_spec.rb +39 -8
- data/spec/integration/resource_spec.rb +10 -6
- data/spec/integration/sti_spec.rb +22 -0
- data/spec/integration/strategic_eager_loading_spec.rb +21 -6
- data/spec/integration/type_spec.rb +1 -0
- data/spec/lib/model_loader.rb +10 -1
- data/spec/models/content.rb +16 -0
- data/spec/spec_helper.rb +4 -1
- data/spec/unit/adapters/data_objects_adapter_spec.rb +11 -11
- data/spec/unit/adapters/in_memory_adapter_spec.rb +98 -0
- data/spec/unit/associations/many_to_many_spec.rb +16 -1
- data/spec/unit/model_spec.rb +0 -16
- data/spec/unit/property_set_spec.rb +8 -1
- data/spec/unit/property_spec.rb +476 -240
- data/spec/unit/query_spec.rb +41 -0
- data/spec/unit/resource_spec.rb +75 -56
- data/tasks/ci.rb +4 -36
- data/tasks/dm.rb +3 -3
- metadata +5 -2
@@ -103,6 +103,22 @@ describe "OneToMany" do
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
+
describe "parent initialized child" do
|
107
|
+
before(:each) do
|
108
|
+
@ajax = Team.create
|
109
|
+
@vandesar = @ajax.players.new
|
110
|
+
@vandesar.save
|
111
|
+
end
|
112
|
+
|
113
|
+
it "child association should return parent" do
|
114
|
+
@vandesar.team.should == @ajax
|
115
|
+
end
|
116
|
+
|
117
|
+
it "parent association should return children" do
|
118
|
+
@ajax.players.should == [@vandesar]
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
106
122
|
it "unsaved parent model should accept array of hashes for association" do
|
107
123
|
players = [{ :name => "Brett Favre" }, { :name => "Reggie White" }]
|
108
124
|
|
@@ -139,12 +155,33 @@ describe "OneToMany" do
|
|
139
155
|
end
|
140
156
|
|
141
157
|
describe "STI" do
|
142
|
-
|
158
|
+
before(:all) do
|
159
|
+
repository(ADAPTER) do
|
160
|
+
@player = Player.create(:name => "Barry Bonds", :team => BaseballTeam.first)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
it "should work for child.parent" do
|
143
165
|
repository(ADAPTER) do
|
144
|
-
|
166
|
+
@player.team.should == BaseballTeam.first
|
145
167
|
end
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should work for parent.children" do
|
171
|
+
repository(ADAPTER) do
|
172
|
+
team = BaseballTeam.first
|
173
|
+
|
174
|
+
team.players.size.should > 0
|
175
|
+
team.players.each{|p| p.should be_an_instance_of(Player)}
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
describe "alone" do
|
181
|
+
it "should work for parent.children without any parents in IM" do
|
146
182
|
repository(ADAPTER) do
|
147
|
-
|
183
|
+
team = BaseballTeam.first
|
184
|
+
team.players.each{|p| p.should be_an_instance_of(Player)}
|
148
185
|
end
|
149
186
|
end
|
150
187
|
end
|
@@ -6,18 +6,6 @@ describe "DataMapper::DependencyQueue" do
|
|
6
6
|
@dependencies = @q.instance_variable_get("@dependencies")
|
7
7
|
end
|
8
8
|
|
9
|
-
describe "#initialize" do
|
10
|
-
describe "@dependencies" do
|
11
|
-
it "should be a hash after initialize" do
|
12
|
-
@dependencies.should be_a_kind_of(Hash)
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should set value to [] when new key is accessed" do
|
16
|
-
@dependencies['New Key'].should == []
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
9
|
describe "#add" do
|
22
10
|
it "should store the supplied callback in @dependencies" do
|
23
11
|
@q.add('MissingConstant') { true }
|
@@ -61,7 +61,7 @@ if ADAPTER
|
|
61
61
|
jon.original_values[:location].should == 'dallas'
|
62
62
|
|
63
63
|
jon.dirty?.should be_false
|
64
|
-
jon.save.should
|
64
|
+
jon.save.should be_true
|
65
65
|
|
66
66
|
jon.location.upcase!
|
67
67
|
jon.location.should == 'DALLAS'
|
@@ -115,10 +115,10 @@ if ADAPTER
|
|
115
115
|
tim = Actor.first(:name => 'tim')
|
116
116
|
tim.notes # make sure they're loaded...
|
117
117
|
tim.dirty?.should be_false
|
118
|
-
tim.save.should
|
118
|
+
tim.save.should be_true
|
119
119
|
tim.notes = "Testing"
|
120
120
|
tim.dirty?.should be_true
|
121
|
-
tim.save
|
121
|
+
tim.save.should be_true
|
122
122
|
end
|
123
123
|
repository(ADAPTER) do
|
124
124
|
tim = Actor.first(:name => 'tim')
|
@@ -128,7 +128,7 @@ if ADAPTER
|
|
128
128
|
describe '#unique' do
|
129
129
|
include LoggingHelper
|
130
130
|
|
131
|
-
before do
|
131
|
+
before(:each) do
|
132
132
|
QuerySpec::SailBoat.auto_migrate!
|
133
133
|
|
134
134
|
QuerySpec::SailBoat.create(:name => 'A', :port => 'C')
|
@@ -203,7 +203,7 @@ if ADAPTER
|
|
203
203
|
end
|
204
204
|
|
205
205
|
describe 'when ordering' do
|
206
|
-
before do
|
206
|
+
before(:each) do
|
207
207
|
QuerySpec::SailBoat.auto_migrate!
|
208
208
|
|
209
209
|
QuerySpec::SailBoat.create(:name => 'A', :port => 'C')
|
@@ -258,12 +258,43 @@ if ADAPTER
|
|
258
258
|
|
259
259
|
find = QuerySpec::SailBoat.all(:id.not => [1,2])
|
260
260
|
find.should have(1).entries
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
describe "conditions passed in as an empty array" do
|
265
|
+
it "should work when id is an empty Array" do
|
266
|
+
repository(ADAPTER) do
|
267
|
+
find = QuerySpec::SailBoat.all(:id => [])
|
268
|
+
find.should have(0).entries
|
269
|
+
end
|
270
|
+
end
|
261
271
|
|
262
|
-
|
263
|
-
|
272
|
+
it "should work when id is NOT an empty Array" do
|
273
|
+
repository(ADAPTER) do
|
274
|
+
find = QuerySpec::SailBoat.all(:id.not => [])
|
275
|
+
find.should have(3).entries
|
276
|
+
end
|
277
|
+
end
|
264
278
|
|
265
|
-
|
266
|
-
|
279
|
+
it "should work when id is an empty Array and other conditions are specified" do
|
280
|
+
repository(ADAPTER) do
|
281
|
+
find = QuerySpec::SailBoat.all(:id => [], :name => "A")
|
282
|
+
find.should have(0).entries
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
it "should work when id is NOT an empty Array and other conditions are specified" do
|
287
|
+
repository(ADAPTER) do
|
288
|
+
find = QuerySpec::SailBoat.all(:id.not => [], :name => "A")
|
289
|
+
find.should have(1).entries
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
it "should work when id is NOT an empty Array and other Array conditions are specified" do
|
294
|
+
repository(ADAPTER) do
|
295
|
+
find = QuerySpec::SailBoat.all(:id.not => [], :name => ["A", "B"])
|
296
|
+
find.should have(2).entries
|
297
|
+
end
|
267
298
|
end
|
268
299
|
end
|
269
300
|
|
@@ -301,7 +332,7 @@ if ADAPTER
|
|
301
332
|
end
|
302
333
|
|
303
334
|
describe 'when sub-selecting' do
|
304
|
-
before do
|
335
|
+
before(:each) do
|
305
336
|
[ QuerySpec::SailBoat, QuerySpec::Permission ].each { |m| m.auto_migrate! }
|
306
337
|
|
307
338
|
QuerySpec::SailBoat.create(:id => 1, :name => "Fantasy I", :port => "Cape Town", :captain => 'Joe')
|
@@ -347,7 +378,7 @@ if ADAPTER
|
|
347
378
|
end # describe sub-selecting
|
348
379
|
|
349
380
|
describe 'when linking associated objects' do
|
350
|
-
before do
|
381
|
+
before(:each) do
|
351
382
|
[ QuerySpec::Region, QuerySpec::Factory, QuerySpec::Vehicle ].each { |m| m.auto_migrate! }
|
352
383
|
|
353
384
|
QuerySpec::Region.create(:id => 1, :name => 'North West', :type => 'commercial')
|
@@ -77,9 +77,11 @@ if ADAPTER
|
|
77
77
|
end
|
78
78
|
|
79
79
|
it "should return a different hash value for different objects of the same type" do
|
80
|
-
|
81
|
-
|
82
|
-
|
80
|
+
repository(ADAPTER) do
|
81
|
+
e1 = Employee.create(:name => "John")
|
82
|
+
e2 = Employee.create(:name => "Dan")
|
83
|
+
e1.hash.should_not == e2.hash
|
84
|
+
end
|
83
85
|
end
|
84
86
|
|
85
87
|
it "should return a different hash value for different types of objects with the same key"
|
@@ -96,9 +98,11 @@ if ADAPTER
|
|
96
98
|
describe '#key' do
|
97
99
|
describe "original_value[:key]" do
|
98
100
|
it "should be used when an existing resource's key changes" do
|
99
|
-
|
100
|
-
|
101
|
-
|
101
|
+
repository(ADAPTER) do
|
102
|
+
employee = Employee.create(:name => "John")
|
103
|
+
employee.name = "Jon"
|
104
|
+
employee.key.should == ["John"]
|
105
|
+
end
|
102
106
|
end
|
103
107
|
|
104
108
|
it "should be used when saving an existing resource" do
|
@@ -204,5 +204,27 @@ if HAS_SQLITE3
|
|
204
204
|
SpaceWestern.properties[:title].should_not be_nil
|
205
205
|
end
|
206
206
|
end
|
207
|
+
|
208
|
+
describe "with a child class" do
|
209
|
+
before :all do
|
210
|
+
Book.auto_migrate!(:sqlite3)
|
211
|
+
repository(:sqlite3) do
|
212
|
+
ShortStory.create(
|
213
|
+
:title => "The Science of Happiness",
|
214
|
+
:isbn => "129038",
|
215
|
+
:moral => "Bullshit might get you to the top, but it won't keep you there.")
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
it "should be able to access the properties from the parent collection" do
|
220
|
+
repository(:sqlite3) do
|
221
|
+
Book.all.each do |book|
|
222
|
+
book.title.should_not be_nil
|
223
|
+
book.isbn.should_not be_nil
|
224
|
+
book.moral.should_not be_nil
|
225
|
+
end
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
207
229
|
end
|
208
230
|
end
|
@@ -64,8 +64,12 @@ describe "Strategic Eager Loading" do
|
|
64
64
|
zoos = Zoo.all.entries # load all zoos
|
65
65
|
dallas = zoos.find { |z| z.name == 'Dallas Zoo' }
|
66
66
|
|
67
|
-
|
68
|
-
|
67
|
+
logger do |log|
|
68
|
+
dallas.exhibits.entries # load all exhibits for zoos in identity_map
|
69
|
+
dallas.exhibits.size.should == 1
|
70
|
+
log.readlines.size.should == 1
|
71
|
+
end
|
72
|
+
|
69
73
|
repository.identity_map(Zoo).keys.sort.should == zoo_ids
|
70
74
|
repository.identity_map(Exhibit).keys.sort.should == exhibit_ids
|
71
75
|
|
@@ -88,16 +92,21 @@ describe "Strategic Eager Loading" do
|
|
88
92
|
dallas = Zoo.all.entries.find { |z| z.name == 'Dallas Zoo' }
|
89
93
|
exhibits = dallas.exhibits.entries # load all exhibits
|
90
94
|
|
95
|
+
reptiles, primates = nil, nil
|
96
|
+
|
91
97
|
logger do |log|
|
92
98
|
reptiles = dallas.exhibits(:name => 'Reptiles')
|
93
99
|
reptiles.size.should == 1
|
100
|
+
log.readlines.size.should == 1
|
101
|
+
end
|
94
102
|
|
103
|
+
logger do |log|
|
95
104
|
primates = dallas.exhibits(:name => 'Primates')
|
96
105
|
primates.size.should == 1
|
97
|
-
|
98
|
-
|
99
|
-
log.readlines.size.should == 2
|
106
|
+
log.readlines.size.should == 1
|
100
107
|
end
|
108
|
+
|
109
|
+
primates.should_not == reptiles
|
101
110
|
end
|
102
111
|
end
|
103
112
|
|
@@ -109,7 +118,12 @@ describe "Strategic Eager Loading" do
|
|
109
118
|
repository(ADAPTER) do
|
110
119
|
animals = Animal.all.entries
|
111
120
|
bear = animals.find { |a| a.name == 'Brown Bear' }
|
112
|
-
|
121
|
+
|
122
|
+
logger do |log|
|
123
|
+
bear.exhibit
|
124
|
+
log.readlines.size.should == 1
|
125
|
+
end
|
126
|
+
|
113
127
|
repository.identity_map(Animal).keys.sort.should == animal_ids
|
114
128
|
repository.identity_map(Exhibit).keys.sort.should == exhibit_ids
|
115
129
|
end
|
@@ -124,6 +138,7 @@ describe "Strategic Eager Loading" do
|
|
124
138
|
animal.exhibit # load exhibit from IM
|
125
139
|
log.readlines.should be_empty
|
126
140
|
end
|
141
|
+
|
127
142
|
repository.identity_map(Exhibit).keys.should == [exhibit.key]
|
128
143
|
end
|
129
144
|
end
|
data/spec/lib/model_loader.rb
CHANGED
@@ -81,7 +81,16 @@ module ModelLoader
|
|
81
81
|
|
82
82
|
def remove_model(klass)
|
83
83
|
DataMapper::Resource.descendants.delete(klass)
|
84
|
-
|
84
|
+
# Check to see if the model is living inside a module
|
85
|
+
klass_name = klass.to_s
|
86
|
+
if klass_name.index("::")
|
87
|
+
mod = klass_name.match(/(\S+)::/)[1]
|
88
|
+
child_class = klass_name.match(/\S+::(\S+)/)[1]
|
89
|
+
|
90
|
+
Object.const_get(mod).module_eval { remove_const child_class }
|
91
|
+
else
|
92
|
+
Object.module_eval { remove_const klass.to_s }
|
93
|
+
end
|
85
94
|
end
|
86
95
|
end
|
87
96
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Content
|
2
|
+
class Dialect
|
3
|
+
include DataMapper::Resource
|
4
|
+
|
5
|
+
property :id, Serial
|
6
|
+
property :name, String
|
7
|
+
property :code, String
|
8
|
+
end
|
9
|
+
|
10
|
+
class Locale
|
11
|
+
include DataMapper::Resource
|
12
|
+
|
13
|
+
property :id, Serial
|
14
|
+
property :name, String
|
15
|
+
end
|
16
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -12,7 +12,10 @@ Dir[DataMapper.root / 'spec' / 'lib' / '*.rb'].each do |file|
|
|
12
12
|
end
|
13
13
|
|
14
14
|
# setup mock adapters
|
15
|
-
|
15
|
+
DataMapper.setup(:default, "sqlite3::memory:")
|
16
|
+
DataMapper.setup(:default2, "sqlite3::memory:")
|
17
|
+
|
18
|
+
[ :mock, :legacy, :west_coast, :east_coast ].each do |repository_name|
|
16
19
|
DataMapper.setup(repository_name, "mock://localhost/#{repository_name}")
|
17
20
|
end
|
18
21
|
|
@@ -73,7 +73,7 @@ describe DataMapper::Adapters::DataObjectsAdapter do
|
|
73
73
|
end
|
74
74
|
|
75
75
|
it "should accept a Query argument with or without options hash" do
|
76
|
-
@connection.should_receive(:create_command).twice.with('SELECT "name" FROM "plupps" WHERE "name" = ? ORDER BY "id"').and_return(@command)
|
76
|
+
@connection.should_receive(:create_command).twice.with('SELECT "name" FROM "plupps" WHERE ("name" = ?) ORDER BY "id"').and_return(@command)
|
77
77
|
@command.should_receive(:execute_reader).twice.with('my pretty plur').and_return(@reader)
|
78
78
|
Plupp.should_receive(:repository).any_number_of_times.and_return(@repository)
|
79
79
|
Plupp.should_receive(:repository).any_number_of_times.with(:plupp_repo).and_return(@repository)
|
@@ -116,7 +116,7 @@ describe DataMapper::Adapters::DataObjectsAdapter do
|
|
116
116
|
|
117
117
|
adapter = DataMapper::Adapters::DataObjectsAdapter.new(:spec, options)
|
118
118
|
adapter.uri.should ==
|
119
|
-
|
119
|
+
DataObjects::URI.parse("mysql://me:mypass@davidleal.com:5000/you_can_call_me_al?socket=nosock")
|
120
120
|
end
|
121
121
|
|
122
122
|
it 'should transform a minimal options hash into a URI' do
|
@@ -126,12 +126,12 @@ describe DataMapper::Adapters::DataObjectsAdapter do
|
|
126
126
|
}
|
127
127
|
|
128
128
|
adapter = DataMapper::Adapters::DataObjectsAdapter.new(:spec, options)
|
129
|
-
adapter.uri.should ==
|
129
|
+
adapter.uri.should == DataObjects::URI.parse("mysql:you_can_call_me_al")
|
130
130
|
end
|
131
131
|
|
132
132
|
it 'should accept the uri when no overrides exist' do
|
133
133
|
uri = Addressable::URI.parse("protocol:///")
|
134
|
-
DataMapper::Adapters::DataObjectsAdapter.new(:spec, uri).uri.should == uri
|
134
|
+
DataMapper::Adapters::DataObjectsAdapter.new(:spec, uri).uri.should == DataObjects::URI.parse(uri)
|
135
135
|
end
|
136
136
|
end
|
137
137
|
|
@@ -271,7 +271,7 @@ describe DataMapper::Adapters::DataObjectsAdapter do
|
|
271
271
|
|
272
272
|
@model.should_receive(:load).with(@values, @query).and_return(@resource)
|
273
273
|
|
274
|
-
@statement = 'SELECT "models"."property" FROM "models" INNER JOIN "parents" ON "parents"."id" = "models"."property" WHERE "models"."property" = ? ORDER BY "models"."property" DESC LIMIT 1 OFFSET 222'
|
274
|
+
@statement = 'SELECT "models"."property" FROM "models" INNER JOIN "parents" ON ("parents"."id" = "models"."property") WHERE ("models"."property" = ?) ORDER BY "models"."property" DESC LIMIT 1 OFFSET 222'
|
275
275
|
end
|
276
276
|
|
277
277
|
define_method(:do_read) do
|
@@ -281,7 +281,7 @@ describe DataMapper::Adapters::DataObjectsAdapter do
|
|
281
281
|
end
|
282
282
|
elsif method == :read_many
|
283
283
|
before do
|
284
|
-
@statement = 'SELECT "models"."property" FROM "models" INNER JOIN "parents" ON "parents"."id" = "models"."property" WHERE "models"."property" = ? ORDER BY "models"."property" DESC LIMIT 111 OFFSET 222'
|
284
|
+
@statement = 'SELECT "models"."property" FROM "models" INNER JOIN "parents" ON ("parents"."id" = "models"."property") WHERE ("models"."property" = ?) ORDER BY "models"."property" DESC LIMIT 111 OFFSET 222'
|
285
285
|
end
|
286
286
|
|
287
287
|
define_method(:do_read) do
|
@@ -310,7 +310,7 @@ describe DataMapper::Adapters::DataObjectsAdapter do
|
|
310
310
|
@bind_values << other_value
|
311
311
|
@conditions << [ :eql, other_property, other_value ]
|
312
312
|
|
313
|
-
@statement = %[SELECT "models"."property" FROM "models" INNER JOIN "parents" ON "parents"."id" = "models"."property" WHERE "models"."property" = ? AND "models"."other" = ? ORDER BY "models"."property" DESC LIMIT #{method == :read_one ? '1' : '111'} OFFSET 222]
|
313
|
+
@statement = %[SELECT "models"."property" FROM "models" INNER JOIN "parents" ON ("parents"."id" = "models"."property") WHERE ("models"."property" = ?) AND ("models"."other" = ?) ORDER BY "models"."property" DESC LIMIT #{method == :read_one ? '1' : '111'} OFFSET 222]
|
314
314
|
@query.should_receive(:conditions).with(no_args).twice.and_return(@conditions)
|
315
315
|
|
316
316
|
@connection.should_receive(:create_command).with(@statement).and_return(@command)
|
@@ -358,7 +358,7 @@ describe DataMapper::Adapters::DataObjectsAdapter do
|
|
358
358
|
@conditions = [ [ :eql, @property, @bind_values[0] ] ]
|
359
359
|
@attributes = mock('attributes', :kind_of? => true, :empty? => false, :keys => [ @property ], :values => @values)
|
360
360
|
@query = mock('query', :kind_of? => true, :model => @model, :links => [], :conditions => @conditions, :bind_values => @bind_values)
|
361
|
-
@statement = 'UPDATE "models" SET "property" = ? WHERE "property" = ?'
|
361
|
+
@statement = 'UPDATE "models" SET "property" = ? WHERE ("property" = ?)'
|
362
362
|
end
|
363
363
|
|
364
364
|
def do_update
|
@@ -385,7 +385,7 @@ describe DataMapper::Adapters::DataObjectsAdapter do
|
|
385
385
|
|
386
386
|
@query.should_receive(:conditions).with(no_args).twice.and_return(@conditions)
|
387
387
|
|
388
|
-
@statement = 'UPDATE "models" SET "property" = ? WHERE "property" = ? AND "other" = ?'
|
388
|
+
@statement = 'UPDATE "models" SET "property" = ? WHERE ("property" = ?) AND ("other" = ?)'
|
389
389
|
@adapter.should_receive(:execute).with(@statement, *%w[ new ] + @bind_values).and_return(@result)
|
390
390
|
|
391
391
|
do_update.should == 1
|
@@ -414,7 +414,7 @@ describe DataMapper::Adapters::DataObjectsAdapter do
|
|
414
414
|
@conditions = [ [ :eql, @property, @bind_values[0] ] ]
|
415
415
|
@query = mock('query', :kind_of? => true, :model => @model, :links => [], :conditions => @conditions, :bind_values => @bind_values)
|
416
416
|
@resource = mock('resource', :to_query => @query)
|
417
|
-
@statement = 'DELETE FROM "models" WHERE "property" = ?'
|
417
|
+
@statement = 'DELETE FROM "models" WHERE ("property" = ?)'
|
418
418
|
end
|
419
419
|
|
420
420
|
def do_delete
|
@@ -440,7 +440,7 @@ describe DataMapper::Adapters::DataObjectsAdapter do
|
|
440
440
|
|
441
441
|
@query.should_receive(:conditions).with(no_args).twice.and_return(@conditions)
|
442
442
|
|
443
|
-
@statement = 'DELETE FROM "models" WHERE "property" = ? AND "other" = ?'
|
443
|
+
@statement = 'DELETE FROM "models" WHERE ("property" = ?) AND ("other" = ?)'
|
444
444
|
@adapter.should_receive(:execute).with(@statement, *@bind_values).and_return(@result)
|
445
445
|
|
446
446
|
do_delete.should == 1
|