sequel 4.49.0 → 5.0.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 (477) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +70 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +3 -5
  6. data/doc/advanced_associations.rdoc +86 -163
  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/schema_modification.rdoc +63 -60
  29. data/doc/security.rdoc +97 -88
  30. data/doc/sharding.rdoc +43 -30
  31. data/doc/sql.rdoc +53 -65
  32. data/doc/testing.rdoc +3 -5
  33. data/doc/thread_safety.rdoc +2 -4
  34. data/doc/transactions.rdoc +18 -17
  35. data/doc/validations.rdoc +48 -45
  36. data/doc/virtual_rows.rdoc +87 -115
  37. data/lib/sequel.rb +1 -1
  38. data/lib/sequel/adapters/ado.rb +9 -25
  39. data/lib/sequel/adapters/ado/access.rb +7 -13
  40. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  41. data/lib/sequel/adapters/amalgalite.rb +3 -18
  42. data/lib/sequel/adapters/ibmdb.rb +9 -45
  43. data/lib/sequel/adapters/jdbc.rb +13 -73
  44. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  45. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  46. data/lib/sequel/adapters/jdbc/h2.rb +4 -25
  47. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
  48. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  49. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  50. data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
  51. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  52. data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
  53. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  54. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  55. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  56. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  57. data/lib/sequel/adapters/mock.rb +4 -30
  58. data/lib/sequel/adapters/mysql.rb +7 -44
  59. data/lib/sequel/adapters/mysql2.rb +5 -23
  60. data/lib/sequel/adapters/odbc.rb +0 -19
  61. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  62. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  63. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  64. data/lib/sequel/adapters/oracle.rb +7 -13
  65. data/lib/sequel/adapters/postgres.rb +13 -57
  66. data/lib/sequel/adapters/postgresql.rb +1 -1
  67. data/lib/sequel/adapters/shared/access.rb +11 -51
  68. data/lib/sequel/adapters/shared/db2.rb +3 -61
  69. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  70. data/lib/sequel/adapters/shared/mysql.rb +23 -224
  71. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  72. data/lib/sequel/adapters/shared/postgres.rb +44 -259
  73. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  74. data/lib/sequel/adapters/shared/sqlite.rb +12 -101
  75. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  76. data/lib/sequel/adapters/sqlite.rb +2 -19
  77. data/lib/sequel/adapters/tinytds.rb +5 -15
  78. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  79. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
  80. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  81. data/lib/sequel/adapters/utils/replace.rb +0 -5
  82. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  83. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  84. data/lib/sequel/ast_transformer.rb +3 -94
  85. data/lib/sequel/connection_pool.rb +26 -28
  86. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  87. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  88. data/lib/sequel/connection_pool/single.rb +0 -2
  89. data/lib/sequel/connection_pool/threaded.rb +94 -110
  90. data/lib/sequel/core.rb +42 -101
  91. data/lib/sequel/database.rb +12 -2
  92. data/lib/sequel/database/connecting.rb +23 -60
  93. data/lib/sequel/database/dataset.rb +6 -9
  94. data/lib/sequel/database/dataset_defaults.rb +4 -48
  95. data/lib/sequel/database/features.rb +5 -4
  96. data/lib/sequel/database/logging.rb +2 -9
  97. data/lib/sequel/database/misc.rb +23 -55
  98. data/lib/sequel/database/query.rb +8 -13
  99. data/lib/sequel/database/schema_generator.rb +89 -64
  100. data/lib/sequel/database/schema_methods.rb +61 -79
  101. data/lib/sequel/database/transactions.rb +4 -24
  102. data/lib/sequel/dataset.rb +18 -10
  103. data/lib/sequel/dataset/actions.rb +53 -107
  104. data/lib/sequel/dataset/dataset_module.rb +3 -15
  105. data/lib/sequel/dataset/features.rb +30 -30
  106. data/lib/sequel/dataset/graph.rb +40 -49
  107. data/lib/sequel/dataset/misc.rb +12 -37
  108. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  109. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  110. data/lib/sequel/dataset/query.rb +71 -155
  111. data/lib/sequel/dataset/sql.rb +30 -225
  112. data/lib/sequel/deprecated.rb +18 -27
  113. data/lib/sequel/exceptions.rb +1 -17
  114. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  115. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  116. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  117. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  118. data/lib/sequel/extensions/connection_validator.rb +1 -1
  119. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  120. data/lib/sequel/extensions/core_extensions.rb +39 -49
  121. data/lib/sequel/extensions/core_refinements.rb +39 -45
  122. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  123. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  124. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  125. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  126. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  127. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  128. data/lib/sequel/extensions/from_block.rb +1 -35
  129. data/lib/sequel/extensions/graph_each.rb +2 -2
  130. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  131. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  132. data/lib/sequel/extensions/inflector.rb +4 -4
  133. data/lib/sequel/extensions/migration.rb +23 -40
  134. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  135. data/lib/sequel/extensions/null_dataset.rb +2 -8
  136. data/lib/sequel/extensions/pagination.rb +1 -17
  137. data/lib/sequel/extensions/pg_array.rb +20 -189
  138. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  139. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  140. data/lib/sequel/extensions/pg_inet.rb +2 -15
  141. data/lib/sequel/extensions/pg_interval.rb +1 -20
  142. data/lib/sequel/extensions/pg_json.rb +7 -27
  143. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  144. data/lib/sequel/extensions/pg_range.rb +6 -121
  145. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  146. data/lib/sequel/extensions/pg_row.rb +5 -77
  147. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  148. data/lib/sequel/extensions/query.rb +3 -4
  149. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  150. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  151. data/lib/sequel/extensions/select_remove.rb +3 -3
  152. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  153. data/lib/sequel/extensions/sql_comments.rb +2 -2
  154. data/lib/sequel/extensions/string_agg.rb +11 -8
  155. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  156. data/lib/sequel/model.rb +27 -62
  157. data/lib/sequel/model/associations.rb +128 -131
  158. data/lib/sequel/model/base.rb +171 -711
  159. data/lib/sequel/model/default_inflections.rb +1 -1
  160. data/lib/sequel/model/errors.rb +0 -3
  161. data/lib/sequel/model/exceptions.rb +2 -6
  162. data/lib/sequel/model/inflections.rb +1 -26
  163. data/lib/sequel/model/plugins.rb +1 -0
  164. data/lib/sequel/plugins/active_model.rb +2 -5
  165. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  166. data/lib/sequel/plugins/association_pks.rb +14 -28
  167. data/lib/sequel/plugins/association_proxies.rb +6 -7
  168. data/lib/sequel/plugins/auto_validations.rb +4 -4
  169. data/lib/sequel/plugins/before_after_save.rb +0 -43
  170. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  171. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  172. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  173. data/lib/sequel/plugins/caching.rb +5 -5
  174. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  175. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  176. data/lib/sequel/plugins/column_select.rb +2 -2
  177. data/lib/sequel/plugins/composition.rb +15 -24
  178. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  179. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  180. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  181. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  182. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  183. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  184. data/lib/sequel/plugins/finder.rb +16 -10
  185. data/lib/sequel/plugins/force_encoding.rb +1 -7
  186. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  187. data/lib/sequel/plugins/input_transformer.rb +10 -11
  188. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  189. data/lib/sequel/plugins/instance_filters.rb +5 -5
  190. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  191. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  192. data/lib/sequel/plugins/json_serializer.rb +19 -19
  193. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  194. data/lib/sequel/plugins/list.rb +6 -6
  195. data/lib/sequel/plugins/many_through_many.rb +11 -8
  196. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  197. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  198. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  199. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  200. data/lib/sequel/plugins/pg_row.rb +2 -11
  201. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  202. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  203. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  204. data/lib/sequel/plugins/serialization.rb +15 -33
  205. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  206. data/lib/sequel/plugins/sharding.rb +2 -8
  207. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  208. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  209. data/lib/sequel/plugins/static_cache.rb +8 -9
  210. data/lib/sequel/plugins/string_stripper.rb +3 -3
  211. data/lib/sequel/plugins/subclasses.rb +1 -1
  212. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  213. data/lib/sequel/plugins/table_select.rb +2 -2
  214. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  215. data/lib/sequel/plugins/timestamps.rb +6 -7
  216. data/lib/sequel/plugins/touch.rb +4 -8
  217. data/lib/sequel/plugins/tree.rb +3 -3
  218. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  219. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  220. data/lib/sequel/plugins/update_or_create.rb +3 -3
  221. data/lib/sequel/plugins/update_refresh.rb +3 -3
  222. data/lib/sequel/plugins/uuid.rb +7 -11
  223. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  224. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  225. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  226. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  227. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  228. data/lib/sequel/sql.rb +145 -276
  229. data/lib/sequel/timezones.rb +8 -22
  230. data/lib/sequel/version.rb +2 -2
  231. data/spec/adapter_spec.rb +1 -1
  232. data/spec/adapters/db2_spec.rb +2 -103
  233. data/spec/adapters/mssql_spec.rb +89 -68
  234. data/spec/adapters/mysql_spec.rb +101 -480
  235. data/spec/adapters/oracle_spec.rb +1 -9
  236. data/spec/adapters/postgres_spec.rb +312 -565
  237. data/spec/adapters/spec_helper.rb +12 -31
  238. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  239. data/spec/adapters/sqlite_spec.rb +8 -146
  240. data/spec/bin_spec.rb +11 -16
  241. data/spec/core/connection_pool_spec.rb +173 -74
  242. data/spec/core/database_spec.rb +64 -244
  243. data/spec/core/dataset_spec.rb +81 -415
  244. data/spec/core/deprecated_spec.rb +3 -3
  245. data/spec/core/expression_filters_spec.rb +37 -144
  246. data/spec/core/mock_adapter_spec.rb +176 -4
  247. data/spec/core/object_graph_spec.rb +11 -60
  248. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  249. data/spec/core/schema_generator_spec.rb +51 -40
  250. data/spec/core/schema_spec.rb +74 -77
  251. data/spec/core/spec_helper.rb +6 -24
  252. data/spec/core/version_spec.rb +1 -1
  253. data/spec/core_extensions_spec.rb +7 -83
  254. data/spec/core_model_spec.rb +2 -2
  255. data/spec/deprecation_helper.rb +2 -14
  256. data/spec/extensions/accessed_columns_spec.rb +1 -1
  257. data/spec/extensions/active_model_spec.rb +3 -3
  258. data/spec/extensions/after_initialize_spec.rb +1 -1
  259. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  260. data/spec/extensions/association_dependencies_spec.rb +1 -1
  261. data/spec/extensions/association_pks_spec.rb +4 -59
  262. data/spec/extensions/association_proxies_spec.rb +1 -1
  263. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  264. data/spec/extensions/auto_validations_spec.rb +1 -1
  265. data/spec/extensions/blacklist_security_spec.rb +1 -1
  266. data/spec/extensions/blank_spec.rb +1 -1
  267. data/spec/extensions/boolean_readers_spec.rb +1 -1
  268. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  269. data/spec/extensions/caching_spec.rb +1 -1
  270. data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
  271. data/spec/extensions/column_conflicts_spec.rb +1 -1
  272. data/spec/extensions/column_select_spec.rb +4 -4
  273. data/spec/extensions/columns_introspection_spec.rb +1 -1
  274. data/spec/extensions/columns_updated_spec.rb +1 -1
  275. data/spec/extensions/composition_spec.rb +1 -7
  276. data/spec/extensions/connection_expiration_spec.rb +3 -3
  277. data/spec/extensions/connection_validator_spec.rb +3 -3
  278. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  279. data/spec/extensions/constraint_validations_spec.rb +1 -1
  280. data/spec/extensions/core_refinements_spec.rb +1 -3
  281. data/spec/extensions/csv_serializer_spec.rb +4 -9
  282. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  283. data/spec/extensions/dataset_associations_spec.rb +2 -1
  284. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  285. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  286. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  287. data/spec/extensions/defaults_setter_spec.rb +2 -2
  288. data/spec/extensions/delay_add_association_spec.rb +8 -9
  289. data/spec/extensions/dirty_spec.rb +1 -1
  290. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  291. data/spec/extensions/eager_each_spec.rb +2 -2
  292. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  293. data/spec/extensions/error_splitter_spec.rb +1 -1
  294. data/spec/extensions/error_sql_spec.rb +1 -1
  295. data/spec/extensions/eval_inspect_spec.rb +1 -1
  296. data/spec/extensions/finder_spec.rb +1 -1
  297. data/spec/extensions/force_encoding_spec.rb +2 -5
  298. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  299. data/spec/extensions/graph_each_spec.rb +5 -5
  300. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  301. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  302. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  303. data/spec/extensions/inflector_spec.rb +1 -1
  304. data/spec/extensions/input_transformer_spec.rb +7 -2
  305. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  306. data/spec/extensions/instance_filters_spec.rb +1 -1
  307. data/spec/extensions/instance_hooks_spec.rb +1 -95
  308. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  309. data/spec/extensions/json_serializer_spec.rb +1 -1
  310. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  311. data/spec/extensions/list_spec.rb +1 -1
  312. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  313. data/spec/extensions/many_through_many_spec.rb +1 -1
  314. data/spec/extensions/migration_spec.rb +2 -2
  315. data/spec/extensions/modification_detection_spec.rb +1 -1
  316. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  317. data/spec/extensions/named_timezones_spec.rb +3 -3
  318. data/spec/extensions/nested_attributes_spec.rb +1 -29
  319. data/spec/extensions/null_dataset_spec.rb +1 -11
  320. data/spec/extensions/optimistic_locking_spec.rb +1 -1
  321. data/spec/extensions/pagination_spec.rb +1 -1
  322. data/spec/extensions/pg_array_associations_spec.rb +4 -1
  323. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  324. data/spec/extensions/pg_array_spec.rb +3 -48
  325. data/spec/extensions/pg_enum_spec.rb +1 -1
  326. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  327. data/spec/extensions/pg_hstore_spec.rb +23 -32
  328. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_inet_spec.rb +1 -14
  330. data/spec/extensions/pg_interval_spec.rb +3 -13
  331. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  332. data/spec/extensions/pg_json_spec.rb +1 -13
  333. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  334. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_range_spec.rb +3 -88
  336. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  337. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  338. data/spec/extensions/pg_row_spec.rb +1 -44
  339. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  340. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  341. data/spec/extensions/prepared_statements_spec.rb +13 -48
  342. data/spec/extensions/pretty_table_spec.rb +1 -1
  343. data/spec/extensions/query_spec.rb +1 -12
  344. data/spec/extensions/rcte_tree_spec.rb +1 -1
  345. data/spec/extensions/round_timestamps_spec.rb +1 -5
  346. data/spec/extensions/s_spec.rb +1 -1
  347. data/spec/extensions/schema_caching_spec.rb +1 -1
  348. data/spec/extensions/schema_dumper_spec.rb +1 -1
  349. data/spec/extensions/select_remove_spec.rb +1 -1
  350. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  351. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  352. data/spec/extensions/serialization_spec.rb +2 -14
  353. data/spec/extensions/server_block_spec.rb +1 -1
  354. data/spec/extensions/server_logging_spec.rb +2 -2
  355. data/spec/extensions/sharding_spec.rb +1 -1
  356. data/spec/extensions/shared_caching_spec.rb +1 -28
  357. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  358. data/spec/extensions/singular_table_names_spec.rb +1 -1
  359. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  360. data/spec/extensions/spec_helper.rb +5 -27
  361. data/spec/extensions/split_array_nil_spec.rb +1 -1
  362. data/spec/extensions/split_values_spec.rb +1 -1
  363. data/spec/extensions/sql_comments_spec.rb +1 -1
  364. data/spec/extensions/sql_expr_spec.rb +1 -1
  365. data/spec/extensions/static_cache_spec.rb +1 -1
  366. data/spec/extensions/string_agg_spec.rb +2 -2
  367. data/spec/extensions/string_date_time_spec.rb +1 -1
  368. data/spec/extensions/string_stripper_spec.rb +1 -1
  369. data/spec/extensions/subclasses_spec.rb +1 -1
  370. data/spec/extensions/subset_conditions_spec.rb +1 -1
  371. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  372. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  373. data/spec/extensions/table_select_spec.rb +4 -4
  374. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  375. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  376. data/spec/extensions/timestamps_spec.rb +3 -3
  377. data/spec/extensions/to_dot_spec.rb +1 -1
  378. data/spec/extensions/touch_spec.rb +1 -1
  379. data/spec/extensions/tree_spec.rb +1 -1
  380. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  381. data/spec/extensions/unlimited_update_spec.rb +1 -1
  382. data/spec/extensions/update_or_create_spec.rb +1 -1
  383. data/spec/extensions/update_primary_key_spec.rb +4 -3
  384. data/spec/extensions/update_refresh_spec.rb +1 -1
  385. data/spec/extensions/uuid_spec.rb +10 -12
  386. data/spec/extensions/validate_associated_spec.rb +1 -1
  387. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  388. data/spec/extensions/validation_contexts_spec.rb +1 -1
  389. data/spec/extensions/validation_helpers_spec.rb +10 -44
  390. data/spec/extensions/whitelist_security_spec.rb +5 -5
  391. data/spec/extensions/xml_serializer_spec.rb +3 -3
  392. data/spec/guards_helper.rb +2 -1
  393. data/spec/integration/associations_test.rb +1 -23
  394. data/spec/integration/database_test.rb +7 -7
  395. data/spec/integration/dataset_test.rb +5 -47
  396. data/spec/integration/eager_loader_test.rb +1 -1
  397. data/spec/integration/migrator_test.rb +1 -1
  398. data/spec/integration/model_test.rb +4 -82
  399. data/spec/integration/plugin_test.rb +6 -22
  400. data/spec/integration/prepared_statement_test.rb +8 -88
  401. data/spec/integration/schema_test.rb +6 -6
  402. data/spec/integration/spec_helper.rb +13 -21
  403. data/spec/integration/timezone_test.rb +5 -5
  404. data/spec/integration/transaction_test.rb +3 -55
  405. data/spec/integration/type_test.rb +9 -9
  406. data/spec/model/association_reflection_spec.rb +24 -9
  407. data/spec/model/associations_spec.rb +124 -303
  408. data/spec/model/base_spec.rb +18 -137
  409. data/spec/model/class_dataset_methods_spec.rb +2 -20
  410. data/spec/model/dataset_methods_spec.rb +1 -20
  411. data/spec/model/eager_loading_spec.rb +17 -11
  412. data/spec/model/hooks_spec.rb +5 -300
  413. data/spec/model/inflector_spec.rb +1 -1
  414. data/spec/model/model_spec.rb +15 -320
  415. data/spec/model/plugins_spec.rb +2 -16
  416. data/spec/model/record_spec.rb +29 -121
  417. data/spec/model/spec_helper.rb +5 -15
  418. data/spec/model/validations_spec.rb +1 -1
  419. data/spec/sequel_warning.rb +1 -12
  420. metadata +8 -64
  421. data/doc/active_record.rdoc +0 -927
  422. data/lib/sequel/adapters/cubrid.rb +0 -160
  423. data/lib/sequel/adapters/do.rb +0 -166
  424. data/lib/sequel/adapters/do/mysql.rb +0 -69
  425. data/lib/sequel/adapters/do/postgres.rb +0 -46
  426. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  427. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  428. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  429. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  430. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  431. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  432. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  433. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  434. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  435. data/lib/sequel/adapters/shared/informix.rb +0 -63
  436. data/lib/sequel/adapters/shared/progress.rb +0 -40
  437. data/lib/sequel/adapters/swift.rb +0 -169
  438. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  439. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  440. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  441. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  442. data/lib/sequel/dataset/mutation.rb +0 -98
  443. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  444. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  445. data/lib/sequel/extensions/filter_having.rb +0 -65
  446. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  447. data/lib/sequel/extensions/meta_def.rb +0 -37
  448. data/lib/sequel/extensions/query_literals.rb +0 -86
  449. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  450. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  451. data/lib/sequel/extensions/set_overrides.rb +0 -82
  452. data/lib/sequel/no_core_ext.rb +0 -4
  453. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  454. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  455. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  456. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  457. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  458. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  459. data/lib/sequel/plugins/schema.rb +0 -84
  460. data/lib/sequel/plugins/scissors.rb +0 -37
  461. data/spec/core/dataset_mutation_spec.rb +0 -253
  462. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  463. data/spec/extensions/before_after_save_spec.rb +0 -40
  464. data/spec/extensions/filter_having_spec.rb +0 -42
  465. data/spec/extensions/from_block_spec.rb +0 -21
  466. data/spec/extensions/hash_aliases_spec.rb +0 -26
  467. data/spec/extensions/identifier_columns_spec.rb +0 -19
  468. data/spec/extensions/meta_def_spec.rb +0 -35
  469. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  470. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  471. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  472. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  473. data/spec/extensions/query_literals_spec.rb +0 -185
  474. data/spec/extensions/schema_spec.rb +0 -123
  475. data/spec/extensions/scissors_spec.rb +0 -27
  476. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  477. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -19,7 +19,7 @@ module Sequel
