sequel 5.28.0 → 5.33.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 (380) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +64 -1922
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +1 -1
  5. data/doc/advanced_associations.rdoc +4 -4
  6. data/doc/association_basics.rdoc +3 -3
  7. data/doc/code_order.rdoc +12 -2
  8. data/doc/model_dataset_method_design.rdoc +1 -1
  9. data/doc/postgresql.rdoc +71 -0
  10. data/doc/release_notes/5.29.0.txt +22 -0
  11. data/doc/release_notes/5.30.0.txt +20 -0
  12. data/doc/release_notes/5.31.0.txt +148 -0
  13. data/doc/release_notes/5.32.0.txt +46 -0
  14. data/doc/release_notes/5.33.0.txt +24 -0
  15. data/doc/testing.rdoc +1 -1
  16. data/lib/sequel/adapters/postgres.rb +5 -1
  17. data/lib/sequel/adapters/shared/access.rb +6 -6
  18. data/lib/sequel/adapters/shared/mssql.rb +5 -5
  19. data/lib/sequel/adapters/shared/mysql.rb +10 -10
  20. data/lib/sequel/adapters/shared/oracle.rb +16 -16
  21. data/lib/sequel/adapters/shared/postgres.rb +169 -14
  22. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  23. data/lib/sequel/adapters/shared/sqlite.rb +32 -5
  24. data/lib/sequel/adapters/tinytds.rb +1 -1
  25. data/lib/sequel/connection_pool/sharded_threaded.rb +2 -2
  26. data/lib/sequel/connection_pool/threaded.rb +1 -1
  27. data/lib/sequel/core.rb +318 -314
  28. data/lib/sequel/database/query.rb +1 -1
  29. data/lib/sequel/database/schema_generator.rb +1 -1
  30. data/lib/sequel/database/transactions.rb +8 -12
  31. data/lib/sequel/dataset/misc.rb +2 -2
  32. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  33. data/lib/sequel/extensions/connection_validator.rb +2 -2
  34. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  35. data/lib/sequel/extensions/index_caching.rb +9 -7
  36. data/lib/sequel/extensions/integer64.rb +2 -0
  37. data/lib/sequel/extensions/migration.rb +1 -1
  38. data/lib/sequel/extensions/pg_enum.rb +5 -2
  39. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  40. data/lib/sequel/extensions/pg_inet.rb +13 -5
  41. data/lib/sequel/extensions/pg_interval.rb +2 -0
  42. data/lib/sequel/extensions/pg_range.rb +2 -0
  43. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  44. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  45. data/lib/sequel/extensions/schema_dumper.rb +10 -4
  46. data/lib/sequel/extensions/server_block.rb +3 -3
  47. data/lib/sequel/model/associations.rb +18 -5
  48. data/lib/sequel/model/base.rb +60 -53
  49. data/lib/sequel/model/plugins.rb +1 -0
  50. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  51. data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
  52. data/lib/sequel/plugins/association_proxies.rb +2 -0
  53. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  54. data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
  55. data/lib/sequel/plugins/dirty.rb +13 -13
  56. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  57. data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
  58. data/lib/sequel/plugins/json_serializer.rb +18 -11
  59. data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
  60. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  61. data/lib/sequel/plugins/subclasses.rb +2 -0
  62. data/lib/sequel/plugins/throw_failures.rb +1 -1
  63. data/lib/sequel/timezones.rb +6 -4
  64. data/lib/sequel/version.rb +1 -1
  65. metadata +18 -367
  66. data/Rakefile +0 -151
  67. data/doc/release_notes/4.0.0.txt +0 -262
  68. data/doc/release_notes/4.1.0.txt +0 -85
  69. data/doc/release_notes/4.10.0.txt +0 -226
  70. data/doc/release_notes/4.11.0.txt +0 -147
  71. data/doc/release_notes/4.12.0.txt +0 -105
  72. data/doc/release_notes/4.13.0.txt +0 -169
  73. data/doc/release_notes/4.14.0.txt +0 -68
  74. data/doc/release_notes/4.15.0.txt +0 -56
  75. data/doc/release_notes/4.16.0.txt +0 -36
  76. data/doc/release_notes/4.17.0.txt +0 -38
  77. data/doc/release_notes/4.18.0.txt +0 -36
  78. data/doc/release_notes/4.19.0.txt +0 -45
  79. data/doc/release_notes/4.2.0.txt +0 -129
  80. data/doc/release_notes/4.20.0.txt +0 -79
  81. data/doc/release_notes/4.21.0.txt +0 -94
  82. data/doc/release_notes/4.22.0.txt +0 -72
  83. data/doc/release_notes/4.23.0.txt +0 -65
  84. data/doc/release_notes/4.24.0.txt +0 -99
  85. data/doc/release_notes/4.25.0.txt +0 -181
  86. data/doc/release_notes/4.26.0.txt +0 -44
  87. data/doc/release_notes/4.27.0.txt +0 -78
  88. data/doc/release_notes/4.28.0.txt +0 -57
  89. data/doc/release_notes/4.29.0.txt +0 -41
  90. data/doc/release_notes/4.3.0.txt +0 -40
  91. data/doc/release_notes/4.30.0.txt +0 -37
  92. data/doc/release_notes/4.31.0.txt +0 -57
  93. data/doc/release_notes/4.32.0.txt +0 -132
  94. data/doc/release_notes/4.33.0.txt +0 -88
  95. data/doc/release_notes/4.34.0.txt +0 -86
  96. data/doc/release_notes/4.35.0.txt +0 -130
  97. data/doc/release_notes/4.36.0.txt +0 -116
  98. data/doc/release_notes/4.37.0.txt +0 -50
  99. data/doc/release_notes/4.38.0.txt +0 -67
  100. data/doc/release_notes/4.39.0.txt +0 -127
  101. data/doc/release_notes/4.4.0.txt +0 -92
  102. data/doc/release_notes/4.40.0.txt +0 -179
  103. data/doc/release_notes/4.41.0.txt +0 -77
  104. data/doc/release_notes/4.42.0.txt +0 -221
  105. data/doc/release_notes/4.43.0.txt +0 -87
  106. data/doc/release_notes/4.44.0.txt +0 -125
  107. data/doc/release_notes/4.45.0.txt +0 -370
  108. data/doc/release_notes/4.46.0.txt +0 -404
  109. data/doc/release_notes/4.47.0.txt +0 -56
  110. data/doc/release_notes/4.48.0.txt +0 -293
  111. data/doc/release_notes/4.49.0.txt +0 -222
  112. data/doc/release_notes/4.5.0.txt +0 -34
  113. data/doc/release_notes/4.6.0.txt +0 -30
  114. data/doc/release_notes/4.7.0.txt +0 -103
  115. data/doc/release_notes/4.8.0.txt +0 -175
  116. data/doc/release_notes/4.9.0.txt +0 -190
  117. data/spec/adapter_spec.rb +0 -4
  118. data/spec/adapters/db2_spec.rb +0 -170
  119. data/spec/adapters/mssql_spec.rb +0 -828
  120. data/spec/adapters/mysql_spec.rb +0 -1060
  121. data/spec/adapters/oracle_spec.rb +0 -371
  122. data/spec/adapters/postgres_spec.rb +0 -4476
  123. data/spec/adapters/spec_helper.rb +0 -44
  124. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  125. data/spec/adapters/sqlite_spec.rb +0 -652
  126. data/spec/bin_spec.rb +0 -278
  127. data/spec/core/connection_pool_spec.rb +0 -1250
  128. data/spec/core/database_spec.rb +0 -2915
  129. data/spec/core/dataset_spec.rb +0 -5547
  130. data/spec/core/deprecated_spec.rb +0 -70
  131. data/spec/core/expression_filters_spec.rb +0 -1498
  132. data/spec/core/mock_adapter_spec.rb +0 -722
  133. data/spec/core/object_graph_spec.rb +0 -336
  134. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  135. data/spec/core/schema_generator_spec.rb +0 -214
  136. data/spec/core/schema_spec.rb +0 -1844
  137. data/spec/core/spec_helper.rb +0 -24
  138. data/spec/core/version_spec.rb +0 -14
  139. data/spec/core_extensions_spec.rb +0 -763
  140. data/spec/core_model_spec.rb +0 -2
  141. data/spec/core_spec.rb +0 -1
  142. data/spec/deprecation_helper.rb +0 -30
  143. data/spec/extensions/accessed_columns_spec.rb +0 -51
  144. data/spec/extensions/active_model_spec.rb +0 -99
  145. data/spec/extensions/after_initialize_spec.rb +0 -28
  146. data/spec/extensions/any_not_empty_spec.rb +0 -23
  147. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  148. data/spec/extensions/association_dependencies_spec.rb +0 -125
  149. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  150. data/spec/extensions/association_pks_spec.rb +0 -423
  151. data/spec/extensions/association_proxies_spec.rb +0 -100
  152. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  153. data/spec/extensions/auto_validations_spec.rb +0 -229
  154. data/spec/extensions/blacklist_security_spec.rb +0 -95
  155. data/spec/extensions/blank_spec.rb +0 -69
  156. data/spec/extensions/boolean_readers_spec.rb +0 -93
  157. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  158. data/spec/extensions/caching_spec.rb +0 -273
  159. data/spec/extensions/caller_logging_spec.rb +0 -52
  160. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  161. data/spec/extensions/column_conflicts_spec.rb +0 -75
  162. data/spec/extensions/column_select_spec.rb +0 -129
  163. data/spec/extensions/columns_introspection_spec.rb +0 -90
  164. data/spec/extensions/columns_updated_spec.rb +0 -35
  165. data/spec/extensions/composition_spec.rb +0 -248
  166. data/spec/extensions/connection_expiration_spec.rb +0 -151
  167. data/spec/extensions/connection_validator_spec.rb +0 -144
  168. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  169. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  170. data/spec/extensions/constraint_validations_spec.rb +0 -439
  171. data/spec/extensions/core_refinements_spec.rb +0 -528
  172. data/spec/extensions/csv_serializer_spec.rb +0 -183
  173. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  174. data/spec/extensions/dataset_associations_spec.rb +0 -365
  175. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  176. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  177. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  178. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  179. data/spec/extensions/defaults_setter_spec.rb +0 -150
  180. data/spec/extensions/delay_add_association_spec.rb +0 -73
  181. data/spec/extensions/dirty_spec.rb +0 -222
  182. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  183. data/spec/extensions/eager_each_spec.rb +0 -62
  184. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  185. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  186. data/spec/extensions/error_splitter_spec.rb +0 -18
  187. data/spec/extensions/error_sql_spec.rb +0 -20
  188. data/spec/extensions/escaped_like_spec.rb +0 -40
  189. data/spec/extensions/eval_inspect_spec.rb +0 -81
  190. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  191. data/spec/extensions/finder_spec.rb +0 -260
  192. data/spec/extensions/force_encoding_spec.rb +0 -126
  193. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  194. data/spec/extensions/graph_each_spec.rb +0 -113
  195. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  196. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  197. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  198. data/spec/extensions/index_caching_spec.rb +0 -66
  199. data/spec/extensions/inflector_spec.rb +0 -183
  200. data/spec/extensions/input_transformer_spec.rb +0 -69
  201. data/spec/extensions/insert_conflict_spec.rb +0 -103
  202. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  203. data/spec/extensions/instance_filters_spec.rb +0 -79
  204. data/spec/extensions/instance_hooks_spec.rb +0 -246
  205. data/spec/extensions/integer64_spec.rb +0 -22
  206. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  207. data/spec/extensions/json_serializer_spec.rb +0 -336
  208. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  209. data/spec/extensions/list_spec.rb +0 -291
  210. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  211. data/spec/extensions/many_through_many_spec.rb +0 -2177
  212. data/spec/extensions/migration_spec.rb +0 -864
  213. data/spec/extensions/modification_detection_spec.rb +0 -93
  214. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  215. data/spec/extensions/named_timezones_spec.rb +0 -218
  216. data/spec/extensions/nested_attributes_spec.rb +0 -815
  217. data/spec/extensions/null_dataset_spec.rb +0 -85
  218. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  219. data/spec/extensions/pagination_spec.rb +0 -116
  220. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  221. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  222. data/spec/extensions/pg_array_spec.rb +0 -398
  223. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  224. data/spec/extensions/pg_enum_spec.rb +0 -118
  225. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  226. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  227. data/spec/extensions/pg_hstore_spec.rb +0 -219
  228. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  229. data/spec/extensions/pg_inet_spec.rb +0 -72
  230. data/spec/extensions/pg_interval_spec.rb +0 -103
  231. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  232. data/spec/extensions/pg_json_spec.rb +0 -451
  233. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  234. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  235. data/spec/extensions/pg_range_spec.rb +0 -600
  236. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  237. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  238. data/spec/extensions/pg_row_spec.rb +0 -363
  239. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  240. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  241. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  242. data/spec/extensions/prepared_statements_spec.rb +0 -177
  243. data/spec/extensions/pretty_table_spec.rb +0 -123
  244. data/spec/extensions/query_spec.rb +0 -94
  245. data/spec/extensions/rcte_tree_spec.rb +0 -387
  246. data/spec/extensions/round_timestamps_spec.rb +0 -39
  247. data/spec/extensions/s_spec.rb +0 -60
  248. data/spec/extensions/schema_caching_spec.rb +0 -64
  249. data/spec/extensions/schema_dumper_spec.rb +0 -870
  250. data/spec/extensions/select_remove_spec.rb +0 -38
  251. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  252. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  253. data/spec/extensions/serialization_spec.rb +0 -365
  254. data/spec/extensions/server_block_spec.rb +0 -135
  255. data/spec/extensions/server_logging_spec.rb +0 -45
  256. data/spec/extensions/sharding_spec.rb +0 -197
  257. data/spec/extensions/shared_caching_spec.rb +0 -151
  258. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  259. data/spec/extensions/singular_table_names_spec.rb +0 -22
  260. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  261. data/spec/extensions/spec_helper.rb +0 -70
  262. data/spec/extensions/split_array_nil_spec.rb +0 -24
  263. data/spec/extensions/split_values_spec.rb +0 -57
  264. data/spec/extensions/sql_comments_spec.rb +0 -33
  265. data/spec/extensions/sql_expr_spec.rb +0 -59
  266. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  267. data/spec/extensions/static_cache_spec.rb +0 -471
  268. data/spec/extensions/string_agg_spec.rb +0 -90
  269. data/spec/extensions/string_date_time_spec.rb +0 -95
  270. data/spec/extensions/string_stripper_spec.rb +0 -68
  271. data/spec/extensions/subclasses_spec.rb +0 -79
  272. data/spec/extensions/subset_conditions_spec.rb +0 -38
  273. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  274. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  275. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  276. data/spec/extensions/table_select_spec.rb +0 -83
  277. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  278. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  279. data/spec/extensions/throw_failures_spec.rb +0 -74
  280. data/spec/extensions/timestamps_spec.rb +0 -209
  281. data/spec/extensions/to_dot_spec.rb +0 -153
  282. data/spec/extensions/touch_spec.rb +0 -226
  283. data/spec/extensions/tree_spec.rb +0 -334
  284. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  285. data/spec/extensions/unlimited_update_spec.rb +0 -21
  286. data/spec/extensions/update_or_create_spec.rb +0 -83
  287. data/spec/extensions/update_primary_key_spec.rb +0 -105
  288. data/spec/extensions/update_refresh_spec.rb +0 -59
  289. data/spec/extensions/uuid_spec.rb +0 -101
  290. data/spec/extensions/validate_associated_spec.rb +0 -52
  291. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  292. data/spec/extensions/validation_contexts_spec.rb +0 -31
  293. data/spec/extensions/validation_helpers_spec.rb +0 -525
  294. data/spec/extensions/whitelist_security_spec.rb +0 -157
  295. data/spec/extensions/xml_serializer_spec.rb +0 -213
  296. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  297. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  298. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  299. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  300. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  301. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  302. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  303. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  304. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  305. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  306. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  307. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  308. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  309. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  310. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  311. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  312. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  313. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  314. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  315. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  316. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  317. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  318. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  319. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  320. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  321. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  322. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  323. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  324. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  325. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  326. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  327. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  328. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  329. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  330. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  331. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  332. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  333. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  334. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  335. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  336. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  337. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  338. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  339. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  340. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  341. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  342. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  343. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  344. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  345. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  346. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  347. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  348. data/spec/guards_helper.rb +0 -59
  349. data/spec/integration/associations_test.rb +0 -2597
  350. data/spec/integration/database_test.rb +0 -113
  351. data/spec/integration/dataset_test.rb +0 -2037
  352. data/spec/integration/eager_loader_test.rb +0 -687
  353. data/spec/integration/migrator_test.rb +0 -262
  354. data/spec/integration/model_test.rb +0 -203
  355. data/spec/integration/plugin_test.rb +0 -2423
  356. data/spec/integration/prepared_statement_test.rb +0 -405
  357. data/spec/integration/schema_test.rb +0 -903
  358. data/spec/integration/spec_helper.rb +0 -71
  359. data/spec/integration/timezone_test.rb +0 -86
  360. data/spec/integration/transaction_test.rb +0 -603
  361. data/spec/integration/type_test.rb +0 -127
  362. data/spec/model/association_reflection_spec.rb +0 -803
  363. data/spec/model/associations_spec.rb +0 -4738
  364. data/spec/model/base_spec.rb +0 -875
  365. data/spec/model/class_dataset_methods_spec.rb +0 -146
  366. data/spec/model/dataset_methods_spec.rb +0 -198
  367. data/spec/model/eager_loading_spec.rb +0 -2377
  368. data/spec/model/hooks_spec.rb +0 -370
  369. data/spec/model/inflector_spec.rb +0 -26
  370. data/spec/model/model_spec.rb +0 -956
  371. data/spec/model/plugins_spec.rb +0 -429
  372. data/spec/model/record_spec.rb +0 -2118
  373. data/spec/model/spec_helper.rb +0 -46
  374. data/spec/model/validations_spec.rb +0 -220
  375. data/spec/model_no_assoc_spec.rb +0 -1
  376. data/spec/model_spec.rb +0 -1
  377. data/spec/plugin_spec.rb +0 -1
  378. data/spec/sequel_coverage.rb +0 -15
  379. data/spec/sequel_warning.rb +0 -4
  380. data/spec/spec_config.rb +0 -12
