sequel 4.41.0 → 4.42.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 +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
|
|