sequel 2.4.0 → 2.5.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.
Files changed (38) hide show
  1. data/CHANGELOG +34 -0
  2. data/Rakefile +1 -1
  3. data/lib/sequel_core.rb +16 -7
  4. data/lib/sequel_core/adapters/ado.rb +6 -2
  5. data/lib/sequel_core/adapters/db2.rb +1 -1
  6. data/lib/sequel_core/adapters/jdbc.rb +2 -2
  7. data/lib/sequel_core/adapters/jdbc/postgresql.rb +22 -10
  8. data/lib/sequel_core/adapters/mysql.rb +2 -2
  9. data/lib/sequel_core/adapters/odbc.rb +6 -2
  10. data/lib/sequel_core/adapters/postgres.rb +25 -14
  11. data/lib/sequel_core/adapters/shared/mysql.rb +15 -35
  12. data/lib/sequel_core/adapters/shared/postgres.rb +137 -77
  13. data/lib/sequel_core/adapters/sqlite.rb +2 -2
  14. data/lib/sequel_core/core_ext.rb +11 -7
  15. data/lib/sequel_core/database.rb +18 -1
  16. data/lib/sequel_core/dataset.rb +23 -7
  17. data/lib/sequel_core/dataset/convenience.rb +1 -1
  18. data/lib/sequel_core/dataset/sql.rb +46 -31
  19. data/lib/sequel_core/exceptions.rb +4 -0
  20. data/lib/sequel_core/schema/generator.rb +43 -3
  21. data/lib/sequel_core/schema/sql.rb +52 -26
  22. data/lib/sequel_model.rb +2 -5
  23. data/lib/sequel_model/associations.rb +3 -3
  24. data/lib/sequel_model/base.rb +19 -13
  25. data/lib/sequel_model/record.rb +19 -11
  26. data/lib/sequel_model/schema.rb +10 -4
  27. data/lib/sequel_model/validations.rb +20 -7
  28. data/spec/adapters/mysql_spec.rb +1 -1
  29. data/spec/adapters/postgres_spec.rb +64 -9
  30. data/spec/integration/dataset_test.rb +32 -0
  31. data/spec/sequel_core/core_sql_spec.rb +38 -0
  32. data/spec/sequel_core/database_spec.rb +16 -1
  33. data/spec/sequel_core/dataset_spec.rb +66 -1
  34. data/spec/sequel_core/schema_generator_spec.rb +23 -3
  35. data/spec/sequel_core/schema_spec.rb +175 -4
  36. data/spec/sequel_model/record_spec.rb +47 -0
  37. data/spec/sequel_model/validations_spec.rb +70 -0
  38. metadata +2 -2
@@ -13,17 +13,14 @@ module Sequel
13
13
  # Lets you create a Model subclass with its dataset already set.
14
14
  # source can be an existing dataset or a symbol (in which case
15
15
  # it will create a dataset using the default database with
16
- # source as the table name.
16
+ # source as the table name).
17
17
  #
18
18
  # Example:
19
19
  # class Comment < Sequel::Model(:something)
20
20
  # table_name # => :something
21
21
  # end
22
22
  def self.Model(source)
23
- return @models[source] if @models[source]
24
- klass = Class.new(Model)
25
- klass.set_dataset(source.is_a?(Dataset) ? source : Model.db[source])
26
- @models[source] = klass
23
+ @models[source] ||= Class.new(Model).set_dataset(source)
27
24
  end
28
25
 
29
26
  # Model has some methods that are added via metaprogramming:
@@ -297,13 +297,13 @@ module Sequel::Model::Associations
297
297
  return if opts[:read_only]
298
298
 
299
299
  class_def(opts._add_method) do |o|
300
- database[join_table].insert(left=>pk, right=>o.pk)
300
+ database.dataset.from(join_table).insert(left=>pk, right=>o.pk)
301
301
  end
302
302
  class_def(opts._remove_method) do |o|
303
- database[join_table].filter([[left, pk], [right, o.pk]]).delete
303
+ database.dataset.from(join_table).filter([[left, pk], [right, o.pk]]).delete
304
304
  end
305
305
  class_def(opts._remove_all_method) do
306
- database[join_table].filter(left=>pk).delete
306
+ database.dataset.from(join_table).filter(left=>pk).delete
307
307
  end
308
308
  private opts._add_method, opts._remove_method, opts._remove_all_method
