sequel 3.45.0 → 3.46.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG +34 -0
  3. data/README.rdoc +6 -0
  4. data/Rakefile +46 -33
  5. data/doc/release_notes/3.46.0.txt +122 -0
  6. data/doc/schema_modification.rdoc +42 -6
  7. data/doc/security.rdoc +379 -0
  8. data/doc/transactions.rdoc +1 -1
  9. data/lib/sequel/adapters/jdbc/as400.rb +1 -0
  10. data/lib/sequel/adapters/jdbc/h2.rb +11 -0
  11. data/lib/sequel/adapters/mysql2.rb +3 -9
  12. data/lib/sequel/adapters/postgres.rb +34 -2
  13. data/lib/sequel/adapters/shared/cubrid.rb +5 -0
  14. data/lib/sequel/adapters/shared/mssql.rb +27 -3
  15. data/lib/sequel/adapters/shared/mysql.rb +25 -4
  16. data/lib/sequel/adapters/shared/sqlite.rb +12 -1
  17. data/lib/sequel/connection_pool.rb +3 -3
  18. data/lib/sequel/connection_pool/sharded_threaded.rb +7 -8
  19. data/lib/sequel/connection_pool/threaded.rb +7 -8
  20. data/lib/sequel/core.rb +5 -2
  21. data/lib/sequel/database.rb +1 -1
  22. data/lib/sequel/database/connecting.rb +7 -7
  23. data/lib/sequel/database/features.rb +88 -0
  24. data/lib/sequel/database/misc.rb +14 -64
  25. data/lib/sequel/database/query.rb +0 -332
  26. data/lib/sequel/database/schema_generator.rb +36 -3
  27. data/lib/sequel/database/schema_methods.rb +48 -12
  28. data/lib/sequel/database/transactions.rb +344 -0
  29. data/lib/sequel/dataset/actions.rb +24 -9
  30. data/lib/sequel/dataset/mutation.rb +20 -0
  31. data/lib/sequel/dataset/query.rb +0 -17
  32. data/lib/sequel/dataset/sql.rb +7 -0
  33. data/lib/sequel/exceptions.rb +10 -6
  34. data/lib/sequel/extensions/_pretty_table.rb +2 -2
  35. data/lib/sequel/extensions/looser_typecasting.rb +10 -0
  36. data/lib/sequel/extensions/migration.rb +5 -2
  37. data/lib/sequel/model.rb +1 -1
  38. data/lib/sequel/model/associations.rb +16 -14
  39. data/lib/sequel/model/base.rb +14 -2
  40. data/lib/sequel/plugins/composition.rb +3 -3
  41. data/lib/sequel/plugins/dirty.rb +6 -6
  42. data/lib/sequel/plugins/hook_class_methods.rb +3 -0
  43. data/lib/sequel/plugins/serialization.rb +7 -17
  44. data/lib/sequel/plugins/string_stripper.rb +2 -1
  45. data/lib/sequel/plugins/validation_helpers.rb +1 -1
  46. data/lib/sequel/sql.rb +3 -0
  47. data/lib/sequel/version.rb +1 -1
  48. data/spec/adapters/mssql_spec.rb +21 -0
  49. data/spec/adapters/postgres_spec.rb +35 -8
  50. data/spec/core/database_spec.rb +4 -0
  51. data/spec/core/dataset_spec.rb +48 -2
  52. data/spec/core/schema_generator_spec.rb +10 -1
  53. data/spec/core/schema_spec.rb +69 -0
  54. data/spec/extensions/composition_spec.rb +21 -2
  55. data/spec/extensions/dirty_spec.rb +17 -10
  56. data/spec/extensions/eager_each_spec.rb +4 -1
  57. data/spec/extensions/looser_typecasting_spec.rb +16 -19
  58. data/spec/extensions/migration_spec.rb +7 -1
  59. data/spec/extensions/serialization_spec.rb +22 -0
  60. data/spec/extensions/single_table_inheritance_spec.rb +3 -2
  61. data/spec/extensions/validation_helpers_spec.rb +6 -0
  62. data/spec/integration/dataset_test.rb +5 -0
  63. data/spec/integration/schema_test.rb +16 -0
  64. data/spec/model/associations_spec.rb +40 -0
  65. data/spec/model/base_spec.rb +21 -1
  66. data/spec/model/record_spec.rb +3 -0
  67. metadata +14 -10
