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
@@ -33,25 +33,25 @@ describe "ActiveModel plugin" do
33
33
  end
34
34
 
35
35
  it "#to_key should return a key array, or nil" do
36
- @o.to_key.must_equal nil
36
+ @o.to_key.must_be_nil
37
37
  @o.id = 1
38
38
  @o.to_key.must_equal [1]
39
39
  @o.id = nil
40
- @o.to_key.must_equal nil
40
+ @o.to_key.must_be_nil
41
41
 
42
42
  @c.set_primary_key [:id2, :id]
43
- @o.to_key.must_equal nil
43
+ @o.to_key.must_be_nil
44
44
  @o.id = 1
45
45
  @o.id2 = 2
46
46
  @o.to_key.must_equal [2, 1]
47
47
  @o.destroy
48
48
  @o.to_key.must_equal [2, 1]
49
49
  @o.id = nil
50
- @o.to_key.must_equal nil
50
+ @o.to_key.must_be_nil
51
51
  end
52
52
 
53
53
  it "#to_param should return a param string or nil" do
54
- @o.to_param.must_equal nil
54
+ @o.to_param.must_be_nil
55
55
  @o.id = 1
56
56
  @o.to_param.must_equal '1'
57
57
  @c.set_primary_key [:id2, :id]
@@ -60,7 +60,7 @@ describe "ActiveModel plugin" do
60
60
  @o.meta_def(:to_param_joiner){'|'}
61
61
  @o.to_param.must_equal '2|1'
62
62
  @o.destroy
63
- @o.to_param.must_equal nil
63
+ @o.to_param.must_be_nil
64
64
  end
65
65
 
66
66
  it "#persisted? should return true if the object exists and has not been destroyed" do
@@ -6,9 +6,9 @@ describe "AssociationDependencies plugin" do
6
6
  @c = Class.new(Sequel::Model)
7
7
  @c.plugin :association_dependencies
8
8
  @Artist = Class.new(@c).set_dataset(:artists)
9
- @Artist.dataset._fetch = {:id=>2, :name=>'Ar'}
9
+ @Artist.dataset = @Artist.dataset.with_fetch(:id=>2, :name=>'Ar')
10
10
  @Album = Class.new(@c).set_dataset(:albums)
11
- @Album.dataset._fetch = {:id=>1, :name=>'Al', :artist_id=>2}
11
+ @Album.dataset = @Album.dataset.with_fetch(:id=>1, :name=>'Al', :artist_id=>2)
12
12
  @Artist.columns :id, :name
13
13
  @Album.columns :id, :name, :artist_id
14
14
  @Artist.one_to_many :albums, :class=>@Album, :key=>:artist_id
@@ -50,7 +50,7 @@ describe Sequel::Model, ".restricted_columns " do
50
50
  end
51
51
 
52
52
  it "should set the restricted columns correctly" do
53
- @c.restricted_columns.must_equal nil
53
+ @c.restricted_columns.must_be_nil
54
54
  @c.set_restricted_columns :x
55
55
  @c.restricted_columns.must_equal [:x]
56
56
  @c.set_restricted_columns :x, :y
@@ -64,7 +64,7 @@ describe Sequel::Model, ".restricted_columns " do
64
64
  i.set(:x => 4, :y => 5, :z => 6)
65
65
  i.values.must_equal(:x => 4, :y => 5)
66
66
 
67
- @c.instance_dataset._fetch = @c.dataset._fetch = {:x => 7}
67
+ @c.dataset = @c.dataset.with_fetch(:x => 7)
68
68
  i = @c.new
69
69
  i.update(:x => 7, :z => 9)
70
70
  i.values.must_equal(:x => 7)
@@ -79,7 +79,7 @@ describe Sequel::Model, ".restricted_columns " do
79
79
  i.set(:x => 4, :y => 5, :z => 6)
80
80
  i.values.must_equal(:x => 4, :y => 5)
81
81
 
