sequel 4.49.0 → 5.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (484) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +130 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +6 -9
  6. data/doc/advanced_associations.rdoc +91 -168
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/release_notes/5.1.0.txt +31 -0
  29. data/doc/release_notes/5.2.0.txt +33 -0
  30. data/doc/release_notes/5.3.0.txt +121 -0
  31. data/doc/schema_modification.rdoc +78 -64
  32. data/doc/security.rdoc +97 -88
  33. data/doc/sharding.rdoc +43 -30
  34. data/doc/sql.rdoc +53 -65
  35. data/doc/testing.rdoc +4 -5
  36. data/doc/thread_safety.rdoc +2 -4
  37. data/doc/transactions.rdoc +18 -17
  38. data/doc/validations.rdoc +48 -45
  39. data/doc/virtual_rows.rdoc +87 -115
  40. data/lib/sequel/adapters/ado/access.rb +7 -13
  41. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  42. data/lib/sequel/adapters/ado.rb +9 -25
  43. data/lib/sequel/adapters/amalgalite.rb +3 -18
  44. data/lib/sequel/adapters/ibmdb.rb +9 -45
  45. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  46. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  47. data/lib/sequel/adapters/jdbc/h2.rb +6 -26
  48. data/lib/sequel/adapters/jdbc/hsqldb.rb +2 -27
  49. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  50. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  51. data/lib/sequel/adapters/jdbc/mysql.rb +11 -15
  52. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  53. data/lib/sequel/adapters/jdbc/postgresql.rb +23 -33
  54. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  55. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  56. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  57. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  58. data/lib/sequel/adapters/jdbc.rb +18 -74
  59. data/lib/sequel/adapters/mock.rb +4 -30
  60. data/lib/sequel/adapters/mysql.rb +7 -44
  61. data/lib/sequel/adapters/mysql2.rb +5 -23
  62. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  63. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  64. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  65. data/lib/sequel/adapters/odbc.rb +0 -19
  66. data/lib/sequel/adapters/oracle.rb +8 -13
  67. data/lib/sequel/adapters/postgres.rb +28 -150
  68. data/lib/sequel/adapters/postgresql.rb +1 -1
  69. data/lib/sequel/adapters/shared/access.rb +11 -51
  70. data/lib/sequel/adapters/shared/db2.rb +3 -61
  71. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  72. data/lib/sequel/adapters/shared/mysql.rb +61 -227
  73. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  74. data/lib/sequel/adapters/shared/postgres.rb +58 -264
  75. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  76. data/lib/sequel/adapters/shared/sqlite.rb +22 -101
  77. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  78. data/lib/sequel/adapters/sqlite.rb +2 -19
  79. data/lib/sequel/adapters/tinytds.rb +5 -15
  80. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  81. data/lib/sequel/adapters/utils/mysql_mysql2.rb +4 -4
  82. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  83. data/lib/sequel/adapters/utils/replace.rb +0 -5
  84. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  85. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  86. data/lib/sequel/ast_transformer.rb +3 -94
  87. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  88. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  89. data/lib/sequel/connection_pool/single.rb +0 -2
  90. data/lib/sequel/connection_pool/threaded.rb +94 -110
  91. data/lib/sequel/connection_pool.rb +38 -28
  92. data/lib/sequel/core.rb +42 -101
  93. data/lib/sequel/database/connecting.rb +23 -60
  94. data/lib/sequel/database/dataset.rb +6 -9
  95. data/lib/sequel/database/dataset_defaults.rb +4 -48
  96. data/lib/sequel/database/features.rb +5 -4
  97. data/lib/sequel/database/logging.rb +2 -9
  98. data/lib/sequel/database/misc.rb +36 -55
  99. data/lib/sequel/database/query.rb +8 -13
  100. data/lib/sequel/database/schema_generator.rb +93 -64
  101. data/lib/sequel/database/schema_methods.rb +61 -79
  102. data/lib/sequel/database/transactions.rb +4 -24
  103. data/lib/sequel/database.rb +12 -2
  104. data/lib/sequel/dataset/actions.rb +57 -107
  105. data/lib/sequel/dataset/dataset_module.rb +4 -16
  106. data/lib/sequel/dataset/features.rb +35 -30
  107. data/lib/sequel/dataset/graph.rb +40 -49
  108. data/lib/sequel/dataset/misc.rb +12 -37
  109. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  110. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  111. data/lib/sequel/dataset/query.rb +91 -161
  112. data/lib/sequel/dataset/sql.rb +33 -225
  113. data/lib/sequel/dataset.rb +18 -10
  114. data/lib/sequel/deprecated.rb +18 -27
  115. data/lib/sequel/exceptions.rb +1 -17
  116. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  117. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  118. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  119. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  120. data/lib/sequel/extensions/connection_validator.rb +1 -1
  121. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  122. data/lib/sequel/extensions/core_extensions.rb +39 -49
  123. data/lib/sequel/extensions/core_refinements.rb +39 -45
  124. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  125. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  126. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  127. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  128. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  129. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  130. data/lib/sequel/extensions/from_block.rb +1 -35
  131. data/lib/sequel/extensions/graph_each.rb +2 -2
  132. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  133. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  134. data/lib/sequel/extensions/inflector.rb +4 -4
  135. data/lib/sequel/extensions/migration.rb +27 -43
  136. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  137. data/lib/sequel/extensions/null_dataset.rb +2 -8
  138. data/lib/sequel/extensions/pagination.rb +1 -17
  139. data/lib/sequel/extensions/pg_array.rb +20 -189
  140. data/lib/sequel/extensions/pg_extended_date_support.rb +230 -0
  141. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  142. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  143. data/lib/sequel/extensions/pg_inet.rb +3 -16
  144. data/lib/sequel/extensions/pg_interval.rb +1 -20
  145. data/lib/sequel/extensions/pg_json.rb +7 -27
  146. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  147. data/lib/sequel/extensions/pg_range.rb +6 -121
  148. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  149. data/lib/sequel/extensions/pg_row.rb +5 -77
  150. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  151. data/lib/sequel/extensions/query.rb +3 -4
  152. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  153. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  154. data/lib/sequel/extensions/select_remove.rb +3 -3
  155. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  156. data/lib/sequel/extensions/sql_comments.rb +2 -2
  157. data/lib/sequel/extensions/string_agg.rb +11 -8
  158. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  159. data/lib/sequel/extensions/synchronize_sql.rb +45 -0
  160. data/lib/sequel/model/associations.rb +129 -131
  161. data/lib/sequel/model/base.rb +133 -731
  162. data/lib/sequel/model/default_inflections.rb +1 -1
  163. data/lib/sequel/model/errors.rb +0 -3
  164. data/lib/sequel/model/exceptions.rb +2 -6
  165. data/lib/sequel/model/inflections.rb +1 -26
  166. data/lib/sequel/model/plugins.rb +1 -0
  167. data/lib/sequel/model.rb +27 -62
  168. data/lib/sequel/plugins/active_model.rb +2 -5
  169. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  170. data/lib/sequel/plugins/association_pks.rb +14 -28
  171. data/lib/sequel/plugins/association_proxies.rb +6 -7
  172. data/lib/sequel/plugins/auto_validations.rb +4 -4
  173. data/lib/sequel/plugins/before_after_save.rb +0 -43
  174. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  175. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  176. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  177. data/lib/sequel/plugins/caching.rb +5 -5
  178. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  179. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  180. data/lib/sequel/plugins/column_select.rb +2 -2
  181. data/lib/sequel/plugins/composition.rb +15 -24
  182. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  183. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  184. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  185. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  186. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  187. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  188. data/lib/sequel/plugins/finder.rb +16 -10
  189. data/lib/sequel/plugins/force_encoding.rb +1 -7
  190. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  191. data/lib/sequel/plugins/input_transformer.rb +10 -11
  192. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  193. data/lib/sequel/plugins/instance_filters.rb +5 -5
  194. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  195. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  196. data/lib/sequel/plugins/json_serializer.rb +19 -19
  197. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  198. data/lib/sequel/plugins/list.rb +6 -6
  199. data/lib/sequel/plugins/many_through_many.rb +11 -8
  200. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  201. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  202. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  203. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  204. data/lib/sequel/plugins/pg_row.rb +2 -11
  205. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  206. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  207. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  208. data/lib/sequel/plugins/serialization.rb +15 -33
  209. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  210. data/lib/sequel/plugins/sharding.rb +2 -8
  211. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  212. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  213. data/lib/sequel/plugins/static_cache.rb +8 -9
  214. data/lib/sequel/plugins/string_stripper.rb +3 -3
  215. data/lib/sequel/plugins/subclasses.rb +1 -1
  216. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  217. data/lib/sequel/plugins/table_select.rb +2 -2
  218. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  219. data/lib/sequel/plugins/timestamps.rb +6 -7
  220. data/lib/sequel/plugins/touch.rb +4 -8
  221. data/lib/sequel/plugins/tree.rb +3 -3
  222. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  223. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  224. data/lib/sequel/plugins/update_or_create.rb +3 -3
  225. data/lib/sequel/plugins/update_refresh.rb +3 -3
  226. data/lib/sequel/plugins/uuid.rb +7 -11
  227. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  228. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  229. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  230. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  231. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  232. data/lib/sequel/sql.rb +145 -276
  233. data/lib/sequel/timezones.rb +8 -23
  234. data/lib/sequel/version.rb +2 -2
  235. data/lib/sequel.rb +1 -1
  236. data/spec/adapter_spec.rb +1 -1
  237. data/spec/adapters/db2_spec.rb +2 -103
  238. data/spec/adapters/mssql_spec.rb +89 -68
  239. data/spec/adapters/mysql_spec.rb +111 -478
  240. data/spec/adapters/oracle_spec.rb +1 -9
  241. data/spec/adapters/postgres_spec.rb +459 -664
  242. data/spec/adapters/spec_helper.rb +12 -31
  243. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  244. data/spec/adapters/sqlite_spec.rb +8 -146
  245. data/spec/bin_spec.rb +11 -16
  246. data/spec/core/connection_pool_spec.rb +173 -74
  247. data/spec/core/database_spec.rb +96 -244
  248. data/spec/core/dataset_spec.rb +99 -414
  249. data/spec/core/deprecated_spec.rb +3 -3
  250. data/spec/core/expression_filters_spec.rb +37 -144
  251. data/spec/core/mock_adapter_spec.rb +241 -4
  252. data/spec/core/object_graph_spec.rb +11 -60
  253. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  254. data/spec/core/schema_generator_spec.rb +51 -40
  255. data/spec/core/schema_spec.rb +88 -77
  256. data/spec/core/spec_helper.rb +6 -24
  257. data/spec/core/version_spec.rb +1 -1
  258. data/spec/core_extensions_spec.rb +7 -83
  259. data/spec/core_model_spec.rb +2 -2
  260. data/spec/deprecation_helper.rb +2 -14
  261. data/spec/extensions/accessed_columns_spec.rb +1 -1
  262. data/spec/extensions/active_model_spec.rb +3 -3
  263. data/spec/extensions/after_initialize_spec.rb +1 -1
  264. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  265. data/spec/extensions/association_dependencies_spec.rb +1 -1
  266. data/spec/extensions/association_pks_spec.rb +30 -92
  267. data/spec/extensions/association_proxies_spec.rb +1 -1
  268. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  269. data/spec/extensions/auto_validations_spec.rb +1 -1
  270. data/spec/extensions/blacklist_security_spec.rb +1 -1
  271. data/spec/extensions/blank_spec.rb +1 -1
  272. data/spec/extensions/boolean_readers_spec.rb +1 -1
  273. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  274. data/spec/extensions/caching_spec.rb +1 -1
  275. data/spec/extensions/class_table_inheritance_spec.rb +53 -1118
  276. data/spec/extensions/column_conflicts_spec.rb +1 -1
  277. data/spec/extensions/column_select_spec.rb +4 -4
  278. data/spec/extensions/columns_introspection_spec.rb +1 -1
  279. data/spec/extensions/columns_updated_spec.rb +1 -1
  280. data/spec/extensions/composition_spec.rb +8 -30
  281. data/spec/extensions/connection_expiration_spec.rb +3 -3
  282. data/spec/extensions/connection_validator_spec.rb +3 -3
  283. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  284. data/spec/extensions/constraint_validations_spec.rb +1 -1
  285. data/spec/extensions/core_refinements_spec.rb +1 -3
  286. data/spec/extensions/csv_serializer_spec.rb +4 -9
  287. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  288. data/spec/extensions/dataset_associations_spec.rb +2 -1
  289. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  290. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  291. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  292. data/spec/extensions/defaults_setter_spec.rb +2 -2
  293. data/spec/extensions/delay_add_association_spec.rb +8 -9
  294. data/spec/extensions/dirty_spec.rb +1 -1
  295. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  296. data/spec/extensions/eager_each_spec.rb +2 -2
  297. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  298. data/spec/extensions/error_splitter_spec.rb +1 -1
  299. data/spec/extensions/error_sql_spec.rb +1 -1
  300. data/spec/extensions/eval_inspect_spec.rb +1 -1
  301. data/spec/extensions/finder_spec.rb +1 -1
  302. data/spec/extensions/force_encoding_spec.rb +2 -5
  303. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  304. data/spec/extensions/graph_each_spec.rb +5 -5
  305. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  306. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  307. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  308. data/spec/extensions/inflector_spec.rb +1 -1
  309. data/spec/extensions/input_transformer_spec.rb +7 -2
  310. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  311. data/spec/extensions/instance_filters_spec.rb +1 -1
  312. data/spec/extensions/instance_hooks_spec.rb +1 -95
  313. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  314. data/spec/extensions/json_serializer_spec.rb +1 -1
  315. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  316. data/spec/extensions/list_spec.rb +5 -6
  317. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  318. data/spec/extensions/many_through_many_spec.rb +25 -33
  319. data/spec/extensions/migration_spec.rb +12 -2
  320. data/spec/extensions/modification_detection_spec.rb +1 -1
  321. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  322. data/spec/extensions/named_timezones_spec.rb +3 -3
  323. data/spec/extensions/nested_attributes_spec.rb +1 -29
  324. data/spec/extensions/null_dataset_spec.rb +1 -11
  325. data/spec/extensions/optimistic_locking_spec.rb +2 -2
  326. data/spec/extensions/pagination_spec.rb +1 -1
  327. data/spec/extensions/pg_array_associations_spec.rb +22 -26
  328. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_array_spec.rb +3 -48
  330. data/spec/extensions/pg_enum_spec.rb +1 -1
  331. data/spec/extensions/pg_extended_date_support_spec.rb +122 -0
  332. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  333. data/spec/extensions/pg_hstore_spec.rb +22 -31
  334. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_inet_spec.rb +1 -14
  336. data/spec/extensions/pg_interval_spec.rb +3 -13
  337. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  338. data/spec/extensions/pg_json_spec.rb +1 -13
  339. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  340. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  341. data/spec/extensions/pg_range_spec.rb +3 -88
  342. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  343. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  344. data/spec/extensions/pg_row_spec.rb +1 -44
  345. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  346. data/spec/extensions/prepared_statements_safe_spec.rb +7 -7
  347. data/spec/extensions/prepared_statements_spec.rb +13 -48
  348. data/spec/extensions/pretty_table_spec.rb +40 -9
  349. data/spec/extensions/query_spec.rb +1 -12
  350. data/spec/extensions/rcte_tree_spec.rb +23 -34
  351. data/spec/extensions/round_timestamps_spec.rb +1 -5
  352. data/spec/extensions/s_spec.rb +1 -1
  353. data/spec/extensions/schema_caching_spec.rb +1 -1
  354. data/spec/extensions/schema_dumper_spec.rb +43 -32
  355. data/spec/extensions/select_remove_spec.rb +1 -1
  356. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  357. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  358. data/spec/extensions/serialization_spec.rb +5 -17
  359. data/spec/extensions/server_block_spec.rb +1 -1
  360. data/spec/extensions/server_logging_spec.rb +2 -2
  361. data/spec/extensions/sharding_spec.rb +1 -1
  362. data/spec/extensions/shared_caching_spec.rb +1 -28
  363. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  364. data/spec/extensions/singular_table_names_spec.rb +1 -1
  365. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  366. data/spec/extensions/spec_helper.rb +5 -27
  367. data/spec/extensions/split_array_nil_spec.rb +1 -1
  368. data/spec/extensions/split_values_spec.rb +1 -1
  369. data/spec/extensions/sql_comments_spec.rb +1 -1
  370. data/spec/extensions/sql_expr_spec.rb +1 -1
  371. data/spec/extensions/static_cache_spec.rb +1 -1
  372. data/spec/extensions/string_agg_spec.rb +2 -2
  373. data/spec/extensions/string_date_time_spec.rb +1 -1
  374. data/spec/extensions/string_stripper_spec.rb +1 -1
  375. data/spec/extensions/subclasses_spec.rb +1 -1
  376. data/spec/extensions/subset_conditions_spec.rb +1 -1
  377. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  378. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  379. data/spec/extensions/synchronize_sql_spec.rb +124 -0
  380. data/spec/extensions/table_select_spec.rb +4 -4
  381. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  382. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  383. data/spec/extensions/timestamps_spec.rb +5 -7
  384. data/spec/extensions/to_dot_spec.rb +1 -1
  385. data/spec/extensions/touch_spec.rb +1 -1
  386. data/spec/extensions/tree_spec.rb +1 -1
  387. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  388. data/spec/extensions/unlimited_update_spec.rb +1 -1
  389. data/spec/extensions/update_or_create_spec.rb +12 -16
  390. data/spec/extensions/update_primary_key_spec.rb +4 -3
  391. data/spec/extensions/update_refresh_spec.rb +1 -1
  392. data/spec/extensions/uuid_spec.rb +10 -13
  393. data/spec/extensions/validate_associated_spec.rb +1 -1
  394. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  395. data/spec/extensions/validation_contexts_spec.rb +1 -1
  396. data/spec/extensions/validation_helpers_spec.rb +10 -44
  397. data/spec/extensions/whitelist_security_spec.rb +5 -5
  398. data/spec/extensions/xml_serializer_spec.rb +8 -13
  399. data/spec/guards_helper.rb +2 -1
  400. data/spec/integration/associations_test.rb +1 -23
  401. data/spec/integration/database_test.rb +7 -7
  402. data/spec/integration/dataset_test.rb +12 -47
  403. data/spec/integration/eager_loader_test.rb +1 -1
  404. data/spec/integration/migrator_test.rb +1 -1
  405. data/spec/integration/model_test.rb +4 -82
  406. data/spec/integration/plugin_test.rb +7 -23
  407. data/spec/integration/prepared_statement_test.rb +8 -88
  408. data/spec/integration/schema_test.rb +10 -10
  409. data/spec/integration/spec_helper.rb +17 -21
  410. data/spec/integration/timezone_test.rb +5 -5
  411. data/spec/integration/transaction_test.rb +3 -55
  412. data/spec/integration/type_test.rb +9 -9
  413. data/spec/model/association_reflection_spec.rb +24 -9
  414. data/spec/model/associations_spec.rb +124 -303
  415. data/spec/model/base_spec.rb +43 -137
  416. data/spec/model/class_dataset_methods_spec.rb +2 -20
  417. data/spec/model/dataset_methods_spec.rb +1 -20
  418. data/spec/model/eager_loading_spec.rb +48 -17
  419. data/spec/model/hooks_spec.rb +5 -300
  420. data/spec/model/inflector_spec.rb +1 -1
  421. data/spec/model/model_spec.rb +29 -339
  422. data/spec/model/plugins_spec.rb +2 -16
  423. data/spec/model/record_spec.rb +33 -129
  424. data/spec/model/spec_helper.rb +5 -15
  425. data/spec/model/validations_spec.rb +1 -1
  426. data/spec/sequel_warning.rb +1 -12
  427. metadata +19 -65
  428. data/doc/active_record.rdoc +0 -927
  429. data/lib/sequel/adapters/cubrid.rb +0 -160
  430. data/lib/sequel/adapters/do/mysql.rb +0 -69
  431. data/lib/sequel/adapters/do/postgres.rb +0 -46
  432. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  433. data/lib/sequel/adapters/do.rb +0 -166
  434. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  435. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  436. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  437. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  438. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  439. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  440. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  441. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  442. data/lib/sequel/adapters/shared/informix.rb +0 -63
  443. data/lib/sequel/adapters/shared/progress.rb +0 -40
  444. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  445. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  446. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  447. data/lib/sequel/adapters/swift.rb +0 -169
  448. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  449. data/lib/sequel/dataset/mutation.rb +0 -98
  450. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  451. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  452. data/lib/sequel/extensions/filter_having.rb +0 -65
  453. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  454. data/lib/sequel/extensions/meta_def.rb +0 -37
  455. data/lib/sequel/extensions/query_literals.rb +0 -86
  456. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  457. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  458. data/lib/sequel/extensions/set_overrides.rb +0 -82
  459. data/lib/sequel/no_core_ext.rb +0 -4
  460. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  461. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  462. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  463. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  464. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  465. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  466. data/lib/sequel/plugins/schema.rb +0 -84
  467. data/lib/sequel/plugins/scissors.rb +0 -37
  468. data/spec/core/dataset_mutation_spec.rb +0 -253
  469. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  470. data/spec/extensions/before_after_save_spec.rb +0 -40
  471. data/spec/extensions/filter_having_spec.rb +0 -42
  472. data/spec/extensions/from_block_spec.rb +0 -21
  473. data/spec/extensions/hash_aliases_spec.rb +0 -26
  474. data/spec/extensions/identifier_columns_spec.rb +0 -19
  475. data/spec/extensions/meta_def_spec.rb +0 -35
  476. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  477. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  478. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  479. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  480. data/spec/extensions/query_literals_spec.rb +0 -185
  481. data/spec/extensions/schema_spec.rb +0 -123
  482. data/spec/extensions/scissors_spec.rb +0 -27
  483. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  484. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -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
