sequel 3.38.0 → 3.39.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (79) hide show
  1. data/CHANGELOG +62 -0
  2. data/README.rdoc +2 -2
  3. data/bin/sequel +12 -2
  4. data/doc/advanced_associations.rdoc +1 -1
  5. data/doc/association_basics.rdoc +13 -0
  6. data/doc/release_notes/3.39.0.txt +237 -0
  7. data/doc/schema_modification.rdoc +4 -4
  8. data/lib/sequel/adapters/jdbc/derby.rb +1 -0
  9. data/lib/sequel/adapters/mock.rb +5 -0
  10. data/lib/sequel/adapters/mysql.rb +8 -1
  11. data/lib/sequel/adapters/mysql2.rb +10 -3
  12. data/lib/sequel/adapters/postgres.rb +72 -8
  13. data/lib/sequel/adapters/shared/db2.rb +1 -0
  14. data/lib/sequel/adapters/shared/mssql.rb +57 -0
  15. data/lib/sequel/adapters/shared/mysql.rb +95 -19
  16. data/lib/sequel/adapters/shared/oracle.rb +14 -0
  17. data/lib/sequel/adapters/shared/postgres.rb +63 -24
  18. data/lib/sequel/adapters/shared/sqlite.rb +6 -9
  19. data/lib/sequel/connection_pool/sharded_threaded.rb +8 -3
  20. data/lib/sequel/connection_pool/threaded.rb +9 -4
  21. data/lib/sequel/database/query.rb +60 -48
  22. data/lib/sequel/database/schema_generator.rb +13 -6
  23. data/lib/sequel/database/schema_methods.rb +65 -12
  24. data/lib/sequel/dataset/actions.rb +22 -4
  25. data/lib/sequel/dataset/features.rb +5 -0
  26. data/lib/sequel/dataset/graph.rb +2 -3
  27. data/lib/sequel/dataset/misc.rb +2 -2
  28. data/lib/sequel/dataset/query.rb +0 -2
  29. data/lib/sequel/dataset/sql.rb +33 -12
  30. data/lib/sequel/extensions/constraint_validations.rb +451 -0
  31. data/lib/sequel/extensions/eval_inspect.rb +17 -2
  32. data/lib/sequel/extensions/pg_array_ops.rb +15 -5
  33. data/lib/sequel/extensions/pg_interval.rb +2 -2
  34. data/lib/sequel/extensions/pg_row_ops.rb +18 -0
  35. data/lib/sequel/extensions/schema_dumper.rb +3 -11
  36. data/lib/sequel/model/associations.rb +3 -2
  37. data/lib/sequel/model/base.rb +57 -13
  38. data/lib/sequel/model/exceptions.rb +20 -2
  39. data/lib/sequel/plugins/constraint_validations.rb +198 -0
  40. data/lib/sequel/plugins/defaults_setter.rb +15 -1
  41. data/lib/sequel/plugins/dirty.rb +2 -2
  42. data/lib/sequel/plugins/identity_map.rb +12 -8
  43. data/lib/sequel/plugins/subclasses.rb +19 -1
  44. data/lib/sequel/plugins/tree.rb +3 -3
  45. data/lib/sequel/plugins/validation_helpers.rb +24 -4
  46. data/lib/sequel/sql.rb +64 -24
  47. data/lib/sequel/timezones.rb +10 -2
  48. data/lib/sequel/version.rb +1 -1
  49. data/spec/adapters/mssql_spec.rb +26 -25
  50. data/spec/adapters/mysql_spec.rb +57 -23
  51. data/spec/adapters/oracle_spec.rb +34 -49
  52. data/spec/adapters/postgres_spec.rb +226 -128
  53. data/spec/adapters/sqlite_spec.rb +50 -49
  54. data/spec/core/connection_pool_spec.rb +22 -0
  55. data/spec/core/database_spec.rb +53 -47
  56. data/spec/core/dataset_spec.rb +36 -32
  57. data/spec/core/expression_filters_spec.rb +14 -2
  58. data/spec/core/mock_adapter_spec.rb +4 -0
  59. data/spec/core/object_graph_spec.rb +0 -13
  60. data/spec/core/schema_spec.rb +64 -5
  61. data/spec/core_extensions_spec.rb +1 -0
  62. data/spec/extensions/constraint_validations_plugin_spec.rb +196 -0
  63. data/spec/extensions/constraint_validations_spec.rb +316 -0
  64. data/spec/extensions/defaults_setter_spec.rb +24 -0
  65. data/spec/extensions/eval_inspect_spec.rb +9 -0
  66. data/spec/extensions/identity_map_spec.rb +11 -2
  67. data/spec/extensions/pg_array_ops_spec.rb +9 -0
  68. data/spec/extensions/pg_row_ops_spec.rb +11 -1
  69. data/spec/extensions/pg_row_plugin_spec.rb +4 -0
  70. data/spec/extensions/schema_dumper_spec.rb +8 -5
  71. data/spec/extensions/subclasses_spec.rb +14 -0
  72. data/spec/extensions/validation_helpers_spec.rb +15 -2
  73. data/spec/integration/dataset_test.rb +75 -1
  74. data/spec/integration/plugin_test.rb +146 -0
  75. data/spec/integration/schema_test.rb +34 -0
  76. data/spec/model/dataset_methods_spec.rb +38 -0
  77. data/spec/model/hooks_spec.rb +6 -0
  78. data/spec/model/validations_spec.rb +27 -2
  79. metadata +8 -2
