sequel 4.41.0 → 4.42.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +98 -0
  3. data/README.rdoc +23 -10
  4. data/doc/active_record.rdoc +4 -4
  5. data/doc/advanced_associations.rdoc +2 -2
  6. data/doc/association_basics.rdoc +5 -2
  7. data/doc/cheat_sheet.rdoc +3 -3
  8. data/doc/core_extensions.rdoc +2 -2
  9. data/doc/dataset_basics.rdoc +4 -4
  10. data/doc/dataset_filtering.rdoc +1 -1
  11. data/doc/migration.rdoc +19 -1
  12. data/doc/prepared_statements.rdoc +2 -2
  13. data/doc/release_notes/4.42.0.txt +221 -0
  14. data/doc/testing.rdoc +3 -1
  15. data/lib/sequel/adapters/ado/access.rb +0 -1
  16. data/lib/sequel/adapters/ado/mssql.rb +0 -1
  17. data/lib/sequel/adapters/do/mysql.rb +0 -1
  18. data/lib/sequel/adapters/do/postgres.rb +0 -1
  19. data/lib/sequel/adapters/do/sqlite3.rb +0 -1
  20. data/lib/sequel/adapters/ibmdb.rb +21 -25
  21. data/lib/sequel/adapters/jdbc.rb +8 -16
  22. data/lib/sequel/adapters/jdbc/as400.rb +0 -1
  23. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -1
  24. data/lib/sequel/adapters/jdbc/db2.rb +0 -1
  25. data/lib/sequel/adapters/jdbc/derby.rb +0 -1
  26. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -1
  27. data/lib/sequel/adapters/jdbc/h2.rb +0 -1
  28. data/lib/sequel/adapters/jdbc/hsqldb.rb +0 -1
  29. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -1
  30. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -1
  31. data/lib/sequel/adapters/jdbc/jtds.rb +0 -1
  32. data/lib/sequel/adapters/jdbc/mssql.rb +0 -1
  33. data/lib/sequel/adapters/jdbc/mysql.rb +0 -1
  34. data/lib/sequel/adapters/jdbc/oracle.rb +0 -1
  35. data/lib/sequel/adapters/jdbc/postgresql.rb +0 -13
  36. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -1
  37. data/lib/sequel/adapters/jdbc/sqlite.rb +0 -1
  38. data/lib/sequel/adapters/jdbc/sqlserver.rb +3 -4
  39. data/lib/sequel/adapters/mock.rb +54 -12
  40. data/lib/sequel/adapters/mysql.rb +1 -1
  41. data/lib/sequel/adapters/mysql2.rb +11 -17
  42. data/lib/sequel/adapters/odbc/mssql.rb +0 -1
  43. data/lib/sequel/adapters/oracle.rb +8 -20
  44. data/lib/sequel/adapters/postgres.rb +11 -29
  45. data/lib/sequel/adapters/shared/access.rb +5 -12
  46. data/lib/sequel/adapters/shared/cubrid.rb +4 -13
  47. data/lib/sequel/adapters/shared/db2.rb +4 -2
  48. data/lib/sequel/adapters/shared/firebird.rb +2 -4
  49. data/lib/sequel/adapters/shared/informix.rb +4 -2
  50. data/lib/sequel/adapters/shared/mssql.rb +3 -5
  51. data/lib/sequel/adapters/shared/mysql.rb +4 -14
  52. data/lib/sequel/adapters/shared/oracle.rb +1 -3
  53. data/lib/sequel/adapters/shared/postgres.rb +16 -38
  54. data/lib/sequel/adapters/shared/progress.rb +0 -2
  55. data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -2
  56. data/lib/sequel/adapters/shared/sqlite.rb +20 -16
  57. data/lib/sequel/adapters/sqlite.rb +8 -20
  58. data/lib/sequel/adapters/swift/mysql.rb +0 -1
  59. data/lib/sequel/adapters/swift/postgres.rb +0 -1
  60. data/lib/sequel/adapters/swift/sqlite.rb +0 -1
  61. data/lib/sequel/adapters/tinytds.rb +4 -12
  62. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
  63. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -2
  64. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +11 -34
  65. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  66. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +26 -0
  67. data/lib/sequel/ast_transformer.rb +2 -2
  68. data/lib/sequel/database/dataset.rb +1 -1
  69. data/lib/sequel/database/dataset_defaults.rb +0 -66
  70. data/lib/sequel/database/features.rb +6 -0
  71. data/lib/sequel/database/misc.rb +31 -17
  72. data/lib/sequel/database/query.rb +7 -4
  73. data/lib/sequel/database/schema_methods.rb +1 -1
  74. data/lib/sequel/dataset.rb +8 -8
  75. data/lib/sequel/dataset/actions.rb +140 -46
  76. data/lib/sequel/dataset/features.rb +1 -5
  77. data/lib/sequel/dataset/graph.rb +7 -8
  78. data/lib/sequel/dataset/misc.rb +127 -56
  79. data/lib/sequel/dataset/mutation.rb +9 -20
  80. data/lib/sequel/dataset/placeholder_literalizer.rb +10 -1
  81. data/lib/sequel/dataset/prepared_statements.rb +102 -46
  82. data/lib/sequel/dataset/query.rb +155 -72
  83. data/lib/sequel/dataset/sql.rb +26 -9
  84. data/lib/sequel/extensions/columns_introspection.rb +3 -1
  85. data/lib/sequel/extensions/core_extensions.rb +5 -5
  86. data/lib/sequel/extensions/core_refinements.rb +5 -5
  87. data/lib/sequel/extensions/duplicate_columns_handler.rb +4 -2
  88. data/lib/sequel/extensions/freeze_datasets.rb +69 -0
  89. data/lib/sequel/extensions/identifier_mangling.rb +196 -0
  90. data/lib/sequel/extensions/looser_typecasting.rb +11 -7
  91. data/lib/sequel/extensions/migration.rb +1 -1
  92. data/lib/sequel/extensions/null_dataset.rb +5 -2
  93. data/lib/sequel/extensions/pagination.rb +42 -23
  94. data/lib/sequel/extensions/pg_enum.rb +3 -3
  95. data/lib/sequel/extensions/query.rb +3 -3
  96. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +15 -8
  97. data/lib/sequel/model/associations.rb +25 -8
  98. data/lib/sequel/model/base.rb +88 -29
  99. data/lib/sequel/model/dataset_module.rb +37 -0
  100. data/lib/sequel/plugins/association_pks.rb +4 -4
  101. data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
  102. data/lib/sequel/plugins/constraint_validations.rb +1 -2
  103. data/lib/sequel/plugins/csv_serializer.rb +2 -2
  104. data/lib/sequel/plugins/dataset_associations.rb +8 -8
  105. data/lib/sequel/plugins/eager_each.rb +2 -2
  106. data/lib/sequel/plugins/instance_filters.rb +1 -1
  107. data/lib/sequel/plugins/json_serializer.rb +2 -2
  108. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  109. data/lib/sequel/plugins/list.rb +4 -4
  110. data/lib/sequel/plugins/prepared_statements.rb +2 -4
  111. data/lib/sequel/plugins/prepared_statements_associations.rb +1 -3
  112. data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
  113. data/lib/sequel/plugins/rcte_tree.rb +13 -13
  114. data/lib/sequel/plugins/sharding.rb +1 -1
  115. data/lib/sequel/plugins/single_table_inheritance.rb +9 -4
  116. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  117. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  118. data/lib/sequel/plugins/validation_helpers.rb +1 -1
  119. data/lib/sequel/plugins/xml_serializer.rb +2 -2
  120. data/lib/sequel/sql.rb +69 -36
  121. data/lib/sequel/version.rb +1 -1
  122. data/spec/adapters/db2_spec.rb +10 -0
  123. data/spec/adapters/firebird_spec.rb +1 -1
  124. data/spec/adapters/mssql_spec.rb +4 -5
  125. data/spec/adapters/mysql_spec.rb +9 -9
  126. data/spec/adapters/postgres_spec.rb +67 -68
  127. data/spec/adapters/spec_helper.rb +6 -1
  128. data/spec/adapters/sqlite_spec.rb +29 -15
  129. data/spec/core/connection_pool_spec.rb +14 -14
  130. data/spec/core/database_spec.rb +38 -180
  131. data/spec/core/dataset_mutation_spec.rb +253 -0
  132. data/spec/core/dataset_spec.rb +394 -537
  133. data/spec/core/expression_filters_spec.rb +34 -32
  134. data/spec/core/mock_adapter_spec.rb +27 -35
  135. data/spec/core/placeholder_literalizer_spec.rb +2 -4
  136. data/spec/core/schema_generator_spec.rb +4 -4
  137. data/spec/core/schema_spec.rb +1 -2
  138. data/spec/core_extensions_spec.rb +22 -29
  139. data/spec/extensions/active_model_spec.rb +6 -6
  140. data/spec/extensions/association_dependencies_spec.rb +2 -2
  141. data/spec/extensions/blacklist_security_spec.rb +3 -3
  142. data/spec/extensions/boolean_readers_spec.rb +12 -12
  143. data/spec/extensions/caching_spec.rb +13 -10
  144. data/spec/extensions/class_table_inheritance_spec.rb +38 -43
  145. data/spec/extensions/column_conflicts_spec.rb +1 -3
  146. data/spec/extensions/columns_introspection_spec.rb +2 -3
  147. data/spec/extensions/composition_spec.rb +5 -3
  148. data/spec/extensions/constraint_validations_plugin_spec.rb +5 -5
  149. data/spec/extensions/constraint_validations_spec.rb +14 -8
  150. data/spec/extensions/core_refinements_spec.rb +22 -29
  151. data/spec/extensions/csv_serializer_spec.rb +7 -6
  152. data/spec/extensions/date_arithmetic_spec.rb +15 -15
  153. data/spec/extensions/defaults_setter_spec.rb +2 -2
  154. data/spec/extensions/delay_add_association_spec.rb +1 -1
  155. data/spec/extensions/dirty_spec.rb +19 -10
  156. data/spec/extensions/duplicate_columns_handler_spec.rb +12 -18
  157. data/spec/extensions/eager_each_spec.rb +12 -16
  158. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  159. data/spec/extensions/eval_inspect_spec.rb +4 -3
  160. data/spec/extensions/force_encoding_spec.rb +12 -12
  161. data/spec/extensions/freeze_datasets_spec.rb +31 -0
  162. data/spec/extensions/graph_each_spec.rb +6 -18
  163. data/spec/extensions/hook_class_methods_spec.rb +7 -7
  164. data/spec/extensions/identifier_mangling_spec.rb +307 -0
  165. data/spec/extensions/instance_filters_spec.rb +5 -6
  166. data/spec/extensions/instance_hooks_spec.rb +12 -12
  167. data/spec/extensions/json_serializer_spec.rb +12 -15
  168. data/spec/extensions/lazy_attributes_spec.rb +4 -4
  169. data/spec/extensions/list_spec.rb +19 -21
  170. data/spec/extensions/many_through_many_spec.rb +108 -163
  171. data/spec/extensions/meta_def_spec.rb +7 -2
  172. data/spec/extensions/migration_spec.rb +10 -12
  173. data/spec/extensions/mssql_optimistic_locking_spec.rb +4 -3
  174. data/spec/extensions/named_timezones_spec.rb +4 -3
  175. data/spec/extensions/nested_attributes_spec.rb +2 -2
  176. data/spec/extensions/null_dataset_spec.rb +17 -12
  177. data/spec/extensions/optimistic_locking_spec.rb +4 -5
  178. data/spec/extensions/pagination_spec.rb +8 -10
  179. data/spec/extensions/pg_array_associations_spec.rb +28 -27
  180. data/spec/extensions/pg_array_ops_spec.rb +2 -1
  181. data/spec/extensions/pg_array_spec.rb +6 -2
  182. data/spec/extensions/pg_enum_spec.rb +5 -3
  183. data/spec/extensions/pg_hstore_ops_spec.rb +3 -1
  184. data/spec/extensions/pg_hstore_spec.rb +7 -6
  185. data/spec/extensions/pg_inet_ops_spec.rb +2 -1
  186. data/spec/extensions/pg_inet_spec.rb +2 -1
  187. data/spec/extensions/pg_interval_spec.rb +2 -1
  188. data/spec/extensions/pg_json_ops_spec.rb +2 -1
  189. data/spec/extensions/pg_json_spec.rb +6 -3
  190. data/spec/extensions/pg_loose_count_spec.rb +1 -0
  191. data/spec/extensions/pg_range_ops_spec.rb +3 -1
  192. data/spec/extensions/pg_range_spec.rb +9 -5
  193. data/spec/extensions/pg_row_ops_spec.rb +2 -1
  194. data/spec/extensions/pg_row_plugin_spec.rb +4 -6
  195. data/spec/extensions/pg_row_spec.rb +5 -3
  196. data/spec/extensions/pg_static_cache_updater_spec.rb +2 -1
  197. data/spec/extensions/pg_typecast_on_load_spec.rb +1 -1
  198. data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
  199. data/spec/extensions/prepared_statements_spec.rb +12 -11
  200. data/spec/extensions/pretty_table_spec.rb +1 -1
  201. data/spec/extensions/query_spec.rb +8 -5
  202. data/spec/extensions/rcte_tree_spec.rb +39 -39
  203. data/spec/extensions/round_timestamps_spec.rb +2 -2
  204. data/spec/extensions/schema_dumper_spec.rb +3 -2
  205. data/spec/extensions/schema_spec.rb +2 -2
  206. data/spec/extensions/scissors_spec.rb +1 -2
  207. data/spec/extensions/sequel_3_dataset_methods_spec.rb +30 -17
  208. data/spec/extensions/serialization_modification_detection_spec.rb +2 -2
  209. data/spec/extensions/serialization_spec.rb +15 -13
  210. data/spec/extensions/set_overrides_spec.rb +14 -8
  211. data/spec/extensions/sharding_spec.rb +9 -18
  212. data/spec/extensions/shared_caching_spec.rb +3 -4
  213. data/spec/extensions/single_table_inheritance_spec.rb +11 -11
  214. data/spec/extensions/skip_create_refresh_spec.rb +2 -1
  215. data/spec/extensions/spec_helper.rb +1 -1
  216. data/spec/extensions/split_values_spec.rb +2 -2
  217. data/spec/extensions/sql_comments_spec.rb +6 -0
  218. data/spec/extensions/static_cache_spec.rb +7 -9
  219. data/spec/extensions/string_agg_spec.rb +30 -29
  220. data/spec/extensions/tactical_eager_loading_spec.rb +4 -5
  221. data/spec/extensions/thread_local_timezones_spec.rb +2 -2
  222. data/spec/extensions/timestamps_spec.rb +28 -3
  223. data/spec/extensions/to_dot_spec.rb +1 -2
  224. data/spec/extensions/tree_spec.rb +33 -29
  225. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  226. data/spec/extensions/unlimited_update_spec.rb +1 -0
  227. data/spec/extensions/update_primary_key_spec.rb +11 -7
  228. data/spec/extensions/update_refresh_spec.rb +1 -1
  229. data/spec/extensions/uuid_spec.rb +0 -1
  230. data/spec/extensions/validate_associated_spec.rb +1 -1
  231. data/spec/extensions/validation_class_methods_spec.rb +10 -10
  232. data/spec/extensions/validation_helpers_spec.rb +10 -10
  233. data/spec/extensions/xml_serializer_spec.rb +7 -3
  234. data/spec/integration/associations_test.rb +31 -31
  235. data/spec/integration/dataset_test.rb +17 -19
  236. data/spec/integration/eager_loader_test.rb +24 -24
  237. data/spec/integration/model_test.rb +6 -6
  238. data/spec/integration/plugin_test.rb +43 -43
  239. data/spec/integration/prepared_statement_test.rb +6 -6
  240. data/spec/integration/schema_test.rb +63 -52
  241. data/spec/integration/spec_helper.rb +6 -1
  242. data/spec/integration/transaction_test.rb +13 -13
  243. data/spec/model/association_reflection_spec.rb +17 -17
  244. data/spec/model/associations_spec.rb +101 -96
  245. data/spec/model/base_spec.rb +175 -49
  246. data/spec/model/class_dataset_methods_spec.rb +5 -9
  247. data/spec/model/dataset_methods_spec.rb +5 -5
  248. data/spec/model/eager_loading_spec.rb +209 -235
  249. data/spec/model/hooks_spec.rb +15 -15
  250. data/spec/model/model_spec.rb +28 -21
  251. data/spec/model/plugins_spec.rb +4 -5
  252. data/spec/model/record_spec.rb +59 -57
  253. data/spec/model/spec_helper.rb +1 -1
  254. data/spec/model/validations_spec.rb +6 -6
  255. data/spec/spec_config.rb +1 -1
  256. metadata +10 -2
