sequel 4.26.0 → 5.37.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 (692) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +405 -5656
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +232 -157
  5. data/bin/sequel +32 -9
  6. data/doc/advanced_associations.rdoc +252 -188
  7. data/doc/association_basics.rdoc +231 -273
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +75 -48
  10. data/doc/code_order.rdoc +28 -10
  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/mass_assignment.rdoc +74 -31
  16. data/doc/migration.rdoc +72 -46
  17. data/doc/model_dataset_method_design.rdoc +129 -0
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +12 -12
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +59 -69
  22. data/doc/opening_databases.rdoc +84 -94
  23. data/doc/postgresql.rdoc +268 -38
  24. data/doc/prepared_statements.rdoc +29 -24
  25. data/doc/querying.rdoc +184 -164
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.10.0.txt +84 -0
  30. data/doc/release_notes/5.11.0.txt +83 -0
  31. data/doc/release_notes/5.12.0.txt +141 -0
  32. data/doc/release_notes/5.13.0.txt +27 -0
  33. data/doc/release_notes/5.14.0.txt +63 -0
  34. data/doc/release_notes/5.15.0.txt +39 -0
  35. data/doc/release_notes/5.16.0.txt +110 -0
  36. data/doc/release_notes/5.17.0.txt +31 -0
  37. data/doc/release_notes/5.18.0.txt +69 -0
  38. data/doc/release_notes/5.19.0.txt +28 -0
  39. data/doc/release_notes/5.2.0.txt +33 -0
  40. data/doc/release_notes/5.20.0.txt +89 -0
  41. data/doc/release_notes/5.21.0.txt +87 -0
  42. data/doc/release_notes/5.22.0.txt +48 -0
  43. data/doc/release_notes/5.23.0.txt +56 -0
  44. data/doc/release_notes/5.24.0.txt +56 -0
  45. data/doc/release_notes/5.25.0.txt +32 -0
  46. data/doc/release_notes/5.26.0.txt +35 -0
  47. data/doc/release_notes/5.27.0.txt +21 -0
  48. data/doc/release_notes/5.28.0.txt +16 -0
  49. data/doc/release_notes/5.29.0.txt +22 -0
  50. data/doc/release_notes/5.3.0.txt +121 -0
  51. data/doc/release_notes/5.30.0.txt +20 -0
  52. data/doc/release_notes/5.31.0.txt +148 -0
  53. data/doc/release_notes/5.32.0.txt +46 -0
  54. data/doc/release_notes/5.33.0.txt +24 -0
  55. data/doc/release_notes/5.34.0.txt +40 -0
  56. data/doc/release_notes/5.35.0.txt +56 -0
  57. data/doc/release_notes/5.36.0.txt +60 -0
  58. data/doc/release_notes/5.37.0.txt +30 -0
  59. data/doc/release_notes/5.4.0.txt +80 -0
  60. data/doc/release_notes/5.5.0.txt +61 -0
  61. data/doc/release_notes/5.6.0.txt +31 -0
  62. data/doc/release_notes/5.7.0.txt +108 -0
  63. data/doc/release_notes/5.8.0.txt +170 -0
  64. data/doc/release_notes/5.9.0.txt +99 -0
  65. data/doc/schema_modification.rdoc +102 -77
  66. data/doc/security.rdoc +160 -87
  67. data/doc/sharding.rdoc +74 -47
  68. data/doc/sql.rdoc +135 -122
  69. data/doc/testing.rdoc +34 -18
  70. data/doc/thread_safety.rdoc +2 -4
  71. data/doc/transactions.rdoc +101 -19
  72. data/doc/validations.rdoc +64 -51
  73. data/doc/virtual_rows.rdoc +90 -109
  74. data/lib/sequel.rb +3 -1
  75. data/lib/sequel/adapters/ado.rb +154 -22
  76. data/lib/sequel/adapters/ado/access.rb +21 -21
  77. data/lib/sequel/adapters/ado/mssql.rb +8 -15
  78. data/lib/sequel/adapters/amalgalite.rb +17 -25
  79. data/lib/sequel/adapters/ibmdb.rb +52 -58
  80. data/lib/sequel/adapters/jdbc.rb +149 -127
  81. data/lib/sequel/adapters/jdbc/db2.rb +32 -40
  82. data/lib/sequel/adapters/jdbc/derby.rb +56 -58
  83. data/lib/sequel/adapters/jdbc/h2.rb +40 -30
  84. data/lib/sequel/adapters/jdbc/hsqldb.rb +22 -33
  85. data/lib/sequel/adapters/jdbc/jtds.rb +4 -10
  86. data/lib/sequel/adapters/jdbc/mssql.rb +6 -12
  87. data/lib/sequel/adapters/jdbc/mysql.rb +17 -18
  88. data/lib/sequel/adapters/jdbc/oracle.rb +25 -19
  89. data/lib/sequel/adapters/jdbc/postgresql.rb +90 -69
  90. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +14 -24
  91. data/lib/sequel/adapters/jdbc/sqlite.rb +50 -12
  92. data/lib/sequel/adapters/jdbc/sqlserver.rb +36 -9
  93. data/lib/sequel/adapters/jdbc/transactions.rb +25 -39
  94. data/lib/sequel/adapters/mock.rb +104 -113
  95. data/lib/sequel/adapters/mysql.rb +42 -61
  96. data/lib/sequel/adapters/mysql2.rb +126 -35
  97. data/lib/sequel/adapters/odbc.rb +21 -28
  98. data/lib/sequel/adapters/odbc/db2.rb +3 -1
  99. data/lib/sequel/adapters/odbc/mssql.rb +11 -15
  100. data/lib/sequel/adapters/odbc/oracle.rb +11 -0
  101. data/lib/sequel/adapters/oracle.rb +62 -68
  102. data/lib/sequel/adapters/postgres.rb +257 -311
  103. data/lib/sequel/adapters/postgresql.rb +3 -1
  104. data/lib/sequel/adapters/shared/access.rb +75 -79
  105. data/lib/sequel/adapters/shared/db2.rb +96 -74
  106. data/lib/sequel/adapters/shared/mssql.rb +258 -213
  107. data/lib/sequel/adapters/shared/mysql.rb +284 -216
  108. data/lib/sequel/adapters/shared/oracle.rb +175 -60
  109. data/lib/sequel/adapters/shared/postgres.rb +829 -383
  110. data/lib/sequel/adapters/shared/sqlanywhere.rb +105 -127
  111. data/lib/sequel/adapters/shared/sqlite.rb +382 -159
  112. data/lib/sequel/adapters/sqlanywhere.rb +53 -38
  113. data/lib/sequel/adapters/sqlite.rb +111 -105
  114. data/lib/sequel/adapters/tinytds.rb +38 -46
  115. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +8 -9
  116. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +7 -5
  117. data/lib/sequel/adapters/utils/mysql_mysql2.rb +87 -0
  118. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +56 -0
  119. data/lib/sequel/adapters/utils/replace.rb +3 -4
  120. data/lib/sequel/adapters/utils/split_alter_table.rb +2 -0
  121. data/lib/sequel/adapters/utils/stored_procedures.rb +9 -22
  122. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +28 -0
  123. data/lib/sequel/ast_transformer.rb +13 -89
  124. data/lib/sequel/connection_pool.rb +54 -26
  125. data/lib/sequel/connection_pool/sharded_single.rb +19 -12
  126. data/lib/sequel/connection_pool/sharded_threaded.rb +160 -111
  127. data/lib/sequel/connection_pool/single.rb +21 -12
  128. data/lib/sequel/connection_pool/threaded.rb +137 -119
  129. data/lib/sequel/core.rb +352 -320
  130. data/lib/sequel/database.rb +19 -2
  131. data/lib/sequel/database/connecting.rb +70 -55
  132. data/lib/sequel/database/dataset.rb +15 -5
  133. data/lib/sequel/database/dataset_defaults.rb +20 -102
  134. data/lib/sequel/database/features.rb +20 -4
  135. data/lib/sequel/database/logging.rb +25 -7
  136. data/lib/sequel/database/misc.rb +132 -118
  137. data/lib/sequel/database/query.rb +51 -28
  138. data/lib/sequel/database/schema_generator.rb +188 -75
  139. data/lib/sequel/database/schema_methods.rb +161 -92
  140. data/lib/sequel/database/transactions.rb +260 -58
  141. data/lib/sequel/dataset.rb +28 -12
  142. data/lib/sequel/dataset/actions.rb +354 -170
  143. data/lib/sequel/dataset/dataset_module.rb +46 -0
  144. data/lib/sequel/dataset/features.rb +81 -34
  145. data/lib/sequel/dataset/graph.rb +82 -58
  146. data/lib/sequel/dataset/misc.rb +139 -47
  147. data/lib/sequel/dataset/placeholder_literalizer.rb +66 -26
  148. data/lib/sequel/dataset/prepared_statements.rb +188 -85
  149. data/lib/sequel/dataset/query.rb +428 -214
  150. data/lib/sequel/dataset/sql.rb +446 -339
  151. data/lib/sequel/deprecated.rb +14 -2
  152. data/lib/sequel/exceptions.rb +48 -16
  153. data/lib/sequel/extensions/_model_constraint_validations.rb +16 -0
  154. data/lib/sequel/extensions/_model_pg_row.rb +43 -0
  155. data/lib/sequel/extensions/_pretty_table.rb +10 -9
  156. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  157. data/lib/sequel/extensions/arbitrary_servers.rb +15 -11
  158. data/lib/sequel/extensions/auto_literal_strings.rb +74 -0
  159. data/lib/sequel/extensions/blank.rb +2 -0
  160. data/lib/sequel/extensions/caller_logging.rb +79 -0
  161. data/lib/sequel/extensions/columns_introspection.rb +9 -4
  162. data/lib/sequel/extensions/connection_expiration.rb +99 -0
  163. data/lib/sequel/extensions/connection_validator.rb +26 -13
  164. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  165. data/lib/sequel/extensions/constraint_validations.rb +93 -38
  166. data/lib/sequel/extensions/core_extensions.rb +45 -53
  167. data/lib/sequel/extensions/core_refinements.rb +44 -46
  168. data/lib/sequel/extensions/current_datetime_timestamp.rb +5 -4
  169. data/lib/sequel/extensions/dataset_source_alias.rb +4 -0
  170. data/lib/sequel/extensions/date_arithmetic.rb +42 -16
  171. data/lib/sequel/extensions/datetime_parse_to_time.rb +37 -0
  172. data/lib/sequel/extensions/duplicate_columns_handler.rb +94 -0
  173. data/lib/sequel/extensions/empty_array_consider_nulls.rb +7 -3
  174. data/lib/sequel/extensions/error_sql.rb +7 -3
  175. data/lib/sequel/extensions/escaped_like.rb +100 -0
  176. data/lib/sequel/extensions/eval_inspect.rb +14 -15
  177. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  178. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  179. data/lib/sequel/extensions/freeze_datasets.rb +3 -0
  180. data/lib/sequel/extensions/from_block.rb +2 -31
  181. data/lib/sequel/extensions/graph_each.rb +19 -6
  182. data/lib/sequel/extensions/identifier_mangling.rb +180 -0
  183. data/lib/sequel/extensions/implicit_subquery.rb +48 -0
  184. data/lib/sequel/extensions/index_caching.rb +109 -0
  185. data/lib/sequel/extensions/inflector.rb +8 -4
  186. data/lib/sequel/extensions/integer64.rb +32 -0
  187. data/lib/sequel/extensions/looser_typecasting.rb +19 -9
  188. data/lib/sequel/extensions/migration.rb +132 -80
  189. data/lib/sequel/extensions/mssql_emulate_lateral_with_apply.rb +4 -0
  190. data/lib/sequel/extensions/named_timezones.rb +88 -23
  191. data/lib/sequel/extensions/no_auto_literal_strings.rb +4 -0
  192. data/lib/sequel/extensions/null_dataset.rb +12 -8
  193. data/lib/sequel/extensions/pagination.rb +35 -28
  194. data/lib/sequel/extensions/pg_array.rb +227 -316
  195. data/lib/sequel/extensions/pg_array_ops.rb +19 -7
  196. data/lib/sequel/extensions/pg_enum.rb +69 -24
  197. data/lib/sequel/extensions/pg_extended_date_support.rb +250 -0
  198. data/lib/sequel/extensions/pg_hstore.rb +50 -59
  199. data/lib/sequel/extensions/pg_hstore_ops.rb +9 -3
  200. data/lib/sequel/extensions/pg_inet.rb +34 -15
  201. data/lib/sequel/extensions/pg_inet_ops.rb +5 -1
  202. data/lib/sequel/extensions/pg_interval.rb +26 -26
  203. data/lib/sequel/extensions/pg_json.rb +422 -141
  204. data/lib/sequel/extensions/pg_json_ops.rb +248 -9
  205. data/lib/sequel/extensions/pg_loose_count.rb +5 -1
  206. data/lib/sequel/extensions/pg_range.rb +162 -146
  207. data/lib/sequel/extensions/pg_range_ops.rb +10 -5
  208. data/lib/sequel/extensions/pg_row.rb +53 -87
  209. data/lib/sequel/extensions/pg_row_ops.rb +36 -13
  210. data/lib/sequel/extensions/pg_static_cache_updater.rb +6 -2
  211. data/lib/sequel/extensions/pg_timestamptz.rb +28 -0
  212. data/lib/sequel/extensions/pretty_table.rb +4 -0
  213. data/lib/sequel/extensions/query.rb +12 -7
  214. data/lib/sequel/extensions/round_timestamps.rb +6 -9
  215. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  216. data/lib/sequel/extensions/s.rb +59 -0
  217. data/lib/sequel/extensions/schema_caching.rb +14 -1
  218. data/lib/sequel/extensions/schema_dumper.rb +83 -55
  219. data/lib/sequel/extensions/select_remove.rb +8 -4
  220. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +85 -0
  221. data/lib/sequel/extensions/server_block.rb +50 -17
  222. data/lib/sequel/extensions/server_logging.rb +61 -0
  223. data/lib/sequel/extensions/split_array_nil.rb +8 -4
  224. data/lib/sequel/extensions/sql_comments.rb +96 -0
  225. data/lib/sequel/extensions/sql_expr.rb +4 -1
  226. data/lib/sequel/extensions/string_agg.rb +181 -0
  227. data/lib/sequel/extensions/string_date_time.rb +2 -0
  228. data/lib/sequel/extensions/symbol_aref.rb +53 -0
  229. data/lib/sequel/extensions/symbol_aref_refinement.rb +43 -0
  230. data/lib/sequel/extensions/symbol_as.rb +23 -0
  231. data/lib/sequel/extensions/symbol_as_refinement.rb +37 -0
  232. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  233. data/lib/sequel/extensions/thread_local_timezones.rb +4 -0
  234. data/lib/sequel/extensions/to_dot.rb +15 -5
  235. data/lib/sequel/extensions/virtual_row_method_block.rb +44 -0
  236. data/lib/sequel/model.rb +36 -126
  237. data/lib/sequel/model/associations.rb +850 -257
  238. data/lib/sequel/model/base.rb +652 -764
  239. data/lib/sequel/model/dataset_module.rb +13 -10
  240. data/lib/sequel/model/default_inflections.rb +3 -1
  241. data/lib/sequel/model/errors.rb +3 -3
  242. data/lib/sequel/model/exceptions.rb +12 -12
  243. data/lib/sequel/model/inflections.rb +8 -19
  244. data/lib/sequel/model/plugins.rb +111 -0
  245. data/lib/sequel/plugins/accessed_columns.rb +2 -0
  246. data/lib/sequel/plugins/active_model.rb +32 -7
  247. data/lib/sequel/plugins/after_initialize.rb +3 -1
  248. data/lib/sequel/plugins/association_dependencies.rb +27 -18
  249. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  250. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  251. data/lib/sequel/plugins/association_pks.rb +181 -83
  252. data/lib/sequel/plugins/association_proxies.rb +33 -9
  253. data/lib/sequel/plugins/auto_validations.rb +58 -23
  254. data/lib/sequel/plugins/before_after_save.rb +8 -0
  255. data/lib/sequel/plugins/blacklist_security.rb +23 -12
  256. data/lib/sequel/plugins/boolean_readers.rb +9 -6
  257. data/lib/sequel/plugins/boolean_subsets.rb +64 -0
  258. data/lib/sequel/plugins/caching.rb +27 -16
  259. data/lib/sequel/plugins/class_table_inheritance.rb +192 -94
  260. data/lib/sequel/plugins/column_conflicts.rb +18 -3
  261. data/lib/sequel/plugins/column_select.rb +9 -5
  262. data/lib/sequel/plugins/columns_updated.rb +42 -0
  263. data/lib/sequel/plugins/composition.rb +36 -24
  264. data/lib/sequel/plugins/constraint_validations.rb +37 -16
  265. data/lib/sequel/plugins/csv_serializer.rb +58 -35
  266. data/lib/sequel/plugins/dataset_associations.rb +60 -18
  267. data/lib/sequel/plugins/def_dataset_method.rb +90 -0
  268. data/lib/sequel/plugins/defaults_setter.rb +74 -13
  269. data/lib/sequel/plugins/delay_add_association.rb +4 -1
  270. data/lib/sequel/plugins/dirty.rb +65 -24
  271. data/lib/sequel/plugins/eager_each.rb +27 -3
  272. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  273. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  274. data/lib/sequel/plugins/error_splitter.rb +19 -12
  275. data/lib/sequel/plugins/finder.rb +246 -0
  276. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  277. data/lib/sequel/plugins/force_encoding.rb +9 -12
  278. data/lib/sequel/plugins/hook_class_methods.rb +39 -54
  279. data/lib/sequel/plugins/input_transformer.rb +20 -10
  280. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  281. data/lib/sequel/plugins/insert_returning_select.rb +4 -2
  282. data/lib/sequel/plugins/instance_filters.rb +12 -8
  283. data/lib/sequel/plugins/instance_hooks.rb +36 -17
  284. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  285. data/lib/sequel/plugins/inverted_subsets.rb +24 -13
  286. data/lib/sequel/plugins/json_serializer.rb +123 -47
  287. data/lib/sequel/plugins/lazy_attributes.rb +20 -14
  288. data/lib/sequel/plugins/list.rb +40 -26
  289. data/lib/sequel/plugins/many_through_many.rb +28 -12
  290. data/lib/sequel/plugins/modification_detection.rb +17 -5
  291. data/lib/sequel/plugins/mssql_optimistic_locking.rb +8 -5
  292. data/lib/sequel/plugins/nested_attributes.rb +55 -28
  293. data/lib/sequel/plugins/optimistic_locking.rb +5 -3
  294. data/lib/sequel/plugins/pg_array_associations.rb +52 -18
  295. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +348 -0
  296. data/lib/sequel/plugins/pg_row.rb +7 -51
  297. data/lib/sequel/plugins/prepared_statements.rb +53 -72
  298. data/lib/sequel/plugins/prepared_statements_safe.rb +13 -5
  299. data/lib/sequel/plugins/rcte_tree.rb +43 -63
  300. data/lib/sequel/plugins/serialization.rb +37 -44
  301. data/lib/sequel/plugins/serialization_modification_detection.rb +3 -1
  302. data/lib/sequel/plugins/sharding.rb +17 -10
  303. data/lib/sequel/plugins/single_table_inheritance.rb +62 -28
  304. data/lib/sequel/plugins/singular_table_names.rb +2 -0
  305. data/lib/sequel/plugins/skip_create_refresh.rb +5 -3
  306. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  307. data/lib/sequel/plugins/split_values.rb +13 -6
  308. data/lib/sequel/plugins/static_cache.rb +79 -53
  309. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  310. data/lib/sequel/plugins/string_stripper.rb +5 -3
  311. data/lib/sequel/plugins/subclasses.rb +20 -2
  312. data/lib/sequel/plugins/subset_conditions.rb +48 -0
  313. data/lib/sequel/plugins/table_select.rb +4 -2
  314. data/lib/sequel/plugins/tactical_eager_loading.rb +120 -6
  315. data/lib/sequel/plugins/throw_failures.rb +110 -0
  316. data/lib/sequel/plugins/timestamps.rb +22 -8
  317. data/lib/sequel/plugins/touch.rb +21 -8
  318. data/lib/sequel/plugins/tree.rb +57 -30
  319. data/lib/sequel/plugins/typecast_on_load.rb +14 -4
  320. data/lib/sequel/plugins/unlimited_update.rb +3 -7
  321. data/lib/sequel/plugins/update_or_create.rb +6 -4
  322. data/lib/sequel/plugins/update_primary_key.rb +3 -1
  323. data/lib/sequel/plugins/update_refresh.rb +28 -15
  324. data/lib/sequel/plugins/uuid.rb +70 -0
  325. data/lib/sequel/plugins/validate_associated.rb +20 -0
  326. data/lib/sequel/plugins/validation_class_methods.rb +40 -19
  327. data/lib/sequel/plugins/validation_contexts.rb +49 -0
  328. data/lib/sequel/plugins/validation_helpers.rb +49 -31
  329. data/lib/sequel/plugins/whitelist_security.rb +122 -0
  330. data/lib/sequel/plugins/xml_serializer.rb +31 -30
  331. data/lib/sequel/sql.rb +479 -329
  332. data/lib/sequel/timezones.rb +62 -32
  333. data/lib/sequel/version.rb +10 -3
  334. metadata +177 -477
  335. data/Rakefile +0 -165
  336. data/doc/active_record.rdoc +0 -912
  337. data/doc/release_notes/1.0.txt +0 -38
  338. data/doc/release_notes/1.1.txt +0 -143
  339. data/doc/release_notes/1.3.txt +0 -101
  340. data/doc/release_notes/1.4.0.txt +0 -53
  341. data/doc/release_notes/1.5.0.txt +0 -155
  342. data/doc/release_notes/2.0.0.txt +0 -298
  343. data/doc/release_notes/2.1.0.txt +0 -271
  344. data/doc/release_notes/2.10.0.txt +0 -328
  345. data/doc/release_notes/2.11.0.txt +0 -215
  346. data/doc/release_notes/2.12.0.txt +0 -534
  347. data/doc/release_notes/2.2.0.txt +0 -253
  348. data/doc/release_notes/2.3.0.txt +0 -88
  349. data/doc/release_notes/2.4.0.txt +0 -106
  350. data/doc/release_notes/2.5.0.txt +0 -137
  351. data/doc/release_notes/2.6.0.txt +0 -157
  352. data/doc/release_notes/2.7.0.txt +0 -166
  353. data/doc/release_notes/2.8.0.txt +0 -171
  354. data/doc/release_notes/2.9.0.txt +0 -97
  355. data/doc/release_notes/3.0.0.txt +0 -221
  356. data/doc/release_notes/3.1.0.txt +0 -406
  357. data/doc/release_notes/3.10.0.txt +0 -286
  358. data/doc/release_notes/3.11.0.txt +0 -254
  359. data/doc/release_notes/3.12.0.txt +0 -304
  360. data/doc/release_notes/3.13.0.txt +0 -210
  361. data/doc/release_notes/3.14.0.txt +0 -118
  362. data/doc/release_notes/3.15.0.txt +0 -78
  363. data/doc/release_notes/3.16.0.txt +0 -45
  364. data/doc/release_notes/3.17.0.txt +0 -58
  365. data/doc/release_notes/3.18.0.txt +0 -120
  366. data/doc/release_notes/3.19.0.txt +0 -67
  367. data/doc/release_notes/3.2.0.txt +0 -268
  368. data/doc/release_notes/3.20.0.txt +0 -41
  369. data/doc/release_notes/3.21.0.txt +0 -87
  370. data/doc/release_notes/3.22.0.txt +0 -39
  371. data/doc/release_notes/3.23.0.txt +0 -172
  372. data/doc/release_notes/3.24.0.txt +0 -420
  373. data/doc/release_notes/3.25.0.txt +0 -88
  374. data/doc/release_notes/3.26.0.txt +0 -88
  375. data/doc/release_notes/3.27.0.txt +0 -82
  376. data/doc/release_notes/3.28.0.txt +0 -304
  377. data/doc/release_notes/3.29.0.txt +0 -459
  378. data/doc/release_notes/3.3.0.txt +0 -192
  379. data/doc/release_notes/3.30.0.txt +0 -135
  380. data/doc/release_notes/3.31.0.txt +0 -146
  381. data/doc/release_notes/3.32.0.txt +0 -202
  382. data/doc/release_notes/3.33.0.txt +0 -157
  383. data/doc/release_notes/3.34.0.txt +0 -671
  384. data/doc/release_notes/3.35.0.txt +0 -144
  385. data/doc/release_notes/3.36.0.txt +0 -245
  386. data/doc/release_notes/3.37.0.txt +0 -338
  387. data/doc/release_notes/3.38.0.txt +0 -234
  388. data/doc/release_notes/3.39.0.txt +0 -237
  389. data/doc/release_notes/3.4.0.txt +0 -325
  390. data/doc/release_notes/3.40.0.txt +0 -73
  391. data/doc/release_notes/3.41.0.txt +0 -155
  392. data/doc/release_notes/3.42.0.txt +0 -74
  393. data/doc/release_notes/3.43.0.txt +0 -105
  394. data/doc/release_notes/3.44.0.txt +0 -152
  395. data/doc/release_notes/3.45.0.txt +0 -179
  396. data/doc/release_notes/3.46.0.txt +0 -122
  397. data/doc/release_notes/3.47.0.txt +0 -270
  398. data/doc/release_notes/3.48.0.txt +0 -477
  399. data/doc/release_notes/3.5.0.txt +0 -510
  400. data/doc/release_notes/3.6.0.txt +0 -366
  401. data/doc/release_notes/3.7.0.txt +0 -179
  402. data/doc/release_notes/3.8.0.txt +0 -151
  403. data/doc/release_notes/3.9.0.txt +0 -233
  404. data/doc/release_notes/4.0.0.txt +0 -262
  405. data/doc/release_notes/4.1.0.txt +0 -85
  406. data/doc/release_notes/4.10.0.txt +0 -226
  407. data/doc/release_notes/4.11.0.txt +0 -147
  408. data/doc/release_notes/4.12.0.txt +0 -105
  409. data/doc/release_notes/4.13.0.txt +0 -169
  410. data/doc/release_notes/4.14.0.txt +0 -68
  411. data/doc/release_notes/4.15.0.txt +0 -56
  412. data/doc/release_notes/4.16.0.txt +0 -36
  413. data/doc/release_notes/4.17.0.txt +0 -38
  414. data/doc/release_notes/4.18.0.txt +0 -36
  415. data/doc/release_notes/4.19.0.txt +0 -45
  416. data/doc/release_notes/4.2.0.txt +0 -129
  417. data/doc/release_notes/4.20.0.txt +0 -79
  418. data/doc/release_notes/4.21.0.txt +0 -94
  419. data/doc/release_notes/4.22.0.txt +0 -72
  420. data/doc/release_notes/4.23.0.txt +0 -65
  421. data/doc/release_notes/4.24.0.txt +0 -99
  422. data/doc/release_notes/4.25.0.txt +0 -181
  423. data/doc/release_notes/4.26.0.txt +0 -44
  424. data/doc/release_notes/4.3.0.txt +0 -40
  425. data/doc/release_notes/4.4.0.txt +0 -92
  426. data/doc/release_notes/4.5.0.txt +0 -34
  427. data/doc/release_notes/4.6.0.txt +0 -30
  428. data/doc/release_notes/4.7.0.txt +0 -103
  429. data/doc/release_notes/4.8.0.txt +0 -175
  430. data/doc/release_notes/4.9.0.txt +0 -190
  431. data/lib/sequel/adapters/cubrid.rb +0 -142
  432. data/lib/sequel/adapters/do.rb +0 -156
  433. data/lib/sequel/adapters/do/mysql.rb +0 -64
  434. data/lib/sequel/adapters/do/postgres.rb +0 -42
  435. data/lib/sequel/adapters/do/sqlite3.rb +0 -40
  436. data/lib/sequel/adapters/jdbc/as400.rb +0 -82
  437. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -62
  438. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -34
  439. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -31
  440. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -31
  441. data/lib/sequel/adapters/odbc/progress.rb +0 -8
  442. data/lib/sequel/adapters/shared/cubrid.rb +0 -243
  443. data/lib/sequel/adapters/shared/firebird.rb +0 -245
  444. data/lib/sequel/adapters/shared/informix.rb +0 -52
  445. data/lib/sequel/adapters/shared/mysql_prepared_statements.rb +0 -150
  446. data/lib/sequel/adapters/shared/progress.rb +0 -38
  447. data/lib/sequel/adapters/swift.rb +0 -158
  448. data/lib/sequel/adapters/swift/mysql.rb +0 -47
  449. data/lib/sequel/adapters/swift/postgres.rb +0 -45
  450. data/lib/sequel/adapters/swift/sqlite.rb +0 -47
  451. data/lib/sequel/adapters/utils/pg_types.rb +0 -68
  452. data/lib/sequel/dataset/mutation.rb +0 -109
  453. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -3
  454. data/lib/sequel/extensions/filter_having.rb +0 -59
  455. data/lib/sequel/extensions/hash_aliases.rb +0 -45
  456. data/lib/sequel/extensions/meta_def.rb +0 -31
  457. data/lib/sequel/extensions/query_literals.rb +0 -80
  458. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -22
  459. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -118
  460. data/lib/sequel/extensions/set_overrides.rb +0 -72
  461. data/lib/sequel/no_core_ext.rb +0 -1
  462. data/lib/sequel/plugins/association_autoreloading.rb +0 -7
  463. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -7
  464. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -78
  465. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -117
  466. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -59
  467. data/lib/sequel/plugins/schema.rb +0 -80
  468. data/lib/sequel/plugins/scissors.rb +0 -33
  469. data/spec/adapters/db2_spec.rb +0 -160
  470. data/spec/adapters/firebird_spec.rb +0 -411
  471. data/spec/adapters/informix_spec.rb +0 -100
  472. data/spec/adapters/mssql_spec.rb +0 -706
  473. data/spec/adapters/mysql_spec.rb +0 -1287
  474. data/spec/adapters/oracle_spec.rb +0 -313
  475. data/spec/adapters/postgres_spec.rb +0 -3725
  476. data/spec/adapters/spec_helper.rb +0 -43
  477. data/spec/adapters/sqlanywhere_spec.rb +0 -170
  478. data/spec/adapters/sqlite_spec.rb +0 -653
  479. data/spec/bin_spec.rb +0 -254
  480. data/spec/core/connection_pool_spec.rb +0 -1016
  481. data/spec/core/database_spec.rb +0 -2531
  482. data/spec/core/dataset_spec.rb +0 -5098
  483. data/spec/core/deprecated_spec.rb +0 -70
  484. data/spec/core/expression_filters_spec.rb +0 -1243
  485. data/spec/core/mock_adapter_spec.rb +0 -462
  486. data/spec/core/object_graph_spec.rb +0 -303
  487. data/spec/core/placeholder_literalizer_spec.rb +0 -163
  488. data/spec/core/schema_generator_spec.rb +0 -179
  489. data/spec/core/schema_spec.rb +0 -1659
  490. data/spec/core/spec_helper.rb +0 -34
  491. data/spec/core/version_spec.rb +0 -7
  492. data/spec/core_extensions_spec.rb +0 -699
  493. data/spec/extensions/accessed_columns_spec.rb +0 -51
  494. data/spec/extensions/active_model_spec.rb +0 -123
  495. data/spec/extensions/after_initialize_spec.rb +0 -24
  496. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  497. data/spec/extensions/association_dependencies_spec.rb +0 -117
  498. data/spec/extensions/association_pks_spec.rb +0 -365
  499. data/spec/extensions/association_proxies_spec.rb +0 -86
  500. data/spec/extensions/auto_validations_spec.rb +0 -192
  501. data/spec/extensions/blacklist_security_spec.rb +0 -88
  502. data/spec/extensions/blank_spec.rb +0 -69
  503. data/spec/extensions/boolean_readers_spec.rb +0 -93
  504. data/spec/extensions/caching_spec.rb +0 -270
  505. data/spec/extensions/class_table_inheritance_spec.rb +0 -420
  506. data/spec/extensions/column_conflicts_spec.rb +0 -60
  507. data/spec/extensions/column_select_spec.rb +0 -108
  508. data/spec/extensions/columns_introspection_spec.rb +0 -91
  509. data/spec/extensions/composition_spec.rb +0 -242
  510. data/spec/extensions/connection_validator_spec.rb +0 -120
  511. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -274
  512. data/spec/extensions/constraint_validations_spec.rb +0 -325
  513. data/spec/extensions/core_refinements_spec.rb +0 -519
  514. data/spec/extensions/csv_serializer_spec.rb +0 -173
  515. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  516. data/spec/extensions/dataset_associations_spec.rb +0 -311
  517. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  518. data/spec/extensions/date_arithmetic_spec.rb +0 -150
  519. data/spec/extensions/defaults_setter_spec.rb +0 -101
  520. data/spec/extensions/delay_add_association_spec.rb +0 -52
  521. data/spec/extensions/dirty_spec.rb +0 -180
  522. data/spec/extensions/eager_each_spec.rb +0 -42
  523. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  524. data/spec/extensions/error_splitter_spec.rb +0 -18
  525. data/spec/extensions/error_sql_spec.rb +0 -20
  526. data/spec/extensions/eval_inspect_spec.rb +0 -73
  527. data/spec/extensions/filter_having_spec.rb +0 -40
  528. data/spec/extensions/force_encoding_spec.rb +0 -114
  529. data/spec/extensions/from_block_spec.rb +0 -21
  530. data/spec/extensions/graph_each_spec.rb +0 -109
  531. data/spec/extensions/hash_aliases_spec.rb +0 -24
  532. data/spec/extensions/hook_class_methods_spec.rb +0 -429
  533. data/spec/extensions/inflector_spec.rb +0 -183
  534. data/spec/extensions/input_transformer_spec.rb +0 -54
  535. data/spec/extensions/insert_returning_select_spec.rb +0 -46
  536. data/spec/extensions/instance_filters_spec.rb +0 -79
  537. data/spec/extensions/instance_hooks_spec.rb +0 -276
  538. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  539. data/spec/extensions/json_serializer_spec.rb +0 -291
  540. data/spec/extensions/lazy_attributes_spec.rb +0 -170
  541. data/spec/extensions/list_spec.rb +0 -267
  542. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  543. data/spec/extensions/many_through_many_spec.rb +0 -2172
  544. data/spec/extensions/meta_def_spec.rb +0 -21
  545. data/spec/extensions/migration_spec.rb +0 -712
  546. data/spec/extensions/modification_detection_spec.rb +0 -80
  547. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -91
  548. data/spec/extensions/named_timezones_spec.rb +0 -108
  549. data/spec/extensions/nested_attributes_spec.rb +0 -697
  550. data/spec/extensions/null_dataset_spec.rb +0 -85
  551. data/spec/extensions/optimistic_locking_spec.rb +0 -128
  552. data/spec/extensions/pagination_spec.rb +0 -118
  553. data/spec/extensions/pg_array_associations_spec.rb +0 -736
  554. data/spec/extensions/pg_array_ops_spec.rb +0 -143
  555. data/spec/extensions/pg_array_spec.rb +0 -395
  556. data/spec/extensions/pg_enum_spec.rb +0 -92
  557. data/spec/extensions/pg_hstore_ops_spec.rb +0 -236
  558. data/spec/extensions/pg_hstore_spec.rb +0 -206
  559. data/spec/extensions/pg_inet_ops_spec.rb +0 -101
  560. data/spec/extensions/pg_inet_spec.rb +0 -52
  561. data/spec/extensions/pg_interval_spec.rb +0 -76
  562. data/spec/extensions/pg_json_ops_spec.rb +0 -229
  563. data/spec/extensions/pg_json_spec.rb +0 -218
  564. data/spec/extensions/pg_loose_count_spec.rb +0 -17
  565. data/spec/extensions/pg_range_ops_spec.rb +0 -58
  566. data/spec/extensions/pg_range_spec.rb +0 -404
  567. data/spec/extensions/pg_row_ops_spec.rb +0 -60
  568. data/spec/extensions/pg_row_plugin_spec.rb +0 -62
  569. data/spec/extensions/pg_row_spec.rb +0 -360
  570. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -92
  571. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -63
  572. data/spec/extensions/prepared_statements_associations_spec.rb +0 -159
  573. data/spec/extensions/prepared_statements_safe_spec.rb +0 -61
  574. data/spec/extensions/prepared_statements_spec.rb +0 -103
  575. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -31
  576. data/spec/extensions/pretty_table_spec.rb +0 -92
  577. data/spec/extensions/query_literals_spec.rb +0 -183
  578. data/spec/extensions/query_spec.rb +0 -102
  579. data/spec/extensions/rcte_tree_spec.rb +0 -392
  580. data/spec/extensions/round_timestamps_spec.rb +0 -43
  581. data/spec/extensions/schema_caching_spec.rb +0 -41
  582. data/spec/extensions/schema_dumper_spec.rb +0 -789
  583. data/spec/extensions/schema_spec.rb +0 -117
  584. data/spec/extensions/scissors_spec.rb +0 -26
  585. data/spec/extensions/select_remove_spec.rb +0 -38
  586. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -101
  587. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  588. data/spec/extensions/serialization_spec.rb +0 -362
  589. data/spec/extensions/server_block_spec.rb +0 -90
  590. data/spec/extensions/set_overrides_spec.rb +0 -61
  591. data/spec/extensions/sharding_spec.rb +0 -198
  592. data/spec/extensions/shared_caching_spec.rb +0 -175
  593. data/spec/extensions/single_table_inheritance_spec.rb +0 -297
  594. data/spec/extensions/singular_table_names_spec.rb +0 -22
  595. data/spec/extensions/skip_create_refresh_spec.rb +0 -17
  596. data/spec/extensions/spec_helper.rb +0 -71
  597. data/spec/extensions/split_array_nil_spec.rb +0 -24
  598. data/spec/extensions/split_values_spec.rb +0 -22
  599. data/spec/extensions/sql_expr_spec.rb +0 -60
  600. data/spec/extensions/static_cache_spec.rb +0 -361
  601. data/spec/extensions/string_date_time_spec.rb +0 -95
  602. data/spec/extensions/string_stripper_spec.rb +0 -68
  603. data/spec/extensions/subclasses_spec.rb +0 -66
  604. data/spec/extensions/table_select_spec.rb +0 -71
  605. data/spec/extensions/tactical_eager_loading_spec.rb +0 -82
  606. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  607. data/spec/extensions/timestamps_spec.rb +0 -175
  608. data/spec/extensions/to_dot_spec.rb +0 -154
  609. data/spec/extensions/touch_spec.rb +0 -203
  610. data/spec/extensions/tree_spec.rb +0 -274
  611. data/spec/extensions/typecast_on_load_spec.rb +0 -80
  612. data/spec/extensions/unlimited_update_spec.rb +0 -20
  613. data/spec/extensions/update_or_create_spec.rb +0 -87
  614. data/spec/extensions/update_primary_key_spec.rb +0 -100
  615. data/spec/extensions/update_refresh_spec.rb +0 -53
  616. data/spec/extensions/validate_associated_spec.rb +0 -52
  617. data/spec/extensions/validation_class_methods_spec.rb +0 -1027
  618. data/spec/extensions/validation_helpers_spec.rb +0 -541
  619. data/spec/extensions/xml_serializer_spec.rb +0 -207
  620. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  621. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  622. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  623. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  624. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  625. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  626. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  627. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  628. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  629. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  630. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  631. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  632. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  633. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  634. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  635. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  636. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  637. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  638. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  639. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  640. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  641. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  642. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  643. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  644. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  645. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  646. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  647. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  648. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  649. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  650. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  651. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  652. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  653. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  654. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  655. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  656. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  657. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  658. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  659. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  660. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  661. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  662. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  663. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  664. data/spec/guards_helper.rb +0 -55
  665. data/spec/integration/associations_test.rb +0 -2454
  666. data/spec/integration/database_test.rb +0 -113
  667. data/spec/integration/dataset_test.rb +0 -1808
  668. data/spec/integration/eager_loader_test.rb +0 -687
  669. data/spec/integration/migrator_test.rb +0 -240
  670. data/spec/integration/model_test.rb +0 -226
  671. data/spec/integration/plugin_test.rb +0 -2240
  672. data/spec/integration/prepared_statement_test.rb +0 -467
  673. data/spec/integration/schema_test.rb +0 -817
  674. data/spec/integration/spec_helper.rb +0 -48
  675. data/spec/integration/timezone_test.rb +0 -86
  676. data/spec/integration/transaction_test.rb +0 -374
  677. data/spec/integration/type_test.rb +0 -133
  678. data/spec/model/association_reflection_spec.rb +0 -525
  679. data/spec/model/associations_spec.rb +0 -4426
  680. data/spec/model/base_spec.rb +0 -759
  681. data/spec/model/class_dataset_methods_spec.rb +0 -146
  682. data/spec/model/dataset_methods_spec.rb +0 -149
  683. data/spec/model/eager_loading_spec.rb +0 -2137
  684. data/spec/model/hooks_spec.rb +0 -604
  685. data/spec/model/inflector_spec.rb +0 -26
  686. data/spec/model/model_spec.rb +0 -982
  687. data/spec/model/plugins_spec.rb +0 -299
  688. data/spec/model/record_spec.rb +0 -2147
  689. data/spec/model/spec_helper.rb +0 -46
  690. data/spec/model/validations_spec.rb +0 -193
  691. data/spec/sequel_coverage.rb +0 -15
  692. data/spec/spec_config.rb +0 -10
