activerecord 4.2.11.1 → 6.0.3.5

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 (373) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +721 -1522
  3. data/MIT-LICENSE +4 -2
  4. data/README.rdoc +14 -13
  5. data/examples/performance.rb +33 -32
  6. data/examples/simple.rb +5 -4
  7. data/lib/active_record/advisory_lock_base.rb +18 -0
  8. data/lib/active_record/aggregations.rb +266 -251
  9. data/lib/active_record/association_relation.rb +20 -13
  10. data/lib/active_record/associations/alias_tracker.rb +29 -36
  11. data/lib/active_record/associations/association.rb +128 -57
  12. data/lib/active_record/associations/association_scope.rb +103 -132
  13. data/lib/active_record/associations/belongs_to_association.rb +65 -60
  14. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +8 -12
  15. data/lib/active_record/associations/builder/association.rb +27 -40
  16. data/lib/active_record/associations/builder/belongs_to.rb +69 -55
  17. data/lib/active_record/associations/builder/collection_association.rb +10 -33
  18. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +50 -66
  19. data/lib/active_record/associations/builder/has_many.rb +8 -4
  20. data/lib/active_record/associations/builder/has_one.rb +46 -5
  21. data/lib/active_record/associations/builder/singular_association.rb +16 -10
  22. data/lib/active_record/associations/collection_association.rb +136 -288
  23. data/lib/active_record/associations/collection_proxy.rb +241 -147
  24. data/lib/active_record/associations/foreign_association.rb +10 -1
  25. data/lib/active_record/associations/has_many_association.rb +34 -98
  26. data/lib/active_record/associations/has_many_through_association.rb +60 -87
  27. data/lib/active_record/associations/has_one_association.rb +61 -49
  28. data/lib/active_record/associations/has_one_through_association.rb +20 -11
  29. data/lib/active_record/associations/join_dependency/join_association.rb +38 -86
  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 +149 -166
  33. data/lib/active_record/associations/preloader/association.rb +90 -123
  34. data/lib/active_record/associations/preloader/through_association.rb +85 -65
  35. data/lib/active_record/associations/preloader.rb +90 -93
  36. data/lib/active_record/associations/singular_association.rb +18 -39
  37. data/lib/active_record/associations/through_association.rb +38 -18
  38. data/lib/active_record/associations.rb +1737 -1597
  39. data/lib/active_record/attribute_assignment.rb +57 -185
  40. data/lib/active_record/attribute_decorators.rb +39 -17
  41. data/lib/active_record/attribute_methods/before_type_cast.rb +13 -9
  42. data/lib/active_record/attribute_methods/dirty.rb +174 -144
  43. data/lib/active_record/attribute_methods/primary_key.rb +90 -84
  44. data/lib/active_record/attribute_methods/query.rb +6 -5
  45. data/lib/active_record/attribute_methods/read.rb +20 -77
  46. data/lib/active_record/attribute_methods/serialization.rb +40 -21
  47. data/lib/active_record/attribute_methods/time_zone_conversion.rb +57 -37
  48. data/lib/active_record/attribute_methods/write.rb +32 -55
  49. data/lib/active_record/attribute_methods.rb +120 -135
  50. data/lib/active_record/attributes.rb +213 -82
  51. data/lib/active_record/autosave_association.rb +97 -41
  52. data/lib/active_record/base.rb +57 -45
  53. data/lib/active_record/callbacks.rb +101 -76
  54. data/lib/active_record/coders/json.rb +3 -1
  55. data/lib/active_record/coders/yaml_column.rb +23 -12
  56. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +804 -297
  57. data/lib/active_record/connection_adapters/abstract/database_limits.rb +26 -8
  58. data/lib/active_record/connection_adapters/abstract/database_statements.rb +240 -115
  59. data/lib/active_record/connection_adapters/abstract/query_cache.rb +83 -24
  60. data/lib/active_record/connection_adapters/abstract/quoting.rb +170 -53
  61. data/lib/active_record/connection_adapters/abstract/savepoints.rb +5 -3
  62. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +74 -47
  63. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +371 -242
  64. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +79 -36
  65. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +694 -256
  66. data/lib/active_record/connection_adapters/abstract/transaction.rb +190 -83
  67. data/lib/active_record/connection_adapters/abstract_adapter.rb +473 -202
  68. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +507 -639
  69. data/lib/active_record/connection_adapters/column.rb +56 -43
  70. data/lib/active_record/connection_adapters/connection_specification.rb +174 -153
  71. data/lib/active_record/connection_adapters/determine_if_preparable_visitor.rb +29 -0
  72. data/lib/active_record/connection_adapters/mysql/column.rb +27 -0
  73. data/lib/active_record/connection_adapters/mysql/database_statements.rb +196 -0
  74. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  75. data/lib/active_record/connection_adapters/mysql/quoting.rb +81 -0
  76. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +71 -0
  77. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +95 -0
  78. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +88 -0
  79. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +264 -0
  80. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +31 -0
  81. data/lib/active_record/connection_adapters/mysql2_adapter.rb +58 -181
  82. data/lib/active_record/connection_adapters/postgresql/column.rb +21 -11
  83. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +70 -114
  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 -58
  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 +4 -2
  89. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +5 -1
  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 +9 -22
  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 +31 -20
  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 -9
  99. data/lib/active_record/connection_adapters/postgresql/oid/{infinity.rb → oid.rb} +5 -3
  100. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +32 -11
  101. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +51 -34
  102. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +4 -5
  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 +9 -5
  105. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +3 -1
  106. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +3 -1
  107. data/lib/active_record/connection_adapters/postgresql/oid.rb +23 -25
  108. data/lib/active_record/connection_adapters/postgresql/quoting.rb +144 -47
  109. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +27 -14
  110. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +76 -0
  111. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +178 -108
  112. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +49 -0
  113. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +462 -296
  114. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +36 -0
  115. data/lib/active_record/connection_adapters/postgresql/utils.rb +11 -8
  116. data/lib/active_record/connection_adapters/postgresql_adapter.rb +558 -356
  117. data/lib/active_record/connection_adapters/schema_cache.rb +72 -25
  118. data/lib/active_record/connection_adapters/sql_type_metadata.rb +37 -0
  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 +21 -0
  121. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +102 -0
  122. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +17 -0
  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 +299 -349
  127. data/lib/active_record/connection_adapters/statement_pool.rb +33 -13
  128. data/lib/active_record/connection_handling.rb +167 -41
  129. data/lib/active_record/core.rb +252 -230
  130. data/lib/active_record/counter_cache.rb +70 -49
  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 -106
  137. data/lib/active_record/enum.rb +163 -86
  138. data/lib/active_record/errors.rb +188 -53
  139. data/lib/active_record/explain.rb +22 -11
  140. data/lib/active_record/explain_registry.rb +4 -2
  141. data/lib/active_record/explain_subscriber.rb +10 -5
  142. data/lib/active_record/fixture_set/file.rb +35 -9
  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 +227 -501
  148. data/lib/active_record/gem_version.rb +6 -4
  149. data/lib/active_record/inheritance.rb +158 -115
  150. data/lib/active_record/insert_all.rb +179 -0
  151. data/lib/active_record/integration.rb +123 -29
  152. data/lib/active_record/internal_metadata.rb +53 -0
  153. data/lib/active_record/legacy_yaml_adapter.rb +21 -3
  154. data/lib/active_record/locale/en.yml +3 -2
  155. data/lib/active_record/locking/optimistic.rb +86 -96
  156. data/lib/active_record/locking/pessimistic.rb +18 -6
  157. data/lib/active_record/log_subscriber.rb +76 -33
  158. data/lib/active_record/middleware/database_selector/resolver/session.rb +45 -0
  159. data/lib/active_record/middleware/database_selector/resolver.rb +87 -0
  160. data/lib/active_record/middleware/database_selector.rb +74 -0
  161. data/lib/active_record/migration/command_recorder.rb +166 -91
  162. data/lib/active_record/migration/compatibility.rb +244 -0
  163. data/lib/active_record/migration/join_table.rb +8 -7
  164. data/lib/active_record/migration.rb +623 -305
  165. data/lib/active_record/model_schema.rb +313 -112
  166. data/lib/active_record/nested_attributes.rb +263 -223
  167. data/lib/active_record/no_touching.rb +15 -2
  168. data/lib/active_record/null_relation.rb +24 -38
  169. data/lib/active_record/persistence.rb +557 -126
  170. data/lib/active_record/query_cache.rb +19 -23
  171. data/lib/active_record/querying.rb +44 -30
  172. data/lib/active_record/railtie.rb +143 -44
  173. data/lib/active_record/railties/collection_cache_association_loading.rb +34 -0
  174. data/lib/active_record/railties/console_sandbox.rb +2 -0
  175. data/lib/active_record/railties/controller_runtime.rb +34 -33
  176. data/lib/active_record/railties/databases.rake +331 -185
  177. data/lib/active_record/readonly_attributes.rb +5 -4
  178. data/lib/active_record/reflection.rb +430 -281
  179. data/lib/active_record/relation/batches/batch_enumerator.rb +69 -0
  180. data/lib/active_record/relation/batches.rb +206 -55
  181. data/lib/active_record/relation/calculations.rb +268 -254
  182. data/lib/active_record/relation/delegation.rb +75 -84
  183. data/lib/active_record/relation/finder_methods.rb +285 -241
  184. data/lib/active_record/relation/from_clause.rb +30 -0
  185. data/lib/active_record/relation/merger.rb +78 -88
  186. data/lib/active_record/relation/predicate_builder/array_handler.rb +27 -26
  187. data/lib/active_record/relation/predicate_builder/association_query_value.rb +43 -0
  188. data/lib/active_record/relation/predicate_builder/base_handler.rb +18 -0
  189. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  190. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +53 -0
  191. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  192. data/lib/active_record/relation/predicate_builder/relation_handler.rb +7 -1
  193. data/lib/active_record/relation/predicate_builder.rb +110 -119
  194. data/lib/active_record/relation/query_attribute.rb +50 -0
  195. data/lib/active_record/relation/query_methods.rb +603 -397
  196. data/lib/active_record/relation/record_fetch_warning.rb +51 -0
  197. data/lib/active_record/relation/spawn_methods.rb +11 -14
  198. data/lib/active_record/relation/where_clause.rb +189 -0
  199. data/lib/active_record/relation/where_clause_factory.rb +33 -0
  200. data/lib/active_record/relation.rb +530 -341
  201. data/lib/active_record/result.rb +79 -43
  202. data/lib/active_record/runtime_registry.rb +6 -4
  203. data/lib/active_record/sanitization.rb +144 -121
  204. data/lib/active_record/schema.rb +21 -24
  205. data/lib/active_record/schema_dumper.rb +112 -93
  206. data/lib/active_record/schema_migration.rb +24 -17
  207. data/lib/active_record/scoping/default.rb +98 -83
  208. data/lib/active_record/scoping/named.rb +86 -33
  209. data/lib/active_record/scoping.rb +45 -27
  210. data/lib/active_record/secure_token.rb +40 -0
  211. data/lib/active_record/serialization.rb +5 -5
  212. data/lib/active_record/statement_cache.rb +73 -36
  213. data/lib/active_record/store.rb +127 -42
  214. data/lib/active_record/suppressor.rb +61 -0
  215. data/lib/active_record/table_metadata.rb +90 -0
  216. data/lib/active_record/tasks/database_tasks.rb +307 -100
  217. data/lib/active_record/tasks/mysql_database_tasks.rb +55 -100
  218. data/lib/active_record/tasks/postgresql_database_tasks.rb +80 -41
  219. data/lib/active_record/tasks/sqlite_database_tasks.rb +37 -16
  220. data/lib/active_record/test_databases.rb +23 -0
  221. data/lib/active_record/test_fixtures.rb +225 -0
  222. data/lib/active_record/timestamp.rb +86 -41
  223. data/lib/active_record/touch_later.rb +65 -0
  224. data/lib/active_record/transactions.rb +223 -157
  225. data/lib/active_record/translation.rb +3 -1
  226. data/lib/active_record/type/adapter_specific_registry.rb +126 -0
  227. data/lib/active_record/type/date.rb +4 -45
  228. data/lib/active_record/type/date_time.rb +4 -49
  229. data/lib/active_record/type/decimal_without_scale.rb +6 -2
  230. data/lib/active_record/type/hash_lookup_type_map.rb +5 -4
  231. data/lib/active_record/type/internal/timezone.rb +17 -0
  232. data/lib/active_record/type/json.rb +30 -0
  233. data/lib/active_record/type/serialized.rb +23 -15
  234. data/lib/active_record/type/text.rb +2 -2
  235. data/lib/active_record/type/time.rb +11 -16
  236. data/lib/active_record/type/type_map.rb +16 -19
  237. data/lib/active_record/type/unsigned_integer.rb +9 -8
  238. data/lib/active_record/type.rb +77 -23
  239. data/lib/active_record/type_caster/connection.rb +34 -0
  240. data/lib/active_record/type_caster/map.rb +20 -0
  241. data/lib/active_record/type_caster.rb +9 -0
  242. data/lib/active_record/validations/absence.rb +25 -0
  243. data/lib/active_record/validations/associated.rb +12 -4
  244. data/lib/active_record/validations/length.rb +26 -0
  245. data/lib/active_record/validations/presence.rb +14 -13
  246. data/lib/active_record/validations/uniqueness.rb +42 -55
  247. data/lib/active_record/validations.rb +38 -35
  248. data/lib/active_record/version.rb +3 -1
  249. data/lib/active_record.rb +42 -22
  250. data/lib/arel/alias_predication.rb +9 -0
  251. data/lib/arel/attributes/attribute.rb +37 -0
  252. data/lib/arel/attributes.rb +22 -0
  253. data/lib/arel/collectors/bind.rb +24 -0
  254. data/lib/arel/collectors/composite.rb +31 -0
  255. data/lib/arel/collectors/plain_string.rb +20 -0
  256. data/lib/arel/collectors/sql_string.rb +20 -0
  257. data/lib/arel/collectors/substitute_binds.rb +28 -0
  258. data/lib/arel/crud.rb +42 -0
  259. data/lib/arel/delete_manager.rb +18 -0
  260. data/lib/arel/errors.rb +9 -0
  261. data/lib/arel/expressions.rb +29 -0
  262. data/lib/arel/factory_methods.rb +49 -0
  263. data/lib/arel/insert_manager.rb +49 -0
  264. data/lib/arel/math.rb +45 -0
  265. data/lib/arel/nodes/and.rb +32 -0
  266. data/lib/arel/nodes/ascending.rb +23 -0
  267. data/lib/arel/nodes/binary.rb +52 -0
  268. data/lib/arel/nodes/bind_param.rb +36 -0
  269. data/lib/arel/nodes/case.rb +55 -0
  270. data/lib/arel/nodes/casted.rb +50 -0
  271. data/lib/arel/nodes/comment.rb +29 -0
  272. data/lib/arel/nodes/count.rb +12 -0
  273. data/lib/arel/nodes/delete_statement.rb +45 -0
  274. data/lib/arel/nodes/descending.rb +23 -0
  275. data/lib/arel/nodes/equality.rb +18 -0
  276. data/lib/arel/nodes/extract.rb +24 -0
  277. data/lib/arel/nodes/false.rb +16 -0
  278. data/lib/arel/nodes/full_outer_join.rb +8 -0
  279. data/lib/arel/nodes/function.rb +44 -0
  280. data/lib/arel/nodes/grouping.rb +8 -0
  281. data/lib/arel/nodes/in.rb +8 -0
  282. data/lib/arel/nodes/infix_operation.rb +80 -0
  283. data/lib/arel/nodes/inner_join.rb +8 -0
  284. data/lib/arel/nodes/insert_statement.rb +37 -0
  285. data/lib/arel/nodes/join_source.rb +20 -0
  286. data/lib/arel/nodes/matches.rb +18 -0
  287. data/lib/arel/nodes/named_function.rb +23 -0
  288. data/lib/arel/nodes/node.rb +50 -0
  289. data/lib/arel/nodes/node_expression.rb +13 -0
  290. data/lib/arel/nodes/outer_join.rb +8 -0
  291. data/lib/arel/nodes/over.rb +15 -0
  292. data/lib/arel/nodes/regexp.rb +16 -0
  293. data/lib/arel/nodes/right_outer_join.rb +8 -0
  294. data/lib/arel/nodes/select_core.rb +67 -0
  295. data/lib/arel/nodes/select_statement.rb +41 -0
  296. data/lib/arel/nodes/sql_literal.rb +16 -0
  297. data/lib/arel/nodes/string_join.rb +11 -0
  298. data/lib/arel/nodes/table_alias.rb +27 -0
  299. data/lib/arel/nodes/terminal.rb +16 -0
  300. data/lib/arel/nodes/true.rb +16 -0
  301. data/lib/arel/nodes/unary.rb +45 -0
  302. data/lib/arel/nodes/unary_operation.rb +20 -0
  303. data/lib/arel/nodes/unqualified_column.rb +22 -0
  304. data/lib/arel/nodes/update_statement.rb +41 -0
  305. data/lib/arel/nodes/values_list.rb +9 -0
  306. data/lib/arel/nodes/window.rb +126 -0
  307. data/lib/arel/nodes/with.rb +11 -0
  308. data/lib/arel/nodes.rb +68 -0
  309. data/lib/arel/order_predications.rb +13 -0
  310. data/lib/arel/predications.rb +256 -0
  311. data/lib/arel/select_manager.rb +271 -0
  312. data/lib/arel/table.rb +110 -0
  313. data/lib/arel/tree_manager.rb +72 -0
  314. data/lib/arel/update_manager.rb +34 -0
  315. data/lib/arel/visitors/depth_first.rb +203 -0
  316. data/lib/arel/visitors/dot.rb +296 -0
  317. data/lib/arel/visitors/ibm_db.rb +34 -0
  318. data/lib/arel/visitors/informix.rb +62 -0
  319. data/lib/arel/visitors/mssql.rb +156 -0
  320. data/lib/arel/visitors/mysql.rb +83 -0
  321. data/lib/arel/visitors/oracle.rb +158 -0
  322. data/lib/arel/visitors/oracle12.rb +65 -0
  323. data/lib/arel/visitors/postgresql.rb +109 -0
  324. data/lib/arel/visitors/sqlite.rb +38 -0
  325. data/lib/arel/visitors/to_sql.rb +888 -0
  326. data/lib/arel/visitors/visitor.rb +45 -0
  327. data/lib/arel/visitors/where_sql.rb +22 -0
  328. data/lib/arel/visitors.rb +20 -0
  329. data/lib/arel/window_predications.rb +9 -0
  330. data/lib/arel.rb +62 -0
  331. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  332. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  333. data/lib/rails/generators/active_record/migration/migration_generator.rb +42 -37
  334. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +24 -0
  335. data/lib/rails/generators/active_record/migration/templates/{migration.rb → migration.rb.tt} +11 -2
  336. data/lib/rails/generators/active_record/migration.rb +30 -1
  337. data/lib/rails/generators/active_record/model/model_generator.rb +18 -22
  338. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  339. data/lib/rails/generators/active_record/model/templates/{module.rb → module.rb.tt} +0 -0
  340. data/lib/rails/generators/active_record.rb +7 -5
  341. metadata +168 -59
  342. data/lib/active_record/associations/preloader/belongs_to.rb +0 -17
  343. data/lib/active_record/associations/preloader/collection_association.rb +0 -24
  344. data/lib/active_record/associations/preloader/has_many.rb +0 -17
  345. data/lib/active_record/associations/preloader/has_many_through.rb +0 -19
  346. data/lib/active_record/associations/preloader/has_one.rb +0 -23
  347. data/lib/active_record/associations/preloader/has_one_through.rb +0 -9
  348. data/lib/active_record/associations/preloader/singular_association.rb +0 -21
  349. data/lib/active_record/attribute.rb +0 -163
  350. data/lib/active_record/attribute_set/builder.rb +0 -106
  351. data/lib/active_record/attribute_set.rb +0 -81
  352. data/lib/active_record/connection_adapters/mysql_adapter.rb +0 -498
  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 -31
  363. data/lib/active_record/type/decimal.rb +0 -64
  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 -59
  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 -40
  370. data/lib/active_record/type/time_value.rb +0 -38
  371. data/lib/active_record/type/value.rb +0 -110
  372. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb +0 -19
  373. data/lib/rails/generators/active_record/model/templates/model.rb +0 -10
