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
@@ -4,11 +4,12 @@ describe "Sequel::Plugins::SkipCreateRefresh" do
4
4
  it "should skip the refresh after saving a new object" do
5
5
  c = Class.new(Sequel::Model(:a))
6
6
  c.columns :id, :x
7
+ c.dataset = c.dataset.with_autoid(2)
7
8
  c.db.reset
8
- c.instance_dataset.meta_def(:insert){|*a| super(*a); 2}
9
9
  c.create(:x=>1)
10
10
  c.db.sqls.must_equal ['INSERT INTO a (x) VALUES (1)', 'SELECT * FROM a WHERE (id = 2) LIMIT 1']
11
11
 
12
+ c.dataset = c.dataset.with_autoid(2)
12
13
  c.plugin :skip_create_refresh
13
14
  c.db.reset
14
15
  c.create(:x=>3).values.must_equal(:id=>2, :x=>3)
@@ -45,7 +45,7 @@ class << Sequel::Model
45
45
  def columns(*cols)
46
46
  return super if cols.empty?
47
47
  define_method(:columns){cols}
48
- @dataset.instance_variable_set(:@columns, cols) if @dataset
48
+ @dataset.send(:columns=, cols) if @dataset
49
49
  def_column_accessor(*cols)
50
50
  @columns = cols
51
51
  @db_schema = {}
@@ -1,11 +1,11 @@
1
1
  require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
2
 
3
3
  describe "Sequel::Plugins::SplitValues" do
4
- it "should skip the refresh after saving a new object" do
4
+ it "stores non-columns in a separate hash" do
5
5
  c = Class.new(Sequel::Model(:a))
6
6
  c.columns :id, :x
7
7
  c.plugin :split_values
8
- c.dataset._fetch = {:id=>1, :x=>2, :y=>3}
8
+ c.dataset = c.dataset.with_fetch(:id=>1, :x=>2, :y=>3)
9
9
  o = c.first
10
10
  c.db.reset
11
11
 
@@ -24,4 +24,10 @@ describe "sql_comments extension" do
24
24
  ds = @ds.comment("Some\nComment\r\n Here")
25
25
  ds.where(:id=>ds).select_sql.must_equal "SELECT * FROM t WHERE (id IN (SELECT * FROM t -- Some Comment Here\n)) -- Some Comment Here\n"
26
26
  end
27
+
28
+ it "should handle frozen SQL strings" do
29
+ @ds = Sequel.mock[:t].with_extend{def select_sql; super.freeze; end}.extension(:sql_comments)
30
+ ds = @ds.comment("Some\nComment\r\n Here")
31
+ ds.select_sql.must_equal "SELECT * FROM t -- Some Comment Here\n"
32
+ end
27
33
  end
@@ -25,10 +25,10 @@ describe "Sequel::Plugins::StaticCache" do
25
25
  it "should make .[] method with primary key use the cache" do
26
26
  @c[1].must_equal @c1
27
27
  @c[2].must_equal @c2
28
- @c[3].must_equal nil
29
- @c[[1, 2]].must_equal nil
30
- @c[nil].must_equal nil
31
- @c[].must_equal nil
28
+ @c[3].must_be_nil
29
+ @c[[1, 2]].must_be_nil
30
+ @c[nil].must_be_nil
31
+ @c[].must_be_nil
32
32
  @db.sqls.must_equal []
33
33
  end
34
34
 
@@ -41,7 +41,7 @@ describe "Sequel::Plugins::StaticCache" do
41
41
  it "should support cache_get_pk" do
42
42
  @c.cache_get_pk(1).must_equal @c1
43
43
  @c.cache_get_pk(2).must_equal @c2
44
- @c.cache_get_pk(3).must_equal nil
44
+ @c.cache_get_pk(3).must_be_nil
45
45
  @db.sqls.must_equal []
46
46
  end
47
47
 
@@ -171,9 +171,7 @@ describe "Sequel::Plugins::StaticCache" do
171
171
  end
172
172
 
173
173
  it "set_dataset should work correctly" do
