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