sequel 4.41.0 → 4.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +98 -0
  3. data/README.rdoc +23 -10
  4. data/doc/active_record.rdoc +4 -4
  5. data/doc/advanced_associations.rdoc +2 -2
  6. data/doc/association_basics.rdoc +5 -2
  7. data/doc/cheat_sheet.rdoc +3 -3
  8. data/doc/core_extensions.rdoc +2 -2
  9. data/doc/dataset_basics.rdoc +4 -4
  10. data/doc/dataset_filtering.rdoc +1 -1
  11. data/doc/migration.rdoc +19 -1
  12. data/doc/prepared_statements.rdoc +2 -2
  13. data/doc/release_notes/4.42.0.txt +221 -0
  14. data/doc/testing.rdoc +3 -1
  15. data/lib/sequel/adapters/ado/access.rb +0 -1
  16. data/lib/sequel/adapters/ado/mssql.rb +0 -1
  17. data/lib/sequel/adapters/do/mysql.rb +0 -1
  18. data/lib/sequel/adapters/do/postgres.rb +0 -1
  19. data/lib/sequel/adapters/do/sqlite3.rb +0 -1
  20. data/lib/sequel/adapters/ibmdb.rb +21 -25
  21. data/lib/sequel/adapters/jdbc.rb +8 -16
  22. data/lib/sequel/adapters/jdbc/as400.rb +0 -1
  23. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -1
  24. data/lib/sequel/adapters/jdbc/db2.rb +0 -1
  25. data/lib/sequel/adapters/jdbc/derby.rb +0 -1
  26. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -1
  27. data/lib/sequel/adapters/jdbc/h2.rb +0 -1
  28. data/lib/sequel/adapters/jdbc/hsqldb.rb +0 -1
  29. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -1
  30. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -1
  31. data/lib/sequel/adapters/jdbc/jtds.rb +0 -1
  32. data/lib/sequel/adapters/jdbc/mssql.rb +0 -1
  33. data/lib/sequel/adapters/jdbc/mysql.rb +0 -1
  34. data/lib/sequel/adapters/jdbc/oracle.rb +0 -1
  35. data/lib/sequel/adapters/jdbc/postgresql.rb +0 -13
  36. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +0 -1
  37. data/lib/sequel/adapters/jdbc/sqlite.rb +0 -1
  38. data/lib/sequel/adapters/jdbc/sqlserver.rb +3 -4
  39. data/lib/sequel/adapters/mock.rb +54 -12
  40. data/lib/sequel/adapters/mysql.rb +1 -1
  41. data/lib/sequel/adapters/mysql2.rb +11 -17
  42. data/lib/sequel/adapters/odbc/mssql.rb +0 -1
  43. data/lib/sequel/adapters/oracle.rb +8 -20
  44. data/lib/sequel/adapters/postgres.rb +11 -29
  45. data/lib/sequel/adapters/shared/access.rb +5 -12
  46. data/lib/sequel/adapters/shared/cubrid.rb +4 -13
  47. data/lib/sequel/adapters/shared/db2.rb +4 -2
  48. data/lib/sequel/adapters/shared/firebird.rb +2 -4
  49. data/lib/sequel/adapters/shared/informix.rb +4 -2
  50. data/lib/sequel/adapters/shared/mssql.rb +3 -5
  51. data/lib/sequel/adapters/shared/mysql.rb +4 -14
  52. data/lib/sequel/adapters/shared/oracle.rb +1 -3
  53. data/lib/sequel/adapters/shared/postgres.rb +16 -38
  54. data/lib/sequel/adapters/shared/progress.rb +0 -2
  55. data/lib/sequel/adapters/shared/sqlanywhere.rb +0 -2
  56. data/lib/sequel/adapters/shared/sqlite.rb +20 -16
  57. data/lib/sequel/adapters/sqlite.rb +8 -20
  58. data/lib/sequel/adapters/swift/mysql.rb +0 -1
  59. data/lib/sequel/adapters/swift/postgres.rb +0 -1
  60. data/lib/sequel/adapters/swift/sqlite.rb +0 -1
  61. data/lib/sequel/adapters/tinytds.rb +4 -12
  62. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +1 -1
  63. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -2
  64. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +11 -34
  65. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  66. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +26 -0
  67. data/lib/sequel/ast_transformer.rb +2 -2
  68. data/lib/sequel/database/dataset.rb +1 -1
  69. data/lib/sequel/database/dataset_defaults.rb +0 -66
  70. data/lib/sequel/database/features.rb +6 -0
  71. data/lib/sequel/database/misc.rb +31 -17
  72. data/lib/sequel/database/query.rb +7 -4
  73. data/lib/sequel/database/schema_methods.rb +1 -1
  74. data/lib/sequel/dataset.rb +8 -8
  75. data/lib/sequel/dataset/actions.rb +140 -46
  76. data/lib/sequel/dataset/features.rb +1 -5
  77. data/lib/sequel/dataset/graph.rb +7 -8
  78. data/lib/sequel/dataset/misc.rb +127 -56
  79. data/lib/sequel/dataset/mutation.rb +9 -20
  80. data/lib/sequel/dataset/placeholder_literalizer.rb +10 -1
  81. data/lib/sequel/dataset/prepared_statements.rb +102 -46
  82. data/lib/sequel/dataset/query.rb +155 -72
  83. data/lib/sequel/dataset/sql.rb +26 -9
  84. data/lib/sequel/extensions/columns_introspection.rb +3 -1
  85. data/lib/sequel/extensions/core_extensions.rb +5 -5
  86. data/lib/sequel/extensions/core_refinements.rb +5 -5
  87. data/lib/sequel/extensions/duplicate_columns_handler.rb +4 -2
  88. data/lib/sequel/extensions/freeze_datasets.rb +69 -0
  89. data/lib/sequel/extensions/identifier_mangling.rb +196 -0
  90. data/lib/sequel/extensions/looser_typecasting.rb +11 -7
  91. data/lib/sequel/extensions/migration.rb +1 -1
  92. data/lib/sequel/extensions/null_dataset.rb +5 -2
  93. data/lib/sequel/extensions/pagination.rb +42 -23
  94. data/lib/sequel/extensions/pg_enum.rb +3 -3
  95. data/lib/sequel/extensions/query.rb +3 -3
  96. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +15 -8
  97. data/lib/sequel/model/associations.rb +25 -8
  98. data/lib/sequel/model/base.rb +88 -29
  99. data/lib/sequel/model/dataset_module.rb +37 -0
  100. data/lib/sequel/plugins/association_pks.rb +4 -4
  101. data/lib/sequel/plugins/class_table_inheritance.rb +2 -2
  102. data/lib/sequel/plugins/constraint_validations.rb +1 -2
  103. data/lib/sequel/plugins/csv_serializer.rb +2 -2
  104. data/lib/sequel/plugins/dataset_associations.rb +8 -8
  105. data/lib/sequel/plugins/eager_each.rb +2 -2
  106. data/lib/sequel/plugins/instance_filters.rb +1 -1
  107. data/lib/sequel/plugins/json_serializer.rb +2 -2
  108. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  109. data/lib/sequel/plugins/list.rb +4 -4
  110. data/lib/sequel/plugins/prepared_statements.rb +2 -4
  111. data/lib/sequel/plugins/prepared_statements_associations.rb +1 -3
  112. data/lib/sequel/plugins/prepared_statements_with_pk.rb +1 -1
  113. data/lib/sequel/plugins/rcte_tree.rb +13 -13
  114. data/lib/sequel/plugins/sharding.rb +1 -1
  115. data/lib/sequel/plugins/single_table_inheritance.rb +9 -4
  116. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  117. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  118. data/lib/sequel/plugins/validation_helpers.rb +1 -1
  119. data/lib/sequel/plugins/xml_serializer.rb +2 -2
  120. data/lib/sequel/sql.rb +69 -36
  121. data/lib/sequel/version.rb +1 -1
  122. data/spec/adapters/db2_spec.rb +10 -0
  123. data/spec/adapters/firebird_spec.rb +1 -1
  124. data/spec/adapters/mssql_spec.rb +4 -5
  125. data/spec/adapters/mysql_spec.rb +9 -9
  126. data/spec/adapters/postgres_spec.rb +67 -68
  127. data/spec/adapters/spec_helper.rb +6 -1
  128. data/spec/adapters/sqlite_spec.rb +29 -15
  129. data/spec/core/connection_pool_spec.rb +14 -14
  130. data/spec/core/database_spec.rb +38 -180
  131. data/spec/core/dataset_mutation_spec.rb +253 -0
  132. data/spec/core/dataset_spec.rb +394 -537
  133. data/spec/core/expression_filters_spec.rb +34 -32
  134. data/spec/core/mock_adapter_spec.rb +27 -35
  135. data/spec/core/placeholder_literalizer_spec.rb +2 -4
  136. data/spec/core/schema_generator_spec.rb +4 -4
  137. data/spec/core/schema_spec.rb +1 -2
  138. data/spec/core_extensions_spec.rb +22 -29
  139. data/spec/extensions/active_model_spec.rb +6 -6
  140. data/spec/extensions/association_dependencies_spec.rb +2 -2
  141. data/spec/extensions/blacklist_security_spec.rb +3 -3
  142. data/spec/extensions/boolean_readers_spec.rb +12 -12
  143. data/spec/extensions/caching_spec.rb +13 -10
  144. data/spec/extensions/class_table_inheritance_spec.rb +38 -43
  145. data/spec/extensions/column_conflicts_spec.rb +1 -3
  146. data/spec/extensions/columns_introspection_spec.rb +2 -3
  147. data/spec/extensions/composition_spec.rb +5 -3
  148. data/spec/extensions/constraint_validations_plugin_spec.rb +5 -5
  149. data/spec/extensions/constraint_validations_spec.rb +14 -8
  150. data/spec/extensions/core_refinements_spec.rb +22 -29
  151. data/spec/extensions/csv_serializer_spec.rb +7 -6
  152. data/spec/extensions/date_arithmetic_spec.rb +15 -15
  153. data/spec/extensions/defaults_setter_spec.rb +2 -2
  154. data/spec/extensions/delay_add_association_spec.rb +1 -1
  155. data/spec/extensions/dirty_spec.rb +19 -10
  156. data/spec/extensions/duplicate_columns_handler_spec.rb +12 -18
  157. data/spec/extensions/eager_each_spec.rb +12 -16
  158. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  159. data/spec/extensions/eval_inspect_spec.rb +4 -3
  160. data/spec/extensions/force_encoding_spec.rb +12 -12
  161. data/spec/extensions/freeze_datasets_spec.rb +31 -0
  162. data/spec/extensions/graph_each_spec.rb +6 -18
  163. data/spec/extensions/hook_class_methods_spec.rb +7 -7
  164. data/spec/extensions/identifier_mangling_spec.rb +307 -0
  165. data/spec/extensions/instance_filters_spec.rb +5 -6
  166. data/spec/extensions/instance_hooks_spec.rb +12 -12
  167. data/spec/extensions/json_serializer_spec.rb +12 -15
  168. data/spec/extensions/lazy_attributes_spec.rb +4 -4
  169. data/spec/extensions/list_spec.rb +19 -21
  170. data/spec/extensions/many_through_many_spec.rb +108 -163
  171. data/spec/extensions/meta_def_spec.rb +7 -2
  172. data/spec/extensions/migration_spec.rb +10 -12
  173. data/spec/extensions/mssql_optimistic_locking_spec.rb +4 -3
  174. data/spec/extensions/named_timezones_spec.rb +4 -3
  175. data/spec/extensions/nested_attributes_spec.rb +2 -2
  176. data/spec/extensions/null_dataset_spec.rb +17 -12
  177. data/spec/extensions/optimistic_locking_spec.rb +4 -5
  178. data/spec/extensions/pagination_spec.rb +8 -10
  179. data/spec/extensions/pg_array_associations_spec.rb +28 -27
  180. data/spec/extensions/pg_array_ops_spec.rb +2 -1
  181. data/spec/extensions/pg_array_spec.rb +6 -2
  182. data/spec/extensions/pg_enum_spec.rb +5 -3
  183. data/spec/extensions/pg_hstore_ops_spec.rb +3 -1
  184. data/spec/extensions/pg_hstore_spec.rb +7 -6
  185. data/spec/extensions/pg_inet_ops_spec.rb +2 -1
  186. data/spec/extensions/pg_inet_spec.rb +2 -1
  187. data/spec/extensions/pg_interval_spec.rb +2 -1
  188. data/spec/extensions/pg_json_ops_spec.rb +2 -1
  189. data/spec/extensions/pg_json_spec.rb +6 -3
  190. data/spec/extensions/pg_loose_count_spec.rb +1 -0
  191. data/spec/extensions/pg_range_ops_spec.rb +3 -1
  192. data/spec/extensions/pg_range_spec.rb +9 -5
  193. data/spec/extensions/pg_row_ops_spec.rb +2 -1
  194. data/spec/extensions/pg_row_plugin_spec.rb +4 -6
  195. data/spec/extensions/pg_row_spec.rb +5 -3
  196. data/spec/extensions/pg_static_cache_updater_spec.rb +2 -1
  197. data/spec/extensions/pg_typecast_on_load_spec.rb +1 -1
  198. data/spec/extensions/prepared_statements_associations_spec.rb +1 -1
  199. data/spec/extensions/prepared_statements_spec.rb +12 -11
  200. data/spec/extensions/pretty_table_spec.rb +1 -1
  201. data/spec/extensions/query_spec.rb +8 -5
  202. data/spec/extensions/rcte_tree_spec.rb +39 -39
  203. data/spec/extensions/round_timestamps_spec.rb +2 -2
  204. data/spec/extensions/schema_dumper_spec.rb +3 -2
  205. data/spec/extensions/schema_spec.rb +2 -2
  206. data/spec/extensions/scissors_spec.rb +1 -2
  207. data/spec/extensions/sequel_3_dataset_methods_spec.rb +30 -17
  208. data/spec/extensions/serialization_modification_detection_spec.rb +2 -2
  209. data/spec/extensions/serialization_spec.rb +15 -13
  210. data/spec/extensions/set_overrides_spec.rb +14 -8
  211. data/spec/extensions/sharding_spec.rb +9 -18
  212. data/spec/extensions/shared_caching_spec.rb +3 -4
  213. data/spec/extensions/single_table_inheritance_spec.rb +11 -11
  214. data/spec/extensions/skip_create_refresh_spec.rb +2 -1
  215. data/spec/extensions/spec_helper.rb +1 -1
  216. data/spec/extensions/split_values_spec.rb +2 -2
  217. data/spec/extensions/sql_comments_spec.rb +6 -0
  218. data/spec/extensions/static_cache_spec.rb +7 -9
  219. data/spec/extensions/string_agg_spec.rb +30 -29
  220. data/spec/extensions/tactical_eager_loading_spec.rb +4 -5
  221. data/spec/extensions/thread_local_timezones_spec.rb +2 -2
  222. data/spec/extensions/timestamps_spec.rb +28 -3
  223. data/spec/extensions/to_dot_spec.rb +1 -2
  224. data/spec/extensions/tree_spec.rb +33 -29
  225. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  226. data/spec/extensions/unlimited_update_spec.rb +1 -0
  227. data/spec/extensions/update_primary_key_spec.rb +11 -7
  228. data/spec/extensions/update_refresh_spec.rb +1 -1
  229. data/spec/extensions/uuid_spec.rb +0 -1
  230. data/spec/extensions/validate_associated_spec.rb +1 -1
  231. data/spec/extensions/validation_class_methods_spec.rb +10 -10
  232. data/spec/extensions/validation_helpers_spec.rb +10 -10
  233. data/spec/extensions/xml_serializer_spec.rb +7 -3
  234. data/spec/integration/associations_test.rb +31 -31
  235. data/spec/integration/dataset_test.rb +17 -19
  236. data/spec/integration/eager_loader_test.rb +24 -24
  237. data/spec/integration/model_test.rb +6 -6
  238. data/spec/integration/plugin_test.rb +43 -43
  239. data/spec/integration/prepared_statement_test.rb +6 -6
  240. data/spec/integration/schema_test.rb +63 -52
  241. data/spec/integration/spec_helper.rb +6 -1
  242. data/spec/integration/transaction_test.rb +13 -13
  243. data/spec/model/association_reflection_spec.rb +17 -17
  244. data/spec/model/associations_spec.rb +101 -96
  245. data/spec/model/base_spec.rb +175 -49
  246. data/spec/model/class_dataset_methods_spec.rb +5 -9
  247. data/spec/model/dataset_methods_spec.rb +5 -5
  248. data/spec/model/eager_loading_spec.rb +209 -235
  249. data/spec/model/hooks_spec.rb +15 -15
  250. data/spec/model/model_spec.rb +28 -21
  251. data/spec/model/plugins_spec.rb +4 -5
  252. data/spec/model/record_spec.rb +59 -57
  253. data/spec/model/spec_helper.rb +1 -1
  254. data/spec/model/validations_spec.rb +6 -6
  255. data/spec/spec_config.rb +1 -1
  256. metadata +10 -2
