sequel 4.44.0 → 4.45.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +110 -0
- data/README.rdoc +8 -9
- data/doc/active_record.rdoc +2 -3
- data/doc/model_plugins.rdoc +1 -1
- data/doc/opening_databases.rdoc +0 -46
- data/doc/release_notes/4.45.0.txt +370 -0
- data/lib/sequel/adapters/cubrid.rb +2 -0
- data/lib/sequel/adapters/do.rb +2 -0
- data/lib/sequel/adapters/jdbc/as400.rb +2 -0
- data/lib/sequel/adapters/jdbc/cubrid.rb +2 -0
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +2 -0
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +2 -0
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +2 -0
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -0
- data/lib/sequel/adapters/jdbc/postgresql.rb +5 -0
- data/lib/sequel/adapters/mysql.rb +1 -0
- data/lib/sequel/adapters/mysql2.rb +1 -0
- data/lib/sequel/adapters/odbc/oracle.rb +11 -0
- data/lib/sequel/adapters/odbc/progress.rb +2 -0
- data/lib/sequel/adapters/postgres.rb +0 -2
- data/lib/sequel/adapters/shared/cubrid.rb +2 -0
- data/lib/sequel/adapters/shared/firebird.rb +2 -0
- data/lib/sequel/adapters/shared/informix.rb +2 -0
- data/lib/sequel/adapters/shared/mssql.rb +47 -7
- data/lib/sequel/adapters/shared/mysql.rb +16 -1
- data/lib/sequel/adapters/shared/postgres.rb +9 -1
- data/lib/sequel/adapters/shared/progress.rb +2 -0
- data/lib/sequel/adapters/shared/sqlanywhere.rb +1 -1
- data/lib/sequel/adapters/swift.rb +2 -0
- data/lib/sequel/ast_transformer.rb +13 -6
- data/lib/sequel/core.rb +13 -16
- data/lib/sequel/database/connecting.rb +25 -10
- data/lib/sequel/database/dataset.rb +6 -1
- data/lib/sequel/database/dataset_defaults.rb +9 -2
- data/lib/sequel/database/misc.rb +10 -3
- data/lib/sequel/database/schema_methods.rb +4 -0
- data/lib/sequel/dataset/mutation.rb +8 -20
- data/lib/sequel/dataset/prepared_statements.rb +2 -0
- data/lib/sequel/dataset/query.rb +32 -7
- data/lib/sequel/dataset/sql.rb +13 -3
- data/lib/sequel/deprecated.rb +9 -1
- data/lib/sequel/exceptions.rb +37 -8
- data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +117 -0
- data/lib/sequel/extensions/date_arithmetic.rb +1 -0
- data/lib/sequel/extensions/identifier_mangling.rb +3 -2
- data/lib/sequel/extensions/pg_hstore.rb +1 -5
- data/lib/sequel/extensions/schema_dumper.rb +3 -1
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +2 -2
- data/lib/sequel/extensions/string_agg.rb +1 -0
- data/lib/sequel/model.rb +23 -10
- data/lib/sequel/model/associations.rb +17 -5
- data/lib/sequel/model/base.rb +115 -62
- data/lib/sequel/model/dataset_module.rb +10 -3
- data/lib/sequel/model/exceptions.rb +7 -5
- data/lib/sequel/plugins/association_pks.rb +13 -1
- data/lib/sequel/plugins/association_proxies.rb +8 -1
- data/lib/sequel/plugins/before_after_save.rb +1 -0
- data/lib/sequel/plugins/class_table_inheritance.rb +7 -3
- data/lib/sequel/plugins/columns_updated.rb +42 -0
- data/lib/sequel/plugins/composition.rb +10 -5
- data/lib/sequel/plugins/error_splitter.rb +1 -1
- data/lib/sequel/plugins/hook_class_methods.rb +39 -5
- data/lib/sequel/plugins/instance_hooks.rb +58 -5
- data/lib/sequel/plugins/lazy_attributes.rb +10 -5
- data/lib/sequel/plugins/nested_attributes.rb +10 -5
- data/lib/sequel/plugins/prepared_statements.rb +7 -0
- data/lib/sequel/plugins/prepared_statements_associations.rb +2 -0
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +2 -0
- data/lib/sequel/plugins/schema.rb +2 -0
- data/lib/sequel/plugins/scissors.rb +2 -0
- data/lib/sequel/plugins/serialization.rb +10 -5
- data/lib/sequel/plugins/split_values.rb +5 -1
- data/lib/sequel/plugins/static_cache.rb +2 -2
- data/lib/sequel/plugins/tactical_eager_loading.rb +1 -1
- data/lib/sequel/plugins/validation_contexts.rb +49 -0
- data/lib/sequel/plugins/validation_helpers.rb +1 -0
- data/lib/sequel/sql.rb +1 -1
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/mssql_spec.rb +31 -0
- data/spec/adapters/mysql_spec.rb +20 -2
- data/spec/adapters/postgres_spec.rb +43 -12
- data/spec/adapters/spec_helper.rb +5 -8
- data/spec/core/database_spec.rb +47 -12
- data/spec/core/dataset_mutation_spec.rb +22 -22
- data/spec/core/dataset_spec.rb +88 -20
- data/spec/core/deprecated_spec.rb +1 -1
- data/spec/core/expression_filters_spec.rb +1 -1
- data/spec/core/mock_adapter_spec.rb +0 -3
- data/spec/core/placeholder_literalizer_spec.rb +1 -1
- data/spec/core/schema_spec.rb +8 -1
- data/spec/core/spec_helper.rb +6 -1
- data/spec/core_extensions_spec.rb +4 -0
- data/spec/deprecation_helper.rb +17 -0
- data/spec/extensions/_deprecated_identifier_mangling_spec.rb +314 -0
- data/spec/extensions/association_pks_spec.rb +61 -13
- data/spec/extensions/association_proxies_spec.rb +3 -3
- data/spec/extensions/class_table_inheritance_spec.rb +39 -0
- data/spec/extensions/columns_updated_spec.rb +35 -0
- data/spec/extensions/composition_spec.rb +6 -1
- data/spec/extensions/hook_class_methods_spec.rb +114 -26
- data/spec/extensions/identifier_mangling_spec.rb +107 -73
- data/spec/extensions/instance_hooks_spec.rb +78 -14
- data/spec/extensions/lazy_attributes_spec.rb +8 -2
- data/spec/extensions/many_through_many_spec.rb +2 -2
- data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
- data/spec/extensions/nested_attributes_spec.rb +8 -2
- data/spec/extensions/pg_array_spec.rb +18 -4
- data/spec/extensions/prepared_statements_associations_spec.rb +48 -39
- data/spec/extensions/prepared_statements_with_pk_spec.rb +13 -11
- data/spec/extensions/query_spec.rb +1 -1
- data/spec/extensions/schema_dumper_spec.rb +34 -6
- data/spec/extensions/schema_spec.rb +13 -7
- data/spec/extensions/scissors_spec.rb +3 -1
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +4 -4
- data/spec/extensions/serialization_spec.rb +7 -1
- data/spec/extensions/set_overrides_spec.rb +2 -2
- data/spec/extensions/shared_caching_spec.rb +19 -15
- data/spec/extensions/spec_helper.rb +7 -3
- data/spec/extensions/split_values_spec.rb +45 -10
- data/spec/extensions/string_agg_spec.rb +2 -2
- data/spec/extensions/subset_conditions_spec.rb +3 -3
- data/spec/extensions/tactical_eager_loading_spec.rb +1 -1
- data/spec/extensions/validation_contexts_spec.rb +31 -0
- data/spec/guards_helper.rb +2 -0
- data/spec/integration/associations_test.rb +22 -20
- data/spec/integration/dataset_test.rb +25 -2
- data/spec/integration/model_test.rb +1 -1
- data/spec/integration/plugin_test.rb +11 -16
- data/spec/integration/prepared_statement_test.rb +40 -32
- data/spec/integration/spec_helper.rb +5 -8
- data/spec/model/association_reflection_spec.rb +4 -0
- data/spec/model/associations_spec.rb +37 -10
- data/spec/model/base_spec.rb +6 -0
- data/spec/model/hooks_spec.rb +56 -35
- data/spec/model/model_spec.rb +21 -5
- data/spec/model/record_spec.rb +14 -11
- data/spec/model/spec_helper.rb +7 -1
- data/spec/sequel_warning.rb +11 -0
- metadata +13 -3
@@ -2,34 +2,36 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
3
3
|
describe "prepared_statements_with_pk plugin" do
|
4
4
|
before do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
deprecated do
|
6
|
+
@db = Sequel.mock(:fetch=>{:id=>1, :name=>'foo', :i=>2}, :autoid=>proc{|sql| 1}, :numrows=>1, :servers=>{:read_only=>{}})
|
7
|
+
@c = Class.new(Sequel::Model(@db[:people]))
|
8
|
+
@c.columns :id, :name, :i
|
9
|
+
@c.plugin :prepared_statements_with_pk
|
10
|
+
@p = @c.load(:id=>1, :name=>'foo', :i=>2)
|
11
|
+
@db.sqls
|
12
|
+
end
|
11
13
|
end
|
12
14
|
|
13
|
-
|
15
|
+
deprecated "should load the prepared_statements plugin" do
|
14
16
|
@c.plugins.must_include(Sequel::Plugins::PreparedStatements)
|
15
17
|
end
|
16
18
|
|
17
|
-
|
19
|
+
deprecated "should correctly lookup by primary key from dataset" do
|
18
20
|
@c.dataset.filter(:name=>'foo')[1].must_equal @p
|
19
21
|
@c.db.sqls.must_equal ["SELECT * FROM people WHERE ((name = 'foo') AND (people.id = 1)) LIMIT 1 -- read_only"]
|
20
22
|
end
|
21
23
|
|
22
|
-
|
24
|
+
deprecated "should still work correctly if there are multiple conflicting variables" do
|
23
25
|
@c.dataset.filter(:name=>'foo').or(:name=>'bar')[1].must_equal @p
|
24
26
|
@c.db.sqls.must_equal ["SELECT * FROM people WHERE (((name = 'foo') OR (name = 'bar')) AND (people.id = 1)) LIMIT 1 -- read_only"]
|
25
27
|
end
|
26
28
|
|
27
|
-
|
29
|
+
deprecated "should still work correctly if the primary key is used elsewhere in the query" do
|
28
30
|
@c.dataset.filter{id > 2}[1].must_equal @p
|
29
31
|
@c.db.sqls.must_equal ["SELECT * FROM people WHERE ((id > 2) AND (people.id = 1)) LIMIT 1 -- read_only"]
|
30
32
|
end
|
31
33
|
|
32
|
-
|
34
|
+
deprecated "should respect explicitly set server" do
|
33
35
|
@c.dataset.filter(:name=>'foo')[1].must_equal @p
|
34
36
|
@c.db.sqls.must_equal ["SELECT * FROM people WHERE ((name = 'foo') AND (people.id = 1)) LIMIT 1 -- read_only"]
|
35
37
|
@c.dataset.server(:default).filter(:name=>'foo')[1].must_equal @p
|
@@ -75,9 +75,9 @@ end
|
|
75
75
|
describe "Sequel::Database dump methods" do
|
76
76
|
before do
|
77
77
|
@d = Sequel::Database.new.extension(:schema_dumper)
|
78
|
-
@d.meta_def(:tables){|o| [:t1, :t2]}
|
78
|
+
@d.meta_def(:tables){|o| o[:schema] ? [o[:schema]] : [:t1, :t2]}
|
79
79
|
@d.meta_def(:schema) do |t, *o|
|
80
|
-
case t
|
80
|
+
v = case t
|
81
81
|
when :t1, 't__t1', Sequel.identifier(:t__t1)
|
82
82
|
[[:c1, {:db_type=>'integer', :primary_key=>true, :auto_increment=>true, :allow_null=>false}],
|
83
83
|
[:c2, {:db_type=>'varchar(20)', :allow_null=>true}]]
|
@@ -90,9 +90,19 @@ describe "Sequel::Database dump methods" do
|
|
90
90
|
when :t5
|
91
91
|
[[:c1, {:db_type=>'blahblah', :allow_null=>true}]]
|
92
92
|
end
|
93
|
+
|
94
|
+
if o.first.is_a?(Hash) && o.first[:schema]
|
95
|
+
v.last.last[:db_type] = o.first[:schema]
|
96
|
+
end
|
97
|
+
|
98
|
+
v
|
93
99
|
end
|
94
100
|
end
|
95
101
|
|
102
|
+
it "should support dumping table with :schema option" do
|
103
|
+
@d.dump_table_schema(:t1, :schema=>'varchar(15)').must_equal "create_table(:t1) do\n primary_key :c1\n String :c2, :size=>15\nend"
|
104
|
+
end
|
105
|
+
|
96
106
|
it "should support dumping table schemas as create_table method calls" do
|
97
107
|
@d.dump_table_schema(:t1).must_equal "create_table(:t1) do\n primary_key :c1\n String :c2, :size=>20\nend"
|
98
108
|
end
|
@@ -110,6 +120,11 @@ describe "Sequel::Database dump methods" do
|
|
110
120
|
@d.dump_table_schema(:t6).must_equal "create_table(:t6) do\n primary_key :c1, :type=>:Bignum\nend"
|
111
121
|
end
|
112
122
|
|
123
|
+
it "should dump non-Integer primary key columns with explicit :type when using :same_db=>true" do
|
124
|
+
@d.meta_def(:schema){|*s| [[:c1, {:db_type=>'bigint', :primary_key=>true, :allow_null=>true, :auto_increment=>true}]]}
|
125
|
+
@d.dump_table_schema(:t6, :same_db=>true).must_equal "create_table(:t6) do\n primary_key :c1, :type=>:Bignum\nend"
|
126
|
+
end
|
127
|
+
|
113
128
|
it "should dump auto incrementing primary keys with :keep_order option if they are not first" do
|
114
129
|
@d.dump_table_schema(:t3).must_equal "create_table(:t3) do\n String :c2, :size=>20\n primary_key :c1, :keep_order=>true\nend"
|
115
130
|
end
|
@@ -206,6 +221,19 @@ describe "Sequel::Database dump methods" do
|
|
206
221
|
@d.dump_table_schema(:t1).must_equal "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1], :name=>:i1\n index [:c2, :c1], :unique=>true\nend"
|
207
222
|
end
|
208
223
|
|
224
|
+
it "should support dumping the whole database as a migration with a :schema option" do
|
225
|
+
@d.dump_schema_migration(:schema=>'t__t1').must_equal <<-END_MIG
|
226
|
+
Sequel.migration do
|
227
|
+
change do
|
228
|
+
create_table("t__t1") do
|
229
|
+
primary_key :c1
|
230
|
+
String :c2
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
END_MIG
|
235
|
+
end
|
236
|
+
|
209
237
|
it "should support dumping the whole database as a migration" do
|
210
238
|
@d.dump_schema_migration.must_equal <<-END_MIG
|
211
239
|
Sequel.migration do
|
@@ -249,7 +277,7 @@ END_MIG
|
|
249
277
|
|
250
278
|
it "should sort table names topologically when dumping a migration with foreign keys" do
|
251
279
|
@d.meta_def(:tables){|o| [:t1, :t2]}
|
252
|
-
@d.meta_def(:schema) do |t|
|
280
|
+
@d.meta_def(:schema) do |t, *o|
|
253
281
|
t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer', :primary_key=>true, :auto_increment=>true}]]
|
254
282
|
end
|
255
283
|
@d.meta_def(:supports_foreign_key_parsing?){true}
|
@@ -273,7 +301,7 @@ END_MIG
|
|
273
301
|
|
274
302
|
it "should handle circular dependencies when dumping a migration with foreign keys" do
|
275
303
|
@d.meta_def(:tables){|o| [:t1, :t2]}
|
276
|
-
@d.meta_def(:schema) do |t|
|
304
|
+
@d.meta_def(:schema) do |t, *o|
|
277
305
|
t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer'}]]
|
278
306
|
end
|
279
307
|
@d.meta_def(:supports_foreign_key_parsing?){true}
|
@@ -301,7 +329,7 @@ END_MIG
|
|
301
329
|
|
302
330
|
it "should sort topologically even if the database raises an error when trying to parse foreign keys for a non-existent table" do
|
303
331
|
@d.meta_def(:tables){|o| [:t1, :t2]}
|
304
|
-
@d.meta_def(:schema) do |t|
|
332
|
+
@d.meta_def(:schema) do |t, *o|
|
305
333
|
t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer', :primary_key=>true, :auto_increment=>true}]]
|
306
334
|
end
|
307
335
|
@d.meta_def(:supports_foreign_key_parsing?){true}
|
@@ -582,7 +610,7 @@ END_MIG
|
|
582
610
|
|
583
611
|
it "should support dumping just foreign_keys as a migration" do
|
584
612
|
@d.meta_def(:tables){|o| [:t1, :t2, :t3]}
|
585
|
-
@d.meta_def(:schema) do |t|
|
613
|
+
@d.meta_def(:schema) do |t, *o|
|
586
614
|
t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer'}]]
|
587
615
|
end
|
588
616
|
@d.meta_def(:supports_foreign_key_parsing?){true}
|
@@ -3,7 +3,9 @@ require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
3
3
|
describe Sequel::Model, "set_schema" do
|
4
4
|
before do
|
5
5
|
@model = Class.new(Sequel::Model(:items))
|
6
|
-
|
6
|
+
deprecated do
|
7
|
+
@model.plugin :schema
|
8
|
+
end
|
7
9
|
end
|
8
10
|
|
9
11
|
it "sets schema with implicit table name" do
|
@@ -26,11 +28,13 @@ end
|
|
26
28
|
describe Sequel::Model, "create_table and schema" do
|
27
29
|
before do
|
28
30
|
@model = Class.new(Sequel::Model)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
deprecated do
|
32
|
+
@model.class_eval do
|
33
|
+
plugin :schema
|
34
|
+
set_schema(:items) do
|
35
|
+
text :name
|
36
|
+
float :price, :null => false
|
37
|
+
end
|
34
38
|
end
|
35
39
|
end
|
36
40
|
DB.reset
|
@@ -76,7 +80,9 @@ end
|
|
76
80
|
describe Sequel::Model, "schema methods" do
|
77
81
|
before do
|
78
82
|
@model = Class.new(Sequel::Model(:items))
|
79
|
-
|
83
|
+
deprecated do
|
84
|
+
@model.plugin :schema
|
85
|
+
end
|
80
86
|
DB.reset
|
81
87
|
end
|
82
88
|
|
@@ -59,7 +59,7 @@ end
|
|
59
59
|
# SEQUEL5: Remove
|
60
60
|
unless Sequel.mock.dataset.frozen?
|
61
61
|
describe "Dataset#db=" do
|
62
|
-
|
62
|
+
deprecated "should change the dataset's database" do
|
63
63
|
db = Sequel.mock
|
64
64
|
ds = db[:items].extension(:sequel_3_dataset_methods)
|
65
65
|
db2 = Sequel.mock
|
@@ -68,14 +68,14 @@ unless Sequel.mock.dataset.frozen?
|
|
68
68
|
ds.db.wont_equal db
|
69
69
|
end
|
70
70
|
|
71
|
-
|
71
|
+
deprecated "should raise error for frozen datasets" do
|
72
72
|
ds = Sequel.mock.dataset.extension(:sequel_3_dataset_methods).freeze
|
73
73
|
proc{ds.db = ds.db}.must_raise RuntimeError
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
77
|
describe "Dataset#opts=" do
|
78
|
-
|
78
|
+
deprecated "should change the dataset's opts" do
|
79
79
|
db = Sequel.mock
|
80
80
|
ds = db[:items].extension(:sequel_3_dataset_methods)
|
81
81
|
ds.sql.must_equal 'SELECT * FROM items'
|
@@ -84,7 +84,7 @@ unless Sequel.mock.dataset.frozen?
|
|
84
84
|
ds.opts.must_equal({})
|
85
85
|
end
|
86
86
|
|
87
|
-
|
87
|
+
deprecated "should raise error for frozen datasets" do
|
88
88
|
ds = Sequel.mock.dataset.extension(:sequel_3_dataset_methods).freeze
|
89
89
|
proc{ds.opts = {}}.must_raise RuntimeError
|
90
90
|
end
|
@@ -12,6 +12,13 @@ describe "Serialization plugin" do
|
|
12
12
|
DB.reset
|
13
13
|
end
|
14
14
|
|
15
|
+
deprecated "should allow access to serialization_module" do
|
16
|
+
@c.plugin :serialization, :yaml, :abc
|
17
|
+
@c.serialization_module.must_be_kind_of Module
|
18
|
+
@c.serialization_module = v = Module.new
|
19
|
+
@c.serialization_module.must_equal v
|
20
|
+
end
|
21
|
+
|
15
22
|
it "should allow setting additional serializable attributes via plugin :serialization call" do
|
16
23
|
@c.plugin :serialization, :yaml, :abc
|
17
24
|
@c.create(:abc => 1, :def=> 2)
|
@@ -366,6 +373,5 @@ describe "Serialization plugin" do
|
|
366
373
|
@c.freeze
|
367
374
|
@c.serialization_map.frozen?.must_equal true
|
368
375
|
@c.deserialization_map.frozen?.must_equal true
|
369
|
-
@c.serialization_module.frozen?.must_equal true
|
370
376
|
end
|
371
377
|
end
|
@@ -27,7 +27,7 @@ describe "Sequel::Dataset #set_defaults" do
|
|
27
27
|
|
28
28
|
# SEQUEL5: Remove
|
29
29
|
unless Sequel.mock.dataset.frozen?
|
30
|
-
|
30
|
+
deprecated "should have working mutation method" do
|
31
31
|
@ds = Sequel.mock.dataset.from(:items).extension(:set_overrides)
|
32
32
|
@ds.set_defaults!(:x=>1)
|
33
33
|
@ds.insert_sql.must_equal "INSERT INTO items (x) VALUES (1)"
|
@@ -58,7 +58,7 @@ describe "Sequel::Dataset #set_overrides" do
|
|
58
58
|
|
59
59
|
# SEQUEL5: Remove
|
60
60
|
unless Sequel.mock.dataset.frozen?
|
61
|
-
|
61
|
+
deprecated "should have working mutation method" do
|
62
62
|
@ds = Sequel.mock.dataset.from(:items).extension(:set_overrides)
|
63
63
|
@ds.set_overrides!(:x=>1)
|
64
64
|
@ds.insert_sql.must_equal "INSERT INTO items (x) VALUES (1)"
|
@@ -93,26 +93,30 @@ describe "Shared caching behavior" do
|
|
93
93
|
end
|
94
94
|
|
95
95
|
it "should not use a simple primary key lookup if the prepared_statements_associations method is being used" do
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
96
|
+
deprecated do
|
97
|
+
c2 = Class.new(Sequel::Model(@db[:not_caching_model].with_fetch(:id=>1)))
|
98
|
+
c = Class.new(Sequel::Model(@db[:lookup_model]))
|
99
|
+
c.class_eval do
|
100
|
+
plugin :prepared_statements_associations
|
101
|
+
columns :id, :caching_model_id
|
102
|
+
many_to_one :caching_model, :class=>c2
|
103
|
+
end
|
104
|
+
c.load(:id=>3, :caching_model_id=>1).caching_model.must_equal c2.load(:id=>1)
|
105
|
+
@db.sqls.wont_equal []
|
102
106
|
end
|
103
|
-
c.load(:id=>3, :caching_model_id=>1).caching_model.must_equal c2.load(:id=>1)
|
104
|
-
@db.sqls.wont_equal []
|
105
107
|
end
|
106
108
|
|
107
109
|
it "should use a simple primary key lookup if the prepared_statements_associations method is being used but associated model also uses caching" do
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
110
|
+
deprecated do
|
111
|
+
c = Class.new(Sequel::Model(:lookup_model))
|
112
|
+
c.class_eval do
|
113
|
+
plugin :prepared_statements_associations
|
114
|
+
columns :id, :caching_model_id
|
115
|
+
many_to_one :caching_model
|
116
|
+
end
|
117
|
+
c.load(:id=>3, :caching_model_id=>1).caching_model.must_be_same_as(@cm1)
|
118
|
+
@db.sqls.must_equal []
|
113
119
|
end
|
114
|
-
c.load(:id=>3, :caching_model_id=>1).caching_model.must_be_same_as(@cm1)
|
115
|
-
@db.sqls.must_equal []
|
116
120
|
end
|
117
121
|
end
|
118
122
|
|
@@ -15,8 +15,8 @@ unless Object.const_defined?('Sequel') && Sequel.const_defined?('Model')
|
|
15
15
|
$:.unshift(File.join(File.dirname(File.expand_path(__FILE__)), "../../lib/"))
|
16
16
|
require 'sequel'
|
17
17
|
end
|
18
|
-
|
19
|
-
|
18
|
+
|
19
|
+
require "#{File.dirname(File.dirname(__FILE__))}/deprecation_helper.rb"
|
20
20
|
|
21
21
|
begin
|
22
22
|
# Attempt to load ActiveSupport blank extension and inflector first, so Sequel
|
@@ -35,9 +35,13 @@ def skip_warn(s)
|
|
35
35
|
warn "Skipping test of #{s}" if ENV["SKIPPED_TEST_WARN"]
|
36
36
|
end
|
37
37
|
|
38
|
+
# SEQUEL5: Remove
|
39
|
+
output = Sequel::Deprecation.output
|
40
|
+
Sequel::Deprecation.output = nil
|
38
41
|
Sequel.quote_identifiers = false
|
39
42
|
Sequel.identifier_input_method = nil
|
40
43
|
Sequel.identifier_output_method = nil
|
44
|
+
Sequel::Deprecation.output = output
|
41
45
|
|
42
46
|
class << Sequel::Model
|
43
47
|
attr_writer :db_schema
|
@@ -54,7 +58,7 @@ class << Sequel::Model
|
|
54
58
|
end
|
55
59
|
|
56
60
|
Sequel::Model.use_transactions = false
|
57
|
-
Sequel.cache_anonymous_models = false
|
61
|
+
Sequel::Model.cache_anonymous_models = false
|
58
62
|
|
59
63
|
db = Sequel.mock(:fetch=>{:id => 1, :x => 1}, :numrows=>1, :autoid=>proc{|sql| 10})
|
60
64
|
def db.schema(*) [[:id, {:primary_key=>true}]] end
|
@@ -1,22 +1,57 @@
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
2
2
|
|
3
3
|
describe "Sequel::Plugins::SplitValues" do
|
4
|
+
before do
|
5
|
+
@c = Class.new(Sequel::Model(:a))
|
6
|
+
@c.columns :id, :x
|
7
|
+
@c.plugin :split_values
|
8
|
+
end
|
9
|
+
|
4
10
|
it "stores non-columns in a separate hash" do
|
5
|
-
c =
|
6
|
-
c.
|
7
|
-
c.
|
8
|
-
|
9
|
-
o
|
10
|
-
c.db.reset
|
11
|
-
|
12
|
-
o.must_equal c.load(:id=>1, :x=>2)
|
11
|
+
@c.dataset = @c.dataset.with_fetch(:id=>1, :x=>2, :y=>3)
|
12
|
+
o = @c.first
|
13
|
+
@c.db.reset
|
14
|
+
|
15
|
+
o.must_equal @c.load(:id=>1, :x=>2)
|
13
16
|
o[:id].must_equal 1
|
14
17
|
o[:x].must_equal 2
|
15
18
|
o[:y].must_equal 3
|
16
|
-
{c.load(:id=>1, :x=>2)=>4}[o].must_equal 4
|
19
|
+
{@c.load(:id=>1, :x=>2)=>4}[o].must_equal 4
|
17
20
|
o.values.must_equal(:id=>1, :x=>2)
|
18
21
|
|
19
22
|
o.save
|
20
|
-
c.db.sqls.must_equal ["UPDATE a SET x = 2 WHERE (id = 1)"]
|
23
|
+
@c.db.sqls.must_equal ["UPDATE a SET x = 2 WHERE (id = 1)"]
|
24
|
+
end
|
25
|
+
|
26
|
+
it "handles false values" do
|
27
|
+
@c.dataset = @c.dataset.with_fetch(:id=>1, :x=>false, :y=>3)
|
28
|
+
o = @c.first
|
29
|
+
@c.db.reset
|
30
|
+
|
31
|
+
o.must_equal @c.load(:id=>1, :x=>false)
|
32
|
+
o[:id].must_equal 1
|
33
|
+
o[:x].must_equal false
|
34
|
+
o[:y].must_equal 3
|
35
|
+
{@c.load(:id=>1, :x=>false)=>4}[o].must_equal 4
|
36
|
+
o.values.must_equal(:id=>1, :x=>false)
|
37
|
+
|
38
|
+
o.save
|
39
|
+
@c.db.sqls.must_equal ["UPDATE a SET x = 'f' WHERE (id = 1)"]
|
40
|
+
end
|
41
|
+
|
42
|
+
it "handles nil values" do
|
43
|
+
@c.dataset = @c.dataset.with_fetch(:id=>1, :x=>nil, :y=>3)
|
44
|
+
o = @c.first
|
45
|
+
@c.db.reset
|
46
|
+
|
47
|
+
o.must_equal @c.load(:id=>1, :x=>nil)
|
48
|
+
o[:id].must_equal 1
|
49
|
+
o[:x].must_be_nil
|
50
|
+
o[:y].must_equal 3
|
51
|
+
{@c.load(:id=>1, :x=>nil)=>4}[o].must_equal 4
|
52
|
+
o.values.must_equal(:id=>1, :x=>nil)
|
53
|
+
|
54
|
+
o.save
|
55
|
+
@c.db.sqls.must_equal ["UPDATE a SET x = NULL WHERE (id = 1)"]
|
21
56
|
end
|
22
57
|
end
|
@@ -45,8 +45,8 @@ describe "string_agg extension" do
|
|
45
45
|
ds.literal(@sa4).must_equal "list(DISTINCT c, ',' ORDER BY o)"
|
46
46
|
end
|
47
47
|
|
48
|
-
it "should correctly literalize on MySQL, H2, HSQLDB
|
49
|
-
[:mysql, :h2, :hsqldb
|
48
|
+
it "should correctly literalize on MySQL, H2, HSQLDB" do
|
49
|
+
[:mysql, :h2, :hsqldb].each do |type|
|
50
50
|
db = dbf.call(type)
|
51
51
|
db.meta_def(:database_type){type}
|
52
52
|
ds = db.dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
|
@@ -13,7 +13,7 @@ describe "subset_conditions plugin" do
|
|
13
13
|
@c.subset(:active, :active)
|
14
14
|
@c.where(@c.active_conditions).sql.must_equal @c.active.sql
|
15
15
|
|
16
|
-
@c.subset(:active_published, :active, :published => true)
|
16
|
+
@c.subset(:active_published, Sequel.&(:active, :published => true))
|
17
17
|
@c.where(@c.active_published_conditions).sql.must_equal @c.active_published.sql
|
18
18
|
@c.where(Sequel.&(@c.active_conditions, @c.published_conditions)).sql.must_equal @c.active_published.sql
|
19
19
|
@c.where(Sequel.|(@c.active_conditions, @c.published_conditions)).sql.must_equal "SELECT * FROM a WHERE (active OR (published IS TRUE))"
|
@@ -25,8 +25,8 @@ describe "subset_conditions plugin" do
|
|
25
25
|
@c.subset(:published, &p1)
|
26
26
|
@c.where(@c.published_conditions).sql.must_equal @c.published.sql
|
27
27
|
|
28
|
-
p2 =
|
29
|
-
@c.subset(:active,
|
28
|
+
p2 = :active
|
29
|
+
@c.subset(:active, p2)
|
30
30
|
@c.where(@c.active_conditions).sql.must_equal @c.active.sql
|
31
31
|
|
32
32
|
@c.subset(:active_published, p2, &p1)
|