activerecord 5.0.7.2 → 6.0.6.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activerecord might be problematic. Click here for more details.

Files changed (359) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +844 -1944
  3. data/MIT-LICENSE +3 -1
  4. data/README.rdoc +9 -7
  5. data/examples/performance.rb +31 -29
  6. data/examples/simple.rb +5 -3
  7. data/lib/active_record/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +249 -247
  9. data/lib/active_record/association_relation.rb +18 -14
  10. data/lib/active_record/associations/alias_tracker.rb +24 -34
  11. data/lib/active_record/associations/association.rb +113 -55
  12. data/lib/active_record/associations/association_scope.rb +102 -96
  13. data/lib/active_record/associations/belongs_to_association.rb +58 -42
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +18 -25
  16. data/lib/active_record/associations/builder/belongs_to.rb +43 -54
  17. data/lib/active_record/associations/builder/collection_association.rb +7 -18
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +41 -62
  19. data/lib/active_record/associations/builder/has_many.rb +4 -0
  20. data/lib/active_record/associations/builder/has_one.rb +37 -1
  21. data/lib/active_record/associations/builder/singular_association.rb +4 -0
  22. data/lib/active_record/associations/collection_association.rb +93 -254
  23. data/lib/active_record/associations/collection_proxy.rb +159 -122
  24. data/lib/active_record/associations/foreign_association.rb +9 -0
  25. data/lib/active_record/associations/has_many_association.rb +23 -30
  26. data/lib/active_record/associations/has_many_through_association.rb +58 -44
  27. data/lib/active_record/associations/has_one_association.rb +59 -54
  28. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  29. data/lib/active_record/associations/join_dependency/join_association.rb +43 -85
  30. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  31. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  32. data/lib/active_record/associations/join_dependency.rb +152 -177
  33. data/lib/active_record/associations/preloader/association.rb +101 -97
  34. data/lib/active_record/associations/preloader/through_association.rb +77 -76
  35. data/lib/active_record/associations/preloader.rb +94 -103
  36. data/lib/active_record/associations/singular_association.rb +12 -45
  37. data/lib/active_record/associations/through_association.rb +27 -15
  38. data/lib/active_record/associations.rb +1603 -1592
  39. data/lib/active_record/attribute_assignment.rb +54 -61
  40. data/lib/active_record/attribute_decorators.rb +38 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +12 -8
  42. data/lib/active_record/attribute_methods/dirty.rb +179 -109
  43. data/lib/active_record/attribute_methods/primary_key.rb +85 -92
  44. data/lib/active_record/attribute_methods/query.rb +4 -3
  45. data/lib/active_record/attribute_methods/read.rb +20 -49
  46. data/lib/active_record/attribute_methods/serialization.rb +29 -7
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +39 -66
  48. data/lib/active_record/attribute_methods/write.rb +34 -33
  49. data/lib/active_record/attribute_methods.rb +66 -106
  50. data/lib/active_record/attributes.rb +38 -25
  51. data/lib/active_record/autosave_association.rb +58 -39
  52. data/lib/active_record/base.rb +27 -24
  53. data/lib/active_record/callbacks.rb +64 -35
  54. data/lib/active_record/coders/json.rb +2 -0
  55. data/lib/active_record/coders/yaml_column.rb +34 -13
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +558 -323
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +23 -5
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +215 -94
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +59 -35
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +128 -75
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +2 -0
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +33 -28
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +233 -147
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +68 -80
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +400 -213
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +169 -79
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +373 -202
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +401 -562
  69. data/lib/active_record/connection_adapters/column.rb +41 -13
  70. data/lib/active_record/connection_adapters/connection_specification.rb +172 -139
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +11 -4
  72. data/lib/active_record/connection_adapters/mysql/column.rb +8 -31
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +137 -49
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +24 -23
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +50 -20
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +49 -45
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +58 -56
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +70 -36
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +268 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +12 -13
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +48 -30
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +19 -31
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +64 -54
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +5 -3
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +22 -11
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +6 -5
  87. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +2 -0
  88. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +2 -0
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +3 -1
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +23 -0
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +12 -2
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +5 -4
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +19 -18
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  97. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -5
  99. data/lib/active_record/connection_adapters/postgresql/oid/{json.rb → oid.rb} +6 -1
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +30 -9
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +52 -30
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  103. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +58 -54
  104. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +8 -4
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +2 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +2 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +24 -21
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +95 -35
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +20 -26
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +147 -105
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +34 -32
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +378 -308
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +26 -25
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +9 -6
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +383 -275
  117. data/lib/active_record/connection_adapters/schema_cache.rb +46 -12
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +13 -8
  119. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +119 -0
  120. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +3 -1
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +72 -18
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +3 -8
  123. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +137 -0
  126. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +261 -267
  127. data/lib/active_record/connection_adapters/statement_pool.rb +9 -8
  128. data/lib/active_record/connection_handling.rb +143 -40
  129. data/lib/active_record/core.rb +207 -160
  130. data/lib/active_record/counter_cache.rb +60 -28
  131. data/lib/active_record/database_configurations/database_config.rb +37 -0
  132. data/lib/active_record/database_configurations/hash_config.rb +50 -0
  133. data/lib/active_record/database_configurations/url_config.rb +78 -0
  134. data/lib/active_record/database_configurations.rb +233 -0
  135. data/lib/active_record/define_callbacks.rb +22 -0
  136. data/lib/active_record/dynamic_matchers.rb +87 -87
  137. data/lib/active_record/enum.rb +67 -23
  138. data/lib/active_record/errors.rb +114 -18
  139. data/lib/active_record/explain.rb +4 -4
  140. data/lib/active_record/explain_registry.rb +3 -1
  141. data/lib/active_record/explain_subscriber.rb +9 -4
  142. data/lib/active_record/fixture_set/file.rb +13 -8
  143. data/lib/active_record/fixture_set/model_metadata.rb +33 -0
  144. data/lib/active_record/fixture_set/render_context.rb +17 -0
  145. data/lib/active_record/fixture_set/table_row.rb +152 -0
  146. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  147. data/lib/active_record/fixtures.rb +194 -504
  148. data/lib/active_record/gem_version.rb +5 -3
  149. data/lib/active_record/inheritance.rb +150 -99
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +116 -25
  152. data/lib/active_record/internal_metadata.rb +16 -19
  153. data/lib/active_record/legacy_yaml_adapter.rb +4 -2
  154. data/lib/active_record/locking/optimistic.rb +85 -86
  155. data/lib/active_record/locking/pessimistic.rb +18 -6
  156. data/lib/active_record/log_subscriber.rb +48 -29
  157. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  158. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  159. data/lib/active_record/middleware/database_selector.rb +74 -0
  160. data/lib/active_record/migration/command_recorder.rb +134 -100
  161. data/lib/active_record/migration/compatibility.rb +174 -56
  162. data/lib/active_record/migration/join_table.rb +8 -7
  163. data/lib/active_record/migration.rb +369 -302
  164. data/lib/active_record/model_schema.rb +160 -127
  165. data/lib/active_record/nested_attributes.rb +213 -202
  166. data/lib/active_record/no_touching.rb +12 -3
  167. data/lib/active_record/null_relation.rb +12 -34
  168. data/lib/active_record/persistence.rb +446 -77
  169. data/lib/active_record/query_cache.rb +13 -12
  170. data/lib/active_record/querying.rb +37 -24
  171. data/lib/active_record/railtie.rb +128 -36
  172. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  173. data/lib/active_record/railties/console_sandbox.rb +2 -0
  174. data/lib/active_record/railties/controller_runtime.rb +34 -33
  175. data/lib/active_record/railties/databases.rake +312 -177
  176. data/lib/active_record/readonly_attributes.rb +5 -4
  177. data/lib/active_record/reflection.rb +214 -254
  178. data/lib/active_record/relation/batches/batch_enumerator.rb +3 -1
  179. data/lib/active_record/relation/batches.rb +98 -52
  180. data/lib/active_record/relation/calculations.rb +212 -173
  181. data/lib/active_record/relation/delegation.rb +73 -69
  182. data/lib/active_record/relation/finder_methods.rb +207 -247
  183. data/lib/active_record/relation/from_clause.rb +6 -8
  184. data/lib/active_record/relation/merger.rb +82 -61
  185. data/lib/active_record/relation/predicate_builder/array_handler.rb +20 -14
  186. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  187. data/lib/active_record/relation/predicate_builder/base_handler.rb +4 -3
  188. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +6 -4
  189. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  190. data/lib/active_record/relation/predicate_builder/range_handler.rb +7 -18
  191. data/lib/active_record/relation/predicate_builder/relation_handler.rb +6 -0
  192. data/lib/active_record/relation/predicate_builder.rb +83 -105
  193. data/lib/active_record/relation/query_attribute.rb +33 -2
  194. data/lib/active_record/relation/query_methods.rb +488 -332
  195. data/lib/active_record/relation/record_fetch_warning.rb +5 -3
  196. data/lib/active_record/relation/spawn_methods.rb +8 -8
  197. data/lib/active_record/relation/where_clause.rb +111 -96
  198. data/lib/active_record/relation/where_clause_factory.rb +6 -11
  199. data/lib/active_record/relation.rb +443 -318
  200. data/lib/active_record/result.rb +69 -40
  201. data/lib/active_record/runtime_registry.rb +5 -3
  202. data/lib/active_record/sanitization.rb +83 -99
  203. data/lib/active_record/schema.rb +7 -14
  204. data/lib/active_record/schema_dumper.rb +71 -69
  205. data/lib/active_record/schema_migration.rb +16 -6
  206. data/lib/active_record/scoping/default.rb +92 -95
  207. data/lib/active_record/scoping/named.rb +51 -26
  208. data/lib/active_record/scoping.rb +20 -20
  209. data/lib/active_record/secure_token.rb +4 -2
  210. data/lib/active_record/serialization.rb +2 -0
  211. data/lib/active_record/statement_cache.rb +63 -28
  212. data/lib/active_record/store.rb +121 -41
  213. data/lib/active_record/suppressor.rb +6 -3
  214. data/lib/active_record/table_metadata.rb +39 -18
  215. data/lib/active_record/tasks/database_tasks.rb +271 -81
  216. data/lib/active_record/tasks/mysql_database_tasks.rb +54 -91
  217. data/lib/active_record/tasks/postgresql_database_tasks.rb +77 -47
  218. data/lib/active_record/tasks/sqlite_database_tasks.rb +33 -16
  219. data/lib/active_record/test_databases.rb +23 -0
  220. data/lib/active_record/test_fixtures.rb +243 -0
  221. data/lib/active_record/timestamp.rb +70 -36
  222. data/lib/active_record/touch_later.rb +8 -6
  223. data/lib/active_record/transactions.rb +141 -157
  224. data/lib/active_record/translation.rb +3 -1
  225. data/lib/active_record/type/adapter_specific_registry.rb +44 -48
  226. data/lib/active_record/type/date.rb +2 -0
  227. data/lib/active_record/type/date_time.rb +2 -0
  228. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  229. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  230. data/lib/active_record/type/internal/timezone.rb +2 -0
  231. data/lib/active_record/type/json.rb +30 -0
  232. data/lib/active_record/type/serialized.rb +16 -9
  233. data/lib/active_record/type/text.rb +11 -0
  234. data/lib/active_record/type/time.rb +12 -1
  235. data/lib/active_record/type/type_map.rb +14 -17
  236. data/lib/active_record/type/unsigned_integer.rb +16 -0
  237. data/lib/active_record/type.rb +23 -18
  238. data/lib/active_record/type_caster/connection.rb +17 -12
  239. data/lib/active_record/type_caster/map.rb +5 -4
  240. data/lib/active_record/type_caster.rb +4 -2
  241. data/lib/active_record/validations/absence.rb +2 -0
  242. data/lib/active_record/validations/associated.rb +3 -2
  243. data/lib/active_record/validations/length.rb +2 -0
  244. data/lib/active_record/validations/presence.rb +4 -2
  245. data/lib/active_record/validations/uniqueness.rb +29 -42
  246. data/lib/active_record/validations.rb +7 -5
  247. data/lib/active_record/version.rb +3 -1
  248. data/lib/active_record.rb +37 -22
  249. data/lib/arel/alias_predication.rb +9 -0
  250. data/lib/arel/attributes/attribute.rb +37 -0
  251. data/lib/arel/attributes.rb +22 -0
  252. data/lib/arel/collectors/bind.rb +24 -0
  253. data/lib/arel/collectors/composite.rb +31 -0
  254. data/lib/arel/collectors/plain_string.rb +20 -0
  255. data/lib/arel/collectors/sql_string.rb +20 -0
  256. data/lib/arel/collectors/substitute_binds.rb +28 -0
  257. data/lib/arel/crud.rb +42 -0
  258. data/lib/arel/delete_manager.rb +18 -0
  259. data/lib/arel/errors.rb +9 -0
  260. data/lib/arel/expressions.rb +29 -0
  261. data/lib/arel/factory_methods.rb +49 -0
  262. data/lib/arel/insert_manager.rb +49 -0
  263. data/lib/arel/math.rb +45 -0
  264. data/lib/arel/nodes/and.rb +32 -0
  265. data/lib/arel/nodes/ascending.rb +23 -0
  266. data/lib/arel/nodes/binary.rb +52 -0
  267. data/lib/arel/nodes/bind_param.rb +36 -0
  268. data/lib/arel/nodes/case.rb +55 -0
  269. data/lib/arel/nodes/casted.rb +50 -0
  270. data/lib/arel/nodes/comment.rb +29 -0
  271. data/lib/arel/nodes/count.rb +12 -0
  272. data/lib/arel/nodes/delete_statement.rb +45 -0
  273. data/lib/arel/nodes/descending.rb +23 -0
  274. data/lib/arel/nodes/equality.rb +18 -0
  275. data/lib/arel/nodes/extract.rb +24 -0
  276. data/lib/arel/nodes/false.rb +16 -0
  277. data/lib/arel/nodes/full_outer_join.rb +8 -0
  278. data/lib/arel/nodes/function.rb +44 -0
  279. data/lib/arel/nodes/grouping.rb +8 -0
  280. data/lib/arel/nodes/in.rb +8 -0
  281. data/lib/arel/nodes/infix_operation.rb +80 -0
  282. data/lib/arel/nodes/inner_join.rb +8 -0
  283. data/lib/arel/nodes/insert_statement.rb +37 -0
  284. data/lib/arel/nodes/join_source.rb +20 -0
  285. data/lib/arel/nodes/matches.rb +18 -0
  286. data/lib/arel/nodes/named_function.rb +23 -0
  287. data/lib/arel/nodes/node.rb +50 -0
  288. data/lib/arel/nodes/node_expression.rb +13 -0
  289. data/lib/arel/nodes/outer_join.rb +8 -0
  290. data/lib/arel/nodes/over.rb +15 -0
  291. data/lib/arel/nodes/regexp.rb +16 -0
  292. data/lib/arel/nodes/right_outer_join.rb +8 -0
  293. data/lib/arel/nodes/select_core.rb +67 -0
  294. data/lib/arel/nodes/select_statement.rb +41 -0
  295. data/lib/arel/nodes/sql_literal.rb +16 -0
  296. data/lib/arel/nodes/string_join.rb +11 -0
  297. data/lib/arel/nodes/table_alias.rb +27 -0
  298. data/lib/arel/nodes/terminal.rb +16 -0
  299. data/lib/arel/nodes/true.rb +16 -0
  300. data/lib/arel/nodes/unary.rb +45 -0
  301. data/lib/arel/nodes/unary_operation.rb +20 -0
  302. data/lib/arel/nodes/unqualified_column.rb +22 -0
  303. data/lib/arel/nodes/update_statement.rb +41 -0
  304. data/lib/arel/nodes/values_list.rb +9 -0
  305. data/lib/arel/nodes/window.rb +126 -0
  306. data/lib/arel/nodes/with.rb +11 -0
  307. data/lib/arel/nodes.rb +68 -0
  308. data/lib/arel/order_predications.rb +13 -0
  309. data/lib/arel/predications.rb +256 -0
  310. data/lib/arel/select_manager.rb +271 -0
  311. data/lib/arel/table.rb +110 -0
  312. data/lib/arel/tree_manager.rb +72 -0
  313. data/lib/arel/update_manager.rb +34 -0
  314. data/lib/arel/visitors/depth_first.rb +203 -0
  315. data/lib/arel/visitors/dot.rb +296 -0
  316. data/lib/arel/visitors/ibm_db.rb +34 -0
  317. data/lib/arel/visitors/informix.rb +62 -0
  318. data/lib/arel/visitors/mssql.rb +156 -0
  319. data/lib/arel/visitors/mysql.rb +83 -0
  320. data/lib/arel/visitors/oracle.rb +158 -0
  321. data/lib/arel/visitors/oracle12.rb +65 -0
  322. data/lib/arel/visitors/postgresql.rb +109 -0
  323. data/lib/arel/visitors/sqlite.rb +38 -0
  324. data/lib/arel/visitors/to_sql.rb +888 -0
  325. data/lib/arel/visitors/visitor.rb +45 -0
  326. data/lib/arel/visitors/where_sql.rb +22 -0
  327. data/lib/arel/visitors.rb +20 -0
  328. data/lib/arel/window_predications.rb +9 -0
  329. data/lib/arel.rb +62 -0
  330. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  331. data/lib/rails/generators/active_record/migration/migration_generator.rb +37 -35
  332. data/lib/rails/generators/active_record/migration/templates/{create_table_migration.rb → create_table_migration.rb.tt} +1 -1
  333. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +4 -2
  334. data/lib/rails/generators/active_record/migration.rb +17 -3
  335. data/lib/rails/generators/active_record/model/model_generator.rb +9 -30
  336. data/lib/rails/generators/active_record/model/templates/{model.rb → model.rb.tt} +10 -1
  337. data/lib/rails/generators/active_record.rb +7 -5
  338. metadata +138 -52
  339. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  340. data/lib/active_record/associations/preloader/collection_association.rb +0 -17
  341. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  342. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  343. data/lib/active_record/associations/preloader/has_one.rb +0 -15
  344. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  345. data/lib/active_record/associations/preloader/singular_association.rb +0 -20
  346. data/lib/active_record/attribute/user_provided_default.rb +0 -28
  347. data/lib/active_record/attribute.rb +0 -213
  348. data/lib/active_record/attribute_mutation_tracker.rb +0 -70
  349. data/lib/active_record/attribute_set/builder.rb +0 -132
  350. data/lib/active_record/attribute_set.rb +0 -110
  351. data/lib/active_record/collection_cache_key.rb +0 -50
  352. data/lib/active_record/connection_adapters/postgresql/oid/rails_5_1_point.rb +0 -50
  353. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  354. data/lib/active_record/relation/predicate_builder/association_query_handler.rb +0 -88
  355. data/lib/active_record/relation/predicate_builder/class_handler.rb +0 -27
  356. data/lib/active_record/relation/predicate_builder/polymorphic_array_handler.rb +0 -57
  357. data/lib/active_record/type/internal/abstract_json.rb +0 -33
  358. /data/lib/rails/generators/active_record/{model/templates/application_record.rb → application_record/templates/application_record.rb.tt} +0 -0
  359. /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,7 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  class LogSubscriber < ActiveSupport::LogSubscriber
