sequel 4.41.0 → 4.42.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +98 -0
- data/README.rdoc +23 -10
- data/doc/active_record.rdoc +4 -4
- data/doc/advanced_associations.rdoc +2 -2
- data/doc/association_basics.rdoc +5 -2
- data/doc/cheat_sheet.rdoc +3 -3
- data/doc/core_extensions.rdoc +2 -2
- data/doc/dataset_basics.rdoc +4 -4
- data/doc/dataset_filtering.rdoc +1 -1
- data/doc/migration.rdoc +19 -1
- data/doc/prepared_statements.rdoc +2 -2
- data/doc/release_notes/4.42.0.txt +221 -0
- data/doc/testing.rdoc +3 -1
- data/lib/sequel/adapters/ado/access.rb +0 -1
- data/lib/sequel/adapters/ado/mssql.rb +0 -1
- data/lib/sequel/adapters/do/mysql.rb +0 -1
- data/lib/sequel/adapters/do/postgres.rb +0 -1
- data/lib/sequel/adapters/do/sqlite3.rb +0 -1
- data/lib/sequel/adapters/ibmdb.rb +21 -25
- data/lib/sequel/adapters/jdbc.rb +8 -16
- data/lib/sequel/adapters/jdbc/as400.rb +0 -1
- data/lib/sequel/adapters/jdbc/cubrid.rb +0 -1
- data/lib/sequel/adapters/jdbc/db2.rb +0 -1
- data/lib/sequel/adapters/jdbc/derby.rb +0 -1
- data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -1
- data/lib/sequel/adapters/jdbc/h2.rb +0 -1
- data/lib/sequel/adapters/jdbc/hsqldb.rb +0 -1
- data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -1
- data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -1
- data/lib/sequel/adapters/jdbc/jtds.rb +0 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +0 -1
- data/lib/sequel/adapters/jdbc/mysql.rb +0 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +0 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +0 -13
- data/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -1
- data/lib/sequel/adapters/jdbc/sqlite.rb +0 -1
- data/lib/sequel/adapters/jdbc/sqlserver.rb +3 -4
- data/lib/sequel/adapters/mock.rb +54 -12
- data/lib/sequel/adapters/mysql.rb +1 -1
- data/lib/sequel/adapters/mysql2.rb +11 -17
- data/lib/sequel/adapters/odbc/mssql.rb +0 -1
- data/lib/sequel/adapters/oracle.rb +8 -20
- data/lib/sequel/adapters/postgres.rb +11 -29
- data/lib/sequel/adapters/shared/access.rb +5 -12
- data/lib/sequel/adapters/shared/cubrid.rb +4 -13
- data/lib/sequel/adapters/shared/db2.rb +4 -2
- data/lib/sequel/adapters/shared/firebird.rb +2 -4
- data/lib/sequel/adapters/shared/informix.rb +4 -2
- data/lib/sequel/adapters/shared/mssql.rb +3 -5
- data/lib/sequel/adapters/shared/mysql.rb +4 -14
- data/lib/sequel/adapters/shared/oracle.rb +1 -3
- data/lib/sequel/adapters/shared/postgres.rb +16 -38
- data/lib/sequel/adapters/shared/progress.rb +0 -2
- data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -2
- data/lib/sequel/adapters/shared/sqlite.rb +20 -16
- data/lib/sequel/adapters/sqlite.rb +8 -20
- data/lib/sequel/adapters/swift/mysql.rb +0 -1
- data/lib/sequel/adapters/swift/postgres.rb +0 -1
- data/lib/sequel/adapters/swift/sqlite.rb +0 -1
- data/lib/sequel/adapters/tinytds.rb +4 -12
- data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
- data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -2
- data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +11 -34
- data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
- data/lib/sequel/adapters/utils/unmodified_identifiers.rb +26 -0
- data/lib/sequel/ast_transformer.rb +2 -2
- data/lib/sequel/database/dataset.rb +1 -1
- data/lib/sequel/database/dataset_defaults.rb +0 -66
- data/lib/sequel/database/features.rb +6 -0
- data/lib/sequel/database/misc.rb +31 -17
- data/lib/sequel/database/query.rb +7 -4
- data/lib/sequel/database/schema_methods.rb +1 -1
- data/lib/sequel/dataset.rb +8 -8
- data/lib/sequel/dataset/actions.rb +140 -46
- data/lib/sequel/dataset/features.rb +1 -5
- data/lib/sequel/dataset/graph.rb +7 -8
- data/lib/sequel/dataset/misc.rb +127 -56
- data/lib/sequel/dataset/mutation.rb +9 -20
- data/lib/sequel/dataset/placeholder_literalizer.rb +10 -1
- data/lib/sequel/dataset/prepared_statements.rb +102 -46
- data/lib/sequel/dataset/query.rb +155 -72
- data/lib/sequel/dataset/sql.rb +26 -9
- data/lib/sequel/extensions/columns_introspection.rb +3 -1
- data/lib/sequel/extensions/core_extensions.rb +5 -5
- data/lib/sequel/extensions/core_refinements.rb +5 -5
- data/lib/sequel/extensions/duplicate_columns_handler.rb +4 -2
- data/lib/sequel/extensions/freeze_datasets.rb +69 -0
- data/lib/sequel/extensions/identifier_mangling.rb +196 -0
- data/lib/sequel/extensions/looser_typecasting.rb +11 -7
- data/lib/sequel/extensions/migration.rb +1 -1
- data/lib/sequel/extensions/null_dataset.rb +5 -2
- data/lib/sequel/extensions/pagination.rb +42 -23
- data/lib/sequel/extensions/pg_enum.rb +3 -3
- data/lib/sequel/extensions/query.rb +3 -3
- data/lib/sequel/extensions/sequel_3_dataset_methods.rb +15 -8
- data/lib/sequel/model/associations.rb +25 -8
- data/lib/sequel/model/base.rb +88 -29
- data/lib/sequel/model/dataset_module.rb +37 -0
- data/lib/sequel/plugins/association_pks.rb +4 -4
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/constraint_validations.rb +1 -2
- data/lib/sequel/plugins/csv_serializer.rb +2 -2
- data/lib/sequel/plugins/dataset_associations.rb +8 -8
- data/lib/sequel/plugins/eager_each.rb +2 -2
- data/lib/sequel/plugins/instance_filters.rb +1 -1
- data/lib/sequel/plugins/json_serializer.rb +2 -2
- data/lib/sequel/plugins/lazy_attributes.rb +1 -1
- data/lib/sequel/plugins/list.rb +4 -4
- data/lib/sequel/plugins/prepared_statements.rb +2 -4
- data/lib/sequel/plugins/prepared_statements_associations.rb +1 -3
- data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
- data/lib/sequel/plugins/rcte_tree.rb +13 -13
- data/lib/sequel/plugins/sharding.rb +1 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +9 -4
- data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
- data/lib/sequel/plugins/validation_class_methods.rb +1 -1
- data/lib/sequel/plugins/validation_helpers.rb +1 -1
- data/lib/sequel/plugins/xml_serializer.rb +2 -2
- data/lib/sequel/sql.rb +69 -36
- data/lib/sequel/version.rb +1 -1
- data/spec/adapters/db2_spec.rb +10 -0
- data/spec/adapters/firebird_spec.rb +1 -1
- data/spec/adapters/mssql_spec.rb +4 -5
- data/spec/adapters/mysql_spec.rb +9 -9
- data/spec/adapters/postgres_spec.rb +67 -68
- data/spec/adapters/spec_helper.rb +6 -1
- data/spec/adapters/sqlite_spec.rb +29 -15
- data/spec/core/connection_pool_spec.rb +14 -14
- data/spec/core/database_spec.rb +38 -180
- data/spec/core/dataset_mutation_spec.rb +253 -0
- data/spec/core/dataset_spec.rb +394 -537
- data/spec/core/expression_filters_spec.rb +34 -32
- data/spec/core/mock_adapter_spec.rb +27 -35
- data/spec/core/placeholder_literalizer_spec.rb +2 -4
- data/spec/core/schema_generator_spec.rb +4 -4
- data/spec/core/schema_spec.rb +1 -2
- data/spec/core_extensions_spec.rb +22 -29
- data/spec/extensions/active_model_spec.rb +6 -6
- data/spec/extensions/association_dependencies_spec.rb +2 -2
- data/spec/extensions/blacklist_security_spec.rb +3 -3
- data/spec/extensions/boolean_readers_spec.rb +12 -12
- data/spec/extensions/caching_spec.rb +13 -10
- data/spec/extensions/class_table_inheritance_spec.rb +38 -43
- data/spec/extensions/column_conflicts_spec.rb +1 -3
- data/spec/extensions/columns_introspection_spec.rb +2 -3
- data/spec/extensions/composition_spec.rb +5 -3
- data/spec/extensions/constraint_validations_plugin_spec.rb +5 -5
- data/spec/extensions/constraint_validations_spec.rb +14 -8
- data/spec/extensions/core_refinements_spec.rb +22 -29
- data/spec/extensions/csv_serializer_spec.rb +7 -6
- data/spec/extensions/date_arithmetic_spec.rb +15 -15
- data/spec/extensions/defaults_setter_spec.rb +2 -2
- data/spec/extensions/delay_add_association_spec.rb +1 -1
- data/spec/extensions/dirty_spec.rb +19 -10
- data/spec/extensions/duplicate_columns_handler_spec.rb +12 -18
- data/spec/extensions/eager_each_spec.rb +12 -16
- data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
- data/spec/extensions/eval_inspect_spec.rb +4 -3
- data/spec/extensions/force_encoding_spec.rb +12 -12
- data/spec/extensions/freeze_datasets_spec.rb +31 -0
- data/spec/extensions/graph_each_spec.rb +6 -18
- data/spec/extensions/hook_class_methods_spec.rb +7 -7
- data/spec/extensions/identifier_mangling_spec.rb +307 -0
- data/spec/extensions/instance_filters_spec.rb +5 -6
- data/spec/extensions/instance_hooks_spec.rb +12 -12
- data/spec/extensions/json_serializer_spec.rb +12 -15
- data/spec/extensions/lazy_attributes_spec.rb +4 -4
- data/spec/extensions/list_spec.rb +19 -21
- data/spec/extensions/many_through_many_spec.rb +108 -163
- data/spec/extensions/meta_def_spec.rb +7 -2
- data/spec/extensions/migration_spec.rb +10 -12
- data/spec/extensions/mssql_optimistic_locking_spec.rb +4 -3
- data/spec/extensions/named_timezones_spec.rb +4 -3
- data/spec/extensions/nested_attributes_spec.rb +2 -2
- data/spec/extensions/null_dataset_spec.rb +17 -12
- data/spec/extensions/optimistic_locking_spec.rb +4 -5
- data/spec/extensions/pagination_spec.rb +8 -10
- data/spec/extensions/pg_array_associations_spec.rb +28 -27
- data/spec/extensions/pg_array_ops_spec.rb +2 -1
- data/spec/extensions/pg_array_spec.rb +6 -2
- data/spec/extensions/pg_enum_spec.rb +5 -3
- data/spec/extensions/pg_hstore_ops_spec.rb +3 -1
- data/spec/extensions/pg_hstore_spec.rb +7 -6
- data/spec/extensions/pg_inet_ops_spec.rb +2 -1
- data/spec/extensions/pg_inet_spec.rb +2 -1
- data/spec/extensions/pg_interval_spec.rb +2 -1
- data/spec/extensions/pg_json_ops_spec.rb +2 -1
- data/spec/extensions/pg_json_spec.rb +6 -3
- data/spec/extensions/pg_loose_count_spec.rb +1 -0
- data/spec/extensions/pg_range_ops_spec.rb +3 -1
- data/spec/extensions/pg_range_spec.rb +9 -5
- data/spec/extensions/pg_row_ops_spec.rb +2 -1
- data/spec/extensions/pg_row_plugin_spec.rb +4 -6
- data/spec/extensions/pg_row_spec.rb +5 -3
- data/spec/extensions/pg_static_cache_updater_spec.rb +2 -1
- data/spec/extensions/pg_typecast_on_load_spec.rb +1 -1
- data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
- data/spec/extensions/prepared_statements_spec.rb +12 -11
- data/spec/extensions/pretty_table_spec.rb +1 -1
- data/spec/extensions/query_spec.rb +8 -5
- data/spec/extensions/rcte_tree_spec.rb +39 -39
- data/spec/extensions/round_timestamps_spec.rb +2 -2
- data/spec/extensions/schema_dumper_spec.rb +3 -2
- data/spec/extensions/schema_spec.rb +2 -2
- data/spec/extensions/scissors_spec.rb +1 -2
- data/spec/extensions/sequel_3_dataset_methods_spec.rb +30 -17
- data/spec/extensions/serialization_modification_detection_spec.rb +2 -2
- data/spec/extensions/serialization_spec.rb +15 -13
- data/spec/extensions/set_overrides_spec.rb +14 -8
- data/spec/extensions/sharding_spec.rb +9 -18
- data/spec/extensions/shared_caching_spec.rb +3 -4
- data/spec/extensions/single_table_inheritance_spec.rb +11 -11
- data/spec/extensions/skip_create_refresh_spec.rb +2 -1
- data/spec/extensions/spec_helper.rb +1 -1
- data/spec/extensions/split_values_spec.rb +2 -2
- data/spec/extensions/sql_comments_spec.rb +6 -0
- data/spec/extensions/static_cache_spec.rb +7 -9
- data/spec/extensions/string_agg_spec.rb +30 -29
- data/spec/extensions/tactical_eager_loading_spec.rb +4 -5
- data/spec/extensions/thread_local_timezones_spec.rb +2 -2
- data/spec/extensions/timestamps_spec.rb +28 -3
- data/spec/extensions/to_dot_spec.rb +1 -2
- data/spec/extensions/tree_spec.rb +33 -29
- data/spec/extensions/typecast_on_load_spec.rb +1 -1
- data/spec/extensions/unlimited_update_spec.rb +1 -0
- data/spec/extensions/update_primary_key_spec.rb +11 -7
- data/spec/extensions/update_refresh_spec.rb +1 -1
- data/spec/extensions/uuid_spec.rb +0 -1
- data/spec/extensions/validate_associated_spec.rb +1 -1
- data/spec/extensions/validation_class_methods_spec.rb +10 -10
- data/spec/extensions/validation_helpers_spec.rb +10 -10
- data/spec/extensions/xml_serializer_spec.rb +7 -3
- data/spec/integration/associations_test.rb +31 -31
- data/spec/integration/dataset_test.rb +17 -19
- data/spec/integration/eager_loader_test.rb +24 -24
- data/spec/integration/model_test.rb +6 -6
- data/spec/integration/plugin_test.rb +43 -43
- data/spec/integration/prepared_statement_test.rb +6 -6
- data/spec/integration/schema_test.rb +63 -52
- data/spec/integration/spec_helper.rb +6 -1
- data/spec/integration/transaction_test.rb +13 -13
- data/spec/model/association_reflection_spec.rb +17 -17
- data/spec/model/associations_spec.rb +101 -96
- data/spec/model/base_spec.rb +175 -49
- data/spec/model/class_dataset_methods_spec.rb +5 -9
- data/spec/model/dataset_methods_spec.rb +5 -5
- data/spec/model/eager_loading_spec.rb +209 -235
- data/spec/model/hooks_spec.rb +15 -15
- data/spec/model/model_spec.rb +28 -21
- data/spec/model/plugins_spec.rb +4 -5
- data/spec/model/record_spec.rb +59 -57
- data/spec/model/spec_helper.rb +1 -1
- data/spec/model/validations_spec.rb +6 -6
- data/spec/spec_config.rb +1 -1
- metadata +10 -2
@@ -33,25 +33,25 @@ describe "ActiveModel plugin" do
|
|
33
33
|
end
|
34
34
|
|
35
35
|
it "#to_key should return a key array, or nil" do
|
36
|
-
@o.to_key.
|
36
|
+
@o.to_key.must_be_nil
|
37
37
|
@o.id = 1
|
38
38
|
@o.to_key.must_equal [1]
|
39
39
|
@o.id = nil
|
40
|
-
@o.to_key.
|
40
|
+
@o.to_key.must_be_nil
|
41
41
|
|
42
42
|
@c.set_primary_key [:id2, :id]
|
43
|
-
@o.to_key.
|
43
|
+
@o.to_key.must_be_nil
|
44
44
|
@o.id = 1
|
45
45
|
@o.id2 = 2
|
46
46
|
@o.to_key.must_equal [2, 1]
|
47
47
|
@o.destroy
|
48
48
|
@o.to_key.must_equal [2, 1]
|
49
49
|
@o.id = nil
|
50
|
-
@o.to_key.
|
50
|
+
@o.to_key.must_be_nil
|
51
51
|
end
|
52
52
|
|
53
53
|
it "#to_param should return a param string or nil" do
|
54
|
-
@o.to_param.
|
54
|
+
@o.to_param.must_be_nil
|
55
55
|
@o.id = 1
|
56
56
|
@o.to_param.must_equal '1'
|
57
57
|
@c.set_primary_key [:id2, :id]
|
@@ -60,7 +60,7 @@ describe "ActiveModel plugin" do
|
|
60
60
|
@o.meta_def(:to_param_joiner){'|'}
|
61
61
|
@o.to_param.must_equal '2|1'
|
62
62
|
@o.destroy
|
63
|
-
@o.to_param.
|
63
|
+
@o.to_param.must_be_nil
|
64
64
|
end
|
65
65
|
|
66
66
|
it "#persisted? should return true if the object exists and has not been destroyed" do
|
@@ -6,9 +6,9 @@ describe "AssociationDependencies plugin" do
|
|
6
6
|
@c = Class.new(Sequel::Model)
|
7
7
|
@c.plugin :association_dependencies
|
8
8
|
@Artist = Class.new(@c).set_dataset(:artists)
|
9
|
-
@Artist.dataset
|
9
|
+
@Artist.dataset = @Artist.dataset.with_fetch(:id=>2, :name=>'Ar')
|
10
10
|
@Album = Class.new(@c).set_dataset(:albums)
|
11
|
-
@Album.dataset
|
11
|
+
@Album.dataset = @Album.dataset.with_fetch(:id=>1, :name=>'Al', :artist_id=>2)
|
12
12
|
@Artist.columns :id, :name
|
13
13
|
@Album.columns :id, :name, :artist_id
|
14
14
|
@Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
|
@@ -50,7 +50,7 @@ describe Sequel::Model, ".restricted_columns " do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
it "should set the restricted columns correctly" do
|
53
|
-
@c.restricted_columns.
|
53
|
+
@c.restricted_columns.must_be_nil
|
54
54
|
@c.set_restricted_columns :x
|
55
55
|
@c.restricted_columns.must_equal [:x]
|
56
56
|
@c.set_restricted_columns :x, :y
|
@@ -64,7 +64,7 @@ describe Sequel::Model, ".restricted_columns " do
|
|
64
64
|
i.set(:x => 4, :y => 5, :z => 6)
|
65
65
|
i.values.must_equal(:x => 4, :y => 5)
|
66
66
|
|
67
|
-
@c.
|
67
|
+
@c.dataset = @c.dataset.with_fetch(:x => 7)
|
68
68
|
i = @c.new
|
69
69
|
i.update(:x => 7, :z => 9)
|
70
70
|
i.values.must_equal(:x => 7)
|
@@ -79,7 +79,7 @@ describe Sequel::Model, ".restricted_columns " do
|
|
79
79
|
i.set(:x => 4, :y => 5, :z => 6)
|
80
80
|
i.values.must_equal(:x => 4, :y => 5)
|
81
81
|
|
82
|
-
@c.
|
82
|
+
@c.dataset = @c.dataset.with_fetch(:y => 7)
|
83
83
|
i = @c.new
|
84
84
|
i.update(:y => 7, :z => 9)
|
85
85
|
i.values.must_equal(:y => 7)
|
@@ -19,13 +19,13 @@ describe Sequel::Model, "BooleanReaders plugin" do
|
|
19
19
|
it "should create attribute? readers for all boolean attributes" do
|
20
20
|
@c.plugin(:boolean_readers)
|
21
21
|
o = @c.new
|
22
|
-
o.b?.
|
22
|
+
o.b?.must_be_nil
|
23
23
|
o.b = '1'
|
24
24
|
o.b?.must_equal true
|
25
25
|
o.b = '0'
|
26
26
|
o.b?.must_equal false
|
27
27
|
o.b = ''
|
28
|
-
o.b?.
|
28
|
+
o.b?.must_be_nil
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should not create attribute? readers for non-boolean attributes" do
|
@@ -38,8 +38,8 @@ describe Sequel::Model, "BooleanReaders plugin" do
|
|
38
38
|
@c.plugin(:boolean_readers){|c| db_schema[c][:db_type] == 'tinyint(1)'}
|
39
39
|
proc{@c.new.b?}.must_raise(NoMethodError)
|
40
40
|
o = @c.new
|
41
|
-
o.z.
|
42
|
-
o.z?.
|
41
|
+
o.z.must_be_nil
|
42
|
+
o.z?.must_be_nil
|
43
43
|
o.z = '1'
|
44
44
|
o.z.must_equal 1
|
45
45
|
o.z?.must_equal true
|
@@ -47,8 +47,8 @@ describe Sequel::Model, "BooleanReaders plugin" do
|
|
47
47
|
o.z.must_equal 0
|
48
48
|
o.z?.must_equal false
|
49
49
|
o.z = ''
|
50
|
-
o.z.
|
51
|
-
o.z?.
|
50
|
+
o.z.must_be_nil
|
51
|
+
o.z?.must_be_nil
|
52
52
|
end
|
53
53
|
|
54
54
|
it "should create boolean readers when set_dataset is defined" do
|
@@ -57,13 +57,13 @@ describe Sequel::Model, "BooleanReaders plugin" do
|
|
57
57
|
c.plugin(:boolean_readers)
|
58
58
|
c.set_dataset(@db[:a])
|
59
59
|
o = c.new
|
60
|
-
o.b?.
|
60
|
+
o.b?.must_be_nil
|
61
61
|
o.b = '1'
|
62
62
|
o.b?.must_equal true
|
63
63
|
o.b = '0'
|
64
64
|
o.b?.must_equal false
|
65
65
|
o.b = ''
|
66
|
-
o.b?.
|
66
|
+
o.b?.must_be_nil
|
67
67
|
proc{o.i?}.must_raise(NoMethodError)
|
68
68
|
|
69
69
|
c = Class.new(Sequel::Model(@db))
|
@@ -71,8 +71,8 @@ describe Sequel::Model, "BooleanReaders plugin" do
|
|
71
71
|
c.plugin(:boolean_readers){|x| db_schema[x][:db_type] == 'tinyint(1)'}
|
72
72
|
c.set_dataset(@db[:a])
|
73
73
|
o = c.new
|
74
|
-
o.z.
|
75
|
-
o.z?.
|
74
|
+
o.z.must_be_nil
|
75
|
+
o.z?.must_be_nil
|
76
76
|
o.z = '1'
|
77
77
|
o.z.must_equal 1
|
78
78
|
o.z?.must_equal true
|
@@ -80,8 +80,8 @@ describe Sequel::Model, "BooleanReaders plugin" do
|
|
80
80
|
o.z.must_equal 0
|
81
81
|
o.z?.must_equal false
|
82
82
|
o.z = ''
|
83
|
-
o.z.
|
84
|
-
o.z?.
|
83
|
+
o.z.must_be_nil
|
84
|
+
o.z?.must_be_nil
|
85
85
|
proc{o.b?}.must_raise(NoMethodError)
|
86
86
|
end
|
87
87
|
|
@@ -43,13 +43,15 @@ describe Sequel::Model, "caching" do
|
|
43
43
|
columns :name, :id
|
44
44
|
end
|
45
45
|
|
46
|
-
@dataset = @c.dataset = @c3.dataset = @c4.dataset
|
47
|
-
@dataset._fetch = {:name => 'sharon'.dup, :id => 1}
|
48
|
-
@dataset.numrows = 1
|
49
46
|
|
50
47
|
@c2 = Class.new(@c) do
|
51
48
|
def self.name; 'SubItem' end
|
52
49
|
end
|
50
|
+
|
51
|
+
[@c, @c2, @c3, @c4].each do |c|
|
52
|
+
c.dataset = c.dataset.with_fetch(:name => 'sharon'.dup, :id => 1).with_numrows(1)
|
53
|
+
end
|
54
|
+
|
53
55
|
@c.db.reset
|
54
56
|
end
|
55
57
|
|
@@ -164,7 +166,7 @@ describe Sequel::Model, "caching" do
|
|
164
166
|
end
|
165
167
|
|
166
168
|
it "should handle lookups by nil primary keys" do
|
167
|
-
@c[nil].
|
169
|
+
@c[nil].must_be_nil
|
168
170
|
@c.db.sqls.must_equal []
|
169
171
|
end
|
170
172
|
|
@@ -200,7 +202,7 @@ describe Sequel::Model, "caching" do
|
|
200
202
|
|
201
203
|
it "should support #[] as a shortcut to #find with hash" do
|
202
204
|
m = @c[:id => 3]
|
203
|
-
@cache[m.cache_key].
|
205
|
+
@cache[m.cache_key].must_be_nil
|
204
206
|
@c.db.sqls.must_equal ["SELECT * FROM items WHERE (id = 3) LIMIT 1"]
|
205
207
|
m = @c[1]
|
206
208
|
@cache[m.cache_key].must_equal m
|
@@ -209,7 +211,7 @@ describe Sequel::Model, "caching" do
|
|
209
211
|
@c.db.sqls.must_equal ["SELECT * FROM items WHERE (id = 4) LIMIT 1"]
|
210
212
|
|
211
213
|
m = @c2[:id => 3]
|
212
|
-
@cache[m.cache_key].
|
214
|
+
@cache[m.cache_key].must_be_nil
|
213
215
|
@c.db.sqls.must_equal ["SELECT * FROM items WHERE (id = 3) LIMIT 1"]
|
214
216
|
m = @c2[1]
|
215
217
|
@cache[m.cache_key].must_equal m
|
@@ -232,13 +234,14 @@ describe Sequel::Model, "caching" do
|
|
232
234
|
|
233
235
|
it "should rescue an exception if cache_store is memcached and ignore_exception is enabled" do
|
234
236
|
@c4[1].values.must_equal(:name => 'sharon', :id => 1)
|
237
|
+
@c4.dataset = @c4.dataset.with_fetch(:name => 'sharon', :id => 1, :x=>1)
|
235
238
|
m = @c4.new.save
|
236
239
|
m.update({:name=>'blah'})
|
237
240
|
m.values.must_equal(:name => 'blah', :id => 1, :x => 1)
|
238
241
|
end
|
239
242
|
|
240
243
|
it "should support Model.cache_get_pk for getting a value from the cache by primary key" do
|
241
|
-
@c.cache_get_pk(1).
|
244
|
+
@c.cache_get_pk(1).must_be_nil
|
242
245
|
m = @c[1]
|
243
246
|
@c.cache_get_pk(1).must_equal m
|
244
247
|
end
|
@@ -246,8 +249,8 @@ describe Sequel::Model, "caching" do
|
|
246
249
|
it "should support Model.cache_delete_pk for removing a value from the cache by primary key" do
|
247
250
|
@c[1]
|
248
251
|
@c.cache_get_pk(1).wont_equal nil
|
249
|
-
@c.cache_delete_pk(1).
|
250
|
-
@c.cache_get_pk(1).
|
252
|
+
@c.cache_delete_pk(1).must_be_nil
|
253
|
+
@c.cache_get_pk(1).must_be_nil
|
251
254
|
end
|
252
255
|
|
253
256
|
it "should support overriding the cache key prefix" do
|
@@ -258,7 +261,7 @@ describe Sequel::Model, "caching" do
|
|
258
261
|
c2.cache_key(:id).must_equal c3.cache_key(:id)
|
259
262
|
|
260
263
|
@c[1]
|
261
|
-
c2.cache_get_pk(1).
|
264
|
+
c2.cache_get_pk(1).must_be_nil
|
262
265
|
m = c2[1]
|
263
266
|
c2.cache_get_pk(1).values.must_equal @c[1].values
|
264
267
|
c3.cache_get_pk(1).values.must_equal m.values
|
@@ -71,15 +71,15 @@ describe "class_table_inheritance plugin" do
|
|
71
71
|
end
|
72
72
|
|
73
73
|
it "should have simple_table = nil for all subclasses" do
|
74
|
-
Manager.simple_table.
|
75
|
-
Executive.simple_table.
|
76
|
-
Ceo.simple_table.
|
77
|
-
Staff.simple_table.
|
74
|
+
Manager.simple_table.must_be_nil
|
75
|
+
Executive.simple_table.must_be_nil
|
76
|
+
Ceo.simple_table.must_be_nil
|
77
|
+
Staff.simple_table.must_be_nil
|
78
78
|
end
|
79
79
|
|
80
80
|
it "should have working row_proc if using set_dataset in subclass to remove columns" do
|
81
81
|
Manager.set_dataset(Manager.dataset.select(*(Manager.columns - [:blah])))
|
82
|
-
Manager.dataset
|
82
|
+
Manager.dataset = Manager.dataset.with_fetch(:id=>1, :kind=>'Ceo')
|
83
83
|
Manager[1].must_equal Ceo.load(:id=>1, :kind=>'Ceo')
|
84
84
|
end
|
85
85
|
|
@@ -92,18 +92,16 @@ describe "class_table_inheritance plugin" do
|
|
92
92
|
end
|
93
93
|
|
94
94
|
it "should return rows with the correct class based on the polymorphic_key value" do
|
95
|
-
@ds.
|
96
|
-
Employee.all.collect{|x| x.class}.must_equal [Employee, Manager, Executive, Ceo, Staff]
|
95
|
+
@ds.with_fetch([{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Staff'}]).all.collect{|x| x.class}.must_equal [Employee, Manager, Executive, Ceo, Staff]
|
97
96
|
end
|
98
97
|
|
99
98
|
it "should return rows with the correct class based on the polymorphic_key value for subclasses" do
|
100
|
-
Manager.dataset.
|
101
|
-
Manager.all.collect{|x| x.class}.must_equal [Manager, Executive, Ceo]
|
99
|
+
Manager.dataset.with_fetch([{:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}]).all.collect{|x| x.class}.must_equal [Manager, Executive, Ceo]
|
102
100
|
end
|
103
101
|
|
104
102
|
it "should have refresh return all columns in subclass after loading from superclass" do
|
105
|
-
Employee.dataset
|
106
|
-
Ceo.
|
103
|
+
Employee.dataset = Employee.dataset.with_fetch([{:id=>1, :name=>'A', :kind=>'Ceo'}])
|
104
|
+
Ceo.dataset = Ceo.dataset.with_fetch([{:id=>1, :name=>'A', :kind=>'Ceo', :num_staff=>3, :num_managers=>2}])
|
107
105
|
a = Employee.first
|
108
106
|
a.class.must_equal Ceo
|
109
107
|
a.values.must_equal(:id=>1, :name=>'A', :kind=>'Ceo')
|
@@ -114,8 +112,7 @@ describe "class_table_inheritance plugin" do
|
|
114
112
|
|
115
113
|
it "should return rows with the current class if cti_key is nil" do
|
116
114
|
Employee.plugin(:class_table_inheritance)
|
117
|
-
Employee.dataset.
|
118
|
-
Employee.all.collect{|x| x.class}.must_equal [Employee, Employee, Employee, Employee, Employee]
|
115
|
+
Employee.dataset.with_fetch([{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Staff'}]).all.map{|x| x.class}.must_equal [Employee, Employee, Employee, Employee, Employee]
|
119
116
|
end
|
120
117
|
|
121
118
|
it "should return rows with the current class if cti_key is nil in subclasses" do
|
@@ -124,8 +121,7 @@ describe "class_table_inheritance plugin" do
|
|
124
121
|
Object.send(:remove_const, :Manager)
|
125
122
|
class ::Manager < Employee; end
|
126
123
|
class ::Executive < Manager; end
|
127
|
-
Manager.dataset.
|
128
|
-
Manager.all.collect{|x| x.class}.must_equal [Manager, Manager]
|
124
|
+
Manager.dataset.with_fetch([{:kind=>'Manager'}, {:kind=>'Executive'}]).all.map{|x| x.class}.must_equal [Manager, Manager]
|
129
125
|
end
|
130
126
|
|
131
127
|
it "should handle a model map with integer values" do
|
@@ -136,20 +132,18 @@ describe "class_table_inheritance plugin" do
|
|
136
132
|
class ::Manager < Employee; end
|
137
133
|
class ::Executive < Manager; end
|
138
134
|
class ::Ceo < Executive; end
|
139
|
-
Employee.dataset
|
135
|
+
Employee.dataset = Employee.dataset.with_fetch([{:kind=>nil},{:kind=>0},{:kind=>1}, {:kind=>2}, {:kind=>3}])
|
140
136
|
Employee.all.collect{|x| x.class}.must_equal [Employee, Employee, Manager, Executive, Ceo]
|
141
|
-
Manager.dataset
|
137
|
+
Manager.dataset = Manager.dataset.with_fetch([{:kind=>nil},{:kind=>0},{:kind=>1}, {:kind=>2}, {:kind=>3}])
|
142
138
|
Manager.all.collect{|x| x.class}.must_equal [Manager, Employee, Manager, Executive, Ceo]
|
143
139
|
end
|
144
140
|
|
145
141
|
it "should fallback to the main class if the given class does not exist" do
|
146
|
-
@ds.
|
147
|
-
Employee.all.collect{|x| x.class}.must_equal [Employee, Manager, Employee, Staff]
|
142
|
+
@ds.with_fetch([{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Blah'}, {:kind=>'Staff'}]).all.map{|x| x.class}.must_equal [Employee, Manager, Employee, Staff]
|
148
143
|
end
|
149
144
|
|
150
145
|
it "should fallback to the main class if the given class does not exist in subclasses" do
|
151
|
-
Manager.dataset.
|
152
|
-
Manager.all.collect{|x| x.class}.must_equal [Manager, Executive, Ceo, Manager]
|
146
|
+
Manager.dataset.with_fetch([{:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Blah'}]).all.map{|x| x.class}.must_equal [Manager, Executive, Ceo, Manager]
|
153
147
|
end
|
154
148
|
|
155
149
|
it "should sets the model class name for the key when creating new parent class records" do
|
@@ -194,7 +188,7 @@ describe "class_table_inheritance plugin" do
|
|
194
188
|
end
|
195
189
|
|
196
190
|
it "should lazily load attributes for columns in subclass tables" do
|
197
|
-
Manager.
|
191
|
+
Manager.dataset = Manager.dataset.with_fetch(:id=>1, :name=>'J', :kind=>'Ceo', :num_staff=>2)
|
198
192
|
m = Manager[1]
|
199
193
|
@db.sqls.must_equal ['SELECT employees.id, employees.name, employees.kind, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id = 1) LIMIT 1']
|
200
194
|
@db.fetch = {:num_managers=>3}
|
@@ -205,8 +199,8 @@ describe "class_table_inheritance plugin" do
|
|
205
199
|
end
|
206
200
|
|
207
201
|
it "should lazily load columns in middle classes correctly when loaded from parent class" do
|
208
|
-
Employee.dataset
|
209
|
-
|
202
|
+
Employee.dataset = Employee.dataset.with_fetch(:id=>1, :kind=>'Ceo')
|
203
|
+
@db.fetch = [[:num_staff=>2]]
|
210
204
|
e = Employee[1]
|
211
205
|
e.must_be_kind_of(Ceo)
|
212
206
|
@db.sqls.must_equal ["SELECT * FROM employees WHERE (id = 1) LIMIT 1"]
|
@@ -215,9 +209,8 @@ describe "class_table_inheritance plugin" do
|
|
215
209
|
end
|
216
210
|
|
217
211
|
it "should eagerly load lazily columns in subclasses when loaded from parent class" do
|
218
|
-
Employee.dataset
|
219
|
-
|
220
|
-
@db.fetch = {:id=>1, :num_managers=>3}
|
212
|
+
Employee.dataset = Employee.dataset.with_fetch(:id=>1, :kind=>'Ceo')
|
213
|
+
@db.fetch = [[{:id=>1, :num_staff=>2}], [{:id=>1, :num_managers=>3}]]
|
221
214
|
e = Employee.all.first
|
222
215
|
e.must_be_kind_of(Ceo)
|
223
216
|
@db.sqls.must_equal ["SELECT * FROM employees"]
|
@@ -267,13 +260,15 @@ describe "class_table_inheritance plugin" do
|
|
267
260
|
sqls[2].must_match(/INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([13], [13]\)/)
|
268
261
|
end
|
269
262
|
|
270
|
-
it "should insert the correct rows into all tables when inserting when
|
271
|
-
[
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
263
|
+
it "should insert the correct rows into all tables when inserting when insert_select is supported" do
|
264
|
+
[Executive, Manager, Employee].each do |klass|
|
265
|
+
klass.instance_variable_set(:@cti_instance_dataset, klass.cti_instance_dataset.with_extend do
|
266
|
+
def supports_insert_select?; true; end
|
267
|
+
def insert_select(v)
|
268
|
+
db.run(insert_sql(v) + " RETURNING *")
|
269
|
+
v.merge(:id=>1)
|
270
|
+
end
|
271
|
+
end)
|
277
272
|
end
|
278
273
|
Ceo.create(:num_managers=>3, :num_staff=>2, :name=>'E')
|
279
274
|
sqls = @db.sqls
|
@@ -300,13 +295,13 @@ describe "class_table_inheritance plugin" do
|
|
300
295
|
end
|
301
296
|
|
302
297
|
it "should handle many_to_one relationships correctly" do
|
303
|
-
Manager.dataset
|
298
|
+
Manager.dataset = Manager.dataset.with_fetch(:id=>3, :name=>'E', :kind=>'Ceo', :num_managers=>3)
|
304
299
|
Staff.load(:manager_id=>3).manager.must_equal Ceo.load(:id=>3, :name=>'E', :kind=>'Ceo', :num_managers=>3)
|
305
300
|
@db.sqls.must_equal ['SELECT employees.id, employees.name, employees.kind, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id = 3) LIMIT 1']
|
306
301
|
end
|
307
302
|
|
308
303
|
it "should handle one_to_many relationships correctly" do
|
309
|
-
Staff.dataset
|
304
|
+
Staff.dataset = Staff.dataset.with_fetch(:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3)
|
310
305
|
Ceo.load(:id=>3).staff_members.must_equal [Staff.load(:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3)]
|
311
306
|
@db.sqls.must_equal ['SELECT employees.id, employees.name, employees.kind, staff.manager_id FROM employees INNER JOIN staff ON (staff.id = employees.id) WHERE (staff.manager_id = 3)']
|
312
307
|
end
|
@@ -361,14 +356,14 @@ describe "class_table_inheritance plugin without sti_key" do
|
|
361
356
|
end
|
362
357
|
|
363
358
|
it "should have simple_table = nil for all subclasses" do
|
364
|
-
Manager.simple_table.
|
365
|
-
Executive.simple_table.
|
366
|
-
Staff.simple_table.
|
359
|
+
Manager.simple_table.must_be_nil
|
360
|
+
Executive.simple_table.must_be_nil
|
361
|
+
Staff.simple_table.must_be_nil
|
367
362
|
end
|
368
363
|
|
369
364
|
it "should have working row_proc if using set_dataset in subclass to remove columns" do
|
370
365
|
Manager.set_dataset(Manager.dataset.select(*(Manager.columns - [:blah])))
|
371
|
-
Manager.dataset
|
366
|
+
Manager.dataset = Manager.dataset.with_fetch(:id=>1)
|
372
367
|
Manager[1].must_equal Manager.load(:id=>1)
|
373
368
|
end
|
374
369
|
|
@@ -381,7 +376,7 @@ describe "class_table_inheritance plugin without sti_key" do
|
|
381
376
|
|
382
377
|
it "should return rows with the current class if cti_key is nil" do
|
383
378
|
Employee.plugin(:class_table_inheritance)
|
384
|
-
Employee.dataset
|
379
|
+
Employee.dataset = Employee.dataset.with_fetch([{}])
|
385
380
|
Employee.first.class.must_equal Employee
|
386
381
|
end
|
387
382
|
|
@@ -442,13 +437,13 @@ describe "class_table_inheritance plugin without sti_key" do
|
|
442
437
|
end
|
443
438
|
|
444
439
|
it "should handle many_to_one relationships correctly" do
|
445
|
-
Manager.dataset
|
440
|
+
Manager.dataset = Manager.dataset.with_fetch(:id=>3, :name=>'E', :num_staff=>3)
|
446
441
|
Staff.load(:manager_id=>3).manager.must_equal Manager.load(:id=>3, :name=>'E', :num_staff=>3)
|
447
442
|
@db.sqls.must_equal ['SELECT employees.id, employees.name, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id = 3) LIMIT 1']
|
448
443
|
end
|
449
444
|
|
450
445
|
it "should handle one_to_many relationships correctly" do
|
451
|
-
Staff.dataset
|
446
|
+
Staff.dataset = Staff.dataset.with_fetch(:id=>1, :name=>'S', :manager_id=>3)
|
452
447
|
Executive.load(:id=>3).staff_members.must_equal [Staff.load(:id=>1, :name=>'S', :manager_id=>3)]
|
453
448
|
@db.sqls.must_equal ['SELECT employees.id, employees.name, staff.manager_id FROM employees INNER JOIN staff ON (staff.id = employees.id) WHERE (staff.manager_id = 3)']
|
454
449
|
end
|
@@ -50,9 +50,7 @@ describe "column_conflicts plugin" do
|
|
50
50
|
end
|
51
51
|
|
52
52
|
it "should work correctly for dataset changes" do
|
53
|
-
|
54
|
-
def ds.columns; [:object_id] end
|
55
|
-
@c.dataset = ds
|
53
|
+
@c.dataset = @db[:test].with_extend{def columns; [:object_id] end}
|
56
54
|
o = @c.load(:object_id=>3)
|
57
55
|
o.get_column_value(:object_id).must_equal 3
|
58
56
|
o.object_id.wont_equal 3
|
@@ -10,7 +10,7 @@ describe "columns_introspection extension" do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
it "should not issue a database query if the columns are already loaded" do
|
13
|
-
@ds.
|
13
|
+
@ds.send(:columns=, [:x])
|
14
14
|
@ds.columns.must_equal [:x]
|
15
15
|
@db.sqls.length.must_equal 0
|
16
16
|
end
|
@@ -74,8 +74,7 @@ describe "columns_introspection extension" do
|
|
74
74
|
|
75
75
|
it "should issue a database query when common table expressions are used" do
|
76
76
|
@db.instance_variable_set(:@schemas, "a"=>[[:x, {}]])
|
77
|
-
|
78
|
-
@ds.with(:a, @ds).columns
|
77
|
+
@ds.with_extend{def supports_cte?(*) true end}.with(:a, @ds).columns
|
79
78
|
@db.sqls.length.must_equal 1
|
80
79
|
end
|
81
80
|
|