sequel 3.21.0 → 3.36.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 (311) hide show
  1. data/CHANGELOG +855 -3
  2. data/MIT-LICENSE +1 -1
  3. data/README.rdoc +23 -7
  4. data/Rakefile +42 -24
  5. data/bin/sequel +26 -8
  6. data/doc/active_record.rdoc +1 -0
  7. data/doc/advanced_associations.rdoc +171 -11
  8. data/doc/association_basics.rdoc +293 -43
  9. data/doc/dataset_basics.rdoc +5 -5
  10. data/doc/dataset_filtering.rdoc +8 -0
  11. data/doc/mass_assignment.rdoc +56 -0
  12. data/doc/migration.rdoc +85 -552
  13. data/doc/model_hooks.rdoc +78 -27
  14. data/doc/object_model.rdoc +541 -0
  15. data/doc/opening_databases.rdoc +97 -50
  16. data/doc/prepared_statements.rdoc +40 -14
  17. data/doc/querying.rdoc +28 -4
  18. data/doc/reflection.rdoc +30 -4
  19. data/doc/release_notes/3.22.0.txt +39 -0
  20. data/doc/release_notes/3.23.0.txt +172 -0
  21. data/doc/release_notes/3.24.0.txt +420 -0
  22. data/doc/release_notes/3.25.0.txt +88 -0
  23. data/doc/release_notes/3.26.0.txt +88 -0
  24. data/doc/release_notes/3.27.0.txt +82 -0
  25. data/doc/release_notes/3.28.0.txt +304 -0
  26. data/doc/release_notes/3.29.0.txt +459 -0
  27. data/doc/release_notes/3.30.0.txt +135 -0
  28. data/doc/release_notes/3.31.0.txt +146 -0
  29. data/doc/release_notes/3.32.0.txt +202 -0
  30. data/doc/release_notes/3.33.0.txt +157 -0
  31. data/doc/release_notes/3.34.0.txt +671 -0
  32. data/doc/release_notes/3.35.0.txt +144 -0
  33. data/doc/release_notes/3.36.0.txt +245 -0
  34. data/doc/schema_modification.rdoc +572 -0
  35. data/doc/sharding.rdoc +95 -3
  36. data/doc/testing.rdoc +129 -0
  37. data/doc/thread_safety.rdoc +17 -0
  38. data/doc/transactions.rdoc +137 -0
  39. data/doc/virtual_rows.rdoc +51 -2
  40. data/lib/sequel/adapters/ado/mssql.rb +18 -6
  41. data/lib/sequel/adapters/ado.rb +40 -18
  42. data/lib/sequel/adapters/amalgalite.rb +17 -9
  43. data/lib/sequel/adapters/db2.rb +175 -86
  44. data/lib/sequel/adapters/dbi.rb +15 -15
  45. data/lib/sequel/adapters/do/mysql.rb +17 -11
  46. data/lib/sequel/adapters/do/postgres.rb +1 -57
  47. data/lib/sequel/adapters/do/sqlite.rb +0 -10
  48. data/lib/sequel/adapters/do.rb +18 -36
  49. data/lib/sequel/adapters/firebird.rb +27 -208
  50. data/lib/sequel/adapters/ibmdb.rb +453 -0
  51. data/lib/sequel/adapters/informix.rb +6 -23
  52. data/lib/sequel/adapters/jdbc/as400.rb +16 -34
  53. data/lib/sequel/adapters/jdbc/db2.rb +47 -0
  54. data/lib/sequel/adapters/jdbc/derby.rb +287 -0
  55. data/lib/sequel/adapters/jdbc/firebird.rb +24 -0
  56. data/lib/sequel/adapters/jdbc/h2.rb +73 -31
  57. data/lib/sequel/adapters/jdbc/hsqldb.rb +184 -0
  58. data/lib/sequel/adapters/jdbc/informix.rb +21 -0
  59. data/lib/sequel/adapters/jdbc/jtds.rb +29 -0
  60. data/lib/sequel/adapters/jdbc/mssql.rb +3 -33
  61. data/lib/sequel/adapters/jdbc/mysql.rb +7 -24
  62. data/lib/sequel/adapters/jdbc/oracle.rb +88 -25
  63. data/lib/sequel/adapters/jdbc/postgresql.rb +58 -48
  64. data/lib/sequel/adapters/jdbc/progress.rb +21 -0
  65. data/lib/sequel/adapters/jdbc/sqlite.rb +20 -10
  66. data/lib/sequel/adapters/jdbc/sqlserver.rb +66 -0
  67. data/lib/sequel/adapters/jdbc/transactions.rb +83 -0
  68. data/lib/sequel/adapters/jdbc.rb +265 -94
  69. data/lib/sequel/adapters/mock.rb +361 -0
  70. data/lib/sequel/adapters/mysql.rb +118 -222
  71. data/lib/sequel/adapters/mysql2.rb +58 -57
  72. data/lib/sequel/adapters/odbc/mssql.rb +15 -7
  73. data/lib/sequel/adapters/odbc.rb +28 -9
  74. data/lib/sequel/adapters/openbase.rb +3 -5
  75. data/lib/sequel/adapters/oracle.rb +349 -53
  76. data/lib/sequel/adapters/postgres.rb +356 -107
  77. data/lib/sequel/adapters/shared/access.rb +32 -9
  78. data/lib/sequel/adapters/shared/db2.rb +342 -0
  79. data/lib/sequel/adapters/shared/firebird.rb +221 -0
  80. data/lib/sequel/adapters/shared/informix.rb +53 -0
  81. data/lib/sequel/adapters/shared/mssql.rb +335 -118
  82. data/lib/sequel/adapters/shared/mysql.rb +340 -76
  83. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +155 -0
  84. data/lib/sequel/adapters/shared/oracle.rb +243 -45
  85. data/lib/sequel/adapters/shared/postgres.rb +524 -279
  86. data/lib/sequel/adapters/shared/progress.rb +5 -8
  87. data/lib/sequel/adapters/shared/sqlite.rb +265 -89
  88. data/lib/sequel/adapters/sqlite.rb +101 -39
  89. data/lib/sequel/adapters/swift/mysql.rb +9 -12
  90. data/lib/sequel/adapters/swift/postgres.rb +9 -74
  91. data/lib/sequel/adapters/swift/sqlite.rb +8 -6
  92. data/lib/sequel/adapters/swift.rb +8 -7
  93. data/lib/sequel/adapters/tinytds.rb +161 -21
  94. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +66 -0
  95. data/lib/sequel/adapters/utils/stored_procedures.rb +1 -11
  96. data/lib/sequel/ast_transformer.rb +194 -0
  97. data/lib/sequel/connection_pool/sharded_single.rb +11 -1
  98. data/lib/sequel/connection_pool/sharded_threaded.rb +28 -2
  99. data/lib/sequel/connection_pool/single.rb +5 -0
  100. data/lib/sequel/connection_pool/threaded.rb +38 -14
  101. data/lib/sequel/connection_pool.rb +10 -2
  102. data/lib/sequel/core.rb +118 -11
  103. data/lib/sequel/database/connecting.rb +38 -28
  104. data/lib/sequel/database/dataset.rb +4 -4
  105. data/lib/sequel/database/dataset_defaults.rb +63 -2
  106. data/lib/sequel/database/logging.rb +7 -2
  107. data/lib/sequel/database/misc.rb +150 -46
  108. data/lib/sequel/database/query.rb +215 -65
  109. data/lib/sequel/database/schema_generator.rb +64 -20
  110. data/lib/sequel/database/schema_methods.rb +212 -54
  111. data/lib/sequel/dataset/actions.rb +322 -85
  112. data/lib/sequel/dataset/features.rb +96 -8
  113. data/lib/sequel/dataset/graph.rb +38 -11
  114. data/lib/sequel/dataset/misc.rb +50 -23
  115. data/lib/sequel/dataset/mutation.rb +12 -7
  116. data/lib/sequel/dataset/prepared_statements.rb +68 -30
  117. data/lib/sequel/dataset/query.rb +237 -44
  118. data/lib/sequel/dataset/sql.rb +698 -278
  119. data/lib/sequel/dataset.rb +8 -0
  120. data/lib/sequel/exceptions.rb +4 -0
  121. data/lib/sequel/extensions/_pretty_table.rb +79 -0
  122. data/lib/sequel/extensions/arbitrary_servers.rb +108 -0
  123. data/lib/sequel/extensions/columns_introspection.rb +61 -0
  124. data/lib/sequel/{core_sql.rb → extensions/core_extensions.rb} +16 -34
  125. data/lib/sequel/extensions/migration.rb +97 -11
  126. data/lib/sequel/extensions/named_timezones.rb +5 -0
  127. data/lib/sequel/extensions/null_dataset.rb +90 -0
  128. data/lib/sequel/extensions/pg_array.rb +460 -0
  129. data/lib/sequel/extensions/pg_array_ops.rb +220 -0
  130. data/lib/sequel/extensions/pg_auto_parameterize.rb +169 -0
  131. data/lib/sequel/extensions/pg_hstore.rb +296 -0
  132. data/lib/sequel/extensions/pg_hstore_ops.rb +259 -0
  133. data/lib/sequel/extensions/pg_inet.rb +89 -0
  134. data/lib/sequel/extensions/pg_json.rb +178 -0
  135. data/lib/sequel/extensions/pg_statement_cache.rb +316 -0
  136. data/lib/sequel/extensions/pretty_table.rb +5 -71
  137. data/lib/sequel/extensions/query.rb +1 -1
  138. data/lib/sequel/extensions/query_literals.rb +79 -0
  139. data/lib/sequel/extensions/schema_caching.rb +76 -0
  140. data/lib/sequel/extensions/schema_dumper.rb +251 -37
  141. data/lib/sequel/extensions/select_remove.rb +35 -0
  142. data/lib/sequel/extensions/server_block.rb +139 -0
  143. data/lib/sequel/extensions/sql_expr.rb +4 -110
  144. data/lib/sequel/extensions/thread_local_timezones.rb +1 -1
  145. data/lib/sequel/extensions/to_dot.rb +95 -83
  146. data/lib/sequel/model/associations.rb +1187 -393
  147. data/lib/sequel/model/base.rb +578 -170
  148. data/lib/sequel/model/errors.rb +1 -1
  149. data/lib/sequel/model/exceptions.rb +5 -1
  150. data/lib/sequel/model/inflections.rb +1 -1
  151. data/lib/sequel/model.rb +30 -11
  152. data/lib/sequel/no_core_ext.rb +2 -0
  153. data/lib/sequel/plugins/active_model.rb +13 -1
  154. data/lib/sequel/plugins/association_pks.rb +22 -4
  155. data/lib/sequel/plugins/caching.rb +25 -18
  156. data/lib/sequel/plugins/class_table_inheritance.rb +4 -4
  157. data/lib/sequel/plugins/composition.rb +44 -12
  158. data/lib/sequel/plugins/dataset_associations.rb +100 -0
  159. data/lib/sequel/plugins/defaults_setter.rb +58 -0
  160. data/lib/sequel/plugins/dirty.rb +214 -0
  161. data/lib/sequel/plugins/eager_each.rb +59 -0
  162. data/lib/sequel/plugins/force_encoding.rb +6 -6
  163. data/lib/sequel/plugins/hook_class_methods.rb +1 -1
  164. data/lib/sequel/plugins/identity_map.rb +123 -8
  165. data/lib/sequel/plugins/instance_filters.rb +10 -0
  166. data/lib/sequel/plugins/instance_hooks.rb +1 -1
  167. data/lib/sequel/plugins/json_serializer.rb +58 -6
  168. data/lib/sequel/plugins/list.rb +12 -2
  169. data/lib/sequel/plugins/many_through_many.rb +79 -28
  170. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +71 -0
  171. data/lib/sequel/plugins/nested_attributes.rb +139 -63
  172. data/lib/sequel/plugins/optimistic_locking.rb +8 -0
  173. data/lib/sequel/plugins/prepared_statements.rb +167 -0
  174. data/lib/sequel/plugins/prepared_statements_associations.rb +87 -0
  175. data/lib/sequel/plugins/prepared_statements_safe.rb +82 -0
  176. data/lib/sequel/plugins/prepared_statements_with_pk.rb +59 -0
  177. data/lib/sequel/plugins/rcte_tree.rb +29 -15
  178. data/lib/sequel/plugins/schema.rb +7 -2
  179. data/lib/sequel/plugins/serialization.rb +98 -49
  180. data/lib/sequel/plugins/serialization_modification_detection.rb +63 -0
  181. data/lib/sequel/plugins/sharding.rb +21 -54
  182. data/lib/sequel/plugins/single_table_inheritance.rb +5 -3
  183. data/lib/sequel/plugins/static_cache.rb +99 -0
  184. data/lib/sequel/plugins/subclasses.rb +10 -2
  185. data/lib/sequel/plugins/tactical_eager_loading.rb +7 -7
  186. data/lib/sequel/plugins/timestamps.rb +1 -1
  187. data/lib/sequel/plugins/typecast_on_load.rb +9 -12
  188. data/lib/sequel/plugins/update_primary_key.rb +2 -2
  189. data/lib/sequel/plugins/validation_class_methods.rb +1 -1
  190. data/lib/sequel/plugins/xml_serializer.rb +15 -4
  191. data/lib/sequel/sql.rb +526 -59
  192. data/lib/sequel/timezones.rb +57 -38
  193. data/lib/sequel/version.rb +1 -1
  194. data/spec/adapters/db2_spec.rb +146 -0
  195. data/spec/adapters/firebird_spec.rb +1 -1
  196. data/spec/adapters/mssql_spec.rb +142 -40
  197. data/spec/adapters/mysql_spec.rb +380 -234
  198. data/spec/adapters/oracle_spec.rb +67 -77
  199. data/spec/adapters/postgres_spec.rb +1050 -212
  200. data/spec/adapters/spec_helper.rb +8 -5
  201. data/spec/adapters/sqlite_spec.rb +139 -27
  202. data/spec/core/connection_pool_spec.rb +196 -93
  203. data/spec/core/database_spec.rb +879 -510
  204. data/spec/core/dataset_spec.rb +1415 -1086
  205. data/spec/core/expression_filters_spec.rb +554 -109
  206. data/spec/core/mock_adapter_spec.rb +449 -0
  207. data/spec/core/object_graph_spec.rb +86 -114
  208. data/spec/core/schema_generator_spec.rb +4 -4
  209. data/spec/core/schema_spec.rb +482 -38
  210. data/spec/core/spec_helper.rb +6 -48
  211. data/spec/extensions/active_model_spec.rb +13 -0
  212. data/spec/extensions/arbitrary_servers_spec.rb +110 -0
  213. data/spec/extensions/association_autoreloading_spec.rb +18 -10
  214. data/spec/extensions/association_dependencies_spec.rb +15 -25
  215. data/spec/extensions/association_pks_spec.rb +66 -32
  216. data/spec/extensions/association_proxies_spec.rb +4 -4
  217. data/spec/extensions/caching_spec.rb +47 -51
  218. data/spec/extensions/class_table_inheritance_spec.rb +31 -83
  219. data/spec/extensions/columns_introspection_spec.rb +91 -0
  220. data/spec/extensions/composition_spec.rb +18 -13
  221. data/spec/{core/core_sql_spec.rb → extensions/core_extensions_spec.rb} +119 -139
  222. data/spec/extensions/dataset_associations_spec.rb +199 -0
  223. data/spec/extensions/defaults_setter_spec.rb +64 -0
  224. data/spec/extensions/dirty_spec.rb +155 -0
  225. data/spec/extensions/eager_each_spec.rb +34 -0
  226. data/spec/extensions/force_encoding_spec.rb +4 -2
  227. data/spec/extensions/hook_class_methods_spec.rb +69 -92
  228. data/spec/extensions/identity_map_spec.rb +131 -22
  229. data/spec/extensions/inflector_spec.rb +0 -4
  230. data/spec/extensions/instance_filters_spec.rb +11 -21
  231. data/spec/extensions/instance_hooks_spec.rb +72 -0
  232. data/spec/extensions/json_serializer_spec.rb +49 -6
  233. data/spec/extensions/lazy_attributes_spec.rb +16 -20
  234. data/spec/extensions/list_spec.rb +48 -39
  235. data/spec/extensions/many_through_many_spec.rb +283 -250
  236. data/spec/extensions/many_to_one_pk_lookup_spec.rb +140 -0
  237. data/spec/extensions/migration_spec.rb +140 -35
  238. data/spec/extensions/named_timezones_spec.rb +29 -11
  239. data/spec/extensions/nested_attributes_spec.rb +251 -89
  240. data/spec/extensions/null_dataset_spec.rb +85 -0
  241. data/spec/extensions/optimistic_locking_spec.rb +24 -21
  242. data/spec/extensions/pg_array_ops_spec.rb +105 -0
  243. data/spec/extensions/pg_array_spec.rb +196 -0
  244. data/spec/extensions/pg_auto_parameterize_spec.rb +65 -0
  245. data/spec/extensions/pg_hstore_ops_spec.rb +136 -0
  246. data/spec/extensions/pg_hstore_spec.rb +195 -0
  247. data/spec/extensions/pg_inet_spec.rb +44 -0
  248. data/spec/extensions/pg_json_spec.rb +101 -0
  249. data/spec/extensions/pg_statement_cache_spec.rb +209 -0
  250. data/spec/extensions/prepared_statements_associations_spec.rb +111 -0
  251. data/spec/extensions/prepared_statements_safe_spec.rb +61 -0
  252. data/spec/extensions/prepared_statements_spec.rb +87 -0
  253. data/spec/extensions/prepared_statements_with_pk_spec.rb +31 -0
  254. data/spec/extensions/pretty_table_spec.rb +7 -6
  255. data/spec/extensions/query_literals_spec.rb +168 -0
  256. data/spec/extensions/query_spec.rb +6 -0
  257. data/spec/extensions/rcte_tree_spec.rb +50 -43
  258. data/spec/extensions/schema_caching_spec.rb +41 -0
  259. data/spec/extensions/schema_dumper_spec.rb +429 -22
  260. data/spec/extensions/schema_spec.rb +25 -21
  261. data/spec/extensions/select_remove_spec.rb +38 -0
  262. data/spec/extensions/serialization_modification_detection_spec.rb +72 -0
  263. data/spec/extensions/serialization_spec.rb +85 -43
  264. data/spec/extensions/server_block_spec.rb +90 -0
  265. data/spec/extensions/sharding_spec.rb +69 -143
  266. data/spec/extensions/single_table_inheritance_spec.rb +23 -29
  267. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  268. data/spec/extensions/spec_helper.rb +22 -61
  269. data/spec/extensions/sql_expr_spec.rb +29 -60
  270. data/spec/extensions/static_cache_spec.rb +145 -0
  271. data/spec/extensions/tactical_eager_loading_spec.rb +17 -19
  272. data/spec/extensions/thread_local_timezones_spec.rb +22 -2
  273. data/spec/extensions/timestamps_spec.rb +6 -6
  274. data/spec/extensions/to_dot_spec.rb +4 -7
  275. data/spec/extensions/touch_spec.rb +13 -14
  276. data/spec/extensions/tree_spec.rb +11 -26
  277. data/spec/extensions/typecast_on_load_spec.rb +9 -6
  278. data/spec/extensions/update_primary_key_spec.rb +30 -24
  279. data/spec/extensions/validation_class_methods_spec.rb +30 -51
  280. data/spec/extensions/validation_helpers_spec.rb +16 -35
  281. data/spec/extensions/xml_serializer_spec.rb +29 -4
  282. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +4 -0
  283. data/spec/files/transaction_specified_migrations/002_create_basic.rb +4 -0
  284. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +3 -0
  285. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +3 -0
  286. data/spec/integration/associations_test.rb +659 -21
  287. data/spec/integration/database_test.rb +9 -3
  288. data/spec/integration/dataset_test.rb +605 -91
  289. data/spec/integration/eager_loader_test.rb +19 -21
  290. data/spec/integration/migrator_test.rb +2 -3
  291. data/spec/integration/model_test.rb +81 -2
  292. data/spec/integration/plugin_test.rb +454 -143
  293. data/spec/integration/prepared_statement_test.rb +263 -128
  294. data/spec/integration/schema_test.rb +309 -43
  295. data/spec/integration/spec_helper.rb +40 -30
  296. data/spec/integration/timezone_test.rb +38 -12
  297. data/spec/integration/transaction_test.rb +183 -8
  298. data/spec/integration/type_test.rb +18 -4
  299. data/spec/model/association_reflection_spec.rb +201 -7
  300. data/spec/model/associations_spec.rb +1067 -661
  301. data/spec/model/base_spec.rb +329 -95
  302. data/spec/model/dataset_methods_spec.rb +7 -27
  303. data/spec/model/eager_loading_spec.rb +677 -676
  304. data/spec/model/hooks_spec.rb +349 -67
  305. data/spec/model/model_spec.rb +240 -168
  306. data/spec/model/plugins_spec.rb +24 -13
  307. data/spec/model/record_spec.rb +490 -232
  308. data/spec/model/spec_helper.rb +14 -71
  309. data/spec/model/validations_spec.rb +11 -0
  310. data/spec/rcov.opts +2 -0
  311. metadata +178 -80
