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
@@ -371,7 +371,7 @@ describe "Bound Argument Types" do
371
371
  cspecify "should handle blob type with nil values", [:oracle], [:tinytds], [:jdbc, :mssql] do
372
372
  @ds.delete
373
373
  @ds.prepare(:insert, :ps_blob, {:file=>:$x}).call(:x=>nil)
374
- @ds.get(:file).must_equal nil
374
+ @ds.get(:file).must_be_nil
375
375
  end
376
376
 
377
377
  cspecify "should handle blob type with embedded zeros", [:odbc] do
@@ -412,10 +412,10 @@ describe "Dataset#unbind" do
412
412
  it "should unbind values assigned to equality and inequality statements" do
413
413
  @ct[Integer, 10]
414
414
  @u[@ds.filter(:c=>10)].must_equal(:c=>10)
415
- @u[@ds.exclude(:c=>10)].must_equal nil
416
- @u[@ds.filter{c < 10}].must_equal nil
415
+ @u[@ds.exclude(:c=>10)].must_be_nil
416
+ @u[@ds.filter{c < 10}].must_be_nil
417
417
  @u[@ds.filter{c <= 10}].must_equal(:c=>10)
418
- @u[@ds.filter{c > 10}].must_equal nil
418
+ @u[@ds.filter{c > 10}].must_be_nil
419
419
  @u[@ds.filter{c >= 10}].must_equal(:c=>10)
420
420
  end
421
421
 
@@ -456,12 +456,12 @@ describe "Dataset#unbind" do
456
456
  end
457
457
  @ds.insert(:a=>2, :b=>0, :c=>3, :d=>5)
458
458
  @u[@ds.filter{a > 1}.and{b < 2}.or(:c=>3).and(Sequel.case({~Sequel.expr(:d=>4)=>1}, 0) => 1)].must_equal(:a=>2, :b=>0, :c=>3, :d=>5)
459
- @u[@ds.filter{a > 1}.and{b < 2}.or(:c=>3).and(Sequel.case({~Sequel.expr(:d=>5)=>1}, 0) => 1)].must_equal nil
459
+ @u[@ds.filter{a > 1}.and{b < 2}.or(:c=>3).and(Sequel.case({~Sequel.expr(:d=>5)=>1}, 0) => 1)].must_be_nil
460
460
  end
461
461
 
462
462
  it "should handle case where the same variable has the same value in multiple places " do
463
463
  @ct[Integer, 1]
464
464
  @u[@ds.filter{c > 1}.or{c < 1}.invert].must_equal(:c=>1)
465
- @u[@ds.filter{c > 1}.or{c < 1}].must_equal nil
465
+ @u[@ds.filter{c > 1}.or{c < 1}].must_be_nil
466
466
  end
467
467
  end
@@ -1,50 +1,54 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper.rb')
2
2
 
3
3
  describe "Database schema parser" do
4
- before do
5
- @iom = DB.identifier_output_method
6
- @iim = DB.identifier_input_method
7
- @qi = DB.quote_identifiers?
8
- end
9
4
  after do
10
- DB.identifier_output_method = @iom
11
- DB.identifier_input_method = @iim
12
- DB.quote_identifiers = @qi
13
5
  DB.drop_table?(:items)
14
6
  end
15
7
 
16
- it "should handle a database with a identifier methods" do
17
- DB.identifier_output_method = :reverse
18
- DB.identifier_input_method = :reverse
19
- DB.quote_identifiers = true
20
- DB.create_table!(:items){Integer :number}
21
- begin
22
- DB.schema(:items, :reload=>true).must_be_kind_of(Array)
23
- DB.schema(:items, :reload=>true).first.first.must_equal :number
24
- ensure
25
- DB.drop_table(:items)
8
+ describe "with identifier mangling" do
9
+ before do
10
+ @iom = DB.identifier_output_method
11
+ @iim = DB.identifier_input_method
12
+ @qi = DB.quote_identifiers?
13
+ end
14
+ after do
15
+ DB.identifier_output_method = @iom
16
+ DB.identifier_input_method = @iim
17
+ DB.quote_identifiers = @qi
26
18
  end
27
- end
28
19
 
29
- it "should handle a dataset with identifier methods different than the database's" do
30
- DB.identifier_output_method = :reverse
31
- DB.identifier_input_method = :reverse
32
- DB.quote_identifiers = true
33
- DB.create_table!(:items){Integer :number}
34
- DB.identifier_output_method = @iom
35
- DB.identifier_input_method = @iim
36
- ds = DB[:items].
37
- with_identifier_output_method(:reverse).
38
- with_identifier_input_method(:reverse)
39
- begin
40
- DB.schema(ds, :reload=>true).must_be_kind_of(Array)
41
- DB.schema(ds, :reload=>true).first.first.must_equal :number
42
- ensure
20
+ it "should handle a database with a identifier methods" do
43
21
  DB.identifier_output_method = :reverse
44
22
  DB.identifier_input_method = :reverse
45
- DB.drop_table(:items)
23
+ DB.quote_identifiers = true
24
+ DB.create_table!(:items){Integer :number}
25
+ begin
26
+ DB.schema(:items, :reload=>true).must_be_kind_of(Array)
27
+ DB.schema(:items, :reload=>true).first.first.must_equal :number
28
+ ensure
29
+ end
46
30
  end
47
- end
31
+
32
+ it "should handle a dataset with identifier methods different than the database's" do
33
+ DB.identifier_output_method = :reverse
34
+ DB.identifier_input_method = :reverse
35
+ DB.quote_identifiers = true
36
+ DB.create_table!(:items){Integer :number}
37
+ DB.identifier_output_method = @iom
38
+ DB.identifier_input_method = @iim
39
+ ds = DB[:items].
40
+ with_identifier_output_method(:reverse).
41
+ with_identifier_input_method(:reverse)
42
+ begin
43
+ DB.schema(ds, :reload=>true).must_be_kind_of(Array)
44
+ DB.schema(ds, :reload=>true).first.first.must_equal :number
45
+ ensure
46
+ DB.identifier_output_method = :reverse
47
+ DB.identifier_input_method = :reverse
48
+ DB.drop_table(:items)
49
+ end
50
+ end
51
+ end if IDENTIFIER_MANGLING
48
52
 
49
53
  it "should not issue an sql query if the schema has been loaded unless :reload is true" do
50
54
  DB.create_table!(:items){Integer :number}
@@ -106,7 +110,7 @@ describe "Database schema parser" do
106
110
 
107
111
  it "should parse defaults from the schema properly" do
108
112
  DB.create_table!(:items){Integer :number}
109
- DB.schema(:items).first.last[:ruby_default].must_equal nil
113
+ DB.schema(:items).first.last[:ruby_default].must_be_nil
110
114
  DB.create_table!(:items){Integer :number, :default=>0}
111
115
  DB.schema(:items).first.last[:ruby_default].must_equal 0
112
116
  DB.create_table!(:items){String :a, :default=>"blah"}
@@ -115,7 +119,7 @@ describe "Database schema parser" do
115
119
 
116
120
  it "should make :default nil for a NULL default" do
117
121
  DB.create_table!(:items){Integer :number}
118
- DB.schema(:items).first.last[:default].must_equal nil
122
+ DB.schema(:items).first.last[:default].must_be_nil
119
123
  DB.create_table!(:items){Integer :number, :default=>0}
120
124
  DB.schema(:items).first.last[:default].wont_equal nil
121
125
  end
@@ -796,12 +800,8 @@ describe "Database#tables and #views" do
796
800
  @db.drop_table?(:sequel_test_table)
797
801
  @db.create_table(:sequel_test_table){Integer :a}
798
802
  @db.create_view :sequel_test_view, @db[:sequel_test_table]
799
- @iom = @db.identifier_output_method
800
- @iim = @db.identifier_input_method
801
803
  end
802
804
  after do
803
- @db.identifier_output_method = @iom
804
- @db.identifier_input_method = @iim
805
805
  @db.drop_view :sequel_test_view
806
806
  @db.drop_table :sequel_test_table
807
807
  end
@@ -814,12 +814,6 @@ describe "Database#tables and #views" do
814
814
  ts.wont_include(:sequel_test_view)
815
815
  end if DB.supports_table_listing?
816
816
 
817
- it "#tables should respect the database's identifier_output_method" do
818
- @db.identifier_output_method = :xxxxx
819
- @db.identifier_input_method = :xxxxx
820
- @db.tables.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
821
- end if DB.supports_table_listing?
822
-
823
817
  it "#views should return an array of symbols" do