309
309
 
@@ -206,7 +206,7 @@ module Sequel
206
206
  if sup_class == Model
207
207
  subclass.set_dataset(Model.db[subclass.implicit_table_name]) unless subclass.name.blank?
208
208
  elsif ds = sup_class.instance_variable_get(:@dataset)
209
- subclass.set_dataset(sup_class.sti_key ? sup_class.sti_dataset.filter(sup_class.sti_key=>subclass.name.to_s) : ds.clone)
209
+ subclass.set_dataset(sup_class.sti_key ? sup_class.sti_dataset.filter(sup_class.sti_key=>subclass.name.to_s) : ds.clone, :inherited=>true)
210
210
  end
211
211
  rescue
212
212
  nil
@@ -308,7 +308,8 @@ module Sequel
308
308
  # if there is one associated with the model. Finally, it attempts to
309
309
  # determine the database schema based on the given/created dataset unless
310
310
  # lazy_load_schema is set.
311
- def self.set_dataset(ds)
311
+ def self.set_dataset(ds, opts={})
312
+ inherited = opts[:inherited]
312
313
  @dataset = case ds
313
314
  when Symbol
314
315
  db[ds]
@@ -319,13 +320,15 @@ module Sequel
319
320
  raise(Error, "Model.set_dataset takes a Symbol or a Sequel::Dataset")
320
321
  end
321
322
  @dataset.set_model(self)
322
- @dataset.extend(DatasetMethods)
323
- @dataset.extend(Associations::EagerLoading)
324
323
  @dataset.transform(@transform) if @transform
325
- @dataset_methods.each{|meth, block| @dataset.meta_def(meth, &block)} if @dataset_methods
326
- unless @@lazy_load_schema
327
- (@db_schema = get_db_schema) rescue nil
324
+ if inherited
325
+ ((@columns = @dataset.columns) rescue nil) unless @@lazy_load_schema
326
+ else
327
+ @dataset.extend(DatasetMethods)
328
+ @dataset.extend(Associations::EagerLoading)
329
+ @dataset_methods.each{|meth, block| @dataset.meta_def(meth, &block)} if @dataset_methods
328
330
  end
331
+ ((@db_schema = inherited ? superclass.db_schema : get_db_schema) rescue nil) unless @@lazy_load_schema
329
332
  self
330
333
  end
331
334
  metaalias :dataset=, :set_dataset
@@ -425,15 +428,18 @@ module Sequel
425
428
 
426
429
  # Create the column accessors
427
430
  def self.def_column_accessor(*columns) # :nodoc:
431
+ include(@column_accessors_module = Module.new) unless @column_accessors_module
428
432
  columns.each do |column|
429
433
  im = instance_methods.collect{|x| x.to_s}
430
434
  meth = "#{column}="
431
- define_method(column){self[column]} unless im.include?(column.to_s)
432
- unless im.include?(meth)
433
- define_method(meth) do |*v|
434
- len = v.length
435
- raise(ArgumentError, "wrong number of arguments (#{len} for 1)") unless len == 1
436
- self[column] = v.first
435
+ @column_accessors_module.module_eval do
436
+ define_method(column){self[column]} unless im.include?(column.to_s)
437
+ unless im.include?(meth)
438
+ define_method(meth) do |*v|
439
+ len = v.length
440
+ raise(ArgumentError, "wrong number of arguments (#{len} for 1)") unless len == 1
441
+ self[column] = v.first
442
+ end
437
443
  end
438
444
  end
439
445
  end
@@ -214,25 +214,33 @@ module Sequel
214
214
  # (if !new?) return false, returns nil unless raise_on_save_failure
215
215
  # is true. Otherwise, returns self.
216
216
  def save!(*columns)
217
+ opts = columns.extract_options!
217
218
  return save_failure(:save) if before_save == false
218
219
  if @new
219
220
  return save_failure(:create) if before_create == false
