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
@@ -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