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,289 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :pg_array, :pg_array_ops, :pg_json, :pg_json_ops
4
-
5
- describe "Sequel::Postgres::JSONOp" do
6
- before do
7
- @db = Sequel.connect('mock://postgres')
8
- @db.extend_datasets{def quote_identifiers?; false end}
9
- @j = Sequel.pg_json_op(:j)
10
- @jb = Sequel.pg_jsonb_op(:j)
11
- @l = proc{|o| @db.literal(o)}
12
- end
13
-
14
- it "should have #[] get the element" do
15
- @l[@j[1]].must_equal "(j -> 1)"
16
- @l[@j['a']].must_equal "(j -> 'a')"
17
- end
18
-
19
- it "should have #[] accept an array" do
20
- @l[@j[%w'a b']].must_equal "(j #> ARRAY['a','b'])"
21
- @l[@j[Sequel.pg_array(%w'a b')]].must_equal "(j #> ARRAY['a','b'])"
22
- @l[@j[Sequel.pg_array(:a)]].must_equal "(j #> a)"
23
- end
24
-
25
- it "should have #[] return an object of the same class" do
26
- @l[@j[1].to_recordset].must_equal "json_to_recordset((j -> 1))"
27
- @l[@j[%w'a b'][2]].must_equal "((j #> ARRAY['a','b']) -> 2)"
28
- @l[@jb[1].to_recordset].must_equal "jsonb_to_recordset((j -> 1))"
29
- @l[@jb[%w'a b'][2]].must_equal "((j #> ARRAY['a','b']) -> 2)"
30
- end
31
-
32
- it "should have #get be an alias to #[]" do
33
- @l[@j.get(1)].must_equal "(j -> 1)"
34
- @l[@j.get(%w'a b')].must_equal "(j #> ARRAY['a','b'])"
35
- end
36
-
37
- it "should have #get_text get the element as text" do
38
- @l[@j.get_text(1)].must_equal "(j ->> 1)"
39
- @l[@j.get_text('a')].must_equal "(j ->> 'a')"
40
- end
41
-
42
- it "should have #get_text accept an array" do
43
- @l[@j.get_text(%w'a b')].must_equal "(j #>> ARRAY['a','b'])"
44
- @l[@j.get_text(Sequel.pg_array(%w'a b'))].must_equal "(j #>> ARRAY['a','b'])"
45
- @l[@j.get_text(Sequel.pg_array(:a))].must_equal "(j #>> a)"
46
- end
47
-
48
- it "should have #get_text return an SQL::StringExpression" do
49
- @l[@j.get_text(1) + 'a'].must_equal "((j ->> 1) || 'a')"
50
- @l[@j.get_text(%w'a b') + 'a'].must_equal "((j #>> ARRAY['a','b']) || 'a')"
51
- end
52
-
53
- it "should have #array_length use the json_array_length function" do
54
- @l[@j.array_length].must_equal "json_array_length(j)"
55
- @l[@jb.array_length].must_equal "jsonb_array_length(j)"
56
- end
57
-
58
- it "should have #array_length return a numeric expression" do
59
- @l[@j.array_length & 1].must_equal "(json_array_length(j) & 1)"
60
- @l[@jb.array_length & 1].must_equal "(jsonb_array_length(j) & 1)"
61
- end
62
-
63
- it "should have #each use the json_each function" do
64
- @l[@j.each].must_equal "json_each(j)"
65
- @l[@jb.each].must_equal "jsonb_each(j)"
66
- end
67
-
68
- it "should have #each_text use the json_each_text function" do
69
- @l[@j.each_text].must_equal "json_each_text(j)"
70
- @l[@jb.each_text].must_equal "jsonb_each_text(j)"
71
- end
72
-
73
- it "should have #extract use the json_extract_path function" do
74
- @l[@j.extract('a')].must_equal "json_extract_path(j, 'a')"
75
- @l[@j.extract('a', 'b')].must_equal "json_extract_path(j, 'a', 'b')"
76
- @l[@jb.extract('a')].must_equal "jsonb_extract_path(j, 'a')"
77
- @l[@jb.extract('a', 'b')].must_equal "jsonb_extract_path(j, 'a', 'b')"
78
- end
79
-
80
- it "should have #extract return a JSONOp" do
81
- @l[@j.extract('a')[1]].must_equal "(json_extract_path(j, 'a') -> 1)"
82
- @l[@jb.extract('a')[1]].must_equal "(jsonb_extract_path(j, 'a') -> 1)"
83
- end
84
-
85
- it "should have #extract_text use the json_extract_path_text function" do
86
- @l[@j.extract_text('a')].must_equal "json_extract_path_text(j, 'a')"
87
- @l[@j.extract_text('a', 'b')].must_equal "json_extract_path_text(j, 'a', 'b')"
88
- @l[@jb.extract_text('a')].must_equal "jsonb_extract_path_text(j, 'a')"
89
- @l[@jb.extract_text('a', 'b')].must_equal "jsonb_extract_path_text(j, 'a', 'b')"
90
- end
91
-
92
- it "should have #extract_text return an SQL::StringExpression" do
93
- @l[@j.extract_text('a') + 'a'].must_equal "(json_extract_path_text(j, 'a') || 'a')"
94
- @l[@jb.extract_text('a') + 'a'].must_equal "(jsonb_extract_path_text(j, 'a') || 'a')"
95
- end
96
-
97
- it "should have #keys use the json_object_keys function" do
98
- @l[@j.keys].must_equal "json_object_keys(j)"
99
- @l[@jb.keys].must_equal "jsonb_object_keys(j)"
100
- end
101
-
102
- it "should have #array_elements use the json_array_elements function" do
103
- @l[@j.array_elements].must_equal "json_array_elements(j)"
104
- @l[@jb.array_elements].must_equal "jsonb_array_elements(j)"
105
- end
106
-
107
- it "should have #array_elements use the json_array_elements_text function" do
108
- @l[@j.array_elements_text].must_equal "json_array_elements_text(j)"
109
- @l[@jb.array_elements_text].must_equal "jsonb_array_elements_text(j)"
110
- end
111
-
112
- it "should have #strip_nulls use the json_strip_nulls function" do
113
- @l[@j.strip_nulls].must_equal "json_strip_nulls(j)"
114
- @l[@jb.strip_nulls].must_equal "jsonb_strip_nulls(j)"
115
- end
116
-
117
- it "should have #typeof use the json_typeof function" do
118
- @l[@j.typeof].must_equal "json_typeof(j)"
119
- @l[@jb.typeof].must_equal "jsonb_typeof(j)"
120
- end
121
-
122
- it "should have #to_record use the json_to_record function" do
123
- @l[@j.to_record].must_equal "json_to_record(j)"
124
- @l[@jb.to_record].must_equal "jsonb_to_record(j)"
125
- end
126
-
127
- it "should have #to_recordset use the json_to_recordsetfunction" do
128
- @l[@j.to_recordset].must_equal "json_to_recordset(j)"
129
- @l[@jb.to_recordset].must_equal "jsonb_to_recordset(j)"
130
- end
131
-
132
- it "should have #populate use the json_populate_record function" do
133
- @l[@j.populate(:a)].must_equal "json_populate_record(a, j)"
134
- @l[@jb.populate(:a)].must_equal "jsonb_populate_record(a, j)"
135
- end
136
-
137
- it "should have #populate_set use the json_populate_record function" do
138
- @l[@j.populate_set(:a)].must_equal "json_populate_recordset(a, j)"
139
- @l[@jb.populate_set(:a)].must_equal "jsonb_populate_recordset(a, j)"
140
- end
141
-
142
- it "#contain_all should use the ?& operator" do
143
- @l[@jb.contain_all(:h1)].must_equal "(j ?& h1)"
144
- end
145
-
146
- it "#contain_all handle arrays" do
147
- @l[@jb.contain_all(%w'h1')].must_equal "(j ?& ARRAY['h1'])"
148
- end
149
-
150
- it "#contain_any should use the ?| operator" do
151
- @l[@jb.contain_any(:h1)].must_equal "(j ?| h1)"
152
- end
153
-
154
- it "#contain_any should handle arrays" do
155
- @l[@jb.contain_any(%w'h1')].must_equal "(j ?| ARRAY['h1'])"
156
- end
157
-
158
- it "#contains should use the @> operator" do
159
- @l[@jb.contains(:h1)].must_equal "(j @> h1)"
160
- end
161
-
162
- it "#contains should handle hashes" do
163
- @l[@jb.contains('a'=>'b')].must_equal "(j @> '{\"a\":\"b\"}'::jsonb)"
164
- end
165
-
166
- it "#contains should handle arrays" do
167
- @l[@jb.contains([1, 2])].must_equal "(j @> '[1,2]'::jsonb)"
168
- end
169
-
170
- it "#contained_by should use the <@ operator" do
171
- @l[@jb.contained_by(:h1)].must_equal "(j <@ h1)"
172
- end
173
-
174
- it "#contained_by should handle hashes" do
175
- @l[@jb.contained_by('a'=>'b')].must_equal "(j <@ '{\"a\":\"b\"}'::jsonb)"
176
- end
177
-
178
- it "#contained_by should handle arrays" do
179
- @l[@jb.contained_by([1, 2])].must_equal "(j <@ '[1,2]'::jsonb)"
180
- end
181
-
182
- it "#concat should use the || operator" do
183
- @l[@jb.concat(:h1)].must_equal "(j || h1)"
184
- end
185
-
186
- it "#concat should handle hashes" do
187
- @l[@jb.concat('a'=>'b')].must_equal "(j || '{\"a\":\"b\"}'::jsonb)"
188
- end
189
-
190
- it "#concat should handle arrays" do
191
- @l[@jb.concat([1, 2])].must_equal "(j || '[1,2]'::jsonb)"
192
- end
193
-
194
- it "#insert should use the jsonb_insert function" do
195
- @l[@jb.insert(:a, :h)].must_equal "jsonb_insert(j, a, h, false)"
196
- @l[@jb.insert(:a, :h, true)].must_equal "jsonb_insert(j, a, h, true)"
197
- end
198
-
199
- it "#insert should handle hashes" do
200
- @l[@jb.insert(:a, 'a'=>'b')].must_equal "jsonb_insert(j, a, '{\"a\":\"b\"}'::jsonb, false)"
201
- end
202
-
203
- it "#insert should handle arrays" do
204
- @l[@jb.insert(%w'a b', [1, 2])].must_equal "jsonb_insert(j, ARRAY['a','b'], '[1,2]'::jsonb, false)"
205
- end
206
-
207
- it "#set should use the jsonb_set function" do
208
- @l[@jb.set(:a, :h)].must_equal "jsonb_set(j, a, h, true)"
209
- @l[@jb.set(:a, :h, false)].must_equal "jsonb_set(j, a, h, false)"
210
- end
211
-
212
- it "#set should handle hashes" do
213
- @l[@jb.set(:a, 'a'=>'b')].must_equal "jsonb_set(j, a, '{\"a\":\"b\"}'::jsonb, true)"
214
- end
215
-
216
- it "#set should handle arrays" do
217
- @l[@jb.set(%w'a b', [1, 2])].must_equal "jsonb_set(j, ARRAY['a','b'], '[1,2]'::jsonb, true)"
218
- end
219
-
220
- it "#pretty should use the jsonb_pretty function" do
221
- @l[@jb.pretty].must_equal "jsonb_pretty(j)"
222
- end
223
-
224
- it "#- should use the - operator" do
225
- @l[@jb - 1].must_equal "(j - 1)"
226
- end
227
-
228
- it "#delete_path should use the #- operator" do
229
- @l[@jb.delete_path(:a)].must_equal "(j #- a)"
230
- end
231
-
232
- it "#delete_path should handle arrays" do
233
- @l[@jb.delete_path(['a'])].must_equal "(j #- ARRAY['a'])"
234
- end
235
-
236
- it "#has_key? and aliases should use the ? operator" do
237
- @l[@jb.has_key?('a')].must_equal "(j ? 'a')"
238
- @l[@jb.include?('a')].must_equal "(j ? 'a')"
239
- end
240
-
241
- it "#pg_json should return self" do
242
- @j.pg_json.must_be_same_as(@j)
243
- @jb.pg_jsonb.must_be_same_as(@jb)
244
- end
245
-
246
- it "Sequel.pg_json_op should return arg for JSONOp" do
247
- Sequel.pg_json_op(@j).must_be_same_as(@j)
248
- Sequel.pg_jsonb_op(@jb).must_be_same_as(@jb)
249
- end
250
-
251
- it "should be able to turn expressions into json ops using pg_json" do
252
- @db.literal(Sequel.qualify(:b, :a).pg_json[1]).must_equal "(b.a -> 1)"
253
- @db.literal(Sequel.function(:a, :b).pg_json[1]).must_equal "(a(b) -> 1)"
254
- @db.literal(Sequel.qualify(:b, :a).pg_jsonb[1]).must_equal "(b.a -> 1)"
255
- @db.literal(Sequel.function(:a, :b).pg_jsonb[1]).must_equal "(a(b) -> 1)"
256
- end
257
-
258
- it "should be able to turn literal strings into json ops using pg_json" do
259
- @db.literal(Sequel.lit('a').pg_json[1]).must_equal "(a -> 1)"
260
- @db.literal(Sequel.lit('a').pg_jsonb[1]).must_equal "(a -> 1)"
261
- end
262
-
263
- it "should be able to turn symbols into json ops using Sequel.pg_json_op" do
264
- @db.literal(Sequel.pg_json_op(:a)[1]).must_equal "(a -> 1)"
265
- @db.literal(Sequel.pg_jsonb_op(:a)[1]).must_equal "(a -> 1)"
266
- end
267
-
268
- it "should be able to turn symbols into json ops using Sequel.pg_json" do
269
- @db.literal(Sequel.pg_json(:a)[1]).must_equal "(a -> 1)"
270
- @db.literal(Sequel.pg_jsonb(:a)[1]).must_equal "(a -> 1)"
271
- @db.literal(Sequel.pg_jsonb(:a).contains('a'=>1)).must_equal "(a @> '{\"a\":1}'::jsonb)"
272
- end
273
-
274
- it "should allow transforming JSONArray instances into ArrayOp instances" do
275
- @db.literal(Sequel.pg_json([1,2]).op[1]).must_equal "('[1,2]'::json -> 1)"
276
- end
277
-
278
- it "should allow transforming JSONHash instances into ArrayOp instances" do
279
- @db.literal(Sequel.pg_json('a'=>1).op['a']).must_equal "('{\"a\":1}'::json -> 'a')"
280
- end
281
-
282
- it "should allow transforming JSONBArray instances into ArrayOp instances" do
283
- @db.literal(Sequel.pg_jsonb([1,2]).op[1]).must_equal "('[1,2]'::jsonb -> 1)"
284
- end
285
-
286
- it "should allow transforming JSONBHash instances into ArrayOp instances" do
287
- @db.literal(Sequel.pg_jsonb('a'=>1).op['a']).must_equal "('{\"a\":1}'::jsonb -> 'a')"
288
- end
289
- end
@@ -1,262 +0,0 @@
1
- require_relative "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')
16
- @db.extend_datasets{def quote_identifiers?; false end}
17
- @db.extension(:pg_array, :pg_json)
18
- end
19
-
20
- it "should set up conversion procs correctly" do
21
- cp = @db.conversion_procs
22
- cp[114].call("{}").must_equal @hc.new({})
23
- cp[3802].call("{}").must_equal @bhc.new({})
24
- end
25
-
26
- it "should set up conversion procs for arrays correctly" do
27
- cp = @db.conversion_procs
28
- cp[199].call("{[]}").must_equal [@ac.new([])]
29
- cp[3807].call("{[]}").must_equal [@bac.new([])]
30
- end
31
-
32
- it "should parse json strings correctly" do
33
- @m.parse_json('[]').class.must_equal(@ac)
34
- @m.parse_json('[]').to_a.must_equal []
35
- @m.parse_json('[1]').to_a.must_equal [1]
36
- @m.parse_json('[1, 2]').to_a.must_equal [1, 2]
37
- @m.parse_json('[1, [2], {"a": "b"}]').to_a.must_equal [1, [2], {'a'=>'b'}]
38
- @m.parse_json('{}').class.must_equal(@hc)
39
- @m.parse_json('{}').to_hash.must_equal({})
40
- @m.parse_json('{"a": "b"}').to_hash.must_equal('a'=>'b')
41
- @m.parse_json('{"a": "b", "c": [1, 2, 3]}').to_hash.must_equal('a'=>'b', 'c'=>[1, 2, 3])
42
- @m.parse_json('{"a": "b", "c": {"d": "e"}}').to_hash.must_equal('a'=>'b', 'c'=>{'d'=>'e'})
43
- end
44
-
45
- it "should parse json and non-json plain strings, integers, and floats correctly in db_parse_json" do
46
- @m.db_parse_json('{"a": "b", "c": {"d": "e"}}').to_hash.must_equal('a'=>'b', 'c'=>{'d'=>'e'})
47
- @m.db_parse_json('[1, [2], {"a": "b"}]').to_a.must_equal [1, [2], {'a'=>'b'}]
48
- @m.db_parse_json('1').must_equal 1
49
- @m.db_parse_json('"b"').must_equal 'b'
50
- @m.db_parse_json('1.1').must_equal 1.1
51
- end
52
-
53
- it "should parse json and non-json plain strings, integers, and floats correctly in db_parse_jsonb" do
54
- @m.db_parse_jsonb('{"a": "b", "c": {"d": "e"}}').to_hash.must_equal('a'=>'b', 'c'=>{'d'=>'e'})
55
- @m.db_parse_jsonb('[1, [2], {"a": "b"}]').to_a.must_equal [1, [2], {'a'=>'b'}]
56
- @m.db_parse_jsonb('1').must_equal 1
57
- @m.db_parse_jsonb('"b"').must_equal 'b'
58
- @m.db_parse_jsonb('1.1').must_equal 1.1
59
- end
60
-
61
- it "should raise an error when attempting to parse invalid json" do
62
- proc{@m.parse_json('')}.must_raise(Sequel::InvalidValue)
63
- proc{@m.parse_json('a')}.must_raise(Sequel::InvalidValue)
64
-
65
- begin
66
- Sequel.instance_eval do
67
- alias pj parse_json
68
- def parse_json(v)
69
- {'1'=>1, "'a'"=>'a', 'true'=>true, 'false'=>false, 'null'=>nil, 'o'=>Object.new, '[one]'=>[1]}.fetch(v){pj(v)}
70
- end
71
- end
72
- @m.parse_json('1').must_equal 1
73
- @m.parse_json("'a'").must_equal 'a'
74
- @m.parse_json('true').must_equal true
75
- @m.parse_json('false').must_equal false
76
- @m.parse_json('null').must_be_nil
77
- proc{@m.parse_json('o')}.must_raise(Sequel::InvalidValue)
78
- @m.db_parse_json('one').must_equal 1
79
- @m.db_parse_jsonb('one').must_equal 1
80
- ensure
81
- Sequel.instance_eval do
82
- alias parse_json pj
83
- end
84
- end
85
- end
86
-
87
- it "should literalize JSONHash and JSONArray to strings correctly" do
88
- @db.literal(Sequel.pg_json([])).must_equal "'[]'::json"
89
- @db.literal(Sequel.pg_json([1, [2], {'a'=>'b'}])).must_equal "'[1,[2],{\"a\":\"b\"}]'::json"
90
- @db.literal(Sequel.pg_json({})).must_equal "'{}'::json"
91
- @db.literal(Sequel.pg_json('a'=>'b')).must_equal "'{\"a\":\"b\"}'::json"
92
- end
93
-
94
- it "should literalize JSONBHash and JSONBArray to strings correctly" do
95
- @db.literal(Sequel.pg_jsonb([])).must_equal "'[]'::jsonb"
96
- @db.literal(Sequel.pg_jsonb([1, [2], {'a'=>'b'}])).must_equal "'[1,[2],{\"a\":\"b\"}]'::jsonb"
97
- @db.literal(Sequel.pg_jsonb({})).must_equal "'{}'::jsonb"
98
- @db.literal(Sequel.pg_jsonb('a'=>'b')).must_equal "'{\"a\":\"b\"}'::jsonb"
99
- end
100
-
101
- it "should have Sequel.pg_json return JSONHash and JSONArray as is" do
102
- a = Sequel.pg_json({})
103
- Sequel.pg_json(a).object_id.must_equal(a.object_id)
104
- a = Sequel.pg_json([])
105
- Sequel.pg_json(a).object_id.must_equal(a.object_id)
106
- end
107
-
108
- it "should have Sequel.pg_json convert jsonb values" do
109
- a = {}
110
- v = Sequel.pg_json(Sequel.pg_jsonb(a))
111
- v.to_hash.must_be_same_as(a)
112
- v.class.must_equal(@hc)
113
-
114
- a = []
115
- v = Sequel.pg_json(Sequel.pg_jsonb(a))
116
- v.to_a.must_be_same_as(a)
117
- v.class.must_equal(@ac)
118
- end
119
-
120
- it "should have Sequel.pg_jsonb return JSONBHash and JSONBArray as is" do
121
- a = Sequel.pg_jsonb({})
122
- Sequel.pg_jsonb(a).object_id.must_equal(a.object_id)
123
- a = Sequel.pg_jsonb([])
124
- Sequel.pg_jsonb(a).object_id.must_equal(a.object_id)
125
- end
126
-
127
- it "should have Sequel.pg_jsonb convert json values" do
128
- a = {}
129
- v = Sequel.pg_jsonb(Sequel.pg_json(a))
130
- v.to_hash.must_be_same_as(a)
131
- v.class.must_equal(@bhc)
132
-
133
- a = []
134
- v = Sequel.pg_jsonb(Sequel.pg_json(a))
135
- v.to_a.must_be_same_as(a)
136
- v.class.must_equal(@bac)
137
- end
138
-
139
- it "should have JSONHashBase#to_hash method for getting underlying hash" do
140
- Sequel.pg_json({}).to_hash.must_be_kind_of(Hash)
141
- Sequel.pg_jsonb({}).to_hash.must_be_kind_of(Hash)
142
- end
143
-
144
- it "should allow aliasing json objects" do
145
- @db.literal(Sequel.pg_json({}).as(:a)).must_equal "'{}'::json AS a"
146
- @db.literal(Sequel.pg_json([]).as(:a)).must_equal "'[]'::json AS a"
147
- @db.literal(Sequel.pg_jsonb({}).as(:a)).must_equal "'{}'::jsonb AS a"
148
- @db.literal(Sequel.pg_jsonb([]).as(:a)).must_equal "'[]'::jsonb AS a"
149
- end
150
-
151
- it "should allow casting json objects" do
152
- @db.literal(Sequel.pg_json({}).cast(String)).must_equal "CAST('{}'::json AS text)"
153
- @db.literal(Sequel.pg_json([]).cast(String)).must_equal "CAST('[]'::json AS text)"
154
- @db.literal(Sequel.pg_jsonb({}).cast(String)).must_equal "CAST('{}'::jsonb AS text)"
155
- @db.literal(Sequel.pg_jsonb([]).cast(String)).must_equal "CAST('[]'::jsonb AS text)"
156
- end
157
-
158
- it "should have JSONArrayBase#to_a method for getting underlying array" do
159
- Sequel.pg_json([]).to_a.must_be_kind_of(Array)
160
- Sequel.pg_jsonb([]).to_a.must_be_kind_of(Array)
161
- end
162
-
163
- it "should support using JSONHashBase and JSONArrayBase as bound variables" do
164
- @db.bound_variable_arg(1, nil).must_equal 1
165
- @db.bound_variable_arg(Sequel.pg_json([1]), nil).must_equal '[1]'
166
- @db.bound_variable_arg(Sequel.pg_json('a'=>'b'), nil).must_equal '{"a":"b"}'
167
- @db.bound_variable_arg(Sequel.pg_jsonb([1]), nil).must_equal '[1]'
168
- @db.bound_variable_arg(Sequel.pg_jsonb('a'=>'b'), nil).must_equal '{"a":"b"}'
169
- end
170
-
171
- it "should support using json[] and jsonb[] types in bound variables" do
172
- @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]}"}'
173
- @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]}"}'
174
- end
175
-
176
- it "should parse json type from the schema correctly" do
177
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i', :db_type=>'json'}]
178
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :json]
179
- end
180
-
181
- it "should parse json type from the schema correctly" do
182
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i', :db_type=>'jsonb'}]
183
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :jsonb]
184
- end
185
-
186
- it "should set :callable_default schema entries if default value is recognized" do
187
- @db.fetch = [{:name=>'id', :db_type=>'integer', :default=>'1'}, {:name=>'jh', :db_type=>'json', :default=>"'{}'::json"}, {:name=>'ja', :db_type=>'json', :default=>"'[]'::json"}, {:name=>'jbh', :db_type=>'jsonb', :default=>"'{}'::jsonb"}, {:name=>'jba', :db_type=>'jsonb', :default=>"'[]'::jsonb"}]
188
- s = @db.schema(:items)
189
- s[0][1][:callable_default].must_be_nil
190
- v = s[1][1][:callable_default].call
191
- Sequel::Postgres::JSONHash.===(v).must_equal true
192
- @db.literal(v).must_equal "'{}'::json"
193
- v['a'] = 'b'
194
- @db.literal(v).must_equal "'{\"a\":\"b\"}'::json"
195
-
196
- v = s[2][1][:callable_default].call
197
- Sequel::Postgres::JSONArray.===(v).must_equal true
198
- @db.literal(v).must_equal "'[]'::json"
199
- v << 1
200
- @db.literal(v).must_equal "'[1]'::json"
201
-
202
- v = s[3][1][:callable_default].call
203
- Sequel::Postgres::JSONBHash.===(v).must_equal true
204
- @db.literal(v).must_equal "'{}'::jsonb"
205
- v['a'] = 'b'
206
- @db.literal(v).must_equal "'{\"a\":\"b\"}'::jsonb"
207
-
208
- v = s[4][1][:callable_default].call
209
- Sequel::Postgres::JSONBArray.===(v).must_equal true
210
- @db.literal(v).must_equal "'[]'::jsonb"
211
- v << 1
212
- @db.literal(v).must_equal "'[1]'::jsonb"
213
- end
214
-
215
- it "should support typecasting for the json type" do
216
- h = Sequel.pg_json(1=>2)
217
- a = Sequel.pg_json([1])
218
- @db.typecast_value(:json, h).object_id.must_equal(h.object_id)
219
- @db.typecast_value(:json, h.to_hash).must_equal h
220
- @db.typecast_value(:json, h.to_hash).class.must_equal(@hc)
221
- @db.typecast_value(:json, Sequel.pg_jsonb(h)).must_equal h
222
- @db.typecast_value(:json, Sequel.pg_jsonb(h)).class.must_equal(@hc)
223
- @db.typecast_value(:json, a).object_id.must_equal(a.object_id)
224
- @db.typecast_value(:json, a.to_a).must_equal a
225
- @db.typecast_value(:json, a.to_a).class.must_equal(@ac)
226
- @db.typecast_value(:json, Sequel.pg_jsonb(a)).must_equal a
227
- @db.typecast_value(:json, Sequel.pg_jsonb(a)).class.must_equal(@ac)
228
- @db.typecast_value(:json, '[]').must_equal Sequel.pg_json([])
229
- @db.typecast_value(:json, '[]').class.must_equal(@ac)
230
- @db.typecast_value(:json, '{"a": "b"}').must_equal Sequel.pg_json("a"=>"b")
231
- @db.typecast_value(:json, '{"a": "b"}').class.must_equal(@hc)
232
- proc{@db.typecast_value(:json, '')}.must_raise(Sequel::InvalidValue)
233
- proc{@db.typecast_value(:json, 1)}.must_raise(Sequel::InvalidValue)
234
- end
235
-
236
- it "should support typecasting for the jsonb type" do
237
- h = Sequel.pg_jsonb(1=>2)
238
- a = Sequel.pg_jsonb([1])
239
- @db.typecast_value(:jsonb, h).object_id.must_equal(h.object_id)
240
- @db.typecast_value(:jsonb, h.to_hash).must_equal h
241
- @db.typecast_value(:jsonb, h.to_hash).class.must_equal(@bhc)
242
- @db.typecast_value(:jsonb, Sequel.pg_json(h)).must_equal h
243
- @db.typecast_value(:jsonb, Sequel.pg_json(h)).class.must_equal(@bhc)
244
- @db.typecast_value(:jsonb, a).object_id.must_equal(a.object_id)
245
- @db.typecast_value(:jsonb, a.to_a).must_equal a
246
- @db.typecast_value(:jsonb, a.to_a).class.must_equal(@bac)
247
- @db.typecast_value(:jsonb, Sequel.pg_json(a)).must_equal a
248
- @db.typecast_value(:jsonb, Sequel.pg_json(a)).class.must_equal(@bac)
249
- @db.typecast_value(:jsonb, '[]').must_equal Sequel.pg_jsonb([])
250
- @db.typecast_value(:jsonb, '[]').class.must_equal(@bac)
251
- @db.typecast_value(:jsonb, '{"a": "b"}').must_equal Sequel.pg_jsonb("a"=>"b")
252
- @db.typecast_value(:jsonb, '{"a": "b"}').class.must_equal(@bhc)
253
- proc{@db.typecast_value(:jsonb, '')}.must_raise(Sequel::InvalidValue)
254
- proc{@db.typecast_value(:jsonb, 1)}.must_raise(Sequel::InvalidValue)
255
- end
256
-
257
- it "should return correct results for Database#schema_type_class" do
258
- @db.schema_type_class(:json).must_equal [Sequel::Postgres::JSONHash, Sequel::Postgres::JSONArray]
259
- @db.schema_type_class(:jsonb).must_equal [Sequel::Postgres::JSONBHash, Sequel::Postgres::JSONBArray]
260
- @db.schema_type_class(:integer).must_equal Integer
261
- end
262
- end
@@ -1,23 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "pg_loose_count extension" do
4
- before do
5
- @db = Sequel.mock(:host=>'postgres', :fetch=>{:v=>1}).extension(:pg_loose_count)
6
- @db.extend_datasets{def quote_identifiers?; false end}
7
- end
8
-
9
- it "should add loose_count method getting fast count for entire table using table statistics" do
10
- @db.loose_count(:a).must_equal 1
11
- @db.sqls.must_equal ["SELECT CAST(reltuples AS integer) AS v FROM pg_class WHERE (oid = CAST(CAST('a' AS regclass) AS oid)) LIMIT 1"]
12
- end
13
-
14
- it "should support schema qualified tables" do
15
- @db.loose_count(Sequel[:a][:b]).must_equal 1
16
- @db.sqls.must_equal ["SELECT CAST(reltuples AS integer) AS v FROM pg_class WHERE (oid = CAST(CAST('a.b' AS regclass) AS oid)) LIMIT 1"]
17
- end
18
-
19
- with_symbol_splitting "should support schema qualified table symbols" do
20
- @db.loose_count(:a__b).must_equal 1
21
- @db.sqls.must_equal ["SELECT CAST(reltuples AS integer) AS v FROM pg_class WHERE (oid = CAST(CAST('a.b' AS regclass) AS oid)) LIMIT 1"]
22
- end
23
- end
@@ -1,60 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :pg_array, :pg_range, :pg_range_ops
4
-
5
- describe "Sequel::Postgres::RangeOp" do
6
- before do
7
- db = Sequel.connect('mock://postgres')
8
- db.extend_datasets{def quote_identifiers?; false end}
9
- @ds = db.dataset
10
- @h = Sequel.pg_range_op(:h)
11
- end
12
-
13
- it "#pg_range should return self" do
14
- @h.pg_range.must_be_same_as(@h)
15
- end
16
-
17
- it "Sequel.pg_range_op should return argument if already a RangeOp" do
18
- Sequel.pg_range_op(@h).must_be_same_as(@h)
19
- end
20
-
21
- it "Sequel.pg_range should return a new RangeOp if not given a range" do
22
- @ds.literal(Sequel.pg_range(:h).lower).must_equal "lower(h)"
23
- end
24
-
25
- it "#pg_range should return a RangeOp for literal strings, and expressions" do
26
- @ds.literal(Sequel.function(:b, :h).pg_range.lower).must_equal "lower(b(h))"
27
- @ds.literal(Sequel.lit('h').pg_range.lower).must_equal "lower(h)"
28
- end
29
-
30
- it "PGRange#op should return a RangeOp" do
31
- @ds.literal(Sequel.pg_range(1..2, :numrange).op.lower).must_equal "lower(numrange(1,2,'[]'))"
32
- end
33
-
34
- it "should define methods for all of the PostgreSQL range operators" do
35
- @ds.literal(@h.contains(@h)).must_equal "(h @> h)"
36
- @ds.literal(@h.contained_by(@h)).must_equal "(h <@ h)"
37
- @ds.literal(@h.overlaps(@h)).must_equal "(h && h)"
38
- @ds.literal(@h.left_of(@h)).must_equal "(h << h)"
39
- @ds.literal(@h.right_of(@h)).must_equal "(h >> h)"
40
- @ds.literal(@h.ends_before(@h)).must_equal "(h &< h)"
41
- @ds.literal(@h.starts_after(@h)).must_equal "(h &> h)"
42
- @ds.literal(@h.adjacent_to(@h)).must_equal "(h -|- h)"
43
- end
44
-
45
- it "should define methods for all of the PostgreSQL range functions" do
46
- @ds.literal(@h.lower).must_equal "lower(h)"
47
- @ds.literal(@h.upper).must_equal "upper(h)"
48
- @ds.literal(@h.isempty).must_equal "isempty(h)"
49
- @ds.literal(@h.lower_inc).must_equal "lower_inc(h)"
50
- @ds.literal(@h.upper_inc).must_equal "upper_inc(h)"
51
- @ds.literal(@h.lower_inf).must_equal "lower_inf(h)"
52
- @ds.literal(@h.upper_inf).must_equal "upper_inf(h)"
53
- end
54
-
55
- it "+ - * operators should be defined and return a RangeOp" do
56
- @ds.literal((@h + @h).lower).must_equal "lower((h + h))"
57
- @ds.literal((@h * @h).lower).must_equal "lower((h * h))"
58
- @ds.literal((@h - @h).lower).must_equal "lower((h - h))"
59
- end
60
- end