19
19
  #
20
20
  # Then when you went to save an album that uses this plugin:
21
21
  #
22
- # Album.create(:name=>'abc')
22
+ # Album.create(name: 'abc')
23
23
  # # raises Sequel::ValidationFailed: name is shorter than 5 characters
24
24
  #
25
25
  # Usage:
@@ -39,7 +39,7 @@ module Sequel
39
39
 
40
40
  # Automatically load the validation_helpers plugin to run the actual validations.
41
41
  def self.apply(model, opts=OPTS)
42
- model.instance_eval do
42
+ model.instance_exec do
43
43
  plugin :validation_helpers
44
44
  @constraint_validations_table = DEFAULT_CONSTRAINT_VALIDATIONS_TABLE
45
45
  @constraint_validation_options = {}
@@ -56,7 +56,7 @@ module Sequel
56
56
  # :presence) and values should be hashes of options specific
57
57
  # to that validation type.
58
58
  def self.configure(model, opts=OPTS)
59
- model.instance_eval do
59
+ model.instance_exec do
60
60
  if table = opts[:constraint_validations_table]
61
61
  @constraint_validations_table = table
62
62
  end
@@ -240,6 +240,7 @@ module Sequel
240
240
  def validate
241
241
  super
242
242
  model.constraint_validations.each do |v|