824
818
  ts = @db.views
825
819
  ts.must_be_kind_of(Array)
@@ -828,9 +822,26 @@ describe "Database#tables and #views" do
828
822
  ts.must_include(:sequel_test_view)
829
823
  end if DB.supports_view_listing?
830
824
 
831
- it "#views should respect the database's identifier_output_method" do
832
- @db.identifier_output_method = :xxxxx
833
- @db.identifier_input_method = :xxxxx
834
- @db.views.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
835
- end if DB.supports_view_listing?
825
+ describe "with identifier mangling" do
826
+ before do
827
+ @iom = @db.identifier_output_method
828
+ @iim = @db.identifier_input_method
829
+ end
830
+ after do
831
+ @db.identifier_output_method = @iom
832
+ @db.identifier_input_method = @iim
833
+ end
834
+
835
+ it "#tables should respect the database's identifier_output_method" do
836
+ @db.identifier_output_method = :xxxxx
837
+ @db.identifier_input_method = :xxxxx
838
+ @db.tables.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
839
+ end if DB.supports_table_listing?
840
+
841
+ it "#views should respect the database's identifier_output_method" do
842
+ @db.identifier_output_method = :xxxxx
843
+ @db.identifier_input_method = :xxxxx
844
+ @db.views.each{|t| t.to_s.must_match(/\Ax{5}\d+\z/)}
845
+ end if DB.supports_view_listing?
846
+ end if IDENTIFIER_MANGLING
836
847
  end
@@ -25,8 +25,13 @@ Sequel.cache_anonymous_models = false
25
25
 
26
26
  require './spec/guards_helper'
27
27
 
28
+ IDENTIFIER_MANGLING = !ENV['SEQUEL_NO_MANGLE'] unless defined?(IDENTIFIER_MANGLING)
29
+
28
30
  unless defined?(DB)
29
- DB = Sequel.connect(ENV['SEQUEL_INTEGRATION_URL'])
31
+ opts = {}
32
+ opts[:identifier_mangling] = false unless IDENTIFIER_MANGLING
33
+ DB = Sequel.connect(ENV['SEQUEL_INTEGRATION_URL'], opts)
34
+ DB.extension(:freeze_datasets) if ENV['SEQUEL_FREEZE_DATASETS']
30
35
  end
31
36
 
32
37
  if DB.adapter_scheme == :ibmdb || (DB.adapter_scheme == :ado && DB.database_type == :access)
@@ -40,7 +40,7 @@ describe "Database transactions" do
40
40
  @db.transaction do
41
41
  @d << {:name => 'abc', :value => 1}
42
42
  raise Sequel::Rollback
43
- end.must_equal nil
43
+ end.must_be_nil
44
44
 
45
45
  proc do
46
46
  @db.transaction(:rollback=>:reraise) do
@@ -235,30 +235,30 @@ describe "Database transactions" do
235
235
  it "should support after_rollback outside transactions" do
236
236
  c = nil
237
237
  @db.after_rollback{c = 1}
238
- c.must_equal nil
238
+ c.must_be_nil
239
239
  end
240
240
 
241
241
  it "should support after_commit inside transactions" do
242
242
  c = nil
243
- @db.transaction{@db.after_commit{c = 1}; c.must_equal nil}
243
+ @db.transaction{@db.after_commit{c = 1}; c.must_be_nil}
244
244
  c.must_equal 1
245
245
  end
246
246
 
247
247
  it "should support after_rollback inside transactions" do
248
248
  c = nil
249
- @db.transaction{@db.after_rollback{c = 1}; c.must_equal nil}
250
- c.must_equal nil
249
+ @db.transaction{@db.after_rollback{c = 1}; c.must_be_nil}
250
+ c.must_be_nil
251
251
  end
252
252
 
253
253
  it "should not call after_commit if the transaction rolls back" do
254
254
  c = nil
255
- @db.transaction{@db.after_commit{c = 1}; c.must_equal nil; raise Sequel::Rollback}
256
- c.must_equal nil
255
+ @db.transaction{@db.after_commit{c = 1}; c.must_be_nil; raise Sequel::Rollback}
256
+ c.must_be_nil
257
257
  end
258
258
 
259
259
  it "should call after_rollback if the transaction rolls back" do
260
260
  c = nil
261
- @db.transaction{@db.after_rollback{c = 1}; c.must_equal nil; raise Sequel::Rollback}
261
+ @db.transaction{@db.after_rollback{c = 1}; c.must_be_nil; raise Sequel::Rollback}
262
262
  c.must_equal 1
263
263
  end
264
264
 
@@ -276,26 +276,26 @@ describe "Database transactions" do
276
276
 
277
277
  it "should support after_commit inside nested transactions" do
278
278
  c = nil
279
- @db.transaction{@db.transaction{@db.after_commit{c = 1}}; c.must_equal nil}
279
+ @db.transaction{@db.transaction{@db.after_commit{c = 1}}; c.must_be_nil}
280
280
  c.must_equal 1
281
281
  end
282
282
 
283
283
  it "should support after_rollback inside nested transactions" do
284
284
  c = nil
285
- @db.transaction{@db.transaction{@db.after_rollback{c = 1}}; c.must_equal nil; raise Sequel::Rollback}
285
+ @db.transaction{@db.transaction{@db.after_rollback{c = 1}}; c.must_be_nil; raise Sequel::Rollback}
286
286
  c.must_equal 1
287
287
  end
288
288
 
289
289
  if DB.supports_savepoints?
290
290
  it "should support after_commit inside savepoints" do
291
291
  c = nil
292
- @db.transaction{@db.transaction(:savepoint=>true){@db.after_commit{c = 1}}; c.must_equal nil}
292
+ @db.transaction{@db.transaction(:savepoint=>true){@db.after_commit{c = 1}}; c.must_be_nil}
293
293
  c.must_equal 1
294
294
  end
295
295
 
296
296
  it "should support after_rollback inside savepoints" do
297
297
  c = nil
298
- @db.transaction{@db.transaction(:savepoint=>true){@db.after_rollback{c = 1}}; c.must_equal nil; raise Sequel::Rollback}
298
+ @db.transaction{@db.transaction(:savepoint=>true){@db.after_rollback{c = 1}}; c.must_be_nil; raise Sequel::Rollback}
299
299
  c.must_equal 1
300
300
  end
301
301
  end
@@ -315,7 +315,7 @@ describe "Database transactions" do
315
315
  end
316
316
  end
317
317
 
318
- if (! defined?(RUBY_ENGINE) or RUBY_ENGINE == 'ruby' or (RUBY_ENGINE == 'rbx' && !Sequel.guarded?([:do, :sqlite], [:tinytds, :mssql]))) and RUBY_VERSION < '1.9'
318
+ if (! defined?(RUBY_ENGINE) or RUBY_ENGINE == 'ruby') and RUBY_VERSION < '1.9'
319
319
  describe "Database transactions and Thread#kill" do
320
320
  before do
321
321
  @db = DB
@@ -208,10 +208,10 @@ describe Sequel::Model::Associations::AssociationReflection, "#select" do
208
208
  it "should be blank if :select is not present for a many_to_one and one_to_many associaiton" do
209
209
  @c.one_to_many :cs, :class=>'ParParent'
210
210
  @c.association_reflection(:cs).keys.wont_include(:select)
211
- @c.association_reflection(:cs).select.must_equal nil
211
+ @c.association_reflection(:cs).select.must_be_nil
212
212
  @c.many_to_one :c, :class=>'ParParent'
213
213
  @c.association_reflection(:c).keys.wont_include(:select)
214
- @c.association_reflection(:c).select.must_equal nil
214
+ @c.association_reflection(:c).select.must_be_nil
215
215
  end
216
216
  end
217
217
 
@@ -319,11 +319,11 @@ describe Sequel::Model::Associations::AssociationReflection, "#filter_by_associa
319
319
 
320
320
  it "should be nil by default for *_one associations" do
321
321
  @c.many_to_one :c, :class=>@c
322
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
322
+ @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
323
323
  @c.one_to_one :c, :class=>@c
324
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
324
+ @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
325
325
  @c.one_through_one :c, :class=>@c
326
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
326
+ @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
327
327
  end
328
328
 
329
329
  it "should be :correlated_subquery by default for one_to_many and one_to_one with :order associations" do
@@ -342,11 +342,11 @@ describe Sequel::Model::Associations::AssociationReflection, "#filter_by_associa
342
342
 