174
- ds = @c.dataset.from(:t2)
175
- ds.instance_variable_set(:@columns, [:id])
176
- ds._fetch = {:id=>3}
174
+ ds = @c.dataset.from(:t2).columns(:id).with_fetch(:id=>3)
177
175
  @c.dataset = ds
178
176
  @c.all.must_equal [@c.load(:id=>3)]
179
177
  @c.to_hash.must_equal(3=>@c.load(:id=>3))
@@ -341,7 +339,7 @@ describe "Sequel::Plugins::StaticCache" do
341
339
  @db.autoid = 3
342
340
  @db.fetch = [[{:id=>1}, {:id=>2}, {:id=>3}], [{:id=>3}]]
343
341
  o.save
344
- @c[3].must_equal nil
342
+ @c[3].must_be_nil
345
343
  end
346
344
 
347
345
  it "should not automatically update the cache when updating model objects" do
@@ -30,39 +30,40 @@ describe "string_agg extension" do
30
30
  end
31
31
 
32
32
  it "should correctly literalize on Postgres" do
33
- db = dbf.call(:postgres)
34
- db.literal(@sa1).must_equal "string_agg(c, ',')"
35
- db.literal(@sa2).must_equal "string_agg(c, '-')"
36
- db.literal(@sa3).must_equal "string_agg(c, '-' ORDER BY o)"
37
- db.literal(@sa4).must_equal "string_agg(DISTINCT c, ',' ORDER BY o)"
33
+ ds = dbf.call(:postgres).dataset.with_quote_identifiers(false)
34
+ ds.literal(@sa1).must_equal "string_agg(c, ',')"
35
+ ds.literal(@sa2).must_equal "string_agg(c, '-')"
36
+ ds.literal(@sa3).must_equal "string_agg(c, '-' ORDER BY o)"
37
+ ds.literal(@sa4).must_equal "string_agg(DISTINCT c, ',' ORDER BY o)"
38
38
  end
39
39
 
40
40
  it "should correctly literalize on SQLAnywhere" do
41
- db = dbf.call(:sqlanywhere)
42
- db.literal(@sa1).must_equal "list(c, ',')"
43
- db.literal(@sa2).must_equal "list(c, '-')"
44
- db.literal(@sa3).must_equal "list(c, '-' ORDER BY o)"
45
- db.literal(@sa4).must_equal "list(DISTINCT c, ',' ORDER BY o)"
41
+ ds = dbf.call(:sqlanywhere).dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
42
+ ds.literal(@sa1).must_equal "list(c, ',')"
43
+ ds.literal(@sa2).must_equal "list(c, '-')"
44
+ ds.literal(@sa3).must_equal "list(c, '-' ORDER BY o)"
45
+ ds.literal(@sa4).must_equal "list(DISTINCT c, ',' ORDER BY o)"
46
46
  end
47
47
 
48
48
  it "should correctly literalize on MySQL, H2, HSQLDB, CUBRID" do
49
49
  [:mysql, :h2, :hsqldb, :cubrid].each do |type|
50
50
  db = dbf.call(type)
51
51
  db.meta_def(:database_type){type}
52
- db.literal(@sa1).must_equal "GROUP_CONCAT(c SEPARATOR ',')"
53
- db.literal(@sa2).must_equal "GROUP_CONCAT(c SEPARATOR '-')"
54
- db.literal(@sa3).must_equal "GROUP_CONCAT(c ORDER BY o SEPARATOR '-')"
55
- db.literal(@sa4).must_equal "GROUP_CONCAT(DISTINCT c ORDER BY o SEPARATOR ',')"
52
+ ds = db.dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
53
+ ds.literal(@sa1).upcase.must_equal "GROUP_CONCAT(C SEPARATOR ',')"
54
+ ds.literal(@sa2).upcase.must_equal "GROUP_CONCAT(C SEPARATOR '-')"
55
+ ds.literal(@sa3).upcase.must_equal "GROUP_CONCAT(C ORDER BY O SEPARATOR '-')"
56
+ ds.literal(@sa4).upcase.must_equal "GROUP_CONCAT(DISTINCT C ORDER BY O SEPARATOR ',')"
56
57
  end
57
58
  end
58
59
 