243
+ # Allow calling private validation methods
243
244
  send(*v)
244
245
  end
245
246
  end
@@ -1,42 +1,35 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- if RUBY_VERSION < "1.9"
4
- # :nocov:
5
- require 'fastercsv'
6
- # :nocov:
7
- else
8
- require 'csv'
9
- end
3
+ require 'csv'
10
4
 
11
5
  module Sequel
12
6
  module Plugins
13
7
  # csv_serializer handles serializing entire Sequel::Model objects to CSV,
14
8
  # as well as support for deserializing CSV directly into Sequel::Model
15
- # objects. It requires either the csv standard library when usnig ruby 1.9+,
16
- # or the fastercsv gem when using ruby 1.8.
9
+ # objects. It requires the csv standard library.
17
10
  #
18
11
  # Basic Example:
19
12
  #
20
13
  # album = Album[1]
21
- # album.to_csv(:write_headers=>true)
14
+ # album.to_csv(write_headers: true)
22
15
  # # => "id,name,artist_id\n1,RF,2\n"
23
16
  #
24
17
  # You can provide options to control the CSV output:
25
18
  #
26
- # album.to_csv(:only=>:name)
27
- # album.to_csv(:except=>[:id, :artist_id])
19
+ # album.to_csv(only: :name)
20
+ # album.to_csv(except: [:id, :artist_id])
28
21
  # # => "RF\n"