@@ -128,6 +128,8 @@ describe "Reversible Migrations with Sequel.migration{change{}}" do
128
128
  add_column :d, String
129
129
  add_constraint :blah, 'd IS NOT NULL'
130
130
  add_foreign_key :e, :b
131
+ add_foreign_key [:e], :b, :name=>'e_fk'
132
+ add_foreign_key [:e, :a], :b
131
133
  add_primary_key :f, :b
132
134
  add_index :e, :name=>'e_n'
133
135
  add_full_text_index :e, :name=>'e_ft'
@@ -151,6 +153,8 @@ describe "Reversible Migrations with Sequel.migration{change{}}" do
151
153
  [:add_column, :d, String],
152
154
  [:add_constraint, :blah, "d IS NOT NULL"],
153
155
  [:add_foreign_key, :e, :b],
156
+ [:add_foreign_key, [:e], :b, {:name=>"e_fk"}],
157
+ [:add_foreign_key, [:e, :a], :b],
154
158
  [:add_primary_key, :f, :b],
155
159
  [:add_index, :e, {:name=>"e_n"}],
156
160
  [:add_full_text_index, :e, {:name=>"e_ft"}],
@@ -173,7 +177,9 @@ describe "Reversible Migrations with Sequel.migration{change{}}" do
173
177
  [:drop_index, :e, {:name=>"e_ft"}],
174
178
  [:drop_index, :e, {:name=>"e_n"}],
175
179
  [:drop_column, :f],
176
- [:drop_column, :e],
180
+ [:drop_foreign_key, [:e, :a]],
181
+ [:drop_foreign_key, [:e], {:name=>"e_fk"}],
182
+ [:drop_foreign_key, :e],
177
183
  [:drop_constraint, :blah],
178
184
  [:drop_column, :d]]
179
185
  ],
@@ -218,6 +218,17 @@ describe "Serialization plugin" do
218
218
  "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
219
219
  end
220
220
 
221
+ it "should clear the deserialized columns when using set_values" do
222
+ @c.set_primary_key :id
223
+ @c.plugin :serialization, :yaml, :abc, :def
224
+ o = @c.load(:id => 1, :abc => "--- 1\n", :def => "--- hello\n")
225
+ o.abc = 23
226
+ o.deserialized_values.length.should == 1
227
+ o.abc.should == 23
228
+ o.set_values(:id=>1)
229
+ o.deserialized_values.length.should == 0
230
+ end
231
+
221
232
  it "should clear the deserialized columns when refreshing" do
222
233
  @c.set_primary_key :id
223
234
  @c.plugin :serialization, :yaml, :abc, :def
@@ -238,6 +249,17 @@ describe "Serialization plugin" do
238
249
  o.deserialized_values.length.should == 0
239
250
  end
240
251
 
252
+ it "should clear the deserialized columns when refreshing after saving a new object with insert_select" do
253
+ @c.set_primary_key :id
254
+ @c.plugin :serialization, :yaml, :abc, :def
255
+ def (@c.instance_dataset).supports_insert_select?() true end
256
+ def (@c.instance_dataset).insert_select(*) {:id=>1} end
257
+ o = @c.new(:abc => "--- 1\n", :def => "--- hello\n")
258
+ o.deserialized_values.length.should == 2
259
+ o.save
260
+ o.deserialized_values.length.should == 0
261
+ end
262
+
241
263
  it "should raise an error if calling internal serialization methods with bad columns" do
242
264
  @c.set_primary_key :id
243
265
  @c.plugin :serialization
@@ -193,7 +193,7 @@ describe Sequel::Model, "#sti_key" do
193
193
  StiTest2.dataset.row_proc.call(:kind=>1).should be_a_instance_of(StiTest3)
194
194
  StiTest2.dataset.row_proc.call(:kind=>2).should be_a_instance_of(StiTest4)
195
195
 
196
- StiTest3.create.kind.should == 1
196
+ [0,1].should include(StiTest3.create.kind)
197
197
  StiTest4.create.kind.should == 2
198
198
  end
199
199
 
@@ -214,7 +214,8 @@ describe Sequel::Model, "#sti_key" do
214
214
  class ::StiTest4 < ::StiTest2; end
215
215
 
216
216
  StiTest2.dataset.sql.should == "SELECT * FROM sti_test2s"