@@ -2,13 +2,14 @@ require File.join(File.dirname(File.expand_path(__FILE__)), 'spec_helper')
2
2
 
3
3
  describe "Blockless Ruby Filters" do
4
4
  before do
5
- db = Sequel::Database.new
6
- @d = db[:items]
7
- def @d.l(*args, &block)
8
- literal(filter_expr(*args, &block))
9
- end
10
- def @d.lit(*args)
11
- literal(*args)
5
+ db = Sequel.mock
6
+ @d = db[:items].with_extend do
7
+ def l(*args, &block)
8
+ literal(filter_expr(*args, &block))
9
+ end
10
+ def lit(*args)
11
+ literal(*args)
12
+ end
12
13
  end
13
14
  end
14
15
 
@@ -62,7 +63,7 @@ describe "Blockless Ruby Filters" do
62
63
  end
63
64
 
64
65
  it "should use = 't' and != 't' OR IS NULL if IS TRUE is not supported" do
65
- meta_def(@d, :supports_is_true?){false}
66
+ @d = @d.with_extend{def supports_is_true?; false end}
66
67
  @d.l(:x => true).must_equal "(x = 't')"
67
68
  @d.l(~Sequel.expr(:x => true)).must_equal "((x != 't') OR (x IS NULL))"
68
69
  @d.l(:x => false).must_equal "(x = 'f')"