29
22
  #
30
23
  # +to_csv+ also exists as a class and dataset method, both of which return
31
24
  # all objects in the dataset:
32
25
  #
33
26
  # Album.to_csv
34
- # Album.where(:artist_id=>1).to_csv
27
+ # Album.where(artist_id: 1).to_csv
35
28
  #
36
- # If you have an existing array of model instance you want to convert to
29
+ # If you have an existing array of model instances you want to convert to
37
30
  # CSV, you can call the class to_csv method with the :array option:
38
31
  #
39
- # Album.to_csv(:array=>[Album[1], Album[2]])
32
+ # Album.to_csv(array: [Album[1], Album[2]])
40
33
  #
41
34
  # In addition to creating CSV, this plugin also enables Sequel::Model
42
35
  # classes to create instances directly from CSV using the from_csv class
@@ -48,7 +41,7 @@ module Sequel
48
41
  # The array_from_csv class method exists to parse arrays of model instances
49
42
  # from CSV:
50
43
  #
51
- # csv = Album.where(:artist_id=>1).to_csv
44
+ # csv = Album.where(artist_id: 1).to_csv
52
45
  # albums = Album.array_from_csv(csv)
53
46
  #
54
47
  # These do not necessarily round trip, since doing so would let users
@@ -56,7 +49,7 @@ module Sequel
56
49
  # call set with the values in the hash. If you want to specify the allowed