@@ -1,5 +1,6 @@
1
- module ActiveRecord
1
+ # frozen_string_literal: true
2
2
 
3
+ module ActiveRecord
3
4
  # = Active Record Errors
4
5
  #
5
6
  # Generic Active Record exception class.
@@ -7,8 +8,10 @@ module ActiveRecord
7
8
  end
8
9
 
9
10
  # Raised when the single-table inheritance mechanism fails to locate the subclass
10
- # (for example due to improper usage of column that +inheritance_column+ points to).
11
- class SubclassNotFound < ActiveRecordError #:nodoc:
11
+ # (for example due to improper usage of column that
12
+ # {ActiveRecord::Base.inheritance_column}[rdoc-ref:ModelSchema::ClassMethods#inheritance_column]
13
+ # points to).
14
+ class SubclassNotFound < ActiveRecordError
12
15
  end
13
16
 
14
17
  # Raised when an object assigned to an association has an incorrect type.
@@ -40,27 +43,44 @@ module ActiveRecord
40
43
  class AdapterNotFound < ActiveRecordError
41
44
  end
42
45
 
43
- # Raised when connection to the database could not been established (for
44
- # example when +connection=+ is given a nil object).
46
+ # Raised when connection to the database could not been established (for example when
47
+ # {ActiveRecord::Base.connection=}[rdoc-ref:ConnectionHandling#connection]
48
+ # is given a +nil+ object).
45
49
  class ConnectionNotEstablished < ActiveRecordError