@@ -94,7 +95,7 @@ describe "Blockless Ruby Filters" do
94
95
  @d.l{(x + y) =~ (1...5)}.must_equal '(((x + y) >= 1) AND ((x + y) < 5))'
95
96
  @d.l{(x + y) =~ [1,2,3]}.must_equal '((x + y) IN (1, 2, 3))'
96
97
 
97
- def @d.supports_regexp?; true end
98
+ @d = @d.with_extend{def supports_regexp?; true end}
98
99
  @d.l{x =~ /blah/}.must_equal '(x ~ \'blah\')'
99
100
  @d.l{(x + y) =~ /blah/}.must_equal '((x + y) ~ \'blah\')'
100
101
  end
@@ -117,19 +118,19 @@ describe "Blockless Ruby Filters" do
117
118
  @d.l{(x + y) !~ (1...5)}.must_equal '(((x + y) < 1) OR ((x + y) >= 5))'
118
119
  @d.l{(x + y) !~ [1,2,3]}.must_equal '((x + y) NOT IN (1, 2, 3))'
119
120
 
120
- def @d.supports_regexp?; true end
121
+ @d = @d.with_extend{def supports_regexp?; true end}
121
122
  @d.l{x !~ /blah/}.must_equal '(x !~ \'blah\')'
122
123
  @d.l{(x + y) !~ /blah/}.must_equal '((x + y) !~ \'blah\')'