57
50
  # fields, you can use the :headers option.
58
51
  #
59
- # Album.from_csv(album.to_csv, :headers=>%w'id name')
52
+ # Album.from_csv(album.to_csv, headers: %w'id name')
60
53
  #
61
54
  # If you want to update an existing instance, you can use the from_csv
62
55
  # instance method:
@@ -77,7 +70,7 @@ module Sequel
77
70
  # Set up the column readers to do deserialization and the column writers
78
71
  # to save the value in deserialized_values
79
72
  def self.configure(model, opts = OPTS)
80
- model.instance_eval do
73
+ model.instance_exec do
81
74
  @csv_serializer_opts = (@csv_serializer_opts || OPTS).merge(opts)
82
75
  end
83
76
  end
@@ -155,7 +148,7 @@ module Sequel
155
148
  opts = model.process_csv_serializer_opts(opts)
156
149
 
157
150
  CSV.generate(opts) do |csv|
158
- csv << opts[:headers].map{|k| send(k)}
151
+ csv << opts[:headers].map{|k| public_send(k)}
159
152
  end
160
153
  end
161
154
  end
@@ -174,7 +167,7 @@ module Sequel
174
167
 
175
168
  CSV.generate(opts) do |csv|
176
169
  items.each do |object|
177
- csv << opts[:headers].map{|header| object.send(header) }
170
+ csv << opts[:headers].map{|header| object.public_send(header) }
178
171
  end
