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
@@ -3,13 +3,11 @@
3
3
  module Sequel
4
4
  module Plugins
5
5
  # The prepared_statements plugin modifies the model to use prepared statements for
6
- # instance level saves (inserts and updates). It also will use prepared statements for
7
- # deletes, refreshes, and class level lookups by primary key, if it thinks that using
8
- # a prepared statement will be faster in such cases.
6
+ # instance level inserts and updates.
9
7
  #
10
8
  # Note that this plugin is unsafe in some circumstances, as it can allow up to
11
9
  # 2^N prepared statements to be created for each type of insert and update query, where
12
- # N is the number of colums in the table. It is recommended that you use the
10
+ # N is the number of columns in the table. It is recommended that you use the
13
11
  # +prepared_statements_safe+ plugin in addition to this plugin to reduce the number
14
12
  # of prepared statements that can be created, unless you tightly control how your
15
13
  # model instances are saved.
@@ -32,12 +30,11 @@ module Sequel
32
30
 
33
31
  # Setup the datastructure used to hold the prepared statements in the model.
34
32
  def self.apply(model)
35
- # SEQUEL5: Drop Support for :fixed/:lookup_sql SQL
36
- model.instance_variable_set(:@prepared_statements, {:insert=>{}, :insert_select=>{}, :update=>{}, :lookup_sql=>{}, :fixed=>{}}.freeze)
33
+ model.instance_variable_set(:@prepared_statements, {:insert=>{}, :insert_select=>{}, :update=>{}}.freeze)
37
34
  end
38
35
 
39
36
  module ClassMethods
40
- Plugins.inherited_instance_variables(self, :@prepared_statements=>lambda{|v| {:insert=>{}, :insert_select=>{}, :update=>{}, :lookup_sql=>{}, :fixed=>{}}.freeze})
37
+ Plugins.inherited_instance_variables(self, :@prepared_statements=>lambda{|v| {:insert=>{}, :insert_select=>{}, :update=>{}}.freeze})
41
38
 
42
39
  private
43
40
 
@@ -48,7 +45,7 @@ module Sequel
48
45
  meth = type == :insert_select ? :returning : :select
49
46
  s = ds.opts[meth]
50
47
  if f && f.length == 1 && !ds.opts[:join] && (!s || s.empty?)
51
- ds = ds.send(meth, *columns.map{|c| Sequel.identifier(c)})
48
+ ds = ds.public_send(meth, *columns.map{|c| Sequel.identifier(c)})
52
49
  end
53
50
 
54
51
  prepare_statement(ds, type, vals)
@@ -62,13 +59,7 @@ module Sequel
62
59
 
63
60
  # Return a sorted array of columns for use as a hash key.
64
61
  def prepared_columns(cols)
65
- RUBY_VERSION >= '1.9' ? cols.sort : cols.sort_by(&:to_s)
66
- end
67
-
68
- # Return a prepared statement that can be used to delete a row from this model's dataset.
69
- def prepared_delete
70
- # SEQUEL5: Remove
71
- cached_prepared_statement(:fixed, :delete){prepare_statement(filter(prepared_statement_key_array(primary_key)), :delete)}
62
+ cols.sort
72
63
  end
73
64
 
74
65
  # Return a prepared statement that can be used to insert a row using the given columns.
@@ -84,18 +75,6 @@ module Sequel
84
75
  end
85
76
  end
86
77
 
87
- # Return a prepared statement that can be used to lookup a row solely based on the primary key.
88
- def prepared_lookup
89
- # SEQUEL5: Remove
90
- cached_prepared_statement(:fixed, :lookup){prepare_explicit_statement(filter(prepared_statement_key_array(primary_key)), :first)}
91
- end
92
-
93
- # Return a prepared statement that can be used to refresh a row to get new column values after insertion.
94
- def prepared_refresh
95
- # SEQUEL5: Remove
96
- cached_prepared_statement(:fixed, :refresh){prepare_explicit_statement(naked.clone(:server=>dataset.opts.fetch(:server, :default)).where(prepared_statement_key_array(primary_key)), :first)}
97
- end
98
-
99
78
  # Return an array of two element arrays with the column symbol as the first entry and the
