sequel 5.8.0 → 5.38.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 (510) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +409 -1795
  3. data/MIT-LICENSE +1 -1
  4. data/README.rdoc +4 -4
  5. data/bin/sequel +4 -0
  6. data/doc/advanced_associations.rdoc +136 -18
  7. data/doc/association_basics.rdoc +10 -5
  8. data/doc/cheat_sheet.rdoc +1 -0
  9. data/doc/code_order.rdoc +12 -2
  10. data/doc/dataset_filtering.rdoc +17 -2
  11. data/doc/mass_assignment.rdoc +3 -3
  12. data/doc/model_dataset_method_design.rdoc +1 -1
  13. data/doc/model_plugins.rdoc +1 -1
  14. data/doc/opening_databases.rdoc +30 -8
  15. data/doc/postgresql.rdoc +107 -2
  16. data/doc/release_notes/5.10.0.txt +84 -0
  17. data/doc/release_notes/5.11.0.txt +83 -0
  18. data/doc/release_notes/5.12.0.txt +141 -0
  19. data/doc/release_notes/5.13.0.txt +27 -0
  20. data/doc/release_notes/5.14.0.txt +63 -0
  21. data/doc/release_notes/5.15.0.txt +39 -0
  22. data/doc/release_notes/5.16.0.txt +110 -0
  23. data/doc/release_notes/5.17.0.txt +31 -0
  24. data/doc/release_notes/5.18.0.txt +69 -0
  25. data/doc/release_notes/5.19.0.txt +28 -0
  26. data/doc/release_notes/5.20.0.txt +89 -0
  27. data/doc/release_notes/5.21.0.txt +87 -0
  28. data/doc/release_notes/5.22.0.txt +48 -0
  29. data/doc/release_notes/5.23.0.txt +56 -0
  30. data/doc/release_notes/5.24.0.txt +56 -0
  31. data/doc/release_notes/5.25.0.txt +32 -0
  32. data/doc/release_notes/5.26.0.txt +35 -0
  33. data/doc/release_notes/5.27.0.txt +21 -0
  34. data/doc/release_notes/5.28.0.txt +16 -0
  35. data/doc/release_notes/5.29.0.txt +22 -0
  36. data/doc/release_notes/5.30.0.txt +20 -0
  37. data/doc/release_notes/5.31.0.txt +148 -0
  38. data/doc/release_notes/5.32.0.txt +46 -0
  39. data/doc/release_notes/5.33.0.txt +24 -0
  40. data/doc/release_notes/5.34.0.txt +40 -0
  41. data/doc/release_notes/5.35.0.txt +56 -0
  42. data/doc/release_notes/5.36.0.txt +60 -0
  43. data/doc/release_notes/5.37.0.txt +30 -0
  44. data/doc/release_notes/5.38.0.txt +28 -0
  45. data/doc/release_notes/5.9.0.txt +99 -0
  46. data/doc/security.rdoc +10 -0
  47. data/doc/sharding.rdoc +42 -28
  48. data/doc/sql.rdoc +12 -0
  49. data/doc/testing.rdoc +24 -17
  50. data/doc/transactions.rdoc +78 -0
  51. data/doc/validations.rdoc +2 -2
  52. data/lib/sequel/adapters/ado.rb +26 -18
  53. data/lib/sequel/adapters/ado/access.rb +2 -2
  54. data/lib/sequel/adapters/ado/mssql.rb +5 -8
  55. data/lib/sequel/adapters/amalgalite.rb +1 -1
  56. data/lib/sequel/adapters/jdbc.rb +71 -27
  57. data/lib/sequel/adapters/jdbc/mysql.rb +6 -6
  58. data/lib/sequel/adapters/jdbc/oracle.rb +7 -6
  59. data/lib/sequel/adapters/jdbc/postgresql.rb +17 -28
  60. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +5 -6
  61. data/lib/sequel/adapters/jdbc/sqlite.rb +33 -2
  62. data/lib/sequel/adapters/jdbc/sqlserver.rb +4 -3
  63. data/lib/sequel/adapters/jdbc/transactions.rb +14 -28
  64. data/lib/sequel/adapters/mysql.rb +14 -15
  65. data/lib/sequel/adapters/mysql2.rb +5 -3
  66. data/lib/sequel/adapters/odbc.rb +4 -6
  67. data/lib/sequel/adapters/oracle.rb +7 -7
  68. data/lib/sequel/adapters/postgres.rb +52 -16
  69. data/lib/sequel/adapters/shared/access.rb +16 -12
  70. data/lib/sequel/adapters/shared/db2.rb +5 -0
  71. data/lib/sequel/adapters/shared/mssql.rb +41 -18
  72. data/lib/sequel/adapters/shared/mysql.rb +66 -19
  73. data/lib/sequel/adapters/shared/oracle.rb +29 -23
  74. data/lib/sequel/adapters/shared/postgres.rb +341 -95
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +23 -10
  76. data/lib/sequel/adapters/shared/sqlite.rb +174 -21
  77. data/lib/sequel/adapters/sqlanywhere.rb +33 -17
  78. data/lib/sequel/adapters/sqlite.rb +78 -68
  79. data/lib/sequel/adapters/tinytds.rb +14 -6
  80. data/lib/sequel/adapters/utils/emulate_offset_with_reverse_and_count.rb +2 -5
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +5 -1
  82. data/lib/sequel/connection_pool.rb +2 -6
  83. data/lib/sequel/connection_pool/sharded_single.rb +7 -4
  84. data/lib/sequel/connection_pool/sharded_threaded.rb +32 -21
  85. data/lib/sequel/connection_pool/single.rb +1 -1
  86. data/lib/sequel/connection_pool/threaded.rb +26 -11
  87. data/lib/sequel/core.rb +327 -319
  88. data/lib/sequel/database/connecting.rb +7 -8
  89. data/lib/sequel/database/logging.rb +7 -1
  90. data/lib/sequel/database/misc.rb +68 -34
  91. data/lib/sequel/database/query.rb +6 -4
  92. data/lib/sequel/database/schema_generator.rb +31 -11
  93. data/lib/sequel/database/schema_methods.rb +32 -22
  94. data/lib/sequel/database/transactions.rb +129 -25
  95. data/lib/sequel/dataset.rb +4 -2
  96. data/lib/sequel/dataset/actions.rb +34 -23
  97. data/lib/sequel/dataset/features.rb +34 -0
  98. data/lib/sequel/dataset/graph.rb +27 -11
  99. data/lib/sequel/dataset/misc.rb +17 -3
  100. data/lib/sequel/dataset/placeholder_literalizer.rb +50 -21
  101. data/lib/sequel/dataset/prepared_statements.rb +96 -26
  102. data/lib/sequel/dataset/query.rb +43 -8
  103. data/lib/sequel/dataset/sql.rb +189 -41
  104. data/lib/sequel/deprecated.rb +3 -1
  105. data/lib/sequel/exceptions.rb +2 -0
  106. data/lib/sequel/extensions/_pretty_table.rb +1 -2
  107. data/lib/sequel/extensions/any_not_empty.rb +45 -0
  108. data/lib/sequel/extensions/caller_logging.rb +79 -0
  109. data/lib/sequel/extensions/columns_introspection.rb +1 -2
  110. data/lib/sequel/extensions/connection_expiration.rb +6 -6
  111. data/lib/sequel/extensions/connection_validator.rb +7 -6
  112. data/lib/sequel/extensions/constant_sql_override.rb +65 -0
  113. data/lib/sequel/extensions/constraint_validations.rb +53 -28
  114. data/lib/sequel/extensions/core_refinements.rb +2 -0
  115. data/lib/sequel/extensions/duplicate_columns_handler.rb +2 -0
  116. data/lib/sequel/extensions/escaped_like.rb +100 -0
  117. data/lib/sequel/extensions/eval_inspect.rb +3 -1
  118. data/lib/sequel/extensions/exclude_or_null.rb +68 -0
  119. data/lib/sequel/extensions/fiber_concurrency.rb +24 -0
  120. data/lib/sequel/extensions/index_caching.rb +9 -7
  121. data/lib/sequel/extensions/integer64.rb +3 -1
  122. data/lib/sequel/extensions/looser_typecasting.rb +3 -3
  123. data/lib/sequel/extensions/migration.rb +13 -6
  124. data/lib/sequel/extensions/named_timezones.rb +84 -23
  125. data/lib/sequel/extensions/pg_array.rb +87 -79
  126. data/lib/sequel/extensions/pg_array_ops.rb +14 -6
  127. data/lib/sequel/extensions/pg_enum.rb +34 -18
  128. data/lib/sequel/extensions/pg_extended_date_support.rb +34 -14
  129. data/lib/sequel/extensions/pg_hstore.rb +6 -0
  130. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -0
  131. data/lib/sequel/extensions/pg_inet.rb +15 -5
  132. data/lib/sequel/extensions/pg_interval.rb +2 -0
  133. data/lib/sequel/extensions/pg_json.rb +387 -123
  134. data/lib/sequel/extensions/pg_json_ops.rb +168 -0
  135. data/lib/sequel/extensions/pg_range.rb +20 -10
  136. data/lib/sequel/extensions/pg_range_ops.rb +2 -0
  137. data/lib/sequel/extensions/pg_row.rb +3 -2
  138. data/lib/sequel/extensions/pg_row_ops.rb +24 -0
  139. data/lib/sequel/extensions/pg_static_cache_updater.rb +2 -2
  140. data/lib/sequel/extensions/pg_timestamptz.rb +2 -0
  141. data/lib/sequel/extensions/query.rb +1 -0
  142. data/lib/sequel/extensions/run_transaction_hooks.rb +72 -0
  143. data/lib/sequel/extensions/s.rb +2 -0
  144. data/lib/sequel/extensions/schema_dumper.rb +13 -7
  145. data/lib/sequel/extensions/sequel_4_dataset_methods.rb +4 -2
  146. data/lib/sequel/extensions/server_block.rb +18 -7
  147. data/lib/sequel/extensions/sql_comments.rb +2 -2
  148. data/lib/sequel/extensions/symbol_aref_refinement.rb +2 -0
  149. data/lib/sequel/extensions/symbol_as_refinement.rb +2 -0
  150. data/lib/sequel/extensions/to_dot.rb +9 -3
  151. data/lib/sequel/model.rb +3 -1
  152. data/lib/sequel/model/associations.rb +403 -69
  153. data/lib/sequel/model/base.rb +170 -90
  154. data/lib/sequel/model/plugins.rb +105 -0
  155. data/lib/sequel/plugins/after_initialize.rb +1 -1
  156. data/lib/sequel/plugins/association_dependencies.rb +3 -3
  157. data/lib/sequel/plugins/association_lazy_eager_option.rb +66 -0
  158. data/lib/sequel/plugins/association_multi_add_remove.rb +85 -0
  159. data/lib/sequel/plugins/association_pks.rb +74 -22
  160. data/lib/sequel/plugins/association_proxies.rb +6 -2
  161. data/lib/sequel/plugins/auto_validations.rb +36 -17
  162. data/lib/sequel/plugins/blacklist_security.rb +1 -2
  163. data/lib/sequel/plugins/boolean_subsets.rb +4 -1
  164. data/lib/sequel/plugins/caching.rb +3 -0
  165. data/lib/sequel/plugins/class_table_inheritance.rb +62 -34
  166. data/lib/sequel/plugins/composition.rb +13 -9
  167. data/lib/sequel/plugins/csv_serializer.rb +28 -9
  168. data/lib/sequel/plugins/defaults_setter.rb +2 -2
  169. data/lib/sequel/plugins/dirty.rb +60 -22
  170. data/lib/sequel/plugins/eager_graph_eager.rb +139 -0
  171. data/lib/sequel/plugins/empty_failure_backtraces.rb +38 -0
  172. data/lib/sequel/plugins/finder.rb +2 -2
  173. data/lib/sequel/plugins/forbid_lazy_load.rb +216 -0
  174. data/lib/sequel/plugins/hook_class_methods.rb +17 -5
  175. data/lib/sequel/plugins/insert_conflict.rb +72 -0
  176. data/lib/sequel/plugins/instance_specific_default.rb +113 -0
  177. data/lib/sequel/plugins/inverted_subsets.rb +2 -2
  178. data/lib/sequel/plugins/json_serializer.rb +21 -14
  179. data/lib/sequel/plugins/lazy_attributes.rb +1 -1
  180. data/lib/sequel/plugins/list.rb +22 -10
  181. data/lib/sequel/plugins/many_through_many.rb +1 -1
  182. data/lib/sequel/plugins/nested_attributes.rb +27 -5
  183. data/lib/sequel/plugins/pg_array_associations.rb +12 -9
  184. data/lib/sequel/plugins/pg_auto_constraint_validations.rb +149 -61
  185. data/lib/sequel/plugins/prepared_statements.rb +6 -12
  186. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -3
  187. data/lib/sequel/plugins/rcte_tree.rb +20 -22
  188. data/lib/sequel/plugins/sharding.rb +13 -7
  189. data/lib/sequel/plugins/single_table_inheritance.rb +20 -15
  190. data/lib/sequel/plugins/skip_saving_columns.rb +108 -0
  191. data/lib/sequel/plugins/static_cache.rb +36 -17
  192. data/lib/sequel/plugins/static_cache_cache.rb +53 -0
  193. data/lib/sequel/plugins/string_stripper.rb +1 -1
  194. data/lib/sequel/plugins/subclasses.rb +2 -0
  195. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  196. data/lib/sequel/plugins/tactical_eager_loading.rb +73 -2
  197. data/lib/sequel/plugins/throw_failures.rb +110 -0
  198. data/lib/sequel/plugins/tree.rb +49 -31
  199. data/lib/sequel/plugins/typecast_on_load.rb +3 -2
  200. data/lib/sequel/plugins/validation_class_methods.rb +11 -5
  201. data/lib/sequel/plugins/validation_helpers.rb +2 -2
  202. data/lib/sequel/sql.rb +120 -30
  203. data/lib/sequel/timezones.rb +55 -14
  204. data/lib/sequel/version.rb +6 -1
  205. metadata +101 -361
  206. data/Rakefile +0 -151
  207. data/doc/release_notes/4.0.0.txt +0 -262
  208. data/doc/release_notes/4.1.0.txt +0 -85
  209. data/doc/release_notes/4.10.0.txt +0 -226
  210. data/doc/release_notes/4.11.0.txt +0 -147
  211. data/doc/release_notes/4.12.0.txt +0 -105
  212. data/doc/release_notes/4.13.0.txt +0 -169
  213. data/doc/release_notes/4.14.0.txt +0 -68
  214. data/doc/release_notes/4.15.0.txt +0 -56
  215. data/doc/release_notes/4.16.0.txt +0 -36
  216. data/doc/release_notes/4.17.0.txt +0 -38
  217. data/doc/release_notes/4.18.0.txt +0 -36
  218. data/doc/release_notes/4.19.0.txt +0 -45
  219. data/doc/release_notes/4.2.0.txt +0 -129
  220. data/doc/release_notes/4.20.0.txt +0 -79
  221. data/doc/release_notes/4.21.0.txt +0 -94
  222. data/doc/release_notes/4.22.0.txt +0 -72
  223. data/doc/release_notes/4.23.0.txt +0 -65
  224. data/doc/release_notes/4.24.0.txt +0 -99
  225. data/doc/release_notes/4.25.0.txt +0 -181
  226. data/doc/release_notes/4.26.0.txt +0 -44
  227. data/doc/release_notes/4.27.0.txt +0 -78
  228. data/doc/release_notes/4.28.0.txt +0 -57
  229. data/doc/release_notes/4.29.0.txt +0 -41
  230. data/doc/release_notes/4.3.0.txt +0 -40
  231. data/doc/release_notes/4.30.0.txt +0 -37
  232. data/doc/release_notes/4.31.0.txt +0 -57
  233. data/doc/release_notes/4.32.0.txt +0 -132
  234. data/doc/release_notes/4.33.0.txt +0 -88
  235. data/doc/release_notes/4.34.0.txt +0 -86
  236. data/doc/release_notes/4.35.0.txt +0 -130
  237. data/doc/release_notes/4.36.0.txt +0 -116
  238. data/doc/release_notes/4.37.0.txt +0 -50
  239. data/doc/release_notes/4.38.0.txt +0 -67
  240. data/doc/release_notes/4.39.0.txt +0 -127
  241. data/doc/release_notes/4.4.0.txt +0 -92
  242. data/doc/release_notes/4.40.0.txt +0 -179
  243. data/doc/release_notes/4.41.0.txt +0 -77
  244. data/doc/release_notes/4.42.0.txt +0 -221
  245. data/doc/release_notes/4.43.0.txt +0 -87
  246. data/doc/release_notes/4.44.0.txt +0 -125
  247. data/doc/release_notes/4.45.0.txt +0 -370
  248. data/doc/release_notes/4.46.0.txt +0 -404
  249. data/doc/release_notes/4.47.0.txt +0 -56
  250. data/doc/release_notes/4.48.0.txt +0 -293
  251. data/doc/release_notes/4.49.0.txt +0 -222
  252. data/doc/release_notes/4.5.0.txt +0 -34
  253. data/doc/release_notes/4.6.0.txt +0 -30
  254. data/doc/release_notes/4.7.0.txt +0 -103
  255. data/doc/release_notes/4.8.0.txt +0 -175
  256. data/doc/release_notes/4.9.0.txt +0 -190
  257. data/spec/adapter_spec.rb +0 -4
  258. data/spec/adapters/db2_spec.rb +0 -170
  259. data/spec/adapters/mssql_spec.rb +0 -804
  260. data/spec/adapters/mysql_spec.rb +0 -1041
  261. data/spec/adapters/oracle_spec.rb +0 -327
  262. data/spec/adapters/postgres_spec.rb +0 -4000
  263. data/spec/adapters/spec_helper.rb +0 -43
  264. data/spec/adapters/sqlanywhere_spec.rb +0 -97
  265. data/spec/adapters/sqlite_spec.rb +0 -600
  266. data/spec/bin_spec.rb +0 -269
  267. data/spec/core/connection_pool_spec.rb +0 -1228
  268. data/spec/core/database_spec.rb +0 -2673
  269. data/spec/core/dataset_spec.rb +0 -5419
  270. data/spec/core/deprecated_spec.rb +0 -70
  271. data/spec/core/expression_filters_spec.rb +0 -1344
  272. data/spec/core/mock_adapter_spec.rb +0 -722
  273. data/spec/core/object_graph_spec.rb +0 -306
  274. data/spec/core/placeholder_literalizer_spec.rb +0 -166
  275. data/spec/core/schema_generator_spec.rb +0 -214
  276. data/spec/core/schema_spec.rb +0 -1820
  277. data/spec/core/spec_helper.rb +0 -23
  278. data/spec/core/version_spec.rb +0 -7
  279. data/spec/core_extensions_spec.rb +0 -762
  280. data/spec/core_model_spec.rb +0 -2
  281. data/spec/core_spec.rb +0 -1
  282. data/spec/deprecation_helper.rb +0 -30
  283. data/spec/extensions/accessed_columns_spec.rb +0 -51
  284. data/spec/extensions/active_model_spec.rb +0 -99
  285. data/spec/extensions/after_initialize_spec.rb +0 -24
  286. data/spec/extensions/arbitrary_servers_spec.rb +0 -109
  287. data/spec/extensions/association_dependencies_spec.rb +0 -125
  288. data/spec/extensions/association_pks_spec.rb +0 -423
  289. data/spec/extensions/association_proxies_spec.rb +0 -100
  290. data/spec/extensions/auto_literal_strings_spec.rb +0 -205
  291. data/spec/extensions/auto_validations_spec.rb +0 -202
  292. data/spec/extensions/blacklist_security_spec.rb +0 -95
  293. data/spec/extensions/blank_spec.rb +0 -69
  294. data/spec/extensions/boolean_readers_spec.rb +0 -93
  295. data/spec/extensions/boolean_subsets_spec.rb +0 -47
  296. data/spec/extensions/caching_spec.rb +0 -273
  297. data/spec/extensions/class_table_inheritance_spec.rb +0 -568
  298. data/spec/extensions/column_conflicts_spec.rb +0 -75
  299. data/spec/extensions/column_select_spec.rb +0 -129
  300. data/spec/extensions/columns_introspection_spec.rb +0 -90
  301. data/spec/extensions/columns_updated_spec.rb +0 -35
  302. data/spec/extensions/composition_spec.rb +0 -248
  303. data/spec/extensions/connection_expiration_spec.rb +0 -133
  304. data/spec/extensions/connection_validator_spec.rb +0 -127
  305. data/spec/extensions/constraint_validations_plugin_spec.rb +0 -300
  306. data/spec/extensions/constraint_validations_spec.rb +0 -395
  307. data/spec/extensions/core_refinements_spec.rb +0 -528
  308. data/spec/extensions/csv_serializer_spec.rb +0 -183
  309. data/spec/extensions/current_datetime_timestamp_spec.rb +0 -27
  310. data/spec/extensions/dataset_associations_spec.rb +0 -365
  311. data/spec/extensions/dataset_source_alias_spec.rb +0 -51
  312. data/spec/extensions/date_arithmetic_spec.rb +0 -181
  313. data/spec/extensions/datetime_parse_to_time_spec.rb +0 -169
  314. data/spec/extensions/def_dataset_method_spec.rb +0 -100
  315. data/spec/extensions/defaults_setter_spec.rb +0 -141
  316. data/spec/extensions/delay_add_association_spec.rb +0 -73
  317. data/spec/extensions/dirty_spec.rb +0 -189
  318. data/spec/extensions/duplicate_columns_handler_spec.rb +0 -104
  319. data/spec/extensions/eager_each_spec.rb +0 -62
  320. data/spec/extensions/empty_array_consider_nulls_spec.rb +0 -24
  321. data/spec/extensions/error_splitter_spec.rb +0 -18
  322. data/spec/extensions/error_sql_spec.rb +0 -20
  323. data/spec/extensions/eval_inspect_spec.rb +0 -74
  324. data/spec/extensions/finder_spec.rb +0 -260
  325. data/spec/extensions/force_encoding_spec.rb +0 -126
  326. data/spec/extensions/freeze_datasets_spec.rb +0 -31
  327. data/spec/extensions/graph_each_spec.rb +0 -113
  328. data/spec/extensions/hook_class_methods_spec.rb +0 -380
  329. data/spec/extensions/identifier_mangling_spec.rb +0 -201
  330. data/spec/extensions/implicit_subquery_spec.rb +0 -58
  331. data/spec/extensions/index_caching_spec.rb +0 -66
  332. data/spec/extensions/inflector_spec.rb +0 -183
  333. data/spec/extensions/input_transformer_spec.rb +0 -69
  334. data/spec/extensions/insert_returning_select_spec.rb +0 -72
  335. data/spec/extensions/instance_filters_spec.rb +0 -79
  336. data/spec/extensions/instance_hooks_spec.rb +0 -246
  337. data/spec/extensions/integer64_spec.rb +0 -22
  338. data/spec/extensions/inverted_subsets_spec.rb +0 -33
  339. data/spec/extensions/json_serializer_spec.rb +0 -336
  340. data/spec/extensions/lazy_attributes_spec.rb +0 -183
  341. data/spec/extensions/list_spec.rb +0 -275
  342. data/spec/extensions/looser_typecasting_spec.rb +0 -43
  343. data/spec/extensions/many_through_many_spec.rb +0 -2177
  344. data/spec/extensions/migration_spec.rb +0 -840
  345. data/spec/extensions/modification_detection_spec.rb +0 -93
  346. data/spec/extensions/mssql_optimistic_locking_spec.rb +0 -92
  347. data/spec/extensions/named_timezones_spec.rb +0 -109
  348. data/spec/extensions/nested_attributes_spec.rb +0 -703
  349. data/spec/extensions/null_dataset_spec.rb +0 -85
  350. data/spec/extensions/optimistic_locking_spec.rb +0 -127
  351. data/spec/extensions/pagination_spec.rb +0 -116
  352. data/spec/extensions/pg_array_associations_spec.rb +0 -802
  353. data/spec/extensions/pg_array_ops_spec.rb +0 -144
  354. data/spec/extensions/pg_array_spec.rb +0 -398
  355. data/spec/extensions/pg_auto_constraint_validations_spec.rb +0 -165
  356. data/spec/extensions/pg_enum_spec.rb +0 -113
  357. data/spec/extensions/pg_extended_date_support_spec.rb +0 -126
  358. data/spec/extensions/pg_hstore_ops_spec.rb +0 -238
  359. data/spec/extensions/pg_hstore_spec.rb +0 -219
  360. data/spec/extensions/pg_inet_ops_spec.rb +0 -102
  361. data/spec/extensions/pg_inet_spec.rb +0 -72
  362. data/spec/extensions/pg_interval_spec.rb +0 -103
  363. data/spec/extensions/pg_json_ops_spec.rb +0 -289
  364. data/spec/extensions/pg_json_spec.rb +0 -262
  365. data/spec/extensions/pg_loose_count_spec.rb +0 -23
  366. data/spec/extensions/pg_range_ops_spec.rb +0 -60
  367. data/spec/extensions/pg_range_spec.rb +0 -487
  368. data/spec/extensions/pg_row_ops_spec.rb +0 -61
  369. data/spec/extensions/pg_row_plugin_spec.rb +0 -60
  370. data/spec/extensions/pg_row_spec.rb +0 -363
  371. data/spec/extensions/pg_static_cache_updater_spec.rb +0 -93
  372. data/spec/extensions/pg_timestamptz_spec.rb +0 -17
  373. data/spec/extensions/prepared_statements_safe_spec.rb +0 -66
  374. data/spec/extensions/prepared_statements_spec.rb +0 -182
  375. data/spec/extensions/pretty_table_spec.rb +0 -123
  376. data/spec/extensions/query_spec.rb +0 -94
  377. data/spec/extensions/rcte_tree_spec.rb +0 -381
  378. data/spec/extensions/round_timestamps_spec.rb +0 -39
  379. data/spec/extensions/s_spec.rb +0 -60
  380. data/spec/extensions/schema_caching_spec.rb +0 -64
  381. data/spec/extensions/schema_dumper_spec.rb +0 -868
  382. data/spec/extensions/select_remove_spec.rb +0 -38
  383. data/spec/extensions/sequel_4_dataset_methods_spec.rb +0 -121
  384. data/spec/extensions/serialization_modification_detection_spec.rb +0 -98
  385. data/spec/extensions/serialization_spec.rb +0 -365
  386. data/spec/extensions/server_block_spec.rb +0 -97
  387. data/spec/extensions/server_logging_spec.rb +0 -45
  388. data/spec/extensions/sharding_spec.rb +0 -189
  389. data/spec/extensions/shared_caching_spec.rb +0 -151
  390. data/spec/extensions/single_table_inheritance_spec.rb +0 -347
  391. data/spec/extensions/singular_table_names_spec.rb +0 -22
  392. data/spec/extensions/skip_create_refresh_spec.rb +0 -18
  393. data/spec/extensions/spec_helper.rb +0 -61
  394. data/spec/extensions/split_array_nil_spec.rb +0 -24
  395. data/spec/extensions/split_values_spec.rb +0 -57
  396. data/spec/extensions/sql_comments_spec.rb +0 -33
  397. data/spec/extensions/sql_expr_spec.rb +0 -59
  398. data/spec/extensions/static_cache_spec.rb +0 -410
  399. data/spec/extensions/string_agg_spec.rb +0 -90
  400. data/spec/extensions/string_date_time_spec.rb +0 -95
  401. data/spec/extensions/string_stripper_spec.rb +0 -68
  402. data/spec/extensions/subclasses_spec.rb +0 -79
  403. data/spec/extensions/subset_conditions_spec.rb +0 -38
  404. data/spec/extensions/symbol_aref_refinement_spec.rb +0 -28
  405. data/spec/extensions/symbol_as_refinement_spec.rb +0 -21
  406. data/spec/extensions/synchronize_sql_spec.rb +0 -124
  407. data/spec/extensions/table_select_spec.rb +0 -83
  408. data/spec/extensions/tactical_eager_loading_spec.rb +0 -141
  409. data/spec/extensions/thread_local_timezones_spec.rb +0 -67
  410. data/spec/extensions/timestamps_spec.rb +0 -209
  411. data/spec/extensions/to_dot_spec.rb +0 -153
  412. data/spec/extensions/touch_spec.rb +0 -226
  413. data/spec/extensions/tree_spec.rb +0 -284
  414. data/spec/extensions/typecast_on_load_spec.rb +0 -86
  415. data/spec/extensions/unlimited_update_spec.rb +0 -21
  416. data/spec/extensions/update_or_create_spec.rb +0 -83
  417. data/spec/extensions/update_primary_key_spec.rb +0 -105
  418. data/spec/extensions/update_refresh_spec.rb +0 -59
  419. data/spec/extensions/uuid_spec.rb +0 -101
  420. data/spec/extensions/validate_associated_spec.rb +0 -52
  421. data/spec/extensions/validation_class_methods_spec.rb +0 -1040
  422. data/spec/extensions/validation_contexts_spec.rb +0 -31
  423. data/spec/extensions/validation_helpers_spec.rb +0 -525
  424. data/spec/extensions/whitelist_security_spec.rb +0 -157
  425. data/spec/extensions/xml_serializer_spec.rb +0 -213
  426. data/spec/files/bad_down_migration/001_create_alt_basic.rb +0 -4
  427. data/spec/files/bad_down_migration/002_create_alt_advanced.rb +0 -4
  428. data/spec/files/bad_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  429. data/spec/files/bad_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  430. data/spec/files/bad_timestamped_migrations/1273253853_3_create_users.rb +0 -3
  431. data/spec/files/bad_up_migration/001_create_alt_basic.rb +0 -4
  432. data/spec/files/bad_up_migration/002_create_alt_advanced.rb +0 -3
  433. data/spec/files/convert_to_timestamp_migrations/001_create_sessions.rb +0 -9
  434. data/spec/files/convert_to_timestamp_migrations/002_create_nodes.rb +0 -9
  435. data/spec/files/convert_to_timestamp_migrations/003_3_create_users.rb +0 -4
  436. data/spec/files/convert_to_timestamp_migrations/1273253850_create_artists.rb +0 -9
  437. data/spec/files/convert_to_timestamp_migrations/1273253852_create_albums.rb +0 -9
  438. data/spec/files/double_migration/001_create_sessions.rb +0 -9
  439. data/spec/files/double_migration/002_create_nodes.rb +0 -19
  440. data/spec/files/double_migration/003_3_create_users.rb +0 -4
  441. data/spec/files/duplicate_integer_migrations/001_create_alt_advanced.rb +0 -4
  442. data/spec/files/duplicate_integer_migrations/001_create_alt_basic.rb +0 -4
  443. data/spec/files/duplicate_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  444. data/spec/files/duplicate_timestamped_migrations/1273253853_create_nodes.rb +0 -9
  445. data/spec/files/duplicate_timestamped_migrations/1273253853_create_users.rb +0 -4
  446. data/spec/files/empty_migration/001_create_sessions.rb +0 -9
  447. data/spec/files/empty_migration/002_create_nodes.rb +0 -0
  448. data/spec/files/empty_migration/003_3_create_users.rb +0 -4
  449. data/spec/files/integer_migrations/001_create_sessions.rb +0 -9
  450. data/spec/files/integer_migrations/002_create_nodes.rb +0 -9
  451. data/spec/files/integer_migrations/003_3_create_users.rb +0 -4
  452. data/spec/files/interleaved_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  453. data/spec/files/interleaved_timestamped_migrations/1273253850_create_artists.rb +0 -9
  454. data/spec/files/interleaved_timestamped_migrations/1273253851_create_nodes.rb +0 -9
  455. data/spec/files/interleaved_timestamped_migrations/1273253852_create_albums.rb +0 -9
  456. data/spec/files/interleaved_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  457. data/spec/files/missing_integer_migrations/001_create_alt_basic.rb +0 -4
  458. data/spec/files/missing_integer_migrations/003_create_alt_advanced.rb +0 -4
  459. data/spec/files/missing_timestamped_migrations/1273253849_create_sessions.rb +0 -9
  460. data/spec/files/missing_timestamped_migrations/1273253853_3_create_users.rb +0 -4
  461. data/spec/files/reversible_migrations/001_reversible.rb +0 -5
  462. data/spec/files/reversible_migrations/002_reversible.rb +0 -5
  463. data/spec/files/reversible_migrations/003_reversible.rb +0 -5
  464. data/spec/files/reversible_migrations/004_reversible.rb +0 -5
  465. data/spec/files/reversible_migrations/005_reversible.rb +0 -10
  466. data/spec/files/reversible_migrations/006_reversible.rb +0 -10
  467. data/spec/files/reversible_migrations/007_reversible.rb +0 -10
  468. data/spec/files/timestamped_migrations/1273253849_create_sessions.rb +0 -9
  469. data/spec/files/timestamped_migrations/1273253851_create_nodes.rb +0 -9
  470. data/spec/files/timestamped_migrations/1273253853_3_create_users.rb +0 -4
  471. data/spec/files/transaction_specified_migrations/001_create_alt_basic.rb +0 -4
  472. data/spec/files/transaction_specified_migrations/002_create_basic.rb +0 -4
  473. data/spec/files/transaction_unspecified_migrations/001_create_alt_basic.rb +0 -3
  474. data/spec/files/transaction_unspecified_migrations/002_create_basic.rb +0 -3
  475. data/spec/files/uppercase_timestamped_migrations/1273253849_CREATE_SESSIONS.RB +0 -9
  476. data/spec/files/uppercase_timestamped_migrations/1273253851_CREATE_NODES.RB +0 -9
  477. data/spec/files/uppercase_timestamped_migrations/1273253853_3_CREATE_USERS.RB +0 -4
  478. data/spec/guards_helper.rb +0 -58
  479. data/spec/integration/associations_test.rb +0 -2513
  480. data/spec/integration/database_test.rb +0 -113
  481. data/spec/integration/dataset_test.rb +0 -1880
  482. data/spec/integration/eager_loader_test.rb +0 -687
  483. data/spec/integration/migrator_test.rb +0 -262
  484. data/spec/integration/model_test.rb +0 -203
  485. data/spec/integration/plugin_test.rb +0 -2302
  486. data/spec/integration/prepared_statement_test.rb +0 -398
  487. data/spec/integration/schema_test.rb +0 -869
  488. data/spec/integration/spec_helper.rb +0 -64
  489. data/spec/integration/timezone_test.rb +0 -86
  490. data/spec/integration/transaction_test.rb +0 -354
  491. data/spec/integration/type_test.rb +0 -127
  492. data/spec/model/association_reflection_spec.rb +0 -803
  493. data/spec/model/associations_spec.rb +0 -4538
  494. data/spec/model/base_spec.rb +0 -817
  495. data/spec/model/class_dataset_methods_spec.rb +0 -146
  496. data/spec/model/dataset_methods_spec.rb +0 -198
  497. data/spec/model/eager_loading_spec.rb +0 -2262
  498. data/spec/model/hooks_spec.rb +0 -370
  499. data/spec/model/inflector_spec.rb +0 -26
  500. data/spec/model/model_spec.rb +0 -953
  501. data/spec/model/plugins_spec.rb +0 -318
  502. data/spec/model/record_spec.rb +0 -2107
  503. data/spec/model/spec_helper.rb +0 -45
  504. data/spec/model/validations_spec.rb +0 -193
  505. data/spec/model_no_assoc_spec.rb +0 -1
  506. data/spec/model_spec.rb +0 -1
  507. data/spec/plugin_spec.rb +0 -1
  508. data/spec/sequel_coverage.rb +0 -15
  509. data/spec/sequel_warning.rb +0 -4
  510. data/spec/spec_config.rb +0 -12