@@ -9,57 +9,63 @@ describe "Sequel::Plugins::UpdatePrimaryKey" do
9
9
  @c.unrestrict_primary_key
10
10
  @o = @c.new
11
11
  @ds = @c.dataset
12
- @ds.extend(Module.new do
13
- attr_accessor :a
14
- def fetch_rows(sql)
15
- yield(a.dup)
16
- end
17
-
18
- def update(h)
19
- if literal(opts[:where]) =~ /a = (\d)/ and $1.to_i == a[:a]
20
- a.update(h)
21
- end
22
- super
23
- end
24
- end)
25
- @ds.a = {:a=>1, :b=>3}
26
- @ds2 = @ds.naked
27
12
  MODEL_DB.reset
28
13
  end
29
14
 
30
15
  specify "should handle regular updates" do
16
+ @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>1, :b=>4}], [{:a=>1, :b=>4}], [{:a=>1, :b=>5}], [{:a=>1, :b=>5}], [{:a=>1, :b=>6}], [{:a=>1, :b=>6}]]
31
17
  @c.first.update(:b=>4)
32
- @ds2.all.should == [{:a=>1, :b=>4}]
18
+ @c.all.should == [@c.load(:a=>1, :b=>4)]
19
+ MODEL_DB.sqls.should == ["SELECT * FROM a LIMIT 1", "UPDATE a SET b = 4 WHERE (a = 1)", "SELECT * FROM a"]
33
20
  @c.first.set(:b=>5).save
