sequel 4.46.0 → 4.49.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.
Files changed (228) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +210 -0
  3. data/Rakefile +1 -1
  4. data/doc/advanced_associations.rdoc +1 -1
  5. data/doc/opening_databases.rdoc +3 -2
  6. data/doc/release_notes/4.47.0.txt +56 -0
  7. data/doc/release_notes/4.48.0.txt +293 -0
  8. data/doc/release_notes/4.49.0.txt +222 -0
  9. data/lib/sequel/adapters/ado/access.rb +2 -1
  10. data/lib/sequel/adapters/do/postgres.rb +5 -2
  11. data/lib/sequel/adapters/ibmdb.rb +30 -8
  12. data/lib/sequel/adapters/jdbc/as400.rb +1 -1
  13. data/lib/sequel/adapters/jdbc/db2.rb +12 -3
  14. data/lib/sequel/adapters/jdbc/derby.rb +4 -5
  15. data/lib/sequel/adapters/jdbc/h2.rb +10 -1
  16. data/lib/sequel/adapters/jdbc/oracle.rb +16 -2
  17. data/lib/sequel/adapters/jdbc/postgresql.rb +46 -20
  18. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +9 -7
  19. data/lib/sequel/adapters/jdbc/sqlserver.rb +20 -6
  20. data/lib/sequel/adapters/jdbc.rb +39 -23
  21. data/lib/sequel/adapters/mock.rb +27 -19
  22. data/lib/sequel/adapters/mysql.rb +17 -16
  23. data/lib/sequel/adapters/mysql2.rb +5 -6
  24. data/lib/sequel/adapters/oracle.rb +5 -9
  25. data/lib/sequel/adapters/postgres.rb +91 -103
  26. data/lib/sequel/adapters/shared/db2.rb +22 -6
  27. data/lib/sequel/adapters/shared/mssql.rb +5 -4
  28. data/lib/sequel/adapters/shared/mysql.rb +79 -25
  29. data/lib/sequel/adapters/shared/oracle.rb +26 -3
  30. data/lib/sequel/adapters/shared/postgres.rb +199 -95
  31. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  32. data/lib/sequel/adapters/shared/sqlite.rb +72 -82
  33. data/lib/sequel/adapters/sqlanywhere.rb +4 -1
  34. data/lib/sequel/adapters/sqlite.rb +5 -3
  35. data/lib/sequel/adapters/swift/postgres.rb +5 -2
  36. data/lib/sequel/adapters/tinytds.rb +0 -5
  37. data/lib/sequel/adapters/utils/mysql_mysql2.rb +1 -1
  38. data/lib/sequel/adapters/utils/pg_types.rb +2 -76
  39. data/lib/sequel/ast_transformer.rb +1 -1
  40. data/lib/sequel/connection_pool/sharded_single.rb +1 -1
  41. data/lib/sequel/connection_pool/sharded_threaded.rb +1 -1
  42. data/lib/sequel/connection_pool/single.rb +2 -2
  43. data/lib/sequel/connection_pool/threaded.rb +2 -2
  44. data/lib/sequel/connection_pool.rb +9 -2
  45. data/lib/sequel/core.rb +2 -2
  46. data/lib/sequel/database/connecting.rb +8 -8
  47. data/lib/sequel/database/dataset.rb +6 -3
  48. data/lib/sequel/database/dataset_defaults.rb +14 -1
  49. data/lib/sequel/database/misc.rb +1 -1
  50. data/lib/sequel/database/query.rb +3 -0
  51. data/lib/sequel/database/schema_methods.rb +1 -1
  52. data/lib/sequel/dataset/actions.rb +72 -10
  53. data/lib/sequel/dataset/dataset_module.rb +58 -0
  54. data/lib/sequel/dataset/graph.rb +1 -1
  55. data/lib/sequel/dataset/misc.rb +1 -0
  56. data/lib/sequel/dataset/prepared_statements.rb +3 -3
  57. data/lib/sequel/dataset/query.rb +22 -11
  58. data/lib/sequel/dataset.rb +1 -1
  59. data/lib/sequel/exceptions.rb +8 -0
  60. data/lib/sequel/extensions/_model_pg_row.rb +5 -2
  61. data/lib/sequel/extensions/core_extensions.rb +4 -1
  62. data/lib/sequel/extensions/current_datetime_timestamp.rb +2 -1
  63. data/lib/sequel/extensions/date_arithmetic.rb +1 -0
  64. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -3
  65. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +3 -0
  66. data/lib/sequel/extensions/filter_having.rb +2 -0
  67. data/lib/sequel/extensions/freeze_datasets.rb +2 -0
  68. data/lib/sequel/extensions/from_block.rb +1 -1
  69. data/lib/sequel/extensions/graph_each.rb +2 -2
  70. data/lib/sequel/extensions/hash_aliases.rb +2 -0
  71. data/lib/sequel/extensions/identifier_mangling.rb +0 -7
  72. data/lib/sequel/extensions/meta_def.rb +2 -0
  73. data/lib/sequel/extensions/migration.rb +11 -8
  74. data/lib/sequel/extensions/no_auto_literal_strings.rb +1 -1
  75. data/lib/sequel/extensions/null_dataset.rb +1 -0
  76. data/lib/sequel/extensions/pagination.rb +1 -1
  77. data/lib/sequel/extensions/pg_array.rb +207 -130
  78. data/lib/sequel/extensions/pg_hstore.rb +38 -20
  79. data/lib/sequel/extensions/pg_inet.rb +18 -6
  80. data/lib/sequel/extensions/pg_interval.rb +19 -12
  81. data/lib/sequel/extensions/pg_json.rb +25 -14
  82. data/lib/sequel/extensions/pg_json_ops.rb +2 -2
  83. data/lib/sequel/extensions/pg_range.rb +133 -100
  84. data/lib/sequel/extensions/pg_range_ops.rb +4 -3
  85. data/lib/sequel/extensions/pg_row.rb +68 -39
  86. data/lib/sequel/extensions/pg_row_ops.rb +11 -5
  87. data/lib/sequel/extensions/query_literals.rb +2 -0
  88. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +2 -0
  89. data/lib/sequel/extensions/s.rb +1 -1
  90. data/lib/sequel/extensions/schema_dumper.rb +29 -25
  91. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +3 -1
  92. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +83 -0
  93. data/lib/sequel/extensions/server_block.rb +32 -15
  94. data/lib/sequel/extensions/set_overrides.rb +2 -2
  95. data/lib/sequel/extensions/string_agg.rb +0 -1
  96. data/lib/sequel/extensions/symbol_aref.rb +0 -4
  97. data/lib/sequel/model/associations.rb +35 -7
  98. data/lib/sequel/model/base.rb +113 -87
  99. data/lib/sequel/model/dataset_module.rb +5 -43
  100. data/lib/sequel/model/errors.rb +2 -1
  101. data/lib/sequel/model/inflections.rb +17 -5
  102. data/lib/sequel/model.rb +26 -58
  103. data/lib/sequel/plugins/active_model.rb +2 -2
  104. data/lib/sequel/plugins/association_autoreloading.rb +2 -0
  105. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  106. data/lib/sequel/plugins/association_pks.rb +73 -46
  107. data/lib/sequel/plugins/association_proxies.rb +1 -1
  108. data/lib/sequel/plugins/auto_validations.rb +6 -2
  109. data/lib/sequel/plugins/boolean_readers.rb +2 -2
  110. data/lib/sequel/plugins/boolean_subsets.rb +1 -1
  111. data/lib/sequel/plugins/caching.rb +19 -13
  112. data/lib/sequel/plugins/class_table_inheritance.rb +24 -13
  113. data/lib/sequel/plugins/column_conflicts.rb +7 -2
  114. data/lib/sequel/plugins/column_select.rb +3 -3
  115. data/lib/sequel/plugins/composition.rb +2 -2
  116. data/lib/sequel/plugins/csv_serializer.rb +8 -8
  117. data/lib/sequel/plugins/dataset_associations.rb +25 -13
  118. data/lib/sequel/plugins/defaults_setter.rb +13 -1
  119. data/lib/sequel/plugins/eager_each.rb +1 -1
  120. data/lib/sequel/plugins/force_encoding.rb +2 -2
  121. data/lib/sequel/plugins/hook_class_methods.rb +9 -12
  122. data/lib/sequel/plugins/identifier_columns.rb +2 -0
  123. data/lib/sequel/plugins/instance_filters.rb +3 -1
  124. data/lib/sequel/plugins/instance_hooks.rb +17 -9
  125. data/lib/sequel/plugins/json_serializer.rb +19 -12
  126. data/lib/sequel/plugins/lazy_attributes.rb +8 -7
  127. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +2 -0
  128. data/lib/sequel/plugins/modification_detection.rb +3 -0
  129. data/lib/sequel/plugins/nested_attributes.rb +6 -2
  130. data/lib/sequel/plugins/pg_array_associations.rb +5 -0
  131. data/lib/sequel/plugins/pg_row.rb +4 -2
  132. data/lib/sequel/plugins/pg_typecast_on_load.rb +2 -0
  133. data/lib/sequel/plugins/prepared_statements.rb +1 -0
  134. data/lib/sequel/plugins/rcte_tree.rb +4 -24
  135. data/lib/sequel/plugins/serialization.rb +9 -15
  136. data/lib/sequel/plugins/single_table_inheritance.rb +8 -3
  137. data/lib/sequel/plugins/split_values.rb +6 -5
  138. data/lib/sequel/plugins/static_cache.rb +31 -25
  139. data/lib/sequel/plugins/subset_conditions.rb +3 -1
  140. data/lib/sequel/plugins/table_select.rb +1 -1
  141. data/lib/sequel/plugins/touch.rb +4 -2
  142. data/lib/sequel/plugins/validation_class_methods.rb +5 -6
  143. data/lib/sequel/plugins/validation_helpers.rb +14 -8
  144. data/lib/sequel/plugins/xml_serializer.rb +4 -4
  145. data/lib/sequel/sql.rb +18 -9
  146. data/lib/sequel/version.rb +1 -1
  147. data/spec/adapters/db2_spec.rb +115 -14
  148. data/spec/adapters/mssql_spec.rb +4 -4
  149. data/spec/adapters/mysql_spec.rb +83 -29
  150. data/spec/adapters/oracle_spec.rb +28 -24
  151. data/spec/adapters/postgres_spec.rb +40 -24
  152. data/spec/adapters/sqlanywhere_spec.rb +88 -86
  153. data/spec/adapters/sqlite_spec.rb +29 -24
  154. data/spec/bin_spec.rb +7 -1
  155. data/spec/core/connection_pool_spec.rb +45 -14
  156. data/spec/core/database_spec.rb +155 -0
  157. data/spec/core/dataset_spec.rb +219 -36
  158. data/spec/core/schema_spec.rb +16 -0
  159. data/spec/core/spec_helper.rb +1 -0
  160. data/spec/core_extensions_spec.rb +6 -2
  161. data/spec/extensions/active_model_spec.rb +1 -1
  162. data/spec/extensions/arbitrary_servers_spec.rb +1 -1
  163. data/spec/extensions/association_pks_spec.rb +34 -2
  164. data/spec/extensions/auto_literal_strings_spec.rb +5 -1
  165. data/spec/extensions/auto_validations_spec.rb +2 -0
  166. data/spec/extensions/boolean_readers_spec.rb +1 -1
  167. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  168. data/spec/extensions/class_table_inheritance_spec.rb +106 -19
  169. data/spec/extensions/column_conflicts_spec.rb +11 -0
  170. data/spec/extensions/column_select_spec.rb +1 -0
  171. data/spec/extensions/composition_spec.rb +13 -0
  172. data/spec/extensions/connection_validator_spec.rb +1 -1
  173. data/spec/extensions/dataset_associations_spec.rb +20 -8
  174. data/spec/extensions/defaults_setter_spec.rb +15 -1
  175. data/spec/extensions/filter_having_spec.rb +5 -3
  176. data/spec/extensions/hash_aliases_spec.rb +3 -1
  177. data/spec/extensions/identifier_columns_spec.rb +3 -1
  178. data/spec/extensions/implicit_subquery_spec.rb +4 -2
  179. data/spec/extensions/json_serializer_spec.rb +18 -0
  180. data/spec/extensions/lazy_attributes_spec.rb +3 -3
  181. data/spec/extensions/many_through_many_spec.rb +4 -4
  182. data/spec/extensions/meta_def_spec.rb +9 -0
  183. data/spec/extensions/migration_spec.rb +3 -3
  184. data/spec/extensions/nested_attributes_spec.rb +14 -3
  185. data/spec/extensions/no_auto_literal_strings_spec.rb +8 -4
  186. data/spec/extensions/null_dataset_spec.rb +1 -1
  187. data/spec/extensions/pg_array_associations_spec.rb +29 -18
  188. data/spec/extensions/pg_array_spec.rb +44 -25
  189. data/spec/extensions/pg_hstore_spec.rb +10 -0
  190. data/spec/extensions/pg_inet_spec.rb +26 -0
  191. data/spec/extensions/pg_interval_spec.rb +20 -0
  192. data/spec/extensions/pg_json_spec.rb +24 -0
  193. data/spec/extensions/pg_range_spec.rb +98 -14
  194. data/spec/extensions/pg_row_spec.rb +14 -4
  195. data/spec/extensions/pg_typecast_on_load_spec.rb +11 -9
  196. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  197. data/spec/extensions/query_literals_spec.rb +3 -1
  198. data/spec/extensions/schema_dumper_spec.rb +108 -94
  199. data/spec/extensions/sequel_3_dataset_methods_spec.rb +10 -6
  200. data/spec/extensions/sequel_4_dataset_methods_spec.rb +121 -0
  201. data/spec/extensions/serialization_spec.rb +1 -1
  202. data/spec/extensions/server_block_spec.rb +7 -0
  203. data/spec/extensions/single_table_inheritance_spec.rb +17 -1
  204. data/spec/extensions/spec_helper.rb +7 -1
  205. data/spec/extensions/static_cache_spec.rb +75 -24
  206. data/spec/extensions/string_agg_spec.rb +1 -1
  207. data/spec/extensions/touch_spec.rb +9 -0
  208. data/spec/extensions/validation_helpers_spec.rb +10 -5
  209. data/spec/extensions/whitelist_security_spec.rb +26 -0
  210. data/spec/integration/associations_test.rb +8 -0
  211. data/spec/integration/dataset_test.rb +45 -44
  212. data/spec/integration/model_test.rb +53 -4
  213. data/spec/integration/plugin_test.rb +28 -4
  214. data/spec/integration/prepared_statement_test.rb +3 -0
  215. data/spec/integration/schema_test.rb +21 -1
  216. data/spec/integration/transaction_test.rb +40 -40
  217. data/spec/model/association_reflection_spec.rb +43 -1
  218. data/spec/model/associations_spec.rb +29 -9
  219. data/spec/model/class_dataset_methods_spec.rb +20 -4
  220. data/spec/model/dataset_methods_spec.rb +12 -3
  221. data/spec/model/eager_loading_spec.rb +8 -8
  222. data/spec/model/model_spec.rb +45 -1
  223. data/spec/model/plugins_spec.rb +34 -0
  224. data/spec/model/record_spec.rb +1 -1
  225. data/spec/spec_config.rb +2 -0
  226. metadata +11 -4
  227. data/spec/adapters/firebird_spec.rb +0 -405
  228. data/spec/adapters/informix_spec.rb +0 -100