@@ -250,7 +250,7 @@ module Sequel
250
250
  # Artist.create do |a|
251
251
  # a.name = 'Jim'
252
252
  # end # INSERT INTO artists (name) VALUES ('Jim')
253
- def create(values = {}, &block)
253
+ def create(values = OPTS, &block)
254
254
  new(values, &block).save
255
255
  end
256
256
 
@@ -324,14 +324,14 @@ module Sequel
324
324
  # Any public methods in the dataset module will have class methods created that
325
325
  # call the method on the dataset, assuming that the class method is not already
326
326
  # defined.
327
- def dataset_module(mod = nil)
327
+ def dataset_module(mod = nil, &block)
328
328
  if mod
329
- raise Error, "can't provide both argument and block to Model.dataset_module" if block_given?
329
+ raise Error, "can't provide both argument and block to Model.dataset_module" if block
330
330
  dataset_extend(mod)
331
331
  mod
332
332
  else
333
333
  @dataset_module ||= dataset_module_class.new(self)
334
- @dataset_module.module_eval(&Proc.new) if block_given?
334
+ @dataset_module.module_eval(&block) if block
335
335
  dataset_extend(@dataset_module)
336
336
  @dataset_module
337
337
  end
@@ -446,6 +446,13 @@ module Sequel
446
446
  super