34
- @ds2.all.should == [{:a=>1, :b=>5}]
21
+ @c.all.should == [@c.load(:a=>1, :b=>5)]
22
+ MODEL_DB.sqls.should == ["SELECT * FROM a LIMIT 1", "UPDATE a SET b = 5 WHERE (a = 1)", "SELECT * FROM a"]
35
23
  @c.first.set(:b=>6).save(:b)
36
- @ds2.all.should == [{:a=>1, :b=>6}]
24
+ @c.all.should == [@c.load(:a=>1, :b=>6)]
25
+ MODEL_DB.sqls.should == ["SELECT * FROM a LIMIT 1", "UPDATE a SET b = 6 WHERE (a = 1)", "SELECT * FROM a"]
37
26
  end
38
27
 
39
28
  specify "should handle updating the primary key field with another field" do
29
+ @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>4}]]
40
30
  @c.first.update(:a=>2, :b=>4)
41
- @ds2.all.should == [{:a=>2, :b=>4}]
31
+ @c.all.should == [@c.load(:a=>2, :b=>4)]
32
+ sqls = MODEL_DB.sqls
33
+ ["UPDATE a SET a = 2, b = 4 WHERE (a = 1)", "UPDATE a SET b = 4, a = 2 WHERE (a = 1)"].should include(sqls.slice!(1))
34
+ sqls.should == ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
42
35
  end
