sequel 5.8.0 → 5.38.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 (510) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +409 -1795
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/bin/sequel +4 -0
  6. data/doc/advanced_associations.rdoc +136 -18
  7. data/doc/association_basics.rdoc +10 -5
  8. data/doc/cheat_sheet.rdoc +1 -0
  9. data/doc/code_order.rdoc +12 -2
  10. data/doc/dataset_filtering.rdoc +17 -2
  11. data/doc/mass_assignment.rdoc +3 -3
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +30 -8
  15. data/doc/postgresql.rdoc +107 -2
  16. data/doc/release_notes/5.10.0.txt +84 -0
  17. data/doc/release_notes/5.11.0.txt +83 -0
  18. data/doc/release_notes/5.12.0.txt +141 -0
  19. data/doc/release_notes/5.13.0.txt +27 -0
  20. data/doc/release_notes/5.14.0.txt +63 -0
  21. data/doc/release_notes/5.15.0.txt +39 -0
  22. data/doc/release_notes/5.16.0.txt +110 -0
  23. data/doc/release_notes/5.17.0.txt +31 -0
  24. data/doc/release_notes/5.18.0.txt +69 -0
  25. data/doc/release_notes/5.19.0.txt +28 -0
  26. data/doc/release_notes/5.20.0.txt +89 -0
  27. data/doc/release_notes/5.21.0.txt +87 -0
  28. data/doc/release_notes/5.22.0.txt +48 -0
  29. data/doc/release_notes/5.23.0.txt +56 -0
  30. data/doc/release_notes/5.24.0.txt +56 -0
  31. data/doc/release_notes/5.25.0.txt +32 -0
  32. data/doc/release_notes/5.26.0.txt +35 -0
  33. data/doc/release_notes/5.27.0.txt +21 -0
  34. data/doc/release_notes/5.28.0.txt +16 -0
  35. data/doc/release_notes/5.29.0.txt +22 -0
  36. data/doc/release_notes/5.30.0.txt +20 -0
  37. data/doc/release_notes/5.31.0.txt +148 -0
  38. data/doc/release_notes/5.32.0.txt +46 -0
  39. data/doc/release_notes/5.33.0.txt +24 -0
  40. data/doc/release_notes/5.34.0.txt +40 -0
  41. data/doc/release_notes/5.35.0.txt +56 -0
  42. data/doc/release_notes/5.36.0.txt +60 -0
  43. data/doc/release_notes/5.37.0.txt +30 -0
  44. data/doc/release_notes/5.38.0.txt +28 -0
  45. data/doc/release_notes/5.9.0.txt +99 -0
  46. data/doc/security.rdoc +10 -0
  47. data/doc/sharding.rdoc +42 -28
  48. data/doc/sql.rdoc +12 -0
  49. data/doc/testing.rdoc +24 -17
  50. data/doc/transactions.rdoc +78 -0
  51. data/doc/validations.rdoc +2 -2
  52. data/lib/sequel/adapters/ado.rb +26 -18
  53. data/lib/sequel/adapters/ado/access.rb +2 -2
  54. data/lib/sequel/adapters/ado/mssql.rb +5 -8
  55. data/lib/sequel/adapters/amalgalite.rb +1 -1
  56. data/lib/sequel/adapters/jdbc.rb +71 -27
  57. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  58. data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
  59. data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
  60. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
  61. data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
  62. data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
  63. data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
  64. data/lib/sequel/adapters/mysql.rb +14 -15
  65. data/lib/sequel/adapters/mysql2.rb +5 -3
  66. data/lib/sequel/adapters/odbc.rb +4 -6
  67. data/lib/sequel/adapters/oracle.rb +7 -7
  68. data/lib/sequel/adapters/postgres.rb +52 -16
  69. data/lib/sequel/adapters/shared/access.rb +16 -12
  70. data/lib/sequel/adapters/shared/db2.rb +5 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +41 -18
  72. data/lib/sequel/adapters/shared/mysql.rb +66 -19
  73. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  74. data/lib/sequel/adapters/shared/postgres.rb +341 -95
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  76. data/lib/sequel/adapters/shared/sqlite.rb +174 -21
  77. data/lib/sequel/adapters/sqlanywhere.rb +33 -17
  78. data/lib/sequel/adapters/sqlite.rb +78 -68
  79. data/lib/sequel/adapters/tinytds.rb +14 -6
  80. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
  82. data/lib/sequel/connection_pool.rb +2 -6
  83. data/lib/sequel/connection_pool/sharded_single.rb +7 -4
  84. data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
  85. data/lib/sequel/connection_pool/single.rb +1 -1
  86. data/lib/sequel/connection_pool/threaded.rb +26 -11
  87. data/lib/sequel/core.rb +327 -319
  88. data/lib/sequel/database/connecting.rb +7 -8
  89. data/lib/sequel/database/logging.rb +7 -1
  90. data/lib/sequel/database/misc.rb +68 -34
  91. data/lib/sequel/database/query.rb +6 -4
  92. data/lib/sequel/database/schema_generator.rb +31 -11
  93. data/lib/sequel/database/schema_methods.rb +32 -22
  94. data/lib/sequel/database/transactions.rb +129 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/dataset/actions.rb +34 -23
  97. data/lib/sequel/dataset/features.rb +34 -0
  98. data/lib/sequel/dataset/graph.rb +27 -11
  99. data/lib/sequel/dataset/misc.rb +17 -3
  100. data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
  101. data/lib/sequel/dataset/prepared_statements.rb +96 -26
  102. data/lib/sequel/dataset/query.rb +43 -8
  103. data/lib/sequel/dataset/sql.rb +189 -41
  104. data/lib/sequel/deprecated.rb +3 -1
  105. data/lib/sequel/exceptions.rb +2 -0
  106. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  107. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  108. data/lib/sequel/extensions/caller_logging.rb +79 -0
  109. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  110. data/lib/sequel/extensions/connection_expiration.rb +6 -6
  111. data/lib/sequel/extensions/connection_validator.rb +7 -6
  112. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  113. data/lib/sequel/extensions/constraint_validations.rb +53 -28
  114. data/lib/sequel/extensions/core_refinements.rb +2 -0
  115. data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
  116. data/lib/sequel/extensions/escaped_like.rb +100 -0
  117. data/lib/sequel/extensions/eval_inspect.rb +3 -1
  118. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  119. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  120. data/lib/sequel/extensions/index_caching.rb +9 -7
  121. data/lib/sequel/extensions/integer64.rb +3 -1
  122. data/lib/sequel/extensions/looser_typecasting.rb +3 -3
  123. data/lib/sequel/extensions/migration.rb +13 -6
  124. data/lib/sequel/extensions/named_timezones.rb +84 -23
  125. data/lib/sequel/extensions/pg_array.rb +87 -79
  126. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  127. data/lib/sequel/extensions/pg_enum.rb +34 -18
  128. data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
  129. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  130. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
  131. data/lib/sequel/extensions/pg_inet.rb +15 -5
  132. data/lib/sequel/extensions/pg_interval.rb +2 -0
  133. data/lib/sequel/extensions/pg_json.rb +387 -123
  134. data/lib/sequel/extensions/pg_json_ops.rb +168 -0
  135. data/lib/sequel/extensions/pg_range.rb +20 -10
  136. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  137. data/lib/sequel/extensions/pg_row.rb +3 -2
  138. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  139. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  140. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  141. data/lib/sequel/extensions/query.rb +1 -0
  142. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  143. data/lib/sequel/extensions/s.rb +2 -0
  144. data/lib/sequel/extensions/schema_dumper.rb +13 -7
  145. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
  146. data/lib/sequel/extensions/server_block.rb +18 -7
  147. data/lib/sequel/extensions/sql_comments.rb +2 -2
  148. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  149. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  150. data/lib/sequel/extensions/to_dot.rb +9 -3
  151. data/lib/sequel/model.rb +3 -1
  152. data/lib/sequel/model/associations.rb +403 -69
  153. data/lib/sequel/model/base.rb +170 -90
  154. data/lib/sequel/model/plugins.rb +105 -0
  155. data/lib/sequel/plugins/after_initialize.rb +1 -1
  156. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  157. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  158. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  159. data/lib/sequel/plugins/association_pks.rb +74 -22
  160. data/lib/sequel/plugins/association_proxies.rb +6 -2
  161. data/lib/sequel/plugins/auto_validations.rb +36 -17
  162. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  163. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  164. data/lib/sequel/plugins/caching.rb +3 -0
  165. data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
  166. data/lib/sequel/plugins/composition.rb +13 -9
  167. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  168. data/lib/sequel/plugins/defaults_setter.rb +2 -2
  169. data/lib/sequel/plugins/dirty.rb +60 -22
  170. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  171. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  172. data/lib/sequel/plugins/finder.rb +2 -2
  173. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  174. data/lib/sequel/plugins/hook_class_methods.rb +17 -5
  175. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  176. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  177. data/lib/sequel/plugins/inverted_subsets.rb +2 -2
  178. data/lib/sequel/plugins/json_serializer.rb +21 -14
  179. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  180. data/lib/sequel/plugins/list.rb +22 -10
  181. data/lib/sequel/plugins/many_through_many.rb +1 -1
  182. data/lib/sequel/plugins/nested_attributes.rb +27 -5
  183. data/lib/sequel/plugins/pg_array_associations.rb +12 -9
  184. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
  185. data/lib/sequel/plugins/prepared_statements.rb +6 -12
  186. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  187. data/lib/sequel/plugins/rcte_tree.rb +20 -22
  188. data/lib/sequel/plugins/sharding.rb +13 -7
  189. data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
  190. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  191. data/lib/sequel/plugins/static_cache.rb +36 -17
  192. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  193. data/lib/sequel/plugins/string_stripper.rb +1 -1
  194. data/lib/sequel/plugins/subclasses.rb +2 -0
  195. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  196. data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
  197. data/lib/sequel/plugins/throw_failures.rb +110 -0
  198. data/lib/sequel/plugins/tree.rb +49 -31
  199. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  200. data/lib/sequel/plugins/validation_class_methods.rb +11 -5
  201. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  202. data/lib/sequel/sql.rb +120 -30
  203. data/lib/sequel/timezones.rb +55 -14
  204. data/lib/sequel/version.rb +6 -1
  205. metadata +101 -361
  206. data/Rakefile +0 -151
  207. data/doc/release_notes/4.0.0.txt +0 -262
  208. data/doc/release_notes/4.1.0.txt +0 -85
  209. data/doc/release_notes/4.10.0.txt +0 -226
  210. data/doc/release_notes/4.11.0.txt +0 -147
  211. data/doc/release_notes/4.12.0.txt +0 -105
  212. data/doc/release_notes/4.13.0.txt +0 -169
  213. data/doc/release_notes/4.14.0.txt +0 -68
  214. data/doc/release_notes/4.15.0.txt +0 -56
  215. data/doc/release_notes/4.16.0.txt +0 -36
  216. data/doc/release_notes/4.17.0.txt +0 -38
  217. data/doc/release_notes/4.18.0.txt +0 -36
  218. data/doc/release_notes/4.19.0.txt +0 -45
  219. data/doc/release_notes/4.2.0.txt +0 -129
  220. data/doc/release_notes/4.20.0.txt +0 -79
  221. data/doc/release_notes/4.21.0.txt +0 -94
  222. data/doc/release_notes/4.22.0.txt +0 -72
  223. data/doc/release_notes/4.23.0.txt +0 -65
  224. data/doc/release_notes/4.24.0.txt +0 -99
  225. data/doc/release_notes/4.25.0.txt +0 -181
  226. data/doc/release_notes/4.26.0.txt +0 -44
  227. data/doc/release_notes/4.27.0.txt +0 -78
  228. data/doc/release_notes/4.28.0.txt +0 -57
  229. data/doc/release_notes/4.29.0.txt +0 -41
  230. data/doc/release_notes/4.3.0.txt +0 -40
  231. data/doc/release_notes/4.30.0.txt +0 -37
  232. data/doc/release_notes/4.31.0.txt +0 -57
  233. data/doc/release_notes/4.32.0.txt +0 -132
  234. data/doc/release_notes/4.33.0.txt +0 -88
  235. data/doc/release_notes/4.34.0.txt +0 -86
  236. data/doc/release_notes/4.35.0.txt +0 -130
  237. data/doc/release_notes/4.36.0.txt +0 -116
  238. data/doc/release_notes/4.37.0.txt +0 -50
  239. data/doc/release_notes/4.38.0.txt +0 -67
  240. data/doc/release_notes/4.39.0.txt +0 -127
  241. data/doc/release_notes/4.4.0.txt +0 -92
  242. data/doc/release_notes/4.40.0.txt +0 -179
  243. data/doc/release_notes/4.41.0.txt +0 -77
  244. data/doc/release_notes/4.42.0.txt +0 -221
  245. data/doc/release_notes/4.43.0.txt +0 -87
  246. data/doc/release_notes/4.44.0.txt +0 -125
  247. data/doc/release_notes/4.45.0.txt +0 -370
  248. data/doc/release_notes/4.46.0.txt +0 -404
  249. data/doc/release_notes/4.47.0.txt +0 -56
  250. data/doc/release_notes/4.48.0.txt +0 -293
  251. data/doc/release_notes/4.49.0.txt +0 -222
  252. data/doc/release_notes/4.5.0.txt +0 -34
  253. data/doc/release_notes/4.6.0.txt +0 -30
  254. data/doc/release_notes/4.7.0.txt +0 -103
  255. data/doc/release_notes/4.8.0.txt +0 -175
  256. data/doc/release_notes/4.9.0.txt +0 -190
  257. data/spec/adapter_spec.rb +0 -4
  258. data/spec/adapters/db2_spec.rb +0 -170
  259. data/spec/adapters/mssql_spec.rb +0 -804
  260. data/spec/adapters/mysql_spec.rb +0 -1041
  261. data/spec/adapters/oracle_spec.rb +0 -327
  262. data/spec/adapters/postgres_spec.rb +0 -4000
  263. data/spec/adapters/spec_helper.rb +0 -43
  264. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  265. data/spec/adapters/sqlite_spec.rb +0 -600
  266. data/spec/bin_spec.rb +0 -269
  267. data/spec/core/connection_pool_spec.rb +0 -1228
  268. data/spec/core/database_spec.rb +0 -2673
  269. data/spec/core/dataset_spec.rb +0 -5419
  270. data/spec/core/deprecated_spec.rb +0 -70
  271. data/spec/core/expression_filters_spec.rb +0 -1344
  272. data/spec/core/mock_adapter_spec.rb +0 -722
  273. data/spec/core/object_graph_spec.rb +0 -306
  274. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  275. data/spec/core/schema_generator_spec.rb +0 -214
  276. data/spec/core/schema_spec.rb +0 -1820
  277. data/spec/core/spec_helper.rb +0 -23
  278. data/spec/core/version_spec.rb +0 -7
  279. data/spec/core_extensions_spec.rb +0 -762
  280. data/spec/core_model_spec.rb +0 -2
  281. data/spec/core_spec.rb +0 -1
  282. data/spec/deprecation_helper.rb +0 -30
  283. data/spec/extensions/accessed_columns_spec.rb +0 -51
  284. data/spec/extensions/active_model_spec.rb +0 -99
  285. data/spec/extensions/after_initialize_spec.rb +0 -24
  286. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  287. data/spec/extensions/association_dependencies_spec.rb +0 -125
  288. data/spec/extensions/association_pks_spec.rb +0 -423
  289. data/spec/extensions/association_proxies_spec.rb +0 -100
  290. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  291. data/spec/extensions/auto_validations_spec.rb +0 -202
  292. data/spec/extensions/blacklist_security_spec.rb +0 -95
  293. data/spec/extensions/blank_spec.rb +0 -69
  294. data/spec/extensions/boolean_readers_spec.rb +0 -93
  295. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  296. data/spec/extensions/caching_spec.rb +0 -273
  297. data/spec/extensions/class_table_inheritance_spec.rb +0 -568
  298. data/spec/extensions/column_conflicts_spec.rb +0 -75
  299. data/spec/extensions/column_select_spec.rb +0 -129
  300. data/spec/extensions/columns_introspection_spec.rb +0 -90
  301. data/spec/extensions/columns_updated_spec.rb +0 -35
  302. data/spec/extensions/composition_spec.rb +0 -248
  303. data/spec/extensions/connection_expiration_spec.rb +0 -133
  304. data/spec/extensions/connection_validator_spec.rb +0 -127
  305. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  306. data/spec/extensions/constraint_validations_spec.rb +0 -395
  307. data/spec/extensions/core_refinements_spec.rb +0 -528
  308. data/spec/extensions/csv_serializer_spec.rb +0 -183
  309. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  310. data/spec/extensions/dataset_associations_spec.rb +0 -365
  311. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  312. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  313. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  314. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  315. data/spec/extensions/defaults_setter_spec.rb +0 -141
  316. data/spec/extensions/delay_add_association_spec.rb +0 -73
  317. data/spec/extensions/dirty_spec.rb +0 -189
  318. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  319. data/spec/extensions/eager_each_spec.rb +0 -62
  320. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  321. data/spec/extensions/error_splitter_spec.rb +0 -18
  322. data/spec/extensions/error_sql_spec.rb +0 -20
  323. data/spec/extensions/eval_inspect_spec.rb +0 -74
  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 -380
  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 -275
  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 -840
  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 -109
  348. data/spec/extensions/nested_attributes_spec.rb +0 -703
  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 -165
  356. data/spec/extensions/pg_enum_spec.rb +0 -113
  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 -487
  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 -182
  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 -868
  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 -61
  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 -410
  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 -141
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/timestamps_spec.rb +0 -209
  411. data/spec/extensions/to_dot_spec.rb +0 -153
  412. data/spec/extensions/touch_spec.rb +0 -226
  413. data/spec/extensions/tree_spec.rb +0 -284
  414. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  415. data/spec/extensions/unlimited_update_spec.rb +0 -21
  416. data/spec/extensions/update_or_create_spec.rb +0 -83
  417. data/spec/extensions/update_primary_key_spec.rb +0 -105
  418. data/spec/extensions/update_refresh_spec.rb +0 -59
  419. data/spec/extensions/uuid_spec.rb +0 -101
  420. data/spec/extensions/validate_associated_spec.rb +0 -52
  421. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  422. data/spec/extensions/validation_contexts_spec.rb +0 -31
  423. data/spec/extensions/validation_helpers_spec.rb +0 -525
  424. data/spec/extensions/whitelist_security_spec.rb +0 -157
  425. data/spec/extensions/xml_serializer_spec.rb +0 -213
  426. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  427. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  428. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  429. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  431. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  432. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  433. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  434. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  436. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  437. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  438. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  439. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  440. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  441. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  443. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  444. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  446. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  447. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  448. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  449. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  450. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  451. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  452. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  453. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  457. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  458. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  459. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  460. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  461. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  462. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  466. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  468. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  469. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  471. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  473. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  474. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  475. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  476. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  478. data/spec/guards_helper.rb +0 -58
  479. data/spec/integration/associations_test.rb +0 -2513
  480. data/spec/integration/database_test.rb +0 -113
  481. data/spec/integration/dataset_test.rb +0 -1880
  482. data/spec/integration/eager_loader_test.rb +0 -687
  483. data/spec/integration/migrator_test.rb +0 -262
  484. data/spec/integration/model_test.rb +0 -203
  485. data/spec/integration/plugin_test.rb +0 -2302
  486. data/spec/integration/prepared_statement_test.rb +0 -398
  487. data/spec/integration/schema_test.rb +0 -869
  488. data/spec/integration/spec_helper.rb +0 -64
  489. data/spec/integration/timezone_test.rb +0 -86
  490. data/spec/integration/transaction_test.rb +0 -354
  491. data/spec/integration/type_test.rb +0 -127
  492. data/spec/model/association_reflection_spec.rb +0 -803
  493. data/spec/model/associations_spec.rb +0 -4538
  494. data/spec/model/base_spec.rb +0 -817
  495. data/spec/model/class_dataset_methods_spec.rb +0 -146
  496. data/spec/model/dataset_methods_spec.rb +0 -198
  497. data/spec/model/eager_loading_spec.rb +0 -2262
  498. data/spec/model/hooks_spec.rb +0 -370
  499. data/spec/model/inflector_spec.rb +0 -26
  500. data/spec/model/model_spec.rb +0 -953
  501. data/spec/model/plugins_spec.rb +0 -318
  502. data/spec/model/record_spec.rb +0 -2107
  503. data/spec/model/spec_helper.rb +0 -45
  504. data/spec/model/validations_spec.rb +0 -193
  505. data/spec/model_no_assoc_spec.rb +0 -1
  506. data/spec/model_spec.rb +0 -1
  507. data/spec/plugin_spec.rb +0 -1
  508. data/spec/sequel_coverage.rb +0 -15
  509. data/spec/sequel_warning.rb +0 -4
  510. data/spec/spec_config.rb +0 -12