100
79
  # placeholder symbol as the second entry.
101
80
  def prepared_statement_key_array(keys)
@@ -120,14 +99,7 @@ module Sequel
120
99
 
121
100
  # Return a prepared statement that can be used to update row using the given columns.
122
101
  def prepared_update(cols)
123
- cached_prepared_statement(:update, prepared_columns(cols)){prepare_statement(filter(prepared_statement_key_array(primary_key)), :update, prepared_statement_key_hash(cols))}
124
- end
125
-
126
- # Use a prepared statement to query the database for the row matching the given primary key.
127
- def primary_key_lookup(pk)
128
- return super unless use_prepared_statements_for_pk_lookup?
129
- # SEQUEL5: Remove
130
- prepared_lookup.call(primary_key_hash(pk))
102
+ cached_prepared_statement(:update, prepared_columns(cols)){prepare_statement(where(prepared_statement_key_array(primary_key)), :update, prepared_statement_key_hash(cols))}
131
103
  end
132
104
 
133
105
  # If a prepared statement has already been cached for the given type and subtype,
@@ -153,16 +125,6 @@ module Sequel
153
125
  module InstanceMethods
154
126
  private
155
127
 
156
- # Use a prepared statement to delete the row.
157
- def _delete_without_checking
158
- # SEQUEL5: Remove
159
- if use_prepared_statements_for?(:delete)
160
- _set_prepared_statement_server(model.send(:prepared_delete)).call(pk_hash)
161
- else
162
- super
163
- end
164
- end
165
-
166
128
  # Use a prepared statement to insert the values into the model's dataset.
167
129
  def _insert_raw(ds)
168
130
  if use_prepared_statements_for?(:insert)
@@ -184,16 +146,6 @@ module Sequel
184
146
  end
185
147
  end
186
148
 
187
- # Use a prepared statement to refresh this model's column values.
188
- def _refresh_get(ds)
189
- # SEQUEL5: Remove
190
- if use_prepared_statements_for?(:refresh)
191
- _set_prepared_statement_server(model.send(:prepared_refresh)).call(pk_hash)
192
- else
193
- super
194
- end
195
- end
196
-
197
149
  # Use a prepared statement to update this model's columns in the database.
198
150
  def _update_without_checking(columns)
199
151
  if use_prepared_statements_for?(:update)
@@ -213,7 +165,7 @@ module Sequel
213
165
  end
214
166
 
215
167
  # Whether prepared statements should be used for the given type of query
216
- # (:insert, :insert_select, :refresh, :update, or :delete). True by default,
168
+ # (:insert, :insert_select, :update). True by default,
217
169
  # can be overridden in other plugins to disallow prepared statements for
218
170
  # specific types of queries.
219
171
  def use_prepared_statements_for?(type)
@@ -225,16 +177,11 @@ module Sequel
225
177
  case type
226
178
  when :insert, :insert_select, :update
227
179
  true
228
- # SEQUEL5: Remove :delete/:refresh
229
- when :delete
230
- return true unless model.fast_instance_delete_sql
231
-
232
- # Using deletes for prepared statements appears faster on Oracle and DB2,
233
- # but not for most other database types if optimized SQL is used.
234
- db_type = model.db.database_type
235
- db_type == :oracle || db_type == :db2
236
- when :refresh
237
- !model.fast_pk_lookup_sql
180
+ # :nocov:
181
+ when :delete, :refresh
182
+ Sequel::Deprecation.deprecate("The :delete and :refresh prepared statement types", "There should be no need to check if these types are supported")
183
+ false
184
+ # :nocov:
238
185
  else
239
186
  raise Error, "unsupported type used: #{type.inspect}"
240
187
  end
@@ -28,7 +28,7 @@ module Sequel
28
28
  end
29
29
 
30
30
  module ClassMethods