179
172
  end
180
173
  end
@@ -12,7 +12,7 @@ module Sequel
12
12
  # plugin :dataset_associations
13
13
  # one_to_many :albums
14
14
  # end
15
- # Artist.where(id=>1..100).albums
15
+ # Artist.where(id: 1..100).albums
16
16
  # # SELECT * FROM albums
17
17
  # # WHERE (albums.artist_id IN (
18
18
  # # SELECT id FROM artists
@@ -27,7 +27,7 @@ module Sequel
27
27
  # As the dataset methods return datasets, you can easily chain the
28
28
  # methods to get associated datasets of associated datasets:
29
29
  #
30
- # Artist.where(id=>1..100).albums.where{name < 'M'}.tags
30
+ # Artist.where(id: 1..100).albums.where{name < 'M'}.tags
31
31
  # # SELECT tags.* FROM tags
32
32
  # # WHERE (tags.id IN (
33
33
  # # SELECT albums_tags.tag_id FROM albums
@@ -6,7 +6,7 @@ module Sequel
6
6
  # for defining dataset methods:
7
7
  #
8
8
  # Album.def_dataset_method(:by_name) do |name|
9
- # where(:name=>name)
9
+ # where(name: name)
10
10
  # end
11
11
  #
12
12
  # Additionally, this adds support for Model.subset, which can also
@@ -41,8 +41,8 @@ module Sequel
41
41
  #
42
42
  # # Add new dataset method and class method that calls it
43
43
  # Artist.def_dataset_method(:by_name){order(:name)}
44
- # Artist.where(:name.like('A%')).by_name
45
- # Artist.by_name.where(:name.like('A%'))
44
+ # Artist.where(Sequel[:name].like('A%')).by_name
45
+ # Artist.by_name.where(Sequel[:name].like('A%'))
46
46
  #
47
47
  # # Just add a class method that calls an existing dataset method
48
48
  # Artist.def_dataset_method(:paginate)
@@ -63,7 +63,7 @@ module Sequel
63
63
  # they can be chained.
64
64
  # For example:
65
65
  #
66
- # Topic.subset(:joes, :username.like('%joe%'))
66
+ # Topic.subset(:joes, Sequel[:username].like('%joe%'))
67
67
  # Topic.subset(:popular){num_posts > 100}
68
68
  # Topic.subset(:recent){created_on > Date.today - 7}
69
69
  #
@@ -75,7 +75,7 @@ module Sequel
75
75
  # have more than 100 posts and were created less than
76
76
  # 7 days ago.
77
77
  #
78
- # Both the args given and the block are passed to <tt>Dataset#filter</tt>.
78
+ # Both the args given and the block are passed to <tt>Dataset#where</tt>.
79
79
  #
80
80
  # This method creates dataset methods that do not accept arguments. To create
81
81
  # dataset methods that accept arguments, you should use define a
@@ -10,7 +10,7 @@ module Sequel
10
10
  # album = Album.new
11
11
  # album.a # => nil
12
12
  # album.b # => 2
13
- # album = Album.new(:a=>1, :b=>3)
13
+ # album = Album.new(a: 1, b: 3)
14
14
  # album.a # => 1
15
15
  # album.b # => 3
16
16
  #
@@ -40,7 +40,7 @@ module Sequel
40
40
  if opts.dataset_need_primary_key? && new?
41
41
  o = make_add_associated_object(opts, o)
42
42
  delay_validate_associated_object(opts, o)
43
- send(opts[:name]) << o
43
+ public_send(opts[:name]) << o
44
44
  after_create_hook{super(opts, o, *args)}
45
45
  o
46
46
  else
@@ -7,7 +7,7 @@ module Sequel
7
7
  # that represents a model class method that returns a dataset:
8
8
  #
9
9
  # def Artist.by_name(name)
10
- # where(:name=>name)
10
+ # where(name: name)
11
11
  # end
12
12
  #
13
13
  # Artist.finder :by_name
@@ -18,7 +18,7 @@ module Sequel
18
18
  #
19
19
  # The alternative way to use this to pass your own block:
20
20
  #
21
- # Artist.finder(:name=>:first_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}
21
+ # Artist.finder(name: :first_by_name){|pl, ds| ds.where(name: pl.arg).limit(1)}
22
22
  #
23
23
  # Additionally, there is a Model.prepared_finder method. This works similarly
24
24
  # to Model.finder, but uses a prepared statement. This limits the types of
@@ -50,7 +50,7 @@ module Sequel
50
50
  # that represents a model class method that returns a dataset:
51
51
  #
52
52
  # def Artist.by_name(name)
53
- # where(:name=>name)
53
+ # where(name: name)
54
54
  # end
55
55
  #
56
56
  # Artist.finder :by_name
@@ -61,7 +61,7 @@ module Sequel
61
61
  #
62
62
  # The alternative way to use this to pass your own block:
63
63
  #
64
- # Artist.finder(:name=>:first_by_name){|pl, ds| ds.where(:name=>pl.arg).limit(1)}
64
+ # Artist.finder(name: :first_by_name){|pl, ds| ds.where(name: pl.arg).limit(1)}
65
65
  #
66
66
  # Note that if you pass your own block, you are responsible for manually setting
67
67
  # limits if necessary (as shown above).