343
343
  it "should be nil for many_to_one associations even if :eager_limit_strategy or :filter_limit_strategy is used" do
344
344
  @c.many_to_one :c, :class=>@c, :eager_limit_strategy=>true
345
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
345
+ @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
346
346
  @c.many_to_one :c, :class=>@c, :eager_limit_strategy=>:distinct_on
347
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
347
+ @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
348
348
  @c.many_to_one :c, :class=>@c, :filter_limit_strategy=>true
349
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
349
+ @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
350
350
  end
351
351
 
352
352
  it "should be a symbol for other associations if given a symbol" do
@@ -357,13 +357,13 @@ describe Sequel::Model::Associations::AssociationReflection, "#filter_by_associa
357
357
  end
358
358
 
359
359
  it "should use :distinct_on for one_to_one associations if picking and the association dataset supports ordered distinct on" do
360
- def (@c.dataset).supports_ordered_distinct_on?() true end
360
+ @c.dataset = @c.dataset.with_extend{def supports_ordered_distinct_on?; true end}
361
361
  @c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
362
362
  @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :distinct_on
363
363
  end
364
364
 
365
365
  it "should use :window_function for associations if picking and the association dataset supports window functions" do
366
- def (@c.dataset).supports_window_functions?() true end
366
+ @c.dataset = @c.dataset.with_extend{def supports_window_functions?; true end}
367
367
  @c.one_to_one :c, :class=>@c, :eager_limit_strategy=>true
368
368
  @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal :window_function
369
369
  @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
@@ -373,21 +373,21 @@ describe Sequel::Model::Associations::AssociationReflection, "#filter_by_associa
373
373
  end
374
374
 
375
375
  it "should use :ruby for one_to_many associations if the database doesn't support limits in subqueries" do
376
- def (@c.dataset).supports_limits_in_correlated_subqueries?; false; end
376
+ @c.dataset = @c.dataset.with_extend{def supports_limits_in_correlated_subqueries?; false end}
377
377
  @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
378
378
  @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
379
379
  end
380
380
 
381
381
  it "should use :ruby for one_to_many associations if offset doesn't work in correlated subqueries and an offset is used" do
382
- def (@c.dataset).supports_offsets_in_correlated_subqueries?; false; end
382
+ @c.dataset = @c.dataset.with_extend{def supports_offsets_in_correlated_subqueries?; false end}
383
383
  @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1
384
384
  @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
385
385
  @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>[1, 1]
386
386
  @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
387
387
  end
388
388
 
389
- it "should use :ruby for one_to_many associations if composite primary key is used and database does not multiple columns in IN" do
390
- def (@c.dataset).supports_multiple_column_in?; false; end
389
+ it "should use :ruby for one_to_many associations if composite primary key is used and database does not support multiple columns in IN" do
390
+ @c.dataset = @c.dataset.with_extend{def supports_multiple_column_in?; false end}
391
391
  @c.set_primary_key [:id, :id2]
392
392
  @c.one_to_many :cs, :class=>@c, :eager_limit_strategy=>true, :limit=>1, :key=>[:id, :id2]
393
393
  @c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :ruby
@@ -414,7 +414,7 @@ describe Sequel::Model::Associations::AssociationReflection, "#filter_by_associa
414
414
  c.dataset = :a
415
415
  c.one_to_many :cs, :class=>c, :limit=>1
416
416
  c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :correlated_subquery
417
- def (c.dataset).supports_window_functions?() true end
417
+ c.dataset = c.dataset.with_extend{def supports_window_functions?; true end}
418
418
  c.many_to_many :cs, :class=>c, :limit=>1
419
419
  c.association_reflection(:cs).send(:filter_by_associations_limit_strategy).must_equal :window_function
420
420
  end
@@ -422,7 +422,7 @@ describe Sequel::Model::Associations::AssociationReflection, "#filter_by_associa
422
422
  it "should ignore Model.default_eager_limit_strategy for one_to_one associations" do
423
423
  @c.default_eager_limit_strategy = :window_function
424
424
  @c.one_to_one :c, :class=>@c
425
- @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_equal nil
425
+ @c.association_reflection(:c).send(:filter_by_associations_limit_strategy).must_be_nil
426
426
  end
427
427
  end
428
428
 
@@ -459,7 +459,7 @@ describe Sequel::Model, " association reflection methods" do
459
459
  end
460
460
 
461
461
  it "#association_reflection should return nil for nonexistent association" do
462
- @c1.association_reflection(:blah).must_equal nil
462
+ @c1.association_reflection(:blah).must_be_nil
463
463
  end
464
464
 
465
465
  it "#association_reflection should return association reflection hash if association exists" do
@@ -118,7 +118,7 @@ describe Sequel::Model, "associate" do
118
118
  klass.association_reflection(:par)[:eager_block].call.must_equal 1
119
119
  klass.association_reflection(:par1s)[:limit].must_equal 10
120
120
  klass.association_reflection(:par1s)[:order].must_equal :b
121
- klass.association_reflection(:par1s)[:block].must_equal nil
121
+ klass.association_reflection(:par1s)[:block].must_be_nil
122
122
  klass.association_reflection(:par2s)[:after_load].length.must_equal 1
123
123
  klass.association_reflection(:par2s)[:order].must_equal :c
124
124
  klass.association_reflection(:par2s)[:block].call.must_equal 3
@@ -177,9 +177,10 @@ describe Sequel::Model, "associate" do
177
177
  end
178
178
 
179
179
  it "should not clear associations cache when saving with insert_select" do
180
- ds = Sequel::Model.db[:c]
181
- def ds.supports_insert_select?() true end
182
- def ds.insert_select(*) {:id=>1} end
180
+ ds = Sequel::Model.db[:c].with_extend do
181
+ def supports_insert_select?; true end
182
+ def insert_select(*) {:id=>1} end
183
+ end
183
184
  c = Class.new(Sequel::Model(ds))
184
185
  c.many_to_one :c
185
186
  o = c.new
@@ -297,7 +298,7 @@ describe Sequel::Model, "many_to_one" do
297
298
 
298
299
  it "should not issue query if not all keys have values" do
299
300
  @c2.many_to_one :parent, :class => @c2, :key=>[:id, :parent_id], :primary_key=>[:parent_id, :id]
300
- @c2.new(:id => 1, :parent_id => nil).parent.must_equal nil
301
+ @c2.new(:id => 1, :parent_id => nil).parent.must_be_nil
301
302
  DB.sqls.must_equal []
302
303
  end
303
304
 
@@ -334,18 +335,18 @@ describe Sequel::Model, "many_to_one" do
334
335
 
335
336
  it "should return nil if key value is nil" do
336
337
  @c2.many_to_one :parent, :class => @c2
337
- @c2.new(:id => 1).parent.must_equal nil
338
+ @c2.new(:id => 1).parent.must_be_nil
338
339
  DB.sqls.must_equal []
339
340
  end
340
341
 
341
342
  it "should cache negative lookup" do
342
343
  @c2.many_to_one :parent, :class => @c2
343
- @c2.dataset._fetch = []
344
+ @c2.dataset = @c2.dataset.with_fetch([])
344
345
  d = @c2.new(:id => 1, :parent_id=>555)
345
346
  DB.sqls.must_equal []
346
- d.parent.must_equal nil
347
+ d.parent.must_be_nil
347
348
  DB.sqls.must_equal ['SELECT * FROM nodes WHERE id = 555']
348
- d.parent.must_equal nil
349
+ d.parent.must_be_nil
349
350
  DB.sqls.must_equal []
350
351
  end
351
352
 
@@ -410,8 +411,8 @@ describe Sequel::Model, "many_to_one" do
410
411
 
411
412
  d = @c2.load(:id => 1)
412
413
  d.parent_id = 234
413
- d.associations[:parent].must_equal nil
414
- @c2.dataset._fetch = {:id=>234}
414
+ d.associations[:parent].must_be_nil
415
+ @c2.dataset = @c2.dataset.with_fetch(:id=>234)
415
416
  e = d.parent
416
417
  DB.sqls.must_equal ["SELECT * FROM nodes WHERE id = 234"]
417
418
  d.associations[:parent].must_equal e
@@ -422,7 +423,7 @@ describe Sequel::Model, "many_to_one" do
422
423
 
423
424
  d = @c2.create(:id => 1)
424
425
  DB.reset
425
- d.associations[:parent].must_equal nil
426
+ d.associations[:parent].must_be_nil
426
427
  d.parent = @c2.new(:id => 234)
427
428
  e = d.parent
428
429
  d.associations[:parent].must_equal e