82
- @c.instance_dataset._fetch = @c.dataset._fetch = {:y => 7}
82
+ @c.dataset = @c.dataset.with_fetch(:y => 7)
83
83
  i = @c.new
84
84
  i.update(:y => 7, :z => 9)
85
85
  i.values.must_equal(:y => 7)
@@ -19,13 +19,13 @@ describe Sequel::Model, "BooleanReaders plugin" do
19
19
  it "should create attribute? readers for all boolean attributes" do
20
20
  @c.plugin(:boolean_readers)
21
21
  o = @c.new
22
- o.b?.must_equal nil
22
+ o.b?.must_be_nil
23
23
  o.b = '1'
24
24
  o.b?.must_equal true
25
25
  o.b = '0'
26
26
  o.b?.must_equal false
27
27
  o.b = ''
28
- o.b?.must_equal nil
28
+ o.b?.must_be_nil
29
29
  end
30
30
 
31
31
  it "should not create attribute? readers for non-boolean attributes" do
@@ -38,8 +38,8 @@ describe Sequel::Model, "BooleanReaders plugin" do
38
38
  @c.plugin(:boolean_readers){|c| db_schema[c][:db_type] == 'tinyint(1)'}
39
39
  proc{@c.new.b?}.must_raise(NoMethodError)
40
40
  o = @c.new
41
- o.z.must_equal nil
42
- o.z?.must_equal nil
41
+ o.z.must_be_nil
42
+ o.z?.must_be_nil
43
43
  o.z = '1'
44
44
  o.z.must_equal 1
45
45
  o.z?.must_equal true
@@ -47,8 +47,8 @@ describe Sequel::Model, "BooleanReaders plugin" do
47
47
  o.z.must_equal 0
48
48
  o.z?.must_equal false
49
49
  o.z = ''
50
- o.z.must_equal nil
51
- o.z?.must_equal nil
50
+ o.z.must_be_nil
51
+ o.z?.must_be_nil
52
52
  end
53
53
 
54
54
  it "should create boolean readers when set_dataset is defined" do
@@ -57,13 +57,13 @@ describe Sequel::Model, "BooleanReaders plugin" do
57
57
  c.plugin(:boolean_readers)
58
58
  c.set_dataset(@db[:a])
59
59
  o = c.new
60
- o.b?.must_equal nil
60
+ o.b?.must_be_nil
61
61
  o.b = '1'
62
62
  o.b?.must_equal true
63
63
  o.b = '0'
64
64
  o.b?.must_equal false
65
65
  o.b = ''
66
- o.b?.must_equal nil
66
+ o.b?.must_be_nil
67
67
  proc{o.i?}.must_raise(NoMethodError)
68
68
 
69
69
  c = Class.new(Sequel::Model(@db))
@@ -71,8 +71,8 @@ describe Sequel::Model, "BooleanReaders plugin" do
71
71
  c.plugin(:boolean_readers){|x| db_schema[x][:db_type] == 'tinyint(1)'}
72
72
  c.set_dataset(@db[:a])
73
73
  o = c.new
74
- o.z.must_equal nil
75
- o.z?.must_equal nil
74
+ o.z.must_be_nil
75
+ o.z?.must_be_nil
76
76
  o.z = '1'
77
77
  o.z.must_equal 1
78
78
  o.z?.must_equal true
@@ -80,8 +80,8 @@ describe Sequel::Model, "BooleanReaders plugin" do
80
80
  o.z.must_equal 0
81
81
  o.z?.must_equal false
82
82
  o.z = ''
83
- o.z.must_equal nil
84
- o.z?.must_equal nil
83
+ o.z.must_be_nil
84
+ o.z?.must_be_nil
85
85
  proc{o.b?}.must_raise(NoMethodError)
86
86
  end
87
87
 
@@ -43,13 +43,15 @@ describe Sequel::Model, "caching" do
43
43
  columns :name, :id
44
44
  end
45
45
 