@@ -37,14 +37,14 @@ describe "Model#before_create && Model#after_create" do
37
37
  it ".create should cancel the save and return nil if before_create returns false and raise_on_save_failure is false" do
38
38
  @c.send(:define_method, :before_create){false}
39
39
  @c.raise_on_save_failure = false
40
- @c.create(:x => 2).must_equal nil
40
+ @c.create(:x => 2).must_be_nil
41
41
  DB.sqls.must_equal []
42
42
  end
43
43
 
44
44
  it ".create should cancel the save and return nil if before_create calls cancel_action and raise_on_save_failure is false" do
45
45
  @c.send(:define_method, :before_create){cancel_action}
46
46
  @c.raise_on_save_failure = false
47
- @c.create(:x => 2).must_equal nil
47
+ @c.create(:x => 2).must_be_nil
48
48
  DB.sqls.must_equal []
49
49
  end
50
50
  end
@@ -89,14 +89,14 @@ describe "Model#before_update && Model#after_update" do
89
89
  it "#save should cancel the save and return nil if before_update returns false and raise_on_save_failure is false" do
90
90
  @c.send(:define_method, :before_update){false}
91
91
  @c.raise_on_save_failure = false
92
- @c.load(:id => 2233).save.must_equal nil
92
+ @c.load(:id => 2233).save.must_be_nil
93
93
  DB.sqls.must_equal []