@@ -479,7 +480,7 @@ describe Sequel::Model, "many_to_one" do
479
480
  it "should have the setter add to the reciprocal one_to_many cached association array if it exists" do
480
481
  @c2.many_to_one :parent, :class => @c2
481
482
  @c2.one_to_many :children, :class => @c2, :key=>:parent_id
482
- @c2.dataset._fetch = []
483
+ @c2.dataset = @c2.dataset.with_fetch([])
483
484
 
484
485
  d = @c2.new(:id => 1)
485
486
  e = @c2.new(:id => 2)
@@ -507,13 +508,13 @@ describe Sequel::Model, "many_to_one" do
507
508
  d.parent = e
508
509
  e.child.must_equal d
509
510
  d.parent = nil
510
- e.child.must_equal nil
511
+ e.child.must_be_nil
511
512
  d.parent = e
512
513
  e.child.must_equal d
513
514
 
514
515
  f = @c2.new(:id => 3)
515
516
  d.parent = nil
516
- e.child.must_equal nil
517
+ e.child.must_be_nil
517
518
  e.associations[:child] = f
518
519
  d.parent = e
519
520
  e.child.must_equal d
@@ -522,7 +523,7 @@ describe Sequel::Model, "many_to_one" do
522
523
  it "should have the setter remove the object from the previous associated object's reciprocal one_to_many cached association array if it exists" do
523
524
  @c2.many_to_one :parent, :class => @c2
524
525
  @c2.one_to_many :children, :class => @c2, :key=>:parent_id
525
- @c2.dataset._fetch = []
526
+ @c2.dataset = @c2.dataset.with_fetch([])
526
527
 
527
528
  d = @c2.new(:id => 1)
528
529
  e = @c2.new(:id => 2)
@@ -555,9 +556,10 @@ describe Sequel::Model, "many_to_one" do
555
556
  end
556
557
 
557
558
  it "should get all matching records and only return the first if :key option is set to nil" do
559
+ @c2.dataset = @c2.dataset.with_fetch([{:id=>1, :parent_id=>0, :par_parent_id=>3, :blah=>4, :children_id=>2, :children_parent_id=>1, :children_par_parent_id=>5, :children_blah=>6}, {}])
560
+ @c2.dataset.columns(:id, :parent_id, :par_parent_id, :blah)
558
561
  @c2.one_to_many :children, :class => @c2, :key=>:parent_id
559
562
  @c2.many_to_one :first_grand_parent, :class => @c2, :key=>nil, :eager_graph=>:children, :dataset=>proc{model.filter(:children_id=>parent_id)}
560
- @c2.dataset.columns(:id, :parent_id, :par_parent_id, :blah)._fetch = [{:id=>1, :parent_id=>0, :par_parent_id=>3, :blah=>4, :children_id=>2, :children_parent_id=>1, :children_par_parent_id=>5, :children_blah=>6}, {}]
561
563
  p = @c2.new(:parent_id=>2)
562
564
  fgp = p.first_grand_parent
563
565
  DB.sqls.must_equal ["SELECT nodes.id, nodes.parent_id, nodes.par_parent_id, nodes.blah, children.id AS children_id, children.parent_id AS children_parent_id, children.par_parent_id AS children_par_parent_id, children.blah AS children_blah FROM nodes LEFT OUTER JOIN nodes AS children ON (children.parent_id = nodes.id) WHERE (children_id = 2)"]
@@ -655,7 +657,7 @@ describe Sequel::Model, "many_to_one" do
655
657
  def al(v)
656
658
  model::Foo << v.pk
657
659
  end
658
- dataset._fetch = {:id=>20}
660
+ set_dataset dataset.with_fetch(:id=>20)
659
661
  end
660
662
  p = @c2.load(:id=>10, :parent_id=>20)
661
663
  parent = p.parent
@@ -684,7 +686,7 @@ describe Sequel::Model, "many_to_one" do
684
686
  def p._parent=; raise; end
685
687
  proc{p.parent = c}.must_raise(Sequel::HookFailed)
686
688
 
687
- p.parent.must_equal nil
689
+ p.parent.must_be_nil
688
690
  p.associations[:parent] = c
689
691
  p.parent.must_equal c
690
692
  proc{p.parent = nil}.must_raise(Sequel::HookFailed)
@@ -699,7 +701,7 @@ describe Sequel::Model, "many_to_one" do
699
701
  def p._parent=; raise; end
700
702
  proc{p.parent = c}.must_raise(Sequel::HookFailed)
701
703
 
702
- p.parent.must_equal nil
704
+ p.parent.must_be_nil
703
705
  p.associations[:parent] = c
704
706
  p.parent.must_equal c
705
707
  proc{p.parent = nil}.must_raise(Sequel::HookFailed)
@@ -732,8 +734,8 @@ describe Sequel::Model, "one_to_one" do
732
734
  columns :id, :x, :parent_id, :par_parent_id, :blah, :node_id
733
735
  end
734
736
  @dataset = @c2.dataset
735
- @dataset._fetch = {}
736
- @c1.dataset._fetch = {}
737
+ @dataset = @dataset.with_fetch({})
738
+ @c1.dataset = @c1.dataset.with_fetch({})
737
739
  DB.reset
738
740
  end
739
741
 
@@ -755,7 +757,7 @@ describe Sequel::Model, "one_to_one" do
755
757
  it "should add a setter method" do
756
758
  @c2.one_to_one :attribute, :class => @c1
757
759
  attrib = @c1.new(:id=>3)
758
- @c1.dataset._fetch = @c1.instance_dataset._fetch = {:id=>3}
760
+ @c1.dataset = @c1.dataset.with_fetch(:id=>3)
759
761
  @c2.new(:id => 1234).attribute = attrib
760
762
  sqls = DB.sqls