59
60
  it "should correctly literalize on Oracle and DB2" do
60
61
  [:oracle, :db2].each do |type|
61
- db = dbf.call(type)
62
- db.literal(@sa1).must_equal "listagg(c, ',') WITHIN GROUP (ORDER BY 1)"
63
- db.literal(@sa2).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY 1)"
64
- db.literal(@sa3).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY o)"
65
- proc{db.literal(@sa4)}.must_raise Sequel::Error
62
+ ds = dbf.call(type).dataset.with_quote_identifiers(false).with_extend{def input_identifier(v) v.to_s end}
63
+ ds.literal(@sa1).must_equal "listagg(c, ',') WITHIN GROUP (ORDER BY 1)"
64
+ ds.literal(@sa2).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY 1)"
65
+ ds.literal(@sa3).must_equal "listagg(c, '-') WITHIN GROUP (ORDER BY o)"
66
+ proc{ds.literal(@sa4)}.must_raise Sequel::Error
66
67
  end
67
68
  end
68
69
 
@@ -72,18 +73,18 @@ describe "string_agg extension" do
72
73
 
73
74
  it "should handle order without arguments" do
74
75
  db = dbf.call(:postgres)
75
- db.literal(@sa1.order).must_equal "string_agg(c, ',')"
76
+ db.dataset.with_quote_identifiers(false).literal(@sa1.order).must_equal "string_agg(c, ',')"
76
77
  end
77
78
 
78
79
  it "should handle operations on object" do
79
- db = dbf.call(:postgres)
80
- db.literal(@sa1 + 'b').must_equal "(string_agg(c, ',') || 'b')"
81
- db.literal(@sa1.like('b')).must_equal "(string_agg(c, ',') LIKE 'b' ESCAPE '\\')"
82
- db.literal(@sa1 < 'b').must_equal "(string_agg(c, ',') < 'b')"
83
- db.literal(@sa1.as(:b)).must_equal "string_agg(c, ',') AS b"
84
- db.literal(@sa1.cast(:b)).must_equal "CAST(string_agg(c, ',') AS b)"
85
- db.literal(@sa1.desc).must_equal "string_agg(c, ',') DESC"
86
- db.literal(@sa1 =~ /a/).must_equal "(string_agg(c, ',') ~ 'a')"
87
- db.literal(@sa1.sql_subscript(1)).must_equal "string_agg(c, ',')[1]"
80
+ ds = dbf.call(:postgres).dataset.with_quote_identifiers(false)
81
+ ds.literal(@sa1 + 'b').must_equal "(string_agg(c, ',') || 'b')"
82
+ ds.literal(@sa1.like('b')).must_equal "(string_agg(c, ',') LIKE 'b' ESCAPE '\\')"
83
+ ds.literal(@sa1 < 'b').must_equal "(string_agg(c, ',') < 'b')"
84
+ ds.literal(@sa1.as(:b)).must_equal "string_agg(c, ',') AS b"
85
+ ds.literal(@sa1.cast(:b)).must_equal "CAST(string_agg(c, ',') AS b)"
86
+ ds.literal(@sa1.desc).must_equal "string_agg(c, ',') DESC"
87
+ ds.literal(@sa1 =~ /a/).must_equal "(string_agg(c, ',') ~ 'a')"
88
+ ds.literal(@sa1.sql_subscript(1)).must_equal "string_agg(c, ',')[1]"
88
89
  end
89
90
  end
@@ -21,7 +21,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
21
21
  columns :id, :parent_id
22
22
  many_to_one :parent, :class=>self
23
23
  one_to_many :children, :class=>self, :key=>:parent_id
24
- dataset._fetch = proc do |sql|
24
+ set_dataset dataset.with_fetch(proc do |sql|
25
25
  if sql !~ /WHERE/
26
26
  [{:id=>1, :parent_id=>101}, {:id=>2, :parent_id=>102}, {:id=>101, :parent_id=>nil}, {:id=>102, :parent_id=>nil}]
27
27
  elsif sql =~ /WHERE.*\bid = (\d+)/
@@ -31,7 +31,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
31
31
  elsif sql =~ /WHERE.*\bparent_id IN \(([\d, ]*)\)/
32
32
  $1.split(', ').map{|x| {:id=>x.to_i - 100, :parent_id=>x.to_i} if x.to_i > 100}.compact
33
33
  end
34
- end
34
+ end)
35
35
  end
