sequel 5.20.0 → 5.49.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 (511) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +398 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +80 -16
  7. data/doc/cheat_sheet.rdoc +6 -5
  8. data/doc/code_order.rdoc +10 -12
  9. data/doc/dataset_filtering.rdoc +17 -2
  10. data/doc/fork_safety.rdoc +84 -0
  11. data/doc/migration.rdoc +11 -5
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +10 -2
  15. data/doc/postgresql.rdoc +82 -3
  16. data/doc/querying.rdoc +4 -4
  17. data/doc/release_notes/5.21.0.txt +87 -0
  18. data/doc/release_notes/5.22.0.txt +48 -0
  19. data/doc/release_notes/5.23.0.txt +56 -0
  20. data/doc/release_notes/5.24.0.txt +56 -0
  21. data/doc/release_notes/5.25.0.txt +32 -0
  22. data/doc/release_notes/5.26.0.txt +35 -0
  23. data/doc/release_notes/5.27.0.txt +21 -0
  24. data/doc/release_notes/5.28.0.txt +16 -0
  25. data/doc/release_notes/5.29.0.txt +22 -0
  26. data/doc/release_notes/5.30.0.txt +20 -0
  27. data/doc/release_notes/5.31.0.txt +148 -0
  28. data/doc/release_notes/5.32.0.txt +46 -0
  29. data/doc/release_notes/5.33.0.txt +24 -0
  30. data/doc/release_notes/5.34.0.txt +40 -0
  31. data/doc/release_notes/5.35.0.txt +56 -0
  32. data/doc/release_notes/5.36.0.txt +60 -0
  33. data/doc/release_notes/5.37.0.txt +30 -0
  34. data/doc/release_notes/5.38.0.txt +28 -0
  35. data/doc/release_notes/5.39.0.txt +19 -0
  36. data/doc/release_notes/5.40.0.txt +40 -0
  37. data/doc/release_notes/5.41.0.txt +25 -0
  38. data/doc/release_notes/5.42.0.txt +136 -0
  39. data/doc/release_notes/5.43.0.txt +98 -0
  40. data/doc/release_notes/5.44.0.txt +32 -0
  41. data/doc/release_notes/5.45.0.txt +34 -0
  42. data/doc/release_notes/5.46.0.txt +87 -0
  43. data/doc/release_notes/5.47.0.txt +59 -0
  44. data/doc/release_notes/5.48.0.txt +14 -0
  45. data/doc/release_notes/5.49.0.txt +59 -0
  46. data/doc/sharding.rdoc +2 -0
  47. data/doc/sql.rdoc +13 -1
  48. data/doc/testing.rdoc +20 -7
  49. data/doc/transactions.rdoc +0 -8
  50. data/doc/validations.rdoc +1 -1
  51. data/doc/virtual_rows.rdoc +1 -1
  52. data/lib/sequel/adapters/ado/access.rb +1 -1
  53. data/lib/sequel/adapters/ado.rb +43 -35
  54. data/lib/sequel/adapters/ibmdb.rb +2 -2
  55. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  56. data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
  57. data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
  58. data/lib/sequel/adapters/jdbc.rb +24 -6
  59. data/lib/sequel/adapters/mysql.rb +1 -1
  60. data/lib/sequel/adapters/mysql2.rb +2 -3
  61. data/lib/sequel/adapters/odbc.rb +8 -6
  62. data/lib/sequel/adapters/oracle.rb +5 -4
  63. data/lib/sequel/adapters/postgres.rb +15 -9
  64. data/lib/sequel/adapters/shared/access.rb +6 -6
  65. data/lib/sequel/adapters/shared/mssql.rb +66 -21
  66. data/lib/sequel/adapters/shared/mysql.rb +27 -10
  67. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  68. data/lib/sequel/adapters/shared/postgres.rb +271 -32
  69. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  70. data/lib/sequel/adapters/shared/sqlite.rb +161 -19
  71. data/lib/sequel/adapters/sqlanywhere.rb +1 -1
  72. data/lib/sequel/adapters/sqlite.rb +1 -1
  73. data/lib/sequel/adapters/tinytds.rb +15 -2
  74. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
  75. data/lib/sequel/ast_transformer.rb +6 -0
  76. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  77. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  78. data/lib/sequel/connection_pool/single.rb +1 -1
  79. data/lib/sequel/connection_pool/threaded.rb +2 -2
  80. data/lib/sequel/core.rb +333 -319
  81. data/lib/sequel/database/connecting.rb +3 -4
  82. data/lib/sequel/database/logging.rb +7 -1
  83. data/lib/sequel/database/misc.rb +31 -12
  84. data/lib/sequel/database/query.rb +3 -1
  85. data/lib/sequel/database/schema_generator.rb +53 -51
  86. data/lib/sequel/database/schema_methods.rb +38 -23
  87. data/lib/sequel/database/transactions.rb +17 -18
  88. data/lib/sequel/dataset/actions.rb +14 -9
  89. data/lib/sequel/dataset/features.rb +16 -0
  90. data/lib/sequel/dataset/misc.rb +2 -2
  91. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  92. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  93. data/lib/sequel/dataset/query.rb +26 -9
  94. data/lib/sequel/dataset/sql.rb +76 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/deprecated.rb +3 -1
  97. data/lib/sequel/exceptions.rb +2 -0
  98. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  99. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  100. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  101. data/lib/sequel/extensions/blank.rb +8 -0
  102. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  103. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  104. data/lib/sequel/extensions/connection_validator.rb +2 -2
  105. data/lib/sequel/extensions/core_refinements.rb +2 -0
  106. data/lib/sequel/extensions/date_arithmetic.rb +36 -24
  107. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
  108. data/lib/sequel/extensions/eval_inspect.rb +2 -0
  109. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  110. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  111. data/lib/sequel/extensions/index_caching.rb +9 -7
  112. data/lib/sequel/extensions/inflector.rb +9 -1
  113. data/lib/sequel/extensions/integer64.rb +2 -0
  114. data/lib/sequel/extensions/migration.rb +11 -3
  115. data/lib/sequel/extensions/named_timezones.rb +56 -8
  116. data/lib/sequel/extensions/pagination.rb +1 -1
  117. data/lib/sequel/extensions/pg_array.rb +5 -0
  118. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  119. data/lib/sequel/extensions/pg_enum.rb +11 -3
  120. data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
  121. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  122. data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
  123. data/lib/sequel/extensions/pg_inet.rb +15 -5
  124. data/lib/sequel/extensions/pg_interval.rb +36 -8
  125. data/lib/sequel/extensions/pg_json.rb +387 -123
  126. data/lib/sequel/extensions/pg_json_ops.rb +238 -0
  127. data/lib/sequel/extensions/pg_loose_count.rb +3 -1
  128. data/lib/sequel/extensions/pg_range.rb +17 -9
  129. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  130. data/lib/sequel/extensions/pg_row.rb +4 -2
  131. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  132. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  133. data/lib/sequel/extensions/query.rb +3 -0
  134. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  135. data/lib/sequel/extensions/s.rb +2 -0
  136. data/lib/sequel/extensions/schema_dumper.rb +24 -7
  137. data/lib/sequel/extensions/server_block.rb +18 -7
  138. data/lib/sequel/extensions/sql_comments.rb +2 -2
  139. data/lib/sequel/extensions/string_agg.rb +1 -1
  140. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  141. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  142. data/lib/sequel/extensions/to_dot.rb +9 -3
  143. data/lib/sequel/model/associations.rb +356 -117
  144. data/lib/sequel/model/base.rb +107 -68
  145. data/lib/sequel/model/errors.rb +10 -1
  146. data/lib/sequel/model/inflections.rb +1 -1
  147. data/lib/sequel/model/plugins.rb +9 -3
  148. data/lib/sequel/model.rb +3 -1
  149. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  150. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  151. data/lib/sequel/plugins/association_pks.rb +60 -18
  152. data/lib/sequel/plugins/association_proxies.rb +8 -2
  153. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  154. data/lib/sequel/plugins/auto_validations.rb +39 -5
  155. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  156. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  157. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  158. data/lib/sequel/plugins/caching.rb +3 -0
  159. data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
  160. data/lib/sequel/plugins/column_encryption.rb +728 -0
  161. data/lib/sequel/plugins/composition.rb +7 -2
  162. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  163. data/lib/sequel/plugins/constraint_validations.rb +2 -1
  164. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  165. data/lib/sequel/plugins/dataset_associations.rb +4 -1
  166. data/lib/sequel/plugins/dirty.rb +60 -22
  167. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  168. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  169. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  170. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  171. data/lib/sequel/plugins/json_serializer.rb +57 -35
  172. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  173. data/lib/sequel/plugins/many_through_many.rb +108 -9
  174. data/lib/sequel/plugins/nested_attributes.rb +15 -3
  175. data/lib/sequel/plugins/pg_array_associations.rb +58 -41
  176. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
  177. data/lib/sequel/plugins/prepared_statements.rb +15 -12
  178. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  179. data/lib/sequel/plugins/rcte_tree.rb +43 -35
  180. data/lib/sequel/plugins/serialization.rb +8 -3
  181. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  182. data/lib/sequel/plugins/sharding.rb +11 -5
  183. data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
  184. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  185. data/lib/sequel/plugins/static_cache.rb +9 -4
  186. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  187. data/lib/sequel/plugins/string_stripper.rb +1 -1
  188. data/lib/sequel/plugins/subclasses.rb +2 -0
  189. data/lib/sequel/plugins/throw_failures.rb +1 -1
  190. data/lib/sequel/plugins/timestamps.rb +1 -1
  191. data/lib/sequel/plugins/tree.rb +9 -4
  192. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  193. data/lib/sequel/plugins/unused_associations.rb +521 -0
  194. data/lib/sequel/plugins/update_or_create.rb +1 -1
  195. data/lib/sequel/plugins/validation_class_methods.rb +5 -1
  196. data/lib/sequel/plugins/validation_helpers.rb +18 -11
  197. data/lib/sequel/plugins/xml_serializer.rb +1 -1
  198. data/lib/sequel/sql.rb +20 -5
  199. data/lib/sequel/timezones.rb +63 -17
  200. data/lib/sequel/version.rb +1 -1
  201. metadata +113 -381
  202. data/Rakefile +0 -151
  203. data/doc/release_notes/4.0.0.txt +0 -262
  204. data/doc/release_notes/4.1.0.txt +0 -85
  205. data/doc/release_notes/4.10.0.txt +0 -226
  206. data/doc/release_notes/4.11.0.txt +0 -147
  207. data/doc/release_notes/4.12.0.txt +0 -105
  208. data/doc/release_notes/4.13.0.txt +0 -169
  209. data/doc/release_notes/4.14.0.txt +0 -68
  210. data/doc/release_notes/4.15.0.txt +0 -56
  211. data/doc/release_notes/4.16.0.txt +0 -36
  212. data/doc/release_notes/4.17.0.txt +0 -38
  213. data/doc/release_notes/4.18.0.txt +0 -36
  214. data/doc/release_notes/4.19.0.txt +0 -45
  215. data/doc/release_notes/4.2.0.txt +0 -129
  216. data/doc/release_notes/4.20.0.txt +0 -79
  217. data/doc/release_notes/4.21.0.txt +0 -94
  218. data/doc/release_notes/4.22.0.txt +0 -72
  219. data/doc/release_notes/4.23.0.txt +0 -65
  220. data/doc/release_notes/4.24.0.txt +0 -99
  221. data/doc/release_notes/4.25.0.txt +0 -181
  222. data/doc/release_notes/4.26.0.txt +0 -44
  223. data/doc/release_notes/4.27.0.txt +0 -78
  224. data/doc/release_notes/4.28.0.txt +0 -57
  225. data/doc/release_notes/4.29.0.txt +0 -41
  226. data/doc/release_notes/4.3.0.txt +0 -40
  227. data/doc/release_notes/4.30.0.txt +0 -37
  228. data/doc/release_notes/4.31.0.txt +0 -57
  229. data/doc/release_notes/4.32.0.txt +0 -132
  230. data/doc/release_notes/4.33.0.txt +0 -88
  231. data/doc/release_notes/4.34.0.txt +0 -86
  232. data/doc/release_notes/4.35.0.txt +0 -130
  233. data/doc/release_notes/4.36.0.txt +0 -116
  234. data/doc/release_notes/4.37.0.txt +0 -50
  235. data/doc/release_notes/4.38.0.txt +0 -67
  236. data/doc/release_notes/4.39.0.txt +0 -127
  237. data/doc/release_notes/4.4.0.txt +0 -92
  238. data/doc/release_notes/4.40.0.txt +0 -179
  239. data/doc/release_notes/4.41.0.txt +0 -77
  240. data/doc/release_notes/4.42.0.txt +0 -221
  241. data/doc/release_notes/4.43.0.txt +0 -87
  242. data/doc/release_notes/4.44.0.txt +0 -125
  243. data/doc/release_notes/4.45.0.txt +0 -370
  244. data/doc/release_notes/4.46.0.txt +0 -404
  245. data/doc/release_notes/4.47.0.txt +0 -56
  246. data/doc/release_notes/4.48.0.txt +0 -293
  247. data/doc/release_notes/4.49.0.txt +0 -222
  248. data/doc/release_notes/4.5.0.txt +0 -34
  249. data/doc/release_notes/4.6.0.txt +0 -30
  250. data/doc/release_notes/4.7.0.txt +0 -103
  251. data/doc/release_notes/4.8.0.txt +0 -175
  252. data/doc/release_notes/4.9.0.txt +0 -190
  253. data/spec/adapter_spec.rb +0 -4
  254. data/spec/adapters/db2_spec.rb +0 -170
  255. data/spec/adapters/mssql_spec.rb +0 -804
  256. data/spec/adapters/mysql_spec.rb +0 -1065
  257. data/spec/adapters/oracle_spec.rb +0 -371
  258. data/spec/adapters/postgres_spec.rb +0 -4125
  259. data/spec/adapters/spec_helper.rb +0 -44
  260. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  261. data/spec/adapters/sqlite_spec.rb +0 -652
  262. data/spec/bin_spec.rb +0 -278
  263. data/spec/core/connection_pool_spec.rb +0 -1250
  264. data/spec/core/database_spec.rb +0 -2865
  265. data/spec/core/dataset_spec.rb +0 -5515
  266. data/spec/core/deprecated_spec.rb +0 -70
  267. data/spec/core/expression_filters_spec.rb +0 -1455
  268. data/spec/core/mock_adapter_spec.rb +0 -722
  269. data/spec/core/object_graph_spec.rb +0 -336
  270. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  271. data/spec/core/schema_generator_spec.rb +0 -214
  272. data/spec/core/schema_spec.rb +0 -1826
  273. data/spec/core/spec_helper.rb +0 -24
  274. data/spec/core/version_spec.rb +0 -14
  275. data/spec/core_extensions_spec.rb +0 -763
  276. data/spec/core_model_spec.rb +0 -2
  277. data/spec/core_spec.rb +0 -1
  278. data/spec/deprecation_helper.rb +0 -30
  279. data/spec/extensions/accessed_columns_spec.rb +0 -51
  280. data/spec/extensions/active_model_spec.rb +0 -99
  281. data/spec/extensions/after_initialize_spec.rb +0 -28
  282. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  283. data/spec/extensions/association_dependencies_spec.rb +0 -125
  284. data/spec/extensions/association_pks_spec.rb +0 -423
  285. data/spec/extensions/association_proxies_spec.rb +0 -100
  286. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  287. data/spec/extensions/auto_validations_spec.rb +0 -229
  288. data/spec/extensions/blacklist_security_spec.rb +0 -95
  289. data/spec/extensions/blank_spec.rb +0 -69
  290. data/spec/extensions/boolean_readers_spec.rb +0 -93
  291. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  292. data/spec/extensions/caching_spec.rb +0 -273
  293. data/spec/extensions/caller_logging_spec.rb +0 -52
  294. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  295. data/spec/extensions/column_conflicts_spec.rb +0 -75
  296. data/spec/extensions/column_select_spec.rb +0 -129
  297. data/spec/extensions/columns_introspection_spec.rb +0 -90
  298. data/spec/extensions/columns_updated_spec.rb +0 -35
  299. data/spec/extensions/composition_spec.rb +0 -248
  300. data/spec/extensions/connection_expiration_spec.rb +0 -151
  301. data/spec/extensions/connection_validator_spec.rb +0 -144
  302. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  303. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  304. data/spec/extensions/constraint_validations_spec.rb +0 -439
  305. data/spec/extensions/core_refinements_spec.rb +0 -528
  306. data/spec/extensions/csv_serializer_spec.rb +0 -183
  307. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  308. data/spec/extensions/dataset_associations_spec.rb +0 -365
  309. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  310. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  311. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  312. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  313. data/spec/extensions/defaults_setter_spec.rb +0 -150
  314. data/spec/extensions/delay_add_association_spec.rb +0 -73
  315. data/spec/extensions/dirty_spec.rb +0 -189
  316. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  317. data/spec/extensions/eager_each_spec.rb +0 -62
  318. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  319. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  320. data/spec/extensions/error_splitter_spec.rb +0 -18
  321. data/spec/extensions/error_sql_spec.rb +0 -20
  322. data/spec/extensions/escaped_like_spec.rb +0 -40
  323. data/spec/extensions/eval_inspect_spec.rb +0 -81
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -291
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -864
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -111
  348. data/spec/extensions/nested_attributes_spec.rb +0 -767
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
  356. data/spec/extensions/pg_enum_spec.rb +0 -118
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -519
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -177
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -870
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -63
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -471
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/throw_failures_spec.rb +0 -74
  411. data/spec/extensions/timestamps_spec.rb +0 -209
  412. data/spec/extensions/to_dot_spec.rb +0 -153
  413. data/spec/extensions/touch_spec.rb +0 -226
  414. data/spec/extensions/tree_spec.rb +0 -334
  415. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  416. data/spec/extensions/unlimited_update_spec.rb +0 -21
  417. data/spec/extensions/update_or_create_spec.rb +0 -83
  418. data/spec/extensions/update_primary_key_spec.rb +0 -105
  419. data/spec/extensions/update_refresh_spec.rb +0 -59
  420. data/spec/extensions/uuid_spec.rb +0 -101
  421. data/spec/extensions/validate_associated_spec.rb +0 -52
  422. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  423. data/spec/extensions/validation_contexts_spec.rb +0 -31
  424. data/spec/extensions/validation_helpers_spec.rb +0 -525
  425. data/spec/extensions/whitelist_security_spec.rb +0 -157
  426. data/spec/extensions/xml_serializer_spec.rb +0 -213
  427. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  428. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  429. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  431. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  432. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  433. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  434. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  436. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  437. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  438. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  439. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  440. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  441. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  443. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  444. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  446. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  447. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  448. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  449. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  450. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  451. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  452. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  453. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  457. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  458. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  459. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  460. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  461. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  462. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  466. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  468. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  469. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  471. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  473. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  474. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  475. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  476. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  478. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  479. data/spec/guards_helper.rb +0 -59
  480. data/spec/integration/associations_test.rb +0 -2597
  481. data/spec/integration/database_test.rb +0 -113
  482. data/spec/integration/dataset_test.rb +0 -1981
  483. data/spec/integration/eager_loader_test.rb +0 -687
  484. data/spec/integration/migrator_test.rb +0 -262
  485. data/spec/integration/model_test.rb +0 -203
  486. data/spec/integration/plugin_test.rb +0 -2396
  487. data/spec/integration/prepared_statement_test.rb +0 -405
  488. data/spec/integration/schema_test.rb +0 -889
  489. data/spec/integration/spec_helper.rb +0 -65
  490. data/spec/integration/timezone_test.rb +0 -86
  491. data/spec/integration/transaction_test.rb +0 -603
  492. data/spec/integration/type_test.rb +0 -127
  493. data/spec/model/association_reflection_spec.rb +0 -803
  494. data/spec/model/associations_spec.rb +0 -4738
  495. data/spec/model/base_spec.rb +0 -875
  496. data/spec/model/class_dataset_methods_spec.rb +0 -146
  497. data/spec/model/dataset_methods_spec.rb +0 -198
  498. data/spec/model/eager_loading_spec.rb +0 -2377
  499. data/spec/model/hooks_spec.rb +0 -370
  500. data/spec/model/inflector_spec.rb +0 -26
  501. data/spec/model/model_spec.rb +0 -956
  502. data/spec/model/plugins_spec.rb +0 -429
  503. data/spec/model/record_spec.rb +0 -2118
  504. data/spec/model/spec_helper.rb +0 -46
  505. data/spec/model/validations_spec.rb +0 -220
  506. data/spec/model_no_assoc_spec.rb +0 -1
  507. data/spec/model_spec.rb +0 -1
  508. data/spec/plugin_spec.rb +0 -1
  509. data/spec/sequel_coverage.rb +0 -15
  510. data/spec/sequel_warning.rb +0 -4
  511. data/spec/spec_config.rb +0 -12