@@ -86,7 +86,7 @@ module Sequel
86
86
  # This doesn't handle all possible cases. For example, if you have a method such as:
87
87
  #
88
88
  # def Artist.by_name(name)
89
- # name ? where(:name=>name) : exclude(:name=>nil)
89
+ # name ? where(name: name) : exclude(name: nil)
90
90
  # end
91
91
  #
92
92
  # Then calling a finder without an argument will not work as you expect.
@@ -128,7 +128,7 @@ module Sequel
128
128
  ds = if block
129
129
  model.instance_exec(*args, &block)
130
130
  else
131
- model.send(meth, *args)
131
+ model.public_send(meth, *args)
132
132
  end
133
133
  ds = ds.limit(1) if limit1
134
134
  model_name = model.name
@@ -144,7 +144,7 @@ module Sequel
144
144
  n = argn.call(model)
145
145
  block ||= lambda do |pl, model2|
146
146
  args = (0...n).map{pl.arg}
147
- ds = model2.send(meth, *args)
147
+ ds = model2.public_send(meth, *args)
148
148
  ds = ds.limit(1) if limit1
149
149
  ds
150
150
  end
@@ -154,7 +154,7 @@ module Sequel
154
154
  end
155
155
 
156
156
  @finder_loaders[meth_name] = loader_proc
157
- mod = opts[:mod] || (class << self; self; end)
157
+ mod = opts[:mod] || singleton_class
158
158
  if prepare
159
159
  def_prepare_method(mod, meth_name)
160
160
  else
@@ -190,14 +190,14 @@ module Sequel
190
190
  finder(meth, opts, &block)
191
191
  end
192
192
 
193
- Plugins.inherited_instance_variables(self, :@finders=>:dup, :@autoreloading_associations=>:hash_dup, :@default_association_options=>:dup, :@cache_associations=>nil, :@default_eager_limit_strategy=>nil)
193
+ Plugins.inherited_instance_variables(self, :@finders=>:dup, :@finder_loaders=>:dup)
194
194
 
195
195
  private
196
196
 
197
197
  # Define a finder method in the given module with the given method name that
198
198
  # load rows using the finder with the given name.
199
199
  def def_finder_method(mod, meth, type)
200
- mod.send(:define_method, meth){|*args, &block| finder_for(meth).send(type, *args, &block)}
200
+ mod.send(:define_method, meth){|*args, &block| finder_for(meth).public_send(type, *args, &block)}
201
201
  end
202
202
 
203
203
  # Define a prepared_finder method in the given module that will call the associated prepared
@@ -234,6 +234,12 @@ module Sequel
234
234
  s
235
235
  end
236
236
  end
237
+
238
+ # Clear any finders when reseting the instance dataset
239
+ def reset_instance_dataset
240
+ Sequel.synchronize{@finders.clear} if @finders && !@finders.frozen?
241
+ super
242
+ end
237
243
  end
238
244
  end
239
245
  end
@@ -1,9 +1,8 @@
1
1
  # frozen-string-literal: true
2
2
 
3
- if RUBY_VERSION >= '1.9.0'
4
3
  module Sequel
5
4
  module Plugins
6
- # The ForceEncoding plugin allows you force specific encodings for all
5
+ # The force_encoding plugin allows you force specific encodings for all
7
6
  # strings that are used by the model. When model instances are loaded
8
7
  # from the database, all values in the hash that are strings are
9
8
  # forced to the given encoding. Whenever you update a model column
@@ -77,8 +76,3 @@ module Sequel
77
76
  end
78
77
  end
79
78
  end
80
- else
81
- # :nocov:
82
- raise LoadError, 'ForceEncoding plugin only works on Ruby 1.9+'
83
- # :nocov:
84
- end
@@ -31,14 +31,6 @@ module Sequel
31
31
  # # Allow the use of hook class methods in the Album class
32
32
  # Album.plugin :hook_class_methods
33
33
  module HookClassMethods
34
- # SEQUEL5: Remove
35
- DEPRECATION_REPLACEMENTS = {
36
- :after_commit=>"Use after_save{db.after_commit{}} instead",
37
- :after_destroy_commit=>"Use after_destroy{db.after_commit{}} instead",
38
- :after_destroy_rollback=>"Use before_destroy{db.after_rollback{}} instead",
39
- :after_rollback=>"Use before_save{db.after_rollback{}} instead"
40
- }.freeze
41
-
42
34
  # Set up the hooks instance variable in the model.
43
35
  def self.apply(model)
44
36
  hooks = model.instance_variable_set(:@hooks, {})
@@ -49,52 +41,11 @@ module Sequel
49
41
  Model::HOOKS.each do |h|
50
42
  class_eval(<<-END, __FILE__, __LINE__ + 1)
51
43
  def #{h}(method = nil, &block)
