sequel 4.49.0 → 5.3.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 (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +130 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +6 -9
  6. data/doc/advanced_associations.rdoc +91 -168
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  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.2.0.txt +33 -0
  30. data/doc/release_notes/5.3.0.txt +121 -0
  31. data/doc/schema_modification.rdoc +78 -64
  32. data/doc/security.rdoc +97 -88
  33. data/doc/sharding.rdoc +43 -30
  34. data/doc/sql.rdoc +53 -65
  35. data/doc/testing.rdoc +4 -5
  36. data/doc/thread_safety.rdoc +2 -4
  37. data/doc/transactions.rdoc +18 -17
  38. data/doc/validations.rdoc +48 -45
  39. data/doc/virtual_rows.rdoc +87 -115
  40. data/lib/sequel/adapters/ado/access.rb +7 -13
  41. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  42. data/lib/sequel/adapters/ado.rb +9 -25
  43. data/lib/sequel/adapters/amalgalite.rb +3 -18
  44. data/lib/sequel/adapters/ibmdb.rb +9 -45
  45. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  46. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  47. data/lib/sequel/adapters/jdbc/h2.rb +6 -26
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
  49. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  50. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  51. data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
  52. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  53. data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
  54. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  55. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  56. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  57. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  58. data/lib/sequel/adapters/jdbc.rb +18 -74
  59. data/lib/sequel/adapters/mock.rb +4 -30
  60. data/lib/sequel/adapters/mysql.rb +7 -44
  61. data/lib/sequel/adapters/mysql2.rb +5 -23
  62. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  63. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  64. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  65. data/lib/sequel/adapters/odbc.rb +0 -19
  66. data/lib/sequel/adapters/oracle.rb +8 -13
  67. data/lib/sequel/adapters/postgres.rb +28 -150
  68. data/lib/sequel/adapters/postgresql.rb +1 -1
  69. data/lib/sequel/adapters/shared/access.rb +11 -51
  70. data/lib/sequel/adapters/shared/db2.rb +3 -61
  71. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  72. data/lib/sequel/adapters/shared/mysql.rb +61 -227
  73. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +58 -264
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  76. data/lib/sequel/adapters/shared/sqlite.rb +22 -101
  77. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  78. data/lib/sequel/adapters/sqlite.rb +2 -19
  79. data/lib/sequel/adapters/tinytds.rb +5 -15
  80. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
  82. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  83. data/lib/sequel/adapters/utils/replace.rb +0 -5
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  85. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  86. data/lib/sequel/ast_transformer.rb +3 -94
  87. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  88. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  89. data/lib/sequel/connection_pool/single.rb +0 -2
  90. data/lib/sequel/connection_pool/threaded.rb +94 -110
  91. data/lib/sequel/connection_pool.rb +38 -28
  92. data/lib/sequel/core.rb +42 -101
  93. data/lib/sequel/database/connecting.rb +23 -60
  94. data/lib/sequel/database/dataset.rb +6 -9
  95. data/lib/sequel/database/dataset_defaults.rb +4 -48
  96. data/lib/sequel/database/features.rb +5 -4
  97. data/lib/sequel/database/logging.rb +2 -9
  98. data/lib/sequel/database/misc.rb +36 -55
  99. data/lib/sequel/database/query.rb +8 -13
  100. data/lib/sequel/database/schema_generator.rb +93 -64
  101. data/lib/sequel/database/schema_methods.rb +61 -79
  102. data/lib/sequel/database/transactions.rb +4 -24
  103. data/lib/sequel/database.rb +12 -2
  104. data/lib/sequel/dataset/actions.rb +57 -107
  105. data/lib/sequel/dataset/dataset_module.rb +4 -16
  106. data/lib/sequel/dataset/features.rb +35 -30
  107. data/lib/sequel/dataset/graph.rb +40 -49
  108. data/lib/sequel/dataset/misc.rb +12 -37
  109. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  110. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  111. data/lib/sequel/dataset/query.rb +91 -161
  112. data/lib/sequel/dataset/sql.rb +33 -225
  113. data/lib/sequel/dataset.rb +18 -10
  114. data/lib/sequel/deprecated.rb +18 -27
  115. data/lib/sequel/exceptions.rb +1 -17
  116. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  117. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  118. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  119. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  120. data/lib/sequel/extensions/connection_validator.rb +1 -1
  121. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  122. data/lib/sequel/extensions/core_extensions.rb +39 -49
  123. data/lib/sequel/extensions/core_refinements.rb +39 -45
  124. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  125. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  126. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  127. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  128. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  129. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  130. data/lib/sequel/extensions/from_block.rb +1 -35
  131. data/lib/sequel/extensions/graph_each.rb +2 -2
  132. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  133. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  134. data/lib/sequel/extensions/inflector.rb +4 -4
  135. data/lib/sequel/extensions/migration.rb +27 -43
  136. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  137. data/lib/sequel/extensions/null_dataset.rb +2 -8
  138. data/lib/sequel/extensions/pagination.rb +1 -17
  139. data/lib/sequel/extensions/pg_array.rb +20 -189
  140. data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
  141. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  142. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  143. data/lib/sequel/extensions/pg_inet.rb +3 -16
  144. data/lib/sequel/extensions/pg_interval.rb +1 -20
  145. data/lib/sequel/extensions/pg_json.rb +7 -27
  146. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  147. data/lib/sequel/extensions/pg_range.rb +6 -121
  148. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  149. data/lib/sequel/extensions/pg_row.rb +5 -77
  150. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  151. data/lib/sequel/extensions/query.rb +3 -4
  152. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  153. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  154. data/lib/sequel/extensions/select_remove.rb +3 -3
  155. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  156. data/lib/sequel/extensions/sql_comments.rb +2 -2
  157. data/lib/sequel/extensions/string_agg.rb +11 -8
  158. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  159. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  160. data/lib/sequel/model/associations.rb +129 -131
  161. data/lib/sequel/model/base.rb +133 -731
  162. data/lib/sequel/model/default_inflections.rb +1 -1
  163. data/lib/sequel/model/errors.rb +0 -3
  164. data/lib/sequel/model/exceptions.rb +2 -6
  165. data/lib/sequel/model/inflections.rb +1 -26
  166. data/lib/sequel/model/plugins.rb +1 -0
  167. data/lib/sequel/model.rb +27 -62
  168. data/lib/sequel/plugins/active_model.rb +2 -5
  169. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  170. data/lib/sequel/plugins/association_pks.rb +14 -28
  171. data/lib/sequel/plugins/association_proxies.rb +6 -7
  172. data/lib/sequel/plugins/auto_validations.rb +4 -4
  173. data/lib/sequel/plugins/before_after_save.rb +0 -43
  174. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  175. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  176. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  177. data/lib/sequel/plugins/caching.rb +5 -5
  178. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  179. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  180. data/lib/sequel/plugins/column_select.rb +2 -2
  181. data/lib/sequel/plugins/composition.rb +15 -24
  182. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  183. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  184. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  185. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  186. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  187. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  188. data/lib/sequel/plugins/finder.rb +16 -10
  189. data/lib/sequel/plugins/force_encoding.rb +1 -7
  190. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  191. data/lib/sequel/plugins/input_transformer.rb +10 -11
  192. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  193. data/lib/sequel/plugins/instance_filters.rb +5 -5
  194. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  195. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  196. data/lib/sequel/plugins/json_serializer.rb +19 -19
  197. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  198. data/lib/sequel/plugins/list.rb +6 -6
  199. data/lib/sequel/plugins/many_through_many.rb +11 -8
  200. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  201. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  202. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  203. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  204. data/lib/sequel/plugins/pg_row.rb +2 -11
  205. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  206. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  207. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  208. data/lib/sequel/plugins/serialization.rb +15 -33
  209. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  210. data/lib/sequel/plugins/sharding.rb +2 -8
  211. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  212. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  213. data/lib/sequel/plugins/static_cache.rb +8 -9
  214. data/lib/sequel/plugins/string_stripper.rb +3 -3
  215. data/lib/sequel/plugins/subclasses.rb +1 -1
  216. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  217. data/lib/sequel/plugins/table_select.rb +2 -2
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  219. data/lib/sequel/plugins/timestamps.rb +6 -7
  220. data/lib/sequel/plugins/touch.rb +4 -8
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  223. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  224. data/lib/sequel/plugins/update_or_create.rb +3 -3
  225. data/lib/sequel/plugins/update_refresh.rb +3 -3
  226. data/lib/sequel/plugins/uuid.rb +7 -11
  227. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  228. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  229. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  230. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  231. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  232. data/lib/sequel/sql.rb +145 -276
  233. data/lib/sequel/timezones.rb +8 -23
  234. data/lib/sequel/version.rb +2 -2
  235. data/lib/sequel.rb +1 -1
  236. data/spec/adapter_spec.rb +1 -1
  237. data/spec/adapters/db2_spec.rb +2 -103
  238. data/spec/adapters/mssql_spec.rb +89 -68
  239. data/spec/adapters/mysql_spec.rb +111 -478
  240. data/spec/adapters/oracle_spec.rb +1 -9
  241. data/spec/adapters/postgres_spec.rb +459 -664
  242. data/spec/adapters/spec_helper.rb +12 -31
  243. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  244. data/spec/adapters/sqlite_spec.rb +8 -146
  245. data/spec/bin_spec.rb +11 -16
  246. data/spec/core/connection_pool_spec.rb +173 -74
  247. data/spec/core/database_spec.rb +96 -244
  248. data/spec/core/dataset_spec.rb +99 -414
  249. data/spec/core/deprecated_spec.rb +3 -3
  250. data/spec/core/expression_filters_spec.rb +37 -144
  251. data/spec/core/mock_adapter_spec.rb +241 -4
  252. data/spec/core/object_graph_spec.rb +11 -60
  253. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  254. data/spec/core/schema_generator_spec.rb +51 -40
  255. data/spec/core/schema_spec.rb +88 -77
  256. data/spec/core/spec_helper.rb +6 -24
  257. data/spec/core/version_spec.rb +1 -1
  258. data/spec/core_extensions_spec.rb +7 -83
  259. data/spec/core_model_spec.rb +2 -2
  260. data/spec/deprecation_helper.rb +2 -14
  261. data/spec/extensions/accessed_columns_spec.rb +1 -1
  262. data/spec/extensions/active_model_spec.rb +3 -3
  263. data/spec/extensions/after_initialize_spec.rb +1 -1
  264. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  265. data/spec/extensions/association_dependencies_spec.rb +1 -1
  266. data/spec/extensions/association_pks_spec.rb +30 -92
  267. data/spec/extensions/association_proxies_spec.rb +1 -1
  268. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  269. data/spec/extensions/auto_validations_spec.rb +1 -1
  270. data/spec/extensions/blacklist_security_spec.rb +1 -1
  271. data/spec/extensions/blank_spec.rb +1 -1
  272. data/spec/extensions/boolean_readers_spec.rb +1 -1
  273. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  274. data/spec/extensions/caching_spec.rb +1 -1
  275. data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
  276. data/spec/extensions/column_conflicts_spec.rb +1 -1
  277. data/spec/extensions/column_select_spec.rb +4 -4
  278. data/spec/extensions/columns_introspection_spec.rb +1 -1
  279. data/spec/extensions/columns_updated_spec.rb +1 -1
  280. data/spec/extensions/composition_spec.rb +8 -30
  281. data/spec/extensions/connection_expiration_spec.rb +3 -3
  282. data/spec/extensions/connection_validator_spec.rb +3 -3
  283. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  284. data/spec/extensions/constraint_validations_spec.rb +1 -1
  285. data/spec/extensions/core_refinements_spec.rb +1 -3
  286. data/spec/extensions/csv_serializer_spec.rb +4 -9
  287. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  288. data/spec/extensions/dataset_associations_spec.rb +2 -1
  289. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  290. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  291. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  292. data/spec/extensions/defaults_setter_spec.rb +2 -2
  293. data/spec/extensions/delay_add_association_spec.rb +8 -9
  294. data/spec/extensions/dirty_spec.rb +1 -1
  295. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  296. data/spec/extensions/eager_each_spec.rb +2 -2
  297. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  298. data/spec/extensions/error_splitter_spec.rb +1 -1
  299. data/spec/extensions/error_sql_spec.rb +1 -1
  300. data/spec/extensions/eval_inspect_spec.rb +1 -1
  301. data/spec/extensions/finder_spec.rb +1 -1
  302. data/spec/extensions/force_encoding_spec.rb +2 -5
  303. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  304. data/spec/extensions/graph_each_spec.rb +5 -5
  305. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  306. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  307. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  308. data/spec/extensions/inflector_spec.rb +1 -1
  309. data/spec/extensions/input_transformer_spec.rb +7 -2
  310. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  311. data/spec/extensions/instance_filters_spec.rb +1 -1
  312. data/spec/extensions/instance_hooks_spec.rb +1 -95
  313. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  314. data/spec/extensions/json_serializer_spec.rb +1 -1
  315. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  316. data/spec/extensions/list_spec.rb +5 -6
  317. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  318. data/spec/extensions/many_through_many_spec.rb +25 -33
  319. data/spec/extensions/migration_spec.rb +12 -2
  320. data/spec/extensions/modification_detection_spec.rb +1 -1
  321. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  322. data/spec/extensions/named_timezones_spec.rb +3 -3
  323. data/spec/extensions/nested_attributes_spec.rb +1 -29
  324. data/spec/extensions/null_dataset_spec.rb +1 -11
  325. data/spec/extensions/optimistic_locking_spec.rb +2 -2
  326. data/spec/extensions/pagination_spec.rb +1 -1
  327. data/spec/extensions/pg_array_associations_spec.rb +22 -26
  328. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_array_spec.rb +3 -48
  330. data/spec/extensions/pg_enum_spec.rb +1 -1
  331. data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
  332. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  333. data/spec/extensions/pg_hstore_spec.rb +22 -31
  334. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_inet_spec.rb +1 -14
  336. data/spec/extensions/pg_interval_spec.rb +3 -13
  337. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  338. data/spec/extensions/pg_json_spec.rb +1 -13
  339. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  340. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  341. data/spec/extensions/pg_range_spec.rb +3 -88
  342. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  343. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  344. data/spec/extensions/pg_row_spec.rb +1 -44
  345. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  346. data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
  347. data/spec/extensions/prepared_statements_spec.rb +13 -48
  348. data/spec/extensions/pretty_table_spec.rb +40 -9
  349. data/spec/extensions/query_spec.rb +1 -12
  350. data/spec/extensions/rcte_tree_spec.rb +23 -34
  351. data/spec/extensions/round_timestamps_spec.rb +1 -5
  352. data/spec/extensions/s_spec.rb +1 -1
  353. data/spec/extensions/schema_caching_spec.rb +1 -1
  354. data/spec/extensions/schema_dumper_spec.rb +43 -32
  355. data/spec/extensions/select_remove_spec.rb +1 -1
  356. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  357. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  358. data/spec/extensions/serialization_spec.rb +5 -17
  359. data/spec/extensions/server_block_spec.rb +1 -1
  360. data/spec/extensions/server_logging_spec.rb +2 -2
  361. data/spec/extensions/sharding_spec.rb +1 -1
  362. data/spec/extensions/shared_caching_spec.rb +1 -28
  363. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  364. data/spec/extensions/singular_table_names_spec.rb +1 -1
  365. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  366. data/spec/extensions/spec_helper.rb +5 -27
  367. data/spec/extensions/split_array_nil_spec.rb +1 -1
  368. data/spec/extensions/split_values_spec.rb +1 -1
  369. data/spec/extensions/sql_comments_spec.rb +1 -1
  370. data/spec/extensions/sql_expr_spec.rb +1 -1
  371. data/spec/extensions/static_cache_spec.rb +1 -1
  372. data/spec/extensions/string_agg_spec.rb +2 -2
  373. data/spec/extensions/string_date_time_spec.rb +1 -1
  374. data/spec/extensions/string_stripper_spec.rb +1 -1
  375. data/spec/extensions/subclasses_spec.rb +1 -1
  376. data/spec/extensions/subset_conditions_spec.rb +1 -1
  377. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  378. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  379. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  380. data/spec/extensions/table_select_spec.rb +4 -4
  381. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  382. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  383. data/spec/extensions/timestamps_spec.rb +5 -7
  384. data/spec/extensions/to_dot_spec.rb +1 -1
  385. data/spec/extensions/touch_spec.rb +1 -1
  386. data/spec/extensions/tree_spec.rb +1 -1
  387. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  388. data/spec/extensions/unlimited_update_spec.rb +1 -1
  389. data/spec/extensions/update_or_create_spec.rb +12 -16
  390. data/spec/extensions/update_primary_key_spec.rb +4 -3
  391. data/spec/extensions/update_refresh_spec.rb +1 -1
  392. data/spec/extensions/uuid_spec.rb +10 -13
  393. data/spec/extensions/validate_associated_spec.rb +1 -1
  394. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  395. data/spec/extensions/validation_contexts_spec.rb +1 -1
  396. data/spec/extensions/validation_helpers_spec.rb +10 -44
  397. data/spec/extensions/whitelist_security_spec.rb +5 -5
  398. data/spec/extensions/xml_serializer_spec.rb +8 -13
  399. data/spec/guards_helper.rb +2 -1
  400. data/spec/integration/associations_test.rb +1 -23
  401. data/spec/integration/database_test.rb +7 -7
  402. data/spec/integration/dataset_test.rb +12 -47
  403. data/spec/integration/eager_loader_test.rb +1 -1
  404. data/spec/integration/migrator_test.rb +1 -1
  405. data/spec/integration/model_test.rb +4 -82
  406. data/spec/integration/plugin_test.rb +7 -23
  407. data/spec/integration/prepared_statement_test.rb +8 -88
  408. data/spec/integration/schema_test.rb +10 -10
  409. data/spec/integration/spec_helper.rb +17 -21
  410. data/spec/integration/timezone_test.rb +5 -5
  411. data/spec/integration/transaction_test.rb +3 -55
  412. data/spec/integration/type_test.rb +9 -9
  413. data/spec/model/association_reflection_spec.rb +24 -9
  414. data/spec/model/associations_spec.rb +124 -303
  415. data/spec/model/base_spec.rb +43 -137
  416. data/spec/model/class_dataset_methods_spec.rb +2 -20
  417. data/spec/model/dataset_methods_spec.rb +1 -20
  418. data/spec/model/eager_loading_spec.rb +48 -17
  419. data/spec/model/hooks_spec.rb +5 -300
  420. data/spec/model/inflector_spec.rb +1 -1
  421. data/spec/model/model_spec.rb +29 -339
  422. data/spec/model/plugins_spec.rb +2 -16
  423. data/spec/model/record_spec.rb +33 -129
  424. data/spec/model/spec_helper.rb +5 -15
  425. data/spec/model/validations_spec.rb +1 -1
  426. data/spec/sequel_warning.rb +1 -12
  427. metadata +19 -65
  428. data/doc/active_record.rdoc +0 -927
  429. data/lib/sequel/adapters/cubrid.rb +0 -160
  430. data/lib/sequel/adapters/do/mysql.rb +0 -69
  431. data/lib/sequel/adapters/do/postgres.rb +0 -46
  432. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  433. data/lib/sequel/adapters/do.rb +0 -166
  434. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  435. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  436. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  437. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  438. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  439. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  440. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  441. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  442. data/lib/sequel/adapters/shared/informix.rb +0 -63
  443. data/lib/sequel/adapters/shared/progress.rb +0 -40
  444. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  445. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  446. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  447. data/lib/sequel/adapters/swift.rb +0 -169
  448. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  449. data/lib/sequel/dataset/mutation.rb +0 -98
  450. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  451. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  452. data/lib/sequel/extensions/filter_having.rb +0 -65
  453. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  454. data/lib/sequel/extensions/meta_def.rb +0 -37
  455. data/lib/sequel/extensions/query_literals.rb +0 -86
  456. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  457. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  458. data/lib/sequel/extensions/set_overrides.rb +0 -82
  459. data/lib/sequel/no_core_ext.rb +0 -4
  460. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  461. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  462. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  463. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  464. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  465. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  466. data/lib/sequel/plugins/schema.rb +0 -84
  467. data/lib/sequel/plugins/scissors.rb +0 -37
  468. data/spec/core/dataset_mutation_spec.rb +0 -253
  469. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  470. data/spec/extensions/before_after_save_spec.rb +0 -40
  471. data/spec/extensions/filter_having_spec.rb +0 -42
  472. data/spec/extensions/from_block_spec.rb +0 -21
  473. data/spec/extensions/hash_aliases_spec.rb +0 -26
  474. data/spec/extensions/identifier_columns_spec.rb +0 -19
  475. data/spec/extensions/meta_def_spec.rb +0 -35
  476. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  477. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  478. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  479. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  480. data/spec/extensions/query_literals_spec.rb +0 -185
  481. data/spec/extensions/schema_spec.rb +0 -123
  482. data/spec/extensions/scissors_spec.rb +0 -27
  483. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  484. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -15,11 +15,11 @@ module Sequel
15
15
  # Sequel::Model.plugin :timestamps
16
16
  #
17
17
  # # Timestamp Album instances, with custom column names
18
- # Album.plugin :timestamps, :create=>:created_on, :update=>:updated_on
18
+ # Album.plugin :timestamps, create: :created_on, update: :updated_on
19
19
  #
20
20
  # # Timestamp Artist instances, forcing an overwrite of the create
21
21
  # # timestamp, and setting the update timestamp when creating
22
- # Album.plugin :timestamps, :force=>true, :update_on_create=>true
22
+ # Album.plugin :timestamps, force: true, update_on_create: true
23
23
  module Timestamps
24
24
  # Configure the plugin by setting the available options. Note that
25
25
  # if this method is run more than once, previous settings are ignored,
@@ -30,7 +30,7 @@ module Sequel
30
30
  # :update :: The field to hold the update timestamp (default: :updated_at)
31
31
  # :update_on_create :: Whether to set the update timestamp to the create timestamp when creating (default: false)
32
32
  def self.configure(model, opts=OPTS)
33
- model.instance_eval do
33
+ model.instance_exec do
34
34
  @allow_manual_timestamp_update = opts[:allow_manual_update]||false
35
35
  @create_timestamp_field = opts[:create]||:created_at
36
36
  @update_timestamp_field = opts[:update]||:updated_at
@@ -58,7 +58,6 @@ module Sequel
58
58
  :@set_update_timestamp_on_create=>nil,
59
59
  :@update_timestamp_field=>nil)