761
763
  ['INSERT INTO attributes (node_id, id) VALUES (1234, 3)',
@@ -794,7 +796,7 @@ describe Sequel::Model, "one_to_one" do
794
796
  it "should have the setter method respect the :primary_key option" do
795
797
  @c2.one_to_one :attribute, :class => @c1, :primary_key=>:xxx
796
798
  attrib = @c1.new(:id=>3)
797
- @c1.dataset._fetch = @c1.instance_dataset._fetch = {:id=>3}
799
+ @c1.dataset = @c1.dataset.with_fetch(:id=>3)
798
800
  @c2.new(:id => 1234, :xxx=>5).attribute = attrib
799
801
  sqls = DB.sqls
800
802
  ['INSERT INTO attributes (node_id, id) VALUES (5, 3)',
@@ -812,7 +814,7 @@ describe Sequel::Model, "one_to_one" do
812
814
  it "should have the setter method respect composite keys" do
813
815
  @c2.one_to_one :attribute, :class => @c1, :key=>[:node_id, :y], :primary_key=>[:id, :x]
814
816
  attrib = @c1.load(:id=>3, :y=>6)
815
- @c1.dataset._fetch = {:id=>3, :y=>6}
817
+ @c1.dataset = @c1.dataset.with_fetch(:id=>3, :y=>6)
816
818
  @c2.load(:id => 1234, :x=>5).attribute = attrib
817
819
  sqls = DB.sqls
818
820
  sqls.last.must_match(/UPDATE attributes SET (node_id = 1234|y = 5), (node_id = 1234|y = 5) WHERE \(id = 3\)/)
@@ -821,6 +823,7 @@ describe Sequel::Model, "one_to_one" do
821
823
  end
822
824
 
823
825
  it "should use implicit key if omitted" do
826
+ @c2.dataset = @c2.dataset.with_fetch({})
824
827
  @c2.one_to_one :parent, :class => @c2
825
828
 
826
829
  d = @c2.new(:id => 234)
@@ -856,6 +859,7 @@ describe Sequel::Model, "one_to_one" do
856
859
  end
857
860
 
858
861
  it "should use explicit key if given" do
862
+ @c2.dataset = @c2.dataset.with_fetch({})
859
863
  @c2.one_to_one :parent, :class => @c2, :key => :blah
860
864
 
861
865
  d = @c2.new(:id => 234)
@@ -880,7 +884,7 @@ describe Sequel::Model, "one_to_one" do
880
884
 
881
885
  it "should not issue query if not all keys have values" do
882
886
  @c2.one_to_one :parent, :class => @c2, :key=>[:id, :parent_id], :primary_key=>[:parent_id, :id]
883
- @c2.new(:id => 1, :parent_id => nil).parent.must_equal nil
887
+ @c2.new(:id => 1, :parent_id => nil).parent.must_be_nil
884
888
  DB.sqls.must_equal []
885
889
  end
886
890
 
@@ -918,18 +922,18 @@ describe Sequel::Model, "one_to_one" do
918
922
  it "should return nil if primary_key value is nil" do
919
923
  @c2.one_to_one :parent, :class => @c2, :primary_key=>:node_id
920
924
 
921
- @c2.new(:id => 1).parent.must_equal nil
925
+ @c2.new(:id => 1).parent.must_be_nil
922
926
  DB.sqls.must_equal []
923
927
  end
924
928
 
925
929
  it "should cache negative lookup" do
926
930
  @c2.one_to_one :parent, :class => @c2
927
- @c2.dataset._fetch = []
931
+ @c2.dataset = @c2.dataset.with_fetch([])
928
932
  d = @c2.new(:id => 555)
929
933
  DB.sqls.must_equal []
930
- d.parent.must_equal nil
934
+ d.parent.must_be_nil
931
935
  DB.sqls.must_equal ['SELECT * FROM nodes WHERE (nodes.node_id = 555) LIMIT 1']
932
- d.parent.must_equal nil
936
+ d.parent.must_be_nil
933
937
  DB.sqls.must_equal []
934
938
  end
935
939
 
@@ -937,7 +941,7 @@ describe Sequel::Model, "one_to_one" do
937
941
  @c2.one_to_one :parent, :class => @c2, :key=>:blah
938
942
  d = @c2.new(:id => 3)
939
943
  e = @c2.new(:id => 4321, :blah=>444)
940
- @c2.dataset._fetch = @c2.instance_dataset._fetch = {:id => 4321, :blah => 3}
944
+ @c2.dataset = @c2.dataset.with_fetch(:id => 4321, :blah => 3)
941
945
  d.parent = e
942
946
  e.values.must_equal(:id => 4321, :blah => 3)
943
947
  sqls = DB.sqls
@@ -958,8 +962,8 @@ describe Sequel::Model, "one_to_one" do
958
962
  @c2.one_to_one :parent, :class => @c2
959
963
 
960
964
  d = @c2.load(:id => 1)
961
- d.associations[:parent].must_equal nil
962
- @c2.dataset._fetch = {:id=>234}
965
+ d.associations[:parent].must_be_nil
966
+ @c2.dataset = @c2.dataset.with_fetch(:id=>234)
963
967
  e = d.parent
964
968
  DB.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.node_id = 1) LIMIT 1"]
965
969
  d.parent
@@ -971,7 +975,7 @@ describe Sequel::Model, "one_to_one" do
971
975
  @c2.one_to_one :parent, :class => @c2
972
976
 
973
977
  d = @c2.load(:id => 1)
974
- d.associations[:parent].must_equal nil
978
+ d.associations[:parent].must_be_nil
975
979
  e = @c2.load(:id => 234)
976
980
  d.parent = e
977
981
  f = d.parent
@@ -1006,27 +1010,27 @@ describe Sequel::Model, "one_to_one" do
1006
1010
  DB.sqls.must_equal ["UPDATE nodes SET parent_id = NULL WHERE ((parent_id = 1) AND (id != 2))",
1007
1011
  "UPDATE nodes SET parent_id = 1 WHERE (id = 2)"]
1008
1012
  d.parent = nil
1009
- e.child.must_equal nil
1013
+ e.child.must_be_nil
1010
1014
  DB.sqls.must_equal ["UPDATE nodes SET parent_id = NULL WHERE (parent_id = 1)"]
1011
1015
  end
1012
1016
 
1013
1017
  it "should have the setter remove the object from the previous associated object's reciprocal many_to_one cached association array if it exists" do
1014
1018
  @c2.one_to_one :parent, :class => @c2, :key=>:parent_id
1015
1019
  @c2.many_to_one :child, :class => @c2, :key=>:parent_id
1016
- @c2.dataset._fetch = []
1020
+ @c2.dataset = @c2.dataset.with_fetch([])
1017
1021
 
1018
1022
  d = @c2.load(:id => 1)
1019
1023
  e = @c2.load(:id => 2)
1020
1024
  f = @c2.load(:id => 3)
1021
- e.child.must_equal nil
1022
- f.child.must_equal nil
1025
+ e.child.must_be_nil
1026
+ f.child.must_be_nil
1023
1027
  d.parent = e
1024
1028
  e.child.must_equal d
1025
1029
  d.parent = f
1026
1030
  f.child.must_equal d
1027
- e.child.must_equal nil
1031
+ e.child.must_be_nil
1028
1032
  d.parent = nil
1029
- f.child.must_equal nil
1033
+ f.child.must_be_nil
1030
1034
  end
1031
1035
 
1032
1036
  it "should have the setter not modify the reciprocal if set to same value as current" do
@@ -1108,7 +1112,7 @@ describe Sequel::Model, "one_to_one" do
1108
1112
  def al(v)
1109
1113
  model::Foo << v.pk
1110
1114
  end
1111
- @dataset._fetch = {:id=>20}
1115
+ @dataset = @dataset.with_fetch(:id=>20)
1112
1116
  end
1113
1117
  p = @c2.load(:id=>10)
1114
1118
  parent = p.parent
@@ -1125,7 +1129,7 @@ describe Sequel::Model, "one_to_one" do
1125
1129
  def p._parent=; raise; end
1126
1130
  proc{p.parent = c}.must_raise(Sequel::HookFailed)
1127
1131
 
1128
- p.associations[:parent].must_equal nil
1132
+ p.associations[:parent].must_be_nil
1129
1133
  p.associations[:parent] = c
1130
1134
  p.parent.must_equal c
1131
1135
  proc{p.parent = nil}.must_raise(Sequel::HookFailed)
@@ -1145,6 +1149,7 @@ describe Sequel::Model, "one_to_one" do
1145
1149
  end
1146
1150
 
1147
1151
  it "should work_correctly when used with associate" do
1152
+ @c2.dataset = @c2.dataset.with_fetch({})
1148
1153
  @c2.associate :one_to_one, :parent, :class => @c2
1149
1154
  @c2.load(:id => 567).parent.must_equal @c2.load({})
1150
1155
  DB.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.node_id = 567) LIMIT 1"]
@@ -1172,9 +1177,8 @@ describe Sequel::Model, "one_to_many" do
1172
1177
  def self.to_s; 'Node'; end
1173
1178
  columns :id, :x
1174
1179
  end
1175
- @dataset = @c2.dataset
1176
- @dataset._fetch = {}
1177
- @c1.dataset._fetch = proc{|sql| sql =~ /SELECT 1/ ? {:a=>1} : {}}
1180
+ @dataset = @c2.dataset = @c2.dataset.with_fetch({})
1181
+ @c1.dataset = @c1.dataset.with_fetch(proc{|sql| sql =~ /SELECT 1/ ? {:a=>1} : {}})
1178
1182
  DB.reset
1179
1183
  end
1180
1184
 
@@ -1267,7 +1271,7 @@ describe Sequel::Model, "one_to_many" do
1267
1271
 
1268
1272
  n = @c2.load(:id => 1234)
1269
1273
  a = @c1.new(:id => 234)
1270
- @c1.dataset._fetch = @c1.instance_dataset._fetch = {:node_id => 1234, :id => 234}
1274
+ @c1.dataset = @c1.dataset.with_fetch(:id=>234, :node_id=>1234)
1271
1275
  a.must_equal n.add_attribute(a)
1272
1276
  sqls = DB.sqls
1273
1277
  sqls.shift.must_match(/INSERT INTO attributes \((node_)?id, (node_)?id\) VALUES \(1?234, 1?234\)/)
@@ -1290,7 +1294,7 @@ describe Sequel::Model, "one_to_many" do
1290
1294
 
1291
1295
  n = @c2.new(:id => 1234)
1292
1296
  a = @c1.load(:id => 2345, :node_id => 1234)
1293
- @c1.dataset._fetch = []
1297
+ @c1.dataset = @c1.dataset.with_fetch([])
1294
1298
  proc{n.remove_attribute(a)}.must_raise(Sequel::Error)
1295
1299
  DB.sqls.must_equal ["SELECT 1 AS one FROM attributes WHERE ((attributes.node_id = 1234) AND (id = 2345)) LIMIT 1"]
1296
1300
  end
@@ -1299,7 +1303,7 @@ describe Sequel::Model, "one_to_many" do
1299
1303
  @c2.one_to_many :attributes, :class => @c1
1300
1304
  n = @c2.new(:id => 1234)
