sequel 4.22.0 → 4.23.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (214) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +22 -0
  3. data/README.rdoc +6 -0
  4. data/Rakefile +59 -81
  5. data/doc/migration.rdoc +2 -0
  6. data/doc/release_notes/4.23.0.txt +65 -0
  7. data/doc/sharding.rdoc +16 -14
  8. data/doc/testing.rdoc +61 -77
  9. data/lib/sequel/adapters/jdbc.rb +1 -0
  10. data/lib/sequel/adapters/mock.rb +0 -1
  11. data/lib/sequel/adapters/postgres.rb +1 -0
  12. data/lib/sequel/adapters/postgresql.rb +1 -0
  13. data/lib/sequel/adapters/shared/postgres.rb +3 -3
  14. data/lib/sequel/connection_pool/sharded_threaded.rb +5 -0
  15. data/lib/sequel/connection_pool/threaded.rb +9 -1
  16. data/lib/sequel/database/connecting.rb +1 -1
  17. data/lib/sequel/database/transactions.rb +2 -1
  18. data/lib/sequel/dataset/prepared_statements.rb +1 -1
  19. data/lib/sequel/extensions/constraint_validations.rb +12 -12
  20. data/lib/sequel/extensions/date_arithmetic.rb +0 -4
  21. data/lib/sequel/extensions/pagination.rb +14 -2
  22. data/lib/sequel/extensions/pg_enum.rb +2 -2
  23. data/lib/sequel/extensions/pg_hstore.rb +1 -1
  24. data/lib/sequel/extensions/pg_json_ops.rb +2 -2
  25. data/lib/sequel/plugins/csv_serializer.rb +2 -0
  26. data/lib/sequel/plugins/delay_add_association.rb +50 -0
  27. data/lib/sequel/plugins/list.rb +2 -2
  28. data/lib/sequel/plugins/nested_attributes.rb +8 -28
  29. data/lib/sequel/plugins/update_refresh.rb +50 -0
  30. data/lib/sequel/plugins/validate_associated.rb +55 -0
  31. data/lib/sequel/version.rb +1 -1
  32. data/spec/adapters/db2_spec.rb +29 -29
  33. data/spec/adapters/firebird_spec.rb +97 -103
  34. data/spec/adapters/informix_spec.rb +25 -25
  35. data/spec/adapters/mssql_spec.rb +156 -172
  36. data/spec/adapters/mysql_spec.rb +334 -359
  37. data/spec/adapters/oracle_spec.rb +67 -69
  38. data/spec/adapters/postgres_spec.rb +1298 -1249
  39. data/spec/adapters/spec_helper.rb +2 -35
  40. data/spec/adapters/sqlanywhere_spec.rb +39 -39
  41. data/spec/adapters/sqlite_spec.rb +203 -200
  42. data/spec/bin_spec.rb +57 -59
  43. data/spec/core/connection_pool_spec.rb +402 -401
  44. data/spec/core/database_spec.rb +953 -944
  45. data/spec/core/dataset_spec.rb +2178 -2168
  46. data/spec/core/deprecated_spec.rb +19 -19
  47. data/spec/core/expression_filters_spec.rb +415 -415
  48. data/spec/core/mock_adapter_spec.rb +212 -212
  49. data/spec/core/object_graph_spec.rb +73 -73
  50. data/spec/core/placeholder_literalizer_spec.rb +71 -71
  51. data/spec/core/schema_generator_spec.rb +44 -44
  52. data/spec/core/schema_spec.rb +470 -472
  53. data/spec/core/spec_helper.rb +5 -20
  54. data/spec/core/version_spec.rb +2 -2
  55. data/spec/core_extensions_spec.rb +320 -320
  56. data/spec/extensions/accessed_columns_spec.rb +12 -12
  57. data/spec/extensions/active_model_spec.rb +3 -3
  58. data/spec/extensions/after_initialize_spec.rb +2 -2
  59. data/spec/extensions/arbitrary_servers_spec.rb +23 -23
  60. data/spec/extensions/association_dependencies_spec.rb +34 -34
  61. data/spec/extensions/association_pks_spec.rb +98 -98
  62. data/spec/extensions/association_proxies_spec.rb +33 -33
  63. data/spec/extensions/auto_validations_spec.rb +46 -46
  64. data/spec/extensions/blacklist_security_spec.rb +19 -18
  65. data/spec/extensions/blank_spec.rb +36 -36
  66. data/spec/extensions/boolean_readers_spec.rb +36 -36
  67. data/spec/extensions/caching_spec.rb +82 -82
  68. data/spec/extensions/class_table_inheritance_spec.rb +72 -72
  69. data/spec/extensions/column_conflicts_spec.rb +19 -14
  70. data/spec/extensions/column_select_spec.rb +19 -19
  71. data/spec/extensions/columns_introspection_spec.rb +43 -43
  72. data/spec/extensions/composition_spec.rb +64 -64
  73. data/spec/extensions/connection_validator_spec.rb +92 -90
  74. data/spec/extensions/constraint_validations_plugin_spec.rb +92 -92
  75. data/spec/extensions/constraint_validations_spec.rb +80 -80
  76. data/spec/extensions/core_refinements_spec.rb +220 -220
  77. data/spec/extensions/csv_serializer_spec.rb +44 -44
  78. data/spec/extensions/current_datetime_timestamp_spec.rb +8 -8
  79. data/spec/extensions/dataset_associations_spec.rb +65 -65
  80. data/spec/extensions/dataset_source_alias_spec.rb +16 -16
  81. data/spec/extensions/date_arithmetic_spec.rb +51 -58
  82. data/spec/extensions/defaults_setter_spec.rb +19 -19
  83. data/spec/extensions/delay_add_association_spec.rb +52 -0
  84. data/spec/extensions/dirty_spec.rb +51 -51
  85. data/spec/extensions/eager_each_spec.rb +8 -8
  86. data/spec/extensions/empty_array_ignore_nulls_spec.rb +10 -10
  87. data/spec/extensions/error_splitter_spec.rb +2 -2
  88. data/spec/extensions/error_sql_spec.rb +4 -4
  89. data/spec/extensions/eval_inspect_spec.rb +3 -3
  90. data/spec/extensions/filter_having_spec.rb +8 -8
  91. data/spec/extensions/force_encoding_spec.rb +30 -30
  92. data/spec/extensions/from_block_spec.rb +7 -7
  93. data/spec/extensions/graph_each_spec.rb +19 -19
  94. data/spec/extensions/hash_aliases_spec.rb +5 -5
  95. data/spec/extensions/hook_class_methods_spec.rb +100 -100
  96. data/spec/extensions/inflector_spec.rb +54 -54
  97. data/spec/extensions/input_transformer_spec.rb +10 -10
  98. data/spec/extensions/insert_returning_select_spec.rb +8 -8
  99. data/spec/extensions/instance_filters_spec.rb +26 -26
  100. data/spec/extensions/instance_hooks_spec.rb +85 -85
  101. data/spec/extensions/json_serializer_spec.rb +68 -68
  102. data/spec/extensions/lazy_attributes_spec.rb +49 -49
  103. data/spec/extensions/list_spec.rb +77 -75
  104. data/spec/extensions/looser_typecasting_spec.rb +16 -16
  105. data/spec/extensions/many_through_many_spec.rb +627 -627
  106. data/spec/extensions/meta_def_spec.rb +7 -7
  107. data/spec/extensions/migration_spec.rb +217 -217
  108. data/spec/extensions/modification_detection_spec.rb +20 -20
  109. data/spec/extensions/mssql_optimistic_locking_spec.rb +21 -21
  110. data/spec/extensions/named_timezones_spec.rb +18 -18
  111. data/spec/extensions/nested_attributes_spec.rb +107 -107
  112. data/spec/extensions/null_dataset_spec.rb +24 -24
  113. data/spec/extensions/optimistic_locking_spec.rb +21 -21
  114. data/spec/extensions/pagination_spec.rb +52 -52
  115. data/spec/extensions/pg_array_associations_spec.rb +273 -273
  116. data/spec/extensions/pg_array_ops_spec.rb +52 -52
  117. data/spec/extensions/pg_array_spec.rb +152 -152
  118. data/spec/extensions/pg_enum_spec.rb +13 -13
  119. data/spec/extensions/pg_hstore_ops_spec.rb +63 -63
  120. data/spec/extensions/pg_hstore_spec.rb +84 -84
  121. data/spec/extensions/pg_inet_spec.rb +15 -15
  122. data/spec/extensions/pg_interval_spec.rb +29 -29
  123. data/spec/extensions/pg_json_ops_spec.rb +86 -84
  124. data/spec/extensions/pg_json_spec.rb +104 -104
  125. data/spec/extensions/pg_loose_count_spec.rb +6 -6
  126. data/spec/extensions/pg_range_ops_spec.rb +24 -24
  127. data/spec/extensions/pg_range_spec.rb +143 -143
  128. data/spec/extensions/pg_row_ops_spec.rb +14 -14
  129. data/spec/extensions/pg_row_plugin_spec.rb +12 -12
  130. data/spec/extensions/pg_row_spec.rb +118 -118
  131. data/spec/extensions/pg_static_cache_updater_spec.rb +28 -28
  132. data/spec/extensions/pg_typecast_on_load_spec.rb +21 -21
  133. data/spec/extensions/prepared_statements_associations_spec.rb +42 -42
  134. data/spec/extensions/prepared_statements_safe_spec.rb +18 -18
  135. data/spec/extensions/prepared_statements_spec.rb +28 -28
  136. data/spec/extensions/prepared_statements_with_pk_spec.rb +11 -11
  137. data/spec/extensions/pretty_table_spec.rb +16 -16
  138. data/spec/extensions/query_literals_spec.rb +37 -37
  139. data/spec/extensions/query_spec.rb +32 -32
  140. data/spec/extensions/rcte_tree_spec.rb +141 -141
  141. data/spec/extensions/round_timestamps_spec.rb +21 -21
  142. data/spec/extensions/schema_caching_spec.rb +8 -8
  143. data/spec/extensions/schema_dumper_spec.rb +78 -78
  144. data/spec/extensions/schema_spec.rb +31 -27
  145. data/spec/extensions/scissors_spec.rb +3 -3
  146. data/spec/extensions/select_remove_spec.rb +14 -14
  147. data/spec/extensions/sequel_3_dataset_methods_spec.rb +28 -28
  148. data/spec/extensions/serialization_modification_detection_spec.rb +33 -33
  149. data/spec/extensions/serialization_spec.rb +79 -78
  150. data/spec/extensions/server_block_spec.rb +17 -17
  151. data/spec/extensions/set_overrides_spec.rb +30 -30
  152. data/spec/extensions/sharding_spec.rb +65 -65
  153. data/spec/extensions/shared_caching_spec.rb +29 -29
  154. data/spec/extensions/single_table_inheritance_spec.rb +79 -79
  155. data/spec/extensions/skip_create_refresh_spec.rb +3 -3
  156. data/spec/extensions/spec_helper.rb +4 -29
  157. data/spec/extensions/split_array_nil_spec.rb +9 -9
  158. data/spec/extensions/split_values_spec.rb +7 -7
  159. data/spec/extensions/sql_expr_spec.rb +32 -32
  160. data/spec/extensions/static_cache_spec.rb +123 -123
  161. data/spec/extensions/string_date_time_spec.rb +34 -34
  162. data/spec/extensions/string_stripper_spec.rb +15 -15
  163. data/spec/extensions/subclasses_spec.rb +31 -31
  164. data/spec/extensions/table_select_spec.rb +15 -15
  165. data/spec/extensions/tactical_eager_loading_spec.rb +23 -23
  166. data/spec/extensions/thread_local_timezones_spec.rb +13 -13
  167. data/spec/extensions/timestamps_spec.rb +40 -40
  168. data/spec/extensions/to_dot_spec.rb +34 -34
  169. data/spec/extensions/touch_spec.rb +52 -52
  170. data/spec/extensions/tree_spec.rb +72 -72
  171. data/spec/extensions/typecast_on_load_spec.rb +25 -25
  172. data/spec/extensions/unlimited_update_spec.rb +2 -2
  173. data/spec/extensions/update_or_create_spec.rb +36 -36
  174. data/spec/extensions/update_primary_key_spec.rb +35 -35
  175. data/spec/extensions/update_refresh_spec.rb +41 -0
  176. data/spec/extensions/validate_associated_spec.rb +52 -0
  177. data/spec/extensions/validation_class_methods_spec.rb +314 -317
  178. data/spec/extensions/validation_helpers_spec.rb +195 -195
  179. data/spec/extensions/xml_serializer_spec.rb +48 -48
  180. data/spec/guards_helper.rb +55 -0
  181. data/spec/integration/associations_test.rb +1089 -1088
  182. data/spec/integration/database_test.rb +29 -29
  183. data/spec/integration/dataset_test.rb +661 -661
  184. data/spec/integration/eager_loader_test.rb +147 -147
  185. data/spec/integration/migrator_test.rb +122 -122
  186. data/spec/integration/model_test.rb +70 -70
  187. data/spec/integration/plugin_test.rb +682 -640
  188. data/spec/integration/prepared_statement_test.rb +172 -172
  189. data/spec/integration/schema_test.rb +245 -245
  190. data/spec/integration/spec_helper.rb +1 -64
  191. data/spec/integration/timezone_test.rb +17 -17
  192. data/spec/integration/transaction_test.rb +87 -87
  193. data/spec/integration/type_test.rb +33 -33
  194. data/spec/model/association_reflection_spec.rb +130 -121
  195. data/spec/model/associations_spec.rb +1112 -1113
  196. data/spec/model/base_spec.rb +197 -196
  197. data/spec/model/class_dataset_methods_spec.rb +118 -118
  198. data/spec/model/dataset_methods_spec.rb +49 -49
  199. data/spec/model/eager_loading_spec.rb +705 -702
  200. data/spec/model/hooks_spec.rb +169 -168
  201. data/spec/model/inflector_spec.rb +5 -5
  202. data/spec/model/model_spec.rb +287 -297
  203. data/spec/model/plugins_spec.rb +47 -47
  204. data/spec/model/record_spec.rb +534 -535
  205. data/spec/model/spec_helper.rb +3 -21
  206. data/spec/model/validations_spec.rb +72 -70
  207. data/spec/spec_config.rb +8 -0
  208. metadata +41 -9
  209. data/lib/sequel/adapters/fdbsql.rb +0 -286
  210. data/lib/sequel/adapters/jdbc/fdbsql.rb +0 -66
  211. data/lib/sequel/adapters/openbase.rb +0 -54
  212. data/lib/sequel/adapters/shared/fdbsql.rb +0 -550
  213. data/spec/adapters/fdbsql_spec.rb +0 -429
  214. data/spec/rspec_helper.rb +0 -22
