sequel 2.11.0 → 2.12.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.
- data/CHANGELOG +168 -0
- data/README.rdoc +77 -95
- data/Rakefile +100 -80
- data/bin/sequel +2 -1
- data/doc/advanced_associations.rdoc +23 -32
- data/doc/cheat_sheet.rdoc +23 -40
- data/doc/dataset_filtering.rdoc +6 -6
- data/doc/prepared_statements.rdoc +22 -22
- data/doc/release_notes/2.12.0.txt +534 -0
- data/doc/schema.rdoc +3 -1
- data/doc/sharding.rdoc +8 -8
- data/doc/virtual_rows.rdoc +65 -0
- data/lib/sequel.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/ado.rb +3 -3
- data/lib/{sequel_core → sequel}/adapters/db2.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/dbi.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/do.rb +9 -5
- data/lib/{sequel_core → sequel}/adapters/do/mysql.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/do/postgres.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/do/sqlite.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/firebird.rb +84 -80
- data/lib/{sequel_core → sequel}/adapters/informix.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc.rb +21 -14
- data/lib/{sequel_core → sequel}/adapters/jdbc/h2.rb +14 -13
- data/lib/{sequel_core → sequel}/adapters/jdbc/mysql.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc/oracle.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc/postgresql.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/jdbc/sqlite.rb +1 -1
- data/lib/{sequel_core → sequel}/adapters/mysql.rb +60 -39
- data/lib/{sequel_core → sequel}/adapters/odbc.rb +8 -4
- data/lib/{sequel_core → sequel}/adapters/openbase.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/oracle.rb +38 -7
- data/lib/{sequel_core → sequel}/adapters/postgres.rb +24 -24
- data/lib/{sequel_core → sequel}/adapters/shared/mssql.rb +5 -5
- data/lib/{sequel_core → sequel}/adapters/shared/mysql.rb +126 -71
- data/lib/{sequel_core → sequel}/adapters/shared/oracle.rb +7 -10
- data/lib/{sequel_core → sequel}/adapters/shared/postgres.rb +159 -125
- data/lib/{sequel_core → sequel}/adapters/shared/progress.rb +1 -2
- data/lib/{sequel_core → sequel}/adapters/shared/sqlite.rb +72 -67
- data/lib/{sequel_core → sequel}/adapters/sqlite.rb +11 -7
- data/lib/{sequel_core → sequel}/adapters/utils/date_format.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/utils/stored_procedures.rb +0 -0
- data/lib/{sequel_core → sequel}/adapters/utils/unsupported.rb +19 -0
- data/lib/{sequel_core → sequel}/connection_pool.rb +7 -5
- data/lib/sequel/core.rb +221 -0
- data/lib/{sequel_core → sequel}/core_sql.rb +91 -49
- data/lib/{sequel_core → sequel}/database.rb +264 -149
- data/lib/{sequel_core/schema/generator.rb → sequel/database/schema_generator.rb} +6 -2
- data/lib/{sequel_core/database/schema.rb → sequel/database/schema_methods.rb} +12 -12
- data/lib/sequel/database/schema_sql.rb +224 -0
- data/lib/{sequel_core → sequel}/dataset.rb +78 -236
- data/lib/{sequel_core → sequel}/dataset/convenience.rb +99 -61
- data/lib/{sequel_core/object_graph.rb → sequel/dataset/graph.rb} +16 -14
- data/lib/{sequel_core → sequel}/dataset/prepared_statements.rb +1 -1
- data/lib/{sequel_core → sequel}/dataset/sql.rb +150 -99
- data/lib/sequel/deprecated.rb +593 -0
- data/lib/sequel/deprecated_migration.rb +91 -0
- data/lib/sequel/exceptions.rb +48 -0
- data/lib/sequel/extensions/blank.rb +42 -0
- data/lib/{sequel_model → sequel/extensions}/inflector.rb +8 -1
- data/lib/{sequel_core → sequel/extensions}/migration.rb +1 -1
- data/lib/{sequel_core/dataset → sequel/extensions}/pagination.rb +0 -0
- data/lib/{sequel_core → sequel/extensions}/pretty_table.rb +7 -0
- data/lib/{sequel_core/dataset → sequel/extensions}/query.rb +7 -0
- data/lib/sequel/extensions/string_date_time.rb +47 -0
- data/lib/sequel/metaprogramming.rb +43 -0
- data/lib/sequel/model.rb +110 -0
- data/lib/sequel/model/associations.rb +1300 -0
- data/lib/sequel/model/base.rb +937 -0
- data/lib/sequel/model/deprecated.rb +204 -0
- data/lib/sequel/model/deprecated_hooks.rb +103 -0
- data/lib/sequel/model/deprecated_inflector.rb +335 -0
- data/lib/sequel/model/deprecated_validations.rb +388 -0
- data/lib/sequel/model/errors.rb +39 -0
- data/lib/{sequel_model → sequel/model}/exceptions.rb +4 -4
- data/lib/sequel/model/inflections.rb +208 -0
- data/lib/sequel/model/plugins.rb +76 -0
- data/lib/sequel/plugins/caching.rb +122 -0
- data/lib/sequel/plugins/hook_class_methods.rb +122 -0
- data/lib/sequel/plugins/schema.rb +53 -0
- data/lib/sequel/plugins/serialization.rb +117 -0
- data/lib/sequel/plugins/single_table_inheritance.rb +63 -0
- data/lib/sequel/plugins/validation_class_methods.rb +384 -0
- data/lib/sequel/plugins/validation_helpers.rb +150 -0
- data/lib/{sequel_core → sequel}/sql.rb +125 -190
- data/lib/{sequel_core → sequel}/version.rb +2 -1
- data/lib/sequel_core.rb +1 -172
- data/lib/sequel_model.rb +1 -91
- data/spec/adapters/firebird_spec.rb +5 -5
- data/spec/adapters/informix_spec.rb +1 -1
- data/spec/adapters/mysql_spec.rb +128 -42
- data/spec/adapters/oracle_spec.rb +47 -19
- data/spec/adapters/postgres_spec.rb +64 -52
- data/spec/adapters/spec_helper.rb +1 -1
- data/spec/adapters/sqlite_spec.rb +12 -17
- data/spec/{sequel_core → core}/connection_pool_spec.rb +10 -10
- data/spec/{sequel_core → core}/core_ext_spec.rb +19 -19
- data/spec/{sequel_core → core}/core_sql_spec.rb +68 -71
- data/spec/{sequel_core → core}/database_spec.rb +135 -99
- data/spec/{sequel_core → core}/dataset_spec.rb +398 -242
- data/spec/{sequel_core → core}/expression_filters_spec.rb +13 -13
- data/spec/core/migration_spec.rb +263 -0
- data/spec/{sequel_core → core}/object_graph_spec.rb +10 -10
- data/spec/{sequel_core → core}/pretty_table_spec.rb +2 -2
- data/spec/{sequel_core → core}/schema_generator_spec.rb +0 -0
- data/spec/{sequel_core → core}/schema_spec.rb +8 -10
- data/spec/{sequel_core → core}/spec_helper.rb +29 -2
- data/spec/{sequel_core → core}/version_spec.rb +0 -0
- data/spec/extensions/blank_spec.rb +67 -0
- data/spec/extensions/caching_spec.rb +201 -0
- data/spec/{sequel_model/hooks_spec.rb → extensions/hook_class_methods_spec.rb} +8 -23
- data/spec/{sequel_model → extensions}/inflector_spec.rb +3 -0
- data/spec/{sequel_core → extensions}/migration_spec.rb +4 -4
- data/spec/extensions/pagination_spec.rb +99 -0
- data/spec/extensions/pretty_table_spec.rb +91 -0
- data/spec/extensions/query_spec.rb +85 -0
- data/spec/{sequel_model → extensions}/schema_spec.rb +22 -1
- data/spec/extensions/serialization_spec.rb +109 -0
- data/spec/extensions/single_table_inheritance_spec.rb +53 -0
- data/spec/{sequel_model → extensions}/spec_helper.rb +13 -4
- data/spec/extensions/string_date_time_spec.rb +93 -0
- data/spec/{sequel_model/validations_spec.rb → extensions/validation_class_methods_spec.rb} +15 -103
- data/spec/extensions/validation_helpers_spec.rb +291 -0
- data/spec/integration/dataset_test.rb +31 -0
- data/spec/integration/eager_loader_test.rb +17 -30
- data/spec/integration/schema_test.rb +8 -5
- data/spec/integration/spec_helper.rb +17 -0
- data/spec/integration/transaction_test.rb +68 -0
- data/spec/{sequel_model → model}/association_reflection_spec.rb +0 -0
- data/spec/{sequel_model → model}/associations_spec.rb +23 -10
- data/spec/{sequel_model → model}/base_spec.rb +29 -20
- data/spec/{sequel_model → model}/caching_spec.rb +16 -14
- data/spec/{sequel_model → model}/dataset_methods_spec.rb +0 -0
- data/spec/{sequel_model → model}/eager_loading_spec.rb +8 -8
- data/spec/model/hooks_spec.rb +472 -0
- data/spec/model/inflector_spec.rb +126 -0
- data/spec/{sequel_model → model}/model_spec.rb +25 -20
- data/spec/model/plugins_spec.rb +142 -0
- data/spec/{sequel_model → model}/record_spec.rb +121 -62
- data/spec/model/schema_spec.rb +92 -0
- data/spec/model/spec_helper.rb +124 -0
- data/spec/model/validations_spec.rb +1080 -0
- metadata +136 -107
- data/lib/sequel_core/core_ext.rb +0 -217
- data/lib/sequel_core/dataset/callback.rb +0 -13
- data/lib/sequel_core/dataset/schema.rb +0 -15
- data/lib/sequel_core/deprecated.rb +0 -26
- data/lib/sequel_core/exceptions.rb +0 -44
- data/lib/sequel_core/schema.rb +0 -2
- data/lib/sequel_core/schema/sql.rb +0 -325
- data/lib/sequel_model/association_reflection.rb +0 -267
- data/lib/sequel_model/associations.rb +0 -499
- data/lib/sequel_model/base.rb +0 -539
- data/lib/sequel_model/caching.rb +0 -82
- data/lib/sequel_model/dataset_methods.rb +0 -26
- data/lib/sequel_model/eager_loading.rb +0 -370
- data/lib/sequel_model/hooks.rb +0 -101
- data/lib/sequel_model/plugins.rb +0 -62
- data/lib/sequel_model/record.rb +0 -568
- data/lib/sequel_model/schema.rb +0 -49
- data/lib/sequel_model/validations.rb +0 -429
- data/spec/sequel_model/plugins_spec.rb +0 -80
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), 'spec_helper')
|
|
2
|
+
|
|
3
|
+
describe String do
|
|
4
|
+
deprec_specify "#camelize and #camelcase should transform the word to CamelCase" do
|
|
5
|
+
"egg_and_hams".camelize.should == "EggAndHams"
|
|
6
|
+
"egg_and_hams".camelize(false).should == "eggAndHams"
|
|
7
|
+
"post".camelize.should == "Post"
|
|
8
|
+
"post".camelcase.should == "Post"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
deprec_specify "#constantize should eval the string to get a constant" do
|
|
12
|
+
"String".constantize.should == String
|
|
13
|
+
"String::Inflections".constantize.should == String::Inflections
|
|
14
|
+
proc{"BKSDDF".constantize}.should raise_error
|
|
15
|
+
proc{"++A++".constantize}.should raise_error
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
deprec_specify "#dasherize should transform underscores to dashes" do
|
|
19
|
+
"egg_and_hams".dasherize.should == "egg-and-hams"
|
|
20
|
+
"post".dasherize.should == "post"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
deprec_specify "#demodulize should remove any preceding modules" do
|
|
24
|
+
"String::Inflections::Blah".demodulize.should == "Blah"
|
|
25
|
+
"String::Inflections".demodulize.should == "Inflections"
|
|
26
|
+
"String".demodulize.should == "String"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
deprec_specify "#humanize should remove _i, transform underscore to spaces, and capitalize" do
|
|
30
|
+
"egg_and_hams".humanize.should == "Egg and hams"
|
|
31
|
+
"post".humanize.should == "Post"
|
|
32
|
+
"post_id".humanize.should == "Post"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
deprec_specify "#titleize and #titlecase should underscore, humanize, and capitalize all words" do
|
|
36
|
+
"egg-and: hams".titleize.should == "Egg And: Hams"
|
|
37
|
+
"post".titleize.should == "Post"
|
|
38
|
+
"post".titlecase.should == "Post"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
deprec_specify "#underscore should add underscores between CamelCased words, change :: to / and - to _, and downcase" do
|
|
42
|
+
"EggAndHams".underscore.should == "egg_and_hams"
|
|
43
|
+
"EGGAndHams".underscore.should == "egg_and_hams"
|
|
44
|
+
"Egg::And::Hams".underscore.should == "egg/and/hams"
|
|
45
|
+
"post".underscore.should == "post"
|
|
46
|
+
"post-id".underscore.should == "post_id"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
deprec_specify "#pluralize should transform words from singular to plural" do
|
|
50
|
+
"post".pluralize.should == "posts"
|
|
51
|
+
"octopus".pluralize.should =="octopi"
|
|
52
|
+
"the blue mailman".pluralize.should == "the blue mailmen"
|
|
53
|
+
"CamelOctopus".pluralize.should == "CamelOctopi"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
deprec_specify "#singularize should transform words from plural to singular" do
|
|
57
|
+
"posts".singularize.should == "post"
|
|
58
|
+
"octopi".singularize.should == "octopus"
|
|
59
|
+
"the blue mailmen".singularize.should == "the blue mailman"
|
|
60
|
+
"CamelOctopi".singularize.should == "CamelOctopus"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
deprec_specify "#tableize should transform class names to table names" do
|
|
64
|
+
"RawScaledScorer".tableize.should == "raw_scaled_scorers"
|
|
65
|
+
"egg_and_ham".tableize.should == "egg_and_hams"
|
|
66
|
+
"fancyCategory".tableize.should == "fancy_categories"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
deprec_specify "#classify should tranform table names to class names" do
|
|
70
|
+
"egg_and_hams".classify.should == "EggAndHam"
|
|
71
|
+
"post".classify.should == "Post"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
deprec_specify "#foreign_key should create a foreign key name from a class name" do
|
|
75
|
+
"Message".foreign_key.should == "message_id"
|
|
76
|
+
"Message".foreign_key(false).should == "messageid"
|
|
77
|
+
"Admin::Post".foreign_key.should == "post_id"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe String::Inflections do
|
|
82
|
+
before do
|
|
83
|
+
deprec do
|
|
84
|
+
@plurals, @singulars, @uncountables = String.inflections.plurals.dup, String.inflections.singulars.dup, String.inflections.uncountables.dup
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
after do
|
|
88
|
+
deprec do
|
|
89
|
+
String.inflections.plurals.replace(@plurals)
|
|
90
|
+
String.inflections.singulars.replace(@singulars)
|
|
91
|
+
String.inflections.uncountables.replace(@uncountables)
|
|
92
|
+
Sequel.inflections.plurals.replace(@plurals)
|
|
93
|
+
Sequel.inflections.singulars.replace(@singulars)
|
|
94
|
+
Sequel.inflections.uncountables.replace(@uncountables)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
deprec_specify "should be possible to clear the list of singulars, plurals, and uncountables" do
|
|
99
|
+
String.inflections.clear(:plurals)
|
|
100
|
+
String.inflections.plurals.should == []
|
|
101
|
+
String.inflections.plural('blah', 'blahs')
|
|
102
|
+
String.inflections.clear
|
|
103
|
+
String.inflections.plurals.should == []
|
|
104
|
+
String.inflections.singulars.should == []
|
|
105
|
+
String.inflections.uncountables.should == []
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
deprec_specify "should be able to specify new inflection rules" do
|
|
109
|
+
String.inflections do |i|
|
|
110
|
+
i.plural(/xx$/i, 'xxx')
|
|
111
|
+
i.singular(/ttt$/i, 'tt')
|
|
112
|
+
i.irregular('yy', 'yyy')
|
|
113
|
+
i.uncountable(%w'zz')
|
|
114
|
+
end
|
|
115
|
+
'roxx'.pluralize.should == 'roxxx'
|
|
116
|
+
'rottt'.singularize.should == 'rott'
|
|
117
|
+
'yy'.pluralize.should == 'yyy'
|
|
118
|
+
'yyy'.singularize.should == 'yy'
|
|
119
|
+
'zz'.pluralize.should == 'zz'
|
|
120
|
+
'zz'.singularize.should == 'zz'
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
deprec_specify "should be yielded and returned by String.inflections" do
|
|
124
|
+
String.inflections{|i| i.should == String::Inflections}.should == String::Inflections
|
|
125
|
+
end
|
|
126
|
+
end
|
|
@@ -64,7 +64,7 @@ describe Sequel::Model, "dataset & schema" do
|
|
|
64
64
|
ds.should respond_to(:destroy)
|
|
65
65
|
end
|
|
66
66
|
|
|
67
|
-
|
|
67
|
+
deprec_specify "sets schema with implicit table name" do
|
|
68
68
|
@model.set_schema do
|
|
69
69
|
primary_key :ssn, :string
|
|
70
70
|
end
|
|
@@ -72,7 +72,7 @@ describe Sequel::Model, "dataset & schema" do
|
|
|
72
72
|
@model.table_name.should == :items
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
|
|
75
|
+
deprec_specify "sets schema with explicit table name" do
|
|
76
76
|
@model.set_schema :foo do
|
|
77
77
|
primary_key :id
|
|
78
78
|
end
|
|
@@ -93,10 +93,12 @@ end
|
|
|
93
93
|
|
|
94
94
|
describe Sequel::Model, "#sti_key" do
|
|
95
95
|
before do
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
deprec do
|
|
97
|
+
class ::StiTest < Sequel::Model
|
|
98
|
+
def kind=(x); self[:kind] = x; end
|
|
99
|
+
def refresh; end
|
|
100
|
+
set_sti_key :kind
|
|
101
|
+
end
|
|
100
102
|
end
|
|
101
103
|
class ::StiTestSub1 < StiTest
|
|
102
104
|
end
|
|
@@ -106,7 +108,7 @@ describe Sequel::Model, "#sti_key" do
|
|
|
106
108
|
MODEL_DB.reset
|
|
107
109
|
end
|
|
108
110
|
|
|
109
|
-
|
|
111
|
+
deprec_specify "should return rows with the correct class based on the polymorphic_key value" do
|
|
110
112
|
def @ds.fetch_rows(sql)
|
|
111
113
|
yield({:kind=>'StiTest'})
|
|
112
114
|
yield({:kind=>'StiTestSub1'})
|
|
@@ -115,28 +117,28 @@ describe Sequel::Model, "#sti_key" do
|
|
|
115
117
|
StiTest.all.collect{|x| x.class}.should == [StiTest, StiTestSub1, StiTestSub2]
|
|
116
118
|
end
|
|
117
119
|
|
|
118
|
-
|
|
120
|
+
deprec_specify "should fallback to the main class if polymophic_key value is NULL" do
|
|
119
121
|
def @ds.fetch_rows(sql)
|
|
120
122
|
yield({:kind=>nil})
|
|
121
123
|
end
|
|
122
124
|
StiTest.all.collect{|x| x.class}.should == [StiTest]
|
|
123
125
|
end
|
|
124
126
|
|
|
125
|
-
|
|
127
|
+
deprec_specify "should fallback to the main class if the given class does not exist" do
|
|
126
128
|
def @ds.fetch_rows(sql)
|
|
127
129
|
yield({:kind=>'StiTestSub3'})
|
|
128
130
|
end
|
|
129
131
|
StiTest.all.collect{|x| x.class}.should == [StiTest]
|
|
130
132
|
end
|
|
131
133
|
|
|
132
|
-
|
|
134
|
+
deprec_specify "should add a before_create hook that sets the model class name for the key" do
|
|
133
135
|
StiTest.new.save
|
|
134
136
|
StiTestSub1.new.save
|
|
135
137
|
StiTestSub2.new.save
|
|
136
138
|
MODEL_DB.sqls.should == ["INSERT INTO sti_tests (kind) VALUES ('StiTest')", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub1')", "INSERT INTO sti_tests (kind) VALUES ('StiTestSub2')"]
|
|
137
139
|
end
|
|
138
140
|
|
|
139
|
-
|
|
141
|
+
deprec_specify "should add a filter to model datasets inside subclasses hook to only retreive objects with the matching key" do
|
|
140
142
|
StiTest.dataset.sql.should == "SELECT * FROM sti_tests"
|
|
141
143
|
StiTestSub1.dataset.sql.should == "SELECT * FROM sti_tests WHERE (kind = 'StiTestSub1')"
|
|
142
144
|
StiTestSub2.dataset.sql.should == "SELECT * FROM sti_tests WHERE (kind = 'StiTestSub2')"
|
|
@@ -233,6 +235,11 @@ describe Sequel::Model, ".subset" do
|
|
|
233
235
|
@c.new_only.pricey.sql.should == "SELECT * FROM items WHERE ((age < 'new') AND (price > 100))"
|
|
234
236
|
end
|
|
235
237
|
|
|
238
|
+
specify "should not override existing model methods" do
|
|
239
|
+
@c.meta_def(:active){true}
|
|
240
|
+
@c.subset(:active, :active)
|
|
241
|
+
@c.active.should == true
|
|
242
|
+
end
|
|
236
243
|
end
|
|
237
244
|
|
|
238
245
|
describe Sequel::Model, ".find" do
|
|
@@ -284,10 +291,9 @@ describe Sequel::Model, ".fetch" do
|
|
|
284
291
|
|
|
285
292
|
it "should return true for .empty? and not raise an error on empty selection" do
|
|
286
293
|
rows = @c.fetch("SELECT * FROM items WHERE FALSE")
|
|
287
|
-
@c.
|
|
294
|
+
@c.send(:define_method, :fetch_rows){|sql| yield({:count => 0})}
|
|
288
295
|
proc {rows.empty?}.should_not raise_error
|
|
289
296
|
end
|
|
290
|
-
|
|
291
297
|
end
|
|
292
298
|
|
|
293
299
|
describe Sequel::Model, ".find_or_create" do
|
|
@@ -332,7 +338,7 @@ describe Sequel::Model, ".delete_all" do
|
|
|
332
338
|
@c.dataset.meta_def(:delete) {MODEL_DB << delete_sql}
|
|
333
339
|
end
|
|
334
340
|
|
|
335
|
-
|
|
341
|
+
deprec_specify "should delete all records in the dataset" do
|
|
336
342
|
@c.delete_all
|
|
337
343
|
MODEL_DB.sqls.should == ["DELETE FROM items"]
|
|
338
344
|
end
|
|
@@ -350,13 +356,13 @@ describe Sequel::Model, ".destroy_all" do
|
|
|
350
356
|
@c.dataset.meta_def(:delete) {MODEL_DB << delete_sql}
|
|
351
357
|
end
|
|
352
358
|
|
|
353
|
-
|
|
359
|
+
deprec_specify "should delete all records in the dataset" do
|
|
354
360
|
@c.dataset.meta_def(:destroy) {MODEL_DB << "DESTROY this stuff"}
|
|
355
361
|
@c.destroy_all
|
|
356
362
|
MODEL_DB.sqls.should == ["DESTROY this stuff"]
|
|
357
363
|
end
|
|
358
364
|
|
|
359
|
-
|
|
365
|
+
deprec_specify "should call dataset.destroy" do
|
|
360
366
|
@c.dataset.should_receive(:destroy).and_return(true)
|
|
361
367
|
@c.destroy_all
|
|
362
368
|
end
|
|
@@ -511,7 +517,7 @@ describe Sequel::Model, ".[]" do
|
|
|
511
517
|
end
|
|
512
518
|
|
|
513
519
|
context "Model#inspect" do
|
|
514
|
-
|
|
520
|
+
before do
|
|
515
521
|
@o = Sequel::Model.load(:x => 333)
|
|
516
522
|
end
|
|
517
523
|
|
|
@@ -521,13 +527,12 @@ context "Model#inspect" do
|
|
|
521
527
|
end
|
|
522
528
|
|
|
523
529
|
context "Model.db_schema" do
|
|
524
|
-
|
|
530
|
+
before do
|
|
525
531
|
@c = Class.new(Sequel::Model(:items)) do
|
|
526
532
|
def self.columns; orig_columns; end
|
|
527
533
|
end
|
|
528
534
|
@dataset = Sequel::Dataset.new(nil).from(:items)
|
|
529
535
|
@dataset.meta_def(:db){@db ||= Sequel::Database.new}
|
|
530
|
-
def @dataset.set_model(blah); end
|
|
531
536
|
def @dataset.naked; self; end
|
|
532
537
|
def @dataset.columns; []; end
|
|
533
538
|
def @dataset.def_mutation_method(*names); end
|
|
@@ -579,7 +584,7 @@ context "Model.db_schema" do
|
|
|
579
584
|
end
|
|
580
585
|
|
|
581
586
|
context "Model.str_columns" do
|
|
582
|
-
|
|
587
|
+
deprec_specify "should return the columns as frozen strings" do
|
|
583
588
|
c = Class.new(Sequel::Model)
|
|
584
589
|
c.meta_def(:columns){[:a, :b]}
|
|
585
590
|
c.orig_str_columns.should == %w'a b'
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
require File.join(File.dirname(__FILE__), "spec_helper")
|
|
2
|
+
|
|
3
|
+
module Sequel::Plugins
|
|
4
|
+
|
|
5
|
+
module Timestamped
|
|
6
|
+
def self.apply(m, opts)
|
|
7
|
+
m.meta_def(:stamp_opts) {opts}
|
|
8
|
+
m.send(:define_method, :before_save){@values[:stamp] = Time.now}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
module InstanceMethods
|
|
12
|
+
def get_stamp(*args); @values[:stamp] end
|
|
13
|
+
def abc; timestamped_opts; end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
module ClassMethods
|
|
17
|
+
def deff; timestamped_opts; end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
module DatasetMethods
|
|
21
|
+
def ghi; timestamped_opts; end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe Sequel::Model, "using a plugin" do
|
|
28
|
+
|
|
29
|
+
it "should fail if the plugin is not found" do
|
|
30
|
+
proc do
|
|
31
|
+
c = Class.new(Sequel::Model)
|
|
32
|
+
c.class_eval do
|
|
33
|
+
plugin :something_or_other
|
|
34
|
+
end
|
|
35
|
+
end.should raise_error(LoadError)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should apply the plugin to the class" do
|
|
39
|
+
c = nil
|
|
40
|
+
proc do
|
|
41
|
+
c = Class.new(Sequel::Model)
|
|
42
|
+
c.class_eval do
|
|
43
|
+
set_dataset MODEL_DB[:items]
|
|
44
|
+
plugin :timestamped, :a => 1, :b => 2
|
|
45
|
+
end
|
|
46
|
+
end.should_not raise_error(LoadError)
|
|
47
|
+
|
|
48
|
+
c.should respond_to(:stamp_opts)
|
|
49
|
+
c.stamp_opts.should == {:a => 1, :b => 2}
|
|
50
|
+
|
|
51
|
+
# instance methods
|
|
52
|
+
m = c.new
|
|
53
|
+
m.should respond_to(:get_stamp)
|
|
54
|
+
m.should respond_to(:abc)
|
|
55
|
+
m.abc.should == {:a => 1, :b => 2}
|
|
56
|
+
t = Time.now
|
|
57
|
+
m[:stamp] = t
|
|
58
|
+
m.get_stamp.should == t
|
|
59
|
+
|
|
60
|
+
# class methods
|
|
61
|
+
c.should respond_to(:deff)
|
|
62
|
+
c.deff.should == {:a => 1, :b => 2}
|
|
63
|
+
|
|
64
|
+
# dataset methods
|
|
65
|
+
c.dataset.should respond_to(:ghi)
|
|
66
|
+
c.dataset.ghi.should == {:a => 1, :b => 2}
|
|
67
|
+
|
|
68
|
+
# dataset methods called on the class
|
|
69
|
+
c.should respond_to(:ghi)
|
|
70
|
+
c.ghi.should == {:a => 1, :b => 2}
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
deprec_specify "should have an .is alias" do
|
|
74
|
+
c = nil
|
|
75
|
+
proc do
|
|
76
|
+
c = Class.new(Sequel::Model)
|
|
77
|
+
c.class_eval do
|
|
78
|
+
set_dataset MODEL_DB[:items]
|
|
79
|
+
is :timestamped, :a => 1, :b => 2
|
|
80
|
+
end
|
|
81
|
+
end.should_not raise_error(LoadError)
|
|
82
|
+
|
|
83
|
+
c.should respond_to(:stamp_opts)
|
|
84
|
+
c.stamp_opts.should == {:a => 1, :b => 2}
|
|
85
|
+
|
|
86
|
+
# instance methods
|
|
87
|
+
m = c.new
|
|
88
|
+
m.should respond_to(:get_stamp)
|
|
89
|
+
m.should respond_to(:abc)
|
|
90
|
+
m.abc.should == {:a => 1, :b => 2}
|
|
91
|
+
t = Time.now
|
|
92
|
+
m[:stamp] = t
|
|
93
|
+
m.get_stamp.should == t
|
|
94
|
+
|
|
95
|
+
# class methods
|
|
96
|
+
c.should respond_to(:deff)
|
|
97
|
+
c.deff.should == {:a => 1, :b => 2}
|
|
98
|
+
|
|
99
|
+
# dataset methods
|
|
100
|
+
c.dataset.should respond_to(:ghi)
|
|
101
|
+
c.dataset.ghi.should == {:a => 1, :b => 2}
|
|
102
|
+
|
|
103
|
+
# dataset methods called on the class
|
|
104
|
+
c.should respond_to(:ghi)
|
|
105
|
+
c.ghi.should == {:a => 1, :b => 2}
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
deprec_specify "should have an .is_a alias" do
|
|
109
|
+
c = nil
|
|
110
|
+
proc do
|
|
111
|
+
c = Class.new(Sequel::Model)
|
|
112
|
+
c.class_eval do
|
|
113
|
+
set_dataset MODEL_DB[:items]
|
|
114
|
+
is_a :timestamped, :a => 1, :b => 2
|
|
115
|
+
end
|
|
116
|
+
end.should_not raise_error(LoadError)
|
|
117
|
+
|
|
118
|
+
c.should respond_to(:stamp_opts)
|
|
119
|
+
c.stamp_opts.should == {:a => 1, :b => 2}
|
|
120
|
+
|
|
121
|
+
# instance methods
|
|
122
|
+
m = c.new
|
|
123
|
+
m.should respond_to(:get_stamp)
|
|
124
|
+
m.should respond_to(:abc)
|
|
125
|
+
m.abc.should == {:a => 1, :b => 2}
|
|
126
|
+
t = Time.now
|
|
127
|
+
m[:stamp] = t
|
|
128
|
+
m.get_stamp.should == t
|
|
129
|
+
|
|
130
|
+
# class methods
|
|
131
|
+
c.should respond_to(:deff)
|
|
132
|
+
c.deff.should == {:a => 1, :b => 2}
|
|
133
|
+
|
|
134
|
+
# dataset methods
|
|
135
|
+
c.dataset.should respond_to(:ghi)
|
|
136
|
+
c.dataset.ghi.should == {:a => 1, :b => 2}
|
|
137
|
+
|
|
138
|
+
# dataset methods called on the class
|
|
139
|
+
c.should respond_to(:ghi)
|
|
140
|
+
c.ghi.should == {:a => 1, :b => 2}
|
|
141
|
+
end
|
|
142
|
+
end
|
|
@@ -3,11 +3,10 @@ require File.join(File.dirname(__FILE__), "spec_helper")
|
|
|
3
3
|
describe "Model#save" do
|
|
4
4
|
|
|
5
5
|
before(:each) do
|
|
6
|
-
MODEL_DB.reset
|
|
7
|
-
|
|
8
6
|
@c = Class.new(Sequel::Model(:items)) do
|
|
9
7
|
columns :id, :x, :y
|
|
10
8
|
end
|
|
9
|
+
MODEL_DB.reset
|
|
11
10
|
end
|
|
12
11
|
|
|
13
12
|
it "should insert a record for a new model instance" do
|
|
@@ -41,7 +40,6 @@ describe "Model#save" do
|
|
|
41
40
|
it "should update only the given columns if given" do
|
|
42
41
|
o = @c.load(:id => 3, :x => 1, :y => nil)
|
|
43
42
|
o.save(:y)
|
|
44
|
-
|
|
45
43
|
MODEL_DB.sqls.first.should == "UPDATE items SET y = NULL WHERE (id = 3)"
|
|
46
44
|
end
|
|
47
45
|
|
|
@@ -55,28 +53,83 @@ describe "Model#save" do
|
|
|
55
53
|
o.changed_columns.should == []
|
|
56
54
|
end
|
|
57
55
|
|
|
58
|
-
it "should
|
|
56
|
+
it "should store previous value of @new in @was_new and as well as the hash used for updating in @columns_updated until after hooks finish running" do
|
|
59
57
|
res = nil
|
|
60
|
-
@c.after_save
|
|
58
|
+
@c.send(:define_method, :after_save){ res = [@columns_updated, @was_new]}
|
|
61
59
|
o = @c.new(:x => 1, :y => nil)
|
|
62
60
|
o[:x] = 2
|
|
63
61
|
o.save
|
|
64
|
-
res.should == [
|
|
62
|
+
res.should == [nil, true]
|
|
63
|
+
o.after_save
|
|
64
|
+
res.should == [nil, nil]
|
|
65
65
|
|
|
66
66
|
res = nil
|
|
67
67
|
o = @c.load(:id => 23,:x => 1, :y => nil)
|
|
68
68
|
o[:x] = 2
|
|
69
69
|
o.save
|
|
70
|
-
res.should == [:x,
|
|
70
|
+
res.should == [{:id => 23,:x => 2, :y => nil}, nil]
|
|
71
|
+
o.after_save
|
|
72
|
+
res.should == [nil, nil]
|
|
71
73
|
|
|
72
74
|
res = nil
|
|
73
|
-
o = @c.load(:id => 23,:x =>
|
|
75
|
+
o = @c.load(:id => 23,:x => 2, :y => nil)
|
|
74
76
|
o[:x] = 2
|
|
75
77
|
o[:y] = 22
|
|
76
78
|
o.save(:x)
|
|
77
|
-
res.should == [:x
|
|
79
|
+
res.should == [{:x=>2},nil]
|
|
80
|
+
o.after_save
|
|
81
|
+
res.should == [nil, nil]
|
|
78
82
|
end
|
|
79
83
|
|
|
84
|
+
it "should use Model's save_in_transaction setting by default" do
|
|
85
|
+
@c.use_transactions = true
|
|
86
|
+
@c.load(:id => 3, :x => 1, :y => nil).save(:y)
|
|
87
|
+
MODEL_DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
|
|
88
|
+
MODEL_DB.reset
|
|
89
|
+
@c.use_transactions = false
|
|
90
|
+
@c.load(:id => 3, :x => 1, :y => nil).save(:y)
|
|
91
|
+
MODEL_DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
|
|
92
|
+
MODEL_DB.reset
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "should inherit Model's save_in_transaction setting" do
|
|
96
|
+
@c.use_transactions = true
|
|
97
|
+
Class.new(@c).load(:id => 3, :x => 1, :y => nil).save(:y)
|
|
98
|
+
MODEL_DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
|
|
99
|
+
MODEL_DB.reset
|
|
100
|
+
@c.use_transactions = false
|
|
101
|
+
Class.new(@c).load(:id => 3, :x => 1, :y => nil).save(:y)
|
|
102
|
+
MODEL_DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
|
|
103
|
+
MODEL_DB.reset
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it "should use object's save_in_transaction setting" do
|
|
107
|
+
o = @c.load(:id => 3, :x => 1, :y => nil)
|
|
108
|
+
o.use_transactions = false
|
|
109
|
+
@c.use_transactions = true
|
|
110
|
+
o.save(:y)
|
|
111
|
+
MODEL_DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
|
|
112
|
+
MODEL_DB.reset
|
|
113
|
+
o = @c.load(:id => 3, :x => 1, :y => nil)
|
|
114
|
+
o.use_transactions = true
|
|
115
|
+
@c.use_transactions = false
|
|
116
|
+
o.save(:y)
|
|
117
|
+
MODEL_DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
|
|
118
|
+
MODEL_DB.reset
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "should use :transaction option if given" do
|
|
122
|
+
o = @c.load(:id => 3, :x => 1, :y => nil)
|
|
123
|
+
o.use_transactions = true
|
|
124
|
+
o.save(:y, :transaction=>false)
|
|
125
|
+
MODEL_DB.sqls.should == ["UPDATE items SET y = NULL WHERE (id = 3)"]
|
|
126
|
+
MODEL_DB.reset
|
|
127
|
+
o = @c.load(:id => 3, :x => 1, :y => nil)
|
|
128
|
+
o.use_transactions = false
|
|
129
|
+
o.save(:y, :transaction=>true)
|
|
130
|
+
MODEL_DB.sqls.should == ["BEGIN", "UPDATE items SET y = NULL WHERE (id = 3)", "COMMIT"]
|
|
131
|
+
MODEL_DB.reset
|
|
132
|
+
end
|
|
80
133
|
end
|
|
81
134
|
|
|
82
135
|
describe "Model#save_changes" do
|
|
@@ -142,7 +195,7 @@ describe "Model#save_changes" do
|
|
|
142
195
|
|
|
143
196
|
it "should update columns changed in a before_update hook" do
|
|
144
197
|
o = @c.load(:id => 3, :x => 1, :y => nil)
|
|
145
|
-
@c.before_update{self.x += 1}
|
|
198
|
+
@c.send(:define_method, :before_update){self.x += 1}
|
|
146
199
|
o.save_changes
|
|
147
200
|
MODEL_DB.sqls.should == []
|
|
148
201
|
o.x = 2
|
|
@@ -159,7 +212,7 @@ describe "Model#save_changes" do
|
|
|
159
212
|
|
|
160
213
|
it "should update columns changed in a before_save hook" do
|
|
161
214
|
o = @c.load(:id => 3, :x => 1, :y => nil)
|
|
162
|
-
@c.
|
|
215
|
+
@c.send(:define_method, :before_update){self.x += 1}
|
|
163
216
|
o.save_changes
|
|
164
217
|
MODEL_DB.sqls.should == []
|
|
165
218
|
o.x = 2
|
|
@@ -185,20 +238,20 @@ describe "Model#update_values" do
|
|
|
185
238
|
end
|
|
186
239
|
end
|
|
187
240
|
|
|
188
|
-
|
|
241
|
+
deprec_specify "should generate an update statement" do
|
|
189
242
|
o = @c.new(:id => 1)
|
|
190
243
|
o.update_values(:x => 1)
|
|
191
244
|
MODEL_DB.sqls.first.should == "UPDATE items SET x = 1 WHERE (id = 1)"
|
|
192
245
|
end
|
|
193
246
|
|
|
194
|
-
|
|
247
|
+
deprec_specify "should update attribute values" do
|
|
195
248
|
o = @c.new(:id => 1)
|
|
196
249
|
o.x.should be_nil
|
|
197
250
|
o.update_values(:x => 1)
|
|
198
251
|
o.x.should == 1
|
|
199
252
|
end
|
|
200
253
|
|
|
201
|
-
|
|
254
|
+
deprec_specify "should support string keys" do
|
|
202
255
|
o = @c.new(:id => 1)
|
|
203
256
|
o.x.should be_nil
|
|
204
257
|
o.update_values('x' => 1)
|
|
@@ -217,27 +270,27 @@ describe "Model#set_values" do
|
|
|
217
270
|
end
|
|
218
271
|
end
|
|
219
272
|
|
|
220
|
-
|
|
273
|
+
deprec_specify "should not touch the database" do
|
|
221
274
|
o = @c.new(:id => 1)
|
|
222
275
|
o.set_values(:x => 1)
|
|
223
276
|
MODEL_DB.sqls.should == []
|
|
224
277
|
end
|
|
225
278
|
|
|
226
|
-
|
|
279
|
+
deprec_specify "should update attribute values" do
|
|
227
280
|
o = @c.new(:id => 1)
|
|
228
281
|
o.x.should be_nil
|
|
229
282
|
o.set_values(:x => 1)
|
|
230
283
|
o.x.should == 1
|
|
231
284
|
end
|
|
232
285
|
|
|
233
|
-
|
|
286
|
+
deprec_specify "should support string keys" do
|
|
234
287
|
o = @c.new(:id => 1)
|
|
235
288
|
o.x.should be_nil
|
|
236
289
|
o.set_values('x' => 1)
|
|
237
290
|
o.x.should == 1
|
|
238
291
|
end
|
|
239
292
|
|
|
240
|
-
|
|
293
|
+
deprec_specify "should raise an error if used with a non-String, non-Symbol key" do
|
|
241
294
|
proc{@c.new.set_values(1=>2)}.should raise_error(Sequel::Error)
|
|
242
295
|
end
|
|
243
296
|
end
|
|
@@ -435,7 +488,7 @@ describe Sequel::Model, "#set" do
|
|
|
435
488
|
end
|
|
436
489
|
|
|
437
490
|
it "should support virtual attributes" do
|
|
438
|
-
@c.
|
|
491
|
+
@c.send(:define_method, :blah=){|v| self.x = v}
|
|
439
492
|
@o1.set(:blah => 333)
|
|
440
493
|
@o1.values.should == {:x => 333}
|
|
441
494
|
MODEL_DB.sqls.should == []
|
|
@@ -453,19 +506,19 @@ describe Sequel::Model, "#set" do
|
|
|
453
506
|
MODEL_DB.sqls.should == []
|
|
454
507
|
end
|
|
455
508
|
|
|
456
|
-
|
|
509
|
+
deprec_specify "should be aliased as set_with_params" do
|
|
457
510
|
@o1.set_with_params(:x => 1, :z => 2)
|
|
458
511
|
@o1.values.should == {:x => 1}
|
|
459
512
|
MODEL_DB.sqls.should == []
|
|
460
513
|
end
|
|
461
514
|
|
|
462
515
|
it "should return self" do
|
|
463
|
-
returned_value = @o1.
|
|
516
|
+
returned_value = @o1.set(:x => 1, :z => 2)
|
|
464
517
|
returned_value.should == @o1
|
|
465
518
|
MODEL_DB.sqls.should == []
|
|
466
519
|
end
|
|
467
520
|
|
|
468
|
-
|
|
521
|
+
deprec_specify "should assume it is a column if no column information is present and the key is a symbol" do
|
|
469
522
|
@c.instance_variable_set(:@columns, nil)
|
|
470
523
|
o = @c.new.set(:x123=>1)
|
|
471
524
|
o[:x123].should == 1
|
|
@@ -496,7 +549,7 @@ describe Sequel::Model, "#update" do
|
|
|
496
549
|
end
|
|
497
550
|
|
|
498
551
|
it "should support virtual attributes" do
|
|
499
|
-
@c.
|
|
552
|
+
@c.send(:define_method, :blah=){|v| self.x = v}
|
|
500
553
|
@o1.update(:blah => 333)
|
|
501
554
|
MODEL_DB.sqls.first.should == "INSERT INTO items (x) VALUES (333)"
|
|
502
555
|
end
|
|
@@ -510,7 +563,7 @@ describe Sequel::Model, "#update" do
|
|
|
510
563
|
MODEL_DB.sqls.first.should == "UPDATE items SET y = 1 WHERE (id = 5)"
|
|
511
564
|
end
|
|
512
565
|
|
|
513
|
-
|
|
566
|
+
deprec_specify "should be aliased as update_with_params" do
|
|
514
567
|
@o1.update_with_params(:x => 1, :z => 2)
|
|
515
568
|
MODEL_DB.sqls.first.should == "INSERT INTO items (x) VALUES (1)"
|
|
516
569
|
end
|
|
@@ -589,19 +642,25 @@ describe Sequel::Model, "#destroy" do
|
|
|
589
642
|
end
|
|
590
643
|
|
|
591
644
|
it "should return self" do
|
|
592
|
-
@model.
|
|
593
|
-
@model.after_destroy{3}
|
|
645
|
+
@model.send(:define_method, :after_destroy){3}
|
|
594
646
|
@instance.destroy.should == @instance
|
|
595
647
|
end
|
|
596
648
|
|
|
597
|
-
it "should run within a transaction" do
|
|
649
|
+
it "should run within a transaction if use_transactions is true" do
|
|
650
|
+
@instance.use_transactions = true
|
|
598
651
|
@model.db.should_receive(:transaction)
|
|
599
652
|
@instance.destroy
|
|
600
653
|
end
|
|
601
654
|
|
|
655
|
+
it "should not run within a transaction if use_transactions is false" do
|
|
656
|
+
@instance.use_transactions = false
|
|
657
|
+
@model.db.should_not_receive(:transaction)
|
|
658
|
+
@instance.destroy
|
|
659
|
+
end
|
|
660
|
+
|
|
602
661
|
it "should run before_destroy and after_destroy hooks" do
|
|
603
|
-
@model.before_destroy
|
|
604
|
-
@model.after_destroy
|
|
662
|
+
@model.send(:define_method, :before_destroy){MODEL_DB.execute('before blah')}
|
|
663
|
+
@model.send(:define_method, :after_destroy){MODEL_DB.execute('after blah')}
|
|
605
664
|
@instance.destroy
|
|
606
665
|
|
|
607
666
|
MODEL_DB.sqls.should == [
|
|
@@ -630,7 +689,7 @@ describe Sequel::Model, "#exists?" do
|
|
|
630
689
|
end
|
|
631
690
|
|
|
632
691
|
describe Sequel::Model, "#each" do
|
|
633
|
-
|
|
692
|
+
before do
|
|
634
693
|
@model = Class.new(Sequel::Model(:items))
|
|
635
694
|
@model.columns :a, :b, :id
|
|
636
695
|
@m = @model.load(:a => 1, :b => 2, :id => 4444)
|
|
@@ -644,7 +703,7 @@ describe Sequel::Model, "#each" do
|
|
|
644
703
|
end
|
|
645
704
|
|
|
646
705
|
describe Sequel::Model, "#keys" do
|
|
647
|
-
|
|
706
|
+
before do
|
|
648
707
|
@model = Class.new(Sequel::Model(:items))
|
|
649
708
|
@model.columns :a, :b, :id
|
|
650
709
|
@m = @model.load(:a => 1, :b => 2, :id => 4444)
|
|
@@ -750,7 +809,7 @@ describe Sequel::Model, "#hash" do
|
|
|
750
809
|
end
|
|
751
810
|
|
|
752
811
|
describe Sequel::Model, "#initialize" do
|
|
753
|
-
|
|
812
|
+
before do
|
|
754
813
|
@c = Class.new(Sequel::Model) do
|
|
755
814
|
columns :id, :x
|
|
756
815
|
end
|
|
@@ -778,8 +837,8 @@ describe Sequel::Model, "#initialize" do
|
|
|
778
837
|
end
|
|
779
838
|
|
|
780
839
|
specify "should accept virtual attributes" do
|
|
781
|
-
@c.
|
|
782
|
-
@c.
|
|
840
|
+
@c.send(:define_method, :blah=){|x| @blah = x}
|
|
841
|
+
@c.send(:define_method, :blah){@blah}
|
|
783
842
|
|
|
784
843
|
m = @c.new(:x => 2, :blah => 3)
|
|
785
844
|
m.values.should == {:x => 2}
|
|
@@ -833,7 +892,7 @@ describe Sequel::Model, ".create" do
|
|
|
833
892
|
end
|
|
834
893
|
|
|
835
894
|
describe Sequel::Model, "#refresh" do
|
|
836
|
-
|
|
895
|
+
before do
|
|
837
896
|
MODEL_DB.reset
|
|
838
897
|
@c = Class.new(Sequel::Model(:items)) do
|
|
839
898
|
unrestrict_primary_key
|
|
@@ -872,14 +931,14 @@ describe Sequel::Model, "#refresh" do
|
|
|
872
931
|
end
|
|
873
932
|
|
|
874
933
|
describe Sequel::Model, "typecasting" do
|
|
875
|
-
|
|
934
|
+
before do
|
|
876
935
|
MODEL_DB.reset
|
|
877
936
|
@c = Class.new(Sequel::Model(:items)) do
|
|
878
937
|
columns :x
|
|
879
938
|
end
|
|
880
939
|
end
|
|
881
940
|
|
|
882
|
-
|
|
941
|
+
after do
|
|
883
942
|
Sequel.datetime_class = Time
|
|
884
943
|
end
|
|
885
944
|
|
|
@@ -891,7 +950,7 @@ describe Sequel::Model, "typecasting" do
|
|
|
891
950
|
m.x.should == '1'
|
|
892
951
|
end
|
|
893
952
|
|
|
894
|
-
|
|
953
|
+
deprec_specify "should not convert if serializing the field" do
|
|
895
954
|
@c.serialize :x
|
|
896
955
|
@c.instance_variable_set(:@db_schema, {:x=>{:type=>:string}})
|
|
897
956
|
m = @c.new
|
|
@@ -968,7 +1027,7 @@ describe Sequel::Model, "typecasting" do
|
|
|
968
1027
|
|
|
969
1028
|
specify "should raise an error if invalid data is used in an integer field" do
|
|
970
1029
|
@c.instance_variable_set(:@db_schema, {:x=>{:type=>:integer}})
|
|
971
|
-
proc{@c.new.x = 'a'}.should raise_error(Sequel::
|
|
1030
|
+
proc{@c.new.x = 'a'}.should raise_error(Sequel::InvalidValue)
|
|
972
1031
|
end
|
|
973
1032
|
|
|
974
1033
|
specify "should assign value if raise_on_typecast_failure is off and assigning invalid integer" do
|
|
@@ -992,7 +1051,7 @@ describe Sequel::Model, "typecasting" do
|
|
|
992
1051
|
|
|
993
1052
|
specify "should raise an error if invalid data is used in an float field" do
|
|
994
1053
|
@c.instance_variable_set(:@db_schema, {:x=>{:type=>:float}})
|
|
995
|
-
proc{@c.new.x = 'a'}.should raise_error(Sequel::
|
|
1054
|
+
proc{@c.new.x = 'a'}.should raise_error(Sequel::InvalidValue)
|
|
996
1055
|
end
|
|
997
1056
|
|
|
998
1057
|
specify "should assign value if raise_on_typecast_failure is off and assigning invalid float" do
|
|
@@ -1019,7 +1078,7 @@ describe Sequel::Model, "typecasting" do
|
|
|
1019
1078
|
|
|
1020
1079
|
specify "should raise an error if invalid data is used in an decimal field" do
|
|
1021
1080
|
@c.instance_variable_set(:@db_schema, {:x=>{:type=>:decimal}})
|
|
1022
|
-
proc{@c.new.x = Date.today}.should raise_error(Sequel::
|
|
1081
|
+
proc{@c.new.x = Date.today}.should raise_error(Sequel::InvalidValue)
|
|
1023
1082
|
end
|
|
1024
1083
|
|
|
1025
1084
|
specify "should assign value if raise_on_typecast_failure is off and assigning invalid decimal" do
|
|
@@ -1085,18 +1144,18 @@ describe Sequel::Model, "typecasting" do
|
|
|
1085
1144
|
y = Date.new(2007,10,21)
|
|
1086
1145
|
m.x = '2007-10-21'
|
|
1087
1146
|
m.x.should == y
|
|
1088
|
-
m.x = '2007-10-21'
|
|
1147
|
+
m.x = Date.parse('2007-10-21')
|
|
1089
1148
|
m.x.should == y
|
|
1090
|
-
m.x = '2007-10-21'
|
|
1149
|
+
m.x = Time.parse('2007-10-21')
|
|
1091
1150
|
m.x.should == y
|
|
1092
|
-
m.x = '2007-10-21'
|
|
1151
|
+
m.x = DateTime.parse('2007-10-21')
|
|
1093
1152
|
m.x.should == y
|
|
1094
1153
|
end
|
|
1095
1154
|
|
|
1096
1155
|
specify "should raise an error if invalid data is used in a date field" do
|
|
1097
1156
|
@c.instance_variable_set(:@db_schema, {:x=>{:type=>:date}})
|
|
1098
|
-
proc{@c.new.x = 'a'}.should raise_error(Sequel::
|
|
1099
|
-
proc{@c.new.x = 100}.should raise_error(Sequel::
|
|
1157
|
+
proc{@c.new.x = 'a'}.should raise_error(Sequel::InvalidValue)
|
|
1158
|
+
proc{@c.new.x = 100}.should raise_error(Sequel::InvalidValue)
|
|
1100
1159
|
end
|
|
1101
1160
|
|
|
1102
1161
|
specify "should assign value if raise_on_typecast_failure is off and assigning invalid date" do
|
|
@@ -1111,7 +1170,7 @@ describe Sequel::Model, "typecasting" do
|
|
|
1111
1170
|
@c.instance_variable_set(:@db_schema, {:x=>{:type=>:time}})
|
|
1112
1171
|
m = @c.new
|
|
1113
1172
|
x = '10:20:30'
|
|
1114
|
-
y = x
|
|
1173
|
+
y = Time.parse(x)
|
|
1115
1174
|
m.x = x
|
|
1116
1175
|
m.x.should == y
|
|
1117
1176
|
m.x = y
|
|
@@ -1122,8 +1181,8 @@ describe Sequel::Model, "typecasting" do
|
|
|
1122
1181
|
@c.instance_variable_set(:@db_schema, {:x=>{:type=>:time}})
|
|
1123
1182
|
proc{@c.new.x = '0000'}.should raise_error
|
|
1124
1183
|
proc{@c.new.x = 'a'}.should_not raise_error # Valid Time
|
|
1125
|
-
proc{@c.new.x = '2008-10-21'
|
|
1126
|
-
proc{@c.new.x = '2008-10-21'
|
|
1184
|
+
proc{@c.new.x = Date.parse('2008-10-21')}.should raise_error(Sequel::InvalidValue)
|
|
1185
|
+
proc{@c.new.x = DateTime.parse('2008-10-21')}.should raise_error(Sequel::InvalidValue)
|
|
1127
1186
|
end
|
|
1128
1187
|
|
|
1129
1188
|
specify "should assign value if raise_on_typecast_failure is off and assigning invalid time" do
|
|
@@ -1138,34 +1197,34 @@ describe Sequel::Model, "typecasting" do
|
|
|
1138
1197
|
@c.instance_variable_set(:@db_schema, {:x=>{:type=>:datetime}})
|
|
1139
1198
|
m = @c.new
|
|
1140
1199
|
x = '2007-10-21T10:20:30-07:00'
|
|
1141
|
-
y = x
|
|
1200
|
+
y = Time.parse(x)
|
|
1142
1201
|
m.x = x
|
|
1143
1202
|
m.x.should == y
|
|
1144
|
-
m.x = x
|
|
1203
|
+
m.x = DateTime.parse(x)
|
|
1145
1204
|
m.x.should == y
|
|
1146
|
-
m.x = x
|
|
1205
|
+
m.x = Time.parse(x)
|
|
1147
1206
|
m.x.should == y
|
|
1148
|
-
m.x = '2007-10-21'
|
|
1149
|
-
m.x.should == '2007-10-21'
|
|
1207
|
+
m.x = Date.parse('2007-10-21')
|
|
1208
|
+
m.x.should == Time.parse('2007-10-21')
|
|
1150
1209
|
Sequel.datetime_class = DateTime
|
|
1151
|
-
y = x
|
|
1210
|
+
y = DateTime.parse(x)
|
|
1152
1211
|
m.x = x
|
|
1153
1212
|
m.x.should == y
|
|
1154
|
-
m.x = x
|
|
1213
|
+
m.x = DateTime.parse(x)
|
|
1155
1214
|
m.x.should == y
|
|
1156
|
-
m.x = x
|
|
1215
|
+
m.x = Time.parse(x)
|
|
1157
1216
|
m.x.should == y
|
|
1158
|
-
m.x = '2007-10-21'
|
|
1159
|
-
m.x.should == '2007-10-21'
|
|
1217
|
+
m.x = Date.parse('2007-10-21')
|
|
1218
|
+
m.x.should == DateTime.parse('2007-10-21')
|
|
1160
1219
|
end
|
|
1161
1220
|
|
|
1162
1221
|
specify "should raise an error if invalid data is used in a datetime field" do
|
|
1163
1222
|
@c.instance_variable_set(:@db_schema, {:x=>{:type=>:datetime}})
|
|
1164
|
-
proc{@c.new.x = '0000'}.should raise_error(Sequel::
|
|
1223
|
+
proc{@c.new.x = '0000'}.should raise_error(Sequel::InvalidValue)
|
|
1165
1224
|
proc{@c.new.x = 'a'}.should_not raise_error # Valid Time
|
|
1166
1225
|
Sequel.datetime_class = DateTime
|
|
1167
|
-
proc{@c.new.x = '0000'}.should raise_error(Sequel::
|
|
1168
|
-
proc{@c.new.x = 'a'}.should raise_error(Sequel::
|
|
1226
|
+
proc{@c.new.x = '0000'}.should raise_error(Sequel::InvalidValue)
|
|
1227
|
+
proc{@c.new.x = 'a'}.should raise_error(Sequel::InvalidValue)
|
|
1169
1228
|
end
|
|
1170
1229
|
|
|
1171
1230
|
specify "should assign value if raise_on_typecast_failure is off and assigning invalid datetime" do
|