sequel 3.38.0 → 3.39.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 (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