@@ -8,6 +8,13 @@ with_server_specs = shared_description do
8
8
  @db.sqls.must_equal ["SELECT * FROM t -- b"]
9
9
  end
10
10
 
11
+ it "should set the default server to use in the block" do
12
+ @db.with_server(:a, :b){@db[:t].all}
13
+ @db.sqls.must_equal ["SELECT * FROM t -- b"]
14
+ @db.with_server(:a, :b){@db[:t].insert}
15
+ @db.sqls.must_equal ["INSERT INTO t DEFAULT VALUES -- a"]
16
+ end
17
+
11
18
  it "should have no affect after the block" do
12
19
  @db.with_server(:a){@db[:t].all}
13
20
  @db.sqls.must_equal ["SELECT * FROM t -- a"]
@@ -19,6 +19,22 @@ describe Sequel::Model, "single table inheritance plugin" do
19
19
  Object.send(:remove_const, :StiTest)
20
20
  end
21
21
 
22
+ describe ".sti_load" do
23
+ it "should load instances of the correct type" do
24
+ StiTest.sti_load(:id => 3).must_be_instance_of StiTest
25
+ StiTest.sti_load(:id => 3, :kind => 'StiTestSub1').must_be_instance_of StiTestSub1
26
+ StiTest.sti_load(:id => 3, :kind => 'StiTestSub2').must_be_instance_of StiTestSub2
27
+ end
28
+ end
29
+
30
+ describe ".sti_class_from_sti_key" do
31
+ it "should load the correct subclass based on the key" do
32
+ StiTest.sti_class_from_sti_key('StiTest').must_equal StiTest
33
+ StiTest.sti_class_from_sti_key('StiTestSub1').must_equal StiTestSub1
34
+ StiTest.sti_class_from_sti_key('StiTestSub2').must_equal StiTestSub2
35
+ end
36
+ end
37
+
22
38
  it "should freeze sti metadata when freezing model class" do