@@ -7,14 +7,14 @@ module Sequel
7
7
  #
8
8
  # Album.plugin :input_transformer
9
9
  # Album.add_input_transformer(:reverser){|v| v.is_a?(String) ? v.reverse : v}
10
- # album = Album.new(:name=>'foo')
10
+ # album = Album.new(name: 'foo')
11
11
  # album.name # => 'oof'
12
12
  #
13
13
  # You can specifically set some columns to skip some input
14
14
  # input transformers:
15
15
  #
16
16
  # Album.skip_input_transformer(:reverser, :foo)
17
- # Album.new(:foo=>'bar').foo # => 'bar'
17
+ # Album.new(foo: 'bar').foo # => 'bar'
18
18
  #
19
19
  # Usage:
20
20
  #
@@ -25,9 +25,8 @@ module Sequel
25
25
  # Album.plugin :input_transformer
26
26
  module InputTransformer
27
27
  def self.apply(model, *)
28
- model.instance_eval do
28
+ model.instance_exec do
29
29
  @input_transformers = {}
30
- @input_transformer_order = []
31
30
  @skip_input_transformer_columns = {}
32
31
  end
33
32
  end
@@ -42,23 +41,23 @@ module Sequel
42
41
  # Hash of input transformer name symbols to transformer callables.