36
36
  @c = ::TacticalEagerLoadingModel
37
37
  @ds = TacticalEagerLoadingModel.dataset
@@ -63,7 +63,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
63
63
  it "association getter methods should not eagerly load the association if the association is cached" do
64
64
  ts.map{|x| x.parent}.must_equal [ts[2], ts[3], nil, nil]
65
65
  sql_match(/\ASELECT \* FROM t WHERE \(t\.id IN \(10[12], 10[12]\)\)\z/)
66
- def @ds.eager_load(*) raise end
66
+ @c.dataset = @c.dataset.with_extend{def eager_load(*) raise end}
67
67
  ts.map{|x| x.parent}.must_equal [ts[2], ts[3], nil, nil]
68
68
  end
69
69
 
@@ -113,8 +113,7 @@ describe "Sequel::Plugins::TacticalEagerLoading" do
113
113
  it "should handle case where an association is valid on an instance, but not on all instances" do
114
114
  c = Class.new(@c)
115
115
  c.many_to_one :parent2, :class=>@c, :key=>:parent_id
116
- @c.dataset.row_proc = proc{|r| (r[:parent_id] == 101 ? c : @c).call(r)}
117
- @c.all{|x| x.parent2 if x.is_a?(c)}
116
+ @c.dataset.with_row_proc(proc{|r| (r[:parent_id] == 101 ? c : @c).call(r)}).all{|x| x.parent2 if x.is_a?(c)}
118
117
  sql_match('SELECT * FROM t', 'SELECT * FROM t WHERE id = 101')
119
118
  end
120
119
 
@@ -22,7 +22,7 @@ describe "Sequel thread_local_timezones extension" do
22
22
  Sequel.thread_database_timezone = :utc
23
23
  Sequel.database_timezone.must_equal :utc
24
24
  Sequel.thread_typecast_timezone = nil
25
- Sequel.typecast_timezone.must_equal nil
25
+ Sequel.typecast_timezone.must_be_nil
26
26
  end
27
27
 
28
28
  it "should fallback to default timezone if no thread_local timezone" do
@@ -37,7 +37,7 @@ describe "Sequel thread_local_timezones extension" do
37
37
  Sequel.thread_typecast_timezone = nil
38
38
  Sequel.typecast_timezone.must_equal :utc
39
39
  Sequel.thread_typecast_timezone = :nil
40
- Sequel.typecast_timezone.must_equal nil
40
+ Sequel.typecast_timezone.must_be_nil
41
41
  end
42
42
 
43
43
  it "should be thread safe" do
@@ -16,7 +16,6 @@ describe "Sequel::Plugins::Timestamps" do
16
16
  def _save_refresh(*) end
17
17
  db.reset
18
18
  end
19
- @c.dataset.autoid = nil
20
19
  end
21
20
  after do
22
21
  Sequel.datetime_class = Time
@@ -71,7 +70,7 @@ describe "Sequel::Plugins::Timestamps" do
71
70
  end
72
71
 
73
72
  it "should not update the update timestamp on creation" do
74
- @c.create.updated_at.must_equal nil
73
+ @c.create.updated_at.must_be_nil
75
74
  end
76
75
 
77
76
  it "should use the same value for the creation and update timestamps when creating if the :update_on_create option is given" do
@@ -133,6 +132,32 @@ describe "Sequel::Plugins::Timestamps" do
133
132
  o.created_at.must_equal '2009-08-01'
134
133
  end
135
134
 