1301
1305
  DB.reset
1302
- @c1.dataset._fetch = @c1.instance_dataset._fetch = {:node_id => 1234, :id => 234}
1306
+ @c1.dataset = @c1.dataset.with_fetch(:node_id => 1234, :id => 234)
1303
1307
  n.add_attribute(:id => 234).must_equal @c1.load(:node_id => 1234, :id => 234)
1304
1308
  sqls = DB.sqls
1305
1309
  sqls.shift.must_match(/INSERT INTO attributes \((node_)?id, (node_)?id\) VALUES \(1?234, 1?234\)/)
@@ -1309,7 +1313,7 @@ describe Sequel::Model, "one_to_many" do
1309
1313
  it "should accept a primary key for the add_ method" do
1310
1314
  @c2.one_to_many :attributes, :class => @c1
1311
1315
  n = @c2.new(:id => 1234)
1312
- @c1.dataset._fetch = {:id=>234, :node_id=>nil}
1316
+ @c1.dataset = @c1.dataset.with_fetch(:node_id => nil, :id => 234)
1313
1317
  n.add_attribute(234).must_equal @c1.load(:node_id => 1234, :id => 234)
1314
1318
  DB.sqls.must_equal ["SELECT * FROM attributes WHERE id = 234", "UPDATE attributes SET node_id = 1234 WHERE (id = 234)"]
1315
1319
  end
@@ -1317,7 +1321,7 @@ describe Sequel::Model, "one_to_many" do
1317
1321
  it "should raise an error if the primary key passed to the add_ method does not match an existing record" do
1318
1322
  @c2.one_to_many :attributes, :class => @c1
1319
1323
  n = @c2.new(:id => 1234)
1320
- @c1.dataset._fetch = []
1324
+ @c1.dataset = @c1.dataset.with_fetch([])
1321
1325
  proc{n.add_attribute(234)}.must_raise(Sequel::NoMatchingRow)
1322
1326
  DB.sqls.must_equal ["SELECT * FROM attributes WHERE id = 234"]
1323
1327
  end
@@ -1330,7 +1334,7 @@ describe Sequel::Model, "one_to_many" do
1330
1334
  it "should accept a primary key for the remove_ method and remove an existing record" do
1331
1335
  @c2.one_to_many :attributes, :class => @c1
1332
1336
  n = @c2.new(:id => 1234)
1333
- @c1.dataset._fetch = {:id=>234, :node_id=>1234}
1337
+ @c1.dataset = @c1.dataset.with_fetch(:id=>234, :node_id=>1234)
1334
1338
  n.remove_attribute(234).must_equal @c1.load(:node_id => nil, :id => 234)
1335
1339
  DB.sqls.must_equal ['SELECT * FROM attributes WHERE ((attributes.node_id = 1234) AND (attributes.id = 234)) LIMIT 1',
1336
1340
  'UPDATE attributes SET node_id = NULL WHERE (id = 234)']
@@ -1375,9 +1379,9 @@ describe Sequel::Model, "one_to_many" do
1375
1379
  end
1376
1380
 
1377
1381
  it "should have add_ method accept a composite key" do
1382
+ @c1.dataset = @c1.dataset.with_fetch(:id=>2345, :node_id=>1234, :z=>8, :y=>5)
1378
1383
  @c1.set_primary_key [:id, :z]
1379
1384
  @c2.one_to_many :attributes, :class => @c1, :key =>[:node_id, :y], :primary_key=>[:id, :x]
1380
- @c1.dataset._fetch = {:id => 2345, :z => 8, :node_id => 1234, :y=>5}
1381
1385
 
1382
1386
  n = @c2.load(:id => 1234, :x=>5)
1383
1387
  a = @c1.load(:id => 2345, :z => 8, :node_id => 1234, :y=>5)
@@ -1400,10 +1404,10 @@ describe Sequel::Model, "one_to_many" do
1400
1404
  end
1401
1405
 
1402
1406
  it "should accept a array of composite primary key values for the remove_ method and remove an existing record" do
1407
+ @c1.dataset = @c1.dataset.with_fetch(:id=>234, :node_id=>123, :y=>5)
1403
1408
  @c1.set_primary_key [:id, :y]
1404
1409
  @c2.one_to_many :attributes, :class => @c1, :key=>:node_id, :primary_key=>:id
1405
1410
  n = @c2.new(:id => 123)
1406
- @c1.dataset._fetch = {:id=>234, :node_id=>123, :y=>5}
1407
1411
  n.remove_attribute([234, 5]).must_equal @c1.load(:node_id => nil, :y => 5, :id => 234)
1408
1412
  sqls = DB.sqls
1409
1413
  sqls.length.must_equal 2
@@ -1435,9 +1439,9 @@ describe Sequel::Model, "one_to_many" do
1435
1439
  a = @c1.new(:id => 2345)
1436
1440
  def a.validate() errors.add(:id, 'foo') end
1437
1441
  n.associations[:attributes] = []
1438
- n.add_attribute(a).must_equal nil
1442
+ n.add_attribute(a).must_be_nil
1439
1443
  n.associations[:attributes].must_equal []
1440
- n.remove_attribute(a).must_equal nil
1444
+ n.remove_attribute(a).must_be_nil
1441
1445
  n.associations[:attributes].must_equal []
1442
1446
  end
1443
1447
 
@@ -1506,6 +1510,7 @@ describe Sequel::Model, "one_to_many" do
1506
1510
 
1507
1511
  it "should support a :dataset option that is used instead of the default" do
1508
1512
  c1 = @c1
1513
+ @c1.dataset = @c1.dataset.with_fetch({})
1509
1514
  @c2.one_to_many :all_other_attributes, :class => @c1, :dataset=>proc{c1.exclude(:nodeid=>pk)}, :order=>:a, :limit=>10 do |ds|
1510
1515
  ds.filter(:xxx => 5)
1511
1516
  end
@@ -1591,7 +1596,7 @@ describe Sequel::Model, "one_to_many" do
1591
1596
  att.associations[:node] = n
1592
1597
  att.node.must_equal n
1593
1598
  n.remove_attribute(att)
1594
- att.node.must_equal nil
1599
+ att.node.must_be_nil
1595
1600
  end
1596
1601
 
1597
1602
  it "should not create the add_, remove_, or remove_all_ methods if :read_only option is used" do
@@ -1682,7 +1687,7 @@ describe Sequel::Model, "one_to_many" do
1682
1687
  @c2.one_to_many :attributes, :class => @c1
1683
1688
  attrib = @c1.new(:id=>3)
1684
1689
  node = @c2.new(:id => 1234)
1685
- @c1.dataset._fetch = [[], [{:id=>3, :node_id=>1234}]]
1690
+ @c1.dataset = @c1.dataset.with_fetch([[], [{:id=>3, :node_id=>1234}]])
1686
1691
  node.attributes.must_equal []
1687
1692
  node.add_attribute(attrib)
1688
1693
  node.associations[:attributes].must_equal [attrib]
@@ -1691,22 +1696,22 @@ describe Sequel::Model, "one_to_many" do
1691
1696
 
1692
1697
  it "remove_all should return nil if the cache is not populated" do
1693
1698
  @c2.one_to_many :attributes, :class => @c1
1694
- @c2.new(:id => 1234).remove_all_attributes.must_equal nil
1699
+ @c2.new(:id => 1234).remove_all_attributes.must_be_nil
1695
1700
  end
1696
1701
 
1697
1702
  it "remove_all should remove the current item from all reciprocal association caches if they are populated" do
1698
1703
  @c2.one_to_many :attributes, :class => @c1
1699
1704
  @c1.many_to_one :node, :class => @c2
1700
- @c2.dataset._fetch = []
1701
- @c1.dataset._fetch = [[], [{:id=>3, :node_id=>1234}]]
1705
+ @c2.dataset = @c2.dataset.with_fetch([])
1706
+ @c1.dataset = @c1.dataset.with_fetch([[], [{:id=>3, :node_id=>1234}]])
1702
1707
  attrib = @c1.new(:id=>3)
1703
1708
  node = @c2.load(:id => 1234)
1704
1709
  node.attributes.must_equal []
1705
- attrib.node.must_equal nil
1710
+ attrib.node.must_be_nil
1706
1711
  node.add_attribute(attrib)
1707
1712
  attrib.associations[:node].must_equal node
1708
1713
  node.remove_all_attributes
1709
- attrib.associations.fetch(:node, 2).must_equal nil
1714
+ attrib.associations.fetch(:node, 2).must_be_nil
1710
1715
  end