60
60
 
61
-
62
61
  # Whether to allow manual setting of the update timestamp when creating
63
62
  def allow_manual_timestamp_update?
64
63
  @allow_manual_timestamp_update
@@ -77,14 +76,14 @@ module Sequel
77
76
  super
78
77
  end
79
78
 
80
- private
81
-
82
79
  # Set the create timestamp when creating
83
- def _before_validation
80
+ def before_validation
84
81
  set_create_timestamp if new?
85
82
  super
86
83
  end
87
84
 
85
+ private
86
+
88
87
  # If the object has accessor methods for the create timestamp field, and
89
88
  # the create timestamp value is nil or overwriting it is allowed, set the
90
89
  # create timestamp field to the time given or the current time. If setting
@@ -22,17 +22,13 @@ module Sequel
22
22
  # Sequel::Model.plugin :touch
23
23
  #
24
24
  # # Allow touching of Album instances, with a custom column
25
- # Album.plugin :touch, :column=>:updated_on
25
+ # Album.plugin :touch, column: :updated_on
26
26
  #
27
27
  # # Allow touching of Artist instances, updating the albums and tags
28
28
  # # associations when touching, touching the +updated_on+ column for
29
29
  # # albums and the +updated_at+ column for tags
30
- # Artist.plugin :touch, :associations=>[{:albums=>:updated_on}, :tags]
30
+ # Artist.plugin :touch, associations: [{albums: :updated_on}, :tags]
31
31
  module Touch
