sequel 4.36.0 → 5.61.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 (760) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +548 -5749
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +265 -159
  5. data/bin/sequel +34 -12
  6. data/doc/advanced_associations.rdoc +228 -187
  7. data/doc/association_basics.rdoc +281 -291
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +86 -51
  10. data/doc/code_order.rdoc +25 -19
  11. data/doc/core_extensions.rdoc +104 -63
  12. data/doc/dataset_basics.rdoc +12 -21
  13. data/doc/dataset_filtering.rdoc +99 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/fork_safety.rdoc +84 -0
  16. data/doc/mass_assignment.rdoc +74 -31
  17. data/doc/migration.rdoc +59 -51
  18. data/doc/model_dataset_method_design.rdoc +129 -0
  19. data/doc/model_hooks.rdoc +15 -25
  20. data/doc/model_plugins.rdoc +12 -12
  21. data/doc/mssql_stored_procedures.rdoc +3 -3
  22. data/doc/object_model.rdoc +58 -68
  23. data/doc/opening_databases.rdoc +85 -95
  24. data/doc/postgresql.rdoc +263 -38
  25. data/doc/prepared_statements.rdoc +29 -24
  26. data/doc/querying.rdoc +189 -167
  27. data/doc/reflection.rdoc +5 -6
  28. data/doc/release_notes/5.0.0.txt +159 -0
  29. data/doc/release_notes/5.1.0.txt +31 -0
  30. data/doc/release_notes/5.10.0.txt +84 -0
  31. data/doc/release_notes/5.11.0.txt +83 -0
  32. data/doc/release_notes/5.12.0.txt +141 -0
  33. data/doc/release_notes/5.13.0.txt +27 -0
  34. data/doc/release_notes/5.14.0.txt +63 -0
  35. data/doc/release_notes/5.15.0.txt +39 -0
  36. data/doc/release_notes/5.16.0.txt +110 -0
  37. data/doc/release_notes/5.17.0.txt +31 -0
  38. data/doc/release_notes/5.18.0.txt +69 -0
  39. data/doc/release_notes/5.19.0.txt +28 -0
  40. data/doc/release_notes/5.2.0.txt +33 -0
  41. data/doc/release_notes/5.20.0.txt +89 -0
  42. data/doc/release_notes/5.21.0.txt +87 -0
  43. data/doc/release_notes/5.22.0.txt +48 -0
  44. data/doc/release_notes/5.23.0.txt +56 -0
  45. data/doc/release_notes/5.24.0.txt +56 -0
  46. data/doc/release_notes/5.25.0.txt +32 -0
  47. data/doc/release_notes/5.26.0.txt +35 -0
  48. data/doc/release_notes/5.27.0.txt +21 -0
  49. data/doc/release_notes/5.28.0.txt +16 -0
  50. data/doc/release_notes/5.29.0.txt +22 -0
  51. data/doc/release_notes/5.3.0.txt +121 -0
  52. data/doc/release_notes/5.30.0.txt +20 -0
  53. data/doc/release_notes/5.31.0.txt +148 -0
  54. data/doc/release_notes/5.32.0.txt +46 -0
  55. data/doc/release_notes/5.33.0.txt +24 -0
  56. data/doc/release_notes/5.34.0.txt +40 -0
  57. data/doc/release_notes/5.35.0.txt +56 -0
  58. data/doc/release_notes/5.36.0.txt +60 -0
  59. data/doc/release_notes/5.37.0.txt +30 -0
  60. data/doc/release_notes/5.38.0.txt +28 -0
  61. data/doc/release_notes/5.39.0.txt +19 -0
  62. data/doc/release_notes/5.4.0.txt +80 -0
  63. data/doc/release_notes/5.40.0.txt +40 -0
  64. data/doc/release_notes/5.41.0.txt +25 -0
  65. data/doc/release_notes/5.42.0.txt +136 -0
  66. data/doc/release_notes/5.43.0.txt +98 -0
  67. data/doc/release_notes/5.44.0.txt +32 -0
  68. data/doc/release_notes/5.45.0.txt +34 -0
  69. data/doc/release_notes/5.46.0.txt +87 -0
  70. data/doc/release_notes/5.47.0.txt +59 -0
  71. data/doc/release_notes/5.48.0.txt +14 -0
  72. data/doc/release_notes/5.49.0.txt +59 -0
  73. data/doc/release_notes/5.5.0.txt +61 -0
  74. data/doc/release_notes/5.50.0.txt +78 -0
  75. data/doc/release_notes/5.51.0.txt +47 -0
  76. data/doc/release_notes/5.52.0.txt +87 -0
  77. data/doc/release_notes/5.53.0.txt +23 -0
  78. data/doc/release_notes/5.54.0.txt +27 -0
  79. data/doc/release_notes/5.55.0.txt +21 -0
  80. data/doc/release_notes/5.56.0.txt +51 -0
  81. data/doc/release_notes/5.57.0.txt +23 -0
  82. data/doc/release_notes/5.58.0.txt +31 -0
  83. data/doc/release_notes/5.59.0.txt +73 -0
  84. data/doc/release_notes/5.6.0.txt +31 -0
  85. data/doc/release_notes/5.60.0.txt +22 -0
  86. data/doc/release_notes/5.61.0.txt +43 -0
  87. data/doc/release_notes/5.7.0.txt +108 -0
  88. data/doc/release_notes/5.8.0.txt +170 -0
  89. data/doc/release_notes/5.9.0.txt +99 -0
  90. data/doc/schema_modification.rdoc +95 -75
  91. data/doc/security.rdoc +109 -80
  92. data/doc/sharding.rdoc +74 -47
  93. data/doc/sql.rdoc +147 -122
  94. data/doc/testing.rdoc +43 -20
  95. data/doc/thread_safety.rdoc +2 -4
  96. data/doc/transactions.rdoc +97 -18
  97. data/doc/validations.rdoc +52 -50
  98. data/doc/virtual_rows.rdoc +90 -109
  99. data/lib/sequel/adapters/ado/access.rb +15 -17
  100. data/lib/sequel/adapters/ado/mssql.rb +6 -15
  101. data/lib/sequel/adapters/ado.rb +150 -20
  102. data/lib/sequel/adapters/amalgalite.rb +11 -23
  103. data/lib/sequel/adapters/ibmdb.rb +47 -55
  104. data/lib/sequel/adapters/jdbc/db2.rb +29 -39
  105. data/lib/sequel/adapters/jdbc/derby.rb +58 -54
  106. data/lib/sequel/adapters/jdbc/h2.rb +93 -35
  107. data/lib/sequel/adapters/jdbc/hsqldb.rb +24 -31
  108. data/lib/sequel/adapters/jdbc/jtds.rb +2 -10
  109. data/lib/sequel/adapters/jdbc/mssql.rb +3 -11
  110. data/lib/sequel/adapters/jdbc/mysql.rb +17 -20
  111. data/lib/sequel/adapters/jdbc/oracle.rb +22 -18
  112. data/lib/sequel/adapters/jdbc/postgresql.rb +69 -71
  113. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +11 -23
  114. data/lib/sequel/adapters/jdbc/sqlite.rb +47 -11
  115. data/lib/sequel/adapters/jdbc/sqlserver.rb +34 -9
  116. data/lib/sequel/adapters/jdbc/transactions.rb +22 -38
  117. data/lib/sequel/adapters/jdbc.rb +145 -130
  118. data/lib/sequel/adapters/mock.rb +100 -111
  119. data/lib/sequel/adapters/mysql.rb +114 -122
  120. data/lib/sequel/adapters/mysql2.rb +147 -63
  121. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  122. data/lib/sequel/adapters/odbc/mssql.rb +8 -14
  123. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  124. data/lib/sequel/adapters/odbc.rb +20 -25
  125. data/lib/sequel/adapters/oracle.rb +50 -56
  126. data/lib/sequel/adapters/postgres.rb +305 -327
  127. data/lib/sequel/adapters/postgresql.rb +1 -1
  128. data/lib/sequel/adapters/shared/access.rb +74 -78
  129. data/lib/sequel/adapters/shared/db2.rb +118 -71
  130. data/lib/sequel/adapters/shared/mssql.rb +301 -220
  131. data/lib/sequel/adapters/shared/mysql.rb +299 -217
  132. data/lib/sequel/adapters/shared/oracle.rb +226 -65
  133. data/lib/sequel/adapters/shared/postgres.rb +935 -395
  134. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -126
  135. data/lib/sequel/adapters/shared/sqlite.rb +447 -173
  136. data/lib/sequel/adapters/sqlanywhere.rb +48 -35
  137. data/lib/sequel/adapters/sqlite.rb +156 -111
  138. data/lib/sequel/adapters/tinytds.rb +30 -38
  139. data/lib/sequel/adapters/utils/columns_limit_1.rb +22 -0
  140. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +3 -6
  141. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +2 -2
  142. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  143. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  144. data/lib/sequel/adapters/utils/replace.rb +1 -4
  145. data/lib/sequel/adapters/utils/stored_procedures.rb +7 -22
  146. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  147. data/lib/sequel/ast_transformer.rb +17 -89
  148. data/lib/sequel/connection_pool/sharded_single.rb +18 -15
  149. data/lib/sequel/connection_pool/sharded_threaded.rb +130 -111
  150. data/lib/sequel/connection_pool/single.rb +18 -13
  151. data/lib/sequel/connection_pool/threaded.rb +121 -120
  152. data/lib/sequel/connection_pool.rb +48 -29
  153. data/lib/sequel/core.rb +351 -301
  154. data/lib/sequel/database/connecting.rb +69 -57
  155. data/lib/sequel/database/dataset.rb +13 -5
  156. data/lib/sequel/database/dataset_defaults.rb +18 -102
  157. data/lib/sequel/database/features.rb +18 -4
  158. data/lib/sequel/database/logging.rb +12 -11
  159. data/lib/sequel/database/misc.rb +180 -122
  160. data/lib/sequel/database/query.rb +47 -27
  161. data/lib/sequel/database/schema_generator.rb +178 -84
  162. data/lib/sequel/database/schema_methods.rb +172 -97
  163. data/lib/sequel/database/transactions.rb +205 -44
  164. data/lib/sequel/database.rb +17 -2
  165. data/lib/sequel/dataset/actions.rb +339 -155
  166. data/lib/sequel/dataset/dataset_module.rb +46 -0
  167. data/lib/sequel/dataset/features.rb +90 -35
  168. data/lib/sequel/dataset/graph.rb +80 -58
  169. data/lib/sequel/dataset/misc.rb +137 -47
  170. data/lib/sequel/dataset/placeholder_literalizer.rb +63 -25
  171. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  172. data/lib/sequel/dataset/query.rb +530 -222
  173. data/lib/sequel/dataset/sql.rb +590 -368
  174. data/lib/sequel/dataset.rb +26 -16
  175. data/lib/sequel/deprecated.rb +12 -2
  176. data/lib/sequel/exceptions.rb +46 -16
  177. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  178. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  179. data/lib/sequel/extensions/_pretty_table.rb +2 -5
  180. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  181. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  182. data/lib/sequel/extensions/async_thread_pool.rb +438 -0
  183. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  184. data/lib/sequel/extensions/blank.rb +8 -0
  185. data/lib/sequel/extensions/caller_logging.rb +79 -0
  186. data/lib/sequel/extensions/columns_introspection.rb +4 -3
  187. data/lib/sequel/extensions/connection_expiration.rb +20 -10
  188. data/lib/sequel/extensions/connection_validator.rb +11 -10
  189. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  190. data/lib/sequel/extensions/constraint_validations.rb +62 -39
  191. data/lib/sequel/extensions/core_extensions.rb +42 -48
  192. data/lib/sequel/extensions/core_refinements.rb +80 -59
  193. data/lib/sequel/extensions/current_datetime_timestamp.rb +1 -4
  194. data/lib/sequel/extensions/date_arithmetic.rb +98 -39
  195. data/lib/sequel/extensions/date_parse_input_handler.rb +67 -0
  196. data/lib/sequel/extensions/datetime_parse_to_time.rb +41 -0
  197. data/lib/sequel/extensions/duplicate_columns_handler.rb +21 -14
  198. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  199. data/lib/sequel/extensions/escaped_like.rb +100 -0
  200. data/lib/sequel/extensions/eval_inspect.rb +12 -15
  201. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  202. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  203. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  204. data/lib/sequel/extensions/from_block.rb +1 -34
  205. data/lib/sequel/extensions/graph_each.rb +4 -4
  206. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  207. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  208. data/lib/sequel/extensions/index_caching.rb +109 -0
  209. data/lib/sequel/extensions/inflector.rb +13 -5
  210. data/lib/sequel/extensions/integer64.rb +32 -0
  211. data/lib/sequel/extensions/is_distinct_from.rb +141 -0
  212. data/lib/sequel/extensions/looser_typecasting.rb +17 -8
  213. data/lib/sequel/extensions/migration.rb +119 -78
  214. data/lib/sequel/extensions/named_timezones.rb +88 -23
  215. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -82
  216. data/lib/sequel/extensions/null_dataset.rb +8 -8
  217. data/lib/sequel/extensions/pagination.rb +32 -29
  218. data/lib/sequel/extensions/pg_array.rb +221 -287
  219. data/lib/sequel/extensions/pg_array_ops.rb +17 -9
  220. data/lib/sequel/extensions/pg_enum.rb +63 -23
  221. data/lib/sequel/extensions/pg_extended_date_support.rb +241 -0
  222. data/lib/sequel/extensions/pg_hstore.rb +45 -54
  223. data/lib/sequel/extensions/pg_hstore_ops.rb +58 -6
  224. data/lib/sequel/extensions/pg_inet.rb +31 -12
  225. data/lib/sequel/extensions/pg_inet_ops.rb +2 -2
  226. data/lib/sequel/extensions/pg_interval.rb +56 -29
  227. data/lib/sequel/extensions/pg_json.rb +417 -140
  228. data/lib/sequel/extensions/pg_json_ops.rb +270 -18
  229. data/lib/sequel/extensions/pg_loose_count.rb +4 -2
  230. data/lib/sequel/extensions/pg_multirange.rb +372 -0
  231. data/lib/sequel/extensions/pg_range.rb +131 -191
  232. data/lib/sequel/extensions/pg_range_ops.rb +42 -13
  233. data/lib/sequel/extensions/pg_row.rb +48 -81
  234. data/lib/sequel/extensions/pg_row_ops.rb +33 -14
  235. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  236. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  237. data/lib/sequel/extensions/query.rb +9 -7
  238. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  239. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  240. data/lib/sequel/extensions/s.rb +60 -0
  241. data/lib/sequel/extensions/schema_caching.rb +10 -1
  242. data/lib/sequel/extensions/schema_dumper.rb +71 -48
  243. data/lib/sequel/extensions/select_remove.rb +4 -4
  244. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  245. data/lib/sequel/extensions/server_block.rb +51 -27
  246. data/lib/sequel/extensions/split_array_nil.rb +4 -4
  247. data/lib/sequel/extensions/sql_comments.rb +119 -7
  248. data/lib/sequel/extensions/sql_expr.rb +2 -1
  249. data/lib/sequel/extensions/sql_log_normalizer.rb +108 -0
  250. data/lib/sequel/extensions/sqlite_json_ops.rb +255 -0
  251. data/lib/sequel/extensions/string_agg.rb +11 -8
  252. data/lib/sequel/extensions/string_date_time.rb +19 -23
  253. data/lib/sequel/extensions/symbol_aref.rb +55 -0
  254. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  255. data/lib/sequel/extensions/symbol_as.rb +23 -0
  256. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  257. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  258. data/lib/sequel/extensions/to_dot.rb +10 -4
  259. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  260. data/lib/sequel/model/associations.rb +1006 -284
  261. data/lib/sequel/model/base.rb +560 -805
  262. data/lib/sequel/model/dataset_module.rb +11 -10
  263. data/lib/sequel/model/default_inflections.rb +1 -1
  264. data/lib/sequel/model/errors.rb +10 -3
  265. data/lib/sequel/model/exceptions.rb +8 -10
  266. data/lib/sequel/model/inflections.rb +7 -20
  267. data/lib/sequel/model/plugins.rb +114 -0
  268. data/lib/sequel/model.rb +32 -82
  269. data/lib/sequel/plugins/active_model.rb +30 -14
  270. data/lib/sequel/plugins/after_initialize.rb +1 -1
  271. data/lib/sequel/plugins/association_dependencies.rb +25 -18
  272. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  273. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  274. data/lib/sequel/plugins/association_pks.rb +147 -70
  275. data/lib/sequel/plugins/association_proxies.rb +33 -9
  276. data/lib/sequel/plugins/async_thread_pool.rb +39 -0
  277. data/lib/sequel/plugins/auto_restrict_eager_graph.rb +62 -0
  278. data/lib/sequel/plugins/auto_validations.rb +95 -28
  279. data/lib/sequel/plugins/auto_validations_constraint_validations_presence_message.rb +68 -0
  280. data/lib/sequel/plugins/before_after_save.rb +0 -42
  281. data/lib/sequel/plugins/blacklist_security.rb +21 -12
  282. data/lib/sequel/plugins/boolean_readers.rb +5 -5
  283. data/lib/sequel/plugins/boolean_subsets.rb +13 -8
  284. data/lib/sequel/plugins/caching.rb +25 -16
  285. data/lib/sequel/plugins/class_table_inheritance.rb +179 -100
  286. data/lib/sequel/plugins/column_conflicts.rb +16 -3
  287. data/lib/sequel/plugins/column_encryption.rb +728 -0
  288. data/lib/sequel/plugins/column_select.rb +7 -5
  289. data/lib/sequel/plugins/columns_updated.rb +42 -0
  290. data/lib/sequel/plugins/composition.rb +42 -26
  291. data/lib/sequel/plugins/concurrent_eager_loading.rb +174 -0
  292. data/lib/sequel/plugins/constraint_validations.rb +20 -14
  293. data/lib/sequel/plugins/csv_serializer.rb +56 -35
  294. data/lib/sequel/plugins/dataset_associations.rb +40 -17
  295. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  296. data/lib/sequel/plugins/defaults_setter.rb +65 -10
  297. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  298. data/lib/sequel/plugins/dirty.rb +62 -24
  299. data/lib/sequel/plugins/eager_each.rb +3 -3
  300. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  301. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  302. data/lib/sequel/plugins/enum.rb +124 -0
  303. data/lib/sequel/plugins/error_splitter.rb +17 -12
  304. data/lib/sequel/plugins/finder.rb +246 -0
  305. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  306. data/lib/sequel/plugins/force_encoding.rb +7 -12
  307. data/lib/sequel/plugins/hook_class_methods.rb +37 -54
  308. data/lib/sequel/plugins/input_transformer.rb +18 -10
  309. data/lib/sequel/plugins/insert_conflict.rb +76 -0
  310. data/lib/sequel/plugins/insert_returning_select.rb +2 -2
  311. data/lib/sequel/plugins/instance_filters.rb +10 -8
  312. data/lib/sequel/plugins/instance_hooks.rb +34 -17
  313. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  314. data/lib/sequel/plugins/inverted_subsets.rb +22 -13
  315. data/lib/sequel/plugins/json_serializer.rb +124 -64
  316. data/lib/sequel/plugins/lazy_attributes.rb +21 -14
  317. data/lib/sequel/plugins/list.rb +35 -21
  318. data/lib/sequel/plugins/many_through_many.rb +134 -21
  319. data/lib/sequel/plugins/modification_detection.rb +15 -5
  320. data/lib/sequel/plugins/mssql_optimistic_locking.rb +6 -5
  321. data/lib/sequel/plugins/nested_attributes.rb +61 -31
  322. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  323. data/lib/sequel/plugins/pg_array_associations.rb +103 -53
  324. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +350 -0
  325. data/lib/sequel/plugins/pg_row.rb +5 -51
  326. data/lib/sequel/plugins/prepared_statements.rb +60 -72
  327. data/lib/sequel/plugins/prepared_statements_safe.rb +9 -4
  328. data/lib/sequel/plugins/rcte_tree.rb +68 -82
  329. data/lib/sequel/plugins/require_valid_schema.rb +67 -0
  330. data/lib/sequel/plugins/serialization.rb +43 -46
  331. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -2
  332. data/lib/sequel/plugins/sharding.rb +15 -10
  333. data/lib/sequel/plugins/single_table_inheritance.rb +67 -28
  334. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  335. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  336. data/lib/sequel/plugins/split_values.rb +11 -6
  337. data/lib/sequel/plugins/sql_comments.rb +189 -0
  338. data/lib/sequel/plugins/static_cache.rb +77 -53
  339. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  340. data/lib/sequel/plugins/string_stripper.rb +3 -3
  341. data/lib/sequel/plugins/subclasses.rb +43 -10
  342. data/lib/sequel/plugins/subset_conditions.rb +15 -5
  343. data/lib/sequel/plugins/table_select.rb +2 -2
  344. data/lib/sequel/plugins/tactical_eager_loading.rb +96 -12
  345. data/lib/sequel/plugins/throw_failures.rb +110 -0
  346. data/lib/sequel/plugins/timestamps.rb +20 -8
  347. data/lib/sequel/plugins/touch.rb +19 -8
  348. data/lib/sequel/plugins/tree.rb +62 -32
  349. data/lib/sequel/plugins/typecast_on_load.rb +12 -4
  350. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  351. data/lib/sequel/plugins/unused_associations.rb +521 -0
  352. data/lib/sequel/plugins/update_or_create.rb +4 -4
  353. data/lib/sequel/plugins/update_primary_key.rb +1 -1
  354. data/lib/sequel/plugins/update_refresh.rb +26 -15
  355. data/lib/sequel/plugins/uuid.rb +7 -11
  356. data/lib/sequel/plugins/validate_associated.rb +18 -0
  357. data/lib/sequel/plugins/validation_class_methods.rb +38 -19
  358. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  359. data/lib/sequel/plugins/validation_helpers.rb +57 -41
  360. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  361. data/lib/sequel/plugins/xml_serializer.rb +30 -31
  362. data/lib/sequel/sql.rb +471 -331
  363. data/lib/sequel/timezones.rb +78 -47
  364. data/lib/sequel/version.rb +7 -2
  365. data/lib/sequel.rb +1 -1
  366. metadata +217 -521
  367. data/Rakefile +0 -164
  368. data/doc/active_record.rdoc +0 -928
  369. data/doc/release_notes/1.0.txt +0 -38
  370. data/doc/release_notes/1.1.txt +0 -143
  371. data/doc/release_notes/1.3.txt +0 -101
  372. data/doc/release_notes/1.4.0.txt +0 -53
  373. data/doc/release_notes/1.5.0.txt +0 -155
  374. data/doc/release_notes/2.0.0.txt +0 -298
  375. data/doc/release_notes/2.1.0.txt +0 -271
  376. data/doc/release_notes/2.10.0.txt +0 -328
  377. data/doc/release_notes/2.11.0.txt +0 -215
  378. data/doc/release_notes/2.12.0.txt +0 -534
  379. data/doc/release_notes/2.2.0.txt +0 -253
  380. data/doc/release_notes/2.3.0.txt +0 -88
  381. data/doc/release_notes/2.4.0.txt +0 -106
  382. data/doc/release_notes/2.5.0.txt +0 -137
  383. data/doc/release_notes/2.6.0.txt +0 -157
  384. data/doc/release_notes/2.7.0.txt +0 -166
  385. data/doc/release_notes/2.8.0.txt +0 -171
  386. data/doc/release_notes/2.9.0.txt +0 -97
  387. data/doc/release_notes/3.0.0.txt +0 -221
  388. data/doc/release_notes/3.1.0.txt +0 -406
  389. data/doc/release_notes/3.10.0.txt +0 -286
  390. data/doc/release_notes/3.11.0.txt +0 -254
  391. data/doc/release_notes/3.12.0.txt +0 -304
  392. data/doc/release_notes/3.13.0.txt +0 -210
  393. data/doc/release_notes/3.14.0.txt +0 -118
  394. data/doc/release_notes/3.15.0.txt +0 -78
  395. data/doc/release_notes/3.16.0.txt +0 -45
  396. data/doc/release_notes/3.17.0.txt +0 -58
  397. data/doc/release_notes/3.18.0.txt +0 -120
  398. data/doc/release_notes/3.19.0.txt +0 -67
  399. data/doc/release_notes/3.2.0.txt +0 -268
  400. data/doc/release_notes/3.20.0.txt +0 -41
  401. data/doc/release_notes/3.21.0.txt +0 -87
  402. data/doc/release_notes/3.22.0.txt +0 -39
  403. data/doc/release_notes/3.23.0.txt +0 -172
  404. data/doc/release_notes/3.24.0.txt +0 -420
  405. data/doc/release_notes/3.25.0.txt +0 -88
  406. data/doc/release_notes/3.26.0.txt +0 -88
  407. data/doc/release_notes/3.27.0.txt +0 -82
  408. data/doc/release_notes/3.28.0.txt +0 -304
  409. data/doc/release_notes/3.29.0.txt +0 -459
  410. data/doc/release_notes/3.3.0.txt +0 -192
  411. data/doc/release_notes/3.30.0.txt +0 -135
  412. data/doc/release_notes/3.31.0.txt +0 -146
  413. data/doc/release_notes/3.32.0.txt +0 -202
  414. data/doc/release_notes/3.33.0.txt +0 -157
  415. data/doc/release_notes/3.34.0.txt +0 -671
  416. data/doc/release_notes/3.35.0.txt +0 -144
  417. data/doc/release_notes/3.36.0.txt +0 -245
  418. data/doc/release_notes/3.37.0.txt +0 -338
  419. data/doc/release_notes/3.38.0.txt +0 -234
  420. data/doc/release_notes/3.39.0.txt +0 -237
  421. data/doc/release_notes/3.4.0.txt +0 -325
  422. data/doc/release_notes/3.40.0.txt +0 -73
  423. data/doc/release_notes/3.41.0.txt +0 -155
  424. data/doc/release_notes/3.42.0.txt +0 -74
  425. data/doc/release_notes/3.43.0.txt +0 -105
  426. data/doc/release_notes/3.44.0.txt +0 -152
  427. data/doc/release_notes/3.45.0.txt +0 -179
  428. data/doc/release_notes/3.46.0.txt +0 -122
  429. data/doc/release_notes/3.47.0.txt +0 -270
  430. data/doc/release_notes/3.48.0.txt +0 -477
  431. data/doc/release_notes/3.5.0.txt +0 -510
  432. data/doc/release_notes/3.6.0.txt +0 -366
  433. data/doc/release_notes/3.7.0.txt +0 -179
  434. data/doc/release_notes/3.8.0.txt +0 -151
  435. data/doc/release_notes/3.9.0.txt +0 -233
  436. data/doc/release_notes/4.0.0.txt +0 -262
  437. data/doc/release_notes/4.1.0.txt +0 -85
  438. data/doc/release_notes/4.10.0.txt +0 -226
  439. data/doc/release_notes/4.11.0.txt +0 -147
  440. data/doc/release_notes/4.12.0.txt +0 -105
  441. data/doc/release_notes/4.13.0.txt +0 -169
  442. data/doc/release_notes/4.14.0.txt +0 -68
  443. data/doc/release_notes/4.15.0.txt +0 -56
  444. data/doc/release_notes/4.16.0.txt +0 -36
  445. data/doc/release_notes/4.17.0.txt +0 -38
  446. data/doc/release_notes/4.18.0.txt +0 -36
  447. data/doc/release_notes/4.19.0.txt +0 -45
  448. data/doc/release_notes/4.2.0.txt +0 -129
  449. data/doc/release_notes/4.20.0.txt +0 -79
  450. data/doc/release_notes/4.21.0.txt +0 -94
  451. data/doc/release_notes/4.22.0.txt +0 -72
  452. data/doc/release_notes/4.23.0.txt +0 -65
  453. data/doc/release_notes/4.24.0.txt +0 -99
  454. data/doc/release_notes/4.25.0.txt +0 -181
  455. data/doc/release_notes/4.26.0.txt +0 -44
  456. data/doc/release_notes/4.27.0.txt +0 -78
  457. data/doc/release_notes/4.28.0.txt +0 -57
  458. data/doc/release_notes/4.29.0.txt +0 -41
  459. data/doc/release_notes/4.3.0.txt +0 -40
  460. data/doc/release_notes/4.30.0.txt +0 -37
  461. data/doc/release_notes/4.31.0.txt +0 -57
  462. data/doc/release_notes/4.32.0.txt +0 -132
  463. data/doc/release_notes/4.33.0.txt +0 -88
  464. data/doc/release_notes/4.34.0.txt +0 -86
  465. data/doc/release_notes/4.35.0.txt +0 -130
  466. data/doc/release_notes/4.36.0.txt +0 -116
  467. data/doc/release_notes/4.4.0.txt +0 -92
  468. data/doc/release_notes/4.5.0.txt +0 -34
  469. data/doc/release_notes/4.6.0.txt +0 -30
  470. data/doc/release_notes/4.7.0.txt +0 -103
  471. data/doc/release_notes/4.8.0.txt +0 -175
  472. data/doc/release_notes/4.9.0.txt +0 -190
  473. data/lib/sequel/adapters/cubrid.rb +0 -144
  474. data/lib/sequel/adapters/do/mysql.rb +0 -66
  475. data/lib/sequel/adapters/do/postgres.rb +0 -44
  476. data/lib/sequel/adapters/do/sqlite3.rb +0 -42
  477. data/lib/sequel/adapters/do.rb +0 -158
  478. data/lib/sequel/adapters/jdbc/as400.rb +0 -84
  479. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -64
  480. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -36
  481. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -33
  482. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -33
  483. data/lib/sequel/adapters/odbc/progress.rb +0 -10
  484. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  485. data/lib/sequel/adapters/shared/firebird.rb +0 -247
  486. data/lib/sequel/adapters/shared/informix.rb +0 -54
  487. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -152
  488. data/lib/sequel/adapters/shared/progress.rb +0 -40
  489. data/lib/sequel/adapters/swift/mysql.rb +0 -49
  490. data/lib/sequel/adapters/swift/postgres.rb +0 -47
  491. data/lib/sequel/adapters/swift/sqlite.rb +0 -49
  492. data/lib/sequel/adapters/swift.rb +0 -160
  493. data/lib/sequel/adapters/utils/pg_types.rb +0 -70
  494. data/lib/sequel/dataset/mutation.rb +0 -111
  495. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -5
  496. data/lib/sequel/extensions/filter_having.rb +0 -63
  497. data/lib/sequel/extensions/hash_aliases.rb +0 -49
  498. data/lib/sequel/extensions/meta_def.rb +0 -35
  499. data/lib/sequel/extensions/query_literals.rb +0 -84
  500. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -24
  501. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -122
  502. data/lib/sequel/extensions/set_overrides.rb +0 -76
  503. data/lib/sequel/no_core_ext.rb +0 -3
  504. data/lib/sequel/plugins/association_autoreloading.rb +0 -9
  505. data/lib/sequel/plugins/identifier_columns.rb +0 -47
  506. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -9
  507. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -81
  508. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -119
  509. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -61
  510. data/lib/sequel/plugins/schema.rb +0 -82
  511. data/lib/sequel/plugins/scissors.rb +0 -35
  512. data/spec/adapter_spec.rb +0 -4
  513. data/spec/adapters/db2_spec.rb +0 -160
  514. data/spec/adapters/firebird_spec.rb +0 -411
  515. data/spec/adapters/informix_spec.rb +0 -100
  516. data/spec/adapters/mssql_spec.rb +0 -733
  517. data/spec/adapters/mysql_spec.rb +0 -1319
  518. data/spec/adapters/oracle_spec.rb +0 -313
  519. data/spec/adapters/postgres_spec.rb +0 -3790
  520. data/spec/adapters/spec_helper.rb +0 -49
  521. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  522. data/spec/adapters/sqlite_spec.rb +0 -688
  523. data/spec/bin_spec.rb +0 -258
  524. data/spec/core/connection_pool_spec.rb +0 -1045
  525. data/spec/core/database_spec.rb +0 -2636
  526. data/spec/core/dataset_spec.rb +0 -5175
  527. data/spec/core/deprecated_spec.rb +0 -70
  528. data/spec/core/expression_filters_spec.rb +0 -1247
  529. data/spec/core/mock_adapter_spec.rb +0 -464
  530. data/spec/core/object_graph_spec.rb +0 -303
  531. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  532. data/spec/core/schema_generator_spec.rb +0 -203
  533. data/spec/core/schema_spec.rb +0 -1676
  534. data/spec/core/spec_helper.rb +0 -34
  535. data/spec/core/version_spec.rb +0 -7
  536. data/spec/core_extensions_spec.rb +0 -699
  537. data/spec/core_model_spec.rb +0 -2
  538. data/spec/core_spec.rb +0 -1
  539. data/spec/extensions/accessed_columns_spec.rb +0 -51
  540. data/spec/extensions/active_model_spec.rb +0 -85
  541. data/spec/extensions/after_initialize_spec.rb +0 -24
  542. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  543. data/spec/extensions/association_dependencies_spec.rb +0 -117
  544. data/spec/extensions/association_pks_spec.rb +0 -405
  545. data/spec/extensions/association_proxies_spec.rb +0 -86
  546. data/spec/extensions/auto_validations_spec.rb +0 -192
  547. data/spec/extensions/before_after_save_spec.rb +0 -40
  548. data/spec/extensions/blacklist_security_spec.rb +0 -88
  549. data/spec/extensions/blank_spec.rb +0 -69
  550. data/spec/extensions/boolean_readers_spec.rb +0 -93
  551. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  552. data/spec/extensions/caching_spec.rb +0 -270
  553. data/spec/extensions/class_table_inheritance_spec.rb +0 -444
  554. data/spec/extensions/column_conflicts_spec.rb +0 -60
  555. data/spec/extensions/column_select_spec.rb +0 -108
  556. data/spec/extensions/columns_introspection_spec.rb +0 -91
  557. data/spec/extensions/composition_spec.rb +0 -242
  558. data/spec/extensions/connection_expiration_spec.rb +0 -121
  559. data/spec/extensions/connection_validator_spec.rb +0 -127
  560. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -288
  561. data/spec/extensions/constraint_validations_spec.rb +0 -389
  562. data/spec/extensions/core_refinements_spec.rb +0 -519
  563. data/spec/extensions/csv_serializer_spec.rb +0 -180
  564. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  565. data/spec/extensions/dataset_associations_spec.rb +0 -343
  566. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  567. data/spec/extensions/date_arithmetic_spec.rb +0 -167
  568. data/spec/extensions/defaults_setter_spec.rb +0 -102
  569. data/spec/extensions/delay_add_association_spec.rb +0 -74
  570. data/spec/extensions/dirty_spec.rb +0 -180
  571. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -110
  572. data/spec/extensions/eager_each_spec.rb +0 -66
  573. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  574. data/spec/extensions/error_splitter_spec.rb +0 -18
  575. data/spec/extensions/error_sql_spec.rb +0 -20
  576. data/spec/extensions/eval_inspect_spec.rb +0 -73
  577. data/spec/extensions/filter_having_spec.rb +0 -40
  578. data/spec/extensions/force_encoding_spec.rb +0 -114
  579. data/spec/extensions/from_block_spec.rb +0 -21
  580. data/spec/extensions/graph_each_spec.rb +0 -119
  581. data/spec/extensions/hash_aliases_spec.rb +0 -24
  582. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  583. data/spec/extensions/identifier_columns_spec.rb +0 -17
  584. data/spec/extensions/inflector_spec.rb +0 -183
  585. data/spec/extensions/input_transformer_spec.rb +0 -54
  586. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  587. data/spec/extensions/instance_filters_spec.rb +0 -79
  588. data/spec/extensions/instance_hooks_spec.rb +0 -276
  589. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  590. data/spec/extensions/json_serializer_spec.rb +0 -304
  591. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  592. data/spec/extensions/list_spec.rb +0 -278
  593. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  594. data/spec/extensions/many_through_many_spec.rb +0 -2172
  595. data/spec/extensions/meta_def_spec.rb +0 -21
  596. data/spec/extensions/migration_spec.rb +0 -728
  597. data/spec/extensions/modification_detection_spec.rb +0 -80
  598. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  599. data/spec/extensions/named_timezones_spec.rb +0 -108
  600. data/spec/extensions/nested_attributes_spec.rb +0 -697
  601. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -65
  602. data/spec/extensions/null_dataset_spec.rb +0 -85
  603. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  604. data/spec/extensions/pagination_spec.rb +0 -118
  605. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  606. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  607. data/spec/extensions/pg_array_spec.rb +0 -390
  608. data/spec/extensions/pg_enum_spec.rb +0 -92
  609. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  610. data/spec/extensions/pg_hstore_spec.rb +0 -206
  611. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  612. data/spec/extensions/pg_inet_spec.rb +0 -52
  613. data/spec/extensions/pg_interval_spec.rb +0 -76
  614. data/spec/extensions/pg_json_ops_spec.rb +0 -275
  615. data/spec/extensions/pg_json_spec.rb +0 -218
  616. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  617. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  618. data/spec/extensions/pg_range_spec.rb +0 -473
  619. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  620. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  621. data/spec/extensions/pg_row_spec.rb +0 -360
  622. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  623. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  624. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  625. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  626. data/spec/extensions/prepared_statements_spec.rb +0 -103
  627. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  628. data/spec/extensions/pretty_table_spec.rb +0 -92
  629. data/spec/extensions/query_literals_spec.rb +0 -183
  630. data/spec/extensions/query_spec.rb +0 -102
  631. data/spec/extensions/rcte_tree_spec.rb +0 -392
  632. data/spec/extensions/round_timestamps_spec.rb +0 -43
  633. data/spec/extensions/schema_caching_spec.rb +0 -41
  634. data/spec/extensions/schema_dumper_spec.rb +0 -814
  635. data/spec/extensions/schema_spec.rb +0 -117
  636. data/spec/extensions/scissors_spec.rb +0 -26
  637. data/spec/extensions/select_remove_spec.rb +0 -38
  638. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  639. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  640. data/spec/extensions/serialization_spec.rb +0 -362
  641. data/spec/extensions/server_block_spec.rb +0 -90
  642. data/spec/extensions/server_logging_spec.rb +0 -45
  643. data/spec/extensions/set_overrides_spec.rb +0 -61
  644. data/spec/extensions/sharding_spec.rb +0 -198
  645. data/spec/extensions/shared_caching_spec.rb +0 -175
  646. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  647. data/spec/extensions/singular_table_names_spec.rb +0 -22
  648. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  649. data/spec/extensions/spec_helper.rb +0 -71
  650. data/spec/extensions/split_array_nil_spec.rb +0 -24
  651. data/spec/extensions/split_values_spec.rb +0 -22
  652. data/spec/extensions/sql_comments_spec.rb +0 -27
  653. data/spec/extensions/sql_expr_spec.rb +0 -60
  654. data/spec/extensions/static_cache_spec.rb +0 -361
  655. data/spec/extensions/string_agg_spec.rb +0 -85
  656. data/spec/extensions/string_date_time_spec.rb +0 -95
  657. data/spec/extensions/string_stripper_spec.rb +0 -68
  658. data/spec/extensions/subclasses_spec.rb +0 -66
  659. data/spec/extensions/subset_conditions_spec.rb +0 -38
  660. data/spec/extensions/table_select_spec.rb +0 -71
  661. data/spec/extensions/tactical_eager_loading_spec.rb +0 -136
  662. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  663. data/spec/extensions/timestamps_spec.rb +0 -175
  664. data/spec/extensions/to_dot_spec.rb +0 -154
  665. data/spec/extensions/touch_spec.rb +0 -203
  666. data/spec/extensions/tree_spec.rb +0 -274
  667. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  668. data/spec/extensions/unlimited_update_spec.rb +0 -20
  669. data/spec/extensions/update_or_create_spec.rb +0 -87
  670. data/spec/extensions/update_primary_key_spec.rb +0 -100
  671. data/spec/extensions/update_refresh_spec.rb +0 -53
  672. data/spec/extensions/uuid_spec.rb +0 -106
  673. data/spec/extensions/validate_associated_spec.rb +0 -52
  674. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  675. data/spec/extensions/validation_helpers_spec.rb +0 -554
  676. data/spec/extensions/xml_serializer_spec.rb +0 -207
  677. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  678. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  679. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  680. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  681. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  682. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  683. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  684. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  685. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  686. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  687. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  688. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  689. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  690. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  691. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  692. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  693. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  694. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  695. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  696. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  697. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  698. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  699. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  700. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  701. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  702. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  703. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  704. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  705. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  706. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  707. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  708. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  709. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  710. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  711. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  712. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  713. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  714. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  715. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  716. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  717. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  718. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  719. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  720. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  721. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  722. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  723. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  724. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  725. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  726. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  727. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  728. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  729. data/spec/guards_helper.rb +0 -55
  730. data/spec/integration/associations_test.rb +0 -2506
  731. data/spec/integration/database_test.rb +0 -113
  732. data/spec/integration/dataset_test.rb +0 -1858
  733. data/spec/integration/eager_loader_test.rb +0 -687
  734. data/spec/integration/migrator_test.rb +0 -262
  735. data/spec/integration/model_test.rb +0 -230
  736. data/spec/integration/plugin_test.rb +0 -2297
  737. data/spec/integration/prepared_statement_test.rb +0 -467
  738. data/spec/integration/schema_test.rb +0 -815
  739. data/spec/integration/spec_helper.rb +0 -56
  740. data/spec/integration/timezone_test.rb +0 -86
  741. data/spec/integration/transaction_test.rb +0 -406
  742. data/spec/integration/type_test.rb +0 -133
  743. data/spec/model/association_reflection_spec.rb +0 -565
  744. data/spec/model/associations_spec.rb +0 -4589
  745. data/spec/model/base_spec.rb +0 -759
  746. data/spec/model/class_dataset_methods_spec.rb +0 -150
  747. data/spec/model/dataset_methods_spec.rb +0 -149
  748. data/spec/model/eager_loading_spec.rb +0 -2197
  749. data/spec/model/hooks_spec.rb +0 -604
  750. data/spec/model/inflector_spec.rb +0 -26
  751. data/spec/model/model_spec.rb +0 -1097
  752. data/spec/model/plugins_spec.rb +0 -299
  753. data/spec/model/record_spec.rb +0 -2162
  754. data/spec/model/spec_helper.rb +0 -46
  755. data/spec/model/validations_spec.rb +0 -193
  756. data/spec/model_no_assoc_spec.rb +0 -1
  757. data/spec/model_spec.rb +0 -1
  758. data/spec/plugin_spec.rb +0 -1
  759. data/spec/sequel_coverage.rb +0 -15
  760. data/spec/spec_config.rb +0 -10