@@ -1,80 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe Sequel::Model, "TypecastOnLoad plugin" do
4
- before do
5
- @db = Sequel.mock(:fetch=>{:id=>1, :b=>"1", :y=>"0"}, :columns=>[:id, :b, :y], :numrows=>1)
6
- def @db.supports_schema_parsing?() true end
7
- def @db.schema(*args)
8
- [[:id, {}], [:y, {:type=>:boolean, :db_type=>'tinyint(1)'}], [:b, {:type=>:integer, :db_type=>'integer'}]]
9
- end
10
- @c = Class.new(Sequel::Model(@db[:items])) do
11
- attr_accessor :bset
12
- def b=(x)
13
- self.bset = true
14
- super
15
- end
16
- end
17
- end
18
-
19
- it "should call setter method with value when loading the object, for all given columns" do
20
- @c.plugin :typecast_on_load, :b
21
- o = @c.load(:id=>1, :b=>"1", :y=>"0")
22
- o.values.must_equal(:id=>1, :b=>1, :y=>"0")
23
- o.bset.must_equal true
24
- end
25
-
26
- it "should call setter method with value when reloading the object, for all given columns" do
27
- @c.plugin :typecast_on_load, :b
28
- o = @c.load(:id=>1, :b=>"1", :y=>"0")
29
- o.refresh
30
- o.values.must_equal(:id=>1, :b=>1, :y=>"0")
31
- o.bset.must_equal true
32
- end
33
-
34
- it "should call setter method with value when automatically reloading the object on creation" do
35
- @c.plugin :typecast_on_load, :b
36
- o = @c.new(:b=>"1", :y=>"0")
37
- o.save.values.must_equal(:id=>1, :b=>1, :y=>"0")
38
- o.bset.must_equal true
39
- end
40
-
41
- it "should call setter method with value when automatically reloading the object on creation via insert_select" do
42
- @c.plugin :typecast_on_load, :b
43
- @c.dataset.meta_def(:insert_select){|h| insert(h); first}
44
- o = @c.new(:b=>"1", :y=>"0")
45
- o.save.values.must_equal(:id=>1, :b=>1, :y=>"0")
46
- o.bset.must_equal true
47
- end
48
-
49
- it "should allowing setting columns separately via add_typecast_on_load_columns" do
50
- @c.plugin :typecast_on_load
51
- @c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>"1", :y=>"0")
52
- @c.add_typecast_on_load_columns :b
53
- @c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>1, :y=>"0")
54
- @c.add_typecast_on_load_columns :y
55
- @c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>1, :y=>false)
56
- end
57
-
58
- it "should work with subclasses" do
59
- @c.plugin :typecast_on_load
60
- @c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>"1", :y=>"0")
61
-
62
- c1 = Class.new(@c)
63
- @c.add_typecast_on_load_columns :b
64
- @c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>1, :y=>"0")
65
- c1.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>"1", :y=>"0")
66
-
67
- c2 = Class.new(@c)
68
- @c.add_typecast_on_load_columns :y
69
- @c.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>1, :y=>false)
70
- c2.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>1, :y=>"0")
71
-
72
- c1.add_typecast_on_load_columns :y
73
- c1.load(:id=>1, :b=>"1", :y=>"0").values.must_equal(:id=>1, :b=>"1", :y=>false)
74
- end
75
-
76
- it "should not mark the object as modified" do
77
- @c.plugin :typecast_on_load, :b
78
- @c.load(:id=>1, :b=>"1", :y=>"0").modified?.must_equal false
79
- end
80
- end
@@ -1,20 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Sequel::Plugins::UnlimitedUpdate" do
4
- before do
5
- @db = Sequel.mock(:host=>'mysql', :numrows=>1)
6
- @c = Class.new(Sequel::Model(@db[:test]))
7
- @c.columns :id, :name
8
- @o = @c.load(:id=>1, :name=>'a')
9
- @db.sqls
10
- end
11
-
12
- it "should remove limit from update dataset" do
13
- @o.save
14
- @db.sqls.must_equal ["UPDATE test SET name = 'a' WHERE (id = 1) LIMIT 1"]
15
-
16
- @c.plugin :unlimited_update
17
- @o.save
18
- @db.sqls.must_equal ["UPDATE test SET name = 'a' WHERE (id = 1)"]
19
- end
20
- end
@@ -1,87 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Sequel::Plugins::UpdateOrCreate" do
4
- before do
5
- @db = Sequel.mock(:autoid=>proc{1}, :numrows=>1)
6
- @c = Class.new(Sequel::Model(@db[:test]))
7
- @c.plugin :update_or_create
8
- @c.columns :id, :a, :b
9
- @db.sqls
10
- end
11
-
12
- it ".update_or_create should update an existing record if one exists" do
13
- @db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
14
- @c.update_or_create(:a=>2){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>2, :b=>4)
15
- @db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1", "UPDATE test SET b = 4 WHERE (id = 1)"]
16
-
17
- @db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
18
- @c.update_or_create({:a=>2}, :b=>4).must_equal @c.load(:id=>1, :a=>2, :b=>4)
19
- @db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1", "UPDATE test SET b = 4 WHERE (id = 1)"]
20
-
21
- @db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
22
- @c.update_or_create({:a=>2}, :a=>3){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>3, :b=>4)
23
- sqls = @db.sqls
24
- sqls.shift.must_equal "SELECT * FROM test WHERE (a = 2) LIMIT 1"
25
- sqls.shift.must_match(/UPDATE test SET [ab] = [34], [ab] = [34] WHERE \(id = 1\)/)
26
- end
27
-
28
- it ".update_or_create should create a record if an existing record does not exist" do
29
- @db.fetch = [[], [{:id=>1, :a=>1, :b=>4}]]
30
- @c.update_or_create(:a=>1){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>1, :b=>4)
31
- sqls = @db.sqls
32
- sqls.shift.must_equal "SELECT * FROM test WHERE (a = 1) LIMIT 1"
33
- sqls.shift.must_match(/INSERT INTO test \([ab], [ab]\) VALUES \([14], [14]\)/)
34
- sqls.shift.must_equal "SELECT * FROM test WHERE (id = 1) LIMIT 1"
35
-
36
- @db.fetch = [[], [{:id=>1, :a=>1, :b=>4}]]
37
- @c.update_or_create({:a=>1}, :b=>4).must_equal @c.load(:id=>1, :a=>1, :b=>4)
38
- sqls = @db.sqls
39
- sqls.shift.must_equal "SELECT * FROM test WHERE (a = 1) LIMIT 1"
40
- sqls.shift.must_match(/INSERT INTO test \([ab], [ab]\) VALUES \([14], [14]\)/)
41
- sqls.shift.must_equal "SELECT * FROM test WHERE (id = 1) LIMIT 1"
42
-
43
- @db.fetch = [[], [{:id=>1, :a=>3, :b=>4}]]
44
- @c.update_or_create({:a=>1}, :a=>3){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>3, :b=>4)
45
- sqls = @db.sqls
46
- sqls.shift.must_equal "SELECT * FROM test WHERE (a = 1) LIMIT 1"
47
- sqls.shift.must_match(/INSERT INTO test \([ab], [ab]\) VALUES \([34], [34]\)/)
48
- sqls.shift.must_equal "SELECT * FROM test WHERE (id = 1) LIMIT 1"
49
- end
50
-
51
- it ".update_or_create should return an existing record even if no changes necessary" do
52
- @db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
53
- @c.update_or_create(:a=>2){|t| t.b = 3}.must_equal @c.load(:id=>1, :a=>2, :b=>3)
54
- @db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1"]
55
- end
56
-
57
- it ".find_or_new should return an existing record" do
58
- @db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
59
- @c.find_or_new(:a=>2){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>2, :b=>4)
60
- @db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1"]
61
-
62
- @db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
63
- @c.find_or_new({:a=>2}, :b=>4).must_equal @c.load(:id=>1, :a=>2, :b=>4)
64
- @db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1"]
65
-
66
- @db.fetch = [[{:id=>1, :a=>2, :b=>3}]]
67
- @c.find_or_new({:a=>2}, :a=>3){|t| t.b = 4}.must_equal @c.load(:id=>1, :a=>3, :b=>4)
68
- @db.sqls.must_equal ["SELECT * FROM test WHERE (a = 2) LIMIT 1"]
69
- end
70
-
71
- it ".find_or_new should return a new record if no record exists" do
72
- o = @c.find_or_new(:a=>1){|t| t.b = 4}
73
- o.must_equal @c.load(:a=>1, :b=>4)
74
- o.new?.must_equal true
75
- @db.sqls.must_equal ["SELECT * FROM test WHERE (a = 1) LIMIT 1"]
76
-
77
- o = @c.find_or_new({:a=>1}, :b=>4)
78
- o.must_equal @c.load(:a=>1, :b=>4)
79
- o.new?.must_equal true
80
- @db.sqls.must_equal ["SELECT * FROM test WHERE (a = 1) LIMIT 1"]
81
-
82
- o = @c.find_or_new({:a=>1}, :a=>3){|t| t.b = 4}
83
- o.must_equal @c.load(:a=>3, :b=>4)
84
- o.new?.must_equal true
85
- @db.sqls.must_equal ["SELECT * FROM test WHERE (a = 1) LIMIT 1"]
86
- end
87
- end
@@ -1,100 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Sequel::Plugins::UpdatePrimaryKey" do
4
- before do
5
- @c = Class.new(Sequel::Model(:a))
6
- @c.plugin :update_primary_key
7
- @c.columns :a, :b
8
- @c.set_primary_key :a
9
- @c.unrestrict_primary_key
10
- @ds = @c.dataset
11
- DB.reset
12
- end
13
-
14
- it "should handle regular updates" do
15
- @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>1, :b=>4}], [{:a=>1, :b=>4}], [{:a=>1, :b=>5}], [{:a=>1, :b=>5}], [{:a=>1, :b=>6}], [{:a=>1, :b=>6}]]
16
- @c.first.update(:b=>4)
17
- @c.all.must_equal [@c.load(:a=>1, :b=>4)]
18
- DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET b = 4 WHERE (a = 1)", "SELECT * FROM a"]
19
- @c.first.set(:b=>5).save
20
- @c.all.must_equal [@c.load(:a=>1, :b=>5)]
21
- DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET b = 5 WHERE (a = 1)", "SELECT * FROM a"]
22
- @c.first.set(:b=>6).save(:columns=>:b)
23
- @c.all.must_equal [@c.load(:a=>1, :b=>6)]
24
- DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET b = 6 WHERE (a = 1)", "SELECT * FROM a"]
25
- end
26
-
27
- it "should handle updating the primary key field with another field" do
28
- @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>4}]]
29
- @c.first.update(:a=>2, :b=>4)
30
- @c.all.must_equal [@c.load(:a=>2, :b=>4)]
31
- sqls = DB.sqls
32
- ["UPDATE a SET a = 2, b = 4 WHERE (a = 1)", "UPDATE a SET b = 4, a = 2 WHERE (a = 1)"].must_include(sqls.slice!(1))
33
- sqls.must_equal ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
34
- end
35
-
36
- it "should handle updating just the primary key field when saving changes" do
37
- @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>3}], [{:a=>2, :b=>3}], [{:a=>3, :b=>3}]]
38
- @c.first.update(:a=>2)
39
- @c.all.must_equal [@c.load(:a=>2, :b=>3)]
40
- DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET a = 2 WHERE (a = 1)", "SELECT * FROM a"]
41
- @c.first.set(:a=>3).save(:columns=>:a)
42
- @c.all.must_equal [@c.load(:a=>3, :b=>3)]
43
- DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET a = 3 WHERE (a = 2)", "SELECT * FROM a"]
44
- end
45
-
46
- it "should handle saving after modifying the primary key field with another field" do
47
- @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>4}]]
48
- @c.first.set(:a=>2, :b=>4).save
49
- @c.all.must_equal [@c.load(:a=>2, :b=>4)]
50
- sqls = DB.sqls
51
- ["UPDATE a SET a = 2, b = 4 WHERE (a = 1)", "UPDATE a SET b = 4, a = 2 WHERE (a = 1)"].must_include(sqls.slice!(1))
52
- sqls.must_equal ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
53
- end
54
-
55
- it "should handle saving after modifying just the primary key field" do
56
- @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>3}]]
57
- @c.first.set(:a=>2).save
58
- @c.all.must_equal [@c.load(:a=>2, :b=>3)]
59
- sqls = DB.sqls
60
- ["UPDATE a SET a = 2, b = 3 WHERE (a = 1)", "UPDATE a SET b = 3, a = 2 WHERE (a = 1)"].must_include(sqls.slice!(1))
61
- sqls.must_equal ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
62
- end
63
-
64
- it "should handle saving after updating the primary key" do
65
- @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>5}]]
66
- @c.first.update(:a=>2).update(:b=>4).set(:b=>5).save
67
- @c.all.must_equal [@c.load(:a=>2, :b=>5)]
68
- DB.sqls.must_equal ["SELECT * FROM a LIMIT 1", "UPDATE a SET a = 2 WHERE (a = 1)", "UPDATE a SET b = 4 WHERE (a = 2)", "UPDATE a SET b = 5 WHERE (a = 2)", "SELECT * FROM a"]
69
- end
70
-
71
- it "should work correctly when using the prepared_statements plugin" do
72
- @c.plugin :prepared_statements
73
- @ds._fetch = [[{:a=>1, :b=>3}], [{:a=>2, :b=>4}]]
74
- o = @c.first
75
- o.update(:a=>2, :b=>4)
76
- @c.all.must_equal [@c.load(:a=>2, :b=>4)]
77
- sqls = DB.sqls
78
- ["UPDATE a SET a = 2, b = 4 WHERE (a = 1)", "UPDATE a SET b = 4, a = 2 WHERE (a = 1)"].must_include(sqls.slice!(1))
79
- sqls.must_equal ["SELECT * FROM a LIMIT 1", "SELECT * FROM a"]
80
-
81
- o.delete
82
- end
83
-
84
- it "should clear the associations cache of non-many_to_one associations when changing the primary key" do
85
- @c.one_to_many :cs, :class=>@c
86
- @c.many_to_one :c, :class=>@c
87
- o = @c.new(:a=>1)
88
- o.associations[:cs] = @c.new
89
- o.associations[:c] = o2 = @c.new
90
- o.a = 2
91
- o.associations.must_equal(:c=>o2)
92
- end
93
-
94
- it "should handle frozen instances" do
95
- o = @c.new
96
- o.a = 1
97
- o.freeze
98
- o.pk_hash.must_equal(:a=>1)
99
- end
100
- end
@@ -1,53 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "spec_helper")
2
-
3
- describe "Sequel::Plugins::UpdateRefresh" do
4
- before do
5
- @db = Sequel.mock(:numrows=>1, :fetch=>{:id=>1, :name=>'b'})
6
- @c = Class.new(Sequel::Model(@db[:test]))
7
- @ds = @c.dataset
8
- @c.columns :id, :name
9
- @c.plugin :update_refresh
10
- @db.sqls
11
- end
12
-
13
- it "should refresh the instance after updating" do
14
- o = @c.load(:id=>1, :name=>'a')
15
- o.save
16
- @db.sqls.must_equal ["UPDATE test SET name = 'a' WHERE (id = 1)", "SELECT * FROM test WHERE (id = 1) LIMIT 1"]
17
- o.name.must_equal 'b'
18
- end
19
-
20
- it "should refresh the instance after updating" do
21
- @db.extend_datasets{def supports_returning?(x) true end; def update_sql(*); sql = super; update_returning_sql(sql); sql end}
22
- @c.dataset = @db[:test]
23
- @db.sqls
24
- o = @c.load(:id=>1, :name=>'a')
25
- o.save
26
- @db.sqls.must_equal ["UPDATE test SET name = 'a' WHERE (id = 1) RETURNING *"]
27
- o.name.must_equal 'b'
28
- end
29
-
30
- it "should support specifying columns to return" do
31
- @db.extend_datasets{def supports_returning?(x) true end; def update_sql(*); sql = super; update_returning_sql(sql); sql end}
32
- @c.plugin :update_refresh, :columns => [ :a ]
33
- @c.dataset = @db[:test]
34
- @db.sqls
35
- o = @c.load(:id=>1, :name=>'a')
36
- o.save
37
- @db.sqls.must_equal ["UPDATE test SET name = 'a' WHERE (id = 1) RETURNING a"]
38
- o.name.must_equal 'b'
39
- end
40
-
41
-
42
- it "should refresh the instance after updating when returning specific columns" do
43
- @db.extend_datasets{def supports_returning?(x) true end; def update_sql(*); sql = super; update_returning_sql(sql); sql end}
44
- @c.plugin :insert_returning_select
45
- @c.dataset = @db[:test].select(:id, :name)
46
- @db.sqls
47
- o = @c.load(:id=>1, :name=>'a')
48
- o.this.opts[:returning] = [:id, :name]
49
- o.save
50
- @db.sqls.must_equal ["UPDATE test SET name = 'a' WHERE (id = 1) RETURNING id, name"]
51
- o.name.must_equal 'b'
52
- end
53
- end
@@ -1,52 +0,0 @@
1
- require File.join(File.dirname(File.expand_path(__FILE__)), "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_equal 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,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