32
- # The default column to update when touching
33
- TOUCH_COLUMN_DEFAULT = :updated_at
34
- Sequel::Deprecation.deprecate_constant(self, :TOUCH_COLUMN_DEFAULT)
35
-
36
32
  def self.apply(model, opts=OPTS)
37
33
  model.instance_variable_set(:@touched_associations, {})
38
34
  end
@@ -131,13 +127,13 @@ module Sequel
131
127
  model.touched_associations.each do |assoc, column|
132
128
  r = model.association_reflection(assoc)
133
129
  next unless r.can_have_associated_objects?(self)
134
- ds = send(r.dataset_method)
130
+ ds = public_send(r[:dataset_method])
135
131
 
136
132
  if ds.send(:joined_dataset?)
137
133
  # Can't update all values at once, so update each instance individually.
138
134
  # Instead if doing a simple save, update via the instance's dataset,
139
135
  # to avoid going into an infinite loop in some cases.
140
- send(assoc).each{|x| x.this.update(column=>touch_association_value)}
136
+ public_send(assoc).each{|x| x.this.update(column=>touch_association_value)}
141
137
  else
142
138
  # Update all values at once for performance reasons.
143
139
  ds.update(column=>touch_association_value)
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Sequel
4
4
  module Plugins
5
- # The Tree plugin adds additional associations and methods that allow you to
5
+ # The tree plugin adds additional associations and methods that allow you to
6
6
  # treat a Model as a tree.