23
39
  StiTest.freeze
24
40
  StiTest.sti_dataset.frozen?.must_equal true
@@ -90,7 +106,7 @@ describe Sequel::Model, "single table inheritance plugin" do
90
106
 
91
107
  it "should fallback to the main class if the sti_key field is empty or nil without calling constantize" do
92
108
  called = false
93
- StiTest.meta_def(:constantize) do |s|
109
+ def StiTest.constantize(s)
94
110
  called = true
95
111
  Object
96
112
  end
@@ -28,13 +28,19 @@ rescue LoadError
28
28
  nil
29
29
  end
30
30
 
31
- Sequel.extension :meta_def
32
31
  Sequel.extension :core_refinements if RUBY_VERSION >= '2.0.0' && RUBY_ENGINE == 'ruby'
33
32
 
34
33
  def skip_warn(s)
35
34
  warn "Skipping test of #{s}" if ENV["SKIPPED_TEST_WARN"]
36
35
  end
37
36
 
37
+ class Minitest::HooksSpec
38
+ # SEQUEL5: Replace with define_singleton_method
39
+ def meta_def(obj, name, &block)
40
+ (class << obj; self end).send(:define_method, name, &block)
41
+ end
42
+ end
43
+
38
44
  # SEQUEL5: Remove
39
45
  output = Sequel::Deprecation.output
40
46
  Sequel::Deprecation.output = nil
@@ -113,35 +113,58 @@ describe "Sequel::Plugins::StaticCache" do
113
113
  @c.all.must_equal [@c1, @c2]
114
114
  end
