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,23 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "pg_loose_count extension" do
4
- before do
5
- @db = Sequel.mock(:host=>'postgres', :fetch=>{:v=>1}).extension(:pg_loose_count)
6
- @db.extend_datasets{def quote_identifiers?; false end}
7
- end
8
-
9
- it "should add loose_count method getting fast count for entire table using table statistics" do
10
- @db.loose_count(:a).must_equal 1
11
- @db.sqls.must_equal ["SELECT CAST(reltuples AS integer) AS v FROM pg_class WHERE (oid = CAST(CAST('a' AS regclass) AS oid)) LIMIT 1"]
12
- end
13
-
14
- it "should support schema qualified tables" do
15
- @db.loose_count(Sequel[:a][:b]).must_equal 1
16
- @db.sqls.must_equal ["SELECT CAST(reltuples AS integer) AS v FROM pg_class WHERE (oid = CAST(CAST('a.b' AS regclass) AS oid)) LIMIT 1"]
17
- end
18
-
19
- with_symbol_splitting "should support schema qualified table symbols" do
20
- @db.loose_count(:a__b).must_equal 1
21
- @db.sqls.must_equal ["SELECT CAST(reltuples AS integer) AS v FROM pg_class WHERE (oid = CAST(CAST('a.b' AS regclass) AS oid)) LIMIT 1"]
22
- end
23
- end
@@ -1,60 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :pg_array, :pg_range, :pg_range_ops
4
-
5
- describe "Sequel::Postgres::RangeOp" do
6
- before do
7
- db = Sequel.connect('mock://postgres')
8
- db.extend_datasets{def quote_identifiers?; false end}
9
- @ds = db.dataset
10
- @h = Sequel.pg_range_op(:h)
11
- end
12
-
13
- it "#pg_range should return self" do
14
- @h.pg_range.must_be_same_as(@h)
15
- end
16
-
17
- it "Sequel.pg_range_op should return argument if already a RangeOp" do
18
- Sequel.pg_range_op(@h).must_be_same_as(@h)
19
- end
20
-
21
- it "Sequel.pg_range should return a new RangeOp if not given a range" do
22
- @ds.literal(Sequel.pg_range(:h).lower).must_equal "lower(h)"
23
- end
24
-
25
- it "#pg_range should return a RangeOp for literal strings, and expressions" do
26
- @ds.literal(Sequel.function(:b, :h).pg_range.lower).must_equal "lower(b(h))"
27
- @ds.literal(Sequel.lit('h').pg_range.lower).must_equal "lower(h)"
28
- end
29
-
30
- it "PGRange#op should return a RangeOp" do
31
- @ds.literal(Sequel.pg_range(1..2, :numrange).op.lower).must_equal "lower(numrange(1,2,'[]'))"
32
- end
33
-
34
- it "should define methods for all of the PostgreSQL range operators" do
35
- @ds.literal(@h.contains(@h)).must_equal "(h @> h)"
36
- @ds.literal(@h.contained_by(@h)).must_equal "(h <@ h)"
37
- @ds.literal(@h.overlaps(@h)).must_equal "(h && h)"
38
- @ds.literal(@h.left_of(@h)).must_equal "(h << h)"
39
- @ds.literal(@h.right_of(@h)).must_equal "(h >> h)"
40
- @ds.literal(@h.ends_before(@h)).must_equal "(h &< h)"
41
- @ds.literal(@h.starts_after(@h)).must_equal "(h &> h)"
42
- @ds.literal(@h.adjacent_to(@h)).must_equal "(h -|- h)"
43
- end
44
-
45
- it "should define methods for all of the PostgreSQL range functions" do
46
- @ds.literal(@h.lower).must_equal "lower(h)"
47
- @ds.literal(@h.upper).must_equal "upper(h)"
48
- @ds.literal(@h.isempty).must_equal "isempty(h)"
49
- @ds.literal(@h.lower_inc).must_equal "lower_inc(h)"
50
- @ds.literal(@h.upper_inc).must_equal "upper_inc(h)"
51
- @ds.literal(@h.lower_inf).must_equal "lower_inf(h)"
52
- @ds.literal(@h.upper_inf).must_equal "upper_inf(h)"
53
- end
54
-
55
- it "+ - * operators should be defined and return a RangeOp" do
56
- @ds.literal((@h + @h).lower).must_equal "lower((h + h))"
57
- @ds.literal((@h * @h).lower).must_equal "lower((h * h))"
58
- @ds.literal((@h - @h).lower).must_equal "lower((h - h))"
59
- end
60
- end
@@ -1,487 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "pg_range extension" do
4
- before(:all) do
5
- Sequel.extension :pg_array, :pg_range
6
- end
7
-
8
- before do
9
- @db = Sequel.connect('mock://postgres')
10
- @R = Sequel::Postgres::PGRange
11
- @db.extend_datasets do
12
- def supports_timestamp_timezones?; false end
13
- def supports_timestamp_usecs?; false end
14
- def quote_identifiers?; false end
15
- end
16
- @db.extension(:pg_array, :pg_range)
17
- end
18
-
19
- it "should set up conversion procs correctly" do
20
- cp = @db.conversion_procs
21
- cp[3904].call("[1,2]").must_equal @R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'int4range')
22
- cp[3906].call("[1,2]").must_equal @R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'numrange')
23
- cp[3908].call("[2011-01-02 10:20:30,2011-02-03 10:20:30)").must_equal @R.new(Time.local(2011, 1, 2, 10, 20, 30),Time.local(2011, 2, 3, 10, 20, 30), :exclude_begin=>false, :exclude_end=>true, :db_type=>'tsrange')
24
- cp[3910].call("[2011-01-02 10:20:30,2011-02-03 10:20:30)").must_equal @R.new(Time.local(2011, 1, 2, 10, 20, 30),Time.local(2011, 2, 3, 10, 20, 30), :exclude_begin=>false, :exclude_end=>true, :db_type=>'tstzrange')
25
- cp[3912].call("[2011-01-02,2011-02-03)").must_equal @R.new(Date.new(2011, 1, 2),Date.new(2011, 2, 3), :exclude_begin=>false, :exclude_end=>true, :db_type=>'daterange')
26
- cp[3926].call("[1,2]").must_equal @R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'int8range')
27
- end
28
-
29
- it "should set up conversion procs for arrays correctly" do
30
- cp = @db.conversion_procs
31
- cp[3905].call("{\"[1,2]\"}").must_equal [@R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'int4range')]
32
- cp[3907].call("{\"[1,2]\"}").must_equal [@R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'numrange')]
33
- cp[3909].call("{\"[2011-01-02 10:20:30,2011-02-03 10:20:30)\"}").must_equal [@R.new(Time.local(2011, 1, 2, 10, 20, 30),Time.local(2011, 2, 3, 10, 20, 30), :exclude_begin=>false, :exclude_end=>true, :db_type=>'tsrange')]
34
- cp[3911].call("{\"[2011-01-02 10:20:30,2011-02-03 10:20:30)\"}").must_equal [@R.new(Time.local(2011, 1, 2, 10, 20, 30),Time.local(2011, 2, 3, 10, 20, 30), :exclude_begin=>false, :exclude_end=>true, :db_type=>'tstzrange')]
35
- cp[3913].call("{\"[2011-01-02,2011-02-03)\"}").must_equal [@R.new(Date.new(2011, 1, 2),Date.new(2011, 2, 3), :exclude_begin=>false, :exclude_end=>true, :db_type=>'daterange')]
36
- cp[3927].call("{\"[1,2]\"}").must_equal [@R.new(1,2, :exclude_begin=>false, :exclude_end=>false, :db_type=>'int8range')]
37
- end
38
-
39
- it "should literalize Range instances to strings correctly" do
40
- @db.literal(Date.new(2011, 1, 2)...Date.new(2011, 3, 2)).must_equal "'[2011-01-02,2011-03-02)'"
41
- @db.literal(Time.local(2011, 1, 2, 10, 20, 30)...Time.local(2011, 2, 3, 10, 20, 30)).must_equal "'[2011-01-02 10:20:30,2011-02-03 10:20:30)'"
42
- @db.literal(DateTime.new(2011, 1, 2, 10, 20, 30)...DateTime.new(2011, 2, 3, 10, 20, 30)).must_equal "'[2011-01-02 10:20:30,2011-02-03 10:20:30)'"
43
- @db.literal(DateTime.new(2011, 1, 2, 10, 20, 30)...DateTime.new(2011, 2, 3, 10, 20, 30)).must_equal "'[2011-01-02 10:20:30,2011-02-03 10:20:30)'"
44
- @db.literal(1..2).must_equal "'[1,2]'"
45
- @db.literal(1.0..2.0).must_equal "'[1.0,2.0]'"
46
- @db.literal(BigDecimal.new('1.0')..BigDecimal.new('2.0')).must_equal "'[1.0,2.0]'"
47
- @db.literal(Sequel.lit('a')..Sequel.lit('z')).must_equal "'[a,z]'"
48
- @db.literal(''..'()[]",\\2').must_equal "'[\"\",\\(\\)\\[\\]\\\"\\,\\\\2]'"
49
- end
50
-
51
- it "should literalize PGRange instances to strings correctly" do
52
- @db.literal(@R.new(1, 2)).must_equal "'[1,2]'"
53
- @db.literal(@R.new(true, false)).must_equal "'[true,false]'"
54
- @db.literal(@R.new(1, 2, :exclude_begin=>true)).must_equal "'(1,2]'"
55
- @db.literal(@R.new(1, 2, :exclude_end=>true)).must_equal "'[1,2)'"
56
- @db.literal(@R.new(nil, 2)).must_equal "'[,2]'"
57
- @db.literal(@R.new(1, nil)).must_equal "'[1,]'"
58
- @db.literal(@R.new(1, 2, :db_type=>'int8range')).must_equal "int8range(1,2,'[]')"
59
- @db.literal(@R.new(nil, nil, :empty=>true)).must_equal "'empty'"
60
- @db.literal(@R.new(nil, nil, :empty=>true, :db_type=>'int8range')).must_equal "'empty'::int8range"
61
- @db.literal(@R.new("", 2)).must_equal "'[\"\",2]'"
62
- end
63
-
64
- it "should not affect literalization of custom objects" do
65
- o = Object.new
66
- def o.sql_literal(ds) 'v' end
67
- @db.literal(o).must_equal 'v'
68
- end
69
-
70
- it "should support using Range instances as bound variables" do
71
- @db.bound_variable_arg(1..2, nil).must_equal "[1,2]"
72
- end
73
-
74
- it "should support using PGRange instances as bound variables" do
75
- @db.bound_variable_arg(@R.new(1, 2), nil).must_equal "[1,2]"
76
- end
77
-
78
- it "should support using arrays of Range instances as bound variables" do
79
- @db.bound_variable_arg([1..2,2...3], nil).must_equal '{"[1,2]","[2,3)"}'
80
- end
81
-
82
- it "should support using PGRange instances as bound variables" do
83
- @db.bound_variable_arg([@R.new(1, 2),@R.new(2, 3)], nil).must_equal '{"[1,2]","[2,3]"}'
84
- end
85
-
86
- it "should parse range types from the schema correctly" do
87
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i4', :db_type=>'int4range'}, {:name=>'i8', :db_type=>'int8range'}, {:name=>'n', :db_type=>'numrange'}, {:name=>'d', :db_type=>'daterange'}, {:name=>'ts', :db_type=>'tsrange'}, {:name=>'tz', :db_type=>'tstzrange'}]
88
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :int4range, :int8range, :numrange, :daterange, :tsrange, :tstzrange]
89
- end
90
-
91
- it "should parse arrays of range types from the schema correctly" do
92
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i4', :db_type=>'int4range[]'}, {:name=>'i8', :db_type=>'int8range[]'}, {:name=>'n', :db_type=>'numrange[]'}, {:name=>'d', :db_type=>'daterange[]'}, {:name=>'ts', :db_type=>'tsrange[]'}, {:name=>'tz', :db_type=>'tstzrange[]'}]
93
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :int4range_array, :int8range_array, :numrange_array, :daterange_array, :tsrange_array, :tstzrange_array]
94
- end
95
-
96
- it "should set :ruby_default schema entries if default value is recognized" do
97
- @db.fetch = [{:name=>'id', :db_type=>'integer', :default=>'1'}, {:oid=>3904, :name=>'t', :db_type=>'int4range', :default=>"'[1,5)'::int4range"}]
98
- s = @db.schema(:items)
99
- s[1][1][:ruby_default].must_equal Sequel::Postgres::PGRange.new(1, 5, :exclude_end=>true, :db_type=>'int4range')
100
- end
101
-
102
- describe "database typecasting" do
103
- before do
104
- @o = @R.new(1, 2, :db_type=>'int4range')
105
- @o2 = @R.new(1, 2, :db_type=>'int8range')
106
- @eo = @R.new(nil, nil, :empty=>true, :db_type=>'int4range')
107
- @eo2 = @R.new(nil, nil, :empty=>true, :db_type=>'int8range')
108
- end
109
-
110
- it "should handle multiple range types" do
111
- %w'int4 int8 num date ts tstz'.each do |i|
112
- @db.typecast_value(:"#{i}range", @R.new(1, 2, :db_type=>"#{i}range")).must_equal @R.new(1, 2, :db_type=>"#{i}range")
113
- end
114
- end
115
-
116
- it "should handle multiple array range types" do
117
- %w'int4 int8 num date ts tstz'.each do |i|
118
- @db.typecast_value(:"#{i}range_array", [@R.new(1, 2, :db_type=>"#{i}range")]).class.must_equal(Sequel::Postgres::PGArray)
119
- @db.typecast_value(:"#{i}range_array", [@R.new(1, 2, :db_type=>"#{i}range")]).must_equal [@R.new(1, 2, :db_type=>"#{i}range")]
120
- end
121
- end
122
-
123
- it "should return PGRange value as is if they have the same subtype" do
124
- @db.typecast_value(:int4range, @o).must_be_same_as(@o)
125
- end
126
-
127
- it "should return new PGRange value as is if they have a different subtype" do
128
- @db.typecast_value(:int8range, @o).wont_be_same_as(@o)
129
- @db.typecast_value(:int8range, @o).must_equal @o2
130
- end
131
-
132
- it "should return new PGRange value as is if they have a different subtype and value is empty" do
133
- @db.typecast_value(:int8range, @eo).must_equal @eo2
134
- end
135
-
136
- it "should return new PGRange value if given a Range" do
137
- @db.typecast_value(:int4range, 1..2).must_equal @o
138
- @db.typecast_value(:int4range, 1..2).wont_equal @o2
139
- @db.typecast_value(:int8range, 1..2).must_equal @o2
140
- end
141
-
142
- it "should parse a string argument as the PostgreSQL output format" do
143
- @db.typecast_value(:int4range, '[1,2]').must_equal @o
144
- end
145
-
146
- it "should raise errors for unparsable formats" do
147
- proc{@db.typecast_value(:int8range, 'foo')}.must_raise(Sequel::InvalidValue)
148
- end
149
-
150
- it "should raise errors for unhandled values" do
151
- proc{@db.typecast_value(:int4range, 1)}.must_raise(Sequel::InvalidValue)
152
- end
153
- end
154
-
155
- it "should support registering custom range types" do
156
- @db.register_range_type('foorange')
157
- @db.typecast_value(:foorange, 1..2).must_be_kind_of(@R)
158
- @db.fetch = [{:name=>'id', :db_type=>'foorange'}]
159
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:foorange]
160
- end
161
-
162
- it "should support using a block as a custom conversion proc given as block" do
163
- @db.register_range_type('foo2range'){|s| (s*2).to_i}
164
- @db.typecast_value(:foo2range, '[1,2]').must_be :==, (11..22)
165
- end
166
-
167
- it "should support using a block as a custom conversion proc given as :converter option" do
168
- @db.register_range_type('foo3range', :converter=>proc{|s| (s*2).to_i})
169
- @db.typecast_value(:foo3range, '[1,2]').must_be :==, (11..22)
170
- end
171
-
172
- it "should support using an existing scaler conversion proc via the :subtype_oid option" do
173
- @db.register_range_type('foo4range', :subtype_oid=>16)
174
- @db.typecast_value(:foo4range, '[t,f]').must_equal @R.new(true, false, :db_type=>'foo4range')
175
- end
176
-
177
- it "should raise an error if using :subtype_oid option with unexisting scalar conversion proc" do
178
- proc{@db.register_range_type('fooirange', :subtype_oid=>0)}.must_raise(Sequel::Error)
179
- end
180
-
181
- it "should raise an error if using :converter option and a block argument" do
182
- proc{@db.register_range_type('fooirange', :converter=>proc{}){}}.must_raise(Sequel::Error)
183
- end
184
-
185
- it "should raise an error if using :subtype_oid option and a block argument" do
186
- proc{@db.register_range_type('fooirange', :subtype_oid=>16){}}.must_raise(Sequel::Error)
187
- end
188
-
189
- it "should support registering custom types with :oid option" do
190
- @db.register_range_type('foo5range', :oid=>331)
191
- @db.conversion_procs[331].call('[1,3)').must_be_kind_of(@R)
192
- end
193
-
194
- it "should not support registering custom range types on a per-Database basis for frozen databases" do
195
- @db.freeze
196
- proc{@db.register_range_type('banana', :oid=>7865){|s| s}}.must_raise RuntimeError, TypeError
197
- end
198
-
199
- it "should support registering custom range types on a per-Database basis" do
200
- @db.register_range_type('banana', :oid=>7865){|s| s}
201
- @db.typecast_value(:banana, '[1,2]').class.must_equal(Sequel::Postgres::PGRange)
202
- @db.fetch = [{:name=>'id', :db_type=>'banana'}]
203
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:banana]
204
- @db.conversion_procs.must_include(7865)
205
- @db.respond_to?(:typecast_value_banana, true).must_equal true
206
-
207
- db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
208
- db.extend_datasets(Module.new{def supports_timestamp_timezones?; false; end; def supports_timestamp_usecs?; false; end})
209
- db.extension(:pg_range)
210
- db.fetch = [{:name=>'id', :db_type=>'banana'}]
211
- db.schema(:items).map{|e| e[1][:type]}.must_equal [nil]
212
- db.conversion_procs.wont_include(7865)
213
- db.respond_to?(:typecast_value_banana, true).must_equal false
214
- end
215
-
216
- it "should automatically look up the range and subtype oids when registering per-Database types" do
217
- @db.fetch = [[{:rngsubtype=>21, :rngtypid=>7866}], [{:name=>'id', :db_type=>'banana'}]]
218
- @db.register_range_type('banana', :subtype_typecast=>:integer)
219
- @db.sqls.must_equal ["SELECT rngtypid, rngsubtype FROM pg_range INNER JOIN pg_type ON (pg_type.oid = pg_range.rngtypid) WHERE (typname = 'banana') LIMIT 1"]
220
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:banana]
221
- @db.conversion_procs[7866].call("[1,3)").must_be :==, (1...3)
222
- @db.typecast_value(:banana, '[1,2]').must_be :==, (1..2)
223
- end
224
-
225
- it "should not automatically look up oids if given both subtype and range oids" do
226
- @db.register_range_type('banana', :oid=>7866, :subtype_oid=>21)
227
- @db.sqls.must_equal []
228
- @db.conversion_procs[7866].call("[1,3)").must_be :==, (1...3)
229
- @db.typecast_value(:banana, '[1,2]').must_be :==, (1..2)
230
- end
231
-
232
- it "should not automatically look up oids if given range oid and block" do
233
- @db.register_range_type('banana', :oid=>7866){|s| s.to_i}
234
- @db.sqls.must_equal []
235
- @db.conversion_procs[7866].call("[1,3)").must_be :==, (1...3)
236
- @db.typecast_value(:banana, '[1,2]').must_be :==, (1..2)
237
- end
238
-
239
- it "should return correct results for Database#schema_type_class" do
240
- @db.schema_type_class(:int4range).must_equal Sequel::Postgres::PGRange
241
- @db.schema_type_class(:integer).must_equal Integer
242
- end
243
-
244
- describe "parser" do
245
- before do
246
- @p = @R::Parser.new('int4range', proc(&:to_i))
247
- @sp = @R::Parser.new(nil)
248
- end
249
-
250
- it "should have db_type method to return the database type string" do
251
- @p.db_type.must_equal 'int4range'
252
- end
253
-
254
- it "should have converter method which returns a callable used for conversion" do
255
- @p.converter.call('1').must_equal 1
256
- end
257
-
258
- it "should have call parse input string argument into PGRange instance" do
259
- @p.call('[1,2]').must_equal @R.new(1, 2, :db_type=>'int4range')
260
- end
261
-
262
- it "should handle empty ranges" do
263
- @p.call('empty').must_equal @R.new(nil, nil, :empty=>true, :db_type=>'int4range')
264
- end
265
-
266
- it "should handle exclusive beginnings and endings" do
267
- @p.call('(1,3]').must_equal @R.new(1, 3, :exclude_begin=>true, :db_type=>'int4range')
268
- @p.call('[1,3)').must_equal @R.new(1, 3, :exclude_end=>true, :db_type=>'int4range')
269
- @p.call('(1,3)').must_equal @R.new(1, 3, :exclude_begin=>true, :exclude_end=>true, :db_type=>'int4range')
270
- end
271
-
272
- it "should handle unbounded beginnings and endings" do
273
- @p.call('[,2]').must_equal @R.new(nil, 2, :db_type=>'int4range')
274
- @p.call('[1,]').must_equal @R.new(1, nil, :db_type=>'int4range')
275
- @p.call('[,]').must_equal @R.new(nil, nil, :db_type=>'int4range')
276
- end
277
-
278
- it "should unescape quoted beginnings and endings" do
279
- @sp.call('["\\\\ \\"","\\" \\\\"]').must_equal @R.new("\\ \"", "\" \\")
280
- end
281
-
282
- it "should treat empty quoted string not as unbounded" do
283
- @sp.call('["","z"]').must_equal @R.new("", "z")
284
- @sp.call('["a",""]').must_equal @R.new("a", "")
285
- @sp.call('["",""]').must_equal @R.new("", "")
286
- end
287
- end
288
-
289
- describe "a PGRange instance" do
290
- before do
291
- @r1 = @R.new(1, 2)
292
- @r2 = @R.new(3, nil, :exclude_begin=>true, :db_type=>'int4range')
293
- @r3 = @R.new(nil, 4, :exclude_end=>true, :db_type=>'int8range')
294
- end
295
-
296
- it "should have #begin return the beginning of the range" do
297
- @r1.begin.must_equal 1
298
- @r2.begin.must_equal 3
299
- @r3.begin.must_be_nil
300
- end
301
-
302
- it "should have #end return the end of the range" do
303
- @r1.end.must_equal 2
304
- @r2.end.must_be_nil
305
- @r3.end.must_equal 4
306
- end
307
-
308
- it "should have #db_type return the range's database type" do
309
- @r1.db_type.must_be_nil
310
- @r2.db_type.must_equal 'int4range'
311
- @r3.db_type.must_equal 'int8range'
312
- end
313
-
314
- it "should be able to be created by Sequel.pg_range" do
315
- Sequel.pg_range(1..2).must_equal @r1
316
- end
317
-
318
- it "should have Sequel.pg_range be able to take a database type" do
319
- Sequel.pg_range(1..2, :int4range).must_equal @R.new(1, 2, :db_type=>:int4range)
320
- end
321
-
322
- it "should have Sequel.pg_range return a PGRange as is" do
323
- a = Sequel.pg_range(1..2)
324
- Sequel.pg_range(a).must_be_same_as(a)
325
- end
326
-
327
- it "should have Sequel.pg_range return a new PGRange if the database type differs" do
328
- a = Sequel.pg_range(1..2, :int4range)
329
- b = Sequel.pg_range(a, :int8range)
330
- a.to_range.must_equal b.to_range
331
- a.wont_be_same_as(b)
332
- a.db_type.must_equal :int4range
333
- b.db_type.must_equal :int8range
334
- end
335
-
336
- it "should have #initialize raise if requesting an empty range with beginning or ending" do
337
- proc{@R.new(1, nil, :empty=>true)}.must_raise(Sequel::Error)
338
- proc{@R.new(nil, 2, :empty=>true)}.must_raise(Sequel::Error)
339
- proc{@R.new(nil, nil, :empty=>true, :exclude_begin=>true)}.must_raise(Sequel::Error)
340
- proc{@R.new(nil, nil, :empty=>true, :exclude_end=>true)}.must_raise(Sequel::Error)
341
- end
342
-
343
- it "should quack like a range" do
344
- @r1.cover?(1.5).must_equal true
345
- @r1.cover?(2.5).must_equal false
346
- @r1.first(1).must_equal [1]
347
- @r1.last(1).must_equal [2]
348
- @r1.to_a.must_equal [1, 2]
349
- @r1.first.must_equal 1
350
- @r1.last.must_equal 2
351
- a = []
352
- @r1.step{|x| a << x}
353
- a.must_equal [1, 2]
354
- end
355
-
356
- it "should have cover? handle empty, unbounded, and exclusive beginning ranges" do
357
- @R.empty.cover?(1).must_equal false
358
-
359
- r = @R.new(1, nil)
360
- r.cover?(0).must_equal false
361
- r.cover?(1).must_equal true
362
- r.cover?(2).must_equal true
363
- r.cover?(3).must_equal true
364
-
365
- r = @R.new(nil, 2)
366
- r.cover?(0).must_equal true
367
- r.cover?(1).must_equal true
368
- r.cover?(2).must_equal true
369
- r.cover?(3).must_equal false
370
-
371
- r = @R.new(1, 2, :exclude_begin=>true)
372
- r.cover?(0).must_equal false
373
- r.cover?(1).must_equal false
374
- r.cover?(2).must_equal true
375
- r.cover?(3).must_equal false
376
-
377
- r = @R.new(1, 2, :exclude_end=>true)
378
- r.cover?(0).must_equal false
379
- r.cover?(1).must_equal true
380
- r.cover?(2).must_equal false
381
- r.cover?(3).must_equal false
382
- end
383
-
384
- it "should only consider PGRanges equal if they have the same db_type" do
385
- @R.new(1, 2, :db_type=>'int4range').must_equal @R.new(1, 2, :db_type=>'int4range')
386
- @R.new(1, 2, :db_type=>'int8range').wont_equal @R.new(1, 2, :db_type=>'int4range')
387
- end
388
-
389
- it "should only consider empty PGRanges equal with other empty PGRanges" do
390
- @R.new(nil, nil, :empty=>true).must_equal @R.new(nil, nil, :empty=>true)
391
- @R.new(nil, nil, :empty=>true).wont_equal @R.new(nil, nil)
392
- @R.new(nil, nil).wont_equal @R.new(nil, nil, :empty=>true)
393
- end
394
-
395
- it "should only consider empty PGRanges equal if they have the same bounds" do
396
- @R.new(1, 2).must_equal @R.new(1, 2)
397
- @R.new(1, 2).wont_equal @R.new(1, 3)
398
- end
399
-
400
- it "should only consider empty PGRanges equal if they have the same bound exclusions" do
401
- @R.new(1, 2, :exclude_begin=>true).must_equal @R.new(1, 2, :exclude_begin=>true)
402
- @R.new(1, 2, :exclude_end=>true).must_equal @R.new(1, 2, :exclude_end=>true)
403
- @R.new(1, 2, :exclude_begin=>true).wont_equal @R.new(1, 2, :exclude_end=>true)
404
- @R.new(1, 2, :exclude_end=>true).wont_equal @R.new(1, 2, :exclude_begin=>true)
405
- end
406
-
407
- it "should consider PGRanges equal with a Range they represent" do
408
- @R.new(1, 2).must_be :==, (1..2)
409
- @R.new(1, 2, :exclude_end=>true).must_be :==, (1...2)
410
- @R.new(1, 3).wont_be :==, (1..2)
411
- @R.new(1, 2, :exclude_end=>true).wont_be :==, (1..2)
412
- end
413
-
414
- it "should not consider a PGRange equal with a Range if it can't be expressed as a range" do
415
- @R.new(nil, nil).wont_be :==, (1..2)
416
- end
417
-
418
- it "should not consider a PGRange equal to other objects" do
419
- @R.new(nil, nil).wont_equal 1
420
- end
421
-
422
- it "should have #=== be true if given an equal PGRange" do
423
- @R.new(1, 2).must_be :===, @R.new(1, 2)
424
- @R.new(1, 2).wont_be :===, @R.new(1, 3)
425
-
426
- end
427
-
428
- it "should have #=== be true if it would be true for the Range represented by the PGRange" do
429
- @R.new(1, 2).must_be :===, 1.5
430
- @R.new(1, 2).wont_be :===, 2.5
431
- end
432
-
433
- it "should have #=== be false if the PGRange cannot be represented by a Range" do
434
- @R.new(nil, nil).wont_be :===, 1.5
435
- end
436
-
437
- it "should have #empty? indicate whether the range is empty" do
438
- @R.empty.must_be :empty?
439
- @R.new(1, 2).wont_be :empty?
440
- end
441
-
442
- it "should have #exclude_begin? and #exclude_end indicate whether the beginning or ending of the range is excluded" do
443
- @r1.exclude_begin?.must_equal false
444
- @r1.exclude_end?.must_equal false
445
- @r2.exclude_begin?.must_equal true
446
- @r2.exclude_end?.must_equal false
447
- @r3.exclude_begin?.must_equal false
448
- @r3.exclude_end?.must_equal true
449
- end
450
-
451
- it "should have #to_range raise an exception if the PGRange cannot be represented by a Range" do
452
- proc{@R.new(nil, 1).to_range}.must_raise(Sequel::Error)
453
- proc{@R.new(1, nil).to_range}.must_raise(Sequel::Error)
454
- proc{@R.new(0, 1, :exclude_begin=>true).to_range}.must_raise(Sequel::Error)
455
- proc{@R.empty.to_range}.must_raise(Sequel::Error)
456
- end
457
-
458
- it "should have #to_range return the represented range" do
459
- @r1.to_range.must_be :==, (1..2)
460
- end
461
-
462
- it "should have #to_range cache the returned value" do
463
- @r1.to_range.must_be_same_as(@r1.to_range)
464
- end
465
-
466
- it "should have #unbounded_begin? and #unbounded_end indicate whether the beginning or ending of the range is unbounded" do
467
- @r1.unbounded_begin?.must_equal false
468
- @r1.unbounded_end?.must_equal false
469
- @r2.unbounded_begin?.must_equal false
470
- @r2.unbounded_end?.must_equal true
471
- @r3.unbounded_begin?.must_equal true
472
- @r3.unbounded_end?.must_equal false
473
- end
474
-
475
- it "should have #valid_ruby_range? return true if the PGRange can be represented as a Range" do
476
- @r1.valid_ruby_range?.must_equal true
477
- @R.new(1, 2, :exclude_end=>true).valid_ruby_range?.must_equal true
478
- end
479
-
480
- it "should have #valid_ruby_range? return false if the PGRange cannot be represented as a Range" do
481
- @R.new(nil, 1).valid_ruby_range?.must_equal false
482
- @R.new(1, nil).valid_ruby_range?.must_equal false
483
- @R.new(0, 1, :exclude_begin=>true).valid_ruby_range?.must_equal false
484
- @R.empty.valid_ruby_range?.must_equal false
485
- end
486
- end
487
- end