@@ -1,1027 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "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 respond to validations, has_validations?, and validation_reflections" do
20
- @c.must_respond_to(:validations)
21
- @c.must_respond_to(:has_validations?)
22
- @c.must_respond_to(:validation_reflections)
23
- end
24
-
25
- it "should be able to reflect on validations" do
26
- @c.validation_reflections.must_equal({})
27
- @c.validates_acceptance_of(:a)
28
- @c.validation_reflections.must_equal(:a=>[[:acceptance, {:tag=>:acceptance, :message=>"is not accepted", :allow_nil=>true, :accept=>"1"}]])
29
- @c.validates_presence_of(:a)
30
- @c.validation_reflections[:a].length.must_equal 2
31
- @c.validation_reflections[:a].last.must_equal [:presence, {:tag=>:presence, :message=>"is not present"}]
32
- end
33
-
34
- it "should handle validation reflections correctly when subclassing" do
35
- @c.validates_acceptance_of(:a)
36
- c = Class.new(@c)
37
- c.validation_reflections.map{|k,v| k}.must_equal [:a]
38
- c.validates_presence_of(:a)
39
- @c.validation_reflections.must_equal(:a=>[[:acceptance, {:tag=>:acceptance, :message=>"is not accepted", :allow_nil=>true, :accept=>"1"}]])
40
- c.validation_reflections[:a].last.must_equal [:presence, {:tag=>:presence, :message=>"is not present"}]
41
- end
42
-
43
- it "should acccept validation definitions using validates_each" do
44
- @c.validates_each(:xx, :yy) {|o, a, v| o.errors.add(a, 'too low') if v < 50}
45
- o = @c.new
46
- def o.xx; 40; end
47
- def o.yy; 60; end
48
- o.valid?.must_equal false
49
- o.errors.full_messages.must_equal ['xx too low']
50
- end
51
-
52
- it "should return true/false for has_validations?" do
53
- @c.has_validations?.must_equal false
54
- @c.validates_each(:xx) {1}
55
- @c.has_validations?.must_equal true
56
- end
57
-
58
- it "should validate multiple attributes at once" do
59
- o = @c.new
60
- def o.xx
61
- 1
62
- end
63
- def o.yy
64
- 2
65
- end
66
- vals = nil
67
- atts = nil
68
- @c.validates_each([:xx, :yy]){|obj,a,v| atts=a; vals=v}
69
- o.valid?
70
- vals.must_equal [1,2]
71
- atts.must_equal [:xx, :yy]
72
- end
73
-
74
- it "should respect allow_missing option when using multiple attributes" do
75
- o = @c.new
76
- def o.xx
77
- self[:xx]
78
- end
79
- def o.yy
80
- self[:yy]
81
- end
82
- vals = nil
83
- atts = nil
84
- @c.validates_each([:xx, :yy], :allow_missing=>true){|obj,a,v| atts=a; vals=v}
85
-
86
- o.values[:xx] = 1
87
- o.valid?
88
- vals.must_equal [1,nil]
89
- atts.must_equal [:xx, :yy]
90
-
91
- vals = nil
92
- atts = nil
93
- o.values.clear
94
- o.values[:yy] = 2
95
- o.valid?
96
- vals.must_equal [nil, 2]
97
- atts.must_equal [:xx, :yy]
98
-
99
- vals = nil
100
- atts = nil
101
- o.values.clear
102
- o.valid?.must_equal true
103
- vals.must_equal nil
104
- atts.must_equal nil
105
- end
106
-
107
- it "should overwrite existing validation with the same tag and attribute" do
108
- @c.validates_each(:xx, :xx, :tag=>:low) {|o, a, v| o.xxx; o.errors.add(a, 'too low') if v < 50}
109
- @c.validates_each(:yy, :yy) {|o, a, v| o.yyy; o.errors.add(a, 'too low') if v < 50}
110
- @c.validates_presence_of(:zz, :zz)
111
- @c.validates_length_of(:aa, :aa, :tag=>:blah)
112
- o = @c.new
113
- def o.zz
114
- @a ||= 0
115
- @a += 1
116
- end
117
- def o.aa
118
- @b ||= 0
119
- @b += 1
120
- end
121
- def o.xx; 40; end
122
- def o.yy; 60; end
123
- def o.xxx; end
124
- def o.yyy; end
125
- o.valid?.must_equal false
126
- o.zz.must_equal 2
127
- o.aa.must_equal 2
128
- o.errors.full_messages.must_equal ['xx too low']
129
- end
130
-
131
- it "should provide a validates method that takes block with validation definitions" do
132
- @c.validates do
133
- coolness_of :blah
134
- end
135
- @c.validations[:blah].wont_be :empty?
136
- o = @c.new
137
- def o.blah; end
138
- o.valid?.must_equal false
139
- o.errors.full_messages.must_equal ['blah is not cool']
140
- end
141
-
142
- it "should have the validates block have appropriate respond_to?" do
143
- c = nil
144
- @c.validates{c = respond_to?(:foo)}
145
- c.must_equal false
146
- @c.validates{c = respond_to?(:length_of)}
147
- c.must_equal true
148
- end if RUBY_VERSION >= '1.9'
149
- end
150
-
151
- describe Sequel::Model do
152
- before do
153
- @c = model_class.call Sequel::Model do
154
- columns :score
155
- validates_each :score do |o, a, v|
156
- o.errors.add(a, 'too low') if v < 87
157
- end
158
- end
159
-
160
- @o = @c.new
161
- end
162
-
163
- it "should supply a #valid? method that returns true if validations pass" do
164
- @o.score = 50
165
- @o.wont_be :valid?
166
- @o.score = 100
167
- @o.must_be :valid?
168
- end
169
-
170
- it "should provide an errors object" do
171
- @o.score = 100
172
- @o.must_be :valid?
173
- @o.errors.must_be :empty?
174
-
175
- @o.score = 86
176
- @o.wont_be :valid?
177
- @o.errors[:score].must_equal ['too low']
178
- @o.errors.on(:blah).must_equal nil
179
- end
180
- end
181
-
182
- describe "Sequel::Plugins::ValidationClassMethods::ClassMethods::Generator" do
183
- before do
184
- @testit = testit = []
185
-
186
- @c = model_class.call Sequel::Model do
187
- (class << self; self end).send(:define_method, :validates_blah) do
188
- testit << 1324
189
- end
190
- end
191
- end
192
-
193
- it "should instance_eval the block, sending everything to its receiver" do
194
- @c.validates do
195
- blah
196
- end
197
- @testit.must_equal [1324]
198
- end
199
- end
200
-
201
- describe Sequel::Model do
202
- before do
203
- @c = model_class.call Sequel::Model do
204
- columns :value
205
-
206
- def self.filter(*args)
207
- o = Object.new
208
- def o.count; 2; end
209
- o
210
- end
211
-
212
- def skip; false; end
213
- def dont_skip; true; end
214
- end
215
- @m = @c.new
216
- end
217
-
218
- it "should validate acceptance_of" do
219
- @c.validates_acceptance_of :value
220
- @m.must_be :valid?
221
- @m.value = '1'
222
- @m.must_be :valid?
223
- end
224
-
225
- it "should validate acceptance_of with accept" do
226
- @c.validates_acceptance_of :value, :accept => 'true'
227
- @m.value = '1'
228
- @m.wont_be :valid?
229
- @m.value = 'true'
230
- @m.must_be :valid?
231
- end
232
-
233
- it "should validate acceptance_of with allow_nil => false" do
234
- @c.validates_acceptance_of :value, :allow_nil => false
235
- @m.wont_be :valid?
236
- end
237
-
238
- it "should validate acceptance_of with allow_missing => true" do
239
- @c.validates_acceptance_of :value, :allow_missing => true
240
- @m.must_be :valid?
241
- end
242
-
243
- it "should validate acceptance_of with allow_missing => true and allow_nil => false" do
244
- @c.validates_acceptance_of :value, :allow_missing => true, :allow_nil => false
245
- @m.must_be :valid?
246
- @m.value = nil
247
- @m.wont_be :valid?
248
- end
249
-
250
- it "should validate acceptance_of with if => true" do
251
- @c.validates_acceptance_of :value, :if => :dont_skip
252
- @m.value = '0'
253
- @m.wont_be :valid?
254
- end
255
-
256
- it "should validate acceptance_of with if => false" do
257
- @c.validates_acceptance_of :value, :if => :skip
258
- @m.value = '0'
259
- @m.must_be :valid?
260
- end
261
-
262
- it "should validate acceptance_of with if proc that evaluates to true" do
263
- @c.validates_acceptance_of :value, :if => proc{true}
264
- @m.value = '0'
265
- @m.wont_be :valid?
266
- end
267
-
268
- it "should validate acceptance_of with if proc that evaluates to false" do
269
- @c.validates_acceptance_of :value, :if => proc{false}
270
- @m.value = '0'
271
- @m.must_be :valid?
272
- end
273
-
274
- it "should raise an error if :if option is not a Symbol, Proc, or nil" do
275
- @c.validates_acceptance_of :value, :if => 1
276
- @m.value = '0'
277
- proc{@m.valid?}.must_raise(Sequel::Error)
278
- end
279
-
280
- it "should validate confirmation_of" do
281
- @c.send(:attr_accessor, :value_confirmation)
282
- @c.validates_confirmation_of :value
283
-
284
- @m.value = 'blah'
285
- @m.wont_be :valid?
286
-
287
- @m.value_confirmation = 'blah'
288
- @m.must_be :valid?
289
- end
290
-
291
- it "should validate confirmation_of with if => true" do
292
- @c.send(:attr_accessor, :value_confirmation)
293
- @c.validates_confirmation_of :value, :if => :dont_skip
294
-
295
- @m.value = 'blah'
296
- @m.wont_be :valid?
297
- end
298
-
299
- it "should validate confirmation_of with if => false" do
300
- @c.send(:attr_accessor, :value_confirmation)
301
- @c.validates_confirmation_of :value, :if => :skip
302
-
303
- @m.value = 'blah'
304
- @m.must_be :valid?
305
- end
306
-
307
- it "should validate confirmation_of with allow_missing => true" do
308
- @c.send(:attr_accessor, :value_confirmation)
309
- @c.validates_acceptance_of :value, :allow_missing => true
310
- @m.must_be :valid?
311
- @m.value_confirmation = 'blah'
312
- @m.must_be :valid?
313
- @m.value = nil
314
- @m.wont_be :valid?
315
- end
316
-
317
- it "should validate format_of" do
318
- @c.validates_format_of :value, :with => /.+_.+/
319
- @m.value = 'abc_'
320
- @m.wont_be :valid?
321
- @m.value = 'abc_def'
322
- @m.must_be :valid?
323
- end
324
-
325
- it "should raise for validate_format_of without regexp" do
326
- proc {@c.validates_format_of :value}.must_raise(ArgumentError)
327
- proc {@c.validates_format_of :value, :with => :blah}.must_raise(ArgumentError)
328
- end
329
-
330
- it "should validate format_of with if => true" do
331
- @c.validates_format_of :value, :with => /_/, :if => :dont_skip
332
-
333
- @m.value = 'a'
334
- @m.wont_be :valid?
335
- end
336
-
337
- it "should validate format_of with if => false" do
338
- @c.validates_format_of :value, :with => /_/, :if => :skip
339
-
340
- @m.value = 'a'
341
- @m.must_be :valid?
342
- end
343
-
344
- it "should validate format_of with allow_missing => true" do
345
- @c.validates_format_of :value, :allow_missing => true, :with=>/./
346
- @m.must_be :valid?
347
- @m.value = nil
348
- @m.wont_be :valid?
349
- end
350
-
351
- it "should validate length_of with maximum" do
352
- @c.validates_length_of :value, :maximum => 5
353
- @m.wont_be :valid?
354
- @m.value = '12345'
355
- @m.must_be :valid?
356
- @m.value = '123456'
357
- @m.wont_be :valid?
358
- @m.errors[:value].must_equal ['is too long']
359
- @m.value = nil
360
- @m.wont_be :valid?
361
- @m.errors[:value].must_equal ['is not present']
362
- end
363
-
364
- it "should validate length_of with maximum using customized error messages" do
365
- @c.validates_length_of :value, :maximum => 5, :too_long=>'tl', :nil_message=>'np'
366
- @m.value = '123456'
367
- @m.wont_be :valid?
368
- @m.errors[:value].must_equal ['tl']
369
- @m.value = nil
370
- @m.wont_be :valid?
371
- @m.errors[:value].must_equal ['np']
372
- end
373
-
374
- it "should validate length_of with minimum" do
375
- @c.validates_length_of :value, :minimum => 5
376
- @m.wont_be :valid?
377
- @m.value = '12345'
378
- @m.must_be :valid?
379
- @m.value = '1234'
380
- @m.wont_be :valid?
381
- end
382
-
383
- it "should validate length_of with within" do
384
- @c.validates_length_of :value, :within => 2..5
385
- @m.wont_be :valid?
386
- @m.value = '12345'
387
- @m.must_be :valid?
388
- @m.value = '1'
389
- @m.wont_be :valid?
390
- @m.value = '123456'
391
- @m.wont_be :valid?
392
- end
393
-
394
- it "should validate length_of with is" do
395
- @c.validates_length_of :value, :is => 3
396
- @m.wont_be :valid?
397
- @m.value = '123'
398
- @m.must_be :valid?
399
- @m.value = '12'
400
- @m.wont_be :valid?
401
- @m.value = '1234'
402
- @m.wont_be :valid?
403
- end
404
-
405
- it "should validate length_of with allow_nil" do
406
- @c.validates_length_of :value, :is => 3, :allow_nil => true
407
- @m.must_be :valid?
408
- end
409
-
410
- it "should validate length_of with if => true" do
411
- @c.validates_length_of :value, :is => 3, :if => :dont_skip
412
-
413
- @m.value = 'a'
414
- @m.wont_be :valid?
415
- end
416
-
417
- it "should validate length_of with if => false" do
418
- @c.validates_length_of :value, :is => 3, :if => :skip
419
-
420
- @m.value = 'a'
421
- @m.must_be :valid?
422
- end
423
-
424
- it "should validate length_of with allow_missing => true" do
425
- @c.validates_length_of :value, :allow_missing => true, :minimum => 5
426
- @m.must_be :valid?
427
- @m.value = nil
428
- @m.wont_be :valid?
429
- end
430
-
431
- it "should allow multiple calls to validates_length_of with different options without overwriting" do
432
- @c.validates_length_of :value, :maximum => 5
433
- @c.validates_length_of :value, :minimum => 5
434
- @m.wont_be :valid?
435
- @m.value = '12345'
436
- @m.must_be :valid?
437
- @m.value = '123456'
438
- @m.wont_be :valid?
439
- @m.value = '12345'
440
- @m.must_be :valid?
441
- @m.value = '1234'
442
- @m.wont_be :valid?
443
- end
444
-
445
- it "should validate numericality_of" do
446
- @c.validates_numericality_of :value
447
- @m.value = 'blah'
448
- @m.wont_be :valid?
449
- @m.value = '123'
450
- @m.must_be :valid?
451
- @m.value = '123.1231'
452
- @m.must_be :valid?
453
- @m.value = '+1'
454
- @m.must_be :valid?
455
- @m.value = '-1'
456
- @m.must_be :valid?
457
- @m.value = '+1.123'
458
- @m.must_be :valid?
459
- @m.value = '-0.123'
460
- @m.must_be :valid?
461
- @m.value = '-0.123E10'
462
- @m.must_be :valid?
463
- @m.value = '32.123e10'
464
- @m.must_be :valid?
465
- @m.value = '+32.123E10'
466
- @m.must_be :valid?
467
- @m.must_be :valid?
468
- @m.value = '.0123'
469
- end
470
-
471
- it "should validate numericality_of with only_integer" do
472
- @c.validates_numericality_of :value, :only_integer => true
473
- @m.value = 'blah'
474
- @m.wont_be :valid?
475
- @m.value = '123'
476
- @m.must_be :valid?
477
- @m.value = '123.1231'
478
- @m.wont_be :valid?
479
- end
480
-
481
- it "should validate numericality_of with if => true" do
482
- @c.validates_numericality_of :value, :if => :dont_skip
483
-
484
- @m.value = 'a'
485
- @m.wont_be :valid?
486
- end
487
-
488
- it "should validate numericality_of with if => false" do
489
- @c.validates_numericality_of :value, :if => :skip
490
-
491
- @m.value = 'a'
492
- @m.must_be :valid?
493
- end
494
-
495
- it "should validate numericality_of with allow_missing => true" do
496
- @c.validates_numericality_of :value, :allow_missing => true
497
- @m.must_be :valid?
498
- @m.value = nil
499
- @m.wont_be :valid?
500
- end
501
-
502
- it "should validate presence_of" do
503
- @c.validates_presence_of :value
504
- @m.wont_be :valid?
505
- @m.value = ''
506
- @m.wont_be :valid?
507
- @m.value = 1234
508
- @m.must_be :valid?
509
- @m.value = nil
510
- @m.wont_be :valid?
511
- @m.value = true
512
- @m.must_be :valid?
513
- @m.value = false
514
- @m.must_be :valid?
515
- end
516
-
517
- it "should validate inclusion_of with an array" do
518
- @c.validates_inclusion_of :value, :in => [1,2]
519
- @m.wont_be :valid?
520
- @m.value = 1
521
- @m.must_be :valid?
522
- @m.value = 1.5
523
- @m.wont_be :valid?
524
- @m.value = 2
525
- @m.must_be :valid?
526
- @m.value = 3
527
- @m.wont_be :valid?
528
- end
529
-
530
- it "should validate inclusion_of with a range" do
531
- @c.validates_inclusion_of :value, :in => 1..4
532
- @m.wont_be :valid?
533
- @m.value = 1
534
- @m.must_be :valid?
535
- @m.value = 1.5
536
- @m.must_be :valid?
537
- @m.value = 0
538
- @m.wont_be :valid?
539
- @m.value = 5
540
- @m.wont_be :valid?
541
- end
542
-
543
- it "should raise an error if inclusion_of doesn't receive a valid :in option" do
544
- lambda{@c.validates_inclusion_of :value}.must_raise(ArgumentError)
545
- lambda{@c.validates_inclusion_of :value, :in => 1}.must_raise(ArgumentError)
546
- end
547
-
548
- it "should raise an error if inclusion_of handles :allow_nil too" do
549
- @c.validates_inclusion_of :value, :in => 1..4, :allow_nil => true
550
- @m.value = nil
551
- @m.must_be :valid?
552
- @m.value = 0
553
- @m.wont_be :valid?
554
- end
555
-
556
- it "should validate presence_of with if => true" do
557
- @c.validates_presence_of :value, :if => :dont_skip
558
- @m.wont_be :valid?
559
- end
560
-
561
- it "should validate presence_of with if => false" do
562
- @c.validates_presence_of :value, :if => :skip
563
- @m.must_be :valid?
564
- end
565
-
566
- it "should validate presence_of with allow_missing => true" do
567
- @c.validates_presence_of :value, :allow_missing => true
568
- @m.must_be :valid?
569
- @m.value = nil
570
- @m.wont_be :valid?
571
- end
572
-
573
- it "should validate uniqueness_of with if => true" do
574
- @c.validates_uniqueness_of :value, :if => :dont_skip
575
-
576
- @m.value = 'a'
577
- @m.wont_be :valid?
578
- end
579
-
580
- it "should validate uniqueness_of with if => false" do
581
- @c.validates_uniqueness_of :value, :if => :skip
582
- @m.value = 'a'
583
- @m.must_be :valid?
584
- end
585
-
586
- it "should validate uniqueness_of with allow_missing => true" do
587
- @c.validates_uniqueness_of :value, :allow_missing => true
588
- @m.must_be :valid?
589
- @m.value = 1
590
- @m.wont_be :valid?
591
- end
592
- end
593
-
594
- describe "Superclass validations" do
595
- before do
596
- @c1 = model_class.call Sequel::Model do
597
- columns :value
598
- validates_length_of :value, :minimum => 5
599
- end
600
-
601
- @c2 = Class.new(@c1)
602
- @c2.class_eval do
603
- columns :value
604
- validates_format_of :value, :with => /^[a-z]+$/
605
- end
606
- end
607
-
608
- it "should be checked when validating" do
609
- o = @c2.new
610
- o.value = 'ab'
611
- o.valid?.must_equal false
612
- o.errors.full_messages.must_equal ['value is too short']
613
-
614
- o.value = '12'
615
- o.valid?.must_equal false
616
- o.errors.full_messages.must_equal ['value is too short', 'value is invalid']
617
-
618
- o.value = 'abcde'
619
- o.valid?.must_equal true
620
- end
621
-
622
- it "should have skip_superclass_validations? return whether superclass validations were skipped" do
623
- @c2.skip_superclass_validations?.must_equal nil
624
- @c2.skip_superclass_validations
625
- @c2.skip_superclass_validations?.must_equal true
626
- end
627
-
628
- it "should be skipped if skip_superclass_validations is called" do
629
- @c2.skip_superclass_validations
630
-
631
- o = @c2.new
632
- o.value = 'ab'
633
- o.valid?.must_equal true
634
-
635
- o.value = '12'
636
- o.valid?.must_equal false
637
- o.errors.full_messages.must_equal ['value is invalid']
638
-
639
- o.value = 'abcde'
640
- o.valid?.must_equal true
641
- end
642
- end
643
-
644
- describe ".validates with block" do
645
- it "should support calling .each" do
646
- @c = model_class.call Sequel::Model do
647
- columns :vvv
648
- validates do
649
- each :vvv do |o, a, v|
650
- o.errors.add(a, "is less than zero") if v.to_i < 0
651
- end
652
- end
653
- end
654
-
655
- o = @c.new
656
- o.vvv = 1
657
- o.must_be :valid?
658
- o.vvv = -1
659
- o.wont_be :valid?
660
- end
661
- end
662
-
663
- describe Sequel::Model, "Validations" do
664
- before do
665
- class ::Person < Sequel::Model
666
- plugin :validation_class_methods
667
- columns :id,:name,:first_name,:last_name,:middle_name,:initials,:age, :terms
668
- end
669
-
670
- class ::Smurf < Person
671
- end
672
-
673
- class ::Can < Sequel::Model
674
- plugin :validation_class_methods
675
- columns :id, :name
676
- end
677
-
678
- class ::Cow < Sequel::Model
679
- plugin :validation_class_methods
680
- columns :id, :name, :got_milk
681
- end
682
-
683
- class ::User < Sequel::Model
684
- plugin :validation_class_methods
685
- columns :id, :username, :password
686
- end
687
-
688
- class ::Address < Sequel::Model
689
- plugin :validation_class_methods
690
- columns :id, :zip_code
691
- end
692
- end
693
- after do
694
- [:Person, :Smurf, :Cow, :User, :Address].each{|c| Object.send(:remove_const, c)}
695
- end
696
-
697
- it "should validate the acceptance of a column" do
698
- class ::Cow < Sequel::Model
699
- validations.clear
700
- validates_acceptance_of :got_milk, :accept => 'blah', :allow_nil => false
701
- end
702
-
703
- @cow = Cow.new
704
- @cow.wont_be :valid?
705
- @cow.errors.full_messages.must_equal ["got_milk is not accepted"]
706
-
707
- @cow.got_milk = "blah"
708
- @cow.must_be :valid?
709
- end
710
-
711
- it "should validate the confirmation of a column" do
712
- class ::User < Sequel::Model
713
- def password_confirmation
714
- "test"
715
- end
716
-
717
- validations.clear
718
- validates_confirmation_of :password
719
- end
720
-
721
- @user = User.new
722
- @user.wont_be :valid?
723
- @user.errors.full_messages.must_equal ["password is not confirmed"]
724
-
725
- @user.password = "test"
726
- @user.must_be :valid?
727
- end
728
-
729
- it "should validate format of column" do
730
- class ::Person < Sequel::Model
731
- validates_format_of :first_name, :with => /^[a-zA-Z]+$/
732
- end
733
-
734
- @person = Person.new :first_name => "Lancelot99"
735
- @person.valid?.must_equal false
736
- @person = Person.new :first_name => "Anita"
737
- @person.valid?.must_equal true
738
- end
739
-
740
- it "should validate length of column" do
741
- class ::Person < Sequel::Model
742
- validations.clear
743
- validates_length_of :first_name, :maximum => 30
744
- validates_length_of :last_name, :minimum => 30
745
- validates_length_of :middle_name, :within => 1..5
746
- validates_length_of :initials, :is => 2
747
- end
748
-
749
- @person = Person.new(
750
- :first_name => "Anamethatiswaytofreakinglongandwayoverthirtycharacters",
751
- :last_name => "Alastnameunderthirtychars",
752
- :initials => "LGC",
753
- :middle_name => "danger"
754
- )
755
-
756
- @person.wont_be :valid?
757
- @person.errors.full_messages.size.must_equal 4
758
- @person.errors.full_messages.sort.must_equal [
759
- 'first_name is too long',
760
- 'initials is the wrong length',
761
- 'last_name is too short',
762
- 'middle_name is the wrong length'
763
- ]
764
-
765
- @person.first_name = "Lancelot"
766
- @person.last_name = "1234567890123456789012345678901"
767
- @person.initials = "LC"
768
- @person.middle_name = "Will"
769
- @person.must_be :valid?
770
- end
771
-
772
- it "should validate that a column has the correct type for the schema column" do
773
- p = model_class.call Sequel::Model do
774
- columns :age, :d
775
- self.raise_on_typecast_failure = false
776
- validates_schema_type :age
777
- validates_schema_type :d, :message=>'is a bad choice'
778
- @db_schema = {:age=>{:type=>:integer}, :d=>{:type=>:date}}
779
- end
780
-
781
- @person = p.new
782
- @person.must_be :valid?
783
-
784
- @person.age = 'a'
785
- @person.wont_be :valid?
786
- @person.errors.full_messages.must_equal ['age is not a valid integer']
787
- @person.age = 1
788
- @person.must_be :valid?
789
-
790
- @person.d = 'a'
791
- @person.wont_be :valid?
792
- @person.errors.full_messages.must_equal ['d is a bad choice']
793
- @person.d = Date.today
794
- @person.must_be :valid?
795
- end
796
-
797
- it "should validate numericality of column" do
798
- class ::Person < Sequel::Model
799
- validations.clear
800
- validates_numericality_of :age
801
- end
802
-
803
- @person = Person.new :age => "Twenty"
804
- @person.wont_be :valid?
805
- @person.errors.full_messages.must_equal ['age is not a number']
806
-
807
- @person.age = 20
808
- @person.must_be :valid?
809
- end
810
-
811
- it "should validate the presence of a column" do
812
- class ::Cow < Sequel::Model
813
- validations.clear
814
- validates_presence_of :name
815
- end
816
-
817
- @cow = Cow.new
818
- @cow.wont_be :valid?
819
- @cow.errors.full_messages.must_equal ['name is not present']
820
-
821
- @cow.name = "Betsy"
822
- @cow.must_be :valid?
823
- end
824
-
825
- it "should validate the uniqueness of a column" do
826
- class ::User < Sequel::Model
827
- validations.clear
828
- validates do
829
- uniqueness_of :username
830
- end
831
- end
832
- User.dataset._fetch = proc do |sql|
833
- case sql
834
- when /count.*username = '0records'/
835
- {:v => 0}
836
- when /count.*username = '2records'/
837
- {:v => 2}
838
- when /count.*username = '1record'/
839
- {:v => 1}
840
- when /username = '1record'/
841
- {:id => 3, :username => "1record", :password => "test"}
842
- end
843
- end
844
-
845
- @user = User.new(:username => "2records", :password => "anothertest")
846
- @user.wont_be :valid?
847
- @user.errors.full_messages.must_equal ['username is already taken']
848
-
849
- @user = User.new(:username => "1record", :password => "anothertest")
850
- @user.wont_be :valid?
851
- @user.errors.full_messages.must_equal ['username is already taken']
852
-
853
- @user = User.load(:id=>4, :username => "1record", :password => "anothertest")
854
- @user.wont_be :valid?
855
- @user.errors.full_messages.must_equal ['username is already taken']
856
-
857
- @user = User.load(:id=>3, :username => "1record", :password => "anothertest")
858
- @user.must_be :valid?
859
- @user.errors.full_messages.must_equal []
860
-
861
- @user = User.new(:username => "0records", :password => "anothertest")
862
- @user.must_be :valid?
863
- @user.errors.full_messages.must_equal []
864
-
865
- User.db.sqls
866
- @user = User.new(:password => "anothertest")
867
- @user.must_be :valid?
868
- @user.errors.full_messages.must_equal []
869
- User.db.sqls.must_equal []
870
- end
871
-
872
- it "should validate the uniqueness of multiple columns" do
873
- class ::User < Sequel::Model
874
- validations.clear
875
- validates do
876
- uniqueness_of [:username, :password]
877
- end
878
- end
879
- User.dataset._fetch = proc do |sql|
880
- case sql
881
- when /count.*username = '0records'/
882
- {:v => 0}
883
- when /count.*username = '2records'/
884
- {:v => 2}
885
- when /count.*username = '1record'/
886
- {:v => 1}
887
- when /username = '1record'/
888
- if sql =~ /password = 'anothertest'/
889
- {:id => 3, :username => "1record", :password => "anothertest"}
890
- else
891
- {:id => 4, :username => "1record", :password => "test"}
892
- end
893
- end
894
- end
895
-
896
- @user = User.new(:username => "2records", :password => "anothertest")
897
- @user.wont_be :valid?
898
- @user.errors.full_messages.must_equal ['username and password is already taken']
899
-
900
- @user = User.new(:username => "1record", :password => "anothertest")
901
- @user.wont_be :valid?
902
- @user.errors.full_messages.must_equal ['username and password is already taken']
903
-
904
- @user = User.load(:id=>4, :username => "1record", :password => "anothertest")
905
- @user.wont_be :valid?
906
- @user.errors.full_messages.must_equal ['username and password is already taken']
907
-
908
- @user = User.load(:id=>3, :username => "1record", :password => "test")
909
- @user.wont_be :valid?
910
- @user.errors.full_messages.must_equal ['username and password is already taken']
911
-
912
- @user = User.load(:id=>3, :username => "1record", :password => "anothertest")
913
- @user.must_be :valid?
914
- @user.errors.full_messages.must_equal []
915
-
916
- @user = User.new(:username => "0records", :password => "anothertest")
917
- @user.must_be :valid?
918
- @user.errors.full_messages.must_equal []
919
-
920
- User.db.sqls
921
- @user = User.new(:password => "anothertest")
922
- @user.must_be :valid?
923
- @user.errors.full_messages.must_equal []
924
- @user = User.new(:username => "0records")
925
- @user.must_be :valid?
926
- @user.errors.full_messages.must_equal []
927
- @user = User.new
928
- @user.must_be :valid?
929
- @user.errors.full_messages.must_equal []
930
- User.db.sqls.must_equal []
931
- end
932
-
933
- it "should have a validates block that contains multiple validations" do
934
- class ::Person < Sequel::Model
935
- validations.clear
936
- validates do
937
- format_of :first_name, :with => /^[a-zA-Z]+$/
938
- length_of :first_name, :maximum => 30
939
- end
940
- end
941
-
942
- Person.validations[:first_name].size.must_equal 2
943
-
944
- @person = Person.new :first_name => "Lancelot99"
945
- @person.valid?.must_equal false
946
-
947
- @person2 = Person.new :first_name => "Wayne"
948
- @person2.valid?.must_equal true
949
- end
950
-
951
- it "should allow 'longhand' validations direcly within the model." do
952
- class ::Person < Sequel::Model
953
- validations.clear
954
- validates_length_of :first_name, :maximum => 30
955
- end
956
- Person.validations.length.must_equal(1)
957
- end
958
-
959
- it "should define a has_validations? method which returns true if the model has validations, false otherwise" do
960
- class ::Person < Sequel::Model
961
- validations.clear
962
- validates do
963
- format_of :first_name, :with => /\w+/
964
- length_of :first_name, :maximum => 30
965
- end
966
- end
967
-
968
- class ::Smurf < Person
969
- validations.clear
970
- end
971
-
972
- Person.validations.wont_be :empty?
973
- Smurf.validations.must_be :empty?
974
- end
975
-
976
- it "should validate correctly instances initialized with string keys" do
977
- class ::Can < Sequel::Model
978
- validates_length_of :name, :minimum => 4
979
- end
980
-
981
- Can.new('name' => 'ab').wont_be :valid?
982
- Can.new('name' => 'abcd').must_be :valid?
983
- end
984
-
985
- end
986
-
987
- describe "Model#save" do
988
- before do
989
- @c = model_class.call Sequel::Model(:people) do
990
- columns :id, :x
991
-
992
- validates_each :x do |o, a, v|
993
- o.errors.add(a, 'blah') unless v == 7
994
- end
995
- end
996
- @m = @c.load(:id => 4, :x=>6)
997
- DB.reset
998
- end
999
-
1000
- it "should save only if validations pass" do
1001
- @m.raise_on_save_failure = false
1002
- @m.wont_be :valid?
1003
- @m.save
1004
- DB.sqls.must_be :empty?
1005
-
1006
- @m.x = 7
1007
- @m.must_be :valid?
1008
- @m.save.wont_equal false
1009
- DB.sqls.must_equal ['UPDATE people SET x = 7 WHERE (id = 4)']
1010
- end
1011
-
1012
- it "should skip validations if the :validate=>false option is used" do
1013
- @m.raise_on_save_failure = false
1014
- @m.wont_be :valid?
1015
- @m.save(:validate=>false)
1016
- DB.sqls.must_equal ['UPDATE people SET x = 6 WHERE (id = 4)']
1017
- end
1018
-
1019
- it "should raise error if validations fail and raise_on_save_faiure is true" do
1020
- proc{@m.save}.must_raise(Sequel::ValidationFailed)
1021
- end
1022
-
1023
- it "should return nil if validations fail and raise_on_save_faiure is false" do
1024
- @m.raise_on_save_failure = false
1025
- @m.save.must_equal nil
1026
- end
1027
- end