135
+ it "should set update timestamp to same timestamp as create timestamp when setting creating timestamp" do
136
+ i = 1
137
+ (class << (Sequel.datetime_class); self end).send(:define_method, :now){"2009-08-0#{i+=1}"}
138
+ @c.plugin :timestamps, :update_on_create=>true
139
+ o = @c.create
140
+ sqls = @c.db.sqls
141
+ sqls.length.must_equal 1
142
+ ["INSERT INTO t (created_at, updated_at) VALUES ('2009-08-02', '2009-08-02')",
143
+ "INSERT INTO t (updated_at, created_at) VALUES ('2009-08-02', '2009-08-02')"].must_include sqls.first
144
+ o.created_at.must_equal '2009-08-02'
145
+ o.updated_at.must_equal '2009-08-02'
146
+ end
147
+
148
+ it "should set update timestamp when using not overriding create timestamp" do
149
+ i = 1
150
+ (class << (Sequel.datetime_class); self end).send(:define_method, :now){"2009-08-0#{i+=1}"}
151
+ @c.plugin :timestamps, :update_on_create=>true
152
+ o = @c.create(:created_at=>'2009-08-10')
153
+ sqls = @c.db.sqls
154
+ sqls.length.must_equal 1
155
+ ["INSERT INTO t (created_at, updated_at) VALUES ('2009-08-10', '2009-08-02')",
156
+ "INSERT INTO t (updated_at, created_at) VALUES ('2009-08-02', '2009-08-10')"].must_include sqls.first
157
+ o.created_at.must_equal '2009-08-10'
158
+ o.updated_at.must_equal '2009-08-02'
159
+ end
160
+
136
161
  it "should have create_timestamp_field give the create timestamp field" do
137
162
  @c.create_timestamp_field.must_equal :created_at
138
163
  @c.plugin :timestamps, :create=>:c
@@ -161,7 +186,7 @@ describe "Sequel::Plugins::Timestamps" do
161
186
  c = Class.new(@c)
162
187
  o = c.create
163
188
  o.created_at.must_equal '2009-08-01'
164
- o.updated_at.must_equal nil
189
+ o.updated_at.must_be_nil
165
190
  o = c.load(:id=>1).save
166
191
  o.updated_at.must_equal '2009-08-01'
167
192
  c.db.sqls.must_equal ["INSERT INTO t (created_at) VALUES ('2009-08-01')", "UPDATE t SET updated_at = '2009-08-01' WHERE (id = 1)"]
@@ -25,8 +25,7 @@ END
25
25
  end
26
26
 
27
27
  it "should handle WITH" do
28
- def @ds.supports_cte?(*) true end
29
- a = dot(@ds.with(:a, @ds))
28
+ a = dot(@ds.with_extend{def supports_cte?(*) true end}.with(:a, @ds))
30
29
  a[0..3].must_equal ["1 -> 2 [label=\"with\"];", "2 [label=\"Array\"];", "2 -> 3 [label=\"0\"];", "3 [label=\"Hash\"];"]
31
30
  [["3 -> 4 [label=\"dataset\"];", "4 [label=\"Dataset\"];", "3 -> 5 [label=\"name\"];", "5 [label=\":a\"];"],
32
31
  ["3 -> 4 [label=\"name\"];", "4 [label=\":a\"];", "3 -> 5 [label=\"dataset\"];", "5 [label=\"Dataset\"];"]].must_include(a[4..-1])
@@ -48,7 +48,7 @@ describe Sequel::Model, "tree plugin" do
48
48
  end
49
49
 
50
50
  it "should have tree_order give the order of the association" do
51
- @c.tree_order.must_equal nil
51
+ @c.tree_order.must_be_nil
52
52
  klass(:order=>:name).tree_order.must_equal :name
53
53
  klass(:order=>[:parent_id, :name]).tree_order.must_equal [:parent_id, :name]
54
54
  end
@@ -60,7 +60,7 @@ describe Sequel::Model, "tree plugin" do
60
60
  end
61
61
 
62
62
  it "should have roots return an array of the tree's roots" do
63
- @ds._fetch = [{:id=>1, :parent_id=>nil, :name=>'r'}]
63
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
64
64
  @c.roots.must_equal [@c.load(:id=>1, :parent_id=>nil, :name=>'r')]
65
65
  @db.sqls.must_equal ["SELECT * FROM nodes WHERE (parent_id IS NULL)"]
66
66
  end
@@ -70,14 +70,14 @@ describe Sequel::Model, "tree plugin" do
70
70
  end
71
71
 