46
50
  end
47
51
 
48
- # Raised when Active Record cannot find record by given id or set of ids.
52
+ # Raised when a write to the database is attempted on a read only connection.
53
+ class ReadOnlyError < ActiveRecordError
54
+ end
55
+
56
+ # Raised when Active Record cannot find a record by given id or set of ids.
49
57
  class RecordNotFound < ActiveRecordError
58
+ attr_reader :model, :primary_key, :id
59
+
60
+ def initialize(message = nil, model = nil, primary_key = nil, id = nil)
61
+ @primary_key = primary_key
62
+ @model = model
63
+ @id = id
64
+
65
+ super(message)
66
+ end
50
67
  end
51
68
 
52
- # Raised by ActiveRecord::Base.save! and ActiveRecord::Base.create! methods when record cannot be
53
- # saved because record is invalid.
69
+ # Raised by {ActiveRecord::Base#save!}[rdoc-ref:Persistence#save!] and
70
+ # {ActiveRecord::Base.create!}[rdoc-ref:Persistence::ClassMethods#create!]
71
+ # methods when a record is invalid and cannot be saved.
54
72
  class RecordNotSaved < ActiveRecordError
55
73
  attr_reader :record
56
74
 
57
- def initialize(message, record = nil)
75
+ def initialize(message = nil, record = nil)
58
76
  @record = record