3
5
  IGNORE_PAYLOAD_NAMES = ["SCHEMA", "EXPLAIN"]
4
6
 
7
+ class_attribute :backtrace_cleaner, default: ActiveSupport::BacktraceCleaner.new
8
+
5
9
  def self.runtime=(value)
6
10
  ActiveRecord::RuntimeRegistry.sql_runtime = value
7
11
  end
@@ -15,11 +19,6 @@ module ActiveRecord
15
19
  rt
16
20
  end
17
21
 
18
- def initialize
19
- super
20
- @odd = false
21
- end
22
-
23
22
  def sql(event)
24
23
  self.class.runtime += event.duration
25
24
  return unless logger.debug?
@@ -29,6 +28,7 @@ module ActiveRecord
29
28
  return if IGNORE_PAYLOAD_NAMES.include?(payload[:name])
30
29
 
31
30
  name = "#{payload[:name]} (#{event.duration.round(1)}ms)"
31
+ name = "CACHE #{name}" if payload[:cached]
32
32
  sql = payload[:sql]
33
33
  binds = nil
34
34
 
@@ -40,37 +40,36 @@ module ActiveRecord
40
40
  end
41
41
 
42
42
  name = colorize_payload_name(name, payload[:name])
43
- sql = color(sql, sql_color(sql), true)
43
+ sql = color(sql, sql_color(sql), true) if colorize_logging
44
44
 
