sequel 4.26.0 → 5.37.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 (692) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +405 -5656
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +232 -157
  5. data/bin/sequel +32 -9
  6. data/doc/advanced_associations.rdoc +252 -188
  7. data/doc/association_basics.rdoc +231 -273
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +75 -48
  10. data/doc/code_order.rdoc +28 -10
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +74 -31
  16. data/doc/migration.rdoc +72 -46
  17. data/doc/model_dataset_method_design.rdoc +129 -0
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +12 -12
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +59 -69
  22. data/doc/opening_databases.rdoc +84 -94
  23. data/doc/postgresql.rdoc +268 -38
  24. data/doc/prepared_statements.rdoc +29 -24
  25. data/doc/querying.rdoc +184 -164
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.10.0.txt +84 -0
  30. data/doc/release_notes/5.11.0.txt +83 -0
  31. data/doc/release_notes/5.12.0.txt +141 -0
  32. data/doc/release_notes/5.13.0.txt +27 -0
  33. data/doc/release_notes/5.14.0.txt +63 -0
  34. data/doc/release_notes/5.15.0.txt +39 -0
  35. data/doc/release_notes/5.16.0.txt +110 -0
  36. data/doc/release_notes/5.17.0.txt +31 -0
  37. data/doc/release_notes/5.18.0.txt +69 -0
  38. data/doc/release_notes/5.19.0.txt +28 -0
  39. data/doc/release_notes/5.2.0.txt +33 -0
  40. data/doc/release_notes/5.20.0.txt +89 -0
  41. data/doc/release_notes/5.21.0.txt +87 -0
  42. data/doc/release_notes/5.22.0.txt +48 -0
  43. data/doc/release_notes/5.23.0.txt +56 -0
  44. data/doc/release_notes/5.24.0.txt +56 -0
  45. data/doc/release_notes/5.25.0.txt +32 -0
  46. data/doc/release_notes/5.26.0.txt +35 -0
  47. data/doc/release_notes/5.27.0.txt +21 -0
  48. data/doc/release_notes/5.28.0.txt +16 -0
  49. data/doc/release_notes/5.29.0.txt +22 -0
  50. data/doc/release_notes/5.3.0.txt +121 -0
  51. data/doc/release_notes/5.30.0.txt +20 -0
  52. data/doc/release_notes/5.31.0.txt +148 -0
  53. data/doc/release_notes/5.32.0.txt +46 -0
  54. data/doc/release_notes/5.33.0.txt +24 -0
  55. data/doc/release_notes/5.34.0.txt +40 -0
  56. data/doc/release_notes/5.35.0.txt +56 -0
  57. data/doc/release_notes/5.36.0.txt +60 -0
  58. data/doc/release_notes/5.37.0.txt +30 -0
  59. data/doc/release_notes/5.4.0.txt +80 -0
  60. data/doc/release_notes/5.5.0.txt +61 -0
  61. data/doc/release_notes/5.6.0.txt +31 -0
  62. data/doc/release_notes/5.7.0.txt +108 -0
  63. data/doc/release_notes/5.8.0.txt +170 -0
  64. data/doc/release_notes/5.9.0.txt +99 -0
  65. data/doc/schema_modification.rdoc +102 -77
  66. data/doc/security.rdoc +160 -87
  67. data/doc/sharding.rdoc +74 -47
  68. data/doc/sql.rdoc +135 -122
  69. data/doc/testing.rdoc +34 -18
  70. data/doc/thread_safety.rdoc +2 -4
  71. data/doc/transactions.rdoc +101 -19
  72. data/doc/validations.rdoc +64 -51
  73. data/doc/virtual_rows.rdoc +90 -109
  74. data/lib/sequel.rb +3 -1
  75. data/lib/sequel/adapters/ado.rb +154 -22
  76. data/lib/sequel/adapters/ado/access.rb +21 -21
  77. data/lib/sequel/adapters/ado/mssql.rb +8 -15
  78. data/lib/sequel/adapters/amalgalite.rb +17 -25
  79. data/lib/sequel/adapters/ibmdb.rb +52 -58
  80. data/lib/sequel/adapters/jdbc.rb +149 -127
  81. data/lib/sequel/adapters/jdbc/db2.rb +32 -40
  82. data/lib/sequel/adapters/jdbc/derby.rb +56 -58
  83. data/lib/sequel/adapters/jdbc/h2.rb +40 -30
  84. data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
  85. data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
  86. data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
  87. data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
  88. data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
  89. data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
  90. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
  91. data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
  92. data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
  93. data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
  94. data/lib/sequel/adapters/mock.rb +104 -113
  95. data/lib/sequel/adapters/mysql.rb +42 -61
  96. data/lib/sequel/adapters/mysql2.rb +126 -35
  97. data/lib/sequel/adapters/odbc.rb +21 -28
  98. data/lib/sequel/adapters/odbc/db2.rb +3 -1
  99. data/lib/sequel/adapters/odbc/mssql.rb +11 -15
  100. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  101. data/lib/sequel/adapters/oracle.rb +62 -68
  102. data/lib/sequel/adapters/postgres.rb +257 -311
  103. data/lib/sequel/adapters/postgresql.rb +3 -1
  104. data/lib/sequel/adapters/shared/access.rb +75 -79
  105. data/lib/sequel/adapters/shared/db2.rb +96 -74
  106. data/lib/sequel/adapters/shared/mssql.rb +258 -213
  107. data/lib/sequel/adapters/shared/mysql.rb +284 -216
  108. data/lib/sequel/adapters/shared/oracle.rb +175 -60
  109. data/lib/sequel/adapters/shared/postgres.rb +829 -383
  110. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
  111. data/lib/sequel/adapters/shared/sqlite.rb +382 -159
  112. data/lib/sequel/adapters/sqlanywhere.rb +53 -38
  113. data/lib/sequel/adapters/sqlite.rb +111 -105
  114. data/lib/sequel/adapters/tinytds.rb +38 -46
  115. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
  116. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
  117. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  118. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  119. data/lib/sequel/adapters/utils/replace.rb +3 -4
  120. data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
  121. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  122. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  123. data/lib/sequel/ast_transformer.rb +13 -89
  124. data/lib/sequel/connection_pool.rb +54 -26
  125. data/lib/sequel/connection_pool/sharded_single.rb +19 -12
  126. data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
  127. data/lib/sequel/connection_pool/single.rb +21 -12
  128. data/lib/sequel/connection_pool/threaded.rb +137 -119
  129. data/lib/sequel/core.rb +352 -320
  130. data/lib/sequel/database.rb +19 -2
  131. data/lib/sequel/database/connecting.rb +70 -55
  132. data/lib/sequel/database/dataset.rb +15 -5
  133. data/lib/sequel/database/dataset_defaults.rb +20 -102
  134. data/lib/sequel/database/features.rb +20 -4
  135. data/lib/sequel/database/logging.rb +25 -7
  136. data/lib/sequel/database/misc.rb +132 -118
  137. data/lib/sequel/database/query.rb +51 -28
  138. data/lib/sequel/database/schema_generator.rb +188 -75
  139. data/lib/sequel/database/schema_methods.rb +161 -92
  140. data/lib/sequel/database/transactions.rb +260 -58
  141. data/lib/sequel/dataset.rb +28 -12
  142. data/lib/sequel/dataset/actions.rb +354 -170
  143. data/lib/sequel/dataset/dataset_module.rb +46 -0
  144. data/lib/sequel/dataset/features.rb +81 -34
  145. data/lib/sequel/dataset/graph.rb +82 -58
  146. data/lib/sequel/dataset/misc.rb +139 -47
  147. data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
  148. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  149. data/lib/sequel/dataset/query.rb +428 -214
  150. data/lib/sequel/dataset/sql.rb +446 -339
  151. data/lib/sequel/deprecated.rb +14 -2
  152. data/lib/sequel/exceptions.rb +48 -16
  153. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  154. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  155. data/lib/sequel/extensions/_pretty_table.rb +10 -9
  156. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  157. data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
  158. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  159. data/lib/sequel/extensions/blank.rb +2 -0
  160. data/lib/sequel/extensions/caller_logging.rb +79 -0
  161. data/lib/sequel/extensions/columns_introspection.rb +9 -4
  162. data/lib/sequel/extensions/connection_expiration.rb +99 -0
  163. data/lib/sequel/extensions/connection_validator.rb +26 -13
  164. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  165. data/lib/sequel/extensions/constraint_validations.rb +93 -38
  166. data/lib/sequel/extensions/core_extensions.rb +45 -53
  167. data/lib/sequel/extensions/core_refinements.rb +44 -46
  168. data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
  169. data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
  170. data/lib/sequel/extensions/date_arithmetic.rb +42 -16
  171. data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
  172. data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
  173. data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
  174. data/lib/sequel/extensions/error_sql.rb +7 -3
  175. data/lib/sequel/extensions/escaped_like.rb +100 -0
  176. data/lib/sequel/extensions/eval_inspect.rb +14 -15
  177. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  178. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  179. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  180. data/lib/sequel/extensions/from_block.rb +2 -31
  181. data/lib/sequel/extensions/graph_each.rb +19 -6
  182. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  183. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  184. data/lib/sequel/extensions/index_caching.rb +109 -0
  185. data/lib/sequel/extensions/inflector.rb +8 -4
  186. data/lib/sequel/extensions/integer64.rb +32 -0
  187. data/lib/sequel/extensions/looser_typecasting.rb +19 -9
  188. data/lib/sequel/extensions/migration.rb +132 -80
  189. data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
  190. data/lib/sequel/extensions/named_timezones.rb +88 -23
  191. data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
  192. data/lib/sequel/extensions/null_dataset.rb +12 -8
  193. data/lib/sequel/extensions/pagination.rb +35 -28
  194. data/lib/sequel/extensions/pg_array.rb +227 -316
  195. data/lib/sequel/extensions/pg_array_ops.rb +19 -7
  196. data/lib/sequel/extensions/pg_enum.rb +69 -24
  197. data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
  198. data/lib/sequel/extensions/pg_hstore.rb +50 -59
  199. data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
  200. data/lib/sequel/extensions/pg_inet.rb +34 -15
  201. data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
  202. data/lib/sequel/extensions/pg_interval.rb +26 -26
  203. data/lib/sequel/extensions/pg_json.rb +422 -141
  204. data/lib/sequel/extensions/pg_json_ops.rb +248 -9
  205. data/lib/sequel/extensions/pg_loose_count.rb +5 -1
  206. data/lib/sequel/extensions/pg_range.rb +162 -146
  207. data/lib/sequel/extensions/pg_range_ops.rb +10 -5
  208. data/lib/sequel/extensions/pg_row.rb +53 -87
  209. data/lib/sequel/extensions/pg_row_ops.rb +36 -13
  210. data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
  211. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  212. data/lib/sequel/extensions/pretty_table.rb +4 -0
  213. data/lib/sequel/extensions/query.rb +12 -7
  214. data/lib/sequel/extensions/round_timestamps.rb +6 -9
  215. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  216. data/lib/sequel/extensions/s.rb +59 -0
  217. data/lib/sequel/extensions/schema_caching.rb +14 -1
  218. data/lib/sequel/extensions/schema_dumper.rb +83 -55
  219. data/lib/sequel/extensions/select_remove.rb +8 -4
  220. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  221. data/lib/sequel/extensions/server_block.rb +50 -17
  222. data/lib/sequel/extensions/server_logging.rb +61 -0
  223. data/lib/sequel/extensions/split_array_nil.rb +8 -4
  224. data/lib/sequel/extensions/sql_comments.rb +96 -0
  225. data/lib/sequel/extensions/sql_expr.rb +4 -1
  226. data/lib/sequel/extensions/string_agg.rb +181 -0
  227. data/lib/sequel/extensions/string_date_time.rb +2 -0
  228. data/lib/sequel/extensions/symbol_aref.rb +53 -0
  229. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  230. data/lib/sequel/extensions/symbol_as.rb +23 -0
  231. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  232. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  233. data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
  234. data/lib/sequel/extensions/to_dot.rb +15 -5
  235. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  236. data/lib/sequel/model.rb +36 -126
  237. data/lib/sequel/model/associations.rb +850 -257
  238. data/lib/sequel/model/base.rb +652 -764
  239. data/lib/sequel/model/dataset_module.rb +13 -10
  240. data/lib/sequel/model/default_inflections.rb +3 -1
  241. data/lib/sequel/model/errors.rb +3 -3
  242. data/lib/sequel/model/exceptions.rb +12 -12
  243. data/lib/sequel/model/inflections.rb +8 -19
  244. data/lib/sequel/model/plugins.rb +111 -0
  245. data/lib/sequel/plugins/accessed_columns.rb +2 -0
  246. data/lib/sequel/plugins/active_model.rb +32 -7
  247. data/lib/sequel/plugins/after_initialize.rb +3 -1
  248. data/lib/sequel/plugins/association_dependencies.rb +27 -18
  249. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  250. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  251. data/lib/sequel/plugins/association_pks.rb +181 -83
  252. data/lib/sequel/plugins/association_proxies.rb +33 -9
  253. data/lib/sequel/plugins/auto_validations.rb +58 -23
  254. data/lib/sequel/plugins/before_after_save.rb +8 -0
  255. data/lib/sequel/plugins/blacklist_security.rb +23 -12
  256. data/lib/sequel/plugins/boolean_readers.rb +9 -6
  257. data/lib/sequel/plugins/boolean_subsets.rb +64 -0
  258. data/lib/sequel/plugins/caching.rb +27 -16
  259. data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
  260. data/lib/sequel/plugins/column_conflicts.rb +18 -3
  261. data/lib/sequel/plugins/column_select.rb +9 -5
  262. data/lib/sequel/plugins/columns_updated.rb +42 -0
  263. data/lib/sequel/plugins/composition.rb +36 -24
  264. data/lib/sequel/plugins/constraint_validations.rb +37 -16
  265. data/lib/sequel/plugins/csv_serializer.rb +58 -35
  266. data/lib/sequel/plugins/dataset_associations.rb +60 -18
  267. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  268. data/lib/sequel/plugins/defaults_setter.rb +74 -13
  269. data/lib/sequel/plugins/delay_add_association.rb +4 -1
  270. data/lib/sequel/plugins/dirty.rb +65 -24
  271. data/lib/sequel/plugins/eager_each.rb +27 -3
  272. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  273. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  274. data/lib/sequel/plugins/error_splitter.rb +19 -12
  275. data/lib/sequel/plugins/finder.rb +246 -0
  276. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  277. data/lib/sequel/plugins/force_encoding.rb +9 -12
  278. data/lib/sequel/plugins/hook_class_methods.rb +39 -54
  279. data/lib/sequel/plugins/input_transformer.rb +20 -10
  280. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  281. data/lib/sequel/plugins/insert_returning_select.rb +4 -2
  282. data/lib/sequel/plugins/instance_filters.rb +12 -8
  283. data/lib/sequel/plugins/instance_hooks.rb +36 -17
  284. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  285. data/lib/sequel/plugins/inverted_subsets.rb +24 -13
  286. data/lib/sequel/plugins/json_serializer.rb +123 -47
  287. data/lib/sequel/plugins/lazy_attributes.rb +20 -14
  288. data/lib/sequel/plugins/list.rb +40 -26
  289. data/lib/sequel/plugins/many_through_many.rb +28 -12
  290. data/lib/sequel/plugins/modification_detection.rb +17 -5
  291. data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
  292. data/lib/sequel/plugins/nested_attributes.rb +55 -28
  293. data/lib/sequel/plugins/optimistic_locking.rb +5 -3
  294. data/lib/sequel/plugins/pg_array_associations.rb +52 -18
  295. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
  296. data/lib/sequel/plugins/pg_row.rb +7 -51
  297. data/lib/sequel/plugins/prepared_statements.rb +53 -72
  298. data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
  299. data/lib/sequel/plugins/rcte_tree.rb +43 -63
  300. data/lib/sequel/plugins/serialization.rb +37 -44
  301. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
  302. data/lib/sequel/plugins/sharding.rb +17 -10
  303. data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
  304. data/lib/sequel/plugins/singular_table_names.rb +2 -0
  305. data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
  306. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  307. data/lib/sequel/plugins/split_values.rb +13 -6
  308. data/lib/sequel/plugins/static_cache.rb +79 -53
  309. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  310. data/lib/sequel/plugins/string_stripper.rb +5 -3
  311. data/lib/sequel/plugins/subclasses.rb +20 -2
  312. data/lib/sequel/plugins/subset_conditions.rb +48 -0
  313. data/lib/sequel/plugins/table_select.rb +4 -2
  314. data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
  315. data/lib/sequel/plugins/throw_failures.rb +110 -0
  316. data/lib/sequel/plugins/timestamps.rb +22 -8
  317. data/lib/sequel/plugins/touch.rb +21 -8
  318. data/lib/sequel/plugins/tree.rb +57 -30
  319. data/lib/sequel/plugins/typecast_on_load.rb +14 -4
  320. data/lib/sequel/plugins/unlimited_update.rb +3 -7
  321. data/lib/sequel/plugins/update_or_create.rb +6 -4
  322. data/lib/sequel/plugins/update_primary_key.rb +3 -1
  323. data/lib/sequel/plugins/update_refresh.rb +28 -15
  324. data/lib/sequel/plugins/uuid.rb +70 -0
  325. data/lib/sequel/plugins/validate_associated.rb +20 -0
  326. data/lib/sequel/plugins/validation_class_methods.rb +40 -19
  327. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  328. data/lib/sequel/plugins/validation_helpers.rb +49 -31
  329. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  330. data/lib/sequel/plugins/xml_serializer.rb +31 -30
  331. data/lib/sequel/sql.rb +479 -329
  332. data/lib/sequel/timezones.rb +62 -32
  333. data/lib/sequel/version.rb +10 -3
  334. metadata +177 -477
  335. data/Rakefile +0 -165
  336. data/doc/active_record.rdoc +0 -912
  337. data/doc/release_notes/1.0.txt +0 -38
  338. data/doc/release_notes/1.1.txt +0 -143
  339. data/doc/release_notes/1.3.txt +0 -101
  340. data/doc/release_notes/1.4.0.txt +0 -53
  341. data/doc/release_notes/1.5.0.txt +0 -155
  342. data/doc/release_notes/2.0.0.txt +0 -298
  343. data/doc/release_notes/2.1.0.txt +0 -271
  344. data/doc/release_notes/2.10.0.txt +0 -328
  345. data/doc/release_notes/2.11.0.txt +0 -215
  346. data/doc/release_notes/2.12.0.txt +0 -534
  347. data/doc/release_notes/2.2.0.txt +0 -253
  348. data/doc/release_notes/2.3.0.txt +0 -88
  349. data/doc/release_notes/2.4.0.txt +0 -106
  350. data/doc/release_notes/2.5.0.txt +0 -137
  351. data/doc/release_notes/2.6.0.txt +0 -157
  352. data/doc/release_notes/2.7.0.txt +0 -166
  353. data/doc/release_notes/2.8.0.txt +0 -171
  354. data/doc/release_notes/2.9.0.txt +0 -97
  355. data/doc/release_notes/3.0.0.txt +0 -221
  356. data/doc/release_notes/3.1.0.txt +0 -406
  357. data/doc/release_notes/3.10.0.txt +0 -286
  358. data/doc/release_notes/3.11.0.txt +0 -254
  359. data/doc/release_notes/3.12.0.txt +0 -304
  360. data/doc/release_notes/3.13.0.txt +0 -210
  361. data/doc/release_notes/3.14.0.txt +0 -118
  362. data/doc/release_notes/3.15.0.txt +0 -78
  363. data/doc/release_notes/3.16.0.txt +0 -45
  364. data/doc/release_notes/3.17.0.txt +0 -58
  365. data/doc/release_notes/3.18.0.txt +0 -120
  366. data/doc/release_notes/3.19.0.txt +0 -67
  367. data/doc/release_notes/3.2.0.txt +0 -268
  368. data/doc/release_notes/3.20.0.txt +0 -41
  369. data/doc/release_notes/3.21.0.txt +0 -87
  370. data/doc/release_notes/3.22.0.txt +0 -39
  371. data/doc/release_notes/3.23.0.txt +0 -172
  372. data/doc/release_notes/3.24.0.txt +0 -420
  373. data/doc/release_notes/3.25.0.txt +0 -88
  374. data/doc/release_notes/3.26.0.txt +0 -88
  375. data/doc/release_notes/3.27.0.txt +0 -82
  376. data/doc/release_notes/3.28.0.txt +0 -304
  377. data/doc/release_notes/3.29.0.txt +0 -459
  378. data/doc/release_notes/3.3.0.txt +0 -192
  379. data/doc/release_notes/3.30.0.txt +0 -135
  380. data/doc/release_notes/3.31.0.txt +0 -146
  381. data/doc/release_notes/3.32.0.txt +0 -202
  382. data/doc/release_notes/3.33.0.txt +0 -157
  383. data/doc/release_notes/3.34.0.txt +0 -671
  384. data/doc/release_notes/3.35.0.txt +0 -144
  385. data/doc/release_notes/3.36.0.txt +0 -245
  386. data/doc/release_notes/3.37.0.txt +0 -338
  387. data/doc/release_notes/3.38.0.txt +0 -234
  388. data/doc/release_notes/3.39.0.txt +0 -237
  389. data/doc/release_notes/3.4.0.txt +0 -325
  390. data/doc/release_notes/3.40.0.txt +0 -73
  391. data/doc/release_notes/3.41.0.txt +0 -155
  392. data/doc/release_notes/3.42.0.txt +0 -74
  393. data/doc/release_notes/3.43.0.txt +0 -105
  394. data/doc/release_notes/3.44.0.txt +0 -152
  395. data/doc/release_notes/3.45.0.txt +0 -179
  396. data/doc/release_notes/3.46.0.txt +0 -122
  397. data/doc/release_notes/3.47.0.txt +0 -270
  398. data/doc/release_notes/3.48.0.txt +0 -477
  399. data/doc/release_notes/3.5.0.txt +0 -510
  400. data/doc/release_notes/3.6.0.txt +0 -366
  401. data/doc/release_notes/3.7.0.txt +0 -179
  402. data/doc/release_notes/3.8.0.txt +0 -151
  403. data/doc/release_notes/3.9.0.txt +0 -233
  404. data/doc/release_notes/4.0.0.txt +0 -262
  405. data/doc/release_notes/4.1.0.txt +0 -85
  406. data/doc/release_notes/4.10.0.txt +0 -226
  407. data/doc/release_notes/4.11.0.txt +0 -147
  408. data/doc/release_notes/4.12.0.txt +0 -105
  409. data/doc/release_notes/4.13.0.txt +0 -169
  410. data/doc/release_notes/4.14.0.txt +0 -68
  411. data/doc/release_notes/4.15.0.txt +0 -56
  412. data/doc/release_notes/4.16.0.txt +0 -36
  413. data/doc/release_notes/4.17.0.txt +0 -38
  414. data/doc/release_notes/4.18.0.txt +0 -36
  415. data/doc/release_notes/4.19.0.txt +0 -45
  416. data/doc/release_notes/4.2.0.txt +0 -129
  417. data/doc/release_notes/4.20.0.txt +0 -79
  418. data/doc/release_notes/4.21.0.txt +0 -94
  419. data/doc/release_notes/4.22.0.txt +0 -72
  420. data/doc/release_notes/4.23.0.txt +0 -65
  421. data/doc/release_notes/4.24.0.txt +0 -99
  422. data/doc/release_notes/4.25.0.txt +0 -181
  423. data/doc/release_notes/4.26.0.txt +0 -44
  424. data/doc/release_notes/4.3.0.txt +0 -40
  425. data/doc/release_notes/4.4.0.txt +0 -92
  426. data/doc/release_notes/4.5.0.txt +0 -34
  427. data/doc/release_notes/4.6.0.txt +0 -30
  428. data/doc/release_notes/4.7.0.txt +0 -103
  429. data/doc/release_notes/4.8.0.txt +0 -175
  430. data/doc/release_notes/4.9.0.txt +0 -190
  431. data/lib/sequel/adapters/cubrid.rb +0 -142
  432. data/lib/sequel/adapters/do.rb +0 -156
  433. data/lib/sequel/adapters/do/mysql.rb +0 -64
  434. data/lib/sequel/adapters/do/postgres.rb +0 -42
  435. data/lib/sequel/adapters/do/sqlite3.rb +0 -40
  436. data/lib/sequel/adapters/jdbc/as400.rb +0 -82
  437. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
  438. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
  439. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
  440. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
  441. data/lib/sequel/adapters/odbc/progress.rb +0 -8
  442. data/lib/sequel/adapters/shared/cubrid.rb +0 -243
  443. data/lib/sequel/adapters/shared/firebird.rb +0 -245
  444. data/lib/sequel/adapters/shared/informix.rb +0 -52
  445. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
  446. data/lib/sequel/adapters/shared/progress.rb +0 -38
  447. data/lib/sequel/adapters/swift.rb +0 -158
  448. data/lib/sequel/adapters/swift/mysql.rb +0 -47
  449. data/lib/sequel/adapters/swift/postgres.rb +0 -45
  450. data/lib/sequel/adapters/swift/sqlite.rb +0 -47
  451. data/lib/sequel/adapters/utils/pg_types.rb +0 -68
  452. data/lib/sequel/dataset/mutation.rb +0 -109
  453. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
  454. data/lib/sequel/extensions/filter_having.rb +0 -59
  455. data/lib/sequel/extensions/hash_aliases.rb +0 -45
  456. data/lib/sequel/extensions/meta_def.rb +0 -31
  457. data/lib/sequel/extensions/query_literals.rb +0 -80
  458. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
  459. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
  460. data/lib/sequel/extensions/set_overrides.rb +0 -72
  461. data/lib/sequel/no_core_ext.rb +0 -1
  462. data/lib/sequel/plugins/association_autoreloading.rb +0 -7
  463. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
  464. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
  465. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
  466. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
  467. data/lib/sequel/plugins/schema.rb +0 -80
  468. data/lib/sequel/plugins/scissors.rb +0 -33
  469. data/spec/adapters/db2_spec.rb +0 -160
  470. data/spec/adapters/firebird_spec.rb +0 -411
  471. data/spec/adapters/informix_spec.rb +0 -100
  472. data/spec/adapters/mssql_spec.rb +0 -706
  473. data/spec/adapters/mysql_spec.rb +0 -1287
  474. data/spec/adapters/oracle_spec.rb +0 -313
  475. data/spec/adapters/postgres_spec.rb +0 -3725
  476. data/spec/adapters/spec_helper.rb +0 -43
  477. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  478. data/spec/adapters/sqlite_spec.rb +0 -653
  479. data/spec/bin_spec.rb +0 -254
  480. data/spec/core/connection_pool_spec.rb +0 -1016
  481. data/spec/core/database_spec.rb +0 -2531
  482. data/spec/core/dataset_spec.rb +0 -5098
  483. data/spec/core/deprecated_spec.rb +0 -70
  484. data/spec/core/expression_filters_spec.rb +0 -1243
  485. data/spec/core/mock_adapter_spec.rb +0 -462
  486. data/spec/core/object_graph_spec.rb +0 -303
  487. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  488. data/spec/core/schema_generator_spec.rb +0 -179
  489. data/spec/core/schema_spec.rb +0 -1659
  490. data/spec/core/spec_helper.rb +0 -34
  491. data/spec/core/version_spec.rb +0 -7
  492. data/spec/core_extensions_spec.rb +0 -699
  493. data/spec/extensions/accessed_columns_spec.rb +0 -51
  494. data/spec/extensions/active_model_spec.rb +0 -123
  495. data/spec/extensions/after_initialize_spec.rb +0 -24
  496. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  497. data/spec/extensions/association_dependencies_spec.rb +0 -117
  498. data/spec/extensions/association_pks_spec.rb +0 -365
  499. data/spec/extensions/association_proxies_spec.rb +0 -86
  500. data/spec/extensions/auto_validations_spec.rb +0 -192
  501. data/spec/extensions/blacklist_security_spec.rb +0 -88
  502. data/spec/extensions/blank_spec.rb +0 -69
  503. data/spec/extensions/boolean_readers_spec.rb +0 -93
  504. data/spec/extensions/caching_spec.rb +0 -270
  505. data/spec/extensions/class_table_inheritance_spec.rb +0 -420
  506. data/spec/extensions/column_conflicts_spec.rb +0 -60
  507. data/spec/extensions/column_select_spec.rb +0 -108
  508. data/spec/extensions/columns_introspection_spec.rb +0 -91
  509. data/spec/extensions/composition_spec.rb +0 -242
  510. data/spec/extensions/connection_validator_spec.rb +0 -120
  511. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
  512. data/spec/extensions/constraint_validations_spec.rb +0 -325
  513. data/spec/extensions/core_refinements_spec.rb +0 -519
  514. data/spec/extensions/csv_serializer_spec.rb +0 -173
  515. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  516. data/spec/extensions/dataset_associations_spec.rb +0 -311
  517. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  518. data/spec/extensions/date_arithmetic_spec.rb +0 -150
  519. data/spec/extensions/defaults_setter_spec.rb +0 -101
  520. data/spec/extensions/delay_add_association_spec.rb +0 -52
  521. data/spec/extensions/dirty_spec.rb +0 -180
  522. data/spec/extensions/eager_each_spec.rb +0 -42
  523. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  524. data/spec/extensions/error_splitter_spec.rb +0 -18
  525. data/spec/extensions/error_sql_spec.rb +0 -20
  526. data/spec/extensions/eval_inspect_spec.rb +0 -73
  527. data/spec/extensions/filter_having_spec.rb +0 -40
  528. data/spec/extensions/force_encoding_spec.rb +0 -114
  529. data/spec/extensions/from_block_spec.rb +0 -21
  530. data/spec/extensions/graph_each_spec.rb +0 -109
  531. data/spec/extensions/hash_aliases_spec.rb +0 -24
  532. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  533. data/spec/extensions/inflector_spec.rb +0 -183
  534. data/spec/extensions/input_transformer_spec.rb +0 -54
  535. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  536. data/spec/extensions/instance_filters_spec.rb +0 -79
  537. data/spec/extensions/instance_hooks_spec.rb +0 -276
  538. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  539. data/spec/extensions/json_serializer_spec.rb +0 -291
  540. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  541. data/spec/extensions/list_spec.rb +0 -267
  542. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  543. data/spec/extensions/many_through_many_spec.rb +0 -2172
  544. data/spec/extensions/meta_def_spec.rb +0 -21
  545. data/spec/extensions/migration_spec.rb +0 -712
  546. data/spec/extensions/modification_detection_spec.rb +0 -80
  547. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  548. data/spec/extensions/named_timezones_spec.rb +0 -108
  549. data/spec/extensions/nested_attributes_spec.rb +0 -697
  550. data/spec/extensions/null_dataset_spec.rb +0 -85
  551. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  552. data/spec/extensions/pagination_spec.rb +0 -118
  553. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  554. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  555. data/spec/extensions/pg_array_spec.rb +0 -395
  556. data/spec/extensions/pg_enum_spec.rb +0 -92
  557. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  558. data/spec/extensions/pg_hstore_spec.rb +0 -206
  559. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  560. data/spec/extensions/pg_inet_spec.rb +0 -52
  561. data/spec/extensions/pg_interval_spec.rb +0 -76
  562. data/spec/extensions/pg_json_ops_spec.rb +0 -229
  563. data/spec/extensions/pg_json_spec.rb +0 -218
  564. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  565. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  566. data/spec/extensions/pg_range_spec.rb +0 -404
  567. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  568. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  569. data/spec/extensions/pg_row_spec.rb +0 -360
  570. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  571. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  572. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  573. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  574. data/spec/extensions/prepared_statements_spec.rb +0 -103
  575. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  576. data/spec/extensions/pretty_table_spec.rb +0 -92
  577. data/spec/extensions/query_literals_spec.rb +0 -183
  578. data/spec/extensions/query_spec.rb +0 -102
  579. data/spec/extensions/rcte_tree_spec.rb +0 -392
  580. data/spec/extensions/round_timestamps_spec.rb +0 -43
  581. data/spec/extensions/schema_caching_spec.rb +0 -41
  582. data/spec/extensions/schema_dumper_spec.rb +0 -789
  583. data/spec/extensions/schema_spec.rb +0 -117
  584. data/spec/extensions/scissors_spec.rb +0 -26
  585. data/spec/extensions/select_remove_spec.rb +0 -38
  586. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  587. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  588. data/spec/extensions/serialization_spec.rb +0 -362
  589. data/spec/extensions/server_block_spec.rb +0 -90
  590. data/spec/extensions/set_overrides_spec.rb +0 -61
  591. data/spec/extensions/sharding_spec.rb +0 -198
  592. data/spec/extensions/shared_caching_spec.rb +0 -175
  593. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  594. data/spec/extensions/singular_table_names_spec.rb +0 -22
  595. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  596. data/spec/extensions/spec_helper.rb +0 -71
  597. data/spec/extensions/split_array_nil_spec.rb +0 -24
  598. data/spec/extensions/split_values_spec.rb +0 -22
  599. data/spec/extensions/sql_expr_spec.rb +0 -60
  600. data/spec/extensions/static_cache_spec.rb +0 -361
  601. data/spec/extensions/string_date_time_spec.rb +0 -95
  602. data/spec/extensions/string_stripper_spec.rb +0 -68
  603. data/spec/extensions/subclasses_spec.rb +0 -66
  604. data/spec/extensions/table_select_spec.rb +0 -71
  605. data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
  606. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  607. data/spec/extensions/timestamps_spec.rb +0 -175
  608. data/spec/extensions/to_dot_spec.rb +0 -154
  609. data/spec/extensions/touch_spec.rb +0 -203
  610. data/spec/extensions/tree_spec.rb +0 -274
  611. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  612. data/spec/extensions/unlimited_update_spec.rb +0 -20
  613. data/spec/extensions/update_or_create_spec.rb +0 -87
  614. data/spec/extensions/update_primary_key_spec.rb +0 -100
  615. data/spec/extensions/update_refresh_spec.rb +0 -53
  616. data/spec/extensions/validate_associated_spec.rb +0 -52
  617. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  618. data/spec/extensions/validation_helpers_spec.rb +0 -541
  619. data/spec/extensions/xml_serializer_spec.rb +0 -207
  620. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  621. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  622. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  623. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  624. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  625. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  626. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  627. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  628. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  629. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  630. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  631. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  632. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  633. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  634. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  635. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  636. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  637. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  638. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  639. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  640. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  641. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  642. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  643. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  644. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  645. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  646. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  647. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  648. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  649. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  650. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  651. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  652. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  653. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  654. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  655. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  656. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  657. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  658. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  659. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  660. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  661. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  662. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  663. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  664. data/spec/guards_helper.rb +0 -55
  665. data/spec/integration/associations_test.rb +0 -2454
  666. data/spec/integration/database_test.rb +0 -113
  667. data/spec/integration/dataset_test.rb +0 -1808
  668. data/spec/integration/eager_loader_test.rb +0 -687
  669. data/spec/integration/migrator_test.rb +0 -240
  670. data/spec/integration/model_test.rb +0 -226
  671. data/spec/integration/plugin_test.rb +0 -2240
  672. data/spec/integration/prepared_statement_test.rb +0 -467
  673. data/spec/integration/schema_test.rb +0 -817
  674. data/spec/integration/spec_helper.rb +0 -48
  675. data/spec/integration/timezone_test.rb +0 -86
  676. data/spec/integration/transaction_test.rb +0 -374
  677. data/spec/integration/type_test.rb +0 -133
  678. data/spec/model/association_reflection_spec.rb +0 -525
  679. data/spec/model/associations_spec.rb +0 -4426
  680. data/spec/model/base_spec.rb +0 -759
  681. data/spec/model/class_dataset_methods_spec.rb +0 -146
  682. data/spec/model/dataset_methods_spec.rb +0 -149
  683. data/spec/model/eager_loading_spec.rb +0 -2137
  684. data/spec/model/hooks_spec.rb +0 -604
  685. data/spec/model/inflector_spec.rb +0 -26
  686. data/spec/model/model_spec.rb +0 -982
  687. data/spec/model/plugins_spec.rb +0 -299
  688. data/spec/model/record_spec.rb +0 -2147
  689. data/spec/model/spec_helper.rb +0 -46
  690. data/spec/model/validations_spec.rb +0 -193
  691. data/spec/sequel_coverage.rb +0 -15
  692. data/spec/spec_config.rb +0 -10
