sequel 4.41.0 → 4.42.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 (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