@@ -0,0 +1,55 @@
1
+ module Sequel
2
+ module Plugins
3
+ # The validates_associated plugin allows you to validate associated
4
+ # objects. It also offers the ability to delay the validation of
5
+ # associated objects until the current object is validated.
6
+ # If the associated object is invalid, validation error messages
7
+ # from the associated object will be added to the current object's
8
+ # validation errors.
9
+ #
10
+ # Usage:
11
+ #
12
+ # # Make all model subclass support validating associated objects
13
+ # Sequel::Model.plugin :validate_associated
14
+ #
15
+ # # Make the Album class support validating associated objects
16
+ # Album.plugin :validate_associated
17
+ module ValidateAssociated
18
+ # Depend on the instance_hooks plugin.
19
+ def self.apply(mod)
20
+ mod.plugin :instance_hooks
21
+ end
22
+
23
+ module InstanceMethods
24
+ private
25
+
26
+ # Delay validating the associated object until validating the current object.
27
+ def delay_validate_associated_object(reflection, obj)
28
+ after_validation_hook{validate_associated_object(reflection, obj)}
29
+ end
30
+
31
+ # Validate the given associated object, adding any validation error messages from the
32
+ # given object to the parent object.
33
+ def validate_associated_object(reflection, obj)
34
+ return if reflection[:validate] == false
35
+ association = reflection[:name]
36
+ if (reflection[:type] == :one_to_many || reflection[:type] == :one_to_one) && (key = reflection[:key]).is_a?(Symbol) && !(pk_val = obj.values[key])
37
+ # There could be a presence validation on the foreign key in the associated model,
38
+ # which will fail if we validate before saving the current object. If there is
39
+ # no value for the foreign key, set it to the current primary key value, or a dummy
40
+ # value of 0 if we haven't saved the current object.
41
+ p_key = pk unless pk.is_a?(Array)
42
+ obj.values[key] = p_key || 0
43
+ key = nil if p_key
44
+ end
45
+ obj.errors.full_messages.each{|m| errors.add(association, m)} unless obj.valid?
46
+ if key && !pk_val
47
+ # If we used a dummy value of 0, remove it so it doesn't accidently remain.
48
+ obj.values.delete(key)
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+
@@ -3,7 +3,7 @@ module Sequel
3
3
  MAJOR = 4