217
- StiTest3.dataset.sql.should == "SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (0, 1))"
217
+ ["SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (0, 1))",
218
+ "SELECT * FROM sti_test2s WHERE (sti_test2s.kind IN (1, 0))"].should include(StiTest3.dataset.sql)
218
219
  end
219
220
 
220
221
  it "should honor a :key_chooser" do
@@ -294,6 +294,12 @@ describe "Sequel::Plugins::ValidationHelpers" do
294
294
  @m.value = 123.05
295
295
  @m.should_not be_valid
296
296
  @m.errors.full_messages.should == ['value is not a Integer']
297
+
298
+ @c.set_validations{validates_type(Integer, :value)}
299
+ @m.value = nil
300
+ @m.should be_valid
301
+ @m.value = false
302
+ @m.should_not be_valid
297
303
  end
298
304
 
299
305
  specify "should support validates_presence" do
@@ -361,6 +361,11 @@ describe Sequel::Database do
361
361
  INTEGRATION_DB.get(Sequel.cast(Sequel.blob("\1\2\3"), File).as(:a)).should == "\1\2\3"
362
362
  end
363
363
 
364
+ cspecify "should properly escape identifiers", :db2, :oracle do
365
+ INTEGRATION_DB.create_table(:"\\'\"[]"){Integer :id}
366
+ INTEGRATION_DB.drop_table(:"\\'\"[]")
367
+ end
368
+
364
369
  specify "should have a working table_exists?" do
365
370
  t = :basdfdsafsaddsaf
366
371
  INTEGRATION_DB.drop_table?(t)
@@ -237,6 +237,15 @@ describe "Database foreign key parsing" do
237
237
  @db.alter_table(:a){add_index [:d, :c], :unique=>true}
238
238
  @db.alter_table(:b){add_foreign_key [:f, :e], :a, :key=>[:d, :c]}
239
239
  @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]], [[:f, :e], :a, [:d, :c]]]
240
+
241
+ @db.alter_table(:b){drop_foreign_key [:f, :e]}
242
+ @pr[:b, [[:e], :a, [:pk, :c]], [[:f], :a, [:c]], [[:f], :a, [:d]]]
243
+
244
+ @db.alter_table(:b){drop_foreign_key :e}
245
+ @pr[:b, [[:f], :a, [:c]], [[:f], :a, [:d]]]
246
+
247
+ proc{@db.alter_table(:b){drop_foreign_key :f}}.should raise_error(Sequel::Error)
248
+ @pr[:b, [[:f], :a, [:c]], [[:f], :a, [:d]]]
240
249
  end
241
250
 
242
251
  specify "should handle composite foreign and primary keys" do
@@ -367,6 +376,13 @@ describe "Database schema modifiers" do
367
376
  @ds.insert([10])
368
377
  end
369
378
 
379
+ specify "should be able to specify constraint names for column constraints" do
380
+ @db.create_table!(:items2){primary_key :id, :primary_key_constraint_name=>:foo_pk}
381
+ @db.create_table!(:items){foreign_key :id, :items2, :unique=>true, :foreign_key_constraint_name => :foo_fk, :unique_constraint_name => :foo_uk, :null=>false}
382
+ @db.alter_table(:items){drop_constraint :foo_fk, :type=>:foreign_key; drop_constraint :foo_uk, :type=>:unique}
383
+ @db.alter_table(:items2){drop_constraint :foo_pk, :type=>:primary_key}
384
+ end
385
+
370
386
  specify "should handle foreign keys correctly when creating tables" do
371
387
  @db.create_table!(:items) do
372
388
  primary_key :id
@@ -137,6 +137,46 @@ describe Sequel::Model, "associate" do
137
137
  proc{c.one_to_many :cs, :clone=>:c}.should_not raise_error(Sequel::Error)
138
138
  proc{c.one_to_one :c2, :clone=>:cs}.should_not raise_error(Sequel::Error)
139
139
  end