59
77
  super(message)
60
78
  end
61
79
  end
62
80
 
63
- # Raised by ActiveRecord::Base.destroy! when a call to destroy would return false.
81
+ # Raised by {ActiveRecord::Base#destroy!}[rdoc-ref:Persistence#destroy!]
82
+ # when a call to {#destroy}[rdoc-ref:Persistence#destroy!]
83
+ # would return false.
64
84
  #
65
85
  # begin
66
86
  # complex_operation_that_internally_calls_destroy!
@@ -71,7 +91,7 @@ module ActiveRecord
71
91
  class RecordNotDestroyed < ActiveRecordError
72
92
  attr_reader :record
73
93
 
74
- def initialize(message, record = nil)
94
+ def initialize(message = nil, record = nil)
75
95
  @record = record
76
96
  super(message)
77
97
  end
@@ -79,32 +99,79 @@ module ActiveRecord
79
99
 
80
100
  # Superclass for all database execution errors.
81
101
  #
82
- # Wraps the underlying database error as +original_exception+.
102
+ # Wraps the underlying database error as +cause+.
83
103
  class StatementInvalid < ActiveRecordError
84
- attr_reader :original_exception
85
-
86
- def initialize(message, original_exception = nil)
87
- super(message)
88
- @original_exception = original_exception
104
+ def initialize(message = nil, sql: nil, binds: nil)
105
+ super(message || $!.try(:message))
106
+ @sql = sql
107
+ @binds = binds
89
108
  end