115
115
 
116
- it "should have to_hash without arguments run without a query" do
116
+ it "should have as_hash/to_hash without arguments run without a query" do
117
117
  a = @c.to_hash
118
118
  a.must_equal(1=>@c1, 2=>@c2)
119
119
  a[1].must_equal @c1
120
120
  a[2].must_equal @c2
121
+
122
+ a = @c.as_hash
123
+ a.must_equal(1=>@c1, 2=>@c2)
124
+ a[1].must_equal @c1
125
+ a[2].must_equal @c2
126
+ @db.sqls.must_equal []
127
+ end
128
+
129
+ it "should have as_hash handle :hash option" do
130
+ h = {}
131
+ a = @c.as_hash(nil, nil, :hash=>h)
132
+ a.must_be_same_as h
133
+ a.must_equal(1=>@c1, 2=>@c2)
134
+ a[1].must_equal @c1
135
+ a[2].must_equal @c2
136
+
137
+ h = {}
138
+ a = @c.as_hash(:id, nil, :hash=>h)
139
+ a.must_be_same_as h
140
+ a.must_equal(1=>@c1, 2=>@c2)
141
+ a[1].must_equal @c1
142
+ a[2].must_equal @c2
143
+
121
144
  @db.sqls.must_equal []
122
145
  end
123
146
 
124
- it "should have to_hash with arguments return results without a query" do
125
- a = @c.to_hash(:id)
147
+ it "should have as_hash with arguments return results without a query" do
148
+ a = @c.as_hash(:id)
126
149
  a.must_equal(1=>@c1, 2=>@c2)
127
150
  a[1].must_equal @c1
128
151
  a[2].must_equal @c2
129
152
 
130
- a = @c.to_hash([:id])
153
+ a = @c.as_hash([:id])
131
154
  a.must_equal([1]=>@c1, [2]=>@c2)
132
155
  a[[1]].must_equal @c1
133
156
  a[[2]].must_equal @c2
134
157
 
135
- @c.to_hash(:id, :id).must_equal(1=>1, 2=>2)
136
- @c.to_hash([:id], :id).must_equal([1]=>1, [2]=>2)
137
- @c.to_hash(:id, [:id]).must_equal(1=>[1], 2=>[2])
138
- @c.to_hash([:id], [:id]).must_equal([1]=>[1], [2]=>[2])
158
+ @c.as_hash(:id, :id).must_equal(1=>1, 2=>2)
159
+ @c.as_hash([:id], :id).must_equal([1]=>1, [2]=>2)
160
+ @c.as_hash(:id, [:id]).must_equal(1=>[1], 2=>[2])
161
+ @c.as_hash([:id], [:id]).must_equal([1]=>[1], [2]=>[2])
139
162
 
140
163
  @db.sqls.must_equal []
141
164
  end
142
165
 
143
- it "should have to_hash not return a frozen object" do
144
- @c.to_hash.frozen?.must_equal false
166
+ it "should have as_hash not return a frozen object" do
167
+ @c.as_hash.frozen?.must_equal false
145
168
  end
146
169
 
147
170
  it "should have to_hash_groups without arguments return the cached objects without a query" do
@@ -163,10 +186,38 @@ describe "Sequel::Plugins::StaticCache" do
163
186
  @db.sqls.must_equal []
164
187
  end
165
188
 
189
+ it "should have to_hash_groups handle :hash option" do
190
+ h = {}
191
+ a = @c.to_hash_groups(:id, nil, :hash=>h)
192
+ a.must_be_same_as h
193
+ a.must_equal(1=>[@c1], 2=>[@c2])
194
+ a[1].first.must_equal @c1
195
+ a[2].first.must_equal @c2
196
+ end
197
+
198
+ it "should have as_hash_groups without arguments return the cached objects without a query" do
199
+ a = @c.to_hash_groups(:id)
200
+ a.must_equal(1=>[@c1], 2=>[@c2])
201
+ a[1].first.must_equal @c1
202
+ a[2].first.must_equal @c2
203
+
204
+ a = @c.to_hash_groups([:id])
205
+ a.must_equal([1]=>[@c1], [2]=>[@c2])
206
+ a[[1]].first.must_equal @c1
207
+ a[[2]].first.must_equal @c2
208
+
209
+ @c.to_hash_groups(:id, :id).must_equal(1=>[1], 2=>[2])
210
+ @c.to_hash_groups([:id], :id).must_equal([1]=>[1], [2]=>[2])
211
+ @c.to_hash_groups(:id, [:id]).must_equal(1=>[[1]], 2=>[[2]])
212
+ @c.to_hash_groups([:id], [:id]).must_equal([1]=>[[1]], [2]=>[[2]])
213
+
214
+ @db.sqls.must_equal []
215
+ end
216
+
166
217
  it "subclasses should work correctly" do
167
218
  c = Class.new(@c)
168
219
  c.all.must_equal [c.load(:id=>1), c.load(:id=>2)]
169
- c.to_hash.must_equal(1=>c.load(:id=>1), 2=>c.load(:id=>2))
220
+ c.as_hash.must_equal(1=>c.load(:id=>1), 2=>c.load(:id=>2))
170
221
  @db.sqls.must_equal ['SELECT * FROM t']
171
222
  end
172
223
 
@@ -174,8 +225,8 @@ describe "Sequel::Plugins::StaticCache" do
174
225
  ds = @c.dataset.from(:t2).columns(:id).with_fetch(:id=>3)
175
226
  @c.dataset = ds
176
227
  @c.all.must_equal [@c.load(:id=>3)]
177
- @c.to_hash.must_equal(3=>@c.load(:id=>3))
178
- @c.to_hash[3].must_equal @c.all.first
228
+ @c.as_hash.must_equal(3=>@c.load(:id=>3))
229
+ @c.as_hash[3].must_equal @c.all.first
179
230
  @db.sqls.must_equal ['SELECT * FROM t2']
180
231
  end
181
232
  end
@@ -238,18 +289,18 @@ describe "Sequel::Plugins::StaticCache" do
238
289
  a.last.must_be_same_as(@c2)
239
290
  end
240
291
 
241
- it "should have to_hash without arguments use cached instances" do
242
- a = @c.to_hash
292
+ it "should have as_hash without arguments use cached instances" do
293
+ a = @c.as_hash
243
294
  a[1].must_be_same_as(@c1)
244
295
  a[2].must_be_same_as(@c2)
