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,151 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- connection_expiration_specs = shared_description do
4
- describe "connection expiration" do
5
- before do
6
- @m = Module.new do
7
- def disconnect_connection(conn)
8
- @sqls << 'disconnect'
9
- end
10
- end
11
- @db.extend @m
12
- @db.extension(:connection_expiration)
13
- @db.pool.connection_expiration_timeout = 2
14
- end
15
-
16
- it "should still allow new connections" do
17
- @db.synchronize{|c| c}.must_be_kind_of(Sequel::Mock::Connection)
18
- end
19
-
20
- it "should not override connection_expiration_timeout when loading extension" do
21
- @db.extension(:connection_expiration)
22
- @db.pool.connection_expiration_timeout.must_equal 2
23
- end
24
-
25
- it "should handle Database#disconnect calls while the connection is checked out" do
26
- @db.synchronize{|c| @db.disconnect}
27
- end
28
-
29
- it "should handle disconnected connections" do
30
- proc{@db.synchronize{|c| raise Sequel::DatabaseDisconnectError}}.must_raise Sequel::DatabaseDisconnectError
31
- @db.sqls.must_equal ['disconnect']
32
- end
33
-
34
- it "should handle :connection_handling => :disconnect setting" do
35
- @db = Sequel.mock(@db.opts.merge(:connection_handling => :disconnect))
36
- @db.extend @m
37
- @db.extension(:connection_expiration)
38
- @db.synchronize{}
39
- @db.sqls.must_equal ['disconnect']
40
- end
41
-
42
- it "should only expire if older than timeout" do
43
- c1 = @db.synchronize{|c| c}
44
- @db.sqls.must_equal []
45
- @db.synchronize{|c| c}.must_be_same_as(c1)
46
- @db.sqls.must_equal []
47
- end
48
-
49
- it "should disconnect connection if expired" do
50
- c1 = @db.synchronize{|c| c}
51
- @db.sqls.must_equal []
52
- simulate_sleep(c1)
53
- c2 = @db.synchronize{|c| c}
54
- @db.sqls.must_equal ['disconnect']
55
- c2.wont_be_same_as(c1)
56
- end
57
-
58
- it "should disconnect only expired connections among multiple" do
59
- c1, c2 = multiple_connections
60
-
61
- # Expire c1 only.
62
- simulate_sleep(c1)
63
- simulate_sleep(c2, 1)
64
- c1, c2 = multiple_connections
65
-
66
- c3 = @db.synchronize{|c| c}
67
- @db.sqls.must_equal ['disconnect']
68
- c3.wont_be_same_as(c1)
69
- c3.must_be_same_as(c2)
70
- end
71
-
72
- it "should disconnect connections repeatedly if they are expired" do
73
- c1, c2 = multiple_connections
74
-
75
- simulate_sleep(c1)
76
- simulate_sleep(c2)
77
-
78
- c3 = @db.synchronize{|c| c}
79
- @db.sqls.must_equal ['disconnect', 'disconnect']
80
- c3.wont_be_same_as(c1)
81
- c3.wont_be_same_as(c2)
82
- end
83
-
84
- it "should not leak connection references to expiring connections" do
85
- c1 = @db.synchronize{|c| c}
86
- simulate_sleep(c1)
87
- c2 = @db.synchronize{|c| c}
88
- c2.wont_be_same_as(c1)
89
- @db.pool.instance_variable_get(:@connection_expiration_timestamps).must_include(c2)
90
- @db.pool.instance_variable_get(:@connection_expiration_timestamps).wont_include(c1)
91
- end
92
-
93
- it "should not leak connection references during disconnect" do
94
- multiple_connections
95
- @db.pool.instance_variable_get(:@connection_expiration_timestamps).size.must_equal 2
96
- @db.disconnect
97
- @db.pool.instance_variable_get(:@connection_expiration_timestamps).size.must_equal 0
98
- end
99
-
100
- it "should not vary expiration timestamps by default" do
101
- c1 = @db.synchronize{|c| c}
102
- @db.pool.instance_variable_get(:@connection_expiration_timestamps)[c1].last.must_equal 2
103
- end
104
-
105
- it "should support #connection_expiration_random_delay to vary expiration timestamps" do
106
- @db.pool.connection_expiration_random_delay = 1
107
- c1 = @db.synchronize{|c| c}
108
- @db.pool.instance_variable_get(:@connection_expiration_timestamps)[c1].last.wont_equal 2
109
- end
110
-
111
- def multiple_connections
112
- q, q1 = Queue.new, Queue.new
113
- c1 = nil
114
- c2 = nil
115
- @db.synchronize do |c|
116
- Thread.new do
117
- @db.synchronize do |cc|
118
- c2 = cc
119
- end
120
- q1.pop
121
- q.push nil
122
- end
123
- q1.push nil
124
- q.pop
125
- c1 = c
126
- end
127
- [c1, c2]
128
- end
129
-
130
- # Set the timestamp back in time to simulate sleep / passage of time.
131
- def simulate_sleep(conn, sleep_time = 3)
132
- timestamps = @db.pool.instance_variable_get(:@connection_expiration_timestamps)
133
- timer, max = timestamps[conn]
134
- timestamps[conn] = [timer - sleep_time, max]
135
- @db.pool.instance_variable_set(:@connection_expiration_timestamps, timestamps)
136
- end
137
- end
138
- end
139
-
140
- describe "Sequel::ConnectionExpiration with threaded pool" do
141
- before do
142
- @db = Sequel.mock(:test=>false)
143
- end
144
- include connection_expiration_specs
145
- end
146
- describe "Sequel::ConnectionExpiration with sharded threaded pool" do
147
- before do
148
- @db = Sequel.mock(:test=>false, :servers=>{})
149
- end
150
- include connection_expiration_specs
151
- end
@@ -1,144 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- connection_validator_specs = shared_description do
4
- describe "connection validator" do
5
- before do
6
- @m = Module.new do
7
- def disconnect_connection(conn)
8
- @sqls << 'disconnect'
9
- end
10
- def valid_connection?(conn)
11
- super
12
- conn.valid
13
- end
14
- def connect(server)
15
- conn = super
16
- conn.extend(Module.new do
17
- attr_accessor :valid
18
- end)
19
- conn.valid = true
20
- conn
21
- end
22
- end
23
- @db.extend @m
24
- @db.extension(:connection_validator)
25
- end
26
-
27
- it "should still allow new connections" do
28
- @db.synchronize{|c| c}.must_be_kind_of(Sequel::Mock::Connection)
29
- end
30
-
31
- it "should only validate if connection idle longer than timeout" do
32
- c1 = @db.synchronize{|c| c}
33
- @db.sqls.must_equal []
34
- @db.synchronize{|c| c}.must_be_same_as(c1)
35
- @db.sqls.must_equal []
36
- @db.pool.connection_validation_timeout = -1
37
- @db.synchronize{|c| c}.must_be_same_as(c1)
38
- @db.sqls.must_equal ['SELECT NULL']
39
- @db.pool.connection_validation_timeout = 1
40
- @db.synchronize{|c| c}.must_be_same_as(c1)
41
- @db.sqls.must_equal []
42
- @db.synchronize{|c| c}.must_be_same_as(c1)
43
- @db.sqls.must_equal []
44
- end
45
-
46
- it "should disconnect connection if not valid" do
47
- c1 = @db.synchronize{|c| c}
48
- @db.sqls.must_equal []
49
- c1.valid = false
50
- @db.pool.connection_validation_timeout = -1
51
- c2 = @db.synchronize{|c| c}
52
- @db.sqls.must_equal ['SELECT NULL', 'disconnect']
53
- c2.wont_be_same_as(c1)
54
- end
55
-
56
- it "should handle Database#disconnect calls while the connection is checked out" do
57
- @db.synchronize{|c| @db.disconnect}
58
- end
59
-
60
- it "should handle disconnected connections" do
61
- proc{@db.synchronize{|c| raise Sequel::DatabaseDisconnectError}}.must_raise Sequel::DatabaseDisconnectError
62
- @db.sqls.must_equal ['disconnect']
63
- end
64
-
65
- it "should handle :connection_handling => :disconnect setting" do
66
- @db = Sequel.mock(@db.opts.merge(:connection_handling => :disconnect))
67
- @db.extend @m
68
- @db.extension(:connection_validator)
69
- @db.synchronize{}
70
- @db.sqls.must_equal ['disconnect']
71
- end
72
-
73
- it "should disconnect multiple connections repeatedly if they are not valid" do
74
- q, q1 = Queue.new, Queue.new
75
- c1 = nil
76
- c2 = nil
77
- @db.pool.connection_validation_timeout = -1
78
- @db.synchronize do |c|
79
- Thread.new do
80
- @db.synchronize do |cc|
81
- c2 = cc
82
- end
83
- q1.pop
84
- q.push nil
85
- end
86
- q1.push nil
87
- q.pop
88
- c1 = c
89
- end
90
- c1.valid = false
91
- c2.valid = false
92
-
93
- c3 = @db.synchronize{|c| c}
94
- @db.sqls.must_equal ['SELECT NULL', 'disconnect', 'SELECT NULL', 'disconnect']
95
- c3.wont_be_same_as(c1)
96
- c3.wont_be_same_as(c2)
97
- end
98
-
99
- it "should not leak connection references during disconnect" do
100
- @db.synchronize{}
101
- @db.pool.instance_variable_get(:@connection_timestamps).size.must_equal 1
102
- @db.disconnect
103
- @db.pool.instance_variable_get(:@connection_timestamps).size.must_equal 0
104
- end
105
-
106
- it "should not leak connection references" do
107
- c1 = @db.synchronize do |c|
108
- @db.pool.instance_variable_get(:@connection_timestamps).must_equal({})
109
- c
110
- end
111
- @db.pool.instance_variable_get(:@connection_timestamps).must_include(c1)
112
-
113
- c1.valid = false
114
- @db.pool.connection_validation_timeout = -1
115
- c2 = @db.synchronize do |c|
116
- @db.pool.instance_variable_get(:@connection_timestamps).must_equal({})
117
- c
118
- end
119
- c2.wont_be_same_as(c1)
120
- @db.pool.instance_variable_get(:@connection_timestamps).wont_include(c1)
121
- @db.pool.instance_variable_get(:@connection_timestamps).must_include(c2)
122
- end
123
-
124
- it "should handle case where determining validity requires a connection" do
125
- def @db.valid_connection?(c) synchronize{}; true end
126
- @db.pool.connection_validation_timeout = -1
127
- c1 = @db.synchronize{|c| c}
128
- @db.synchronize{|c| c}.must_be_same_as(c1)
129
- end
130
- end
131
- end
132
-
133
- describe "Sequel::ConnectionValidator with threaded pool" do
134
- before do
135
- @db = Sequel.mock(:test=>false)
136
- end
137
- include connection_validator_specs
138
- end
139
- describe "Sequel::ConnectionValidator with sharded threaded pool" do
140
- before do
141
- @db = Sequel.mock(:test=>false, :servers=>{})
142
- end
143
- include connection_validator_specs
144
- end
@@ -1,24 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "constant_sql_override extension" do
4
- before do
5
- @db = Sequel.mock.extension(:constant_sql_override)
6
- end
7
-
8
- it 'overrides configured constants' do
9
- @db.set_constant_sql(Sequel::CURRENT_TIMESTAMP, "CURRENT TIMESTAMP AT TIME ZONE 'UTC'")
10
- @db[:tbl].where(foo: Sequel::CURRENT_TIMESTAMP).first
11
- @db.sqls.must_equal ["SELECT * FROM tbl WHERE (foo = CURRENT TIMESTAMP AT TIME ZONE 'UTC') LIMIT 1"]
12
- end
13
-
14
- it 'does not change behavior for unconfigured constants' do
15
- @db[:tbl].where(foo: Sequel::CURRENT_TIMESTAMP).first
16
- @db.sqls.must_equal ["SELECT * FROM tbl WHERE (foo = CURRENT_TIMESTAMP) LIMIT 1"]
17
- end
18
-
19
- it 'freezes the constant_sqls hash when frozen' do
20
- @db.freeze
21
- @db.constant_sqls.frozen?.must_equal true
22
- proc{@db.set_constant_sql(Sequel::CURRENT_TIMESTAMP, "CURRENT TIMESTAMP AT TIME ZONE 'UTC'")}.must_raise RuntimeError
23
- end
24
- end
@@ -1,300 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "Sequel::Plugins::ConstraintValidations" do
4
- def model_class(opts={})
5
- return @c if @c
6
- @c = Class.new(Sequel::Model(@db[:items]))
7
- @c.columns :name
8
- @db.sqls
9
- set_fetch(opts)
10
- @c.plugin :constraint_validations
11
- @c
12
- end
13
-
14
- def set_fetch(opts)
15
- @db.fetch = {:table=>'items', :message=>nil, :allow_nil=>nil, :constraint_name=>nil, :validation_type=>'presence', :argument=>nil, :column=>'name'}.merge(opts)
16
- end
17
-
18
- before do
19
- @db = Sequel.mock
20
- set_fetch({})
21
- @ds = @db[:items]
22
- @ds.send(:columns=, [:name])
23
- @ds2 = Sequel.mock[:items2]
24
- @ds2.send(:columns=, [:name])
25
- end
26
-
27
- it "should load the validation_helpers plugin into the class" do
28
- model_class.new.must_respond_to(:validates_presence)
29
- end
30
-
31
- it "should parse constraint validations when loading plugin" do
32
- @c = model_class
33
- @db.sqls.must_equal ["SELECT * FROM sequel_constraint_validations"]
34
- @db.constraint_validations.must_equal("items"=>[{:allow_nil=>nil, :constraint_name=>nil, :message=>nil, :validation_type=>"presence", :column=>"name", :argument=>nil, :table=>"items"}])
35
- @c.constraint_validations.must_equal [[:validates_presence, :name]]
36
- @c.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
37
- end
38
-
39
- it "should parse constraint validations with a custom constraint validations table" do
40
- c = Class.new(Sequel::Model(@db[:items]))
41
- @db.sqls
42
- c.plugin :constraint_validations, :constraint_validations_table=>:foo
43
- @db.sqls.must_equal ["SELECT * FROM foo"]
44
- @db.constraint_validations.must_equal("items"=>[{:allow_nil=>nil, :constraint_name=>nil, :message=>nil, :validation_type=>"presence", :column=>"name", :argument=>nil, :table=>"items"}])
45
- c.constraint_validations.must_equal [[:validates_presence, :name]]
46
- c.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
47
- end
48
-
49
- it "should populate constraint_validations when subclassing" do
50
- c = Class.new(Sequel::Model(@db))
51
- c.plugin :constraint_validations
52
- @db.sqls.must_equal ["SELECT * FROM sequel_constraint_validations"]
53
- sc = Class.new(c)
54
- sc.set_dataset @ds
55
- @db.sqls.must_equal []
56
- sc.constraint_validations.must_equal [[:validates_presence, :name]]
57
- sc.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
58
- end
59
-
60
- it "should handle plugin being loaded in subclass when superclass uses a custom constraint validations table" do
61
- c = Class.new(Sequel::Model(@db))
62
- c.plugin :constraint_validations, :constraint_validations_table=>:foo
63
- @db.sqls.must_equal ["SELECT * FROM foo"]
64
- sc = Class.new(c)
65
- sc.plugin :constraint_validations
66
- sc.constraint_validations_table.must_equal :foo
67
- sc.set_dataset @ds
68
- @db.sqls.must_equal []
69
- sc.constraint_validations.must_equal [[:validates_presence, :name]]
70
- sc.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
71
- end
72
-
73
- it "should populate constraint_validations when changing the model's dataset" do
74
- c = Class.new(Sequel::Model(@db[:foo]))
75
- c.columns :name
76
- @db.sqls
77
- c.plugin :constraint_validations
78
- @db.sqls.must_equal ["SELECT * FROM sequel_constraint_validations"]
79
- sc = Class.new(c)
80
- sc.set_dataset @ds
81
- @db.sqls.must_equal []
82
- sc.constraint_validations.must_equal [[:validates_presence, :name]]
83
- sc.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
84
- end
85
-
86
- it "should reparse constraint validations when changing the model's database" do
87
- c = Class.new(Sequel::Model(@ds2))
88
- c.plugin :constraint_validations
89
- @ds2.db.sqls.must_equal ["SELECT * FROM sequel_constraint_validations"]
90
- sc = Class.new(c)
91
- sc.set_dataset @ds
92
- @db.sqls.must_equal ["SELECT * FROM sequel_constraint_validations"]
93
- sc.constraint_validations.must_equal [[:validates_presence, :name]]
94
- sc.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
95
- end
96
-
97
- it "should reparse constraint validations when changing the model's database with a custom constraint validations table" do
98
- c = Class.new(Sequel::Model(@ds2))
99
- c.plugin :constraint_validations, :constraint_validations_table=>:foo
100
- @ds2.db.sqls.must_equal ["SELECT * FROM foo"]
101
- sc = Class.new(c)
102
- sc.set_dataset @ds
103
- @db.sqls.must_equal ["SELECT * FROM foo"]
104
- sc.constraint_validations.must_equal [[:validates_presence, :name]]
105
- sc.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
106
- end
107
-
108
- it "should correctly retrieve :message option from constraint validations table" do
109
- model_class(:message=>'foo').constraint_validations.must_equal [[:validates_presence, :name, {:message=>'foo'}]]
110
- @c.constraint_validation_reflections.must_equal(:name=>[[:presence, {:message=>'foo'}]])
111
- end
112
-
113
- it "should correctly retrieve :allow_nil option from constraint validations table" do
114
- model_class(:allow_nil=>true).constraint_validations.must_equal [[:validates_presence, :name, {:allow_nil=>true}]]
115
- @c.constraint_validation_reflections.must_equal(:name=>[[:presence, {:allow_nil=>true}]])
116
- end
117
-
118
- it "should handle presence validation" do
119
- model_class(:validation_type=>'presence').constraint_validations.must_equal [[:validates_presence, :name]]
120
- @c.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
121
- end
122
-
123
- it "should handle exact_length validation" do
124
- model_class(:validation_type=>'exact_length', :argument=>'5').constraint_validations.must_equal [[:validates_exact_length, 5, :name]]
125
- @c.constraint_validation_reflections.must_equal(:name=>[[:exact_length, {:argument=>5}]])
126
- end
127
-
128
- it "should handle min_length validation" do
129
- model_class(:validation_type=>'min_length', :argument=>'5').constraint_validations.must_equal [[:validates_min_length, 5, :name]]
130
- @c.constraint_validation_reflections.must_equal(:name=>[[:min_length, {:argument=>5}]])
131
- end
132
-
133
- it "should handle max_length validation" do
134
- model_class(:validation_type=>'max_length', :argument=>'5').constraint_validations.must_equal [[:validates_max_length, 5, :name]]
135
- @c.constraint_validation_reflections.must_equal(:name=>[[:max_length, {:argument=>5}]])
136
- end
137
-
138
- it "should handle length_range validation" do
139
- model_class(:validation_type=>'length_range', :argument=>'3..5').constraint_validations.must_equal [[:validates_length_range, 3..5, :name]]
140
- @c.constraint_validation_reflections.must_equal(:name=>[[:length_range, {:argument=>3..5}]])
141
- end
142
-
143
- it "should handle length_range validation with an exclusive end" do
144
- model_class(:validation_type=>'length_range', :argument=>'3...5').constraint_validations.must_equal [[:validates_length_range, 3...5, :name]]
145
- @c.constraint_validation_reflections.must_equal(:name=>[[:length_range, {:argument=>3...5}]])
146
- end
147
-
148
- it "should handle format validation" do
149
- model_class(:validation_type=>'format', :argument=>'^foo.*').constraint_validations.must_equal [[:validates_format, /^foo.*/, :name]]
150
- @c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/^foo.*/}]])
151
- end
152
-
153
- it "should handle format validation with case insensitive format" do
154
- model_class(:validation_type=>'iformat', :argument=>'^foo.*').constraint_validations.must_equal [[:validates_format, /^foo.*/i, :name]]
155
- @c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/^foo.*/i}]])
156
- end
157
-
158
- it "should handle includes validation with array of strings" do
159
- model_class(:validation_type=>'includes_str_array', :argument=>'a,b,c').constraint_validations.must_equal [[:validates_includes, %w'a b c', :name]]
160
- @c.constraint_validation_reflections.must_equal(:name=>[[:includes, {:argument=>%w'a b c'}]])
161
- end
162
-
163
- it "should handle includes validation with array of integers" do
164
- model_class(:validation_type=>'includes_int_array', :argument=>'1,2,3').constraint_validations.must_equal [[:validates_includes, [1, 2, 3], :name]]
165
- @c.constraint_validation_reflections.must_equal(:name=>[[:includes, {:argument=>[1, 2, 3]}]])
166
- end
167
-
168
- it "should handle includes validation with inclusive range of integers" do
169
- model_class(:validation_type=>'includes_int_range', :argument=>'3..5').constraint_validations.must_equal [[:validates_includes, 3..5, :name]]
170
- @c.constraint_validation_reflections.must_equal(:name=>[[:includes, {:argument=>3..5}]])
171
- end
172
-
173
- it "should handle includes validation with exclusive range of integers" do
174
- model_class(:validation_type=>'includes_int_range', :argument=>'3...5').constraint_validations.must_equal [[:validates_includes, 3...5, :name]]
175
- @c.constraint_validation_reflections.must_equal(:name=>[[:includes, {:argument=>3...5}]])
176
- end
177
-
178
- it "should handle like validation" do
179
- model_class(:validation_type=>'like', :argument=>'foo').constraint_validations.must_equal [[:validates_format, /\Afoo\z/, :name]]
180
- @c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\Afoo\z/}]])
181
- end
182
-
183
- it "should handle ilike validation" do
184
- model_class(:validation_type=>'ilike', :argument=>'foo').constraint_validations.must_equal [[:validates_format, /\Afoo\z/i, :name]]
185
- @c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\Afoo\z/i}]])
186
- end
187
-
188
- it "should handle operator validation" do
189
- [[:str_lt, :<], [:str_lte, :<=], [:str_gt, :>], [:str_gte, :>=]].each do |vt, op|
190
- model_class(:validation_type=>vt.to_s, :argument=>'a').constraint_validations.must_equal [[:validates_operator, op, 'a', :name]]
191
- @c.constraint_validation_reflections.must_equal(:name=>[[:operator, {:operator=>op, :argument=>'a'}]])
192
- @c = @c.db.constraint_validations = nil
193
- end
194
-
195
- [[:int_lt, :<], [:int_lte, :<=], [:int_gt, :>], [:int_gte, :>=]].each do |vt, op|
196
- model_class(:validation_type=>vt.to_s, :argument=>'1').constraint_validations.must_equal [[:validates_operator, op, 1, :name]]
197
- @c.constraint_validation_reflections.must_equal(:name=>[[:operator, {:operator=>op, :argument=>1}]])
198
- @c = @c.db.constraint_validations = nil
199
- end
200
- end
201
-
202
- it "should handle like validation with % metacharacter" do
203
- model_class(:validation_type=>'like', :argument=>'%foo%').constraint_validations.must_equal [[:validates_format, /\A.*foo.*\z/, :name]]
204
- @c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\A.*foo.*\z/}]])
205
- end
206
-
207
- it "should handle like validation with %% metacharacter" do
208
- model_class(:validation_type=>'like', :argument=>'%%foo%%').constraint_validations.must_equal [[:validates_format, /\A%foo%\z/, :name]]
209
- @c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\A%foo%\z/}]])
210
- end
211
-
212
- it "should handle like validation with _ metacharacter" do
213
- model_class(:validation_type=>'like', :argument=>'f_o').constraint_validations.must_equal [[:validates_format, /\Af.o\z/, :name]]
214
- @c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\Af.o\z/}]])
215
- end
216
-
217
- it "should handle like validation with Regexp metacharacter" do
218
- model_class(:validation_type=>'like', :argument=>'\wfoo\d').constraint_validations.must_equal [[:validates_format, /\A\\wfoo\\d\z/, :name]]
219
- @c.constraint_validation_reflections.must_equal(:name=>[[:format, {:argument=>/\A\\wfoo\\d\z/}]])
220
- end
221
-
222
- it "should handle unique validation" do
223
- model_class(:validation_type=>'unique').constraint_validations.must_equal [[:validates_unique, [:name]]]
224
- @c.constraint_validation_reflections.must_equal(:name=>[[:unique, {}]])
225
- end
226
-
227
- it "should handle unique validation with multiple columns" do
228
- model_class(:validation_type=>'unique', :column=>'name,id').constraint_validations.must_equal [[:validates_unique, [:name, :id]]]
229
- @c.constraint_validation_reflections.must_equal([:name, :id]=>[[:unique, {}]])
230
- end
231
-
232
- it "should handle :validation_options" do
233
- c = model_class(:validation_type=>'unique', :column=>'name')
234
- c.plugin :constraint_validations, :validation_options=>{:unique=>{:message=>'is bad'}}
235
- c.constraint_validations.must_equal [[:validates_unique, [:name], {:message=>'is bad'}]]
236
- c.constraint_validation_reflections.must_equal(:name=>[[:unique, {:message=>'is bad'}]])
237
- c.dataset = c.dataset.with_fetch(:count=>1)
238
- o = c.new(:name=>'a')
239
- o.valid?.must_equal false
240
- o.errors.full_messages.must_equal ['name is bad']
241
- end
242
-
243
- it "should handle :validation_options merging with constraint validation options" do
244
- c = model_class(:validation_type=>'unique', :column=>'name', :allow_nil=>true)
245
- c.plugin :constraint_validations, :validation_options=>{:unique=>{:message=>'is bad'}}
246
- c.constraint_validations.must_equal [[:validates_unique, [:name], {:message=>'is bad', :allow_nil=>true}]]
247
- c.constraint_validation_reflections.must_equal(:name=>[[:unique, {:message=>'is bad', :allow_nil=>true}]])
248
- c.dataset = c.dataset.with_fetch(:count=>1)
249
- o = c.new(:name=>'a')
250
- o.valid?.must_equal false
251
- o.errors.full_messages.must_equal ['name is bad']
252
- end
253
-
254
- it "should handle :validation_options merging with subclasses" do
255
- c = model_class(:validation_type=>'unique', :column=>'name')
256
- c.plugin :constraint_validations, :validation_options=>{:unique=>{:message=>'is bad', :allow_nil=>true}}
257
- sc = Class.new(c)
258
- sc.plugin :constraint_validations, :validation_options=>{:unique=>{:allow_missing=>true, :allow_nil=>false}}
259
- sc.constraint_validations.must_equal [[:validates_unique, [:name], {:message=>'is bad', :allow_missing=>true, :allow_nil=>false}]]
260
- sc.constraint_validation_reflections.must_equal(:name=>[[:unique, {:message=>'is bad', :allow_missing=>true, :allow_nil=>false}]])
261
- sc.dataset = sc.dataset.with_fetch(:count=>1)
262
- o = sc.new(:name=>'a')
263
- o.valid?.must_equal false
264
- o.errors.full_messages.must_equal ['name is bad']
265
- end
266
-
267
- it "should used parsed constraint validations when validating" do
268
- o = model_class.new
269
- o.valid?.must_equal false
270
- o.errors.full_messages.must_equal ['name is not present']
271
- end
272
-
273
- it "should handle a table name specified as SQL::Identifier" do
274
- set_fetch(:table=>'sch__items')
275
- c = Class.new(Sequel::Model(@db[Sequel.identifier(:sch__items)]))
276
- c.plugin :constraint_validations
277
- c.constraint_validations.must_equal [[:validates_presence, :name]]
278
- c.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
279
- end
280
-
281
- it "should handle a table name specified as SQL::QualifiedIdentifier" do
282
- set_fetch(:table=>'sch.items')
283
- c = Class.new(Sequel::Model(@db[Sequel.qualify(:sch, :items)]))
284
- c.plugin :constraint_validations
285
- c.constraint_validations.must_equal [[:validates_presence, :name]]
286
- c.constraint_validation_reflections.must_equal(:name=>[[:presence, {}]])
287
- end
288
-
289
- it "should freeze constraint validations data when freezing model class" do
290
- @c = model_class
291
- @c.freeze
292
- @c.constraint_validations.frozen?.must_equal true
293
- @c.constraint_validations.all?(&:frozen?).must_equal true
294
- @c.constraint_validation_reflections.frozen?.must_equal true
295
- @c.constraint_validation_reflections.values.all?(&:frozen?).must_equal true
296
- @c.constraint_validation_reflections.values.all?{|r| r.all?(&:frozen?)}.must_equal true
297
- @c.instance_variable_get(:@constraint_validation_options).frozen?.must_equal true
298
- @c.instance_variable_get(:@constraint_validation_options).values.all?(&:frozen?).must_equal true
299
- end
300
- end