123
124
  end
124
125
  end
125
126
 
126
127
  it "should support ~ via Hash and Regexp (if supported by database)" do
127
- def @d.supports_regexp?; true end
128
+ @d = @d.with_extend{def supports_regexp?; true end}
128
129
  @d.l(:x => /blah/).must_equal '(x ~ \'blah\')'
129
130
  end
130
131
 
131
132
  it "should support !~ via inverted Hash and Regexp" do
132
- def @d.supports_regexp?; true end
133
+ @d = @d.with_extend{def supports_regexp?; true end}
133
134
  @d.l(~Sequel.expr(:x => /blah/)).must_equal '(x !~ \'blah\')'
134
135
  end
135
136
 
@@ -265,7 +266,7 @@ describe "Blockless Ruby Filters" do
265
266
  end
266
267
 
267
268
  it "should emulate multiple column in if not supported" do
268
- meta_def(@d, :supports_multiple_column_in?){false}
269
+ @d = @d.with_extend{def supports_multiple_column_in?; false end}
269
270
  @d.l([:x, :y]=>Sequel.value_list([[1,2], [3,4]])).must_equal '(((x = 1) AND (y = 2)) OR ((x = 3) AND (y = 4)))'
270
271
  @d.l([:x, :y, :z]=>[[1,2,5], [3,4,6]]).must_equal '(((x = 1) AND (y = 2) AND (z = 5)) OR ((x = 3) AND (y = 4) AND (z = 6)))'
271
272
  end
@@ -429,8 +430,11 @@ describe "Blockless Ruby Filters" do
429
430
  end
430
431
 
431
432
  it "should raise an error if trying to literalize an invalid complex expression" do
432
- ce = Sequel.+(:x, 1)
433
- ce.instance_variable_set(:@op, :BANG)
433
+ ce = Sequel::SQL::ComplexExpression.allocate
434
+ ce.instance_eval do
435
+ @op = :BANG
436
+ @args = [:x, 1]
437
+ end
434
438
  proc{@d.lit(ce)}.must_raise(Sequel::InvalidOperation)
435
439
  end
436
440
 
@@ -489,7 +493,9 @@ describe "Blockless Ruby Filters" do
489
493
  end
490
494
 
491
495
  it "should handled emulated function where only name is emulated" do
492
- dsc = Class.new(Sequel::Dataset)
496
+ db = Sequel.mock
497
+ db.extend_datasets{}
498
+ dsc = db.dataset_class
493
499
  efm = dsc::EMULATED_FUNCTION_MAP.dup
494
500
  dsc::EMULATED_FUNCTION_MAP[:trim] = :foo
495
501
  dsc.new(@d.db).literal(Sequel.trim(:a)).must_equal 'foo(a)'
@@ -509,12 +515,11 @@ end
509
515
 
510
516
  describe Sequel::SQL::VirtualRow do
511
517
  before do
