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
data/spec/model/hooks_spec.rb
CHANGED
@@ -37,14 +37,14 @@ describe "Model#before_create && Model#after_create" do
|
|
37
37
|
it ".create should cancel the save and return nil if before_create returns false and raise_on_save_failure is false" do
|
38
38
|
@c.send(:define_method, :before_create){false}
|
39
39
|
@c.raise_on_save_failure = false
|
40
|
-
@c.create(:x => 2).
|
40
|
+
@c.create(:x => 2).must_be_nil
|
41
41
|
DB.sqls.must_equal []
|
42
42
|
end
|
43
43
|
|
44
44
|
it ".create should cancel the save and return nil if before_create calls cancel_action and raise_on_save_failure is false" do
|
45
45
|
@c.send(:define_method, :before_create){cancel_action}
|
46
46
|
@c.raise_on_save_failure = false
|
47
|
-
@c.create(:x => 2).
|
47
|
+
@c.create(:x => 2).must_be_nil
|
48
48
|
DB.sqls.must_equal []
|
49
49
|
end
|
50
50
|
end
|
@@ -89,14 +89,14 @@ describe "Model#before_update && Model#after_update" do
|
|
89
89
|
it "#save should cancel the save and return nil if before_update returns false and raise_on_save_failure is false" do
|
90
90
|
@c.send(:define_method, :before_update){false}
|
91
91
|
@c.raise_on_save_failure = false
|
92
|
-
@c.load(:id => 2233).save.
|
92
|
+
@c.load(:id => 2233).save.must_be_nil
|
93
93
|
DB.sqls.must_equal []
|
94
94
|
end
|
95
95
|
|
96
96
|
it "#save should cancel the save and return nil if before_update calls cancel_action and raise_on_save_failure is false" do
|
97
97
|
@c.send(:define_method, :before_update){cancel_action}
|
98
98
|
@c.raise_on_save_failure = false
|
99
|
-
@c.load(:id => 2233).save.
|
99
|
+
@c.load(:id => 2233).save.must_be_nil
|
100
100
|
DB.sqls.must_equal []
|
101
101
|
end
|
102
102
|
end
|
@@ -150,14 +150,14 @@ describe "Model#before_save && Model#after_save" do
|
|
150
150
|
it "#save should cancel the save and return nil if before_save returns false and raise_on_save_failure is false" do
|
151
151
|
@c.send(:define_method, :before_save){false}
|
152
152
|
@c.raise_on_save_failure = false
|
153
|
-
@c.load(:id => 2233).save.
|
153
|
+
@c.load(:id => 2233).save.must_be_nil
|
154
154
|
DB.sqls.must_equal []
|
155
155
|
end
|
156
156
|
|
157
157
|
it "#save should cancel the save and return nil if before_save calls cancel_action and raise_on_save_failure is false" do
|
158
158
|
@c.send(:define_method, :before_save){cancel_action}
|
159
159
|
@c.raise_on_save_failure = false
|
160
|
-
@c.load(:id => 2233).save.
|
160
|
+
@c.load(:id => 2233).save.must_be_nil
|
161
161
|
DB.sqls.must_equal []
|
162
162
|
end
|
163
163
|
|
@@ -207,14 +207,14 @@ describe "Model#before_destroy && Model#after_destroy" do
|
|
207
207
|
it "#destroy should cancel the destroy and return nil if before_destroy returns false and raise_on_save_failure is false" do
|
208
208
|
@c.send(:define_method, :before_destroy){false}
|
209
209
|
@c.raise_on_save_failure = false
|
210
|
-
@c.load(:id => 2233).destroy.
|
210
|
+
@c.load(:id => 2233).destroy.must_be_nil
|
211
211
|
DB.sqls.must_equal []
|
212
212
|
end
|
213
213
|
|
214
214
|
it "#destroy should cancel the destroy and return nil if before_destroy calls cancel_action and raise_on_save_failure is false" do
|
215
215
|
@c.send(:define_method, :before_destroy){cancel_action; true}
|
216
216
|
@c.raise_on_save_failure = false
|
217
|
-
@c.load(:id => 2233).destroy.
|
217
|
+
@c.load(:id => 2233).destroy.must_be_nil
|
218
218
|
DB.sqls.must_equal []
|
219
219
|
end
|
220
220
|
end
|
@@ -253,7 +253,7 @@ describe "Model#before_validation && Model#after_validation" do
|
|
253
253
|
|
254
254
|
m = @c.load(:id => 22)
|
255
255
|
m.raise_on_save_failure = false
|
256
|
-
m.save.
|
256
|
+
m.save.must_be_nil
|
257
257
|
DB.sqls.must_equal ['BLAH before', 'BLAH after']
|
258
258
|
end
|
259
259
|
|
@@ -279,14 +279,14 @@ describe "Model#before_validation && Model#after_validation" do
|
|
279
279
|
it "#save should cancel the save and return nil if before_validation returns false and raise_on_save_failure is false" do
|
280
280
|
@c.send(:define_method, :before_validation){false}
|
281
281
|
@c.raise_on_save_failure = false
|
282
|
-
@c.load(:id => 2233).save.
|
282
|
+
@c.load(:id => 2233).save.must_be_nil
|
283
283
|
DB.sqls.must_equal []
|
284
284
|
end
|
285
285
|
|
286
286
|
it "#save should cancel the save and return nil if before_validation calls cancel_action and raise_on_save_failure is false" do
|
287
287
|
@c.send(:define_method, :before_validation){cancel_action}
|
288
288
|
@c.raise_on_save_failure = false
|
289
|
-
@c.load(:id => 2233).save.
|
289
|
+
@c.load(:id => 2233).save.must_be_nil
|
290
290
|
DB.sqls.must_equal []
|
291
291
|
end
|
292
292
|
|
@@ -431,19 +431,19 @@ describe "Model around filters" do
|
|
431
431
|
|
432
432
|
o = @c.load(:id => 1)
|
433
433
|
def o.around_save() end
|
434
|
-
o.save.
|
434
|
+
o.save.must_be_nil
|
435
435
|
|
436
436
|
o = @c.load(:id => 1)
|
437
437
|
def o.around_update() end
|
438
|
-
o.save.
|
438
|
+
o.save.must_be_nil
|
439
439
|
|
440
440
|
o = @c.new
|
441
441
|
def o.around_create() end
|
442
|
-
o.save.
|
442
|
+
o.save.must_be_nil
|
443
443
|
|
444
444
|
o = @c.new
|
445
445
|
def o.around_validation() end
|
446
|
-
o.save.
|
446
|
+
o.save.must_be_nil
|
447
447
|
end
|
448
448
|
end
|
449
449
|
|
data/spec/model/model_spec.rb
CHANGED
@@ -9,7 +9,7 @@ describe "Sequel::Model()" do
|
|
9
9
|
ds = @db[:blah]
|
10
10
|
c = Sequel::Model(ds)
|
11
11
|
c.superclass.must_equal Sequel::Model
|
12
|
-
c.dataset.must_equal
|
12
|
+
c.dataset.row_proc.must_equal c
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should return a model subclass with a dataset with the default database and given table name if given a Symbol" do
|
@@ -51,14 +51,14 @@ describe "Sequel::Model()" do
|
|
51
51
|
ds = @db[Sequel.identifier(:blah)]
|
52
52
|
c = Sequel::Model(ds)
|
53
53
|
c.superclass.must_equal Sequel::Model
|
54
|
-
c.dataset.must_equal
|
54
|
+
c.dataset.row_proc.must_equal c
|
55
55
|
end
|
56
56
|
|
57
57
|
it "should be callable on Sequel::Model" do
|
58
58
|
ds = @db[:blah]
|
59
59
|
c = Sequel::Model::Model(ds)
|
60
60
|
c.superclass.must_equal Sequel::Model
|
61
|
-
c.dataset.must_equal
|
61
|
+
c.dataset.row_proc.must_equal c
|
62
62
|
end
|
63
63
|
|
64
64
|
it "should be callable on subclasses of Sequel::Model" do
|
@@ -66,7 +66,7 @@ describe "Sequel::Model()" do
|
|
66
66
|
c = Class.new(Sequel::Model)
|
67
67
|
sc = c::Model(ds)
|
68
68
|
sc.superclass.must_equal c
|
69
|
-
sc.dataset.must_equal
|
69
|
+
sc.dataset.row_proc.must_equal sc
|
70
70
|
end
|
71
71
|
|
72
72
|
it "should be callable on other modules if def_Model is used" do
|
@@ -75,7 +75,7 @@ describe "Sequel::Model()" do
|
|
75
75
|
ds = @db[:blah]
|
76
76
|
c = m::Model(ds)
|
77
77
|
c.superclass.must_equal Sequel::Model
|
78
|
-
c.dataset.must_equal
|
78
|
+
c.dataset.row_proc.must_equal c
|
79
79
|
end
|
80
80
|
|
81
81
|
it "should be callable using model subclasses on other modules if def_Model is used" do
|
@@ -85,7 +85,7 @@ describe "Sequel::Model()" do
|
|
85
85
|
ds = @db[:blah]
|
86
86
|
sc = m::Model(ds)
|
87
87
|
sc.superclass.must_equal c
|
88
|
-
sc.dataset.must_equal
|
88
|
+
sc.dataset.row_proc.must_equal sc
|
89
89
|
end
|
90
90
|
|
91
91
|
it "should return a model subclass associated to the given database if given a database" do
|
@@ -227,6 +227,12 @@ describe Sequel::Model do
|
|
227
227
|
@model.table_name.must_equal :foo
|
228
228
|
end
|
229
229
|
|
230
|
+
it "allows frozen dataset" do
|
231
|
+
@model.set_dataset(DB[:foo].freeze)
|
232
|
+
@model.table_name.must_equal :foo
|
233
|
+
@model.dataset.sql.must_equal 'SELECT * FROM foo'
|
234
|
+
end
|
235
|
+
|
230
236
|
it "allows set_dataset to accept a Symbol" do
|
231
237
|
@model.db = DB
|
232
238
|
@model.set_dataset(:foo)
|
@@ -269,11 +275,10 @@ describe Sequel::Model do
|
|
269
275
|
it "set_dataset should add the destroy method to the dataset that destroys each object" do
|
270
276
|
ds = DB[:foo]
|
271
277
|
ds.wont_respond_to(:destroy)
|
272
|
-
@model.set_dataset(ds)
|
278
|
+
ds = @model.set_dataset(ds).dataset
|
273
279
|
ds.must_respond_to(:destroy)
|
274
280
|
DB.sqls
|
275
|
-
ds.
|
276
|
-
ds.destroy.must_equal 2
|
281
|
+
ds.with_fetch([{:id=>1}, {:id=>2}]).destroy.must_equal 2
|
277
282
|
DB.sqls.must_equal ["SELECT * FROM foo", "DELETE FROM foo WHERE id = 1", "DELETE FROM foo WHERE id = 2"]
|
278
283
|
end
|
279
284
|
|
@@ -281,7 +286,7 @@ describe Sequel::Model do
|
|
281
286
|
db = Sequel.mock(:servers=>{:s1=>{}})
|
282
287
|
ds = db[:foo].server(:s1)
|
283
288
|
@model.use_transactions = true
|
284
|
-
@model.set_dataset(ds)
|
289
|
+
ds = @model.set_dataset(ds).dataset
|
285
290
|
db.sqls
|
286
291
|
ds.destroy.must_equal 0
|
287
292
|
db.sqls.must_equal ["BEGIN -- s1", "SELECT * FROM foo -- s1", "COMMIT -- s1"]
|
@@ -462,8 +467,7 @@ describe Sequel::Model, "new" do
|
|
462
467
|
end
|
463
468
|
|
464
469
|
it "should use the last inserted id as primary key if not in values" do
|
465
|
-
@m.
|
466
|
-
@m.instance_dataset.autoid = @m.dataset.autoid = 1234
|
470
|
+
@m.dataset = @m.dataset.with_fetch(:x => 1, :id => 1234).with_autoid(1234)
|
467
471
|
|
468
472
|
o = @m.new(:x => 1)
|
469
473
|
o.save
|
@@ -508,7 +512,7 @@ end
|
|
508
512
|
describe Sequel::Model, ".find" do
|
509
513
|
before do
|
510
514
|
@c = Class.new(Sequel::Model(:items))
|
511
|
-
@c.dataset
|
515
|
+
@c.dataset = @c.dataset.with_fetch(:name => 'sharon', :id => 1)
|
512
516
|
DB.reset
|
513
517
|
end
|
514
518
|
|
@@ -874,7 +878,7 @@ describe Sequel::Model, "attribute accessors" do
|
|
874
878
|
o.methods.collect{|z| z.to_s}.must_include(x)
|
875
879
|
end
|
876
880
|
|
877
|
-
o.x.
|
881
|
+
o.x.must_be_nil
|
878
882
|
o.x = 34
|
879
883
|
o.x.must_equal 34
|
880
884
|
end
|
@@ -912,7 +916,7 @@ end
|
|
912
916
|
describe Sequel::Model, ".[]" do
|
913
917
|
before do
|
914
918
|
@c = Class.new(Sequel::Model(:items))
|
915
|
-
@c.dataset
|
919
|
+
@c.dataset = @c.dataset.with_fetch(:name => 'sharon', :id => 1)
|
916
920
|
DB.reset
|
917
921
|
end
|
918
922
|
|
@@ -924,8 +928,8 @@ describe Sequel::Model, ".[]" do
|
|
924
928
|
end
|
925
929
|
|
926
930
|
it "should have #[] return nil if no rows match" do
|
927
|
-
@c.dataset
|
928
|
-
@c[1].
|
931
|
+
@c.dataset = @c.dataset.with_fetch([])
|
932
|
+
@c[1].must_be_nil
|
929
933
|
DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
|
930
934
|
end
|
931
935
|
|
@@ -971,12 +975,15 @@ describe "Model.db_schema" do
|
|
971
975
|
def @db.schema(table, opts = {})
|
972
976
|
raise Sequel::Error
|
973
977
|
end
|
974
|
-
@dataset.
|
978
|
+
@dataset = @dataset.with_extend do
|
979
|
+
def columns
|
980
|
+
[:x, :y]
|
981
|
+
end
|
982
|
+
end
|
975
983
|
|
976
984
|
@c.dataset = @dataset
|
977
985
|
@c.db_schema.must_equal(:x=>{}, :y=>{})
|
978
986
|
@c.columns.must_equal [:x, :y]
|
979
|
-
@c.dataset.instance_variable_get(:@columns).must_equal [:x, :y]
|
980
987
|
end
|
981
988
|
|
982
989
|
it "should use the database's schema and set the columns and dataset columns" do
|
@@ -986,7 +993,7 @@ describe "Model.db_schema" do
|
|
986
993
|
@c.dataset = @dataset
|
987
994
|
@c.db_schema.must_equal(:x=>{:type=>:integer}, :y=>{:type=>:string})
|
988
995
|
@c.columns.must_equal [:x, :y]
|
989
|
-
@c.dataset.
|
996
|
+
@c.dataset.columns.must_equal [:x, :y]
|
990
997
|
end
|
991
998
|
|
992
999
|
it "should not restrict the schema for datasets with a :select option" do
|
@@ -1052,7 +1059,7 @@ describe "Model.db_schema" do
|
|
1052
1059
|
@c.primary_key.must_equal :id
|
1053
1060
|
@c.dataset = ds
|
1054
1061
|
@c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{:primary_key=>false})
|
1055
|
-
@c.primary_key.
|
1062
|
+
@c.primary_key.must_be_nil
|
1056
1063
|
end
|
1057
1064
|
|
1058
1065
|
it "should automatically set primary key for dataset selecting table.*" do
|
data/spec/model/plugins_spec.rb
CHANGED
@@ -284,16 +284,15 @@ describe Sequel::Plugins do
|
|
284
284
|
m = Module.new do
|
285
285
|
module self::ClassMethods
|
286
286
|
Sequel::Plugins.after_set_dataset(self, :one)
|
287
|
+
def foo; dataset.send(:cache_get, :foo) end
|
287
288
|
private
|
288
|
-
def one
|
289
|
-
dataset.opts[:foo] = 1
|
290
|
-
end
|
289
|
+
def one; dataset.send(:cache_set, :foo, 1) end
|
291
290
|
end
|
292
291
|
end
|
293
292
|
@c.plugin m
|
294
|
-
@c.
|
293
|
+
@c.foo.must_be_nil
|
295
294
|
@c.set_dataset :blah
|
296
|
-
@c.
|
295
|
+
@c.foo.must_equal 1
|
297
296
|
end
|
298
297
|
end
|
299
298
|
|
data/spec/model/record_spec.rb
CHANGED
@@ -57,7 +57,7 @@ describe "Model#save" do
|
|
57
57
|
@c = Class.new(Sequel::Model(:items)) do
|
58
58
|
columns :id, :x, :y
|
59
59
|
end
|
60
|
-
@c.
|
60
|
+
@c.dataset = @c.dataset.with_autoid(13)
|
61
61
|
DB.reset
|
62
62
|
end
|
63
63
|
|
@@ -69,16 +69,16 @@ describe "Model#save" do
|
|
69
69
|
|
70
70
|
it "should raise if the object can't be refreshed after save" do
|
71
71
|
o = @c.new(:x => 1)
|
72
|
-
@c.
|
72
|
+
@c.dataset = @c.dataset.with_fetch([])
|
73
73
|
proc{o.save}.must_raise(Sequel::NoExistingObject)
|
74
74
|
end
|
75
75
|
|
76
76
|
it "should use dataset's insert_select method if present" do
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
77
|
+
@c.dataset = @c.dataset.with_fetch(:y=>2).with_extend do
|
78
|
+
def supports_insert_select?; true end
|
79
|
+
def insert_select(hash)
|
80
|
+
with_sql_first("INSERT INTO items (y) VALUES (2) RETURNING *")
|
81
|
+
end
|
82
82
|
end
|
83
83
|
o = @c.new(:x => 1)
|
84
84
|
o.save
|
@@ -88,21 +88,19 @@ describe "Model#save" do
|
|
88
88
|
end
|
89
89
|
|
90
90
|
it "should not use dataset's insert_select method if specific columns are selected" do
|
91
|
-
ds = @c.dataset = @c.dataset.select(:y)
|
92
|
-
def ds.insert_select(*) raise; end
|
91
|
+
ds = @c.dataset = @c.dataset.select(:y).with_extend{def insert_select(*) raise; end}
|
93
92
|
@c.new(:x => 1).save
|
94
93
|
end
|
95
94
|
|
96
95
|
it "should use dataset's insert_select method if the dataset uses returning, even if specific columns are selected" do
|
97
|
-
|
98
|
-
|
96
|
+
ds = @c.dataset = @c.dataset.select(:y).with_fetch(:y=>2).with_extend do
|
97
|
+
def supports_returning?(_) true end
|
98
|
+
def supports_insert_select?; true end
|
99
|
+
def insert_select(hash)
|
100
|
+
with_sql_first("INSERT INTO items (y) VALUES (2) RETURNING y")
|
101
|
+
end
|
102
|
+
end.returning(:y)
|
99
103
|
DB.reset
|
100
|
-
ds = @c.instance_dataset
|
101
|
-
ds._fetch = {:y=>2}
|
102
|
-
def ds.supports_insert_select?() true end
|
103
|
-
def ds.insert_select(hash)
|
104
|
-
with_sql_first("INSERT INTO items (y) VALUES (2) RETURNING y")
|
105
|
-
end
|
106
104
|
o = @c.new(:x => 1)
|
107
105
|
o.save
|
108
106
|
|
@@ -149,19 +147,19 @@ describe "Model#save" do
|
|
149
147
|
end
|
150
148
|
|
151
149
|
it "should raise a NoExistingObject exception if the dataset update call doesn't return 1, unless require_modification is false" do
|
150
|
+
i = 0
|
151
|
+
@c.dataset = @c.dataset.with_extend{define_method(:numrows){i}}
|
152
152
|
o = @c.load(:id => 3, :x => 1)
|
153
|
-
t = o.this
|
154
|
-
t.numrows = 0
|
155
153
|
proc{o.save}.must_raise(Sequel::NoExistingObject)
|
156
|
-
|
154
|
+
i = 2
|
157
155
|
proc{o.save}.must_raise(Sequel::NoExistingObject)
|
158
|
-
|
156
|
+
i = 1
|
159
157
|
o.save
|
160
158
|
|
161
159
|
o.require_modification = false
|
162
|
-
|
160
|
+
i = 0
|
163
161
|
o.save
|
164
|
-
|
162
|
+
i = 2
|
165
163
|
o.save
|
166
164
|
end
|
167
165
|
|
@@ -190,7 +188,7 @@ describe "Model#save" do
|
|
190
188
|
end
|
191
189
|
|
192
190
|
it "should mark all columns as not changed if this is a new record and insert_select was used" do
|
193
|
-
|
191
|
+
ds = @c.dataset = @c.dataset.with_extend{def insert_select(h) h.merge(:id=>1) end}
|
194
192
|
o = @c.new(:x => 1, :y => nil)
|
195
193
|
o.x = 4
|
196
194
|
o.changed_columns.must_equal [:x]
|
@@ -309,7 +307,7 @@ describe "Model#save" do
|
|
309
307
|
false
|
310
308
|
end
|
311
309
|
DB.transaction do
|
312
|
-
o.save(:columns=>:y).
|
310
|
+
o.save(:columns=>:y).must_be_nil
|
313
311
|
DB.run "BLAH"
|
314
312
|
end
|
315
313
|
DB.sqls.must_equal ["BEGIN", "BLAH", "COMMIT"]
|
@@ -322,7 +320,7 @@ describe "Model#save" do
|
|
322
320
|
def o.before_save
|
323
321
|
false
|
324
322
|
end
|
325
|
-
o.save(:columns=>:y).
|
323
|
+
o.save(:columns=>:y).must_be_nil
|
326
324
|
DB.sqls.must_equal ["BEGIN", "ROLLBACK"]
|
327
325
|
end
|
328
326
|
|
@@ -499,11 +497,13 @@ describe "Model#dup" do
|
|
499
497
|
end
|
500
498
|
|
501
499
|
it "should not copy frozen status" do
|
502
|
-
@o.
|
503
|
-
@o.freeze.dup
|
504
|
-
|
505
|
-
|
506
|
-
|
500
|
+
this_frozen = @o.this.frozen?
|
501
|
+
d = @o.freeze.dup
|
502
|
+
d.wont_be :frozen?
|
503
|
+
d.values.wont_be :frozen?
|
504
|
+
d.changed_columns.wont_be :frozen?
|
505
|
+
d.errors.wont_be :frozen?
|
506
|
+
d.this.frozen?.must_equal this_frozen
|
507
507
|
end
|
508
508
|
end
|
509
509
|
|
@@ -820,7 +820,7 @@ end
|
|
820
820
|
|
821
821
|
describe Sequel::Model, "without a primary key" do
|
822
822
|
it "should return nil for primary key" do
|
823
|
-
Class.new(Sequel::Model){no_primary_key}.primary_key.
|
823
|
+
Class.new(Sequel::Model){no_primary_key}.primary_key.must_be_nil
|
824
824
|
end
|
825
825
|
|
826
826
|
it "should raise a Sequel::Error on 'this'" do
|
@@ -1304,9 +1304,9 @@ describe Sequel::Model, "#(set|update)_(all|only)" do
|
|
1304
1304
|
end
|
1305
1305
|
|
1306
1306
|
it "#set_all should set not set restricted fields" do
|
1307
|
-
@o1.use_after_commit_rollback.
|
1307
|
+
@o1.use_after_commit_rollback.must_be_nil
|
1308
1308
|
@o1.set_all(:x => 1, :use_after_commit_rollback => true)
|
1309
|
-
@o1.use_after_commit_rollback.
|
1309
|
+
@o1.use_after_commit_rollback.must_be_nil
|
1310
1310
|
@o1.values.must_equal(:x => 1)
|
1311
1311
|
end
|
1312
1312
|
|
@@ -1345,17 +1345,18 @@ describe Sequel::Model, "#destroy with filtered dataset" do
|
|
1345
1345
|
end
|
1346
1346
|
|
1347
1347
|
it "should raise a NoExistingObject exception if the dataset delete call doesn't return 1" do
|
1348
|
-
|
1348
|
+
i = 0
|
1349
|
+
@model.dataset = @model.dataset.with_extend{define_method(:execute_dui){|*| i}}
|
1349
1350
|
proc{@instance.delete}.must_raise(Sequel::NoExistingObject)
|
1350
|
-
|
1351
|
+
i = 2
|
1351
1352
|
proc{@instance.delete}.must_raise(Sequel::NoExistingObject)
|
1352
|
-
|
1353
|
+
i = 1
|
1353
1354
|
@instance.delete
|
1354
1355
|
|
1355
1356
|
@instance.require_modification = false
|
1356
|
-
|
1357
|
+
i = 0
|
1357
1358
|
@instance.delete
|
1358
|
-
|
1359
|
+
i = 2
|
1359
1360
|
@instance.delete
|
1360
1361
|
end
|
1361
1362
|
|
@@ -1379,17 +1380,18 @@ describe Sequel::Model, "#destroy" do
|
|
1379
1380
|
end
|
1380
1381
|
|
1381
1382
|
it "should raise a NoExistingObject exception if the dataset delete call doesn't return 1" do
|
1382
|
-
|
1383
|
+
i = 0
|
1384
|
+
@model.dataset = @model.dataset.with_extend{define_method(:execute_dui){|*| i}}
|
1383
1385
|
proc{@instance.delete}.must_raise(Sequel::NoExistingObject)
|
1384
|
-
|
1386
|
+
i = 2
|
1385
1387
|
proc{@instance.delete}.must_raise(Sequel::NoExistingObject)
|
1386
|
-
|
1388
|
+
i = 1
|
1387
1389
|
@instance.delete
|
1388
1390
|
|
1389
1391
|
@instance.require_modification = false
|
1390
|
-
|
1392
|
+
i = 0
|
1391
1393
|
@instance.delete
|
1392
|
-
|
1394
|
+
i = 2
|
1393
1395
|
@instance.delete
|
1394
1396
|
end
|
1395
1397
|
|
@@ -1428,7 +1430,7 @@ end
|
|
1428
1430
|
describe Sequel::Model, "#exists?" do
|
1429
1431
|
before do
|
1430
1432
|
@model = Class.new(Sequel::Model(:items))
|
1431
|
-
@model.
|
1433
|
+
@model.dataset = @model.dataset.with_fetch(proc{|sql| {:x=>1} if sql =~ /id = 1/})
|
1432
1434
|
DB.reset
|
1433
1435
|
end
|
1434
1436
|
|
@@ -1736,7 +1738,7 @@ describe Sequel::Model, "#refresh" do
|
|
1736
1738
|
it "should reload the instance values from the database" do
|
1737
1739
|
@m = @c.new(:id => 555)
|
1738
1740
|
@m[:x] = 'blah'
|
1739
|
-
@c.
|
1741
|
+
@c.dataset = @c.dataset.with_fetch(:x => 'kaboom', :id => 555)
|
1740
1742
|
@m.refresh
|
1741
1743
|
@m[:x].must_equal 'kaboom'
|
1742
1744
|
DB.sqls.must_equal ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
|
@@ -1744,14 +1746,14 @@ describe Sequel::Model, "#refresh" do
|
|
1744
1746
|
|
1745
1747
|
it "should raise if the instance is not found" do
|
1746
1748
|
@m = @c.new(:id => 555)
|
1747
|
-
@c.
|
1749
|
+
@c.dataset = @c.dataset.with_fetch([])
|
1748
1750
|
proc {@m.refresh}.must_raise(Sequel::NoExistingObject)
|
1749
1751
|
DB.sqls.must_equal ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
|
1750
1752
|
end
|
1751
1753
|
|
1752
1754
|
it "should be aliased by #reload" do
|
1753
1755
|
@m = @c.new(:id => 555)
|
1754
|
-
@c.
|
1756
|
+
@c.dataset = @c.dataset.with_fetch(:x => 'kaboom', :id => 555)
|
1755
1757
|
@m.reload
|
1756
1758
|
@m[:x].must_equal 'kaboom'
|
1757
1759
|
DB.sqls.must_equal ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
|
@@ -1795,7 +1797,7 @@ describe Sequel::Model, "typecasting" do
|
|
1795
1797
|
@c.db_schema = {:x=>{:type=>x}}
|
1796
1798
|
m = @c.new
|
1797
1799
|
m.x = ''
|
1798
|
-
m.x.
|
1800
|
+
m.x.must_be_nil
|
1799
1801
|
end
|
1800
1802
|
[:string, :blob].each do |x|
|
1801
1803
|
@c.db_schema = {:x=>{:type=>x}}
|
@@ -1826,7 +1828,7 @@ describe Sequel::Model, "typecasting" do
|
|
1826
1828
|
@c.db_schema[:x][:allow_null] = true
|
1827
1829
|
m = @c.new
|
1828
1830
|
m.x = nil
|
1829
|
-
m.x.
|
1831
|
+
m.x.must_be_nil
|
1830
1832
|
end
|
1831
1833
|
|
1832
1834
|
it "should raise an error if attempting to typecast nil and NULLs are not allowed" do
|
@@ -1840,7 +1842,7 @@ describe Sequel::Model, "typecasting" do
|
|
1840
1842
|
@c.db_schema[:x][:allow_null] = false
|
1841
1843
|
m = @c.new
|
1842
1844
|
m.x = nil
|
1843
|
-
m.x.
|
1845
|
+
m.x.must_be_nil
|
1844
1846
|
end
|
1845
1847
|
|
1846
1848
|
it "should not raise when typecasting nil to NOT NULL column but raise_on_typecast_failure is off" do
|
@@ -1848,9 +1850,9 @@ describe Sequel::Model, "typecasting" do
|
|
1848
1850
|
@c.typecast_on_assignment = true
|
1849
1851
|
m = @c.new
|
1850
1852
|
m.x = ''
|
1851
|
-
m.x.
|
1853
|
+
m.x.must_be_nil
|
1852
1854
|
m.x = nil
|
1853
|
-
m.x.
|
1855
|
+
m.x.must_be_nil
|
1854
1856
|
end
|
1855
1857
|
|
1856
1858
|
it "should raise an error if invalid data is used in an integer field" do
|
@@ -1950,11 +1952,11 @@ describe Sequel::Model, "typecasting" do
|
|
1950
1952
|
m.x = true
|
1951
1953
|
m.x.must_equal true
|
1952
1954
|
m.x = nil
|
1953
|
-
m.x.
|
1955
|
+
m.x.must_be_nil
|
1954
1956
|
m.x = ''
|
1955
|
-
m.x.
|
1957
|
+
m.x.must_be_nil
|
1956
1958
|
m.x = []
|
1957
|
-
m.x.
|
1959
|
+
m.x.must_be_nil
|
1958
1960
|
m.x = 'f'
|
1959
1961
|
m.x.must_equal false
|
1960
1962
|
m.x = 'F'
|
@@ -2123,7 +2125,7 @@ describe "Model#lock!" do
|
|
2123
2125
|
@c = Class.new(Sequel::Model(:items)) do
|
2124
2126
|
columns :id
|
2125
2127
|
end
|
2126
|
-
@c.dataset
|
2128
|
+
@c.dataset = @c.dataset.with_fetch(:id=>1)
|
2127
2129
|
DB.reset
|
2128
2130
|
end
|
2129
2131
|
|