31
- # A hash with column symbol keys and default values. Instance's
31
+ # A hash with column symbol keys and default values. Instance
32
32
  # values are merged into this hash before creating to reduce the
33
33
  # number of free columns (columns that may or may not be present
34
34
  # in the INSERT statement), as the number of prepared statements
@@ -36,12 +36,12 @@ module Sequel
36
36
  #
37
37
  # # Eager loading - also populates the :parent and children associations
38
38
  # # for all ancestors and descendants
39
- # Model.where(:id=>[1, 2]).eager(:ancestors, :descendants).all
39
+ # Model.where(id: [1, 2]).eager(:ancestors, :descendants).all
40
40
  #
41
- # # Eager loading children and grand children
42
- # Model.where(:id=>[1, 2]).eager(:descendants=>2).all
43
- # # Eager loading children, grand children, and great grand children
44
- # Model.where(:id=>[1, 2]).eager(:descendants=>3).all
41
+ # # Eager loading children and grandchildren
42
+ # Model.where(id: [1, 2]).eager(descendants: 2).all
43
+ # # Eager loading children, grandchildren, and great grandchildren
44
+ # Model.where(id: [1, 2]).eager(descendants: 3).all
45
45
  #
46
46
  # = Options
47
47
  #
@@ -56,8 +56,8 @@ module Sequel
56
56
  # Note that you can change the name of the above associations by specifying
57
57
  # a :name key in the appropriate hash of options above. For example:
58
58
  #
59
- # Model.plugin :rcte_tree, :parent=>{:name=>:mother},
60
- # :children=>{:name=>:daughters}, :descendants=>{:name=>:offspring}
59
+ # Model.plugin :rcte_tree, parent: {name: :mother},
60
+ # children: {name: :daughters}, descendants: {name: :offspring}
61
61
  #
62
62
  # Any other keys in the main options hash are treated as options shared by
63
63
  # all of the associations. Here's a few options that affect the plugin:
@@ -2,15 +2,15 @@
2
2
 
3
3
  module Sequel
4
4
  module Plugins
5
- # Sequel's built in Serialization plugin allows you to keep serialized
5
+ # The serialization plugin allows you to keep serialized
6
6
  # ruby objects in the database, while giving you deserialized objects
7
7
  # when you call an accessor.
8
8
  #
9
9
  # This plugin works by keeping the serialized value in the values, and
10
10
  # adding a deserialized_values hash. The reader method for serialized columns
11
11
  # will check the deserialized_values for the value, return it if present,
12
- # or deserialized the entry in values and return it. The writer method will
13
- # set the deserialized_values entry. This plugin adds a before_save hook
12
+ # or deserialize the entry in values and return it. The writer method will
13
+ # set the deserialized_values entry. This plugin adds a before_validation hook
14
14
  # that serializes all deserialized_values to values.
15
15
  #
16
16
  # You can specify the serialization format as a pair of serializer/deserializer
@@ -37,9 +37,7 @@ module Sequel
37
37
  #
38
38
  # # Register custom serializer/deserializer pair, if desired
39
39
  # require 'sequel/plugins/serialization'
40
- # Sequel::Plugins::Serialization.register_format(:reverse,
41
- # lambda(&:reverse),
42
- # lambda(&:reverse))
40
+ # Sequel::Plugins::Serialization.register_format(:reverse, :reverse.to_proc, :reverse.to_proc)
43
41
  #
44
42
  # class User < Sequel::Model
45
43
  # # Built-in format support when loading the plugin
@@ -53,10 +51,10 @@ module Sequel
53
51
  # serialize_attributes :reverse, :password
54
52
  #
55
53
  # # Use a custom serializer/deserializer pair without registering
56
- # serialize_attributes [lambda(&:reverse), lambda(&:reverse)], :password
54
+ # serialize_attributes [:reverse.to_proc, :reverse.to_proc], :password
57
55
  # end
58
56
  # user = User.create