512
- db = Sequel::Database.new
513
- db.quote_identifiers = true
514
- @d = db[:items]
515
- meta_def(@d, :supports_window_functions?){true}
516
- def @d.l(*args, &block)
517
- literal(filter_expr(*args, &block))
518
+ @d = Sequel.mock[:items].with_quote_identifiers(true).with_extend do
519
+ def supports_window_functions?; true end
520
+ def l(*args, &block)
521
+ literal(filter_expr(*args, &block))
522
+ end
518
523
  end
519
524
  end
520
525
 
@@ -626,9 +631,7 @@ describe Sequel::SQL::VirtualRow do
626
631
  end
627
632
 
628
633
  it "should raise an error if window functions are not supported" do
629
- class << @d; remove_method :supports_window_functions? end
630
- meta_def(@d, :supports_window_functions?){false}
631
- proc{@d.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}}.must_raise(Sequel::Error)
634
+ proc{@d.with_extend{def supports_window_functions?; false end}.l{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}}.must_raise(Sequel::Error)
632
635
  proc{Sequel.mock.dataset.filter{count(:over, :* =>true, :partition=>a, :order=>b, :window=>:win, :frame=>:rows){}}.sql}.must_raise(Sequel::Error)
633
636
  end
634
637
 
@@ -670,19 +673,19 @@ describe Sequel::SQL::VirtualRow do
670
673
  end
671
674
 
672
675
  it "should handle quoted function names" do
673
- def @d.supports_quoted_function_names?; true; end
676
+ @d = @d.with_extend{def supports_quoted_function_names?; true end}
674
677
  @d.l{rank.function}.must_equal '"rank"()'
675
678
  @d.l{sch__rank.function}.must_equal '"sch"."rank"()'
676
679
  end
677
680
 
678
681
  it "should quote function names if a quoted function is used and database supports quoted function names" do
679
- def @d.supports_quoted_function_names?; true; end
682
+ @d = @d.with_extend{def supports_quoted_function_names?; true end}
680
683
  @d.l{rank{}.quoted}.must_equal '"rank"()'
681
684
  @d.l{sch__rank{}.quoted}.must_equal '"sch__rank"()'
682
685
  end
683
686
 
684
687
  it "should not quote function names if an unquoted function is used" do
685
- def @d.supports_quoted_function_names?; true; end
688
+ @d = @d.with_extend{def supports_quoted_function_names?; true end}
686
689
  @d.l{rank.function.unquoted}.must_equal 'rank()'
687
690
  @d.l{sch__rank.function.unquoted}.must_equal 'sch.rank()'
688
691
  end
@@ -734,9 +737,8 @@ end
734
737
 
735
738
  describe "Sequel core extension replacements" do
736
739
  before do
737
- @db = Sequel::Database.new
738
- @ds = @db.dataset
739
- def @ds.supports_regexp?; true end
740
+ @db = Sequel.mock
741
+ @ds = @db.dataset.with_extend{def supports_regexp?; true end}
740
742
  @o = Object.new
741
743
  def @o.sql_literal(ds) 'foo' end
742
744
  end
@@ -1242,7 +1244,7 @@ describe "Sequel.delay" do
1242
1244
 
1243
1245
  it "should delay calling the block until literalization" do
1244
1246
  ds = Sequel.mock[:b].where(:a=>Sequel.delay{@o.a})
1245
- @o._a.must_equal nil
1247
+ @o._a.must_be_nil
1246
1248
  ds.sql.must_equal "SELECT * FROM b WHERE (a = 1)"
1247
1249
  @o._a.must_equal 1
1248
1250
  ds.sql.must_equal "SELECT * FROM b WHERE (a = 2)"
@@ -39,6 +39,7 @@ describe "Sequel Mock Adapter" do
39
39
  end
40
40
 
41
41
  it "should have constructor accept no arguments" do
42
+ Sequel.require 'adapters/mock'
42
43
  Sequel::Mock::Database.new.must_be_kind_of(Sequel::Mock::Database)
43
44
  end
44
45
 
@@ -56,8 +57,8 @@ describe "Sequel Mock Adapter" do
56
57
  end
57
58
 
58
59
  it "should return nil for insert/execute_insert by default" do
59
- Sequel.mock[:t].insert(:a=>1).must_equal nil
60
- Sequel.mock.execute_insert('INSERT INTO a () DEFAULT VALUES').must_equal nil
60
+ Sequel.mock[:t].insert(:a=>1).must_be_nil
61
+ Sequel.mock.execute_insert('INSERT INTO a () DEFAULT VALUES').must_be_nil
61
62
  end
62
63
 
63
64
  it "should be able to set the rows returned by each using :fetch option with a single hash" do
@@ -149,13 +150,13 @@ describe "Sequel Mock Adapter" do
149
150
  proc{db[:t].all}.must_raise(Sequel::DatabaseError)
150
151
  end
151
152
 
152
- it "should be able to set the rows returned by each on a per dataset basis using _fetch" do
153
+ it "should be able to set the rows returned by each on a per dataset basis using with_fetch" do
153
154
  rs = []
154
155
  db = Sequel.mock(:fetch=>{:a=>1})
155
156
  ds = db[:t]
156
157
  ds.each{|r| rs << r}
157
158
  rs.must_equal [{:a=>1}]
158
- ds._fetch = {:b=>2}
159
+ ds = ds.with_fetch(:b=>2)
159
160
  ds.each{|r| rs << r}
160
161
  rs.must_equal [{:a=>1}, {:b=>2}]
161
162
  end
@@ -222,7 +223,7 @@ describe "Sequel Mock Adapter" do
222
223
  ds = db[:t]
223
224
  ds.update(:a=>1).must_equal 2
224
225
  ds.delete.must_equal 2
225
- ds.numrows = 3
226
+ ds = ds.with_numrows(3)
226
227
  ds.update(:a=>1).must_equal 3
227
228
  ds.delete.must_equal 3
228
229
  end