4
4
  # The minor version of Sequel. Bumped for every non-patch level
5
5
  # release, generally around once a month.
6
- MINOR = 22
6
+ MINOR = 23
7
7
  # The tiny version of Sequel. Usually 0, only bumped for bugfix
8
8
  # releases that fix regressions from previous versions.
9
9
  TINY = 0
@@ -17,14 +17,14 @@ describe Sequel::Database do
17
17
  @db.drop_table(:test)
18
18
  end
19
19
 
20
- specify "should provide disconnect functionality after preparing a connection" do
20
+ it "should provide disconnect functionality after preparing a connection" do
21
21
  @ds.prepare(:first, :a).call
22
22
  @db.disconnect
23
- @db.pool.size.should == 0
23
+ @db.pool.size.must_equal 0
24
24
  end
25
25
 
26
- specify "should return version correctly" do
27
- @db.db2_version.should match(/DB2 v/i)
26
+ it "should return version correctly" do
27
+ @db.db2_version.must_match(/DB2 v/i)
28
28
  end
29
29
  end
30
30
 
@@ -47,15 +47,15 @@ describe "Simple Dataset operations" do
47
47
  DB.drop_table(:items)
48
48
  end
49
49
 
50
- specify "should insert with a primary key specified" do
50
+ it "should insert with a primary key specified" do
51
51
  @ds.insert(:id => 1, :number => 10)
