sequel 3.48.0 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
|