245
296
  end
246
297
 
247
- it "should have to_hash with arguments return cached instances" do
248
- a = @c.to_hash(:id)
298
+ it "should have as_hash with arguments return cached instances" do
299
+ a = @c.as_hash(:id)
249
300
  a[1].must_be_same_as(@c1)
250
301
  a[2].must_be_same_as(@c2)
251
302
 
252
- a = @c.to_hash([:id])
303
+ a = @c.as_hash([:id])
253
304
  a[[1]].must_be_same_as(@c1)
254
305
  a[[2]].must_be_same_as(@c2)
255
306
  end
@@ -313,16 +364,16 @@ describe "Sequel::Plugins::StaticCache" do
313
364
  @c.map.all?{|o| !o.frozen?}.must_equal true
314
365
  end
315
366
 
316
- it "none of values in the hash returned by to_hash without an argument should be frozen" do
317
- @c.to_hash.values.all?{|o| !o.frozen?}.must_equal true
367
+ it "none of values in the hash returned by as_hash without an argument should be frozen" do
368
+ @c.as_hash.values.all?{|o| !o.frozen?}.must_equal true
318
369
  end
319
370
 
320
- it "none of values in the hash returned by to_hash with a single argument should be frozen" do
321
- @c.to_hash(:id).values.all?{|o| !o.frozen?}.must_equal true
371
+ it "none of values in the hash returned by as_hash with a single argument should be frozen" do
372
+ @c.as_hash(:id).values.all?{|o| !o.frozen?}.must_equal true
322
373
  end
323
374
 
324
- it "none of values in the hash returned by to_hash with a single array argument should be frozen" do
325
- @c.to_hash([:id, :id]).values.all?{|o| !o.frozen?}.must_equal true
375
+ it "none of values in the hash returned by as_hash with a single array argument should be frozen" do
376
+ @c.as_hash([:id, :id]).values.all?{|o| !o.frozen?}.must_equal true
326
377
  end
327
378
 
328
379
  it "none of values in the hash returned by to_hash_groups with a single argument should be frozen" do
@@ -48,7 +48,7 @@ describe "string_agg extension" do
48
48
  it "should correctly literalize on MySQL, H2, HSQLDB" do
49
49
  [:mysql, :h2, :hsqldb].each do |type|
50
50
  db = dbf.call(type)
51
- db.meta_def(:database_type){type}
51
+ meta_def(db, :database_type){type}
52
52
  ds = db.dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
53
53
  ds.literal(@sa1).upcase.must_equal "GROUP_CONCAT(C SEPARATOR ',')"
54
54
  ds.literal(@sa2).upcase.must_equal "GROUP_CONCAT(C SEPARATOR '-')"
@@ -67,6 +67,15 @@ describe "Touch plugin" do
67
67
  "UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (albums.artist_id = 1)"]
68
68
  end
69
69
 
70
+ it "should clear associations after touching them :associations option" do
71
+ @Artist.plugin :touch, :associations=>:albums
72
+ @a.associations[:albums] = [@Album.call(:id=>1)]
73
+ @a.touch
74
+ @a.associations[:albums].must_be_nil
75
+ DB.sqls.must_equal ["UPDATE artists SET updated_at = CURRENT_TIMESTAMP WHERE (id = 1)",
76
+ "UPDATE albums SET updated_at = CURRENT_TIMESTAMP WHERE (albums.artist_id = 1)"]
77
+ end
78
+
70
79
  it "should be able to give an array to the :associations option specifying multiple associations" do
71
80
  @Album.plugin :touch, :associations=>[:artist, :followup_albums]
72
81
  @Album.load(:id=>4, :artist_id=>1).touch
@@ -18,6 +18,12 @@ describe "Sequel::Plugins::ValidationHelpers" do
18
18
  @m.wont_be :valid?
19
19
  @m.value = '1_1'
20
20
  @m.must_be :valid?
21
+ o = String.new
22
+ class << o
23
+ undef_method :blank?
24
+ end
25
+ @m.value = o
26
+ @m.must_be :valid?
21
27
  o = Object.new
22
28
  @m.value = o
23
29
  @m.wont_be :valid?
@@ -80,7 +86,7 @@ describe "Sequel::Plugins::ValidationHelpers" do
80
86
  @m.must_be :valid?
81
87
  end
82
88
 
83
- it "should support modifying default options for all models" do
89
+ deprecated "should support modifying default options for all models" do
84
90
  @c.set_validations{validates_presence(:value)}
85
91
  @m.wont_be :valid?
86
92
  @m.errors.must_equal(:value=>['is not present'])
@@ -98,7 +104,6 @@ describe "Sequel::Plugins::ValidationHelpers" do
98
104
  @m.wont_be :valid?
99
105
  @m.errors.must_equal(:value=>["was not entered"])
100
106
 
101
-
102
107
  c = Class.new(Sequel::Model)
103
108
  c.class_eval do
104
109
  plugin :validation_helpers
@@ -248,17 +253,17 @@ describe "Sequel::Plugins::ValidationHelpers" do
248
253
  @m.must_be :valid?
249
254
  @m.value = '123'
250
255
  @m.must_be :valid?
251
- @m.meta_def(:db_schema){{:value=>{:type=>:integer}}}
256
+ def @m.db_schema; {:value=>{:type=>:integer}} end
252
257
  @m.wont_be :valid?
253
258
  @m.errors.full_messages.must_equal ['value is not a valid integer']
254
259
 
255
260
  @c.set_validations{validates_schema_types(:value)}
256
- @m.meta_def(:db_schema){{:value=>{:type=>:integer}}}
261
+ def @m.db_schema; {:value=>{:type=>:integer}} end
257
262
  @m.wont_be :valid?
258
263
  @m.errors.full_messages.must_equal ['value is not a valid integer']
259
264
 
260
265
  @c.set_validations{validates_schema_types(:value, :message=>'is bad')}
261
- @m.meta_def(:db_schema){{:value=>{:type=>:integer}}}
266
+ def @m.db_schema; {:value=>{:type=>:integer}} end
262
267
  @m.wont_be :valid?
263
268
  @m.errors.full_messages.must_equal ['value is bad']
264
269
  end
@@ -64,6 +64,19 @@ describe Sequel::Model, "#(set|update)_(all|only)" do
64
64
  end
65
65
  end
66
66
 