@@ -1,218 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- Sequel.extension :pg_array, :pg_json
4
-
5
- describe "pg_json extension" do
6
- before(:all) do
7
- m = Sequel::Postgres
8
- @m = m::JSONDatabaseMethods
9
- @hc = m::JSONHash
10
- @ac = m::JSONArray
11
- @bhc = m::JSONBHash
12
- @bac = m::JSONBArray
13
- end
14
- before do
15
- @db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
16
- @db.extension(:pg_array, :pg_json)
17
- end
18
-
19
- it "should parse json strings correctly" do
20
- @m.parse_json('[]').class.must_equal(@ac)
21
- @m.parse_json('[]').to_a.must_equal []
22
- @m.parse_json('[1]').to_a.must_equal [1]
23
- @m.parse_json('[1, 2]').to_a.must_equal [1, 2]
24
- @m.parse_json('[1, [2], {"a": "b"}]').to_a.must_equal [1, [2], {'a'=>'b'}]
25
- @m.parse_json('{}').class.must_equal(@hc)
26
- @m.parse_json('{}').to_hash.must_equal({})
27
- @m.parse_json('{"a": "b"}').to_hash.must_equal('a'=>'b')
28
- @m.parse_json('{"a": "b", "c": [1, 2, 3]}').to_hash.must_equal('a'=>'b', 'c'=>[1, 2, 3])
29
- @m.parse_json('{"a": "b", "c": {"d": "e"}}').to_hash.must_equal('a'=>'b', 'c'=>{'d'=>'e'})
30
- end
31
-
32
- it "should parse json and non-json plain strings, integers, and floats correctly in db_parse_json" do
33
- @m.db_parse_json('{"a": "b", "c": {"d": "e"}}').to_hash.must_equal('a'=>'b', 'c'=>{'d'=>'e'})
34
- @m.db_parse_json('[1, [2], {"a": "b"}]').to_a.must_equal [1, [2], {'a'=>'b'}]
35
- @m.db_parse_json('1').must_equal 1
36
- @m.db_parse_json('"b"').must_equal 'b'
37
- @m.db_parse_json('1.1').must_equal 1.1
38
- end
39
-
40
- it "should parse json and non-json plain strings, integers, and floats correctly in db_parse_jsonb" do
41
- @m.db_parse_jsonb('{"a": "b", "c": {"d": "e"}}').to_hash.must_equal('a'=>'b', 'c'=>{'d'=>'e'})
42
- @m.db_parse_jsonb('[1, [2], {"a": "b"}]').to_a.must_equal [1, [2], {'a'=>'b'}]
43
- @m.db_parse_jsonb('1').must_equal 1
44
- @m.db_parse_jsonb('"b"').must_equal 'b'
45
- @m.db_parse_jsonb('1.1').must_equal 1.1
46
- end
47
-
48
- it "should raise an error when attempting to parse invalid json" do
49
- proc{@m.parse_json('')}.must_raise(Sequel::InvalidValue)
50
- proc{@m.parse_json('1')}.must_raise(Sequel::InvalidValue)
51
-
52
- begin
53
- Sequel.instance_eval do
54
- alias pj parse_json
55
- def parse_json(v)
56
- {'1'=>1, "'a'"=>'a', 'true'=>true, 'false'=>false, 'null'=>nil, 'o'=>Object.new}.fetch(v){pj(v)}
57
- end
58
- end
59
- @m.parse_json('1').must_equal 1
60
- @m.parse_json("'a'").must_equal 'a'
61
- @m.parse_json('true').must_equal true
62
- @m.parse_json('false').must_equal false
63
- @m.parse_json('null').must_equal nil
64
- proc{@m.parse_json('o')}.must_raise(Sequel::InvalidValue)
65
- ensure
66
- Sequel.instance_eval do
67
- alias parse_json pj
68
- end
69
- end
70
- end
71
-
72
- it "should literalize JSONHash and JSONArray to strings correctly" do
73
- @db.literal(Sequel.pg_json([])).must_equal "'[]'::json"
74
- @db.literal(Sequel.pg_json([1, [2], {'a'=>'b'}])).must_equal "'[1,[2],{\"a\":\"b\"}]'::json"
75
- @db.literal(Sequel.pg_json({})).must_equal "'{}'::json"
76
- @db.literal(Sequel.pg_json('a'=>'b')).must_equal "'{\"a\":\"b\"}'::json"
77
- end
78
-
79
- it "should literalize JSONHash and JSONArray to strings correctly" do
80
- @db.literal(Sequel.pg_jsonb([])).must_equal "'[]'::jsonb"
81
- @db.literal(Sequel.pg_jsonb([1, [2], {'a'=>'b'}])).must_equal "'[1,[2],{\"a\":\"b\"}]'::jsonb"
82
- @db.literal(Sequel.pg_jsonb({})).must_equal "'{}'::jsonb"
83
- @db.literal(Sequel.pg_jsonb('a'=>'b')).must_equal "'{\"a\":\"b\"}'::jsonb"
84
- end
85
-
86
- it "should have Sequel.pg_json return JSONHash and JSONArray as is" do
87
- a = Sequel.pg_json({})
88
- Sequel.pg_json(a).object_id.must_equal(a.object_id)
89
- a = Sequel.pg_json([])
90
- Sequel.pg_json(a).object_id.must_equal(a.object_id)
91
- end
92
-
93
- it "should have Sequel.pg_json convert jsonb values" do
94
- a = {}
95
- v = Sequel.pg_json(Sequel.pg_jsonb(a))
96
- v.to_hash.must_be_same_as(a)
97
- v.class.must_equal(@hc)
98
-
99
- a = []
100
- v = Sequel.pg_json(Sequel.pg_jsonb(a))
101
- v.to_a.must_be_same_as(a)
102
- v.class.must_equal(@ac)
103
- end
104
-
105
- it "should have Sequel.pg_jsonb return JSONBHash and JSONBArray as is" do
106
- a = Sequel.pg_jsonb({})
107
- Sequel.pg_jsonb(a).object_id.must_equal(a.object_id)
108
- a = Sequel.pg_jsonb([])
109
- Sequel.pg_jsonb(a).object_id.must_equal(a.object_id)
110
- end
111
-
112
- it "should have Sequel.pg_jsonb convert json values" do
113
- a = {}
114
- v = Sequel.pg_jsonb(Sequel.pg_json(a))
115
- v.to_hash.must_be_same_as(a)
116
- v.class.must_equal(@bhc)
117
-
118
- a = []
119
- v = Sequel.pg_jsonb(Sequel.pg_json(a))
120
- v.to_a.must_be_same_as(a)
121
- v.class.must_equal(@bac)
122
- end
123
-
124
- it "should have JSONHashBase#to_hash method for getting underlying hash" do
125
- Sequel.pg_json({}).to_hash.must_be_kind_of(Hash)
126
- Sequel.pg_jsonb({}).to_hash.must_be_kind_of(Hash)
127
- end
128
-
129
- it "should allow aliasing json objects" do
130
- @db.literal(Sequel.pg_json({}).as(:a)).must_equal "'{}'::json AS a"
131
- @db.literal(Sequel.pg_json([]).as(:a)).must_equal "'[]'::json AS a"
132
- @db.literal(Sequel.pg_jsonb({}).as(:a)).must_equal "'{}'::jsonb AS a"
133
- @db.literal(Sequel.pg_jsonb([]).as(:a)).must_equal "'[]'::jsonb AS a"
134
- end
135
-
136
- it "should allow casting json objects" do
137
- @db.literal(Sequel.pg_json({}).cast(String)).must_equal "CAST('{}'::json AS text)"
138
- @db.literal(Sequel.pg_json([]).cast(String)).must_equal "CAST('[]'::json AS text)"
139
- @db.literal(Sequel.pg_jsonb({}).cast(String)).must_equal "CAST('{}'::jsonb AS text)"
140
- @db.literal(Sequel.pg_jsonb([]).cast(String)).must_equal "CAST('[]'::jsonb AS text)"
141
- end
142
-
143
- it "should have JSONArrayBase#to_a method for getting underlying array" do
144
- Sequel.pg_json([]).to_a.must_be_kind_of(Array)
145
- Sequel.pg_jsonb([]).to_a.must_be_kind_of(Array)
146
- end
147
-
148
- it "should support using JSONHashBase and JSONArrayBase as bound variables" do
149
- @db.bound_variable_arg(1, nil).must_equal 1
150
- @db.bound_variable_arg(Sequel.pg_json([1]), nil).must_equal '[1]'
151
- @db.bound_variable_arg(Sequel.pg_json('a'=>'b'), nil).must_equal '{"a":"b"}'
152
- @db.bound_variable_arg(Sequel.pg_jsonb([1]), nil).must_equal '[1]'
153
- @db.bound_variable_arg(Sequel.pg_jsonb('a'=>'b'), nil).must_equal '{"a":"b"}'
154
- end
155
-
156
- it "should support using json[] and jsonb[] types in bound variables" do
157
- @db.bound_variable_arg(Sequel.pg_array([Sequel.pg_json([{"a"=>1}]), Sequel.pg_json("b"=>[1, 2])]), nil).must_equal '{"[{\\"a\\":1}]","{\\"b\\":[1,2]}"}'
158
- @db.bound_variable_arg(Sequel.pg_array([Sequel.pg_jsonb([{"a"=>1}]), Sequel.pg_jsonb("b"=>[1, 2])]), nil).must_equal '{"[{\\"a\\":1}]","{\\"b\\":[1,2]}"}'
159
- end
160
-
161
- it "should parse json type from the schema correctly" do
162
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i', :db_type=>'json'}]
163
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :json]
164
- end
165
-
166
- it "should parse json type from the schema correctly" do
167
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i', :db_type=>'jsonb'}]
168
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :jsonb]
169
- end
170
-
171
- it "should support typecasting for the json type" do
172
- h = Sequel.pg_json(1=>2)
173
- a = Sequel.pg_json([1])
174
- @db.typecast_value(:json, h).object_id.must_equal(h.object_id)
175
- @db.typecast_value(:json, h.to_hash).must_equal h
176
- @db.typecast_value(:json, h.to_hash).class.must_equal(@hc)
177
- @db.typecast_value(:json, Sequel.pg_jsonb(h)).must_equal h
178
- @db.typecast_value(:json, Sequel.pg_jsonb(h)).class.must_equal(@hc)
179
- @db.typecast_value(:json, a).object_id.must_equal(a.object_id)
180
- @db.typecast_value(:json, a.to_a).must_equal a
181
- @db.typecast_value(:json, a.to_a).class.must_equal(@ac)
182
- @db.typecast_value(:json, Sequel.pg_jsonb(a)).must_equal a
183
- @db.typecast_value(:json, Sequel.pg_jsonb(a)).class.must_equal(@ac)
184
- @db.typecast_value(:json, '[]').must_equal Sequel.pg_json([])
185
- @db.typecast_value(:json, '[]').class.must_equal(@ac)
186
- @db.typecast_value(:json, '{"a": "b"}').must_equal Sequel.pg_json("a"=>"b")
187
- @db.typecast_value(:json, '{"a": "b"}').class.must_equal(@hc)
188
- proc{@db.typecast_value(:json, '')}.must_raise(Sequel::InvalidValue)
189
- proc{@db.typecast_value(:json, 1)}.must_raise(Sequel::InvalidValue)
190
- end
191
-
192
- it "should support typecasting for the jsonb type" do
193
- h = Sequel.pg_jsonb(1=>2)
194
- a = Sequel.pg_jsonb([1])
195
- @db.typecast_value(:jsonb, h).object_id.must_equal(h.object_id)
196
- @db.typecast_value(:jsonb, h.to_hash).must_equal h
197
- @db.typecast_value(:jsonb, h.to_hash).class.must_equal(@bhc)
198
- @db.typecast_value(:jsonb, Sequel.pg_json(h)).must_equal h
199
- @db.typecast_value(:jsonb, Sequel.pg_json(h)).class.must_equal(@bhc)
200
- @db.typecast_value(:jsonb, a).object_id.must_equal(a.object_id)
201
- @db.typecast_value(:jsonb, a.to_a).must_equal a
202
- @db.typecast_value(:jsonb, a.to_a).class.must_equal(@bac)
203
- @db.typecast_value(:jsonb, Sequel.pg_json(a)).must_equal a
204
- @db.typecast_value(:jsonb, Sequel.pg_json(a)).class.must_equal(@bac)
205
- @db.typecast_value(:jsonb, '[]').must_equal Sequel.pg_jsonb([])
206
- @db.typecast_value(:jsonb, '[]').class.must_equal(@bac)
207
- @db.typecast_value(:jsonb, '{"a": "b"}').must_equal Sequel.pg_jsonb("a"=>"b")
208
- @db.typecast_value(:jsonb, '{"a": "b"}').class.must_equal(@bhc)
209
- proc{@db.typecast_value(:jsonb, '')}.must_raise(Sequel::InvalidValue)
210
- proc{@db.typecast_value(:jsonb, 1)}.must_raise(Sequel::InvalidValue)
211
- end
212
-
213
- it "should return correct results for Database#schema_type_class" do
214
- @db.schema_type_class(:json).must_equal [Sequel::Postgres::JSONHash, Sequel::Postgres::JSONArray]
215
- @db.schema_type_class(:jsonb).must_equal [Sequel::Postgres::JSONBHash, Sequel::Postgres::JSONBArray]
216
- @db.schema_type_class(:integer).must_equal Integer
217
- end
218
- end
@@ -1,17 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "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
- end
7
-
8
- it "should add loose_count method getting fast count for entire table using table statistics" do
9
- @db.loose_count(:a).must_equal 1
10
- @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"]
11
- end
12
-
13
- it "should support schema qualified tables" do
14
- @db.loose_count(:a__b).must_equal 1
15
- @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"]
16
- end
17
- end
@@ -1,58 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- Sequel.extension :pg_array, :pg_range, :pg_range_ops
4
-
5
- describe "Sequel::Postgres::RangeOp" do
6
- before do
7
- @ds = Sequel.connect('mock://postgres', :quote_identifiers=>false).dataset
8
- @h = Sequel.pg_range_op(:h)
9
- end
10
-
11
- it "#pg_range should return self" do
12
- @h.pg_range.must_be_same_as(@h)
13
- end
14
-
15
- it "Sequel.pg_range_op should return argument if already a RangeOp" do
16
- Sequel.pg_range_op(@h).must_be_same_as(@h)
17
- end
18
-
19
- it "Sequel.pg_range should return a new RangeOp if not given a range" do
20
- @ds.literal(Sequel.pg_range(:h).lower).must_equal "lower(h)"
21
- end
22
-
23
- it "#pg_range should return a RangeOp for literal strings, and expressions" do
24
- @ds.literal(Sequel.function(:b, :h).pg_range.lower).must_equal "lower(b(h))"
25
- @ds.literal(Sequel.lit('h').pg_range.lower).must_equal "lower(h)"
26
- end
27
-
28
- it "PGRange#op should return a RangeOp" do
29
- @ds.literal(Sequel.pg_range(1..2, :numrange).op.lower).must_equal "lower(numrange(1,2,'[]'))"
30
- end
31
-
32
- it "should define methods for all of the PostgreSQL range operators" do
33
- @ds.literal(@h.contains(@h)).must_equal "(h @> h)"
34
- @ds.literal(@h.contained_by(@h)).must_equal "(h <@ h)"
35
- @ds.literal(@h.overlaps(@h)).must_equal "(h && h)"
36
- @ds.literal(@h.left_of(@h)).must_equal "(h << h)"
37
- @ds.literal(@h.right_of(@h)).must_equal "(h >> h)"
38
- @ds.literal(@h.ends_before(@h)).must_equal "(h &< h)"
39
- @ds.literal(@h.starts_after(@h)).must_equal "(h &> h)"
40
- @ds.literal(@h.adjacent_to(@h)).must_equal "(h -|- h)"
41
- end
42
-
43
- it "should define methods for all of the PostgreSQL range functions" do
44
- @ds.literal(@h.lower).must_equal "lower(h)"
45
- @ds.literal(@h.upper).must_equal "upper(h)"
46
- @ds.literal(@h.isempty).must_equal "isempty(h)"
47
- @ds.literal(@h.lower_inc).must_equal "lower_inc(h)"
48
- @ds.literal(@h.upper_inc).must_equal "upper_inc(h)"
49
- @ds.literal(@h.lower_inf).must_equal "lower_inf(h)"
50
- @ds.literal(@h.upper_inf).must_equal "upper_inf(h)"
51
- end
52
-
53
- it "+ - * operators should be defined and return a RangeOp" do
54
- @ds.literal((@h + @h).lower).must_equal "lower((h + h))"
55
- @ds.literal((@h * @h).lower).must_equal "lower((h * h))"
56
- @ds.literal((@h - @h).lower).must_equal "lower((h - h))"
57
- end
58
- end
@@ -1,404 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
-
4
- describe "pg_range extension" do
5
- before(:all) do
6
- Sequel.extension :pg_array, :pg_range
7
- @pg_types = Sequel::Postgres::PG_TYPES.dup
8
- end
9
- after(:all) do
10
- Sequel::Postgres::PG_TYPES.replace(@pg_types)
11
- end
12
-
13
- before do
14
- @db = Sequel.connect('mock://postgres', :quote_identifiers=>false)
15
- @R = Sequel::Postgres::PGRange
16
- @db.extend_datasets(Module.new{def supports_timestamp_timezones?; false; end; def supports_timestamp_usecs?; false; end})
17
- @db.extension(:pg_array, :pg_range)
18
- end
19
-
20
- it "should literalize Range instances to strings correctly" do
21
- @db.literal(Date.new(2011, 1, 2)...Date.new(2011, 3, 2)).must_equal "'[2011-01-02,2011-03-02)'"
22
- @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)'"
23
- @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)'"
24
- @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)'"
25
- @db.literal(1..2).must_equal "'[1,2]'"
26
- @db.literal(1.0..2.0).must_equal "'[1.0,2.0]'"
27
- @db.literal(BigDecimal.new('1.0')..BigDecimal.new('2.0')).must_equal "'[1.0,2.0]'"
28
- @db.literal(Sequel.lit('a')..Sequel.lit('z')).must_equal "'[a,z]'"
29
- @db.literal(''..'()[]",\\2').must_equal "'[\"\",\\(\\)\\[\\]\\\"\\,\\\\2]'"
30
- end
31
-
32
- it "should literalize PGRange instances to strings correctly" do
33
- @db.literal(@R.new(1, 2)).must_equal "'[1,2]'"
34
- @db.literal(@R.new(true, false)).must_equal "'[true,false]'"
35
- @db.literal(@R.new(1, 2, :exclude_begin=>true)).must_equal "'(1,2]'"
36
- @db.literal(@R.new(1, 2, :exclude_end=>true)).must_equal "'[1,2)'"
37
- @db.literal(@R.new(nil, 2)).must_equal "'[,2]'"
38
- @db.literal(@R.new(1, nil)).must_equal "'[1,]'"
39
- @db.literal(@R.new(1, 2, :db_type=>'int8range')).must_equal "int8range(1,2,'[]')"
40
- @db.literal(@R.new(nil, nil, :empty=>true)).must_equal "'empty'"
41
- @db.literal(@R.new("", 2)).must_equal "'[\"\",2]'"
42
- end
43
-
44
- it "should not affect literalization of custom objects" do
45
- o = Object.new
46
- def o.sql_literal(ds) 'v' end
47
- @db.literal(o).must_equal 'v'
48
- end
49
-
50
- it "should support using Range instances as bound variables" do
51
- @db.bound_variable_arg(1..2, nil).must_equal "[1,2]"
52
- end
53
-
54
- it "should support using PGRange instances as bound variables" do
55
- @db.bound_variable_arg(@R.new(1, 2), nil).must_equal "[1,2]"
56
- end
57
-
58
- it "should support using arrays of Range instances as bound variables" do
59
- @db.bound_variable_arg([1..2,2...3], nil).must_equal '{"[1,2]","[2,3)"}'
60
- end
61
-
62
- it "should support using PGRange instances as bound variables" do
63
- @db.bound_variable_arg([@R.new(1, 2),@R.new(2, 3)], nil).must_equal '{"[1,2]","[2,3]"}'
64
- end
65
-
66
- it "should parse range types from the schema correctly" do
67
- @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'}]
68
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :int4range, :int8range, :numrange, :daterange, :tsrange, :tstzrange]
69
- end
70
-
71
- it "should parse arrays of range types from the schema correctly" do
72
- @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[]'}]
73
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :int4range_array, :int8range_array, :numrange_array, :daterange_array, :tsrange_array, :tstzrange_array]
74
- end
75
-
76
- describe "database typecasting" do
77
- before do
78
- @o = @R.new(1, 2, :db_type=>'int4range')
79
- @o2 = @R.new(1, 2, :db_type=>'int8range')
80
- @eo = @R.new(nil, nil, :empty=>true, :db_type=>'int4range')
81
- @eo2 = @R.new(nil, nil, :empty=>true, :db_type=>'int8range')
82
- end
83
-
84
- it "should handle multiple range types" do
85
- %w'int4 int8 num date ts tstz'.each do |i|
86
- @db.typecast_value(:"#{i}range", @R.new(1, 2, :db_type=>"#{i}range")).must_equal @R.new(1, 2, :db_type=>"#{i}range")
87
- end
88
- end
89
-
90
- it "should handle multiple array range types" do
91
- %w'int4 int8 num date ts tstz'.each do |i|
92
- @db.typecast_value(:"#{i}range_array", [@R.new(1, 2, :db_type=>"#{i}range")]).class.must_equal(Sequel::Postgres::PGArray)
93
- @db.typecast_value(:"#{i}range_array", [@R.new(1, 2, :db_type=>"#{i}range")]).must_equal [@R.new(1, 2, :db_type=>"#{i}range")]
94
- end
95
- end
96
-
97
- it "should return PGRange value as is if they have the same subtype" do
98
- @db.typecast_value(:int4range, @o).must_be_same_as(@o)
99
- end
100
-
101
- it "should return new PGRange value as is if they have a different subtype" do
102
- @db.typecast_value(:int8range, @o).wont_be_same_as(@o)
103
- @db.typecast_value(:int8range, @o).must_equal @o2
104
- end
105
-
106
- it "should return new PGRange value as is if they have a different subtype and value is empty" do
107
- @db.typecast_value(:int8range, @eo).must_equal @eo2
108
- end
109
-
110
- it "should return new PGRange value if given a Range" do
111
- @db.typecast_value(:int4range, 1..2).must_equal @o
112
- @db.typecast_value(:int4range, 1..2).wont_equal @o2
113
- @db.typecast_value(:int8range, 1..2).must_equal @o2
114
- end
115
-
116
- it "should parse a string argument as the PostgreSQL output format" do
117
- @db.typecast_value(:int4range, '[1,2]').must_equal @o
118
- end
119
-
120
- it "should raise errors for unparsable formats" do
121
- proc{@db.typecast_value(:int8range, 'foo')}.must_raise(Sequel::InvalidValue)
122
- end
123
-
124
- it "should raise errors for unhandled values" do
125
- proc{@db.typecast_value(:int4range, 1)}.must_raise(Sequel::InvalidValue)
126
- end
127
- end
128
-
129
- it "should support registering custom range types" do
130
- @R.register('foorange')
131
- @db.typecast_value(:foorange, 1..2).must_be_kind_of(@R)
132
- @db.fetch = [{:name=>'id', :db_type=>'foorange'}]
133
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:foorange]
134
- end
135
-
136
- it "should support using a block as a custom conversion proc given as block" do
137
- @R.register('foo2range'){|s| (s*2).to_i}
138
- @db.typecast_value(:foo2range, '[1,2]').must_be :==, (11..22)
139
- end
140
-
141
- it "should support using a block as a custom conversion proc given as :converter option" do
142
- @R.register('foo3range', :converter=>proc{|s| (s*2).to_i})
143
- @db.typecast_value(:foo3range, '[1,2]').must_be :==, (11..22)
144
- end
145
-
146
- it "should support using an existing scaler conversion proc via the :subtype_oid option" do
147
- @R.register('foo4range', :subtype_oid=>16)
148
- @db.typecast_value(:foo4range, '[t,f]').must_equal @R.new(true, false, :db_type=>'foo4range')
149
- end
150
-
151
- it "should raise an error if using :subtype_oid option with unexisting scalar conversion proc" do
152
- proc{@R.register('fooirange', :subtype_oid=>0)}.must_raise(Sequel::Error)
153
- end
154
-
155
- it "should raise an error if using :converter option and a block argument" do
156
- proc{@R.register('fooirange', :converter=>proc{}){}}.must_raise(Sequel::Error)
157
- end
158
-
159
- it "should raise an error if using :subtype_oid option and a block argument" do
160
- proc{@R.register('fooirange', :subtype_oid=>16){}}.must_raise(Sequel::Error)
161
- end
162
-
163
- it "should support registering custom types with :oid option" do
164
- @R.register('foo5range', :oid=>331)
165
- Sequel::Postgres::PG_TYPES[331].call('[1,3)').must_be_kind_of(@R)
166
- end
167
-
168
- it "should return correct results for Database#schema_type_class" do
169
- @db.schema_type_class(:int4range).must_equal Sequel::Postgres::PGRange
170
- @db.schema_type_class(:integer).must_equal Integer
171
- end
172
-
173
- describe "parser" do
174
- before do
175
- @p = Sequel::Postgres::PG_TYPES[3904]
176
- @sp = @R::Parser.new(nil)
177
- end
178
-
179
- it "should have db_type method to return the database type string" do
180
- @p.db_type.must_equal 'int4range'
181
- end
182
-
183
- it "should have converter method which returns a callable used for conversion" do
184
- @p.converter.call('1').must_equal 1
185
- end
186
-
187
- it "should have call parse input string argument into PGRange instance" do
188
- @p.call('[1,2]').must_equal @R.new(1, 2, :db_type=>'int4range')
189
- end
190
-
191
- it "should handle empty ranges" do
192
- @p.call('empty').must_equal @R.new(nil, nil, :empty=>true, :db_type=>'int4range')
193
- end
194
-
195
- it "should handle exclusive beginnings and endings" do
196
- @p.call('(1,3]').must_equal @R.new(1, 3, :exclude_begin=>true, :db_type=>'int4range')
197
- @p.call('[1,3)').must_equal @R.new(1, 3, :exclude_end=>true, :db_type=>'int4range')
198
- @p.call('(1,3)').must_equal @R.new(1, 3, :exclude_begin=>true, :exclude_end=>true, :db_type=>'int4range')
199
- end
200
-
201
- it "should handle unbounded beginnings and endings" do
202
- @p.call('[,2]').must_equal @R.new(nil, 2, :db_type=>'int4range')
203
- @p.call('[1,]').must_equal @R.new(1, nil, :db_type=>'int4range')
204
- @p.call('[,]').must_equal @R.new(nil, nil, :db_type=>'int4range')
205
- end
206
-
207
- it "should unescape quoted beginnings and endings" do
208
- @sp.call('["\\\\ \\"","\\" \\\\"]').must_equal @R.new("\\ \"", "\" \\")
209
- end
210
-
211
- it "should treat empty quoted string not as unbounded" do
212
- @sp.call('["","z"]').must_equal @R.new("", "z")
213
- @sp.call('["a",""]').must_equal @R.new("a", "")
214
- @sp.call('["",""]').must_equal @R.new("", "")
215
- end
216
- end
217
-
218
- it "should set appropriate timestamp range conversion procs when resetting conversion procs" do
219
- @db.reset_conversion_procs
220
- procs = @db.conversion_procs
221
- procs[3908].call('[2011-10-20 11:12:13,2011-10-20 11:12:14]').must_be :==, (Time.local(2011, 10, 20, 11, 12, 13)..(Time.local(2011, 10, 20, 11, 12, 14)))
222
- procs[3910].call('[2011-10-20 11:12:13,2011-10-20 11:12:14]').must_be :==, (Time.local(2011, 10, 20, 11, 12, 13)..(Time.local(2011, 10, 20, 11, 12, 14)))
223
- end
224
-
225
- it "should set appropriate timestamp range array conversion procs when resetting conversion procs" do
226
- @db.reset_conversion_procs
227
- procs = @db.conversion_procs
228
- procs[3909].call('{"[2011-10-20 11:12:13,2011-10-20 11:12:14]"}').must_be :==, [Time.local(2011, 10, 20, 11, 12, 13)..Time.local(2011, 10, 20, 11, 12, 14)]
229
- procs[3911].call('{"[2011-10-20 11:12:13,2011-10-20 11:12:14]"}').must_be :==, [Time.local(2011, 10, 20, 11, 12, 13)..Time.local(2011, 10, 20, 11, 12, 14)]
230
- end
231
-
232
- describe "a PGRange instance" do
233
- before do
234
- @r1 = @R.new(1, 2)
235
- @r2 = @R.new(3, nil, :exclude_begin=>true, :db_type=>'int4range')
236
- @r3 = @R.new(nil, 4, :exclude_end=>true, :db_type=>'int8range')
237
- end
238
-
239
- it "should have #begin return the beginning of the range" do
240
- @r1.begin.must_equal 1
241
- @r2.begin.must_equal 3
242
- @r3.begin.must_equal nil
243
- end
244
-
245
- it "should have #end return the end of the range" do
246
- @r1.end.must_equal 2
247
- @r2.end.must_equal nil
248
- @r3.end.must_equal 4
249
- end
250
-
251
- it "should have #db_type return the range's database type" do
252
- @r1.db_type.must_equal nil
253
- @r2.db_type.must_equal 'int4range'
254
- @r3.db_type.must_equal 'int8range'
255
- end
256
-
257
- it "should be able to be created by Sequel.pg_range" do
258
- Sequel.pg_range(1..2).must_equal @r1
259
- end
260
-
261
- it "should have Sequel.pg_range be able to take a database type" do
262
- Sequel.pg_range(1..2, :int4range).must_equal @R.new(1, 2, :db_type=>:int4range)
263
- end
264
-
265
- it "should have Sequel.pg_range return a PGRange as is" do
266
- a = Sequel.pg_range(1..2)
267
- Sequel.pg_range(a).must_be_same_as(a)
268
- end
269
-
270
- it "should have Sequel.pg_range return a new PGRange if the database type differs" do
271
- a = Sequel.pg_range(1..2, :int4range)
272
- b = Sequel.pg_range(a, :int8range)
273
- a.to_range.must_equal b.to_range
274
- a.wont_be_same_as(b)
275
- a.db_type.must_equal :int4range
276
- b.db_type.must_equal :int8range
277
- end
278
-
279
- it "should have #initialize raise if requesting an empty range with beginning or ending" do
280
- proc{@R.new(1, nil, :empty=>true)}.must_raise(Sequel::Error)
281
- proc{@R.new(nil, 2, :empty=>true)}.must_raise(Sequel::Error)
282
- proc{@R.new(nil, nil, :empty=>true, :exclude_begin=>true)}.must_raise(Sequel::Error)
283
- proc{@R.new(nil, nil, :empty=>true, :exclude_end=>true)}.must_raise(Sequel::Error)
284
- end
285
-
286
- it "should quack like a range" do
287
- if RUBY_VERSION >= '1.9'
288
- @r1.cover?(1.5).must_equal true
289
- @r1.cover?(2.5).must_equal false
290
- @r1.first(1).must_equal [1]
291
- @r1.last(1).must_equal [2]
292
- end
293
- @r1.to_a.must_equal [1, 2]
294
- @r1.first.must_equal 1
295
- @r1.last.must_equal 2
296
- a = []
297
- @r1.step{|x| a << x}
298
- a.must_equal [1, 2]
299
- end
300
-
301
- it "should only consider PGRanges equal if they have the same db_type" do
302
- @R.new(1, 2, :db_type=>'int4range').must_equal @R.new(1, 2, :db_type=>'int4range')
303
- @R.new(1, 2, :db_type=>'int8range').wont_equal @R.new(1, 2, :db_type=>'int4range')
304
- end
305
-
306
- it "should only consider empty PGRanges equal with other empty PGRanges" do
307
- @R.new(nil, nil, :empty=>true).must_equal @R.new(nil, nil, :empty=>true)
308
- @R.new(nil, nil, :empty=>true).wont_equal @R.new(nil, nil)
309
- @R.new(nil, nil).wont_equal @R.new(nil, nil, :empty=>true)
310
- end
311
-
312
- it "should only consider empty PGRanges equal if they have the same bounds" do
313
- @R.new(1, 2).must_equal @R.new(1, 2)
314
- @R.new(1, 2).wont_equal @R.new(1, 3)
315
- end
316
-
317
- it "should only consider empty PGRanges equal if they have the same bound exclusions" do
318
- @R.new(1, 2, :exclude_begin=>true).must_equal @R.new(1, 2, :exclude_begin=>true)
319
- @R.new(1, 2, :exclude_end=>true).must_equal @R.new(1, 2, :exclude_end=>true)
320
- @R.new(1, 2, :exclude_begin=>true).wont_equal @R.new(1, 2, :exclude_end=>true)
321
- @R.new(1, 2, :exclude_end=>true).wont_equal @R.new(1, 2, :exclude_begin=>true)
322
- end
323
-
324
- it "should consider PGRanges equal with a Range they represent" do
325
- @R.new(1, 2).must_be :==, (1..2)
326
- @R.new(1, 2, :exclude_end=>true).must_be :==, (1...2)
327
- @R.new(1, 3).wont_be :==, (1..2)
328
- @R.new(1, 2, :exclude_end=>true).wont_be :==, (1..2)
329
- end
330
-
331
- it "should not consider a PGRange equal with a Range if it can't be expressed as a range" do
332
- @R.new(nil, nil).wont_be :==, (1..2)
333
- end
334
-
335
- it "should not consider a PGRange equal to other objects" do
336
- @R.new(nil, nil).wont_equal 1
337
- end
338
-
339
- it "should have #=== be true if given an equal PGRange" do
340
- @R.new(1, 2).must_be :===, @R.new(1, 2)
341
- @R.new(1, 2).wont_be :===, @R.new(1, 3)
342
-
343
- end
344
-
345
- it "should have #=== be true if it would be true for the Range represented by the PGRange" do
346
- @R.new(1, 2).must_be :===, 1.5
347
- @R.new(1, 2).wont_be :===, 2.5
348
- end
349
-
350
- it "should have #=== be false if the PGRange cannot be represented by a Range" do
351
- @R.new(nil, nil).wont_be :===, 1.5
352
- end
353
-
354
- it "should have #empty? indicate whether the range is empty" do
355
- @R.empty.must_be :empty?
356
- @R.new(1, 2).wont_be :empty?
357
- end
358
-
359
- it "should have #exclude_begin? and #exclude_end indicate whether the beginning or ending of the range is excluded" do
360
- @r1.exclude_begin?.must_equal false
361
- @r1.exclude_end?.must_equal false
362
- @r2.exclude_begin?.must_equal true
363
- @r2.exclude_end?.must_equal false
364
- @r3.exclude_begin?.must_equal false
365
- @r3.exclude_end?.must_equal true
366
- end
367
-
368
- it "should have #to_range raise an exception if the PGRange cannot be represented by a Range" do
369
- proc{@R.new(nil, 1).to_range}.must_raise(Sequel::Error)
370
- proc{@R.new(1, nil).to_range}.must_raise(Sequel::Error)
371
- proc{@R.new(0, 1, :exclude_begin=>true).to_range}.must_raise(Sequel::Error)
372
- proc{@R.empty.to_range}.must_raise(Sequel::Error)
373
- end
374
-
375
- it "should have #to_range return the represented range" do
376
- @r1.to_range.must_be :==, (1..2)
377
- end
378
-
379
- it "should have #to_range cache the returned value" do
380
- @r1.to_range.must_be_same_as(@r1.to_range)
381
- end
382
-
383
- it "should have #unbounded_begin? and #unbounded_end indicate whether the beginning or ending of the range is unbounded" do
384
- @r1.unbounded_begin?.must_equal false
385
- @r1.unbounded_end?.must_equal false
386
- @r2.unbounded_begin?.must_equal false
387
- @r2.unbounded_end?.must_equal true
388
- @r3.unbounded_begin?.must_equal true
389
- @r3.unbounded_end?.must_equal false
390
- end
391
-
392
- it "should have #valid_ruby_range? return true if the PGRange can be represented as a Range" do
393
- @r1.valid_ruby_range?.must_equal true
394
- @R.new(1, 2, :exclude_end=>true).valid_ruby_range?.must_equal true
395
- end
396
-
397
- it "should have #valid_ruby_range? return false if the PGRange cannot be represented as a Range" do
398
- @R.new(nil, 1).valid_ruby_range?.must_equal false
399
- @R.new(1, nil).valid_ruby_range?.must_equal false
400
- @R.new(0, 1, :exclude_begin=>true).valid_ruby_range?.must_equal false
401
- @R.empty.valid_ruby_range?.must_equal false
402
- end
403
- end
404
- end