sequel 5.20.0 → 5.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (511) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +398 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +7 -7
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +80 -16
  7. data/doc/cheat_sheet.rdoc +6 -5
  8. data/doc/code_order.rdoc +10 -12
  9. data/doc/dataset_filtering.rdoc +17 -2
  10. data/doc/fork_safety.rdoc +84 -0
  11. data/doc/migration.rdoc +11 -5
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +10 -2
  15. data/doc/postgresql.rdoc +82 -3
  16. data/doc/querying.rdoc +4 -4
  17. data/doc/release_notes/5.21.0.txt +87 -0
  18. data/doc/release_notes/5.22.0.txt +48 -0
  19. data/doc/release_notes/5.23.0.txt +56 -0
  20. data/doc/release_notes/5.24.0.txt +56 -0
  21. data/doc/release_notes/5.25.0.txt +32 -0
  22. data/doc/release_notes/5.26.0.txt +35 -0
  23. data/doc/release_notes/5.27.0.txt +21 -0
  24. data/doc/release_notes/5.28.0.txt +16 -0
  25. data/doc/release_notes/5.29.0.txt +22 -0
  26. data/doc/release_notes/5.30.0.txt +20 -0
  27. data/doc/release_notes/5.31.0.txt +148 -0
  28. data/doc/release_notes/5.32.0.txt +46 -0
  29. data/doc/release_notes/5.33.0.txt +24 -0
  30. data/doc/release_notes/5.34.0.txt +40 -0
  31. data/doc/release_notes/5.35.0.txt +56 -0
  32. data/doc/release_notes/5.36.0.txt +60 -0
  33. data/doc/release_notes/5.37.0.txt +30 -0
  34. data/doc/release_notes/5.38.0.txt +28 -0
  35. data/doc/release_notes/5.39.0.txt +19 -0
  36. data/doc/release_notes/5.40.0.txt +40 -0
  37. data/doc/release_notes/5.41.0.txt +25 -0
  38. data/doc/release_notes/5.42.0.txt +136 -0
  39. data/doc/release_notes/5.43.0.txt +98 -0
  40. data/doc/release_notes/5.44.0.txt +32 -0
  41. data/doc/release_notes/5.45.0.txt +34 -0
  42. data/doc/release_notes/5.46.0.txt +87 -0
  43. data/doc/release_notes/5.47.0.txt +59 -0
  44. data/doc/release_notes/5.48.0.txt +14 -0
  45. data/doc/release_notes/5.49.0.txt +59 -0
  46. data/doc/sharding.rdoc +2 -0
  47. data/doc/sql.rdoc +13 -1
  48. data/doc/testing.rdoc +20 -7
  49. data/doc/transactions.rdoc +0 -8
  50. data/doc/validations.rdoc +1 -1
  51. data/doc/virtual_rows.rdoc +1 -1
  52. data/lib/sequel/adapters/ado/access.rb +1 -1
  53. data/lib/sequel/adapters/ado.rb +43 -35
  54. data/lib/sequel/adapters/ibmdb.rb +2 -2
  55. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  56. data/lib/sequel/adapters/jdbc/postgresql.rb +11 -17
  57. data/lib/sequel/adapters/jdbc/sqlite.rb +29 -0
  58. data/lib/sequel/adapters/jdbc.rb +24 -6
  59. data/lib/sequel/adapters/mysql.rb +1 -1
  60. data/lib/sequel/adapters/mysql2.rb +2 -3
  61. data/lib/sequel/adapters/odbc.rb +8 -6
  62. data/lib/sequel/adapters/oracle.rb +5 -4
  63. data/lib/sequel/adapters/postgres.rb +15 -9
  64. data/lib/sequel/adapters/shared/access.rb +6 -6
  65. data/lib/sequel/adapters/shared/mssql.rb +66 -21
  66. data/lib/sequel/adapters/shared/mysql.rb +27 -10
  67. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  68. data/lib/sequel/adapters/shared/postgres.rb +271 -32
  69. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  70. data/lib/sequel/adapters/shared/sqlite.rb +161 -19
  71. data/lib/sequel/adapters/sqlanywhere.rb +1 -1
  72. data/lib/sequel/adapters/sqlite.rb +1 -1
  73. data/lib/sequel/adapters/tinytds.rb +15 -2
  74. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -1
  75. data/lib/sequel/ast_transformer.rb +6 -0
  76. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  77. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  78. data/lib/sequel/connection_pool/single.rb +1 -1
  79. data/lib/sequel/connection_pool/threaded.rb +2 -2
  80. data/lib/sequel/core.rb +333 -319
  81. data/lib/sequel/database/connecting.rb +3 -4
  82. data/lib/sequel/database/logging.rb +7 -1
  83. data/lib/sequel/database/misc.rb +31 -12
  84. data/lib/sequel/database/query.rb +3 -1
  85. data/lib/sequel/database/schema_generator.rb +53 -51
  86. data/lib/sequel/database/schema_methods.rb +38 -23
  87. data/lib/sequel/database/transactions.rb +17 -18
  88. data/lib/sequel/dataset/actions.rb +14 -9
  89. data/lib/sequel/dataset/features.rb +16 -0
  90. data/lib/sequel/dataset/misc.rb +2 -2
  91. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  92. data/lib/sequel/dataset/prepared_statements.rb +2 -0
  93. data/lib/sequel/dataset/query.rb +26 -9
  94. data/lib/sequel/dataset/sql.rb +76 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/deprecated.rb +3 -1
  97. data/lib/sequel/exceptions.rb +2 -0
  98. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  99. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  100. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  101. data/lib/sequel/extensions/blank.rb +8 -0
  102. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  103. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  104. data/lib/sequel/extensions/connection_validator.rb +2 -2
  105. data/lib/sequel/extensions/core_refinements.rb +2 -0
  106. data/lib/sequel/extensions/date_arithmetic.rb +36 -24
  107. data/lib/sequel/extensions/duplicate_columns_handler.rb +3 -1
  108. data/lib/sequel/extensions/eval_inspect.rb +2 -0
  109. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  110. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  111. data/lib/sequel/extensions/index_caching.rb +9 -7
  112. data/lib/sequel/extensions/inflector.rb +9 -1
  113. data/lib/sequel/extensions/integer64.rb +2 -0
  114. data/lib/sequel/extensions/migration.rb +11 -3
  115. data/lib/sequel/extensions/named_timezones.rb +56 -8
  116. data/lib/sequel/extensions/pagination.rb +1 -1
  117. data/lib/sequel/extensions/pg_array.rb +5 -0
  118. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  119. data/lib/sequel/extensions/pg_enum.rb +11 -3
  120. data/lib/sequel/extensions/pg_extended_date_support.rb +2 -2
  121. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  122. data/lib/sequel/extensions/pg_hstore_ops.rb +54 -2
  123. data/lib/sequel/extensions/pg_inet.rb +15 -5
  124. data/lib/sequel/extensions/pg_interval.rb +36 -8
  125. data/lib/sequel/extensions/pg_json.rb +387 -123
  126. data/lib/sequel/extensions/pg_json_ops.rb +238 -0
  127. data/lib/sequel/extensions/pg_loose_count.rb +3 -1
  128. data/lib/sequel/extensions/pg_range.rb +17 -9
  129. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  130. data/lib/sequel/extensions/pg_row.rb +4 -2
  131. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  132. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  133. data/lib/sequel/extensions/query.rb +3 -0
  134. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  135. data/lib/sequel/extensions/s.rb +2 -0
  136. data/lib/sequel/extensions/schema_dumper.rb +24 -7
  137. data/lib/sequel/extensions/server_block.rb +18 -7
  138. data/lib/sequel/extensions/sql_comments.rb +2 -2
  139. data/lib/sequel/extensions/string_agg.rb +1 -1
  140. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  141. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  142. data/lib/sequel/extensions/to_dot.rb +9 -3
  143. data/lib/sequel/model/associations.rb +356 -117
  144. data/lib/sequel/model/base.rb +107 -68
  145. data/lib/sequel/model/errors.rb +10 -1
  146. data/lib/sequel/model/inflections.rb +1 -1
  147. data/lib/sequel/model/plugins.rb +9 -3
  148. data/lib/sequel/model.rb +3 -1
  149. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  150. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  151. data/lib/sequel/plugins/association_pks.rb +60 -18
  152. data/lib/sequel/plugins/association_proxies.rb +8 -2
  153. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  154. data/lib/sequel/plugins/auto_validations.rb +39 -5
  155. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  156. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  157. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  158. data/lib/sequel/plugins/caching.rb +3 -0
  159. data/lib/sequel/plugins/class_table_inheritance.rb +33 -28
  160. data/lib/sequel/plugins/column_encryption.rb +728 -0
  161. data/lib/sequel/plugins/composition.rb +7 -2
  162. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  163. data/lib/sequel/plugins/constraint_validations.rb +2 -1
  164. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  165. data/lib/sequel/plugins/dataset_associations.rb +4 -1
  166. data/lib/sequel/plugins/dirty.rb +60 -22
  167. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  168. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  169. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  170. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  171. data/lib/sequel/plugins/json_serializer.rb +57 -35
  172. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  173. data/lib/sequel/plugins/many_through_many.rb +108 -9
  174. data/lib/sequel/plugins/nested_attributes.rb +15 -3
  175. data/lib/sequel/plugins/pg_array_associations.rb +58 -41
  176. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +91 -30
  177. data/lib/sequel/plugins/prepared_statements.rb +15 -12
  178. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  179. data/lib/sequel/plugins/rcte_tree.rb +43 -35
  180. data/lib/sequel/plugins/serialization.rb +8 -3
  181. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  182. data/lib/sequel/plugins/sharding.rb +11 -5
  183. data/lib/sequel/plugins/single_table_inheritance.rb +22 -15
  184. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  185. data/lib/sequel/plugins/static_cache.rb +9 -4
  186. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  187. data/lib/sequel/plugins/string_stripper.rb +1 -1
  188. data/lib/sequel/plugins/subclasses.rb +2 -0
  189. data/lib/sequel/plugins/throw_failures.rb +1 -1
  190. data/lib/sequel/plugins/timestamps.rb +1 -1
  191. data/lib/sequel/plugins/tree.rb +9 -4
  192. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  193. data/lib/sequel/plugins/unused_associations.rb +521 -0
  194. data/lib/sequel/plugins/update_or_create.rb +1 -1
  195. data/lib/sequel/plugins/validation_class_methods.rb +5 -1
  196. data/lib/sequel/plugins/validation_helpers.rb +18 -11
  197. data/lib/sequel/plugins/xml_serializer.rb +1 -1
  198. data/lib/sequel/sql.rb +20 -5
  199. data/lib/sequel/timezones.rb +63 -17
  200. data/lib/sequel/version.rb +1 -1
  201. metadata +113 -381
  202. data/Rakefile +0 -151
  203. data/doc/release_notes/4.0.0.txt +0 -262
  204. data/doc/release_notes/4.1.0.txt +0 -85
  205. data/doc/release_notes/4.10.0.txt +0 -226
  206. data/doc/release_notes/4.11.0.txt +0 -147
  207. data/doc/release_notes/4.12.0.txt +0 -105
  208. data/doc/release_notes/4.13.0.txt +0 -169
  209. data/doc/release_notes/4.14.0.txt +0 -68
  210. data/doc/release_notes/4.15.0.txt +0 -56
  211. data/doc/release_notes/4.16.0.txt +0 -36
  212. data/doc/release_notes/4.17.0.txt +0 -38
  213. data/doc/release_notes/4.18.0.txt +0 -36
  214. data/doc/release_notes/4.19.0.txt +0 -45
  215. data/doc/release_notes/4.2.0.txt +0 -129
  216. data/doc/release_notes/4.20.0.txt +0 -79
  217. data/doc/release_notes/4.21.0.txt +0 -94
  218. data/doc/release_notes/4.22.0.txt +0 -72
  219. data/doc/release_notes/4.23.0.txt +0 -65
  220. data/doc/release_notes/4.24.0.txt +0 -99
  221. data/doc/release_notes/4.25.0.txt +0 -181
  222. data/doc/release_notes/4.26.0.txt +0 -44
  223. data/doc/release_notes/4.27.0.txt +0 -78
  224. data/doc/release_notes/4.28.0.txt +0 -57
  225. data/doc/release_notes/4.29.0.txt +0 -41
  226. data/doc/release_notes/4.3.0.txt +0 -40
  227. data/doc/release_notes/4.30.0.txt +0 -37
  228. data/doc/release_notes/4.31.0.txt +0 -57
  229. data/doc/release_notes/4.32.0.txt +0 -132
  230. data/doc/release_notes/4.33.0.txt +0 -88
  231. data/doc/release_notes/4.34.0.txt +0 -86
  232. data/doc/release_notes/4.35.0.txt +0 -130
  233. data/doc/release_notes/4.36.0.txt +0 -116
  234. data/doc/release_notes/4.37.0.txt +0 -50
  235. data/doc/release_notes/4.38.0.txt +0 -67
  236. data/doc/release_notes/4.39.0.txt +0 -127
  237. data/doc/release_notes/4.4.0.txt +0 -92
  238. data/doc/release_notes/4.40.0.txt +0 -179
  239. data/doc/release_notes/4.41.0.txt +0 -77
  240. data/doc/release_notes/4.42.0.txt +0 -221
  241. data/doc/release_notes/4.43.0.txt +0 -87
  242. data/doc/release_notes/4.44.0.txt +0 -125
  243. data/doc/release_notes/4.45.0.txt +0 -370
  244. data/doc/release_notes/4.46.0.txt +0 -404
  245. data/doc/release_notes/4.47.0.txt +0 -56
  246. data/doc/release_notes/4.48.0.txt +0 -293
  247. data/doc/release_notes/4.49.0.txt +0 -222
  248. data/doc/release_notes/4.5.0.txt +0 -34
  249. data/doc/release_notes/4.6.0.txt +0 -30
  250. data/doc/release_notes/4.7.0.txt +0 -103
  251. data/doc/release_notes/4.8.0.txt +0 -175
  252. data/doc/release_notes/4.9.0.txt +0 -190
  253. data/spec/adapter_spec.rb +0 -4
  254. data/spec/adapters/db2_spec.rb +0 -170
  255. data/spec/adapters/mssql_spec.rb +0 -804
  256. data/spec/adapters/mysql_spec.rb +0 -1065
  257. data/spec/adapters/oracle_spec.rb +0 -371
  258. data/spec/adapters/postgres_spec.rb +0 -4125
  259. data/spec/adapters/spec_helper.rb +0 -44
  260. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  261. data/spec/adapters/sqlite_spec.rb +0 -652
  262. data/spec/bin_spec.rb +0 -278
  263. data/spec/core/connection_pool_spec.rb +0 -1250
  264. data/spec/core/database_spec.rb +0 -2865
  265. data/spec/core/dataset_spec.rb +0 -5515
  266. data/spec/core/deprecated_spec.rb +0 -70
  267. data/spec/core/expression_filters_spec.rb +0 -1455
  268. data/spec/core/mock_adapter_spec.rb +0 -722
  269. data/spec/core/object_graph_spec.rb +0 -336
  270. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  271. data/spec/core/schema_generator_spec.rb +0 -214
  272. data/spec/core/schema_spec.rb +0 -1826
  273. data/spec/core/spec_helper.rb +0 -24
  274. data/spec/core/version_spec.rb +0 -14
  275. data/spec/core_extensions_spec.rb +0 -763
  276. data/spec/core_model_spec.rb +0 -2
  277. data/spec/core_spec.rb +0 -1
  278. data/spec/deprecation_helper.rb +0 -30
  279. data/spec/extensions/accessed_columns_spec.rb +0 -51
  280. data/spec/extensions/active_model_spec.rb +0 -99
  281. data/spec/extensions/after_initialize_spec.rb +0 -28
  282. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  283. data/spec/extensions/association_dependencies_spec.rb +0 -125
  284. data/spec/extensions/association_pks_spec.rb +0 -423
  285. data/spec/extensions/association_proxies_spec.rb +0 -100
  286. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  287. data/spec/extensions/auto_validations_spec.rb +0 -229
  288. data/spec/extensions/blacklist_security_spec.rb +0 -95
  289. data/spec/extensions/blank_spec.rb +0 -69
  290. data/spec/extensions/boolean_readers_spec.rb +0 -93
  291. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  292. data/spec/extensions/caching_spec.rb +0 -273
  293. data/spec/extensions/caller_logging_spec.rb +0 -52
  294. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  295. data/spec/extensions/column_conflicts_spec.rb +0 -75
  296. data/spec/extensions/column_select_spec.rb +0 -129
  297. data/spec/extensions/columns_introspection_spec.rb +0 -90
  298. data/spec/extensions/columns_updated_spec.rb +0 -35
  299. data/spec/extensions/composition_spec.rb +0 -248
  300. data/spec/extensions/connection_expiration_spec.rb +0 -151
  301. data/spec/extensions/connection_validator_spec.rb +0 -144
  302. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  303. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  304. data/spec/extensions/constraint_validations_spec.rb +0 -439
  305. data/spec/extensions/core_refinements_spec.rb +0 -528
  306. data/spec/extensions/csv_serializer_spec.rb +0 -183
  307. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  308. data/spec/extensions/dataset_associations_spec.rb +0 -365
  309. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  310. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  311. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  312. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  313. data/spec/extensions/defaults_setter_spec.rb +0 -150
  314. data/spec/extensions/delay_add_association_spec.rb +0 -73
  315. data/spec/extensions/dirty_spec.rb +0 -189
  316. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  317. data/spec/extensions/eager_each_spec.rb +0 -62
  318. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  319. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  320. data/spec/extensions/error_splitter_spec.rb +0 -18
  321. data/spec/extensions/error_sql_spec.rb +0 -20
  322. data/spec/extensions/escaped_like_spec.rb +0 -40
  323. data/spec/extensions/eval_inspect_spec.rb +0 -81
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -291
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -864
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -111
  348. data/spec/extensions/nested_attributes_spec.rb +0 -767
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -172
  356. data/spec/extensions/pg_enum_spec.rb +0 -118
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -519
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -177
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -870
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -63
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -471
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/throw_failures_spec.rb +0 -74
  411. data/spec/extensions/timestamps_spec.rb +0 -209
  412. data/spec/extensions/to_dot_spec.rb +0 -153
  413. data/spec/extensions/touch_spec.rb +0 -226
  414. data/spec/extensions/tree_spec.rb +0 -334
  415. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  416. data/spec/extensions/unlimited_update_spec.rb +0 -21
  417. data/spec/extensions/update_or_create_spec.rb +0 -83
  418. data/spec/extensions/update_primary_key_spec.rb +0 -105
  419. data/spec/extensions/update_refresh_spec.rb +0 -59
  420. data/spec/extensions/uuid_spec.rb +0 -101
  421. data/spec/extensions/validate_associated_spec.rb +0 -52
  422. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  423. data/spec/extensions/validation_contexts_spec.rb +0 -31
  424. data/spec/extensions/validation_helpers_spec.rb +0 -525
  425. data/spec/extensions/whitelist_security_spec.rb +0 -157
  426. data/spec/extensions/xml_serializer_spec.rb +0 -213
  427. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  428. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  429. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  431. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  432. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  433. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  434. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  436. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  437. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  438. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  439. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  440. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  441. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  443. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  444. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  446. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  447. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  448. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  449. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  450. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  451. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  452. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  453. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  457. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  458. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  459. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  460. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  461. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  462. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  466. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  468. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  469. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  471. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  473. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  474. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  475. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  476. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  478. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  479. data/spec/guards_helper.rb +0 -59
  480. data/spec/integration/associations_test.rb +0 -2597
  481. data/spec/integration/database_test.rb +0 -113
  482. data/spec/integration/dataset_test.rb +0 -1981
  483. data/spec/integration/eager_loader_test.rb +0 -687
  484. data/spec/integration/migrator_test.rb +0 -262
  485. data/spec/integration/model_test.rb +0 -203
  486. data/spec/integration/plugin_test.rb +0 -2396
  487. data/spec/integration/prepared_statement_test.rb +0 -405
  488. data/spec/integration/schema_test.rb +0 -889
  489. data/spec/integration/spec_helper.rb +0 -65
  490. data/spec/integration/timezone_test.rb +0 -86
  491. data/spec/integration/transaction_test.rb +0 -603
  492. data/spec/integration/type_test.rb +0 -127
  493. data/spec/model/association_reflection_spec.rb +0 -803
  494. data/spec/model/associations_spec.rb +0 -4738
  495. data/spec/model/base_spec.rb +0 -875
  496. data/spec/model/class_dataset_methods_spec.rb +0 -146
  497. data/spec/model/dataset_methods_spec.rb +0 -198
  498. data/spec/model/eager_loading_spec.rb +0 -2377
  499. data/spec/model/hooks_spec.rb +0 -370
  500. data/spec/model/inflector_spec.rb +0 -26
  501. data/spec/model/model_spec.rb +0 -956
  502. data/spec/model/plugins_spec.rb +0 -429
  503. data/spec/model/record_spec.rb +0 -2118
  504. data/spec/model/spec_helper.rb +0 -46
  505. data/spec/model/validations_spec.rb +0 -220
  506. data/spec/model_no_assoc_spec.rb +0 -1
  507. data/spec/model_spec.rb +0 -1
  508. data/spec/plugin_spec.rb +0 -1
  509. data/spec/sequel_coverage.rb +0 -15
  510. data/spec/sequel_warning.rb +0 -4
  511. data/spec/spec_config.rb +0 -12