94
94
  end
95
95
 
96
96
  it "#save should cancel the save and return nil if before_update calls cancel_action and raise_on_save_failure is false" do
97
97
  @c.send(:define_method, :before_update){cancel_action}
98
98
  @c.raise_on_save_failure = false
99
- @c.load(:id => 2233).save.must_equal nil
99
+ @c.load(:id => 2233).save.must_be_nil
100
100
  DB.sqls.must_equal []
101
101
  end
102
102
  end
@@ -150,14 +150,14 @@ describe "Model#before_save && Model#after_save" do
150
150
  it "#save should cancel the save and return nil if before_save returns false and raise_on_save_failure is false" do
151
151
  @c.send(:define_method, :before_save){false}
152
152
  @c.raise_on_save_failure = false
153
- @c.load(:id => 2233).save.must_equal nil
153
+ @c.load(:id => 2233).save.must_be_nil
154
154
  DB.sqls.must_equal []
155
155
  end
156
156
 
157
157
  it "#save should cancel the save and return nil if before_save calls cancel_action and raise_on_save_failure is false" do
158
158
  @c.send(:define_method, :before_save){cancel_action}
159
159
  @c.raise_on_save_failure = false
160
- @c.load(:id => 2233).save.must_equal nil
160
+ @c.load(:id => 2233).save.must_be_nil
161
161
  DB.sqls.must_equal []
