omg-activerecord 8.0.0.alpha1

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 (412) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +355 -0
  3. data/MIT-LICENSE +22 -0
  4. data/README.rdoc +219 -0
  5. data/examples/performance.rb +185 -0
  6. data/examples/simple.rb +15 -0
  7. data/lib/active_record/aggregations.rb +287 -0
  8. data/lib/active_record/association_relation.rb +50 -0
  9. data/lib/active_record/associations/alias_tracker.rb +90 -0
  10. data/lib/active_record/associations/association.rb +417 -0
  11. data/lib/active_record/associations/association_scope.rb +175 -0
  12. data/lib/active_record/associations/belongs_to_association.rb +163 -0
  13. data/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
  14. data/lib/active_record/associations/builder/association.rb +170 -0
  15. data/lib/active_record/associations/builder/belongs_to.rb +160 -0
  16. data/lib/active_record/associations/builder/collection_association.rb +80 -0
  17. data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +107 -0
  18. data/lib/active_record/associations/builder/has_many.rb +23 -0
  19. data/lib/active_record/associations/builder/has_one.rb +61 -0
  20. data/lib/active_record/associations/builder/singular_association.rb +48 -0
  21. data/lib/active_record/associations/collection_association.rb +535 -0
  22. data/lib/active_record/associations/collection_proxy.rb +1163 -0
  23. data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
  24. data/lib/active_record/associations/errors.rb +265 -0
  25. data/lib/active_record/associations/foreign_association.rb +40 -0
  26. data/lib/active_record/associations/has_many_association.rb +167 -0
  27. data/lib/active_record/associations/has_many_through_association.rb +232 -0
  28. data/lib/active_record/associations/has_one_association.rb +142 -0
  29. data/lib/active_record/associations/has_one_through_association.rb +45 -0
  30. data/lib/active_record/associations/join_dependency/join_association.rb +106 -0
  31. data/lib/active_record/associations/join_dependency/join_base.rb +23 -0
  32. data/lib/active_record/associations/join_dependency/join_part.rb +71 -0
  33. data/lib/active_record/associations/join_dependency.rb +301 -0
  34. data/lib/active_record/associations/nested_error.rb +47 -0
  35. data/lib/active_record/associations/preloader/association.rb +316 -0
  36. data/lib/active_record/associations/preloader/batch.rb +48 -0
  37. data/lib/active_record/associations/preloader/branch.rb +153 -0
  38. data/lib/active_record/associations/preloader/through_association.rb +150 -0
  39. data/lib/active_record/associations/preloader.rb +135 -0
  40. data/lib/active_record/associations/singular_association.rb +76 -0
  41. data/lib/active_record/associations/through_association.rb +132 -0
  42. data/lib/active_record/associations.rb +1897 -0
  43. data/lib/active_record/asynchronous_queries_tracker.rb +64 -0
  44. data/lib/active_record/attribute_assignment.rb +82 -0
  45. data/lib/active_record/attribute_methods/before_type_cast.rb +106 -0
  46. data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
  47. data/lib/active_record/attribute_methods/dirty.rb +262 -0
  48. data/lib/active_record/attribute_methods/primary_key.rb +158 -0
  49. data/lib/active_record/attribute_methods/query.rb +50 -0
  50. data/lib/active_record/attribute_methods/read.rb +46 -0
  51. data/lib/active_record/attribute_methods/serialization.rb +232 -0
  52. data/lib/active_record/attribute_methods/time_zone_conversion.rb +94 -0
  53. data/lib/active_record/attribute_methods/write.rb +49 -0
  54. data/lib/active_record/attribute_methods.rb +542 -0
  55. data/lib/active_record/attributes.rb +307 -0
  56. data/lib/active_record/autosave_association.rb +586 -0
  57. data/lib/active_record/base.rb +338 -0
  58. data/lib/active_record/callbacks.rb +452 -0
  59. data/lib/active_record/coders/column_serializer.rb +61 -0
  60. data/lib/active_record/coders/json.rb +15 -0
  61. data/lib/active_record/coders/yaml_column.rb +95 -0
  62. data/lib/active_record/connection_adapters/abstract/connection_handler.rb +290 -0
  63. data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +210 -0
  64. data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +78 -0
  65. data/lib/active_record/connection_adapters/abstract/connection_pool.rb +923 -0
  66. data/lib/active_record/connection_adapters/abstract/database_limits.rb +31 -0
  67. data/lib/active_record/connection_adapters/abstract/database_statements.rb +747 -0
  68. data/lib/active_record/connection_adapters/abstract/query_cache.rb +319 -0
  69. data/lib/active_record/connection_adapters/abstract/quoting.rb +239 -0
  70. data/lib/active_record/connection_adapters/abstract/savepoints.rb +24 -0
  71. data/lib/active_record/connection_adapters/abstract/schema_creation.rb +190 -0
  72. data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +961 -0
  73. data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +106 -0
  74. data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1883 -0
  75. data/lib/active_record/connection_adapters/abstract/transaction.rb +676 -0
  76. data/lib/active_record/connection_adapters/abstract_adapter.rb +1218 -0
  77. data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +1016 -0
  78. data/lib/active_record/connection_adapters/column.rb +122 -0
  79. data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
  80. data/lib/active_record/connection_adapters/mysql/column.rb +28 -0
  81. data/lib/active_record/connection_adapters/mysql/database_statements.rb +95 -0
  82. data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
  83. data/lib/active_record/connection_adapters/mysql/quoting.rb +114 -0
  84. data/lib/active_record/connection_adapters/mysql/schema_creation.rb +106 -0
  85. data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +106 -0
  86. data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +97 -0
  87. data/lib/active_record/connection_adapters/mysql/schema_statements.rb +300 -0
  88. data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
  89. data/lib/active_record/connection_adapters/mysql2/database_statements.rb +96 -0
  90. data/lib/active_record/connection_adapters/mysql2_adapter.rb +196 -0
  91. data/lib/active_record/connection_adapters/pool_config.rb +83 -0
  92. data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
  93. data/lib/active_record/connection_adapters/postgresql/column.rb +82 -0
  94. data/lib/active_record/connection_adapters/postgresql/database_statements.rb +231 -0
  95. data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
  96. data/lib/active_record/connection_adapters/postgresql/oid/array.rb +91 -0
  97. data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
  98. data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
  99. data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
  100. data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +54 -0
  101. data/lib/active_record/connection_adapters/postgresql/oid/date.rb +31 -0
  102. data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
  103. data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
  104. data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +20 -0
  105. data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +109 -0
  106. data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
  107. data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
  108. data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
  109. data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
  110. data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
  111. data/lib/active_record/connection_adapters/postgresql/oid/money.rb +42 -0
  112. data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
  113. data/lib/active_record/connection_adapters/postgresql/oid/point.rb +74 -0
  114. data/lib/active_record/connection_adapters/postgresql/oid/range.rb +124 -0
  115. data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
  116. data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
  117. data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
  118. data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +125 -0
  119. data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +45 -0
  120. data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
  121. data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
  122. data/lib/active_record/connection_adapters/postgresql/oid.rb +38 -0
  123. data/lib/active_record/connection_adapters/postgresql/quoting.rb +238 -0
  124. data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +71 -0
  125. data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +169 -0
  126. data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +392 -0
  127. data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +127 -0
  128. data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +1162 -0
  129. data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
  130. data/lib/active_record/connection_adapters/postgresql/utils.rb +79 -0
  131. data/lib/active_record/connection_adapters/postgresql_adapter.rb +1182 -0
  132. data/lib/active_record/connection_adapters/schema_cache.rb +478 -0
  133. data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
  134. data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
  135. data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +145 -0
  136. data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
  137. data/lib/active_record/connection_adapters/sqlite3/quoting.rb +116 -0
  138. data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +37 -0
  139. data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +39 -0
  140. data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +47 -0
  141. data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +221 -0
  142. data/lib/active_record/connection_adapters/sqlite3_adapter.rb +843 -0
  143. data/lib/active_record/connection_adapters/statement_pool.rb +67 -0
  144. data/lib/active_record/connection_adapters/trilogy/database_statements.rb +69 -0
  145. data/lib/active_record/connection_adapters/trilogy_adapter.rb +212 -0
  146. data/lib/active_record/connection_adapters.rb +176 -0
  147. data/lib/active_record/connection_handling.rb +413 -0
  148. data/lib/active_record/core.rb +836 -0
  149. data/lib/active_record/counter_cache.rb +230 -0
  150. data/lib/active_record/database_configurations/connection_url_resolver.rb +105 -0
  151. data/lib/active_record/database_configurations/database_config.rb +104 -0
  152. data/lib/active_record/database_configurations/hash_config.rb +172 -0
  153. data/lib/active_record/database_configurations/url_config.rb +78 -0
  154. data/lib/active_record/database_configurations.rb +309 -0
  155. data/lib/active_record/delegated_type.rb +289 -0
  156. data/lib/active_record/deprecator.rb +7 -0
  157. data/lib/active_record/destroy_association_async_job.rb +38 -0
  158. data/lib/active_record/disable_joins_association_relation.rb +39 -0
  159. data/lib/active_record/dynamic_matchers.rb +121 -0
  160. data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
  161. data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
  162. data/lib/active_record/encryption/cipher.rb +53 -0
  163. data/lib/active_record/encryption/config.rb +70 -0
  164. data/lib/active_record/encryption/configurable.rb +60 -0
  165. data/lib/active_record/encryption/context.rb +42 -0
  166. data/lib/active_record/encryption/contexts.rb +76 -0
  167. data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
  168. data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
  169. data/lib/active_record/encryption/encryptable_record.rb +230 -0
  170. data/lib/active_record/encryption/encrypted_attribute_type.rb +184 -0
  171. data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
  172. data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
  173. data/lib/active_record/encryption/encryptor.rb +177 -0
  174. data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
  175. data/lib/active_record/encryption/errors.rb +15 -0
  176. data/lib/active_record/encryption/extended_deterministic_queries.rb +159 -0
  177. data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
  178. data/lib/active_record/encryption/key.rb +28 -0
  179. data/lib/active_record/encryption/key_generator.rb +53 -0
  180. data/lib/active_record/encryption/key_provider.rb +46 -0
  181. data/lib/active_record/encryption/message.rb +33 -0
  182. data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
  183. data/lib/active_record/encryption/message_serializer.rb +96 -0
  184. data/lib/active_record/encryption/null_encryptor.rb +25 -0
  185. data/lib/active_record/encryption/properties.rb +76 -0
  186. data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
  187. data/lib/active_record/encryption/scheme.rb +107 -0
  188. data/lib/active_record/encryption.rb +58 -0
  189. data/lib/active_record/enum.rb +424 -0
  190. data/lib/active_record/errors.rb +614 -0
  191. data/lib/active_record/explain.rb +63 -0
  192. data/lib/active_record/explain_registry.rb +37 -0
  193. data/lib/active_record/explain_subscriber.rb +34 -0
  194. data/lib/active_record/fixture_set/file.rb +89 -0
  195. data/lib/active_record/fixture_set/model_metadata.rb +42 -0
  196. data/lib/active_record/fixture_set/render_context.rb +19 -0
  197. data/lib/active_record/fixture_set/table_row.rb +208 -0
  198. data/lib/active_record/fixture_set/table_rows.rb +46 -0
  199. data/lib/active_record/fixtures.rb +850 -0
  200. data/lib/active_record/future_result.rb +182 -0
  201. data/lib/active_record/gem_version.rb +17 -0
  202. data/lib/active_record/inheritance.rb +366 -0
  203. data/lib/active_record/insert_all.rb +328 -0
  204. data/lib/active_record/integration.rb +209 -0
  205. data/lib/active_record/internal_metadata.rb +164 -0
  206. data/lib/active_record/legacy_yaml_adapter.rb +15 -0
  207. data/lib/active_record/locale/en.yml +48 -0
  208. data/lib/active_record/locking/optimistic.rb +228 -0
  209. data/lib/active_record/locking/pessimistic.rb +102 -0
  210. data/lib/active_record/log_subscriber.rb +149 -0
  211. data/lib/active_record/marshalling.rb +56 -0
  212. data/lib/active_record/message_pack.rb +124 -0
  213. data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
  214. data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
  215. data/lib/active_record/middleware/database_selector.rb +87 -0
  216. data/lib/active_record/middleware/shard_selector.rb +62 -0
  217. data/lib/active_record/migration/command_recorder.rb +406 -0
  218. data/lib/active_record/migration/compatibility.rb +490 -0
  219. data/lib/active_record/migration/default_strategy.rb +22 -0
  220. data/lib/active_record/migration/execution_strategy.rb +19 -0
  221. data/lib/active_record/migration/join_table.rb +16 -0
  222. data/lib/active_record/migration/pending_migration_connection.rb +21 -0
  223. data/lib/active_record/migration.rb +1626 -0
  224. data/lib/active_record/model_schema.rb +635 -0
  225. data/lib/active_record/nested_attributes.rb +633 -0
  226. data/lib/active_record/no_touching.rb +65 -0
  227. data/lib/active_record/normalization.rb +163 -0
  228. data/lib/active_record/persistence.rb +968 -0
  229. data/lib/active_record/promise.rb +84 -0
  230. data/lib/active_record/query_cache.rb +56 -0
  231. data/lib/active_record/query_logs.rb +247 -0
  232. data/lib/active_record/query_logs_formatter.rb +30 -0
  233. data/lib/active_record/querying.rb +122 -0
  234. data/lib/active_record/railtie.rb +440 -0
  235. data/lib/active_record/railties/console_sandbox.rb +5 -0
  236. data/lib/active_record/railties/controller_runtime.rb +65 -0
  237. data/lib/active_record/railties/databases.rake +641 -0
  238. data/lib/active_record/railties/job_runtime.rb +23 -0
  239. data/lib/active_record/readonly_attributes.rb +66 -0
  240. data/lib/active_record/reflection.rb +1287 -0
  241. data/lib/active_record/relation/batches/batch_enumerator.rb +115 -0
  242. data/lib/active_record/relation/batches.rb +491 -0
  243. data/lib/active_record/relation/calculations.rb +679 -0
  244. data/lib/active_record/relation/delegation.rb +154 -0
  245. data/lib/active_record/relation/finder_methods.rb +661 -0
  246. data/lib/active_record/relation/from_clause.rb +30 -0
  247. data/lib/active_record/relation/merger.rb +192 -0
  248. data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
  249. data/lib/active_record/relation/predicate_builder/association_query_value.rb +76 -0
  250. data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
  251. data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +60 -0
  252. data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
  253. data/lib/active_record/relation/predicate_builder/relation_handler.rb +24 -0
  254. data/lib/active_record/relation/predicate_builder.rb +181 -0
  255. data/lib/active_record/relation/query_attribute.rb +68 -0
  256. data/lib/active_record/relation/query_methods.rb +2235 -0
  257. data/lib/active_record/relation/record_fetch_warning.rb +52 -0
  258. data/lib/active_record/relation/spawn_methods.rb +78 -0
  259. data/lib/active_record/relation/where_clause.rb +218 -0
  260. data/lib/active_record/relation.rb +1495 -0
  261. data/lib/active_record/result.rb +249 -0
  262. data/lib/active_record/runtime_registry.rb +82 -0
  263. data/lib/active_record/sanitization.rb +254 -0
  264. data/lib/active_record/schema.rb +77 -0
  265. data/lib/active_record/schema_dumper.rb +364 -0
  266. data/lib/active_record/schema_migration.rb +106 -0
  267. data/lib/active_record/scoping/default.rb +205 -0
  268. data/lib/active_record/scoping/named.rb +202 -0
  269. data/lib/active_record/scoping.rb +136 -0
  270. data/lib/active_record/secure_password.rb +60 -0
  271. data/lib/active_record/secure_token.rb +66 -0
  272. data/lib/active_record/serialization.rb +29 -0
  273. data/lib/active_record/signed_id.rb +137 -0
  274. data/lib/active_record/statement_cache.rb +164 -0
  275. data/lib/active_record/store.rb +299 -0
  276. data/lib/active_record/suppressor.rb +59 -0
  277. data/lib/active_record/table_metadata.rb +85 -0
  278. data/lib/active_record/tasks/database_tasks.rb +681 -0
  279. data/lib/active_record/tasks/mysql_database_tasks.rb +120 -0
  280. data/lib/active_record/tasks/postgresql_database_tasks.rb +147 -0
  281. data/lib/active_record/tasks/sqlite_database_tasks.rb +89 -0
  282. data/lib/active_record/test_databases.rb +24 -0
  283. data/lib/active_record/test_fixtures.rb +321 -0
  284. data/lib/active_record/testing/query_assertions.rb +121 -0
  285. data/lib/active_record/timestamp.rb +177 -0
  286. data/lib/active_record/token_for.rb +123 -0
  287. data/lib/active_record/touch_later.rb +70 -0
  288. data/lib/active_record/transaction.rb +132 -0
  289. data/lib/active_record/transactions.rb +523 -0
  290. data/lib/active_record/translation.rb +22 -0
  291. data/lib/active_record/type/adapter_specific_registry.rb +144 -0
  292. data/lib/active_record/type/date.rb +9 -0
  293. data/lib/active_record/type/date_time.rb +9 -0
  294. data/lib/active_record/type/decimal_without_scale.rb +15 -0
  295. data/lib/active_record/type/hash_lookup_type_map.rb +57 -0
  296. data/lib/active_record/type/internal/timezone.rb +22 -0
  297. data/lib/active_record/type/json.rb +30 -0
  298. data/lib/active_record/type/serialized.rb +76 -0
  299. data/lib/active_record/type/text.rb +11 -0
  300. data/lib/active_record/type/time.rb +35 -0
  301. data/lib/active_record/type/type_map.rb +58 -0
  302. data/lib/active_record/type/unsigned_integer.rb +16 -0
  303. data/lib/active_record/type.rb +83 -0
  304. data/lib/active_record/type_caster/connection.rb +33 -0
  305. data/lib/active_record/type_caster/map.rb +23 -0
  306. data/lib/active_record/type_caster.rb +9 -0
  307. data/lib/active_record/validations/absence.rb +25 -0
  308. data/lib/active_record/validations/associated.rb +65 -0
  309. data/lib/active_record/validations/length.rb +26 -0
  310. data/lib/active_record/validations/numericality.rb +36 -0
  311. data/lib/active_record/validations/presence.rb +45 -0
  312. data/lib/active_record/validations/uniqueness.rb +295 -0
  313. data/lib/active_record/validations.rb +101 -0
  314. data/lib/active_record/version.rb +10 -0
  315. data/lib/active_record.rb +616 -0
  316. data/lib/arel/alias_predication.rb +9 -0
  317. data/lib/arel/attributes/attribute.rb +33 -0
  318. data/lib/arel/collectors/bind.rb +31 -0
  319. data/lib/arel/collectors/composite.rb +46 -0
  320. data/lib/arel/collectors/plain_string.rb +20 -0
  321. data/lib/arel/collectors/sql_string.rb +27 -0
  322. data/lib/arel/collectors/substitute_binds.rb +35 -0
  323. data/lib/arel/crud.rb +48 -0
  324. data/lib/arel/delete_manager.rb +32 -0
  325. data/lib/arel/errors.rb +19 -0
  326. data/lib/arel/expressions.rb +29 -0
  327. data/lib/arel/factory_methods.rb +53 -0
  328. data/lib/arel/filter_predications.rb +9 -0
  329. data/lib/arel/insert_manager.rb +48 -0
  330. data/lib/arel/math.rb +45 -0
  331. data/lib/arel/nodes/ascending.rb +23 -0
  332. data/lib/arel/nodes/binary.rb +125 -0
  333. data/lib/arel/nodes/bind_param.rb +44 -0
  334. data/lib/arel/nodes/bound_sql_literal.rb +65 -0
  335. data/lib/arel/nodes/case.rb +55 -0
  336. data/lib/arel/nodes/casted.rb +62 -0
  337. data/lib/arel/nodes/comment.rb +29 -0
  338. data/lib/arel/nodes/count.rb +12 -0
  339. data/lib/arel/nodes/cte.rb +36 -0
  340. data/lib/arel/nodes/delete_statement.rb +44 -0
  341. data/lib/arel/nodes/descending.rb +23 -0
  342. data/lib/arel/nodes/equality.rb +15 -0
  343. data/lib/arel/nodes/extract.rb +24 -0
  344. data/lib/arel/nodes/false.rb +16 -0
  345. data/lib/arel/nodes/filter.rb +10 -0
  346. data/lib/arel/nodes/fragments.rb +35 -0
  347. data/lib/arel/nodes/full_outer_join.rb +8 -0
  348. data/lib/arel/nodes/function.rb +45 -0
  349. data/lib/arel/nodes/grouping.rb +11 -0
  350. data/lib/arel/nodes/homogeneous_in.rb +68 -0
  351. data/lib/arel/nodes/in.rb +15 -0
  352. data/lib/arel/nodes/infix_operation.rb +92 -0
  353. data/lib/arel/nodes/inner_join.rb +8 -0
  354. data/lib/arel/nodes/insert_statement.rb +37 -0
  355. data/lib/arel/nodes/join_source.rb +20 -0
  356. data/lib/arel/nodes/leading_join.rb +8 -0
  357. data/lib/arel/nodes/matches.rb +18 -0
  358. data/lib/arel/nodes/named_function.rb +23 -0
  359. data/lib/arel/nodes/nary.rb +39 -0
  360. data/lib/arel/nodes/node.rb +161 -0
  361. data/lib/arel/nodes/node_expression.rb +13 -0
  362. data/lib/arel/nodes/ordering.rb +27 -0
  363. data/lib/arel/nodes/outer_join.rb +8 -0
  364. data/lib/arel/nodes/over.rb +15 -0
  365. data/lib/arel/nodes/regexp.rb +16 -0
  366. data/lib/arel/nodes/right_outer_join.rb +8 -0
  367. data/lib/arel/nodes/select_core.rb +67 -0
  368. data/lib/arel/nodes/select_statement.rb +41 -0
  369. data/lib/arel/nodes/sql_literal.rb +32 -0
  370. data/lib/arel/nodes/string_join.rb +11 -0
  371. data/lib/arel/nodes/table_alias.rb +35 -0
  372. data/lib/arel/nodes/terminal.rb +16 -0
  373. data/lib/arel/nodes/true.rb +16 -0
  374. data/lib/arel/nodes/unary.rb +44 -0
  375. data/lib/arel/nodes/unary_operation.rb +20 -0
  376. data/lib/arel/nodes/unqualified_column.rb +22 -0
  377. data/lib/arel/nodes/update_statement.rb +46 -0
  378. data/lib/arel/nodes/values_list.rb +9 -0
  379. data/lib/arel/nodes/window.rb +126 -0
  380. data/lib/arel/nodes/with.rb +11 -0
  381. data/lib/arel/nodes.rb +75 -0
  382. data/lib/arel/order_predications.rb +13 -0
  383. data/lib/arel/predications.rb +260 -0
  384. data/lib/arel/select_manager.rb +276 -0
  385. data/lib/arel/table.rb +121 -0
  386. data/lib/arel/tree_manager.rb +65 -0
  387. data/lib/arel/update_manager.rb +49 -0
  388. data/lib/arel/visitors/dot.rb +299 -0
  389. data/lib/arel/visitors/mysql.rb +111 -0
  390. data/lib/arel/visitors/postgresql.rb +99 -0
  391. data/lib/arel/visitors/sqlite.rb +38 -0
  392. data/lib/arel/visitors/to_sql.rb +1033 -0
  393. data/lib/arel/visitors/visitor.rb +45 -0
  394. data/lib/arel/visitors.rb +13 -0
  395. data/lib/arel/window_predications.rb +9 -0
  396. data/lib/arel.rb +73 -0
  397. data/lib/rails/generators/active_record/application_record/USAGE +8 -0
  398. data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
  399. data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
  400. data/lib/rails/generators/active_record/migration/migration_generator.rb +76 -0
  401. data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +29 -0
  402. data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
  403. data/lib/rails/generators/active_record/migration.rb +54 -0
  404. data/lib/rails/generators/active_record/model/USAGE +113 -0
  405. data/lib/rails/generators/active_record/model/model_generator.rb +94 -0
  406. data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
  407. data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
  408. data/lib/rails/generators/active_record/model/templates/module.rb.tt +7 -0
  409. data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
  410. data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
  411. data/lib/rails/generators/active_record.rb +19 -0
  412. metadata +505 -0
