sequel 4.49.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (477) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +70 -0
  3. data/README.rdoc +195 -136
  4. data/Rakefile +26 -42
  5. data/bin/sequel +3 -5
  6. data/doc/advanced_associations.rdoc +86 -163
  7. data/doc/association_basics.rdoc +197 -274
  8. data/doc/bin_sequel.rdoc +5 -3
  9. data/doc/cheat_sheet.rdoc +66 -43
  10. data/doc/code_order.rdoc +1 -8
  11. data/doc/core_extensions.rdoc +81 -56
  12. data/doc/dataset_basics.rdoc +8 -17
  13. data/doc/dataset_filtering.rdoc +81 -86
  14. data/doc/extensions.rdoc +3 -10
  15. data/doc/mass_assignment.rdoc +73 -30
  16. data/doc/migration.rdoc +19 -36
  17. data/doc/model_dataset_method_design.rdoc +14 -17
  18. data/doc/model_hooks.rdoc +15 -25
  19. data/doc/model_plugins.rdoc +10 -10
  20. data/doc/mssql_stored_procedures.rdoc +3 -3
  21. data/doc/object_model.rdoc +52 -70
  22. data/doc/opening_databases.rdoc +39 -32
  23. data/doc/postgresql.rdoc +48 -38
  24. data/doc/prepared_statements.rdoc +27 -22
  25. data/doc/querying.rdoc +173 -150
  26. data/doc/reflection.rdoc +5 -6
  27. data/doc/release_notes/5.0.0.txt +159 -0
  28. data/doc/schema_modification.rdoc +63 -60
  29. data/doc/security.rdoc +97 -88
  30. data/doc/sharding.rdoc +43 -30
  31. data/doc/sql.rdoc +53 -65
  32. data/doc/testing.rdoc +3 -5
  33. data/doc/thread_safety.rdoc +2 -4
  34. data/doc/transactions.rdoc +18 -17
  35. data/doc/validations.rdoc +48 -45
  36. data/doc/virtual_rows.rdoc +87 -115
  37. data/lib/sequel.rb +1 -1
  38. data/lib/sequel/adapters/ado.rb +9 -25
  39. data/lib/sequel/adapters/ado/access.rb +7 -13
  40. data/lib/sequel/adapters/ado/mssql.rb +2 -9
  41. data/lib/sequel/adapters/amalgalite.rb +3 -18
  42. data/lib/sequel/adapters/ibmdb.rb +9 -45
  43. data/lib/sequel/adapters/jdbc.rb +13 -73
  44. data/lib/sequel/adapters/jdbc/db2.rb +8 -37
  45. data/lib/sequel/adapters/jdbc/derby.rb +4 -50
  46. data/lib/sequel/adapters/jdbc/h2.rb +4 -25
  47. data/lib/sequel/adapters/jdbc/hsqldb.rb +1 -26
  48. data/lib/sequel/adapters/jdbc/jtds.rb +2 -9
  49. data/lib/sequel/adapters/jdbc/mssql.rb +1 -11
  50. data/lib/sequel/adapters/jdbc/mysql.rb +1 -15
  51. data/lib/sequel/adapters/jdbc/oracle.rb +4 -26
  52. data/lib/sequel/adapters/jdbc/postgresql.rb +2 -31
  53. data/lib/sequel/adapters/jdbc/sqlanywhere.rb +4 -17
  54. data/lib/sequel/adapters/jdbc/sqlite.rb +1 -7
  55. data/lib/sequel/adapters/jdbc/sqlserver.rb +1 -13
  56. data/lib/sequel/adapters/jdbc/transactions.rb +1 -14
  57. data/lib/sequel/adapters/mock.rb +4 -30
  58. data/lib/sequel/adapters/mysql.rb +7 -44
  59. data/lib/sequel/adapters/mysql2.rb +5 -23
  60. data/lib/sequel/adapters/odbc.rb +0 -19
  61. data/lib/sequel/adapters/odbc/db2.rb +1 -1
  62. data/lib/sequel/adapters/odbc/mssql.rb +4 -12
  63. data/lib/sequel/adapters/odbc/oracle.rb +1 -1
  64. data/lib/sequel/adapters/oracle.rb +7 -13
  65. data/lib/sequel/adapters/postgres.rb +13 -57
  66. data/lib/sequel/adapters/postgresql.rb +1 -1
  67. data/lib/sequel/adapters/shared/access.rb +11 -51
  68. data/lib/sequel/adapters/shared/db2.rb +3 -61
  69. data/lib/sequel/adapters/shared/mssql.rb +21 -157
  70. data/lib/sequel/adapters/shared/mysql.rb +23 -224
  71. data/lib/sequel/adapters/shared/oracle.rb +13 -41
  72. data/lib/sequel/adapters/shared/postgres.rb +44 -259
  73. data/lib/sequel/adapters/shared/sqlanywhere.rb +4 -96
  74. data/lib/sequel/adapters/shared/sqlite.rb +12 -101
  75. data/lib/sequel/adapters/sqlanywhere.rb +4 -23
  76. data/lib/sequel/adapters/sqlite.rb +2 -19
  77. data/lib/sequel/adapters/tinytds.rb +5 -15
  78. data/lib/sequel/adapters/utils/emulate_offset_with_row_number.rb +1 -1
  79. data/lib/sequel/adapters/utils/mysql_mysql2.rb +2 -4
  80. data/lib/sequel/adapters/utils/mysql_prepared_statements.rb +3 -6
  81. data/lib/sequel/adapters/utils/replace.rb +0 -5
  82. data/lib/sequel/adapters/utils/stored_procedures.rb +0 -2
  83. data/lib/sequel/adapters/utils/unmodified_identifiers.rb +2 -0
  84. data/lib/sequel/ast_transformer.rb +3 -94
  85. data/lib/sequel/connection_pool.rb +26 -28
  86. data/lib/sequel/connection_pool/sharded_single.rb +1 -4
  87. data/lib/sequel/connection_pool/sharded_threaded.rb +97 -95
  88. data/lib/sequel/connection_pool/single.rb +0 -2
  89. data/lib/sequel/connection_pool/threaded.rb +94 -110
  90. data/lib/sequel/core.rb +42 -101
  91. data/lib/sequel/database.rb +12 -2
  92. data/lib/sequel/database/connecting.rb +23 -60
  93. data/lib/sequel/database/dataset.rb +6 -9
  94. data/lib/sequel/database/dataset_defaults.rb +4 -48
  95. data/lib/sequel/database/features.rb +5 -4
  96. data/lib/sequel/database/logging.rb +2 -9
  97. data/lib/sequel/database/misc.rb +23 -55
  98. data/lib/sequel/database/query.rb +8 -13
  99. data/lib/sequel/database/schema_generator.rb +89 -64
  100. data/lib/sequel/database/schema_methods.rb +61 -79
  101. data/lib/sequel/database/transactions.rb +4 -24
  102. data/lib/sequel/dataset.rb +18 -10
  103. data/lib/sequel/dataset/actions.rb +53 -107
  104. data/lib/sequel/dataset/dataset_module.rb +3 -15
  105. data/lib/sequel/dataset/features.rb +30 -30
  106. data/lib/sequel/dataset/graph.rb +40 -49
  107. data/lib/sequel/dataset/misc.rb +12 -37
  108. data/lib/sequel/dataset/placeholder_literalizer.rb +4 -4
  109. data/lib/sequel/dataset/prepared_statements.rb +23 -51
  110. data/lib/sequel/dataset/query.rb +71 -155
  111. data/lib/sequel/dataset/sql.rb +30 -225
  112. data/lib/sequel/deprecated.rb +18 -27
  113. data/lib/sequel/exceptions.rb +1 -17
  114. data/lib/sequel/extensions/_model_pg_row.rb +0 -7
  115. data/lib/sequel/extensions/_pretty_table.rb +1 -3
  116. data/lib/sequel/extensions/arbitrary_servers.rb +10 -10
  117. data/lib/sequel/extensions/connection_expiration.rb +1 -1
  118. data/lib/sequel/extensions/connection_validator.rb +1 -1
  119. data/lib/sequel/extensions/constraint_validations.rb +11 -11
  120. data/lib/sequel/extensions/core_extensions.rb +39 -49
  121. data/lib/sequel/extensions/core_refinements.rb +39 -45
  122. data/lib/sequel/extensions/current_datetime_timestamp.rb +0 -4
  123. data/lib/sequel/extensions/date_arithmetic.rb +7 -7
  124. data/lib/sequel/extensions/duplicate_columns_handler.rb +12 -9
  125. data/lib/sequel/extensions/empty_array_consider_nulls.rb +2 -2
  126. data/lib/sequel/extensions/eval_inspect.rb +4 -11
  127. data/lib/sequel/extensions/freeze_datasets.rb +1 -69
  128. data/lib/sequel/extensions/from_block.rb +1 -35
  129. data/lib/sequel/extensions/graph_each.rb +2 -2
  130. data/lib/sequel/extensions/identifier_mangling.rb +9 -19
  131. data/lib/sequel/extensions/implicit_subquery.rb +2 -2
  132. data/lib/sequel/extensions/inflector.rb +4 -4
  133. data/lib/sequel/extensions/migration.rb +23 -40
  134. data/lib/sequel/extensions/no_auto_literal_strings.rb +2 -84
  135. data/lib/sequel/extensions/null_dataset.rb +2 -8
  136. data/lib/sequel/extensions/pagination.rb +1 -17
  137. data/lib/sequel/extensions/pg_array.rb +20 -189
  138. data/lib/sequel/extensions/pg_hstore.rb +11 -50
  139. data/lib/sequel/extensions/pg_hstore_ops.rb +2 -2
  140. data/lib/sequel/extensions/pg_inet.rb +2 -15
  141. data/lib/sequel/extensions/pg_interval.rb +1 -20
  142. data/lib/sequel/extensions/pg_json.rb +7 -27
  143. data/lib/sequel/extensions/pg_loose_count.rb +1 -1
  144. data/lib/sequel/extensions/pg_range.rb +6 -121
  145. data/lib/sequel/extensions/pg_range_ops.rb +1 -3
  146. data/lib/sequel/extensions/pg_row.rb +5 -77
  147. data/lib/sequel/extensions/pg_row_ops.rb +2 -13
  148. data/lib/sequel/extensions/query.rb +3 -4
  149. data/lib/sequel/extensions/round_timestamps.rb +0 -6
  150. data/lib/sequel/extensions/schema_dumper.rb +13 -13
  151. data/lib/sequel/extensions/select_remove.rb +3 -3
  152. data/lib/sequel/extensions/split_array_nil.rb +2 -2
  153. data/lib/sequel/extensions/sql_comments.rb +2 -2
  154. data/lib/sequel/extensions/string_agg.rb +11 -8
  155. data/lib/sequel/extensions/symbol_aref.rb +6 -20
  156. data/lib/sequel/model.rb +27 -62
  157. data/lib/sequel/model/associations.rb +128 -131
  158. data/lib/sequel/model/base.rb +171 -711
  159. data/lib/sequel/model/default_inflections.rb +1 -1
  160. data/lib/sequel/model/errors.rb +0 -3
  161. data/lib/sequel/model/exceptions.rb +2 -6
  162. data/lib/sequel/model/inflections.rb +1 -26
  163. data/lib/sequel/model/plugins.rb +1 -0
  164. data/lib/sequel/plugins/active_model.rb +2 -5
  165. data/lib/sequel/plugins/association_dependencies.rb +15 -15
  166. data/lib/sequel/plugins/association_pks.rb +14 -28
  167. data/lib/sequel/plugins/association_proxies.rb +6 -7
  168. data/lib/sequel/plugins/auto_validations.rb +4 -4
  169. data/lib/sequel/plugins/before_after_save.rb +0 -43
  170. data/lib/sequel/plugins/blacklist_security.rb +9 -8
  171. data/lib/sequel/plugins/boolean_readers.rb +3 -3
  172. data/lib/sequel/plugins/boolean_subsets.rb +2 -2
  173. data/lib/sequel/plugins/caching.rb +5 -5
  174. data/lib/sequel/plugins/class_table_inheritance.rb +71 -102
  175. data/lib/sequel/plugins/column_conflicts.rb +2 -2
  176. data/lib/sequel/plugins/column_select.rb +2 -2
  177. data/lib/sequel/plugins/composition.rb +15 -24
  178. data/lib/sequel/plugins/constraint_validations.rb +4 -3
  179. data/lib/sequel/plugins/csv_serializer.rb +13 -20
  180. data/lib/sequel/plugins/dataset_associations.rb +2 -2
  181. data/lib/sequel/plugins/def_dataset_method.rb +5 -5
  182. data/lib/sequel/plugins/defaults_setter.rb +1 -1
  183. data/lib/sequel/plugins/delay_add_association.rb +1 -1
  184. data/lib/sequel/plugins/finder.rb +16 -10
  185. data/lib/sequel/plugins/force_encoding.rb +1 -7
  186. data/lib/sequel/plugins/hook_class_methods.rb +4 -106
  187. data/lib/sequel/plugins/input_transformer.rb +10 -11
  188. data/lib/sequel/plugins/insert_returning_select.rb +1 -9
  189. data/lib/sequel/plugins/instance_filters.rb +5 -5
  190. data/lib/sequel/plugins/instance_hooks.rb +7 -52
  191. data/lib/sequel/plugins/inverted_subsets.rb +3 -1
  192. data/lib/sequel/plugins/json_serializer.rb +19 -19
  193. data/lib/sequel/plugins/lazy_attributes.rb +1 -10
  194. data/lib/sequel/plugins/list.rb +6 -6
  195. data/lib/sequel/plugins/many_through_many.rb +11 -8
  196. data/lib/sequel/plugins/mssql_optimistic_locking.rb +3 -3
  197. data/lib/sequel/plugins/nested_attributes.rb +18 -31
  198. data/lib/sequel/plugins/optimistic_locking.rb +3 -3
  199. data/lib/sequel/plugins/pg_array_associations.rb +8 -2
  200. data/lib/sequel/plugins/pg_row.rb +2 -11
  201. data/lib/sequel/plugins/prepared_statements.rb +13 -66
  202. data/lib/sequel/plugins/prepared_statements_safe.rb +1 -1
  203. data/lib/sequel/plugins/rcte_tree.rb +7 -7
  204. data/lib/sequel/plugins/serialization.rb +15 -33
  205. data/lib/sequel/plugins/serialization_modification_detection.rb +1 -1
  206. data/lib/sequel/plugins/sharding.rb +2 -8
  207. data/lib/sequel/plugins/single_table_inheritance.rb +10 -13
  208. data/lib/sequel/plugins/skip_create_refresh.rb +3 -3
  209. data/lib/sequel/plugins/static_cache.rb +8 -9
  210. data/lib/sequel/plugins/string_stripper.rb +3 -3
  211. data/lib/sequel/plugins/subclasses.rb +1 -1
  212. data/lib/sequel/plugins/subset_conditions.rb +2 -2
  213. data/lib/sequel/plugins/table_select.rb +2 -2
  214. data/lib/sequel/plugins/tactical_eager_loading.rb +4 -4
  215. data/lib/sequel/plugins/timestamps.rb +6 -7
  216. data/lib/sequel/plugins/touch.rb +4 -8
  217. data/lib/sequel/plugins/tree.rb +3 -3
  218. data/lib/sequel/plugins/typecast_on_load.rb +2 -2
  219. data/lib/sequel/plugins/unlimited_update.rb +1 -7
  220. data/lib/sequel/plugins/update_or_create.rb +3 -3
  221. data/lib/sequel/plugins/update_refresh.rb +3 -3
  222. data/lib/sequel/plugins/uuid.rb +7 -11
  223. data/lib/sequel/plugins/validation_class_methods.rb +10 -9
  224. data/lib/sequel/plugins/validation_contexts.rb +4 -4
  225. data/lib/sequel/plugins/validation_helpers.rb +26 -25
  226. data/lib/sequel/plugins/whitelist_security.rb +13 -9
  227. data/lib/sequel/plugins/xml_serializer.rb +24 -25
  228. data/lib/sequel/sql.rb +145 -276
  229. data/lib/sequel/timezones.rb +8 -22
  230. data/lib/sequel/version.rb +2 -2
  231. data/spec/adapter_spec.rb +1 -1
  232. data/spec/adapters/db2_spec.rb +2 -103
  233. data/spec/adapters/mssql_spec.rb +89 -68
  234. data/spec/adapters/mysql_spec.rb +101 -480
  235. data/spec/adapters/oracle_spec.rb +1 -9
  236. data/spec/adapters/postgres_spec.rb +312 -565
  237. data/spec/adapters/spec_helper.rb +12 -31
  238. data/spec/adapters/sqlanywhere_spec.rb +2 -77
  239. data/spec/adapters/sqlite_spec.rb +8 -146
  240. data/spec/bin_spec.rb +11 -16
  241. data/spec/core/connection_pool_spec.rb +173 -74
  242. data/spec/core/database_spec.rb +64 -244
  243. data/spec/core/dataset_spec.rb +81 -415
  244. data/spec/core/deprecated_spec.rb +3 -3
  245. data/spec/core/expression_filters_spec.rb +37 -144
  246. data/spec/core/mock_adapter_spec.rb +176 -4
  247. data/spec/core/object_graph_spec.rb +11 -60
  248. data/spec/core/placeholder_literalizer_spec.rb +1 -14
  249. data/spec/core/schema_generator_spec.rb +51 -40
  250. data/spec/core/schema_spec.rb +74 -77
  251. data/spec/core/spec_helper.rb +6 -24
  252. data/spec/core/version_spec.rb +1 -1
  253. data/spec/core_extensions_spec.rb +7 -83
  254. data/spec/core_model_spec.rb +2 -2
  255. data/spec/deprecation_helper.rb +2 -14
  256. data/spec/extensions/accessed_columns_spec.rb +1 -1
  257. data/spec/extensions/active_model_spec.rb +3 -3
  258. data/spec/extensions/after_initialize_spec.rb +1 -1
  259. data/spec/extensions/arbitrary_servers_spec.rb +2 -2
  260. data/spec/extensions/association_dependencies_spec.rb +1 -1
  261. data/spec/extensions/association_pks_spec.rb +4 -59
  262. data/spec/extensions/association_proxies_spec.rb +1 -1
  263. data/spec/extensions/auto_literal_strings_spec.rb +1 -12
  264. data/spec/extensions/auto_validations_spec.rb +1 -1
  265. data/spec/extensions/blacklist_security_spec.rb +1 -1
  266. data/spec/extensions/blank_spec.rb +1 -1
  267. data/spec/extensions/boolean_readers_spec.rb +1 -1
  268. data/spec/extensions/boolean_subsets_spec.rb +1 -1
  269. data/spec/extensions/caching_spec.rb +1 -1
  270. data/spec/extensions/class_table_inheritance_spec.rb +35 -1086
  271. data/spec/extensions/column_conflicts_spec.rb +1 -1
  272. data/spec/extensions/column_select_spec.rb +4 -4
  273. data/spec/extensions/columns_introspection_spec.rb +1 -1
  274. data/spec/extensions/columns_updated_spec.rb +1 -1
  275. data/spec/extensions/composition_spec.rb +1 -7
  276. data/spec/extensions/connection_expiration_spec.rb +3 -3
  277. data/spec/extensions/connection_validator_spec.rb +3 -3
  278. data/spec/extensions/constraint_validations_plugin_spec.rb +1 -1
  279. data/spec/extensions/constraint_validations_spec.rb +1 -1
  280. data/spec/extensions/core_refinements_spec.rb +1 -3
  281. data/spec/extensions/csv_serializer_spec.rb +4 -9
  282. data/spec/extensions/current_datetime_timestamp_spec.rb +1 -1
  283. data/spec/extensions/dataset_associations_spec.rb +2 -1
  284. data/spec/extensions/dataset_source_alias_spec.rb +1 -1
  285. data/spec/extensions/date_arithmetic_spec.rb +3 -3
  286. data/spec/extensions/def_dataset_method_spec.rb +1 -1
  287. data/spec/extensions/defaults_setter_spec.rb +2 -2
  288. data/spec/extensions/delay_add_association_spec.rb +8 -9
  289. data/spec/extensions/dirty_spec.rb +1 -1
  290. data/spec/extensions/duplicate_columns_handler_spec.rb +1 -1
  291. data/spec/extensions/eager_each_spec.rb +2 -2
  292. data/spec/extensions/empty_array_consider_nulls_spec.rb +1 -1
  293. data/spec/extensions/error_splitter_spec.rb +1 -1
  294. data/spec/extensions/error_sql_spec.rb +1 -1
  295. data/spec/extensions/eval_inspect_spec.rb +1 -1
  296. data/spec/extensions/finder_spec.rb +1 -1
  297. data/spec/extensions/force_encoding_spec.rb +2 -5
  298. data/spec/extensions/freeze_datasets_spec.rb +1 -1
  299. data/spec/extensions/graph_each_spec.rb +5 -5
  300. data/spec/extensions/hook_class_methods_spec.rb +1 -194
  301. data/spec/extensions/identifier_mangling_spec.rb +17 -170
  302. data/spec/extensions/implicit_subquery_spec.rb +1 -5
  303. data/spec/extensions/inflector_spec.rb +1 -1
  304. data/spec/extensions/input_transformer_spec.rb +7 -2
  305. data/spec/extensions/insert_returning_select_spec.rb +1 -1
  306. data/spec/extensions/instance_filters_spec.rb +1 -1
  307. data/spec/extensions/instance_hooks_spec.rb +1 -95
  308. data/spec/extensions/inverted_subsets_spec.rb +1 -1
  309. data/spec/extensions/json_serializer_spec.rb +1 -1
  310. data/spec/extensions/lazy_attributes_spec.rb +1 -7
  311. data/spec/extensions/list_spec.rb +1 -1
  312. data/spec/extensions/looser_typecasting_spec.rb +1 -1
  313. data/spec/extensions/many_through_many_spec.rb +1 -1
  314. data/spec/extensions/migration_spec.rb +2 -2
  315. data/spec/extensions/modification_detection_spec.rb +1 -1
  316. data/spec/extensions/mssql_optimistic_locking_spec.rb +1 -1
  317. data/spec/extensions/named_timezones_spec.rb +3 -3
  318. data/spec/extensions/nested_attributes_spec.rb +1 -29
  319. data/spec/extensions/null_dataset_spec.rb +1 -11
  320. data/spec/extensions/optimistic_locking_spec.rb +1 -1
  321. data/spec/extensions/pagination_spec.rb +1 -1
  322. data/spec/extensions/pg_array_associations_spec.rb +4 -1
  323. data/spec/extensions/pg_array_ops_spec.rb +1 -1
  324. data/spec/extensions/pg_array_spec.rb +3 -48
  325. data/spec/extensions/pg_enum_spec.rb +1 -1
  326. data/spec/extensions/pg_hstore_ops_spec.rb +1 -1
  327. data/spec/extensions/pg_hstore_spec.rb +23 -32
  328. data/spec/extensions/pg_inet_ops_spec.rb +1 -1
  329. data/spec/extensions/pg_inet_spec.rb +1 -14
  330. data/spec/extensions/pg_interval_spec.rb +3 -13
  331. data/spec/extensions/pg_json_ops_spec.rb +1 -1
  332. data/spec/extensions/pg_json_spec.rb +1 -13
  333. data/spec/extensions/pg_loose_count_spec.rb +1 -1
  334. data/spec/extensions/pg_range_ops_spec.rb +1 -1
  335. data/spec/extensions/pg_range_spec.rb +3 -88
  336. data/spec/extensions/pg_row_ops_spec.rb +1 -1
  337. data/spec/extensions/pg_row_plugin_spec.rb +1 -1
  338. data/spec/extensions/pg_row_spec.rb +1 -44
  339. data/spec/extensions/pg_static_cache_updater_spec.rb +1 -1
  340. data/spec/extensions/prepared_statements_safe_spec.rb +1 -1
  341. data/spec/extensions/prepared_statements_spec.rb +13 -48
  342. data/spec/extensions/pretty_table_spec.rb +1 -1
  343. data/spec/extensions/query_spec.rb +1 -12
  344. data/spec/extensions/rcte_tree_spec.rb +1 -1
  345. data/spec/extensions/round_timestamps_spec.rb +1 -5
  346. data/spec/extensions/s_spec.rb +1 -1
  347. data/spec/extensions/schema_caching_spec.rb +1 -1
  348. data/spec/extensions/schema_dumper_spec.rb +1 -1
  349. data/spec/extensions/select_remove_spec.rb +1 -1
  350. data/spec/extensions/sequel_4_dataset_methods_spec.rb +1 -1
  351. data/spec/extensions/serialization_modification_detection_spec.rb +1 -1
  352. data/spec/extensions/serialization_spec.rb +2 -14
  353. data/spec/extensions/server_block_spec.rb +1 -1
  354. data/spec/extensions/server_logging_spec.rb +2 -2
  355. data/spec/extensions/sharding_spec.rb +1 -1
  356. data/spec/extensions/shared_caching_spec.rb +1 -28
  357. data/spec/extensions/single_table_inheritance_spec.rb +2 -5
  358. data/spec/extensions/singular_table_names_spec.rb +1 -1
  359. data/spec/extensions/skip_create_refresh_spec.rb +1 -1
  360. data/spec/extensions/spec_helper.rb +5 -27
  361. data/spec/extensions/split_array_nil_spec.rb +1 -1
  362. data/spec/extensions/split_values_spec.rb +1 -1
  363. data/spec/extensions/sql_comments_spec.rb +1 -1
  364. data/spec/extensions/sql_expr_spec.rb +1 -1
  365. data/spec/extensions/static_cache_spec.rb +1 -1
  366. data/spec/extensions/string_agg_spec.rb +2 -2
  367. data/spec/extensions/string_date_time_spec.rb +1 -1
  368. data/spec/extensions/string_stripper_spec.rb +1 -1
  369. data/spec/extensions/subclasses_spec.rb +1 -1
  370. data/spec/extensions/subset_conditions_spec.rb +1 -1
  371. data/spec/extensions/symbol_aref_refinement_spec.rb +1 -1
  372. data/spec/extensions/symbol_as_refinement_spec.rb +1 -1
  373. data/spec/extensions/table_select_spec.rb +4 -4
  374. data/spec/extensions/tactical_eager_loading_spec.rb +1 -6
  375. data/spec/extensions/thread_local_timezones_spec.rb +1 -1
  376. data/spec/extensions/timestamps_spec.rb +3 -3
  377. data/spec/extensions/to_dot_spec.rb +1 -1
  378. data/spec/extensions/touch_spec.rb +1 -1
  379. data/spec/extensions/tree_spec.rb +1 -1
  380. data/spec/extensions/typecast_on_load_spec.rb +1 -1
  381. data/spec/extensions/unlimited_update_spec.rb +1 -1
  382. data/spec/extensions/update_or_create_spec.rb +1 -1
  383. data/spec/extensions/update_primary_key_spec.rb +4 -3
  384. data/spec/extensions/update_refresh_spec.rb +1 -1
  385. data/spec/extensions/uuid_spec.rb +10 -12
  386. data/spec/extensions/validate_associated_spec.rb +1 -1
  387. data/spec/extensions/validation_class_methods_spec.rb +3 -3
  388. data/spec/extensions/validation_contexts_spec.rb +1 -1
  389. data/spec/extensions/validation_helpers_spec.rb +10 -44
  390. data/spec/extensions/whitelist_security_spec.rb +5 -5
  391. data/spec/extensions/xml_serializer_spec.rb +3 -3
  392. data/spec/guards_helper.rb +2 -1
  393. data/spec/integration/associations_test.rb +1 -23
  394. data/spec/integration/database_test.rb +7 -7
  395. data/spec/integration/dataset_test.rb +5 -47
  396. data/spec/integration/eager_loader_test.rb +1 -1
  397. data/spec/integration/migrator_test.rb +1 -1
  398. data/spec/integration/model_test.rb +4 -82
  399. data/spec/integration/plugin_test.rb +6 -22
  400. data/spec/integration/prepared_statement_test.rb +8 -88
  401. data/spec/integration/schema_test.rb +6 -6
  402. data/spec/integration/spec_helper.rb +13 -21
  403. data/spec/integration/timezone_test.rb +5 -5
  404. data/spec/integration/transaction_test.rb +3 -55
  405. data/spec/integration/type_test.rb +9 -9
  406. data/spec/model/association_reflection_spec.rb +24 -9
  407. data/spec/model/associations_spec.rb +124 -303
  408. data/spec/model/base_spec.rb +18 -137
  409. data/spec/model/class_dataset_methods_spec.rb +2 -20
  410. data/spec/model/dataset_methods_spec.rb +1 -20
  411. data/spec/model/eager_loading_spec.rb +17 -11
  412. data/spec/model/hooks_spec.rb +5 -300
  413. data/spec/model/inflector_spec.rb +1 -1
  414. data/spec/model/model_spec.rb +15 -320
  415. data/spec/model/plugins_spec.rb +2 -16
  416. data/spec/model/record_spec.rb +29 -121
  417. data/spec/model/spec_helper.rb +5 -15
  418. data/spec/model/validations_spec.rb +1 -1
  419. data/spec/sequel_warning.rb +1 -12
  420. metadata +8 -64
  421. data/doc/active_record.rdoc +0 -927
  422. data/lib/sequel/adapters/cubrid.rb +0 -160
  423. data/lib/sequel/adapters/do.rb +0 -166
  424. data/lib/sequel/adapters/do/mysql.rb +0 -69
  425. data/lib/sequel/adapters/do/postgres.rb +0 -46
  426. data/lib/sequel/adapters/do/sqlite3.rb +0 -41
  427. data/lib/sequel/adapters/jdbc/as400.rb +0 -92
  428. data/lib/sequel/adapters/jdbc/cubrid.rb +0 -65
  429. data/lib/sequel/adapters/jdbc/firebirdsql.rb +0 -37
  430. data/lib/sequel/adapters/jdbc/informix-sqli.rb +0 -34
  431. data/lib/sequel/adapters/jdbc/jdbcprogress.rb +0 -34
  432. data/lib/sequel/adapters/odbc/progress.rb +0 -12
  433. data/lib/sequel/adapters/shared/cubrid.rb +0 -245
  434. data/lib/sequel/adapters/shared/firebird.rb +0 -261
  435. data/lib/sequel/adapters/shared/informix.rb +0 -63
  436. data/lib/sequel/adapters/shared/progress.rb +0 -40
  437. data/lib/sequel/adapters/swift.rb +0 -169
  438. data/lib/sequel/adapters/swift/mysql.rb +0 -50
  439. data/lib/sequel/adapters/swift/postgres.rb +0 -49
  440. data/lib/sequel/adapters/swift/sqlite.rb +0 -48
  441. data/lib/sequel/adapters/utils/pg_types.rb +0 -4
  442. data/lib/sequel/dataset/mutation.rb +0 -98
  443. data/lib/sequel/extensions/_deprecated_identifier_mangling.rb +0 -117
  444. data/lib/sequel/extensions/empty_array_ignore_nulls.rb +0 -8
  445. data/lib/sequel/extensions/filter_having.rb +0 -65
  446. data/lib/sequel/extensions/hash_aliases.rb +0 -51
  447. data/lib/sequel/extensions/meta_def.rb +0 -37
  448. data/lib/sequel/extensions/query_literals.rb +0 -86
  449. data/lib/sequel/extensions/ruby18_symbol_extensions.rb +0 -26
  450. data/lib/sequel/extensions/sequel_3_dataset_methods.rb +0 -133
  451. data/lib/sequel/extensions/set_overrides.rb +0 -82
  452. data/lib/sequel/no_core_ext.rb +0 -4
  453. data/lib/sequel/plugins/association_autoreloading.rb +0 -11
  454. data/lib/sequel/plugins/identifier_columns.rb +0 -49
  455. data/lib/sequel/plugins/many_to_one_pk_lookup.rb +0 -11
  456. data/lib/sequel/plugins/pg_typecast_on_load.rb +0 -90
  457. data/lib/sequel/plugins/prepared_statements_associations.rb +0 -137
  458. data/lib/sequel/plugins/prepared_statements_with_pk.rb +0 -71
  459. data/lib/sequel/plugins/schema.rb +0 -84
  460. data/lib/sequel/plugins/scissors.rb +0 -37
  461. data/spec/core/dataset_mutation_spec.rb +0 -253
  462. data/spec/extensions/_deprecated_identifier_mangling_spec.rb +0 -314
  463. data/spec/extensions/before_after_save_spec.rb +0 -40
  464. data/spec/extensions/filter_having_spec.rb +0 -42
  465. data/spec/extensions/from_block_spec.rb +0 -21
  466. data/spec/extensions/hash_aliases_spec.rb +0 -26
  467. data/spec/extensions/identifier_columns_spec.rb +0 -19
  468. data/spec/extensions/meta_def_spec.rb +0 -35
  469. data/spec/extensions/no_auto_literal_strings_spec.rb +0 -69
  470. data/spec/extensions/pg_typecast_on_load_spec.rb +0 -70
  471. data/spec/extensions/prepared_statements_associations_spec.rb +0 -212
  472. data/spec/extensions/prepared_statements_with_pk_spec.rb +0 -40
  473. data/spec/extensions/query_literals_spec.rb +0 -185
  474. data/spec/extensions/schema_spec.rb +0 -123
  475. data/spec/extensions/scissors_spec.rb +0 -27
  476. data/spec/extensions/sequel_3_dataset_methods_spec.rb +0 -118
  477. data/spec/extensions/set_overrides_spec.rb +0 -75
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Sequel
4
4
  module Plugins
