activerecord 4.2.0 → 6.1.7.1

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 (374) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1221 -796
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +15 -14
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/aggregations.rb +267 -249
  8. data/lib/active_record/association_relation.rb +45 -7
  9. data/lib/active_record/associations/alias_tracker.rb +40 -43
  10. data/lib/active_record/associations/association.rb +172 -67
  11. data/lib/active_record/associations/association_scope.rb +105 -129
  12. data/lib/active_record/associations/belongs_to_association.rb +85 -59
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +13 -12
  14. data/lib/active_record/associations/builder/association.rb +57 -43
  15. data/lib/active_record/associations/builder/belongs_to.rb +74 -57
  16. data/lib/active_record/associations/builder/collection_association.rb +15 -33
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +57 -70
  18. data/lib/active_record/associations/builder/has_many.rb +13 -5
  19. data/lib/active_record/associations/builder/has_one.rb +44 -6
  20. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  21. data/lib/active_record/associations/collection_association.rb +168 -279
  22. data/lib/active_record/associations/collection_proxy.rb +263 -155
  23. data/lib/active_record/associations/foreign_association.rb +33 -0
  24. data/lib/active_record/associations/has_many_association.rb +57 -84
  25. data/lib/active_record/associations/has_many_through_association.rb +70 -82
  26. data/lib/active_record/associations/has_one_association.rb +74 -47
  27. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  28. data/lib/active_record/associations/join_dependency/join_association.rb +54 -73
  29. data/lib/active_record/associations/join_dependency/join_base.rb +10 -9
  30. data/lib/active_record/associations/join_dependency/join_part.rb +14 -14
  31. data/lib/active_record/associations/join_dependency.rb +175 -164
  32. data/lib/active_record/associations/preloader/association.rb +107 -112
  33. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  34. data/lib/active_record/associations/preloader.rb +99 -96
  35. data/lib/active_record/associations/singular_association.rb +18 -45
  36. data/lib/active_record/associations/through_association.rb +49 -24
  37. data/lib/active_record/associations.rb +1845 -1597
  38. data/lib/active_record/attribute_assignment.rb +59 -185
  39. data/lib/active_record/attribute_methods/before_type_cast.rb +20 -7
  40. data/lib/active_record/attribute_methods/dirty.rb +168 -138
  41. data/lib/active_record/attribute_methods/primary_key.rb +93 -83
  42. data/lib/active_record/attribute_methods/query.rb +8 -10
  43. data/lib/active_record/attribute_methods/read.rb +19 -79
  44. data/lib/active_record/attribute_methods/serialization.rb +49 -24
  45. data/lib/active_record/attribute_methods/time_zone_conversion.rb +59 -36
  46. data/lib/active_record/attribute_methods/write.rb +25 -56
  47. data/lib/active_record/attribute_methods.rb +153 -162
  48. data/lib/active_record/attributes.rb +234 -70
  49. data/lib/active_record/autosave_association.rb +157 -69
  50. data/lib/active_record/base.rb +49 -50
  51. data/lib/active_record/callbacks.rb +234 -79
  52. data/lib/active_record/coders/json.rb +3 -1
  53. data/lib/active_record/coders/yaml_column.rb +46 -13
  54. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +887 -317
  55. data/lib/active_record/connection_adapters/abstract/database_limits.rb +17 -41
  56. data/lib/active_record/connection_adapters/abstract/database_statements.rb +301 -113
  57. data/lib/active_record/connection_adapters/abstract/query_cache.rb +78 -24
  58. data/lib/active_record/connection_adapters/abstract/quoting.rb +187 -60
  59. data/lib/active_record/connection_adapters/abstract/savepoints.rb +9 -7
  60. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +157 -93
  61. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +485 -253
  62. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  63. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +909 -263
  64. data/lib/active_record/connection_adapters/abstract/transaction.rb +254 -92
  65. data/lib/active_record/connection_adapters/abstract_adapter.rb +492 -221
  66. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +580 -608
  67. data/lib/active_record/connection_adapters/column.rb +67 -40
  68. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  69. data/lib/active_record/connection_adapters/legacy_pool_manager.rb +35 -0
  70. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  71. data/lib/active_record/connection_adapters/mysql/database_statements.rb +196 -0
  72. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  73. data/lib/active_record/connection_adapters/mysql/quoting.rb +96 -0
  74. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +97 -0
  75. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +103 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +91 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +271 -0
  78. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
  79. data/lib/active_record/connection_adapters/mysql2_adapter.rb +81 -199
  80. data/lib/active_record/connection_adapters/pool_config.rb +73 -0
  81. data/lib/active_record/connection_adapters/pool_manager.rb +47 -0
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +44 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +78 -161
  84. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  85. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +49 -57
  86. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +9 -8
  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 +5 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +8 -6
  90. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +13 -1
  91. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +17 -13
  92. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +3 -1
  93. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +6 -3
  94. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +31 -20
  95. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +2 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +3 -11
  98. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +7 -9
  101. data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
  102. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
  103. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +70 -34
  104. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -1
  105. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +67 -51
  106. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +18 -4
  107. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  108. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  109. data/lib/active_record/connection_adapters/postgresql/oid.rb +25 -25
  110. data/lib/active_record/connection_adapters/postgresql/quoting.rb +171 -48
  111. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  112. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +80 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  114. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
  115. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +499 -293
  116. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
  117. data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
  118. data/lib/active_record/connection_adapters/postgresql_adapter.rb +595 -382
  119. data/lib/active_record/connection_adapters/schema_cache.rb +191 -29
  120. data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
  121. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +146 -0
  122. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  123. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
  124. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +21 -0
  125. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +19 -0
  126. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +18 -0
  127. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +170 -0
  128. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +322 -389
  129. data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
  130. data/lib/active_record/connection_adapters.rb +52 -0
  131. data/lib/active_record/connection_handling.rb +314 -41
  132. data/lib/active_record/core.rb +488 -243
  133. data/lib/active_record/counter_cache.rb +71 -50
  134. data/lib/active_record/database_configurations/connection_url_resolver.rb +99 -0
  135. data/lib/active_record/database_configurations/database_config.rb +80 -0
  136. data/lib/active_record/database_configurations/hash_config.rb +96 -0
  137. data/lib/active_record/database_configurations/url_config.rb +53 -0
  138. data/lib/active_record/database_configurations.rb +273 -0
  139. data/lib/active_record/delegated_type.rb +209 -0
  140. data/lib/active_record/destroy_association_async_job.rb +36 -0
  141. data/lib/active_record/dynamic_matchers.rb +87 -106
  142. data/lib/active_record/enum.rb +212 -94
  143. data/lib/active_record/errors.rb +225 -54
  144. data/lib/active_record/explain.rb +27 -11
  145. data/lib/active_record/explain_registry.rb +4 -2
  146. data/lib/active_record/explain_subscriber.rb +11 -6
  147. data/lib/active_record/fixture_set/file.rb +33 -14
  148. data/lib/active_record/fixture_set/model_metadata.rb +32 -0
  149. data/lib/active_record/fixture_set/render_context.rb +17 -0
  150. data/lib/active_record/fixture_set/table_row.rb +152 -0
  151. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  152. data/lib/active_record/fixtures.rb +273 -496
  153. data/lib/active_record/gem_version.rb +6 -4
  154. data/lib/active_record/inheritance.rb +175 -110
  155. data/lib/active_record/insert_all.rb +212 -0
  156. data/lib/active_record/integration.rb +121 -29
  157. data/lib/active_record/internal_metadata.rb +64 -0
  158. data/lib/active_record/legacy_yaml_adapter.rb +52 -0
  159. data/lib/active_record/locale/en.yml +3 -2
  160. data/lib/active_record/locking/optimistic.rb +103 -95
  161. data/lib/active_record/locking/pessimistic.rb +22 -6
  162. data/lib/active_record/log_subscriber.rb +93 -31
  163. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  164. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  165. data/lib/active_record/middleware/database_selector.rb +77 -0
  166. data/lib/active_record/migration/command_recorder.rb +185 -90
  167. data/lib/active_record/migration/compatibility.rb +298 -0
  168. data/lib/active_record/migration/join_table.rb +8 -7
  169. data/lib/active_record/migration.rb +685 -309
  170. data/lib/active_record/model_schema.rb +420 -113
  171. data/lib/active_record/nested_attributes.rb +265 -216
  172. data/lib/active_record/no_touching.rb +15 -2
  173. data/lib/active_record/null_relation.rb +24 -38
  174. data/lib/active_record/persistence.rb +574 -135
  175. data/lib/active_record/query_cache.rb +29 -23
  176. data/lib/active_record/querying.rb +50 -31
  177. data/lib/active_record/railtie.rb +175 -54
  178. data/lib/active_record/railties/console_sandbox.rb +3 -3
  179. data/lib/active_record/railties/controller_runtime.rb +34 -33
  180. data/lib/active_record/railties/databases.rake +533 -216
  181. data/lib/active_record/readonly_attributes.rb +9 -4
  182. data/lib/active_record/reflection.rb +485 -310
  183. data/lib/active_record/relation/batches/batch_enumerator.rb +85 -0
  184. data/lib/active_record/relation/batches.rb +217 -59
  185. data/lib/active_record/relation/calculations.rb +326 -244
  186. data/lib/active_record/relation/delegation.rb +76 -84
  187. data/lib/active_record/relation/finder_methods.rb +318 -256
  188. data/lib/active_record/relation/from_clause.rb +30 -0
  189. data/lib/active_record/relation/merger.rb +99 -84
  190. data/lib/active_record/relation/predicate_builder/array_handler.rb +26 -25
  191. data/lib/active_record/relation/predicate_builder/association_query_value.rb +42 -0
  192. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  193. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +57 -0
  194. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  195. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  196. data/lib/active_record/relation/predicate_builder.rb +139 -96
  197. data/lib/active_record/relation/query_attribute.rb +50 -0
  198. data/lib/active_record/relation/query_methods.rb +757 -409
  199. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  200. data/lib/active_record/relation/spawn_methods.rb +23 -21
  201. data/lib/active_record/relation/where_clause.rb +239 -0
  202. data/lib/active_record/relation.rb +554 -342
  203. data/lib/active_record/result.rb +91 -47
  204. data/lib/active_record/runtime_registry.rb +6 -4
  205. data/lib/active_record/sanitization.rb +134 -122
  206. data/lib/active_record/schema.rb +21 -24
  207. data/lib/active_record/schema_dumper.rb +141 -92
  208. data/lib/active_record/schema_migration.rb +24 -26
  209. data/lib/active_record/scoping/default.rb +96 -82
  210. data/lib/active_record/scoping/named.rb +78 -36
  211. data/lib/active_record/scoping.rb +45 -27
  212. data/lib/active_record/secure_token.rb +48 -0
  213. data/lib/active_record/serialization.rb +8 -6
  214. data/lib/active_record/signed_id.rb +116 -0
  215. data/lib/active_record/statement_cache.rb +89 -36
  216. data/lib/active_record/store.rb +133 -43
  217. data/lib/active_record/suppressor.rb +61 -0
  218. data/lib/active_record/table_metadata.rb +81 -0
  219. data/lib/active_record/tasks/database_tasks.rb +366 -129
  220. data/lib/active_record/tasks/mysql_database_tasks.rb +68 -100
  221. data/lib/active_record/tasks/postgresql_database_tasks.rb +87 -39
  222. data/lib/active_record/tasks/sqlite_database_tasks.rb +44 -19
  223. data/lib/active_record/test_databases.rb +24 -0
  224. data/lib/active_record/test_fixtures.rb +291 -0
  225. data/lib/active_record/timestamp.rb +86 -43
  226. data/lib/active_record/touch_later.rb +65 -0
  227. data/lib/active_record/transactions.rb +181 -152
  228. data/lib/active_record/translation.rb +3 -1
  229. data/lib/active_record/type/adapter_specific_registry.rb +126 -0
  230. data/lib/active_record/type/date.rb +4 -41
  231. data/lib/active_record/type/date_time.rb +4 -38
  232. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  233. data/lib/active_record/type/hash_lookup_type_map.rb +12 -5
  234. data/lib/active_record/type/internal/timezone.rb +17 -0
  235. data/lib/active_record/type/json.rb +30 -0
  236. data/lib/active_record/type/serialized.rb +33 -15
  237. data/lib/active_record/type/text.rb +2 -2
  238. data/lib/active_record/type/time.rb +21 -16
  239. data/lib/active_record/type/type_map.rb +16 -19
  240. data/lib/active_record/type/unsigned_integer.rb +9 -8
  241. data/lib/active_record/type.rb +84 -23
  242. data/lib/active_record/type_caster/connection.rb +33 -0
  243. data/lib/active_record/type_caster/map.rb +23 -0
  244. data/lib/active_record/type_caster.rb +9 -0
  245. data/lib/active_record/validations/absence.rb +25 -0
  246. data/lib/active_record/validations/associated.rb +12 -4
  247. data/lib/active_record/validations/length.rb +26 -0
  248. data/lib/active_record/validations/numericality.rb +35 -0
  249. data/lib/active_record/validations/presence.rb +14 -13
  250. data/lib/active_record/validations/uniqueness.rb +65 -48
  251. data/lib/active_record/validations.rb +39 -35
  252. data/lib/active_record/version.rb +3 -1
  253. data/lib/active_record.rb +44 -28
  254. data/lib/arel/alias_predication.rb +9 -0
  255. data/lib/arel/attributes/attribute.rb +41 -0
  256. data/lib/arel/collectors/bind.rb +29 -0
  257. data/lib/arel/collectors/composite.rb +39 -0
  258. data/lib/arel/collectors/plain_string.rb +20 -0
  259. data/lib/arel/collectors/sql_string.rb +27 -0
  260. data/lib/arel/collectors/substitute_binds.rb +35 -0
  261. data/lib/arel/crud.rb +42 -0
  262. data/lib/arel/delete_manager.rb +18 -0
  263. data/lib/arel/errors.rb +9 -0
  264. data/lib/arel/expressions.rb +29 -0
  265. data/lib/arel/factory_methods.rb +49 -0
  266. data/lib/arel/insert_manager.rb +49 -0
  267. data/lib/arel/math.rb +45 -0
  268. data/lib/arel/nodes/and.rb +32 -0
  269. data/lib/arel/nodes/ascending.rb +23 -0
  270. data/lib/arel/nodes/binary.rb +126 -0
  271. data/lib/arel/nodes/bind_param.rb +44 -0
  272. data/lib/arel/nodes/case.rb +55 -0
  273. data/lib/arel/nodes/casted.rb +62 -0
  274. data/lib/arel/nodes/comment.rb +29 -0
  275. data/lib/arel/nodes/count.rb +12 -0
  276. data/lib/arel/nodes/delete_statement.rb +45 -0
  277. data/lib/arel/nodes/descending.rb +23 -0
  278. data/lib/arel/nodes/equality.rb +15 -0
  279. data/lib/arel/nodes/extract.rb +24 -0
  280. data/lib/arel/nodes/false.rb +16 -0
  281. data/lib/arel/nodes/full_outer_join.rb +8 -0
  282. data/lib/arel/nodes/function.rb +44 -0
  283. data/lib/arel/nodes/grouping.rb +11 -0
  284. data/lib/arel/nodes/homogeneous_in.rb +76 -0
  285. data/lib/arel/nodes/in.rb +15 -0
  286. data/lib/arel/nodes/infix_operation.rb +92 -0
  287. data/lib/arel/nodes/inner_join.rb +8 -0
  288. data/lib/arel/nodes/insert_statement.rb +37 -0
  289. data/lib/arel/nodes/join_source.rb +20 -0
  290. data/lib/arel/nodes/matches.rb +18 -0
  291. data/lib/arel/nodes/named_function.rb +23 -0
  292. data/lib/arel/nodes/node.rb +51 -0
  293. data/lib/arel/nodes/node_expression.rb +13 -0
  294. data/lib/arel/nodes/ordering.rb +27 -0
  295. data/lib/arel/nodes/outer_join.rb +8 -0
  296. data/lib/arel/nodes/over.rb +15 -0
  297. data/lib/arel/nodes/regexp.rb +16 -0
  298. data/lib/arel/nodes/right_outer_join.rb +8 -0
  299. data/lib/arel/nodes/select_core.rb +67 -0
  300. data/lib/arel/nodes/select_statement.rb +41 -0
  301. data/lib/arel/nodes/sql_literal.rb +19 -0
  302. data/lib/arel/nodes/string_join.rb +11 -0
  303. data/lib/arel/nodes/table_alias.rb +31 -0
  304. data/lib/arel/nodes/terminal.rb +16 -0
  305. data/lib/arel/nodes/true.rb +16 -0
  306. data/lib/arel/nodes/unary.rb +44 -0
  307. data/lib/arel/nodes/unary_operation.rb +20 -0
  308. data/lib/arel/nodes/unqualified_column.rb +22 -0
  309. data/lib/arel/nodes/update_statement.rb +41 -0
  310. data/lib/arel/nodes/values_list.rb +9 -0
  311. data/lib/arel/nodes/window.rb +126 -0
  312. data/lib/arel/nodes/with.rb +11 -0
  313. data/lib/arel/nodes.rb +70 -0
  314. data/lib/arel/order_predications.rb +13 -0
  315. data/lib/arel/predications.rb +250 -0
  316. data/lib/arel/select_manager.rb +270 -0
  317. data/lib/arel/table.rb +118 -0
  318. data/lib/arel/tree_manager.rb +72 -0
  319. data/lib/arel/update_manager.rb +34 -0
  320. data/lib/arel/visitors/dot.rb +308 -0
  321. data/lib/arel/visitors/mysql.rb +93 -0
  322. data/lib/arel/visitors/postgresql.rb +120 -0
  323. data/lib/arel/visitors/sqlite.rb +38 -0
  324. data/lib/arel/visitors/to_sql.rb +899 -0
  325. data/lib/arel/visitors/visitor.rb +45 -0
  326. data/lib/arel/visitors.rb +13 -0
  327. data/lib/arel/window_predications.rb +9 -0
  328. data/lib/arel.rb +54 -0
  329. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  330. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  331. data/lib/rails/generators/active_record/migration/migration_generator.rb +43 -37
  332. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +26 -0
  333. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +13 -10
  334. data/lib/rails/generators/active_record/migration.rb +35 -1
  335. data/lib/rails/generators/active_record/model/model_generator.rb +55 -22
  336. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  337. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  338. data/lib/rails/generators/active_record.rb +7 -5
  339. metadata +175 -65
  340. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  341. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  342. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  343. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  344. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  345. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  346. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  347. data/lib/active_record/attribute.rb +0 -149
  348. data/lib/active_record/attribute_decorators.rb +0 -66
  349. data/lib/active_record/attribute_set/builder.rb +0 -86
  350. data/lib/active_record/attribute_set.rb +0 -77
  351. data/lib/active_record/connection_adapters/connection_specification.rb +0 -275
  352. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -491
  353. data/lib/active_record/connection_adapters/postgresql/array_parser.rb +0 -93
  354. data/lib/active_record/connection_adapters/postgresql/oid/float.rb +0 -21
  355. data/lib/active_record/connection_adapters/postgresql/oid/integer.rb +0 -11
  356. data/lib/active_record/connection_adapters/postgresql/oid/json.rb +0 -35
  357. data/lib/active_record/connection_adapters/postgresql/oid/time.rb +0 -11
  358. data/lib/active_record/railties/jdbcmysql_error.rb +0 -16
  359. data/lib/active_record/serializers/xml_serializer.rb +0 -193
  360. data/lib/active_record/type/big_integer.rb +0 -13
  361. data/lib/active_record/type/binary.rb +0 -50
  362. data/lib/active_record/type/boolean.rb +0 -30
  363. data/lib/active_record/type/decimal.rb +0 -40
  364. data/lib/active_record/type/decorator.rb +0 -14
  365. data/lib/active_record/type/float.rb +0 -19
  366. data/lib/active_record/type/integer.rb +0 -55
  367. data/lib/active_record/type/mutable.rb +0 -16
  368. data/lib/active_record/type/numeric.rb +0 -36
  369. data/lib/active_record/type/string.rb +0 -36
  370. data/lib/active_record/type/time_value.rb +0 -38
  371. data/lib/active_record/type/value.rb +0 -101
  372. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -22
  373. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
  374. /data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