109
+
110
+ attr_reader :sql, :binds
90
111
  end
91
112
 
92
113
  # Defunct wrapper class kept for compatibility.
93
- # +StatementInvalid+ wraps the original exception now.
114
+ # StatementInvalid wraps the original exception now.
94
115
  class WrappedDatabaseException < StatementInvalid
95
116
  end
96
117
 
97
- # Raised when a record cannot be inserted because it would violate a uniqueness constraint.
118
+ # Raised when a record cannot be inserted or updated because it would violate a uniqueness constraint.
98
119
  class RecordNotUnique < WrappedDatabaseException
99
120
  end
100
121
 
101
- # Raised when a record cannot be inserted or updated because it references a non-existent record.
122
+ # Raised when a record cannot be inserted or updated because it references a non-existent record,
123
+ # or when a record cannot be deleted because a parent record references it.
102
124
  class InvalidForeignKey < WrappedDatabaseException
103
125
  end
104
126
 
127
+ # Raised when a foreign key constraint cannot be added because the column type does not match the referenced column type.
128
+ class MismatchedForeignKey < StatementInvalid
129
+ def initialize(
130
+ message: nil,
131
+ sql: nil,
132
+ binds: nil,
133
+ table: nil,
134
+ foreign_key: nil,
135
+ target_table: nil,
136
+ primary_key: nil,
137
+ primary_key_column: nil
138
+ )
139
+ if table
140
+ type = primary_key_column.bigint? ? :bigint : primary_key_column.type
141
+ msg = <<~EOM.squish
142
+ Column `#{foreign_key}` on table `#{table}` does not match column `#{primary_key}` on `#{target_table}`,
143
+ which has type `#{primary_key_column.sql_type}`.
144
+ To resolve this issue, change the type of the `#{foreign_key}` column on `#{table}` to be :#{type}.
145
+ (For example `t.#{type} :#{foreign_key}`).
146
+ EOM
147
+ else
148
+ msg = <<~EOM.squish
149
+ There is a mismatch between the foreign key and primary key column types.
150
+ Verify that the foreign key column type and the primary key of the associated table match types.
151
+ EOM
152
+ end
153
+ if message
154
+ msg << "\nOriginal message: #{message}"
155
+ end
156
+ super(msg, sql: sql, binds: binds)
157
+ end
158
+ end
159
+
160
+ # Raised when a record cannot be inserted or updated because it would violate a not null constraint.
161
+ class NotNullViolation < StatementInvalid
162
+ end
163
+
164
+ # Raised when a record cannot be inserted or updated because a value too long for a column type.
165
+ class ValueTooLong < StatementInvalid
166
+ end
167
+
168
+ # Raised when values that executed are out of range.
169
+ class RangeError < StatementInvalid
170
+ end
171
+
105
172
  # Raised when number of bind variables in statement given to +:condition+ key
106
- # (for example, when using +find+ method) does not match number of expected
107
- # values supplied.
173
+ # (for example, when using {ActiveRecord::Base.find}[rdoc-ref:FinderMethods#find] method)
174
+ # does not match number of expected values supplied.
108
175
  #
109
176
  # For example, when there are two placeholders with only one value supplied:
110
177
  #
@@ -116,6 +183,11 @@ module ActiveRecord
116
183
  class NoDatabaseError < StatementInvalid