5
- # The BooleanReaders plugin allows for the creation of attribute? methods
5
+ # The boolean_readers plugin allows for the creation of attribute? methods
6
6
  # for boolean columns, which provides a nicer API. By default, the accessors
7
7
  # are created for all columns of type :boolean. However, you can provide a
8
8
  # block to the plugin to change the criteria used to determine if a
@@ -28,8 +28,8 @@ module Sequel
28
28
  # Add the boolean_attribute? class method to the model, and create
29
29
  # attribute? boolean reader methods for the class's columns if the class has a dataset.
30
30
  def self.configure(model, &block)
31
- model.instance_eval do
32
- (class << self; self; end).send(:define_method, :boolean_attribute?, &(block || DEFAULT_BOOLEAN_ATTRIBUTE_PROC))
31
+ model.instance_exec do
32
+ define_singleton_method(:boolean_attribute?, &(block || DEFAULT_BOOLEAN_ATTRIBUTE_PROC))
33
33
  send(:create_boolean_readers) if @dataset
34
34
  end
35
35
  end
@@ -30,8 +30,8 @@ module Sequel
30
30
  module BooleanSubsets
31
31
  # Create boolean subset methods for each boolean column.
32
32
  def self.configure(model, &block)
33
- model.instance_eval do
34
- (class << self; self; end).send(:define_method, :boolean_subset_args, &block) if block
33
+ model.instance_exec do
34
+ define_singleton_method(:boolean_subset_args, &block) if block
35
35
  create_boolean_subsets if @dataset