52
- #{"Sequel::Deprecation.deprecate('Sequel::Model.#{h} in the hook_class_methods plugin', #{DEPRECATION_REPLACEMENTS[h].inspect})" if DEPRECATION_REPLACEMENTS[h]}
53
44
  add_hook(:#{h}, method, &block)
54
45
  end
55
46
  END
56
47
  end
57
48
 
58
- # This adds a new hook type. It will define both a class
59
- # method that you can use to add hooks, as well as an instance method
60
- # that you can use to call all hooks of that type. The class method
61
- # can be called with a symbol or a block or both. If a block is given and
62
- # and symbol is not, it adds the hook block to the hook type. If a block
63
- # and symbol are both given, it replaces the hook block associated with
64
- # that symbol for a given hook type, or adds it if there is no hook block
65
- # with that symbol for that hook type. If no block is given, it assumes
66
- # the symbol specifies an instance method to call and adds it to the hook
67
- # type.
68
- #
69
- # If any before hook block returns false, the instance method will return false
70
- # immediately without running the rest of the hooks of that type.
71
- #
72
- # It is recommended that you always provide a symbol to this method,
73
- # for descriptive purposes. It's only necessary to do so when you
74
- # are using a system that reloads code.
75
- #
76
- # Example of usage:
77
- #
78
- # class MyModel
79
- # add_hook_type :before_move_to
80
- # before_move_to(:check_move_allowed, &:allow_move?)
81
- # def move_to(there)
82
- # return if before_move_to == false
83
- # # move MyModel object to there
84
- # end
85
- # end
86
- #
87
- # Do not call this method with untrusted input, as that can result in
88
- # arbitrary code execution.
89
- def add_hook_type(*hooks)
90
- Sequel::Deprecation.deprecate("Sequel::Model.add_hook_type", "You should add your own hook types manually")
91
- hooks.each do |hook|
92
- @hooks[hook] = []
93
- instance_eval("def #{hook}(method = nil, &block); add_hook(:#{hook}, method, &block) end", __FILE__, __LINE__)
94
- class_eval("def #{hook}; model.hook_blocks(:#{hook}){|b| return false if instance_eval(&b) == false} end", __FILE__, __LINE__)
95
- end
96
- end
97
-
98
49
  # Freeze hooks when freezing model class.
99
50
  def freeze
100
51
  @hooks.freeze.each_value(&:freeze)
@@ -121,7 +72,8 @@ module Sequel
121
72
  def add_hook(hook, tag, &block)
122
73
  unless block
123
74
  (raise Error, 'No hook method specified') unless tag
124
- block = proc {send tag}
75
+ # Allow calling private hook methods
76
+ block = proc {send(tag)}
125
77
  end
126
78
  h = @hooks[hook]
127
79
  if tag && (old = h.find{|x| x[0] == tag})
@@ -137,63 +89,9 @@ module Sequel
137
89
  end
138
90
 
139
91
  module InstanceMethods
140
- # SEQUEL5: Make :before_save, :before_destroy, :after_save, :after_destroy hooks use metaprogramming instead of specific definitions
141
- [:before_create, :before_update, :before_validation].each do |h|
142
- class_eval(<<-END, __FILE__, __LINE__+1)
143
- def #{h}
144
- model.hook_blocks(:#{h}) do |b|
145
- if instance_eval(&b) == false
146
- Sequel::Deprecation.deprecate("Having #{h} hook block return false to stop evaluation of further #{h} hook blocks", "Instead, call cancel_action inside #{h} hook block")
147
- return false
148
- end
149
- end
150
- super
151
- end
152
- END
153
- end
154
- [:after_create, :after_update, :after_validation].each{|h| class_eval("def #{h}; super; model.hook_blocks(:#{h}){|b| instance_eval(&b)}; end", __FILE__, __LINE__)}
155
-
156
- def after_destroy
157
- super
158
- model.hook_blocks(:after_destroy){|b| instance_eval(&b)}
159
- if model.has_hooks?(:after_destroy_commit)
160
- db.after_commit{model.hook_blocks(:after_destroy_commit){|b| instance_eval(&b)}}
161
- end
162
- end
163
-
164
- def after_save
165
- super
166
- model.hook_blocks(:after_save){|b| instance_eval(&b)}
167
- if model.has_hooks?(:after_commit)
168
- db.after_commit{model.hook_blocks(:after_commit){|b| instance_eval(&b)}}
169
- end
170
- end
92
+ [:before_create, :before_update, :before_validation, :before_save, :before_destroy].each{|h| class_eval("def #{h}; model.hook_blocks(:#{h}){|b| instance_exec(&b)}; super end", __FILE__, __LINE__)}
171
93
 
172
- def before_destroy
173
- model.hook_blocks(:before_destroy) do |b|
174
- if instance_eval(&b) == false
175
- Sequel::Deprecation.deprecate("Having before_destory hook block return false to stop evaluation of further before_destroy hook blocks", "Instead, call cancel_action inside before_destroy hook block")
176
- return false
177
- end
178
- end
179
- super
180
- if model.has_hooks?(:after_destroy_rollback)
181
- db.after_rollback{model.hook_blocks(:after_destroy_rollback){|b| instance_eval(&b)}}
182
- end
183
- end
184
-
185
- def before_save
186
- model.hook_blocks(:before_save) do |b|
187
- if instance_eval(&b) == false
188
- Sequel::Deprecation.deprecate("Having before_save hook block return false to stop evaluation of further before_save hook blocks", "Instead, call cancel_action inside before_save hook block")
189
- return false
190
- end
191
- end
192
- super
193
- if model.has_hooks?(:after_rollback)
194
- db.after_rollback{model.hook_blocks(:after_rollback){|b| instance_eval(&b)}}
195
- end
196
- end
94
+ [:after_create, :after_update, :after_validation, :after_save, :after_destroy].each{|h| class_eval("def #{h}; super; model.hook_blocks(:#{h}){|b| instance_exec(&b)}; end", __FILE__, __LINE__)}
197
95
  end
198
96
  end
199
97
  end