7
7
  #
8
8
  # A column for holding the parent key is required and is :parent_id by default.
@@ -21,7 +21,7 @@ module Sequel
21
21
  # end
22
22
  #
23
23
  # class Node < Sequel::Model
24
- # plugin :tree, :key=>:parentid, :order=>:position
24
+ # plugin :tree, key: :parentid, order: :position
25
25
  # end
26
26
  module Tree
27
27
  # Create parent and children associations. Any options
@@ -33,7 +33,7 @@ module Sequel
33
33
  opts = opts.dup
34
34
  opts[:class] = model
35
35
 
36
- model.instance_eval do
36
+ model.instance_exec do
37
37
  @parent_column = (opts[:key] ||= :parent_id)
38
38
  @tree_order = opts[:order]
39
39
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Sequel
4
4
  module Plugins
5
- # The TypecastOnLoad plugin exists because most of Sequel's database adapters don't
5
+ # The typecast_on_load plugin exists because most of Sequel's database adapters don't
6
6
  # have complete control over typecasting, and may return columns that aren't
7
7
  # typecast correctly (with correct being defined as how the model object
8
8
  # would typecast the same column values).
@@ -23,7 +23,7 @@ module Sequel
23
23
  module TypecastOnLoad
24
24
  # Call add_typecast_on_load_columns on the passed column arguments.