@@ -1,133 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- connection_expiration_specs = shared_description do
4
- describe "connection expiration" do
5
- before do
6
- @db.extend(Module.new do
7
- def disconnect_connection(conn)
8
- @sqls << 'disconnect'
9
- end
10
- end)
11
- @db.extension(:connection_expiration)
12
- @db.pool.connection_expiration_timeout = 2
13
- end
14
-
15
- it "should still allow new connections" do
16
- @db.synchronize{|c| c}.must_be_kind_of(Sequel::Mock::Connection)
17
- end
18
-
19
- it "should not override connection_expiration_timeout when loading extension" do
20
- @db.extension(:connection_expiration)
21
- @db.pool.connection_expiration_timeout.must_equal 2
22
- end
23
-
24
- it "should only expire if older than timeout" do
25
- c1 = @db.synchronize{|c| c}
26
- @db.sqls.must_equal []
27
- @db.synchronize{|c| c}.must_be_same_as(c1)
28
- @db.sqls.must_equal []
29
- end
30
-
31
- it "should disconnect connection if expired" do
32
- c1 = @db.synchronize{|c| c}
33
- @db.sqls.must_equal []
34
- simulate_sleep(c1)
35
- c2 = @db.synchronize{|c| c}
36
- @db.sqls.must_equal ['disconnect']
37
- c2.wont_be_same_as(c1)
38
- end
39
-
40
- it "should disconnect only expired connections among multiple" do
41
- c1, c2 = multiple_connections
42
-
43
- # Expire c1 only.
44
- simulate_sleep(c1)
45
- simulate_sleep(c2, 1)
46
- c1, c2 = multiple_connections
47
-
48
- c3 = @db.synchronize{|c| c}
49
- @db.sqls.must_equal ['disconnect']
50
- c3.wont_be_same_as(c1)
51
- c3.must_be_same_as(c2)
52
- end
53
-
54
- it "should disconnect connections repeatedly if they are expired" do
55
- c1, c2 = multiple_connections
56
-
57
- simulate_sleep(c1)
58
- simulate_sleep(c2)
59
-
60
- c3 = @db.synchronize{|c| c}
61
- @db.sqls.must_equal ['disconnect', 'disconnect']
62
- c3.wont_be_same_as(c1)
63
- c3.wont_be_same_as(c2)
64
- end
65
-
66
- it "should not leak connection references to expiring connections" do
67
- c1 = @db.synchronize{|c| c}
68
- simulate_sleep(c1)
69
- c2 = @db.synchronize{|c| c}
70
- c2.wont_be_same_as(c1)
71
- @db.pool.instance_variable_get(:@connection_expiration_timestamps).must_include(c2)
72
- @db.pool.instance_variable_get(:@connection_expiration_timestamps).wont_include(c1)
73
- end
74
-
75
- it "should not leak connection references during disconnect" do
76
- multiple_connections
77
- @db.pool.instance_variable_get(:@connection_expiration_timestamps).size.must_equal 2
78
- @db.disconnect
79
- @db.pool.instance_variable_get(:@connection_expiration_timestamps).size.must_equal 0
80
- end
81
-
82
- it "should not vary expiration timestamps by default" do
83
- c1 = @db.synchronize{|c| c}
84
- @db.pool.instance_variable_get(:@connection_expiration_timestamps)[c1].last.must_equal 2
85
- end
86
-
87
- it "should support #connection_expiration_random_delay to vary expiration timestamps" do
88
- @db.pool.connection_expiration_random_delay = 1
89
- c1 = @db.synchronize{|c| c}
90
- @db.pool.instance_variable_get(:@connection_expiration_timestamps)[c1].last.wont_equal 2
91
- end
92
-
93
- def multiple_connections
94
- q, q1 = Queue.new, Queue.new
95
- c1 = nil
96
- c2 = nil
97
- @db.synchronize do |c|
98
- Thread.new do
99
- @db.synchronize do |cc|
100
- c2 = cc
101
- end
102
- q1.pop
103
- q.push nil
104
- end
105
- q1.push nil
106
- q.pop
107
- c1 = c
108
- end
109
- [c1, c2]
110
- end
111
-
112
- # Set the timestamp back in time to simulate sleep / passage of time.
113
- def simulate_sleep(conn, sleep_time = 3)
114
- timestamps = @db.pool.instance_variable_get(:@connection_expiration_timestamps)
115
- timer, max = timestamps[conn]
116
- timestamps[conn] = [timer - sleep_time, max]
117
- @db.pool.instance_variable_set(:@connection_expiration_timestamps, timestamps)
118
- end
119
- end
120
- end
121
-
122
- describe "Sequel::ConnectionExpiration with threaded pool" do
123
- before do
124
- @db = Sequel.mock(:test=>false)
125
- end
126
- include connection_expiration_specs
127
- end
128
- describe "Sequel::ConnectionExpiration with sharded threaded pool" do
129
- before do
130
- @db = Sequel.mock(:test=>false, :servers=>{})
131
- end
132
- include connection_expiration_specs
133
- end
@@ -1,127 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- connection_validator_specs = shared_description do
4
- describe "connection validator" do
5
- before do
6
- @db.extend(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.extension(:connection_validator)
24
- end
25
-
26
- it "should still allow new connections" do
27
- @db.synchronize{|c| c}.must_be_kind_of(Sequel::Mock::Connection)
28
- end
29
-
30
- it "should only validate if connection idle longer than timeout" do
31
- c1 = @db.synchronize{|c| c}
32
- @db.sqls.must_equal []
33
- @db.synchronize{|c| c}.must_be_same_as(c1)
34
- @db.sqls.must_equal []
35
- @db.pool.connection_validation_timeout = -1
36
- @db.synchronize{|c| c}.must_be_same_as(c1)
37
- @db.sqls.must_equal ['SELECT NULL']
38
- @db.pool.connection_validation_timeout = 1
39
- @db.synchronize{|c| c}.must_be_same_as(c1)
40
- @db.sqls.must_equal []
41
- @db.synchronize{|c| c}.must_be_same_as(c1)
42
- @db.sqls.must_equal []
43
- end
44
-
45
- it "should disconnect connection if not valid" do
46
- c1 = @db.synchronize{|c| c}
47
- @db.sqls.must_equal []
48
- c1.valid = false
49
- @db.pool.connection_validation_timeout = -1
50
- c2 = @db.synchronize{|c| c}
51
- @db.sqls.must_equal ['SELECT NULL', 'disconnect']
52
- c2.wont_be_same_as(c1)
53
- end
54
-
55
- it "should disconnect multiple connections repeatedly if they are not valid" do
56
- q, q1 = Queue.new, Queue.new
57
- c1 = nil
58
- c2 = nil
59
- @db.pool.connection_validation_timeout = -1
60
- @db.synchronize do |c|
61
- Thread.new do
62
- @db.synchronize do |cc|
63
- c2 = cc
64
- end
65
- q1.pop
66
- q.push nil
67
- end
68
- q1.push nil
69
- q.pop
70
- c1 = c
71
- end
72
- c1.valid = false
73
- c2.valid = false
74
-
75
- c3 = @db.synchronize{|c| c}
76
- @db.sqls.must_equal ['SELECT NULL', 'disconnect', 'SELECT NULL', 'disconnect']
77
- c3.wont_be_same_as(c1)
78
- c3.wont_be_same_as(c2)
79
- end
80
-
81
- it "should not leak connection references during disconnect" do
82
- @db.synchronize{}
83
- @db.pool.instance_variable_get(:@connection_timestamps).size.must_equal 1
84
- @db.disconnect
85
- @db.pool.instance_variable_get(:@connection_timestamps).size.must_equal 0
86
- end
87
-
88
- it "should not leak connection references" do
89
- c1 = @db.synchronize do |c|
90
- @db.pool.instance_variable_get(:@connection_timestamps).must_equal({})
91
- c
92
- end
93
- @db.pool.instance_variable_get(:@connection_timestamps).must_include(c1)
94
-
95
- c1.valid = false
96
- @db.pool.connection_validation_timeout = -1
97
- c2 = @db.synchronize do |c|
98
- @db.pool.instance_variable_get(:@connection_timestamps).must_equal({})
99
- c
100
- end
101
- c2.wont_be_same_as(c1)
102
- @db.pool.instance_variable_get(:@connection_timestamps).wont_include(c1)
103
- @db.pool.instance_variable_get(:@connection_timestamps).must_include(c2)
104
- end
105
-
106
- it "should handle case where determining validity requires a connection" do
107
- def @db.valid_connection?(c) synchronize{}; true end
108
- @db.pool.connection_validation_timeout = -1
109
- c1 = @db.synchronize{|c| c}
110
- @db.synchronize{|c| c}.must_be_same_as(c1)
111
- end
112
- end
113
- end
114
-
115
- describe "Sequel::ConnectionValidator with threaded pool" do
116
- before do
117
- @db = Sequel.mock(:test=>false)
118
- end
119
- include connection_validator_specs
120
- end
121
- describe "Sequel::ConnectionValidator with sharded threaded pool" do
122
- before do
123
- @db = Sequel.mock(:test=>false, :servers=>{})
124
- end
125
- include connection_validator_specs
126
- end
127
-
@@ -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