36
36
  end
37
37
  end
@@ -34,15 +34,15 @@ module Sequel
34
34
  # Sequel::Model.plugin :caching, CACHE
35
35
  #
36
36
  # # Make the Album class use the cache with a 30 minute time-to-live
37
- # Album.plugin :caching, CACHE, :ttl=>1800
37
+ # Album.plugin :caching, CACHE, ttl: 1800
38
38
  #
39
39
  # # Make the Artist class use a cache with the memcached protocol
40
- # Artist.plugin :caching, MEMCACHED_CACHE, :ignore_exceptions=>true
40
+ # Artist.plugin :caching, MEMCACHED_CACHE, ignore_exceptions: true
41
41
  module Caching
42
42
  # Set the cache_store and cache_ttl attributes for the given model.
43
43
  # If the :ttl option is not given, 3600 seconds is the default.
44
44
  def self.configure(model, store, opts=OPTS)
45
- model.instance_eval do
45
+ model.instance_exec do
46
46
  @cache_store = store
47
47
  @cache_ttl = opts[:ttl] || 3600
48
48
  @cache_ignore_exceptions = opts[:ignore_exceptions]
@@ -94,9 +94,9 @@ module Sequel
94
94
  # Access the cache using the given method and key, rescuing exceptions if necessary.