25
25
  def self.configure(model, *columns)
26
- model.instance_eval do
26
+ model.instance_exec do
27
27
  @typecast_on_load_columns ||= []
28
28
  add_typecast_on_load_columns(*columns)
29
29
  end
@@ -4,13 +4,7 @@ module Sequel
4
4
  module Plugins
5
5
  # The unlimited_update plugin is designed to work around a
6
6
  # MySQL warning in replicated environments, which occurs if
7
- # you issue an UPDATE with a LIMIT clause. No other
8
- # database Sequel supports will create an UPDATE clause with
9
- # a LIMIT, and in non-replicated MySQL environments, MySQL
10
- # doesn't issue a warning. Note that even in replicated
11
- # environments the MySQL warning is harmless, as Sequel
12
- # restricts an update to rows with a matching primary key,
13
- # which should be unique.
7
+ # you issue an UPDATE with a LIMIT clause.
14
8
  #
15
9
  # Usage:
16
10
  #
@@ -2,21 +2,21 @@
2
2
 
3
3
  module Sequel
4
4
  module Plugins
5
- # The update_or_create plugin adds a couple of methods that make it easier
5
+ # The update_or_create plugin adds methods that make it easier
6
6
  # to deal with objects which may or may not yet exist in the database.
7
7
  # The first method is update_or_create, which updates an object if it
8
8
  # exists in the database, or creates the object if it does not.
9
9
  #
10
10
  # You can call update_or_create with a block:
11
11
  #
12
- # Album.update_or_create(:name=>'Hello') do |album|
12
+ # Album.update_or_create(name: 'Hello') do |album|
13
13
  # album.num_copies_sold = 1000
14
14
  # end
15
15
  #
16
16
  # or provide two hashes, with the second one being the attributes
17
17
  # to set.
18
18
  #
19
- # Album.update_or_create({:name=>'Hello'}, {:num_copies_sold=>1000})
19
+ # Album.update_or_create({name: 'Hello'}, num_copies_sold: 1000)
20
20
  #
21
21
  # In both cases, this will check the database to find the album with
22
22
  # the name "Hello". If such an album exists, it will be updated to set
@@ -30,15 +30,15 @@ module Sequel
30
30
  # dataset supports RETURNING.
31
31
  #
32
32
  # # Only include the artist column in RETURNING
33
- # Album.plugin :update_refresh, :columns => :artist
33
+ # Album.plugin :update_refresh, columns: :artist
34
34
  #
35
35
  # # Only include the artist and title columns in RETURNING
36
- # Album.plugin :update_refresh, :columns => [ :artist, :title ]
36
+ # Album.plugin :update_refresh, columns: [:artist, :title]
37
37
  module UpdateRefresh
38
38
  # Set the specific columns to refresh, if the :columns option
39
39
  # is provided.
40
40
  def self.configure(model, opts=OPTS)