43
42
  attr_reader :input_transformers
44
43
 
45
- # The order in which to call the input transformers.
46
- attr_reader :input_transformer_order
44
+ # The order in which to call the input transformers. For backwards compatibility only.
45
+ def input_transformer_order
46
+ input_transformers.keys.reverse
47
+ end
47
48
 
48
- Plugins.inherited_instance_variables(self, :@skip_input_transformer_columns=>:hash_dup, :@input_transformers=>:dup, :@input_transformer_order=>:dup)
49
+ Plugins.inherited_instance_variables(self, :@skip_input_transformer_columns=>:hash_dup, :@input_transformers=>:dup)
49
50
 
50
51
  # Add an input transformer to this model.
51
52
  def add_input_transformer(transformer_name, &block)
52
53
  raise(Error, 'must provide both transformer name and block when adding input transformer') unless transformer_name && block
53
54
  @input_transformers[transformer_name] = block
54
- @input_transformer_order.unshift(transformer_name)
55
55
  @skip_input_transformer_columns[transformer_name] = []
56
56
  end
57
57
 
58
58
  # Freeze input transformers when freezing model class
59
59
  def freeze
60
60
  @input_transformers.freeze
61
- @input_transformer_order.freeze
62
61
  @skip_input_transformer_columns.freeze.each_value(&:freeze)