43
36
 
44
37
  specify "should handle updating just the primary key field when saving changes" do
38
+ @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>3}], [{:a=>2, :b=>3}], [{:a=>3, :b=>3}]]
45
39
  @c.first.update(:a=>2)
46
- @ds2.all.should == [{:a=>2, :b=>3}]
40
+ @c.all.should == [@c.load(:a=>2, :b=>3)]
41
+ MODEL_DB.sqls.should == ["SELECT * FROM a LIMIT 1", "UPDATE a SET a = 2 WHERE (a = 1)", "SELECT * FROM a"]
47
42
  @c.first.set(:a=>3).save(:a)
48
- @ds2.all.should == [{:a=>3, :b=>3}]
43
+ @c.all.should == [@c.load(:a=>3, :b=>3)]
44
+ MODEL_DB.sqls.should == ["SELECT * FROM a LIMIT 1", "UPDATE a SET a = 3 WHERE (a = 2)", "SELECT * FROM a"]
49
45
  end
50
46
 
51
47
  specify "should handle saving after modifying the primary key field with another field" do
48
+ @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>4}]]
52
49
  @c.first.set(:a=>2, :b=>4).save
53
- @ds2.all.should == [{:a=>2, :b=>4}]
50
+ @c.all.should == [@c.load(:a=>2, :b=>4)]
51
+ sqls = MODEL_DB.sqls
52
+ ["UPDATE a SET a = 2, b = 4 WHERE (a = 1)", "UPDATE a SET b = 4, a = 2 WHERE (a = 1)"].should include(sqls.slice!(1))
53
+ sqls.should == ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
54
54
  end