@@ -0,0 +1,641 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "active_support/configuration_file"
5
+ require "active_support/deprecation"
6
+
7
+ databases = ActiveRecord::Tasks::DatabaseTasks.setup_initial_database_yaml
8
+
9
+ db_namespace = namespace :db do
10
+ desc "Set the environment value for the database"
11
+ task "environment:set" => :load_config do
12
+ pool = ActiveRecord::Tasks::DatabaseTasks.migration_connection_pool
13
+ raise ActiveRecord::EnvironmentStorageError unless pool.internal_metadata.enabled?
14
+
15
+ pool.internal_metadata.create_table_and_set_flags(pool.migration_context.current_environment)
16
+ end
17
+
18
+ task check_protected_environments: :load_config do
19
+ ActiveRecord::Tasks::DatabaseTasks.check_protected_environments!
20
+ end
21
+
22
+ task load_config: :environment do
23
+ if ActiveRecord::Base.configurations.empty?
24
+ ActiveRecord::Base.configurations = ActiveRecord::Tasks::DatabaseTasks.database_configuration
25
+ end
26
+
27
+ ActiveRecord::Migrator.migrations_paths = ActiveRecord::Tasks::DatabaseTasks.migrations_paths
28
+ end
29
+
30
+ namespace :create do
31
+ task all: :load_config do
32
+ ActiveRecord::Tasks::DatabaseTasks.create_all
33
+ end
34
+
35
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
36
+ desc "Create #{name} database for current environment"
37
+ task name => :load_config do
38
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
39
+ ActiveRecord::Tasks::DatabaseTasks.create(db_config)
40
+ end
41
+ end
42
+ end
43
+
44
+ desc "Create the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:create:all to create all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to creating the development and test databases, except when DATABASE_URL is present."
45
+ task create: [:load_config] do
46
+ ActiveRecord::Tasks::DatabaseTasks.create_current
47
+ end
48
+
49
+ namespace :drop do
50
+ task all: [:load_config, :check_protected_environments] do
51
+ ActiveRecord::Tasks::DatabaseTasks.drop_all
52
+ end
53
+
54
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
55
+ desc "Drop #{name} database for current environment"
56
+ task name => [:load_config, :check_protected_environments] do
57
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
58
+ ActiveRecord::Tasks::DatabaseTasks.drop(db_config)
59
+ end
60
+ end
61
+ end
62
+
63
+ desc "Drop the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:drop:all to drop all databases in the config). Without RAILS_ENV or when RAILS_ENV is development, it defaults to dropping the development and test databases, except when DATABASE_URL is present."
64
+ task drop: [:load_config, :check_protected_environments] do
65
+ db_namespace["drop:_unsafe"].invoke
66
+ end
67
+
68
+ task "drop:_unsafe" => [:load_config] do
69
+ ActiveRecord::Tasks::DatabaseTasks.drop_current
70
+ end
71
+
72
+ namespace :purge do
73
+ task all: [:load_config, :check_protected_environments] do
74
+ ActiveRecord::Tasks::DatabaseTasks.purge_all
75
+ end
76
+ end
77
+
78
+ # desc "Truncates tables of each database for current environment"
79
+ task truncate_all: [:load_config, :check_protected_environments] do
80
+ ActiveRecord::Tasks::DatabaseTasks.truncate_all
81
+ end
82
+
83
+ # desc "Empty the database from DATABASE_URL or config/database.yml for the current RAILS_ENV (use db:purge:all to purge all databases in the config). Without RAILS_ENV it defaults to purging the development and test databases, except when DATABASE_URL is present."
84
+ task purge: [:load_config, :check_protected_environments] do
85
+ ActiveRecord::Tasks::DatabaseTasks.purge_current
86
+ end
87
+
88
+ desc "Migrate the database (options: VERSION=x, VERBOSE=false, SCOPE=blog)."
89
+ task migrate: :load_config do
90
+ db_configs = ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env)
91
+
92
+ if db_configs.size == 1 && db_configs.first.primary?
93
+ ActiveRecord::Tasks::DatabaseTasks.migrate
94
+ else
95
+ mapped_versions = ActiveRecord::Tasks::DatabaseTasks.db_configs_with_versions
96
+
97
+ mapped_versions.sort.each do |version, db_configs|
98
+ db_configs.each do |db_config|
99
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection(db_config) do
100
+ ActiveRecord::Tasks::DatabaseTasks.migrate(version)
101
+ end
102
+ end
103
+ end
104
+ end
105
+
106
+ db_namespace["_dump"].invoke
107
+ end
108
+
109
+ # IMPORTANT: This task won't dump the schema if ActiveRecord.dump_schema_after_migration is set to false
110
+ task :_dump do
111
+ if ActiveRecord.dump_schema_after_migration
112
+ db_namespace["schema:dump"].invoke
113
+ end
114
+ # Allow this task to be called as many times as required. An example is the
115
+ # migrate:redo task, which calls other two internally that depend on this one.
116
+ db_namespace["_dump"].reenable
117
+ end
118
+
119
+ namespace :_dump do
120
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
121
+ # IMPORTANT: This task won't dump the schema if ActiveRecord.dump_schema_after_migration is set to false
122
+ task name do
123
+ if ActiveRecord.dump_schema_after_migration
124
+ db_namespace["schema:dump:#{name}"].invoke
125
+ end
126
+
127
+ # Allow this task to be called as many times as required. An example is the
128
+ # migrate:redo task, which calls other two internally that depend on this one.
129
+ db_namespace["_dump:#{name}"].reenable
130
+ end
131
+ end
132
+ end
133
+
134
+ namespace :migrate do
135
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
136
+ desc "Migrate #{name} database for current environment"
137
+ task name => :load_config do
138
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do
139
+ ActiveRecord::Tasks::DatabaseTasks.migrate
140
+ end
141
+
142
+ db_namespace["_dump:#{name}"].invoke
143
+ end
144
+ end
145
+
146
+ desc "Roll back the database one migration and re-migrate up (options: STEP=x, VERSION=x)."
147
+ task redo: :load_config do
148
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:redo")
149
+
150
+ raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
151
+
152
+ if ENV["VERSION"]
153
+ db_namespace["migrate:down"].invoke
154
+ db_namespace["migrate:up"].invoke
155
+ else
156
+ db_namespace["rollback"].invoke
157
+ db_namespace["migrate"].invoke
158
+ end
159
+ end
160
+
161
+ namespace :redo do
162
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
163
+ desc "Roll back #{name} database one migration and re-migrate up (options: STEP=x, VERSION=x)."
164
+ task name => :load_config do
165
+ raise "Empty VERSION provided" if ENV["VERSION"] && ENV["VERSION"].empty?
166
+
167
+ if ENV["VERSION"]
168
+ db_namespace["migrate:down:#{name}"].invoke
169
+ db_namespace["migrate:up:#{name}"].invoke
170
+ else
171
+ db_namespace["rollback:#{name}"].invoke
172
+ db_namespace["migrate:#{name}"].invoke
173
+ end
174
+ end
175
+ end
176
+ end
177
+
178
+ # desc 'Resets your database using your migrations for the current environment'
179
+ task reset: ["db:drop", "db:create", "db:migrate"]
180
+
181
+ desc 'Run the "up" for a given migration VERSION.'
182
+ task up: :load_config do
183
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:up")
184
+
185
+ raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
186
+
187
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
188
+
189
+ ActiveRecord::Tasks::DatabaseTasks.migration_connection_pool.migration_context.run(
190
+ :up,
191
+ ActiveRecord::Tasks::DatabaseTasks.target_version
192
+ )
193
+ db_namespace["_dump"].invoke
194
+ end
195
+
196
+ namespace :up do
197
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
198
+ desc "Run the \"up\" on #{name} database for a given migration VERSION."
199
+ task name => :load_config do
200
+ raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
201
+
202
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do |pool|
203
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
204
+ pool.migration_context.run(:up, ActiveRecord::Tasks::DatabaseTasks.target_version)
205
+ end
206
+
207
+ db_namespace["_dump:#{name}"].invoke
208
+ end
209
+ end
210
+ end
211
+
212
+ desc 'Run the "down" for a given migration VERSION.'
213
+ task down: :load_config do
214
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:migrate:down")
215
+
216
+ raise "VERSION is required - To go down one migration, use db:rollback" if !ENV["VERSION"] || ENV["VERSION"].empty?
217
+
218
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
219
+
220
+ ActiveRecord::Tasks::DatabaseTasks.migration_connection_pool.migration_context.run(
221
+ :down,
222
+ ActiveRecord::Tasks::DatabaseTasks.target_version
223
+ )
224
+ db_namespace["_dump"].invoke
225
+ end
226
+
227
+ namespace :down do
228
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
229
+ desc "Run the \"down\" on #{name} database for a given migration VERSION."
230
+ task name => :load_config do
231
+ raise "VERSION is required" if !ENV["VERSION"] || ENV["VERSION"].empty?
232
+
233
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do |pool|
234
+ ActiveRecord::Tasks::DatabaseTasks.check_target_version
235
+ pool.migration_context.run(:down, ActiveRecord::Tasks::DatabaseTasks.target_version)
236
+ end
237
+
238
+ db_namespace["_dump:#{name}"].invoke
239
+ end
240
+ end
241
+ end
242
+
243
+ desc "Display status of migrations"
244
+ task status: :load_config do
245
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each do
246
+ ActiveRecord::Tasks::DatabaseTasks.migrate_status
247
+ end
248
+ end
249
+
250
+ namespace :status do
251
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
252
+ desc "Display status of migrations for #{name} database"
253
+ task name => :load_config do
254
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do
255
+ ActiveRecord::Tasks::DatabaseTasks.migrate_status
256
+ end
257
+ end
258
+ end
259
+ end
260
+ end
261
+
262
+ namespace :rollback do
263
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
264
+ desc "Rollback #{name} database for current environment (specify steps w/ STEP=n)."
265
+ task name => :load_config do
266
+ step = ENV["STEP"] ? ENV["STEP"].to_i : 1
267
+
268
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do |pool|
269
+ pool.migration_context.rollback(step)
270
+ end
271
+
272
+ db_namespace["_dump:#{name}"].invoke
273
+ end
274
+ end
275
+ end
276
+
277
+ desc "Roll the schema back to the previous version (specify steps w/ STEP=n)."
278
+ task rollback: :load_config do
279
+ ActiveRecord::Tasks::DatabaseTasks.raise_for_multi_db(command: "db:rollback")
280
+ raise "VERSION is not supported - To rollback a specific version, use db:migrate:down" if ENV["VERSION"]
281
+
282
+ step = ENV["STEP"] ? ENV["STEP"].to_i : 1
283
+
284
+ ActiveRecord::Tasks::DatabaseTasks.migration_connection_pool.migration_context.rollback(step)
285
+
286
+ db_namespace["_dump"].invoke
287
+ end
288
+
289
+ # desc 'Pushes the schema to the next version (specify steps w/ STEP=n).'
290
+ task forward: :load_config do
291
+ step = ENV["STEP"] ? ENV["STEP"].to_i : 1
292
+
293
+ ActiveRecord::Tasks::DatabaseTasks.migration_connection_pool.migration_context.forward(step)
294
+
295
+ db_namespace["_dump"].invoke
296
+ end
297
+
298
+ namespace :reset do
299
+ task all: ["db:drop", "db:setup"]
300
+
301
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
302
+ desc "Drop and recreate the #{name} database from its schema for the current environment and load the seeds."
303
+ task name => ["db:drop:#{name}", "db:setup:#{name}"]
304
+ end
305
+ end
306
+
307
+ desc "Drop and recreate all databases from their schema for the current environment and load the seeds."
308
+ task reset: [ "db:drop", "db:setup" ]
309
+
310
+ # desc "Retrieve the charset for the current environment's database"
311
+ task charset: :load_config do
312
+ puts ActiveRecord::Tasks::DatabaseTasks.charset_current
313
+ end
314
+
315
+ # desc "Retrieve the collation for the current environment's database"
316
+ task collation: :load_config do
317
+ puts ActiveRecord::Tasks::DatabaseTasks.collation_current
318
+ rescue NoMethodError
319
+ $stderr.puts "Sorry, your database adapter is not supported yet. Feel free to submit a patch."
320
+ end
321
+
322
+ desc "Retrieve the current schema version number"
323
+ task version: :load_config do
324
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env) do |pool|
325
+ puts "\ndatabase: #{pool.db_config.database}\n"
326
+ puts "Current version: #{pool.migration_context.current_version}"
327
+ puts
328
+ end
329
+ end
330
+
331
+ namespace :version do
332
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
333
+ desc "Retrieve the current schema version number for #{name} database"
334
+ task name => :load_config do
335
+ db_config = ActiveRecord::Base.configurations.configs_for(env_name: Rails.env, name: name)
336
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_connection(db_config) do |connection|
337
+ puts "Current version: #{connection.schema_version}"
338
+ end
339
+ end
340
+ end
341
+ end
342
+
343
+ # desc "Raises an error if there are pending migrations"
344
+ task abort_if_pending_migrations: :load_config do
345
+ pending_migrations = []
346
+
347
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each do |pool|
348
+ pending_migrations << pool.migration_context.open.pending_migrations
349
+ end
350
+
351
+ pending_migrations = pending_migrations.flatten!
352
+
353
+ if pending_migrations.any?
354
+ puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
355
+
356
+ pending_migrations.each do |pending_migration|
357
+ puts " %4d %s" % [pending_migration.version, pending_migration.name]
358
+ end
359
+
360
+ abort %{Run `bin/rails db:migrate` to update your database then try again.}
361
+ end
362
+ end
363
+
364
+ namespace :abort_if_pending_migrations do
365
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
366
+ # desc "Raise an error if there are pending migrations for #{name} database"
367
+ task name => :load_config do
368
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: Rails.env, name: name) do |pool|
369
+ pending_migrations = pool.migration_context.open.pending_migrations
370
+
371
+ if pending_migrations.any?
372
+ puts "You have #{pending_migrations.size} pending #{pending_migrations.size > 1 ? 'migrations:' : 'migration:'}"
373
+
374
+ pending_migrations.each do |pending_migration|
375
+ puts " %4d %s" % [pending_migration.version, pending_migration.name]
376
+ end
377
+
378
+ abort %{Run `bin/rails db:migrate:#{name}` to update your database then try again.}
379
+ end
380
+ end
381
+ end
382
+ end
383
+ end
384
+
385
+ namespace :setup do
386
+ task all: ["db:create", :environment, "db:schema:load", :seed]
387
+
388
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
389
+ desc "Create the #{name} database, load the schema, and initialize with the seed data (use db:reset:#{name} to also drop the database first)"
390
+ task name => ["db:create:#{name}", :environment, "db:schema:load:#{name}", "db:seed"]
391
+ end
392
+ end
393
+
394
+ desc "Create all databases, load all schemas, and initialize with the seed data (use db:reset to also drop all databases first)"
395
+ task setup: ["db:create", :environment, "db:schema:load", :seed]
396
+
397
+ desc "Run setup if database does not exist, or run migrations if it does"
398
+ task prepare: :load_config do
399
+ ActiveRecord::Tasks::DatabaseTasks.prepare_all
400
+ end
401
+
402
+ desc "Load the seed data from db/seeds.rb"
403
+ task seed: :load_config do
404
+ db_namespace["abort_if_pending_migrations"].invoke
405
+ ActiveRecord::Tasks::DatabaseTasks.load_seed
406
+ end
407
+
408
+ namespace :seed do
409
+ desc "Truncate tables of each database for current environment and load the seeds"
410
+ task replant: [:load_config, :truncate_all, :seed]
411
+ end
412
+
413
+ namespace :fixtures do
414
+ desc "Load fixtures into the current environment's database. To load specific fixtures, use FIXTURES=x,y. To load from subdirectory in test/fixtures, use FIXTURES_DIR=z. To specify an alternative path (e.g. spec/fixtures), use FIXTURES_PATH=spec/fixtures."
415
+ task load: :load_config do
416
+ require "active_record/fixtures"
417
+
418
+ base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
419
+
420
+ fixtures_dir = if ENV["FIXTURES_DIR"]
421
+ File.join base_dir, ENV["FIXTURES_DIR"]
422
+ else
423
+ base_dir
424
+ end
425
+
426
+ fixture_files = if ENV["FIXTURES"]
427
+ ENV["FIXTURES"].split(",")
428
+ else
429
+ files = Dir[File.join(fixtures_dir, "**/*.{yml}")]
430
+ files.reject! { |f| f.start_with?(File.join(fixtures_dir, "files")) }
431
+ files.map! { |f| f[fixtures_dir.to_s.size..-5].delete_prefix("/") }
432
+ end
433
+
434
+ ActiveRecord::FixtureSet.create_fixtures(fixtures_dir, fixture_files)
435
+ end
436
+
437
+ # desc "Search for a fixture given a LABEL or ID. Specify an alternative path (e.g. spec/fixtures) using FIXTURES_PATH=spec/fixtures."
438
+ task identify: :load_config do
439
+ require "active_record/fixtures"
440
+
441
+ label, id = ENV["LABEL"], ENV["ID"]
442
+ raise "LABEL or ID required" if label.blank? && id.blank?
443
+
444
+ puts %Q(The fixture ID for "#{label}" is #{ActiveRecord::FixtureSet.identify(label)}.) if label
445
+
446
+ base_dir = ActiveRecord::Tasks::DatabaseTasks.fixtures_path
447
+
448
+ Dir["#{base_dir}/**/*.yml"].each do |file|
449
+ if data = ActiveSupport::ConfigurationFile.parse(file)
450
+ data.each_key do |key|
451
+ key_id = ActiveRecord::FixtureSet.identify(key)
452
+
453
+ if key == label || key_id == id.to_i
454
+ puts "#{file}: #{key} (#{key_id})"
455
+ end
456
+ end
457
+ end
458
+ end
459
+ end
460
+ end
461
+
462
+ namespace :schema do
463
+ desc "Create a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`)"
464
+ task dump: :load_config do
465
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each do |pool|
466
+ db_config = pool.db_config
467
+ schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
468
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, schema_format)
469
+ end
470
+
471
+ db_namespace["schema:dump"].reenable
472
+ end
473
+
474
+ desc "Load a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`) into the database"
475
+ task load: [:load_config, :check_protected_environments] do
476
+ ActiveRecord::Tasks::DatabaseTasks.load_schema_current(ActiveRecord.schema_format, ENV["SCHEMA"])
477
+ end
478
+
479
+ namespace :dump do
480
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
481
+ desc "Create a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`) for #{name} database"
482
+ task name => :load_config do
483
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(name: name) do |pool|
484
+ db_config = pool.db_config
485
+ schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
486
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema(db_config, schema_format)
487
+ end
488
+
489
+ db_namespace["schema:dump:#{name}"].reenable
490
+ end
491
+ end
492
+ end
493
+
494
+ namespace :load do
495
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
496
+ desc "Load a database schema file (either db/schema.rb or db/structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`) into the #{name} database"
497
+ task name => "db:test:purge:#{name}" do
498
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(name: name) do |pool|
499
+ db_config = pool.db_config
500
+ schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
501
+ ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
502
+ end
503
+ end
504
+ end
505
+ end
506
+
507
+ namespace :cache do
508
+ desc "Create a db/schema_cache.yml file."
509
+ task dump: :load_config do
510
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each do |pool|
511
+ db_config = pool.db_config
512
+ filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config)
513
+
514
+ ActiveRecord::Tasks::DatabaseTasks.dump_schema_cache(pool, filename)
515
+ end
516
+ end
517
+
518
+ desc "Clear a db/schema_cache.yml file."
519
+ task clear: :load_config do
520
+ ActiveRecord::Base.configurations.configs_for(env_name: ActiveRecord::Tasks::DatabaseTasks.env).each do |db_config|
521
+ filename = ActiveRecord::Tasks::DatabaseTasks.cache_dump_filename(db_config)
522
+ ActiveRecord::Tasks::DatabaseTasks.clear_schema_cache(
523
+ filename,
524
+ )
525
+ end
526
+ end
527
+ end
528
+ end
529
+
530
+ namespace :encryption do
531
+ desc "Generate a set of keys for configuring Active Record encryption in a given environment"
532
+ task :init do
533
+ puts <<~MSG
534
+ Add this entry to the credentials of the target environment:#{' '}
535
+
536
+ active_record_encryption:
537
+ primary_key: #{SecureRandom.alphanumeric(32)}
538
+ deterministic_key: #{SecureRandom.alphanumeric(32)}
539
+ key_derivation_salt: #{SecureRandom.alphanumeric(32)}
540
+ MSG
541
+ end
542
+ end
543
+
544
+ namespace :test do
545
+ # desc "Recreate the test database from an existent schema file (schema.rb or structure.sql, depending on `ENV['SCHEMA_FORMAT']` or `config.active_record.schema_format`)"
546
+ task load_schema: %w(db:test:purge) do
547
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: "test") do |pool|
548
+ db_config = pool.db_config
549
+ ActiveRecord::Schema.verbose = false
550
+ schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
551
+ ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
552
+ end
553
+ end
554
+
555
+ # desc "Empty the test database"
556
+ task purge: %w(load_config check_protected_environments) do
557
+ ActiveRecord::Base.configurations.configs_for(env_name: "test").each do |db_config|
558
+ ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
559
+ end
560
+ end
561
+
562
+ # desc 'Load the test schema'
563
+ task prepare: :load_config do
564
+ unless ActiveRecord::Base.configurations.blank?
565
+ db_namespace["test:load_schema"].invoke
566
+ end
567
+ end
568
+
569
+ ActiveRecord::Tasks::DatabaseTasks.for_each(databases) do |name|
570
+ # desc "Recreate the #{name} test database from an existent schema.rb file"
571
+ namespace :load_schema do
572
+ task name => "db:test:purge:#{name}" do
573
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: "test", name: name) do |pool|
574
+ db_config = pool.db_config
575
+ ActiveRecord::Schema.verbose = false
576
+ schema_format = ENV.fetch("SCHEMA_FORMAT", ActiveRecord.schema_format).to_sym
577
+ ActiveRecord::Tasks::DatabaseTasks.load_schema(db_config, schema_format)
578
+ end
579
+ end
580
+ end
581
+
582
+ # desc "Empty the #{name} test database"
583
+ namespace :purge do
584
+ task name => %w(load_config check_protected_environments) do
585
+ ActiveRecord::Tasks::DatabaseTasks.with_temporary_pool_for_each(env: "test", name: name) do |pool|
586
+ db_config = pool.db_config
587
+ ActiveRecord::Tasks::DatabaseTasks.purge(db_config)
588
+ end
589
+ end
590
+ end
591
+
592
+ # desc 'Load the #{name} database test schema'
593
+ namespace :prepare do
594
+ task name => :load_config do
595
+ db_namespace["test:load_schema:#{name}"].invoke
596
+ end
597
+ end
598
+ end
599
+ end
600
+ end
601
+
602
+ namespace :railties do
603
+ namespace :install do
604
+ # desc "Copy missing migrations from Railties (e.g. engines). You can specify Railties to use with FROM=railtie1,railtie2 and database to copy to with DATABASE=database."
605
+ task migrations: :'db:load_config' do
606
+ to_load = ENV["FROM"].blank? ? :all : ENV["FROM"].split(",").map(&:strip)
607
+ railties = {}
608
+ Rails.application.migration_railties.each do |railtie|
609
+ next unless to_load == :all || to_load.include?(railtie.railtie_name)
610
+
611
+ if railtie.respond_to?(:paths) && (path = railtie.paths["db/migrate"].first)
612
+ railties[railtie.railtie_name] = path
613
+ end
614
+
615
+ unless ENV["MIGRATIONS_PATH"].blank?
616
+ railties[railtie.railtie_name] = railtie.root + ENV["MIGRATIONS_PATH"]
617
+ end
618
+ end
619
+
620
+ on_skip = Proc.new do |name, migration|
621
+ puts "NOTE: Migration #{migration.basename} from #{name} has been skipped. Migration with the same name already exists."
622
+ end
623
+
624
+ on_copy = Proc.new do |name, migration|
625
+ puts "Copied migration #{migration.basename} from #{name}"
626
+ end
627
+
628
+ if ENV["DATABASE"].present? && ENV["DATABASE"] != "primary"
629
+ config = ActiveRecord::Base.configurations.configs_for(name: ENV["DATABASE"])
630
+ raise "Invalid DATABASE provided" if config.blank?
631
+ destination = config.migrations_paths
632
+ raise "#{ENV["DATABASE"]} does not have a custom migration path" if destination.blank?
633
+ else
634
+ destination = ActiveRecord::Tasks::DatabaseTasks.migrations_paths.first
635
+ end
636
+
637
+ ActiveRecord::Migration.copy(destination, railties,
638
+ on_skip: on_skip, on_copy: on_copy)
639
+ end
640
+ end
641
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record/runtime_registry"
4
+
5
+ module ActiveRecord
6
+ module Railties # :nodoc:
7
+ module JobRuntime # :nodoc:
8
+ private
9
+ def instrument(operation, payload = {}, &block)
10
+ if operation == :perform && block
11
+ super(operation, payload) do
12
+ db_runtime_before_perform = ActiveRecord::RuntimeRegistry.sql_runtime
13
+ result = block.call
14
+ payload[:db_runtime] = ActiveRecord::RuntimeRegistry.sql_runtime - db_runtime_before_perform
15
+ result
16
+ end
17
+ else
18
+ super
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end