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