162
162
  end
163
163
 
@@ -207,14 +207,14 @@ describe "Model#before_destroy && Model#after_destroy" do
207
207
  it "#destroy should cancel the destroy and return nil if before_destroy returns false and raise_on_save_failure is false" do
208
208
  @c.send(:define_method, :before_destroy){false}
209
209
  @c.raise_on_save_failure = false
210
- @c.load(:id => 2233).destroy.must_equal nil
210
+ @c.load(:id => 2233).destroy.must_be_nil
211
211
  DB.sqls.must_equal []
212
212
  end
213
213
 
214
214
  it "#destroy should cancel the destroy and return nil if before_destroy calls cancel_action and raise_on_save_failure is false" do
215
215
  @c.send(:define_method, :before_destroy){cancel_action; true}
216
216
  @c.raise_on_save_failure = false
217
- @c.load(:id => 2233).destroy.must_equal nil
217
+ @c.load(:id => 2233).destroy.must_be_nil
218
218
  DB.sqls.must_equal []
219
219
  end
220
220
  end
@@ -253,7 +253,7 @@ describe "Model#before_validation && Model#after_validation" do
253
253
 
254
254
  m = @c.load(:id => 22)
255
255
  m.raise_on_save_failure = false
256
- m.save.must_equal nil
256
+ m.save.must_be_nil
257
257
  DB.sqls.must_equal ['BLAH before', 'BLAH after']
258
258
  end
259
259
 
@@ -279,14 +279,14 @@ describe "Model#before_validation && Model#after_validation" do
279
279
  it "#save should cancel the save and return nil if before_validation returns false and raise_on_save_failure is false" do
280
280
  @c.send(:define_method, :before_validation){false}
281
281
  @c.raise_on_save_failure = false
282
- @c.load(:id => 2233).save.must_equal nil
282
+ @c.load(:id => 2233).save.must_be_nil
283
283
  DB.sqls.must_equal []
284
284
  end
285
285
 
286
286
  it "#save should cancel the save and return nil if before_validation calls cancel_action and raise_on_save_failure is false" do
287
287
  @c.send(:define_method, :before_validation){cancel_action}
288
288
  @c.raise_on_save_failure = false
289
- @c.load(:id => 2233).save.must_equal nil
289
+ @c.load(:id => 2233).save.must_be_nil
290
290
  DB.sqls.must_equal []
291
291
  end
292
292
 
@@ -431,19 +431,19 @@ describe "Model around filters" do
431
431
 
432
432
  o = @c.load(:id => 1)
433
433
  def o.around_save() end
434
- o.save.must_equal nil
434
+ o.save.must_be_nil
435
435
 
436
436
  o = @c.load(:id => 1)
437
437
  def o.around_update() end
438
- o.save.must_equal nil
438
+ o.save.must_be_nil
439
439
 
440
440
  o = @c.new
441
441
  def o.around_create() end
442
- o.save.must_equal nil
442
+ o.save.must_be_nil
443
443
 
444
444
  o = @c.new
445
445
  def o.around_validation() end
446
- o.save.must_equal nil
446
+ o.save.must_be_nil
447
447
  end
448
448
  end
449
449
 
@@ -9,7 +9,7 @@ describe "Sequel::Model()" do
9
9
  ds = @db[:blah]
10
10
  c = Sequel::Model(ds)
11
11
  c.superclass.must_equal Sequel::Model
12
- c.dataset.must_equal ds
12
+ c.dataset.row_proc.must_equal c
13
13
  end
14
14
 
15
15
  it "should return a model subclass with a dataset with the default database and given table name if given a Symbol" do
@@ -51,14 +51,14 @@ describe "Sequel::Model()" do
51
51
  ds = @db[Sequel.identifier(:blah)]