41
- model.instance_eval do
41
+ model.instance_exec do
42
42
  @update_refresh_columns = Array(opts[:columns]) || []
43
43
  end
44
44
  end
@@ -5,10 +5,7 @@ require 'securerandom'
5
5
  module Sequel
6
6
  module Plugins
7
7
  # The uuid plugin creates hooks that automatically create a uuid for every
8
- # instance. Note that this uses SecureRandom.uuid to create UUIDs, and
9
- # that method is not defined on ruby 1.8.7. If you would like to use this
10
- # on ruby 1.8.7, you need to override the Model#create_uuid private method
11
- # to return a valid uuid.
8
+ # instance.
12
9
  #
13
10
  # Usage:
14
11
  #
@@ -17,7 +14,7 @@ module Sequel
17
14
  # Sequel::Model.plugin :uuid
18
15
  #
19
16
  # # Uuid Album instances, with custom column name
20
- # Album.plugin :uuid, :field=>my_uuid
17
+ # Album.plugin :uuid, field: :my_uuid
21
18
  module Uuid
22
19
  # Configure the plugin by setting the available options. Note that
23
20
  # if this method is run more than once, previous settings are ignored,
@@ -25,7 +22,7 @@ module Sequel
25
22
  # :field :: The field to hold the uuid (default: :uuid)
26
23
  # :force :: Whether to overwrite an existing uuid (default: false)
27
24
  def self.configure(model, opts=OPTS)
28
- model.instance_eval do
25
+ model.instance_exec do
29
26
  @uuid_field = opts[:field]||:uuid
30
27
  @uuid_overwrite = opts[:force]||false
31
28
  end
@@ -44,17 +41,16 @@ module Sequel
44
41
  end
45
42
 
46
43
  module InstanceMethods
47
- private
48
-
49
44
  # Set the uuid when creating
50
- def _before_validation
45
+ def before_validation
51
46
  set_uuid if new?
52
47
  super
53
48
  end
54
49
 
50
+ private
51
+
55
52
  # Create a new UUID. This method can be overridden to use a separate
56
- # method for creating UUIDs. Note that this method does not work on
57
- # ruby 1.8.7, you will have to override it if you are using ruby 1.8.7.
53
+ # method for creating UUIDs.
58
54
  def create_uuid
59
55
  SecureRandom.uuid
60
56
  end
@@ -56,7 +56,7 @@ module Sequel
56
56
  # Initializes a new generator.
57
57
  def initialize(receiver ,&block)
58
58
  @receiver = receiver
59
- instance_eval(&block)
59
+ instance_exec(&block)
60
60
  end
61
61
 
62
62
  # Delegates method calls to the receiver by calling receiver.validates_xxx.
@@ -97,15 +97,16 @@ module Sequel
97
97
  #
98
98
  # class MyClass < Sequel::Model
99
99
  # validates do
100
- # length_of :name, :minimum => 6
101
- # length_of :password, :minimum => 8
100
+ # length_of :name, minimum: 6
101
+ # length_of :password, minimum: 8
102
102
  # end
103
103
  # end
104
104
  #
105
105
  # is equivalent to:
106
+ #
106
107
  # class MyClass < Sequel::Model
107
- # validates_length_of :name, :minimum => 6
108
- # validates_length_of :password, :minimum => 8
108
+ # validates_length_of :name, minimum: 6
109
+ # validates_length_of :password, minimum: 8
109
110
  # end
110
111
  def validates(&block)
111
112
  Generator.new(self, &block)
@@ -187,7 +188,7 @@ module Sequel
187
188
  # Sequel will attempt to insert a NULL value into the database, instead of using the
188
189
  # database's default.
189
190
  # :allow_nil :: Whether to skip the validation if the value is nil.
190
- # :if :: A symbol (indicating an instance_method) or proc (which is instance_evaled)
191
+ # :if :: A symbol (indicating an instance_method) or proc (which is instance_execed)
191
192
  # skipping this validation if it returns nil or false.
192
193
  # :tag :: The tag to use for this validation.
193
194
  def validates_each(*atts, &block)
@@ -273,7 +274,7 @@ module Sequel
273
274
  o.errors.add(a, opts[:message] || opts[:wrong_length]) unless v && v.size == i
274
275
  end
275
276
  if w = opts[:within]
276
- o.errors.add(a, opts[:message] || opts[:wrong_length]) unless v && w.send(w.respond_to?(:cover?) ? :cover? : :include?, v.size)
277
+ o.errors.add(a, opts[:message] || opts[:wrong_length]) unless v && w.public_send(w.respond_to?(:cover?) ? :cover? : :include?, v.size)
277
278
  end
278
279
  end
279
280
  end
@@ -335,7 +336,7 @@ module Sequel
335
336
  reflect_validation(:inclusion, opts, atts)
336
337
  atts << opts
337
338
  validates_each(*atts) do |o, a, v|
338
- o.errors.add(a, opts[:message]) unless n.send(n.respond_to?(:cover?) ? :cover? : :include?, v)
339
+ o.errors.add(a, opts[:message]) unless n.public_send(n.respond_to?(:cover?) ? :cover? : :include?, v)
339
340
  end
340
341
  end
341
342
 
@@ -434,7 +435,7 @@ module Sequel
434
435
  when Symbol
435
436
  o.get_column_value(i)
436
437
  when Proc
437
- o.instance_eval(&i)
438
+ o.instance_exec(&i)
438
439
  else
439
440
  raise(::Sequel::Error, "invalid value for :if validation option")
440
441
  end
@@ -15,11 +15,11 @@ module Sequel
15
15
  # end
16
16
  # end
17
17
  #
18
- # Album.new(:status_id=>1).valid?(:validation_context=>:initial) # => true
19
- # Album.new(:status_id=>2).valid?(:validation_context=>:initial) # => false
18
+ # Album.new(status_id: 1).valid?(validation_context: :initial) # => true
19
+ # Album.new(status_id: 2).valid?(validation_context: :initial) # => false
20
20
  #