447
447
  end
448
448
 
449
+ # Whether the model has a dataset. True for most model classes,
450
+ # but can be false if the model class is an abstract model class
451
+ # designed for subclassing, such as Sequel::Model itself.
452
+ def has_dataset?
453
+ !@dataset.nil?
454
+ end
455
+
449
456
  # Clear the setter_methods cache when a module is included, as it
450
457
  # may contain setter methods.
451
458
  def include(*mods)
@@ -453,47 +460,6 @@ module Sequel
453
460
  super
454
461
  end
455
462
 
456
- # If possible, set the dataset for the model subclass as soon as it
457
- # is created. Also, make sure the inherited class instance variables
458
- # are copied into the subclass.
459
- #
460
- # Sequel queries the database to get schema information as soon as
461
- # a model class is created:
462
- #
463
- # class Artist < Sequel::Model # Causes schema query
464
- # end
465
- def inherited(subclass)
466
- super
467
- ivs = subclass.instance_variables
468
- inherited_instance_variables.each do |iv, dup|
469
- next if ivs.include?(iv)
470
- if (sup_class_value = instance_variable_get(iv)) && dup
471
- sup_class_value = case dup
472
- when :dup
473
- sup_class_value.dup
474
- when :hash_dup
475
- h = {}
476
- sup_class_value.each{|k,v| h[k] = v.dup}
477
- h
478
- when Proc
479
- dup.call(sup_class_value)
480
- else
481
- raise Error, "bad inherited instance variable type: #{dup.inspect}"
482
- end
483
- end
484
- subclass.instance_variable_set(iv, sup_class_value)
485
- end
486
-
487
- unless ivs.include?(:@dataset)
488
- if @dataset && self != Model
489
- subclass.set_dataset(@dataset.clone, :inherited=>true)
490
- elsif (n = subclass.name) && !n.to_s.empty?
491
- db
492
- subclass.set_dataset(subclass.implicit_table_name)
493
- end
494
- end
495
- end
496
-
497
463
  # Returns the implicit table name for the model class, which is the demodulized,