55
55
 
56
56
  specify "should handle saving after modifying just the primary key field" do
57
+ @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>3}]]
57
58
  @c.first.set(:a=>2).save
58
- @ds2.all.should == [{:a=>2, :b=>3}]
59
+ @c.all.should == [@c.load(:a=>2, :b=>3)]
60
+ sqls = MODEL_DB.sqls
61
+ ["UPDATE a SET a = 2, b = 3 WHERE (a = 1)", "UPDATE a SET b = 3, a = 2 WHERE (a = 1)"].should include(sqls.slice!(1))
62
+ sqls.should == ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
59
63
  end
60
64
 
61
65
  specify "should handle saving after updating the primary key" do
66
+ @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>5}]]
62
67
  @c.first.update(:a=>2).update(:b=>4).set(:b=>5).save
63
- @ds2.all.should == [{:a=>2, :b=>5}]
68
+ @c.all.should == [@c.load(:a=>2, :b=>5)]
69
+ MODEL_DB.sqls.should == ["SELECT * FROM a LIMIT 1", "UPDATE a SET a = 2 WHERE (a = 1)", "UPDATE a SET b = 4 WHERE (a = 2)", "UPDATE a SET b = 5 WHERE (a = 2)", "SELECT * FROM a"]
64
70
  end
65
71
  end
