sequel 5.28.0 → 5.33.0

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