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
@@ -28,31 +28,16 @@ module Sequel
28
28
  # # Add the instance hook methods just to Album instances
29
29
  # Album.plugin :instance_hooks
30
30
  module InstanceHooks
31
- BEFORE_HOOKS, AFTER_HOOKS = Sequel::Model::HOOKS.partition{|l| l.to_s.start_with?('before')}
32
- Sequel::Deprecation.deprecate_constant(self, :BEFORE_HOOKS)
33
- Sequel::Deprecation.deprecate_constant(self, :AFTER_HOOKS)
34
- HOOKS = Sequel::Model::HOOKS
35
- Sequel::Deprecation.deprecate_constant(self, :HOOKS)
36
-
37
- # SEQUEL5: Remove
38
- DEPRECATION_REPLACEMENTS = {
39
- :after_commit=>"Use obj.after_save_hook{obj.db.after_commit{}} instead",
40
- :after_destroy_commit=>"Use obj.after_destroy_hook{obj.db.after_commit{}} instead",
41
- :after_destroy_rollback=>"Use obj.before_destroy_hook{obj.db.after_rollback{}} instead",
42
- :after_rollback=>"Use obj.before_save_hook{obj.db.after_rollback{}} instead"
43
- }.freeze
44
-
45
31
  module InstanceMethods
46
32
  Sequel::Model::HOOKS.each{|h| class_eval(<<-END , __FILE__, __LINE__+1)}
47
33
  def #{h}_hook(&block)
48
- #{"Sequel::Deprecation.deprecate('Sequel::Model##{h}_hook in the instance_hooks plugin', #{DEPRECATION_REPLACEMENTS[h].inspect})" if DEPRECATION_REPLACEMENTS[h]}
49
34
  raise Sequel::Error, "can't add hooks to frozen object" if frozen?