59
- # user.permissions = { :global => 'read-only' }
57
+ # user.permissions = {global: 'read-only'}
60
58
  # user.save
61
59
  #
62
60
  # Note that if you mutate serialized column values without reassigning them,
@@ -77,7 +75,7 @@ module Sequel
77
75
  # Set up the column readers to do deserialization and the column writers
78
76
  # to save the value in deserialized_values.
79
77
  def self.apply(model, *args)
80
- model.instance_eval do
78
+ model.instance_exec do
81
79
  @deserialization_map = {}
82
80
  @serialization_map = {}
83
81
  end
@@ -93,7 +91,7 @@ module Sequel
93
91
  # models to pick this format by name. Both serializer and deserializer
94
92
  # should be callable objects.
95
93
  def self.register_format(format, serializer, deserializer)
96
- REGISTERED_FORMATS[format] = [serializer, deserializer]
94
+ Sequel.synchronize{REGISTERED_FORMATS[format] = [serializer, deserializer].freeze}
97
95
  end
98
96
  register_format(:marshal, lambda{|v| [Marshal.dump(v)].pack('m')},
99
97
  lambda do |v|
@@ -101,8 +99,8 @@ module Sequel
101
99
  v = v.unpack('m')[0] unless v[0..1] == "\x04\x08"
102
100
  Marshal.load(v)
103
101
  end)
104
- register_format(:yaml, lambda(&:to_yaml), lambda{|v| YAML.load(v)})
105
- register_format(:json, lambda{|v| Sequel.object_to_json(v)}, lambda{|v| Sequel.parse_json(v)})
102
+ register_format(:yaml, :to_yaml.to_proc, lambda{|s| YAML.load(s)})
103
+ register_format(:json, Sequel.method(:object_to_json), Sequel.method(:parse_json))
106
104
 
107
105
  module ClassMethods
108
106
  # A hash with column name symbols and callable values, with the value
@@ -113,15 +111,6 @@ module Sequel
113
111
  # called to serialize the column.
114
112
  attr_reader :serialization_map
115
113
 
116
- def serialization_module
117
- Sequel::Deprecation.deprecate('Sequel::Model.serialization_module', 'There is no replacement')
118
- @serialization_module
119
- end
120
- def serialization_module=(v)
121
- Sequel::Deprecation.deprecate('Sequel::Model.serialization_module=', 'There is no replacement')
122
- @serialization_module = v
123
- end
124
-
125
114
  Plugins.inherited_instance_variables(self, :@deserialization_map=>:dup, :@serialization_map=>:dup)
126
115
 
127
116
  # Freeze serialization metadata when freezing model class.
@@ -137,8 +126,8 @@ module Sequel
137
126
  # and instance level writer that stores new deserialized values.
138
127
  def serialize_attributes(format, *columns)
139
128
  if format.is_a?(Symbol)
140
- unless format = REGISTERED_FORMATS[format]
141
- raise(Error, "Unsupported serialization format: #{format} (valid formats: #{REGISTERED_FORMATS.keys.map(&:inspect).join})")
129
+ unless format = Sequel.synchronize{REGISTERED_FORMATS[format]}
130
+ raise(Error, "Unsupported serialization format: #{format} (valid formats: #{Sequel.synchronize{REGISTERED_FORMATS.keys}.map(&:inspect).join})")
142
131
  end
143
132
  end
144
133
  serializer, deserializer = format
@@ -146,13 +135,6 @@ module Sequel
146
135
  define_serialized_attribute_accessor(serializer, deserializer, *columns)
147
136
  end
148
137
 
149
- # The columns that will be serialized. This is only for
150
- # backwards compatibility, use serialization_map in new code.
151
- def serialized_columns
152
- Sequel::Deprecation.deprecate("#{self}.serialized_columns in the serialization plugin", "Use #{self}.serialization_map.keys instead")
153
- serialization_map.keys
154
- end
155
-
156
138
  private
157
139
 
158
140
  # Add serializated attribute acessor methods to the serialization_module