@@ -527,13 +527,8 @@ describe Sequel::Model do
527
527
  end
528
528
 
529
529
  specify "should raise an error if inclusion_of doesn't receive a valid :in option" do
530
- lambda {
531
- @c.validates_inclusion_of :value
532
- }.should raise_error(ArgumentError)
533
-
534
- lambda {
535
- @c.validates_inclusion_of :value, :in => 1
536
- }.should raise_error(ArgumentError)
530
+ lambda{@c.validates_inclusion_of :value}.should raise_error(ArgumentError)
531
+ lambda{@c.validates_inclusion_of :value, :in => 1}.should raise_error(ArgumentError)
537
532
  end
538
533
 
539
534
  specify "should raise an error if inclusion_of handles :allow_nil too" do
@@ -570,7 +565,6 @@ describe Sequel::Model do
570
565
 
571
566
  specify "should validate uniqueness_of with if => false" do
572
567
  @c.validates_uniqueness_of :value, :if => :skip
573
-
574
568
  @m.value = 'a'
575
569
  @m.should be_valid
576
570
  end
@@ -602,16 +596,11 @@ describe "Superclass validations" do
602
596
  o = @c2.new
603
597
  o.value = 'ab'
604
598
  o.valid?.should == false
605
- o.errors.full_messages.should == [
606
- 'value is too short'
607
- ]
599
+ o.errors.full_messages.should == ['value is too short']
608
600
 
609
601
  o.value = '12'
610
602
  o.valid?.should == false
611
- o.errors.full_messages.should == [
612
- 'value is too short',
613
- 'value is invalid'
614
- ]
603
+ o.errors.full_messages.should == ['value is too short', 'value is invalid']
615
604
 
616
605
  o.value = 'abcde'
617
606
  o.valid?.should be_true
@@ -626,9 +615,7 @@ describe "Superclass validations" do
626
615
 
627
616
  o.value = '12'
628
617
  o.valid?.should == false
629
- o.errors.full_messages.should == [
630
- 'value is invalid'
631
- ]
618
+ o.errors.full_messages.should == ['value is invalid']
632
619
 
633
620
  o.value = 'abcde'
634
621
  o.valid?.should be_true
@@ -824,22 +811,18 @@ describe Sequel::Model, "Validations" do
824
811
  uniqueness_of :username
825
812
  end
826
813
  end
