sequel 3.48.0 → 4.0.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 +114 -0
- data/Rakefile +10 -7
- data/doc/association_basics.rdoc +25 -23
- data/doc/code_order.rdoc +7 -0
- data/doc/core_extensions.rdoc +0 -10
- data/doc/object_model.rdoc +4 -1
- data/doc/querying.rdoc +3 -3
- data/doc/release_notes/4.0.0.txt +262 -0
- data/doc/security.rdoc +0 -28
- data/doc/testing.rdoc +8 -14
- data/lib/sequel/adapters/ado.rb +7 -11
- data/lib/sequel/adapters/ado/access.rb +8 -8
- data/lib/sequel/adapters/ado/mssql.rb +4 -4
- data/lib/sequel/adapters/amalgalite.rb +6 -6
- data/lib/sequel/adapters/cubrid.rb +7 -7
- data/lib/sequel/adapters/db2.rb +5 -9
- data/lib/sequel/adapters/dbi.rb +2 -6
- data/lib/sequel/adapters/do.rb +4 -4
- data/lib/sequel/adapters/firebird.rb +4 -4
- data/lib/sequel/adapters/ibmdb.rb +8 -8
- data/lib/sequel/adapters/informix.rb +2 -10
- data/lib/sequel/adapters/jdbc.rb +17 -17
- data/lib/sequel/adapters/jdbc/as400.rb +2 -2
- data/lib/sequel/adapters/jdbc/cubrid.rb +1 -1
- data/lib/sequel/adapters/jdbc/db2.rb +1 -1
- data/lib/sequel/adapters/jdbc/derby.rb +1 -1
- data/lib/sequel/adapters/jdbc/h2.rb +2 -2
- data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -1
- data/lib/sequel/adapters/jdbc/informix.rb +1 -1
- data/lib/sequel/adapters/jdbc/mssql.rb +2 -2
- data/lib/sequel/adapters/jdbc/mysql.rb +1 -1
- data/lib/sequel/adapters/jdbc/oracle.rb +5 -1
- data/lib/sequel/adapters/jdbc/postgresql.rb +3 -3
- data/lib/sequel/adapters/jdbc/sqlite.rb +3 -3
- data/lib/sequel/adapters/jdbc/transactions.rb +3 -3
- data/lib/sequel/adapters/mock.rb +7 -7
- data/lib/sequel/adapters/mysql.rb +3 -3
- data/lib/sequel/adapters/mysql2.rb +4 -4
- data/lib/sequel/adapters/odbc.rb +2 -6
- data/lib/sequel/adapters/odbc/mssql.rb +1 -1
- data/lib/sequel/adapters/openbase.rb +1 -5
- data/lib/sequel/adapters/oracle.rb +13 -17
- data/lib/sequel/adapters/postgres.rb +20 -25
- data/lib/sequel/adapters/shared/cubrid.rb +3 -3
- data/lib/sequel/adapters/shared/db2.rb +2 -2
- data/lib/sequel/adapters/shared/firebird.rb +7 -7
- data/lib/sequel/adapters/shared/mssql.rb +9 -9
- data/lib/sequel/adapters/shared/mysql.rb +29 -13
- data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +7 -7
- data/lib/sequel/adapters/shared/oracle.rb +22 -13
- data/lib/sequel/adapters/shared/postgres.rb +61 -46
- data/lib/sequel/adapters/shared/sqlite.rb +9 -9
- data/lib/sequel/adapters/sqlite.rb +17 -11
- data/lib/sequel/adapters/swift.rb +3 -3
- data/lib/sequel/adapters/swift/mysql.rb +1 -1
- data/lib/sequel/adapters/swift/sqlite.rb +1 -1
- data/lib/sequel/adapters/tinytds.rb +8 -8
- data/lib/sequel/ast_transformer.rb +3 -1
- data/lib/sequel/connection_pool.rb +4 -2
- data/lib/sequel/connection_pool/sharded_single.rb +2 -2
- data/lib/sequel/connection_pool/sharded_threaded.rb +5 -5
- data/lib/sequel/connection_pool/threaded.rb +7 -7
- data/lib/sequel/core.rb +4 -67
- data/lib/sequel/database.rb +1 -0
- data/lib/sequel/database/connecting.rb +2 -8
- data/lib/sequel/database/dataset.rb +2 -7
- data/lib/sequel/database/dataset_defaults.rb +0 -18
- data/lib/sequel/database/features.rb +4 -4
- data/lib/sequel/database/misc.rb +6 -8
- data/lib/sequel/database/query.rb +5 -61
- data/lib/sequel/database/schema_generator.rb +22 -20
- data/lib/sequel/database/schema_methods.rb +48 -20
- data/lib/sequel/database/transactions.rb +7 -17
- data/lib/sequel/dataset.rb +2 -0
- data/lib/sequel/dataset/actions.rb +23 -91
- data/lib/sequel/dataset/features.rb +1 -4
- data/lib/sequel/dataset/graph.rb +3 -47
- data/lib/sequel/dataset/misc.rb +4 -33
- data/lib/sequel/dataset/prepared_statements.rb +3 -1
- data/lib/sequel/dataset/query.rb +116 -240
- data/lib/sequel/dataset/sql.rb +19 -97
- data/lib/sequel/deprecated.rb +0 -16
- data/lib/sequel/exceptions.rb +0 -3
- data/lib/sequel/extensions/_pretty_table.rb +1 -1
- data/lib/sequel/extensions/columns_introspection.rb +1 -12
- data/lib/sequel/extensions/constraint_validations.rb +3 -3
- data/lib/sequel/extensions/core_extensions.rb +0 -9
- data/lib/sequel/extensions/date_arithmetic.rb +1 -2
- data/lib/sequel/extensions/graph_each.rb +11 -0
- data/lib/sequel/extensions/migration.rb +5 -5
- data/lib/sequel/extensions/null_dataset.rb +11 -13
- data/lib/sequel/extensions/pagination.rb +3 -6
- data/lib/sequel/extensions/pg_array.rb +6 -4
- data/lib/sequel/extensions/pg_array_ops.rb +35 -1
- data/lib/sequel/extensions/pg_json.rb +12 -2
- data/lib/sequel/extensions/pg_json_ops.rb +266 -0
- data/lib/sequel/extensions/pg_range.rb +2 -2
- data/lib/sequel/extensions/pg_range_ops.rb +0 -8
- data/lib/sequel/extensions/pg_row.rb +2 -2
- data/lib/sequel/extensions/pretty_table.rb +0 -4
- data/lib/sequel/extensions/query.rb +3 -8
- data/lib/sequel/extensions/schema_caching.rb +0 -7
- data/lib/sequel/extensions/schema_dumper.rb +10 -17
- data/lib/sequel/extensions/select_remove.rb +0 -4
- data/lib/sequel/extensions/set_overrides.rb +28 -0
- data/lib/sequel/extensions/to_dot.rb +6 -10
- data/lib/sequel/model.rb +6 -7
- data/lib/sequel/model/associations.rb +127 -182
- data/lib/sequel/model/base.rb +88 -211
- data/lib/sequel/model/errors.rb +0 -13
- data/lib/sequel/model/plugins.rb +2 -2
- data/lib/sequel/no_core_ext.rb +0 -1
- data/lib/sequel/plugins/after_initialize.rb +11 -17
- data/lib/sequel/plugins/association_autoreloading.rb +1 -47
- data/lib/sequel/plugins/association_dependencies.rb +2 -2
- data/lib/sequel/plugins/auto_validations.rb +2 -8
- data/lib/sequel/plugins/blacklist_security.rb +32 -2
- data/lib/sequel/plugins/caching.rb +1 -1
- data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
- data/lib/sequel/plugins/composition.rb +10 -8
- data/lib/sequel/plugins/constraint_validations.rb +2 -2
- data/lib/sequel/plugins/dataset_associations.rb +4 -0
- data/lib/sequel/plugins/defaults_setter.rb +8 -6
- data/lib/sequel/plugins/dirty.rb +6 -6
- data/lib/sequel/plugins/force_encoding.rb +13 -8
- data/lib/sequel/plugins/hook_class_methods.rb +1 -7
- data/lib/sequel/plugins/json_serializer.rb +13 -74
- data/lib/sequel/plugins/lazy_attributes.rb +2 -4
- data/lib/sequel/plugins/list.rb +1 -1
- data/lib/sequel/plugins/many_through_many.rb +4 -11
- data/lib/sequel/plugins/many_to_one_pk_lookup.rb +1 -49
- data/lib/sequel/plugins/nested_attributes.rb +1 -1
- data/lib/sequel/plugins/optimistic_locking.rb +3 -5
- data/lib/sequel/plugins/pg_array_associations.rb +453 -0
- data/lib/sequel/plugins/pg_typecast_on_load.rb +23 -7
- data/lib/sequel/plugins/prepared_statements.rb +1 -1
- data/lib/sequel/plugins/prepared_statements_associations.rb +20 -14
- data/lib/sequel/plugins/prepared_statements_safe.rb +2 -2
- data/lib/sequel/plugins/rcte_tree.rb +1 -1
- data/lib/sequel/plugins/serialization.rb +5 -4
- data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
- data/lib/sequel/plugins/sharding.rb +7 -1
- data/lib/sequel/plugins/single_table_inheritance.rb +1 -1
- data/lib/sequel/plugins/timestamps.rb +1 -1
- data/lib/sequel/plugins/touch.rb +2 -2
- data/lib/sequel/plugins/tree.rb +1 -1
- data/lib/sequel/plugins/typecast_on_load.rb +19 -4
- data/lib/sequel/plugins/validation_class_methods.rb +0 -30
- data/lib/sequel/plugins/validation_helpers.rb +13 -31
- data/lib/sequel/plugins/xml_serializer.rb +18 -57
- data/lib/sequel/sql.rb +20 -22
- data/lib/sequel/version.rb +2 -2
- data/spec/adapters/db2_spec.rb +14 -23
- data/spec/adapters/firebird_spec.rb +25 -29
- data/spec/adapters/informix_spec.rb +11 -14
- data/spec/adapters/mssql_spec.rb +71 -77
- data/spec/adapters/mysql_spec.rb +165 -172
- data/spec/adapters/oracle_spec.rb +36 -39
- data/spec/adapters/postgres_spec.rb +175 -100
- data/spec/adapters/spec_helper.rb +13 -11
- data/spec/adapters/sqlite_spec.rb +36 -44
- data/spec/core/connection_pool_spec.rb +2 -1
- data/spec/core/database_spec.rb +55 -55
- data/spec/core/dataset_spec.rb +45 -249
- data/spec/core/deprecated_spec.rb +0 -8
- data/spec/core/expression_filters_spec.rb +23 -5
- data/spec/core/object_graph_spec.rb +4 -66
- data/spec/core/schema_spec.rb +35 -12
- data/spec/core/spec_helper.rb +3 -2
- data/spec/core_extensions_spec.rb +17 -19
- data/spec/extensions/arbitrary_servers_spec.rb +2 -3
- data/spec/extensions/association_dependencies_spec.rb +14 -14
- data/spec/extensions/auto_validations_spec.rb +7 -0
- data/spec/extensions/blacklist_security_spec.rb +5 -5
- data/spec/extensions/blank_spec.rb +2 -0
- data/spec/extensions/class_table_inheritance_spec.rb +2 -2
- data/spec/extensions/columns_introspection_spec.rb +2 -29
- data/spec/extensions/composition_spec.rb +10 -17
- data/spec/extensions/core_refinements_spec.rb +5 -1
- data/spec/extensions/dataset_associations_spec.rb +18 -0
- data/spec/extensions/date_arithmetic_spec.rb +2 -2
- data/spec/extensions/defaults_setter_spec.rb +9 -9
- data/spec/extensions/dirty_spec.rb +0 -5
- data/spec/extensions/eval_inspect_spec.rb +2 -0
- data/spec/extensions/force_encoding_spec.rb +2 -18
- data/spec/extensions/hash_aliases_spec.rb +8 -0
- data/spec/extensions/hook_class_methods_spec.rb +39 -58
- data/spec/extensions/inflector_spec.rb +2 -0
- data/spec/extensions/instance_filters_spec.rb +8 -8
- data/spec/extensions/json_serializer_spec.rb +1 -41
- data/spec/extensions/list_spec.rb +1 -1
- data/spec/extensions/many_through_many_spec.rb +106 -109
- data/spec/extensions/migration_spec.rb +2 -0
- data/spec/extensions/named_timezones_spec.rb +1 -0
- data/spec/extensions/pg_array_associations_spec.rb +603 -0
- data/spec/extensions/pg_array_ops_spec.rb +25 -0
- data/spec/extensions/pg_array_spec.rb +9 -1
- data/spec/extensions/pg_hstore_ops_spec.rb +13 -0
- data/spec/extensions/pg_hstore_spec.rb +1 -0
- data/spec/extensions/pg_json_ops_spec.rb +131 -0
- data/spec/extensions/pg_json_spec.rb +10 -4
- data/spec/extensions/pg_range_ops_spec.rb +2 -5
- data/spec/extensions/pg_range_spec.rb +6 -2
- data/spec/extensions/pg_row_ops_spec.rb +2 -0
- data/spec/extensions/prepared_statements_associations_spec.rb +26 -5
- data/spec/extensions/rcte_tree_spec.rb +15 -15
- data/spec/extensions/schema_dumper_spec.rb +0 -1
- data/spec/extensions/schema_spec.rb +9 -9
- data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
- data/spec/extensions/serialization_spec.rb +18 -29
- data/spec/extensions/set_overrides_spec.rb +4 -0
- data/spec/extensions/{many_to_one_pk_lookup_spec.rb → shared_caching_spec.rb} +1 -4
- data/spec/extensions/single_table_inheritance_spec.rb +4 -4
- data/spec/extensions/spec_helper.rb +8 -9
- data/spec/extensions/sql_expr_spec.rb +2 -0
- data/spec/extensions/string_date_time_spec.rb +2 -0
- data/spec/extensions/string_stripper_spec.rb +2 -0
- data/spec/extensions/tactical_eager_loading_spec.rb +12 -12
- data/spec/extensions/thread_local_timezones_spec.rb +2 -0
- data/spec/extensions/timestamps_spec.rb +1 -1
- data/spec/extensions/to_dot_spec.rb +1 -1
- data/spec/extensions/touch_spec.rb +24 -24
- data/spec/extensions/tree_spec.rb +7 -7
- data/spec/extensions/typecast_on_load_spec.rb +8 -1
- data/spec/extensions/update_primary_key_spec.rb +10 -10
- data/spec/extensions/validation_class_methods_spec.rb +10 -39
- data/spec/extensions/validation_helpers_spec.rb +29 -47
- data/spec/extensions/xml_serializer_spec.rb +1 -23
- data/spec/integration/associations_test.rb +231 -40
- data/spec/integration/database_test.rb +1 -1
- data/spec/integration/dataset_test.rb +64 -64
- data/spec/integration/eager_loader_test.rb +28 -28
- data/spec/integration/migrator_test.rb +1 -1
- data/spec/integration/model_test.rb +2 -2
- data/spec/integration/plugin_test.rb +21 -21
- data/spec/integration/prepared_statement_test.rb +7 -7
- data/spec/integration/schema_test.rb +115 -110
- data/spec/integration/spec_helper.rb +17 -27
- data/spec/integration/timezone_test.rb +1 -1
- data/spec/integration/transaction_test.rb +10 -10
- data/spec/integration/type_test.rb +2 -2
- data/spec/model/association_reflection_spec.rb +2 -28
- data/spec/model/associations_spec.rb +239 -188
- data/spec/model/base_spec.rb +27 -68
- data/spec/model/dataset_methods_spec.rb +4 -4
- data/spec/model/eager_loading_spec.rb +160 -172
- data/spec/model/hooks_spec.rb +62 -79
- data/spec/model/model_spec.rb +36 -51
- data/spec/model/plugins_spec.rb +5 -19
- data/spec/model/record_spec.rb +125 -151
- data/spec/model/spec_helper.rb +8 -6
- data/spec/model/validations_spec.rb +4 -17
- data/spec/spec_config.rb +2 -10
- metadata +50 -56
- data/lib/sequel/deprecated_core_extensions.rb +0 -135
- data/lib/sequel/extensions/pg_auto_parameterize.rb +0 -185
- data/lib/sequel/extensions/pg_statement_cache.rb +0 -318
- data/lib/sequel/plugins/identity_map.rb +0 -260
- data/lib/sequel_core.rb +0 -2
- data/lib/sequel_model.rb +0 -2
- data/spec/extensions/association_autoreloading_spec.rb +0 -102
- data/spec/extensions/identity_map_spec.rb +0 -337
- data/spec/extensions/pg_auto_parameterize_spec.rb +0 -70
- data/spec/extensions/pg_statement_cache_spec.rb +0 -208
- data/spec/rcov.opts +0 -8
- data/spec/spec_config.rb.example +0 -10
|
@@ -43,6 +43,13 @@ describe "Sequel::Plugins::AutoValidations" do
|
|
|
43
43
|
@m.errors.should == {[:name, :num]=>["is already taken"]}
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
it "should handle databases that don't support index parsing" do
|
|
47
|
+
def (@m.db).supports_index_parsing?() false end
|
|
48
|
+
@m.model.send(:setup_auto_validations)
|
|
49
|
+
@m.set(:d=>Date.today, :num=>1, :name=>'1')
|
|
50
|
+
@m.valid?.should be_true
|
|
51
|
+
end
|
|
52
|
+
|
|
46
53
|
it "should support :not_null=>:presence option" do
|
|
47
54
|
@c.plugin :auto_validations, :not_null=>:presence
|
|
48
55
|
@m.set(:d=>Date.today, :num=>'')
|
|
@@ -11,7 +11,7 @@ describe Sequel::Model, "#(set|update)_except" do
|
|
|
11
11
|
end
|
|
12
12
|
@c.strict_param_setting = false
|
|
13
13
|
@o1 = @c.new
|
|
14
|
-
|
|
14
|
+
DB.reset
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
it "should raise errors if not all hash fields can be set and strict_param_setting is true" do
|
|
@@ -31,9 +31,9 @@ describe Sequel::Model, "#(set|update)_except" do
|
|
|
31
31
|
|
|
32
32
|
it "#update_except should not update given attributes" do
|
|
33
33
|
@o1.update_except({:x => 1, :y => 2, :z=>3, :id=>4}, [:y, :z])
|
|
34
|
-
|
|
34
|
+
DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
|
|
35
35
|
@c.new.update_except({:x => 1, :y => 2, :z=>3, :id=>4}, :y, :z)
|
|
36
|
-
|
|
36
|
+
DB.sqls.should == ["INSERT INTO items (x) VALUES (1)", "SELECT * FROM items WHERE (id = 10) LIMIT 1"]
|
|
37
37
|
end
|
|
38
38
|
end
|
|
39
39
|
|
|
@@ -67,7 +67,7 @@ describe Sequel::Model, ".restricted_columns " do
|
|
|
67
67
|
i = @c.new
|
|
68
68
|
i.update(:x => 7, :z => 9)
|
|
69
69
|
i.values.should == {:x => 7}
|
|
70
|
-
|
|
70
|
+
DB.sqls.should == ["INSERT INTO blahblah (x) VALUES (7)", "SELECT * FROM blahblah WHERE (id = 10) LIMIT 1"]
|
|
71
71
|
end
|
|
72
72
|
|
|
73
73
|
it "should have allowed take precedence over restricted" do
|
|
@@ -82,6 +82,6 @@ describe Sequel::Model, ".restricted_columns " do
|
|
|
82
82
|
i = @c.new
|
|
83
83
|
i.update(:y => 7, :z => 9)
|
|
84
84
|
i.values.should == {:y => 7}
|
|
85
|
-
|
|
85
|
+
DB.sqls.should == ["INSERT INTO blahblah (y) VALUES (7)", "SELECT * FROM blahblah WHERE (id = 10) LIMIT 1"]
|
|
86
86
|
end
|
|
87
87
|
end
|
|
@@ -24,7 +24,7 @@ describe "class_table_inheritance plugin" do
|
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
class ::Employee < Sequel::Model(@db)
|
|
27
|
-
def
|
|
27
|
+
def _save_refresh; @values[:id] = 1 end
|
|
28
28
|
def self.columns
|
|
29
29
|
dataset.columns
|
|
30
30
|
end
|
|
@@ -204,7 +204,7 @@ describe "class_table_inheritance plugin" do
|
|
|
204
204
|
it "should handle many_to_one relationships correctly" do
|
|
205
205
|
Manager.dataset._fetch = {:id=>3, :name=>'E', :kind=>'Executive', :num_managers=>3}
|
|
206
206
|
Staff.load(:manager_id=>3).manager.should == Executive.load(:id=>3, :name=>'E', :kind=>'Executive', :num_managers=>3)
|
|
207
|
-
@db.sqls.should == ['SELECT * FROM employees INNER JOIN managers USING (id) WHERE (
|
|
207
|
+
@db.sqls.should == ['SELECT * FROM employees INNER JOIN managers USING (id) WHERE (id = 3) LIMIT 1']
|
|
208
208
|
end
|
|
209
209
|
|
|
210
210
|
it "should handle one_to_many relationships correctly" do
|
|
@@ -1,33 +1,11 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
before do
|
|
5
|
-
@db = MODEL_DB
|
|
6
|
-
@ds = @db[:a]
|
|
7
|
-
class Sequel::Dataset
|
|
8
|
-
# Handle case where introspect_all_columns has already been called
|
|
9
|
-
alias columns columns_without_introspection unless instance_methods(false).map{|x| x.to_s}.include?('columns')
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
after do
|
|
13
|
-
class Sequel::Dataset
|
|
14
|
-
alias columns columns_without_introspection
|
|
15
|
-
end
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
qspecify "should turn on column introspection by default" do
|
|
19
|
-
Sequel::Dataset.introspect_all_columns
|
|
20
|
-
@db.reset
|
|
21
|
-
@ds.select(:x).columns.should == [:x]
|
|
22
|
-
@db.sqls.length.should == 0
|
|
23
|
-
end
|
|
24
|
-
end
|
|
3
|
+
Sequel.extension :columns_introspection
|
|
25
4
|
|
|
26
5
|
describe "columns_introspection extension" do
|
|
27
6
|
before do
|
|
28
|
-
@db = Sequel.mock
|
|
7
|
+
@db = Sequel.mock.extension(:columns_introspection)
|
|
29
8
|
@ds = @db[:a]
|
|
30
|
-
@ds.extend(Sequel::ColumnsIntrospection.dup) # dup to allow multiple places in class hierarchy
|
|
31
9
|
@db.sqls
|
|
32
10
|
end
|
|
33
11
|
|
|
@@ -109,9 +87,4 @@ describe "columns_introspection extension" do
|
|
|
109
87
|
@ds.select(1).columns
|
|
110
88
|
@db.sqls.length.should == 1
|
|
111
89
|
end
|
|
112
|
-
|
|
113
|
-
specify "should not have column introspection on by default" do
|
|
114
|
-
@db[:a].select(:x).columns
|
|
115
|
-
@db.sqls.length.should == 1
|
|
116
|
-
end
|
|
117
90
|
end
|
|
@@ -6,7 +6,7 @@ describe "Composition plugin" do
|
|
|
6
6
|
@c.plugin :composition
|
|
7
7
|
@c.columns :id, :year, :month, :day
|
|
8
8
|
@o = @c.load(:id=>1, :year=>1, :month=>2, :day=>3)
|
|
9
|
-
|
|
9
|
+
DB.reset
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
it ".composition should add compositions" do
|
|
@@ -48,7 +48,7 @@ describe "Composition plugin" do
|
|
|
48
48
|
@c.composition :date, :composer=>proc{Date.new(year+1, month+2, day+3)}, :decomposer=>proc{[:year, :month, :day].each{|s| self.send("#{s}=", date.send(s) * 2)}}
|
|
49
49
|
@o.date.should == Date.new(2, 4, 6)
|
|
50
50
|
@o.save
|
|
51
|
-
sql =
|
|
51
|
+
sql = DB.sqls.last
|
|
52
52
|
sql.should include("year = 4")
|
|
53
53
|
sql.should include("month = 8")
|
|
54
54
|
sql.should include("day = 12")
|
|
@@ -90,13 +90,6 @@ describe "Composition plugin" do
|
|
|
90
90
|
called.should == true
|
|
91
91
|
end
|
|
92
92
|
|
|
93
|
-
it "should clear compositions cache when using set_values" do
|
|
94
|
-
@c.composition :date, :composer=>proc{}, :decomposer=>proc{}
|
|
95
|
-
@o.date = Date.new(3, 4, 5)
|
|
96
|
-
@o.set_values(:id=>1)
|
|
97
|
-
@o.compositions.should == {}
|
|
98
|
-
end
|
|
99
|
-
|
|
100
93
|
it "should clear compositions cache when refreshing" do
|
|
101
94
|
@c.composition :date, :composer=>proc{}, :decomposer=>proc{}
|
|
102
95
|
@o.date = Date.new(3, 4, 5)
|
|
@@ -104,16 +97,16 @@ describe "Composition plugin" do
|
|
|
104
97
|
@o.compositions.should == {}
|
|
105
98
|
end
|
|
106
99
|
|
|
107
|
-
it "should clear compositions cache when refreshing after save" do
|
|
100
|
+
it "should not clear compositions cache when refreshing after save" do
|
|
108
101
|
@c.composition :date, :composer=>proc{}, :decomposer=>proc{}
|
|
109
|
-
@c.create(:date=>Date.new(3, 4, 5)).compositions.should == {}
|
|
102
|
+
@c.create(:date=>Date.new(3, 4, 5)).compositions.should == {:date=>Date.new(3, 4, 5)}
|
|
110
103
|
end
|
|
111
104
|
|
|
112
|
-
it "should clear compositions cache when saving with insert_select" do
|
|
105
|
+
it "should not clear compositions cache when saving with insert_select" do
|
|
113
106
|
def (@c.instance_dataset).supports_insert_select?() true end
|
|
114
107
|
def (@c.instance_dataset).insert_select(*) {:id=>1} end
|
|
115
108
|
@c.composition :date, :composer=>proc{}, :decomposer=>proc{}
|
|
116
|
-
@c.create(:date=>Date.new(3, 4, 5)).compositions.should == {}
|
|
109
|
+
@c.create(:date=>Date.new(3, 4, 5)).compositions.should == {:date=>Date.new(3, 4, 5)}
|
|
117
110
|
end
|
|
118
111
|
|
|
119
112
|
it "should instantiate compositions lazily" do
|
|
@@ -159,7 +152,7 @@ describe "Composition plugin" do
|
|
|
159
152
|
@o.date.month.should == 6
|
|
160
153
|
@o.date = c.new(3, 4)
|
|
161
154
|
@o.save
|
|
162
|
-
sql =
|
|
155
|
+
sql = DB.sqls.last
|
|
163
156
|
sql.should include("year = 6")
|
|
164
157
|
sql.should include("month = 12")
|
|
165
158
|
end
|
|
@@ -181,7 +174,7 @@ describe "Composition plugin" do
|
|
|
181
174
|
@o.date.m.should == 6
|
|
182
175
|
@o.date = c.new(3, 4)
|
|
183
176
|
@o.save
|
|
184
|
-
sql =
|
|
177
|
+
sql = DB.sqls.last
|
|
185
178
|
sql.should include("year = 6")
|
|
186
179
|
sql.should include("month = 12")
|
|
187
180
|
end
|
|
@@ -195,7 +188,7 @@ describe "Composition plugin" do
|
|
|
195
188
|
@c.composition :date, :mapping=>[:year, :month, :day]
|
|
196
189
|
@o.date = nil
|
|
197
190
|
@o.save
|
|
198
|
-
sql =
|
|
191
|
+
sql = DB.sqls.last
|
|
199
192
|
sql.should include("year = NULL")
|
|
200
193
|
sql.should include("month = NULL")
|
|
201
194
|
sql.should include("day = NULL")
|
|
@@ -214,7 +207,7 @@ describe "Composition plugin" do
|
|
|
214
207
|
o = c.load(:id=>1, :year=>1, :month=>2, :day=>3)
|
|
215
208
|
o.date.should == Date.new(1, 2, 3)
|
|
216
209
|
o.save
|
|
217
|
-
sql =
|
|
210
|
+
sql = DB.sqls.last
|
|
218
211
|
sql.should include("year = 1")
|
|
219
212
|
sql.should include("month = 2")
|
|
220
213
|
sql.should include("day = 3")
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
|
|
2
2
|
|
|
3
3
|
if RUBY_VERSION >= '2.0.0'
|
|
4
|
+
Sequel.extension :core_refinements, :pg_array, :pg_hstore, :pg_row, :pg_range, :pg_row_ops, :pg_range_ops, :pg_array_ops, :pg_hstore_ops, :pg_json, :pg_json_ops
|
|
4
5
|
using Sequel::CoreRefinements
|
|
5
6
|
|
|
6
7
|
describe "Core refinements" do
|
|
@@ -451,7 +452,6 @@ end
|
|
|
451
452
|
describe "Postgres extensions integration" do
|
|
452
453
|
before do
|
|
453
454
|
@db = Sequel.mock
|
|
454
|
-
Sequel.extension(:pg_array, :pg_array_ops, :pg_hstore, :pg_hstore_ops, :pg_json, :pg_range, :pg_range_ops, :pg_row, :pg_row_ops)
|
|
455
455
|
end
|
|
456
456
|
|
|
457
457
|
it "Symbol#pg_array should return an ArrayOp" do
|
|
@@ -466,6 +466,10 @@ describe "Postgres extensions integration" do
|
|
|
466
466
|
@db.literal(:a.hstore['a']).should == "(a -> 'a')"
|
|
467
467
|
end
|
|
468
468
|
|
|
469
|
+
it "Symbol#pg_json should return an JSONOp" do
|
|
470
|
+
@db.literal(:a.pg_json[%w'a b']).should == "(a #> ARRAY['a','b'])"
|
|
471
|
+
end
|
|
472
|
+
|
|
469
473
|
it "Symbol#pg_range should return a RangeOp" do
|
|
470
474
|
@db.literal(:a.pg_range.lower).should == "lower(a)"
|
|
471
475
|
end
|
|
@@ -23,11 +23,15 @@ describe "Sequel::Plugins::DatasetAssociations" do
|
|
|
23
23
|
@Tag.columns :id, :name
|
|
24
24
|
|
|
25
25
|
@Artist.plugin :many_through_many
|
|
26
|
+
@Artist.plugin :pg_array_associations
|
|
27
|
+
@Tag.plugin :pg_array_associations
|
|
26
28
|
@Artist.one_to_many :albums, :class=>@Album
|
|
27
29
|
@Artist.one_to_one :first_album, :class=>@Album
|
|
28
30
|
@Album.many_to_one :artist, :class=>@Artist
|
|
29
31
|
@Album.many_to_many :tags, :class=>@Tag
|
|
30
32
|
@Tag.many_to_many :albums, :class=>@Album
|
|
33
|
+
@Artist.pg_array_to_many :artist_tags, :class=>@Tag, :key=>:tag_ids
|
|
34
|
+
@Tag.many_to_pg_array :artists, :class=>@Artist
|
|
31
35
|
@Artist.many_through_many :tags, [[:albums, :artist_id, :id], [:albums_tags, :album_id, :tag_id]], :class=>@Tag
|
|
32
36
|
end
|
|
33
37
|
|
|
@@ -66,6 +70,20 @@ describe "Sequel::Plugins::DatasetAssociations" do
|
|
|
66
70
|
ds.sql.should == "SELECT tags.* FROM tags WHERE (tags.id IN (SELECT albums_tags.tag_id FROM artists INNER JOIN albums ON (albums.artist_id = artists.id) INNER JOIN albums_tags ON (albums_tags.album_id = albums.id)))"
|
|
67
71
|
end
|
|
68
72
|
|
|
73
|
+
it "should work for pg_array_to_many associations" do
|
|
74
|
+
ds = @Artist.artist_tags
|
|
75
|
+
ds.should be_a_kind_of(Sequel::Dataset)
|
|
76
|
+
ds.model.should == @Tag
|
|
77
|
+
ds.sql.should == "SELECT * FROM tags WHERE (id IN (SELECT unnest(artists.tag_ids) FROM artists))"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should work for many_to_pg_array associations" do
|
|
81
|
+
ds = @Tag.artists
|
|
82
|
+
ds.should be_a_kind_of(Sequel::Dataset)
|
|
83
|
+
ds.model.should == @Artist
|
|
84
|
+
ds.sql.should == "SELECT * FROM artists WHERE coalesce((tag_ids && (SELECT array_agg(tags.id) FROM tags)), 'f')"
|
|
85
|
+
end
|
|
86
|
+
|
|
69
87
|
it "should have an associated method that takes an association symbol" do
|
|
70
88
|
ds = @Album.associated(:artist)
|
|
71
89
|
ds.should be_a_kind_of(Sequel::Dataset)
|
|
@@ -142,9 +142,9 @@ describe "date_arithmetic extension" do
|
|
|
142
142
|
db.literal(Sequel.date_add(:a, @h2)).should == "(CAST(a AS timestamp) + 1 years + 1 months + 1 days + 1 hours + 1 minutes + 1 seconds)"
|
|
143
143
|
end
|
|
144
144
|
|
|
145
|
-
|
|
145
|
+
specify "should raise error if literalizing on an unsupported database" do
|
|
146
146
|
db = Sequel.mock
|
|
147
147
|
db.extension :date_arithmetic
|
|
148
|
-
lambda{db.literal(Sequel.date_add(:a, @h0))}.should raise_error(Sequel::
|
|
148
|
+
lambda{db.literal(Sequel.date_add(:a, @h0))}.should raise_error(Sequel::Error)
|
|
149
149
|
end
|
|
150
150
|
end
|
|
@@ -15,7 +15,7 @@ describe "Sequel::Plugins::DefaultsSetter" do
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
it "should set default value upon initialization" do
|
|
18
|
-
@pr.call(2).new.
|
|
18
|
+
@pr.call(2).new.a.should == 2
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
it "should not mark the column as modified" do
|
|
@@ -23,11 +23,11 @@ describe "Sequel::Plugins::DefaultsSetter" do
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
it "should not set a default of nil" do
|
|
26
|
-
@pr.call(nil).new.
|
|
26
|
+
@pr.call(nil).new.class.default_values.should == {}
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
it "should set a default of false" do
|
|
30
|
-
@pr.call(false).new.
|
|
30
|
+
@pr.call(false).new.a.should == false
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
it "should handle Sequel::CURRENT_DATE default by using the current Date" do
|
|
@@ -49,12 +49,12 @@ describe "Sequel::Plugins::DefaultsSetter" do
|
|
|
49
49
|
|
|
50
50
|
it "should not override a given value" do
|
|
51
51
|
@pr.call(2)
|
|
52
|
-
@c.new('a'=>3).
|
|
53
|
-
@c.new('a'=>nil).
|
|
52
|
+
@c.new('a'=>3).a.should == 3
|
|
53
|
+
@c.new('a'=>nil).a.should == nil
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
it "should work correctly when subclassing" do
|
|
57
|
-
Class.new(@pr.call(2)).new.
|
|
57
|
+
Class.new(@pr.call(2)).new.a.should == 2
|
|
58
58
|
end
|
|
59
59
|
|
|
60
60
|
it "should contain the default values in default_values" do
|
|
@@ -65,19 +65,19 @@ describe "Sequel::Plugins::DefaultsSetter" do
|
|
|
65
65
|
it "should allow modifications of default values" do
|
|
66
66
|
@pr.call(2)
|
|
67
67
|
@c.default_values[:a] = 3
|
|
68
|
-
@c.new.
|
|
68
|
+
@c.new.a.should == 3
|
|
69
69
|
end
|
|
70
70
|
|
|
71
71
|
it "should allow proc default values" do
|
|
72
72
|
@pr.call(2)
|
|
73
73
|
@c.default_values[:a] = proc{3}
|
|
74
|
-
@c.new.
|
|
74
|
+
@c.new.a.should == 3
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
it "should have procs that set default values set them to nil" do
|
|
78
78
|
@pr.call(2)
|
|
79
79
|
@c.default_values[:a] = proc{nil}
|
|
80
|
-
@c.new.
|
|
80
|
+
@c.new.a.should == nil
|
|
81
81
|
end
|
|
82
82
|
|
|
83
83
|
it "should work correctly on a model without a dataset" do
|
|
@@ -88,11 +88,6 @@ describe "Sequel::Plugins::Dirty" do
|
|
|
88
88
|
@o.values.has_key?(:missing_changed).should == false
|
|
89
89
|
end
|
|
90
90
|
|
|
91
|
-
it "set_values should clear the cached initial values" do
|
|
92
|
-
@o.set_values(:id=>1)
|
|
93
|
-
@o.column_changes.should == {}
|
|
94
|
-
end
|
|
95
|
-
|
|
96
91
|
it "refresh should clear the cached initial values" do
|
|
97
92
|
@o.refresh
|
|
98
93
|
@o.column_changes.should == {}
|
|
@@ -83,7 +83,7 @@ describe "force_encoding plugin" do
|
|
|
83
83
|
|
|
84
84
|
specify "should work when saving new model instances" do
|
|
85
85
|
o = @c.new
|
|
86
|
-
ds =
|
|
86
|
+
ds = DB[:a]
|
|
87
87
|
def ds.first
|
|
88
88
|
s = 'blah'
|
|
89
89
|
s.force_encoding('US-ASCII')
|
|
@@ -97,7 +97,7 @@ describe "force_encoding plugin" do
|
|
|
97
97
|
|
|
98
98
|
specify "should work when refreshing model instances" do
|
|
99
99
|
o = @c.load(:id=>1, :x=>'as')
|
|
100
|
-
ds =
|
|
100
|
+
ds = DB[:a]
|
|
101
101
|
def ds.first
|
|
102
102
|
s = 'blah'
|
|
103
103
|
s.force_encoding('US-ASCII')
|
|
@@ -108,22 +108,6 @@ describe "force_encoding plugin" do
|
|
|
108
108
|
o.x.should == 'blah'
|
|
109
109
|
o.x.encoding.should == @e1
|
|
110
110
|
end
|
|
111
|
-
|
|
112
|
-
specify "should work when used with the identity_map plugin if the identity_map plugin is setup first" do
|
|
113
|
-
@c = Class.new(Sequel::Model) do
|
|
114
|
-
end
|
|
115
|
-
@c.columns :id, :x
|
|
116
|
-
@c.plugin :identity_map
|
|
117
|
-
@c.plugin :force_encoding, 'UTF-8'
|
|
118
|
-
@c.with_identity_map do
|
|
119
|
-
o = @c.load(:id=>1)
|
|
120
|
-
s = 'blah'
|
|
121
|
-
s.force_encoding('US-ASCII')
|
|
122
|
-
@c.load(:id=>1, :x=>s)
|
|
123
|
-
o.x.should == 'blah'
|
|
124
|
-
o.x.encoding.should == @e1
|
|
125
|
-
end
|
|
126
|
-
end
|
|
127
111
|
end
|
|
128
112
|
else
|
|
129
113
|
skip_warn "force_encoding plugin: only works on ruby 1.9+"
|
|
@@ -9,8 +9,16 @@ describe "hash_aliases extension" do
|
|
|
9
9
|
@ds.from(:a=>:b).sql.should == "SELECT * FROM a AS b"
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
+
it "should not affect other arguments to from" do
|
|
13
|
+
@ds.from(:a, :b).sql.should == "SELECT * FROM a, b"
|
|
14
|
+
end
|
|
15
|
+
|
|
12
16
|
it "should make select treat hash arguments as alias specifiers" do
|
|
13
17
|
@ds.select(:a=>:b).sql.should == "SELECT a AS b"
|
|
14
18
|
@ds.select{{:a=>:b}}.sql.should == "SELECT a AS b"
|
|
15
19
|
end
|
|
20
|
+
|
|
21
|
+
it "should not affect other arguments to select" do
|
|
22
|
+
@ds.select(:a, :b).sql.should == "SELECT a, b"
|
|
23
|
+
end
|
|
16
24
|
end
|
|
@@ -9,7 +9,7 @@ end
|
|
|
9
9
|
|
|
10
10
|
describe Sequel::Model, "hook_class_methods plugin" do
|
|
11
11
|
before do
|
|
12
|
-
|
|
12
|
+
DB.reset
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
specify "should be definable using a block" do
|
|
@@ -164,165 +164,146 @@ describe Sequel::Model, "hook_class_methods plugin" do
|
|
|
164
164
|
end
|
|
165
165
|
end
|
|
166
166
|
|
|
167
|
-
describe "Model#after_initialize" do
|
|
168
|
-
qspecify "should be called after initialization" do
|
|
169
|
-
values1 = nil
|
|
170
|
-
reached_after_initialized = false
|
|
171
|
-
|
|
172
|
-
a = model_class.call Sequel::Model do
|
|
173
|
-
columns :x, :y
|
|
174
|
-
after_initialize do
|
|
175
|
-
values1 = @values.clone
|
|
176
|
-
reached_after_initialized = true
|
|
177
|
-
end
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
a.new(:x => 1, :y => 2)
|
|
181
|
-
values1.should == {:x => 1, :y => 2}
|
|
182
|
-
reached_after_initialized.should == true
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
|
|
186
167
|
describe "Model#before_create && Model#after_create" do
|
|
187
168
|
before do
|
|
188
|
-
|
|
169
|
+
DB.reset
|
|
189
170
|
|
|
190
171
|
@c = model_class.call Sequel::Model(:items) do
|
|
191
172
|
columns :x
|
|
192
173
|
no_primary_key
|
|
193
174
|
|
|
194
|
-
after_create {
|
|
175
|
+
after_create {DB << "BLAH after"}
|
|
195
176
|
end
|
|
196
177
|
end
|
|
197
178
|
|
|
198
179
|
specify "should be called around new record creation" do
|
|
199
|
-
@c.before_create {
|
|
180
|
+
@c.before_create {DB << "BLAH before"}
|
|
200
181
|
@c.create(:x => 2)
|
|
201
|
-
|
|
182
|
+
DB.sqls.should == ['BLAH before', 'INSERT INTO items (x) VALUES (2)', 'BLAH after']
|
|
202
183
|
end
|
|
203
184
|
|
|
204
185
|
specify ".create should cancel the save and raise an error if before_create returns false and raise_on_save_failure is true" do
|
|
205
186
|
@c.before_create{false}
|
|
206
187
|
proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
|
|
207
188
|
proc{@c.create(:x => 2)}.should raise_error(Sequel::BeforeHookFailed)
|
|
208
|
-
|
|
189
|
+
DB.sqls.should == []
|
|
209
190
|
end
|
|
210
191
|
|
|
211
192
|
specify ".create should cancel the save and return nil if before_create returns false and raise_on_save_failure is false" do
|
|
212
193
|
@c.before_create{false}
|
|
213
194
|
@c.raise_on_save_failure = false
|
|
214
195
|
@c.create(:x => 2).should == nil
|
|
215
|
-
|
|
196
|
+
DB.sqls.should == []
|
|
216
197
|
end
|
|
217
198
|
end
|
|
218
199
|
|
|
219
200
|
describe "Model#before_update && Model#after_update" do
|
|
220
201
|
before do
|
|
221
|
-
|
|
202
|
+
DB.reset
|
|
222
203
|
|
|
223
204
|
@c = model_class.call(Sequel::Model(:items)) do
|
|
224
|
-
after_update {
|
|
205
|
+
after_update {DB << "BLAH after"}
|
|
225
206
|
end
|
|
226
207
|
end
|
|
227
208
|
|
|
228
209
|
specify "should be called around record update" do
|
|
229
|
-
@c.before_update {
|
|
210
|
+
@c.before_update {DB << "BLAH before"}
|
|
230
211
|
m = @c.load(:id => 2233, :x=>123)
|
|
231
212
|
m.save
|
|
232
|
-
|
|
213
|
+
DB.sqls.should == ['BLAH before', 'UPDATE items SET x = 123 WHERE (id = 2233)', 'BLAH after']
|
|
233
214
|
end
|
|
234
215
|
|
|
235
216
|
specify "#save should cancel the save and raise an error if before_update returns false and raise_on_save_failure is true" do
|
|
236
217
|
@c.before_update{false}
|
|
237
218
|
proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
|
|
238
219
|
proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
|
|
239
|
-
|
|
220
|
+
DB.sqls.should == []
|
|
240
221
|
end
|
|
241
222
|
|
|
242
223
|
specify "#save should cancel the save and return nil if before_update returns false and raise_on_save_failure is false" do
|
|
243
224
|
@c.before_update{false}
|
|
244
225
|
@c.raise_on_save_failure = false
|
|
245
226
|
@c.load(:id => 2233).save.should == nil
|
|
246
|
-
|
|
227
|
+
DB.sqls.should == []
|
|
247
228
|
end
|
|
248
229
|
end
|
|
249
230
|
|
|
250
231
|
describe "Model#before_save && Model#after_save" do
|
|
251
232
|
before do
|
|
252
|
-
|
|
233
|
+
DB.reset
|
|
253
234
|
|
|
254
235
|
@c = model_class.call(Sequel::Model(:items)) do
|
|
255
236
|
columns :x
|
|
256
|
-
after_save {
|
|
237
|
+
after_save {DB << "BLAH after"}
|
|
257
238
|
end
|
|
258
239
|
end
|
|
259
240
|
|
|
260
241
|
specify "should be called around record update" do
|
|
261
|
-
@c.before_save {
|
|
242
|
+
@c.before_save {DB << "BLAH before"}
|
|
262
243
|
m = @c.load(:id => 2233, :x=>123)
|
|
263
244
|
m.save
|
|
264
|
-
|
|
245
|
+
DB.sqls.should == ['BLAH before', 'UPDATE items SET x = 123 WHERE (id = 2233)', 'BLAH after']
|
|
265
246
|
end
|
|
266
247
|
|
|
267
248
|
specify "should be called around record creation" do
|
|
268
|
-
@c.before_save {
|
|
249
|
+
@c.before_save {DB << "BLAH before"}
|
|
269
250
|
@c.no_primary_key
|
|
270
251
|
@c.create(:x => 2)
|
|
271
|
-
|
|
252
|
+
DB.sqls.should == ['BLAH before', 'INSERT INTO items (x) VALUES (2)', 'BLAH after']
|
|
272
253
|
end
|
|
273
254
|
|
|
274
255
|
specify "#save should cancel the save and raise an error if before_save returns false and raise_on_save_failure is true" do
|
|
275
256
|
@c.before_save{false}
|
|
276
257
|
proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
|
|
277
258
|
proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
|
|
278
|
-
|
|
259
|
+
DB.sqls.should == []
|
|
279
260
|
end
|
|
280
261
|
|
|
281
262
|
specify "#save should cancel the save and return nil if before_save returns false and raise_on_save_failure is false" do
|
|
282
263
|
@c.before_save{false}
|
|
283
264
|
@c.raise_on_save_failure = false
|
|
284
265
|
@c.load(:id => 2233).save.should == nil
|
|
285
|
-
|
|
266
|
+
DB.sqls.should == []
|
|
286
267
|
end
|
|
287
268
|
end
|
|
288
269
|
|
|
289
270
|
describe "Model#before_destroy && Model#after_destroy" do
|
|
290
271
|
before do
|
|
291
|
-
|
|
272
|
+
DB.reset
|
|
292
273
|
|
|
293
274
|
@c = model_class.call(Sequel::Model(:items)) do
|
|
294
|
-
after_destroy {
|
|
275
|
+
after_destroy {DB << "BLAH after"}
|
|
295
276
|
end
|
|
296
277
|
end
|
|
297
278
|
|
|
298
279
|
specify "should be called around record destruction" do
|
|
299
|
-
@c.before_destroy {
|
|
280
|
+
@c.before_destroy {DB << "BLAH before"}
|
|
300
281
|
m = @c.load(:id => 2233)
|
|
301
282
|
m.destroy
|
|
302
|
-
|
|
283
|
+
DB.sqls.should == ['BLAH before', "DELETE FROM items WHERE id = 2233", 'BLAH after']
|
|
303
284
|
end
|
|
304
285
|
|
|
305
286
|
specify "#destroy should cancel the destroy and raise an error if before_destroy returns false and raise_on_save_failure is true" do
|
|
306
287
|
@c.before_destroy{false}
|
|
307
288
|
proc{@c.load(:id => 2233).destroy}.should raise_error(Sequel::BeforeHookFailed)
|
|
308
|
-
|
|
289
|
+
DB.sqls.should == []
|
|
309
290
|
end
|
|
310
291
|
|
|
311
292
|
specify "#destroy should cancel the destroy and return nil if before_destroy returns false and raise_on_save_failure is false" do
|
|
312
293
|
@c.before_destroy{false}
|
|
313
294
|
@c.raise_on_save_failure = false
|
|
314
295
|
@c.load(:id => 2233).destroy.should == nil
|
|
315
|
-
|
|
296
|
+
DB.sqls.should == []
|
|
316
297
|
end
|
|
317
298
|
end
|
|
318
299
|
|
|
319
300
|
describe "Model#before_validation && Model#after_validation" do
|
|
320
301
|
before do
|
|
321
|
-
|
|
302
|
+
DB.reset
|
|
322
303
|
|
|
323
304
|
@c = model_class.call(Sequel::Model(:items)) do
|
|
324
305
|
plugin :validation_class_methods
|
|
325
|
-
after_validation{
|
|
306
|
+
after_validation{DB << "BLAH after"}
|
|
326
307
|
|
|
327
308
|
def self.validate(o)
|
|
328
309
|
o.errors.add(:id, 'not valid') unless o[:id] == 2233
|
|
@@ -332,42 +313,42 @@ describe "Model#before_validation && Model#after_validation" do
|
|
|
332
313
|
end
|
|
333
314
|
|
|
334
315
|
specify "should be called around validation" do
|
|
335
|
-
@c.before_validation{
|
|
316
|
+
@c.before_validation{DB << "BLAH before"}
|
|
336
317
|
m = @c.load(:id => 2233)
|
|
337
318
|
m.should be_valid
|
|
338
|
-
|
|
319
|
+
DB.sqls.should == ['BLAH before', 'BLAH after']
|
|
339
320
|
|
|
340
|
-
|
|
321
|
+
DB.sqls.clear
|
|
341
322
|
m = @c.load(:id => 22)
|
|
342
323
|
m.should_not be_valid
|
|
343
|
-
|
|
324
|
+
DB.sqls.should == ['BLAH before', 'BLAH after']
|
|
344
325
|
end
|
|
345
326
|
|
|
346
327
|
specify "should be called when calling save" do
|
|
347
|
-
@c.before_validation{
|
|
328
|
+
@c.before_validation{DB << "BLAH before"}
|
|
348
329
|
m = @c.load(:id => 2233, :x=>123)
|
|
349
330
|
m.save.should == m
|
|
350
|
-
|
|
331
|
+
DB.sqls.should == ['BLAH before', 'BLAH after', 'UPDATE items SET x = 123 WHERE (id = 2233)']
|
|
351
332
|
|
|
352
|
-
|
|
333
|
+
DB.sqls.clear
|
|
353
334
|
m = @c.load(:id => 22)
|
|
354
335
|
m.raise_on_save_failure = false
|
|
355
336
|
m.save.should == nil
|
|
356
|
-
|
|
337
|
+
DB.sqls.should == ['BLAH before', 'BLAH after']
|
|
357
338
|
end
|
|
358
339
|
|
|
359
340
|
specify "#save should cancel the save and raise an error if before_validation returns false and raise_on_save_failure is true" do
|
|
360
341
|
@c.before_validation{false}
|
|
361
342
|
proc{@c.load(:id => 2233).save}.should_not raise_error(Sequel::ValidationFailed)
|
|
362
343
|
proc{@c.load(:id => 2233).save}.should raise_error(Sequel::BeforeHookFailed)
|
|
363
|
-
|
|
344
|
+
DB.sqls.should == []
|
|
364
345
|
end
|
|
365
346
|
|
|
366
347
|
specify "#save should cancel the save and return nil if before_validation returns false and raise_on_save_failure is false" do
|
|
367
348
|
@c.before_validation{false}
|
|
368
349
|
@c.raise_on_save_failure = false
|
|
369
350
|
@c.load(:id => 2233).save.should == nil
|
|
370
|
-
|
|
351
|
+
DB.sqls.should == []
|
|
371
352
|
end
|
|
372
353
|
end
|
|
373
354
|
|