95
95
  def cache_op(meth, ck)
96
96
  if @cache_ignore_exceptions
97
- @cache_store.send(meth, ck) rescue nil
97
+ @cache_store.public_send(meth, ck) rescue nil
98
98
  else
99
- @cache_store.send(meth, ck)
99
+ @cache_store.public_send(meth, ck)
100
100
  end
101
101
  end
102
102
 
@@ -45,24 +45,28 @@ module Sequel
45
45
  # executives table also stores CEO model objects.
46
46
  #
47
47
  # When using the class_table_inheritance plugin, subclasses that have additional
48
- # columns use joined datasets:
48
+ # columns use joined datasets in subselects:
49
49
  #
50
50
  # Employee.dataset.sql
51
51
  # # SELECT * FROM employees
52
52
  #
53
53
  # Manager.dataset.sql
54
- # # SELECT employees.id, employees.name, employees.kind,
55
- # # managers.num_staff
56
- # # FROM employees
57
- # # JOIN managers ON (managers.id = employees.id)
54
+ # # SELECT * FROM (
55
+ # # SELECT employees.id, employees.name, employees.kind,
56
+ # # managers.num_staff
57
+ # # FROM employees
58
+ # # JOIN managers ON (managers.id = employees.id)
59
+ # # ) AS employees
58
60
  #