72
72
  it "should have ancestors return the ancestors of the current node" do
73
- @ds._fetch = [[{:id=>1, :parent_id=>5, :name=>'r'}], [{:id=>5, :parent_id=>nil, :name=>'r2'}]]
73
+ @c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>5, :name=>'r'}], [{:id=>5, :parent_id=>nil, :name=>'r2'}]])
74
74
  @o.ancestors.must_equal [@c.load(:id=>1, :parent_id=>5, :name=>'r'), @c.load(:id=>5, :parent_id=>nil, :name=>'r2')]
75
75
  @db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
76
76
  "SELECT * FROM nodes WHERE id = 5"]
77
77
  end
78
78
 
79
79
  it "should have descendants return the descendants of the current node" do
80
- @ds._fetch = [[{:id=>3, :parent_id=>2, :name=>'r'}, {:id=>4, :parent_id=>2, :name=>'r2'}], [{:id=>5, :parent_id=>4, :name=>'r3'}], []]
80
+ @c.dataset = @c.dataset.with_fetch([[{:id=>3, :parent_id=>2, :name=>'r'}, {:id=>4, :parent_id=>2, :name=>'r2'}], [{:id=>5, :parent_id=>4, :name=>'r3'}], []])
81
81
  @o.descendants.must_equal [@c.load(:id=>3, :parent_id=>2, :name=>'r'), @c.load(:id=>4, :parent_id=>2, :name=>'r2'), @c.load(:id=>5, :parent_id=>4, :name=>'r3')]
82
82
  @db.sqls.must_equal ["SELECT * FROM nodes WHERE (nodes.parent_id = 2)",
83
83
  "SELECT * FROM nodes WHERE (nodes.parent_id = 3)",
@@ -86,7 +86,7 @@ describe Sequel::Model, "tree plugin" do
86
86
  end
87
87
 
88
88
  it "should have root return the root of the current node" do
89
- @ds._fetch = [[{:id=>1, :parent_id=>5, :name=>'r'}], [{:id=>5, :parent_id=>nil, :name=>'r2'}]]
89
+ @c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>5, :name=>'r'}], [{:id=>5, :parent_id=>nil, :name=>'r2'}]])
90
90
  @o.root.must_equal @c.load(:id=>5, :parent_id=>nil, :name=>'r2')
91
91
  @db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
92
92
  "SELECT * FROM nodes WHERE id = 5"]
@@ -102,14 +102,14 @@ describe Sequel::Model, "tree plugin" do
102
102
  end
103
103
 
104
104
  it "should have self_and_siblings return the children of the current node's parent" do
105
- @ds._fetch = [[{:id=>1, :parent_id=>3, :name=>'r'}], [{:id=>7, :parent_id=>1, :name=>'r2'}, @o.values.dup]]
105
+ @c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>3, :name=>'r'}], [{:id=>7, :parent_id=>1, :name=>'r2'}, @o.values.dup]])
106
106
  @o.self_and_siblings.must_equal [@c.load(:id=>7, :parent_id=>1, :name=>'r2'), @o]
107
107
  @db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
108
108
  "SELECT * FROM nodes WHERE (nodes.parent_id = 1)"]
109
109
  end
110
110
 
111
111
  it "should have siblings return the children of the current node's parent, except for the current node" do
112
- @ds._fetch = [[{:id=>1, :parent_id=>3, :name=>'r'}], [{:id=>7, :parent_id=>1, :name=>'r2'}, @o.values.dup]]
112
+ @c.dataset = @c.dataset.with_fetch([[{:id=>1, :parent_id=>3, :name=>'r'}], [{:id=>7, :parent_id=>1, :name=>'r2'}, @o.values.dup]])
113
113
  @o.siblings.must_equal [@c.load(:id=>7, :parent_id=>1, :name=>'r2')]
114
114
  @db.sqls.must_equal ["SELECT * FROM nodes WHERE id = 1",
115
115
  "SELECT * FROM nodes WHERE (nodes.parent_id = 1)"]
@@ -121,23 +121,23 @@ describe Sequel::Model, "tree plugin" do
121
121
  end
122
122
 