@@ -198,14 +180,14 @@ module Sequel
198
180
  super
199
181
  end
200
182
 
201
- private
202
-
203
183
  # Serialize deserialized values before saving
204
- def _before_validation
184
+ def before_validation
205
185
  serialize_deserialized_values
206
186
  super
207
187
  end
208
188
 
189
+ private
190
+
209
191
  # Clear any cached deserialized values when doing a manual refresh.
210
192
  def _refresh_set_values(hash)
211
193
  @deserialized_values.clear if @deserialized_values
@@ -22,7 +22,7 @@ module Sequel
22
22
  # plugin :serialization, :json, :permissions
23
23
  # plugin :serialization_modification_detection
24
24
  # end
25
- # user = User.create(:permissions => {})
25
+ # user = User.create(permissions: {})
26
26
  # user.permissions[:global] = 'read-only'
27
27
  # user.save_changes
28
28
  module SerializationModificationDetection
@@ -5,10 +5,9 @@ module Sequel
5
5
  # The sharding plugin augments Sequel's default model sharding support
6
6
  # in the following ways:
7
7
  #
8
- # * It automatically sets model instances to be saved back to the
8
+ # * It automatically saves model instances back to the
9
9
  # shard they were retreived from.
10
- # * It makes model associations use the same shard as the model
11
- # object.
10
+ # * It makes model associations use the same shard as the model object.
12
11
  # * It adds a slightly nicer API for creating model instances on
13
12
  # specific shards.
14
13
  #
@@ -83,11 +82,6 @@ module Sequel
83
82
  nil
84
83
  end
85
84
 
86
- # Mark that associated objects should use the same server.
87
- def _associated_objects_use_same_server?
88
- true
89
- end
90
-
91
85
  # Ensure that the join table for many_to_many associations uses the correct shard.
92
86
  def _join_table_dataset(opts)
93
87
  use_server(super)
@@ -39,11 +39,11 @@ module Sequel
39
39
  # # Using integers to store the class type, with a :model_map hash
40
40
  # # and an sti_key of :type
41
41
  # Employee.plugin :single_table_inheritance, :type,
42
- # :model_map=>{1=>:Staff, 2=>:Manager}
42
+ # model_map: {1=>:Staff, 2=>:Manager}
43
43
  #
44
44
  # # Using non-class name strings
45
45
  # Employee.plugin :single_table_inheritance, :type,
46
- # :model_map=>{'line staff'=>:Staff, 'supervisor'=>:Manager}
46
+ # model_map: {'line staff'=>:Staff, 'supervisor'=>:Manager}
47
47
  #
48
48
  # # By default the plugin sets the respective column value
49
49
  # # when a new instance is created.
@@ -53,22 +53,22 @@ module Sequel
53
53
  # # You can customize this behavior with the :key_chooser option.
54
54
  # # This is most useful when using a non-bijective mapping.
55
55
  # Employee.plugin :single_table_inheritance, :type,
56
- # :model_map=>{'line staff'=>:Staff, 'supervisor'=>:Manager},
57
- # :key_chooser=>proc{|instance| instance.model.sti_key_map[instance.model.to_s].first || 'stranger' }
56
+ # model_map: {'line staff'=>:Staff, 'supervisor'=>:Manager},
57
+ # key_chooser: lambda{|instance| instance.model.sti_key_map[instance.model.to_s].first || 'stranger'}
58
58
  #
59
59
  # # Using custom procs, with :model_map taking column values
60
60
  # # and yielding either a class, string, symbol, or nil,
61
61
  # # and :key_map taking a class object and returning the column
62
62
  # # value to use
63
63
  # Employee.plugin :single_table_inheritance, :type,
64
- # :model_map=>proc(&:reverse),
65
- # :key_map=>proc{|klass| klass.name.reverse}
64
+ # model_map: :reverse.to_proc,
65
+ # key_map: lambda{|klass| klass.name.reverse}
66
66
  #
67
67
  # # You can use the same class for multiple values.