45
45
  debug " #{name} #{sql}#{binds}"
46
46
  end
47
47
 
48
48
  private
49
+ def type_casted_binds(casted_binds)
50
+ casted_binds.respond_to?(:call) ? casted_binds.call : casted_binds
51
+ end
49
52
 
50
- def type_casted_binds(casted_binds)
51
- casted_binds.respond_to?(:call) ? casted_binds.call : casted_binds
52
- end
53
+ def render_bind(attr, value)
54
+ if attr.is_a?(Array)
55
+ attr = attr.first
56
+ elsif attr.type.binary? && attr.value
57
+ value = "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
58
+ end
53
59
 
54
- def render_bind(attr, value)
55
- if attr.is_a?(Array)
56
- attr = attr.first
57
- elsif attr.type.binary? && attr.value
58
- value = "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
60
+ [attr && attr.name, value]
59
61
  end
60
62
 
61
- [attr && attr.name, value]
62
- end
63
-
64
- def colorize_payload_name(name, payload_name)
65
- if payload_name.blank? || payload_name == "SQL" # SQL vs Model Load/Exists
66
- color(name, MAGENTA, true)
67
- else
68
- color(name, CYAN, true)
63
+ def colorize_payload_name(name, payload_name)
64
+ if payload_name.blank? || payload_name == "SQL" # SQL vs Model Load/Exists
65
+ color(name, MAGENTA, true)
66
+ else
67
+ color(name, CYAN, true)
68
+ end
69
69
  end