52
52
  @ds.insert(:id => 100, :number => 20)
53
- @ds.select_hash(:id, :number).should == {1 => 10, 100 => 20}
53
+ @ds.select_hash(:id, :number).must_equal(1 => 10, 100 => 20)
54
54
  end
55
55
 
56
- specify "should insert into binary columns" do
56
+ it "should insert into binary columns" do
57
57
  @ds.insert(:id => 1, :bin_string => Sequel.blob("\1"), :bin_clob => Sequel.blob("\2"))
58
- @ds.select(:bin_string, :bin_clob).first.should == {:bin_string => "\1", :bin_clob => "\2"}
58
+ @ds.select(:bin_string, :bin_clob).first.must_equal(:bin_string => "\1", :bin_clob => "\2")
59
59
  end
60
60
  end
61
61
 
@@ -66,13 +66,13 @@ describe Sequel::Database do
66
66
  after do
67
67
  @db.drop_table(:items)
68
68
  end
69
- specify "should parse primary keys from the schema properly" do
69
+ it "should parse primary keys from the schema properly" do
70
70
  @db.create_table!(:items){Integer :number}
71
- @db.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.should == []
71
+ @db.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal []
72
72
  @db.create_table!(:items){primary_key :number}
73
- @db.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.should == [:number]
73
+ @db.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal [:number]
74
74
  @db.create_table!(:items){Integer :number1, :null => false; Integer :number2, :null => false; primary_key [:number1, :number2]}
75
- @db.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.should == [:number1, :number2]
75
+ @db.schema(:items).collect{|k,v| k if v[:primary_key]}.compact.must_equal [:number1, :number2]
76
76
  end
77
77
  end
78
78
 
@@ -87,42 +87,42 @@ describe "Sequel::IBMDB.convert_smallint_to_bool" do
87
87
  @db.drop_table(:booltest)
88
88
  end
89
89
 
90
- specify "should consider smallint datatypes as boolean if set, but not larger smallints" do
91
- @db.schema(:booltest, :reload=>true).first.last[:type].should == :boolean
92
- @db.schema(:booltest, :reload=>true).first.last[:db_type].should match /smallint/i
90
+ it "should consider smallint datatypes as boolean if set, but not larger smallints" do
91
+ @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :boolean
92
+ @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
93
93
  Sequel::IBMDB.convert_smallint_to_bool = false
94
- @db.schema(:booltest, :reload=>true).first.last[:type].should == :integer
95
- @db.schema(:booltest, :reload=>true).first.last[:db_type].should match /smallint/i
94
+ @db.schema(:booltest, :reload=>true).first.last[:type].must_equal :integer
95
+ @db.schema(:booltest, :reload=>true).first.last[:db_type].must_match /smallint/i
96
96
  end
97
97
 
98
- specify "should return smallints as bools and integers as integers when set" do
98
+ it "should return smallints as bools and integers as integers when set" do
99
99
  Sequel::IBMDB.convert_smallint_to_bool = true
100
100
  @ds.delete
101
101
  @ds << {:b=>true, :i=>10}
102
- @ds.all.should == [{:b=>true, :i=>10}]
102
+ @ds.all.must_equal [{:b=>true, :i=>10}]
103
103
  @ds.delete
104
104
  @ds << {:b=>false, :i=>0}
105
- @ds.all.should == [{:b=>false, :i=>0}]
105
+ @ds.all.must_equal [{:b=>false, :i=>0}]
106
106
  @ds.delete
107
107
  @ds << {:b=>true, :i=>1}
108
- @ds.all.should == [{:b=>true, :i=>1}]
108
+ @ds.all.must_equal [{:b=>true, :i=>1}]
109
109
  end
110
110
 
111
- specify "should return all smallints as integers when unset" do
111
+ it "should return all smallints as integers when unset" do
112
112
  Sequel::IBMDB.convert_smallint_to_bool = false
113
113
  @ds.delete
114
114
  @ds << {:b=>true, :i=>10}
115
- @ds.all.should == [{:b=>1, :i=>10}]
115
+ @ds.all.must_equal [{:b=>1, :i=>10}]
116
116
  @ds.delete
117
117
  @ds << {:b=>false, :i=>0}
118
- @ds.all.should == [{:b=>0, :i=>0}]
118
+ @ds.all.must_equal [{:b=>0, :i=>0}]
119
119
 
120
120
  @ds.delete
121
121
  @ds << {:b=>1, :i=>10}
122
- @ds.all.should == [{:b=>1, :i=>10}]
122
+ @ds.all.must_equal [{:b=>1, :i=>10}]
123
123
  @ds.delete
124
124
  @ds << {:b=>0, :i=>0}
125
- @ds.all.should == [{:b=>0, :i=>0}]
125
+ @ds.all.must_equal [{:b=>0, :i=>0}]
126
126
  end
127
127
  end if DB.adapter_scheme == :ibmdb
