Add utilities for fetching dependencies for an evolution or its app.
Review Request #11228 — Created Oct. 18, 2020 and submitted — Latest diff uploaded
Django Evolution 2.1 is getting support for dependencies defined in
evolutions, allowing a single evolution or all evolutions for an app to
apply before or after other evolutions or migrations. These can be
specified as an app-level dependency (in theevolutions/__init__.py
)
or an evolution-level dependency by setting the following:
BEFORE_EVOLUTIONS
BEFORE_MIGRATIONS
AFTER_EVOLUTIONS
AFTER_MIGRATIONS
Each is a list of items, where each item is either a string containing
an app label (for evolutions) or a tuple containing an app label and
evolution/migration name (for evolutions and migrations).
This change begins adding support for this by introducing utility
functions that will look up these dependencies.
get_evolution_app_dependencies()
will fetch the dependencies specified
at the top-level evolutions/__init__.py
for an app, and
get_evolution_dependencies()
will fetch those defined in a particular
evolution.
Along with checking an evolution's specified dependencies,
get_evolution_dependencies()
will also check if any mutations have
dependencies to inject. This is a new feature of mutations.
Currently only MoveToDjangoMigrations
implements mutation-defined
dependencies, and ensures that the evolution will apply after the
migrations it applies to. This ensures that for a new database (or new
app), the migrations will always apply first (since the intent is to
ultimately have the app use them instead of evolutions). For an existing
app, the evolver will already make sure those migrations are marked as
applied by scanning ahead for this mutation, and it's important that the
evolution doesn't try to apply before this step happens.
Upcoming changes will factor the dependencies in when determining the
order in which migrations and evolutions will apply.
Unit tests pass.
Made use of this with upcoming changes to implement full dependency
support.