@@ -246,7 +247,7 @@ describe "Sequel Mock Adapter" do
246
247
  db[:t].insert(:a=>1).must_equal 1
247
248
  db[:t].insert(:a=>1).must_equal 3
248
249
  db[:t].insert(:a=>1).must_equal 5
249
- db[:t].insert(:a=>1).must_equal nil
250
+ db[:t].insert(:a=>1).must_be_nil
250
251
  end
251
252
 
252
253
  it "should be able to set the autogenerated primary key returned by insert using :autoid option as a proc" do
@@ -272,7 +273,7 @@ describe "Sequel Mock Adapter" do
272
273
  db = Sequel.mock(:autoid=>[1, proc{|s| 2}, nil, ArgumentError])
273
274
  db[:t].insert.must_equal 1
274
275
  db[:t].insert.must_equal 2
275
- db[:t].insert.must_equal nil
276
+ db[:t].insert.must_be_nil
276
277
  proc{db[:t].insert}.must_raise(Sequel::DatabaseError)
277
278
  end
278
279
 
@@ -288,7 +289,7 @@ describe "Sequel Mock Adapter" do
288
289
  db = Sequel.mock(:autoid=>1)
289
290
  ds = db[:t]
290
291
  ds.insert(:a=>1).must_equal 1
291
- ds.autoid = 5
292
+ ds = ds.with_autoid(5)
292
293
  ds.insert(:a=>1).must_equal 5
293
294
  ds.insert(:a=>1).must_equal 6
294
295
  db[:t].insert(:a=>1).must_equal 2
@@ -335,14 +336,13 @@ describe "Sequel Mock Adapter" do
335
336
 
336
337
  it "should allow overriding of server_version" do
337
338
  db = Sequel.mock
338
- db.server_version.must_equal nil
339
+ db.server_version.must_be_nil
339
340
  db.server_version = 80102
340
341
  db.server_version.must_equal 80102
341
342
  end
342
343
 
343
- it "should not have identifier input/output methods by default" do
344
- Sequel.mock.send(:identifier_input_method_default).must_equal nil
345
- Sequel.mock.send(:identifier_output_method_default).must_equal nil
344
+ it "should not fold to uppercase by default" do
345
+ Sequel.mock.send(:folds_unquoted_identifiers_to_uppercase?).must_equal false
346
346
  end
347
347
 
348
348
  it "should keep a record of all executed SQL in #sqls" do
@@ -449,29 +449,21 @@ describe "Sequel Mock Adapter" do
449
449
  end
450
450
 
451
451
  it "should be able to load dialects based on the database name" do
452
- begin
453
- qi = class Sequel::Database; @quote_identifiers; end
454
- ii = class Sequel::Database; @identifier_input_method; end
455
- io = class Sequel::Database; @identifier_output_method; end
456
- Sequel.quote_identifiers = nil
457
- class Sequel::Database; @identifier_input_method=nil; end
458
- class Sequel::Database; @identifier_output_method=nil; end
459
- Sequel.mock(:host=>'access').select(Date.new(2011, 12, 13)).sql.must_equal 'SELECT #2011-12-13#'
460
- Sequel.mock(:host=>'cubrid').from(:a).offset(1).sql.must_equal 'SELECT * FROM "a" LIMIT 1,4294967295'
461
- Sequel.mock(:host=>'db2').select(1).sql.must_equal 'SELECT 1 FROM "SYSIBM"."SYSDUMMY1"'
462
- Sequel.mock(:host=>'firebird')[:a].distinct.limit(1, 2).sql.must_equal 'SELECT DISTINCT FIRST 1 SKIP 2 * FROM "A"'
463
- Sequel.mock(:host=>'informix')[:a].distinct.limit(1, 2).sql.must_equal 'SELECT SKIP 2 FIRST 1 DISTINCT * FROM A'
464
- Sequel.mock(:host=>'mssql')[:a].full_text_search(:b, 'c').sql.must_equal "SELECT * FROM [A] WHERE (CONTAINS ([B], 'c'))"
465
- Sequel.mock(:host=>'mysql')[:a].full_text_search(:b, 'c').sql.must_equal "SELECT * FROM `a` WHERE (MATCH (`b`) AGAINST ('c'))"
466
- Sequel.mock(:host=>'oracle')[:a].limit(1).sql.must_equal 'SELECT * FROM (SELECT * FROM "A") "T1" WHERE (ROWNUM <= 1)'
467
- Sequel.mock(:host=>'postgres')[:a].full_text_search(:b, 'c').sql.must_equal "SELECT * FROM \"a\" WHERE (to_tsvector(CAST('simple' AS regconfig), (COALESCE(\"b\", ''))) @@ to_tsquery(CAST('simple' AS regconfig), 'c'))"
468
- Sequel.mock(:host=>'sqlanywhere').from(:a).offset(1).sql.must_equal 'SELECT TOP 2147483647 START AT (1 + 1) * FROM "A"'
469
- Sequel.mock(:host=>'sqlite')[:a___b].sql.must_equal "SELECT * FROM `a` AS 'b'"
470
- ensure
471
- Sequel.quote_identifiers = qi
472
- Sequel::Database.send(:instance_variable_set, :@identifier_input_method, ii)
473
- Sequel::Database.send(:instance_variable_set, :@identifier_output_method, io)
474
- end
452
+ Sequel.mock(:host=>'access').select(Date.new(2011, 12, 13)).sql.must_equal 'SELECT #2011-12-13#'
453
+ Sequel.mock(:host=>'cubrid').from(:a).offset(1).with_quote_identifiers(false).sql.must_equal 'SELECT * FROM a LIMIT 1,4294967295'
454
+ Sequel.mock(:host=>'db2').select(1).sql.must_equal 'SELECT 1 FROM "SYSIBM"."SYSDUMMY1"'
455
+ Sequel.mock(:host=>'firebird')[:A].distinct.limit(1, 2).with_quote_identifiers(false).sql.must_equal 'SELECT DISTINCT FIRST 1 SKIP 2 * FROM A'
456
+ Sequel.mock(:host=>'informix')[:a].distinct.limit(1, 2).sql.upcase.must_equal 'SELECT SKIP 2 FIRST 1 DISTINCT * FROM A'
457
+ Sequel.mock(:host=>'mssql', :identifier_mangling=>false)[:A].full_text_search(:B, 'C').with_quote_identifiers(false).sql.must_equal "SELECT * FROM A WHERE (CONTAINS (B, 'C'))"
458
+ Sequel.mock(:host=>'mysql')[:a].full_text_search(:b, 'c').with_quote_identifiers(false).sql.must_equal "SELECT * FROM a WHERE (MATCH (b) AGAINST ('c'))"
459
+ Sequel.mock(:host=>'oracle')[:a].limit(1).with_quote_identifiers(false).sql.upcase.must_equal 'SELECT * FROM (SELECT * FROM A) T1 WHERE (ROWNUM <= 1)'
460
+ Sequel.mock(:host=>'postgres')[:a].full_text_search(:b, 'c').with_quote_identifiers(false).sql.must_equal "SELECT * FROM a WHERE (to_tsvector(CAST('simple' AS regconfig), (COALESCE(b, ''))) @@ to_tsquery(CAST('simple' AS regconfig), 'c'))"
461
+ Sequel.mock(:host=>'sqlanywhere').from(:A).offset(1).with_quote_identifiers(false).sql.must_equal 'SELECT TOP 2147483647 START AT (1 + 1) * FROM A'
462
+ Sequel.mock(:host=>'sqlite')[:a___b].with_quote_identifiers(false).sql.must_equal "SELECT * FROM a AS 'b'"
463
+ end
464
+
465
+ it "should be able to mock schema calls" do
466
+ Sequel.mock(:host=>'mysql', :fetch=>{:Field=>'a'}).schema(:a).first.first.must_equal :a
475
467
  end