140
+
141
+ it "should clear associations cache when using set_values" do
142
+ c = Class.new(Sequel::Model(:c))
143
+ c.many_to_one :c
144
+ o = c.new
145
+ o.associations[:c] = 1
146
+ o.set_values(:id=>1)
147
+ o.associations.should == {}
148
+ end
149
+
150
+ it "should clear associations cache when refreshing object manually" do
151
+ c = Class.new(Sequel::Model(:c))
152
+ c.many_to_one :c
153
+ o = c.new
154
+ o.associations[:c] = 1
155
+ o.refresh
156
+ o.associations.should == {}
157
+ end
158
+
159
+ it "should clear associations cache when refreshing object after save" do
160
+ c = Class.new(Sequel::Model(:c))
161
+ c.many_to_one :c
162
+ o = c.new
163
+ o.associations[:c] = 1
164
+ o.save
165
+ o.associations.should == {}
166
+ end
167
+
168
+ it "should clear associations cache when saving with insert_select" do
169
+ ds = Sequel::Model.db[:c]
170
+ def ds.supports_insert_select?() true end
171
+ def ds.insert_select(*) {:id=>1} end
172
+ c = Class.new(Sequel::Model(ds))
173
+ c.many_to_one :c
174
+ o = c.new
175
+ o.associations[:c] = 1
176
+ o.save
177
+ o.associations.should == {}
178
+ end
179
+
140
180
  end
141
181
 
142
182
  describe Sequel::Model, "many_to_one" do
@@ -693,7 +693,7 @@ describe Sequel::Model, ".[] optimization" do
693
693
  end
694
694
  end
695
695
 
696
- describe "Model datasets #with_pk" do
696
+ describe "Model datasets #with_pk with #with_pk!" do
697
697
  before do
698
698
  @c = Class.new(Sequel::Model(:a))
699
699
  @ds = @c.dataset
@@ -704,16 +704,22 @@ describe "Model datasets #with_pk" do
704
704
  it "should return the first record where the primary key matches" do
705
705
  @ds.with_pk(1).should == @c.load(:id=>1)
706
706
  MODEL_DB.sqls.should == ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
707
+ @ds.with_pk!(1).should == @c.load(:id=>1)
708
+ MODEL_DB.sqls.should == ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
707
709
  end
708
710
 
709
711
  it "should handle existing filters" do
710
712
  @ds.filter(:a=>2).with_pk(1)
711
713
  MODEL_DB.sqls.should == ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
714
+ @ds.filter(:a=>2).with_pk!(1)
715
+ MODEL_DB.sqls.should == ["SELECT * FROM a WHERE ((a = 2) AND (a.id = 1)) LIMIT 1"]
712
716
  end
713
717
 
714
718
  it "should work with string values" do
715
719
  @ds.with_pk("foo")
716
720
  MODEL_DB.sqls.should == ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
721
+ @ds.with_pk!("foo")
722
+ MODEL_DB.sqls.should == ["SELECT * FROM a WHERE (a.id = 'foo') LIMIT 1"]
717
723
  end
718
724
 
719
725
  it "should handle an array for composite primary keys" do
@@ -723,6 +729,20 @@ describe "Model datasets #with_pk" do
723
729
  ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1",
724
730
  "SELECT * FROM a WHERE ((a.id2 = 2) AND (a.id1 = 1)) LIMIT 1"].should include(sqls.pop)
725
731
  sqls.should == []
732
+
733
+ @ds.with_pk!([1, 2])
734
+ sqls = MODEL_DB.sqls
735
+ ["SELECT * FROM a WHERE ((a.id1 = 1) AND (a.id2 = 2)) LIMIT 1",
736
+ "SELECT * FROM a WHERE ((a.id2 = 2) AND (a.id1 = 1)) LIMIT 1"].should include(sqls.pop)
737
+ sqls.should == []
738
+ end
739
+
740
+ it "should have with_pk return nil and with_pk! raise if no rows match" do
741
+ @ds._fetch = []
742
+ @ds.with_pk(1).should == nil
743
+ MODEL_DB.sqls.should == ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
744
+ proc{@ds.with_pk!(1)}.should raise_error(Sequel::NoMatchingRow)
745
+ MODEL_DB.sqls.should == ["SELECT * FROM a WHERE (a.id = 1) LIMIT 1"]
726
746
  end
727
747
 
728
748
  it "should have #[] consider an integer as a primary key lookup" do
@@ -1642,11 +1642,14 @@ describe Sequel::Model, "typecasting" do
1642
1642
  m.x.should == bd
1643
1643
  m.x = bd
1644
1644
  m.x.should == bd
1645
+ m.x = '0'
1646
+ m.x.should == 0
1645
1647
  end
1646
1648
 