1711
1716
 
1712
1717
  it "should call an _add_ method internally to add attributes" do
@@ -1847,7 +1852,7 @@ describe Sequel::Model, "one_to_many" do
1847
1852
  v.each{|x| model::Foo << x.pk}
1848
1853
  end
1849
1854
  end
1850
- @c1.dataset._fetch = [{:id=>20}, {:id=>30}]
1855
+ @c1.dataset = @c1.dataset.with_fetch([{:id=>20}, {:id=>30}])
1851
1856
  p = @c2.load(:id=>10, :parent_id=>20)
1852
1857
  attributes = p.attributes
1853
1858
  h.must_equal [[10, [20, 30]], 20, 30]
@@ -1879,11 +1884,11 @@ describe Sequel::Model, "one_to_many" do
1879
1884
  def p._add_attribute; raise; end
1880
1885
  def p._remove_attribute; raise; end
1881
1886
  p.associations[:attributes] = []
1882
- p.add_attribute(c).must_equal nil
1887
+ p.add_attribute(c).must_be_nil
1883
1888
  p.attributes.must_equal []
1884
1889
  p.associations[:attributes] = [c]
1885
1890
  def p.br(c) false end
1886
- p.remove_attribute(c).must_equal nil
1891
+ p.remove_attribute(c).must_be_nil
1887
1892
  p.attributes.must_equal [c]
1888
1893
  end
1889
1894
 
@@ -1912,11 +1917,11 @@ describe Sequel::Model, "one_to_many" do
1912
1917
  def p._add_attribute; raise; end
1913
1918
  def p._remove_attribute; raise; end
1914
1919
  p.associations[:attributes] = []
1915
- p.add_attribute(c).must_equal nil
1920
+ p.add_attribute(c).must_be_nil
1916
1921
  p.attributes.must_equal []
1917
1922
  p.associations[:attributes] = [c]
1918
1923
  def p.br(o); cancel_action; end
1919
- p.remove_attribute(c).must_equal nil
1924
+ p.remove_attribute(c).must_be_nil
1920
1925
  p.attributes.must_equal [c]
1921
1926
  end
1922
1927
 
@@ -1945,9 +1950,9 @@ describe Sequel::Model, "many_to_many" do
1945
1950
  columns :id, :x
1946
1951
  end
1947
1952
  @dataset = @c2.dataset
1948
- @c1.dataset.autoid = 1
1953
+ @c1.dataset = @c1.dataset.with_autoid(1)
1949
1954
 
1950
- [@c1, @c2].each{|c| c.dataset._fetch = {}}
1955
+ [@c1, @c2].each{|c| c.dataset = c.dataset.with_fetch({})}
1951
1956
  DB.reset
1952
1957
  end
1953
1958
 
@@ -2181,7 +2186,7 @@ describe Sequel::Model, "many_to_many" do
2181
2186
 
2182
2187
  n = @c2.load(:id => 1234)
2183
2188
  a = @c1.load(:id => 2345)
2184
- @c1.dataset._fetch = {:id=>2345}
2189
+ @c1.dataset = @c1.dataset.with_fetch(:id=>2345)
2185
2190
  n.add_attribute(2345).must_equal a
2186
2191
  sqls = DB.sqls
2187
2192
  ['INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 2345)',
@@ -2193,7 +2198,7 @@ describe Sequel::Model, "many_to_many" do
2193
2198
  @c2.many_to_many :attributes, :class => @c1
2194
2199
 
2195
2200
  n = @c2.load(:id => 1234)
2196
- @c1.dataset._fetch = []
2201
+ @c1.dataset = @c1.dataset.with_fetch([])
2197
2202
  proc{n.add_attribute(2345)}.must_raise(Sequel::NoMatchingRow)
2198
2203
  DB.sqls.must_equal ["SELECT * FROM attributes WHERE id = 2345"]
2199
2204
  end
@@ -2202,7 +2207,7 @@ describe Sequel::Model, "many_to_many" do
2202
2207
  @c2.many_to_many :attributes, :class => @c1
2203
2208
 
2204
2209
  n = @c2.load(:id => 1234)
2205
- @c1.dataset._fetch = @c1.instance_dataset._fetch = {:id=>1}
2210
+ @c1.dataset = @c1.dataset.with_fetch(:id=>1)
2206
2211
  n.add_attribute(:id => 1).must_equal @c1.load(:id => 1)
2207
2212
  sqls = DB.sqls
2208
2213
  ['INSERT INTO attributes_nodes (node_id, attribute_id) VALUES (1234, 1)',
@@ -2228,7 +2233,7 @@ describe Sequel::Model, "many_to_many" do
2228
2233
  it "should accept a primary key for the remove_ method and remove an existing record" do
2229
2234
  @c2.many_to_many :attributes, :class => @c1
2230
2235
  n = @c2.new(:id => 1234)
2231
- @c1.dataset._fetch = {:id=>234}
2236
+ @c1.dataset = @c1.dataset.with_fetch(:id=>234)
2232
2237
  n.remove_attribute(234).must_equal @c1.load(:id => 234)
2233
2238
  DB.sqls.must_equal ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (attributes.id = 234)) LIMIT 1",
2234
2239
  "DELETE FROM attributes_nodes WHERE ((node_id = 1234) AND (attribute_id = 234))"]
@@ -2287,10 +2292,10 @@ describe Sequel::Model, "many_to_many" do
2287
2292
 
2288
2293
  it "should have the add_ method respect composite keys" do
2289
2294
  @c2.many_to_many :attributes, :class => @c1, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :left_primary_key=>[:id, :x], :right_primary_key=>[:id, :z]
2295
+ @c1.dataset = @c1.dataset.with_fetch(:id=>2345, :z=>8)
2290
2296
  @c1.set_primary_key [:id, :z]
2291
2297
  n = @c2.load(:id => 1234, :x=>5)
2292
2298
  a = @c1.load(:id => 2345, :z=>8)
2293
- @c1.dataset._fetch = {:id => 2345, :z=>8}
2294
2299
  n.add_attribute([2345, 8]).must_equal a
2295
2300
  sqls = DB.sqls
2296
2301
  sqls.shift.must_match(/SELECT \* FROM attributes WHERE \(\((id|z) = (8|2345)\) AND \((id|z) = (8|2345)\)\) LIMIT 1/)
@@ -2316,10 +2321,10 @@ describe Sequel::Model, "many_to_many" do
2316
2321
  end
2317
2322
 
2318
2323
  it "should accept a array of composite primary key values for the remove_ method and remove an existing record" do
2324
+ @c1.dataset = @c1.dataset.with_fetch(:id=>234, :y=>8)
2319
2325
  @c1.set_primary_key [:id, :y]
2320
2326
  @c2.many_to_many :attributes, :class => @c1
2321
2327
  n = @c2.new(:id => 1234)
2322
- @c1.dataset._fetch = {:id=>234, :y=>8}
2323
2328
  @c1.load(:id => 234, :y=>8).must_equal n.remove_attribute([234, 8])
2324
2329
  sqls = DB.sqls
2325
2330
  ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1234) AND (attributes.id = 234) AND (attributes.y = 8)) LIMIT 1",
@@ -2342,7 +2347,7 @@ describe Sequel::Model, "many_to_many" do
2342
2347
  n = @c1.new
2343
2348
  a = @c2.load(:id=>123)
2344
2349
  n.new?.must_equal true
2345
- @c1.dataset._fetch = {:id=>1}
2350
+ @c1.dataset = @c1.dataset.with_fetch(:id=>1)
2346
2351
  a.add_attribute(n)
2347
2352
  n.new?.must_equal false
2348
2353
  end
@@ -2369,7 +2374,7 @@ describe Sequel::Model, "many_to_many" do
2369
2374
  n = @c1.new
2370
2375
  a = @c2.load(:id=>123)
2371
2376
  def n.validate() errors.add(:id, 'foo') end
2372
- @c1.dataset._fetch = {:id=>1}
2377
+ @c1.dataset = @c1.dataset.with_fetch(:id=>1)
2373
2378
  a.add_attribute(n)
2374
2379
  n.new?.must_equal false
2375
2380
  end
@@ -2514,7 +2519,7 @@ describe Sequel::Model, "many_to_many" do
2514
2519
  @c2.many_to_many :attributes, :class => @c1
2515
2520
  attrib = @c1.load(:id=>3)
2516
2521
  node = @c2.load(:id => 1234)
