sequel 5.29.0 → 5.34.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 (387) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +70 -1922
  3. data/README.rdoc +1 -1
  4. data/doc/advanced_associations.rdoc +4 -4
  5. data/doc/association_basics.rdoc +3 -3
  6. data/doc/code_order.rdoc +12 -2
  7. data/doc/model_dataset_method_design.rdoc +1 -1
  8. data/doc/postgresql.rdoc +71 -0
  9. data/doc/release_notes/5.30.0.txt +20 -0
  10. data/doc/release_notes/5.31.0.txt +148 -0
  11. data/doc/release_notes/5.32.0.txt +46 -0
  12. data/doc/release_notes/5.33.0.txt +24 -0
  13. data/doc/release_notes/5.34.0.txt +40 -0
  14. data/doc/testing.rdoc +1 -1
  15. data/lib/sequel/adapters/shared/access.rb +6 -6
  16. data/lib/sequel/adapters/shared/mssql.rb +5 -5
  17. data/lib/sequel/adapters/shared/mysql.rb +9 -9
  18. data/lib/sequel/adapters/shared/oracle.rb +16 -16
  19. data/lib/sequel/adapters/shared/postgres.rb +169 -14
  20. data/lib/sequel/adapters/shared/sqlanywhere.rb +9 -9
  21. data/lib/sequel/adapters/shared/sqlite.rb +32 -5
  22. data/lib/sequel/connection_pool/sharded_single.rb +4 -1
  23. data/lib/sequel/connection_pool/sharded_threaded.rb +12 -12
  24. data/lib/sequel/connection_pool/single.rb +1 -1
  25. data/lib/sequel/connection_pool/threaded.rb +2 -2
  26. data/lib/sequel/core.rb +318 -314
  27. data/lib/sequel/database/connecting.rb +1 -1
  28. data/lib/sequel/database/misc.rb +16 -10
  29. data/lib/sequel/database/query.rb +3 -1
  30. data/lib/sequel/database/schema_generator.rb +0 -1
  31. data/lib/sequel/database/schema_methods.rb +15 -16
  32. data/lib/sequel/database/transactions.rb +12 -13
  33. data/lib/sequel/dataset/placeholder_literalizer.rb +3 -7
  34. data/lib/sequel/dataset/query.rb +4 -3
  35. data/lib/sequel/deprecated.rb +2 -0
  36. data/lib/sequel/exceptions.rb +2 -0
  37. data/lib/sequel/extensions/connection_expiration.rb +2 -2
  38. data/lib/sequel/extensions/connection_validator.rb +2 -2
  39. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  40. data/lib/sequel/extensions/index_caching.rb +9 -7
  41. data/lib/sequel/extensions/integer64.rb +2 -0
  42. data/lib/sequel/extensions/migration.rb +1 -1
  43. data/lib/sequel/extensions/pg_enum.rb +5 -2
  44. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  45. data/lib/sequel/extensions/pg_inet.rb +13 -5
  46. data/lib/sequel/extensions/pg_interval.rb +2 -0
  47. data/lib/sequel/extensions/pg_range.rb +2 -0
  48. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  49. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  50. data/lib/sequel/extensions/schema_dumper.rb +10 -4
  51. data/lib/sequel/extensions/server_block.rb +3 -3
  52. data/lib/sequel/model.rb +2 -0
  53. data/lib/sequel/model/associations.rb +30 -18
  54. data/lib/sequel/model/base.rb +64 -55
  55. data/lib/sequel/model/plugins.rb +3 -3
  56. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  57. data/lib/sequel/plugins/association_multi_add_remove.rb +2 -0
  58. data/lib/sequel/plugins/association_pks.rb +57 -16
  59. data/lib/sequel/plugins/association_proxies.rb +2 -0
  60. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  61. data/lib/sequel/plugins/class_table_inheritance.rb +26 -26
  62. data/lib/sequel/plugins/dirty.rb +13 -13
  63. data/lib/sequel/plugins/forbid_lazy_load.rb +214 -0
  64. data/lib/sequel/plugins/json_serializer.rb +3 -7
  65. data/lib/sequel/plugins/rcte_tree.rb +2 -2
  66. data/lib/sequel/plugins/single_table_inheritance.rb +15 -15
  67. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  68. data/lib/sequel/plugins/subclasses.rb +2 -0
  69. data/lib/sequel/timezones.rb +6 -4
  70. data/lib/sequel/version.rb +1 -1
  71. metadata +17 -368
  72. data/Rakefile +0 -151
  73. data/doc/release_notes/4.0.0.txt +0 -262
  74. data/doc/release_notes/4.1.0.txt +0 -85
  75. data/doc/release_notes/4.10.0.txt +0 -226
  76. data/doc/release_notes/4.11.0.txt +0 -147
  77. data/doc/release_notes/4.12.0.txt +0 -105
  78. data/doc/release_notes/4.13.0.txt +0 -169
  79. data/doc/release_notes/4.14.0.txt +0 -68
  80. data/doc/release_notes/4.15.0.txt +0 -56
  81. data/doc/release_notes/4.16.0.txt +0 -36
  82. data/doc/release_notes/4.17.0.txt +0 -38
  83. data/doc/release_notes/4.18.0.txt +0 -36
  84. data/doc/release_notes/4.19.0.txt +0 -45
  85. data/doc/release_notes/4.2.0.txt +0 -129
  86. data/doc/release_notes/4.20.0.txt +0 -79
  87. data/doc/release_notes/4.21.0.txt +0 -94
  88. data/doc/release_notes/4.22.0.txt +0 -72
  89. data/doc/release_notes/4.23.0.txt +0 -65
  90. data/doc/release_notes/4.24.0.txt +0 -99
  91. data/doc/release_notes/4.25.0.txt +0 -181
  92. data/doc/release_notes/4.26.0.txt +0 -44
  93. data/doc/release_notes/4.27.0.txt +0 -78
  94. data/doc/release_notes/4.28.0.txt +0 -57
  95. data/doc/release_notes/4.29.0.txt +0 -41
  96. data/doc/release_notes/4.3.0.txt +0 -40
  97. data/doc/release_notes/4.30.0.txt +0 -37
  98. data/doc/release_notes/4.31.0.txt +0 -57
  99. data/doc/release_notes/4.32.0.txt +0 -132
  100. data/doc/release_notes/4.33.0.txt +0 -88
  101. data/doc/release_notes/4.34.0.txt +0 -86
  102. data/doc/release_notes/4.35.0.txt +0 -130
  103. data/doc/release_notes/4.36.0.txt +0 -116
  104. data/doc/release_notes/4.37.0.txt +0 -50
  105. data/doc/release_notes/4.38.0.txt +0 -67
  106. data/doc/release_notes/4.39.0.txt +0 -127
  107. data/doc/release_notes/4.4.0.txt +0 -92
  108. data/doc/release_notes/4.40.0.txt +0 -179
  109. data/doc/release_notes/4.41.0.txt +0 -77
  110. data/doc/release_notes/4.42.0.txt +0 -221
  111. data/doc/release_notes/4.43.0.txt +0 -87
  112. data/doc/release_notes/4.44.0.txt +0 -125
  113. data/doc/release_notes/4.45.0.txt +0 -370
  114. data/doc/release_notes/4.46.0.txt +0 -404
  115. data/doc/release_notes/4.47.0.txt +0 -56
  116. data/doc/release_notes/4.48.0.txt +0 -293
  117. data/doc/release_notes/4.49.0.txt +0 -222
  118. data/doc/release_notes/4.5.0.txt +0 -34
  119. data/doc/release_notes/4.6.0.txt +0 -30
  120. data/doc/release_notes/4.7.0.txt +0 -103
  121. data/doc/release_notes/4.8.0.txt +0 -175
  122. data/doc/release_notes/4.9.0.txt +0 -190
  123. data/spec/adapter_spec.rb +0 -4
  124. data/spec/adapters/db2_spec.rb +0 -170
  125. data/spec/adapters/mssql_spec.rb +0 -828
  126. data/spec/adapters/mysql_spec.rb +0 -1060
  127. data/spec/adapters/oracle_spec.rb +0 -371
  128. data/spec/adapters/postgres_spec.rb +0 -4476
  129. data/spec/adapters/spec_helper.rb +0 -44
  130. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  131. data/spec/adapters/sqlite_spec.rb +0 -652
  132. data/spec/bin_spec.rb +0 -278
  133. data/spec/core/connection_pool_spec.rb +0 -1250
  134. data/spec/core/database_spec.rb +0 -2915
  135. data/spec/core/dataset_spec.rb +0 -5544
  136. data/spec/core/deprecated_spec.rb +0 -70
  137. data/spec/core/expression_filters_spec.rb +0 -1498
  138. data/spec/core/mock_adapter_spec.rb +0 -722
  139. data/spec/core/object_graph_spec.rb +0 -336
  140. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  141. data/spec/core/schema_generator_spec.rb +0 -214
  142. data/spec/core/schema_spec.rb +0 -1844
  143. data/spec/core/spec_helper.rb +0 -24
  144. data/spec/core/version_spec.rb +0 -14
  145. data/spec/core_extensions_spec.rb +0 -763
  146. data/spec/core_model_spec.rb +0 -2
  147. data/spec/core_spec.rb +0 -1
  148. data/spec/deprecation_helper.rb +0 -30
  149. data/spec/extensions/accessed_columns_spec.rb +0 -51
  150. data/spec/extensions/active_model_spec.rb +0 -99
  151. data/spec/extensions/after_initialize_spec.rb +0 -28
  152. data/spec/extensions/any_not_empty_spec.rb +0 -23
  153. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  154. data/spec/extensions/association_dependencies_spec.rb +0 -125
  155. data/spec/extensions/association_multi_add_remove_spec.rb +0 -1041
  156. data/spec/extensions/association_pks_spec.rb +0 -423
  157. data/spec/extensions/association_proxies_spec.rb +0 -100
  158. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  159. data/spec/extensions/auto_validations_spec.rb +0 -229
  160. data/spec/extensions/blacklist_security_spec.rb +0 -95
  161. data/spec/extensions/blank_spec.rb +0 -69
  162. data/spec/extensions/boolean_readers_spec.rb +0 -93
  163. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  164. data/spec/extensions/caching_spec.rb +0 -273
  165. data/spec/extensions/caller_logging_spec.rb +0 -52
  166. data/spec/extensions/class_table_inheritance_spec.rb +0 -750
  167. data/spec/extensions/column_conflicts_spec.rb +0 -75
  168. data/spec/extensions/column_select_spec.rb +0 -129
  169. data/spec/extensions/columns_introspection_spec.rb +0 -90
  170. data/spec/extensions/columns_updated_spec.rb +0 -35
  171. data/spec/extensions/composition_spec.rb +0 -248
  172. data/spec/extensions/connection_expiration_spec.rb +0 -151
  173. data/spec/extensions/connection_validator_spec.rb +0 -144
  174. data/spec/extensions/constant_sql_override_spec.rb +0 -24
  175. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  176. data/spec/extensions/constraint_validations_spec.rb +0 -439
  177. data/spec/extensions/core_refinements_spec.rb +0 -528
  178. data/spec/extensions/csv_serializer_spec.rb +0 -183
  179. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  180. data/spec/extensions/dataset_associations_spec.rb +0 -365
  181. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  182. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  183. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  184. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  185. data/spec/extensions/defaults_setter_spec.rb +0 -150
  186. data/spec/extensions/delay_add_association_spec.rb +0 -73
  187. data/spec/extensions/dirty_spec.rb +0 -222
  188. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  189. data/spec/extensions/eager_each_spec.rb +0 -62
  190. data/spec/extensions/eager_graph_eager_spec.rb +0 -100
  191. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  192. data/spec/extensions/empty_failure_backtraces_spec.rb +0 -60
  193. data/spec/extensions/error_splitter_spec.rb +0 -18
  194. data/spec/extensions/error_sql_spec.rb +0 -20
  195. data/spec/extensions/escaped_like_spec.rb +0 -40
  196. data/spec/extensions/eval_inspect_spec.rb +0 -81
  197. data/spec/extensions/exclude_or_null_spec.rb +0 -15
  198. data/spec/extensions/finder_spec.rb +0 -260
  199. data/spec/extensions/force_encoding_spec.rb +0 -126
  200. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  201. data/spec/extensions/graph_each_spec.rb +0 -113
  202. data/spec/extensions/hook_class_methods_spec.rb +0 -402
  203. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  204. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  205. data/spec/extensions/index_caching_spec.rb +0 -66
  206. data/spec/extensions/inflector_spec.rb +0 -183
  207. data/spec/extensions/input_transformer_spec.rb +0 -69
  208. data/spec/extensions/insert_conflict_spec.rb +0 -103
  209. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  210. data/spec/extensions/instance_filters_spec.rb +0 -79
  211. data/spec/extensions/instance_hooks_spec.rb +0 -246
  212. data/spec/extensions/integer64_spec.rb +0 -22
  213. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  214. data/spec/extensions/json_serializer_spec.rb +0 -346
  215. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  216. data/spec/extensions/list_spec.rb +0 -291
  217. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  218. data/spec/extensions/many_through_many_spec.rb +0 -2177
  219. data/spec/extensions/migration_spec.rb +0 -864
  220. data/spec/extensions/modification_detection_spec.rb +0 -93
  221. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  222. data/spec/extensions/named_timezones_spec.rb +0 -218
  223. data/spec/extensions/nested_attributes_spec.rb +0 -815
  224. data/spec/extensions/null_dataset_spec.rb +0 -85
  225. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  226. data/spec/extensions/pagination_spec.rb +0 -116
  227. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  228. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  229. data/spec/extensions/pg_array_spec.rb +0 -398
  230. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -209
  231. data/spec/extensions/pg_enum_spec.rb +0 -118
  232. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  233. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  234. data/spec/extensions/pg_hstore_spec.rb +0 -219
  235. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  236. data/spec/extensions/pg_inet_spec.rb +0 -72
  237. data/spec/extensions/pg_interval_spec.rb +0 -103
  238. data/spec/extensions/pg_json_ops_spec.rb +0 -356
  239. data/spec/extensions/pg_json_spec.rb +0 -451
  240. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  241. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  242. data/spec/extensions/pg_range_spec.rb +0 -600
  243. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  244. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  245. data/spec/extensions/pg_row_spec.rb +0 -363
  246. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  247. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  248. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  249. data/spec/extensions/prepared_statements_spec.rb +0 -177
  250. data/spec/extensions/pretty_table_spec.rb +0 -123
  251. data/spec/extensions/query_spec.rb +0 -94
  252. data/spec/extensions/rcte_tree_spec.rb +0 -387
  253. data/spec/extensions/round_timestamps_spec.rb +0 -39
  254. data/spec/extensions/s_spec.rb +0 -60
  255. data/spec/extensions/schema_caching_spec.rb +0 -64
  256. data/spec/extensions/schema_dumper_spec.rb +0 -870
  257. data/spec/extensions/select_remove_spec.rb +0 -38
  258. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  259. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  260. data/spec/extensions/serialization_spec.rb +0 -365
  261. data/spec/extensions/server_block_spec.rb +0 -135
  262. data/spec/extensions/server_logging_spec.rb +0 -45
  263. data/spec/extensions/sharding_spec.rb +0 -197
  264. data/spec/extensions/shared_caching_spec.rb +0 -151
  265. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  266. data/spec/extensions/singular_table_names_spec.rb +0 -22
  267. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  268. data/spec/extensions/spec_helper.rb +0 -70
  269. data/spec/extensions/split_array_nil_spec.rb +0 -24
  270. data/spec/extensions/split_values_spec.rb +0 -57
  271. data/spec/extensions/sql_comments_spec.rb +0 -33
  272. data/spec/extensions/sql_expr_spec.rb +0 -59
  273. data/spec/extensions/static_cache_cache_spec.rb +0 -35
  274. data/spec/extensions/static_cache_spec.rb +0 -471
  275. data/spec/extensions/string_agg_spec.rb +0 -90
  276. data/spec/extensions/string_date_time_spec.rb +0 -95
  277. data/spec/extensions/string_stripper_spec.rb +0 -68
  278. data/spec/extensions/subclasses_spec.rb +0 -79
  279. data/spec/extensions/subset_conditions_spec.rb +0 -38
  280. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  281. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  282. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  283. data/spec/extensions/table_select_spec.rb +0 -83
  284. data/spec/extensions/tactical_eager_loading_spec.rb +0 -402
  285. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  286. data/spec/extensions/throw_failures_spec.rb +0 -74
  287. data/spec/extensions/timestamps_spec.rb +0 -209
  288. data/spec/extensions/to_dot_spec.rb +0 -153
  289. data/spec/extensions/touch_spec.rb +0 -226
  290. data/spec/extensions/tree_spec.rb +0 -334
  291. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  292. data/spec/extensions/unlimited_update_spec.rb +0 -21
  293. data/spec/extensions/update_or_create_spec.rb +0 -83
  294. data/spec/extensions/update_primary_key_spec.rb +0 -105
  295. data/spec/extensions/update_refresh_spec.rb +0 -59
  296. data/spec/extensions/uuid_spec.rb +0 -101
  297. data/spec/extensions/validate_associated_spec.rb +0 -52
  298. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  299. data/spec/extensions/validation_contexts_spec.rb +0 -31
  300. data/spec/extensions/validation_helpers_spec.rb +0 -525
  301. data/spec/extensions/whitelist_security_spec.rb +0 -157
  302. data/spec/extensions/xml_serializer_spec.rb +0 -213
  303. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  304. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  305. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  306. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  307. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  308. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  309. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  310. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  311. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  312. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  313. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  314. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  315. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  316. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  317. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  318. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  319. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  320. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  321. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  322. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  323. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  324. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  325. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  326. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  327. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  328. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  329. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  330. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  331. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  332. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  333. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  334. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  335. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  336. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  337. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  338. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  339. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  340. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  341. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  342. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  343. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  344. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  345. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  346. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  347. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  348. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  349. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  350. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  351. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  352. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  353. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  354. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  355. data/spec/guards_helper.rb +0 -59
  356. data/spec/integration/associations_test.rb +0 -2597
  357. data/spec/integration/database_test.rb +0 -113
  358. data/spec/integration/dataset_test.rb +0 -2037
  359. data/spec/integration/eager_loader_test.rb +0 -687
  360. data/spec/integration/migrator_test.rb +0 -262
  361. data/spec/integration/model_test.rb +0 -203
  362. data/spec/integration/plugin_test.rb +0 -2423
  363. data/spec/integration/prepared_statement_test.rb +0 -405
  364. data/spec/integration/schema_test.rb +0 -903
  365. data/spec/integration/spec_helper.rb +0 -71
  366. data/spec/integration/timezone_test.rb +0 -86
  367. data/spec/integration/transaction_test.rb +0 -603
  368. data/spec/integration/type_test.rb +0 -127
  369. data/spec/model/association_reflection_spec.rb +0 -803
  370. data/spec/model/associations_spec.rb +0 -4738
  371. data/spec/model/base_spec.rb +0 -875
  372. data/spec/model/class_dataset_methods_spec.rb +0 -146
  373. data/spec/model/dataset_methods_spec.rb +0 -198
  374. data/spec/model/eager_loading_spec.rb +0 -2377
  375. data/spec/model/hooks_spec.rb +0 -370
  376. data/spec/model/inflector_spec.rb +0 -26
  377. data/spec/model/model_spec.rb +0 -956
  378. data/spec/model/plugins_spec.rb +0 -429
  379. data/spec/model/record_spec.rb +0 -2118
  380. data/spec/model/spec_helper.rb +0 -46
  381. data/spec/model/validations_spec.rb +0 -220
  382. data/spec/model_no_assoc_spec.rb +0 -1
  383. data/spec/model_spec.rb +0 -1
  384. data/spec/plugin_spec.rb +0 -1
  385. data/spec/sequel_coverage.rb +0 -15
  386. data/spec/sequel_warning.rb +0 -5
  387. 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