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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +355 -0
- data/MIT-LICENSE +22 -0
- data/README.rdoc +219 -0
- data/examples/performance.rb +185 -0
- data/examples/simple.rb +15 -0
- data/lib/active_record/aggregations.rb +287 -0
- data/lib/active_record/association_relation.rb +50 -0
- data/lib/active_record/associations/alias_tracker.rb +90 -0
- data/lib/active_record/associations/association.rb +417 -0
- data/lib/active_record/associations/association_scope.rb +175 -0
- data/lib/active_record/associations/belongs_to_association.rb +163 -0
- data/lib/active_record/associations/belongs_to_polymorphic_association.rb +50 -0
- data/lib/active_record/associations/builder/association.rb +170 -0
- data/lib/active_record/associations/builder/belongs_to.rb +160 -0
- data/lib/active_record/associations/builder/collection_association.rb +80 -0
- data/lib/active_record/associations/builder/has_and_belongs_to_many.rb +107 -0
- data/lib/active_record/associations/builder/has_many.rb +23 -0
- data/lib/active_record/associations/builder/has_one.rb +61 -0
- data/lib/active_record/associations/builder/singular_association.rb +48 -0
- data/lib/active_record/associations/collection_association.rb +535 -0
- data/lib/active_record/associations/collection_proxy.rb +1163 -0
- data/lib/active_record/associations/disable_joins_association_scope.rb +59 -0
- data/lib/active_record/associations/errors.rb +265 -0
- data/lib/active_record/associations/foreign_association.rb +40 -0
- data/lib/active_record/associations/has_many_association.rb +167 -0
- data/lib/active_record/associations/has_many_through_association.rb +232 -0
- data/lib/active_record/associations/has_one_association.rb +142 -0
- data/lib/active_record/associations/has_one_through_association.rb +45 -0
- data/lib/active_record/associations/join_dependency/join_association.rb +106 -0
- data/lib/active_record/associations/join_dependency/join_base.rb +23 -0
- data/lib/active_record/associations/join_dependency/join_part.rb +71 -0
- data/lib/active_record/associations/join_dependency.rb +301 -0
- data/lib/active_record/associations/nested_error.rb +47 -0
- data/lib/active_record/associations/preloader/association.rb +316 -0
- data/lib/active_record/associations/preloader/batch.rb +48 -0
- data/lib/active_record/associations/preloader/branch.rb +153 -0
- data/lib/active_record/associations/preloader/through_association.rb +150 -0
- data/lib/active_record/associations/preloader.rb +135 -0
- data/lib/active_record/associations/singular_association.rb +76 -0
- data/lib/active_record/associations/through_association.rb +132 -0
- data/lib/active_record/associations.rb +1897 -0
- data/lib/active_record/asynchronous_queries_tracker.rb +64 -0
- data/lib/active_record/attribute_assignment.rb +82 -0
- data/lib/active_record/attribute_methods/before_type_cast.rb +106 -0
- data/lib/active_record/attribute_methods/composite_primary_key.rb +84 -0
- data/lib/active_record/attribute_methods/dirty.rb +262 -0
- data/lib/active_record/attribute_methods/primary_key.rb +158 -0
- data/lib/active_record/attribute_methods/query.rb +50 -0
- data/lib/active_record/attribute_methods/read.rb +46 -0
- data/lib/active_record/attribute_methods/serialization.rb +232 -0
- data/lib/active_record/attribute_methods/time_zone_conversion.rb +94 -0
- data/lib/active_record/attribute_methods/write.rb +49 -0
- data/lib/active_record/attribute_methods.rb +542 -0
- data/lib/active_record/attributes.rb +307 -0
- data/lib/active_record/autosave_association.rb +586 -0
- data/lib/active_record/base.rb +338 -0
- data/lib/active_record/callbacks.rb +452 -0
- data/lib/active_record/coders/column_serializer.rb +61 -0
- data/lib/active_record/coders/json.rb +15 -0
- data/lib/active_record/coders/yaml_column.rb +95 -0
- data/lib/active_record/connection_adapters/abstract/connection_handler.rb +290 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/queue.rb +210 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool/reaper.rb +78 -0
- data/lib/active_record/connection_adapters/abstract/connection_pool.rb +923 -0
- data/lib/active_record/connection_adapters/abstract/database_limits.rb +31 -0
- data/lib/active_record/connection_adapters/abstract/database_statements.rb +747 -0
- data/lib/active_record/connection_adapters/abstract/query_cache.rb +319 -0
- data/lib/active_record/connection_adapters/abstract/quoting.rb +239 -0
- data/lib/active_record/connection_adapters/abstract/savepoints.rb +24 -0
- data/lib/active_record/connection_adapters/abstract/schema_creation.rb +190 -0
- data/lib/active_record/connection_adapters/abstract/schema_definitions.rb +961 -0
- data/lib/active_record/connection_adapters/abstract/schema_dumper.rb +106 -0
- data/lib/active_record/connection_adapters/abstract/schema_statements.rb +1883 -0
- data/lib/active_record/connection_adapters/abstract/transaction.rb +676 -0
- data/lib/active_record/connection_adapters/abstract_adapter.rb +1218 -0
- data/lib/active_record/connection_adapters/abstract_mysql_adapter.rb +1016 -0
- data/lib/active_record/connection_adapters/column.rb +122 -0
- data/lib/active_record/connection_adapters/deduplicable.rb +29 -0
- data/lib/active_record/connection_adapters/mysql/column.rb +28 -0
- data/lib/active_record/connection_adapters/mysql/database_statements.rb +95 -0
- data/lib/active_record/connection_adapters/mysql/explain_pretty_printer.rb +71 -0
- data/lib/active_record/connection_adapters/mysql/quoting.rb +114 -0
- data/lib/active_record/connection_adapters/mysql/schema_creation.rb +106 -0
- data/lib/active_record/connection_adapters/mysql/schema_definitions.rb +106 -0
- data/lib/active_record/connection_adapters/mysql/schema_dumper.rb +97 -0
- data/lib/active_record/connection_adapters/mysql/schema_statements.rb +300 -0
- data/lib/active_record/connection_adapters/mysql/type_metadata.rb +40 -0
- data/lib/active_record/connection_adapters/mysql2/database_statements.rb +96 -0
- data/lib/active_record/connection_adapters/mysql2_adapter.rb +196 -0
- data/lib/active_record/connection_adapters/pool_config.rb +83 -0
- data/lib/active_record/connection_adapters/pool_manager.rb +57 -0
- data/lib/active_record/connection_adapters/postgresql/column.rb +82 -0
- data/lib/active_record/connection_adapters/postgresql/database_statements.rb +231 -0
- data/lib/active_record/connection_adapters/postgresql/explain_pretty_printer.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/array.rb +91 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit.rb +53 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bit_varying.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/bytea.rb +17 -0
- data/lib/active_record/connection_adapters/postgresql/oid/cidr.rb +54 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date.rb +31 -0
- data/lib/active_record/connection_adapters/postgresql/oid/date_time.rb +36 -0
- data/lib/active_record/connection_adapters/postgresql/oid/decimal.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/enum.rb +20 -0
- data/lib/active_record/connection_adapters/postgresql/oid/hstore.rb +109 -0
- data/lib/active_record/connection_adapters/postgresql/oid/inet.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/interval.rb +49 -0
- data/lib/active_record/connection_adapters/postgresql/oid/jsonb.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/legacy_point.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/oid/macaddr.rb +25 -0
- data/lib/active_record/connection_adapters/postgresql/oid/money.rb +42 -0
- data/lib/active_record/connection_adapters/postgresql/oid/oid.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/point.rb +74 -0
- data/lib/active_record/connection_adapters/postgresql/oid/range.rb +124 -0
- data/lib/active_record/connection_adapters/postgresql/oid/specialized_string.rb +18 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp.rb +15 -0
- data/lib/active_record/connection_adapters/postgresql/oid/timestamp_with_time_zone.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid/type_map_initializer.rb +125 -0
- data/lib/active_record/connection_adapters/postgresql/oid/uuid.rb +45 -0
- data/lib/active_record/connection_adapters/postgresql/oid/vector.rb +28 -0
- data/lib/active_record/connection_adapters/postgresql/oid/xml.rb +30 -0
- data/lib/active_record/connection_adapters/postgresql/oid.rb +38 -0
- data/lib/active_record/connection_adapters/postgresql/quoting.rb +238 -0
- data/lib/active_record/connection_adapters/postgresql/referential_integrity.rb +71 -0
- data/lib/active_record/connection_adapters/postgresql/schema_creation.rb +169 -0
- data/lib/active_record/connection_adapters/postgresql/schema_definitions.rb +392 -0
- data/lib/active_record/connection_adapters/postgresql/schema_dumper.rb +127 -0
- data/lib/active_record/connection_adapters/postgresql/schema_statements.rb +1162 -0
- data/lib/active_record/connection_adapters/postgresql/type_metadata.rb +44 -0
- data/lib/active_record/connection_adapters/postgresql/utils.rb +79 -0
- data/lib/active_record/connection_adapters/postgresql_adapter.rb +1182 -0
- data/lib/active_record/connection_adapters/schema_cache.rb +478 -0
- data/lib/active_record/connection_adapters/sql_type_metadata.rb +45 -0
- data/lib/active_record/connection_adapters/sqlite3/column.rb +62 -0
- data/lib/active_record/connection_adapters/sqlite3/database_statements.rb +145 -0
- data/lib/active_record/connection_adapters/sqlite3/explain_pretty_printer.rb +21 -0
- data/lib/active_record/connection_adapters/sqlite3/quoting.rb +116 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_creation.rb +37 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_definitions.rb +39 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_dumper.rb +47 -0
- data/lib/active_record/connection_adapters/sqlite3/schema_statements.rb +221 -0
- data/lib/active_record/connection_adapters/sqlite3_adapter.rb +843 -0
- data/lib/active_record/connection_adapters/statement_pool.rb +67 -0
- data/lib/active_record/connection_adapters/trilogy/database_statements.rb +69 -0
- data/lib/active_record/connection_adapters/trilogy_adapter.rb +212 -0
- data/lib/active_record/connection_adapters.rb +176 -0
- data/lib/active_record/connection_handling.rb +413 -0
- data/lib/active_record/core.rb +836 -0
- data/lib/active_record/counter_cache.rb +230 -0
- data/lib/active_record/database_configurations/connection_url_resolver.rb +105 -0
- data/lib/active_record/database_configurations/database_config.rb +104 -0
- data/lib/active_record/database_configurations/hash_config.rb +172 -0
- data/lib/active_record/database_configurations/url_config.rb +78 -0
- data/lib/active_record/database_configurations.rb +309 -0
- data/lib/active_record/delegated_type.rb +289 -0
- data/lib/active_record/deprecator.rb +7 -0
- data/lib/active_record/destroy_association_async_job.rb +38 -0
- data/lib/active_record/disable_joins_association_relation.rb +39 -0
- data/lib/active_record/dynamic_matchers.rb +121 -0
- data/lib/active_record/encryption/auto_filtered_parameters.rb +66 -0
- data/lib/active_record/encryption/cipher/aes256_gcm.rb +101 -0
- data/lib/active_record/encryption/cipher.rb +53 -0
- data/lib/active_record/encryption/config.rb +70 -0
- data/lib/active_record/encryption/configurable.rb +60 -0
- data/lib/active_record/encryption/context.rb +42 -0
- data/lib/active_record/encryption/contexts.rb +76 -0
- data/lib/active_record/encryption/derived_secret_key_provider.rb +18 -0
- data/lib/active_record/encryption/deterministic_key_provider.rb +14 -0
- data/lib/active_record/encryption/encryptable_record.rb +230 -0
- data/lib/active_record/encryption/encrypted_attribute_type.rb +184 -0
- data/lib/active_record/encryption/encrypted_fixtures.rb +38 -0
- data/lib/active_record/encryption/encrypting_only_encryptor.rb +12 -0
- data/lib/active_record/encryption/encryptor.rb +177 -0
- data/lib/active_record/encryption/envelope_encryption_key_provider.rb +55 -0
- data/lib/active_record/encryption/errors.rb +15 -0
- data/lib/active_record/encryption/extended_deterministic_queries.rb +159 -0
- data/lib/active_record/encryption/extended_deterministic_uniqueness_validator.rb +28 -0
- data/lib/active_record/encryption/key.rb +28 -0
- data/lib/active_record/encryption/key_generator.rb +53 -0
- data/lib/active_record/encryption/key_provider.rb +46 -0
- data/lib/active_record/encryption/message.rb +33 -0
- data/lib/active_record/encryption/message_pack_message_serializer.rb +76 -0
- data/lib/active_record/encryption/message_serializer.rb +96 -0
- data/lib/active_record/encryption/null_encryptor.rb +25 -0
- data/lib/active_record/encryption/properties.rb +76 -0
- data/lib/active_record/encryption/read_only_null_encryptor.rb +28 -0
- data/lib/active_record/encryption/scheme.rb +107 -0
- data/lib/active_record/encryption.rb +58 -0
- data/lib/active_record/enum.rb +424 -0
- data/lib/active_record/errors.rb +614 -0
- data/lib/active_record/explain.rb +63 -0
- data/lib/active_record/explain_registry.rb +37 -0
- data/lib/active_record/explain_subscriber.rb +34 -0
- data/lib/active_record/fixture_set/file.rb +89 -0
- data/lib/active_record/fixture_set/model_metadata.rb +42 -0
- data/lib/active_record/fixture_set/render_context.rb +19 -0
- data/lib/active_record/fixture_set/table_row.rb +208 -0
- data/lib/active_record/fixture_set/table_rows.rb +46 -0
- data/lib/active_record/fixtures.rb +850 -0
- data/lib/active_record/future_result.rb +182 -0
- data/lib/active_record/gem_version.rb +17 -0
- data/lib/active_record/inheritance.rb +366 -0
- data/lib/active_record/insert_all.rb +328 -0
- data/lib/active_record/integration.rb +209 -0
- data/lib/active_record/internal_metadata.rb +164 -0
- data/lib/active_record/legacy_yaml_adapter.rb +15 -0
- data/lib/active_record/locale/en.yml +48 -0
- data/lib/active_record/locking/optimistic.rb +228 -0
- data/lib/active_record/locking/pessimistic.rb +102 -0
- data/lib/active_record/log_subscriber.rb +149 -0
- data/lib/active_record/marshalling.rb +56 -0
- data/lib/active_record/message_pack.rb +124 -0
- data/lib/active_record/middleware/database_selector/resolver/session.rb +48 -0
- data/lib/active_record/middleware/database_selector/resolver.rb +92 -0
- data/lib/active_record/middleware/database_selector.rb +87 -0
- data/lib/active_record/middleware/shard_selector.rb +62 -0
- data/lib/active_record/migration/command_recorder.rb +406 -0
- data/lib/active_record/migration/compatibility.rb +490 -0
- data/lib/active_record/migration/default_strategy.rb +22 -0
- data/lib/active_record/migration/execution_strategy.rb +19 -0
- data/lib/active_record/migration/join_table.rb +16 -0
- data/lib/active_record/migration/pending_migration_connection.rb +21 -0
- data/lib/active_record/migration.rb +1626 -0
- data/lib/active_record/model_schema.rb +635 -0
- data/lib/active_record/nested_attributes.rb +633 -0
- data/lib/active_record/no_touching.rb +65 -0
- data/lib/active_record/normalization.rb +163 -0
- data/lib/active_record/persistence.rb +968 -0
- data/lib/active_record/promise.rb +84 -0
- data/lib/active_record/query_cache.rb +56 -0
- data/lib/active_record/query_logs.rb +247 -0
- data/lib/active_record/query_logs_formatter.rb +30 -0
- data/lib/active_record/querying.rb +122 -0
- data/lib/active_record/railtie.rb +440 -0
- data/lib/active_record/railties/console_sandbox.rb +5 -0
- data/lib/active_record/railties/controller_runtime.rb +65 -0
- data/lib/active_record/railties/databases.rake +641 -0
- data/lib/active_record/railties/job_runtime.rb +23 -0
- data/lib/active_record/readonly_attributes.rb +66 -0
- data/lib/active_record/reflection.rb +1287 -0
- data/lib/active_record/relation/batches/batch_enumerator.rb +115 -0
- data/lib/active_record/relation/batches.rb +491 -0
- data/lib/active_record/relation/calculations.rb +679 -0
- data/lib/active_record/relation/delegation.rb +154 -0
- data/lib/active_record/relation/finder_methods.rb +661 -0
- data/lib/active_record/relation/from_clause.rb +30 -0
- data/lib/active_record/relation/merger.rb +192 -0
- data/lib/active_record/relation/predicate_builder/array_handler.rb +48 -0
- data/lib/active_record/relation/predicate_builder/association_query_value.rb +76 -0
- data/lib/active_record/relation/predicate_builder/basic_object_handler.rb +19 -0
- data/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb +60 -0
- data/lib/active_record/relation/predicate_builder/range_handler.rb +22 -0
- data/lib/active_record/relation/predicate_builder/relation_handler.rb +24 -0
- data/lib/active_record/relation/predicate_builder.rb +181 -0
- data/lib/active_record/relation/query_attribute.rb +68 -0
- data/lib/active_record/relation/query_methods.rb +2235 -0
- data/lib/active_record/relation/record_fetch_warning.rb +52 -0
- data/lib/active_record/relation/spawn_methods.rb +78 -0
- data/lib/active_record/relation/where_clause.rb +218 -0
- data/lib/active_record/relation.rb +1495 -0
- data/lib/active_record/result.rb +249 -0
- data/lib/active_record/runtime_registry.rb +82 -0
- data/lib/active_record/sanitization.rb +254 -0
- data/lib/active_record/schema.rb +77 -0
- data/lib/active_record/schema_dumper.rb +364 -0
- data/lib/active_record/schema_migration.rb +106 -0
- data/lib/active_record/scoping/default.rb +205 -0
- data/lib/active_record/scoping/named.rb +202 -0
- data/lib/active_record/scoping.rb +136 -0
- data/lib/active_record/secure_password.rb +60 -0
- data/lib/active_record/secure_token.rb +66 -0
- data/lib/active_record/serialization.rb +29 -0
- data/lib/active_record/signed_id.rb +137 -0
- data/lib/active_record/statement_cache.rb +164 -0
- data/lib/active_record/store.rb +299 -0
- data/lib/active_record/suppressor.rb +59 -0
- data/lib/active_record/table_metadata.rb +85 -0
- data/lib/active_record/tasks/database_tasks.rb +681 -0
- data/lib/active_record/tasks/mysql_database_tasks.rb +120 -0
- data/lib/active_record/tasks/postgresql_database_tasks.rb +147 -0
- data/lib/active_record/tasks/sqlite_database_tasks.rb +89 -0
- data/lib/active_record/test_databases.rb +24 -0
- data/lib/active_record/test_fixtures.rb +321 -0
- data/lib/active_record/testing/query_assertions.rb +121 -0
- data/lib/active_record/timestamp.rb +177 -0
- data/lib/active_record/token_for.rb +123 -0
- data/lib/active_record/touch_later.rb +70 -0
- data/lib/active_record/transaction.rb +132 -0
- data/lib/active_record/transactions.rb +523 -0
- data/lib/active_record/translation.rb +22 -0
- data/lib/active_record/type/adapter_specific_registry.rb +144 -0
- data/lib/active_record/type/date.rb +9 -0
- data/lib/active_record/type/date_time.rb +9 -0
- data/lib/active_record/type/decimal_without_scale.rb +15 -0
- data/lib/active_record/type/hash_lookup_type_map.rb +57 -0
- data/lib/active_record/type/internal/timezone.rb +22 -0
- data/lib/active_record/type/json.rb +30 -0
- data/lib/active_record/type/serialized.rb +76 -0
- data/lib/active_record/type/text.rb +11 -0
- data/lib/active_record/type/time.rb +35 -0
- data/lib/active_record/type/type_map.rb +58 -0
- data/lib/active_record/type/unsigned_integer.rb +16 -0
- data/lib/active_record/type.rb +83 -0
- data/lib/active_record/type_caster/connection.rb +33 -0
- data/lib/active_record/type_caster/map.rb +23 -0
- data/lib/active_record/type_caster.rb +9 -0
- data/lib/active_record/validations/absence.rb +25 -0
- data/lib/active_record/validations/associated.rb +65 -0
- data/lib/active_record/validations/length.rb +26 -0
- data/lib/active_record/validations/numericality.rb +36 -0
- data/lib/active_record/validations/presence.rb +45 -0
- data/lib/active_record/validations/uniqueness.rb +295 -0
- data/lib/active_record/validations.rb +101 -0
- data/lib/active_record/version.rb +10 -0
- data/lib/active_record.rb +616 -0
- data/lib/arel/alias_predication.rb +9 -0
- data/lib/arel/attributes/attribute.rb +33 -0
- data/lib/arel/collectors/bind.rb +31 -0
- data/lib/arel/collectors/composite.rb +46 -0
- data/lib/arel/collectors/plain_string.rb +20 -0
- data/lib/arel/collectors/sql_string.rb +27 -0
- data/lib/arel/collectors/substitute_binds.rb +35 -0
- data/lib/arel/crud.rb +48 -0
- data/lib/arel/delete_manager.rb +32 -0
- data/lib/arel/errors.rb +19 -0
- data/lib/arel/expressions.rb +29 -0
- data/lib/arel/factory_methods.rb +53 -0
- data/lib/arel/filter_predications.rb +9 -0
- data/lib/arel/insert_manager.rb +48 -0
- data/lib/arel/math.rb +45 -0
- data/lib/arel/nodes/ascending.rb +23 -0
- data/lib/arel/nodes/binary.rb +125 -0
- data/lib/arel/nodes/bind_param.rb +44 -0
- data/lib/arel/nodes/bound_sql_literal.rb +65 -0
- data/lib/arel/nodes/case.rb +55 -0
- data/lib/arel/nodes/casted.rb +62 -0
- data/lib/arel/nodes/comment.rb +29 -0
- data/lib/arel/nodes/count.rb +12 -0
- data/lib/arel/nodes/cte.rb +36 -0
- data/lib/arel/nodes/delete_statement.rb +44 -0
- data/lib/arel/nodes/descending.rb +23 -0
- data/lib/arel/nodes/equality.rb +15 -0
- data/lib/arel/nodes/extract.rb +24 -0
- data/lib/arel/nodes/false.rb +16 -0
- data/lib/arel/nodes/filter.rb +10 -0
- data/lib/arel/nodes/fragments.rb +35 -0
- data/lib/arel/nodes/full_outer_join.rb +8 -0
- data/lib/arel/nodes/function.rb +45 -0
- data/lib/arel/nodes/grouping.rb +11 -0
- data/lib/arel/nodes/homogeneous_in.rb +68 -0
- data/lib/arel/nodes/in.rb +15 -0
- data/lib/arel/nodes/infix_operation.rb +92 -0
- data/lib/arel/nodes/inner_join.rb +8 -0
- data/lib/arel/nodes/insert_statement.rb +37 -0
- data/lib/arel/nodes/join_source.rb +20 -0
- data/lib/arel/nodes/leading_join.rb +8 -0
- data/lib/arel/nodes/matches.rb +18 -0
- data/lib/arel/nodes/named_function.rb +23 -0
- data/lib/arel/nodes/nary.rb +39 -0
- data/lib/arel/nodes/node.rb +161 -0
- data/lib/arel/nodes/node_expression.rb +13 -0
- data/lib/arel/nodes/ordering.rb +27 -0
- data/lib/arel/nodes/outer_join.rb +8 -0
- data/lib/arel/nodes/over.rb +15 -0
- data/lib/arel/nodes/regexp.rb +16 -0
- data/lib/arel/nodes/right_outer_join.rb +8 -0
- data/lib/arel/nodes/select_core.rb +67 -0
- data/lib/arel/nodes/select_statement.rb +41 -0
- data/lib/arel/nodes/sql_literal.rb +32 -0
- data/lib/arel/nodes/string_join.rb +11 -0
- data/lib/arel/nodes/table_alias.rb +35 -0
- data/lib/arel/nodes/terminal.rb +16 -0
- data/lib/arel/nodes/true.rb +16 -0
- data/lib/arel/nodes/unary.rb +44 -0
- data/lib/arel/nodes/unary_operation.rb +20 -0
- data/lib/arel/nodes/unqualified_column.rb +22 -0
- data/lib/arel/nodes/update_statement.rb +46 -0
- data/lib/arel/nodes/values_list.rb +9 -0
- data/lib/arel/nodes/window.rb +126 -0
- data/lib/arel/nodes/with.rb +11 -0
- data/lib/arel/nodes.rb +75 -0
- data/lib/arel/order_predications.rb +13 -0
- data/lib/arel/predications.rb +260 -0
- data/lib/arel/select_manager.rb +276 -0
- data/lib/arel/table.rb +121 -0
- data/lib/arel/tree_manager.rb +65 -0
- data/lib/arel/update_manager.rb +49 -0
- data/lib/arel/visitors/dot.rb +299 -0
- data/lib/arel/visitors/mysql.rb +111 -0
- data/lib/arel/visitors/postgresql.rb +99 -0
- data/lib/arel/visitors/sqlite.rb +38 -0
- data/lib/arel/visitors/to_sql.rb +1033 -0
- data/lib/arel/visitors/visitor.rb +45 -0
- data/lib/arel/visitors.rb +13 -0
- data/lib/arel/window_predications.rb +9 -0
- data/lib/arel.rb +73 -0
- data/lib/rails/generators/active_record/application_record/USAGE +8 -0
- data/lib/rails/generators/active_record/application_record/application_record_generator.rb +26 -0
- data/lib/rails/generators/active_record/application_record/templates/application_record.rb.tt +5 -0
- data/lib/rails/generators/active_record/migration/migration_generator.rb +76 -0
- data/lib/rails/generators/active_record/migration/templates/create_table_migration.rb.tt +29 -0
- data/lib/rails/generators/active_record/migration/templates/migration.rb.tt +48 -0
- data/lib/rails/generators/active_record/migration.rb +54 -0
- data/lib/rails/generators/active_record/model/USAGE +113 -0
- data/lib/rails/generators/active_record/model/model_generator.rb +94 -0
- data/lib/rails/generators/active_record/model/templates/abstract_base_class.rb.tt +7 -0
- data/lib/rails/generators/active_record/model/templates/model.rb.tt +22 -0
- data/lib/rails/generators/active_record/model/templates/module.rb.tt +7 -0
- data/lib/rails/generators/active_record/multi_db/multi_db_generator.rb +16 -0
- data/lib/rails/generators/active_record/multi_db/templates/multi_db.rb.tt +44 -0
- data/lib/rails/generators/active_record.rb +19 -0
- 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
|