59
61
  # CEO.dataset.sql
60
- # # SELECT employees.id, employees.name, employees.kind,
61
- # # managers.num_staff, executives.num_managers
62
- # # FROM employees
63
- # # JOIN managers ON (managers.id = employees.id)
64
- # # JOIN executives ON (executives.id = managers.id)
65
- # # WHERE (employees.kind IN ('CEO'))
62
+ # # SELECT * FROM (
63
+ # # SELECT employees.id, employees.name, employees.kind,
64
+ # # managers.num_staff, executives.num_managers
65
+ # # FROM employees
66
+ # # JOIN managers ON (managers.id = employees.id)
67
+ # # JOIN executives ON (executives.id = managers.id)
68
+ # # WHERE (employees.kind IN ('CEO'))
69
+ # # ) AS employees
66
70
  #
67
71
  # This allows CEO.all to return instances with all attributes
68
72
  # loaded. The plugin overrides the deleting, inserting, and updating
@@ -95,19 +99,21 @@ module Sequel
95
99
  # a = Executive.first
96
100
  # a.values # {:id=>1, name=>'S', :kind=>'Executive', :num_staff=>4, :num_managers=>2}
97
101
  #
98
- # Note that when loading from a subclass, because the subclass dataset uses a JOIN,
99
- # if you are referencing the primary key column, you need to disambiguate the reference
100
- # by explicitly qualifying it:
102
+ # Note that when loading from a subclass, because the subclass dataset uses a subquery
103
+ # that by default uses the same alias at the primary table, any qualified identifiers
104
+ # should reference the subquery alias (and qualified identifiers should not be needed
105
+ # unless joining to another table):
101
106
  #