67
+ describe Sequel::Model, "#(set|update)_(all|only) without set_allowed_columns" do
68
+ before do
69
+ @c = Class.new(Sequel::Model(:items)) do
70
+ set_primary_key :id
71
+ columns :x, :y, :z, :id
72
+ end
73
+ @c.plugin :whitelist_security
74
+ @c.strict_param_setting = false
75
+ @o1 = @c.new
76
+ DB.reset
77
+ end
78
+ end
79
+
67
80
  describe Sequel::Model, ".strict_param_setting" do
68
81
  before do
69
82
  @c = Class.new(Sequel::Model(:blahblah)) do
@@ -105,6 +118,19 @@ describe Sequel::Model, ".allowed_columns " do
105
118
  @c.allowed_columns.must_equal [:x, :y]
106
119
  end
107
120
 
121
+ it "should not change behavior if allowed_columns are not set" do
122
+ i = @c.new(:x => 1, :y => 2, :z => 3)
123
+ i.values.must_equal(:x => 1, :y => 2, :z => 3)
124
+ i.set(:x => 4, :y => 5, :z => 6)
125
+ i.values.must_equal(:x => 4, :y => 5, :z => 6)
126
+
127
+ @c.dataset = @c.dataset.with_fetch(:x => 7)
128
+ i = @c.new
129
+ i.update(:x => 7)
130
+ i.values.must_equal(:x => 7)
131
+ DB.sqls.must_equal ["INSERT INTO blahblah (x) VALUES (7)", "SELECT * FROM blahblah WHERE id = 10"]
132
+ end
133
+
108
134
  it "should only set allowed columns by default" do
109
135
  @c.set_allowed_columns :x, :y
110
136
  i = @c.new(:x => 1, :y => 2, :z => 3)
@@ -1621,6 +1621,7 @@ BasicRegularAndCompositeKeyAssociations = shared_description do
1621
1621
  Album.first_tags.all.must_equal []
1622
1622
  Artist.tags.all.must_equal []
1623
1623
  Artist.first_tags.all.must_equal []
1624
+ Tag.tags.all.must_equal []
1624
1625
  end
1625
1626
  Artist.albums.tags.all.must_equal []
1626
1627
 
@@ -1637,6 +1638,7 @@ BasicRegularAndCompositeKeyAssociations = shared_description do
1637
1638
  Album.first_tags.all.must_equal [@tag]
1638
1639
  Artist.tags.all.must_equal [@tag]
1639
1640
  Artist.first_tags.all.must_equal [@tag]
1641
+ Tag.tags.all.must_equal [@tag]
1640
1642
  end
1641
1643
  Artist.albums.tags.all.must_equal [@tag]
1642
1644
 
@@ -1652,6 +1654,7 @@ BasicRegularAndCompositeKeyAssociations = shared_description do
1652
1654
  Album.first_tags.order(:name).all.must_equal [@tag, tag]
1653
1655
  Artist.tags.order(:name).all.must_equal [@tag, tag]
1654
1656
  Artist.first_tags.order(:name).all.must_equal [@tag, tag]
1657
+ Tag.tags.order(:name).all.must_equal [@tag, tag]
1655
1658
  end
1656
1659
  Artist.albums.tags.order(:name).all.must_equal [@tag, tag]
1657
1660
 
@@ -1664,6 +1667,7 @@ BasicRegularAndCompositeKeyAssociations = shared_description do
1664
1667
  Album.filter(Album.qualified_primary_key_hash(album.pk)).first_tags.all.must_equal [tag]
1665
1668
  Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).tags.all.must_equal [tag]
1666
1669
  Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).first_tags.all.must_equal [tag]
1670
+ Tag.filter(Tag.qualified_primary_key_hash(tag.pk)).tags.all.must_equal [tag]
1667
1671
  end
1668
1672
  Artist.filter(Artist.qualified_primary_key_hash(artist.pk)).albums.tags.all.must_equal [tag]
1669
1673
 
@@ -1891,6 +1895,8 @@ describe "Sequel::Model Simple Associations" do
1891
1895
  class ::Tag < Sequel::Model(@db)
1892
1896
  plugin :dataset_associations
1893
1897
  many_to_many :albums
1898
+ plugin :many_through_many
1899
+ many_through_many :tags, [[:albums_tags, :tag_id, :album_id], [:albums, :id, :artist_id], [:albums, :artist_id, :id], [:albums_tags, :album_id, :tag_id]], :class=>:Tag
1894
1900
  end
1895
1901
  @album = Album.create(:name=>'Al')
1896
1902
  @artist = Artist.create(:name=>'Ar')
@@ -2184,6 +2190,8 @@ describe "Sequel::Model Composite Key Associations" do
2184
2190
  set_primary_key [:id1, :id2]
2185
2191
  unrestrict_primary_key
2186
2192
  many_to_many :albums, :right_key=>[:album_id1, :album_id2], :left_key=>[:tag_id1, :tag_id2]
2193
+ plugin :many_through_many
2194
+ many_through_many :tags, [[:albums_tags, [:tag_id1, :tag_id2], [:album_id1, :album_id2]], [:albums, [:id1, :id2], [:artist_id1, :artist_id2]], [:albums, [:artist_id1, :artist_id2], [:id1, :id2]], [:albums_tags, [:album_id1, :album_id2], [:tag_id1, :tag_id2]]], :class=>:Tag
2187
2195
  end
2188
2196
  @album = Album.create(:name=>'Al', :id1=>1, :id2=>2)
2189
2197
  @artist = Artist.create(:name=>'Ar', :id1=>3, :id2=>4)
@@ -15,8 +15,8 @@ describe "Simple Dataset operations" do
15
15
  end
16
16
 
17
17
  it "should support sequential primary keys" do