52
52
  c = Sequel::Model(ds)
53
53
  c.superclass.must_equal Sequel::Model
54
- c.dataset.must_equal ds
54
+ c.dataset.row_proc.must_equal c
55
55
  end
56
56
 
57
57
  it "should be callable on Sequel::Model" do
58
58
  ds = @db[:blah]
59
59
  c = Sequel::Model::Model(ds)
60
60
  c.superclass.must_equal Sequel::Model
61
- c.dataset.must_equal ds
61
+ c.dataset.row_proc.must_equal c
62
62
  end
63
63
 
64
64
  it "should be callable on subclasses of Sequel::Model" do
@@ -66,7 +66,7 @@ describe "Sequel::Model()" do
66
66
  c = Class.new(Sequel::Model)
67
67
  sc = c::Model(ds)
68
68
  sc.superclass.must_equal c
69
- sc.dataset.must_equal ds
69
+ sc.dataset.row_proc.must_equal sc
70
70
  end
71
71
 
72
72
  it "should be callable on other modules if def_Model is used" do
@@ -75,7 +75,7 @@ describe "Sequel::Model()" do
75
75
  ds = @db[:blah]
76
76
  c = m::Model(ds)
77
77
  c.superclass.must_equal Sequel::Model
78
- c.dataset.must_equal ds
78
+ c.dataset.row_proc.must_equal c
79
79
  end
80
80
 
81
81
  it "should be callable using model subclasses on other modules if def_Model is used" do
@@ -85,7 +85,7 @@ describe "Sequel::Model()" do
85
85
  ds = @db[:blah]
86
86
  sc = m::Model(ds)
87
87
  sc.superclass.must_equal c
88
- sc.dataset.must_equal ds
88
+ sc.dataset.row_proc.must_equal sc
89
89
  end
90
90
 
91
91
  it "should return a model subclass associated to the given database if given a database" do
@@ -227,6 +227,12 @@ describe Sequel::Model do
227
227
  @model.table_name.must_equal :foo
228
228
  end
229
229
 
230
+ it "allows frozen dataset" do
231
+ @model.set_dataset(DB[:foo].freeze)
232
+ @model.table_name.must_equal :foo
233
+ @model.dataset.sql.must_equal 'SELECT * FROM foo'
234
+ end
235
+
230
236
  it "allows set_dataset to accept a Symbol" do
231
237
  @model.db = DB
232
238
  @model.set_dataset(:foo)
@@ -269,11 +275,10 @@ describe Sequel::Model do
269
275
  it "set_dataset should add the destroy method to the dataset that destroys each object" do
270
276
  ds = DB[:foo]
271
277
  ds.wont_respond_to(:destroy)
272
- @model.set_dataset(ds)
278
+ ds = @model.set_dataset(ds).dataset
273
279
  ds.must_respond_to(:destroy)
274
280
  DB.sqls
275
- ds._fetch = [{:id=>1}, {:id=>2}]
276
- ds.destroy.must_equal 2
281
+ ds.with_fetch([{:id=>1}, {:id=>2}]).destroy.must_equal 2
277
282
  DB.sqls.must_equal ["SELECT * FROM foo", "DELETE FROM foo WHERE id = 1", "DELETE FROM foo WHERE id = 2"]
278
283
  end
279
284
 
@@ -281,7 +286,7 @@ describe Sequel::Model do
281
286
  db = Sequel.mock(:servers=>{:s1=>{}})
282
287
  ds = db[:foo].server(:s1)
283
288
  @model.use_transactions = true
284
- @model.set_dataset(ds)
289
+ ds = @model.set_dataset(ds).dataset
285
290
  db.sqls
286
291
  ds.destroy.must_equal 0
287
292
  db.sqls.must_equal ["BEGIN -- s1", "SELECT * FROM foo -- s1", "COMMIT -- s1"]
@@ -462,8 +467,7 @@ describe Sequel::Model, "new" do
462
467
  end
463
468
 
464
469
  it "should use the last inserted id as primary key if not in values" do
465
- @m.instance_dataset._fetch = @m.dataset._fetch = {:x => 1, :id => 1234}
466
- @m.instance_dataset.autoid = @m.dataset.autoid = 1234
470
+ @m.dataset = @m.dataset.with_fetch(:x => 1, :id => 1234).with_autoid(1234)
467
471
 
468
472
  o = @m.new(:x => 1)
469
473
  o.save
@@ -508,7 +512,7 @@ end
508
512
  describe Sequel::Model, ".find" do
509
513
  before do
510
514
  @c = Class.new(Sequel::Model(:items))
511
- @c.dataset._fetch = {:name => 'sharon', :id => 1}
515
+ @c.dataset = @c.dataset.with_fetch(:name => 'sharon', :id => 1)
512
516
  DB.reset
513
517
  end
514
518
 
@@ -874,7 +878,7 @@ describe Sequel::Model, "attribute accessors" do
874
878
  o.methods.collect{|z| z.to_s}.must_include(x)
875
879
  end
876
880
 
877
- o.x.must_equal nil
881
+ o.x.must_be_nil
878
882
  o.x = 34
879
883
  o.x.must_equal 34
880
884
  end
@@ -912,7 +916,7 @@ end
912
916
  describe Sequel::Model, ".[]" do
913
917
  before do
914
918
  @c = Class.new(Sequel::Model(:items))
915
- @c.dataset._fetch = {:name => 'sharon', :id => 1}
919
+ @c.dataset = @c.dataset.with_fetch(:name => 'sharon', :id => 1)
916
920
  DB.reset
917
921
  end
918
922
 
@@ -924,8 +928,8 @@ describe Sequel::Model, ".[]" do
924
928
  end
925
929
 
926
930
  it "should have #[] return nil if no rows match" do