102
- # a = Executive.where(:id=>1).first # database error
103
- # a = Executive.where{{executives[:id]=>1}}.first # no error
107
+ # a = Executive.where(:id=>1).first # works
108
+ # a = Executive.where{{employees[:id]=>1}}.first # works
109
+ # a = Executive.where{{executives[:id]=>1}}.first # doesn't work
104
110
  #
105
111
  # = Usage
106
112
  #
107
113
  # # Use the default of storing the class name in the sti_key
108
114
  # # column (:kind in this case)
109
115
  # class Employee < Sequel::Model
110
- # plugin :class_table_inheritance, :key=>:kind
116
+ # plugin :class_table_inheritance, key: :kind
111
117
  # end
112
118
  #
113
119
  # # Have subclasses inherit from the appropriate class
@@ -119,27 +125,23 @@ module Sequel
119
125
  #
120
126
  # # Some examples of using these options:
121
127
  #
122
- # # Use a subquery for all subclass datasets, fixing issues with ambiguous
123
- # # column names.
124
- # Employee.plugin :class_table_inheritance, :key=>:kind, :alias=>:employees
125
- #
126
128
  # # Specifying the tables with a :table_map hash
127
129
  # Employee.plugin :class_table_inheritance,
128
- # :table_map=>{:Employee => :employees,
129
- # :Staff => :staff,
130
- # :Cook => :staff,
131
- # :Manager => :managers,
132
- # :Executive => :executives,
133
- # :CEO => :executives }
130
+ # table_map: {Employee: :employees,
131
+ # Staff: :staff,
132
+ # Cook: :staff,
133
+ # Manager: :managers,
134
+ # Executive: :executives,
135
+ # CEO: ::executives }
134
136
  #
135
137
  # # Using integers to store the class type, with a :model_map hash
136
138
  # # and an sti_key of :type
137
- # Employee.plugin :class_table_inheritance, :type,
138
- # :model_map=>{1=>:Staff, 2=>:Cook, 3=>:Manager, 4=>:Executive, 5=>:CEO}
139
+ # Employee.plugin :class_table_inheritance, key: :type,
140
+ # model_map: {1=>:Staff, 2=>:Cook, 3=>:Manager, 4=>:Executive, 5=>:CEO}
139
141
  #
140
142
  # # Using non-class name strings
141
- # Employee.plugin :class_table_inheritance, :key=>:type,
142
- # :model_map=>{'staff'=>:Staff, 'cook staff'=>:Cook, 'supervisor'=>:Manager}
143
+ # Employee.plugin :class_table_inheritance, key: :type,
144
+ # model_map: {'staff'=>:Staff, 'cook staff'=>:Cook, 'supervisor'=>:Manager}
143
145
  #
144
146
  # # By default the plugin sets the respective column value
145
147
  # # when a new instance is created.
@@ -148,26 +150,26 @@ module Sequel
148
150
  #
149
151
  # # You can customize this behavior with the :key_chooser option.
150
152
  # # This is most useful when using a non-bijective mapping.
151
- # Employee.plugin :class_table_inheritance, :key=>:type,
152
- # :model_map=>{'cook staff'=>:Cook, 'supervisor'=>:Manager},
153
- # :key_chooser=>proc{|instance| instance.model.sti_key_map[instance.model.to_s].first || 'stranger' }
153
+ # Employee.plugin :class_table_inheritance, key: :type,
154
+ # model_map: {'cook staff'=>:Cook, 'supervisor'=>:Manager},
155
+ # key_chooser: proc{|instance| instance.model.sti_key_map[instance.model.to_s].first || 'stranger' }
154
156
  #
155
157
  # # Using custom procs, with :model_map taking column values
156
158
  # # and yielding either a class, string, symbol, or nil,
157
159
  # # and :key_map taking a class object and returning the column
158
160
  # # value to use
159
- # Employee.plugin :single_table_inheritance, :key=>:type,
160
- # :model_map=>proc{|v| v.reverse},
161
- # :key_map=>proc{|klass| klass.name.reverse}
161
+ # Employee.plugin :single_table_inheritance, key: :type,
162
+ # model_map: proc{|v| v.reverse},
163
+ # key_map: proc{|klass| klass.name.reverse}
162
164
  #
163
165
  # # You can use the same class for multiple values.
164
166
  # # This is mainly useful when the sti_key column contains multiple values
165
167
  # # which are different but do not require different code.
166
- # Employee.plugin :single_table_inheritance, :key=>:type,
167
- # :model_map=>{'staff' => "Staff",
168
- # 'manager' => "Manager",
169
- # 'overpayed staff' => "Staff",
170
- # 'underpayed staff' => "Staff"}
168
+ # Employee.plugin :single_table_inheritance, key: :type,
169
+ # model_map: {'staff' => "Staff",
170
+ # 'manager' => "Manager",
171
+ # 'overpayed staff' => "Staff",
172
+ # 'underpayed staff' => "Staff"}
171
173
  #
172
174
  # One minor issue to note is that if you specify the <tt>:key_map</tt>
173
175
  # option as a hash, instead of having it inferred from the <tt>:model_map</tt>,
@@ -183,7 +185,7 @@ module Sequel
183
185
  end
184
186
 
185
187
  # Initialize the plugin using the following options:
186
- # :alias :: Use a subquery for each subclass dataset that joins to another table,
188
+ # :alias :: Change the alias used for the subquery in model datasets.
187
189
  # using this as the alias.
188
190
  # :key :: Column symbol that holds the key that identifies the class to use.
189
191
  # Necessary if you want to call model methods on a superclass
@@ -192,34 +194,26 @@ module Sequel
192
194
  # :key_map :: Hash or proc mapping model class names to key column values.
193
195
  # Each value or return is an array of possible key column values.
194
196
  # :key_chooser :: proc returning key for the provided model instance
195
- # :table_map :: Hash with class name symbols keys mapping to table name symbol values
196
- # Overrides implicit table names
197
+ # :table_map :: Hash with class name symbols keys mapping to table name symbol values.
198
+ # Overrides implicit table names.
197
199
  def self.configure(model, opts = OPTS)
198
200
  SingleTableInheritance.configure model, opts[:key], opts
199
201
 
200
- model.instance_eval do
202
+ model.instance_exec do
201
203
  @cti_models = [self]
202
204
  @cti_tables = [table_name]
203
205
  @cti_instance_dataset = @instance_dataset
204
206
  @cti_table_columns = columns
205
207
  @cti_table_map = opts[:table_map] || {}
206
- @cti_alias = opts[:alias] # || table_name # SEQUEL5
208
+ @cti_alias = opts[:alias] || @dataset.first_source
207
209
  end
208
210
  end
209
211
 
210
212
  module ClassMethods
211
- # An array of each model in the inheritance hierarchy that uses an
213
+ # An array of each model in the inheritance hierarchy that is
212
214
  # backed by a new table.
213
215
  attr_reader :cti_models
214
216
 
215
- # The parent/root/base model for this class table inheritance hierarchy.
216
- # This is the only model in the hierarchy that loads the
217
- # class_table_inheritance plugin. For backwards compatibility.
218
- def cti_base_model
219
- Sequel::Deprecation.deprecate("#{self}.cti_base_model", "Use #{self}.cti_models.first instead")
220
- @cti_models.first
221
- end
222
-
223
217
  # An array of column symbols for the backing database table,
224
218
  # giving the columns to update in each backing database table.
225
219
  attr_reader :cti_table_columns
@@ -238,33 +232,10 @@ module Sequel
238
232
  # the implicit naming is incorrect.
239
233
  attr_reader :cti_table_map
240
234
 
241
- # Hash with table name symbol keys and arrays of column symbol values,
242
- # giving the columns to update in each backing database table.
243
- # For backwards compatibility.
244
- def cti_columns
245
- Sequel::Deprecation.deprecate("#{self}.cti_columns", "Use #{self}.cti_models to get the models, cti_table_name to get the name for the model, and cti_table_columns to get the columns for the model")
246
- h = {}
247
- cti_models.each { |m| h[m.cti_table_name] = m.cti_table_columns }
248
- h
249
- end
250
-
251
- # Alias to sti_key, for backwards compatibility.
252
- def cti_key
253
- Sequel::Deprecation.deprecate("#{self}.cti_key", "Use #{self}.sti_key instead")
254
- sti_key
255
- end
256
-
257
- # Alias to sti_model_map, for backwards compatibility.
258
- def cti_model_map
259
- Sequel::Deprecation.deprecate("#{self}.cti_model_map", "Use #{self}.sti_model_map instead")
260
- sti_model_map
261
- end
262
-
263
235
  # Freeze CTI information when freezing model class.
264
236
  def freeze
265
237
  @cti_models.freeze
266
238
  @cti_tables.freeze
267
- @cti_instance_dataset.freeze
268
239
  @cti_table_columns.freeze
269
240
  @cti_table_map.freeze
270
241
 
@@ -277,7 +248,7 @@ module Sequel
277
248
  ds = sti_dataset
278
249
 
279
250
  # Prevent inherited in model/base.rb from setting the dataset
280
- subclass.instance_eval { @dataset = nil }
251
+ subclass.instance_exec { @dataset = nil }
281
252
 
282
253
  super
283
254
 
@@ -298,27 +269,24 @@ module Sequel
298
269
  return unless table
299
270
 
300
271
  pk = primary_key
301
- subclass.instance_eval do
272
+ subclass.instance_exec do
302
273
  if cti_tables.length == 1
303
274
  ds = ds.select(*self.columns.map{|cc| Sequel.qualify(cti_table_name, Sequel.identifier(cc))})
304
275
  end
305
276
  cols = columns - [pk]
306
277
  dup_cols = cols & ds.columns
307
278
  unless dup_cols.empty?
308
- # raise Error, "class_table_inheritance with duplicate column names (other than the primary key column) is not supported, make sure tables have unique column names"
309
- Sequel::Deprecation.deprecate("Using class_table_inheritance with duplicate column names (#{n} => #{dup_cols}) in subclass tables (other than the primary key column)', 'Make sure all tables used have unique column names, or implement support for handling duplicate column names in the class_table_inheritance plugin")
279
+ raise Error, "class_table_inheritance with duplicate column names (other than the primary key column) is not supported, make sure tables have unique column names"
310
280
  end
311
281
  sel_app = cols.map{|cc| Sequel.qualify(table, Sequel.identifier(cc))}
312
282
  @sti_dataset = ds = ds.join(table, pk=>pk).select_append(*sel_app)
313
283
 
314
- if @cti_alias # SEQUEL5: remove if
315
- ds = ds.from_self(:alias=>@cti_alias)
316
- end
284
+ ds = ds.from_self(:alias=>@cti_alias)
317
285
 
318
286
  set_dataset(ds)
319
287
  set_columns(self.columns)
320
288
  @dataset = @dataset.with_row_proc(lambda{|r| subclass.sti_load(r)})
321
- cols.each{|a| define_lazy_attribute_getter(a, :dataset=>dataset, :table=>@cti_alias||table)} # SEQUEL5: remove ||table
289
+ cols.each{|a| define_lazy_attribute_getter(a, :dataset=>dataset, :table=>@cti_alias)}
322
290
 
323
291
  @cti_models += [self]
324
292
  @cti_tables += [table]
@@ -333,12 +301,8 @@ module Sequel
333
301
 
334
302
  # The table name for the current model class's main table.
335
303
  def table_name
336
- if cti_tables
337
- if @cti_alias # SEQUEL5: remove if
338
- @cti_alias
339
- else
340
- cti_tables.last
341
- end
304
+ if cti_tables && cti_tables.length > 1
305
+ @cti_alias
342
306
  else
343
307
  super
344
308
  end
@@ -360,7 +324,7 @@ module Sequel
360
324
  # when setting subclass dataset.
361
325
  def sti_subclass_dataset(key)
362
326
  ds = super
363
- if @cti_alias && cti_models[0] != self # SEQUEL5: remove @cti_alias
327
+ if cti_models[0] != self
364
328
  ds = ds.from_self(:alias=>@cti_alias)
365
329
  end
366
330
  ds
@@ -383,14 +347,8 @@ module Sequel
383
347
  false
384
348
  end
385
349
 
386
- private
387
-
388
- def cti_this(model)
389
- use_server(model.cti_instance_dataset.where(model.primary_key_hash(pk)))
390
- end
391
-
392
350
  # Set the sti_key column based on the sti_key_map.
393
- def _before_validation
351
+ def before_validation
394
352
  if new? && (set = self[model.sti_key])
395
353
  exp = model.sti_key_chooser.call(self)
396
354
  if set != exp
@@ -402,6 +360,12 @@ module Sequel
402
360
  super
403
361
  end
404
362
 