70
- end
71
70
 
72
- def sql_color(sql)
73
- case sql
71
+ def sql_color(sql)
72
+ case sql
74
73
  when /\A\s*rollback/mi
75
74
  RED
76
75
  when /select .*for update/mi, /\A\s*lock/mi
@@ -87,12 +86,32 @@ module ActiveRecord
87
86
  CYAN
88
87
  else
89
88
  MAGENTA
89
+ end
90
90
  end
91
- end
92
91
 
93
- def logger
94
- ActiveRecord::Base.logger
95
- end
92
+ def logger
93
+ ActiveRecord::Base.logger
94
+ end
95
+
96
+ def debug(progname = nil, &block)
97
+ return unless super
98
+
99
+ if ActiveRecord::Base.verbose_query_logs
100
+ log_query_source
101
+ end
102
+ end
103
+
104
+ def log_query_source
105
+ source = extract_query_source_location(caller)
106
+
107
+ if source
108
+ logger.debug(" ↳ #{source}")
109
+ end
110
+ end
111
+
112
+ def extract_query_source_location(locations)
113
+ backtrace_cleaner.clean(locations.lazy).first
114
+ end
96
115
  end
97
116
  end
98
117
 
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ module Middleware
5
+ class DatabaseSelector
6
+ class Resolver
7
+ # The session class is used by the DatabaseSelector::Resolver to save
8
+ # timestamps of the last write in the session.
9
+ #
10
+ # The last_write is used to determine whether it's safe to read
11
+ # from the replica or the request needs to be sent to the primary.
12
+ class Session # :nodoc:
13
+ def self.call(request)
14
+ new(request.session)
15
+ end
16
+
17
+ # Converts time to a timestamp that represents milliseconds since
18
+ # epoch.
19
+ def self.convert_time_to_timestamp(time)
20
+ time.to_i * 1000 + time.usec / 1000
21
+ end
22
+
23
+ # Converts milliseconds since epoch timestamp into a time object.
24
+ def self.convert_timestamp_to_time(timestamp)
25
+ timestamp ? Time.at(timestamp / 1000, (timestamp % 1000) * 1000) : Time.at(0)
26
+ end
27
+
28
+ def initialize(session)
29
+ @session = session
30
+ end
31
+
32
+ attr_reader :session
33
+
34
+ def last_write_timestamp
35
+ self.class.convert_timestamp_to_time(session[:last_write])
36
+ end
37
+
38
+ def update_last_write_timestamp
39
+ session[:last_write] = self.class.convert_time_to_timestamp(Time.now)
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/middleware/database_selector/resolver/session"
4
+
5
+ module ActiveRecord
6
+ module Middleware
7
+ class DatabaseSelector
8
+ # The Resolver class is used by the DatabaseSelector middleware to
9
+ # determine which database the request should use.
10
+ #
11
+ # To change the behavior of the Resolver class in your application,
12
+ # create a custom resolver class that inherits from
13
+ # DatabaseSelector::Resolver and implements the methods that need to
14
+ # be changed.
15
+ #
16
+ # By default the Resolver class will send read traffic to the replica
17
+ # if it's been 2 seconds since the last write.
18
+ class Resolver # :nodoc:
19
+ SEND_TO_REPLICA_DELAY = 2.seconds
20
+
21
+ def self.call(context, options = {})
22
+ new(context, options)
23
+ end
24
+
25
+ def initialize(context, options = {})
26
+ @context = context
27
+ @options = options
28
+ @delay = @options && @options[:delay] ? @options[:delay] : SEND_TO_REPLICA_DELAY
29
+ @instrumenter = ActiveSupport::Notifications.instrumenter
30
+ end
31
+
32
+ attr_reader :context, :delay, :instrumenter
33
+
34
+ def read(&blk)
35
+ if read_from_primary?
36
+ read_from_primary(&blk)
37
+ else
38
+ read_from_replica(&blk)
39
+ end
40
+ end
41
+
42
+ def write(&blk)
43
+ write_to_primary(&blk)
44
+ end
45
+
46
+ private
47
+ def read_from_primary(&blk)
48
+ ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role, prevent_writes: true) do
49
+ instrumenter.instrument("database_selector.active_record.read_from_primary") do
50
+ yield
51
+ end
52
+ end
53
+ end
54
+
55
+ def read_from_replica(&blk)
56
+ ActiveRecord::Base.connected_to(role: ActiveRecord::Base.reading_role, prevent_writes: true) do
57
+ instrumenter.instrument("database_selector.active_record.read_from_replica") do
58
+ yield
59
+ end
60
+ end
61
+ end
62
+
63
+ def write_to_primary(&blk)
64
+ ActiveRecord::Base.connected_to(role: ActiveRecord::Base.writing_role, prevent_writes: false) do
65
+ instrumenter.instrument("database_selector.active_record.wrote_to_primary") do
66
+ yield
67
+ ensure
68
+ context.update_last_write_timestamp
69
+ end
70
+ end
71
+ end
72
+
73
+ def read_from_primary?
74
+ !time_since_last_write_ok?
75
+ end
76
+
77
+ def send_to_replica_delay
78
+ delay
79
+ end
80
+
81
+ def time_since_last_write_ok?
82
+ Time.now - context.last_write_timestamp >= send_to_replica_delay
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/middleware/database_selector/resolver"
4
+
5
+ module ActiveRecord
6
+ module Middleware
7
+ # The DatabaseSelector Middleware provides a framework for automatically
8
+ # swapping from the primary to the replica database connection. Rails
9
+ # provides a basic framework to determine when to swap and allows for
10
+ # applications to write custom strategy classes to override the default
11
+ # behavior.
12
+ #
13
+ # The resolver class defines when the application should switch (i.e. read
14
+ # from the primary if a write occurred less than 2 seconds ago) and a
15
+ # resolver context class that sets a value that helps the resolver class
16
+ # decide when to switch.
17
+ #
18
+ # Rails default middleware uses the request's session to set a timestamp
19
+ # that informs the application when to read from a primary or read from a
20
+ # replica.
21
+ #
22
+ # To use the DatabaseSelector in your application with default settings add
23
+ # the following options to your environment config:
24
+ #
25
+ # config.active_record.database_selector = { delay: 2.seconds }
26
+ # config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
27
+ # config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
28
+ #
29
+ # New applications will include these lines commented out in the production.rb.
30
+ #
31
+ # The default behavior can be changed by setting the config options to a
32
+ # custom class:
33
+ #
34
+ # config.active_record.database_selector = { delay: 2.seconds }
35
+ # config.active_record.database_resolver = MyResolver
36
+ # config.active_record.database_resolver_context = MyResolver::MySession
37
+ class DatabaseSelector
38
+ def initialize(app, resolver_klass = nil, context_klass = nil, options = {})
39
+ @app = app
40
+ @resolver_klass = resolver_klass || Resolver
41
+ @context_klass = context_klass || Resolver::Session
42
+ @options = options
43
+ end
44
+
45
+ attr_reader :resolver_klass, :context_klass, :options
46
+
47
+ # Middleware that determines which database connection to use in a multiple
48
+ # database application.
49
+ def call(env)
50
+ request = ActionDispatch::Request.new(env)
51
+
52
+ select_database(request) do
53
+ @app.call(env)
54
+ end
55
+ end
56
+
57
+ private
58
+ def select_database(request, &blk)
59
+ context = context_klass.call(request)
60
+ resolver = resolver_klass.call(context, options)
61
+
62
+ if reading_request?(request)
63
+ resolver.read(&blk)
64
+ else
65
+ resolver.write(&blk)
66
+ end
67
+ end
68
+
69
+ def reading_request?(request)
70
+ request.get? || request.head?
71
+ end
72
+ end
73
+ end
74
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module ActiveRecord
2
4
  class Migration