18
- @ds << {:number=>20}
19
- @ds << {:number=>30}
18
+ @ds.insert(:number=>20)
19
+ @ds.insert(:number=>30)
20
20
  @ds.order(:number).all.must_equal [
21
21
  {:id => 1, :number=>10},
22
22
  {:id => 2, :number=>20},
@@ -28,8 +28,8 @@ describe "Simple Dataset operations" do
28
28
  primary_key :id, :type=>:Bignum
29
29
  Integer :number
30
30
  end
31
- @ds << {:number=>20}
32
- @ds << {:number=>30}
31
+ @ds.insert(:number=>20)
32
+ @ds.insert(:number=>30)
33
33
  @ds.order(:number).all.must_equal [{:id => 1, :number=>20}, {:id => 2, :number=>30}]
34
34
  end
35
35
 
@@ -49,7 +49,7 @@ describe "Simple Dataset operations" do
49
49
  @ds.filter(:id=>2).first[:number].must_equal 20
50
50
  end
51
51
 
52
- it "should have insert_multiple return primary key values" do
52
+ deprecated "should have insert_multiple return primary key values" do
53
53
  @ds.extension(:sequel_3_dataset_methods).insert_multiple([{:number=>20}, {:number=>30}]).must_equal [2, 3]
54
54
  @ds.filter(:id=>2).get(:number).must_equal 20
55
55
  @ds.filter(:id=>3).get(:number).must_equal 30
@@ -60,7 +60,7 @@ describe "Simple Dataset operations" do
60
60
  end
61
61
 
62
62
  it "should handle LATERAL subqueries correctly" do
63
- @ds << {:number=>20}
63
+ @ds.insert(:number=>20)
64
64
  @ds.from(Sequel[:items].as(:i), @ds.where(Sequel[:items][:number]=>Sequel[:i][:number]).lateral).select_order_map([Sequel[:i][:number].as(:n), Sequel[:t1][:number]]).must_equal [[10, 10], [20, 20]]
65
65
  @ds.from(Sequel[:items].as(:i)).cross_join(@ds.where(Sequel[:items][:number]=>Sequel[:i][:number]).lateral).select_order_map([Sequel[:i][:number].as(:n), Sequel[:t1][:number]]).must_equal [[10, 10], [20, 20]]
66
66
  @ds.from(Sequel[:items].as(:i)).join(@ds.where(Sequel[:items][:number]=>Sequel[:i][:number]).lateral, 1=>1).select_order_map([Sequel[:i][:number].as(:n), Sequel[:t1][:number]]).must_equal [[10, 10], [20, 20]]
@@ -389,9 +389,9 @@ describe Sequel::Dataset do
389
389
 
390
390
  it "should return the correct record count" do
391
391
  @d.count.must_equal 0
392
- @d << {:name => 'abc', :value => 123}
393
- @d << {:name => 'abc', :value => 456}
394
- @d << {:name => 'def', :value => nil}
392
+ @d.insert(:name => 'abc', :value => 123)
393
+ @d.insert(:name => 'abc', :value => 456)
394
+ @d.insert(:name => 'def', :value => nil)
395
395
  5.times do
396
396
  @d.count.must_equal 3
397
397
  @d.count(:name).must_equal 3
@@ -400,14 +400,14 @@ describe Sequel::Dataset do
400
400
  end
401
401
 
402
402
  it "should handle functions with identifier names correctly" do
403
- @d << {:name => 'abc', :value => 6}
403
+ @d.insert(:name => 'abc', :value => 6)
404
404
  @d.get{sum.function(:value)}.must_equal 6
405
405
  end
406
406
 
407
407
  it "should handle aggregate methods on limited datasets correctly" do
408
- @d << {:name => 'abc', :value => 6}
409
- @d << {:name => 'bcd', :value => 12}
410
- @d << {:name => 'def', :value => 18}
408
+ @d.insert(:name => 'abc', :value => 6)
409
+ @d.insert(:name => 'bcd', :value => 12)
410
+ @d.insert(:name => 'def', :value => 18)
411
411
  @d = @d.order(:name).limit(2)
412
412
  @d.count.must_equal 2
413
413
  @d.avg(:value).to_i.must_equal 9
@@ -415,14 +415,14 @@ describe Sequel::Dataset do
415
415
  @d.reverse.min(:value).to_i.must_equal 12
416
416
  @d.max(:value).to_i.must_equal 12
417
417
  @d.sum(:value).to_i.must_equal 18
418
- @d.interval(:value).to_i.must_equal 6
418
+ @d.extension(:sequel_4_dataset_methods).interval(:value).to_i.must_equal 6
419
419
  end
420
420
 
421
421
  it "should return the correct records" do
422
422
  @d.to_a.must_equal []
423
- @d << {:name => 'abc', :value => 123}
424
- @d << {:name => 'abc', :value => 456}
425
- @d << {:name => 'def', :value => 789}
423
+ @d.insert(:name => 'abc', :value => 123)
424
+ @d.insert(:name => 'abc', :value => 456)
425
+ @d.insert(:name => 'def', :value => 789)
426
426
 
427
427
  @d.order(:value).to_a.must_equal [
428
428
  {:name => 'abc', :value => 123},
@@ -432,27 +432,27 @@ describe Sequel::Dataset do
432
432
  end
433
433
 
434
434
  it "should update records correctly" do
435
- @d << {:name => 'abc', :value => 123}
436
- @d << {:name => 'abc', :value => 456}
437
- @d << {:name => 'def', :value => 789}
435
+ @d.insert(:name => 'abc', :value => 123)
436
+ @d.insert(:name => 'abc', :value => 456)
437
+ @d.insert(:name => 'def', :value => 789)
438
438
  @d.filter(:name => 'abc').update(:value => 530)
439
439
  @d[:name => 'def'][:value].must_equal 789
440
440
  @d.filter(:value => 530).count.must_equal 2
441
441
  end
442
442
 
443
443
  it "should delete records correctly" do
444
- @d << {:name => 'abc', :value => 123}
445
- @d << {:name => 'abc', :value => 456}
446
- @d << {:name => 'def', :value => 789}
444
+ @d.insert(:name => 'abc', :value => 123)
445
+ @d.insert(:name => 'abc', :value => 456)
446
+ @d.insert(:name => 'def', :value => 789)
447
447
  @d.filter(:name => 'abc').delete
448
448
  @d.count.must_equal 1
449
449
  @d.first[:name].must_equal 'def'
450
450
  end
451
451
 
452
452
  it "should be able to truncate the table" do
453
- @d << {:name => 'abc', :value => 123}
454
- @d << {:name => 'abc', :value => 456}
455
- @d << {:name => 'def', :value => 789}
453
+ @d.insert(:name => 'abc', :value => 123)
454
+ @d.insert(:name => 'abc', :value => 456)
455
+ @d.insert(:name => 'def', :value => 789)
456
456
  @d.count.must_equal 3
457
457
  @d.truncate.must_be_nil
458
458
  @d.count.must_equal 0
@@ -517,9 +517,9 @@ describe Sequel::Dataset do
517
517
  Integer :value
518
518
  end
519
519
  @d = DB[:items]
520
- @d << {:value => 123}
521
- @d << {:value => 456}
522
- @d << {:value => 789}
520
+ @d.insert(:value => 123)
521
+ @d.insert(:value => 456)
522
+ @d.insert(:value => 789)
523
523
  end
524
524
  after do
525
525
  DB.drop_table?(:items)
@@ -1055,7 +1055,7 @@ describe "Sequel::Dataset convenience methods" do
1055
1055
  @db.drop_table?(:a)
1056
1056
  end
1057
1057
 
1058
- it "#[]= should update matching rows" do
1058
+ deprecated "#[]= should update matching rows" do
1059
1059
  @ds.insert(20, 10)
1060
1060
  @ds.extension(:sequel_3_dataset_methods)[:a=>20] = {:b=>30}
1061
1061
  @ds.all.must_equal [{:a=>20, :b=>30}]
@@ -1104,7 +1104,7 @@ describe "Sequel::Dataset convenience methods" do
1104
1104
  end
1105
1105
 
1106
1106
  it "#range should return the range between the maximum and minimum values" do
1107
- @ds = @ds.unordered
1107
+ @ds = @ds.unordered.extension(:sequel_4_dataset_methods)
1108
1108
  @ds.insert(20, 10)
1109
1109
  @ds.insert(30, 10)
1110
1110
  @ds.range(:a).must_equal(20..30)
@@ -1112,7 +1112,7 @@ describe "Sequel::Dataset convenience methods" do
1112
1112
  end
1113
1113
 
1114
1114
  it "#interval should return the different between the maximum and minimum values" do
1115
- @ds = @ds.unordered
1115
+ @ds = @ds.unordered.extension(:sequel_4_dataset_methods)
1116
1116
  @ds.insert(20, 10)
1117
1117
  @ds.insert(30, 10)
1118
1118
  @ds.interval(:a).to_i.must_equal 10
@@ -1147,10 +1147,10 @@ describe "Sequel::Dataset main SQL methods" do
1147
1147
  @ds.filter(Sequel.lit("b < ?", 15)).invert.all.must_equal [{:a=>20, :b=>30}]
1148
1148
  end
1149
1149
 
1150
- it "#and and #or should work correctly" do
1150
+ it "#where and #or should work correctly" do
1151
1151
  @ds.insert(20, 30)
1152
- @ds.filter(:a=>20).and(:b=>30).all.must_equal [{:a=>20, :b=>30}]
1153
- @ds.filter(:a=>20).and(:b=>15).all.must_equal []
1152
+ @ds.filter(:a=>20).where(:b=>30).all.must_equal [{:a=>20, :b=>30}]
1153
+ @ds.filter(:a=>20).where(:b=>15).all.must_equal []
1154
1154
  @ds.filter(:a=>20).or(:b=>15).all.must_equal [{:a=>20, :b=>30}]
1155
1155
  @ds.filter(:a=>10).or(:b=>15).all.must_equal []
1156
1156
  end
@@ -1212,17 +1212,18 @@ describe "Sequel::Dataset convenience methods" do
1212
1212
  @ds.map([:a, :b]).must_equal [[1, 2], [5, 6]]
1213
1213
  end
1214
1214
 
1215
- it "should have working #to_hash" do
1215
+ it "should have working #as_hash" do
1216
1216
  @ds.to_hash(:a).must_equal(1=>{:a=>1, :b=>2, :c=>3, :d=>4}, 5=>{:a=>5, :b=>6, :c=>7, :d=>8})
1217
- @ds.to_hash(:b).must_equal(2=>{:a=>1, :b=>2, :c=>3, :d=>4}, 6=>{:a=>5, :b=>6, :c=>7, :d=>8})
1218
- @ds.to_hash([:a, :b]).must_equal([1, 2]=>{:a=>1, :b=>2, :c=>3, :d=>4}, [5, 6]=>{:a=>5, :b=>6, :c=>7, :d=>8})
1217
+ @ds.as_hash(:a).must_equal(1=>{:a=>1, :b=>2, :c=>3, :d=>4}, 5=>{:a=>5, :b=>6, :c=>7, :d=>8})
1218
+ @ds.as_hash(:b).must_equal(2=>{:a=>1, :b=>2, :c=>3, :d=>4}, 6=>{:a=>5, :b=>6, :c=>7, :d=>8})
1219
+ @ds.as_hash([:a, :b]).must_equal([1, 2]=>{:a=>1, :b=>2, :c=>3, :d=>4}, [5, 6]=>{:a=>5, :b=>6, :c=>7, :d=>8})
1219
1220
 
1220
- @ds.to_hash(:a, :b).must_equal(1=>2, 5=>6)
1221
- @ds.to_hash([:a, :c], :b).must_equal([1, 3]=>2, [5, 7]=>6)
1222
- @ds.to_hash(:a, [:b, :c]).must_equal(1=>[2, 3], 5=>[6, 7])
1223
- @ds.to_hash([:a, :c], [:b, :d]).must_equal([1, 3]=>[2, 4], [5, 7]=>[6, 8])
1221
+ @ds.as_hash(:a, :b).must_equal(1=>2, 5=>6)
1222
+ @ds.as_hash([:a, :c], :b).must_equal([1, 3]=>2, [5, 7]=>6)
1223
+ @ds.as_hash(:a, [:b, :c]).must_equal(1=>[2, 3], 5=>[6, 7])
1224
+ @ds.as_hash([:a, :c], [:b, :d]).must_equal([1, 3]=>[2, 4], [5, 7]=>[6, 8])
1224
1225
 
1225
- @ds.to_hash(:a, :b, :hash => (tmp = {})).must_be_same_as(tmp)
1226
+ @ds.as_hash(:a, :b, :hash => (tmp = {})).must_be_same_as(tmp)
1226
1227
  end
1227
1228
 
1228
1229
  it "should have working #to_hash_groups" do
@@ -1874,7 +1875,7 @@ describe "Dataset replace" do
1874
1875
  end
1875
1876
 
1876
1877
  it "should update a record if the condition is met" do
1877
- @d << {:id => 111}
1878
+ @d.insert(:id => 111)
1878
1879
  @d.all.must_equal [{:id => 111, :value => nil}]
1879
1880
  @d.replace(:id => 111, :value => 333)
1880
1881
  @d.all.must_equal [{:id => 111, :value => 333}]