@@ -1,149 +0,0 @@
1
- module ActiveRecord
2
- class Attribute # :nodoc:
3
- class << self
4
- def from_database(name, value, type)
5
- FromDatabase.new(name, value, type)
6
- end
7
-
8
- def from_user(name, value, type)
9
- FromUser.new(name, value, type)
10
- end
11
-
12
- def with_cast_value(name, value, type)
13
- WithCastValue.new(name, value, type)
14
- end
15
-
16
- def null(name)
17
- Null.new(name)
18
- end
19
-
20
- def uninitialized(name, type)
21
- Uninitialized.new(name, type)
22
- end
23
- end
24
-
25
- attr_reader :name, :value_before_type_cast, :type
26
-
27
- # This method should not be called directly.
28
- # Use #from_database or #from_user
29
- def initialize(name, value_before_type_cast, type)
30
- @name = name
31
- @value_before_type_cast = value_before_type_cast
32
- @type = type
33
- end
34
-
35
- def value
36
- # `defined?` is cheaper than `||=` when we get back falsy values
37
- @value = original_value unless defined?(@value)
38
- @value
39
- end
40
-
41
- def original_value
42
- type_cast(value_before_type_cast)
43
- end
44
-
45
- def value_for_database
46
- type.type_cast_for_database(value)
47
- end
48
-
49
- def changed_from?(old_value)
50
- type.changed?(old_value, value, value_before_type_cast)
51
- end
52
-
53
- def changed_in_place_from?(old_value)
54
- type.changed_in_place?(old_value, value)
55
- end
56
-
57
- def with_value_from_user(value)
58
- self.class.from_user(name, value, type)
59
- end
60
-
61
- def with_value_from_database(value)
62
- self.class.from_database(name, value, type)
63
- end
64
-
65
- def with_cast_value(value)
66
- self.class.with_cast_value(name, value, type)
67
- end
68
-
69
- def type_cast(*)
70
- raise NotImplementedError
71
- end
72
-
73
- def initialized?
74
- true
75
- end
76
-
77
- def ==(other)
78
- self.class == other.class &&
79
- name == other.name &&
80
- value_before_type_cast == other.value_before_type_cast &&
81
- type == other.type
82
- end
83
-
84
- protected
85
-
86
- def initialize_dup(other)
87
- if defined?(@value) && @value.duplicable?
88
- @value = @value.dup
89
- end
90
- end
91
-
92
- class FromDatabase < Attribute # :nodoc:
93
- def type_cast(value)
94
- type.type_cast_from_database(value)
95
- end
96
- end
97
-
98
- class FromUser < Attribute # :nodoc:
99
- def type_cast(value)
100
- type.type_cast_from_user(value)
101
- end
102
- end
103
-
104
- class WithCastValue < Attribute # :nodoc:
105
- def type_cast(value)
106
- value
107
- end
108
-
109
- def changed_in_place_from?(old_value)
110
- false
111
- end
112
- end
113
-
114
- class Null < Attribute # :nodoc:
115
- def initialize(name)
116
- super(name, nil, Type::Value.new)
117
- end
118
-
119
- def value
120
- nil
121
- end
122
-
123
- def with_value_from_database(value)
124
- raise ActiveModel::MissingAttributeError, "can't write unknown attribute `#{name}`"
125
- end
126
- alias_method :with_value_from_user, :with_value_from_database
127
- end
128
-
129
- class Uninitialized < Attribute # :nodoc:
130
- def initialize(name, type)
131
- super(name, nil, type)
132
- end
133
-
134
- def value
135
- if block_given?
136
- yield name
137
- end
138
- end
139
-
140
- def value_for_database
141
- end
142
-
143
- def initialized?
144
- false
145
- end
146
- end
147
- private_constant :FromDatabase, :FromUser, :Null, :Uninitialized
148
- end
149
- end
@@ -1,66 +0,0 @@
1
- module ActiveRecord
2
- module AttributeDecorators # :nodoc:
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- class_attribute :attribute_type_decorations, instance_accessor: false # :internal:
7
- self.attribute_type_decorations = TypeDecorator.new
8
- end
9
-
10
- module ClassMethods # :nodoc:
11
- def decorate_attribute_type(column_name, decorator_name, &block)
12
- matcher = ->(name, _) { name == column_name.to_s }
13
- key = "_#{column_name}_#{decorator_name}"
14
- decorate_matching_attribute_types(matcher, key, &block)
15
- end
16
-
17
- def decorate_matching_attribute_types(matcher, decorator_name, &block)
18
- clear_caches_calculated_from_columns
19
- decorator_name = decorator_name.to_s
20
-
21
- # Create new hashes so we don't modify parent classes
22
- self.attribute_type_decorations = attribute_type_decorations.merge(decorator_name => [matcher, block])
23
- end
24
-
25
- private
26
-
27
- def add_user_provided_columns(*)
28
- super.map do |column|
29
- decorated_type = attribute_type_decorations.apply(column.name, column.cast_type)
30
- column.with_type(decorated_type)
31
- end
32
- end
33
- end
34
-
35
- class TypeDecorator # :nodoc:
36
- delegate :clear, to: :@decorations
37
-
38
- def initialize(decorations = {})
39
- @decorations = decorations
40
- end
41
-
42
- def merge(*args)
43
- TypeDecorator.new(@decorations.merge(*args))
44
- end
45
-
46
- def apply(name, type)
47
- decorations = decorators_for(name, type)
48
- decorations.inject(type) do |new_type, block|
49
- block.call(new_type)
50
- end
51
- end
52
-
53
- private
54
-
55
- def decorators_for(name, type)
56
- matching(name, type).map(&:last)
57
- end
58
-
59
- def matching(name, type)
60
- @decorations.values.select do |(matcher, _)|
61
- matcher.call(name, type)
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,86 +0,0 @@
1
- module ActiveRecord
2
- class AttributeSet # :nodoc:
3
- class Builder # :nodoc:
4
- attr_reader :types, :always_initialized
5
-
6
- def initialize(types, always_initialized = nil)
7
- @types = types
8
- @always_initialized = always_initialized
9
- end
10
-
11
- def build_from_database(values = {}, additional_types = {})
12
- if always_initialized && !values.key?(always_initialized)
13
- values[always_initialized] = nil
14
- end
15
-
16
- attributes = LazyAttributeHash.new(types, values, additional_types)
17
- AttributeSet.new(attributes)
18
- end
19
- end
20
- end
21
-
22
- class LazyAttributeHash # :nodoc:
23
- delegate :select, :transform_values, to: :materialize
24
-
25
- def initialize(types, values, additional_types)
26
- @types = types
27
- @values = values
28
- @additional_types = additional_types
29
- @materialized = false
30
- @delegate_hash = {}
31
- end
32
-
33
- def key?(key)
34
- delegate_hash.key?(key) || values.key?(key) || types.key?(key)
35
- end
36
-
37
- def [](key)
38
- delegate_hash[key] || assign_default_value(key)
39
- end
40
-
41
- def []=(key, value)
42
- if frozen?
43
- raise RuntimeError, "Can't modify frozen hash"
44
- end
45
- delegate_hash[key] = value
46
- end
47
-
48
- def initialized_keys
49
- delegate_hash.keys | values.keys
50
- end
51
-
52
- def initialize_dup(_)
53
- @delegate_hash = delegate_hash.transform_values(&:dup)
54
- super
55
- end
56
-
57
- protected
58
-
59
- attr_reader :types, :values, :additional_types, :delegate_hash
60
-
61
- private
62
-
63
- def assign_default_value(name)
64
- type = additional_types.fetch(name, types[name])
65
- value_present = true
66
- value = values.fetch(name) { value_present = false }
67
-
68
- if value_present
69
- delegate_hash[name] = Attribute.from_database(name, value, type)
70
- elsif types.key?(name)
71
- delegate_hash[name] = Attribute.uninitialized(name, type)
72
- end
73
- end
74
-
75
- def materialize
76
- unless @materialized
77
- values.each_key { |key| self[key] }
78
- types.each_key { |key| self[key] }
79
- unless frozen?
80
- @materialized = true
81
- end
82
- end
83
- delegate_hash
84
- end
85
- end
86
- end
@@ -1,77 +0,0 @@
1
- require 'active_record/attribute_set/builder'
2
-
3
- module ActiveRecord
4
- class AttributeSet # :nodoc:
5
- def initialize(attributes)
6
- @attributes = attributes
7
- end
8
-
9
- def [](name)
10
- attributes[name] || Attribute.null(name)
11
- end
12
-
13
- def values_before_type_cast
14
- attributes.transform_values(&:value_before_type_cast)
15
- end
16
-
17
- def to_hash
18
- initialized_attributes.transform_values(&:value)
19
- end
20
- alias_method :to_h, :to_hash
21
-
22
- def key?(name)
23
- attributes.key?(name) && self[name].initialized?
24
- end
25
-
26
- def keys
27
- attributes.initialized_keys
28
- end
29
-
30
- def fetch_value(name)
31
- self[name].value { |n| yield n if block_given? }
32
- end
33
-
34
- def write_from_database(name, value)
35
- attributes[name] = self[name].with_value_from_database(value)
36
- end
37
-
38
- def write_from_user(name, value)
39
- attributes[name] = self[name].with_value_from_user(value)
40
- end
41
-
42
- def write_cast_value(name, value)
43
- attributes[name] = self[name].with_cast_value(value)
44
- end
45
-
46
- def freeze
47
- @attributes.freeze
48
- super
49
- end
50
-
51
- def initialize_dup(_)
52
- @attributes = attributes.dup
53
- super
54
- end
55
-
56
- def initialize_clone(_)
57
- @attributes = attributes.clone
58
- super
59
- end
60
-
61
- def reset(key)
62
- if key?(key)
63
- write_from_database(key, nil)
64
- end
65
- end
66
-
67
- protected
68
-
69
- attr_reader :attributes
70
-
71
- private
72
-
73
- def initialized_attributes
74
- attributes.select { |_, attr| attr.initialized? }
75
- end
76
- end
77
- end
@@ -1,275 +0,0 @@
1
- require 'uri'
2
- require 'active_support/core_ext/string/filters'
3
-
4
- module ActiveRecord
5
- module ConnectionAdapters
6
- class ConnectionSpecification #:nodoc:
7
- attr_reader :config, :adapter_method
8
-
9
- def initialize(config, adapter_method)
10
- @config, @adapter_method = config, adapter_method
11
- end
12
-
13
- def initialize_dup(original)
14
- @config = original.config.dup
15
- end
16
-
17
- # Expands a connection string into a hash.
18
- class ConnectionUrlResolver # :nodoc:
19
-
20
- # == Example
21
- #
22
- # url = "postgresql://foo:bar@localhost:9000/foo_test?pool=5&timeout=3000"
23
- # ConnectionUrlResolver.new(url).to_hash
24
- # # => {
25
- # "adapter" => "postgresql",
26
- # "host" => "localhost",
27
- # "port" => 9000,
28
- # "database" => "foo_test",
29
- # "username" => "foo",
30
- # "password" => "bar",
31
- # "pool" => "5",
32
- # "timeout" => "3000"
33
- # }
34
- def initialize(url)
35
- raise "Database URL cannot be empty" if url.blank?
36
- @uri = uri_parser.parse(url)
37
- @adapter = @uri.scheme.tr('-', '_')
38
- @adapter = "postgresql" if @adapter == "postgres"
39
-
40
- if @uri.opaque
41
- @uri.opaque, @query = @uri.opaque.split('?', 2)
42
- else
43
- @query = @uri.query
44
- end
45
- end
46
-
47
- # Converts the given URL to a full connection hash.
48
- def to_hash
49
- config = raw_config.reject { |_,value| value.blank? }
50
- config.map { |key,value| config[key] = uri_parser.unescape(value) if value.is_a? String }
51
- config
52
- end
53
-
54
- private
55
-
56
- def uri
57
- @uri
58
- end
59
-
60
- def uri_parser
61
- @uri_parser ||= URI::Parser.new
62
- end
63
-
64
- # Converts the query parameters of the URI into a hash.
65
- #
66
- # "localhost?pool=5&reaping_frequency=2"
67
- # # => { "pool" => "5", "reaping_frequency" => "2" }
68
- #
69
- # returns empty hash if no query present.
70
- #
71
- # "localhost"
72
- # # => {}
73
- def query_hash
74
- Hash[(@query || '').split("&").map { |pair| pair.split("=") }]
75
- end
76
-
77
- def raw_config
78
- if uri.opaque
79
- query_hash.merge({
80
- "adapter" => @adapter,
81
- "database" => uri.opaque })
82
- else
83
- query_hash.merge({
84
- "adapter" => @adapter,
85
- "username" => uri.user,
86
- "password" => uri.password,
87
- "port" => uri.port,
88
- "database" => database_from_path,
89
- "host" => uri.hostname })
90
- end
91
- end
92
-
93
- # Returns name of the database.
94
- def database_from_path
95
- if @adapter == 'sqlite3'
96
- # 'sqlite3:/foo' is absolute, because that makes sense. The
97
- # corresponding relative version, 'sqlite3:foo', is handled
98
- # elsewhere, as an "opaque".
99
-
100
- uri.path
101
- else
102
- # Only SQLite uses a filename as the "database" name; for
103
- # anything else, a leading slash would be silly.
104
-
105
- uri.path.sub(%r{^/}, "")
106
- end
107
- end
108
- end
109
-
110
- ##
111
- # Builds a ConnectionSpecification from user input.
112
- class Resolver # :nodoc:
113
- attr_reader :configurations
114
-
115
- # Accepts a hash two layers deep, keys on the first layer represent
116
- # environments such as "production". Keys must be strings.
117
- def initialize(configurations)
118
- @configurations = configurations
119
- end
120
-
121
- # Returns a hash with database connection information.
122
- #
123
- # == Examples
124
- #
125
- # Full hash Configuration.
126
- #
127
- # configurations = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
128
- # Resolver.new(configurations).resolve(:production)
129
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3"}
130
- #
131
- # Initialized with URL configuration strings.
132
- #
133
- # configurations = { "production" => "postgresql://localhost/foo" }
134
- # Resolver.new(configurations).resolve(:production)
135
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
136
- #
137
- def resolve(config)
138
- if config
139
- resolve_connection config
140
- elsif env = ActiveRecord::ConnectionHandling::RAILS_ENV.call
141
- resolve_symbol_connection env.to_sym
142
- else
143
- raise AdapterNotSpecified
144
- end
145
- end
146
-
147
- # Expands each key in @configurations hash into fully resolved hash
148
- def resolve_all
149
- config = configurations.dup
150
- config.each do |key, value|
151
- config[key] = resolve(value) if value
152
- end
153
- config
154
- end
155
-
156
- # Returns an instance of ConnectionSpecification for a given adapter.
157
- # Accepts a hash one layer deep that contains all connection information.
158
- #
159
- # == Example
160
- #
161
- # config = { "production" => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" } }
162
- # spec = Resolver.new(config).spec(:production)
163
- # spec.adapter_method
164
- # # => "sqlite3_connection"
165
- # spec.config
166
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "sqlite3" }
167
- #
168
- def spec(config)
169
- spec = resolve(config).symbolize_keys
170
-
171
- raise(AdapterNotSpecified, "database configuration does not specify adapter") unless spec.key?(:adapter)
172
-
173
- path_to_adapter = "active_record/connection_adapters/#{spec[:adapter]}_adapter"
174
- begin
175
- require path_to_adapter
176
- rescue Gem::LoadError => e
177
- raise Gem::LoadError, "Specified '#{spec[:adapter]}' for database adapter, but the gem is not loaded. Add `gem '#{e.name}'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord)."
178
- rescue LoadError => e
179
- raise LoadError, "Could not load '#{path_to_adapter}'. Make sure that the adapter in config/database.yml is valid. If you use an adapter other than 'mysql', 'mysql2', 'postgresql' or 'sqlite3' add the necessary adapter gem to the Gemfile.", e.backtrace
180
- end
181
-
182
- adapter_method = "#{spec[:adapter]}_connection"
183
- ConnectionSpecification.new(spec, adapter_method)
184
- end
185
-
186
- private
187
-
188
- # Returns fully resolved connection, accepts hash, string or symbol.
189
- # Always returns a hash.
190
- #
191
- # == Examples
192
- #
193
- # Symbol representing current environment.
194
- #
195
- # Resolver.new("production" => {}).resolve_connection(:production)
196
- # # => {}
197
- #
198
- # One layer deep hash of connection values.
199
- #
200
- # Resolver.new({}).resolve_connection("adapter" => "sqlite3")
201
- # # => { "adapter" => "sqlite3" }
202
- #
203
- # Connection URL.
204
- #
205
- # Resolver.new({}).resolve_connection("postgresql://localhost/foo")
206
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
207
- #
208
- def resolve_connection(spec)
209
- case spec
210
- when Symbol
211
- resolve_symbol_connection spec
212
- when String
213
- resolve_string_connection spec
214
- when Hash
215
- resolve_hash_connection spec
216
- end
217
- end
218
-
219
- def resolve_string_connection(spec)
220
- # Rails has historically accepted a string to mean either
221
- # an environment key or a URL spec, so we have deprecated
222
- # this ambiguous behaviour and in the future this function
223
- # can be removed in favor of resolve_url_connection.
224
- if configurations.key?(spec) || spec !~ /:/
225
- ActiveSupport::Deprecation.warn(<<-MSG.squish)
226
- Passing a string to ActiveRecord::Base.establish_connection for a
227
- configuration lookup is deprecated, please pass a symbol
228
- (#{spec.to_sym.inspect}) instead.
229
- MSG
230
-
231
- resolve_symbol_connection(spec)
232
- else
233
- resolve_url_connection(spec)
234
- end
235
- end
236
-
237
- # Takes the environment such as +:production+ or +:development+.
238
- # This requires that the @configurations was initialized with a key that
239
- # matches.
240
- #
241
- # Resolver.new("production" => {}).resolve_symbol_connection(:production)
242
- # # => {}
243
- #
244
- def resolve_symbol_connection(spec)
245
- if config = configurations[spec.to_s]
246
- resolve_connection(config)
247
- else
248
- raise(AdapterNotSpecified, "'#{spec}' database is not configured. Available: #{configurations.keys.inspect}")
249
- end
250
- end
251
-
252
- # Accepts a hash. Expands the "url" key that contains a
253
- # URL database connection to a full connection
254
- # hash and merges with the rest of the hash.
255
- # Connection details inside of the "url" key win any merge conflicts
256
- def resolve_hash_connection(spec)
257
- if spec["url"] && spec["url"] !~ /^jdbc:/
258
- connection_hash = resolve_url_connection(spec.delete("url"))
259
- spec.merge!(connection_hash)
260
- end
261
- spec
262
- end
263
-
264
- # Takes a connection URL.
265
- #
266
- # Resolver.new({}).resolve_url_connection("postgresql://localhost/foo")
267
- # # => { "host" => "localhost", "database" => "foo", "adapter" => "postgresql" }
268
- #
269
- def resolve_url_connection(url)
270
- ConnectionUrlResolver.new(url).to_hash
271
- end
272
- end
273
- end
274
- end
275
- end