498
464
  # underscored, pluralized name of the class.
499
465
  #
@@ -508,12 +474,6 @@ module Sequel
508
474
  call(values)
509
475
  end
510
476
 
511
- # Clear the setter_methods cache when a setter method is added.
512
- def method_added(meth)
513
- clear_setter_methods_cache if meth.to_s.end_with?('=')
514
- super
515
- end
516
-
517
477
  # Mark the model as not having a primary key. Not having a primary key
518
478
  # can cause issues, among which is that you won't be able to update records.
519
479
  #
@@ -531,6 +491,11 @@ module Sequel
531
491
  # the module using a the camelized plugin name under Sequel::Plugins.
532
492
  def plugin(plugin, *args, &block)
533
493
  m = plugin.is_a?(Module) ? plugin : plugin_module(plugin)
494
+
495
+ if !m.respond_to?(:apply) && !m.respond_to?(:configure) && (!args.empty? || block)
496
+ Deprecation.deprecate("Plugin #{plugin} accepts no arguments or block, and passing arguments/block to it", "Remove arguments and block when loading the plugin")
497
+ end
498
+
534
499
  unless @plugins.include?(m)
535
500
  @plugins << m
536
501
  m.apply(self, *args, &block) if m.respond_to?(:apply)
@@ -540,8 +505,10 @@ module Sequel
540
505
  dataset_extend(m::DatasetMethods, :create_class_methods=>false)