@@ -1,102 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- Sequel.extension :pg_inet_ops
4
-
5
- describe "Sequel::Postgres::InetOp" do
6
- before do
7
- db = Sequel.connect('mock://postgres')
8
- db.extend_datasets{def quote_identifiers?; false end}
9
- db.extension :pg_inet
10
- @ds = db.dataset
11
- @h = Sequel.pg_inet_op(:h)
12
- end
13
-
14
- it "#pg_inet should return self" do
15
- @h.pg_inet.must_be_same_as(@h)
16
- end
17
-
18
- it "Sequel.pg_inet_op should return argument if already an InetOp" do
19
- Sequel.pg_inet_op(@h).must_be_same_as(@h)
20
- end
21
-
22
- it "#pg_inet should return a InetOp for literal strings, and expressions" do
23
- @ds.literal(Sequel.function(:b, :h).pg_inet.abbrev).must_equal "abbrev(b(h))"
24
- @ds.literal(Sequel.lit('h').pg_inet.abbrev).must_equal "abbrev(h)"
25
- end
26
-
27
- it "should define methods for all of the PostgreSQL inet operators" do
28
- @ds.literal(@h + @h).must_equal "(h + h)"
29
- @ds.literal(@h - @h).must_equal "(h - h)"
30
- @ds.literal(@h << @h).must_equal "(h << h)"
31
- @ds.literal(@h >> @h).must_equal "(h >> h)"
32
- @ds.literal(@h & @h).must_equal "(h & h)"
33
- @ds.literal(@h | @h).must_equal "(h | h)"
34
- @ds.literal(~@h).must_equal "~h"
35
-
36
- @ds.literal(@h.contained_by(@h)).must_equal "(h << h)"
37
- @ds.literal(@h.contained_by_or_equals(@h)).must_equal "(h <<= h)"
38
- @ds.literal(@h.contains(@h)).must_equal "(h >> h)"
39
- @ds.literal(@h.contains_or_equals(@h)).must_equal "(h >>= h)"
40
- @ds.literal(@h.contains_or_contained_by(@h)).must_equal "(h && h)"
41
- end
42
-
43
- it "should define methods for all of the PostgreSQL inet functions" do
44
- @ds.literal(@h.abbrev).must_equal "abbrev(h)"
45
- @ds.literal(@h.broadcast).must_equal "broadcast(h)"
46
- @ds.literal(@h.family).must_equal "family(h)"
47
- @ds.literal(@h.host).must_equal "host(h)"
48
- @ds.literal(@h.hostmask).must_equal "hostmask(h)"
49
- @ds.literal(@h.masklen).must_equal "masklen(h)"
50
- @ds.literal(@h.netmask).must_equal "netmask(h)"
51
- @ds.literal(@h.network).must_equal "network(h)"
52
- @ds.literal(@h.set_masklen(16)).must_equal "set_masklen(h, 16)"
53
- @ds.literal(@h.text).must_equal "text(h)"
54
- end
55
-
56
- it "should have operators that return booleans return boolean expressions" do
57
- @ds.literal((@h << @h) & :b).must_equal "((h << h) AND b)"
58
- @ds.literal((@h >> @h) & :b).must_equal "((h >> h) AND b)"
59
-
60
- @ds.literal(@h.contained_by(@h) & :b).must_equal "((h << h) AND b)"
61
- @ds.literal(@h.contained_by_or_equals(@h) & :b).must_equal "((h <<= h) AND b)"
62
- @ds.literal(@h.contains(@h) & :b).must_equal "((h >> h) AND b)"
63
- @ds.literal(@h.contains_or_equals(@h) & :b).must_equal "((h >>= h) AND b)"
64
- @ds.literal(@h.contains_or_contained_by(@h) & :b).must_equal "((h && h) AND b)"
65
- end
66
-
67
- it "should have operators that return inet return InetOp" do
68
- @ds.literal((@h & @h).contains(:b)).must_equal "((h & h) >> b)"
69
- @ds.literal((@h | @h).contains(:b)).must_equal "((h | h) >> b)"
70
- @ds.literal((@h + @h).contains(:b)).must_equal "((h + h) >> b)"
71
- @ds.literal((@h - 3).contains(:b)).must_equal "((h - 3) >> b)"
72
- @ds.literal((~@h).contains(:b)).must_equal "(~h >> b)"
73
- end
74
-
75
- it "should have - operator with inet op return numeric expression" do
76
- @ds.literal((@h - @h) / :b).must_equal "((h - h) / b)"
77
- end
78
-
79
- it "should have function methods returning int return numeric expressions" do
80
- @ds.literal(@h.family / 2).must_equal "(family(h) / 2)"
81
- @ds.literal(@h.masklen / 2).must_equal "(masklen(h) / 2)"
82
- end
83
-
84
- it "should have function methods returning text return string expressions" do
85
- @ds.literal(@h.abbrev + :a).must_equal "(abbrev(h) || a)"
86
- @ds.literal(@h.host + :a).must_equal "(host(h) || a)"
87
- @ds.literal(@h.text + :a).must_equal "(text(h) || a)"
88
- end
89
-
90
- it "should have function methods returning inet return InetOp" do
91
- @ds.literal(@h.broadcast.contains(:a)).must_equal "(broadcast(h) >> a)"
92
- @ds.literal(@h.hostmask.contains(:a)).must_equal "(hostmask(h) >> a)"
93
- @ds.literal(@h.netmask.contains(:a)).must_equal "(netmask(h) >> a)"
94
- @ds.literal(@h.network.contains(:a)).must_equal "(network(h) >> a)"
95
- @ds.literal(@h.set_masklen(16).contains(:a)).must_equal "(set_masklen(h, 16) >> a)"
96
- end
97
-
98
- it "should string and IPAddr instances in a cast to inet" do
99
- @ds.literal(Sequel.pg_inet_op('1.2.3.4').contains(:a)).must_equal "(CAST('1.2.3.4' AS inet) >> a)"
100
- @ds.literal(Sequel.pg_inet_op(IPAddr.new('1.2.3.4')).contains(:a)).must_equal "(CAST('1.2.3.4/32' AS inet) >> a)"
101
- end
102
- end
@@ -1,72 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "pg_inet extension" do
4
- ipv6_broken = (IPAddr.new('::1'); false) rescue true
5
- before do
6
- @db = Sequel.connect('mock://postgres')
7
- @db.extend_datasets{def quote_identifiers?; false end}
8
- @db.extension(:pg_array, :pg_inet)
9
- end
10
-
11
- it "should literalize IPAddr v4 instances to strings correctly" do
12
- @db.literal(IPAddr.new('127.0.0.1')).must_equal "'127.0.0.1/32'"
13
- @db.literal(IPAddr.new('127.0.0.0/8')).must_equal "'127.0.0.0/8'"
14
- end
15
-
16
- it "should literalize IPAddr v6 instances to strings correctly" do
17
- @db.literal(IPAddr.new('2001:4f8:3:ba::/64')).must_equal "'2001:4f8:3:ba::/64'"
18
- @db.literal(IPAddr.new('2001:4f8:3:ba:2e0:81ff:fe22:d1f1')).must_equal "'2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128'"
19
- end unless ipv6_broken
20
-
21
- it "should set up conversion procs correctly" do
22
- cp = @db.conversion_procs
23
- cp[869].call("127.0.0.1").must_equal IPAddr.new('127.0.0.1')
24
- cp[650].call("127.0.0.1").must_equal IPAddr.new('127.0.0.1')
25
- end
26
-
27
- it "should set up conversion procs for arrays correctly" do
28
- cp = @db.conversion_procs
29
- cp[1041].call("{127.0.0.1}").must_equal [IPAddr.new('127.0.0.1')]
30
- cp[651].call("{127.0.0.1}").must_equal [IPAddr.new('127.0.0.1')]
31
- cp[1040].call("{127.0.0.1}").must_equal ['127.0.0.1']
32
- end
33
-
34
- it "should not affect literalization of custom objects" do
35
- o = Object.new
36
- def o.sql_literal(ds) 'v' end
37
- @db.literal(o).must_equal 'v'
38
- end
39
-
40
- it "should support using IPAddr as bound variables" do
41
- @db.bound_variable_arg(1, nil).must_equal 1
42
- @db.bound_variable_arg(IPAddr.new('127.0.0.1'), nil).must_equal '127.0.0.1/32'
43
- end
44
-
45
- it "should support using IPAddr instances in array types in bound variables" do
46
- @db.bound_variable_arg(Sequel.pg_array([IPAddr.new('127.0.0.1')]), nil).must_equal '{"127.0.0.1/32"}'
47
- end
48
-
49
- it "should parse inet/cidr type from the schema correctly" do
50
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i', :db_type=>'inet'}, {:name=>'c', :db_type=>'cidr'}]
51
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :ipaddr, :ipaddr]
52
- end
53
-
54
- it "should set :ruby_default schema entries if default value is recognized" do
55
- @db.fetch = [{:name=>'id', :db_type=>'integer', :default=>'1'}, {:name=>'t', :db_type=>'inet', :default=>"'127.0.0.1'::inet"}]
56
- s = @db.schema(:items)
57
- s[1][1][:ruby_default].must_equal IPAddr.new('127.0.0.1')
58
- end
59
-
60
- it "should support typecasting for the ipaddr type" do
61
- ip = IPAddr.new('127.0.0.1')
62
- @db.typecast_value(:ipaddr, ip).must_be_same_as(ip)
63
- @db.typecast_value(:ipaddr, ip.to_s).must_equal ip
64
- proc{@db.typecast_value(:ipaddr, '')}.must_raise(Sequel::InvalidValue)
65
- proc{@db.typecast_value(:ipaddr, 1)}.must_raise(Sequel::InvalidValue)
66
- end
67
-
68
- it "should return correct results for Database#schema_type_class" do
69
- @db.schema_type_class(:ipaddr).must_equal IPAddr
70
- @db.schema_type_class(:integer).must_equal Integer
71
- end
72
- end
@@ -1,103 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- begin
4
- require 'active_support/duration'
5
- begin
6
- require 'active_support/gem_version'
7
- rescue LoadError
8
- end
9
- rescue LoadError
10
- warn "Skipping test of pg_interval plugin: can't load active_support/duration"
11
- else
12
- describe "pg_interval extension" do
13
- before do
14
- @db = Sequel.connect('mock://postgres')
15
- @db.extend_datasets{def quote_identifiers?; false end}
16
- @db.extension(:pg_array, :pg_interval)
17
- end
18
-
19
- it "should literalize ActiveSupport::Duration instances to strings correctly" do
20
- @db.literal(ActiveSupport::Duration.new(0, [])).must_equal "'0'::interval"
21
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 0]])).must_equal "'0'::interval"
22
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 10], [:minutes, 20], [:days, 3], [:months, 4], [:years, 6]])).must_equal "'6 years 4 months 3 days 20 minutes 10 seconds '::interval"
23
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 10], [:minutes, 20], [:hours, 8], [:days, 3], [:weeks, 2], [:months, 4], [:years, 6]])).must_equal "'6 years 4 months 2 weeks 3 days 8 hours 20 minutes 10 seconds '::interval"
24
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, -10.000001], [:minutes, -20], [:days, -3], [:months, -4], [:years, -6]])).must_equal "'-6 years -4 months -3 days -20 minutes -10.000001 seconds '::interval"
25
- end
26
-
27
- it "should literalize ActiveSupport::Duration instances with repeated parts correctly" do
28
- if defined?(ActiveSupport::VERSION::STRING) && ActiveSupport::VERSION::STRING >= '5.1'
29
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 2], [:seconds, 1]])).must_equal "'1 seconds '::interval"
30
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 2], [:seconds, 1], [:days, 1], [:days, 4]])).must_equal "'4 days 1 seconds '::interval"
31
- else
32
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 2], [:seconds, 1]])).must_equal "'3 seconds '::interval"
33
- @db.literal(ActiveSupport::Duration.new(0, [[:seconds, 2], [:seconds, 1], [:days, 1], [:days, 4]])).must_equal "'5 days 3 seconds '::interval"
34
- end
35
- end
36
-
37
- it "should set up conversion procs correctly" do
38
- cp = @db.conversion_procs
39
- cp[1186].call("1 sec").must_equal ActiveSupport::Duration.new(1, [[:seconds, 1]])
40
- end
41
-
42
- it "should set up conversion procs for arrays correctly" do
43
- cp = @db.conversion_procs
44
- cp[1187].call("{1 sec}").must_equal [ActiveSupport::Duration.new(1, [[:seconds, 1]])]
45
- end
46
-
47
- it "should not affect literalization of custom objects" do
48
- o = Object.new
49
- def o.sql_literal(ds) 'v' end
50
- @db.literal(o).must_equal 'v'
51
- end
52
-
53
- it "should support using ActiveSupport::Duration instances as bound variables" do
54
- @db.bound_variable_arg(1, nil).must_equal 1
55
- @db.bound_variable_arg(ActiveSupport::Duration.new(0, [[:seconds, 0]]), nil).must_equal '0'
56
- @db.bound_variable_arg(ActiveSupport::Duration.new(0, [[:seconds, -10.000001], [:minutes, -20], [:days, -3], [:months, -4], [:years, -6]]), nil).must_equal '-6 years -4 months -3 days -20 minutes -10.000001 seconds '
57
- end
58
-
59
- it "should support using ActiveSupport::Duration instances in array types in bound variables" do
60
- @db.bound_variable_arg(Sequel.pg_array([ActiveSupport::Duration.new(0, [[:seconds, 0]])]), nil).must_equal '{"0"}'
61
- @db.bound_variable_arg(Sequel.pg_array([ActiveSupport::Duration.new(0, [[:seconds, -10.000001], [:minutes, -20], [:days, -3], [:months, -4], [:years, -6]])]), nil).must_equal '{"-6 years -4 months -3 days -20 minutes -10.000001 seconds "}'
62
- end
63
-
64
- it "should parse interval type from the schema correctly" do
65
- @db.fetch = [{:name=>'id', :db_type=>'integer'}, {:name=>'i', :db_type=>'interval'}]
66
- @db.schema(:items).map{|e| e[1][:type]}.must_equal [:integer, :interval]
67
- end
68
-
69
- it "should set :ruby_default schema entries if default value is recognized" do
70
- @db.fetch = [{:name=>'id', :db_type=>'integer', :default=>'1'}, {:name=>'t', :db_type=>'interval', :default=>"'3 days'::interval"}]
71
- s = @db.schema(:items)
72
- s[1][1][:ruby_default].must_equal ActiveSupport::Duration.new(3*86400, :days=>3)
73
- end
74
-
75
- it "should support typecasting for the interval type" do
76
- d = ActiveSupport::Duration.new(31557600 + 2*86400*30 + 3*86400*7 + 4*86400 + 5*3600 + 6*60 + 7, [[:years, 1], [:months, 2], [:days, 25], [:seconds, 18367]])
77
- @db.typecast_value(:interval, d).object_id.must_equal d.object_id
78
-
79
- @db.typecast_value(:interval, "1 year 2 mons 25 days 05:06:07").is_a?(ActiveSupport::Duration).must_equal true
80
- @db.typecast_value(:interval, "1 year 2 mons 25 days 05:06:07").must_equal d
81
- @db.typecast_value(:interval, "1 year 2 mons 25 days 05:06:07").parts.sort_by{|k,v| k.to_s}.must_equal d.parts.sort_by{|k,v| k.to_s}
82
- @db.typecast_value(:interval, "1 year 2 mons 25 days 05:06:07.0").parts.sort_by{|k,v| k.to_s}.must_equal d.parts.sort_by{|k,v| k.to_s}
83
-
84
- @db.typecast_value(:interval, "1 year 2 mons 25 days 5 hours 6 mins 7 secs").is_a?(ActiveSupport::Duration).must_equal true
85
- @db.typecast_value(:interval, "1 year 2 mons 25 days 5 hours 6 mins 7 secs").must_equal d
86
- @db.typecast_value(:interval, "1 year 2 mons 25 days 5 hours 6 mins 7 secs").parts.sort_by{|k,v| k.to_s}.must_equal d.parts.sort_by{|k,v| k.to_s}
87
- @db.typecast_value(:interval, "1 year 2 mons 25 days 5 hours 6 mins 7.0 secs").parts.sort_by{|k,v| k.to_s}.must_equal d.parts.sort_by{|k,v| k.to_s}
88
-
89
- d2 = ActiveSupport::Duration.new(1, [[:seconds, 1]])
90
- @db.typecast_value(:interval, 1).is_a?(ActiveSupport::Duration).must_equal true
91
- @db.typecast_value(:interval, 1).must_equal d2
92
- @db.typecast_value(:interval, 1).parts.sort_by{|k,v| k.to_s}.must_equal d2.parts.sort_by{|k,v| k.to_s}
93
-
94
- proc{@db.typecast_value(:interval, 'foo')}.must_raise(Sequel::InvalidValue)
95
- proc{@db.typecast_value(:interval, Object.new)}.must_raise(Sequel::InvalidValue)
96
- end
97
-
98
- it "should return correct results for Database#schema_type_class" do
99
- @db.schema_type_class(:interval).must_equal ActiveSupport::Duration
100
- @db.schema_type_class(:integer).must_equal Integer
101
- end
102
- end
103
- end
@@ -1,356 +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
-
290
- it "#path_exists should use the @? operator" do
291
- @l[@jb.path_exists('$')].must_equal "(j @? '$')"
292
- end
293
-
294
- it "#path_exists result should be a boolean expression" do
295
- @jb.path_exists('$').must_be_kind_of Sequel::SQL::BooleanExpression
296
- end
297
-
298
- it "#path_match should use the @@ operator" do
299
- @l[@jb.path_match('$')].must_equal "(j @@ '$')"
300
- end
301
-
302
- it "#path_match result should be a boolean expression" do
303
- @jb.path_match('$').must_be_kind_of Sequel::SQL::BooleanExpression
304
- end
305
-
306
- it "#path_exists! should use the jsonb_path_exists function" do
307
- @l[@jb.path_exists!('$')].must_equal "jsonb_path_exists(j, '$')"
308
- @l[@jb.path_exists!('$', '{"x":2}')].must_equal "jsonb_path_exists(j, '$', '{\"x\":2}')"
309
- @l[@jb.path_exists!('$', x: 2)].must_equal "jsonb_path_exists(j, '$', '{\"x\":2}')"
310
- @l[@jb.path_exists!('$', {x: 2}, true)].must_equal "jsonb_path_exists(j, '$', '{\"x\":2}', true)"
311
- end
312
-
313
- it "#path_exists! result should be a boolean expression" do
314
- @jb.path_exists!('$').must_be_kind_of Sequel::SQL::BooleanExpression
315
- end
316
-
317
- it "#path_match! should use the jsonb_path_match function" do
318
- @l[@jb.path_match!('$')].must_equal "jsonb_path_match(j, '$')"
319
- @l[@jb.path_match!('$', '{"x":2}')].must_equal "jsonb_path_match(j, '$', '{\"x\":2}')"
320
- @l[@jb.path_match!('$', x: 2)].must_equal "jsonb_path_match(j, '$', '{\"x\":2}')"
321
- @l[@jb.path_match!('$', {x: 2}, true)].must_equal "jsonb_path_match(j, '$', '{\"x\":2}', true)"
322
- end
323
-
324
- it "#path_match! result should be a boolean expression" do
325
- @jb.path_match!('$').must_be_kind_of Sequel::SQL::BooleanExpression
326
- end
327
-
328
- it "#path_query should use the jsonb_path_query function" do
329
- @l[@jb.path_query('$')].must_equal "jsonb_path_query(j, '$')"
330
- @l[@jb.path_query('$', '{"x":2}')].must_equal "jsonb_path_query(j, '$', '{\"x\":2}')"
331
- @l[@jb.path_query('$', x: 2)].must_equal "jsonb_path_query(j, '$', '{\"x\":2}')"
332
- @l[@jb.path_query('$', {x: 2}, true)].must_equal "jsonb_path_query(j, '$', '{\"x\":2}', true)"
333
- end
334
-
335
- it "#path_query_array should use the jsonb_path_query_array function" do
336
- @l[@jb.path_query_array('$')].must_equal "jsonb_path_query_array(j, '$')"
337
- @l[@jb.path_query_array('$', '{"x":2}')].must_equal "jsonb_path_query_array(j, '$', '{\"x\":2}')"
338
- @l[@jb.path_query_array('$', x: 2)].must_equal "jsonb_path_query_array(j, '$', '{\"x\":2}')"
339
- @l[@jb.path_query_array('$', {x: 2}, true)].must_equal "jsonb_path_query_array(j, '$', '{\"x\":2}', true)"
340
- end
341
-
342
- it "#path_query_array result should be a JSONBOp" do
343
- @l[@jb.path_query_array('$').path_query_array('$')].must_equal "jsonb_path_query_array(jsonb_path_query_array(j, '$'), '$')"
344
- end
345
-
346
- it "#path_query_first should use the jsonb_path_query_first function" do
347
- @l[@jb.path_query_first('$')].must_equal "jsonb_path_query_first(j, '$')"
348
- @l[@jb.path_query_first('$', '{"x":2}')].must_equal "jsonb_path_query_first(j, '$', '{\"x\":2}')"
349
- @l[@jb.path_query_first('$', x: 2)].must_equal "jsonb_path_query_first(j, '$', '{\"x\":2}')"
350
- @l[@jb.path_query_first('$', {x: 2}, true)].must_equal "jsonb_path_query_first(j, '$', '{\"x\":2}', true)"
351
- end
352
-
353
- it "#path_query_first result should be a JSONBOp" do
354
- @l[@jb.path_query_first('$').path_query_first('$')].must_equal "jsonb_path_query_first(jsonb_path_query_first(j, '$'), '$')"
355
- end
356
- end