21
- # Album.new(:status_id=>1).valid?(:validation_context=>:approve) # => false
22
- # Album.new(:status_id=>2).valid?(:validation_context=>:approve) # => true
21
+ # Album.new(status_id: 1).valid?(validation_context: :approve) # => false
22
+ # Album.new(status_id: 2).valid?(validation_context: :approve) # => true
23
23
  #
24
24
  # There is no validation context used by default, so validation_context will be
25
25
  # +nil+ if one is not specified. If you want to differentiate between creating new
@@ -38,17 +38,24 @@ module Sequel
38
38
  # that argument is passed as an argument to the proc.
39
39
  #
40
40
  # The default validation options for all models can be modified by
41
- # changing the values of the Sequel::Plugins::ValidationHelpers::DEFAULT_OPTIONS hash. You
42
- # change change the default options on a per model basis
43
- # by overriding a private instance method default_validation_helpers_options.
44
- #
41
+ # overridding the Model#default_validation_helpers_options private method.
45
42
  # By changing the default options, you can setup internationalization of the
46
43
  # error messages. For example, you would modify the default options:
47
44
  #
48
- # Sequel::Plugins::ValidationHelpers::DEFAULT_OPTIONS.merge!(
49
- # :exact_length=>{:message=>lambda{|exact| I18n.t("errors.exact_length", :exact => exact)}},
50
- # :integer=>{:message=>lambda{I18n.t("errors.integer")}}
51
- # )
45
+ # class Sequel::Model
46
+ # private
47
+ #
48
+ # def default_validation_helpers_options(type)
49
+ # case type
50
+ # when :exact_length
51
+ # {message: lambda{|exact| I18n.t("errors.exact_length", exact: exact)}}
52
+ # when :integer
53
+ # {message: lambda{I18n.t("errors.integer")}}
54
+ # else
55
+ # super
56
+ # end
57
+ # end
58
+ # end
52
59
  #
53
60
  # and then use something like this in your yaml translation file:
54
61
  #
@@ -61,20 +68,16 @@ module Sequel
61
68
  # you need to override the method. Here's an example:
62
69
  #
63
70
  # class Sequel::Model::Errors
64
- # ATTRIBUTE_JOINER = I18n.t('errors.joiner').freeze
65
71
  # def full_messages
66
72
  # inject([]) do |m, kv|
67
73
  # att, errors = *kv
68
74
  # att.is_a?(Array) ? Array(att).map!{|v| I18n.t("attributes.#{v}")} : att = I18n.t("attributes.#{att}")
69
- # errors.each {|e| m << (e.is_a?(LiteralString) ? e : "#{Array(att).join(ATTRIBUTE_JOINER)} #{e}")}
75
+ # errors.each {|e| m << (e.is_a?(LiteralString) ? e : "#{Array(att).join(I18n.t('errors.joiner'))} #{e}")}
70
76
  # m
71
77
  # end
72
78
  # end
73
79
  # end
74
80
  module ValidationHelpers
75
- # Default validation options used by Sequel. Can be modified to change the error
76
- # messages for all models (e.g. for internationalization), or to set certain
77
- # default options for validations (e.g. :allow_nil=>true for all validates_format).
78
81
  DEFAULT_OPTIONS = {
79
82
  :exact_length=>{:message=>lambda{|exact| "is not #{exact} characters"}},
80
83
  :format=>{:message=>lambda{|with| 'is invalid'}},
@@ -89,9 +92,8 @@ module Sequel
89
92
  :type=>{:message=>lambda{|klass| klass.is_a?(Array) ? "is not a valid #{klass.join(" or ").downcase}" : "is not a valid #{klass.to_s.downcase}"}},
90
93
  :presence=>{:message=>lambda{"is not present"}},
91
94
  :unique=>{:message=>lambda{'is already taken'}}
92
- }
93
- DEFAULT__OPTIONS = DEFAULT_OPTIONS
94
- Sequel::Deprecation.deprecate_constant(self, :DEFAULT_OPTIONS)
95
+ }.freeze
96
+ DEFAULT_OPTIONS.each_value(&:freeze)
95
97
 
96
98
  module InstanceMethods
97
99
  # Check that the attribute values are the given exact length.
@@ -106,7 +108,7 @@ module Sequel
106
108
 
107
109
  # Check attribute value(s) is included in the given set.
108
110
  def validates_includes(set, atts, opts=OPTS)
109
- validatable_attributes_for_type(:includes, atts, opts){|a,v,m| validation_error_message(m, set) unless set.send(set.respond_to?(:cover?) ? :cover? : :include?, v)}
111
+ validatable_attributes_for_type(:includes, atts, opts){|a,v,m| validation_error_message(m, set) unless set.public_send(set.respond_to?(:cover?) ? :cover? : :include?, v)}
110
112
  end
111
113
 
112
114
  # Check attribute value(s) string representation is a valid integer.
@@ -123,7 +125,7 @@ module Sequel
123
125
 
124
126
  # Check that the attribute values length is in the specified range.
125
127
  def validates_length_range(range, atts, opts=OPTS)
126
- validatable_attributes_for_type(:length_range, atts, opts){|a,v,m| validation_error_message(m, range) if v.nil? || !range.send(range.respond_to?(:cover?) ? :cover? : :include?, v.length)}
128
+ validatable_attributes_for_type(:length_range, atts, opts){|a,v,m| validation_error_message(m, range) if v.nil? || !range.cover?(v.length)}
127
129
  end
128
130
 
129
131
  # Check that the attribute values are not longer than the given max length.
@@ -165,7 +167,7 @@ module Sequel
165
167
  # Check attribute value(s) against a specified value and operation, e.g.
166
168
  # validates_operator(:>, 3, :value) validates that value > 3.
167
169
  def validates_operator(operator, rhs, atts, opts=OPTS)
168
- validatable_attributes_for_type(:operator, atts, opts){|a,v,m| validation_error_message(m, operator, rhs) if v.nil? || !v.send(operator, rhs)}
170
+ validatable_attributes_for_type(:operator, atts, opts){|a,v,m| validation_error_message(m, operator, rhs) if v.nil? || !v.public_send(operator, rhs)}
169
171
  end
