sequel 0.2.1 → 0.2.1.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/CHANGELOG +18 -0
- data/Rakefile +1 -1
- data/lib/sequel/database.rb +1 -1
- data/lib/sequel/dataset/sequelizer.rb +1 -1
- data/lib/sequel/error.rb +9 -0
- data/lib/sequel/model/base.rb +1 -0
- data/lib/sequel/model/record.rb +1 -1
- data/lib/sequel/model/schema.rb +7 -1
- data/lib/sequel/mysql.rb +3 -3
- data/lib/sequel/odbc.rb +1 -1
- data/lib/sequel/postgres.rb +1 -1
- data/lib/sequel/sqlite.rb +1 -0
- data/spec/adapters/mysql_spec.rb +3 -0
- data/spec/database_spec.rb +10 -0
- data/spec/model_spec.rb +99 -0
- data/spec/sequelizer_spec.rb +14 -3
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,21 @@
|
|
1
|
+
=== 0.2.1.1 (2007-10-07)
|
2
|
+
|
3
|
+
* Added Date literalization to sqlite adapter (#60).
|
4
|
+
|
5
|
+
* Changed Model.serialize to allow calling it after the class is defined (#59).
|
6
|
+
|
7
|
+
* Fixed after_create hooks to allow calling save inside the hook (#58).
|
8
|
+
|
9
|
+
* Fixed MySQL quoting of sql functions (#57).
|
10
|
+
|
11
|
+
* Implemented rollback! global method for cancelling transactions in progress.
|
12
|
+
|
13
|
+
* Fixed =~ operator in Sequelizer.
|
14
|
+
|
15
|
+
* Fixed ODBC::Dataset#fetch_rows (thanks Dusty).
|
16
|
+
|
17
|
+
* Renamed Model.recreate_table to create_table!. recreate_table is deprecated and will issue a warning (#56).
|
18
|
+
|
1
19
|
=== 0.2.1 (2007-09-24)
|
2
20
|
|
3
21
|
* Added default implementation of Model.primary_key_hash.
|
data/Rakefile
CHANGED
@@ -6,7 +6,7 @@ require 'fileutils'
|
|
6
6
|
include FileUtils
|
7
7
|
|
8
8
|
NAME = "sequel"
|
9
|
-
VERS = "0.2.1"
|
9
|
+
VERS = "0.2.1.1"
|
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/database.rb
CHANGED
@@ -236,7 +236,7 @@ class Sequel::Dataset
|
|
236
236
|
"(#{e[1..-1].map {|i| pt_expr(i, b)}.join(" AND ")})"
|
237
237
|
when :or # x || y
|
238
238
|
"(#{pt_expr(e[1], b)} OR #{pt_expr(e[2], b)})"
|
239
|
-
when :call, :vcall, :iter # method calls, blocks
|
239
|
+
when :call, :vcall, :iter, :match3 # method calls, blocks
|
240
240
|
eval_expr(e, b)
|
241
241
|
else # literals
|
242
242
|
if e == [:lvar, :block]
|
data/lib/sequel/error.rb
CHANGED
data/lib/sequel/model/base.rb
CHANGED
data/lib/sequel/model/record.rb
CHANGED
@@ -89,6 +89,7 @@ module Sequel
|
|
89
89
|
@this = nil # remove memoized this dataset
|
90
90
|
refresh
|
91
91
|
end
|
92
|
+
@new = false
|
92
93
|
run_hooks(:after_create)
|
93
94
|
else
|
94
95
|
run_hooks(:before_update)
|
@@ -96,7 +97,6 @@ module Sequel
|
|
96
97
|
run_hooks(:after_update)
|
97
98
|
end
|
98
99
|
run_hooks(:after_save)
|
99
|
-
@new = false
|
100
100
|
self
|
101
101
|
end
|
102
102
|
|
data/lib/sequel/model/schema.rb
CHANGED
@@ -28,9 +28,15 @@ module Sequel
|
|
28
28
|
db.execute db.drop_table_sql(table_name)
|
29
29
|
end
|
30
30
|
|
31
|
-
def self.
|
31
|
+
def self.create_table!
|
32
32
|
drop_table if table_exists?
|
33
33
|
create_table
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.recreate_table
|
38
|
+
warn "Model.recreate_table is deprecated. Please use Model.create_table! instead."
|
39
|
+
create_table!
|
34
40
|
end
|
35
41
|
end
|
36
42
|
end
|
data/lib/sequel/mysql.rb
CHANGED
@@ -133,7 +133,7 @@ module Sequel
|
|
133
133
|
result
|
134
134
|
rescue => e
|
135
135
|
conn.query(SQL_ROLLBACK)
|
136
|
-
raise e
|
136
|
+
raise e unless SequelRollbackError === e
|
137
137
|
ensure
|
138
138
|
@transactions.delete(Thread.current)
|
139
139
|
end
|
@@ -144,10 +144,10 @@ module Sequel
|
|
144
144
|
class Dataset < Sequel::Dataset
|
145
145
|
UNQUOTABLE_FIELD_RE = /^(`(.+)`)|\*$/.freeze
|
146
146
|
def quote_field(f)
|
147
|
-
f =~ UNQUOTABLE_FIELD_RE ? f : "`#{f}`"
|
147
|
+
(f.nil? || f.empty? || f =~ UNQUOTABLE_FIELD_RE) ? f : "`#{f}`"
|
148
148
|
end
|
149
149
|
|
150
|
-
FIELD_EXPR_RE = /^([^\(]+\()?([^\.]+\.)?([^\s\)]+)(\))?(\sAS\s(.+))?$/i.freeze
|
150
|
+
FIELD_EXPR_RE = /^([^\(]+\()?([^\.]+\.)?([^\s\)]+)?(\))?(\sAS\s(.+))?$/i.freeze
|
151
151
|
FIELD_ORDER_RE = /^(.*) (DESC|ASC)$/i.freeze
|
152
152
|
def quoted_field_name(name)
|
153
153
|
case name
|
data/lib/sequel/odbc.rb
CHANGED
data/lib/sequel/postgres.rb
CHANGED
data/lib/sequel/sqlite.rb
CHANGED
data/spec/adapters/mysql_spec.rb
CHANGED
@@ -79,6 +79,9 @@ context "A MySQL dataset" do
|
|
79
79
|
|
80
80
|
@d.select(:value.MAX).sql.should == \
|
81
81
|
'SELECT max(`value`) FROM items'
|
82
|
+
|
83
|
+
@d.select(:NOW[]).sql.should == \
|
84
|
+
'SELECT NOW() FROM items'
|
82
85
|
|
83
86
|
@d.select(:items__value.MAX).sql.should == \
|
84
87
|
'SELECT max(items.`value`) FROM items'
|
data/spec/database_spec.rb
CHANGED
@@ -289,6 +289,16 @@ context "Database#transaction" do
|
|
289
289
|
proc {@db.transaction {raise RuntimeError}}.should raise_error(RuntimeError)
|
290
290
|
end
|
291
291
|
|
292
|
+
specify "should issue ROLLBACK if rollback! is called in the transaction" do
|
293
|
+
@db.transaction do
|
294
|
+
@db.drop_table(:a)
|
295
|
+
rollback!
|
296
|
+
@db.drop_table(:b)
|
297
|
+
end
|
298
|
+
|
299
|
+
@db.sql.should == ['BEGIN', 'DROP TABLE a;', 'ROLLBACK']
|
300
|
+
end
|
301
|
+
|
292
302
|
specify "should be re-entrant" do
|
293
303
|
stop = false
|
294
304
|
cc = nil
|
data/spec/model_spec.rb
CHANGED
@@ -252,6 +252,38 @@ context "Model#serialize" do
|
|
252
252
|
]
|
253
253
|
end
|
254
254
|
|
255
|
+
|
256
|
+
specify "should support calling after the class is defined" do
|
257
|
+
@c = Class.new(Sequel::Model(:items)) do
|
258
|
+
no_primary_key
|
259
|
+
end
|
260
|
+
|
261
|
+
@c.serialize :def
|
262
|
+
|
263
|
+
@c.create(:def => 1)
|
264
|
+
@c.create(:def => "hello")
|
265
|
+
|
266
|
+
MODEL_DB.sqls.should == [ \
|
267
|
+
"INSERT INTO items (def) VALUES ('--- 1\n');", \
|
268
|
+
"INSERT INTO items (def) VALUES ('--- hello\n');", \
|
269
|
+
]
|
270
|
+
end
|
271
|
+
|
272
|
+
specify "should support using the Marshal format" do
|
273
|
+
@c = Class.new(Sequel::Model(:items)) do
|
274
|
+
no_primary_key
|
275
|
+
serialize :abc, :format => :marshal
|
276
|
+
end
|
277
|
+
|
278
|
+
@c.create(:abc => 1)
|
279
|
+
@c.create(:abc => "hello")
|
280
|
+
|
281
|
+
MODEL_DB.sqls.should == [ \
|
282
|
+
"INSERT INTO items (abc) VALUES ('\004\bi\006');", \
|
283
|
+
"INSERT INTO items (abc) VALUES ('\004\b\"\nhello');", \
|
284
|
+
]
|
285
|
+
end
|
286
|
+
|
255
287
|
specify "should translate values to and from YAML using accessor methods" do
|
256
288
|
@c = Class.new(Sequel::Model(:items)) do
|
257
289
|
serialize :abc, :def
|
@@ -338,4 +370,71 @@ context "Model attribute accessors" do
|
|
338
370
|
proc {o.x = 3}.should_not raise_error
|
339
371
|
proc {o.yy = 4}.should raise_error
|
340
372
|
end
|
373
|
+
end
|
374
|
+
|
375
|
+
context "Model#new?" do
|
376
|
+
setup do
|
377
|
+
MODEL_DB.reset
|
378
|
+
|
379
|
+
@c = Class.new(Sequel::Model(:items)) do
|
380
|
+
def columns
|
381
|
+
[:id, :x, :y]
|
382
|
+
end
|
383
|
+
end
|
384
|
+
end
|
385
|
+
|
386
|
+
specify "should be true for a new instance" do
|
387
|
+
n = @c.new(:x => 1)
|
388
|
+
n.should be_new
|
389
|
+
end
|
390
|
+
|
391
|
+
specify "should be false after saving" do
|
392
|
+
n = @c.new(:x => 1)
|
393
|
+
n.save
|
394
|
+
n.should_not be_new
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
context "Model.after_create" do
|
399
|
+
setup do
|
400
|
+
MODEL_DB.reset
|
401
|
+
|
402
|
+
@c = Class.new(Sequel::Model(:items)) do
|
403
|
+
def columns
|
404
|
+
[:id, :x, :y]
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
ds = @c.dataset
|
409
|
+
def ds.insert(*args)
|
410
|
+
super(*args)
|
411
|
+
1
|
412
|
+
end
|
413
|
+
end
|
414
|
+
|
415
|
+
specify "should be called after creation" do
|
416
|
+
s = []
|
417
|
+
|
418
|
+
@c.after_create do
|
419
|
+
s = MODEL_DB.sqls.dup
|
420
|
+
end
|
421
|
+
|
422
|
+
n = @c.create(:x => 1)
|
423
|
+
MODEL_DB.sqls.should == ['INSERT INTO items (x) VALUES (1);']
|
424
|
+
s.should == ['INSERT INTO items (x) VALUES (1);']
|
425
|
+
end
|
426
|
+
|
427
|
+
specify "should allow calling save in the hook" do
|
428
|
+
@c.after_create do
|
429
|
+
values.delete(:x)
|
430
|
+
self.id = 2
|
431
|
+
save
|
432
|
+
end
|
433
|
+
|
434
|
+
n = @c.create(:id => 1)
|
435
|
+
MODEL_DB.sqls.should == ['INSERT INTO items (id) VALUES (1);', 'UPDATE items SET id = 2 WHERE (id = 1)']
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
439
|
+
context "Model.serialize" do
|
341
440
|
end
|
data/spec/sequelizer_spec.rb
CHANGED
@@ -9,7 +9,18 @@ context "Proc#to_sql" do
|
|
9
9
|
DS.proc_to_sql(self)
|
10
10
|
end
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
|
+
def DS.match_expr(l, r)
|
14
|
+
case r
|
15
|
+
when String:
|
16
|
+
"(#{literal(l)} LIKE #{literal(r)})"
|
17
|
+
when Regexp:
|
18
|
+
"(#{literal(l)} ~ #{literal(r.source)})"
|
19
|
+
else
|
20
|
+
raise SequelError, "Unsupported match pattern class (#{r.class})."
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
13
24
|
specify "should support <sym> <op> <lit>" do
|
14
25
|
proc {:x > 100}.to_sql.should == '(x > 100)'
|
15
26
|
proc {:x < 100}.to_sql.should == '(x < 100)'
|
@@ -79,11 +90,11 @@ context "Proc#to_sql" do
|
|
79
90
|
specify "should support =~ operator" do
|
80
91
|
# stock SQL version does not know about regexps
|
81
92
|
proc {:x =~ '123'}.to_sql.should == "(x LIKE '123')"
|
93
|
+
|
94
|
+
proc {:x =~ /^123/}.to_sql.should == "(x ~ '^123')"
|
82
95
|
end
|
83
96
|
|
84
97
|
specify "should raise on =~ operator for unsupported types" do
|
85
|
-
# stock SQL version does not know about regexps
|
86
|
-
proc {proc {:x =~ /123/}.to_sql}.should raise_error(SequelError)
|
87
98
|
proc {proc {:x =~ 123}.to_sql}.should raise_error(SequelError)
|
88
99
|
end
|
89
100
|
|
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.2.1
|
7
|
-
date: 2007-
|
6
|
+
version: 0.2.1.1
|
7
|
+
date: 2007-10-07 00:00:00 +02:00
|
8
8
|
summary: Lightweight ORM library for Ruby
|
9
9
|
require_paths:
|
10
10
|
- lib
|