3
5
  # <tt>ActiveRecord::Migration::CommandRecorder</tt> records commands done during
@@ -12,6 +14,8 @@ module ActiveRecord
12
14
  # * change_column
13
15
  # * change_column_default (must supply a :from and :to option)
14
16
  # * change_column_null
17
+ # * change_column_comment (must supply a :from and :to option)
18
+ # * change_table_comment (must supply a :from and :to option)
15
19
  # * create_join_table
16
20
  # * create_table
17
21
  # * disable_extension
@@ -28,12 +32,14 @@ module ActiveRecord
28
32
  # * rename_index
29
33
  # * rename_table
30
34
  class CommandRecorder
31
- ReversibleAndIrreversibleMethods = [:create_table, :create_join_table, :rename_table, :add_column, :remove_column,
35
+ ReversibleAndIrreversibleMethods = [
36
+ :create_table, :create_join_table, :rename_table, :add_column, :remove_column,
32
37
  :rename_index, :rename_column, :add_index, :remove_index, :add_timestamps, :remove_timestamps,
33
38
  :change_column_default, :add_reference, :remove_reference, :transaction,
34
39
  :drop_join_table, :drop_table, :execute_block, :enable_extension, :disable_extension,
35
40
  :change_column, :execute, :remove_columns, :change_column_null,
36
- :add_foreign_key, :remove_foreign_key
41
+ :add_foreign_key, :remove_foreign_key,
42
+ :change_column_comment, :change_table_comment
37
43
  ]
38
44
  include JoinTable
39
45
 
@@ -83,7 +89,7 @@ module ActiveRecord
83
89
  # invert the +command+.
84
90
  def inverse_of(command, args, &block)
85
91
  method = :"invert_#{command}"
86
- raise IrreversibleMigration, <<-MSG.strip_heredoc unless respond_to?(method, true)
92
+ raise IrreversibleMigration, <<~MSG unless respond_to?(method, true)
87
93
  This migration uses #{command}, which is not automatically reversible.
88
94
  To make the migration reversible you can either:
89
95
  1. Define #up and #down methods in place of the #change method.
@@ -92,147 +98,175 @@ module ActiveRecord
92
98
  send(method, args, &block)
93
99
  end
94
100
 
95
- def respond_to?(*args) # :nodoc:
96
- super || delegate.respond_to?(*args)
97
- end
98
-
99
101
  ReversibleAndIrreversibleMethods.each do |method|
100
102
  class_eval <<-EOV, __FILE__, __LINE__ + 1
101
103
  def #{method}(*args, &block) # def create_table(*args, &block)
102
104
  record(:"#{method}", args, &block) # record(:create_table, args, &block)
103
105
  end # end
104
106
  EOV
107
+ ruby2_keywords(method) if respond_to?(:ruby2_keywords, true)
105
108
  end
106
109
  alias :add_belongs_to :add_reference
107
110
  alias :remove_belongs_to :remove_reference
108
111
 
109
- def change_table(table_name, options = {}) # :nodoc:
112
+ def change_table(table_name, **options) # :nodoc:
110
113
  yield delegate.update_table_definition(table_name, self)
111
114
  end
112
115
 
116
+ def replay(migration)
117
+ commands.each do |cmd, args, block|
118
+ migration.send(cmd, *args, &block)
119
+ end
120
+ end
121
+
113
122
  private
123
+ module StraightReversions # :nodoc:
124
+ private
125
+ {
126
+ execute_block: :execute_block,
127
+ create_table: :drop_table,
128
+ create_join_table: :drop_join_table,
129
+ add_column: :remove_column,
130
+ add_timestamps: :remove_timestamps,
131
+ add_reference: :remove_reference,
132
+ add_foreign_key: :remove_foreign_key,
133
+ enable_extension: :disable_extension
134
+ }.each do |cmd, inv|
135
+ [[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
136
+ class_eval <<-EOV, __FILE__, __LINE__ + 1
137
+ def invert_#{method}(args, &block) # def invert_create_table(args, &block)
138
+ [:#{inverse}, args, block] # [:drop_table, args, block]
139
+ end # end
140
+ EOV
141
+ end
142
+ end
143
+ end
144
+
145
+ include StraightReversions
146
+
147
+ def invert_transaction(args)
148
+ sub_recorder = CommandRecorder.new(delegate)
149
+ sub_recorder.revert { yield }
150
+
151
+ invertions_proc = proc {
152
+ sub_recorder.replay(self)
153
+ }
154
+
155
+ [:transaction, args, invertions_proc]
156
+ end
114
157
 
115
- module StraightReversions
116
- private
117
- { transaction: :transaction,
118
- execute_block: :execute_block,
119
- create_table: :drop_table,
120
- create_join_table: :drop_join_table,
121
- add_column: :remove_column,
122
- add_timestamps: :remove_timestamps,
123
- add_reference: :remove_reference,
124
- enable_extension: :disable_extension
125
- }.each do |cmd, inv|
126
- [[inv, cmd], [cmd, inv]].uniq.each do |method, inverse|
127
- class_eval <<-EOV, __FILE__, __LINE__ + 1
128
- def invert_#{method}(args, &block) # def invert_create_table(args, &block)
129
- [:#{inverse}, args, block] # [:drop_table, args, block]
130
- end # end
131
- EOV
158
+ def invert_drop_table(args, &block)
159
+ if args.size == 1 && block == nil
160
+ raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given options or a block (can be empty)."
132
161
  end
162
+ super
133
163
  end
134
- end
135
164
 
136
- include StraightReversions
165
+ def invert_rename_table(args)
166
+ [:rename_table, args.reverse]
167
+ end
137
168
 
138
- def invert_drop_table(args, &block)
139
- if args.size == 1 && block == nil
140
- raise ActiveRecord::IrreversibleMigration, "To avoid mistakes, drop_table is only reversible if given options or a block (can be empty)."
169
+ def invert_remove_column(args)
170
+ raise ActiveRecord::IrreversibleMigration, "remove_column is only reversible if given a type." if args.size <= 2
171
+ super
141
172
  end
142
- super
143
- end
144
173
 
145
- def invert_rename_table(args)
146
- [:rename_table, args.reverse]
147
- end
174
+ def invert_rename_index(args)
175
+ [:rename_index, [args.first] + args.last(2).reverse]
176
+ end
148
177
 
149
- def invert_remove_column(args)
150
- raise ActiveRecord::IrreversibleMigration, "remove_column is only reversible if given a type." if args.size <= 2
151
- super
152
- end
178
+ def invert_rename_column(args)
179
+ [:rename_column, [args.first] + args.last(2).reverse]
180
+ end
153
181
 
154
- def invert_rename_index(args)
155
- [:rename_index, [args.first] + args.last(2).reverse]
156
- end
182
+ def invert_add_index(args)
183
+ table, columns, options = *args
184
+ options ||= {}
157
185
 
158
- def invert_rename_column(args)
159
- [:rename_column, [args.first] + args.last(2).reverse]
160
- end
186
+ options_hash = options.slice(:name, :algorithm)
187
+ options_hash[:column] = columns if !options_hash[:name]
188
+
189
+ [:remove_index, [table, options_hash]]
190
+ end
161
191
 
162
- def invert_add_index(args)
163
- table, columns, options = *args
164
- options ||= {}
192
+ def invert_remove_index(args)
193
+ table, options_or_column = *args
194
+ if (options = options_or_column).is_a?(Hash)
195
+ unless options[:column]
196
+ raise ActiveRecord::IrreversibleMigration, "remove_index is only reversible if given a :column option."
197
+ end
198
+ options = options.dup
199
+ [:add_index, [table, options.delete(:column), options]]
200
+ elsif (column = options_or_column).present?
201
+ [:add_index, [table, column]]
202
+ end
203
+ end
165
204
 
166
- index_name = options[:name]
167
- options_hash = index_name ? { name: index_name } : { column: columns }
205
+ alias :invert_add_belongs_to :invert_add_reference
206
+ alias :invert_remove_belongs_to :invert_remove_reference
168
207
 
169
- [:remove_index, [table, options_hash]]
170
- end
208
+ def invert_change_column_default(args)
209
+ table, column, options = *args
171
210
 
172
- def invert_remove_index(args)
173
- table, options_or_column = *args
174
- if (options = options_or_column).is_a?(Hash)
175
- unless options[:column]
176
- raise ActiveRecord::IrreversibleMigration, "remove_index is only reversible if given a :column option."
211
+ unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
212
+ raise ActiveRecord::IrreversibleMigration, "change_column_default is only reversible if given a :from and :to option."
177
213
  end
178
- options = options.dup
179
- [:add_index, [table, options.delete(:column), options]]
180
- elsif (column = options_or_column).present?
181
- [:add_index, [table, column]]
214
+
215
+ [:change_column_default, [table, column, from: options[:to], to: options[:from]]]
182
216
  end
183
- end
184
217
 
185
- alias :invert_add_belongs_to :invert_add_reference
186
- alias :invert_remove_belongs_to :invert_remove_reference
218
+ def invert_change_column_null(args)
219
+ args[2] = !args[2]
220
+ [:change_column_null, args]
221
+ end
187
222
 
188
- def invert_change_column_default(args)
189
- table, column, options = *args
223
+ def invert_remove_foreign_key(args)
224
+ options = args.extract_options!
225
+ from_table, to_table = args
190
226
 
191
- unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
192
- raise ActiveRecord::IrreversibleMigration, "change_column_default is only reversible if given a :from and :to option."
193
- end
227
+ to_table ||= options.delete(:to_table)
194
228
 
195
- [:change_column_default, [table, column, from: options[:to], to: options[:from]]]
196
- end
229
+ raise ActiveRecord::IrreversibleMigration, "remove_foreign_key is only reversible if given a second table" if to_table.nil?
197
230
 
198
- def invert_change_column_null(args)
199
- args[2] = !args[2]
200
- [:change_column_null, args]
201
- end
231
+ reversed_args = [from_table, to_table]
232
+ reversed_args << options unless options.empty?
202
233
 
203
- def invert_add_foreign_key(args)
204
- from_table, to_table, add_options = args
205
- add_options ||= {}
234
+ [:add_foreign_key, reversed_args]
235
+ end
206
236
 
207
- if add_options[:name]
208
- options = { name: add_options[:name] }
209
- elsif add_options[:column]
210
- options = { column: add_options[:column] }
211
- else
212
- options = to_table
237
+ def invert_change_column_comment(args)
238
+ table, column, options = *args
239
+
240
+ unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
241
+ raise ActiveRecord::IrreversibleMigration, "change_column_comment is only reversible if given a :from and :to option."
242
+ end
243
+
244
+ [:change_column_comment, [table, column, from: options[:to], to: options[:from]]]
213
245
  end
214
246
 
215
- [:remove_foreign_key, [from_table, options]]
216
- end
247
+ def invert_change_table_comment(args)
248
+ table, options = *args
217
249
 
218
- def invert_remove_foreign_key(args)
219
- from_table, to_table, remove_options = args
220
- raise ActiveRecord::IrreversibleMigration, "remove_foreign_key is only reversible if given a second table" if to_table.nil? || to_table.is_a?(Hash)
250
+ unless options && options.is_a?(Hash) && options.has_key?(:from) && options.has_key?(:to)
251
+ raise ActiveRecord::IrreversibleMigration, "change_table_comment is only reversible if given a :from and :to option."
252
+ end
221
253
 
222
- reversed_args = [from_table, to_table]
223
- reversed_args << remove_options if remove_options
254
+ [:change_table_comment, [table, from: options[:to], to: options[:from]]]
255
+ end
224
256
 
225
- [:add_foreign_key, reversed_args]
226
- end
257
+ def respond_to_missing?(method, _)
258
+ super || delegate.respond_to?(method)
259
+ end
227
260
 
228
- # Forwards any missing method call to the \target.
229
- def method_missing(method, *args, &block)
230
- if @delegate.respond_to?(method)
231
- @delegate.send(method, *args, &block)
232
- else
233
- super
261
+ # Forwards any missing method call to the \target.
262
+ def method_missing(method, *args, &block)
263
+ if delegate.respond_to?(method)
264
+ delegate.public_send(method, *args, &block)
265
+ else
266
+ super
267
+ end
234
268
  end
235
- end
269
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
236
270
  end
237
271
  end
238
272
  end