927
- @c.dataset._fetch = []
928
- @c[1].must_equal nil
931
+ @c.dataset = @c.dataset.with_fetch([])
932
+ @c[1].must_be_nil
929
933
  DB.sqls.must_equal ["SELECT * FROM items WHERE id = 1"]
930
934
  end
931
935
 
@@ -971,12 +975,15 @@ describe "Model.db_schema" do
971
975
  def @db.schema(table, opts = {})
972
976
  raise Sequel::Error
973
977
  end
974
- @dataset.instance_variable_set(:@columns, [:x, :y])
978
+ @dataset = @dataset.with_extend do
979
+ def columns
980
+ [:x, :y]
981
+ end
982
+ end
975
983
 
976
984
  @c.dataset = @dataset
977
985
  @c.db_schema.must_equal(:x=>{}, :y=>{})
978
986
  @c.columns.must_equal [:x, :y]
979
- @c.dataset.instance_variable_get(:@columns).must_equal [:x, :y]
980
987
  end
981
988
 
982
989
  it "should use the database's schema and set the columns and dataset columns" do
@@ -986,7 +993,7 @@ describe "Model.db_schema" do
986
993
  @c.dataset = @dataset
987
994
  @c.db_schema.must_equal(:x=>{:type=>:integer}, :y=>{:type=>:string})
988
995
  @c.columns.must_equal [:x, :y]
989
- @c.dataset.instance_variable_get(:@columns).must_equal [:x, :y]
996
+ @c.dataset.columns.must_equal [:x, :y]
990
997
  end
991
998
 
992
999
  it "should not restrict the schema for datasets with a :select option" do
@@ -1052,7 +1059,7 @@ describe "Model.db_schema" do
1052
1059
  @c.primary_key.must_equal :id
1053
1060
  @c.dataset = ds
1054
1061
  @c.db_schema.must_equal(:x=>{:primary_key=>false}, :y=>{:primary_key=>false})
1055
- @c.primary_key.must_equal nil
1062
+ @c.primary_key.must_be_nil
1056
1063
  end
1057
1064
 
1058
1065
  it "should automatically set primary key for dataset selecting table.*" do
@@ -284,16 +284,15 @@ describe Sequel::Plugins do
284
284
  m = Module.new do
285
285
  module self::ClassMethods
286
286
  Sequel::Plugins.after_set_dataset(self, :one)
287
+ def foo; dataset.send(:cache_get, :foo) end
287
288
  private
288
- def one
289
- dataset.opts[:foo] = 1
290
- end
289
+ def one; dataset.send(:cache_set, :foo, 1) end
291
290
  end
292
291
  end
293
292
  @c.plugin m
294
- @c.dataset.opts[:foo].must_equal nil
293
+ @c.foo.must_be_nil
295
294
  @c.set_dataset :blah
296
- @c.dataset.opts[:foo].must_equal 1
295
+ @c.foo.must_equal 1
297
296
  end
298
297
  end
299
298
 
@@ -57,7 +57,7 @@ describe "Model#save" do
57
57
  @c = Class.new(Sequel::Model(:items)) do
58
58
  columns :id, :x, :y
59
59
  end
60
- @c.instance_dataset.autoid = @c.dataset.autoid = 13
60
+ @c.dataset = @c.dataset.with_autoid(13)
61
61
  DB.reset
62
62
  end
63
63
 
@@ -69,16 +69,16 @@ describe "Model#save" do
69
69
 
70
70
  it "should raise if the object can't be refreshed after save" do
71
71
  o = @c.new(:x => 1)
72
- @c.instance_dataset._fetch =@c.dataset._fetch = []
72
+ @c.dataset = @c.dataset.with_fetch([])
73
73
  proc{o.save}.must_raise(Sequel::NoExistingObject)
74
74
  end
75
75
 
76
76
  it "should use dataset's insert_select method if present" do
77
- ds = @c.instance_dataset
78
- ds._fetch = {:y=>2}
79
- def ds.supports_insert_select?() true end
80
- def ds.insert_select(hash)
81
- with_sql_first("INSERT INTO items (y) VALUES (2) RETURNING *")
77
+ @c.dataset = @c.dataset.with_fetch(:y=>2).with_extend do
78
+ def supports_insert_select?; true end
79
+ def insert_select(hash)
80
+ with_sql_first("INSERT INTO items (y) VALUES (2) RETURNING *")
81
+ end
82
82
  end
83
83
  o = @c.new(:x => 1)
84
84
  o.save
@@ -88,21 +88,19 @@ describe "Model#save" do
88
88
  end
89
89
 
90
90
  it "should not use dataset's insert_select method if specific columns are selected" do
91
- ds = @c.dataset = @c.dataset.select(:y)
92
- def ds.insert_select(*) raise; end
91
+ ds = @c.dataset = @c.dataset.select(:y).with_extend{def insert_select(*) raise; end}
93
92
  @c.new(:x => 1).save
94
93
  end
95
94
 
96
95
  it "should use dataset's insert_select method if the dataset uses returning, even if specific columns are selected" do
97
- def (@c.dataset).supports_returning?(_) true end
98
- ds = @c.dataset = @c.dataset.select(:y).returning(:y)
96
+ ds = @c.dataset = @c.dataset.select(:y).with_fetch(:y=>2).with_extend do
97
+ def supports_returning?(_) true end
98
+ def supports_insert_select?; true end
99
+ def insert_select(hash)
100
+ with_sql_first("INSERT INTO items (y) VALUES (2) RETURNING y")
101
+ end
102
+ end.returning(:y)
99
103
  DB.reset
100
- ds = @c.instance_dataset
101
- ds._fetch = {:y=>2}
102
- def ds.supports_insert_select?() true end
103
- def ds.insert_select(hash)
104
- with_sql_first("INSERT INTO items (y) VALUES (2) RETURNING y")
105
- end
106
104
  o = @c.new(:x => 1)
107
105
  o.save
108
106
 
@@ -149,19 +147,19 @@ describe "Model#save" do
149
147
  end
