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,52 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- describe "ValidatesAssociated plugin" do
4
- before do
5
- @db = Sequel.mock(:autoid=>1, :numrows=>1, :fetch=>{:id=>1, :name=>'a', :c_id=>nil})
6
- @c = Class.new(Sequel::Model(@db[:cs]))
7
- @c.plugin :validate_associated
8
- @c.columns :id, :name, :c_id
9
- @c.one_to_many :cs, :class=>@c, :key=>:c_id
10
- @o = @c.load(:id=>1, :name=>'a')
11
- @db.sqls
12
- end
13
-
14
- it "should return nil when saving if the associated object is invalid when raise_on_save_failure is false" do
15
- @c.raise_on_save_failure = false
16
- @c.send(:define_method, :validate){|*| errors.add(:name, 'is b') if name == 'b'}
17
- o = @c.load(:id=>2, :name=>'b')
18
- @o.send(:delay_validate_associated_object, @c.association_reflection(:cs), o)
19
- @o.save.must_be_nil
20
- @o.errors[:cs].must_equal ["name is b"]
21
- o.errors[:name].must_equal ['is b']
22
- end
23
-
24
- it "should support creating new one_to_many and one_to_one objects with presence validations on the foreign key" do
25
- @c.class_eval do
26
- plugin :validation_helpers
27
- def validate
28
- validates_integer :c_id
29
- super
30
- end
31
- end
32
- @o.c_id = 5
33
- @o.send(:delay_validate_associated_object, @c.association_reflection(:cs), @c.load(:id=>2, :name=>'b', :c_id=>2))
34
- @o.valid?.must_equal true
35
- end
36
-
37
- it "should should not remove existing values from object when validating" do
38
- o = @c.load(:id=>2, :name=>'b', :c_id=>3)
39
- @o.send(:delay_validate_associated_object, @c.association_reflection(:cs), o)
40
- @o.valid?.must_equal true
41
- o.c_id.must_equal 3
42
- end
43
-
44
- it "should not attempt to validate associated_object if the :validate=>false option is passed to save" do
45
- @c.one_to_many :cs, :class=>@c, :key=>:c_id
46
- @c.send(:define_method, :validate){|*| errors.add(:name, 'is b') if name == 'b'}
47
- o = @c.load(:id=>2, :name=>'b', :c_id=>3)
48
- @o.send(:delay_validate_associated_object, @c.association_reflection(:cs), o)
49
- @o.save(:validate=>false).must_equal @o
50
- @db.sqls.must_equal ["UPDATE cs SET name = 'a' WHERE (id = 1)"]
51
- end
52
- end
@@ -1,1040 +0,0 @@
1
- require_relative "spec_helper"
2
-
3
- model_class = proc do |klass, &block|
4
- c = Class.new(klass)
5
- c.plugin :validation_class_methods
6
- c.class_eval(&block) if block
7
- c
8
- end
9
-
10
- describe Sequel::Model do
11
- before do
12
- @c = model_class.call Sequel::Model do
13
- def self.validates_coolness_of(attr)
14
- validates_each(attr) {|o, a, v| o.errors.add(a, 'is not cool') if v != :cool}
15
- end
16
- end
17
- end
18
-
19
- it "should freeze validation metadata when freezing model class" do
20
- @c.validates_acceptance_of(:a)
21
- @c.freeze
22
- @c.validations.frozen?.must_equal true
23
- @c.validations.values.all?(&:frozen?).must_equal true
24
- @c.validation_reflections.frozen?.must_equal true
25
- @c.validation_reflections.values.all? do |vs|
26
- vs.frozen? && vs.all? do |v|
27
- v.frozen? && v.last.frozen?
28
- end
29
- end.must_equal true
30
- end
31
-
32
- it "should respond to validations, has_validations?, and validation_reflections" do
33
- @c.must_respond_to(:validations)
34
- @c.must_respond_to(:has_validations?)
35
- @c.must_respond_to(:validation_reflections)
36
- end
37
-
38
- it "should be able to reflect on validations" do
39
- @c.validation_reflections.must_equal({})
40
- @c.validates_acceptance_of(:a)
41
- @c.validation_reflections.must_equal(:a=>[[:acceptance, {:tag=>:acceptance, :message=>"is not accepted", :allow_nil=>true, :accept=>"1"}]])
42
- @c.validates_presence_of(:a)
43
- @c.validation_reflections[:a].length.must_equal 2
44
- @c.validation_reflections[:a].last.must_equal [:presence, {:tag=>:presence, :message=>"is not present"}]
45
- end
46
-
47
- it "should handle validation reflections correctly when subclassing" do
48
- @c.validates_acceptance_of(:a)
49
- c = Class.new(@c)
50
- c.validation_reflections.map{|k,v| k}.must_equal [:a]
51
- c.validates_presence_of(:a)
52
- @c.validation_reflections.must_equal(:a=>[[:acceptance, {:tag=>:acceptance, :message=>"is not accepted", :allow_nil=>true, :accept=>"1"}]])
53
- c.validation_reflections[:a].last.must_equal [:presence, {:tag=>:presence, :message=>"is not present"}]
54
- end
55
-
56
- it "should acccept validation definitions using validates_each" do
57
- @c.validates_each(:xx, :yy) {|o, a, v| o.errors.add(a, 'too low') if v < 50}
58
- o = @c.new
59
- def o.xx; 40; end
60
- def o.yy; 60; end
61
- o.valid?.must_equal false
62
- o.errors.full_messages.must_equal ['xx too low']
63
- end
64
-
65
- it "should return true/false for has_validations?" do
66
- @c.has_validations?.must_equal false
67
- @c.validates_each(:xx) {1}
68
- @c.has_validations?.must_equal true
69
- end
70
-
71
- it "should validate multiple attributes at once" do
72
- o = @c.new
73
- def o.xx
74
- 1
75
- end
76
- def o.yy
77
- 2
78
- end
79
- vals = nil
80
- atts = nil
81
- @c.validates_each([:xx, :yy]){|obj,a,v| atts=a; vals=v}
82
- o.valid?
83
- vals.must_equal [1,2]
84
- atts.must_equal [:xx, :yy]
85
- end
86
-
87
- it "should respect allow_missing option when using multiple attributes" do
88
- o = @c.new
89
- def o.xx
90
- self[:xx]
91
- end
92
- def o.yy
93
- self[:yy]
94
- end
95
- vals = nil
96
- atts = nil
97
- @c.validates_each([:xx, :yy], :allow_missing=>true){|obj,a,v| atts=a; vals=v}
98
-
99
- o.values[:xx] = 1
100
- o.valid?
101
- vals.must_equal [1,nil]
102
- atts.must_equal [:xx, :yy]
103
-
104
- vals = nil
105
- atts = nil
106
- o.values.clear
107
- o.values[:yy] = 2
108
- o.valid?
109
- vals.must_equal [nil, 2]
110
- atts.must_equal [:xx, :yy]
111
-
112
- vals = nil
113
- atts = nil
114
- o.values.clear
115
- o.valid?.must_equal true
116
- vals.must_be_nil
117
- atts.must_be_nil
118
- end
119
-
120
- it "should overwrite existing validation with the same tag and attribute" do
121
- @c.validates_each(:xx, :xx, :tag=>:low) {|o, a, v| o.xxx; o.errors.add(a, 'too low') if v < 50}
122
- @c.validates_each(:yy, :yy) {|o, a, v| o.yyy; o.errors.add(a, 'too low') if v < 50}
123
- @c.validates_presence_of(:zz, :zz)
124
- @c.validates_length_of(:aa, :aa, :tag=>:blah)
125
- o = @c.new
126
- def o.zz
127
- @a ||= 0
128
- @a += 1
129
- end
130
- def o.aa
131
- @b ||= 0
132
- @b += 1
133
- end
134
- def o.xx; 40; end
135
- def o.yy; 60; end
136
- def o.xxx; end
137
- def o.yyy; end
138
- o.valid?.must_equal false
139
- o.zz.must_equal 2
140
- o.aa.must_equal 2
141
- o.errors.full_messages.must_equal ['xx too low']
142
- end
143
-
144
- it "should provide a validates method that takes block with validation definitions" do
145
- @c.validates do
146
- coolness_of :blah
147
- end
148
- @c.validations[:blah].wont_be :empty?
149
- o = @c.new
150
- def o.blah; end
151
- o.valid?.must_equal false
152
- o.errors.full_messages.must_equal ['blah is not cool']
153
- end
154
-
155
- it "should have the validates block have appropriate respond_to?" do
156
- c = nil
157
- @c.validates{c = respond_to?(:foo)}
158
- c.must_equal false
159
- @c.validates{c = respond_to?(:length_of)}
160
- c.must_equal true
161
- end
162
- end
163
-
164
- describe Sequel::Model do
165
- before do
166
- @c = model_class.call Sequel::Model do
167
- columns :score
168
- validates_each :score do |o, a, v|
169
- o.errors.add(a, 'too low') if v < 87
170
- end
171
- end
172
-
173
- @o = @c.new
174
- end
175
-
176
- it "should supply a #valid? method that returns true if validations pass" do
177
- @o.score = 50
178
- @o.wont_be :valid?
179
- @o.score = 100
180
- @o.must_be :valid?
181
- end
182
-
183
- it "should provide an errors object" do
184
- @o.score = 100
185
- @o.must_be :valid?
186
- @o.errors.must_be :empty?
187
-
188
- @o.score = 86
189
- @o.wont_be :valid?
190
- @o.errors[:score].must_equal ['too low']
191
- @o.errors.on(:blah).must_be_nil
192
- end
193
- end
194
-
195
- describe "Sequel::Plugins::ValidationClassMethods::ClassMethods::Generator" do
196
- before do
197
- @testit = testit = []
198
-
199
- @c = model_class.call Sequel::Model do
200
- singleton_class.send(:define_method, :validates_blah) do
201
- testit << 1324
202
- end
203
- end
204
- end
205
-
206
- it "should instance_eval the block, sending everything to its receiver" do
207
- @c.validates do
208
- blah
209
- end
210
- @testit.must_equal [1324]
211
- end
212
- end
213
-
214
- describe Sequel::Model do
215
- before do
216
- @c = model_class.call Sequel::Model do
217
- columns :value
218
-
219
- def self.where(*args)
220
- o = Object.new
221
- def o.count; 2; end
222
- o
223
- end
224
-
225
- def skip; false; end
226
- def dont_skip; true; end
227
- end
228
- @m = @c.new
229
- end
230
-
231
- it "should validate acceptance_of" do
232
- @c.validates_acceptance_of :value
233
- @m.must_be :valid?
234
- @m.value = '1'
235
- @m.must_be :valid?
236
- end
237
-
238
- it "should validate acceptance_of with accept" do
239
- @c.validates_acceptance_of :value, :accept => 'true'
240
- @m.value = '1'
241
- @m.wont_be :valid?
242
- @m.value = 'true'
243
- @m.must_be :valid?
244
- end
245
-
246
- it "should validate acceptance_of with allow_nil => false" do
247
- @c.validates_acceptance_of :value, :allow_nil => false
248
- @m.wont_be :valid?
249
- end
250
-
251
- it "should validate acceptance_of with allow_missing => true" do
252
- @c.validates_acceptance_of :value, :allow_missing => true
253
- @m.must_be :valid?
254
- end
255
-
256
- it "should validate acceptance_of with allow_missing => true and allow_nil => false" do
257
- @c.validates_acceptance_of :value, :allow_missing => true, :allow_nil => false
258
- @m.must_be :valid?
259
- @m.value = nil
260
- @m.wont_be :valid?
261
- end
262
-
263
- it "should validate acceptance_of with if => true" do
264
- @c.validates_acceptance_of :value, :if => :dont_skip
265
- @m.value = '0'
266
- @m.wont_be :valid?
267
- end
268
-
269
- it "should validate acceptance_of with if => false" do
270
- @c.validates_acceptance_of :value, :if => :skip
271
- @m.value = '0'
272
- @m.must_be :valid?
273
- end
274
-
275
- it "should validate acceptance_of with if proc that evaluates to true" do
276
- @c.validates_acceptance_of :value, :if => proc{true}
277
- @m.value = '0'
278
- @m.wont_be :valid?
279
- end
280
-
281
- it "should validate acceptance_of with if proc that evaluates to false" do
282
- @c.validates_acceptance_of :value, :if => proc{false}
283
- @m.value = '0'
284
- @m.must_be :valid?
285
- end
286
-
287
- it "should raise an error if :if option is not a Symbol, Proc, or nil" do
288
- @c.validates_acceptance_of :value, :if => 1
289
- @m.value = '0'
290
- proc{@m.valid?}.must_raise(Sequel::Error)
291
- end
292
-
293
- it "should validate confirmation_of" do
294
- @c.send(:attr_accessor, :value_confirmation)
295
- @c.validates_confirmation_of :value
296
-
297
- @m.value = 'blah'
298
- @m.wont_be :valid?
299
-
300
- @m.value_confirmation = 'blah'
301
- @m.must_be :valid?
302
- end
303
-
304
- it "should validate confirmation_of with if => true" do
305
- @c.send(:attr_accessor, :value_confirmation)
306
- @c.validates_confirmation_of :value, :if => :dont_skip
307
-
308
- @m.value = 'blah'
309
- @m.wont_be :valid?
310
- end
311
-
312
- it "should validate confirmation_of with if => false" do
313
- @c.send(:attr_accessor, :value_confirmation)
314
- @c.validates_confirmation_of :value, :if => :skip
315
-
316
- @m.value = 'blah'
317
- @m.must_be :valid?
318
- end
319
-
320
- it "should validate confirmation_of with allow_missing => true" do
321
- @c.send(:attr_accessor, :value_confirmation)
322
- @c.validates_acceptance_of :value, :allow_missing => true
323
- @m.must_be :valid?
324
- @m.value_confirmation = 'blah'
325
- @m.must_be :valid?
326
- @m.value = nil
327
- @m.wont_be :valid?
328
- end
329
-
330
- it "should validate format_of" do
331
- @c.validates_format_of :value, :with => /.+_.+/
332
- @m.value = 'abc_'
333
- @m.wont_be :valid?
334
- @m.value = 'abc_def'
335
- @m.must_be :valid?
336
- end
337
-
338
- it "should raise for validate_format_of without regexp" do
339
- proc {@c.validates_format_of :value}.must_raise(ArgumentError)
340
- proc {@c.validates_format_of :value, :with => :blah}.must_raise(ArgumentError)
341
- end
342
-
343
- it "should validate format_of with if => true" do
344
- @c.validates_format_of :value, :with => /_/, :if => :dont_skip
345
-
346
- @m.value = 'a'
347
- @m.wont_be :valid?
348
- end
349
-
350
- it "should validate format_of with if => false" do
351
- @c.validates_format_of :value, :with => /_/, :if => :skip
352
-
353
- @m.value = 'a'
354
- @m.must_be :valid?
355
- end
356
-
357
- it "should validate format_of with allow_missing => true" do
358
- @c.validates_format_of :value, :allow_missing => true, :with=>/./
359
- @m.must_be :valid?
360
- @m.value = nil
361
- @m.wont_be :valid?
362
- end
363
-
364
- it "should validate length_of with maximum" do
365
- @c.validates_length_of :value, :maximum => 5
366
- @m.wont_be :valid?
367
- @m.value = '12345'
368
- @m.must_be :valid?
369
- @m.value = '123456'
370
- @m.wont_be :valid?
371
- @m.errors[:value].must_equal ['is too long']
372
- @m.value = nil
373
- @m.wont_be :valid?
374
- @m.errors[:value].must_equal ['is not present']
375
- end
376
-
377
- it "should validate length_of with maximum using customized error messages" do
378
- @c.validates_length_of :value, :maximum => 5, :too_long=>'tl', :nil_message=>'np'
379
- @m.value = '123456'
380
- @m.wont_be :valid?
381
- @m.errors[:value].must_equal ['tl']
382
- @m.value = nil
383
- @m.wont_be :valid?
384
- @m.errors[:value].must_equal ['np']
385
- end
386
-
387
- it "should validate length_of with minimum" do
388
- @c.validates_length_of :value, :minimum => 5
389
- @m.wont_be :valid?
390
- @m.value = '12345'
391
- @m.must_be :valid?
392
- @m.value = '1234'
393
- @m.wont_be :valid?
394
- end
395
-
396
- it "should validate length_of with within" do
397
- @c.validates_length_of :value, :within => 2..5
398
- @m.wont_be :valid?
399
- @m.value = '12345'
400
- @m.must_be :valid?
401
- @m.value = '1'
402
- @m.wont_be :valid?
403
- @m.value = '123456'
404
- @m.wont_be :valid?
405
- end
406
-
407
- it "should validate length_of with is" do
408
- @c.validates_length_of :value, :is => 3
409
- @m.wont_be :valid?
410
- @m.value = '123'
411
- @m.must_be :valid?
412
- @m.value = '12'
413
- @m.wont_be :valid?
414
- @m.value = '1234'
415
- @m.wont_be :valid?
416
- end
417
-
418
- it "should validate length_of with allow_nil" do
419
- @c.validates_length_of :value, :is => 3, :allow_nil => true
420
- @m.must_be :valid?
421
- end
422
-
423
- it "should validate length_of with if => true" do
424
- @c.validates_length_of :value, :is => 3, :if => :dont_skip
425
-
426
- @m.value = 'a'
427
- @m.wont_be :valid?
428
- end
429
-
430
- it "should validate length_of with if => false" do
431
- @c.validates_length_of :value, :is => 3, :if => :skip
432
-
433
- @m.value = 'a'
434
- @m.must_be :valid?
435
- end
436
-
437
- it "should validate length_of with allow_missing => true" do
438
- @c.validates_length_of :value, :allow_missing => true, :minimum => 5
439
- @m.must_be :valid?
440
- @m.value = nil
441
- @m.wont_be :valid?
442
- end
443
-
444
- it "should allow multiple calls to validates_length_of with different options without overwriting" do
445
- @c.validates_length_of :value, :maximum => 5
446
- @c.validates_length_of :value, :minimum => 5
447
- @m.wont_be :valid?
448
- @m.value = '12345'
449
- @m.must_be :valid?
450
- @m.value = '123456'
451
- @m.wont_be :valid?
452
- @m.value = '12345'
453
- @m.must_be :valid?
454
- @m.value = '1234'
455
- @m.wont_be :valid?
456
- end
457
-
458
- it "should validate numericality_of" do
459
- @c.validates_numericality_of :value
460
- @m.value = 'blah'
461
- @m.wont_be :valid?
462
- @m.value = '123'
463
- @m.must_be :valid?
464
- @m.value = '123.1231'
465
- @m.must_be :valid?
466
- @m.value = '+1'
467
- @m.must_be :valid?
468
- @m.value = '-1'
469
- @m.must_be :valid?
470
- @m.value = '+1.123'
471
- @m.must_be :valid?
472
- @m.value = '-0.123'
473
- @m.must_be :valid?
474
- @m.value = '-0.123E10'
475
- @m.must_be :valid?
476
- @m.value = '32.123e10'
477
- @m.must_be :valid?
478
- @m.value = '+32.123E10'
479
- @m.must_be :valid?
480
- @m.must_be :valid?
481
- @m.value = '.0123'
482
- end
483
-
484
- it "should validate numericality_of with only_integer" do
485
- @c.validates_numericality_of :value, :only_integer => true
486
- @m.value = 'blah'
487
- @m.wont_be :valid?
488
- @m.value = '123'
489
- @m.must_be :valid?
490
- @m.value = '123.1231'
491
- @m.wont_be :valid?
492
- end
493
-
494
- it "should validate numericality_of with if => true" do
495
- @c.validates_numericality_of :value, :if => :dont_skip
496
-
497
- @m.value = 'a'
498
- @m.wont_be :valid?
499
- end
500
-
501
- it "should validate numericality_of with if => false" do
502
- @c.validates_numericality_of :value, :if => :skip
503
-
504
- @m.value = 'a'
505
- @m.must_be :valid?
506
- end
507
-
508
- it "should validate numericality_of with allow_missing => true" do
509
- @c.validates_numericality_of :value, :allow_missing => true
510
- @m.must_be :valid?
511
- @m.value = nil
512
- @m.wont_be :valid?
513
- end
514
-
515
- it "should validate presence_of" do
516
- @c.validates_presence_of :value
517
- @m.wont_be :valid?
518
- @m.value = ''
519
- @m.wont_be :valid?
520
- @m.value = 1234
521
- @m.must_be :valid?
522
- @m.value = nil
523
- @m.wont_be :valid?
524
- @m.value = true
525
- @m.must_be :valid?
526
- @m.value = false
527
- @m.must_be :valid?
528
- end
529
-
530
- it "should validate inclusion_of with an array" do
531
- @c.validates_inclusion_of :value, :in => [1,2]
532
- @m.wont_be :valid?
533
- @m.value = 1
534
- @m.must_be :valid?
535
- @m.value = 1.5
536
- @m.wont_be :valid?
537
- @m.value = 2
538
- @m.must_be :valid?
539
- @m.value = 3
540
- @m.wont_be :valid?
541
- end
542
-
543
- it "should validate inclusion_of with a range" do
544
- @c.validates_inclusion_of :value, :in => 1..4
545
- @m.wont_be :valid?
546
- @m.value = 1
547
- @m.must_be :valid?
548
- @m.value = 1.5
549
- @m.must_be :valid?
550
- @m.value = 0
551
- @m.wont_be :valid?
552
- @m.value = 5
553
- @m.wont_be :valid?
554
- end
555
-
556
- it "should raise an error if inclusion_of doesn't receive a valid :in option" do
557
- lambda{@c.validates_inclusion_of :value}.must_raise(ArgumentError)
558
- lambda{@c.validates_inclusion_of :value, :in => 1}.must_raise(ArgumentError)
559
- end
560
-
561
- it "should raise an error if inclusion_of handles :allow_nil too" do
562
- @c.validates_inclusion_of :value, :in => 1..4, :allow_nil => true
563
- @m.value = nil
564
- @m.must_be :valid?
565
- @m.value = 0
566
- @m.wont_be :valid?
567
- end
568
-
569
- it "should validate presence_of with if => true" do
570
- @c.validates_presence_of :value, :if => :dont_skip
571
- @m.wont_be :valid?
572
- end
573
-
574
- it "should validate presence_of with if => false" do
575
- @c.validates_presence_of :value, :if => :skip
576
- @m.must_be :valid?
577
- end
578
-
579
- it "should validate presence_of with allow_missing => true" do
580
- @c.validates_presence_of :value, :allow_missing => true
581
- @m.must_be :valid?
582
- @m.value = nil
583
- @m.wont_be :valid?
584
- end
585
-
586
- it "should validate uniqueness_of with if => true" do
587
- @c.validates_uniqueness_of :value, :if => :dont_skip
588
-
589
- @m.value = 'a'
590
- @m.wont_be :valid?
591
- end
592
-
593
- it "should validate uniqueness_of with if => false" do
594
- @c.validates_uniqueness_of :value, :if => :skip
595
- @m.value = 'a'
596
- @m.must_be :valid?
597
- end
598
-
599
- it "should validate uniqueness_of with allow_missing => true" do
600
- @c.validates_uniqueness_of :value, :allow_missing => true
601
- @m.must_be :valid?
602
- @m.value = 1
603
- @m.wont_be :valid?
604
- end
605
- end
606
-
607
- describe "Superclass validations" do
608
- before do
609
- @c1 = model_class.call Sequel::Model do
610
- columns :value
611
- validates_length_of :value, :minimum => 5
612
- end
613
-
614
- @c2 = Class.new(@c1)
615
- @c2.class_eval do
616
- columns :value
617
- validates_format_of :value, :with => /^[a-z]+$/
618
- end
619
- end
620
-
621
- it "should be checked when validating" do
622
- o = @c2.new
623
- o.value = 'ab'
624
- o.valid?.must_equal false
625
- o.errors.full_messages.must_equal ['value is too short']
626
-
627
- o.value = '12'
628
- o.valid?.must_equal false
629
- o.errors.full_messages.must_equal ['value is too short', 'value is invalid']
630
-
631
- o.value = 'abcde'
632
- o.valid?.must_equal true
633
- end
634
-
635
- it "should have skip_superclass_validations? return whether superclass validations were skipped" do
636
- @c2.skip_superclass_validations?.must_be_nil
637
- @c2.skip_superclass_validations
638
- @c2.skip_superclass_validations?.must_equal true
639
- end
640
-
641
- it "should be skipped if skip_superclass_validations is called" do
642
- @c2.skip_superclass_validations
643
-
644
- o = @c2.new
645
- o.value = 'ab'
646
- o.valid?.must_equal true
647
-
648
- o.value = '12'
649
- o.valid?.must_equal false
650
- o.errors.full_messages.must_equal ['value is invalid']
651
-
652
- o.value = 'abcde'
653
- o.valid?.must_equal true
654
- end
655
- end
656
-
657
- describe ".validates with block" do
658
- it "should support calling .each" do
659
- @c = model_class.call Sequel::Model do
660
- columns :vvv
661
- validates do
662
- each :vvv do |o, a, v|
663
- o.errors.add(a, "is less than zero") if v.to_i < 0
664
- end
665
- end
666
- end
667
-
668
- o = @c.new
669
- o.vvv = 1
670
- o.must_be :valid?
671
- o.vvv = -1
672
- o.wont_be :valid?
673
- end
674
- end
675
-
676
- describe Sequel::Model, "Validations" do
677
- before do
678
- class ::Person < Sequel::Model
679
- plugin :validation_class_methods
680
- columns :id,:name,:first_name,:last_name,:middle_name,:initials,:age, :terms
681
- end
682
-
683
- class ::Smurf < Person
684
- end
685
-
686
- class ::Can < Sequel::Model
687
- plugin :validation_class_methods
688
- columns :id, :name
689
- end
690
-
691
- class ::Cow < Sequel::Model
692
- plugin :validation_class_methods
693
- columns :id, :name, :got_milk
694
- end
695
-
696
- class ::User < Sequel::Model
697
- plugin :validation_class_methods
698
- columns :id, :username, :password
699
- end
700
-
701
- class ::Address < Sequel::Model
702
- plugin :validation_class_methods
703
- columns :id, :zip_code
704
- end
705
- end
706
- after do
707
- [:Person, :Smurf, :Cow, :User, :Address].each{|c| Object.send(:remove_const, c)}
708
- end
709
-
710
- it "should validate the acceptance of a column" do
711
- class ::Cow < Sequel::Model
712
- validations.clear
713
- validates_acceptance_of :got_milk, :accept => 'blah', :allow_nil => false
714
- end
715
-
716
- @cow = Cow.new
717
- @cow.wont_be :valid?
718
- @cow.errors.full_messages.must_equal ["got_milk is not accepted"]
719
-
720
- @cow.got_milk = "blah"
721
- @cow.must_be :valid?
722
- end
723
-
724
- it "should validate the confirmation of a column" do
725
- class ::User < Sequel::Model
726
- def password_confirmation
727
- "test"
728
- end
729
-
730
- validations.clear
731
- validates_confirmation_of :password
732
- end
733
-
734
- @user = User.new
735
- @user.wont_be :valid?
736
- @user.errors.full_messages.must_equal ["password is not confirmed"]
737
-
738
- @user.password = "test"
739
- @user.must_be :valid?
740
- end
741
-
742
- it "should validate format of column" do
743
- class ::Person < Sequel::Model
744
- validates_format_of :first_name, :with => /^[a-zA-Z]+$/
745
- end
746
-
747
- @person = Person.new :first_name => "Lancelot99"
748
- @person.valid?.must_equal false
749
- @person = Person.new :first_name => "Anita"
750
- @person.valid?.must_equal true
751
- end
752
-
753
- it "should validate length of column" do
754
- class ::Person < Sequel::Model
755
- validations.clear
756
- validates_length_of :first_name, :maximum => 30
757
- validates_length_of :last_name, :minimum => 30
758
- validates_length_of :middle_name, :within => 1..5
759
- validates_length_of :initials, :is => 2
760
- end
761
-
762
- @person = Person.new(
763
- :first_name => "Anamethatiswaytofreakinglongandwayoverthirtycharacters",
764
- :last_name => "Alastnameunderthirtychars",
765
- :initials => "LGC",
766
- :middle_name => "danger"
767
- )
768
-
769
- @person.wont_be :valid?
770
- @person.errors.full_messages.size.must_equal 4
771
- @person.errors.full_messages.sort.must_equal [
772
- 'first_name is too long',
773
- 'initials is the wrong length',
774
- 'last_name is too short',
775
- 'middle_name is the wrong length'
776
- ]
777
-
778
- @person.first_name = "Lancelot"
779
- @person.last_name = "1234567890123456789012345678901"
780
- @person.initials = "LC"
781
- @person.middle_name = "Will"
782
- @person.must_be :valid?
783
- end
784
-
785
- it "should validate that a column has the correct type for the schema column" do
786
- p = model_class.call Sequel::Model do
787
- columns :age, :d
788
- self.raise_on_typecast_failure = false
789
- validates_schema_type :age
790
- validates_schema_type :d, :message=>'is a bad choice'
791
- @db_schema = {:age=>{:type=>:integer}, :d=>{:type=>:date}}
792
- end
793
-
794
- @person = p.new
795
- @person.must_be :valid?
796
-
797
- @person.age = 'a'
798
- @person.wont_be :valid?
799
- @person.errors.full_messages.must_equal ['age is not a valid integer']
800
- @person.age = 1
801
- @person.must_be :valid?
802
-
803
- @person.d = 'a'
804
- @person.wont_be :valid?
805
- @person.errors.full_messages.must_equal ['d is a bad choice']
806
- @person.d = Date.today
807
- @person.must_be :valid?
808
- end
809
-
810
- it "should validate numericality of column" do
811
- class ::Person < Sequel::Model
812
- validations.clear
813
- validates_numericality_of :age
814
- end
815
-
816
- @person = Person.new :age => "Twenty"
817
- @person.wont_be :valid?
818
- @person.errors.full_messages.must_equal ['age is not a number']
819
-
820
- @person.age = 20
821
- @person.must_be :valid?
822
- end
823
-
824
- it "should validate the presence of a column" do
825
- class ::Cow < Sequel::Model
826
- validations.clear
827
- validates_presence_of :name
828
- end
829
-
830
- @cow = Cow.new
831
- @cow.wont_be :valid?
832
- @cow.errors.full_messages.must_equal ['name is not present']
833
-
834
- @cow.name = "Betsy"
835
- @cow.must_be :valid?
836
- end
837
-
838
- it "should validate the uniqueness of a column" do
839
- class ::User < Sequel::Model
840
- validations.clear
841
- validates do
842
- uniqueness_of :username
843
- end
844
- end
845
- User.dataset = User.dataset.with_fetch(proc do |sql|
846
- case sql
847
- when /count.*username = '0records'/
848
- {:v => 0}
849
- when /count.*username = '2records'/
850
- {:v => 2}
851
- when /count.*username = '1record'/
852
- {:v => 1}
853
- when /username = '1record'/
854
- {:id => 3, :username => "1record", :password => "test"}
855
- end
856
- end)
857
-
858
- @user = User.new(:username => "2records", :password => "anothertest")
859
- @user.wont_be :valid?
860
- @user.errors.full_messages.must_equal ['username is already taken']
861
-
862
- @user = User.new(:username => "1record", :password => "anothertest")
863
- @user.wont_be :valid?
864
- @user.errors.full_messages.must_equal ['username is already taken']
865
-
866
- @user = User.load(:id=>4, :username => "1record", :password => "anothertest")
867
- @user.wont_be :valid?
868
- @user.errors.full_messages.must_equal ['username is already taken']
869
-
870
- @user = User.load(:id=>3, :username => "1record", :password => "anothertest")
871
- @user.must_be :valid?
872
- @user.errors.full_messages.must_equal []
873
-
874
- @user = User.new(:username => "0records", :password => "anothertest")
875
- @user.must_be :valid?
876
- @user.errors.full_messages.must_equal []
877
-
878
- User.db.sqls
879
- @user = User.new(:password => "anothertest")
880
- @user.must_be :valid?
881
- @user.errors.full_messages.must_equal []
882
- User.db.sqls.must_equal []
883
- end
884
-
885
- it "should validate the uniqueness of multiple columns" do
886
- class ::User < Sequel::Model
887
- validations.clear
888
- validates do
889
- uniqueness_of [:username, :password]
890
- end
891
- end
892
- User.dataset = User.dataset.with_fetch(proc do |sql|
893
- case sql
894
- when /count.*username = '0records'/
895
- {:v => 0}
896
- when /count.*username = '2records'/
897
- {:v => 2}
898
- when /count.*username = '1record'/
899
- {:v => 1}
900
- when /username = '1record'/
901
- if sql =~ /password = 'anothertest'/
902
- {:id => 3, :username => "1record", :password => "anothertest"}
903
- else
904
- {:id => 4, :username => "1record", :password => "test"}
905
- end
906
- end
907
- end)
908
-
909
- @user = User.new(:username => "2records", :password => "anothertest")
910
- @user.wont_be :valid?
911
- @user.errors.full_messages.must_equal ['username and password is already taken']
912
-
913
- @user = User.new(:username => "1record", :password => "anothertest")
914
- @user.wont_be :valid?
915
- @user.errors.full_messages.must_equal ['username and password is already taken']
916
-
917
- @user = User.load(:id=>4, :username => "1record", :password => "anothertest")
918
- @user.wont_be :valid?
919
- @user.errors.full_messages.must_equal ['username and password is already taken']
920
-
921
- @user = User.load(:id=>3, :username => "1record", :password => "test")
922
- @user.wont_be :valid?
923
- @user.errors.full_messages.must_equal ['username and password is already taken']
924
-
925
- @user = User.load(:id=>3, :username => "1record", :password => "anothertest")
926
- @user.must_be :valid?
927
- @user.errors.full_messages.must_equal []
928
-
929
- @user = User.new(:username => "0records", :password => "anothertest")
930
- @user.must_be :valid?
931
- @user.errors.full_messages.must_equal []
932
-
933
- User.db.sqls
934
- @user = User.new(:password => "anothertest")
935
- @user.must_be :valid?
936
- @user.errors.full_messages.must_equal []
937
- @user = User.new(:username => "0records")
938
- @user.must_be :valid?
939
- @user.errors.full_messages.must_equal []
940
- @user = User.new
941
- @user.must_be :valid?
942
- @user.errors.full_messages.must_equal []
943
- User.db.sqls.must_equal []
944
- end
945
-
946
- it "should have a validates block that contains multiple validations" do
947
- class ::Person < Sequel::Model
948
- validations.clear
949
- validates do
950
- format_of :first_name, :with => /^[a-zA-Z]+$/
951
- length_of :first_name, :maximum => 30
952
- end
953
- end
954
-
955
- Person.validations[:first_name].size.must_equal 2
956
-
957
- @person = Person.new :first_name => "Lancelot99"
958
- @person.valid?.must_equal false
959
-
960
- @person2 = Person.new :first_name => "Wayne"
961
- @person2.valid?.must_equal true
962
- end
963
-
964
- it "should allow 'longhand' validations direcly within the model." do
965
- class ::Person < Sequel::Model
966
- validations.clear
967
- validates_length_of :first_name, :maximum => 30
968
- end
969
- Person.validations.length.must_equal(1)
970
- end
971
-
972
- it "should define a has_validations? method which returns true if the model has validations, false otherwise" do
973
- class ::Person < Sequel::Model
974
- validations.clear
975
- validates do
976
- format_of :first_name, :with => /\w+/
977
- length_of :first_name, :maximum => 30
978
- end
979
- end
980
-
981
- class ::Smurf < Person
982
- validations.clear
983
- end
984
-
985
- Person.validations.wont_be :empty?
986
- Smurf.validations.must_be :empty?
987
- end
988
-
989
- it "should validate correctly instances initialized with string keys" do
990
- class ::Can < Sequel::Model
991
- validates_length_of :name, :minimum => 4
992
- end
993
-
994
- Can.new('name' => 'ab').wont_be :valid?
995
- Can.new('name' => 'abcd').must_be :valid?
996
- end
997
-
998
- end
999
-
1000
- describe "Model#save" do
1001
- before do
1002
- @c = model_class.call Sequel::Model(:people) do
1003
- columns :id, :x
1004
-
1005
- validates_each :x do |o, a, v|
1006
- o.errors.add(a, 'blah') unless v == 7
1007
- end
1008
- end
1009
- @m = @c.load(:id => 4, :x=>6)
1010
- DB.reset
1011
- end
1012
-
1013
- it "should save only if validations pass" do
1014
- @m.raise_on_save_failure = false
1015
- @m.wont_be :valid?
1016
- @m.save
1017
- DB.sqls.must_be :empty?
1018
-
1019
- @m.x = 7
1020
- @m.must_be :valid?
1021
- @m.save.wont_equal false
1022
- DB.sqls.must_equal ['UPDATE people SET x = 7 WHERE (id = 4)']
1023
- end
1024
-
1025
- it "should skip validations if the :validate=>false option is used" do
1026
- @m.raise_on_save_failure = false
1027
- @m.wont_be :valid?
1028
- @m.save(:validate=>false)
1029
- DB.sqls.must_equal ['UPDATE people SET x = 6 WHERE (id = 4)']
1030
- end
1031
-
1032
- it "should raise error if validations fail and raise_on_save_faiure is true" do
1033
- proc{@m.save}.must_raise(Sequel::ValidationFailed)
1034
- end
1035
-
1036
- it "should return nil if validations fail and raise_on_save_faiure is false" do
1037
- @m.raise_on_save_failure = false
1038
- @m.save.must_be_nil
1039
- end
1040
- end