123
123
  it "should have root class method return the root" do
124
- @c.dataset._fetch = [{:id=>1, :parent_id=>nil, :name=>'r'}]
124
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
125
125
  @c.root.must_equal @c.load(:id=>1, :parent_id=>nil, :name=>'r')
126
126
  end
127
127
 
128
128
  it "prevents creating a second root" do
129
- @c.dataset._fetch = [{:id=>1, :parent_id=>nil, :name=>'r'}]
129
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
130
130
  lambda { @c.create }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
131
131
  end
132
132
 
133
133
  it "errors when promoting an existing record to a second root" do
134
- @c.dataset._fetch = [{:id=>1, :parent_id=>nil, :name=>'r'}]
134
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
135
135
  n = @c.load(:id => 2, :parent_id => 1)
136
136
  lambda { n.update(:parent_id => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
137
137
  end
138
138
 
139
139
  it "allows updating existing root" do
140
- @c.dataset._fetch = [{:id=>1, :parent_id=>nil, :name=>'r'}]
140
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :name=>'r'}])
141
141
  @c.root.update(:name => 'fdsa')
142
142
  end
143
143
  end
@@ -152,6 +152,10 @@ describe Sequel::Model, "tree plugin with composite keys" do
152
152
  columns :id, :id2, :name, :parent_id, :parent_id2, :i, :pi
153
153
  set_primary_key [:id, :id2]
154
154
  plugin :tree, opts.merge(:key=>[:parent_id, :parent_id2])
155
+ def self.set_dataset(ds)
156
+ super
157
+ set_primary_key [:id, :id2]
158
+ end
155
159
  end
156
160
  c
157
161
  end
@@ -174,7 +178,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
174
178
  end
175
179
 
176
180
  it "should have roots return an array of the tree's roots" do
177
- @ds._fetch = [{:id=>1, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}]
181
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
178
182
  @c.roots.must_equal [@c.load(:id=>1, :parent_id=>nil, :parent_id2=>nil, :name=>'r')]
179
183
  @db.sqls.must_equal ["SELECT * FROM nodes WHERE ((parent_id IS NULL) OR (parent_id2 IS NULL))"]
180
184
  end
@@ -184,7 +188,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
184
188
  end
185
189
 
186
190
  it "should have ancestors return the ancestors of the current node" do
187
- @ds._fetch = [[{:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'}], [{:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2'}]]
191
+ @c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'}], [{:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2'}]])
188
192
  @o.ancestors.must_equal [@c.load(:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'), @c.load(:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2')]
189
193
  sqls = @db.sqls
190
194
  sqls.length.must_equal 2
@@ -193,7 +197,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
193
197
  end
194
198
 
195
199
  it "should have descendants return the descendants of the current node" do
196
- @ds._fetch = [[{:id=>3, :id2=>7, :parent_id=>2, :parent_id2=>5, :name=>'r'}, {:id=>4, :id2=>8, :parent_id=>2, :parent_id2=>5, :name=>'r2'}], [{:id=>5, :id2=>9, :parent_id=>4, :parent_id2=>8, :name=>'r3'}], []]
200
+ @c.dataset = @c.dataset.with_fetch([[{:id=>3, :id2=>7, :parent_id=>2, :parent_id2=>5, :name=>'r'}, {:id=>4, :id2=>8, :parent_id=>2, :parent_id2=>5, :name=>'r2'}], [{:id=>5, :id2=>9, :parent_id=>4, :parent_id2=>8, :name=>'r3'}], []])
197
201
  @o.descendants.must_equal [@c.load(:id=>3, :id2=>7, :parent_id=>2, :parent_id2=>5, :name=>'r'), @c.load(:id=>4, :id2=>8, :parent_id=>2, :parent_id2=>5, :name=>'r2'), @c.load(:id=>5, :id2=>9, :parent_id=>4, :parent_id2=>8, :name=>'r3')]
