sequel_core 1.5.1 → 2.0.0
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 +116 -0
- data/COPYING +19 -19
- data/README +83 -32
- data/Rakefile +9 -20
- data/bin/sequel +43 -112
- data/doc/cheat_sheet.rdoc +225 -0
- data/doc/dataset_filtering.rdoc +257 -0
- data/lib/sequel_core/adapters/adapter_skeleton.rb +4 -2
- data/lib/sequel_core/adapters/ado.rb +3 -1
- data/lib/sequel_core/adapters/db2.rb +4 -2
- data/lib/sequel_core/adapters/dbi.rb +127 -113
- data/lib/sequel_core/adapters/informix.rb +4 -2
- data/lib/sequel_core/adapters/jdbc.rb +5 -3
- data/lib/sequel_core/adapters/mysql.rb +112 -46
- data/lib/sequel_core/adapters/odbc.rb +5 -7
- data/lib/sequel_core/adapters/odbc_mssql.rb +12 -3
- data/lib/sequel_core/adapters/openbase.rb +3 -1
- data/lib/sequel_core/adapters/oracle.rb +11 -9
- data/lib/sequel_core/adapters/postgres.rb +261 -262
- data/lib/sequel_core/adapters/sqlite.rb +72 -22
- data/lib/sequel_core/connection_pool.rb +140 -73
- data/lib/sequel_core/core_ext.rb +201 -66
- data/lib/sequel_core/core_sql.rb +123 -153
- data/lib/sequel_core/database/schema.rb +156 -0
- data/lib/sequel_core/database.rb +321 -338
- data/lib/sequel_core/dataset/callback.rb +11 -12
- data/lib/sequel_core/dataset/convenience.rb +213 -240
- data/lib/sequel_core/dataset/pagination.rb +58 -43
- data/lib/sequel_core/dataset/parse_tree_sequelizer.rb +331 -0
- data/lib/sequel_core/dataset/query.rb +41 -0
- data/lib/sequel_core/dataset/schema.rb +15 -0
- data/lib/sequel_core/dataset/sequelizer.rb +41 -373
- data/lib/sequel_core/dataset/sql.rb +741 -632
- data/lib/sequel_core/dataset.rb +183 -168
- data/lib/sequel_core/deprecated.rb +1 -169
- data/lib/sequel_core/exceptions.rb +24 -19
- data/lib/sequel_core/migration.rb +44 -52
- data/lib/sequel_core/object_graph.rb +43 -42
- data/lib/sequel_core/pretty_table.rb +71 -76
- data/lib/sequel_core/schema/generator.rb +163 -105
- data/lib/sequel_core/schema/sql.rb +250 -93
- data/lib/sequel_core/schema.rb +2 -8
- data/lib/sequel_core/sql.rb +394 -0
- data/lib/sequel_core/worker.rb +37 -27
- data/lib/sequel_core.rb +99 -45
- data/spec/adapters/informix_spec.rb +0 -1
- data/spec/adapters/mysql_spec.rb +177 -124
- data/spec/adapters/oracle_spec.rb +0 -1
- data/spec/adapters/postgres_spec.rb +98 -58
- data/spec/adapters/sqlite_spec.rb +45 -4
- data/spec/blockless_filters_spec.rb +269 -0
- data/spec/connection_pool_spec.rb +21 -18
- data/spec/core_ext_spec.rb +169 -19
- data/spec/core_sql_spec.rb +56 -49
- data/spec/database_spec.rb +78 -17
- data/spec/dataset_spec.rb +300 -428
- data/spec/migration_spec.rb +1 -1
- data/spec/object_graph_spec.rb +5 -11
- data/spec/rcov.opts +1 -1
- data/spec/schema_generator_spec.rb +16 -4
- data/spec/schema_spec.rb +89 -10
- data/spec/sequelizer_spec.rb +56 -56
- data/spec/spec.opts +0 -5
- data/spec/spec_config.rb +7 -0
- data/spec/spec_config.rb.example +5 -5
- data/spec/spec_helper.rb +6 -0
- data/spec/worker_spec.rb +1 -1
- metadata +78 -63
data/spec/core_sql_spec.rb
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'spec_helper')
|
2
2
|
|
3
|
+
context "Array#all_two_pairs?" do
|
4
|
+
specify "should return false if empty" do
|
5
|
+
[].all_two_pairs?.should == false
|
6
|
+
end
|
7
|
+
|
8
|
+
specify "should return false if any of the elements is not an array" do
|
9
|
+
[1].all_two_pairs?.should == false
|
10
|
+
[[1,2],1].all_two_pairs?.should == false
|
11
|
+
end
|
12
|
+
|
13
|
+
specify "should return false if any of the elements has a length other than two" do
|
14
|
+
[[1,2],[]].all_two_pairs?.should == false
|
15
|
+
[[1,2],[1]].all_two_pairs?.should == false
|
16
|
+
[[1,2],[1,2,3]].all_two_pairs?.should == false
|
17
|
+
end
|
18
|
+
|
19
|
+
specify "should return true if all of the elements are arrays with a length of two" do
|
20
|
+
[[1,2]].all_two_pairs?.should == true
|
21
|
+
[[1,2],[1,2]].all_two_pairs?.should == true
|
22
|
+
[[1,2],[1,2],[1,2]].all_two_pairs?.should == true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
3
26
|
context "Array#to_sql" do
|
4
27
|
specify "should concatenate multiple lines into a single string" do
|
5
28
|
"SELECT * \r\nFROM items\r\n WHERE a = 1".split.to_sql. \
|
@@ -51,25 +74,14 @@ context "String#lit" do
|
|
51
74
|
end
|
52
75
|
|
53
76
|
specify "should inhibit string literalization" do
|
54
|
-
|
55
|
-
ds = db[:t]
|
56
|
-
|
57
|
-
ds.update_sql(:stamp => "NOW()".lit).should == \
|
77
|
+
Sequel::Database.new[:t].update_sql(:stamp => "NOW()".expr).should == \
|
58
78
|
"UPDATE t SET stamp = NOW()"
|
59
79
|
end
|
60
|
-
end
|
61
80
|
|
62
|
-
|
63
|
-
specify "should return an LiteralString object" do
|
81
|
+
specify "should be aliased as expr" do
|
64
82
|
'xyz'.expr.should be_a_kind_of(Sequel::LiteralString)
|
65
83
|
'xyz'.expr.to_s.should == 'xyz'
|
66
|
-
|
67
|
-
|
68
|
-
specify "should inhibit string literalization" do
|
69
|
-
db = Sequel::Database.new
|
70
|
-
ds = db[:t]
|
71
|
-
|
72
|
-
ds.update_sql(:stamp => "NOW()".expr).should == \
|
84
|
+
Sequel::Database.new[:t].update_sql(:stamp => "NOW()".expr).should == \
|
73
85
|
"UPDATE t SET stamp = NOW()"
|
74
86
|
end
|
75
87
|
end
|
@@ -149,20 +161,21 @@ end
|
|
149
161
|
context "Column references" do
|
150
162
|
setup do
|
151
163
|
@c = Class.new(Sequel::Dataset) do
|
152
|
-
def
|
164
|
+
def quoted_identifier(c); "`#{c}`"; end
|
153
165
|
end
|
154
166
|
@ds = @c.new(nil)
|
167
|
+
@ds.quote_identifiers = true
|
155
168
|
end
|
156
169
|
|
157
170
|
specify "should be quoted properly" do
|
158
171
|
@ds.literal(:xyz).should == "`xyz`"
|
159
|
-
@ds.literal(:xyz__abc).should == "xyz
|
172
|
+
@ds.literal(:xyz__abc).should == "`xyz`.`abc`"
|
160
173
|
|
161
174
|
@ds.literal(:xyz.as(:x)).should == "`xyz` AS `x`"
|
162
|
-
@ds.literal(:xyz__abc.as(:x)).should == "xyz
|
175
|
+
@ds.literal(:xyz__abc.as(:x)).should == "`xyz`.`abc` AS `x`"
|
163
176
|
|
164
177
|
@ds.literal(:xyz___x).should == "`xyz` AS `x`"
|
165
|
-
@ds.literal(:xyz__abc___x).should == "xyz
|
178
|
+
@ds.literal(:xyz__abc___x).should == "`xyz`.`abc` AS `x`"
|
166
179
|
end
|
167
180
|
|
168
181
|
specify "should be quoted properly in SQL functions" do
|
@@ -178,7 +191,7 @@ context "Column references" do
|
|
178
191
|
|
179
192
|
specify "should be quoted properly in a cast function" do
|
180
193
|
@ds.literal(:x.cast_as(:integer)).should == "cast(`x` AS integer)"
|
181
|
-
@ds.literal(:x__y.cast_as(:varchar[20])).should == "cast(x
|
194
|
+
@ds.literal(:x__y.cast_as(:varchar[20])).should == "cast(`x`.`y` AS varchar(20))"
|
182
195
|
end
|
183
196
|
end
|
184
197
|
|
@@ -187,10 +200,15 @@ context "Symbol#*" do
|
|
187
200
|
@ds = Sequel::Dataset.new(nil)
|
188
201
|
end
|
189
202
|
|
190
|
-
specify "should format a qualified wildcard" do
|
203
|
+
specify "should format a qualified wildcard if no argument" do
|
191
204
|
:xyz.*.to_s(@ds).should == 'xyz.*'
|
192
205
|
:abc.*.to_s(@ds).should == 'abc.*'
|
193
206
|
end
|
207
|
+
|
208
|
+
specify "should format a filter expression if an argument" do
|
209
|
+
:xyz.*(3).to_s(@ds).should == '(xyz * 3)'
|
210
|
+
:abc.*(5).to_s(@ds).should == '(abc * 5)'
|
211
|
+
end
|
194
212
|
end
|
195
213
|
|
196
214
|
context "Symbol#to_column_ref" do
|
@@ -219,38 +237,21 @@ context "Symbol#to_column_ref" do
|
|
219
237
|
:ABC.to_column_ref(@ds).should == 'ABC'
|
220
238
|
:Zvashtoy__aBcD.to_column_ref(@ds).should == 'Zvashtoy.aBcD'
|
221
239
|
end
|
240
|
+
|
241
|
+
specify "should support spaces inside column names" do
|
242
|
+
@ds.quote_identifiers = true
|
243
|
+
:"AB C".to_column_ref(@ds).should == '"AB C"'
|
244
|
+
:"Zvas htoy__aB cD".to_column_ref(@ds).should == '"Zvas htoy"."aB cD"'
|
245
|
+
:"aB cD___XX XX".to_column_ref(@ds).should == '"aB cD" AS "XX XX"'
|
246
|
+
:"Zva shtoy__aB cD___XX XX".to_column_ref(@ds).should == '"Zva shtoy"."aB cD" AS "XX XX"'
|
247
|
+
end
|
222
248
|
end
|
223
249
|
|
224
|
-
### DEPRECATED
|
225
250
|
context "Symbol" do
|
226
251
|
setup do
|
227
252
|
@ds = Sequel::Dataset.new(nil)
|
228
253
|
end
|
229
254
|
|
230
|
-
specify "should support MIN for specifying min function" do
|
231
|
-
:abc__def.MIN.to_s(@ds).should == 'min(abc.def)'
|
232
|
-
end
|
233
|
-
|
234
|
-
specify "should support MAX for specifying max function" do
|
235
|
-
:abc__def.MAX.to_s(@ds).should == 'max(abc.def)'
|
236
|
-
end
|
237
|
-
|
238
|
-
specify "should support SUM for specifying sum function" do
|
239
|
-
:abc__def.SUM.to_s(@ds).should == 'sum(abc.def)'
|
240
|
-
end
|
241
|
-
|
242
|
-
specify "should support AVG for specifying avg function" do
|
243
|
-
:abc__def.AVG.to_s(@ds).should == 'avg(abc.def)'
|
244
|
-
end
|
245
|
-
|
246
|
-
specify "should support COUNT for specifying count function" do
|
247
|
-
:abc__def.COUNT.to_s(@ds).should == 'count(abc.def)'
|
248
|
-
end
|
249
|
-
|
250
|
-
specify "should support any other function using upper case letters" do
|
251
|
-
:abc__def.DADA.to_s(@ds).should == 'dada(abc.def)'
|
252
|
-
end
|
253
|
-
|
254
255
|
specify "should support upper case outer functions" do
|
255
256
|
:COUNT['1'].to_s(@ds).should == "COUNT('1')"
|
256
257
|
end
|
@@ -265,10 +266,6 @@ context "Symbol" do
|
|
265
266
|
:abc.cast_as(:integer).to_s(@ds).should == "cast(abc AS integer)"
|
266
267
|
end
|
267
268
|
|
268
|
-
specify "should raise NoMethodError for non-uppercase invalid methods" do
|
269
|
-
proc {:abc.dfaxs}.should raise_error(NoMethodError)
|
270
|
-
end
|
271
|
-
|
272
269
|
specify "should support subscript access using | operator" do
|
273
270
|
(:abc|1).to_s(@ds).should == 'abc[1]'
|
274
271
|
(:abc|[1]).to_s(@ds).should == 'abc[1]'
|
@@ -298,6 +295,16 @@ context "String#to_date" do
|
|
298
295
|
end
|
299
296
|
end
|
300
297
|
|
298
|
+
context "String#to_datetime" do
|
299
|
+
specify "should convert the string into a DateTime object" do
|
300
|
+
"2007-07-11 10:11:12a".to_datetime.should == DateTime.parse("2007-07-11 10:11:12a")
|
301
|
+
end
|
302
|
+
|
303
|
+
specify "should raise Error::InvalidValue for an invalid date" do
|
304
|
+
proc {'0000-00-00'.to_datetime}.should raise_error(Sequel::Error::InvalidValue)
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
301
308
|
context "Sequel::SQL::Function#==" do
|
302
309
|
specify "should be true for functions with the same name and arguments, false otherwise" do
|
303
310
|
a = :date[:t]
|
data/spec/database_spec.rb
CHANGED
@@ -9,8 +9,17 @@ context "A new Database" do
|
|
9
9
|
@db.opts.should == {1 => 2, :logger => 3}
|
10
10
|
end
|
11
11
|
|
12
|
-
specify "should set the logger from opts[:logger]" do
|
12
|
+
specify "should set the logger from opts[:logger] and opts[:loggers]" do
|
13
13
|
@db.logger.should == 3
|
14
|
+
@db.loggers.should == [3]
|
15
|
+
Sequel::Database.new(1 => 2, :loggers => 3).logger.should == 3
|
16
|
+
Sequel::Database.new(1 => 2, :loggers => 3).loggers.should == [3]
|
17
|
+
Sequel::Database.new(1 => 2, :loggers => [3]).logger.should == 3
|
18
|
+
Sequel::Database.new(1 => 2, :loggers => [3]).loggers.should == [3]
|
19
|
+
Sequel::Database.new(1 => 2, :logger => 4, :loggers => 3).logger.should == 4
|
20
|
+
Sequel::Database.new(1 => 2, :logger => 4, :loggers => 3).loggers.should == [4,3]
|
21
|
+
Sequel::Database.new(1 => 2, :logger => [4], :loggers => [3]).logger.should == 4
|
22
|
+
Sequel::Database.new(1 => 2, :logger => [4], :loggers => [3]).loggers.should == [4,3]
|
14
23
|
end
|
15
24
|
|
16
25
|
specify "should create a connection pool" do
|
@@ -88,7 +97,7 @@ context "Database#dataset" do
|
|
88
97
|
e.sql.should == 'SELECT * FROM miu'
|
89
98
|
end
|
90
99
|
|
91
|
-
|
100
|
+
pt_specify "should provide a filtered #from dataset if a block is given" do
|
92
101
|
d = @db.from(:mau) {:x > 100}
|
93
102
|
d.should be_a_kind_of(Sequel::Dataset)
|
94
103
|
d.sql.should == 'SELECT * FROM mau WHERE (x > 100)'
|
@@ -435,6 +444,18 @@ context "Database#transaction" do
|
|
435
444
|
@db.sql.should == ['BEGIN', 'DROP TABLE test;', 'COMMIT']
|
436
445
|
end
|
437
446
|
|
447
|
+
specify "should handle returning inside of the block by committing" do
|
448
|
+
def @db.ret_commit
|
449
|
+
transaction do
|
450
|
+
execute 'DROP TABLE test;'
|
451
|
+
return
|
452
|
+
execute 'DROP TABLE test2;';
|
453
|
+
end
|
454
|
+
end
|
455
|
+
@db.ret_commit
|
456
|
+
@db.sql.should == ['BEGIN', 'DROP TABLE test;', 'COMMIT']
|
457
|
+
end
|
458
|
+
|
438
459
|
specify "should issue ROLLBACK if an exception is raised, and re-raise" do
|
439
460
|
@db.transaction {@db.execute 'DROP TABLE test'; raise RuntimeError} rescue nil
|
440
461
|
@db.sql.should == ['BEGIN', 'DROP TABLE test', 'ROLLBACK']
|
@@ -477,7 +498,15 @@ end
|
|
477
498
|
context "A Database adapter with a scheme" do
|
478
499
|
setup do
|
479
500
|
class CCC < Sequel::Database
|
501
|
+
if defined?(DISCONNECTS)
|
502
|
+
DISCONNECTS.clear
|
503
|
+
else
|
504
|
+
DISCONNECTS = []
|
505
|
+
end
|
480
506
|
set_adapter_scheme :ccc
|
507
|
+
def disconnect
|
508
|
+
DISCONNECTS << self
|
509
|
+
end
|
481
510
|
end
|
482
511
|
end
|
483
512
|
|
@@ -499,25 +528,40 @@ context "A Database adapter with a scheme" do
|
|
499
528
|
c.opts[:database].should == 'db'
|
500
529
|
end
|
501
530
|
|
502
|
-
specify "should be accessible through Sequel.
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
531
|
+
specify "should be accessible through Sequel.connect via a block" do
|
532
|
+
x = nil
|
533
|
+
y = nil
|
534
|
+
z = nil
|
535
|
+
|
536
|
+
p = proc do |c|
|
537
|
+
c.should be_a_kind_of(CCC)
|
538
|
+
c.opts[:host].should == 'localhost'
|
539
|
+
c.opts[:database].should == 'db'
|
540
|
+
z = y
|
541
|
+
y = x
|
542
|
+
x = c
|
543
|
+
end
|
544
|
+
Sequel::Database.connect('ccc://localhost/db', &p).should == nil
|
545
|
+
CCC::DISCONNECTS.should == [x]
|
546
|
+
|
547
|
+
Sequel.connect('ccc://localhost/db', &p).should == nil
|
548
|
+
CCC::DISCONNECTS.should == [y, x]
|
549
|
+
|
550
|
+
Sequel.send(:def_adapter_method, :ccc)
|
551
|
+
Sequel.ccc('db', :host=>'localhost', &p).should == nil
|
552
|
+
CCC::DISCONNECTS.should == [z, y, x]
|
507
553
|
end
|
508
554
|
|
509
|
-
|
510
|
-
|
511
|
-
c = Sequel('ccc://localhost/db')
|
555
|
+
specify "should be accessible through Sequel.open" do
|
556
|
+
c = Sequel.open 'ccc://localhost/db'
|
512
557
|
c.should be_a_kind_of(CCC)
|
513
558
|
c.opts[:host].should == 'localhost'
|
514
559
|
c.opts[:database].should == 'db'
|
515
560
|
end
|
516
561
|
|
517
562
|
specify "should be accessible through Sequel.<adapter>" do
|
518
|
-
|
519
|
-
|
520
|
-
end
|
563
|
+
Sequel.send(:def_adapter_method, :ccc)
|
564
|
+
|
521
565
|
# invalid parameters
|
522
566
|
proc {Sequel.ccc('abc', 'def')}.should raise_error(Sequel::Error)
|
523
567
|
|
@@ -681,9 +725,26 @@ context "A database" do
|
|
681
725
|
db = Sequel::Database.new
|
682
726
|
s = "I'm a logger"
|
683
727
|
db.logger = s
|
684
|
-
db.logger.should
|
728
|
+
db.logger.should == s
|
729
|
+
db.loggers.should == [s]
|
685
730
|
db.logger = nil
|
686
|
-
db.logger.should
|
731
|
+
db.logger.should == nil
|
732
|
+
db.loggers.should == []
|
733
|
+
|
734
|
+
db.loggers = [s]
|
735
|
+
db.logger.should == s
|
736
|
+
db.loggers.should == [s]
|
737
|
+
db.loggers = []
|
738
|
+
db.logger.should == nil
|
739
|
+
db.loggers.should == []
|
740
|
+
|
741
|
+
t = "I'm also a logger"
|
742
|
+
db.loggers = [s, t]
|
743
|
+
db.logger.should == s
|
744
|
+
db.loggers.should == [s,t]
|
745
|
+
db.loggers = []
|
746
|
+
db.logger.should == nil
|
747
|
+
db.loggers.should == []
|
687
748
|
end
|
688
749
|
end
|
689
750
|
|
@@ -720,7 +781,7 @@ context "Database#fetch" do
|
|
720
781
|
sql.should == "select * from xyz where x = 15 and y = 'abc'"
|
721
782
|
|
722
783
|
# and Aman Gupta's example
|
723
|
-
@db.fetch('select name from table where name = ? or id in
|
784
|
+
@db.fetch('select name from table where name = ? or id in ?',
|
724
785
|
'aman', [3,4,7]) {|r| sql = r[:sql]}
|
725
786
|
sql.should == "select name from table where name = 'aman' or id in (3, 4, 7)"
|
726
787
|
end
|
@@ -739,7 +800,7 @@ context "Database#fetch" do
|
|
739
800
|
ds.select_sql.should == 'select * from xyz'
|
740
801
|
ds.sql.should == 'select * from xyz'
|
741
802
|
|
742
|
-
ds.filter!
|
803
|
+
ds.filter!(:price < 100)
|
743
804
|
ds.select_sql.should == 'select * from xyz'
|
744
805
|
ds.sql.should == 'select * from xyz'
|
745
806
|
end
|