150
148
 
151
149
  it "should raise a NoExistingObject exception if the dataset update call doesn't return 1, unless require_modification is false" do
150
+ i = 0
151
+ @c.dataset = @c.dataset.with_extend{define_method(:numrows){i}}
152
152
  o = @c.load(:id => 3, :x => 1)
153
- t = o.this
154
- t.numrows = 0
155
153
  proc{o.save}.must_raise(Sequel::NoExistingObject)
156
- t.numrows = 2
154
+ i = 2
157
155
  proc{o.save}.must_raise(Sequel::NoExistingObject)
158
- t.numrows = 1
156
+ i = 1
159
157
  o.save
160
158
 
161
159
  o.require_modification = false
162
- t.numrows = 0
160
+ i = 0
163
161
  o.save
164
- t.numrows = 2
162
+ i = 2
165
163
  o.save
166
164
  end
167
165
 
@@ -190,7 +188,7 @@ describe "Model#save" do
190
188
  end
191
189
 
192
190
  it "should mark all columns as not changed if this is a new record and insert_select was used" do
193
- def (@c.dataset).insert_select(h) h.merge(:id=>1) end
191
+ ds = @c.dataset = @c.dataset.with_extend{def insert_select(h) h.merge(:id=>1) end}
194
192
  o = @c.new(:x => 1, :y => nil)
195
193
  o.x = 4
196
194
  o.changed_columns.must_equal [:x]
@@ -309,7 +307,7 @@ describe "Model#save" do
309
307
  false
310
308
  end
311
309
  DB.transaction do
312
- o.save(:columns=>:y).must_equal nil
310
+ o.save(:columns=>:y).must_be_nil
313
311
  DB.run "BLAH"
314
312
  end
315
313
  DB.sqls.must_equal ["BEGIN", "BLAH", "COMMIT"]
@@ -322,7 +320,7 @@ describe "Model#save" do
322
320
  def o.before_save
323
321
  false
324
322
  end
325
- o.save(:columns=>:y).must_equal nil
323
+ o.save(:columns=>:y).must_be_nil
326
324
  DB.sqls.must_equal ["BEGIN", "ROLLBACK"]
327
325
  end
328
326
 
@@ -499,11 +497,13 @@ describe "Model#dup" do
499
497
  end
500
498
 
501
499
  it "should not copy frozen status" do
502
- @o.freeze.dup.wont_be :frozen?
503
- @o.freeze.dup.values.wont_be :frozen?
504
- @o.freeze.dup.changed_columns.wont_be :frozen?
505
- @o.freeze.dup.errors.wont_be :frozen?
506
- @o.freeze.dup.this.wont_be :frozen?
500
+ this_frozen = @o.this.frozen?
501
+ d = @o.freeze.dup
502
+ d.wont_be :frozen?
503
+ d.values.wont_be :frozen?
504
+ d.changed_columns.wont_be :frozen?
505
+ d.errors.wont_be :frozen?
506
+ d.this.frozen?.must_equal this_frozen
507
507
  end
508
508
  end
509
509
 
@@ -820,7 +820,7 @@ end
820
820
 
821
821
  describe Sequel::Model, "without a primary key" do
822
822
  it "should return nil for primary key" do
823
- Class.new(Sequel::Model){no_primary_key}.primary_key.must_equal nil
823
+ Class.new(Sequel::Model){no_primary_key}.primary_key.must_be_nil
824
824
  end
825
825
 
826
826
  it "should raise a Sequel::Error on 'this'" do
@@ -1304,9 +1304,9 @@ describe Sequel::Model, "#(set|update)_(all|only)" do
1304
1304
  end
1305
1305
 
1306
1306
  it "#set_all should set not set restricted fields" do
1307
- @o1.use_after_commit_rollback.must_equal nil
1307
+ @o1.use_after_commit_rollback.must_be_nil
1308
1308
  @o1.set_all(:x => 1, :use_after_commit_rollback => true)
1309
- @o1.use_after_commit_rollback.must_equal nil
1309
+ @o1.use_after_commit_rollback.must_be_nil
1310
1310
  @o1.values.must_equal(:x => 1)
1311
1311
  end
1312
1312
 
@@ -1345,17 +1345,18 @@ describe Sequel::Model, "#destroy with filtered dataset" do
1345
1345
  end
1346
1346
 
1347
1347
  it "should raise a NoExistingObject exception if the dataset delete call doesn't return 1" do
1348
- def (@instance.this).execute_dui(*a) 0 end
1348
+ i = 0
1349
+ @model.dataset = @model.dataset.with_extend{define_method(:execute_dui){|*| i}}
1349
1350
  proc{@instance.delete}.must_raise(Sequel::NoExistingObject)
1350
- def (@instance.this).execute_dui(*a) 2 end
1351
+ i = 2
1351
1352
  proc{@instance.delete}.must_raise(Sequel::NoExistingObject)
1352
- def (@instance.this).execute_dui(*a) 1 end
1353
+ i = 1
1353
1354
  @instance.delete
1354
1355
 
1355
1356
  @instance.require_modification = false
1356
- def (@instance.this).execute_dui(*a) 0 end
1357
+ i = 0
1357
1358
  @instance.delete
1358
- def (@instance.this).execute_dui(*a) 2 end
1359
+ i = 2
1359
1360
  @instance.delete
1360
1361
  end
1361
1362
 
@@ -1379,17 +1380,18 @@ describe Sequel::Model, "#destroy" do
1379
1380
  end
1380
1381
 
1381
1382
  it "should raise a NoExistingObject exception if the dataset delete call doesn't return 1" do
1382
- def (@model.dataset).execute_dui(*a) 0 end
1383
+ i = 0
1384
+ @model.dataset = @model.dataset.with_extend{define_method(:execute_dui){|*| i}}
1383
1385
  proc{@instance.delete}.must_raise(Sequel::NoExistingObject)