541
506
  end
542
507
  end
508
+
543
509
  m.configure(self, *args, &block) if m.respond_to?(:configure)
544
510
  end
511
+ ruby2_keywords(:plugin) if respond_to?(:ruby2_keywords, true)
545
512
 
546
513
  # Returns primary key attribute hash. If using a composite primary key
547
514
  # value such be an array with values for each primary key in the correct
@@ -633,7 +600,7 @@ module Sequel
633
600
  @columns = superclass.instance_variable_get(:@columns)
634
601
  @db_schema = superclass.instance_variable_get(:@db_schema)
635
602
  else
636
- @dataset = @dataset.with_extend(*@dataset_method_modules.reverse) if @dataset_method_modules
603
+ @dataset = @dataset.with_extend(*@dataset_method_modules.reverse)
637
604
  @db_schema = get_db_schema
638
605
  end
639
606
 
@@ -672,8 +639,7 @@ module Sequel
672
639
 
673
640
  # Cache of setter methods to allow by default, in order to speed up mass assignment.
674
641
  def setter_methods
675
- return @setter_methods if @setter_methods
676
- @setter_methods = get_setter_methods
642
+ @setter_methods || (@setter_methods = get_setter_methods)
677
643
  end
678
644
 
679
645
  # Returns name of primary table for the dataset. If the table for the dataset