128
128
 
@@ -138,11 +138,11 @@ describe "Simple Dataset operations in transactions" do
138
138
  DB.drop_table(:items_insert_in_transaction)
139
139
  end
140
140
 
141
- specify "should insert correctly with a primary key specified inside a transaction" do
141
+ it "should insert correctly with a primary key specified inside a transaction" do
142
142
  DB.transaction do
143
143
  @ds.insert(:id=>100, :number=>20)
144
- @ds.count.should == 1
145
- @ds.order(:id).all.should == [{:id=>100, :number=>20}]
144
+ @ds.count.must_equal 1
145
+ @ds.order(:id).all.must_equal [{:id=>100, :number=>20}]
146
146
  end
147
147
  end
148
148
  end
@@ -44,15 +44,15 @@ describe "A Firebird database" do
44
44
  @db = DB
45
45
  end
46
46
 
47
- specify "should provide disconnect functionality" do
47
+ it "should provide disconnect functionality" do
48
48
  @db.tables
49
- @db.pool.size.should == 1
49
+ @db.pool.size.must_equal 1
50
50
  @db.disconnect
51
- @db.pool.size.should == 0
51
+ @db.pool.size.must_equal 0
52
52
  end
53
53
 
54
- specify "should raise Sequel::Error on error" do
55
- proc{@db << "SELECT 1 + 'a'"}.should raise_error(Sequel::Error)
54
+ it "should raise Sequel::Error on error" do
55
+ proc{@db << "SELECT 1 + 'a'"}.must_raise(Sequel::Error)
56
56
  end
57
57
  end
58
58
 
@@ -63,28 +63,28 @@ describe "A Firebird dataset" do
63
63
  @d.quote_identifiers = true
64
64
  end
65
65
 
66
- specify "should return the correct record count" do
67
- @d.count.should == 0
66
+ it "should return the correct record count" do
67
+ @d.count.must_equal 0
68
68
  @d << {:name => 'abc', :val => 123}
69
69
  @d << {:name => 'abc', :val => 456}
70
70
  @d << {:name => 'def', :val => 789}
71
- @d.count.should == 3
71
+ @d.count.must_equal 3
72
72
  end
73
73
 
74
- specify "should return the correct records" do
75
- @d.to_a.should == []
74
+ it "should return the correct records" do
75
+ @d.to_a.must_equal []
76
76
  @d << {:name => 'abc', :val => 123}
77
77
  @d << {:name => 'abc', :val => 456}
78
78
  @d << {:name => 'def', :val => 789}
79
79
 