117
184
  end
118
185
 
186
+ # Raised when PostgreSQL returns 'cached plan must not change result type' and
187
+ # we cannot retry gracefully (e.g. inside a transaction)
188
+ class PreparedStatementCacheExpired < StatementInvalid
189
+ end
190
+
119
191
  # Raised on attempt to save stale record. Record is stale when it's being saved in another query after
120
192
  # instantiation, for example, when two users edit the same wiki page and one starts editing and saves
121
193
  # the page before the other.
@@ -125,16 +197,21 @@ module ActiveRecord
125
197
  class StaleObjectError < ActiveRecordError
126
198
  attr_reader :record, :attempted_action
127
199
 
128
- def initialize(record, attempted_action)
129
- super("Attempted to #{attempted_action} a stale object: #{record.class.name}")
130
- @record = record
131
- @attempted_action = attempted_action
200
+ def initialize(record = nil, attempted_action = nil)
201
+ if record && attempted_action
202
+ @record = record
203
+ @attempted_action = attempted_action
204
+ super("Attempted to #{attempted_action} a stale object: #{record.class.name}.")
205
+ else
206
+ super("Stale object error.")
207
+ end
132
208
  end
133
-
134
209
  end
135
210
 
136
211
  # Raised when association is being configured improperly or user tries to use
137
- # offset and limit together with +has_many+ or +has_and_belongs_to_many+
212
+ # offset and limit together with
213
+ # {ActiveRecord::Base.has_many}[rdoc-ref:Associations::ClassMethods#has_many] or
214
+ # {ActiveRecord::Base.has_and_belongs_to_many}[rdoc-ref:Associations::ClassMethods#has_and_belongs_to_many]
138
215
  # associations.
139
216
  class ConfigurationError < ActiveRecordError
140
217
  end
@@ -143,9 +220,10 @@ module ActiveRecord
143
220
  class ReadOnlyRecord < ActiveRecordError
144
221
  end
145
222
 
146
- # ActiveRecord::Transactions::ClassMethods.transaction uses this exception
147
- # to distinguish a deliberate rollback from other exceptional situations.
148
- # Normally, raising an exception will cause the +transaction+ method to rollback
223
+ # {ActiveRecord::Base.transaction}[rdoc-ref:Transactions::ClassMethods#transaction]
224
+ # uses this exception to distinguish a deliberate rollback from other exceptional situations.
225
+ # Normally, raising an exception will cause the
226
+ # {.transaction}[rdoc-ref:Transactions::ClassMethods#transaction] method to rollback
149
227
  # the database transaction *and* pass on the exception. But if you raise an
150
228
  # ActiveRecord::Rollback exception, then the database transaction will be rolled back,
151
229
  # without passing on the exception.
@@ -179,38 +257,29 @@ module ActiveRecord
179
257
  end
180
258
 
181
259
  # Raised when unknown attributes are supplied via mass assignment.
182
- class UnknownAttributeError < NoMethodError
183
-
184
- attr_reader :record, :attribute
185
-
186
- def initialize(record, attribute)
187
- @record = record
188
- @attribute = attribute.to_s
189
- super("unknown attribute '#{attribute}' for #{@record.class}.")
190
- end
191
-
192
- end
260
+ UnknownAttributeError = ActiveModel::UnknownAttributeError
193
261
 
194
262
  # Raised when an error occurred while doing a mass assignment to an attribute through the
195
- # +attributes=+ method. The exception has an +attribute+ property that is the name of the
196
- # offending attribute.
263
+ # {ActiveRecord::Base#attributes=}[rdoc-ref:AttributeAssignment#attributes=] method.
264
+ # The exception has an +attribute+ property that is the name of the offending attribute.
197
265
  class AttributeAssignmentError < ActiveRecordError
198
266
  attr_reader :exception, :attribute
199
267
 
200
- def initialize(message, exception, attribute)
268
+ def initialize(message = nil, exception = nil, attribute = nil)
201
269
  super(message)
202
270
  @exception = exception
203
271
  @attribute = attribute
204
272
  end
205
273
  end
206
274
 
207
- # Raised when there are multiple errors while doing a mass assignment through the +attributes+
275
+ # Raised when there are multiple errors while doing a mass assignment through the
276
+ # {ActiveRecord::Base#attributes=}[rdoc-ref:AttributeAssignment#attributes=]
208
277
  # method. The exception has an +errors+ property that contains an array of AttributeAssignmentError
209
278
  # objects, each corresponding to the error while assigning to an attribute.
210
279
  class MultiparameterAssignmentErrors < ActiveRecordError
211
280
  attr_reader :errors
212
281
 
213
- def initialize(errors)
282
+ def initialize(errors = nil)
214
283
  @errors = errors
215
284
  end
216
285
  end
@@ -219,11 +288,15 @@ module ActiveRecord
219
288
  class UnknownPrimaryKey < ActiveRecordError
220
289
  attr_reader :model
221
290
 
222
- def initialize(model, description = nil)
223
- message = "Unknown primary key for table #{model.table_name} in model #{model}."
224
- message += "\n#{description}" if description
225
- super(message)
226
- @model = model
291
+ def initialize(model = nil, description = nil)
292
+ if model
293
+ message = "Unknown primary key for table #{model.table_name} in model #{model}."
294
+ message += "\n#{description}" if description
295
+ @model = model
296
+ super(message)
297
+ else
298
+ super("Unknown primary key.")
299
+ end
227
300
  end
228
301
  end
229
302
 
@@ -247,7 +320,69 @@ module ActiveRecord
247
320
  # * You are joining an existing open transaction
248
321
  # * You are creating a nested (savepoint) transaction
249
322
  #