476
468
 
477
469
  it "should automatically set version for adapters needing versions" do
@@ -87,7 +87,7 @@ describe "Dataset::PlaceholderLiteralizer" do
87
87
  end
88
88
 
89
89
  it "should handle dataset with row procs" do
90
- @ds.row_proc = proc{|r| {:foo=>r[:id]+1}}
90
+ @ds = @ds.with_row_proc(proc{|r| {:foo=>r[:id]+1}})
91
91
  loader = @c.loader(@ds){|pl, ds| ds.where(:a=>pl.arg)}
92
92
  loader.first(1).must_equal(:foo=>2)
93
93
  @db.sqls.must_equal ["SELECT * FROM items WHERE (a = 1)"]
@@ -124,9 +124,7 @@ describe "Dataset::PlaceholderLiteralizer" do
124
124
  it "should support modifying dataset used on per-call basis with #run" do
125
125
  loader = @c.loader(@ds){|pl, ds| ds.where(:a=>pl.arg)}
126
126
  loader.with_dataset do |ds|
127
- ds = ds.clone
128
- ds.row_proc = lambda{|row| [row]}
129
- ds
127
+ ds.with_row_proc(lambda{|row| [row]})
130
128
  end.all(1).must_equal [[@h]]
131
129
  @db.sqls.must_equal ["SELECT * FROM items WHERE (a = 1)"]
132
130
  end
@@ -27,7 +27,7 @@ describe Sequel::Schema::Generator do
27
27
  @columns.first[:name].must_equal :id
28
28
  @columns.first[:primary_key].must_equal true
29
29
  @columns[3][:name].must_equal :parent_id
30
- @columns[3][:primary_key].must_equal nil
30
+ @columns[3][:primary_key].must_be_nil
31
31
  end
32
32
 
33
33
  it "should respect existing column order if primary_key :keep_order is used" do
@@ -40,7 +40,7 @@ describe Sequel::Schema::Generator do
40
40
  columns.last[:name].must_equal :id
41
41
  columns.last[:primary_key].must_equal true
42
42
  columns.first[:name].must_equal :title
43
- columns.first[:primary_key].must_equal nil
43
+ columns.first[:primary_key].must_be_nil
44
44
  end
45
45
 
46
46
  it "should handle SQL::Identifier and SQL::QualifiedIdentifier as foreign_key arguments" do
@@ -85,7 +85,7 @@ describe Sequel::Schema::Generator do
85
85
  end
86
86
 
87
87
  it "uses table for foreign key columns, if specified" do
88
- @columns[3][:table].must_equal nil
88
+ @columns[3][:table].must_be_nil
89
89
  @columns[4][:table].must_equal :nodes
90
90
  @constraints[3][:table].must_equal :nodes_props
91
91
  end
@@ -98,7 +98,7 @@ describe Sequel::Schema::Generator do
98
98
  end
99
99
 
100
100
  it "creates constraints" do
101
- @constraints[0][:name].must_equal nil
101
+ @constraints[0][:name].must_be_nil
102
102
  @constraints[0][:type].must_equal :check
103
103
  @constraints[0][:check].must_equal ['price > 100']
104
104
 
@@ -384,11 +384,10 @@ describe "DB#create_table" do
384
384
  end
385
385
 
386
386
  it "should accept collation" do
387
- @db.quote_identifiers = true
388
387
  @db.create_table(:cats) do
389
388
  String :name, :collate => :utf8_bin
390
389
  end
391
- @db.sqls.must_equal ['CREATE TABLE "cats" ("name" varchar(255) COLLATE utf8_bin)']
390
+ @db.sqls.must_equal ['CREATE TABLE cats (name varchar(255) COLLATE utf8_bin)']
392
391
  end
393
392
 