@@ -1,864 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :migration
4
-
5
- describe "Migration.descendants" do
6
- before do
7
- Sequel::Migration.descendants.clear
8
- end
9
-
10
- it "should include Migration subclasses" do
11
- @class = Class.new(Sequel::Migration)
12
-
13
- Sequel::Migration.descendants.must_equal [@class]
14
- end
15
-
16
- it "should include Migration subclasses in order of creation" do
17
- @c1 = Class.new(Sequel::Migration)
18
- @c2 = Class.new(Sequel::Migration)
19
- @c3 = Class.new(Sequel::Migration)
20
-
21
- Sequel::Migration.descendants.must_equal [@c1, @c2, @c3]
22
- end
23
-
24
- it "should include SimpleMigration instances created by migration DSL" do
25
- i1 = Sequel.migration{}
26
- i2 = Sequel.migration{}
27
- i3 = Sequel.migration{}
28
-
29
- Sequel::Migration.descendants.must_equal [i1, i2, i3]
30
- end
31
- end
32
-
33
- describe "Migration.apply" do
34
- before do
35
- @c = Class.new do
36
- define_method(:one) {|x| [1111, x]}
37
- define_method(:two) {|x| [2222, x]}
38
- end
39
- @db = @c.new
40
- end
41
-
42
- it "should raise for an invalid direction" do
43
- proc {Sequel::Migration.apply(@db, :hahaha)}.must_raise(ArgumentError)
44
- end
45
-
46
- it "should apply the up and down directions correctly" do
47
- m = Class.new(Sequel::Migration) do
48
- define_method(:up) {one(3333)}
49
- define_method(:down) {two(4444)}
50
- end
51
- m.apply(@db, :up).must_equal [1111, 3333]
52
- m.apply(@db, :down).must_equal [2222, 4444]
53
- end
54
-
55
- it "should have default up and down actions that do nothing" do
56
- m = Class.new(Sequel::Migration)
57
- m.apply(@db, :up).must_be_nil
58
- m.apply(@db, :down).must_be_nil
59
- end
60
-
61
- it "should respond to the methods the database responds to" do
62
- m = Sequel::Migration.new(Sequel.mock)
63
- m.respond_to?(:foo).must_equal false
64
- m.respond_to?(:execute).must_equal true
65
- end
66
- end
67
-
68
- describe "SimpleMigration#apply" do
69
- before do
70
- @c = Class.new do
71
- define_method(:one) {|x| [1111, x]}
72
- define_method(:two) {|x| [2222, x]}
73
- end
74
- @db = @c.new
75
- end
76
-
77
- it "should raise for an invalid direction" do
78
- proc {Sequel.migration{}.apply(@db, :hahaha)}.must_raise(ArgumentError)
79
- end
80
-
81
- it "should apply the up and down directions correctly" do
82
- m = Sequel.migration do
83
- up{one(3333)}
84
- down{two(4444)}
85
- end
86
- m.apply(@db, :up).must_equal [1111, 3333]
87
- m.apply(@db, :down).must_equal [2222, 4444]
88
- end
89
-
90
- it "should have default up and down actions that do nothing" do
91
- m = Sequel.migration{}
92
- m.apply(@db, :up).must_be_nil
93
- m.apply(@db, :down).must_be_nil
94
- end
95
- end
96
-
97
- describe "Reversible Migrations with Sequel.migration{change{}}" do
98
- before do
99
- @c = Class.new do
100
- self::AT = Class.new do
101
- attr_reader :actions
102
- def initialize(&block)
103
- @actions = []
104
- instance_eval(&block)
105
- end
106
- def method_missing(*args)
107
- @actions << args
108
- end
109
- self
110
- end
111
- attr_reader :actions
112
- def initialize
113
- @actions = []
114
- end
115
- def method_missing(*args)
116
- @actions << args
117
- end
118
- def alter_table(*args, &block)
119
- @actions << [:alter_table, self.class::AT.new(&block).actions]
120
- end
121
- end
122
- @db = @c.new
123
- @p = proc do
124
- create_table(:a, :foo=>:bar){Integer :a}
125
- add_column :a, :b, String
126
- add_index :a, :b
127
- rename_column :a, :b, :c
128
- rename_table :a, :b
129
- alter_table(:b) do
130
- add_column :d, String
131
- add_constraint :blah, 'd IS NOT NULL'
132
- add_constraint({:name=>:merp}, 'a > 1')
133
- add_foreign_key :e, :b
134
- add_foreign_key [:e], :b, :name=>'e_fk'
135
- add_foreign_key [:e, :a], :b
136
- add_primary_key :f, :b
137
- add_index :e, :name=>'e_n'
138
- add_full_text_index :e, :name=>'e_ft'
139
- add_spatial_index :e, :name=>'e_s'
140
- rename_column :e, :g
141
- end
142
- create_view(:c, 'SELECT * FROM b', :foo=>:bar)
143
- create_join_table(:cat_id=>:cats, :dog_id=>:dogs)
144
- end
145
- end
146
-
147
- it "should apply up with normal actions in normal order" do
148
- p = @p
149
- Sequel.migration{change(&p)}.apply(@db, :up)
150
- @db.actions.must_equal [[:create_table, :a, {:foo=>:bar}],
151
- [:add_column, :a, :b, String],
152
- [:add_index, :a, :b],
153
- [:rename_column, :a, :b, :c],
154
- [:rename_table, :a, :b],
155
- [:alter_table, [
156
- [:add_column, :d, String],
157
- [:add_constraint, :blah, "d IS NOT NULL"],
158
- [:add_constraint, {:name=>:merp}, "a > 1"],
159
- [:add_foreign_key, :e, :b],
160
- [:add_foreign_key, [:e], :b, {:name=>"e_fk"}],
161
- [:add_foreign_key, [:e, :a], :b],
162
- [:add_primary_key, :f, :b],
163
- [:add_index, :e, {:name=>"e_n"}],
164
- [:add_full_text_index, :e, {:name=>"e_ft"}],
165
- [:add_spatial_index, :e, {:name=>"e_s"}],
166
- [:rename_column, :e, :g]]
167
- ],
168
- [:create_view, :c, "SELECT * FROM b", {:foo=>:bar}],
169
- [:create_join_table, {:cat_id=>:cats, :dog_id=>:dogs}]]
170
- end
171
-
172
- it "should execute down with reversing actions in reverse order" do
173
- p = @p
174
- Sequel.migration{change(&p)}.apply(@db, :down)
175
- @db.actions.must_equal [
176
- [:drop_join_table, {:cat_id=>:cats, :dog_id=>:dogs}],
177
- [:drop_view, :c, {:foo=>:bar}],
178
- [:alter_table, [
179
- [:rename_column, :g, :e],
180
- [:drop_index, :e, {:name=>"e_s"}],
181
- [:drop_index, :e, {:name=>"e_ft"}],
182
- [:drop_index, :e, {:name=>"e_n"}],
183
- [:drop_column, :f],
184
- [:drop_foreign_key, [:e, :a]],
185
- [:drop_foreign_key, [:e], {:name=>"e_fk"}],
186
- [:drop_foreign_key, :e],
187
- [:drop_constraint, :merp],
188
- [:drop_constraint, :blah],
189
- [:drop_column, :d]]
190
- ],
191
- [:rename_table, :b, :a],
192
- [:rename_column, :a, :c, :b],
193
- [:drop_index, :a, :b],
194
- [:drop_column, :a, :b],
195
- [:drop_table, :a, {:foo=>:bar}]]
196
- end
197
-
198
- it "should reverse add_foreign_key with :type option" do
199
- Sequel.migration{change{alter_table(:t){add_foreign_key :b, :c, :type=>:f}}}.apply(@db, :down)
200
- actions = @db.actions
201
- actions.must_equal [[:alter_table, [[:drop_foreign_key, :b, {:type=>:f}]]]]
202
- @db.sqls
203
- db = Sequel.mock
204
- args = nil
205
- db.define_singleton_method(:foreign_key_list){|*a| args = a; [{:name=>:fbc, :columns=>[:b]}]}
206
- db.alter_table(:t){send(*actions[0][1][0])}
207
- db.sqls.must_equal ["ALTER TABLE t DROP CONSTRAINT fbc", "ALTER TABLE t DROP COLUMN b"]
208
- args.must_equal [:t]
209
- end
210
-
211
- it "should reverse add_foreign_key with :foreign_key_constraint_name option" do
212
- Sequel.migration{change{alter_table(:t){add_foreign_key :b, :c, :foreign_key_constraint_name=>:f}}}.apply(@db, :down)
213
- actions = @db.actions
214
- actions.must_equal [[:alter_table, [[:drop_foreign_key, :b, {:foreign_key_constraint_name=>:f}]]]]
215
- @db.sqls
216
- db = Sequel.mock
217
- db.alter_table(:t){send(*actions[0][1][0])}
218
- db.sqls.must_equal ["ALTER TABLE t DROP CONSTRAINT f", "ALTER TABLE t DROP COLUMN b"]
219
- end
220
-
221
- it "should raise in the down direction if migration uses unsupported method" do
222
- m = Sequel.migration{change{run 'SQL'}}
223
- m.apply(@db, :up)
224
- proc{m.apply(@db, :down)}.must_raise(Sequel::Error)
225
- end
226
-
227
- it "should raise in the down direction if migration uses add_primary_key with an array" do
228
- m = Sequel.migration{change{alter_table(:a){add_primary_key [:b]}}}
229
- m.apply(@db, :up)
230
- proc{m.apply(@db, :down)}.must_raise(Sequel::Error)
231
- end
232
-
233
- it "should raise in the down direction if migration uses add_foreign_key with an array" do
234
- m = Sequel.migration{change{alter_table(:a){add_foreign_key [:b]}}}
235
- m.apply(@db, :up)
236
- proc{m.apply(@db, :down)}.must_raise(Sequel::Error)
237
- end
238
- end
239
-
240
- describe "Sequel::Migrator.migrator_class" do
241
- it "should return IntegerMigrator if not using timestamp migrations" do
242
- Sequel::Migrator.migrator_class("spec/files/integer_migrations").must_equal Sequel::IntegerMigrator
243
- end
244
-
245
- it "should return TimestampMigrator if using timestamp migrations" do
246
- Sequel::Migrator.migrator_class('spec/files/timestamped_migrations').must_equal Sequel::TimestampMigrator
247
- end
248
-
249
- it "should return self if run on a subclass" do
250
- Sequel::IntegerMigrator.migrator_class("spec/files/timestamped_migrations").must_equal Sequel::IntegerMigrator
251
- Sequel::TimestampMigrator.migrator_class("spec/files/integer_migrations").must_equal Sequel::TimestampMigrator
252
- end
253
-
254
- it "should raise an error if the migration folder does not exist" do
255
- proc{Sequel::Migrator.apply(@db, "spec/files/nonexistant_migration_path")}.must_raise(Sequel::Migrator::Error)
256
- end
257
-
258
- end
259
-
260
- describe "Sequel::IntegerMigrator" do
261
- before do
262
- dbc = Class.new(Sequel::Mock::Database) do
263
- attr_reader :drops, :tables_created, :columns_created, :versions
264
- def initialize(*args)
265
- super
266
- @drops = []
267
- @tables_created = []
268
- @columns_created = []
269
- @versions = Hash.new{|h,k| h[k.to_sym]}
270
- end
271
-
272
- def version; versions.values.first || 0; end
273
- def creates; @tables_created.map{|x| y = x.to_s; y !~ /\Asm(\d+)/; $1.to_i if $1}.compact; end
274
- def drop_table(*a); super; @drops.concat(a.map{|x| y = x.to_s; y !~ /\Asm(\d+)/; $1.to_i if $1}.compact); end
275
-
276
- def create_table(name, opts={}, &block)
277
- super
278
- @columns_created << / \(?(\w+) integer.*\)?\z/.match(@sqls.last)[1].to_sym
279
- @tables_created << name.to_sym
280
- end
281
-
282
- def dataset
283
- super.with_extend do
284
- def count; 1; end
285
- def columns; db.columns_created end
286
- def insert(h); db.versions.merge!(h); db.run insert_sql(h) end
287
- def update(h); db.versions.merge!(h); db.run update_sql(h) end
288
- def fetch_rows(sql); db.execute(sql); yield(db.versions) unless db.versions.empty? end
289
- end
290
- end
291
-
292
- def table_exists?(name)
293
- @tables_created.include?(name.to_sym)
294
- end
295
- end
296
- @db = dbc.new
297
-
298
- @dirname = "spec/files/integer_migrations"
299
- end
300
-
301
- after do
302
- Object.send(:remove_const, "CreateSessions") if Object.const_defined?("CreateSessions")
303
- end
304
-
305
- it "should raise an error if there is a missing integer migration version" do
306
- proc{Sequel::Migrator.apply(@db, "spec/files/missing_integer_migrations")}.must_raise(Sequel::Migrator::Error)
307
- end
308
-
309
- it "should not raise an error if there is a missing integer migration version and allow_missing_migration_files is true" do
310
- Sequel::Migrator.run(@db, "spec/files/missing_integer_migrations", :allow_missing_migration_files => true)
311
- @db.sqls.last.must_equal "UPDATE schema_info SET version = 3"
312
- Sequel::Migrator.run(@db, "spec/files/missing_integer_migrations", :allow_missing_migration_files => true, :target=>0)
313
- @db.sqls.last.must_equal "UPDATE schema_info SET version = 0"
314
- end
315
-
316
- it "should raise an error if there is a duplicate integer migration version" do
317
- proc{Sequel::Migrator.apply(@db, "spec/files/duplicate_integer_migrations")}.must_raise(Sequel::Migrator::Error)
318
- end
319
-
320
- it "should raise an error if there is an empty migration file" do
321
- proc{Sequel::Migrator.apply(@db, "spec/files/empty_migration")}.must_raise(Sequel::Migrator::Error)
322
- end
323
-
324
- it "should raise an error if there is a migration file with multiple migrations" do
325
- proc{Sequel::Migrator.apply(@db, "spec/files/double_migration")}.must_raise(Sequel::Migrator::Error)
326
- end
327
-
328
- it "should raise an error if the most recent migration can't be detected" do
329
- # Have to specify a target version, otherwise an earlier check (inability
330
- # to detect the target) would raise an error, falsely matching the check.
331
- proc{Sequel::Migrator.apply(@db, "spec/files/empty_migration_folder", 2)}.must_raise(Sequel::Migrator::Error)
332
- end
333
-
334
- it "should add a column name if it doesn't already exist in the schema_info table" do
335
- @db.create_table(:schema_info){Integer :v}
336
- def @db.alter_table(*); end
337
- Sequel::Migrator.apply(@db, @dirname)
338
- end
339
-
340
- it "should automatically create the schema_info table with the version column" do
341
- @db.table_exists?(:schema_info).must_equal false
342
- Sequel::Migrator.run(@db, @dirname, :target=>0)
343
- @db.table_exists?(:schema_info).must_equal true
344
- @db.dataset.columns.must_equal [:version]
345
- end
346
-
347
- it "should allow specifying the table and columns" do
348
- @db.table_exists?(:si).must_equal false
349
- Sequel::Migrator.run(@db, @dirname, :target=>0, :table=>:si, :column=>:sic)
350
- @db.table_exists?(:si).must_equal true
351
- @db.dataset.columns.must_equal [:sic]
352
- end
353
-
354
- it "should support :relative option for running relative migrations" do
355
- Sequel::Migrator.run(@db, @dirname, :relative=>2).must_equal 2
356
- @db.creates.must_equal [1111, 2222]
357
- @db.version.must_equal 2
358
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [1, 2]
359
-
360
- Sequel::Migrator.run(@db, @dirname, :relative=>-1).must_equal 1
361
- @db.drops.must_equal [2222]
362
- @db.version.must_equal 1
363
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [1]
364
-
365
- Sequel::Migrator.run(@db, @dirname, :relative=>2).must_equal 3
366
- @db.creates.must_equal [1111, 2222, 2222, 3333]
367
- @db.version.must_equal 3
368
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [2, 3]
369
-
370
- Sequel::Migrator.run(@db, @dirname, :relative=>-3).must_equal 0
371
- @db.drops.must_equal [2222, 3333, 2222, 1111]
372
- @db.version.must_equal 0
373
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [2, 1, 0]
374
- end
375
-
376
- it "should handle :relative option beyond the upper and lower limit" do
377
- Sequel::Migrator.run(@db, @dirname, :relative=>100).must_equal 3
378
- @db.creates.must_equal [1111, 2222, 3333]
379
- @db.version.must_equal 3
380
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [1, 2, 3]
381
-
382
- Sequel::Migrator.run(@db, @dirname, :relative=>-200).must_equal 0
383
- @db.drops.must_equal [3333, 2222, 1111]
384
- @db.version.must_equal 0
385
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [2, 1, 0]
386
- end
387
-
388
- it "should correctly handle migration target versions beyond the upper and lower limits" do
389
- Sequel::Migrator.run(@db, @dirname, :target=>100).must_equal 3
390
- @db.creates.must_equal [1111, 2222, 3333]
391
- @db.version.must_equal 3
392
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [1, 2, 3]
393
-
394
- Sequel::Migrator.run(@db, @dirname, :target=>-100).must_equal 0
395
- @db.drops.must_equal [3333, 2222, 1111]
396
- @db.version.must_equal 0
397
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [2, 1, 0]
398
- end
399
-
400
- it "should apply migrations correctly in the up direction if no target is given" do
401
- Sequel::Migrator.apply(@db, @dirname)
402
- @db.creates.must_equal [1111, 2222, 3333]
403
- @db.version.must_equal 3
404
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [1, 2, 3]
405
- end
406
-
407
- it "should be able to tell whether there are outstanding migrations" do
408
- Sequel::Migrator.is_current?(@db, @dirname).must_equal false
409
- Sequel::Migrator.apply(@db, @dirname)
410
- Sequel::Migrator.is_current?(@db, @dirname).must_equal true
411
- end
412
-
413
- it "should have #check_current raise an exception if the migrator is not current" do
414
- proc{Sequel::Migrator.check_current(@db, @dirname)}.must_raise(Sequel::Migrator::NotCurrentError)
415
- Sequel::Migrator.apply(@db, @dirname)
416
- Sequel::Migrator.check_current(@db, @dirname)
417
- end
418
-
419
- it "should apply migrations correctly in the up direction with target" do
420
- Sequel::Migrator.apply(@db, @dirname, 2)
421
- @db.creates.must_equal [1111, 2222]
422
- @db.version.must_equal 2
423
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [1, 2]
424
- end
425
-
426
- it "should apply migrations correctly in the up direction with target and existing" do
427
- Sequel::Migrator.apply(@db, @dirname, 2, 1)
428
- @db.creates.must_equal [2222]
429
- @db.version.must_equal 2
430
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [2]
431
- end
432
-
433
- it "should apply migrations correctly in the down direction with target" do
434
- @db.create_table(:schema_info){Integer :version, :default=>0}
435
- @db[:schema_info].insert(:version=>3)
436
- @db.version.must_equal 3
437
- Sequel::Migrator.apply(@db, @dirname, 0)
438
- @db.drops.must_equal [3333, 2222, 1111]
439
- @db.version.must_equal 0
440
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [2, 1, 0]
441
- end
442
-
443
- it "should apply migrations correctly in the down direction with target and existing" do
444
- Sequel::Migrator.apply(@db, @dirname, 1, 2)
445
- @db.drops.must_equal [2222]
446
- @db.version.must_equal 1
447
- @db.sqls.map{|x| x =~ /\AUPDATE.*(\d+)/ ? $1.to_i : nil}.compact.must_equal [1]
448
- end
449
-
450
- it "should return the target version" do
451
- Sequel::Migrator.apply(@db, @dirname, 3, 2).must_equal 3
452
- Sequel::Migrator.apply(@db, @dirname, 0).must_equal 0
453
- Sequel::Migrator.apply(@db, @dirname).must_equal 3
454
- end
455
-
456
- it "should use IntegerMigrator if IntegerMigrator.apply called, even for timestamped migration directory" do
457
- proc{Sequel::IntegerMigrator.apply(@db, "spec/files/timestamped_migrations")}.must_raise(Sequel::Migrator::Error)
458
- end
459
-
460
- it "should not use transactions by default" do
461
- Sequel::Migrator.apply(@db, "spec/files/transaction_unspecified_migrations")
462
- @db.sqls.must_equal ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
463
- end
464
-
465
- it "should use transactions by default if the database supports transactional ddl" do
466
- def @db.supports_transactional_ddl?; true end
467
- Sequel::Migrator.apply(@db, "spec/files/transaction_unspecified_migrations")
468
- @db.sqls.must_equal ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2", "COMMIT"]
469
- end
470
-
471
- it "should respect transaction use on a per migration basis" do
472
- def @db.supports_transactional_ddl?; true end
473
- Sequel::Migrator.apply(@db, "spec/files/transaction_specified_migrations")
474
- @db.sqls.must_equal ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
475
- end
476
-
477
- it "should force transactions if enabled in the migrator" do
478
- Sequel::Migrator.run(@db, "spec/files/transaction_specified_migrations", :use_transactions=>true)
479
- @db.sqls.must_equal ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2", "COMMIT"]
480
- end
481
-
482
- it "should not use transactions if disabled in the migrator" do
483
- Sequel::Migrator.run(@db, "spec/files/transaction_unspecified_migrations", :use_transactions=>false)
484
- @db.sqls.must_equal ["CREATE TABLE schema_info (version integer DEFAULT 0 NOT NULL)", "SELECT 1 AS one FROM schema_info LIMIT 1", "INSERT INTO schema_info (version) VALUES (0)", "SELECT version FROM schema_info LIMIT 1", "CREATE TABLE sm11111 (smc1 integer)", "UPDATE schema_info SET version = 1", "CREATE TABLE sm (smc1 integer)", "UPDATE schema_info SET version = 2"]
485
- end
486
- end
487
-
488
- describe "Sequel::TimestampMigrator" do
489
- before do
490
- @dsc = dsc = Class.new(Sequel::Mock::Dataset) do
491
- def files
492
- db.files
493
- end
494
-
495
- def columns
496
- super
497
- case opts[:from].first
498
- when :schema_info, 'schema_info'
499
- [:version]
500
- when :schema_migrations, 'schema_migrations'
501
- [:filename]
502
- when :sm, 'sm'
503
- [:fn]
504
- end
505
- end
506
-
507
- def fetch_rows(sql)
508
- super
509
- case opts[:from].first
510
- when :schema_info, 'schema_info'
511
- yield({:version=>db.sequel_migration_version})
512
- when :schema_migrations, 'schema_migrations'
513
- files.sort.each{|f| yield(:filename=>f)}
514
- when :sm, 'sm'
515
- files.sort.each{|f| yield(:fn=>f)}
516
- end
517
- end
518
-
519
- def insert(h={})
520
- super
521
- case opts[:from].first
522
- when :schema_info, 'schema_info'
523
- db.sequel_migration_version = h.values.first
524
- when :schema_migrations, :sm, 'schema_migrations', 'sm'
525
- files << h.values.first
526
- end
527
- end
528
-
529
- def update(h={})
530
- super
531
- case opts[:from].first
532
- when :schema_info, 'schema_info'
533
- db.sequel_migration_version = h.values.first
534
- end
535
- end
536
-
537
- def delete
538
- super
539
- case opts[:from].first
540
- when :schema_migrations, :sm, 'schema_migrations', 'sm'
541
- files.delete(opts[:where].args.last)
542
- end
543
- end
544
- end
545
- dbc = Class.new(Sequel::Mock::Database) do
546
- def files
547
- @files ||= []
548
- end
549
-
550
- def tables
551
- @tables ||= {}
552
- end
553
-
554
- def sequel_migration_version
555
- @sequel_migration_version ||= 0
556
- end
557
- attr_writer :sequel_migration_version
558
-
559
- def create_table(name, *args, &block)
560
- super
561
- tables[name.to_sym] = true
562
- end
563
- define_method(:drop_table){|*names| super(*names); names.each{|n| tables.delete(n.to_sym)}}
564
- define_method(:table_exists?){|name| super(name); tables.has_key?(name.to_sym)}
565
- end
566
- @db = dbc.new
567
- @db.dataset_class = dsc
568
- @m = Sequel::Migrator
569
- end
570
-
571
- after do
572
- Object.send(:remove_const, "CreateSessions") if Object.const_defined?("CreateSessions")
573
- Object.send(:remove_const, "CreateArtists") if Object.const_defined?("CreateArtists")
574
- Object.send(:remove_const, "CreateAlbums") if Object.const_defined?("CreateAlbums")
575
- end
576
-
577
- it "should raise an error if there is an empty migration file" do
578
- proc{Sequel::TimestampMigrator.apply(@db, "spec/files/empty_migration")}.must_raise(Sequel::Migrator::Error)
579
- end
580
-
581
- it "should raise an error if there is a migration file with multiple migrations" do
582
- proc{Sequel::TimestampMigrator.apply(@db, "spec/files/double_migration")}.must_raise(Sequel::Migrator::Error)
583
- end
584
-
585
- it "should handle migrating up or down all the way" do
586
- @dir = 'spec/files/timestamped_migrations'
587
- @m.apply(@db, @dir)
588
- [:schema_migrations, :sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
589
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb 1273253853_3_create_users.rb'
590
- @m.apply(@db, @dir, 0)
591
- [:sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal false}
592
- @db[:schema_migrations].select_order_map(:filename).must_equal []
593
- end
594
-
595
- it "should handle migrating up or down to specific timestamps" do
596
- @dir = 'spec/files/timestamped_migrations'
597
- @m.apply(@db, @dir, 1273253851)
598
- [:schema_migrations, :sm1111, :sm2222].each{|n| @db.table_exists?(n).must_equal true}
599
- @db.table_exists?(:sm3333).must_equal false
600
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb'
601
- @m.apply(@db, @dir, 1273253849)
602
- [:sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal false}
603
- @db.table_exists?(:sm1111).must_equal true
604
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb'
605
- end
606
-
607
- it "should work correctly when multithreaded" do
608
- range = 0..4
609
- dbs = range.map do
610
- db = @db.class.new
611
- db.dataset_class = @db.dataset_class
612
- db
613
- end
614
-
615
- q1, q2 = Queue.new, Queue.new
616
- @dir = 'spec/files/timestamped_migrations'
617
- threads = dbs.map do |db|
618
- Thread.new do
619
- q1.pop
620
- @m.apply(db, @dir)
621
- [:schema_migrations, :sm1111, :sm2222, :sm3333].each{|n| _(db.table_exists?(n)).must_equal true}
622
- _(db[:schema_migrations].select_order_map(:filename)).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb 1273253853_3_create_users.rb'
623
- q2.push db
624
- end
625
- end
626
-
627
- range.each{q1.push nil}
628
- (dbs - range.map{q2.pop}).must_be :empty?
629
- threads.each(&:join)
630
- end
631
-
632
- it "should not be current when there are migrations to apply" do
633
- @dir = 'spec/files/timestamped_migrations'
634
- @m.apply(@db, @dir)
635
- @m.is_current?(@db, @dir).must_equal true
636
- @dir = 'spec/files/interleaved_timestamped_migrations'
637
- @m.is_current?(@db, @dir).must_equal false
638
- end
639
-
640
- it "should raise an exception if the migrator is not current" do
641
- @dir = 'spec/files/timestamped_migrations'
642
- @m.apply(@db, @dir)
643
- @m.check_current(@db, @dir)
644
- @dir = 'spec/files/interleaved_timestamped_migrations'
645
- proc{@m.check_current(@db, @dir)}.must_raise(Sequel::Migrator::NotCurrentError)
646
- end
647
-
648
- it "should apply all missing files when migrating up" do
649
- @dir = 'spec/files/timestamped_migrations'
650
- @m.apply(@db, @dir)
651
- @dir = 'spec/files/interleaved_timestamped_migrations'
652
- @m.apply(@db, @dir)
653
- [:schema_migrations, :sm1111, :sm1122, :sm2222, :sm2233, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
654
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253850_create_artists.rb 1273253851_create_nodes.rb 1273253852_create_albums.rb 1273253853_3_create_users.rb'
655
- end
656
-
657
- it "should not apply down action to migrations where up action hasn't been applied" do
658
- @dir = 'spec/files/timestamped_migrations'
659
- @m.apply(@db, @dir)
660
- @dir = 'spec/files/interleaved_timestamped_migrations'
661
- @m.apply(@db, @dir, 0)
662
- [:sm1111, :sm1122, :sm2222, :sm2233, :sm3333].each{|n| @db.table_exists?(n).must_equal false}
663
- @db[:schema_migrations].select_order_map(:filename).must_equal []
664
- end
665
-
666
- it "should handle updating to a specific timestamp when interleaving migrations" do
667
- @dir = 'spec/files/timestamped_migrations'
668
- @m.apply(@db, @dir)
669
- @dir = 'spec/files/interleaved_timestamped_migrations'
670
- @m.apply(@db, @dir, 1273253851)
671
- [:schema_migrations, :sm1111, :sm1122, :sm2222].each{|n| @db.table_exists?(n).must_equal true}
672
- [:sm2233, :sm3333].each{|n| @db.table_exists?(n).must_equal false}
673
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253850_create_artists.rb 1273253851_create_nodes.rb'
674
- end
675
-
676
- it "should correctly update schema_migrations table when an error occurs when migrating up or down" do
677
- @dir = 'spec/files/bad_timestamped_migrations'
678
- proc{@m.apply(@db, @dir)}.must_raise NoMethodError
679
- [:schema_migrations, :sm1111, :sm2222].each{|n| @db.table_exists?(n).must_equal true}
680
- @db.table_exists?(:sm3333).must_equal false
681
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb'
682
- proc{@m.apply(@db, @dir, 0)}.must_raise NoMethodError
683
- [:sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal false}
684
- @db.table_exists?(:sm1111).must_equal true
685
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb'
686
- end
687
-
688
- it "should handle multiple migrations with the same timestamp correctly" do
689
- @dir = 'spec/files/duplicate_timestamped_migrations'
690
- @m.apply(@db, @dir)
691
- [:schema_migrations, :sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
692
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253853_create_nodes.rb 1273253853_create_users.rb'
693
- @m.apply(@db, @dir, 1273253853)
694
- [:sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
695
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253853_create_nodes.rb 1273253853_create_users.rb'
696
- @m.apply(@db, @dir, 1273253849)
697
- [:sm1111].each{|n| @db.table_exists?(n).must_equal true}
698
- [:sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal false}
699
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb'
700
- @m.apply(@db, @dir, 1273253848)
701
- [:sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal false}
702
- @db[:schema_migrations].select_order_map(:filename).must_equal []
703
- end
704
-
705
- it "should convert schema_info table to schema_migrations table" do
706
- @dir = 'spec/files/integer_migrations'
707
- @m.apply(@db, @dir)
708
- [:schema_info, :sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
709
- [:schema_migrations, :sm1122, :sm2233].each{|n| @db.table_exists?(n).must_equal false}
710
-
711
- @dir = 'spec/files/convert_to_timestamp_migrations'
712
- @m.apply(@db, @dir)
713
- [:schema_info, :sm1111, :sm2222, :sm3333, :schema_migrations, :sm1122, :sm2233].each{|n| @db.table_exists?(n).must_equal true}
714
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'001_create_sessions.rb 002_create_nodes.rb 003_3_create_users.rb 1273253850_create_artists.rb 1273253852_create_albums.rb'
715
-
716
- @m.apply(@db, @dir, 4)
717
- [:schema_info, :schema_migrations, :sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
718
- [:sm1122, :sm2233].each{|n| @db.table_exists?(n).must_equal false}
719
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'001_create_sessions.rb 002_create_nodes.rb 003_3_create_users.rb'
720
-
721
- @m.apply(@db, @dir, 0)
722
- [:schema_info, :schema_migrations].each{|n| @db.table_exists?(n).must_equal true}
723
- [:sm1111, :sm2222, :sm3333, :sm1122, :sm2233].each{|n| @db.table_exists?(n).must_equal false}
724
- @db[:schema_migrations].select_order_map(:filename).must_equal []
725
- end
726
-
727
- it "should handle unapplied migrations when migrating schema_info table to schema_migrations table" do
728
- @dir = 'spec/files/integer_migrations'
729
- @m.apply(@db, @dir, 2)
730
- [:schema_info, :sm1111, :sm2222].each{|n| @db.table_exists?(n).must_equal true}
731
- [:schema_migrations, :sm3333, :sm1122, :sm2233].each{|n| @db.table_exists?(n).must_equal false}
732
-
733
- @dir = 'spec/files/convert_to_timestamp_migrations'
734
- @m.apply(@db, @dir, 1273253850)
735
- [:schema_info, :sm1111, :sm2222, :sm3333, :schema_migrations, :sm1122].each{|n| @db.table_exists?(n).must_equal true}
736
- [:sm2233].each{|n| @db.table_exists?(n).must_equal false}
737
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'001_create_sessions.rb 002_create_nodes.rb 003_3_create_users.rb 1273253850_create_artists.rb'
738
- end
739
-
740
- it "should handle unapplied migrations when migrating schema_info table to schema_migrations table and target is less than last integer migration version" do
741
- @dir = 'spec/files/integer_migrations'
742
- @m.apply(@db, @dir, 1)
743
- [:schema_info, :sm1111].each{|n| @db.table_exists?(n).must_equal true}
744
- [:schema_migrations, :sm2222, :sm3333, :sm1122, :sm2233].each{|n| @db.table_exists?(n).must_equal false}
745
-
746
- @dir = 'spec/files/convert_to_timestamp_migrations'
747
- @m.apply(@db, @dir, 2)
748
- [:schema_info, :sm1111, :sm2222, :schema_migrations].each{|n| @db.table_exists?(n).must_equal true}
749
- [:sm3333, :sm1122, :sm2233].each{|n| @db.table_exists?(n).must_equal false}
750
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'001_create_sessions.rb 002_create_nodes.rb'
751
-
752
- @m.apply(@db, @dir)
753
- [:schema_info, :sm1111, :sm2222, :schema_migrations, :sm3333, :sm1122, :sm2233].each{|n| @db.table_exists?(n).must_equal true}
754
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'001_create_sessions.rb 002_create_nodes.rb 003_3_create_users.rb 1273253850_create_artists.rb 1273253852_create_albums.rb'
755
- end
756
-
757
- it "should raise error for applied migrations not in file system" do
758
- @dir = 'spec/files/timestamped_migrations'
759
- @m.apply(@db, @dir)
760
- [:schema_migrations, :sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
761
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb 1273253853_3_create_users.rb'
762
-
763
- @dir = 'spec/files/missing_timestamped_migrations'
764
- proc{@m.apply(@db, @dir, 0)}.must_raise(Sequel::Migrator::Error)
765
- [:schema_migrations, :sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
766
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb 1273253853_3_create_users.rb'
767
- end
768
-
769
- it "should not raise error for applied migrations not in file system if :allow_missing_migration_files is true" do
770
- @dir = 'spec/files/timestamped_migrations'
771
- @m.apply(@db, @dir)
772
- [:schema_migrations, :sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
773
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb 1273253853_3_create_users.rb'
774
-
775
- @dir = 'spec/files/missing_timestamped_migrations'
776
- @m.run(@db, @dir, :allow_missing_migration_files => true)
777
- [:schema_migrations, :sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
778
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb 1273253853_3_create_users.rb'
779
- end
780
-
781
- it "should raise error missing column name in existing schema_migrations table" do
782
- @dir = 'spec/files/timestamped_migrations'
783
- @m.apply(@db, @dir)
784
- proc{@m.run(@db, @dir, :column=>:fn)}.must_raise(Sequel::Migrator::Error)
785
- end
786
-
787
- it "should handle migration filenames in a case insensitive manner" do
788
- @dir = 'spec/files/uppercase_timestamped_migrations'
789
- @m.apply(@db, @dir)
790
- [:schema_migrations, :sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
791
- @db[:schema_migrations].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb 1273253853_3_create_users.rb'
792
- @dir = 'spec/files/timestamped_migrations'
793
- @m.apply(@db, @dir, 0)
794
- [:sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal false}
795
- @db[:schema_migrations].select_order_map(:filename).must_equal []
796
- end
797
-
798
- it "should :table and :column options" do
799
- @dir = 'spec/files/timestamped_migrations'
800
- @m.run(@db, @dir, :table=>:sm, :column=>:fn)
801
- [:sm, :sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal true}
802
- @db[:sm].select_order_map(:filename).must_equal %w'1273253849_create_sessions.rb 1273253851_create_nodes.rb 1273253853_3_create_users.rb'
803
- @m.run(@db, @dir, :target=>0, :table=>:sm, :column=>:fn)
804
- [:sm1111, :sm2222, :sm3333].each{|n| @db.table_exists?(n).must_equal false}
805
- @db[:sm].select_order_map(:fn).must_equal []
806
- end
807
-
808
- it "should return nil" do
809
- @dir = 'spec/files/timestamped_migrations'
810
- @m.apply(@db, @dir, 1273253850).must_be_nil
811
- @m.apply(@db, @dir, 0).must_be_nil
812
- @m.apply(@db, @dir).must_be_nil
813
- end
814
-
815
- it "should use TimestampMigrator if TimestampMigrator.apply is called even for integer migrations directory" do
816
- Sequel::TimestampMigrator.apply(@db, "spec/files/integer_migrations")
817
- @db.sqls.must_equal ["SELECT NULL AS nil FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL AS nil FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm1111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_sessions.rb')", "CREATE TABLE sm2222 (smc2 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_nodes.rb')", "CREATE TABLE sm3333 (smc3 integer)", "INSERT INTO schema_migrations (filename) VALUES ('003_3_create_users.rb')"]
818
- end
819
-
820
- it "should not use transactions by default" do
821
- Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_unspecified_migrations")
822
- @db.sqls.must_equal ["SELECT NULL AS nil FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL AS nil FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
823
- end
824
-
825
- it "should use transactions by default if database supports transactional ddl" do
826
- def @db.supports_transactional_ddl?; true end
827
- Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_unspecified_migrations")
828
- @db.sqls.must_equal ["SELECT NULL AS nil FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL AS nil FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')", "COMMIT"]
829
- end
830
-
831
- it "should support transaction use on a per migration basis" do
832
- Sequel::TimestampMigrator.apply(@db, "spec/files/transaction_specified_migrations")
833
- @db.sqls.must_equal ["SELECT NULL AS nil FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL AS nil FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
834
- end
835
-
836
- it "should force transactions if enabled by the migrator" do
837
- Sequel::TimestampMigrator.run(@db, "spec/files/transaction_specified_migrations", :use_transactions=>true)
838
- @db.sqls.must_equal ["SELECT NULL AS nil FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL AS nil FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "BEGIN", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "COMMIT", "BEGIN", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')", "COMMIT"]
839
- end
840
-
841
- it "should not use transactions if disabled in the migrator" do
842
- Sequel::TimestampMigrator.run(@db, "spec/files/transaction_unspecified_migrations", :use_transactions=>false)
843
- @db.sqls.must_equal ["SELECT NULL AS nil FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "SELECT NULL AS nil FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
844
- end
845
-
846
- it "should use shorter primary key field on MySQL if creating schema migrations table fails" do
847
- def @db.database_type; :mysql end
848
- def @db.execute_ddl(sql, *)
849
- super
850
- raise Sequel::DatabaseError, "Specified key was too long; max key length is 767 bytes" if sql =~ /varchar\(255\)/
851
- end
852
- Sequel::TimestampMigrator.run(@db, "spec/files/transaction_unspecified_migrations", :use_transactions=>false)
853
- @db.sqls.must_equal ["SELECT NULL AS nil FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)", "CREATE TABLE schema_migrations (filename varchar(190) PRIMARY KEY)", "SELECT NULL AS nil FROM schema_info LIMIT 1", "SELECT filename FROM schema_migrations ORDER BY filename", "CREATE TABLE sm11111 (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('001_create_alt_basic.rb')", "CREATE TABLE sm (smc1 integer)", "INSERT INTO schema_migrations (filename) VALUES ('002_create_basic.rb')"]
854
- end
855
-
856
- it "should not use shorter primary key field on other databases if creating schema migrations table fails" do
857
- def @db.execute_ddl(sql, *)
858
- super
859
- raise Sequel::DatabaseError, "Specified key was too long; max key length is 767 bytes" if sql =~ /varchar\(255\)/
860
- end
861
- proc{Sequel::TimestampMigrator.run(@db, "spec/files/transaction_unspecified_migrations", :use_transactions=>false)}.must_raise Sequel::DatabaseError
862
- @db.sqls.must_equal ["SELECT NULL AS nil FROM schema_migrations LIMIT 1", "CREATE TABLE schema_migrations (filename varchar(255) PRIMARY KEY)"]
863
- end
864
- end