170
172
 
171
173
  # Validates for all of the model columns (or just the given columns)
@@ -223,7 +225,7 @@ module Sequel
223
225
  # model's dataset.
224
226
  # :message :: The message to use (default: 'is already taken')
225
227
  # :only_if_modified :: Only check the uniqueness if the object is new or
226
- # one of the columns has been modified.
228
+ # one of the columns has been modified, true by default.
227
229
  # :where :: A callable object where call takes three arguments, a dataset,
228
230
  # the current object, and an array of columns, and should return
229
231
  # a modified dataset that is filtered to include only rows with
@@ -232,9 +234,9 @@ module Sequel
232
234
  # If you want to do a case insensitive uniqueness validation on a database that
233
235
  # is case sensitive by default, you can use:
234
236
  #
235
- # validates_unique :column, :where=>(proc do |ds, obj, cols|
237
+ # validates_unique :column, where:(lambda do |ds, obj, cols|
236
238
  # ds.where(cols.map do |c|
237
- # v = obj.send(c)
239
+ # v = obj.public_send(c)
238
240
  # v = v.downcase if v
239
241
  # [Sequel.function(:lower, c), v]
240
242
  # end)
@@ -250,8 +252,7 @@ module Sequel
250
252
  atts.each do |a|
251
253
  arr = Array(a)
252
254
  next if arr.any?{|x| errors.on(x)}
253
- # SEQUEL5: Default only_if_modified to true
254
- next if opts[:only_if_modified] && !new? && !arr.any?{|x| changed_columns.include?(x)}
255
+ next if opts.fetch(:only_if_modified, true) && !new? && !arr.any?{|x| changed_columns.include?(x)}
255
256
  ds = opts[:dataset] || model.dataset
256
257
  ds = if where
257
258
  where.call(ds, self, arr)
@@ -276,7 +277,7 @@ module Sequel
276
277
  # The hash return must include a :message option that is either a
277
278
  # proc or string.
278
279
  def default_validation_helpers_options(type)
279
- DEFAULT__OPTIONS[type]
280
+ DEFAULT_OPTIONS[type]
280
281
  end
281
282
 
282
283
  # Skip validating any attribute that matches one of the allow_* options.
@@ -34,12 +34,12 @@ module Sequel
34
34
  # setter methods (methods that end in =) that you want to be used during
35
35
  # mass assignment, they need to be listed here as well (without the =).
36
36
  #
37
- # It may be better to use a method such as +set_only+ or +set_fields+ that lets you specify
37
+ # It may be better to use +set_fields+ which lets you specify
38
38
  # the allowed fields per call.
39
39
  #
40
40
  # Artist.set_allowed_columns(:name, :hometown)
41
- # Artist.set(:name=>'Bob', :hometown=>'Sactown') # No Error
42
- # Artist.set(:name=>'Bob', :records_sold=>30000) # Error
41
+ # Artist.set(name: 'Bob', hometown: 'Sactown') # No Error
42
+ # Artist.set(name: 'Bob', records_sold: 30000) # Error
43
43
  def set_allowed_columns(*cols)
44
44
  clear_setter_methods_cache
45
45
  @allowed_columns = cols
@@ -62,7 +62,7 @@ module Sequel
62
62
  # allowed_columns in the model.
63
63
  #
64
64
  # Artist.set_allowed_columns(:num_albums)
65
- # artist.set_all(:name=>'Jim')
65
+ # artist.set_all(name: 'Jim')
66
66
  # artist.name # => 'Jim'
67
67
  def set_all(hash)
68
68
  set_restricted(hash, :all)
@@ -72,10 +72,10 @@ module Sequel
72
72
  # is included in only. It may be a better idea to use +set_fields+
73
73
  # instead of this method.
74
74
  #
75
- # artist.set_only({:name=>'Jim'}, :name)
75
+ # artist.set_only({name: 'Jim'}, :name)
76
76
  # artist.name # => 'Jim'
77
77
  #
78
- # artist.set_only({:hometown=>'LA'}, :name) # Raise Error
78
+ # artist.set_only({hometown: 'LA'}, :name) # Raise Error
79
79
  def set_only(hash, *only)
80
80
  set_restricted(hash, only.flatten)
81
81
  end
@@ -84,7 +84,7 @@ module Sequel
84
84
  # +allowed_columns+ in the model.
85
85
  #
86
86
  # Artist.set_allowed_columns(:num_albums)
87
- # artist.update_all(:name=>'Jim') # UPDATE artists SET name = 'Jim' WHERE (id = 1)
87
+ # artist.update_all(name: 'Jim') # UPDATE artists SET name = 'Jim' WHERE (id = 1)
88
88
  def update_all(hash)
89
89
  update_restricted(hash, :all)
90
90
  end
@@ -93,10 +93,10 @@ module Sequel
93
93
  # is included in only. It may be a better idea to use +update_fields+
94
94
  # instead of this method.
95
95
  #
96
- # artist.update_only({:name=>'Jim'}, :name)
96
+ # artist.update_only({name: 'Jim'}, :name)
97
97
  # # UPDATE artists SET name = 'Jim' WHERE (id = 1)
98
98
  #
99
- # artist.update_only({:hometown=>'LA'}, :name) # Raise Error
99
+ # artist.update_only({hometown: 'LA'}, :name) # Raise Error
100
100
  def update_only(hash, *only)
101
101
  update_restricted(hash, only.flatten)
102
102
  end
@@ -107,6 +107,10 @@ module Sequel
107
107
  def setter_methods(type)
108
108
  if type == :default && model.allowed_columns
109
109
  model.setter_methods
110
+ elsif type.is_a?(Array)
111
+ type.map{|x| "#{x}="}
112
+ elsif type == :all && primary_key && model.restrict_primary_key?
113
+ super + Array(primary_key).map{|x| "#{x}="}
110
114
  else
111
115
  super
112
116
  end