220
- iid = model.dataset.insert(@values)
221
- # if we have a regular primary key and it's not set in @values,
222
- # we assume it's the last inserted id
223
- if (pk = primary_key) && !(Array === pk) && !@values[pk]
224
- @values[pk] = iid
225
- end
226
- if pk
227
- @this = nil # remove memoized this dataset
228
- refresh
221
+ ds = model.dataset
222
+ if ds.respond_to?(:insert_select) and h = ds.insert_select(@values)
223
+ @values = h
224
+ @this = nil
225
+ else
226
+ iid = ds.insert(@values)
227
+ # if we have a regular primary key and it's not set in @values,
228
+ # we assume it's the last inserted id
229
+ if (pk = primary_key) && !(Array === pk) && !@values[pk]
230
+ @values[pk] = iid
231
+ end
232
+ if pk
233
+ @this = nil # remove memoized this dataset
234
+ refresh
235
+ end
229
236
  end
230
237
  @new = false
231
238
  after_create
232
239
  else
233
240
  return save_failure(:update) if before_update == false
234
241
  if columns.empty?
235
- this.update(@values)
242
+ vals = opts[:changed] ? @values.reject{|k,v| !@changed_columns.include?(k)} : @values
243
+ this.update(vals)
236
244
  @changed_columns = []
237
245
  else # update only the specified columns
238
246
  this.update(@values.reject {|k, v| !columns.include?(k)})
@@ -248,7 +256,7 @@ module Sequel
248
256
  # chanaged. If no columns have been changed, returns nil. If unable to
249
257
  # save, returns false unless raise_on_save_failure is true.
250
258
  def save_changes
251
- save(*@changed_columns) || false unless @changed_columns.empty?
259
+ save(:changed=>true) || false unless @changed_columns.empty?
252
260
  end
253
261
 
254
262
  # Updates the instance with the supplied values with support for virtual
@@ -1,13 +1,14 @@
1
1
  module Sequel
2
2
  class Model
3
- # Creates table.
3
+ # Creates table, using the column information from set_schema.
4
4
  def self.create_table
5
5
  db.create_table(table_name, @schema)
6
6
  @db_schema = get_db_schema(true) unless @@lazy_load_schema
7
7
  columns
8
8
  end
9
9
 
10
- # Drops the table if it exists and then runs create_table.
10
+ # Drops the table if it exists and then runs create_table. Should probably
11
+ # not be used except in testing.
11
12
  def self.create_table!
12
13
  drop_table rescue nil
13
14
  create_table
@@ -27,8 +28,13 @@ module Sequel
27
28
 
28
29
  # Defines a table schema (see Schema::Generator for more information).
29
30
  #
30
- # This is only needed if you want to use the create_table or drop_table
31
- # methods.
31
+ # This is only needed if you want to use the create_table/create_table! methods.
32
+ # Will also set the dataset if you provide a name, as well as setting
33
+ # the primary key if you defined one in the passed block.
34
+ #
35
+ # In general, it is a better idea to use migrations for production code, as
36
+ # migrations allow changes to existing schema. set_schema is mostly useful for
37
+ # test code or simple examples.
32
38
  def self.set_schema(name = nil, &block)
33
39
  set_dataset(db[name]) if name
34
40
  @schema = Schema::Generator.new(db, &block)
@@ -1,5 +1,8 @@
1
1
  module Sequel
2
2
  class Model
3
+ # Validations without an :if option are always run
4
+ DEFAULT_VALIDATION_IF_PROC = proc{true}
5
+
3
6
  # The Validation module houses a couple of classes used by Sequel's
4
7
  # validation code.
5
8
  module Validation
@@ -20,7 +23,7 @@ module Sequel
20
23
  def full_messages
21
24
  inject([]) do |m, kv|
22
25
  att, errors = *kv
23
- errors.each {|e| m << "#{att} #{e}"}
26
+ errors.each {|e| m << "#{Array(att).join(' and ')} #{e}"}
24
27
  m
25
28
  end
26
29
  end
@@ -84,7 +87,12 @@ module Sequel
84
87
  superclass.validate(o)
85
88
  end
86
89
  validations.each do |att, procs|
87
- v = o.send(att)
90
+ v = case att
91
+ when Array
92
+ att.collect{|a| o.send(a)}
93
+ else
94
+ o.send(att)
95
+ end
88
96
  procs.each {|tag, p| p.call(o, att, v)}
89
97
  end
90
98
  end
@@ -300,6 +308,7 @@ module Sequel
300
308
  # database, as this suffers from a fairly obvious race condition.
301
309
  #
302
310
  # Possible Options:
311
+ # * :allow_nil - Whether to skip the validation if the value(s) is/are nil (default: false)
303
312
  # * :if - A symbol (indicating an instance_method) or proc (which is instance_evaled)