46
- @dataset = @c.dataset = @c3.dataset = @c4.dataset
47
- @dataset._fetch = {:name => 'sharon'.dup, :id => 1}
48
- @dataset.numrows = 1
49
46
 
50
47
  @c2 = Class.new(@c) do
51
48
  def self.name; 'SubItem' end
52
49
  end
50
+
51
+ [@c, @c2, @c3, @c4].each do |c|
52
+ c.dataset = c.dataset.with_fetch(:name => 'sharon'.dup, :id => 1).with_numrows(1)
53
+ end
54
+
53
55
  @c.db.reset
54
56
  end
55
57
 
@@ -164,7 +166,7 @@ describe Sequel::Model, "caching" do
164
166
  end
165
167
 
166
168
  it "should handle lookups by nil primary keys" do
167
- @c[nil].must_equal nil
169
+ @c[nil].must_be_nil
168
170
  @c.db.sqls.must_equal []
169
171
  end
170
172
 
@@ -200,7 +202,7 @@ describe Sequel::Model, "caching" do
200
202
 
201
203
  it "should support #[] as a shortcut to #find with hash" do
202
204
  m = @c[:id => 3]
203
- @cache[m.cache_key].must_equal nil
205
+ @cache[m.cache_key].must_be_nil
204
206
  @c.db.sqls.must_equal ["SELECT * FROM items WHERE (id = 3) LIMIT 1"]
205
207
  m = @c[1]
206
208
  @cache[m.cache_key].must_equal m
@@ -209,7 +211,7 @@ describe Sequel::Model, "caching" do
209
211
  @c.db.sqls.must_equal ["SELECT * FROM items WHERE (id = 4) LIMIT 1"]
210
212
 
211
213
  m = @c2[:id => 3]
212
- @cache[m.cache_key].must_equal nil
214
+ @cache[m.cache_key].must_be_nil
213
215
  @c.db.sqls.must_equal ["SELECT * FROM items WHERE (id = 3) LIMIT 1"]
214
216
  m = @c2[1]
215
217
  @cache[m.cache_key].must_equal m
@@ -232,13 +234,14 @@ describe Sequel::Model, "caching" do
232
234
 
233
235
  it "should rescue an exception if cache_store is memcached and ignore_exception is enabled" do
234
236
  @c4[1].values.must_equal(:name => 'sharon', :id => 1)
237
+ @c4.dataset = @c4.dataset.with_fetch(:name => 'sharon', :id => 1, :x=>1)
235
238
  m = @c4.new.save
236
239
  m.update({:name=>'blah'})
237
240
  m.values.must_equal(:name => 'blah', :id => 1, :x => 1)
238
241
  end
239
242
 
240
243
  it "should support Model.cache_get_pk for getting a value from the cache by primary key" do
241
- @c.cache_get_pk(1).must_equal nil
244
+ @c.cache_get_pk(1).must_be_nil
242
245
  m = @c[1]
243
246
  @c.cache_get_pk(1).must_equal m
244
247
  end
@@ -246,8 +249,8 @@ describe Sequel::Model, "caching" do
246
249
  it "should support Model.cache_delete_pk for removing a value from the cache by primary key" do
247
250
  @c[1]
248
251
  @c.cache_get_pk(1).wont_equal nil
249
- @c.cache_delete_pk(1).must_equal nil
250
- @c.cache_get_pk(1).must_equal nil
252
+ @c.cache_delete_pk(1).must_be_nil
253
+ @c.cache_get_pk(1).must_be_nil
251
254
  end
252
255
 
253
256
  it "should support overriding the cache key prefix" do
@@ -258,7 +261,7 @@ describe Sequel::Model, "caching" do
258
261
  c2.cache_key(:id).must_equal c3.cache_key(:id)
259
262
 
260
263
  @c[1]
261
- c2.cache_get_pk(1).must_equal nil
264
+ c2.cache_get_pk(1).must_be_nil
262
265
  m = c2[1]
263
266
  c2.cache_get_pk(1).values.must_equal @c[1].values
