sequel 0.1.9.10 → 0.1.9.11
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/CHANGELOG +6 -2
- data/Rakefile +1 -1
- data/lib/sequel/dataset.rb +46 -27
- data/spec/dataset_spec.rb +42 -18
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -1,14 +1,18 @@
|
|
1
|
+
=== 0.19.11 (2007-08-24)
|
2
|
+
|
3
|
+
* Changed Dataset#set_model to allow supplying additional arguments to the model's initialize method (#35). Thanks Sunny Hirai.
|
4
|
+
|
1
5
|
=== 0.19.10 (2007-08-22)
|
2
6
|
|
3
7
|
* Changed schema generation code to generate separate statements for CREATE TABLE and each CREATE INDEX (#34).
|
4
8
|
|
5
|
-
* Refactored Dataset::SQL#field_name for better support of different quoting
|
9
|
+
* Refactored Dataset::SQL#field_name for better support of different field quoting standards by specific adapters.
|
6
10
|
|
7
11
|
* Added #current_page_record_count for paginated datasets.
|
8
12
|
|
9
13
|
* Removed Database#literal and included Dataset::SQL instead.
|
10
14
|
|
11
|
-
* Sequel::Dataset:SQL#field_name can now take a hash (as well as #select and any method that uses #field_name) for aliasing column names. E.g.
|
15
|
+
* Sequel::Dataset:SQL#field_name can now take a hash (as well as #select and any method that uses #field_name) for aliasing column names. E.g. DB[:test].select(:_qqa => 'Date').sql #=> 'SELECT _qqa AS Date FROM test'.
|
12
16
|
|
13
17
|
* Moved SingleThreadedPool to lib/sequel/connection_pool.rb.
|
14
18
|
|
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ require 'fileutils'
|
|
6
6
|
include FileUtils
|
7
7
|
|
8
8
|
NAME = "sequel"
|
9
|
-
VERS = "0.1.9.
|
9
|
+
VERS = "0.1.9.11"
|
10
10
|
CLEAN.include ['**/.*.sw?', 'pkg/*', '.config', 'doc/*', 'coverage/*']
|
11
11
|
RDOC_OPTS = ['--quiet', '--title', "Sequel: Concise ORM for Ruby",
|
12
12
|
"--opname", "index.html",
|
data/lib/sequel/dataset.rb
CHANGED
@@ -179,33 +179,56 @@ module Sequel
|
|
179
179
|
# class MyModel
|
180
180
|
# def initialize(values)
|
181
181
|
# @values = values
|
182
|
+
# ...
|
182
183
|
# end
|
183
184
|
# end
|
184
185
|
#
|
185
186
|
# dataset.set_model(MyModel)
|
186
187
|
#
|
188
|
+
# You can also provide additional arguments to be passed to the model's
|
189
|
+
# initialize method:
|
190
|
+
#
|
191
|
+
# class MyModel
|
192
|
+
# def initialize(values, options)
|
193
|
+
# @values = values
|
194
|
+
# ...
|
195
|
+
# end
|
196
|
+
# end
|
197
|
+
#
|
198
|
+
# dataset.set_model(MyModel, :allow_delete => false)
|
199
|
+
#
|
187
200
|
# The dataset can be made polymorphic by specifying a column name as the
|
188
201
|
# polymorphic key and a hash mapping column values to model classes.
|
189
202
|
#
|
190
203
|
# dataset.set_model(:kind, {1 => Person, 2 => Business})
|
191
204
|
#
|
192
|
-
|
193
|
-
|
194
|
-
|
205
|
+
# You can also set a default model class to fall back on by specifying a
|
206
|
+
# class corresponding to nil:
|
207
|
+
#
|
208
|
+
# dataset.set_model(:kind, {nil => DefaultClass, 1 => Person, 2 => Business})
|
209
|
+
#
|
210
|
+
# To disassociate a model from the dataset, you can call the #set_model
|
211
|
+
# and specify nil as the class:
|
212
|
+
#
|
213
|
+
# dataset.set_model(nil)
|
214
|
+
#
|
215
|
+
def set_model(key, *args)
|
216
|
+
# pattern matching
|
217
|
+
case key
|
218
|
+
when nil: # set_model(nil) => no
|
219
|
+
# no argument provided, so the dataset is denuded
|
195
220
|
@opts.merge!(:naked => true, :models => nil, :polymorphic_key => nil)
|
196
221
|
extend_with_stock_each
|
197
|
-
|
198
|
-
#
|
199
|
-
|
200
|
-
|
201
|
-
extend_with_model(c)
|
222
|
+
when Class:
|
223
|
+
# isomorphic model
|
224
|
+
@opts.merge!(:naked => nil, :models => {nil => key}, :polymorphic_key => nil)
|
225
|
+
extend_with_model(key, *args)
|
202
226
|
extend_with_destroy
|
203
|
-
|
204
|
-
#
|
205
|
-
|
206
|
-
key, hash = args
|
227
|
+
when Symbol:
|
228
|
+
# polymorphic model
|
229
|
+
hash = args.shift || raise(SequelError, "No class hash supplied for polymorphic model")
|
207
230
|
@opts.merge!(:naked => true, :models => hash, :polymorphic_key => key)
|
208
|
-
extend_with_polymorphic_model(key, hash)
|
231
|
+
extend_with_polymorphic_model(key, hash, *args)
|
209
232
|
extend_with_destroy
|
210
233
|
else
|
211
234
|
raise SequelError, "Invalid parameters specified"
|
@@ -215,15 +238,14 @@ module Sequel
|
|
215
238
|
|
216
239
|
private
|
217
240
|
# Overrides the each method to convert records to model instances.
|
218
|
-
def extend_with_model(c)
|
219
|
-
meta_def(:
|
241
|
+
def extend_with_model(c, *args)
|
242
|
+
meta_def(:make_model_instance) {|r| c.new(r, *args)}
|
220
243
|
m = Module.new do
|
221
244
|
def each(opts = nil, &block)
|
222
|
-
c = model_class
|
223
245
|
if opts && opts[:naked]
|
224
246
|
fetch_rows(select_sql(opts), &block)
|
225
247
|
else
|
226
|
-
fetch_rows(select_sql(opts)) {|r| block.call(
|
248
|
+
fetch_rows(select_sql(opts)) {|r| block.call(make_model_instance(r))}
|
227
249
|
end
|
228
250
|
end
|
229
251
|
end
|
@@ -233,21 +255,18 @@ module Sequel
|
|
233
255
|
# Overrides the each method to convert records to polymorphic model
|
234
256
|
# instances. The model class is determined according to the value in the
|
235
257
|
# key column.
|
236
|
-
def extend_with_polymorphic_model(key, hash)
|
237
|
-
meta_def(:
|
258
|
+
def extend_with_polymorphic_model(key, hash, *args)
|
259
|
+
meta_def(:make_model_instance) do |r|
|
260
|
+
c = hash[r[key]] || hash[nil] || \
|
261
|
+
raise(SequelError, "No matching model class for record (#{polymorphic_key} => #{r[polymorphic_key].inspect})")
|
262
|
+
c.new(r, *args)
|
263
|
+
end
|
238
264
|
m = Module.new do
|
239
265
|
def each(opts = nil, &block)
|
240
266
|
if opts && opts[:naked]
|
241
267
|
fetch_rows(select_sql(opts), &block)
|
242
268
|
else
|
243
|
-
fetch_rows(select_sql(opts))
|
244
|
-
c = model_class(r)
|
245
|
-
if c
|
246
|
-
block.call(c.new(r))
|
247
|
-
else
|
248
|
-
raise SequelError, "No matching model class for record (#{polymorphic_key} = #{r[polymorphic_key].inspect})"
|
249
|
-
end
|
250
|
-
end
|
269
|
+
fetch_rows(select_sql(opts)) {|r| block.call(make_model_instance(r))}
|
251
270
|
end
|
252
271
|
end
|
253
272
|
end
|
data/spec/dataset_spec.rb
CHANGED
@@ -1150,35 +1150,36 @@ context "Dataset#set_model" do
|
|
1150
1150
|
setup do
|
1151
1151
|
@c = Class.new(Sequel::Dataset) do
|
1152
1152
|
def fetch_rows(sql, &block)
|
1153
|
-
|
1153
|
+
# yield a hash with kind as the 1 bit of a number
|
1154
|
+
(1..10).each {|i| block.call({:kind => i[0]})}
|
1154
1155
|
end
|
1155
1156
|
end
|
1156
1157
|
@dataset = @c.new(nil).from(:items)
|
1157
1158
|
@m = Class.new do
|
1158
|
-
attr_accessor :c
|
1159
|
-
def initialize(c); @c = c; end
|
1160
|
-
def ==(o); @c == o.c; end
|
1159
|
+
attr_accessor :c, :args
|
1160
|
+
def initialize(c, *args); @c = c; @args = args; end
|
1161
|
+
def ==(o); (@c == o.c) && (@args = o.args); end
|
1161
1162
|
end
|
1162
1163
|
end
|
1163
1164
|
|
1164
1165
|
specify "should clear the models hash and restore the stock #each if nil is specified" do
|
1165
1166
|
@dataset.set_model(@m)
|
1166
1167
|
@dataset.set_model(nil)
|
1167
|
-
@dataset.first.should == 1
|
1168
|
+
@dataset.first.should == {:kind => 1}
|
1168
1169
|
@dataset.model_classes.should be_nil
|
1169
1170
|
end
|
1170
1171
|
|
1171
1172
|
specify "should clear the models hash and restore the stock #each if nothing is specified" do
|
1172
1173
|
@dataset.set_model(@m)
|
1173
|
-
@dataset.set_model
|
1174
|
-
@dataset.first.should == 1
|
1174
|
+
@dataset.set_model(nil)
|
1175
|
+
@dataset.first.should == {:kind => 1}
|
1175
1176
|
@dataset.model_classes.should be_nil
|
1176
1177
|
end
|
1177
1178
|
|
1178
1179
|
specify "should alter #each to provide model instances" do
|
1179
|
-
@dataset.first.should == 1
|
1180
|
+
@dataset.first.should == {:kind => 1}
|
1180
1181
|
@dataset.set_model(@m)
|
1181
|
-
@dataset.first.should == @m.new(1)
|
1182
|
+
@dataset.first.should == @m.new({:kind => 1})
|
1182
1183
|
end
|
1183
1184
|
|
1184
1185
|
specify "should extend the dataset with a #destroy method" do
|
@@ -1193,20 +1194,43 @@ context "Dataset#set_model" do
|
|
1193
1194
|
@dataset.opts[:naked].should be_nil
|
1194
1195
|
end
|
1195
1196
|
|
1197
|
+
specify "should send additional arguments to the models' initialize method" do
|
1198
|
+
@dataset.set_model(@m, 7, 6, 5)
|
1199
|
+
@dataset.first.should == @m.new({:kind => 1}, 7, 6, 5)
|
1200
|
+
end
|
1201
|
+
|
1196
1202
|
specify "should provide support for polymorphic model instantiation" do
|
1197
1203
|
@m1 = Class.new(@m)
|
1198
1204
|
@m2 = Class.new(@m)
|
1199
|
-
@dataset.set_model(
|
1205
|
+
@dataset.set_model(:kind, 0 => @m1, 1 => @m2)
|
1206
|
+
@dataset.opts[:polymorphic_key].should == :kind
|
1200
1207
|
all = @dataset.all
|
1201
1208
|
all[0].class.should == @m2
|
1202
1209
|
all[1].class.should == @m1
|
1203
1210
|
all[2].class.should == @m2
|
1204
1211
|
all[3].class.should == @m1
|
1205
1212
|
#...
|
1213
|
+
|
1214
|
+
# denude model
|
1215
|
+
@dataset.set_model(nil)
|
1216
|
+
@dataset.first.should == {:kind => 1}
|
1217
|
+
end
|
1218
|
+
|
1219
|
+
specify "should send additional arguments for polymorphic models as well" do
|
1220
|
+
@m1 = Class.new(@m)
|
1221
|
+
@m2 = Class.new(@m)
|
1222
|
+
@dataset.set_model(:kind, {0 => @m1, 1 => @m2}, :hey => :wow)
|
1223
|
+
all = @dataset.all
|
1224
|
+
all[0].class.should == @m2; all[0].args.should == [{:hey => :wow}]
|
1225
|
+
all[1].class.should == @m1; all[1].args.should == [{:hey => :wow}]
|
1226
|
+
all[2].class.should == @m2; all[2].args.should == [{:hey => :wow}]
|
1227
|
+
all[3].class.should == @m1; all[3].args.should == [{:hey => :wow}]
|
1206
1228
|
end
|
1207
1229
|
|
1208
|
-
specify "should raise
|
1209
|
-
proc {@dataset.set_model(
|
1230
|
+
specify "should raise for invalid parameters" do
|
1231
|
+
proc {@dataset.set_model('kind')}.should raise_error(SequelError)
|
1232
|
+
proc {@dataset.set_model(0)}.should raise_error(SequelError)
|
1233
|
+
proc {@dataset.set_model(:kind)}.should raise_error(SequelError) # no hash given
|
1210
1234
|
end
|
1211
1235
|
end
|
1212
1236
|
|
@@ -1238,7 +1262,7 @@ context "Dataset#model_classes" do
|
|
1238
1262
|
specify "should return the polymorphic hash for a polymorphic model dataset" do
|
1239
1263
|
@m1 = Class.new(@m)
|
1240
1264
|
@m2 = Class.new(@m)
|
1241
|
-
@dataset.set_model(
|
1265
|
+
@dataset.set_model(:key, 0 => @m1, 1 => @m2)
|
1242
1266
|
@dataset.model_classes.should == {0 => @m1, 1 => @m2}
|
1243
1267
|
end
|
1244
1268
|
end
|
@@ -1295,7 +1319,7 @@ context "A polymorphic model dataset" do
|
|
1295
1319
|
setup do
|
1296
1320
|
@c = Class.new(Sequel::Dataset) do
|
1297
1321
|
def fetch_rows(sql, &block)
|
1298
|
-
(1..10).each(
|
1322
|
+
(1..10).each {|i| block.call(:bit => i[0])}
|
1299
1323
|
end
|
1300
1324
|
end
|
1301
1325
|
@dataset = @c.new(nil).from(:items)
|
@@ -1308,7 +1332,7 @@ context "A polymorphic model dataset" do
|
|
1308
1332
|
|
1309
1333
|
specify "should use a nil key in the polymorphic hash to specify the default model class" do
|
1310
1334
|
@m2 = Class.new(@m)
|
1311
|
-
@dataset.set_model(
|
1335
|
+
@dataset.set_model(:bit, nil => @m, 1 => @m2)
|
1312
1336
|
all = @dataset.all
|
1313
1337
|
all[0].class.should == @m2
|
1314
1338
|
all[1].class.should == @m
|
@@ -1319,13 +1343,13 @@ context "A polymorphic model dataset" do
|
|
1319
1343
|
|
1320
1344
|
specify "should raise SequelError if no suitable class is found in the polymorphic hash" do
|
1321
1345
|
@m2 = Class.new(@m)
|
1322
|
-
@dataset.set_model(
|
1346
|
+
@dataset.set_model(:bit, 1 => @m2)
|
1323
1347
|
proc {@dataset.all}.should raise_error(SequelError)
|
1324
1348
|
end
|
1325
1349
|
|
1326
1350
|
specify "should supply naked records if the naked option is specified" do
|
1327
|
-
@dataset.set_model(
|
1328
|
-
@dataset.each(:naked => true) {|r| r.class.should ==
|
1351
|
+
@dataset.set_model(:bit, nil => @m)
|
1352
|
+
@dataset.each(:naked => true) {|r| r.class.should == Hash}
|
1329
1353
|
end
|
1330
1354
|
end
|
1331
1355
|
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: sequel
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.9.
|
7
|
-
date: 2007-08-
|
6
|
+
version: 0.1.9.11
|
7
|
+
date: 2007-08-24 00:00:00 +03:00
|
8
8
|
summary: Lightweight ORM library for Ruby
|
9
9
|
require_paths:
|
10
10
|
- lib
|