1647
1649
  specify "should raise an error if invalid data is used in an decimal field" do
1648
1650
  @c.db_schema = {:x=>{:type=>:decimal}}
1649
1651
  proc{@c.new.x = Date.today}.should raise_error(Sequel::InvalidValue)
1652
+ proc{@c.new.x = 'foo'}.should raise_error(Sequel::InvalidValue)
1650
1653
  end
1651
1654
 
1652
1655
  specify "should assign value if raise_on_typecast_failure is off and assigning invalid decimal" do
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sequel
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.45.0
5
- prerelease:
4
+ version: 3.46.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Jeremy Evans
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-03-01 00:00:00.000000000 Z
11
+ date: 2013-04-02 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: The Database Toolkit for Ruby
15
14
  email: code@jeremyevans.net
@@ -44,6 +43,7 @@ extra_rdoc_files:
44
43
  - doc/object_model.rdoc
45
44
  - doc/core_extensions.rdoc
46
45
  - doc/bin_sequel.rdoc
46
+ - doc/security.rdoc
47
47
  - doc/release_notes/1.0.txt
48
48
  - doc/release_notes/1.1.txt
49
49
  - doc/release_notes/1.3.txt
@@ -108,6 +108,7 @@ extra_rdoc_files:
108
108
  - doc/release_notes/3.43.0.txt
109
109
  - doc/release_notes/3.44.0.txt
110
110
  - doc/release_notes/3.45.0.txt
111
+ - doc/release_notes/3.46.0.txt
111
112
  files:
112
113
  - MIT-LICENSE
113
114
  - CHANGELOG
@@ -190,6 +191,7 @@ files:
190
191
  - doc/release_notes/3.43.0.txt
191
192
  - doc/release_notes/3.44.0.txt
192
193
  - doc/release_notes/3.45.0.txt
194
+ - doc/release_notes/3.46.0.txt
193
195
  - doc/sharding.rdoc
194
196
  - doc/sql.rdoc
195
197
  - doc/validations.rdoc
@@ -202,6 +204,7 @@ files:
202
204
  - doc/object_model.rdoc
203
205
  - doc/core_extensions.rdoc
204
206
  - doc/bin_sequel.rdoc
207
+ - doc/security.rdoc
205
208
  - spec/adapters/firebird_spec.rb
206
209
  - spec/adapters/informix_spec.rb
207
210
  - spec/adapters/mssql_spec.rb
@@ -467,6 +470,8 @@ files:
467
470
  - lib/sequel/database/logging.rb
468
471
  - lib/sequel/database/misc.rb
469
472
  - lib/sequel/database/query.rb
473
+ - lib/sequel/database/features.rb
474
+ - lib/sequel/database/transactions.rb
470
475
  - lib/sequel/dataset.rb
471
476
  - lib/sequel/dataset/actions.rb
472
477
  - lib/sequel/dataset/features.rb
@@ -588,33 +593,32 @@ files:
588
593
  - lib/sequel_model.rb
589
594
  homepage: http://sequel.rubyforge.org
590
595
  licenses: []
596
+ metadata: {}
591
597
  post_install_message:
592
598
  rdoc_options:
593
599
  - --quiet
594
600
  - --line-numbers
595
601
  - --inline-source
596
602
  - --title
597
- - ! 'Sequel: The Database Toolkit for Ruby'
603
+ - 'Sequel: The Database Toolkit for Ruby'
598
604
  - --main
599
605
  - README.rdoc
600
606
  require_paths:
601
607
  - lib
602
608
  required_ruby_version: !ruby/object:Gem::Requirement
603
- none: false
604
609
  requirements:
605
- - - ! '>='
610
+ - - '>='
606
611
  - !ruby/object:Gem::Version
607
612
  version: 1.8.7
608
613
  required_rubygems_version: !ruby/object:Gem::Requirement
609
- none: false
610
614
  requirements:
611
- - - ! '>='
615
+ - - '>='
612
616
  - !ruby/object:Gem::Version
613
617
  version: '0'
614
618
  requirements: []
615
619
  rubyforge_project: sequel
616
- rubygems_version: 1.8.23
620
+ rubygems_version: 2.0.0
617
621
  signing_key:
618
- specification_version: 3
622
+ specification_version: 4
619
623
  summary: The Database Toolkit for Ruby
620
624
  test_files: []