@@ -1,181 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- asd = begin
4
- require 'active_support/duration'
5
- true
6
- rescue LoadError
7
- warn "Skipping some tests of date_arithmetic extension: can't load active_support/duration"
8
- false
9
- end
10
-
11
- Sequel.extension :date_arithmetic
12
-
13
- describe "date_arithmetic extension" do
14
- dbf = lambda do |db_type|
15
- db = Sequel.connect("mock://#{db_type}")
16
- db.extension :date_arithmetic
17
- db
18
- end
19
-
20
- before do
21
- @h0 = {:days=>0}
22
- @h1 = {:days=>1, :years=>nil, :hours=>0}
23
- @h2 = {:years=>1, :months=>1, :days=>1, :hours=>1, :minutes=>1, :seconds=>1}
24
- end
25
-
26
- it "should have Sequel.date_add with an interval hash return an appropriate Sequel::SQL::DateAdd expression" do
27
- da = Sequel.date_add(:a, :days=>1)
28
- da.must_be_kind_of(Sequel::SQL::DateAdd)
29
- da.expr.must_equal :a
30
- da.interval.must_equal(:days=>1)
31
- Sequel.date_add(:a, :years=>1, :months=>2, :days=>3, :hours=>1, :minutes=>1, :seconds=>1).interval.must_equal(:years=>1, :months=>2, :days=>3, :hours=>1, :minutes=>1, :seconds=>1)
32
- end
33
-
34
- it "should have Sequel.date_sub with an interval hash return an appropriate Sequel::SQL::DateAdd expression" do
35
- da = Sequel.date_sub(:a, :days=>1)
36
- da.must_be_kind_of(Sequel::SQL::DateAdd)
37
- da.expr.must_equal :a
38
- da.interval.must_equal(:days=>-1)
39
- Sequel.date_sub(:a, :years=>1, :months=>2, :days=>3, :hours=>1, :minutes=>1, :seconds=>1).interval.must_equal(:years=>-1, :months=>-2, :days=>-3, :hours=>-1, :minutes=>-1, :seconds=>-1)
40
- end
41
-
42
- it "should have Sequel.date_* with an interval hash handle nil values" do
43
- Sequel.date_sub(:a, :days=>1, :hours=>nil).interval.must_equal(:days=>-1)
44
- end
45
-
46
- it "should raise an error if given string values in an interval hash" do
47
- lambda{Sequel.date_add(:a, :days=>'1')}.must_raise(Sequel::InvalidValue)
48
- end
49
-
50
- if asd
51
- it "should have Sequel.date_add with an ActiveSupport::Duration return an appropriate Sequel::SQL::DateAdd expression" do
52
- da = Sequel.date_add(:a, ActiveSupport::Duration.new(1, [[:days, 1]]))
53
- da.must_be_kind_of(Sequel::SQL::DateAdd)
54
- da.expr.must_equal :a
55
- da.interval.must_equal(:days=>1)
56
- Sequel.date_add(:a, ActiveSupport::Duration.new(1, [[:years, 1], [:months, 1], [:days, 1], [:minutes, 61], [:seconds, 1]])).interval.must_equal(:years=>1, :months=>1, :days=>1, :minutes=>61, :seconds=>1)
57
- end
58
-
59
- it "should have Sequel.date_sub with an ActiveSupport::Duration return an appropriate Sequel::SQL::DateAdd expression" do
60
- da = Sequel.date_sub(:a, ActiveSupport::Duration.new(1, [[:days, 1]]))
61
- da.must_be_kind_of(Sequel::SQL::DateAdd)
62
- da.expr.must_equal :a
63
- da.interval.must_equal(:days=>-1)
64
- Sequel.date_sub(:a, ActiveSupport::Duration.new(1, [[:years, 1], [:months, 1], [:days, 1], [:minutes, 61], [:seconds, 1]])).interval.must_equal(:years=>-1, :months=>-1, :days=>-1, :minutes=>-61, :seconds=>-1)
65
- end
66
- end
67
-
68
- it "should use existing method" do
69
- db = Sequel.mock
70
- db.extend_datasets do
71
- def date_add_sql_append(sql, da)
72
- interval = String.new
73
- each_valid_interval_unit(da.interval, Sequel::SQL::DateAdd::DatasetMethods::DEF_DURATION_UNITS) do |value, sql_unit|
74
- interval << "#{value} #{sql_unit} "
75
- end
76
- literal_append(sql, Sequel.function(:da, da.expr, interval))
77
- end
78
- end
79
- db.extension :date_arithmetic
80
- db.literal(Sequel.date_add(:a, @h0)).must_equal "da(a, '')"
81
- db.literal(Sequel.date_add(:a, @h1)).must_equal "da(a, '1 days ')"
82
- db.literal(Sequel.date_add(:a, @h2)).must_equal "da(a, '1 years 1 months 1 days 1 hours 1 minutes 1 seconds ')"
83
- end
84
-
85
- it "should correctly literalize on Postgres" do
86
- db = dbf.call(:postgres).dataset.with_quote_identifiers(false)
87
- db.literal(Sequel.date_add(:a, @h0)).must_equal "CAST(a AS timestamp)"
88
- db.literal(Sequel.date_add(:a, @h1)).must_equal "(CAST(a AS timestamp) + CAST('1 days ' AS interval))"
89
- db.literal(Sequel.date_add(:a, @h2)).must_equal "(CAST(a AS timestamp) + CAST('1 years 1 months 1 days 1 hours 1 minutes 1 seconds ' AS interval))"
90
-
91
- db.literal(Sequel.date_add(:a, @h0, :cast=>:timestamptz)).must_equal "CAST(a AS timestamptz)"
92
- db.literal(Sequel.date_sub(:a, @h0, :cast=>:timestamptz)).must_equal "CAST(a AS timestamptz)"
93
- db.literal(Sequel.date_add(:a, @h2, :cast=>:timestamptz)).must_equal "(CAST(a AS timestamptz) + CAST('1 years 1 months 1 days 1 hours 1 minutes 1 seconds ' AS interval))"
94
- end
95
-
96
- it "should correctly literalize on SQLite" do
97
- db = dbf.call(:sqlite).dataset.with_quote_identifiers(false)
98
- db.literal(Sequel.date_add(:a, @h0)).must_equal "datetime(a)"
99
- db.literal(Sequel.date_add(:a, @h1)).must_equal "datetime(a, '1 days')"
100
- db.literal(Sequel.date_add(:a, @h2)).must_equal "datetime(a, '1 years', '1 months', '1 days', '1 hours', '1 minutes', '1 seconds')"
101
- end
102
-
103
- it "should correctly literalize on MySQL" do
104
- db = dbf.call(:mysql).dataset.with_quote_identifiers(false)
105
- db.literal(Sequel.date_add(:a, @h0)).must_equal "CAST(a AS DATETIME)"
106
- db.literal(Sequel.date_add(:a, @h1)).must_equal "DATE_ADD(a, INTERVAL 1 DAY)"
107
- db.literal(Sequel.date_add(:a, @h2)).must_equal "DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(a, INTERVAL 1 YEAR), INTERVAL 1 MONTH), INTERVAL 1 DAY), INTERVAL 1 HOUR), INTERVAL 1 MINUTE), INTERVAL 1 SECOND)"
108
- db.literal(Sequel.date_add(:a, @h0, :cast=>:timestamp)).must_equal "CAST(a AS timestamp)"
109
- end
110
-
111
- it "should correctly literalize on HSQLDB" do
112
- db = Sequel.mock
113
- def db.database_type; :hsqldb end
114
- db.extension :date_arithmetic
115
- db.literal(Sequel.date_add(:a, @h0)).must_equal "CAST(CAST(a AS timestamp) AS timestamp)"
116
- db.literal(Sequel.date_add(:a, @h1)).must_equal "DATE_ADD(CAST(a AS timestamp), INTERVAL 1 DAY)"
117
- db.literal(Sequel.date_add(:a, @h2)).must_equal "DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(CAST(a AS timestamp), INTERVAL 1 YEAR), INTERVAL 1 MONTH), INTERVAL 1 DAY), INTERVAL 1 HOUR), INTERVAL 1 MINUTE), INTERVAL 1 SECOND)"
118
-
119
- db.literal(Sequel.date_add(:a, @h0, :cast=>:datetime)).must_equal "CAST(CAST(a AS datetime) AS datetime)"
120
- db.literal(Sequel.date_add(:a, @h2, :cast=>:datetime)).must_equal "DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(DATE_ADD(CAST(a AS datetime), INTERVAL 1 YEAR), INTERVAL 1 MONTH), INTERVAL 1 DAY), INTERVAL 1 HOUR), INTERVAL 1 MINUTE), INTERVAL 1 SECOND)"
121
- end
122
-
123
- it "should correctly literalize on MSSQL" do
124
- db = dbf.call(:mssql).dataset.with_quote_identifiers(false)
125
- db.literal(Sequel.date_add(:A, @h0)).must_equal "CAST(A AS datetime)"
126
- db.literal(Sequel.date_add(:A, @h1)).must_equal "DATEADD(day, 1, A)"
127
- db.literal(Sequel.date_add(:A, @h2)).must_equal "DATEADD(second, 1, DATEADD(minute, 1, DATEADD(hour, 1, DATEADD(day, 1, DATEADD(month, 1, DATEADD(year, 1, A))))))"
128
- db.literal(Sequel.date_add(:A, @h0, :cast=>:timestamp)).must_equal "CAST(A AS timestamp)"
129
- end
130
-
131
- it "should correctly literalize on H2" do
132
- db = Sequel.mock
133
- def db.database_type; :h2 end
134
- db.extension :date_arithmetic
135
- db.literal(Sequel.date_add(:a, @h0)).must_equal "CAST(a AS timestamp)"
136
- db.literal(Sequel.date_add(:a, @h1)).must_equal "DATEADD('day', 1, a)"
137
- db.literal(Sequel.date_add(:a, @h2)).must_equal "DATEADD('second', 1, DATEADD('minute', 1, DATEADD('hour', 1, DATEADD('day', 1, DATEADD('month', 1, DATEADD('year', 1, a))))))"
138
- db.literal(Sequel.date_add(:a, @h0, :cast=>:datetime)).must_equal "CAST(a AS datetime)"
139
- end
140
-
141
- it "should correctly literalize on access" do
142
- db = dbf.call(:access).dataset.with_quote_identifiers(false)
143
- db.literal(Sequel.date_add(:a, @h0)).must_equal "CDate(a)"
144
- db.literal(Sequel.date_add(:a, @h1)).must_equal "DATEADD('d', 1, a)"
145
- db.literal(Sequel.date_add(:a, @h2)).must_equal "DATEADD('s', 1, DATEADD('n', 1, DATEADD('h', 1, DATEADD('d', 1, DATEADD('m', 1, DATEADD('yyyy', 1, a))))))"
146
- end
147
-
148
- it "should correctly literalize on Derby" do
149
- db = Sequel.mock
150
- def db.database_type; :derby end
151
- db.extension :date_arithmetic
152
- db.literal(Sequel.date_add(:a, @h0)).must_equal "CAST(a AS timestamp)"
153
- db.literal(Sequel.date_add(:a, @h1)).must_equal "{fn timestampadd(SQL_TSI_DAY, 1, timestamp(a))}"
154
- db.literal(Sequel.date_add(:a, @h2)).must_equal "{fn timestampadd(SQL_TSI_SECOND, 1, timestamp({fn timestampadd(SQL_TSI_MINUTE, 1, timestamp({fn timestampadd(SQL_TSI_HOUR, 1, timestamp({fn timestampadd(SQL_TSI_DAY, 1, timestamp({fn timestampadd(SQL_TSI_MONTH, 1, timestamp({fn timestampadd(SQL_TSI_YEAR, 1, timestamp(a))}))}))}))}))}))}"
155
- db.literal(Sequel.date_add(Date.civil(2012, 11, 12), @h1)).must_equal "{fn timestampadd(SQL_TSI_DAY, 1, timestamp((CAST('2012-11-12' AS varchar(255)) || ' 00:00:00')))}"
156
- db.literal(Sequel.date_add(:a, @h0, :cast=>:datetime)).must_equal "CAST(a AS datetime)"
157
- end
158
-
159
- it "should correctly literalize on Oracle" do
160
- db = dbf.call(:oracle).dataset.with_quote_identifiers(false)
161
- db.literal(Sequel.date_add(:A, @h0)).must_equal "CAST(A AS timestamp)"
162
- db.literal(Sequel.date_add(:A, @h1)).must_equal "(A + INTERVAL '1' DAY)"
163
- db.literal(Sequel.date_add(:A, @h2)).must_equal "(A + INTERVAL '1' YEAR + INTERVAL '1' MONTH + INTERVAL '1' DAY + INTERVAL '1' HOUR + INTERVAL '1' MINUTE + INTERVAL '1' SECOND)"
164
- db.literal(Sequel.date_add(:A, @h0, :cast=>:datetime)).must_equal "CAST(A AS datetime)"
165
- end
166
-
167
- it "should correctly literalize on DB2" do
168
- db = dbf.call(:db2)
169
- db.literal(Sequel.date_add(:A, @h0)).must_equal "CAST(A AS timestamp)"
170
- db.literal(Sequel.date_add(:A, @h1)).must_equal "(CAST(A AS timestamp) + 1 days)"
171
- db.literal(Sequel.date_add(:A, @h0)).must_equal "CAST(A AS timestamp)"
172
- db.literal(Sequel.date_add(:A, @h1, :cast=>:datetime)).must_equal "(CAST(A AS datetime) + 1 days)"
173
- db.literal(Sequel.date_add(:A, @h2, :cast=>:datetime)).must_equal "(CAST(A AS datetime) + 1 years + 1 months + 1 days + 1 hours + 1 minutes + 1 seconds)"
174
- end
175
-
176
- it "should raise error if literalizing on an unsupported database" do
177
- db = Sequel.mock
178
- db.extension :date_arithmetic
179
- lambda{db.literal(Sequel.date_add(:a, @h0))}.must_raise(Sequel::Error)
180
- end
181
- end
@@ -1,169 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "datetime_parse_to_time extension" do
4
- before(:all) do
5
- Sequel.extension :datetime_parse_to_time
6
- end
7
- after(:all) do
8
- # Can't undo the adding of the module to Sequel, so removing the
9
- # method in the module is the only way to fix it.
10
- Sequel::DateTimeParseToTime.send(:remove_method, :convert_input_timestamp)
11
- end
12
-
13
- before do
14
- @db = Sequel::Database.new
15
- @dataset = @db.dataset.with_extend do
16
- def supports_timestamp_timezones?; true end
17
- def supports_timestamp_usecs?; false end
18
- end
19
- @utc_time = Time.utc(2010, 1, 2, 3, 4, 5)
20
- @local_time = Time.local(2010, 1, 2, 3, 4, 5)
21
- @offset = sprintf("%+03i%02i", *(@local_time.utc_offset/60).divmod(60))
22
- @dt_offset = @local_time.utc_offset/Rational(86400, 1)
23
- @utc_datetime = DateTime.new(2010, 1, 2, 3, 4, 5)
24
- @local_datetime = DateTime.new(2010, 1, 2, 3, 4, 5, @dt_offset)
25
- end
26
- after do
27
- Sequel.default_timezone = nil
28
- Sequel.datetime_class = Time
29
- end
30
-
31
- it "should handle conversions during invalid localtimes" do
32
- # This only checks of a couple of times that may be invalid.
33
- # You can run with TZ=Europe/Berlin or TZ=US/Pacific
34
- Sequel.database_timezone = :utc
35
- Sequel.database_to_application_timestamp("2017-03-26 02:30:00").getutc.hour.must_equal 2
36
- Sequel.database_to_application_timestamp("2017-03-12 02:30:00").getutc.hour.must_equal 2
37
- end
38
-
39
- it "should handle an database timezone of :utc when literalizing values" do
40
- Sequel.database_timezone = :utc
41
- @dataset.literal(Time.utc(2010, 1, 2, 3, 4, 5)).must_equal "'2010-01-02 03:04:05+0000'"
42
- @dataset.literal(DateTime.new(2010, 1, 2, 3, 4, 5)).must_equal "'2010-01-02 03:04:05+0000'"
43
- end
44
-
45
- it "should handle an database timezone of :local when literalizing values" do
46
- Sequel.database_timezone = :local
47
- @dataset.literal(Time.local(2010, 1, 2, 3, 4, 5)).must_equal "'2010-01-02 03:04:05#{@offset}'"
48
- @dataset.literal(DateTime.new(2010, 1, 2, 3, 4, 5, @dt_offset)).must_equal "'2010-01-02 03:04:05#{@offset}'"
49
- end
50
-
51
- it "should have Database#timezone override Sequel.database_timezone" do
52
- Sequel.database_timezone = :local
53
- @db.timezone = :utc
54
- @dataset.literal(Time.utc(2010, 1, 2, 3, 4, 5)).must_equal "'2010-01-02 03:04:05+0000'"
55
- @dataset.literal(DateTime.new(2010, 1, 2, 3, 4, 5)).must_equal "'2010-01-02 03:04:05+0000'"
56
-
57
- Sequel.database_timezone = :utc
58
- @db.timezone = :local
59
- @dataset.literal(Time.local(2010, 1, 2, 3, 4, 5)).must_equal "'2010-01-02 03:04:05#{@offset}'"
60
- @dataset.literal(DateTime.new(2010, 1, 2, 3, 4, 5, @dt_offset)).must_equal "'2010-01-02 03:04:05#{@offset}'"
61
- end
62
-
63
- it "should handle converting database timestamps into application timestamps" do
64
- Sequel.database_timezone = :utc
65
- Sequel.application_timezone = :local
66
- t = Time.now.utc
67
- Sequel.database_to_application_timestamp(t).to_s.must_equal t.getlocal.to_s
68
- Sequel.database_to_application_timestamp(t.to_s).to_s.must_equal t.getlocal.to_s
69
- Sequel.database_to_application_timestamp(t.strftime('%Y-%m-%d %H:%M:%S')).to_s.must_equal t.getlocal.to_s
70
-
71
- Sequel.datetime_class = DateTime
72
- dt = DateTime.now
73
- dt2 = dt.new_offset(0)
74
- Sequel.database_to_application_timestamp(dt2).to_s.must_equal dt.to_s
75
- Sequel.database_to_application_timestamp(dt2.to_s).to_s.must_equal dt.to_s
76
- Sequel.database_to_application_timestamp(dt2.strftime('%Y-%m-%d %H:%M:%S')).to_s.must_equal dt.to_s
77
-
78
- Sequel.datetime_class = Time
79
- Sequel.database_timezone = :local
80
- Sequel.application_timezone = :utc
81
- Sequel.database_to_application_timestamp(t.getlocal).to_s.must_equal t.to_s
82
- Sequel.database_to_application_timestamp(t.getlocal.to_s).to_s.must_equal t.to_s
83
- Sequel.database_to_application_timestamp(t.getlocal.strftime('%Y-%m-%d %H:%M:%S')).to_s.must_equal t.to_s
84
-
85
- Sequel.datetime_class = DateTime
86
- Sequel.database_to_application_timestamp(dt).to_s.must_equal dt2.to_s
87
- Sequel.database_to_application_timestamp(dt.to_s).to_s.must_equal dt2.to_s
88
- Sequel.database_to_application_timestamp(dt.strftime('%Y-%m-%d %H:%M:%S')).to_s.must_equal dt2.to_s
89
- end
90
-
91
- it "should handle typecasting timestamp columns" do
92
- Sequel.typecast_timezone = :utc
93
- Sequel.application_timezone = :local
94
- t = Time.now.utc
95
- @db.typecast_value(:datetime, t).to_s.must_equal t.getlocal.to_s
96
- @db.typecast_value(:datetime, t.to_s).to_s.must_equal t.getlocal.to_s
97
- @db.typecast_value(:datetime, t.strftime('%Y-%m-%d %H:%M:%S')).to_s.must_equal t.getlocal.to_s
98
-
99
- Sequel.datetime_class = DateTime
100
- dt = DateTime.now
101
- dt2 = dt.new_offset(0)
102
- @db.typecast_value(:datetime, dt2).to_s.must_equal dt.to_s
103
- @db.typecast_value(:datetime, dt2.to_s).to_s.must_equal dt.to_s
104
- @db.typecast_value(:datetime, dt2.strftime('%Y-%m-%d %H:%M:%S')).to_s.must_equal dt.to_s
105
-
106
- Sequel.datetime_class = Time
107
- Sequel.typecast_timezone = :local
108
- Sequel.application_timezone = :utc
109
- @db.typecast_value(:datetime, t.getlocal).to_s.must_equal t.to_s
110
- @db.typecast_value(:datetime, t.getlocal.to_s).to_s.must_equal t.to_s
111
- @db.typecast_value(:datetime, t.getlocal.strftime('%Y-%m-%d %H:%M:%S')).to_s.must_equal t.to_s
112
-
113
- Sequel.datetime_class = DateTime
114
- @db.typecast_value(:datetime, dt).to_s.must_equal dt2.to_s
115
- @db.typecast_value(:datetime, dt.to_s).to_s.must_equal dt2.to_s
116
- @db.typecast_value(:datetime, dt.strftime('%Y-%m-%d %H:%M:%S')).to_s.must_equal dt2.to_s
117
- end
118
-
119
- it "should handle converting database timestamp columns from an array of values" do
120
- Sequel.database_timezone = :utc
121
- Sequel.application_timezone = :local
122
- t = Time.now.utc
123
- Sequel.database_to_application_timestamp([t.year, t.mon, t.day, t.hour, t.min, t.sec]).to_s.must_equal t.getlocal.to_s
124
-
125
- Sequel.datetime_class = DateTime
126
- dt = DateTime.now
127
- dt2 = dt.new_offset(0)
128
- Sequel.database_to_application_timestamp([dt2.year, dt2.mon, dt2.day, dt2.hour, dt2.min, dt2.sec]).to_s.must_equal dt.to_s
129
-
130
- Sequel.datetime_class = Time
131
- Sequel.database_timezone = :local
132
- Sequel.application_timezone = :utc
133
- t = t.getlocal
134
- Sequel.database_to_application_timestamp([t.year, t.mon, t.day, t.hour, t.min, t.sec]).to_s.must_equal t.getutc.to_s
135
-
136
- Sequel.datetime_class = DateTime
137
- Sequel.database_to_application_timestamp([dt.year, dt.mon, dt.day, dt.hour, dt.min, dt.sec]).to_s.must_equal dt2.to_s
138
- end
139
-
140
- it "should raise an InvalidValue error when an error occurs while converting a timestamp" do
141
- proc{Sequel.database_to_application_timestamp([0, 0, 0, 0, 0, 0])}.must_raise(Sequel::InvalidValue)
142
- end
143
-
144
- it "should raise an error when attempting to typecast to a timestamp from an unsupported type" do
145
- proc{Sequel.database_to_application_timestamp(Object.new)}.must_raise(Sequel::InvalidValue)
146
- end
147
-
148
- it "should raise an InvalidValue error when the DateTime class is used and when a bad application timezone is used when attempting to convert timestamps" do
149
- Sequel.application_timezone = :blah
150
- Sequel.datetime_class = DateTime
151
- proc{Sequel.database_to_application_timestamp('2009-06-01 10:20:30')}.must_raise(Sequel::InvalidValue)
152
- end
153
-
154
- it "should raise an InvalidValue error when the DateTime class is used and when a bad database timezone is used when attempting to convert timestamps" do
155
- Sequel.database_timezone = :blah
156
- Sequel.datetime_class = DateTime
157
- proc{Sequel.database_to_application_timestamp('2009-06-01 10:20:30')}.must_raise(Sequel::InvalidValue)
158
- end
159
-
160
- it "should have Sequel.default_timezone= should set all other timezones" do
161
- Sequel.database_timezone.must_be_nil
162
- Sequel.application_timezone.must_be_nil
163
- Sequel.typecast_timezone.must_be_nil
164
- Sequel.default_timezone = :utc
165
- Sequel.database_timezone.must_equal :utc
166
- Sequel.application_timezone.must_equal :utc
167
- Sequel.typecast_timezone.must_equal :utc
168
- end
169
- end
@@ -1,100 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe Sequel::Model, ".def_dataset_method" do
4
- before do
5
- @c = Class.new(Sequel::Model(:items))
6
- @c.plugin :def_dataset_method
7
- end
8
-
9
- it "should add a method to the dataset and model if called with a block argument" do
10
- @c.def_dataset_method(:return_3){3}
11
- @c.return_3.must_equal 3
12
- @c.dataset.return_3.must_equal 3
13
- end
14
-
15
- it "should handle weird method names" do
16
- @c.def_dataset_method(:"return 3"){3}
17
- @c.send(:"return 3").must_equal 3
18
- @c.dataset.send(:"return 3").must_equal 3
19
- end
20
-
21
- it "should not add a model method if the model already responds to the method" do
22
- @c.instance_eval do
23
- def foo
24
- 1
25
- end
26
-
27
- private
28
-
29
- def bar
30
- 2
31
- end
32
-
33
- def_dataset_method(:foo){3}
34
- def_dataset_method(:bar){4}
35
- end
36
- @c.foo.must_equal 1
37
- @c.dataset.foo.must_equal 3
38
- @c.send(:bar).must_equal 2
39
- @c.dataset.bar.must_equal 4
40
- end
41
-
42
- it "should add all passed methods to the model if called without a block argument" do
43
- @c.def_dataset_method(:return_3, :return_4)
44
- proc{@c.return_3}.must_raise(NoMethodError)
45
- proc{@c.return_4}.must_raise(NoMethodError)
46
- @c.dataset = @c.dataset.with_extend do
47
- def return_3; 3; end
48
- def return_4; 4; end
49
- end
50
- @c.return_3.must_equal 3
51
- @c.return_4.must_equal 4
52
- end
53
-
54
- it "should cache calls and readd methods if set_dataset is used" do
55
- @c.def_dataset_method(:return_3){3}
56
- @c.set_dataset :items
57
- @c.return_3.must_equal 3
58
- @c.dataset.return_3.must_equal 3
59
- end
60
-
61
- it "should readd methods to subclasses, if set_dataset is used in a subclass" do
62
- @c.def_dataset_method(:return_3){3}
63
- c = Class.new(@c)
64
- c.set_dataset :items
65
- c.return_3.must_equal 3
66
- c.dataset.return_3.must_equal 3
67
- end
68
- end
69
-
70
- describe Sequel::Model, ".subset" do
71
- before do
72
- @c = Class.new(Sequel::Model(:items))
73
- @c.plugin :def_dataset_method
74
- DB.reset
75
- end
76
-
77
- it "should create a filter on the underlying dataset" do
78
- proc {@c.new_only}.must_raise(NoMethodError)
79
-
80
- @c.subset(:new_only){age < 'new'}
81
-
82
- @c.new_only.sql.must_equal "SELECT * FROM items WHERE (age < 'new')"
83
- @c.dataset.new_only.sql.must_equal "SELECT * FROM items WHERE (age < 'new')"
84
-
85
- @c.subset(:pricey){price > 100}
86
-
87
- @c.pricey.sql.must_equal "SELECT * FROM items WHERE (price > 100)"
88
- @c.dataset.pricey.sql.must_equal "SELECT * FROM items WHERE (price > 100)"
89
-
90
- @c.pricey.new_only.sql.must_equal "SELECT * FROM items WHERE ((price > 100) AND (age < 'new'))"
91
- @c.new_only.pricey.sql.must_equal "SELECT * FROM items WHERE ((age < 'new') AND (price > 100))"
92
- end
93
-
94
- it "should not override existing model methods" do
95
- def @c.active() true end
96
- @c.subset(:active, :active)
97
- @c.active.must_equal true
98
- end
99
- end
100
-
@@ -1,150 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::DefaultsSetter" do
4
- before do
5
- @db = db = Sequel.mock
6
- def db.supports_schema_parsing?() true end
7
- def db.schema(*) [] end
8
- @c = c = Class.new(Sequel::Model(db[:foo]))
9
- @c.instance_variable_set(:@db_schema, {:a=>{}})
10
- @c.plugin :defaults_setter
11
- @c.columns :a
12
- @pr = proc{|x| db.define_singleton_method(:schema){|*| [[:id, {:primary_key=>true}], [:a, {:ruby_default => x, :primary_key=>false}]]}; c.dataset = c.dataset; c}
13
- end
14
- after do
15
- Sequel.datetime_class = Time
16
- end
17
-
18
- it "should set default value upon initialization" do
19
- @pr.call(2).new.a.must_equal 2
20
- end
21
-
22
- it "should not mark the column as modified" do
23
- @pr.call(2).new.changed_columns.must_equal []
24
- end
25
-
26
- it "should not set a default of nil" do
27
- @pr.call(nil).new.class.default_values.must_equal({})
28
- end
29
-
30
- it "should set a default of false" do
31
- @pr.call(false).new.a.must_equal false
32
- end
33
-
34
- it "should handle Sequel::CURRENT_DATE default by using the current Date" do
35
- @pr.call(Sequel::CURRENT_DATE).new.a.must_equal Date.today
36
- end
37
-
38
- it "should handle Sequel::CURRENT_TIMESTAMP default by using the current Time" do
39
- t = @pr.call(Sequel::CURRENT_TIMESTAMP).new.a
40
- t.must_be_kind_of(Time)
41
- (t - Time.now).must_be :<, 1
42
- end
43
-
44
- it "should handle :callable_default values in schema in preference to :ruby_default" do
45
- @db.define_singleton_method(:schema) do |*|
46
- [[:id, {:primary_key=>true}],
47
- [:a, {:ruby_default => Time.now, :callable_default=>lambda{Date.today}, :primary_key=>false}]]
48
- end
49
- @c.dataset = @c.dataset
50
- @c.new.a.must_equal Date.today
51
- end
52
-
53
- it "should handle Sequel::CURRENT_TIMESTAMP default by using the current DateTime if Sequel.datetime_class is DateTime" do
54
- Sequel.datetime_class = DateTime
55
- t = @pr.call(Sequel::CURRENT_TIMESTAMP).new.a
56
- t.must_be_kind_of(DateTime)
57
- (t - DateTime.now).must_be :<, 1/86400.0
58
- end
59
-
60
- it "should work correctly with the current_datetime_timestamp extension" do
61
- @db.autoid = 1
62
- @db.fetch = {:id=>1}
63
- @c.dataset = @c.dataset.extension(:current_datetime_timestamp)
64
- c = @pr.call(Sequel::CURRENT_TIMESTAMP)
65
- @db.sqls
66
- o = c.new
67
- o.a = o.a
68
- o.save
69
- @db.sqls.must_equal ["INSERT INTO foo (a) VALUES (CURRENT_TIMESTAMP)", "SELECT * FROM foo WHERE id = 1"]
70
- end
71
-
72
- it "should cache default values if :cache plugin option is used" do
73
- @c.plugin :defaults_setter, :cache => true
74
- @c.default_values[:a] = 'a'
75
- o = @c.new
76
- o.a.must_equal 'a'
77
- o.values[:a].must_equal 'a'
78
- o.a.must_be_same_as(o.a)
79
- end
80
-
81
- it "should not cache default values if :cache plugin option is used and there is no default values" do
82
- @c.plugin :defaults_setter, :cache => true
83
- o = @c.new
84
- o.a.must_be_nil
85
- o.values.must_be_empty
86
- o.a.must_be_nil
87
- o.a.must_be_same_as(o.a)
88
- end
89
-
90
- it "should not override a given value" do
91
- @pr.call(2)
92
- @c.new('a'=>3).a.must_equal 3
93
- @c.new('a'=>nil).a.must_be_nil
94
- end
95
-
96
- it "should work correctly when subclassing" do
97
- Class.new(@pr.call(2)).new.a.must_equal 2
98
- end
99
-
100
- it "should contain the default values in default_values" do
101
- @pr.call(2).default_values.must_equal(:a=>2)
102
- @c.default_values.clear
103
- @pr.call(nil).default_values.must_equal({})
104
- end
105
-
106
- it "should allow modifications of default values" do
107
- @pr.call(2)
108
- @c.default_values[:a] = 3
109
- @c.new.a.must_equal 3
110
- end
111
-
112
- it "should allow proc default values" do
113
- @pr.call(2)
114
- @c.default_values[:a] = proc{3}
115
- @c.new.a.must_equal 3
116
- end
117
-
118
- it "should have procs that set default values set them to nil" do
119
- @pr.call(2)
120
- @c.default_values[:a] = proc{nil}
121
- @c.new.a.must_be_nil
122
- end
123
-
124
- it "should work in subclasses" do
125
- @pr.call(2)
126
- @c.default_values[:a] = proc{1}
127
- c = Class.new(@c)
128
-
129
- @c.new.a.must_equal 1
130
- c.new.a.must_equal 1
131
-
132
- c.default_values[:a] = proc{2}
133
- @c.new.a.must_equal 1
134
- c.new.a.must_equal 2
135
- end
136
-
137
- it "should work correctly on a model without a dataset" do
138
- @pr.call(2)
139
- c = Class.new(Sequel::Model(@db[:bar]))
140
- c.plugin :defaults_setter
141
- c.default_values.must_equal(:a=>2)
142
- end
143
-
144
- it "should freeze default values when freezing model class" do
145
- c = Class.new(Sequel::Model(@db[:bar]))
146
- c.plugin :defaults_setter
147
- c.freeze
148
- c.default_values.frozen?.must_equal true
149
- end
150
- end
@@ -1,73 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::DelayAddAssociation" do
4
- before do
5
- @db = Sequel.mock(:autoid=>1, :numrows=>1, :fetch=>{:id=>1, :name=>'a', :c_id=>nil})
6
- @c = Class.new(Sequel::Model(@db[:cs]))
7
- @c.send(:define_method, :save){|*| super(:changed=>true)}
8
- @c.plugin :delay_add_association
9
- @c.columns :id, :name, :c_id
10
- @c.one_to_many :cs, :class=>@c, :key=>:c_id
11
- @db.sqls
12
- end
13
-
14
- it "should delay adding of the association until after creation" do
15
- @o = @c.new(:name=>'a')
16
- @o.add_c(@c.load(:id=>2, :name=>'b'))
17
- @db.sqls.must_equal []
18
- @o.save
19
- @db.sqls.must_equal ["INSERT INTO cs (name) VALUES ('a')", "SELECT * FROM cs WHERE (id = 1) LIMIT 1", "UPDATE cs SET c_id = 1 WHERE (id = 2)"]
20
- end
21
-
22
- it "should immediately reflect changes in cached association" do
23
- @o = @c.new(:name=>'a')
24
- o = @c.load(:id=>2, :name=>'b')
25
- @o.add_c(o)
26
- @o.cs.must_equal [o]
27
- @db.sqls.must_equal []
28
- end
29
-
30
- it "should not affect adding associations to existing rows" do
31
- @o = @c.load(:id=>1, :name=>'a')
32
- @o.add_c(@c.load(:id=>2, :name=>'b'))
33
- @db.sqls.must_equal ["UPDATE cs SET c_id = 1 WHERE (id = 2)"]
34
- end
35
-
36
- it "should raise an error when saving if the associated object is invalid" do
37
- @c.send(:define_method, :validate){|*| errors.add(:name, 'is b') if name == 'b'}
38
- @o = @c.new(:name=>'a')
39
- @o.add_c(@c.load(:id=>2, :name=>'b'))
40
- proc{@o.save}.must_raise Sequel::ValidationFailed
41
- end
42
-
43
- it "should return nil when saving if the associated object is invalid when raise_on_save_failure is false" do
44
- @c.raise_on_save_failure = false
45
- @c.send(:define_method, :validate){|*| errors.add(:name, 'is b') if name == 'b'}
46
- @o = @c.new(:name=>'a')
47
- @o.add_c(@c.load(:id=>2, :name=>'b'))
48
- @o.save.must_be_nil
49
- @o.errors[:cs].must_equal ["name is b"]
50
- @o.cs.first.errors[:name].must_equal ['is b']
51
- end
52
-
53
- it "should work when passing in hashes" do
54
- @o = @c.new(:name=>'a')
55
- @o.add_c(:name=>'b')
56
- @db.sqls.must_equal []
57
- @o.save
58
- @db.sqls.must_equal [
59
- "INSERT INTO cs (name) VALUES ('a')",
60
- "SELECT * FROM cs WHERE (id = 1) LIMIT 1",
61
- "INSERT INTO cs (name, c_id) VALUES ('b', 1)",
62
- "SELECT * FROM cs WHERE (id = 2) LIMIT 1"]
63
- end
64
-
65
- it "should work when passing in primary keys" do
66
- @db.fetch = [[{:id=>2, :name=>'b', :c_id=>nil}], [{:id=>1, :name=>'a', :c_id=>nil}]]
67
- @o = @c.new(:name=>'a')
68
- @o.add_c(2)
69
- @db.sqls.must_equal ["SELECT * FROM cs WHERE (id = 2) LIMIT 1"]
70
- @o.save
71
- @db.sqls.must_equal ["INSERT INTO cs (name) VALUES ('a')", "SELECT * FROM cs WHERE (id = 1) LIMIT 1", "UPDATE cs SET c_id = 1 WHERE (id = 2)"]
72
- end
73
- end