@@ -758,9 +724,11 @@ module Sequel
758
724
 
759
725
  # Create a column accessor for a column with a method name that is hard to use in ruby code.
760
726
  def def_bad_column_accessor(column)
727
+ im = instance_methods
761
728
  overridable_methods_module.module_eval do
762
- define_method(column){self[column]}
763
- define_method("#{column}="){|v| self[column] = v}
729
+ meth = :"#{column}="
730
+ define_method(column){self[column]} unless im.include?(column)
731
+ define_method(meth){|v| self[column] = v} unless im.include?(meth)
764
732
  end
765
733
  end
766
734
 
@@ -772,7 +740,7 @@ module Sequel
772
740
  bad_columns.each{|x| def_bad_column_accessor(x)}
773
741
  im = instance_methods
774
742
  columns.each do |column|
775
- meth = "#{column}="
743
+ meth = :"#{column}="
776
744
  overridable_methods_module.module_eval("def #{column}; self[:#{column}] end", __FILE__, __LINE__) unless im.include?(column)
777
745
  overridable_methods_module.module_eval("def #{meth}(v); self[:#{column}] = v end", __FILE__, __LINE__) unless im.include?(meth)
778
746
  end
@@ -789,6 +757,7 @@ module Sequel
789
757
  else
790
758
  define_singleton_method(meth){|*args, &block| dataset.public_send(meth, *args, &block)}
791
759
  end