250
- # The mysql, mysql2 and postgresql adapters support setting the transaction isolation level.
323
+ # The mysql2 and postgresql adapters support setting the transaction isolation level.
251
324
  class TransactionIsolationError < ActiveRecordError
252
325
  end
326
+
327
+ # TransactionRollbackError will be raised when a transaction is rolled
328
+ # back by the database due to a serialization failure or a deadlock.
329
+ #
330
+ # See the following:
331
+ #
332
+ # * https://www.postgresql.org/docs/current/static/transaction-iso.html
333
+ # * https://dev.mysql.com/doc/refman/5.7/en/error-messages-server.html#error_er_lock_deadlock
334
+ class TransactionRollbackError < StatementInvalid
335
+ end
336
+
337
+ # SerializationFailure will be raised when a transaction is rolled
338
+ # back by the database due to a serialization failure.
339
+ class SerializationFailure < TransactionRollbackError
340
+ end
341
+
342
+ # Deadlocked will be raised when a transaction is rolled
343
+ # back by the database when a deadlock is encountered.
344
+ class Deadlocked < TransactionRollbackError
345
+ end
346
+
347
+ # IrreversibleOrderError is raised when a relation's order is too complex for
348
+ # +reverse_order+ to automatically reverse.
349
+ class IrreversibleOrderError < ActiveRecordError
350
+ end
351
+
352
+ # LockWaitTimeout will be raised when lock wait timeout exceeded.
353
+ class LockWaitTimeout < StatementInvalid
354
+ end
355
+
356
+ # StatementTimeout will be raised when statement timeout exceeded.
357
+ class StatementTimeout < StatementInvalid
358
+ end
359
+
360
+ # QueryCanceled will be raised when canceling statement due to user request.
361
+ class QueryCanceled < StatementInvalid
362
+ end
363
+
364
+ # UnknownAttributeReference is raised when an unknown and potentially unsafe
365
+ # value is passed to a query method when allow_unsafe_raw_sql is set to
366
+ # :disabled. For example, passing a non column name value to a relation's
367
+ # #order method might cause this exception.
368
+ #
369
+ # When working around this exception, caution should be taken to avoid SQL
370
+ # injection vulnerabilities when passing user-provided values to query
371
+ # methods. Known-safe values can be passed to query methods by wrapping them
372
+ # in Arel.sql.
373
+ #
374
+ # For example, with allow_unsafe_raw_sql set to :disabled, the following
375
+ # code would raise this exception:
376
+ #
377
+ # Post.order("length(title)").first
378
+ #
379
+ # The desired result can be accomplished by wrapping the known-safe string
380
+ # in Arel.sql:
381
+ #
382
+ # Post.order(Arel.sql("length(title)")).first
383
+ #
384
+ # Again, such a workaround should *not* be used when passing user-provided
385
+ # values, such as request parameters or model attributes to query methods.
386
+ class UnknownAttributeReference < ActiveRecordError
387
+ end
253
388
  end
@@ -1,5 +1,6 @@
1
- require 'active_support/lazy_load_hooks'
2
- require 'active_record/explain_registry'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/explain_registry"
3
4
 
4
5
  module ActiveRecord
5
6
  module Explain
@@ -16,15 +17,14 @@ module ActiveRecord
16
17
  # Makes the adapter execute EXPLAIN for the tuples of queries and bindings.
17
18
  # Returns a formatted string ready to be logged.
18
19
  def exec_explain(queries) # :nodoc:
19
- str = queries.map do |sql, bind|
20
- [].tap do |msg|
21
- msg << "EXPLAIN for: #{sql}"
22
- unless bind.empty?
23
- bind_msg = bind.map {|col, val| [col.name, val]}.inspect
24
- msg.last << " #{bind_msg}"
25
- end
26
- msg << connection.explain(sql, bind)
27
- end.join("\n")
20
+ str = queries.map do |sql, binds|
21
+ msg = +"EXPLAIN for: #{sql}"
22
+ unless binds.empty?
23
+ msg << " "
24
+ msg << binds.map { |attr| render_bind(attr) }.inspect
25
+ end
26
+ msg << "\n"
27
+ msg << connection.explain(sql, binds)
28
28
  end.join("\n")
29
29
 
30
30
  # Overriding inspect to be more human readable, especially in the console.
@@ -34,5 +34,16 @@ module ActiveRecord
34
34
 
35
35
  str
36
36
  end
37
+
38
+ private
39
+ def render_bind(attr)
40
+ value = if attr.type.binary? && attr.value
41
+ "<#{attr.value_for_database.to_s.bytesize} bytes of binary data>"
42
+ else
43
+ connection.type_cast(attr.value_for_database)
44
+ end
45
+
46
+ [attr.name, value]
47
+ end
37
48
  end
38
49
  end
@@ -1,4 +1,6 @@
1
- require 'active_support/per_thread_registry'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/per_thread_registry"
2
4
 
3
5
  module ActiveRecord
4
6
  # This is a thread locals registry for EXPLAIN. For example
@@ -7,7 +9,7 @@ module ActiveRecord
7
9
  #
8
10
  # returns the collected queries local to the current thread.
9
11
  #
10
- # See the documentation of <tt>ActiveSupport::PerThreadRegistry</tt>
12
+ # See the documentation of ActiveSupport::PerThreadRegistry
11
13
  # for further details.
12
14
  class ExplainRegistry # :nodoc:
13
15
  extend ActiveSupport::PerThreadRegistry
@@ -1,5 +1,7 @@
1
- require 'active_support/notifications'
2
- require 'active_record/explain_registry'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/notifications"
4
+ require "active_record/explain_registry"
3
5
 
4
6
  module ActiveRecord
5
7
  class ExplainSubscriber # :nodoc:
@@ -14,14 +16,17 @@ module ActiveRecord
14
16
  end
15
17
 
16
18
  # SCHEMA queries cannot be EXPLAINed, also we do not want to run EXPLAIN on
17
- # our own EXPLAINs now matter how loopingly beautiful that would be.
19
+ # our own EXPLAINs no matter how loopingly beautiful that would be.
18
20
  #
19
21
  # On the other hand, we want to monitor the performance of our real database
20
22
  # queries, not the performance of the access to the query cache.
21
- IGNORED_PAYLOADS = %w(SCHEMA EXPLAIN CACHE)
23
+ IGNORED_PAYLOADS = %w(SCHEMA EXPLAIN)
22
24
  EXPLAINED_SQLS = /\A\s*(with|select|update|delete|insert)\b/i
23
25
  def ignore_payload?(payload)
24
- payload[:exception] || IGNORED_PAYLOADS.include?(payload[:name]) || payload[:sql] !~ EXPLAINED_SQLS
26
+ payload[:exception] ||
27
+ payload[:cached] ||
28
+ IGNORED_PAYLOADS.include?(payload[:name]) ||
29
+ payload[:sql] !~ EXPLAINED_SQLS
25
30
  end
26
31
 
27
32
  ActiveSupport::Notifications.subscribe("sql.active_record", new)
@@ -1,5 +1,7 @@
1
- require 'erb'
2
- require 'yaml'
1
+ # frozen_string_literal: true
2
+
3
+ require "erb"
4
+ require "yaml"
3
5
 
4
6
  module ActiveRecord
5
7
  class FixtureSet
@@ -17,38 +19,62 @@ module ActiveRecord
17
19
 
18
20
  def initialize(file)
19
21
  @file = file
20
- @rows = nil
21
22
  end
22
23
 
23
24
  def each(&block)
24
25
  rows.each(&block)
25
26
  end
26
27
 
28
+ def model_class
29
+ config_row["model_class"]
30
+ end
27
31
 
28
32
  private
29
33
  def rows
30
- return @rows if @rows
34
+ @rows ||= raw_rows.reject { |fixture_name, _| fixture_name == "_fixture" }
35
+ end
31
36
 
32
- begin
37
+ def config_row
38
+ @config_row ||= begin
39
+ row = raw_rows.find { |fixture_name, _| fixture_name == "_fixture" }
40
+ if row
41
+ row.last
42
+ else
43
+ { 'model_class': nil }
44
+ end
45
+ end
46
+ end
47
+
48
+ def raw_rows
49
+ @raw_rows ||= begin
33
50
  data = YAML.load(render(IO.read(@file)))
51
+ data ? validate(data).to_a : []
34
52
  rescue ArgumentError, Psych::SyntaxError => error
35
53
  raise Fixture::FormatError, "a YAML error occurred parsing #{@file}. Please note that YAML must be consistently indented using spaces. Tabs are not allowed. Please have a look at http://www.yaml.org/faq.html\nThe exact error was:\n #{error.class}: #{error}", error.backtrace
36
54
  end
37
- @rows = data ? validate(data).to_a : []
55
+ end
56
+
57
+ def prepare_erb(content)
58
+ erb = ERB.new(content)
59
+ erb.filename = @file
60
+ erb
38
61
  end
39
62
 
40
63
  def render(content)
41
64
  context = ActiveRecord::FixtureSet::RenderContext.create_subclass.new
42
- ERB.new(content).result(context.get_binding)
65
+ prepare_erb(content).result(context.get_binding)
43
66
  end
44
67
 
45
68
  # Validate our unmarshalled data.
46
69
  def validate(data)
47
70
  unless Hash === data || YAML::Omap === data
48
- raise Fixture::FormatError, 'fixture is not a hash'
71
+ raise Fixture::FormatError, "fixture is not a hash: #{@file}"
49
72
  end
50
73
 
51
- raise Fixture::FormatError unless data.all? { |name, row| Hash === row }
74
+ invalid = data.reject { |_, row| Hash === row }
75
+ if invalid.any?
76
+ raise Fixture::FormatError, "fixture key is not a hash: #{@file}, keys: #{invalid.keys.inspect}"
77
+ end
52
78
  data
53
79
  end
54
80
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class FixtureSet
5
+ class ModelMetadata # :nodoc:
6
+ def initialize(model_class)
7
+ @model_class = model_class
8
+ end
9
+
10
+ def primary_key_name
11
+ @primary_key_name ||= @model_class && @model_class.primary_key
12
+ end
13
+
14
+ def primary_key_type
15
+ @primary_key_type ||= @model_class && @model_class.type_for_attribute(@model_class.primary_key).type
16
+ end
17
+
18
+ def has_primary_key_column?
19
+ @has_primary_key_column ||= primary_key_name &&
20
+ @model_class.columns.any? { |col| col.name == primary_key_name }
21
+ end
22
+
23
+ def timestamp_column_names
24
+ @timestamp_column_names ||=
25
+ %w(created_at created_on updated_at updated_on) & @model_class.column_names
26
+ end
27
+
28
+ def inheritance_column_name
29
+ @inheritance_column_name ||= @model_class && @model_class.inheritance_column
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # NOTE: This class has to be defined in compact style in
4
+ # order for rendering context subclassing to work correctly.
5
+ class ActiveRecord::FixtureSet::RenderContext # :nodoc:
6
+ def self.create_subclass
7
+ Class.new(ActiveRecord::FixtureSet.context_class) do
8
+ def get_binding
9
+ binding()
10
+ end
11
+
12
+ def binary(path)
13
+ %(!!binary "#{Base64.strict_encode64(File.read(path))}")
14
+ end
15
+ end
16
+ end
17
+ end