68
68
  # # This is mainly useful when the sti_key column contains multiple values
69
69
  # # which are different but do not require different code.
70
70
  # Employee.plugin :single_table_inheritance, :type,
71
- # :model_map=>{'staff' => "Staff",
71
+ # model_map: {'staff' => "Staff",
72
72
  # 'manager' => "Manager",
73
73
  # 'overpayed staff' => "Staff",
74
74
  # 'underpayed staff' => "Staff"}
@@ -80,7 +80,7 @@ module Sequel
80
80
  module SingleTableInheritance
81
81
  # Setup the necessary STI variables, see the module RDoc for SingleTableInheritance
82
82
  def self.configure(model, key, opts=OPTS)
83
- model.instance_eval do
83
+ model.instance_exec do
84
84
  @sti_key_array = nil
85
85
  @sti_key = key
86
86
  @sti_dataset = dataset
@@ -156,7 +156,6 @@ module Sequel
156
156
  # because of how STI works, you should not freeze an STI subclass
157
157
  # until after all subclasses of it have been created.
158
158
  def freeze
159
- @sti_dataset.freeze
160
159
  @sti_key_array.freeze if @sti_key_array
161
160
  @sti_key_map.freeze if @sti_key_map.is_a?(Hash)
162
161
  @sti_model_map.freeze if @sti_model_map.is_a?(Hash)
@@ -172,7 +171,7 @@ module Sequel
172
171
  sti_subclass_added(key)
173
172
  rp = dataset.row_proc
174
173
  subclass.set_dataset(sti_subclass_dataset(key), :inherited=>true)
175
- subclass.instance_eval do
174
+ subclass.instance_exec do
176
175
  @dataset = @dataset.with_row_proc(rp)
177
176
  @sti_key_array = key
178
177
  self.simple_table = nil
@@ -244,10 +243,8 @@ module Sequel
244
243
  end
245
244
 
246
245
  module InstanceMethods
247
- private
248
-
249
246
  # Set the sti_key column based on the sti_key_map.
250
- def _before_validation
247
+ def before_validation
251
248
  if new? && model.sti_key && !self[model.sti_key]
252
249
  set_column_value("#{model.sti_key}=", model.sti_key_chooser.call(self))
253
250
  end
@@ -2,9 +2,9 @@
2
2
 
3
3
  module Sequel
4
4
  module Plugins
5
- # SkipCreateRefresh is a simple plugin that make Sequel not
5
+ # The skip_create_refresh plugin skips the
6
6
  # refresh after saving a new model object. Sequel does the
7
- # refresh to make sure all columns are populated, which is
7
+ # refresh by default to make sure all columns are populated, which is
8
8
  # necessary so that database defaults work correctly.
9
9
  #
10
10
  # This plugin is mostly for performance reasons where you
@@ -12,7 +12,7 @@ module Sequel
12
12
  # but it could also help cases where records are not
13
13
  # immediately available for selection after insertion.
14
14
  #
15
- # Note that Sequel does not attempt to refresh records when
15
+ # Note that Sequel by default does not attempt to refresh records when
16
16
  # updating existing model objects, only when inserting new
17
17
  # model objects.
18
18
  #
@@ -10,12 +10,12 @@ module Sequel
10
10
  # are frozen so they won't be modified unexpectedly, and before hooks disallow
11
11
  # saving or destroying instances.
12
12
  #
13
- # You can use the :frozen=>false option to have this plugin return unfrozen
13
+ # You can use the frozen: false option to have this plugin return unfrozen
14
14
  # instances. This is slower as it requires creating new objects, but it allows
15
15
  # you to make changes to the object and save them. If you set the option to false,
16
16
  # you are responsible for updating the cache manually (the pg_static_cache_updater
17
17
  # extension can handle this automatically). Note that it is not safe to use the
18
- # :frozen=>false option if you are mutating column values directly. If you are
18
+ # frozen: false option if you are mutating column values directly. If you are
19
19
  # mutating column values, you should also override Model.call to dup each mutable