1384
- def (@model.dataset).execute_dui(*a) 2 end
1386
+ i = 2
1385
1387
  proc{@instance.delete}.must_raise(Sequel::NoExistingObject)
1386
- def (@model.dataset).execute_dui(*a) 1 end
1388
+ i = 1
1387
1389
  @instance.delete
1388
1390
 
1389
1391
  @instance.require_modification = false
1390
- def (@model.dataset).execute_dui(*a) 0 end
1392
+ i = 0
1391
1393
  @instance.delete
1392
- def (@model.dataset).execute_dui(*a) 2 end
1394
+ i = 2
1393
1395
  @instance.delete
1394
1396
  end
1395
1397
 
@@ -1428,7 +1430,7 @@ end
1428
1430
  describe Sequel::Model, "#exists?" do
1429
1431
  before do
1430
1432
  @model = Class.new(Sequel::Model(:items))
1431
- @model.instance_dataset._fetch = @model.dataset._fetch = proc{|sql| {:x=>1} if sql =~ /id = 1/}
1433
+ @model.dataset = @model.dataset.with_fetch(proc{|sql| {:x=>1} if sql =~ /id = 1/})
1432
1434
  DB.reset
1433
1435
  end
1434
1436
 
@@ -1736,7 +1738,7 @@ describe Sequel::Model, "#refresh" do
1736
1738
  it "should reload the instance values from the database" do
1737
1739
  @m = @c.new(:id => 555)
1738
1740
  @m[:x] = 'blah'
1739
- @c.instance_dataset._fetch = @c.dataset._fetch = {:x => 'kaboom', :id => 555}
1741
+ @c.dataset = @c.dataset.with_fetch(:x => 'kaboom', :id => 555)
1740
1742
  @m.refresh
1741
1743
  @m[:x].must_equal 'kaboom'
1742
1744
  DB.sqls.must_equal ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
@@ -1744,14 +1746,14 @@ describe Sequel::Model, "#refresh" do
1744
1746
 
1745
1747
  it "should raise if the instance is not found" do
1746
1748
  @m = @c.new(:id => 555)
1747
- @c.instance_dataset._fetch =@c.dataset._fetch = []
1749
+ @c.dataset = @c.dataset.with_fetch([])
1748
1750
  proc {@m.refresh}.must_raise(Sequel::NoExistingObject)
1749
1751
  DB.sqls.must_equal ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
1750
1752
  end
1751
1753
 
1752
1754
  it "should be aliased by #reload" do
1753
1755
  @m = @c.new(:id => 555)
1754
- @c.instance_dataset._fetch =@c.dataset._fetch = {:x => 'kaboom', :id => 555}
1756
+ @c.dataset = @c.dataset.with_fetch(:x => 'kaboom', :id => 555)
1755
1757
  @m.reload
1756
1758
  @m[:x].must_equal 'kaboom'
1757
1759
  DB.sqls.must_equal ["SELECT * FROM items WHERE (id = 555) LIMIT 1"]
@@ -1795,7 +1797,7 @@ describe Sequel::Model, "typecasting" do
1795
1797
  @c.db_schema = {:x=>{:type=>x}}
1796
1798
  m = @c.new
1797
1799
  m.x = ''
1798
- m.x.must_equal nil
1800
+ m.x.must_be_nil
1799
1801
  end
1800
1802
  [:string, :blob].each do |x|
1801
1803
  @c.db_schema = {:x=>{:type=>x}}
@@ -1826,7 +1828,7 @@ describe Sequel::Model, "typecasting" do
1826
1828
  @c.db_schema[:x][:allow_null] = true
1827
1829
  m = @c.new
1828
1830
  m.x = nil
1829
- m.x.must_equal nil
1831
+ m.x.must_be_nil
1830
1832
  end
1831
1833
 
1832
1834
  it "should raise an error if attempting to typecast nil and NULLs are not allowed" do
@@ -1840,7 +1842,7 @@ describe Sequel::Model, "typecasting" do
1840
1842
  @c.db_schema[:x][:allow_null] = false
1841
1843
  m = @c.new
1842
1844
  m.x = nil
1843
- m.x.must_equal nil
1845
+ m.x.must_be_nil
1844
1846
  end
1845
1847
 
1846
1848
  it "should not raise when typecasting nil to NOT NULL column but raise_on_typecast_failure is off" do
@@ -1848,9 +1850,9 @@ describe Sequel::Model, "typecasting" do
1848
1850
  @c.typecast_on_assignment = true
1849
1851
  m = @c.new
1850
1852
  m.x = ''
1851
- m.x.must_equal nil
1853
+ m.x.must_be_nil
1852
1854
  m.x = nil
1853
- m.x.must_equal nil
1855
+ m.x.must_be_nil
1854
1856
  end
1855
1857
 
1856
1858
  it "should raise an error if invalid data is used in an integer field" do
@@ -1950,11 +1952,11 @@ describe Sequel::Model, "typecasting" do
1950
1952
  m.x = true
1951
1953
  m.x.must_equal true
1952
1954
  m.x = nil
1953
- m.x.must_equal nil
1955
+ m.x.must_be_nil
1954
1956
  m.x = ''
1955
- m.x.must_equal nil
1957
+ m.x.must_be_nil
1956
1958
  m.x = []
1957
- m.x.must_equal nil
1959
+ m.x.must_be_nil
1958
1960
  m.x = 'f'
1959
1961
  m.x.must_equal false
1960
1962
  m.x = 'F'
@@ -2123,7 +2125,7 @@ describe "Model#lock!" do
2123
2125
  @c = Class.new(Sequel::Model(:items)) do
2124
2126
  columns :id
2125
2127
  end
2126
- @c.dataset._fetch = {:id=>1}
2128
+ @c.dataset = @c.dataset.with_fetch(:id=>1)
2127
2129
  DB.reset
2128
2130
  end
2129
2131