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