827
- User.dataset.extend(Module.new {
828
- def fetch_rows(sql)
829
- @db << sql
830
-
831
- case sql
832
- when /COUNT.*username = '0records'/
833
- yield({:v => 0})
834
- when /COUNT.*username = '2records'/
835
- yield({:v => 2})
836
- when /COUNT.*username = '1record'/
837
- yield({:v => 1})
838
- when /username = '1record'/
839
- yield({:id => 3, :username => "1record", :password => "test"})
840
- end
814
+ User.dataset._fetch = proc do |sql|
815
+ case sql
816
+ when /COUNT.*username = '0records'/
817
+ {:v => 0}
818
+ when /COUNT.*username = '2records'/
819
+ {:v => 2}
820
+ when /COUNT.*username = '1record'/
821
+ {:v => 1}
822
+ when /username = '1record'/
823
+ {:id => 3, :username => "1record", :password => "test"}
841
824
  end
842
- })
825
+ end
843
826
 
844
827
  @user = User.new(:username => "2records", :password => "anothertest")
845
828
  @user.should_not be_valid
@@ -869,26 +852,22 @@ describe Sequel::Model, "Validations" do
869
852
  uniqueness_of [:username, :password]
870
853
  end
871
854
  end
872
- User.dataset.extend(Module.new {
873
- def fetch_rows(sql)
874
- @db << sql
875
-
876
- case sql
877
- when /COUNT.*username = '0records'/
878
- yield({:v => 0})
879
- when /COUNT.*username = '2records'/
880
- yield({:v => 2})
881
- when /COUNT.*username = '1record'/
882
- yield({:v => 1})
883
- when /username = '1record'/
884
- if sql =~ /password = 'anothertest'/
885
- yield({:id => 3, :username => "1record", :password => "anothertest"})
886
- else
887
- yield({:id => 4, :username => "1record", :password => "test"})
888
- end
855
+ User.dataset._fetch = proc do |sql|
856
+ case sql
857
+ when /COUNT.*username = '0records'/
858
+ {:v => 0}
859
+ when /COUNT.*username = '2records'/
860
+ {:v => 2}
861
+ when /COUNT.*username = '1record'/
862
+ {:v => 1}
863
+ when /username = '1record'/
864
+ if sql =~ /password = 'anothertest'/
865
+ {:id => 3, :username => "1record", :password => "anothertest"}
866
+ else
867
+ {:id => 4, :username => "1record", :password => "test"}
889
868
  end
890
869
  end
891
- })
870
+ end
892
871
 
893
872
  @user = User.new(:username => "2records", :password => "anothertest")
894
873
  @user.should_not be_valid
@@ -317,18 +317,14 @@ describe "Sequel::Plugins::ValidationHelpers" do
317
317
  @c.columns(:id, :username, :password)
318
318
  @c.set_dataset MODEL_DB[:items]
319
319
  @c.set_validations{validates_unique(:username)}
320
- @c.dataset.extend(Module.new {
321
- def fetch_rows(sql)
322
- @db << sql
323
-
324
- case sql
325
- when /COUNT.*username = '0records'/
326
- yield({:v => 0})
327
- when /COUNT.*username = '1record'/
328
- yield({:v => 1})
329
- end
320
+ @c.dataset._fetch = proc do |sql|
321
+ case sql
322
+ when /COUNT.*username = '0records'/
323
+ {:v => 0}
324
+ when /COUNT.*username = '1record'/
325
+ {:v => 1}
330
326
  end
331
- })
327
+ end
332
328
 
333
329
  @user = @c.new(:username => "0records", :password => "anothertest")
334
330
  @user.should be_valid
@@ -359,18 +355,14 @@ describe "Sequel::Plugins::ValidationHelpers" do
359
355
  @c.columns(:id, :username, :password)
360
356
  @c.set_dataset MODEL_DB[:items]
361
357
  @c.set_validations{validates_unique([:username, :password])}
362
- @c.dataset.extend(Module.new {
363
- def fetch_rows(sql)
364
- @db << sql
365
-
366
- case sql
367
- when /COUNT.*username = '0records'/
368
- yield({:v => 0})
369
- when /COUNT.*username = '1record'/
370
- yield({:v => 1})
371
- end
358
+ @c.dataset._fetch = proc do |sql|
359
+ case sql
360
+ when /COUNT.*username = '0records'/
361
+ {:v => 0}
362
+ when /COUNT.*username = '1record'/
363
+ {:v => 1}
372
364
  end
373
- })
365
+ end
374
366
 
375
367
  @user = @c.new(:username => "0records", :password => "anothertest")
376
368
  @user.should be_valid
@@ -401,12 +393,7 @@ describe "Sequel::Plugins::ValidationHelpers" do
401
393
  @c.columns(:id, :username, :password)
402
394
  @c.set_dataset MODEL_DB[:items]
403
395
  @c.set_validations{validates_unique(:username){|ds| ds.filter(:active)}}
404
- @c.dataset.extend(Module.new {
405
- def fetch_rows (sql)
406
- @db << sql
407
- yield({:v => 0})
408
- end
409
- })
396
+ @c.dataset._fetch = {:v=>0}
410
397
 
411
398
  MODEL_DB.reset
412
399
  @c.new(:username => "0records", :password => "anothertest").should be_valid
@@ -419,13 +406,7 @@ describe "Sequel::Plugins::ValidationHelpers" do
419
406
  @c.columns(:id, :username, :password)