264
267
  c3.cache_get_pk(1).values.must_equal m.values
@@ -71,15 +71,15 @@ describe "class_table_inheritance plugin" do
71
71
  end
72
72
 
73
73
  it "should have simple_table = nil for all subclasses" do
74
- Manager.simple_table.must_equal nil
75
- Executive.simple_table.must_equal nil
76
- Ceo.simple_table.must_equal nil
77
- Staff.simple_table.must_equal nil
74
+ Manager.simple_table.must_be_nil
75
+ Executive.simple_table.must_be_nil
76
+ Ceo.simple_table.must_be_nil
77
+ Staff.simple_table.must_be_nil
78
78
  end
79
79
 
80
80
  it "should have working row_proc if using set_dataset in subclass to remove columns" do
81
81
  Manager.set_dataset(Manager.dataset.select(*(Manager.columns - [:blah])))
82
- Manager.dataset._fetch = {:id=>1, :kind=>'Ceo'}
82
+ Manager.dataset = Manager.dataset.with_fetch(:id=>1, :kind=>'Ceo')
83
83
  Manager[1].must_equal Ceo.load(:id=>1, :kind=>'Ceo')
84
84
  end
85
85
 
@@ -92,18 +92,16 @@ describe "class_table_inheritance plugin" do
92
92
  end
93
93
 
94
94
  it "should return rows with the correct class based on the polymorphic_key value" do