@@ -108,6 +108,16 @@ describe "Database schema parser" do
108
108
  INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == 'blah'
109
109
  end
110
110
 
111
+ specify "should parse current timestamp defaults from the schema properly" do
112
+ INTEGRATION_DB.create_table!(:items){Time :a, :default=>Sequel::CURRENT_TIMESTAMP}
113
+ INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == Sequel::CURRENT_TIMESTAMP
114
+ end
115
+
116
+ cspecify "should parse current date defaults from the schema properly", :mysql, :oracle do
117
+ INTEGRATION_DB.create_table!(:items){Date :a, :default=>Sequel::CURRENT_DATE}
118
+ INTEGRATION_DB.schema(:items).first.last[:ruby_default].should == Sequel::CURRENT_DATE
119
+ end
120
+
111
121
  cspecify "should parse types from the schema properly", [:jdbc, :db2], :oracle do
112
122
  INTEGRATION_DB.create_table!(:items){Integer :number}
113
123
  INTEGRATION_DB.schema(:items).first.last[:type].should == :integer
@@ -575,6 +585,30 @@ describe "Database schema modifiers" do
575
585
  end
576
586
  @db.schema(:items, :reload=>true).map{|x| x.first}.should == [:id]
577
587
  end
588
+
589
+ cspecify "should work correctly with many operations in a single alter_table call", [:jdbc, :db2], [:db2] do
590
+ @db.create_table!(:items) do
591
+ primary_key :id
592
+ String :name2
593
+ String :number2
594
+ constraint :bar, Sequel.~(:id=>nil)
595
+ end
596
+ @ds.insert(:name2=>'A12')
597
+ @db.alter_table(:items) do
598
+ add_column :number, Integer
599
+ drop_column :number2
600
+ rename_column :name2, :name
601
+ drop_constraint :bar
602
+ set_column_not_null :name
603
+ set_column_default :name, 'A13'
604
+ add_constraint :foo, Sequel.like(:name, 'A%')
605
+ end
606
+ @db[:items].first.should == {:id=>1, :name=>'A12', :number=>nil}
607
+ @db[:items].delete
608
+ proc{@db[:items].insert(:name=>nil)}.should raise_error(Sequel::DatabaseError)
609
+ @db[:items].insert(:number=>1)
610
+ @db[:items].get(:name).should == 'A13'
611
+ end
578
612
  end
579
613
 
580
614
  test_tables = begin
@@ -69,3 +69,41 @@ describe Sequel::Model::DatasetMethods, "#to_hash" do
69
69
  proc{@d.to_hash}.should raise_error(Sequel::Error)
70
70
  end
71
71
  end
72
+
73
+ describe Sequel::Model::DatasetMethods, "#join_table" do
74
+ before do
75
+ @c = Class.new(Sequel::Model(:items))
76
+ end
77
+
78
+ specify "should allow use to use a model class when joining" do
79
+ @c.join(Class.new(Sequel::Model(:categories)), :item_id => :id).sql.should == 'SELECT * FROM items INNER JOIN categories ON (categories.item_id = items.id)'
80
+ end
81
+
82
+ specify "should handle model classes that aren't simple selects using a subselect" do
83
+ @c.join(Class.new(Sequel::Model(MODEL_DB[:categories].where(:foo=>1))), :item_id => :id).sql.should == 'SELECT * FROM items INNER JOIN (SELECT * FROM categories WHERE (foo = 1)) AS t1 ON (t1.item_id = items.id)'
84
+ end
85
+ end
86
+
87
+ describe Sequel::Model::DatasetMethods, "#graph" do
88
+ before do
89
+ @c = Class.new(Sequel::Model(:items))
90
+ @c.columns :id
91
+ end
92
+
93
+ specify "should allow use to use a model class when joining" do
94
+ c = Class.new(Sequel::Model(:categories))
95
+ c.columns :id
96
+ @c.graph(c, :item_id => :id).sql.should == 'SELECT items.id, categories.id AS categories_id FROM items LEFT OUTER JOIN categories ON (categories.item_id = items.id)'
97
+ end
98
+ end
99
+
100
+ describe Sequel::Model::DatasetMethods, "#insert_sql" do
101
+ before do
102
+ @c = Class.new(Sequel::Model(:items))
103
+ @c.columns :id
104
+ end
105
+
106
+ specify "should handle a single model instance as an argument" do
107
+ @c.insert_sql(@c.load(:id=>1)).should == 'INSERT INTO items (id) VALUES (1)'
108
+ end
109
+ end
@@ -140,6 +140,12 @@ describe "Model#before_save && Model#after_save" do
140
140
  @c.load(:id => 2233).save.should == nil