304
313
  # skipping this validation if it returns nil or false.
305
314
  # * :message - The message to use (default: 'is already taken')
@@ -311,8 +320,12 @@ module Sequel
311
320
 
312
321
  atts << {:if=>opts[:if], :tag=>opts[:tag]||:uniqueness}
313
322
  validates_each(*atts) do |o, a, v|
314
- next if v.blank?
315
- num_dups = o.class.filter(a => v).count
323
+ error_field = a
324
+ a = Array(a)
325
+ v = Array(v)
326
+ next unless v.any? or opts[:allow_nil] == false
327
+ ds = o.class.filter(a.zip(v))
328
+ num_dups = ds.count
316
329
  allow = if num_dups == 0
317
330
  # No unique value in the database
318
331
  true
@@ -323,13 +336,13 @@ module Sequel
323
336
  elsif o.new?
324
337
  # New record, but unique value already exists in the database
325
338
  false
326
- elsif o.class[a => v].pk == o.pk
339
+ elsif ds.first === o
327
340
  # Unique value exists in database, but for the same record, so the update won't cause a duplicate record
328
341
  true
329
342
  else
330
343
  false
331
344
  end
332
- o.errors[a] << opts[:message] unless allow
345
+ o.errors[error_field] << opts[:message] unless allow
333
346
  end
334
347
  end
335
348
 
@@ -344,7 +357,7 @@ module Sequel
344
357
  case opts[:if]
345
358
  when Symbol then proc{send opts[:if]}
346
359
  when Proc then opts[:if]
347
- when nil then proc{true}
360
+ when nil then DEFAULT_VALIDATION_IF_PROC
348
361
  else raise(::Sequel::Error, "invalid value for :if validation option")
349
362
  end
350
363
  end
@@ -423,7 +423,7 @@ context "A MySQL database" do
423
423
  @db[:test2] << {:name => 'mmm', :value => 111, :tre => 'qqqq'}
424
424
 
425
425
  @db[:test2].columns.should == [:name, :value, :zyx, :tre]
426
- @db.rename_column :test2, :tre, :ert, :type => :varchar[255]
426
+ @db.rename_column :test2, :tre, :ert, :type => :varchar, :size=>255
427
427
  @db[:test2].columns.should == [:name, :value, :zyx, :ert]
428
428
  @db[:test2].first[:ert].should == 'qqqq'
429
429
  end
@@ -21,6 +21,10 @@ POSTGRES_DB.create_table! :test4 do
21
21
  varchar :name, :size => 20
22
22
  bytea :value
23
23
  end
24
+ POSTGRES_DB.create_table! :test5 do
25
+ primary_key :xid
26
+ integer :value
27
+ end
24
28
 
25
29
  context "A PostgreSQL database" do
26
30
  setup do
@@ -150,11 +154,11 @@ context "A PostgreSQL dataset" do
150
154
  @d.select(:test[:abc__def, 'hello'].as(:x2)).sql.should == \
151
155
  "SELECT test(\"abc\".\"def\", 'hello') AS \"x2\" FROM \"test\""
152
156
 
153
- @d.insert_sql(:value => 333).should == \
154
- 'INSERT INTO "test" ("value") VALUES (333)'
157
+ @d.insert_sql(:value => 333).should =~ \
158
+ /\AINSERT INTO "test" \("value"\) VALUES \(333\)( RETURNING NULL)?\z/
155
159
 
156
- @d.insert_sql(:x => :y).should == \
157
- 'INSERT INTO "test" ("x") VALUES ("y")'
160
+ @d.insert_sql(:x => :y).should =~ \
161
+ /\AINSERT INTO "test" \("x"\) VALUES \("y"\)( RETURNING NULL)?\z/
158
162
  end
159
163
 
160
164
  specify "should quote fields correctly when reversing the order if quoting identifiers" do
@@ -275,7 +279,7 @@ context "A PostgreSQL dataset" do
275
279
  end
276
280
  end
277
281
 
278
- context "A PostgreSQL dataaset with a timestamp field" do
282
+ context "A PostgreSQL dataset with a timestamp field" do
279
283
  setup do
280
284
  @d = POSTGRES_DB[:test3]
281
285
  @d.delete
@@ -417,7 +421,7 @@ context "Postgres::Dataset#multi_insert_sql / #import" do
417
421
  end
418
422
 