50
35
  add_instance_hook(:#{h}, &block)
51
36
  self
52
37
  end
53
38
  END
54
39
 
55
- [:before_create, :before_update, :before_validation].each{|h| class_eval("def #{h}; (@instance_hooks && run_before_instance_hooks(:#{h}) == false) ? false : super end", __FILE__, __LINE__)}
40
+ [:before_create, :before_update, :before_validation].each{|h| class_eval("def #{h}; run_before_instance_hooks(:#{h}) if @instance_hooks; super end", __FILE__, __LINE__)}
56
41
  [:after_create, :after_update].each{|h| class_eval(<<-END, __FILE__, __LINE__ + 1)}
57
42
  def #{h}
58
43
  super
@@ -67,15 +52,9 @@ module Sequel
67
52
  def after_destroy
68
53
  super
69
54
  return unless @instance_hooks
70
- # SEQUEL5: Remove commit/rollback
71
- if ad = @instance_hooks[:after_destroy_commit]
72
- db.after_commit{ad.each(&:call)}
73
- end
74
55
  run_after_instance_hooks(:after_destroy)
75
56
  @instance_hooks.delete(:after_destroy)
76
57
  @instance_hooks.delete(:before_destroy)
77
- @instance_hooks.delete(:after_destroy_commit)
78
- @instance_hooks.delete(:after_destroy_rollback)
79
58
  end
80
59
 
81
60
  # Run after validation instance hooks.
@@ -89,39 +68,25 @@ module Sequel
89
68
  def after_save
90
69
  super
91
70
  return unless @instance_hooks
92
- # SEQUEL5: Remove commit/rollback
93
- if (ac = @instance_hooks[:after_commit])
94
- db.after_commit{ac.each(&:call)}
95
- end
96
71
  run_after_instance_hooks(:after_save)
97
72
  @instance_hooks.delete(:after_save)
98
73
  @instance_hooks.delete(:before_save)
99
74
  @instance_hooks.delete(:after_validation)
100
75
  @instance_hooks.delete(:before_validation)
101
- @instance_hooks.delete(:after_commit)
102
- @instance_hooks.delete(:after_rollback)
103
76
  end
104
77
 
105
78
  # Run before_destroy instance hooks.
106
79
  def before_destroy
107
80
  return super unless @instance_hooks
108
- # SEQUEL5: Remove commit/rollback
109
- if adr = @instance_hooks[:after_destroy_rollback]
110
- db.after_rollback{adr.each(&:call)}
111
- end
112
- # SEQUEL5: No false checking
113
- run_before_instance_hooks(:before_destroy) == false ? false : super
81
+ run_before_instance_hooks(:before_destroy)
82
+ super
114
83
  end
115
84
 
116
85
  # Run before_save instance hooks.
117
86
  def before_save
118
87
  return super unless @instance_hooks
119
- # SEQUEL5: Remove commit/rollback
120
- if ar = @instance_hooks[:after_rollback]
121
- db.after_rollback{ar.each(&:call)}
122
- end
123
- # SEQUEL5: No false checking
124
- run_before_instance_hooks(:before_save) == false ? false : super
88
+ run_before_instance_hooks(:before_save)
89
+ super
125
90
  end
126
91
 
127
92
  private
@@ -130,7 +95,7 @@ module Sequel
130
95
  # the beginning of the instance hook's array. For after hooks, add it
131
96
  # to the end.
132
97
  def add_instance_hook(hook, &block)
133
- instance_hooks(hook).send(hook.to_s.start_with?('before') ? :unshift : :push, block)
98
+ instance_hooks(hook).public_send(hook.to_s.start_with?('before') ? :unshift : :push, block)
134
99
  end
135
100
 
136
101
  # An array of instance level hook blocks for the given hook type.
@@ -143,17 +108,7 @@ module Sequel
143
108
  def run_after_instance_hooks(hook)
144
109
  instance_hooks(hook).each(&:call)
145
110
  end
146
-
147
- # Run all hook blocks of the given hook type. If a hook block returns false,
148
- # immediately return false without running the remaining blocks.
149
- def run_before_instance_hooks(hook)
150
- instance_hooks(hook).each do |b|
151
- if b.call == false
152
- Sequel::Deprecation.deprecate("Having #{hook} instance hook block return false to stop evaluation of further #{hook} instance hook blocks", "Instead, call cancel_action inside #{hook} instance hook block")
153
- return false
154
- end
155
- end
156
- end
111
+ alias run_before_instance_hooks run_after_instance_hooks
157
112
  end
158
113
  end
159
114
  end
@@ -18,7 +18,9 @@ module Sequel
18
18
  # Album.plugin :inverted_subsets
19
19
  #
20
20
  # # This will now create two methods, published and not_published
21
- # Album.subset :published, :published => true
21
+ # Album.dataset_module do
22
+ # where :published, published: true
23
+ # end
22
24
  #
23
25
  # Album.published.sql
24
26
  # # SELECT * FROM albums WHERE (published IS TRUE)
@@ -17,37 +17,37 @@ module Sequel
17
17
  #
18
18
  # In addition, you can provide options to control the JSON output:
19
19
  #
20
- # album.to_json(:only=>:name)
21
- # album.to_json(:except=>[:id, :artist_id])
20
+ # album.to_json(only: :name)
21
+ # album.to_json(except: [:id, :artist_id])
22
22
  # # => '{"json_class"="Album","name"=>"RF"}'
23
23
  #
24
- # album.to_json(:include=>:artist)
24
+ # album.to_json(include: :artist)
25
25
  # # => '{"id":1,"name":"RF","artist_id":2,
26
26
  # # "artist":{"id":2,"name":"YJM"}}'
27
27
  #
28
28
  # You can use a hash value with <tt>:include</tt> to pass options
29
29
  # to associations:
30
30
  #
31
- # album.to_json(:include=>{:artist=>{:only=>:name}})
31
+ # album.to_json(include: {artist: {only: :name}})
32
32
  # # => '{"id":1,"name":"RF","artist_id":2,
33
33
  # # "artist":{"name":"YJM"}}'
34
34
  #
35
- # You can specify a name for a given association by passing <tt>:name</tt>
36
- # to the <tt>:include</tt> hash
35
+ # You can specify a name for a given association by using an aliased
36
+ # expression as the key in the <tt>:include</tt> hash
37
37
  #
38
- # album.to_json(:include=>{Sequel.as(:artist, :singer)=>{:only=>:name}})
38
+ # album.to_json(include: {Sequel.as(:artist, :singer)=>{only: :name}})
39
39
  # # => '{"id":1,"name":"RF","artist_id":2,
40
40
  # # "singer":{"name":"YJM"}}'
41
41
  #
42
42
  # You can specify the <tt>:root</tt> option to nest the JSON under the
43
43
  # name of the model:
44
44
  #
45
- # album.to_json(:root => true)
45
+ # album.to_json(root: true)
46
46
  # # => '{"album":{"id":1,"name":"RF","artist_id":2}}'
47
47
  #
48
48
  # You can specify JSON serialization options to use later:
49
49
  #
50
- # album.json_serializer_opts(:root => true)
50
+ # album.json_serializer_opts(root: true)
51
51
  # [album].to_json
52
52
  # # => '[{"album":{"id":1,"name":"RF","artist_id":2}}]'
53
53
  #
@@ -55,12 +55,12 @@ module Sequel
55
55
  # of which return all objects in the dataset:
56
56
  #
57
57
  # Album.to_json
58
- # Album.where(:artist_id=>1).to_json(:include=>:tags)
58
+ # Album.where(artist_id: 1).to_json(include: :tags)
59
59
  #
60
60
  # If you have an existing array of model instances you want to convert to
61
61
  # JSON, you can call the class to_json method with the :array option:
62
62
  #
63
- # Album.to_json(:array=>[Album[1], Album[2]])
63
+ # Album.to_json(array: [Album[1], Album[2]])
64
64
  #
65
65
  # All to_json methods take blocks, and if a block is given, it will yield
66
66
  # the array or hash before serialization, and will serialize the value
@@ -77,7 +77,7 @@ module Sequel
77
77
  # The array_from_json class method exists to parse arrays of model instances
78
78
  # from json:
79
79
  #
80
- # json = Album.where(:artist_id=>1).to_json
80
+ # json = Album.where(artist_id: 1).to_json
81
81
  # albums = Album.array_from_json(json)
82
82
  #
83
83
  # These does not necessarily round trip, since doing so would let users
@@ -86,7 +86,7 @@ module Sequel
86
86
  # fields, you can use the :fields option, which will call set_fields with
87
87
  # the given fields:
88
88
  #
89
- # Album.from_json(album.to_json, :fields=>%w'id name')
89
+ # Album.from_json(album.to_json, fields: %w'id name')
90
90
  #
91
91
  # If you want to update an existing instance, you can use the from_json
92
92
  # instance method:
@@ -96,11 +96,11 @@ module Sequel
96
96
  # Both of these allow creation of cached associated objects, if you provide
97
97
  # the :associations option:
98
98
  #
99
- # album.from_json(json, :associations=>:artist)
99
+ # album.from_json(json, associations: :artist)
100
100
  #
101
101
  # You can even provide options when setting up the associated objects:
102
102
  #
103
- # album.from_json(json, :associations=>{:artist=>{:fields=>%w'id name', :associations=>:tags}})
103
+ # album.from_json(json, associations: {artist: {fields: %w'id name', associations: :tags}})
104
104
  #
105
105
  # Note that active_support/json makes incompatible changes to the to_json API,
106
106
  # and breaks some aspects of the json_serializer plugin. You can undo the damage
@@ -132,7 +132,7 @@ module Sequel
132
132
  # Set up the column readers to do deserialization and the column writers
133
133
  # to save the value in deserialized_values.
134
134
  def self.configure(model, opts=OPTS)
135
- model.instance_eval do
135
+ model.instance_exec do
136
136
  @json_serializer_opts = (@json_serializer_opts || OPTS).merge(opts)
137
137
  end
138
138
  end
@@ -276,7 +276,7 @@ module Sequel
276
276
  #
277
277
  # Example:
278
278
  #
279
- # obj.json_serializer_opts(:only=>:name)
279
+ # obj.json_serializer_opts(only: :name)
280
280
  # [obj].to_json # => '[{"name":"..."}]'
281
281
  def json_serializer_opts(opts=OPTS)
282
282
  @json_serializer_opts = Hash[@json_serializer_opts||OPTS].merge!(opts)
@@ -329,7 +329,7 @@ module Sequel
329
329
 
330
330
  v = v.empty? ? [] : [v]
331
331
 
332
- objs = send(k)
332
+ objs = public_send(k)
333
333
 
334
334
  is_array = if r = model.association_reflection(k)
335
335
  r.returns_array?
@@ -351,7 +351,7 @@ module Sequel
351
351
  else
352
352
  key_name = c.to_s
353
353
  end
354
- h[key_name] = send(c)
354
+ h[key_name] = public_send(c)
355
355
  end
356
356
  end
357
357
  end
@@ -13,7 +13,7 @@ module Sequel
13
13
  # get the reviews for all of those albums:
14
14
  #
15
15
  # Album.plugin :lazy_attributes, :review
16
- # Album.where{id<100}.all do |a|
16
+ # Album.where{id < 100}.all do |a|
17
17
  # a.review
18
18
  # end
19
19
  #
@@ -38,15 +38,6 @@ module Sequel
38
38
  end
39
39
 
40
40
  module ClassMethods
41
- def lazy_attributes_module
42
- Sequel::Deprecation.deprecate('Sequel::Model.lazy_attributes_module', 'There is no replacement')
43
- @lazy_attributes_module
44
- end
45
- def lazy_attributes_module=(v)
46
- Sequel::Deprecation.deprecate('Sequel::Model.lazy_attributes_module=', 'There is no replacement')
47
- @lazy_attributes_module= v
48
- end
49
-
50
41
  # Freeze lazy attributes module when freezing model class.
51
42
  def freeze
52
43
  @lazy_attributes_module.freeze if @lazy_attributes_module
@@ -11,7 +11,7 @@ module Sequel
11
11
  #
12
12
  # class Item < Sequel::Model(:items)
13
13
  # plugin :list # will use :position field for position
14
- # plugin :list, :field=>:pos # will use :pos field for position
14
+ # plugin :list, field: :pos # will use :pos field for position
15
15
  # end
16
16
  #
17
17
  # item = Item[1]
@@ -38,7 +38,7 @@ module Sequel
38
38
  # For example, if each item has a +user_id+ field, and you want every user
39
39
  # to have their own list:
40
40
  #
41
- # Item.plugin :list, :scope=>:user_id
41
+ # Item.plugin :list, scope: :user_id
42
42
  #
43
43
  # Note that using this plugin modifies the order of the model's dataset to
44
44
  # sort by the position and scope fields. Also note that this plugin is subject to
@@ -62,7 +62,7 @@ module Sequel
62
62
  model.scope_proc = case scope = opts[:scope]
63
63
  when Symbol
64
64
  model.dataset = model.dataset.order_prepend(scope)
65
- proc{|obj| obj.model.where(scope=>obj.send(scope))}
65
+ proc{|obj| obj.model.where(scope=>obj.public_send(scope))}
66
66
  when Array
67
67
  model.dataset = model.dataset.order_prepend(*scope)
68
68
  proc{|obj| obj.model.where(scope.map{|s| [s, obj.get_column_value(s)]})}
@@ -170,17 +170,17 @@ module Sequel
170
170
  self.next(n * -1)
171
171
  end
172
172
 
173
- private
174
-
175
173
  # Set the value of the position_field to the maximum value plus 1 unless the
176
174
  # position field already has a value.
177
- def _before_validation
175
+ def before_validation
178
176
  unless get_column_value(position_field)
179
177
  set_column_value("#{position_field}=", list_dataset.max(position_field).to_i+1)
180
178
  end
181
179
  super
182
180
  end
183
181
 
182
+ private
183
+
184
184
  # The model's position field, an instance method for ease of use.
185
185
  def position_field
186
186
  model.position_field
@@ -46,18 +46,18 @@ module Sequel
46
46
  # Artist.many_through_many :artists, [[:albums_artists, :artist_id, :album_id], [:albums_artists, :album_id, :artist_id]]
47
47
  #
48
48
  # # All albums by artists that are associated to any album that this artist is associated to
49
- # Artist.many_through_many :artist_albums, [[:albums_artists, :artist_id, :album_id], \
50
- # [:albums_artists, :album_id, :artist_id], [:albums_artists, :artist_id, :album_id]], \
51
- # :class=>:Album
49
+ # Artist.many_through_many :artist_albums, [[:albums_artists, :artist_id, :album_id],
50
+ # [:albums_artists, :album_id, :artist_id], [:albums_artists, :artist_id, :album_id]],
51
+ # class: :Album
52
52
  #
53
53
  # # All tracks on albums by this artist (also could be a many_to_many)
54
- # Artist.many_through_many :tracks, [[:albums_artists, :artist_id, :album_id]], \
55
- # :right_primary_key=>:album_id
54
+ # Artist.many_through_many :tracks, [[:albums_artists, :artist_id, :album_id]],
55
+ # right_primary_key: :album_id
56
56
  #
57
57
  # Often you don't want the current object to appear in the array of associated objects. This is easiest to handle via an :after_load hook:
58
58
  #
59
59
  # Artist.many_through_many :artists, [[:albums_artists, :artist_id, :album_id], [:albums_artists, :album_id, :artist_id]],
60
- # :after_load=>proc{|artist, associated_artists| associated_artists.delete(artist)}
60
+ # after_load: lambda{|artist, associated_artists| associated_artists.delete(artist)}
61
61
  #
62
62
  # You can also handle it by adding a dataset block that excludes the current record (so it won't be retrieved at all), but
63
63
  # that won't work when eagerly loading, which is why the :after_load proc is recommended instead.
@@ -65,7 +65,7 @@ module Sequel
65
65
  # It's also common to not want duplicate records, in which case the :distinct option can be used:
66
66
  #
67
67
  # Artist.many_through_many :artists, [[:albums_artists, :artist_id, :album_id], [:albums, :id, :id], [:albums_artists, :album_id, :artist_id]],
68
- # :distinct=>true
68
+ # distinct: true
69
69
  #
70
70
  # In addition to many_through_many, this plugin also adds one_through_many, for an association to a single object through multiple join tables.
71
71
  # This is useful if there are unique constraints on the foreign keys in the join tables that reference back to the current table, or if you want
@@ -228,7 +228,10 @@ module Sequel
228
228
  def def_many_through_many(opts)
229
229
  one_through_many = opts[:type] == :one_through_many
230
230
  opts[:read_only] = true
231
- opts[:after_load].unshift(:array_uniq!) if opts[:uniq]
231
+ if opts[:uniq]
232
+ opts[:after_load] ||= []
233
+ opts[:after_load].unshift(:array_uniq!)
234
+ end
232
235
  opts[:cartesian_product_number] ||= one_through_many ? 0 : 2
233
236
  opts[:through] = opts[:through].map do |e|
234
237
  case e
@@ -12,15 +12,15 @@ module Sequel
12
12
  # end
13
13
  # p1 = Person[1]
14
14
  # p2 = Person[1]
15
- # p1.update(:name=>'Jim') # works
16
- # p2.update(:name=>'Bob') # raises Sequel::NoExistingObject
15
+ # p1.update(name: 'Jim') # works
16
+ # p2.update(name: 'Bob') # raises Sequel::NoExistingObject
17
17
  #
18
18
  # In order for this plugin to work, you need to make sure that the database
19
19
  # table has a column of timestamp or rowversion. The plugin uses a default
20
20
  # name of timestamp for this columns, but you can override that using the
21
21
  # :lock_column option:
22
22
  #
23
- # plugin :mssql_optimistic_locking, :lock_column=>:column_name
23
+ # plugin :mssql_optimistic_locking, lock_column: :column_name
24
24
  #
25
25
  # This plugin relies on the instance_filters plugin.
26
26
  module MssqlOptimisticLocking
@@ -13,11 +13,11 @@ module Sequel
13
13
  # The nested_attributes call defines a single method, <tt><i>association</i>_attributes=</tt>,
14
14
  # (e.g. <tt>albums_attributes=</tt>). So if you have an Artist instance:
15
15
  #
16
- # a = Artist.new(:name=>'YJM')
16
+ # a = Artist.new(name: 'YJM')
17
17
  #
18
18
  # You can create new album instances related to this artist:
19
19
  #
20
- # a.albums_attributes = [{:name=>'RF'}, {:name=>'MO'}]
20
+ # a.albums_attributes = [{name: 'RF'}, {name: 'MO'}]
21
21
  #
22
22
  # Note that this doesn't send any queries to the database yet. That doesn't happen till
23
23
  # you save the object:
@@ -33,7 +33,7 @@ module Sequel
33
33
  # objects. You just need to make sure that the primary key field is filled in for the
34
34
  # associated object:
35
35
  #
36
- # a.update(:albums_attributes => [{:id=>1, :name=>'T'}])
36
+ # a.update(:albums_attributes => [{id: 1, name: 'T'}])
37
37
  #
38
38
  # Since the primary key field is filled in, the plugin will update the album with id 1 instead
39
39
  # of creating a new album.
@@ -41,15 +41,15 @@ module Sequel
41
41
  # If you would like to delete the associated object instead of updating it, you add a _delete
42
42
  # entry to the hash, and also pass the :destroy option when calling +nested_attributes+:
43
43
  #
44
- # Artist.nested_attributes :albums, :destroy=>true
45
- # a.update(:albums_attributes => [{:id=>1, :_delete=>true}])
44
+ # Artist.nested_attributes :albums, destroy: true
45
+ # a.update(:albums_attributes => [{id: 1, _delete: true}])
46
46
  #
47
47
  # This will delete the related associated object from the database. If you want to leave the
48
48
  # associated object in the database, but just remove it from the association, add a _remove
49
49
  # entry in the hash, and also pass the :remove option when calling +nested_attributes+:
50
50
  #
51
- # Artist.nested_attributes :albums, :remove=>true
52
- # a.update(:albums_attributes => [{:id=>1, :_remove=>true}])
51
+ # Artist.nested_attributes :albums, remove: true
52
+ # a.update(:albums_attributes => [{id: 1, _remove: true}])
53
53
  #
54
54
  # The above example was for a one_to_many association, but the plugin also works similarly
55
55
  # for other association types. For one_to_one and many_to_one associations, you need to
@@ -66,11 +66,11 @@ module Sequel
66
66
  #
67
67
  # Your web stack will probably parse that into a nested hash similar to:
68
68
  #
69
- # {:artist=>{:name=>'Y', :albums_attributes=>{0=>{:name=>'X'}, 1=>{:id=>'2', :name=>'Z'}}}}
69
+ # {'artist'=>{'name'=>'Y', 'albums_attributes'=>{'0'=>{'name'=>'X'}, '1'=>{'id'=>'2', 'name'=>'Z'}}}}
70
70
  #
71
71
  # Then you can do:
72
72
  #
73
- # artist.update_fields(params[:artist], [:name, :albums_artists])
73
+ # artist.update_fields(params['artist'], %w'name albums_artists')
74
74
  #
75
75
  # To save changes to the artist, create the first album and associate it to the artist,
76
76
  # and update the other existing associated album.
@@ -81,15 +81,6 @@ module Sequel
81
81
  end
82
82
 
83
83
  module ClassMethods
84
- def nested_attributes_module
85
- Sequel::Deprecation.deprecate('Sequel::Model.nested_attributes_module', 'There is no replacement')
86
- @nested_attributes_module
87
- end
88
- def nested_attributes_module=(v)
89
- Sequel::Deprecation.deprecate('Sequel::Model.nested_attributes_module=', 'There is no replacement')
90
- @nested_attributes_module = v
91
- end
92
-
93
84
  # Freeze nested_attributes_module when freezing model class.
94
85
  def freeze
95
86
  @nested_attributes_module.freeze if @nested_attributes_module
@@ -127,11 +118,7 @@ module Sequel
127
118
  reflections = associations.map{|a| association_reflection(a) || raise(Error, "no association named #{a} for #{self}")}
128
119
  reflections.each do |r|
129
120
  r[:nested_attributes] = opts
130
- r[:nested_attributes][:unmatched_pk] ||= (
131
- if opts.has_key?(:strict)
132
- Sequel::Deprecation.deprecate("The nested_attributes :strict option", "Use the :unmatched_pk option instead")
133
- end
134
- opts.delete(:strict) == false ? :ignore : :raise)
121
+ r[:nested_attributes][:unmatched_pk] ||= :raise
135
122
  r[:nested_attributes][:reject_if] ||= block
136
123
  def_nested_attribute_method(r)
137
124
  end
@@ -188,8 +175,8 @@ module Sequel
188
175
  nested_attributes_set_attributes(meta, obj, attributes)
189
176
  delay_validate_associated_object(reflection, obj)
190
177
  if reflection.returns_array?
191
- send(reflection[:name]) << obj
192
- after_save_hook{send(reflection.add_method, obj)}
178
+ public_send(reflection[:name]) << obj
179
+ after_save_hook{public_send(reflection[:add_method], obj)}
193
180
  else
194
181
  associations[reflection[:name]] = obj
195
182
 
@@ -201,9 +188,9 @@ module Sequel
201
188
  # Don't need to validate the object twice if :validate association option is not false
202
189
  # and don't want to validate it at all if it is false.
203
190
  if reflection[:type] == :many_to_one
204
- before_save_hook{send(reflection.setter_method, obj.save(:validate=>false))}
191
+ before_save_hook{public_send(reflection[:setter_method], obj.save(:validate=>false))}
205
192
  else
206
- after_save_hook{send(reflection.setter_method, obj)}
193
+ after_save_hook{public_send(reflection[:setter_method], obj)}
207
194
  end
208
195
  end
209
196
  add_reciprocal_object(reflection, obj)
@@ -215,7 +202,7 @@ module Sequel
215
202
  # If there is a limit on the nested attributes for this association,
216
203
  # make sure the length of the attributes_list is not greater than the limit.
217
204
  def nested_attributes_list_setter(meta, attributes_list)
218
- attributes_list = attributes_list.sort_by(&:to_s).map{|k,v| v} if attributes_list.is_a?(Hash)
205
+ attributes_list = attributes_list.sort.map{|k,v| v} if attributes_list.is_a?(Hash)
219
206
  if (limit = meta[:limit]) && attributes_list.length > limit
220
207
  raise(Error, "number of nested attributes (#{attributes_list.length}) exceeds the limit (#{limit})")
221
208
  end
@@ -231,9 +218,9 @@ module Sequel
231
218
  if !opts[:destroy] || reflection.remove_before_destroy?
232
219
  before_save_hook do
233
220
  if reflection.returns_array?
234
- send(reflection.remove_method, obj)
221
+ public_send(reflection[:remove_method], obj)
235
222
  else
236
- send(reflection.setter_method, nil)
223
+ public_send(reflection[:setter_method], nil)
237
224
  end
238
225
  end
239
226
  end
@@ -277,7 +264,7 @@ module Sequel
277
264
  str_keys = sym_keys.map(&:to_s)
278
265
  if (pk = attributes.values_at(*sym_keys)).all? || (pk = attributes.values_at(*str_keys)).all?
279
266
  pk = pk.map(&:to_s)
280
- obj = Array(send(reflection[:name])).find{|x| Array(x.pk).map(&:to_s) == pk}
267
+ obj = Array(public_send(reflection[:name])).find{|x| Array(x.pk).map(&:to_s) == pk}
281
268
  end
282
269
  if obj
283
270
  attributes = attributes.dup.delete_if{|k,v| str_keys.include? k.to_s}
@@ -11,11 +11,11 @@ module Sequel
11
11
  # end
12
12
  # p1 = Person[1]
13
13
  # p2 = Person[1]
14
- # p1.update(:name=>'Jim') # works
15
- # p2.update(:name=>'Bob') # raises Sequel::Plugins::OptimisticLocking::Error
14
+ # p1.update(name: 'Jim') # works
15
+ # p2.update(name: 'Bob') # raises Sequel::Plugins::OptimisticLocking::Error
16
16
  #
17
17
  # In order for this plugin to work, you need to make sure that the database
18
- # table has a lock_version column (or other column you name via the lock_column
18
+ # table has a +lock_version+ column (or other column you name via the lock_column
19
19
  # class level accessor) that defaults to 0.
20
20
  #
21
21
  # This plugin relies on the instance_filters plugin.
@@ -328,7 +328,10 @@ module Sequel
328
328
  opts[:key] = opts.default_key unless opts.has_key?(:key)
329
329
  key = opts[:key]
330
330
  key_column = opts[:key_column] ||= opts[:key]
331
- opts[:after_load].unshift(:array_uniq!) if opts[:uniq]
331
+ if opts[:uniq]
332
+ opts[:after_load] ||= []
333
+ opts[:after_load].unshift(:array_uniq!)
334
+ end
332
335
  opts[:dataset] ||= lambda do
333
336
  opts.associated_dataset.where(Sequel.pg_array_op(opts.predicate_key).contains(Sequel.pg_array([get_column_value(pk)], opts.array_type)))
334
337
  end
@@ -408,7 +411,10 @@ module Sequel
408
411
  key = opts[:key]
409
412
  key_column = opts[:key_column] ||= key
410
413
  opts[:eager_loader_key] = nil
411
- opts[:after_load].unshift(:array_uniq!) if opts[:uniq]
414
+ if opts[:uniq]
415
+ opts[:after_load] ||= []
416
+ opts[:after_load].unshift(:array_uniq!)
417
+ end
412
418
  opts[:dataset] ||= lambda do
413
419
  opts.associated_dataset.where(opts.predicate_key=>get_column_value(key).to_a)
414
420
  end
@@ -41,22 +41,13 @@ module Sequel
41
41
  #
42
42
  # Address.register_row_type
43
43
  #
44
- # Note that automatic conversion only works with the native postgres adapter.
45
- # For other adapters that connect to PostgreSQL, you need to call the conversion
46
- # proc manually.
47
- #
48
44
  # In addition to returning row-valued/composite types as instances of Sequel::Model,
49
45
  # this also lets you use model instances in datasets when inserting, updating, and
50
46
  # filtering:
51
47
  #
52
- # DB[:company].insert(:name=>'MS', :address=>
53
- # Address.load(:street=>'123 Foo St', :city=>'Bar Town', :zip=>'12345'))
48
+ # DB[:company].insert(name: 'MS', address:
49
+ # Address.load(street: '123 Foo St', city: 'Bar Town', zip: '12345'))
54
50
  module PgRow
55
- ROW = 'ROW'.freeze
56
- Sequel::Deprecation.deprecate_constant(self, :ROW)
57
- CAST = '::'.freeze
58
- Sequel::Deprecation.deprecate_constant(self, :CAST)
59
-
60
51
  # When loading the extension, make sure the database has the pg_row extension
61
52
  # loaded, load the custom database extensions, and automatically register the
62
53
  # row type if the model has a dataset.