63
62
 
64
63
  super
@@ -79,8 +78,8 @@ module Sequel
79
78
  # Transform the input using all of the transformers, except those explicitly
80
79
  # skipped, before setting the value in the model object.
81
80
  def []=(k, v)
82
- model.input_transformer_order.each do |transformer_name|
83
- v = model.input_transformers[transformer_name].call(v) unless model.skip_input_transformer?(transformer_name, k)
81
+ model.input_transformers.reverse_each do |name, transformer|
82
+ v = transformer.call(v) unless model.skip_input_transformer?(name, k)
84
83
  end
85
84
  super
86
85
  end
@@ -21,7 +21,7 @@ module Sequel
21
21
  # Modify the current model's dataset selection, if the model
22
22
  # has a dataset.
23
23
  def self.configure(model)
24
- model.instance_eval do
24
+ model.instance_exec do
25
25
  self.dataset = dataset if @dataset && @dataset.opts[:select]
26
26
  end
27
27
  end
@@ -30,14 +30,6 @@ module Sequel
30
30
  # The dataset to use to insert new rows. For internal use only.
31
31
  attr_reader :instance_insert_dataset
32
32
 
33
- # Freeze instance insert dataset when freezing model class.
34
- def freeze
35
- super
36
-
37
- @instance_insert_dataset.freeze if @instance_insert_dataset
38
- self
39
- end
40
-
41
33
  private