20
20
  # column value to ensure it is not shared by other instances.
21
21
  #
@@ -37,9 +37,9 @@ module Sequel
37
37
  #
38
38
  # # Cache the AlbumType class statically, but return unfrozen instances
39
39
  # # that can be modified.
40
- # AlbumType.plugin :static_cache, :frozen=>false
40
+ # AlbumType.plugin :static_cache, frozen: false
41
41
  #
42
- # If you would like the speed benefits of keeping :frozen=>true but still need
42
+ # If you would like the speed benefits of keeping frozen: true but still need
43
43
  # to occasionally update objects, you can side-step the before_ hooks by
44
44
  # overriding the class method +static_cache_allow_modifications?+ to return true:
45
45
  #
@@ -54,14 +54,13 @@ module Sequel
54
54
  # Now if you +#dup+ a Model object (the resulting object is not frozen), you
55
55
  # will be able to update and save the duplicate.
56
56
  # Note the caveats around your responsibility to update the cache still applies.
57
- #
58
57
  module StaticCache
59
58
  # Populate the static caches when loading the plugin. Options:
60
59
  # :frozen :: Whether retrieved model objects are frozen. The default is true,
61
60
  # for better performance as the shared frozen objects can be used
62
61
  # directly. If set to false, new instances are created.
63
62
  def self.configure(model, opts=OPTS)
64
- model.instance_eval do
63
+ model.instance_exec do
65
64
  @static_cache_frozen = opts.fetch(:frozen, true)
66
65
  load_cache
67
66
  end
@@ -216,7 +215,7 @@ module Sequel
216
215
  @cache = h.freeze
217
216
  end
218
217
 
219
- # If :frozen=>false is not used, just return the argument. Otherwise,
218
+ # If frozen: false is not used, just return the argument. Otherwise,
220
219
  # create a new instance with the arguments values if the argument is
221
220
  # not nil.
222
221
  def static_cache_object(o)
@@ -229,13 +228,13 @@ module Sequel
229
228
  end
230
229
 
231
230
  module InstanceMethods
232
- # Disallowing destroying the object unless the :frozen=>false option was used.
231
+ # Disallowing destroying the object unless the frozen: false option was used.
233
232
  def before_destroy
234
233
  cancel_action("modifying model objects that use the static_cache plugin is not allowed") unless model.static_cache_allow_modifications?
235
234
  super
236
235
  end
237
236
 
238
- # Disallowing saving the object unless the :frozen=>false option was used.
237
+ # Disallowing saving the object unless the frozen: false option was used.
239
238
  def before_save
240
239
  cancel_action("modifying model objects that use the static_cache plugin is not allowed") unless model.static_cache_allow_modifications?
241
240
  super
@@ -5,7 +5,7 @@ module Sequel
5
5
  # StringStripper is a plugin that strips all input strings
6
6
  # when assigning to the model's values. Example:
7
7
  #
8
- # album = Album.new(:name=>' A ')
8
+ # album = Album.new(name: ' A ')
9
9
  # album.name # => 'A'
10
10
  #
11
11
  # SQL::Blob instances and all non-strings are not modified by
@@ -14,7 +14,7 @@ module Sequel
14
14
  # other columns to skip the stripping:
15
15
  #
16
16
  # Album.skip_string_stripping :foo
17
- # Album.new(:foo=>' A ').foo # => ' A '
17
+ # Album.new(foo: ' A ').foo # => ' A '
18
18
  #
19
19
  # Usage:
20
20
  #
@@ -28,7 +28,7 @@ module Sequel
28
28
  model.plugin(:input_transformer, :string_stripper){|v| (v.is_a?(String) && !v.is_a?(SQL::Blob)) ? v.strip : v}
29
29
  end
30
30
  def self.configure(model)
31
- model.instance_eval{set_skipped_string_stripping_columns if @dataset}
31
+ model.instance_exec{set_skipped_string_stripping_columns if @dataset}
32
32
  end
33
33
 
