sequel 5.28.0 → 5.33.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 (380) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +64 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +3 -3
  7. data/doc/code_order.rdoc +12 -2
  8. data/doc/model_dataset_method_design.rdoc +1 -1
  9. data/doc/postgresql.rdoc +71 -0
  10. data/doc/release_notes/5.29.0.txt +22 -0
  11. data/doc/release_notes/5.30.0.txt +20 -0
  12. data/doc/release_notes/5.31.0.txt +148 -0
  13. data/doc/release_notes/5.32.0.txt +46 -0
  14. data/doc/release_notes/5.33.0.txt +24 -0
  15. data/doc/testing.rdoc +1 -1
  16. data/lib/sequel/adapters/postgres.rb +5 -1
  17. data/lib/sequel/adapters/shared/access.rb +6 -6
  18. data/lib/sequel/adapters/shared/mssql.rb +5 -5
  19. data/lib/sequel/adapters/shared/mysql.rb +10 -10
  20. data/lib/sequel/adapters/shared/oracle.rb +16 -16
  21. data/lib/sequel/adapters/shared/postgres.rb +169 -14
  22. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  23. data/lib/sequel/adapters/shared/sqlite.rb +32 -5
  24. data/lib/sequel/adapters/tinytds.rb +1 -1
  25. data/lib/sequel/connection_pool/sharded_threaded.rb +2 -2
  26. data/lib/sequel/connection_pool/threaded.rb +1 -1
  27. data/lib/sequel/core.rb +318 -314
  28. data/lib/sequel/database/query.rb +1 -1
  29. data/lib/sequel/database/schema_generator.rb +1 -1
  30. data/lib/sequel/database/transactions.rb +8 -12
  31. data/lib/sequel/dataset/misc.rb +2 -2
  32. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  33. data/lib/sequel/extensions/connection_validator.rb +2 -2
  34. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  35. data/lib/sequel/extensions/index_caching.rb +9 -7
  36. data/lib/sequel/extensions/integer64.rb +2 -0
  37. data/lib/sequel/extensions/migration.rb +1 -1
  38. data/lib/sequel/extensions/pg_enum.rb +5 -2
  39. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  40. data/lib/sequel/extensions/pg_inet.rb +13 -5
  41. data/lib/sequel/extensions/pg_interval.rb +2 -0
  42. data/lib/sequel/extensions/pg_range.rb +2 -0
  43. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  44. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  45. data/lib/sequel/extensions/schema_dumper.rb +10 -4
  46. data/lib/sequel/extensions/server_block.rb +3 -3
  47. data/lib/sequel/model/associations.rb +18 -5
  48. data/lib/sequel/model/base.rb +60 -53
  49. data/lib/sequel/model/plugins.rb +1 -0
  50. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  51. data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
  52. data/lib/sequel/plugins/association_proxies.rb +2 -0
  53. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  54. data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
  55. data/lib/sequel/plugins/dirty.rb +13 -13
  56. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  57. data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
  58. data/lib/sequel/plugins/json_serializer.rb +18 -11
  59. data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
  60. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  61. data/lib/sequel/plugins/subclasses.rb +2 -0
  62. data/lib/sequel/plugins/throw_failures.rb +1 -1
  63. data/lib/sequel/timezones.rb +6 -4
  64. data/lib/sequel/version.rb +1 -1
  65. metadata +18 -367
  66. data/Rakefile +0 -151
  67. data/doc/release_notes/4.0.0.txt +0 -262
  68. data/doc/release_notes/4.1.0.txt +0 -85
  69. data/doc/release_notes/4.10.0.txt +0 -226
  70. data/doc/release_notes/4.11.0.txt +0 -147
  71. data/doc/release_notes/4.12.0.txt +0 -105
  72. data/doc/release_notes/4.13.0.txt +0 -169
  73. data/doc/release_notes/4.14.0.txt +0 -68
  74. data/doc/release_notes/4.15.0.txt +0 -56
  75. data/doc/release_notes/4.16.0.txt +0 -36
  76. data/doc/release_notes/4.17.0.txt +0 -38
  77. data/doc/release_notes/4.18.0.txt +0 -36
  78. data/doc/release_notes/4.19.0.txt +0 -45
  79. data/doc/release_notes/4.2.0.txt +0 -129
  80. data/doc/release_notes/4.20.0.txt +0 -79
  81. data/doc/release_notes/4.21.0.txt +0 -94
  82. data/doc/release_notes/4.22.0.txt +0 -72
  83. data/doc/release_notes/4.23.0.txt +0 -65
  84. data/doc/release_notes/4.24.0.txt +0 -99
  85. data/doc/release_notes/4.25.0.txt +0 -181
  86. data/doc/release_notes/4.26.0.txt +0 -44
  87. data/doc/release_notes/4.27.0.txt +0 -78
  88. data/doc/release_notes/4.28.0.txt +0 -57
  89. data/doc/release_notes/4.29.0.txt +0 -41
  90. data/doc/release_notes/4.3.0.txt +0 -40
  91. data/doc/release_notes/4.30.0.txt +0 -37
  92. data/doc/release_notes/4.31.0.txt +0 -57
  93. data/doc/release_notes/4.32.0.txt +0 -132
  94. data/doc/release_notes/4.33.0.txt +0 -88
  95. data/doc/release_notes/4.34.0.txt +0 -86
  96. data/doc/release_notes/4.35.0.txt +0 -130
  97. data/doc/release_notes/4.36.0.txt +0 -116
  98. data/doc/release_notes/4.37.0.txt +0 -50
  99. data/doc/release_notes/4.38.0.txt +0 -67
  100. data/doc/release_notes/4.39.0.txt +0 -127
  101. data/doc/release_notes/4.4.0.txt +0 -92
  102. data/doc/release_notes/4.40.0.txt +0 -179
  103. data/doc/release_notes/4.41.0.txt +0 -77
  104. data/doc/release_notes/4.42.0.txt +0 -221
  105. data/doc/release_notes/4.43.0.txt +0 -87
  106. data/doc/release_notes/4.44.0.txt +0 -125
  107. data/doc/release_notes/4.45.0.txt +0 -370
  108. data/doc/release_notes/4.46.0.txt +0 -404
  109. data/doc/release_notes/4.47.0.txt +0 -56
  110. data/doc/release_notes/4.48.0.txt +0 -293
  111. data/doc/release_notes/4.49.0.txt +0 -222
  112. data/doc/release_notes/4.5.0.txt +0 -34
  113. data/doc/release_notes/4.6.0.txt +0 -30
  114. data/doc/release_notes/4.7.0.txt +0 -103
  115. data/doc/release_notes/4.8.0.txt +0 -175
  116. data/doc/release_notes/4.9.0.txt +0 -190
  117. data/spec/adapter_spec.rb +0 -4
  118. data/spec/adapters/db2_spec.rb +0 -170
  119. data/spec/adapters/mssql_spec.rb +0 -828
  120. data/spec/adapters/mysql_spec.rb +0 -1060
  121. data/spec/adapters/oracle_spec.rb +0 -371
  122. data/spec/adapters/postgres_spec.rb +0 -4476
  123. data/spec/adapters/spec_helper.rb +0 -44
  124. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  125. data/spec/adapters/sqlite_spec.rb +0 -652
  126. data/spec/bin_spec.rb +0 -278
  127. data/spec/core/connection_pool_spec.rb +0 -1250
  128. data/spec/core/database_spec.rb +0 -2915
  129. data/spec/core/dataset_spec.rb +0 -5547
  130. data/spec/core/deprecated_spec.rb +0 -70
  131. data/spec/core/expression_filters_spec.rb +0 -1498
  132. data/spec/core/mock_adapter_spec.rb +0 -722
  133. data/spec/core/object_graph_spec.rb +0 -336
  134. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  135. data/spec/core/schema_generator_spec.rb +0 -214
  136. data/spec/core/schema_spec.rb +0 -1844
  137. data/spec/core/spec_helper.rb +0 -24
  138. data/spec/core/version_spec.rb +0 -14
  139. data/spec/core_extensions_spec.rb +0 -763
  140. data/spec/core_model_spec.rb +0 -2
  141. data/spec/core_spec.rb +0 -1
  142. data/spec/deprecation_helper.rb +0 -30
  143. data/spec/extensions/accessed_columns_spec.rb +0 -51
  144. data/spec/extensions/active_model_spec.rb +0 -99
  145. data/spec/extensions/after_initialize_spec.rb +0 -28
  146. data/spec/extensions/any_not_empty_spec.rb +0 -23
  147. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  148. data/spec/extensions/association_dependencies_spec.rb +0 -125
  149. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  150. data/spec/extensions/association_pks_spec.rb +0 -423
  151. data/spec/extensions/association_proxies_spec.rb +0 -100
  152. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  153. data/spec/extensions/auto_validations_spec.rb +0 -229
  154. data/spec/extensions/blacklist_security_spec.rb +0 -95
  155. data/spec/extensions/blank_spec.rb +0 -69
  156. data/spec/extensions/boolean_readers_spec.rb +0 -93
  157. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  158. data/spec/extensions/caching_spec.rb +0 -273
  159. data/spec/extensions/caller_logging_spec.rb +0 -52
  160. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  161. data/spec/extensions/column_conflicts_spec.rb +0 -75
  162. data/spec/extensions/column_select_spec.rb +0 -129
  163. data/spec/extensions/columns_introspection_spec.rb +0 -90
  164. data/spec/extensions/columns_updated_spec.rb +0 -35
  165. data/spec/extensions/composition_spec.rb +0 -248
  166. data/spec/extensions/connection_expiration_spec.rb +0 -151
  167. data/spec/extensions/connection_validator_spec.rb +0 -144
  168. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  169. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  170. data/spec/extensions/constraint_validations_spec.rb +0 -439
  171. data/spec/extensions/core_refinements_spec.rb +0 -528
  172. data/spec/extensions/csv_serializer_spec.rb +0 -183
  173. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  174. data/spec/extensions/dataset_associations_spec.rb +0 -365
  175. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  176. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  177. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  178. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  179. data/spec/extensions/defaults_setter_spec.rb +0 -150
  180. data/spec/extensions/delay_add_association_spec.rb +0 -73
  181. data/spec/extensions/dirty_spec.rb +0 -222
  182. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  183. data/spec/extensions/eager_each_spec.rb +0 -62
  184. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  185. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  186. data/spec/extensions/error_splitter_spec.rb +0 -18
  187. data/spec/extensions/error_sql_spec.rb +0 -20
  188. data/spec/extensions/escaped_like_spec.rb +0 -40
  189. data/spec/extensions/eval_inspect_spec.rb +0 -81
  190. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  191. data/spec/extensions/finder_spec.rb +0 -260
  192. data/spec/extensions/force_encoding_spec.rb +0 -126
  193. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  194. data/spec/extensions/graph_each_spec.rb +0 -113
  195. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  196. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  197. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  198. data/spec/extensions/index_caching_spec.rb +0 -66
  199. data/spec/extensions/inflector_spec.rb +0 -183
  200. data/spec/extensions/input_transformer_spec.rb +0 -69
  201. data/spec/extensions/insert_conflict_spec.rb +0 -103
  202. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  203. data/spec/extensions/instance_filters_spec.rb +0 -79
  204. data/spec/extensions/instance_hooks_spec.rb +0 -246
  205. data/spec/extensions/integer64_spec.rb +0 -22
  206. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  207. data/spec/extensions/json_serializer_spec.rb +0 -336
  208. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  209. data/spec/extensions/list_spec.rb +0 -291
  210. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  211. data/spec/extensions/many_through_many_spec.rb +0 -2177
  212. data/spec/extensions/migration_spec.rb +0 -864
  213. data/spec/extensions/modification_detection_spec.rb +0 -93
  214. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  215. data/spec/extensions/named_timezones_spec.rb +0 -218
  216. data/spec/extensions/nested_attributes_spec.rb +0 -815
  217. data/spec/extensions/null_dataset_spec.rb +0 -85
  218. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  219. data/spec/extensions/pagination_spec.rb +0 -116
  220. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  221. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  222. data/spec/extensions/pg_array_spec.rb +0 -398
  223. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  224. data/spec/extensions/pg_enum_spec.rb +0 -118
  225. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  226. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  227. data/spec/extensions/pg_hstore_spec.rb +0 -219
  228. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  229. data/spec/extensions/pg_inet_spec.rb +0 -72
  230. data/spec/extensions/pg_interval_spec.rb +0 -103
  231. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  232. data/spec/extensions/pg_json_spec.rb +0 -451
  233. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  234. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  235. data/spec/extensions/pg_range_spec.rb +0 -600
  236. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  237. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  238. data/spec/extensions/pg_row_spec.rb +0 -363
  239. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  240. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  241. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  242. data/spec/extensions/prepared_statements_spec.rb +0 -177
  243. data/spec/extensions/pretty_table_spec.rb +0 -123
  244. data/spec/extensions/query_spec.rb +0 -94
  245. data/spec/extensions/rcte_tree_spec.rb +0 -387
  246. data/spec/extensions/round_timestamps_spec.rb +0 -39
  247. data/spec/extensions/s_spec.rb +0 -60
  248. data/spec/extensions/schema_caching_spec.rb +0 -64
  249. data/spec/extensions/schema_dumper_spec.rb +0 -870
  250. data/spec/extensions/select_remove_spec.rb +0 -38
  251. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  252. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  253. data/spec/extensions/serialization_spec.rb +0 -365
  254. data/spec/extensions/server_block_spec.rb +0 -135
  255. data/spec/extensions/server_logging_spec.rb +0 -45
  256. data/spec/extensions/sharding_spec.rb +0 -197
  257. data/spec/extensions/shared_caching_spec.rb +0 -151
  258. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  259. data/spec/extensions/singular_table_names_spec.rb +0 -22
  260. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  261. data/spec/extensions/spec_helper.rb +0 -70
  262. data/spec/extensions/split_array_nil_spec.rb +0 -24
  263. data/spec/extensions/split_values_spec.rb +0 -57
  264. data/spec/extensions/sql_comments_spec.rb +0 -33
  265. data/spec/extensions/sql_expr_spec.rb +0 -59
  266. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  267. data/spec/extensions/static_cache_spec.rb +0 -471
  268. data/spec/extensions/string_agg_spec.rb +0 -90
  269. data/spec/extensions/string_date_time_spec.rb +0 -95
  270. data/spec/extensions/string_stripper_spec.rb +0 -68
  271. data/spec/extensions/subclasses_spec.rb +0 -79
  272. data/spec/extensions/subset_conditions_spec.rb +0 -38
  273. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  274. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  275. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  276. data/spec/extensions/table_select_spec.rb +0 -83
  277. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  278. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  279. data/spec/extensions/throw_failures_spec.rb +0 -74
  280. data/spec/extensions/timestamps_spec.rb +0 -209
  281. data/spec/extensions/to_dot_spec.rb +0 -153
  282. data/spec/extensions/touch_spec.rb +0 -226
  283. data/spec/extensions/tree_spec.rb +0 -334
  284. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  285. data/spec/extensions/unlimited_update_spec.rb +0 -21
  286. data/spec/extensions/update_or_create_spec.rb +0 -83
  287. data/spec/extensions/update_primary_key_spec.rb +0 -105
  288. data/spec/extensions/update_refresh_spec.rb +0 -59
  289. data/spec/extensions/uuid_spec.rb +0 -101
  290. data/spec/extensions/validate_associated_spec.rb +0 -52
  291. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  292. data/spec/extensions/validation_contexts_spec.rb +0 -31
  293. data/spec/extensions/validation_helpers_spec.rb +0 -525
  294. data/spec/extensions/whitelist_security_spec.rb +0 -157
  295. data/spec/extensions/xml_serializer_spec.rb +0 -213
  296. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  297. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  298. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  299. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  300. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  301. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  302. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  303. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  304. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  305. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  306. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  307. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  308. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  309. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  310. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  311. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  312. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  313. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  314. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  315. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  316. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  317. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  318. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  319. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  320. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  321. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  322. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  323. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  324. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  325. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  326. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  327. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  328. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  329. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  330. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  331. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  332. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  333. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  334. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  335. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  336. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  337. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  338. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  339. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  340. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  341. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  342. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  343. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  344. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  345. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  346. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  347. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  348. data/spec/guards_helper.rb +0 -59
  349. data/spec/integration/associations_test.rb +0 -2597
  350. data/spec/integration/database_test.rb +0 -113
  351. data/spec/integration/dataset_test.rb +0 -2037
  352. data/spec/integration/eager_loader_test.rb +0 -687
  353. data/spec/integration/migrator_test.rb +0 -262
  354. data/spec/integration/model_test.rb +0 -203
  355. data/spec/integration/plugin_test.rb +0 -2423
  356. data/spec/integration/prepared_statement_test.rb +0 -405
  357. data/spec/integration/schema_test.rb +0 -903
  358. data/spec/integration/spec_helper.rb +0 -71
  359. data/spec/integration/timezone_test.rb +0 -86
  360. data/spec/integration/transaction_test.rb +0 -603
  361. data/spec/integration/type_test.rb +0 -127
  362. data/spec/model/association_reflection_spec.rb +0 -803
  363. data/spec/model/associations_spec.rb +0 -4738
  364. data/spec/model/base_spec.rb +0 -875
  365. data/spec/model/class_dataset_methods_spec.rb +0 -146
  366. data/spec/model/dataset_methods_spec.rb +0 -198
  367. data/spec/model/eager_loading_spec.rb +0 -2377
  368. data/spec/model/hooks_spec.rb +0 -370
  369. data/spec/model/inflector_spec.rb +0 -26
  370. data/spec/model/model_spec.rb +0 -956
  371. data/spec/model/plugins_spec.rb +0 -429
  372. data/spec/model/record_spec.rb +0 -2118
  373. data/spec/model/spec_helper.rb +0 -46
  374. data/spec/model/validations_spec.rb +0 -220
  375. data/spec/model_no_assoc_spec.rb +0 -1
  376. data/spec/model_spec.rb +0 -1
  377. data/spec/plugin_spec.rb +0 -1
  378. data/spec/sequel_coverage.rb +0 -15
  379. data/spec/sequel_warning.rb +0 -4
  380. 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