394
393
  it "should accept collation as a String, treated literally" do
@@ -33,14 +33,15 @@ end
33
33
 
34
34
  describe "Core extensions" do
35
35
  before do
36
- db = Sequel::Database.new
37
- @d = db[:items]
38
- def @d.supports_regexp?; true end
39
- def @d.l(*args, &block)
40
- literal(filter_expr(*args, &block))
41
- end
42
- def @d.lit(*args)
43
- literal(*args)
36
+ db = Sequel.mock
37
+ @d = db[:items].with_extend do
38
+ def supports_regexp?; true end
39
+ def l(*args, &block)
40
+ literal(filter_expr(*args, &block))
41
+ end
42
+ def lit(*args)
43
+ literal(*args)
44
+ end
44
45
  end
45
46
  end
46
47
 
@@ -316,7 +317,7 @@ end
316
317
 
317
318
  describe "String#lit" do
318
319
  before do
319
- @ds = Sequel::Database.new[:t]
320
+ @ds = Sequel.mock[:t]
320
321
  end
321
322
 
322
323
  it "should return an LiteralString object" do
@@ -332,16 +333,14 @@ describe "String#lit" do
332
333
  a = 'DISTINCT ?'.lit(:a)
333
334
  a.must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
334
335
  @ds.literal(a).must_equal 'DISTINCT a'
335
- @ds.quote_identifiers = true
336
- @ds.literal(a).must_equal 'DISTINCT "a"'
336
+ @ds.with_quote_identifiers(true).literal(a).must_equal 'DISTINCT "a"'
337
337
  end
338
338
 
339
339
  it "should handle named placeholders if given a single argument hash" do
340
340
  a = 'DISTINCT :b'.lit(:b=>:a)
341
341
  a.must_be_kind_of(Sequel::SQL::PlaceholderLiteralString)
342
342
  @ds.literal(a).must_equal 'DISTINCT a'
343
- @ds.quote_identifiers = true
344
- @ds.literal(a).must_equal 'DISTINCT "a"'
343
+ @ds.with_quote_identifiers(true).literal(a).must_equal 'DISTINCT "a"'
345
344
  end
346
345
 
347
346
  it "should treat placeholder literal strings as generic expressions" do
@@ -445,11 +444,7 @@ end
445
444
 
446
445
  describe "Column references" do
447
446
  before do
448
- @ds = Sequel::Database.new.dataset
449
- def @ds.quoted_identifier_append(sql, c)
450
- sql << "`#{c}`"
451
- end
452
- @ds.quote_identifiers = true
447
+ @ds = Sequel.mock.dataset.with_quote_identifiers(true).with_extend{def quoted_identifier_append(sql, c) sql << "`#{c}`" end}
453
448
  end
454
449
 
455
450
  it "should be quoted properly" do
@@ -520,30 +515,28 @@ end
520
515
 
521
516
  describe "Symbol" do
522
517
  before do
523
- @ds = Sequel.mock.dataset
524
- @ds.quote_identifiers = true
525
- @ds.identifier_input_method = :upcase
518
+ @ds = Sequel.mock.dataset.with_quote_identifiers(true)
526
519
  end
527
520
 
528
521
  it "#identifier should format an identifier" do
529
- @ds.literal(:xyz__abc.identifier).must_equal '"XYZ__ABC"'
522
+ @ds.literal(:xyz__abc.identifier).must_equal '"xyz__abc"'
530
523
  end
531
524
 
532
525
  it "#qualify should format a qualified column" do
533
- @ds.literal(:xyz.qualify(:abc)).must_equal '"ABC"."XYZ"'
526
+ @ds.literal(:xyz.qualify(:abc)).must_equal '"abc"."xyz"'
534
527
  end
535
528
 
536
529
  it "#qualify should work on QualifiedIdentifiers" do
537
- @ds.literal(:xyz.qualify(:abc).qualify(:def)).must_equal '"DEF"."ABC"."XYZ"'
530
+ @ds.literal(:xyz.qualify(:abc).qualify(:def)).must_equal '"def"."abc"."xyz"'
538
531
  end
539
532
 
540
533
  it "should be able to qualify an identifier" do
541
- @ds.literal(:xyz.identifier.qualify(:xyz__abc)).must_equal '"XYZ"."ABC"."XYZ"'
534
+ @ds.literal(:xyz.identifier.qualify(:xyz__abc)).must_equal '"xyz"."abc"."xyz"'
542
535
  end
543
536
 
544
537
  it "should be able to specify a schema.table.column" do
545
- @ds.literal(:column.qualify(:table.qualify(:schema))).must_equal '"SCHEMA"."TABLE"."COLUMN"'
546
- @ds.literal(:column.qualify(:table__name.identifier.qualify(:schema))).must_equal '"SCHEMA"."TABLE__NAME"."COLUMN"'
538
+ @ds.literal(:column.qualify(:table.qualify(:schema))).must_equal '"schema"."table"."column"'
539
+ @ds.literal(:column.qualify(:table__name.identifier.qualify(:schema))).must_equal '"schema"."table__name"."column"'
547
540
  end
548
541
 
549
542
  it "should be able to specify order" do
@@ -558,13 +551,13 @@ describe "Symbol" do
558
551
  it "should work correctly with objects" do
559
552
  o = Object.new
560
553
  def o.sql_literal(ds) "(foo)" end
561
- @ds.literal(:column.qualify(o)).must_equal '(foo)."COLUMN"'
554
+ @ds.literal(:column.qualify(o)).must_equal '(foo)."column"'
562
555
  end
563
556
  end
564
557
 
565
558
  describe "Symbol" do
566
559
  before do
567
- @ds = Sequel::Database.new.dataset
560
+ @ds = Sequel.mock.dataset
568
561
  end
569
562
 
570
563
  it "should support sql_function method" do