363
+ private
364
+
365
+ def cti_this(model)
366
+ use_server(model.cti_instance_dataset.where(model.primary_key_hash(pk)))
367
+ end
368
+
405
369
  # Insert rows into all backing tables, using the columns
406
370
  # in each table.
407
371
  def _insert
@@ -422,10 +386,15 @@ module Sequel
422
386
 
423
387
  # Update rows in all backing tables, using the columns in each table.
424
388
  def _update(columns)
389
+ return super if model.cti_models[0] == model
425
390
  model.cti_models.each do |m|
426
391
  h = {}
427
392
  m.cti_table_columns.each{|c| h[c] = columns[c] if columns.include?(c)}
428
- cti_this(m).update(h) unless h.empty?
393
+ unless h.empty?
394
+ ds = cti_this(m)
395
+ n = ds.update(h)
396
+ raise(NoExistingObject, "Attempt to update object did not result in a single row modification (SQL: #{ds.update_sql(h)})") if require_modification && n != 1
397
+ end
429
398
  end
430
399
  end
431
400
  end
@@ -30,7 +30,7 @@ module Sequel
30
30
  # Album.plugin :column_conflicts
31
31
  module ColumnConflicts
32
32
  def self.apply(model)
33
- model.instance_eval do
33
+ model.instance_exec do
34
34
  @get_column_conflicts = {}
35
35
  @set_column_conflicts = {}
36
36
  end
@@ -38,7 +38,7 @@ module Sequel
38
38
 
39
39
  # Check for column conflicts on the current model if the model has a dataset.
40
40
  def self.configure(model)
41
- model.instance_eval do
41
+ model.instance_exec do
42
42
  check_column_conflicts if @dataset
43
43
  end
44
44
  end
@@ -28,7 +28,7 @@ module Sequel
28
28
  # Modify the current model's dataset selection, if the model
29
29
  # has a dataset.
30
30
  def self.configure(model)
31
- model.instance_eval do
31
+ model.instance_exec do
32
32
  self.dataset = dataset if @dataset
33
33
  end
34
34
  end
@@ -41,7 +41,7 @@ module Sequel
41
41
  # qualifying them with table's name.
42
42
  def convert_input_dataset(ds)
43
43
  ds = super
44
- if !ds.opts[:select] && (from = ds.opts[:from]) && from.length == 1 && !ds.opts[:join] # SEQUE5: just !ds.opts[:select]
44
+ unless ds.opts[:select]
45
45
  if db.supports_schema_parsing?
46
46
  cols = check_non_connection_error(false){db.schema(ds)}
47
47
  if cols
@@ -12,7 +12,7 @@ module Sequel
12
12
  # This can be handled with:
13
13
  #
14
14
  # Album.plugin :composition
15
- # Album.composition :date, :mapping=>[:year, :month, :day]
15
+ # Album.composition :date, mapping: [:year, :month, :day]
16
16
  #
17
17
  # With the :mapping option, you can provide a :class option
18
18
  # that gives the class to use, but if that is not provided, it
@@ -32,9 +32,9 @@ module Sequel
32
32
  #
33
33
  # The :mapping option is just a shortcut that works in particular
34
34
  # cases. To handle any case, you can define a custom :composer
35
- # and :decomposer procs. The :composer proc will be instance_evaled
35
+ # and :decomposer procs. The :composer proc will be instance_execed
36
36
  # the first time the getter is called, and the :decomposer proc
37
- # will be instance_evaled before saving. The above example could
37
+ # will be instance_execed before saving. The above example could
38
38
  # also be implemented as:
39
39
  #
40
40
  # Album.composition :date,
@@ -58,7 +58,7 @@ module Sequel
58
58
  module Composition
59
59
  # Define the necessary class instance variables.
60
60
  def self.apply(model)
61
- model.instance_eval do
61
+ model.instance_exec do
62
62
  @compositions = {}
63
63
  include(@composition_module ||= Module.new)
64
64
  end
@@ -69,23 +69,14 @@ module Sequel
69
69
  # hash values.
70
70
  attr_reader :compositions
71
71
 
72
- def composition_module
73
- Sequel::Deprecation.deprecate('Sequel::Model.composition_module', 'There is no replacement')
74
- @composition_module
75
- end
76
- def composition_module=(v)
77
- Sequel::Deprecation.deprecate('Sequel::Model.composition_module=', 'There is no replacement')
78
- @composition_module = v
79
- end
80
-
81
72
  # Define a composition for this model, with name being the name of the composition.
82
73
  # You must provide either a :mapping option or both the :composer and :decomposer options.
83
74
  #
84
75
  # Options:
85
76
  # :class :: if using the :mapping option, the class to use, as a Class, String or Symbol.
86
- # :composer :: A proc that is instance evaled when the composition getter method is called
77
+ # :composer :: A proc that is instance_execed when the composition getter method is called
87
78
  # to create the composition.
88
- # :decomposer :: A proc that is instance evaled before saving the model object,
79
+ # :decomposer :: A proc that is instance_execed before saving the model object,
89
80
  # if the composition object exists, which sets the columns in the model object
90
81
  # based on the value of the composition object.
91
82
  # :mapping :: An array where each element is either a symbol or an array of two symbols.
@@ -94,12 +85,12 @@ module Sequel
94
85
  # represents the getter method in the composition object. Example:
95
86
  # # Uses columns year, month, and day in the current model
96
87
  # # Uses year, month, and day methods in the composition object
97
- # {:mapping=>[:year, :month, :day]}
88
+ # {mapping: [:year, :month, :day]}
98
89
  # # Uses columns year, month, and day in the current model
99
90
  # # Uses y, m, and d methods in the composition object where
100
91
  # # for example y in the composition object represents year
101
92
  # # in the model object.
102
- # {:mapping=>[[:year, :y], [:month, :m], [:day, :d]]}
93
+ # {mapping: [[:year, :y], [:month, :m], [:day, :d]]}
103
94
  def composition(name, opts=OPTS)
104
95
  opts = opts.dup
105
96
  compositions[name] = opts
@@ -125,7 +116,7 @@ module Sequel
125
116
  if (o = compositions[name]).nil?
126
117
  setter_meths.each{|sm| set_column_value(sm, nil)}
127
118
  else
128
- setters.each{|sm, cm| set_column_value(sm, o.send(cm))}
119
+ setters.each{|sm, cm| set_column_value(sm, o.public_send(cm))}
129
120
  end
130
121
  end
131
122
  end
@@ -144,9 +135,9 @@ module Sequel
144
135
  if compositions.has_key?(name)
145
136
  compositions[name]
146
137
  elsif frozen?
147
- instance_eval(&composer)
138
+ instance_exec(&composer)
148
139
  else
149
- compositions[name] = instance_eval(&composer)
140
+ compositions[name] = instance_exec(&composer)
150
141
  end
151
142
  end
152
143
  define_method("#{name}=") do |v|
@@ -177,15 +168,15 @@ module Sequel
177
168
  super
178
169
  end
179
170
 
180
- private
181
-
182
171
  # For each composition, set the columns in the model class based
183
172
  # on the composition object.
184
- def _before_validation
185
- @compositions.keys.each{|n| instance_eval(&model.compositions[n][:decomposer])} if @compositions
173
+ def before_validation
174
+ @compositions.keys.each{|n| instance_exec(&model.compositions[n][:decomposer])} if @compositions
186
175
  super
187
176
  end
188
177
 
178
+ private
179
+
189
180
  # Clear the cached compositions when manually refreshing.
190
181
  def _refresh_set_values(hash)
191
182
  @compositions.clear if @compositions