420
407
  @c.set_dataset MODEL_DB[:items]
421
408
  @c.set_validations{validates_unique([:username, :password], :only_if_modified=>true)}
422
-
423
- @c.dataset.extend(Module.new {
424
- def fetch_rows (sql)
425
- @db << sql
426
- yield({:v => 0})
427
- end
428
- })
409
+ @c.dataset._fetch = {:v=>0}
429
410
 
430
411
  MODEL_DB.reset
431
412
  @c.new(:username => "0records", :password => "anothertest").should be_valid
@@ -36,6 +36,18 @@ describe "Sequel::Plugins::XmlSerializer" do
36
36
  Album.from_xml(@album.to_xml).should == @album
37
37
  end
38
38
 
39
+ it "should round trip successfully for namespaced models" do
40
+ module XmlSerializerTest
41
+ class Artist < Sequel::Model
42
+ plugin :xml_serializer
43
+ columns :id, :name
44
+ @db_schema = {:id=>{:type=>:integer}, :name=>{:type=>:string}}
45
+ end
46
+ end
47
+ artist = XmlSerializerTest::Artist.load(:id=>2, :name=>'YJM')
48
+ XmlSerializerTest::Artist.from_xml(artist.to_xml).should == artist
49
+ end
50
+
39
51
  it "should round trip successfully with empty strings" do
40
52
  artist = Artist.load(:id=>2, :name=>'')
41
53
  Artist.from_xml(artist.to_xml).should == artist
@@ -106,13 +118,13 @@ describe "Sequel::Plugins::XmlSerializer" do
106
118
  end
107
119
 
108
120
  it "should support an :encoding option when serializing" do
109
- ["<?xml version=\"1.0\" encoding=\"utf-8\"?><artist><id>2</id><name>YJM</name></artist>",
110
- "<?xml version=\"1.0\" encoding=\"utf-8\"?><artist><name>YJM</name><id>2</id></artist>"].should include(@artist.to_xml(:encoding=>'utf-8').gsub(/\n */m, ''))
121
+ ["<?xml version=\"1.0\" encoding=\"UTF-8\"?><artist><id>2</id><name>YJM</name></artist>",
122
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?><artist><name>YJM</name><id>2</id></artist>"].should include(@artist.to_xml(:encoding=>'UTF-8').gsub(/\n */m, ''))
111
123
  end
112
124
 
113
125
  it "should support a :builder_opts option when serializing" do
114
- ["<?xml version=\"1.0\" encoding=\"utf-8\"?><artist><id>2</id><name>YJM</name></artist>",
115
- "<?xml version=\"1.0\" encoding=\"utf-8\"?><artist><name>YJM</name><id>2</id></artist>"].should include(@artist.to_xml(:builder_opts=>{:encoding=>'utf-8'}).gsub(/\n */m, ''))
126
+ ["<?xml version=\"1.0\" encoding=\"UTF-8\"?><artist><id>2</id><name>YJM</name></artist>",
127
+ "<?xml version=\"1.0\" encoding=\"UTF-8\"?><artist><name>YJM</name><id>2</id></artist>"].should include(@artist.to_xml(:builder_opts=>{:encoding=>'UTF-8'}).gsub(/\n */m, ''))
116
128
  end
117
129
 
118
130
  it "should support an :types option when serializing" do
@@ -145,6 +157,19 @@ describe "Sequel::Plugins::XmlSerializer" do
145
157
  Album.array_from_xml(Album.dataset.to_xml(:only=>:name)).should == [Album.load(:name=>@album.name)]
146
158
  end
147
159
 
160
+ it "should have to_xml dataset method respect an :array option" do
161
+ a = Album.load(:id=>1, :name=>'RF', :artist_id=>3)
162
+ Album.array_from_xml(Album.to_xml(:array=>[a])).should == [a]
163
+
164
+ a.associations[:artist] = artist = Artist.load(:id=>3, :name=>'YJM')
165
+ Album.array_from_xml(Album.to_xml(:array=>[a], :include=>:artist)).first.artist.should == artist
166
+
167
+ artist.associations[:albums] = [a]
168
+ x = Artist.array_from_xml(Artist.to_xml(:array=>[artist], :include=>:albums))
169
+ x.should == [artist]
170
+ x.first.albums.should == [a]
171
+ end
172
+
148
173
  it "should raise an error if the dataset does not have a row_proc" do
149
174
  proc{Album.dataset.naked.to_xml}.should raise_error(Sequel::Error)
150
175
  end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ transaction
3
+ change{create_table(:sm11111){Integer :smc1}}
4
+ end
@@ -0,0 +1,4 @@
1
+ Sequel.migration do
2
+ no_transaction
3
+ change{create_table(:sm){Integer :smc1}}
4
+ end
@@ -0,0 +1,3 @@
1
+ Sequel.migration do
2
+ change{create_table(:sm11111){Integer :smc1}}
3
+ end
@@ -0,0 +1,3 @@
1
+ Sequel.migration do
2
+ change{create_table(:sm){Integer :smc1}}
3
+ end