419
423
  specify "should return separate insert statements if server_version < 80200" do
420
- @ds.db.meta_def(:server_version) {80199}
424
+ @ds.meta_def(:server_version){80199}
421
425
 
422
426
  @ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
423
427
  'INSERT INTO test (x, y) VALUES (1, 2)',
@@ -426,16 +430,67 @@ context "Postgres::Dataset#multi_insert_sql / #import" do
426
430
  end
427
431
 
428
432
  specify "should a single insert statement if server_version >= 80200" do
429
- @ds.db.meta_def(:server_version) {80200}
430
-
433
+ @ds.meta_def(:server_version){80200}
434
+
431
435
  @ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
432
436
  'INSERT INTO test (x, y) VALUES (1, 2), (3, 4)'
433
437
  ]
434
438
 
435
- @ds.db.meta_def(:server_version) {80201}
439
+ @ds.meta_def(:server_version){80201}
436
440
 
437
441
  @ds.multi_insert_sql([:x, :y], [[1, 2], [3, 4]]).should == [
438
442
  'INSERT INTO test (x, y) VALUES (1, 2), (3, 4)'
439
443
  ]
440
444
  end
441
445
  end
446
+
447
+ context "Postgres::Dataset#insert" do
448
+ setup do
449
+ @ds = POSTGRES_DB[:test5]
450
+ @ds.delete
451
+ end
452
+
453
+ specify "should call insert_sql if server_version < 80200" do
454
+ @ds.meta_def(:server_version){80100}
455
+ @ds.should_receive(:execute_insert).once.with('INSERT INTO test5 (value) VALUES (10)', :table=>:test5, :values=>{:value=>10})
456
+ @ds.insert(:value=>10)
457
+ end
458
+
459
+ specify "should using call insert_returning_sql if server_version >= 80200" do
460
+ @ds.meta_def(:server_version){80201}
461
+ @ds.should_receive(:single_value).once.with(:sql=>'INSERT INTO test5 (value) VALUES (10) RETURNING xid')
462
+ @ds.insert(:value=>10)
463
+ end
464
+
465
+ specify "should have insert_returning_sql use the RETURNING keyword" do
466
+ @ds.insert_returning_sql(:xid, :value=>10).should == "INSERT INTO test5 (value) VALUES (10) RETURNING xid"
467
+ @ds.insert_returning_sql('*'.lit, :value=>10).should == "INSERT INTO test5 (value) VALUES (10) RETURNING *"
468
+ end
469
+
470
+ specify "should have insert_select return nil if server_version < 80200" do
471
+ @ds.meta_def(:server_version){80100}
472
+ @ds.insert_select(:value=>10).should == nil
473
+ end
474
+
475
+ specify "should have insert_select insert the record and return the inserted record if server_version < 80200" do
476
+ @ds.meta_def(:server_version){80201}
477
+ h = @ds.insert_select(:value=>10)
478
+ h[:value].should == 10
479
+ @ds.first(:xid=>h[:xid])[:value].should == 10
480
+ end
481
+
482
+ specify "should correctly return the inserted record's primary key value" do
483
+ value1 = 10
484
+ id1 = @ds.insert(:value=>value1)
485
+ @ds.first(:xid=>id1)[:value].should == value1
486
+ value2 = 20
487
+ id2 = @ds.insert(:value=>value2)
488
+ @ds.first(:xid=>id2)[:value].should == value2
489
+ end
490
+
491
+ specify "should return nil if the table has no primary key" do
492
+ ds = POSTGRES_DB[:test4]
493
+ ds.delete
494
+ ds.insert(:name=>'a').should == nil
495
+ end
496
+ end
@@ -49,3 +49,35 @@ describe "Simple Dataset operations" do
49
49
  sqls_should_be('SELECT * FROM items LIMIT 1')
50
50
  end
51
51
  end