80
- @d.order(:val).to_a.should == [
80
+ @d.order(:val).to_a.must_equal [
81
81
  {:name => 'abc', :val => 123},
82
82
  {:name => 'abc', :val => 456},
83
83
  {:name => 'def', :val => 789}
84
84
  ]
85
85
  end
86
86
 
87
- specify "should update records correctly" do
87
+ it "should update records correctly" do
88
88
  @d << {:name => 'abc', :val => 123}
89
89
  @d << {:name => 'abc', :val => 456}
90
90
  @d << {:name => 'def', :val => 789}
@@ -92,111 +92,111 @@ describe "A Firebird dataset" do
92
92
 
93
93
  # the third record should stay the same
94
94
  # floating-point precision bullshit
95
- @d[:name => 'def'][:val].should == 789
96
- @d.filter(:val => 530).count.should == 2
95
+ @d[:name => 'def'][:val].must_equal 789
96
+ @d.filter(:val => 530).count.must_equal 2
97
97
  end
98
98
 
99
- specify "should delete records correctly" do
99
+ it "should delete records correctly" do
100
100
  @d << {:name => 'abc', :val => 123}
101
101
  @d << {:name => 'abc', :val => 456}
102
102
  @d << {:name => 'def', :val => 789}
103
103
  @d.filter(:name => 'abc').delete
104
104
 
105
- @d.count.should == 1
106
- @d.first[:name].should == 'def'
105
+ @d.count.must_equal 1
106
+ @d.first[:name].must_equal 'def'
107
107
  end
108
108
 
109
- specify "should be able to literalize booleans" do
110
- proc {@d.literal(true)}.should_not raise_error
111
- proc {@d.literal(false)}.should_not raise_error
109
+ it "should be able to literalize booleans" do
110
+ @d.literal(true)
111
+ @d.literal(false)
112
112
  end
113
113
 
114
- specify "should quote columns and tables using double quotes if quoting identifiers" do
114
+ it "should quote columns and tables using double quotes if quoting identifiers" do
115
115
  @d.quote_identifiers = true
116
- @d.select(:name).sql.should == \
116
+ @d.select(:name).sql.must_equal \
117
117
  'SELECT "NAME" FROM "TEST"'
118
118
 
119
- @d.select('COUNT(*)'.lit).sql.should == \
119
+ @d.select('COUNT(*)'.lit).sql.must_equal \
120
120
  'SELECT COUNT(*) FROM "TEST"'
121
121
 
122
- @d.select(:max[:val]).sql.should == \
122
+ @d.select(:max[:val]).sql.must_equal \
123
123
  'SELECT max("VAL") FROM "TEST"'
124
124
 
125
- @d.select(:now[]).sql.should == \
125
+ @d.select(:now[]).sql.must_equal \
126
126
  'SELECT now() FROM "TEST"'
127
127
 
128
- @d.select(:max[:items__val]).sql.should == \
128
+ @d.select(:max[:items__val]).sql.must_equal \
129
129
  'SELECT max("ITEMS"."VAL") FROM "TEST"'
130
130
 
131
- @d.order(:name.desc).sql.should == \
131
+ @d.order(:name.desc).sql.must_equal \
132
132
  'SELECT * FROM "TEST" ORDER BY "NAME" DESC'
133
133
 
134
- @d.select('TEST.NAME AS item_:name'.lit).sql.should == \
134
+ @d.select('TEST.NAME AS item_:name'.lit).sql.must_equal \
135
135
  'SELECT TEST.NAME AS item_:name FROM "TEST"'
136
136
 
137
- @d.select('"NAME"'.lit).sql.should == \
137
+ @d.select('"NAME"'.lit).sql.must_equal \
138
138
  'SELECT "NAME" FROM "TEST"'
139
139
 
140
- @d.select('max(TEST."NAME") AS "max_:name"'.lit).sql.should == \
140
+ @d.select('max(TEST."NAME") AS "max_:name"'.lit).sql.must_equal \
141
141
  'SELECT max(TEST."NAME") AS "max_:name" FROM "TEST"'
142
142
 
143
- @d.select(:test[:ABC, 'hello']).sql.should == \
143
+ @d.select(:test[:ABC, 'hello']).sql.must_equal \
144
144
  "SELECT test(\"ABC\", 'hello') FROM \"TEST\""
145
145
 
146
- @d.select(:test[:ABC__DEF, 'hello']).sql.should == \
146
+ @d.select(:test[:ABC__DEF, 'hello']).sql.must_equal \
147
147
  "SELECT test(\"ABC\".\"DEF\", 'hello') FROM \"TEST\""
148
148
 
149
- @d.select(:test[:ABC__DEF, 'hello'].as(:X2)).sql.should == \
149
+ @d.select(:test[:ABC__DEF, 'hello'].as(:X2)).sql.must_equal \
150
150
  "SELECT test(\"ABC\".\"DEF\", 'hello') AS \"X2\" FROM \"TEST\""
151
151
 
152
- @d.insert_sql(:val => 333).should =~ \
152
+ @d.insert_sql(:val => 333).must_match \
153
153
  /\AINSERT INTO "TEST" \("VAL"\) VALUES \(333\)( RETURNING NULL)?\z/
154
154
 
155
- @d.insert_sql(:X => :Y).should =~ \
155
+ @d.insert_sql(:X => :Y).must_match \
156
156
  /\AINSERT INTO "TEST" \("X"\) VALUES \("Y"\)( RETURNING NULL)?\z/
157
157
  end
158
158
 
159
- specify "should quote fields correctly when reversing the order if quoting identifiers" do
159
+ it "should quote fields correctly when reversing the order if quoting identifiers" do
160
160
  @d.quote_identifiers = true
161
- @d.reverse_order(:name).sql.should == \
161
+ @d.reverse_order(:name).sql.must_equal \
162
162
  'SELECT * FROM "TEST" ORDER BY "NAME" DESC'
163
163
 
164
- @d.reverse_order(:name.desc).sql.should == \
164
+ @d.reverse_order(:name.desc).sql.must_equal \
165
165
  'SELECT * FROM "TEST" ORDER BY "NAME" ASC'
166
166
 
167
- @d.reverse_order(:name, :test.desc).sql.should == \
167
+ @d.reverse_order(:name, :test.desc).sql.must_equal \
168
168
  'SELECT * FROM "TEST" ORDER BY "NAME" DESC, "TEST" ASC'
169
169
 
170
- @d.reverse_order(:name.desc, :test).sql.should == \
170
+ @d.reverse_order(:name.desc, :test).sql.must_equal \
171
171
  'SELECT * FROM "TEST" ORDER BY "NAME" ASC, "TEST" DESC'
172
172
  end
173
173
 
174
- specify "should support transactions" do
174
+ it "should support transactions" do
175
175
  DB.transaction do
176
176
  @d << {:name => 'abc', :val => 1}
177
177
  end
178
178
 
179
- @d.count.should == 1
179
+ @d.count.must_equal 1
180
180
  end
181
181
 
182
- specify "should have #transaction yield the connection" do
182
+ it "should have #transaction yield the connection" do
183
183
  DB.transaction do |conn|
184
- conn.should_not == nil
184
+ conn.wont_equal nil
185
185
  end
186
186
  end
187
187
 
188
- specify "should correctly rollback transactions" do
188
+ it "should correctly rollback transactions" do
189
189
  proc do
190
190
  DB.transaction do
191
191
  @d << {:name => 'abc', :val => 1}
192
192
  raise RuntimeError, 'asdf'
193
193
  end
194
- end.should raise_error(RuntimeError)
194
+ end.must_raise(RuntimeError)
195
195
 
196
- @d.count.should == 0
196
+ @d.count.must_equal 0
197
197
  end
198
198
 
199
- specify "should handle returning inside of the block by committing" do
199
+ it "should handle returning inside of the block by committing" do
200
200
  def DB.ret_commit
201
201
  transaction do
202
202
  self[:test] << {:name => 'abc'}
@@ -204,24 +204,24 @@ describe "A Firebird dataset" do
204
204
  self[:test] << {:name => 'd'}
205
205
  end
206
206
  end
207
- @d.count.should == 0
207
+ @d.count.must_equal 0
208
208
  DB.ret_commit
209
- @d.count.should == 1
209
+ @d.count.must_equal 1
210
210
  DB.ret_commit
211
- @d.count.should == 2
211
+ @d.count.must_equal 2
212
212
  proc do
213
213
  DB.transaction do
214
214
  raise RuntimeError, 'asdf'
215
215
  end
216
- end.should raise_error(RuntimeError)
216
+ end.must_raise(RuntimeError)
217
217
 
218
- @d.count.should == 2
218
+ @d.count.must_equal 2
219
219
  end
220
220
 
221
- specify "should quote and upcase reserved keywords" do
221
+ it "should quote and upcase reserved keywords" do
222
222
  @d = DB[:testing]
223
223
  @d.quote_identifiers = true
224
- @d.select(:select).sql.should == \
224
+ @d.select(:select).sql.must_equal \
225
225
  'SELECT "SELECT" FROM "TESTING"'
226
226
  end
227
227
  end
@@ -232,11 +232,11 @@ describe "A Firebird dataset with a timestamp field" do
232
232
  @d.delete
233
233
  end
234
234
 
235
- specify "should store milliseconds in time fields" do
235
+ it "should store milliseconds in time fields" do
236
236
  t = Time.now
237
237
  @d << {:val=>1, :time_stamp=>t}
238
- @d.literal(@d[:val =>'1'][:time_stamp]).should == @d.literal(t)
239
- @d[:val=>'1'][:time_stamp].usec.should == t.usec - t.usec % 100
238
+ @d.literal(@d[:val =>'1'][:time_stamp]).must_equal @d.literal(t)
239
+ @d[:val=>'1'][:time_stamp].usec.must_equal t.usec - t.usec % 100
240
240
  end
241
241
  end
242
242
 
@@ -247,10 +247,10 @@ describe "A Firebird database" do
247
247
  @db.sqls.clear
248
248
  end
249
249
 
250
- specify "should allow us to name the sequences" do
250
+ it "should allow us to name the sequences" do
251
251
  @db.create_table(:posts){primary_key :id, :sequence_name => "seq_test"}
252
252
  check_sqls do
253
- @db.sqls.should == [
253
+ @db.sqls.must_equal [
254
254
  "DROP SEQUENCE SEQ_TEST",
255
255
  "CREATE TABLE POSTS (ID integer PRIMARY KEY )",
256
256
  "CREATE SEQUENCE SEQ_TEST",
@@ -259,10 +259,10 @@ describe "A Firebird database" do
259
259
  end
260
260
  end
261
261
 
262
- specify "should allow us to set the starting position for the sequences" do
262
+ it "should allow us to set the starting position for the sequences" do
263
263
  @db.create_table(:posts){primary_key :id, :sequence_start_position => 999}
264
264
  check_sqls do
265
- @db.sqls.should == [
265
+ @db.sqls.must_equal [
266
266
  "DROP SEQUENCE SEQ_POSTS_ID",
267
267
  "CREATE TABLE POSTS (ID integer PRIMARY KEY )",
268
268
  "CREATE SEQUENCE SEQ_POSTS_ID",
@@ -272,10 +272,10 @@ describe "A Firebird database" do
272
272
  end
273
273
  end
274
274
 
275
- specify "should allow us to name and set the starting position for the sequences" do
275
+ it "should allow us to name and set the starting position for the sequences" do
276
276
  @db.create_table(:posts){primary_key :id, :sequence_name => "seq_test", :sequence_start_position => 999}
277
277
  check_sqls do
278
- @db.sqls.should == [
278
+ @db.sqls.must_equal [
279
279
  "DROP SEQUENCE SEQ_TEST",
280
280
  "CREATE TABLE POSTS (ID integer PRIMARY KEY )",
281
281
  "CREATE SEQUENCE SEQ_TEST",
@@ -285,10 +285,10 @@ describe "A Firebird database" do
285
285
  end
286
286
  end
287
287
 
288
- specify "should allow us to name the triggers" do
288
+ it "should allow us to name the triggers" do
289
289
  @db.create_table(:posts){primary_key :id, :trigger_name => "trig_test"}
290
290
  check_sqls do
291
- @db.sqls.should == [
291
+ @db.sqls.must_equal [
292
292
  "DROP SEQUENCE SEQ_POSTS_ID",
293
293
  "CREATE TABLE POSTS (ID integer PRIMARY KEY )",
294
294
  "CREATE SEQUENCE SEQ_POSTS_ID",
@@ -297,20 +297,20 @@ describe "A Firebird database" do
297
297
  end
298
298
  end
299
299
 
300
- specify "should allow us to not create the sequence" do
300
+ it "should allow us to not create the sequence" do
301
301
  @db.create_table(:posts){primary_key :id, :create_sequence => false}
302
302
  check_sqls do
303
- @db.sqls.should == [
303
+ @db.sqls.must_equal [
304
304
  "CREATE TABLE POSTS (ID integer PRIMARY KEY )",
305
305
  " CREATE TRIGGER BI_POSTS_ID for POSTS\n ACTIVE BEFORE INSERT position 0\n as begin\n if ((new.ID is null) or (new.ID = 0)) then\n begin\n new.ID = next value for seq_posts_id;\n end\n end\n\n"
306
306
  ]
307
307
  end
308
308
  end
309
309
 
310
- specify "should allow us to not create the trigger" do
310
+ it "should allow us to not create the trigger" do
311
311
  @db.create_table(:posts){primary_key :id, :create_trigger => false}
312
312
  check_sqls do
313
- @db.sqls.should == [
313
+ @db.sqls.must_equal [
314
314
  "DROP SEQUENCE SEQ_POSTS_ID",
315
315
  "CREATE TABLE POSTS (ID integer PRIMARY KEY )",
316
316
  "CREATE SEQUENCE SEQ_POSTS_ID",
@@ -318,48 +318,48 @@ describe "A Firebird database" do
318
318
  end
319
319
  end
320
320
 
321
- specify "should allow us to not create either the sequence nor the trigger" do
321
+ it "should allow us to not create either the sequence nor the trigger" do
322
322
  @db.create_table(:posts){primary_key :id, :create_sequence => false, :create_trigger => false}
323
323
  check_sqls do
324
- @db.sqls.should == [
324
+ @db.sqls.must_equal [
325
325
  "CREATE TABLE POSTS (ID integer PRIMARY KEY )"
326
326
  ]
327
327
  end
328
328
  end
329
329
 
330
- specify "should support column operations" do
330
+ it "should support column operations" do
331
331
  @db.create_table!(:test2){varchar :name, :size => 50; integer :val}
332
332
  @db[:test2] << {}
333
- @db[:test2].columns.should == [:name, :val]
333
+ @db[:test2].columns.must_equal [:name, :val]
334
334
 
335
335
  @db.add_column :test2, :xyz, :varchar, :size => 50
336
- @db[:test2].columns.should == [:name, :val, :xyz]
336
+ @db[:test2].columns.must_equal [:name, :val, :xyz]
337
337
 
338
- @db[:test2].columns.should == [:name, :val, :xyz]
338
+ @db[:test2].columns.must_equal [:name, :val, :xyz]
339
339
  @db.drop_column :test2, :xyz
340
340
 
341
- @db[:test2].columns.should == [:name, :val]
341
+ @db[:test2].columns.must_equal [:name, :val]
342
342
 
343
343
  @db[:test2].delete
344
344
  @db.add_column :test2, :xyz, :varchar, :default => '000', :size => 50#, :create_domain => 'xyz_varchar'
345
345
  @db[:test2] << {:name => 'mmm', :val => 111, :xyz => 'qqqq'}
346
346
 
347
- @db[:test2].columns.should == [:name, :val, :xyz]
347
+ @db[:test2].columns.must_equal [:name, :val, :xyz]
348
348
  @db.rename_column :test2, :xyz, :zyx
349
- @db[:test2].columns.should == [:name, :val, :zyx]
350
- @db[:test2].first[:zyx].should == 'qqqq'
349
+ @db[:test2].columns.must_equal [:name, :val, :zyx]
350
+ @db[:test2].first[:zyx].must_equal 'qqqq'
351
351
 
352
352
  @db.add_column :test2, :xyz, :decimal, :elements => [12, 2]
353
353
  @db[:test2].delete
354
354
  @db[:test2] << {:name => 'mmm', :val => 111, :xyz => 56.4}
355
355
  @db.set_column_type :test2, :xyz, :varchar, :size => 50
356
356
 
357
- @db[:test2].first[:xyz].should == "56.40"
357
+ @db[:test2].first[:xyz].must_equal "56.40"
358
358
  end
359
359
 
360
- specify "should allow us to retrieve the primary key for a table" do
360
+ it "should allow us to retrieve the primary key for a table" do
361
361
  @db.create_table!(:test2){primary_key :id}
362
- @db.primary_key(:test2).should == ["id"]
362
+ @db.primary_key(:test2).must_equal ["id"]
363
363
  end
364
364
  end
365
365
 
@@ -369,31 +369,25 @@ describe "Postgres::Dataset#insert" do
369
369
  @ds.delete
370
370
  end
371
371
 
372
- specify "should using call insert_returning_sql" do
373
- # @ds.should_receive(:single_value).once.with(:sql=>'INSERT INTO TEST5 (VAL) VALUES (10) RETURNING XID', :server=> :default)
374
- @ds.should_receive(:single_value).once
375
- @ds.insert(:val=>10)
372
+ it "should have insert_returning_sql use the RETURNING keyword" do
373
+ @ds.insert_returning_sql(:XID, :val=>10).must_equal "INSERT INTO TEST5 (VAL) VALUES (10) RETURNING XID"
374
+ @ds.insert_returning_sql('*'.lit, :val=>10).must_equal "INSERT INTO TEST5 (VAL) VALUES (10) RETURNING *"
375
+ @ds.insert_returning_sql('NULL'.lit, :val=>10).must_equal "INSERT INTO TEST5 (VAL) VALUES (10) RETURNING NULL"
376
376
  end
377
377
 
378
- specify "should have insert_returning_sql use the RETURNING keyword" do
379
- @ds.insert_returning_sql(:XID, :val=>10).should == "INSERT INTO TEST5 (VAL) VALUES (10) RETURNING XID"
380
- @ds.insert_returning_sql('*'.lit, :val=>10).should == "INSERT INTO TEST5 (VAL) VALUES (10) RETURNING *"
381
- @ds.insert_returning_sql('NULL'.lit, :val=>10).should == "INSERT INTO TEST5 (VAL) VALUES (10) RETURNING NULL"
382
- end
383
-
384
- specify "should correctly return the inserted record's primary key value" do
378
+ it "should correctly return the inserted record's primary key value" do
385
379
  value1 = 10
386
380
  id1 = @ds.insert(:val=>value1)
387
- @ds.first(:XID=>id1)[:val].should == value1
381
+ @ds.first(:XID=>id1)[:val].must_equal value1
388
382
  value2 = 20
389
383
  id2 = @ds.insert(:val=>value2)
390
- @ds.first(:XID=>id2)[:val].should == value2
384
+ @ds.first(:XID=>id2)[:val].must_equal value2
391
385
  end
392
386
 
393
- specify "should return nil if the table has no primary key" do
387
+ it "should return nil if the table has no primary key" do
394
388
  ds = DB[:test]
395
389
  ds.delete
396
- ds.insert(:name=>'a').should == nil
390
+ ds.insert(:name=>'a').must_equal nil
397
391
  end
398
392
  end
399
393
 
@@ -403,15 +397,15 @@ describe "Postgres::Dataset#insert" do
403
397
  @ds.delete
404
398
  end
405
399
 
406
- specify "should insert and retrieve a blob successfully" do
400
+ it "should insert and retrieve a blob successfully" do
407
401
  value1 = "\1\2\2\2\2222\2\2\2"
408
402
  value2 = "abcd"
409
403
  value3 = "efgh"
410
404
  value4 = "ijkl"
411
405
  id1 = @ds.insert(:val=>value1, :val2=>value2, :val3=>value3, :val4=>value4)
412
- @ds.first(:XID=>id1)[:val].should == value1
413
- @ds.first(:XID=>id1)[:val2].should == value2
414
- @ds.first(:XID=>id1)[:val3].should == value3
415
- @ds.first(:XID=>id1)[:val4].should == value4
406
+ @ds.first(:XID=>id1)[:val].must_equal value1
407
+ @ds.first(:XID=>id1)[:val2].must_equal value2
408
+ @ds.first(:XID=>id1)[:val3].must_equal value3
409
+ @ds.first(:XID=>id1)[:val4].must_equal value4
416
410
  end
417
411
  end