760
+ singleton_class.send(:ruby2_keywords, meth) if respond_to?(:ruby2_keywords, true)
792
761
  end
793
762
 
794
763
  # Get the schema from the database, fall back on checking the columns
@@ -845,6 +814,46 @@ module Sequel
845
814
  meths
846
815
  end
847
816
 
817
+ # If possible, set the dataset for the model subclass as soon as it
818
+ # is created. Also, make sure the inherited class instance variables
819
+ # are copied into the subclass.
820
+ #
821
+ # Sequel queries the database to get schema information as soon as
822
+ # a model class is created:
823
+ #
824
+ # class Artist < Sequel::Model # Causes schema query
825
+ # end
826
+ def inherited(subclass)
827
+ super
828
+ ivs = subclass.instance_variables
829
+ inherited_instance_variables.each do |iv, dup|
830
+ if (sup_class_value = instance_variable_get(iv)) && dup
831
+ sup_class_value = case dup
832
+ when :dup
833
+ sup_class_value.dup
834
+ when :hash_dup
835
+ h = {}
836
+ sup_class_value.each{|k,v| h[k] = v.dup}
837
+ h
838
+ when Proc
839
+ dup.call(sup_class_value)
840
+ else
841
+ raise Error, "bad inherited instance variable type: #{dup.inspect}"
842
+ end
843
+ end
844
+ subclass.instance_variable_set(iv, sup_class_value)
845
+ end
846
+
847
+ unless ivs.include?(:@dataset)
848
+ if @dataset && self != Model
849
+ subclass.set_dataset(@dataset.clone, :inherited=>true)
850
+ elsif (n = subclass.name) && !n.to_s.empty?
851
+ db
852
+ subclass.set_dataset(subclass.implicit_table_name)
853
+ end
854
+ end
855
+ end
856
+
848
857
  # A hash of instance variables to automatically set up in subclasses.
849
858
  # Keys are instance variable symbols, values should be:
850
859
  # nil :: Assign directly from superclass to subclass (frozen objects)
@@ -899,6 +908,12 @@ module Sequel
899
908
  opts[:class_name] ||= '::' + ((name || '').split("::")[0..-2] + [camelize(default)]).join('::')
900
909
  end
901
910
 
911
+ # Clear the setter_methods cache when a setter method is added.
912
+ def method_added(meth)
913
+ clear_setter_methods_cache if meth.to_s.end_with?('=')
914
+ super
915
+ end
916
+
902
917
  # Module that the class includes that holds methods the class adds for column accessors and
903
918
  # associations so that the methods can be overridden with +super+.
904
919
  def overridable_methods_module
@@ -1055,12 +1070,12 @@ module Sequel
1055
1070
  # Artist.new do |a|
1056
1071
  # a.name = 'Bob'
1057
1072
  # end
1058
- def initialize(values = {})
1073
+ def initialize(values = OPTS)
1059
1074
  @values = {}
1060
1075
  @new = true
1061
1076
  @modified = true
1062
1077
  initialize_set(values)
1063
- _changed_columns.clear
1078
+ _clear_changed_columns(:initialize)
1064
1079
  yield self if block_given?
1065
1080
  end
1066
1081
 
@@ -1096,16 +1111,33 @@ module Sequel
1096
1111
  eql?(obj)
1097
1112
  end
1098
1113
 
1099
- # If pk is not nil, true only if the objects have the same class and pk.
1100
- # If pk is nil, false.
1114
+ # Case equality. By default, checks equality of the primary key value, see
1115
+ # pk_equal?.
1101
1116
  #
1102
- # Artist[1] === Artist[1] # true
1103
- # Artist.new === Artist.new # false
1104
- # Artist[1].set(:name=>'Bob') == Artist[1] # => true
1117
+ # Artist[1] === Artist[1] # => true
1118
+ # Artist.new === Artist.new # => false
1119
+ # Artist[1].set(:name=>'Bob') === Artist[1] # => true
1105
1120
  def ===(obj)
1106
- pk.nil? ? false : (obj.class == model) && (obj.pk == pk)
1121
+ case pkv = pk
1122
+ when nil
1123
+ return false
1124
+ when Array
1125
+ return false if pkv.any?(&:nil?)
1126
+ end
1127
+
1128
+ (obj.class == model) && (obj.pk == pkv)
1107
1129
  end
1108
-
1130
+
1131
+ # If the receiver has a primary key value, returns true if the objects have
1132
+ # the same class and primary key value.
1133
+ # If the receiver's primary key value is nil or is an array containing
1134
+ # nil, returns false.
1135
+ #
1136
+ # Artist[1].pk_equal?(Artist[1]) # => true
1137
+ # Artist.new.pk_equal?(Artist.new) # => false
1138
+ # Artist[1].set(:name=>'Bob').pk_equal?(Artist[1]) # => true
1139
+ alias pk_equal? ===
1140
+
1109
1141
  # class is defined in Object, but it is also a keyword,
1110
1142
  # and since a lot of instance methods call class methods,
1111
1143
  # this alias makes it so you can use model instead of
@@ -1280,11 +1312,11 @@ module Sequel
1280
1312
  # a.update(:name=>'A')
1281
1313
  # end
1282
1314
  #
1283
- # a = Artist[2]
1284
- # Artist.db.transaction do
1285
- # a.lock!('FOR NO KEY UPDATE')
1286
- # a.update(:name=>'B')
1287
- # end
1315
+ # a = Artist[2]
1316
+ # Artist.db.transaction do
1317
+ # a.lock!('FOR NO KEY UPDATE')
1318
+ # a.update(:name=>'B')
1319
+ # end
1288
1320
  def lock!(style=:update)
1289
1321
  _refresh(this.lock_style(style)) unless new?
1290
1322
  self
@@ -1408,9 +1440,9 @@ module Sequel
1408
1440
  # is valid and before hooks execute successfully. Fails if:
1409
1441
  #
1410
1442
  # * the record is not valid, or
1411
- # * before_save returns false, or
1412
- # * the record is new and before_create returns false, or
1413
- # * the record is not new and before_update returns false.
1443
+ # * before_save calls cancel_action, or
1444
+ # * the record is new and before_create calls cancel_action, or
1445
+ # * the record is not new and before_update calls cancel_action.
1414
1446
  #
1415
1447
  # If +save+ fails and either raise_on_save_failure or the
1416
1448
  # :raise_on_failure option is true, it raises ValidationFailed
@@ -1432,8 +1464,8 @@ module Sequel
1432
1464
  def save(opts=OPTS)
1433
1465
  raise Sequel::Error, "can't save frozen object" if frozen?
1434
1466
  set_server(opts[:server]) if opts[:server]
1435
- unless checked_save_failure(opts){_valid?(opts)}
1436
- raise(ValidationFailed.new(self)) if raise_on_failure?(opts)
1467
+ unless _save_valid?(opts)
1468
+ raise(validation_failed_error) if raise_on_failure?(opts)
1437
1469
  return
1438
1470
  end
1439
1471
  checked_save_failure(opts){checked_transaction(opts){_save(opts)}}
@@ -1491,7 +1523,7 @@ module Sequel
1491
1523
  # # Sequel::Error raised
1492
1524
  def set_fields(hash, fields, opts=nil)
1493
1525
  opts = if opts
1494
- Hash[model.default_set_fields_options].merge!(opts)
1526
+ model.default_set_fields_options.merge(opts)
1495
1527
  else