52
+
53
+ describe "Simple Dataset operations in transactions" do
54
+ before do
55
+ INTEGRATION_DB.create_table!(:items_insert_in_transaction) do
56
+ primary_key :id
57
+ integer :number
58
+ end
59
+ @ds = INTEGRATION_DB[:items_insert_in_transaction]
60
+ clear_sqls
61
+ end
62
+ after do
63
+ INTEGRATION_DB.drop_table(:items_insert_in_transaction)
64
+ end
65
+
66
+ specify "should insert correctly with a primary key specified inside a transaction" do
67
+ INTEGRATION_DB.transaction do
68
+ @ds.insert(:id=>100, :number=>20)
69
+ sqls_should_be(/INSERT INTO items_insert_in_transaction \((number, id|id, number)\) VALUES \((100, 20|20, 100)\)/)
70
+ @ds.count.should == 1
71
+ @ds.order(:id).all.should == [{:id=>100, :number=>20}]
72
+ end
73
+ end
74
+
75
+ specify "should have insert return primary key value inside a transaction" do
76
+ INTEGRATION_DB.transaction do
77
+ @ds.insert(:number=>20).should == 1
78
+ sqls_should_be(/INSERT INTO items_insert_in_transaction \(number\) VALUES \(20\)/)
79
+ @ds.count.should == 1
80
+ @ds.order(:id).all.should == [{:id=>1, :number=>20}]
81
+ end
82
+ end
83
+ end
@@ -367,20 +367,46 @@ context "String#to_time" do
367
367
  end
368
368
 
369
369
  context "String#to_date" do
370
+ after do
371
+ Sequel.convert_two_digit_years = true
372
+ end
373
+
370
374
  specify "should convert the string into a Date object" do
371
375
  "2007-07-11".to_date.should == Date.parse("2007-07-11")
372
376
  end
373
377
 
378
+ specify "should convert 2 digit years by default" do
379
+ "July 11, 07".to_date.should == Date.parse("2007-07-11")
380
+ end
381
+
382
+ specify "should not convert 2 digit years if set not to" do
383
+ Sequel.convert_two_digit_years = false
384
+ "July 11, 07".to_date.should == Date.parse("0007-07-11")
385
+ end
386
+
374
387
  specify "should raise Error::InvalidValue for an invalid date" do
375
388
  proc {'0000-00-00'.to_date}.should raise_error(Sequel::Error::InvalidValue)
376
389
  end
377
390
  end
378
391
 
379
392
  context "String#to_datetime" do
393
+ after do
394
+ Sequel.convert_two_digit_years = true
395
+ end
396
+
380
397
  specify "should convert the string into a DateTime object" do
381
398
  "2007-07-11 10:11:12a".to_datetime.should == DateTime.parse("2007-07-11 10:11:12a")
382
399
  end
383
400
 
401
+ specify "should convert 2 digit years by default" do
402
+ "July 11, 07 10:11:12a".to_datetime.should == DateTime.parse("2007-07-11 10:11:12a")
403
+ end
404
+
405
+ specify "should not convert 2 digit years if set not to" do
406
+ Sequel.convert_two_digit_years = false
407
+ "July 11, 07 10:11:12a".to_datetime.should == DateTime.parse("0007-07-11 10:11:12a")
408
+ end
409
+
384
410
  specify "should raise Error::InvalidValue for an invalid date" do
385
411
  proc {'0000-00-00'.to_datetime}.should raise_error(Sequel::Error::InvalidValue)
386
412
  end
@@ -389,6 +415,7 @@ end
389
415
  context "String#to_sequel_time" do
390
416
  after do
391
417
  Sequel.datetime_class = Time
418
+ Sequel.convert_two_digit_years = true
392
419
  end
393
420
 
394
421
  specify "should convert the string into a Time object by default" do
@@ -402,6 +429,17 @@ context "String#to_sequel_time" do
402
429
  "2007-07-11 10:11:12a".to_sequel_time.should == DateTime.parse("2007-07-11 10:11:12a")
403
430
  end
404
431
 
432
+ specify "should convert 2 digit years by default if using DateTime class" do
433
+ Sequel.datetime_class = DateTime
434
+ "July 11, 07 10:11:12a".to_sequel_time.should == DateTime.parse("2007-07-11 10:11:12a")
435
+ end
436
+
437
+ specify "should not convert 2 digit years if set not to when using DateTime class" do
438
+ Sequel.datetime_class = DateTime
439
+ Sequel.convert_two_digit_years = false
440
+ "July 11, 07 10:11:12a".to_sequel_time.should == DateTime.parse("0007-07-11 10:11:12a")
441
+ end
442
+
405
443
  specify "should raise Error::InvalidValue for an invalid time" do
406
444
  proc {'0000-00-00'.to_sequel_time}.should raise_error(Sequel::Error::InvalidValue)
407
445
  Sequel.datetime_class = DateTime