95
- @ds._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Staff'}]
96
- Employee.all.collect{|x| x.class}.must_equal [Employee, Manager, Executive, Ceo, Staff]
95
+ @ds.with_fetch([{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Staff'}]).all.collect{|x| x.class}.must_equal [Employee, Manager, Executive, Ceo, Staff]
97
96
  end
98
97
 
99
98
  it "should return rows with the correct class based on the polymorphic_key value for subclasses" do
100
- Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}]
101
- Manager.all.collect{|x| x.class}.must_equal [Manager, Executive, Ceo]
99
+ Manager.dataset.with_fetch([{:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}]).all.collect{|x| x.class}.must_equal [Manager, Executive, Ceo]
102
100
  end
103
101
 
104
102
  it "should have refresh return all columns in subclass after loading from superclass" do
105
- Employee.dataset._fetch = [{:id=>1, :name=>'A', :kind=>'Ceo'}]
106
- Ceo.instance_dataset._fetch = [{:id=>1, :name=>'A', :kind=>'Ceo', :num_staff=>3, :num_managers=>2}]
103
+ Employee.dataset = Employee.dataset.with_fetch([{:id=>1, :name=>'A', :kind=>'Ceo'}])
104
+ Ceo.dataset = Ceo.dataset.with_fetch([{:id=>1, :name=>'A', :kind=>'Ceo', :num_staff=>3, :num_managers=>2}])
107
105
  a = Employee.first
108
106
  a.class.must_equal Ceo
109
107
  a.values.must_equal(:id=>1, :name=>'A', :kind=>'Ceo')
@@ -114,8 +112,7 @@ describe "class_table_inheritance plugin" do
114
112
 
115
113
  it "should return rows with the current class if cti_key is nil" do
116
114
  Employee.plugin(:class_table_inheritance)
117
- Employee.dataset._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Staff'}]
118
- Employee.all.collect{|x| x.class}.must_equal [Employee, Employee, Employee, Employee, Employee]
115
+ Employee.dataset.with_fetch([{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Staff'}]).all.map{|x| x.class}.must_equal [Employee, Employee, Employee, Employee, Employee]
119
116
  end
120
117
 
121
118
  it "should return rows with the current class if cti_key is nil in subclasses" do
@@ -124,8 +121,7 @@ describe "class_table_inheritance plugin" do
124
121
  Object.send(:remove_const, :Manager)
125
122
  class ::Manager < Employee; end
126
123
  class ::Executive < Manager; end
127
- Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}]
128
- Manager.all.collect{|x| x.class}.must_equal [Manager, Manager]
124
+ Manager.dataset.with_fetch([{:kind=>'Manager'}, {:kind=>'Executive'}]).all.map{|x| x.class}.must_equal [Manager, Manager]
129
125
  end
130
126
 
131
127
  it "should handle a model map with integer values" do
@@ -136,20 +132,18 @@ describe "class_table_inheritance plugin" do
136
132
  class ::Manager < Employee; end
137
133
  class ::Executive < Manager; end
138
134
  class ::Ceo < Executive; end
139
- Employee.dataset._fetch = [{:kind=>nil},{:kind=>0},{:kind=>1}, {:kind=>2}, {:kind=>3}]
135
+ Employee.dataset = Employee.dataset.with_fetch([{:kind=>nil},{:kind=>0},{:kind=>1}, {:kind=>2}, {:kind=>3}])
140
136
  Employee.all.collect{|x| x.class}.must_equal [Employee, Employee, Manager, Executive, Ceo]
141
- Manager.dataset._fetch = [{:kind=>nil},{:kind=>0},{:kind=>1}, {:kind=>2}, {:kind=>3}]
137
+ Manager.dataset = Manager.dataset.with_fetch([{:kind=>nil},{:kind=>0},{:kind=>1}, {:kind=>2}, {:kind=>3}])
142
138
  Manager.all.collect{|x| x.class}.must_equal [Manager, Employee, Manager, Executive, Ceo]
143
139
  end
144
140
 
145
141
  it "should fallback to the main class if the given class does not exist" do
146
- @ds._fetch = [{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Blah'}, {:kind=>'Staff'}]
147
- Employee.all.collect{|x| x.class}.must_equal [Employee, Manager, Employee, Staff]
142
+ @ds.with_fetch([{:kind=>'Employee'}, {:kind=>'Manager'}, {:kind=>'Blah'}, {:kind=>'Staff'}]).all.map{|x| x.class}.must_equal [Employee, Manager, Employee, Staff]
148
143
  end
149
144
 
150
145
  it "should fallback to the main class if the given class does not exist in subclasses" do
151
- Manager.dataset._fetch = [{:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Blah'}]
152
- Manager.all.collect{|x| x.class}.must_equal [Manager, Executive, Ceo, Manager]
146
+ Manager.dataset.with_fetch([{:kind=>'Manager'}, {:kind=>'Executive'}, {:kind=>'Ceo'}, {:kind=>'Blah'}]).all.map{|x| x.class}.must_equal [Manager, Executive, Ceo, Manager]
153
147
  end
154
148
 
155
149
  it "should sets the model class name for the key when creating new parent class records" do
@@ -194,7 +188,7 @@ describe "class_table_inheritance plugin" do
194
188
  end
195
189
 
196
190
  it "should lazily load attributes for columns in subclass tables" do
197
- Manager.instance_dataset._fetch = Manager.dataset._fetch = {:id=>1, :name=>'J', :kind=>'Ceo', :num_staff=>2}
191
+ Manager.dataset = Manager.dataset.with_fetch(:id=>1, :name=>'J', :kind=>'Ceo', :num_staff=>2)
198
192
  m = Manager[1]
199
193
  @db.sqls.must_equal ['SELECT employees.id, employees.name, employees.kind, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id = 1) LIMIT 1']
200
194
  @db.fetch = {:num_managers=>3}
@@ -205,8 +199,8 @@ describe "class_table_inheritance plugin" do
205
199
  end
206
200
 
207
201
  it "should lazily load columns in middle classes correctly when loaded from parent class" do
208
- Employee.dataset._fetch = {:id=>1, :kind=>'Ceo'}
209
- Manager.dataset._fetch = {:num_staff=>2}
202
+ Employee.dataset = Employee.dataset.with_fetch(:id=>1, :kind=>'Ceo')
203
+ @db.fetch = [[:num_staff=>2]]
210
204
  e = Employee[1]
211
205
  e.must_be_kind_of(Ceo)
212
206
  @db.sqls.must_equal ["SELECT * FROM employees WHERE (id = 1) LIMIT 1"]
@@ -215,9 +209,8 @@ describe "class_table_inheritance plugin" do
215
209
  end
216
210
 
217
211
  it "should eagerly load lazily columns in subclasses when loaded from parent class" do
218
- Employee.dataset._fetch = {:id=>1, :kind=>'Ceo'}
219
- Manager.dataset._fetch = {:id=>1, :num_staff=>2}
220
- @db.fetch = {:id=>1, :num_managers=>3}
212
+ Employee.dataset = Employee.dataset.with_fetch(:id=>1, :kind=>'Ceo')
213
+ @db.fetch = [[{:id=>1, :num_staff=>2}], [{:id=>1, :num_managers=>3}]]
221
214
  e = Employee.all.first
222
215
  e.must_be_kind_of(Ceo)
223
216
  @db.sqls.must_equal ["SELECT * FROM employees"]
@@ -267,13 +260,15 @@ describe "class_table_inheritance plugin" do
267
260
  sqls[2].must_match(/INSERT INTO executives \((num_managers|id), (num_managers|id)\) VALUES \([13], [13]\)/)
268
261
  end
269
262
 
270
- it "should insert the correct rows into all tables when inserting when insert select is important" do
271
- [Ceo, Manager, Employee].each do |klass|
272
- def (klass.cti_instance_dataset).supports_insert_select?; true; end
273
- def (klass.cti_instance_dataset).insert_select(v)
274
- db.run(insert_sql(v) + " RETURNING *")
275
- v.merge(:id=>1)
276
- end
263
+ it "should insert the correct rows into all tables when inserting when insert_select is supported" do
264
+ [Executive, Manager, Employee].each do |klass|
265
+ klass.instance_variable_set(:@cti_instance_dataset, klass.cti_instance_dataset.with_extend do
266
+ def supports_insert_select?; true; end
267
+ def insert_select(v)
268
+ db.run(insert_sql(v) + " RETURNING *")
269
+ v.merge(:id=>1)
270
+ end
271
+ end)
277
272
  end
278
273
  Ceo.create(:num_managers=>3, :num_staff=>2, :name=>'E')
279
274
  sqls = @db.sqls
@@ -300,13 +295,13 @@ describe "class_table_inheritance plugin" do
300
295
  end
301
296
 
302
297
  it "should handle many_to_one relationships correctly" do
303
- Manager.dataset._fetch = {:id=>3, :name=>'E', :kind=>'Ceo', :num_managers=>3}
298
+ Manager.dataset = Manager.dataset.with_fetch(:id=>3, :name=>'E', :kind=>'Ceo', :num_managers=>3)
304
299
  Staff.load(:manager_id=>3).manager.must_equal Ceo.load(:id=>3, :name=>'E', :kind=>'Ceo', :num_managers=>3)
305
300
  @db.sqls.must_equal ['SELECT employees.id, employees.name, employees.kind, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id = 3) LIMIT 1']
306
301
  end
307
302
 
308
303
  it "should handle one_to_many relationships correctly" do
309
- Staff.dataset._fetch = {:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3}
304
+ Staff.dataset = Staff.dataset.with_fetch(:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3)
310
305
  Ceo.load(:id=>3).staff_members.must_equal [Staff.load(:id=>1, :name=>'S', :kind=>'Staff', :manager_id=>3)]
311
306
  @db.sqls.must_equal ['SELECT employees.id, employees.name, employees.kind, staff.manager_id FROM employees INNER JOIN staff ON (staff.id = employees.id) WHERE (staff.manager_id = 3)']
312
307
  end
@@ -361,14 +356,14 @@ describe "class_table_inheritance plugin without sti_key" do
361
356
  end
362
357
 
363
358
  it "should have simple_table = nil for all subclasses" do
364
- Manager.simple_table.must_equal nil
365
- Executive.simple_table.must_equal nil
366
- Staff.simple_table.must_equal nil
359
+ Manager.simple_table.must_be_nil
360
+ Executive.simple_table.must_be_nil
361
+ Staff.simple_table.must_be_nil
367
362
  end
368
363
 
369
364
  it "should have working row_proc if using set_dataset in subclass to remove columns" do
370
365
  Manager.set_dataset(Manager.dataset.select(*(Manager.columns - [:blah])))
371
- Manager.dataset._fetch = {:id=>1}
366
+ Manager.dataset = Manager.dataset.with_fetch(:id=>1)
372
367
  Manager[1].must_equal Manager.load(:id=>1)
373
368
  end
374
369
 
@@ -381,7 +376,7 @@ describe "class_table_inheritance plugin without sti_key" do
381
376
 
382
377
  it "should return rows with the current class if cti_key is nil" do
383
378
  Employee.plugin(:class_table_inheritance)
384
- Employee.dataset._fetch = [{}]
379
+ Employee.dataset = Employee.dataset.with_fetch([{}])
385
380
  Employee.first.class.must_equal Employee
386
381
  end
387
382
 
@@ -442,13 +437,13 @@ describe "class_table_inheritance plugin without sti_key" do
442
437
  end
443
438
 
444
439
  it "should handle many_to_one relationships correctly" do
445
- Manager.dataset._fetch = {:id=>3, :name=>'E', :num_staff=>3}
440
+ Manager.dataset = Manager.dataset.with_fetch(:id=>3, :name=>'E', :num_staff=>3)
446
441
  Staff.load(:manager_id=>3).manager.must_equal Manager.load(:id=>3, :name=>'E', :num_staff=>3)
447
442
  @db.sqls.must_equal ['SELECT employees.id, employees.name, managers.num_staff FROM employees INNER JOIN managers ON (managers.id = employees.id) WHERE (managers.id = 3) LIMIT 1']
448
443
  end
449
444
 
450
445
  it "should handle one_to_many relationships correctly" do
451
- Staff.dataset._fetch = {:id=>1, :name=>'S', :manager_id=>3}
446
+ Staff.dataset = Staff.dataset.with_fetch(:id=>1, :name=>'S', :manager_id=>3)
452
447
  Executive.load(:id=>3).staff_members.must_equal [Staff.load(:id=>1, :name=>'S', :manager_id=>3)]
453
448
  @db.sqls.must_equal ['SELECT employees.id, employees.name, staff.manager_id FROM employees INNER JOIN staff ON (staff.id = employees.id) WHERE (staff.manager_id = 3)']
454
449
  end
@@ -50,9 +50,7 @@ describe "column_conflicts plugin" do
50
50
  end
51
51
 
52
52
  it "should work correctly for dataset changes" do
53
- ds = @db[:test]
54
- def ds.columns; [:object_id] end
55
- @c.dataset = ds
53
+ @c.dataset = @db[:test].with_extend{def columns; [:object_id] end}
56
54
  o = @c.load(:object_id=>3)
57
55
  o.get_column_value(:object_id).must_equal 3
58
56
  o.object_id.wont_equal 3
@@ -10,7 +10,7 @@ describe "columns_introspection extension" do
10
10
  end
11
11
 
12
12
  it "should not issue a database query if the columns are already loaded" do
13
- @ds.instance_variable_set(:@columns, [:x])
13
+ @ds.send(:columns=, [:x])
14
14
  @ds.columns.must_equal [:x]
15
15
  @db.sqls.length.must_equal 0
16
16
  end
@@ -74,8 +74,7 @@ describe "columns_introspection extension" do
74
74
 
75
75
  it "should issue a database query when common table expressions are used" do
76
76
  @db.instance_variable_set(:@schemas, "a"=>[[:x, {}]])
77
- def @ds.supports_cte?(*) true end
78
- @ds.with(:a, @ds).columns
77
+ @ds.with_extend{def supports_cte?(*) true end}.with(:a, @ds).columns
79
78
  @db.sqls.length.must_equal 1
80
79
  end
81
80