141
141
  MODEL_DB.sqls.should == []
142
142
  end
143
+
144
+ specify "#save should have a raised exception reference the model instance" do
145
+ @c.send(:define_method, :before_save){false}
146
+ proc{@c.create(:x => 2233)}.should raise_error(Sequel::HookFailed){|e| e.model.should == @c.load(:x=>2233)}
147
+ MODEL_DB.sqls.should == []
148
+ end
143
149
  end
144
150
 
145
151
  describe "Model#before_destroy && Model#after_destroy" do
@@ -128,6 +128,28 @@ describe Sequel::Model do
128
128
  @o.errors[:blah].should be_empty
129
129
  end
130
130
 
131
+ specify "should allow raising of ValidationFailed with a Model instance with errors" do
132
+ @o.errors.add(:score, 'is too low')
133
+ begin
134
+ raise Sequel::ValidationFailed, @o
135
+ rescue Sequel::ValidationFailed => e
136
+ end
137
+ e.model.should equal(@o)
138
+ e.errors.should equal(@o.errors)
139
+ e.message.should == 'score is too low'
140
+ end
141
+
142
+ specify "should allow raising of ValidationFailed with an Errors instance" do
143
+ @o.errors.add(:score, 'is too low')
144
+ begin
145
+ raise Sequel::ValidationFailed, @o.errors
146
+ rescue Sequel::ValidationFailed => e
147
+ end
148
+ e.model.should be_nil
149
+ e.errors.should equal(@o.errors)
150
+ e.message.should == 'score is too low'
151
+ end
152
+
131
153
  specify "should allow raising of ValidationFailed with a string" do
132
154
  proc{raise Sequel::ValidationFailed, "no reason"}.should raise_error(Sequel::ValidationFailed, "no reason")
133
155
  end
@@ -165,8 +187,11 @@ describe "Model#save" do
165
187
  MODEL_DB.sqls.should == ['UPDATE people SET x = 6 WHERE (id = 4)']
166
188
  end
167
189
 
168
- specify "should raise error if validations fail and raise_on_save_faiure is true" do
169
- proc{@m.save}.should raise_error(Sequel::ValidationFailed){|e| e.errors.should == @m.errors }
190
+ specify "should raise error if validations fail and raise_on_save_failure is true" do
191
+ proc{@m.save}.should(raise_error(Sequel::ValidationFailed) do |e|
192
+ e.model.should equal(@m)
193
+ e.errors.should equal(@m.errors)
194
+ end)
170
195
  end
171
196
 
172
197
  specify "should raise error if validations fail and :raise_on_failure option is true" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.38.0
4
+ version: 3.39.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-01 00:00:00.000000000 Z
12
+ date: 2012-09-01 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: The Database Toolkit for Ruby
15
15
  email: code@jeremyevans.net
@@ -100,6 +100,7 @@ extra_rdoc_files:
100
100
  - doc/release_notes/3.36.0.txt
101
101
  - doc/release_notes/3.37.0.txt
102
102
  - doc/release_notes/3.38.0.txt
103
+ - doc/release_notes/3.39.0.txt
103
104
  files:
104
105
  - MIT-LICENSE
105
106
  - CHANGELOG
@@ -175,6 +176,7 @@ files:
175
176
  - doc/release_notes/3.36.0.txt
176
177
  - doc/release_notes/3.37.0.txt
177
178
  - doc/release_notes/3.38.0.txt
179
+ - doc/release_notes/3.39.0.txt
178
180
  - doc/sharding.rdoc
179
181
  - doc/sql.rdoc
180
182
  - doc/validations.rdoc
@@ -291,6 +293,8 @@ files:
291
293
  - spec/extensions/pg_row_plugin_spec.rb
292
294
  - spec/extensions/pg_row_spec.rb
293
295
  - spec/extensions/pg_typecast_on_load_spec.rb
296
+ - spec/extensions/constraint_validations_plugin_spec.rb
297
+ - spec/extensions/constraint_validations_spec.rb
294
298
  - spec/integration/associations_test.rb
295
299
  - spec/integration/database_test.rb
296
300
  - spec/integration/dataset_test.rb
@@ -485,6 +489,7 @@ files:
485
489
  - lib/sequel/extensions/pg_interval.rb
486
490
  - lib/sequel/extensions/pg_row.rb
487
491
  - lib/sequel/extensions/pg_row_ops.rb
492
+ - lib/sequel/extensions/constraint_validations.rb
488
493
  - lib/sequel/metaprogramming.rb
489
494
  - lib/sequel/model.rb
490
495
  - lib/sequel/model/associations.rb
@@ -544,6 +549,7 @@ files:
544
549
  - lib/sequel/plugins/eager_each.rb
545
550
  - lib/sequel/plugins/pg_row.rb
546
551
  - lib/sequel/plugins/pg_typecast_on_load.rb
552
+ - lib/sequel/plugins/constraint_validations.rb
547
553
  - lib/sequel/timezones.rb
548
554
  - lib/sequel/version.rb
549
555
  - lib/sequel/ast_transformer.rb