sequel 4.44.0 → 4.45.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.
- 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)
|