34
34
  module ClassMethods
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Sequel
4
4
  module Plugins
5
- # The Subclasses plugin keeps track of all subclasses of the
5
+ # The subclasses plugin keeps track of all subclasses of the
6
6
  # current model class. Direct subclasses are available via the
7
7
  # subclasses method, and all descendent classes are available via the
8
8
  # descendents method:
@@ -14,7 +14,7 @@ module Sequel
14
14
  #
15
15
  # # This will now create a published_conditions method
16
16
  # Album.dataset_module do
17
- # subset :published, :published => true
17
+ # subset :published, published: true
18
18
  # end
19
19
  #
20
20
  # Album.where(Album.published_conditions).sql
@@ -23,7 +23,7 @@ module Sequel
23
23
  # Album.exclude(Album.published_conditions).sql
24
24
  # # SELECT * FROM albums WHERE (published IS NOT TRUE)
25
25
  #
26
- # Album.where(Sequel.|(Album.published_conditions, :ready=>true)).sql
26
+ # Album.where(Album.published_conditions | {ready: true}).sql
27
27
  # # SELECT * FROM albums WHERE ((published IS TRUE) OR (ready IS TRUE))
28
28
  module SubsetConditions
29
29
  def self.apply(mod, &block)
@@ -20,7 +20,7 @@ module Sequel
20
20
  # Modify the current model's dataset selection, if the model
21
21
  # has a dataset.
22
22
  def self.configure(model)
23
- model.instance_eval do
23
+ model.instance_exec do
24
24
  self.dataset = dataset if @dataset
25
25
  end
26
26
  end
@@ -32,7 +32,7 @@ module Sequel
32
32
  # has no explicit selection, select table.* from that table.
33
33
  def convert_input_dataset(ds)
34
34
  ds = super
35
- if !ds.opts[:select] && (from = ds.opts[:from]) && from.length == 1 && !ds.opts[:join] # SEQUEL5: Only !ds.opts[:select]
35
+ unless ds.opts[:select]
36
36
  ds = ds.select_all(ds.first_source)
37
37
  end
38
38
  ds
@@ -4,7 +4,7 @@ module Sequel
4
4
  module Plugins
5
5
  # The tactical_eager_loading plugin allows you to eagerly load
6
6
  # an association for all objects retrieved from the same dataset
7
- # without calling eager on the dataset. If you attempt to load
7
+ # without calling +eager+ on the dataset. If you attempt to load
8
8
  # associated objects for a record and the association for that
9
9
  # object is currently not cached, it assumes you want to get
10
10
  # the associated objects for all objects retrieved with the dataset that
@@ -40,7 +40,7 @@ module Sequel
40
40
  #
41
41
  # # Eagerly reload all artists for these albums
42
42
  # # SELECT * FROM artists WHERE id IN (...)
43
- # albums.first.artists(:eager_reload=>true)
43
+ # albums.first.artists(eager_reload: true)
44
44
  #
45
45
  # You can also use the :eager option to specify dependent associations
46
46
  # to eager load:
@@ -50,7 +50,7 @@ module Sequel
50
50
  # # Eager load all artists for these albums, and all albums for those artists
51
51
  # # SELECT * FROM artists WHERE id IN (...)
52
52
  # # SELECT * FROM albums WHERE artist_id IN (...)
53
- # albums.first.artists(:eager=>:albums)
53
+ # albums.first.artists(eager: :albums)
54
54
  #
55
55
  # You can also use :eager to specify an eager callback. For example:
56
56
  #
@@ -58,7 +58,7 @@ module Sequel
58
58
  #
59
59
  # # Eagerly load all artists whose name starts with A-M for these albums
60
60
  # # SELECT * FROM artists WHERE name > 'N' AND id IN (...)
61
- # albums.first.artists(:eager=>proc{|ds| ds.where(:name > 'N')})
61
+ # albums.first.artists(eager: lambda{|ds| ds.where(Sequel[:name] > 'N')})
62
62
  #
63
63
  # Usage:
64
64
  #