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,39 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Dataset::RoundTimestamps" do
4
- before do
5
- @dataset = Sequel.mock.dataset.extension(:round_timestamps)
6
- end
7
-
8
- it "should round times properly for databases supporting microsecond precision" do
9
- @dataset.literal(Sequel::SQLTime.create(1, 2, 3, 499999.5)).must_equal "'01:02:03.500000'"
10
- @dataset.literal(Time.local(2010, 1, 2, 3, 4, 5.4999995)).must_equal "'2010-01-02 03:04:05.500000'"
11
- @dataset.literal(DateTime.new(2010, 1, 2, 3, 4, Rational(54999995, 10000000))).must_equal "'2010-01-02 03:04:05.500000'"
12
-
13
- @dataset.literal(Sequel::SQLTime.create(1, 2, 3, 499999.4)).must_equal "'01:02:03.499999'"
14
- @dataset.literal(Time.local(2010, 1, 2, 3, 4, 5.4999994)).must_equal "'2010-01-02 03:04:05.499999'"
15
- @dataset.literal(DateTime.new(2010, 1, 2, 3, 4, Rational(54999994, 10000000))).must_equal "'2010-01-02 03:04:05.499999'"
16
- end
17
-
18
- it "should round times properly for databases supporting millisecond precision" do
19
- @dataset = @dataset.with_extend{def timestamp_precision; 3 end}
20
- @dataset.literal(Sequel::SQLTime.create(1, 2, 3, 499500)).must_equal "'01:02:03.500'"
21
- @dataset.literal(Time.local(2010, 1, 2, 3, 4, 5.4995)).must_equal "'2010-01-02 03:04:05.500'"
22
- @dataset.literal(DateTime.new(2010, 1, 2, 3, 4, Rational(54995, 10000))).must_equal "'2010-01-02 03:04:05.500'"
23
-
24
- @dataset.literal(Sequel::SQLTime.create(1, 2, 3, 499499)).must_equal "'01:02:03.499'"
25
- @dataset.literal(Time.local(2010, 1, 2, 3, 4, 5.4994)).must_equal "'2010-01-02 03:04:05.499'"
26
- @dataset.literal(DateTime.new(2010, 1, 2, 3, 4, Rational(54994, 10000))).must_equal "'2010-01-02 03:04:05.499'"
27
- end
28
-
29
- it "should round times properly for databases supporting second precision" do
30
- @dataset = @dataset.with_extend{def supports_timestamp_usecs?; false end}
31
- @dataset.literal(Sequel::SQLTime.create(1, 2, 3, 500000)).must_equal "'01:02:04'"
32
- @dataset.literal(Time.local(2010, 1, 2, 3, 4, 5.5)).must_equal "'2010-01-02 03:04:06'"
33
- @dataset.literal(DateTime.new(2010, 1, 2, 3, 4, Rational(55, 10))).must_equal "'2010-01-02 03:04:06'"
34
-
35
- @dataset.literal(Sequel::SQLTime.create(1, 2, 3, 499999)).must_equal "'01:02:03'"
36
- @dataset.literal(Time.local(2010, 1, 2, 3, 4, 5.4999999)).must_equal "'2010-01-02 03:04:05'"
37
- @dataset.literal(DateTime.new(2010, 1, 2, 3, 4, Rational(54999999, 10000000))).must_equal "'2010-01-02 03:04:05'"
38
- end
39
- end
@@ -1,60 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :s
4
-
5
- describe "s extension as refinement" do
6
- include Sequel::S
7
-
8
- before do
9
- @db = Sequel.mock
10
- end
11
-
12
- it "S should be callable with different arguments" do
13
- @db.literal(S(:s) + 1).must_equal "(s + 1)"
14
- @db.literal(S('s') + '1').must_equal "('s' || '1')"
15
- @db.literal(~S([[:s, 1], [:z, 2]])).must_equal "((s != 1) OR (z != 2))"
16
- end
17
-
18
- it "S should be callable with blocks" do
19
- @db.literal(S{x + 1}).must_equal "(x + 1)"
20
- end
21
-
22
- it "S should raise an error if called with multiple objects" do
23
- proc{S(:x, 1)}.must_raise ArgumentError
24
- end
25
-
26
- it "S should raise an error if called with objects and block" do
27
- proc{S(:x){}}.must_raise Sequel::Error
28
- end
29
- end
30
-
31
-
32
- if (RUBY_VERSION >= '2.0.0' && RUBY_ENGINE == 'ruby') # || (RUBY_VERSION >= '2.3.0' && RUBY_ENGINE == 'jruby')
33
- using Sequel::S
34
-
35
- describe "s extension as refinement" do
36
- before do
37
- @db = Sequel.mock
38
- end
39
-
40
- it "S should be callable with different arguments" do
41
- @db.literal(S(:s) + 1).must_equal "(s + 1)"
42
- @db.literal(S('s') + '1').must_equal "('s' || '1')"
43
- @db.literal(~S([[:s, 1], [:z, 2]])).must_equal "((s != 1) OR (z != 2))"
44
- end
45
-
46
- it "S should be callable with blocks" do
47
- @db.literal(S{x + 1}).must_equal "(x + 1)"
48
- end
49
-
50
- it "S should raise an error if called with multiple objects" do
51
- proc{S(:x, 1)}.must_raise ArgumentError
52
- end
53
-
54
- it "S should raise an error if called with objects and block" do
55
- proc{S(:x){}}.must_raise Sequel::Error
56
- end
57
- end
58
- end
59
-
60
-
@@ -1,64 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "schema_caching extension" do
4
- before do
5
- @db = Sequel.mock.extension(:schema_caching)
6
- @schemas = {'"table"'=>[[:column, {:db_type=>"integer", :default=>"nextval('table_id_seq'::regclass)", :allow_null=>false, :primary_key=>true, :type=>:integer, :ruby_default=>nil}]]}
7
- @filename = "spec/files/test_schema_#$$.dump"
8
- @db.instance_variable_set(:@schemas, @schemas)
9
- end
10
- after do
11
- File.delete(@filename) if File.exist?(@filename)
12
- end
13
-
14
- it "Database#dump_schema_cache should dump cached schema to the given file" do
15
- File.exist?(@filename).must_equal false
16
- @db.dump_schema_cache(@filename)
17
- File.exist?(@filename).must_equal true
18
- File.size(@filename).must_be :>, 0
19
- end
20
-
21
- it "Database#dump_schema_cache/load_schema_cache should work with :callable_default values set in schema_post_process" do
22
- @schemas['"table"'][0][1][:callable_default] = lambda{1}
23
- @schemas['"table"'][0][1][:default] = 'call_1'
24
- @db.dump_schema_cache(@filename)
25
- db = Sequel.mock(:host=>'postgres').extension(:schema_caching)
26
- def db.schema_post_process(_)
27
- super.each{|_, c| c[:callable_default] = lambda{1} if c[:default] == 'call_1'}
28
- end
29
- db.load_schema_cache(@filename)
30
- db.schema(:table)[0][1][:callable_default].call.must_equal 1
31
- end
32
-
33
- it "Database#load_schema_cache should load cached schema from the given file dumped by #dump_schema_cache" do
34
- @db.dump_schema_cache(@filename)
35
- db = Sequel::Database.new.extension(:schema_caching)
36
- db.load_schema_cache(@filename)
37
- @db.instance_variable_get(:@schemas).must_equal @schemas
38
- end
39
-
40
- it "Database#load_schema_cache should have frozen string values in the schema caches" do
41
- @db.dump_schema_cache(@filename)
42
- db = Sequel.mock(:host=>'postgres').extension(:schema_caching)
43
- db.load_schema_cache(@filename)
44
- h = db.schema(:table)[0][1]
45
- h[:db_type].must_equal 'integer'
46
- h[:db_type].frozen?.must_equal true
47
- h[:default].must_equal "nextval('table_id_seq'::regclass)"
48
- h[:default].frozen?.must_equal true
49
- end
50
-
51
- it "Database#dump_schema_cache? should dump cached schema to the given file unless the file exists" do
52
- File.open(@filename, 'wb'){|f|}
53
- File.size(@filename).must_equal 0
54
- @db.dump_schema_cache?(@filename)
55
- File.size(@filename).must_equal 0
56
- end
57
-
58
- it "Database#load_schema_cache? should load cached schema from the given file if it exists" do
59
- db = Sequel::Database.new.extension(:schema_caching)
60
- File.exist?(@filename).must_equal false
61
- db.load_schema_cache?(@filename)
62
- db.instance_variable_get(:@schemas).must_equal({})
63
- end
64
- end
@@ -1,868 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Schema::CreateTableGenerator dump methods" do
4
- before do
5
- @d = Sequel::Database.new.extension(:schema_dumper)
6
- @g = Sequel::Schema::CreateTableGenerator
7
- end
8
-
9
- it "should allow the same table information to be converted to a string for evaling inside of another instance with the same result" do
10
- g = @g.new(@d) do
11
- Integer :a
12
- varchar :b
13
- column :dt, DateTime
14
- column :vc, :varchar
15
- primary_key :c
16
- foreign_key :d, :a
17
- foreign_key :e
18
- foreign_key [:d, :e], :name=>:cfk
19
- constraint :blah, "a=1"
20
- check :a=>1
21
- unique [:e]
22
- index :a
23
- index [:c, :e]
24
- index [:b, :c], :type=>:hash
25
- index [:d], :unique=>true
26
- spatial_index :a
27
- full_text_index [:b, :c]
28
- end
29
- g2 = @g.new(@d) do
30
- instance_eval(g.dump_columns, __FILE__, __LINE__)
31
- instance_eval(g.dump_constraints, __FILE__, __LINE__)
32
- instance_eval(g.dump_indexes, __FILE__, __LINE__)
33
- end
34
- g.columns.must_equal g2.columns
35
- g.constraints.must_equal g2.constraints
36
- g.indexes.must_equal g2.indexes
37
- end
38
-
39
- it "should respect :keep_order option to primary_key" do
40
- g = @g.new(@d) do
41
- Integer :a
42
- primary_key :c, :keep_order=>true
43
- end
44
- g2 = @g.new(@d) do
45
- instance_eval(g.dump_columns, __FILE__, __LINE__)
46
- end
47
- g.columns.must_equal g2.columns
48
- end
49
-
50
- it "should allow dumping indexes as separate add_index and drop_index methods" do
51
- g = @g.new(@d) do
52
- index :a
53
- index [:c, :e], :name=>:blah
54
- index [:b, :c], :unique=>true
55
- end
56
-
57
- g.dump_indexes(:add_index=>:t).must_equal((<<END_CODE).strip)
58
- add_index :t, [:a]
59
- add_index :t, [:c, :e], :name=>:blah
60
- add_index :t, [:b, :c], :unique=>true
61
- END_CODE
62
-
63
- g.dump_indexes(:drop_index=>:t).must_equal((<<END_CODE).strip)
64
- drop_index :t, [:b, :c], :unique=>true
65
- drop_index :t, [:c, :e], :name=>:blah
66
- drop_index :t, [:a]
67
- END_CODE
68
- end
69
-
70
- it "should raise an error if you try to dump a Generator that uses a constraint with a proc" do
71
- proc{@g.new(@d){check{a>1}}.dump_constraints}.must_raise(Sequel::Error)
72
- end
73
- end
74
-
75
- describe "Sequel::Database dump methods" do
76
- before do
77
- @d = Sequel::Database.new.extension(:schema_dumper)
78
- def @d.tables(o) o[:schema] ? [o[:schema]] : [:t1, :t2] end
79
- def @d.schema(t, *o)
80
- v = case t
81
- when :t1, 't__t1', Sequel.identifier(:t__t1)
82
- [[:c1, {:db_type=>'integer', :primary_key=>true, :auto_increment=>true, :allow_null=>false}],
83
- [:c2, {:db_type=>'varchar(20)', :allow_null=>true}]]
84
- when :t2
85
- [[:c1, {:db_type=>'integer', :primary_key=>true, :allow_null=>false}],
86
- [:c2, {:db_type=>'numeric', :primary_key=>true, :allow_null=>false}]]
87
- when :t3
88
- [[:c2, {:db_type=>'varchar(20)', :allow_null=>true}],
89
- [:c1, {:db_type=>'integer', :primary_key=>true, :auto_increment=>true, :allow_null=>false}]]
90
- when :t5
91
- [[:c1, {:db_type=>'blahblah', :allow_null=>true}]]
92
- end
93
-
94
- if o.first.is_a?(Hash) && o.first[:schema]
95
- v.last.last[:db_type] = o.first[:schema]
96
- end
97
-
98
- v
99
- end
100
- end
101
-
102
- it "should support dumping table with :schema option" do
103
- @d.dump_table_schema(:t1, :schema=>'varchar(15)').must_equal "create_table(:t1) do\n primary_key :c1\n String :c2, :size=>15\nend"
104
- end
105
-
106
- it "should support dumping table schemas as create_table method calls" do
107
- @d.dump_table_schema(:t1).must_equal "create_table(:t1) do\n primary_key :c1\n String :c2, :size=>20\nend"
108
- end
109
-
110
- it "should support dumping table schemas when given a string" do
111
- @d.dump_table_schema('t__t1').must_equal "create_table(\"t__t1\") do\n primary_key :c1\n String :c2, :size=>20\nend"
112
- end
113
-
114
- it "should support dumping table schemas when given an identifier" do
115
- @d.dump_table_schema(Sequel.identifier(:t__t1)).must_equal "create_table(Sequel::SQL::Identifier.new(:t__t1)) do\n primary_key :c1\n String :c2, :size=>20\nend"
116
- end
117
-
118
- it "should dump non-Integer primary key columns with explicit :type" do
119
- def @d.schema(*s) [[:c1, {:db_type=>'bigint', :primary_key=>true, :allow_null=>true, :auto_increment=>true}]] end
120
- @d.dump_table_schema(:t6).must_equal "create_table(:t6) do\n primary_key :c1, :type=>:Bignum\nend"
121
- end
122
-
123
- it "should dump non-Integer primary key columns with explicit :type when using :same_db=>true" do
124
- def @d.schema(*s) [[:c1, {:db_type=>'bigint', :primary_key=>true, :allow_null=>true, :auto_increment=>true}]] end
125
- @d.dump_table_schema(:t6, :same_db=>true).must_equal "create_table(:t6) do\n primary_key :c1, :type=>:Bignum\nend"
126
- end
127
-
128
- it "should dump auto incrementing primary keys with :keep_order option if they are not first" do
129
- @d.dump_table_schema(:t3).must_equal "create_table(:t3) do\n String :c2, :size=>20\n primary_key :c1, :keep_order=>true\nend"
130
- end
131
-
132
- it "should handle foreign keys" do
133
- def @d.schema(*s) [[:c1, {:db_type=>'integer', :allow_null=>true}]] end
134
- def @d.supports_foreign_key_parsing?; true end
135
- def @d.foreign_key_list(*s) [{:columns=>[:c1], :table=>:t2, :key=>[:c2]}] end
136
- @d.dump_table_schema(:t6).must_equal "create_table(:t6) do\n foreign_key :c1, :t2, :key=>[:c2]\nend"
137
- end
138
-
139
- it "should handle primary keys that are also foreign keys" do
140
- def @d.schema(*s) [[:c1, {:db_type=>'integer', :primary_key=>true, :allow_null=>true, :auto_increment=>true}]] end
141
- def @d.supports_foreign_key_parsing?; true end
142
- def @d.foreign_key_list(*s) [{:columns=>[:c1], :table=>:t2, :key=>[:c2]}] end
143
- @d.dump_table_schema(:t6).must_equal((<<OUTPUT).chomp)
144
- create_table(:t6) do
145
- primary_key :c1, :table=>:t2, :key=>[:c2]
146
- end
147
- OUTPUT
148
- end
149
-
150
- it "should handle foreign key options" do
151
- def @d.schema(*s) [[:c1, {:db_type=>'integer', :allow_null=>true}]] end
152
- def @d.supports_foreign_key_parsing?; true end
153
- def @d.foreign_key_list(*s) [{:columns=>[:c1], :table=>:t2, :key=>[:c2], :on_delete=>:restrict, :on_update=>:set_null, :deferrable=>true}] end
154
- @d.dump_table_schema(:t6).must_equal((<<OUTPUT).chomp)
155
- create_table(:t6) do
156
- foreign_key :c1, :t2, :key=>[:c2], :on_delete=>:restrict, :on_update=>:set_null, :deferrable=>true
157
- end
158
- OUTPUT
159
- end
160
-
161
- it "should handle foreign key options in the primary key" do
162
- def @d.schema(*s) [[:c1, {:db_type=>'integer', :primary_key=>true, :allow_null=>true, :auto_increment=>true}]] end
163
- def @d.supports_foreign_key_parsing?; true end
164
- def @d.foreign_key_list(*s) [{:columns=>[:c1], :table=>:t2, :key=>[:c2], :on_delete=>:restrict, :on_update=>:set_null, :deferrable=>true}] end
165
- @d.dump_table_schema(:t6).must_equal((<<OUTPUT).chomp)
166
- create_table(:t6) do
167
- primary_key :c1, :table=>:t2, :key=>[:c2], :on_delete=>:restrict, :on_update=>:set_null, :deferrable=>true
168
- end
169
- OUTPUT
170
- end
171
-
172
- it "should omit foreign key options that are the same as defaults" do
173
- def @d.schema(*s) [[:c1, {:db_type=>'integer', :allow_null=>true}]] end
174
- def @d.supports_foreign_key_parsing?; true end
175
- def @d.foreign_key_list(*s) [{:columns=>[:c1], :table=>:t2, :key=>[:c2], :on_delete=>:no_action, :on_update=>:no_action, :deferrable=>false}] end
176
- @d.dump_table_schema(:t6).must_equal((<<OUTPUT).chomp)
177
- create_table(:t6) do
178
- foreign_key :c1, :t2, :key=>[:c2]
179
- end
180
- OUTPUT
181
- end
182
-
183
- it "should omit foreign key options that are the same as defaults in the primary key" do
184
- def @d.schema(*s) [[:c1, {:db_type=>'integer', :primary_key=>true, :allow_null=>true, :auto_increment=>true}]] end
185
- def @d.supports_foreign_key_parsing?; true end
186
- def @d.foreign_key_list(*s) [{:columns=>[:c1], :table=>:t2, :key=>[:c2], :on_delete=>:no_action, :on_update=>:no_action, :deferrable=>false}] end
187
- @d.dump_table_schema(:t6).must_equal((<<OUTPUT).chomp)
188
- create_table(:t6) do
189
- primary_key :c1, :table=>:t2, :key=>[:c2]
190
- end
191
- OUTPUT
192
- end
193
-
194
- it "should dump primary key columns with explicit type equal to the database type when :same_db option is passed" do
195
- def @d.schema(*s) [[:c1, {:db_type=>'somedbspecifictype', :primary_key=>true, :allow_null=>false}]] end
196
- @d.dump_table_schema(:t7, :same_db => true).must_equal "create_table(:t7) do\n column :c1, \"somedbspecifictype\", :null=>false\n \n primary_key [:c1]\nend"
197
- end
198
-
199
- it "should use a composite primary_key calls if there is a composite primary key" do
200
- @d.dump_table_schema(:t2).must_equal "create_table(:t2) do\n Integer :c1, :null=>false\n BigDecimal :c2, :null=>false\n \n primary_key [:c1, :c2]\nend"
201
- end
202
-
203
- it "should use a composite foreign_key calls if there is a composite foreign key" do
204
- def @d.schema(*s) [[:c1, {:db_type=>'integer'}], [:c2, {:db_type=>'integer'}]] end
205
- def @d.supports_foreign_key_parsing?; true end
206
- def @d.foreign_key_list(*s) [{:columns=>[:c1, :c2], :table=>:t2, :key=>[:c3, :c4]}] end
207
- @d.dump_table_schema(:t1).must_equal "create_table(:t1) do\n Integer :c1\n Integer :c2\n \n foreign_key [:c1, :c2], :t2, :key=>[:c3, :c4]\nend"
208
- end
209
-
210
- it "should include index information if available" do
211
- def @d.supports_index_parsing?; true end
212
- def @d.indexes(t)
213
- {:i1=>{:columns=>[:c1], :unique=>false},
214
- :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>true}}
215
- end
216
- @d.dump_table_schema(:t1).must_equal "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1], :name=>:i1\n index [:c2, :c1], :unique=>true\nend"
217
- end
218
-
219
- it "should support dumping the whole database as a migration with a :schema option" do
220
- @d.dump_schema_migration(:schema=>'t__t1').must_equal <<-END_MIG
221
- Sequel.migration do
222
- change do
223
- create_table("t__t1") do
224
- primary_key :c1
225
- String :c2
226
- end
227
- end
228
- end
229
- END_MIG
230
- end
231
-
232
- it "should support dumping the whole database as a migration" do
233
- @d.dump_schema_migration.must_equal <<-END_MIG
234
- Sequel.migration do
235
- change do
236
- create_table(:t1) do
237
- primary_key :c1
238
- String :c2, :size=>20
239
- end
240
-
241
- create_table(:t2) do
242
- Integer :c1, :null=>false
243
- BigDecimal :c2, :null=>false
244
-
245
- primary_key [:c1, :c2]
246
- end
247
- end
248
- end
249
- END_MIG
250
- end
251
-
252
- it "should sort table names when dumping a migration" do
253
- def @d.tables(o) [:t2, :t1] end
254
- @d.dump_schema_migration.must_equal <<-END_MIG
255
- Sequel.migration do
256
- change do
257
- create_table(:t1) do
258
- primary_key :c1
259
- String :c2, :size=>20
260
- end
261
-
262
- create_table(:t2) do
263
- Integer :c1, :null=>false
264
- BigDecimal :c2, :null=>false
265
-
266
- primary_key [:c1, :c2]
267
- end
268
- end
269
- end
270
- END_MIG
271
- end
272
-
273
- it "should sort table names topologically when dumping a migration with foreign keys" do
274
- def @d.tables(o) [:t1, :t2] end
275
- def @d.schema(t, *o)
276
- t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer', :primary_key=>true, :auto_increment=>true}]]
277
- end
278
- def @d.supports_foreign_key_parsing?; true end
279
- def @d.foreign_key_list(t)
280
- t == :t1 ? [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}] : []
281
- end
282
- @d.dump_schema_migration.must_equal <<-END_MIG
283
- Sequel.migration do
284
- change do
285
- create_table(:t2) do
286
- primary_key :c1
287
- end
288
-
289
- create_table(:t1) do
290
- foreign_key :c2, :t2, :key=>[:c1]
291
- end
292
- end
293
- end
294
- END_MIG
295
- end
296
-
297
- it "should handle circular dependencies when dumping a migration with foreign keys" do
298
- def @d.tables(o) [:t1, :t2] end
299
- def @d.schema(t, *o)
300
- t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer'}]]
301
- end
302
- def @d.supports_foreign_key_parsing?; true end
303
- def @d.foreign_key_list(t)
304
- t == :t1 ? [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}] : [{:columns=>[:c1], :table=>:t1, :key=>[:c2]}]
305
- end
306
- @d.dump_schema_migration.must_equal <<-END_MIG
307
- Sequel.migration do
308
- change do
309
- create_table(:t1) do
310
- Integer :c2
311
- end
312
-
313
- create_table(:t2) do
314
- foreign_key :c1, :t1, :key=>[:c2]
315
- end
316
-
317
- alter_table(:t1) do
318
- add_foreign_key [:c2], :t2, :key=>[:c1]
319
- end
320
- end
321
- end
322
- END_MIG
323
- end
324
-
325
- it "should sort topologically even if the database raises an error when trying to parse foreign keys for a non-existent table" do
326
- def @d.tables(o) [:t1, :t2] end
327
- def @d.schema(t, *o)
328
- t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer', :primary_key=>true, :auto_increment=>true}]]
329
- end
330
- def @d.supports_foreign_key_parsing?; true end
331
- def @d.foreign_key_list(t)
332
- raise Sequel::DatabaseError unless [:t1, :t2].include?(t)
333
- t == :t1 ? [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}] : []
334
- end
335
- @d.dump_schema_migration.must_equal <<-END_MIG
336
- Sequel.migration do
337
- change do
338
- create_table(:t2) do
339
- primary_key :c1
340
- end
341
-
342
- create_table(:t1) do
343
- foreign_key :c2, :t2, :key=>[:c1]
344
- end
345
- end
346
- end
347
- END_MIG
348
- end
349
-
350
- it "should honor the :same_db option to not convert types" do
351
- @d.dump_table_schema(:t1, :same_db=>true).must_equal "create_table(:t1) do\n primary_key :c1\n column :c2, \"varchar(20)\"\nend"
352
- @d.dump_schema_migration(:same_db=>true).must_equal <<-END_MIG
353
- Sequel.migration do
354
- change do
355
- create_table(:t1) do
356
- primary_key :c1
357
- column :c2, "varchar(20)"
358
- end
359
-
360
- create_table(:t2) do
361
- column :c1, "integer", :null=>false
362
- column :c2, "numeric", :null=>false
363
-
364
- primary_key [:c1, :c2]
365
- end
366
- end
367
- end
368
- END_MIG
369
- end
370
-
371
- it "should honor the :index_names => false option to not include names of indexes" do
372
- def @d.supports_index_parsing?; true end
373
- def @d.indexes(t)
374
- {:i1=>{:columns=>[:c1], :unique=>false},
375
- :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>true}}
376
- end
377
- @d.dump_table_schema(:t1, :index_names=>false).must_equal "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1]\n index [:c2, :c1], :unique=>true\nend"
378
- @d.dump_schema_migration(:index_names=>false).must_equal <<-END_MIG
379
- Sequel.migration do
380
- change do
381
- create_table(:t1, :ignore_index_errors=>true) do
382
- primary_key :c1
383
- String :c2, :size=>20
384
-
385
- index [:c1]
386
- index [:c2, :c1], :unique=>true
387
- end
388
-
389
- create_table(:t2, :ignore_index_errors=>true) do
390
- Integer :c1, :null=>false
391
- BigDecimal :c2, :null=>false
392
-
393
- primary_key [:c1, :c2]
394
-
395
- index [:c1]
396
- index [:c2, :c1], :unique=>true
397
- end
398
- end
399
- end
400
- END_MIG
401
- end
402
-
403
- it "should make :index_names => :namespace option a noop if there is a global index namespace" do
404
- def @d.supports_index_parsing?; true end
405
- def @d.indexes(t)
406
- {:i1=>{:columns=>[:c1], :unique=>false},
407
- :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>false}}
408
- end
409
- @d.dump_table_schema(:t1, :index_names=>:namespace).must_equal "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1], :name=>:i1\n index [:c2, :c1]\nend"
410
- @d.dump_schema_migration(:index_names=>:namespace).must_equal <<-END_MIG
411
- Sequel.migration do
412
- change do
413
- create_table(:t1, :ignore_index_errors=>true) do
414
- primary_key :c1
415
- String :c2, :size=>20
416
-
417
- index [:c1], :name=>:i1
418
- index [:c2, :c1]
419
- end
420
-
421
- create_table(:t2, :ignore_index_errors=>true) do
422
- Integer :c1, :null=>false
423
- BigDecimal :c2, :null=>false
424
-
425
- primary_key [:c1, :c2]
426
-
427
- index [:c1], :name=>:i1
428
- index [:c2, :c1], :name=>:t1_c2_c1_index
429
- end
430
- end
431
- end
432
- END_MIG
433
- end
434
-
435
- it "should honor the :index_names => :namespace option to include names of indexes with prepended table name if there is no global index namespace" do
436
- def @d.global_index_namespace?; false end
437
- def @d.supports_index_parsing?; true end
438
- def @d.indexes(t)
439
- {:i1=>{:columns=>[:c1], :unique=>false},
440
- :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>false}}
441
- end
442
- @d.dump_table_schema(:t1, :index_names=>:namespace).must_equal "create_table(:t1, :ignore_index_errors=>true) do\n primary_key :c1\n String :c2, :size=>20\n \n index [:c1], :name=>:t1_i1\n index [:c2, :c1]\nend"
443
- @d.dump_schema_migration(:index_names=>:namespace).must_equal <<-END_MIG
444
- Sequel.migration do
445
- change do
446
- create_table(:t1, :ignore_index_errors=>true) do
447
- primary_key :c1
448
- String :c2, :size=>20
449
-
450
- index [:c1], :name=>:t1_i1
451
- index [:c2, :c1]
452
- end
453
-
454
- create_table(:t2, :ignore_index_errors=>true) do
455
- Integer :c1, :null=>false
456
- BigDecimal :c2, :null=>false
457
-
458
- primary_key [:c1, :c2]
459
-
460
- index [:c1], :name=>:t2_i1
461
- index [:c2, :c1], :name=>:t2_t1_c2_c1_index
462
- end
463
- end
464
- end
465
- END_MIG
466
- end
467
-
468
- it "should honor the :indexes => false option to not include indexes" do
469
- def @d.supports_index_parsing?; true end
470
- def @d.indexes(t)
471
- {:i1=>{:columns=>[:c1], :unique=>false},
472
- :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>true}}
473
- end
474
- @d.dump_table_schema(:t1, :indexes=>false).must_equal "create_table(:t1) do\n primary_key :c1\n String :c2, :size=>20\nend"
475
- @d.dump_schema_migration(:indexes=>false).must_equal <<-END_MIG
476
- Sequel.migration do
477
- change do
478
- create_table(:t1) do
479
- primary_key :c1
480
- String :c2, :size=>20
481
- end
482
-
483
- create_table(:t2) do
484
- Integer :c1, :null=>false
485
- BigDecimal :c2, :null=>false
486
-
487
- primary_key [:c1, :c2]
488
- end
489
- end
490
- end
491
- END_MIG
492
- end
493
-
494
- it "should have :indexes => false option disable foreign keys as well when dumping a whole migration" do
495
- def @d.foreign_key_list(t)
496
- t == :t1 ? [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}] : []
497
- end
498
- @d.dump_schema_migration(:indexes=>false).wont_match(/foreign_key/)
499
- end
500
-
501
- it "should have :foreign_keys option override :indexes => false disabling of foreign keys" do
502
- def @d.supports_foreign_key_parsing?; true end
503
- def @d.foreign_key_list(t)
504
- t == :t1 ? [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}] : []
505
- end
506
- @d.dump_schema_migration(:indexes=>false, :foreign_keys=>true).must_equal(<<OUTPUT)
507
- Sequel.migration do
508
- change do
509
- create_table(:t2) do
510
- Integer :c1, :null=>false
511
- BigDecimal :c2, :null=>false
512
-
513
- primary_key [:c1, :c2]
514
- end
515
-
516
- create_table(:t1) do
517
- primary_key :c1
518
- foreign_key :c2, :t2, :type=>String, :size=>20, :key=>[:c1]
519
- end
520
- end
521
- end
522
- OUTPUT
523
- end
524
-
525
- it "should support dumping just indexes as a migration" do
526
- def @d.tables(o) [:t1] end
527
- def @d.supports_index_parsing?; true end
528
- def @d.indexes(t)
529
- {:i1=>{:columns=>[:c1], :unique=>false},
530
- :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>true}}
531
- end
532
- @d.dump_indexes_migration.must_equal <<-END_MIG
533
- Sequel.migration do
534
- change do
535
- add_index :t1, [:c1], :ignore_errors=>true, :name=>:i1
536
- add_index :t1, [:c2, :c1], :ignore_errors=>true, :unique=>true
537
- end
538
- end
539
- END_MIG
540
- end
541
-
542
- it "should honor the :index_names => false option to not include names of indexes when dumping just indexes as a migration" do
543
- def @d.tables(o) [:t1] end
544
- def @d.supports_index_parsing?; true end
545
- def @d.indexes(t)
546
- {:i1=>{:columns=>[:c1], :unique=>false},
547
- :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>true}}
548
- end
549
- @d.dump_indexes_migration(:index_names=>false).must_equal <<-END_MIG
550
- Sequel.migration do
551
- change do
552
- add_index :t1, [:c1], :ignore_errors=>true
553
- add_index :t1, [:c2, :c1], :ignore_errors=>true, :unique=>true
554
- end
555
- end
556
- END_MIG
557
- end
558
-
559
- it "should honor the :index_names => :namespace option be a noop if there is a global index namespace" do
560
- def @d.tables(o) [:t1, :t2] end
561
- def @d.supports_index_parsing?; true end
562
- def @d.indexes(t)
563
- {:i1=>{:columns=>[:c1], :unique=>false},
564
- :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>false}}
565
- end
566
- @d.dump_indexes_migration(:index_names=>:namespace).must_equal <<-END_MIG
567
- Sequel.migration do
568
- change do
569
- add_index :t1, [:c1], :ignore_errors=>true, :name=>:i1
570
- add_index :t1, [:c2, :c1], :ignore_errors=>true
571
-
572
- add_index :t2, [:c1], :ignore_errors=>true, :name=>:i1
573
- add_index :t2, [:c2, :c1], :ignore_errors=>true, :name=>:t1_c2_c1_index
574
- end
575
- end
576
- END_MIG
577
- end
578
-
579
- it "should honor the :index_names => :namespace option to include names of indexes with prepended table name when dumping just indexes as a migration if there is no global index namespace" do
580
- def @d.global_index_namespace?; false end
581
- def @d.tables(o) [:t1, :t2] end
582
- def @d.supports_index_parsing?; true end
583
- def @d.indexes(t)
584
- {:i1=>{:columns=>[:c1], :unique=>false},
585
- :t1_c2_c1_index=>{:columns=>[:c2, :c1], :unique=>false}}
586
- end
587
- @d.dump_indexes_migration(:index_names=>:namespace).must_equal <<-END_MIG
588
- Sequel.migration do
589
- change do
590
- add_index :t1, [:c1], :ignore_errors=>true, :name=>:t1_i1
591
- add_index :t1, [:c2, :c1], :ignore_errors=>true
592
-
593
- add_index :t2, [:c1], :ignore_errors=>true, :name=>:t2_i1
594
- add_index :t2, [:c2, :c1], :ignore_errors=>true, :name=>:t2_t1_c2_c1_index
595
- end
596
- end
597
- END_MIG
598
- end
599
-
600
- it "should handle missing index parsing support when dumping index migration" do
601
- def @d.tables(o) [:t1] end
602
- @d.dump_indexes_migration.must_equal <<-END_MIG
603
- Sequel.migration do
604
- change do
605
-
606
- end
607
- end
608
- END_MIG
609
- end
610
-
611
- it "should handle missing foreign key parsing support when dumping foreign key migration" do
612
- def @d.tables(o) [:t1] end
613
- @d.dump_foreign_key_migration.must_equal <<-END_MIG
614
- Sequel.migration do
615
- change do
616
-
617
- end
618
- end
619
- END_MIG
620
- end
621
-
622
- it "should support dumping just foreign_keys as a migration" do
623
- def @d.tables(o) [:t1, :t2, :t3] end
624
- def @d.schema(t, *o)
625
- t == :t1 ? [[:c2, {:db_type=>'integer'}]] : [[:c1, {:db_type=>'integer'}]]
626
- end
627
- def @d.supports_foreign_key_parsing?; true end
628
- def @d.foreign_key_list(t, *a)
629
- case t
630
- when :t1
631
- [{:columns=>[:c2], :table=>:t2, :key=>[:c1]}]
632
- when :t2
633
- [{:columns=>[:c1, :c3], :table=>:t1, :key=>[:c2, :c4]}]
634
- else
635
- []
636
- end
637
- end
638
- @d.dump_foreign_key_migration.must_equal <<-END_MIG
639
- Sequel.migration do
640
- change do
641
- alter_table(:t1) do
642
- add_foreign_key [:c2], :t2, :key=>[:c1]
643
- end
644
-
645
- alter_table(:t2) do
646
- add_foreign_key [:c1, :c3], :t1, :key=>[:c2, :c4]
647
- end
648
- end
649
- end
650
- END_MIG
651
- end
652
-
653
- it "should handle not null values and defaults" do
654
- def @d.schema(*s) [[:c1, {:db_type=>'date', :default=>"'now()'", :allow_null=>true}], [:c2, {:db_type=>'datetime', :allow_null=>false}]] end
655
- @d.dump_table_schema(:t3).must_equal "create_table(:t3) do\n Date :c1\n DateTime :c2, :null=>false\nend"
656
- end
657
-
658
- it "should handle converting common defaults" do
659
- def @d.schema(t, *os)
660
- s = [[:c1, {:db_type=>'boolean', :default=>"false", :type=>:boolean, :allow_null=>true}],
661
- [:c2, {:db_type=>'varchar', :default=>"'blah'", :type=>:string, :allow_null=>true}],
662
- [:c3, {:db_type=>'integer', :default=>"-1", :type=>:integer, :allow_null=>true}],
663
- [:c4, {:db_type=>'float', :default=>"1.0", :type=>:float, :allow_null=>true}],
664
- [:c5, {:db_type=>'decimal', :default=>"100.50", :type=>:decimal, :allow_null=>true}],
665
- [:c6, {:db_type=>'blob', :default=>"'blah'", :type=>:blob, :allow_null=>true}],
666
- [:c7, {:db_type=>'date', :default=>"'2008-10-29'", :type=>:date, :allow_null=>true}],
667
- [:c8, {:db_type=>'datetime', :default=>"'2008-10-29 10:20:30'", :type=>:datetime, :allow_null=>true}],
668
- [:c9, {:db_type=>'time', :default=>"'10:20:30'", :type=>:time, :allow_null=>true}],
669
- [:c10, {:db_type=>'foo', :default=>"'6 weeks'", :type=>nil, :allow_null=>true}],
670
- [:c11, {:db_type=>'date', :default=>"CURRENT_DATE", :type=>:date, :allow_null=>true}],
671
- [:c12, {:db_type=>'timestamp', :default=>"now()", :type=>:datetime, :allow_null=>true}]]
672
- s.each{|_, c| c[:ruby_default] = column_schema_to_ruby_default(c[:default], c[:type])}
673
- s
674
- end
675
- e = RUBY_VERSION >= '2.4' ? 'e' : 'E'
676
- @d.dump_table_schema(:t4).gsub(/[+-]\d\d\d\d"\)/, '")').gsub(/\.0+/, '.0').must_equal "create_table(:t4) do\n TrueClass :c1, :default=>false\n String :c2, :default=>\"blah\"\n Integer :c3, :default=>-1\n Float :c4, :default=>1.0\n BigDecimal :c5, :default=>BigDecimal.new(\"0.1005#{e}3\")\n File :c6, :default=>Sequel::SQL::Blob.new(\"blah\")\n Date :c7, :default=>Date.new(2008, 10, 29)\n DateTime :c8, :default=>DateTime.parse(\"2008-10-29T10:20:30.0\")\n Time :c9, :default=>Sequel::SQLTime.parse(\"10:20:30.0\"), :only_time=>true\n String :c10\n Date :c11, :default=>Sequel::CURRENT_DATE\n DateTime :c12, :default=>Sequel::CURRENT_TIMESTAMP\nend"
677
- @d.dump_table_schema(:t4, :same_db=>true).gsub(/[+-]\d\d\d\d"\)/, '")').gsub(/\.0+/, '.0').must_equal "create_table(:t4) do\n column :c1, \"boolean\", :default=>false\n column :c2, \"varchar\", :default=>\"blah\"\n column :c3, \"integer\", :default=>-1\n column :c4, \"float\", :default=>1.0\n column :c5, \"decimal\", :default=>BigDecimal.new(\"0.1005#{e}3\")\n column :c6, \"blob\", :default=>Sequel::SQL::Blob.new(\"blah\")\n column :c7, \"date\", :default=>Date.new(2008, 10, 29)\n column :c8, \"datetime\", :default=>DateTime.parse(\"2008-10-29T10:20:30.0\")\n column :c9, \"time\", :default=>Sequel::SQLTime.parse(\"10:20:30.0\")\n column :c10, \"foo\", :default=>Sequel::LiteralString.new(\"'6 weeks'\")\n column :c11, \"date\", :default=>Sequel::CURRENT_DATE\n column :c12, \"timestamp\", :default=>Sequel::CURRENT_TIMESTAMP\nend"
678
- end
679
-
680
- it "should not use a literal string as a fallback if using MySQL with the :same_db option" do
681
- def @d.database_type; :mysql end
682
- def @d.supports_index_parsing?; false end
683
- def @d.supports_foreign_key_parsing?; false end
684
- def @d.schema(t, *os)
685
- s = [[:c10, {:db_type=>'foo', :default=>"'6 weeks'", :type=>nil, :allow_null=>true}]]
686
- s.each{|_, c| c[:ruby_default] = column_schema_to_ruby_default(c[:default], c[:type])}
687
- s
688
- end
689
- @d.dump_table_schema(:t5, :same_db=>true).must_equal "create_table(:t5) do\n column :c10, \"foo\"\nend"
690
- end
691
-
692
- it "should convert unknown database types to strings" do
693
- @d.dump_table_schema(:t5).must_equal "create_table(:t5) do\n String :c1\nend"
694
- end
695
-
696
- it "should convert many database types to ruby types" do
697
- def @d.schema(t, *o)
698
- types = %w"mediumint smallint int integer mediumint(6) smallint(7) int(8) integer(9)
699
- tinyint tinyint(2) bigint bigint(20) real float double boolean tinytext mediumtext
700
- longtext text clob date datetime timestamp time char character
701
- varchar varchar(255) varchar(30) bpchar string money
702
- decimal decimal(10,2) numeric numeric(15,3) number bytea tinyblob mediumblob longblob
703
- blob varbinary varbinary(10) binary binary(20) year" +
704
- ["double precision", "timestamp with time zone", "timestamp without time zone",
705
- "time with time zone", "time without time zone", "character varying(20)"] +
706
- %w"nvarchar ntext smalldatetime smallmoney binary varbinary nchar" +
707
- ["timestamp(6) without time zone", "timestamp(6) with time zone", 'mediumint(10) unsigned', 'int(9) unsigned',
708
- 'int(10) unsigned', "int(12) unsigned", 'bigint unsigned', 'tinyint(3) unsigned', 'identity', 'int identity'] +
709
- %w"integer(10) bit bool"
710
- i = 0
711
- types.map{|x| [:"c#{i+=1}", {:db_type=>x, :allow_null=>true}]}
712
- end
713
- @d.dump_table_schema(:x).must_equal((<<END_MIG).chomp)
714
- create_table(:x) do
715
- Integer :c1
716
- Integer :c2
717
- Integer :c3
718
- Integer :c4
719
- Integer :c5
720
- Integer :c6
721
- Integer :c7
722
- Integer :c8
723
- Integer :c9
724
- Integer :c10
725
- Bignum :c11
726
- Bignum :c12
727
- Float :c13
728
- Float :c14
729
- Float :c15
730
- TrueClass :c16
731
- String :c17, :text=>true
732
- String :c18, :text=>true
733
- String :c19, :text=>true
734
- String :c20, :text=>true
735
- String :c21, :text=>true
736
- Date :c22
737
- DateTime :c23
738
- DateTime :c24
739
- Time :c25, :only_time=>true
740
- String :c26, :fixed=>true
741
- String :c27, :fixed=>true
742
- String :c28
743
- String :c29, :size=>255
744
- String :c30, :size=>30
745
- String :c31
746
- String :c32
747
- BigDecimal :c33, :size=>[19, 2]
748
- BigDecimal :c34
749
- BigDecimal :c35, :size=>[10, 2]
750
- BigDecimal :c36
751
- BigDecimal :c37, :size=>[15, 3]
752
- BigDecimal :c38
753
- File :c39
754
- File :c40
755
- File :c41
756
- File :c42
757
- File :c43
758
- File :c44
759
- File :c45, :size=>10
760
- File :c46
761
- File :c47, :size=>20
762
- Integer :c48
763
- Float :c49
764
- DateTime :c50
765
- DateTime :c51
766
- Time :c52, :only_time=>true
767
- Time :c53, :only_time=>true
768
- String :c54, :size=>20
769
- String :c55
770
- String :c56, :text=>true
771
- DateTime :c57
772
- BigDecimal :c58, :size=>[19, 2]
773
- File :c59
774
- File :c60
775
- String :c61, :fixed=>true
776
- DateTime :c62, :size=>6
777
- DateTime :c63, :size=>6
778
- Integer :c64
779
- Integer :c65
780
- Bignum :c66
781
- Bignum :c67
782
- Bignum :c68
783
- Integer :c69
784
- Integer :c70
785
- Integer :c71
786
- Integer :c72
787
- TrueClass :c73
788
- TrueClass :c74
789
-
790
- check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c64), 0)
791
- check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c65), 0)
792
- check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c66), 0)
793
- check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c67), 0)
794
- check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c68), 0)
795
- check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c69), 0)
796
- end
797
- END_MIG
798
- end
799
-
800
- it "should convert mysql types to ruby types" do
801
- def @d.schema(t, *o)
802
- i = 0
803
- ['double(15,2)', 'double(7,1) unsigned'].map{|x| [:"c#{i+=1}", {:db_type=>x, :allow_null=>true}]}
804
- end
805
- @d.dump_table_schema(:x).must_equal((<<END_MIG).chomp)
806
- create_table(:x) do
807
- Float :c1
808
- Float :c2
809
-
810
- check Sequel::SQL::BooleanExpression.new(:>=, Sequel::SQL::Identifier.new(:c2), 0)
811
- end
812
- END_MIG
813
- end
814
-
815
- it "should convert oracle special types to ruby types" do
816
- def @d.database_type; :oracle end
817
- def @d.schema(t, *o)
818
- i = 0
819
- ['number not null', 'date not null', 'varchar2(4 byte) not null'].map{|x| [:"c#{i+=1}", {:db_type=>x, :allow_null=>false}]}
820
- end
821
- @d.dump_table_schema(:x).must_equal((<<END_MIG).chomp)
822
- create_table(:x) do
823
- BigDecimal :c1, :null=>false
824
- Date :c2, :null=>false
825
- String :c3, :null=>false
826
- end
827
- END_MIG
828
- end
829
-
830
- it "should force specify :null option for MySQL timestamp columns when using :same_db" do
831
- def @d.database_type; :mysql end
832
- def @d.schema(*s) [[:c1, {:db_type=>'timestamp', :primary_key=>true, :allow_null=>true}]] end
833
- @d.dump_table_schema(:t3, :same_db=>true).must_equal "create_table(:t3) do\n column :c1, \"timestamp\", :null=>true\n \n primary_key [:c1]\nend"
834
-
835
- def @d.schema(*s) [[:c1, {:db_type=>'timestamp', :primary_key=>true, :allow_null=>false}]] end
836
- @d.dump_table_schema(:t3, :same_db=>true).must_equal "create_table(:t3) do\n column :c1, \"timestamp\", :null=>false\n \n primary_key [:c1]\nend"
837
- end
838
-
839
- it "should use separate primary_key call with non autoincrementable types" do
840
- def @d.schema(*s) [[:c1, {:db_type=>'varchar(8)', :primary_key=>true, :auto_increment=>false}]] end
841
- @d.dump_table_schema(:t3).must_equal "create_table(:t3) do\n String :c1, :size=>8\n \n primary_key [:c1]\nend"
842
- @d.dump_table_schema(:t3, :same_db=>true).must_equal "create_table(:t3) do\n column :c1, \"varchar(8)\"\n \n primary_key [:c1]\nend"
843
- end
844
-
845
- it "should use explicit type for non integer foreign_key types" do
846
- def @d.schema(*s) [[:c1, {:db_type=>'date', :primary_key=>true, :auto_increment=>false}]] end
847
- def @d.supports_foreign_key_parsing?; true end
848
- def @d.foreign_key_list(t, *a) [{:columns=>[:c1], :table=>:t3, :key=>[:c1]}] if t == :t4 end
849
- ["create_table(:t4) do\n foreign_key :c1, :t3, :type=>Date, :key=>[:c1]\n \n primary_key [:c1]\nend",
850
- "create_table(:t4) do\n foreign_key :c1, :t3, :key=>[:c1], :type=>Date\n \n primary_key [:c1]\nend"].must_include(@d.dump_table_schema(:t4))
851
- ["create_table(:t4) do\n foreign_key :c1, :t3, :type=>\"date\", :key=>[:c1]\n \n primary_key [:c1]\nend",
852
- "create_table(:t4) do\n foreign_key :c1, :t3, :key=>[:c1], :type=>\"date\"\n \n primary_key [:c1]\nend"].must_include(@d.dump_table_schema(:t4, :same_db=>true))
853
- end
854
-
855
- it "should correctly handing autoincrementing primary keys that are also foreign keys" do
856
- def @d.schema(*s) [[:c1, {:db_type=>'integer', :primary_key=>true, :auto_increment=>true}]] end
857
- def @d.supports_foreign_key_parsing?; true end
858
- def @d.foreign_key_list(t, *a) [{:columns=>[:c1], :table=>:t3, :key=>[:c1]}] if t == :t4 end
859
- ["create_table(:t4) do\n primary_key :c1, :table=>:t3, :key=>[:c1]\nend",
860
- "create_table(:t4) do\n primary_key :c1, :key=>[:c1], :table=>:t3\nend"].must_include(@d.dump_table_schema(:t4))
861
- end
862
-
863
- it "should handle dumping on PostgreSQL using qualified tables" do
864
- @d = Sequel.connect('mock://postgres').extension(:schema_dumper)
865
- def @d.schema(*s) [[:c1, {:db_type=>'timestamp', :primary_key=>true, :allow_null=>true}]] end
866
- @d.dump_table_schema(Sequel.qualify(:foo, :bar), :same_db=>true).must_equal "create_table(Sequel::SQL::QualifiedIdentifier.new(:foo, :bar)) do\n column :c1, \"timestamp\"\n \n primary_key [:c1]\nend"
867
- end
868
- end