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