42
34
 
43
35
  # When reseting the instance dataset, also reset the instance_insert_dataset.
@@ -17,12 +17,12 @@ module Sequel
17
17
  #
18
18
  # # These are two separate objects that represent the same
19
19
  # # database row.
20
- # i1 = Item.first(:id=>1, :delete_allowed=>false)
21
- # i2 = Item.first(:id=>1, :delete_allowed=>false)
20
+ # i1 = Item.first(id: 1, delete_allowed: false)
21
+ # i2 = Item.first(id: 1, delete_allowed: false)
22
22
  #
23
23
  # # Add an instance filter to the object. This filter is in effect
24
24
  # # until the object is successfully updated or deleted.
25
- # i1.instance_filter(:delete_allowed=>true)
25
+ # i1.instance_filter(delete_allowed: true)
26
26
  #
27
27
  # # Attempting to delete the object where the filter doesn't
28
28
  # # match any rows raises an error.
@@ -30,7 +30,7 @@ module Sequel
30
30
  #
31
31
  # # The other object that represents the same row has no
32
32
  # # instance filters, and can be updated normally.
33
- # i2.update(:delete_allowed=>true)
33
+ # i2.update(delete_allowed: true)
34
34
  #
35
35
  # # Even though the filter is now still in effect, since the
36
36
  # # database row has been updated to allow deleting,
@@ -123,7 +123,7 @@ module Sequel
123
123
  # Only use prepared statements for update and delete queries
124
124
  # if there are no instance filters.
125
125
  def use_prepared_statements_for?(type)
126
- if (type == :update || type == :delete) && !instance_filters.empty?
126
+ if type == :update && !instance_filters.empty?
127
127
  false
128
128
  else
129
129
  super if defined?(super)