198
202
  @db.sqls.must_equal ["SELECT * FROM nodes WHERE ((nodes.parent_id = 2) AND (nodes.parent_id2 = 5))",
199
203
  "SELECT * FROM nodes WHERE ((nodes.parent_id = 3) AND (nodes.parent_id2 = 7))",
@@ -202,7 +206,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
202
206
  end
203
207
 
204
208
  it "should have root return the root of the current node" do
205
- @ds._fetch = [[{:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'}], [{:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2'}]]
209
+ @c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>5, :parent_id2=>7, :name=>'r'}], [{:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2'}]])
206
210
  @o.root.must_equal @c.load(:id=>5, :id2=>7, :parent_id=>nil, :parent_id2=>nil, :name=>'r2')
207
211
  sqls = @db.sqls
208
212
  sqls.length.must_equal 2
@@ -222,7 +226,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
222
226
  end
223
227
 
224
228
  it "should have self_and_siblings return the children of the current node's parent" do
225
- @ds._fetch = [[{:id=>1, :id2=>6, :parent_id=>3, :parent_id2=>7, :name=>'r'}], [{:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'}, @o.values.dup]]
229
+ @c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>3, :parent_id2=>7, :name=>'r'}], [{:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'}, @o.values.dup]])
226
230
  @o.self_and_siblings.must_equal [@c.load(:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'), @o]
227
231
  sqls = @db.sqls
228
232
  sqls.length.must_equal 2
@@ -231,7 +235,7 @@ describe Sequel::Model, "tree plugin with composite keys" do
231
235
  end
232
236
 
233
237
  it "should have siblings return the children of the current node's parent, except for the current node" do
234
- @ds._fetch = [[{:id=>1, :id2=>6, :parent_id=>3, :parent_id2=>7, :name=>'r'}], [{:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'}, @o.values.dup]]
238
+ @c.dataset = @c.dataset.with_fetch([[{:id=>1, :id2=>6, :parent_id=>3, :parent_id2=>7, :name=>'r'}], [{:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2'}, @o.values.dup]])
235
239
  @o.siblings.must_equal [@c.load(:id=>7, :id2=>9, :parent_id=>1, :parent_id2=>6, :name=>'r2')]
236
240
  sqls = @db.sqls
237
241
  sqls.length.must_equal 2
@@ -245,30 +249,30 @@ describe Sequel::Model, "tree plugin with composite keys" do
245
249
  end
246
250
 
247
251
  it "prevents creating a second root" do
248
- @c.dataset._fetch = [{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}]
252
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
249
253
  lambda { @c.create }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
250
- @c.dataset._fetch = [{:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}]
254
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}])
251
255
  lambda { @c.create(:parent_id2=>1) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
252
- @c.dataset._fetch = [{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}]
256
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}])
253
257
  lambda { @c.create(:parent_id=>2) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
254
258
  end
255
259
 
256
260
  it "errors when promoting an existing record to a second root" do
257
- @c.dataset._fetch = [{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}]
261
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}])
258
262
  lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id => nil, :parent_id2=>nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
259
- @c.dataset._fetch = [{:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}]
263
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}])
260
264
  lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
261
- @c.dataset._fetch = [{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}]
265
+ @c.dataset = @c.dataset.with_fetch([{:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}])
262
266
  lambda { @c.load(:id => 2, :id2=>7, :parent_id => 1, :parent_id2=>2).update(:parent_id2 => nil) }.must_raise(Sequel::Plugins::Tree::TreeMultipleRootError)
263
267
  end
264
268
 
265
269
  it "allows updating existing root" do
266
- @c.dataset._fetch = {:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r'}
267
- @c.root.update(:name => 'fdsa')
268
- @c.dataset._fetch = {:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r'}
269
- @c.root.update(:name => 'fdsa')
270
- @c.dataset._fetch = {:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r'}
271
- @c.root.update(:name => 'fdsa')
270
+ @c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>nil, :name=>'r')
271
+ @c.root.update(:name => 'fdsa')
272
+ @c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>1, :parent_id2=>nil, :name=>'r')
273
+ @c.root.update(:name => 'fdsa')
274
+ @c.dataset = @c.dataset.with_fetch(:id=>1, :id2=>6, :parent_id=>nil, :parent_id2=>2, :name=>'r')
275
+ @c.root.update(:name => 'fdsa')
272
276
  end
273
277
  end
274
278
  end