1496
1528
  model.default_set_fields_options
1497
1529
  end
@@ -1527,6 +1559,15 @@ module Sequel
1527
1559
  super
1528
1560
  end
1529
1561
 
1562
+ # Skip all validation of the object on the next call to #save,
1563
+ # including the running of validation hooks. This is designed for
1564
+ # and should only be used in cases where #valid? is called before
1565
+ # saving and the <tt>validate: false</tt> option cannot be passed to
1566
+ # #save.
1567
+ def skip_validation_on_next_save!
1568
+ @skip_validation_on_next_save = true
1569
+ end
1570
+
1530
1571
  # Returns (naked) dataset that should return only this instance.
1531
1572
  #
1532
1573
  # Artist[1].this
@@ -1544,8 +1585,8 @@ module Sequel
1544
1585
  update_restricted(hash, :default)
1545
1586
  end
1546
1587
 
1547
- # Update the instances values by calling +set_fields+ with the arguments, then
1548
- # saves any changes to the record. Returns self.
1588
+ # Update the instance's values by calling set_fields with the arguments, then
1589
+ # calls save_changes.
1549
1590
  #
1550
1591
  # artist.update_fields({name: 'Jim'}, [:name])
1551
1592
  # # UPDATE artists SET name = 'Jim' WHERE (id = 1)
@@ -1591,6 +1632,13 @@ module Sequel
1591
1632
  def _changed_columns
1592
1633
  @changed_columns ||= []
1593
1634
  end
1635
+
1636
+ # Clear the changed columns. Reason is the reason for clearing
1637
+ # the columns, and should be one of: :initialize, :refresh, :create
1638
+ # or :update.
1639
+ def _clear_changed_columns(_reason)
1640
+ _changed_columns.clear
1641
+ end
1594
1642
 
1595
1643
  # Do the deletion of the object's dataset, and check that the row
1596
1644
  # was actually deleted.
@@ -1676,12 +1724,13 @@ module Sequel
1676
1724
 
1677
1725
  # The values hash to use when inserting a new record.
1678
1726
  alias _insert_values values
1727
+ private :_insert_values
1679
1728
 
1680
1729
  # Refresh using a particular dataset, used inside save to make sure the same server
1681
1730
  # is used for reading newly inserted values from the database
1682
1731
  def _refresh(dataset)
1683
1732
  _refresh_set_values(_refresh_get(dataset) || raise(NoExistingObject, "Record not found"))
1684
- _changed_columns.clear
1733
+ _clear_changed_columns(:refresh)
1685
1734
  end
1686
1735
 
1687
1736
  # Get the row of column data from the database.
@@ -1719,7 +1768,7 @@ module Sequel
1719
1768
  @this = nil
1720
1769
  @new = false
1721
1770
  @modified = false
1722
- pk ? _save_refresh : _changed_columns.clear
1771
+ pk ? _save_refresh : _clear_changed_columns(:create)
1723
1772
  after_create
1724
1773
  true
1725
1774
  end
@@ -1730,14 +1779,12 @@ module Sequel
1730
1779
  before_update
1731
1780
  columns = opts[:columns]
1732
1781
  if columns.nil?
1733
- if opts[:changed]
1734
- cc = changed_columns
1735
- columns_updated = @values.reject{|k,v| !cc.include?(k)}
1736
- cc.clear
1782
+ columns_updated = if opts[:changed]
1783
+ _save_update_changed_colums_hash
1737
1784
  else
1738
- columns_updated = _save_update_all_columns_hash
1739
- _changed_columns.clear
1785
+ _save_update_all_columns_hash
1740
1786
  end
1787
+ _clear_changed_columns(:update)
1741
1788
  else # update only the specified columns
1742
1789
  columns = Array(columns)
1743
1790
  columns_updated = @values.reject{|k, v| !columns.include?(k)}
@@ -1763,7 +1810,7 @@ module Sequel
1763
1810
  # can be overridden to avoid the refresh.
1764
1811
  def _save_refresh
1765
1812
  _save_set_values(_refresh_get(this.server?(:default)) || raise(NoExistingObject, "Record not found"))
1766
- _changed_columns.clear
1813
+ _clear_changed_columns(:create)
1767
1814
  end
1768
1815
 
1769
1816
  # Set values to the provided hash. Called after a create,
@@ -1785,6 +1832,27 @@ module Sequel
1785
1832
  v
1786
1833
  end
1787
1834
 
1835
+ # Return a hash of values used when saving changed columns of an
1836
+ # existing object. Defaults to all of the objects current values
1837
+ # that are recorded as modified.
1838
+ def _save_update_changed_colums_hash
1839
+ cc = changed_columns
1840
+ @values.reject{|k,v| !cc.include?(k)}
1841
+ end
1842
+
1843
+ # Validate the object if validating on save. Skips validation
1844
+ # completely (including validation hooks) if
1845
+ # skip_validation_on_save! has been called on the object,
1846
+ # resetting the flag so that future saves will validate.
1847
+ def _save_valid?(opts)
1848
+ if @skip_validation_on_next_save
1849
+ @skip_validation_on_next_save = false
1850
+ return true
1851
+ end
1852
+
1853
+ checked_save_failure(opts){_valid?(opts)}
1854
+ end
1855
+
1788
1856
  # Call _update with the given columns, if any are present.
1789
1857
  # Plugins can override this method in order to update with
1790
1858
  # additional columns, even when the column hash is initially empty.
@@ -1868,6 +1936,11 @@ module Sequel
1868
1936
  Errors
1869
1937
  end
1870
1938
 
1939
+ # A HookFailed exception for the given message tied to the current instance.
1940
+ def hook_failed_error(msg)
1941
+ HookFailed.new(msg, self)
1942
+ end
1943
+
1871
1944
  # Clone constructor -- freeze internal data structures if the original's
1872
1945
  # are frozen.
1873
1946
  def initialize_clone(other)
@@ -1917,9 +1990,9 @@ module Sequel
1917
1990
  "a hook failed"
1918
1991
  end
1919
1992
 
1920
- raise HookFailed.new(msg, self)
1993
+ raise hook_failed_error(msg)
1921
1994
  end
1922
-
1995
+
1923
1996
  # Get the ruby class or classes related to the given column's type.
1924
1997
  def schema_type_class(column)
1925
1998
  if (sch = db_schema[column]) && (type = sch[:type])
@@ -2012,6 +2085,11 @@ module Sequel
2012
2085
  def use_transaction?(opts = OPTS)
2013
2086
  opts.fetch(:transaction, use_transactions)
2014
2087
  end
2088
+
2089
+ # An ValidationFailed exception instance to raise for this instance.
2090
+ def validation_failed_error
2091
+ ValidationFailed.new(self)
2092
+ end
2015
2093
  end
2016
2094
 
2017
2095
  # DatasetMethods contains methods that all model datasets have.
@@ -2160,7 +2238,9 @@ module Sequel
2160
2238
  plugin self
2161
2239
 
2162
2240
  singleton_class.send(:undef_method, :dup, :clone, :initialize_copy)
2241
+ # :nocov:
2163
2242
  if RUBY_VERSION >= '1.9.3'
2243
+ # :nocov:
2164
2244
  singleton_class.send(:undef_method, :initialize_clone, :initialize_dup)
2165
2245
  end
2166
2246
  end