2517
- @c1.dataset._fetch = []
2522
+ @c1.dataset = @c1.dataset.with_fetch([])
2518
2523
  node.attributes.must_equal []
2519
2524
  node.add_attribute(attrib)
2520
2525
  node.associations[:attributes].must_equal [attrib]
@@ -2523,14 +2528,14 @@ describe Sequel::Model, "many_to_many" do
2523
2528
 
2524
2529
  it "remove_all should return nil if the cached instance variable does not exist" do
2525
2530
  @c2.many_to_many :attributes, :class => @c1
2526
- @c2.new(:id => 1234).remove_all_attributes.must_equal nil
2531
+ @c2.new(:id => 1234).remove_all_attributes.must_be_nil
2527
2532
  end
2528
2533
 
2529
2534
  it "remove_all should remove the current item from all reciprocal instance varaibles if it cached instance variable exists" do
2530
2535
  @c2.many_to_many :attributes, :class => @c1
2531
2536
  @c1.many_to_many :nodes, :class => @c2
2532
- @c1.dataset._fetch = []
2533
- @c2.dataset._fetch = []
2537
+ @c1.dataset = @c1.dataset.with_fetch([])
2538
+ @c2.dataset = @c2.dataset.with_fetch([])
2534
2539
  attrib = @c1.load(:id=>3)
2535
2540
  node = @c2.new(:id => 1234)
2536
2541
  node.attributes.must_equal []
@@ -2689,7 +2694,7 @@ describe Sequel::Model, "many_to_many" do
2689
2694
  v.each{|x| model::Foo << x.pk}
2690
2695
  end
2691
2696
  end
2692
- @c1.dataset._fetch = [{:id=>20}, {:id=>30}]
2697
+ @c1.dataset = @c1.dataset.with_fetch([{:id=>20}, {:id=>30}])
2693
2698
  p = @c2.load(:id=>10, :parent_id=>20)
2694
2699
  attributes = p.attributes
2695
2700
  h.must_equal [[10, [20, 30]], 20, 30]
@@ -2722,11 +2727,11 @@ describe Sequel::Model, "many_to_many" do
2722
2727
  def p._add_attribute; raise; end
2723
2728
  def p._remove_attribute; raise; end
2724
2729
  p.associations[:attributes] = []
2725
- p.add_attribute(c).must_equal nil
2730
+ p.add_attribute(c).must_be_nil
2726
2731
  p.attributes.must_equal []
2727
2732
  p.associations[:attributes] = [c]
2728
2733
  def p.br(c) false end
2729
- p.remove_attribute(c).must_equal nil
2734
+ p.remove_attribute(c).must_be_nil
2730
2735
  p.attributes.must_equal [c]
2731
2736
  end
2732
2737
 
@@ -2756,17 +2761,17 @@ describe Sequel::Model, "many_to_many" do
2756
2761
  def p._add_attribute; raise; end
2757
2762
  def p._remove_attribute; raise; end
2758
2763
  p.associations[:attributes] = []
2759
- p.add_attribute(c).must_equal nil
2764
+ p.add_attribute(c).must_be_nil
2760
2765
  p.attributes.must_equal []
2761
2766
  p.associations[:attributes] = [c]
2762
2767
  def p.br(o) cancel_action end
2763
- p.remove_attribute(c).must_equal nil
2768
+ p.remove_attribute(c).must_be_nil
2764
2769
  p.attributes.must_equal [c]
2765
2770
  end
2766
2771
 
2767
2772
  it "should support a :uniq option that removes duplicates from the association" do
2768
2773
  @c2.many_to_many :attributes, :class => @c1, :uniq=>true
2769
- @c1.dataset._fetch = [{:id=>20}, {:id=>30}, {:id=>20}, {:id=>30}]
2774
+ @c1.dataset = @c1.dataset.with_fetch([{:id=>20}, {:id=>30}, {:id=>20}, {:id=>30}])
2770
2775
  @c2.load(:id=>10, :parent_id=>20).attributes.must_equal [@c1.load(:id=>20), @c1.load(:id=>30)]
2771
2776
  end
2772
2777
 
@@ -2787,7 +2792,7 @@ describe Sequel::Model, "many_to_many" do
2787
2792
  @c2.many_to_many :attributes, :class => @c1 do |ds|
2788
2793
  ds.filter(:join_table_att=>3)
2789
2794
  end
2790
- @c1.dataset._fetch = {:id=>2}
2795
+ @c1.dataset = @c1.dataset.with_fetch(:id=>2)
2791
2796
  @c2.load(:id=>1).remove_attribute(2)
2792
2797
  DB.sqls.must_equal ["SELECT attributes.* FROM attributes INNER JOIN attributes_nodes ON (attributes_nodes.attribute_id = attributes.id) WHERE ((attributes_nodes.node_id = 1) AND (join_table_att = 3) AND (attributes.id = 2)) LIMIT 1",
2793
2798
  "DELETE FROM attributes_nodes WHERE ((node_id = 1) AND (attribute_id = 2))"]
@@ -2818,9 +2823,9 @@ describe Sequel::Model, "one_through_one" do
2818
2823
  columns :id, :x
2819
2824
  end
2820
2825
  @dataset = @c2.dataset
2821
- @c1.dataset.autoid = 1
2826
+ @c1.dataset = @c1.dataset.with_autoid(1)
2822
2827
 
2823
- [@c1, @c2].each{|c| c.dataset._fetch = {}}
2828
+ [@c1, @c2].each{|c| c.dataset = c.dataset.with_fetch({})}
2824
2829
  DB.reset
2825
2830
  end
2826
2831
  after do
@@ -2873,7 +2878,7 @@ describe Sequel::Model, "one_through_one" do
2873
2878
 
2874
2879
  it "should not issue query if not all keys have values" do
2875
2880
  @c2.one_through_one :attribute, :class => @c1, :left_key=>[:l1, :l2], :right_key=>[:r1, :r2], :left_primary_key=>[:id, :x], :right_primary_key=>[:id, :y]
2876
- @c2.load(:id => 1234, :x=>nil).attribute.must_equal nil
2881
+ @c2.load(:id => 1234, :x=>nil).attribute.must_be_nil
2877
2882
  DB.sqls.must_equal []
2878
2883
  end
2879
2884
 
@@ -3022,7 +3027,7 @@ describe Sequel::Model, "one_through_one" do
3022
3027
  model::Foo << v.pk
3023
3028
  end
3024
3029
  end
3025
- @c1.dataset._fetch = [{:id=>20}]
3030
+ @c1.dataset = @c1.dataset.with_fetch([{:id=>20}])
3026
3031
  p = @c2.load(:id=>10, :parent_id=>20)
3027
3032
  attribute = p.attribute
3028
3033
  h.must_equal [[10, 20], 20]
@@ -4493,9 +4498,9 @@ describe "Model#freeze" do
4493
4498
  end
4494
4499
 
4495
4500
  it "should not break associations getters" do
4496
- Album::B.dataset._fetch = {:album_id=>1, :id=>2}
4501
+ Album::B.dataset = Album::B.dataset.with_fetch(:album_id=>1, :id=>2)
4497
4502
  @o.b.must_equal Album::B.load(:id=>2, :album_id=>1)
4498
- @o.associations[:b].must_equal nil
4503
+ @o.associations[:b].must_be_nil
4499
4504
 
4500
4505
  @o = @o.dup
4501
4506
  @o.b.must_equal Album::B.load(:id=>2, :album_id=>1)
@@ -4505,7 +4510,7 @@ describe "Model#freeze" do
4505
4510
  it "should not break reciprocal associations" do
4506
4511
  b = Album::B.load(:id=>2, :album_id=>nil)
4507
4512
  b.album = @o
4508
- @o.associations[:b].must_equal nil
4513
+ @o.associations[:b].must_be_nil
4509
4514
 
4510
4515
  @o = @o.dup
4511
4516
  b = Album::B.load(:id=>2, :album_id=>nil)
@@ -4518,7 +4523,7 @@ describe "association autoreloading" do
4518
4523
  before do
4519
4524
  @c = Class.new(Sequel::Model)
4520
4525
  @Artist = Class.new(@c).set_dataset(:artists)
4521
- @Artist.dataset._fetch = {:id=>2, :name=>'Ar'}
4526
+ @Artist.dataset = @Artist.dataset.with_fetch(:id=>2, :name=>'Ar')
4522
4527
  @Album = Class.new(@c).set_dataset(:albums)
4523
4528
  @Artist.columns :id, :name
4524
4529
  @Album.columns :id, :name, :artist_id