summaryrefslogtreecommitdiff
path: root/tests/migrations/test_loader.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/migrations/test_loader.py')
-rw-r--r--tests/migrations/test_loader.py358
1 files changed, 210 insertions, 148 deletions
diff --git a/tests/migrations/test_loader.py b/tests/migrations/test_loader.py
index 03a98506e3..de70c4d981 100644
--- a/tests/migrations/test_loader.py
+++ b/tests/migrations/test_loader.py
@@ -4,7 +4,9 @@ from importlib import import_module
from django.db import connection, connections
from django.db.migrations.exceptions import (
- AmbiguityError, InconsistentMigrationHistory, NodeNotFoundError,
+ AmbiguityError,
+ InconsistentMigrationHistory,
+ NodeNotFoundError,
)
from django.db.migrations.loader import MigrationLoader
from django.db.migrations.recorder import MigrationRecorder
@@ -17,7 +19,8 @@ class RecorderTests(TestCase):
"""
Tests recording migrations as applied or not.
"""
- databases = {'default', 'other'}
+
+ databases = {"default", "other"}
def test_apply(self):
"""
@@ -34,7 +37,7 @@ class RecorderTests(TestCase):
{("myapp", "0432_ponies")},
)
# That should not affect records of another database
- recorder_other = MigrationRecorder(connections['other'])
+ recorder_other = MigrationRecorder(connections["other"])
self.assertEqual(
{(x, y) for (x, y) in recorder_other.applied_migrations() if x == "myapp"},
set(),
@@ -51,6 +54,7 @@ class LoaderTests(TestCase):
Tests the disk and database loader, and running through migrations
in memory.
"""
+
def setUp(self):
self.applied_records = []
@@ -66,7 +70,7 @@ class LoaderTests(TestCase):
self.applied_records.append((recorder, app, name))
@override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
- @modify_settings(INSTALLED_APPS={'append': 'basic'})
+ @modify_settings(INSTALLED_APPS={"append": "basic"})
def test_load(self):
"""
Makes sure the loader can load the migrations for the test apps,
@@ -87,33 +91,40 @@ class LoaderTests(TestCase):
author_state = project_state.models["migrations", "author"]
self.assertEqual(
- list(author_state.fields),
- ["id", "name", "slug", "age", "rating"]
+ list(author_state.fields), ["id", "name", "slug", "age", "rating"]
)
book_state = project_state.models["migrations", "book"]
- self.assertEqual(list(book_state.fields), ['id', 'author'])
+ self.assertEqual(list(book_state.fields), ["id", "author"])
# Ensure we've included unmigrated apps in there too
self.assertIn("basic", project_state.real_apps)
- @override_settings(MIGRATION_MODULES={
- 'migrations': 'migrations.test_migrations',
- 'migrations2': 'migrations2.test_migrations_2',
- })
- @modify_settings(INSTALLED_APPS={'append': 'migrations2'})
+ @override_settings(
+ MIGRATION_MODULES={
+ "migrations": "migrations.test_migrations",
+ "migrations2": "migrations2.test_migrations_2",
+ }
+ )
+ @modify_settings(INSTALLED_APPS={"append": "migrations2"})
def test_plan_handles_repeated_migrations(self):
"""
_generate_plan() doesn't readd migrations already in the plan (#29180).
"""
migration_loader = MigrationLoader(connection)
- nodes = [('migrations', '0002_second'), ('migrations2', '0001_initial')]
+ nodes = [("migrations", "0002_second"), ("migrations2", "0001_initial")]
self.assertEqual(
migration_loader.graph._generate_plan(nodes, at_end=True),
- [('migrations', '0001_initial'), ('migrations', '0002_second'), ('migrations2', '0001_initial')]
+ [
+ ("migrations", "0001_initial"),
+ ("migrations", "0002_second"),
+ ("migrations2", "0001_initial"),
+ ],
)
- @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations_unmigdep"})
+ @override_settings(
+ MIGRATION_MODULES={"migrations": "migrations.test_migrations_unmigdep"}
+ )
def test_load_unmigrated_dependency(self):
"""
Makes sure the loader can load migrations with a dependency on an unmigrated app.
@@ -123,19 +134,23 @@ class LoaderTests(TestCase):
self.assertEqual(
migration_loader.graph.forwards_plan(("migrations", "0001_initial")),
[
- ('contenttypes', '0001_initial'),
- ('auth', '0001_initial'),
+ ("contenttypes", "0001_initial"),
+ ("auth", "0001_initial"),
("migrations", "0001_initial"),
],
)
# Now render it out!
project_state = migration_loader.project_state(("migrations", "0001_initial"))
- self.assertEqual(len([m for a, m in project_state.models if a == "migrations"]), 1)
+ self.assertEqual(
+ len([m for a, m in project_state.models if a == "migrations"]), 1
+ )
book_state = project_state.models["migrations", "book"]
- self.assertEqual(list(book_state.fields), ['id', 'user'])
+ self.assertEqual(list(book_state.fields), ["id", "user"])
- @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations_run_before"})
+ @override_settings(
+ MIGRATION_MODULES={"migrations": "migrations.test_migrations_run_before"}
+ )
def test_run_before(self):
"""
Makes sure the loader uses Migration.run_before.
@@ -151,11 +166,13 @@ class LoaderTests(TestCase):
],
)
- @override_settings(MIGRATION_MODULES={
- "migrations": "migrations.test_migrations_first",
- "migrations2": "migrations2.test_migrations_2_first",
- })
- @modify_settings(INSTALLED_APPS={'append': 'migrations2'})
+ @override_settings(
+ MIGRATION_MODULES={
+ "migrations": "migrations.test_migrations_first",
+ "migrations2": "migrations2.test_migrations_2_first",
+ }
+ )
+ @modify_settings(INSTALLED_APPS={"append": "migrations2"})
def test_first(self):
"""
Makes sure the '__first__' migrations build correctly.
@@ -187,39 +204,47 @@ class LoaderTests(TestCase):
migration_loader.get_migration_by_prefix("migrations", "blarg")
def test_load_import_error(self):
- with override_settings(MIGRATION_MODULES={"migrations": "import_error_package"}):
+ with override_settings(
+ MIGRATION_MODULES={"migrations": "import_error_package"}
+ ):
with self.assertRaises(ImportError):
MigrationLoader(connection)
def test_load_module_file(self):
- with override_settings(MIGRATION_MODULES={"migrations": "migrations.faulty_migrations.file"}):
+ with override_settings(
+ MIGRATION_MODULES={"migrations": "migrations.faulty_migrations.file"}
+ ):
loader = MigrationLoader(connection)
self.assertIn(
- "migrations", loader.unmigrated_apps,
- "App with migrations module file not in unmigrated apps."
+ "migrations",
+ loader.unmigrated_apps,
+ "App with migrations module file not in unmigrated apps.",
)
def test_load_empty_dir(self):
- with override_settings(MIGRATION_MODULES={"migrations": "migrations.faulty_migrations.namespace"}):
+ with override_settings(
+ MIGRATION_MODULES={"migrations": "migrations.faulty_migrations.namespace"}
+ ):
loader = MigrationLoader(connection)
self.assertIn(
- "migrations", loader.unmigrated_apps,
- "App missing __init__.py in migrations module not in unmigrated apps."
+ "migrations",
+ loader.unmigrated_apps,
+ "App missing __init__.py in migrations module not in unmigrated apps.",
)
@override_settings(
- INSTALLED_APPS=['migrations.migrations_test_apps.migrated_app'],
+ INSTALLED_APPS=["migrations.migrations_test_apps.migrated_app"],
)
def test_marked_as_migrated(self):
"""
Undefined MIGRATION_MODULES implies default migration module.
"""
migration_loader = MigrationLoader(connection)
- self.assertEqual(migration_loader.migrated_apps, {'migrated_app'})
+ self.assertEqual(migration_loader.migrated_apps, {"migrated_app"})
self.assertEqual(migration_loader.unmigrated_apps, set())
@override_settings(
- INSTALLED_APPS=['migrations.migrations_test_apps.migrated_app'],
+ INSTALLED_APPS=["migrations.migrations_test_apps.migrated_app"],
MIGRATION_MODULES={"migrated_app": None},
)
def test_marked_as_unmigrated(self):
@@ -228,11 +253,11 @@ class LoaderTests(TestCase):
"""
migration_loader = MigrationLoader(connection)
self.assertEqual(migration_loader.migrated_apps, set())
- self.assertEqual(migration_loader.unmigrated_apps, {'migrated_app'})
+ self.assertEqual(migration_loader.unmigrated_apps, {"migrated_app"})
@override_settings(
- INSTALLED_APPS=['migrations.migrations_test_apps.migrated_app'],
- MIGRATION_MODULES={'migrated_app': 'missing-module'},
+ INSTALLED_APPS=["migrations.migrations_test_apps.migrated_app"],
+ MIGRATION_MODULES={"migrated_app": "missing-module"},
)
def test_explicit_missing_module(self):
"""
@@ -240,13 +265,15 @@ class LoaderTests(TestCase):
raised during the importation attempt should be propagated unless
`ignore_no_migrations=True`.
"""
- with self.assertRaisesMessage(ImportError, 'missing-module'):
+ with self.assertRaisesMessage(ImportError, "missing-module"):
migration_loader = MigrationLoader(connection)
migration_loader = MigrationLoader(connection, ignore_no_migrations=True)
self.assertEqual(migration_loader.migrated_apps, set())
- self.assertEqual(migration_loader.unmigrated_apps, {'migrated_app'})
+ self.assertEqual(migration_loader.unmigrated_apps, {"migrated_app"})
- @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations_squashed"})
+ @override_settings(
+ MIGRATION_MODULES={"migrations": "migrations.test_migrations_squashed"}
+ )
def test_loading_squashed(self):
"Tests loading a squashed migration"
migration_loader = MigrationLoader(connection)
@@ -258,14 +285,16 @@ class LoaderTests(TestCase):
1,
)
# However, fake-apply one migration and it should now use the old two
- self.record_applied(recorder, 'migrations', '0001_initial')
+ self.record_applied(recorder, "migrations", "0001_initial")
migration_loader.build_graph()
self.assertEqual(
len([x for x in migration_loader.graph.nodes if x[0] == "migrations"]),
2,
)
- @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations_squashed_complex"})
+ @override_settings(
+ MIGRATION_MODULES={"migrations": "migrations.test_migrations_squashed_complex"}
+ )
def test_loading_squashed_complex(self):
"Tests loading a complex set of squashed migrations"
@@ -274,7 +303,7 @@ class LoaderTests(TestCase):
self.addCleanup(recorder.flush)
def num_nodes():
- plan = set(loader.graph.forwards_plan(('migrations', '7_auto')))
+ plan = set(loader.graph.forwards_plan(("migrations", "7_auto")))
return len(plan - loader.applied_migrations.keys())
# Empty database: use squashed migration
@@ -282,83 +311,99 @@ class LoaderTests(TestCase):
self.assertEqual(num_nodes(), 5)
# Starting at 1 or 2 should use the squashed migration too
- self.record_applied(recorder, 'migrations', '1_auto')
+ self.record_applied(recorder, "migrations", "1_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 4)
- self.record_applied(recorder, 'migrations', '2_auto')
+ self.record_applied(recorder, "migrations", "2_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 3)
# However, starting at 3 to 5 cannot use the squashed migration
- self.record_applied(recorder, 'migrations', '3_auto')
+ self.record_applied(recorder, "migrations", "3_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 4)
- self.record_applied(recorder, 'migrations', '4_auto')
+ self.record_applied(recorder, "migrations", "4_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 3)
# Starting at 5 to 7 we are past the squashed migrations.
- self.record_applied(recorder, 'migrations', '5_auto')
+ self.record_applied(recorder, "migrations", "5_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 2)
- self.record_applied(recorder, 'migrations', '6_auto')
+ self.record_applied(recorder, "migrations", "6_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 1)
- self.record_applied(recorder, 'migrations', '7_auto')
+ self.record_applied(recorder, "migrations", "7_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 0)
- @override_settings(MIGRATION_MODULES={
- "app1": "migrations.test_migrations_squashed_complex_multi_apps.app1",
- "app2": "migrations.test_migrations_squashed_complex_multi_apps.app2",
- })
- @modify_settings(INSTALLED_APPS={'append': [
- "migrations.test_migrations_squashed_complex_multi_apps.app1",
- "migrations.test_migrations_squashed_complex_multi_apps.app2",
- ]})
+ @override_settings(
+ MIGRATION_MODULES={
+ "app1": "migrations.test_migrations_squashed_complex_multi_apps.app1",
+ "app2": "migrations.test_migrations_squashed_complex_multi_apps.app2",
+ }
+ )
+ @modify_settings(
+ INSTALLED_APPS={
+ "append": [
+ "migrations.test_migrations_squashed_complex_multi_apps.app1",
+ "migrations.test_migrations_squashed_complex_multi_apps.app2",
+ ]
+ }
+ )
def test_loading_squashed_complex_multi_apps(self):
loader = MigrationLoader(connection)
loader.build_graph()
- plan = set(loader.graph.forwards_plan(('app1', '4_auto')))
+ plan = set(loader.graph.forwards_plan(("app1", "4_auto")))
expected_plan = {
- ('app1', '1_auto'),
- ('app2', '1_squashed_2'),
- ('app1', '2_squashed_3'),
- ('app1', '4_auto'),
+ ("app1", "1_auto"),
+ ("app2", "1_squashed_2"),
+ ("app1", "2_squashed_3"),
+ ("app1", "4_auto"),
}
self.assertEqual(plan, expected_plan)
- @override_settings(MIGRATION_MODULES={
- "app1": "migrations.test_migrations_squashed_complex_multi_apps.app1",
- "app2": "migrations.test_migrations_squashed_complex_multi_apps.app2",
- })
- @modify_settings(INSTALLED_APPS={'append': [
- "migrations.test_migrations_squashed_complex_multi_apps.app1",
- "migrations.test_migrations_squashed_complex_multi_apps.app2",
- ]})
+ @override_settings(
+ MIGRATION_MODULES={
+ "app1": "migrations.test_migrations_squashed_complex_multi_apps.app1",
+ "app2": "migrations.test_migrations_squashed_complex_multi_apps.app2",
+ }
+ )
+ @modify_settings(
+ INSTALLED_APPS={
+ "append": [
+ "migrations.test_migrations_squashed_complex_multi_apps.app1",
+ "migrations.test_migrations_squashed_complex_multi_apps.app2",
+ ]
+ }
+ )
def test_loading_squashed_complex_multi_apps_partially_applied(self):
loader = MigrationLoader(connection)
recorder = MigrationRecorder(connection)
- self.record_applied(recorder, 'app1', '1_auto')
- self.record_applied(recorder, 'app1', '2_auto')
+ self.record_applied(recorder, "app1", "1_auto")
+ self.record_applied(recorder, "app1", "2_auto")
loader.build_graph()
- plan = set(loader.graph.forwards_plan(('app1', '4_auto')))
+ plan = set(loader.graph.forwards_plan(("app1", "4_auto")))
plan = plan - loader.applied_migrations.keys()
expected_plan = {
- ('app2', '1_squashed_2'),
- ('app1', '3_auto'),
- ('app1', '4_auto'),
+ ("app2", "1_squashed_2"),
+ ("app1", "3_auto"),
+ ("app1", "4_auto"),
}
self.assertEqual(plan, expected_plan)
- @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations_squashed_erroneous"})
+ @override_settings(
+ MIGRATION_MODULES={
+ "migrations": "migrations.test_migrations_squashed_erroneous"
+ }
+ )
def test_loading_squashed_erroneous(self):
"Tests loading a complex but erroneous set of squashed migrations"
@@ -367,7 +412,7 @@ class LoaderTests(TestCase):
self.addCleanup(recorder.flush)
def num_nodes():
- plan = set(loader.graph.forwards_plan(('migrations', '7_auto')))
+ plan = set(loader.graph.forwards_plan(("migrations", "7_auto")))
return len(plan - loader.applied_migrations.keys())
# Empty database: use squashed migration
@@ -375,50 +420,52 @@ class LoaderTests(TestCase):
self.assertEqual(num_nodes(), 5)
# Starting at 1 or 2 should use the squashed migration too
- self.record_applied(recorder, 'migrations', '1_auto')
+ self.record_applied(recorder, "migrations", "1_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 4)
- self.record_applied(recorder, 'migrations', '2_auto')
+ self.record_applied(recorder, "migrations", "2_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 3)
# However, starting at 3 or 4, nonexistent migrations would be needed.
- msg = ("Migration migrations.6_auto depends on nonexistent node ('migrations', '5_auto'). "
- "Django tried to replace migration migrations.5_auto with any of "
- "[migrations.3_squashed_5] but wasn't able to because some of the replaced "
- "migrations are already applied.")
+ msg = (
+ "Migration migrations.6_auto depends on nonexistent node ('migrations', '5_auto'). "
+ "Django tried to replace migration migrations.5_auto with any of "
+ "[migrations.3_squashed_5] but wasn't able to because some of the replaced "
+ "migrations are already applied."
+ )
- self.record_applied(recorder, 'migrations', '3_auto')
+ self.record_applied(recorder, "migrations", "3_auto")
with self.assertRaisesMessage(NodeNotFoundError, msg):
loader.build_graph()
- self.record_applied(recorder, 'migrations', '4_auto')
+ self.record_applied(recorder, "migrations", "4_auto")
with self.assertRaisesMessage(NodeNotFoundError, msg):
loader.build_graph()
# Starting at 5 to 7 we are passed the squashed migrations
- self.record_applied(recorder, 'migrations', '5_auto')
+ self.record_applied(recorder, "migrations", "5_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 2)
- self.record_applied(recorder, 'migrations', '6_auto')
+ self.record_applied(recorder, "migrations", "6_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 1)
- self.record_applied(recorder, 'migrations', '7_auto')
+ self.record_applied(recorder, "migrations", "7_auto")
loader.build_graph()
self.assertEqual(num_nodes(), 0)
@override_settings(
- MIGRATION_MODULES={'migrations': 'migrations.test_migrations'},
- INSTALLED_APPS=['migrations'],
+ MIGRATION_MODULES={"migrations": "migrations.test_migrations"},
+ INSTALLED_APPS=["migrations"],
)
def test_check_consistent_history(self):
loader = MigrationLoader(connection=None)
loader.check_consistent_history(connection)
recorder = MigrationRecorder(connection)
- self.record_applied(recorder, 'migrations', '0002_second')
+ self.record_applied(recorder, "migrations", "0002_second")
msg = (
"Migration migrations.0002_second is applied before its dependency "
"migrations.0001_initial on database 'default'."
@@ -427,8 +474,8 @@ class LoaderTests(TestCase):
loader.check_consistent_history(connection)
@override_settings(
- MIGRATION_MODULES={'migrations': 'migrations.test_migrations_squashed_extra'},
- INSTALLED_APPS=['migrations'],
+ MIGRATION_MODULES={"migrations": "migrations.test_migrations_squashed_extra"},
+ INSTALLED_APPS=["migrations"],
)
def test_check_consistent_history_squashed(self):
"""
@@ -437,20 +484,26 @@ class LoaderTests(TestCase):
"""
loader = MigrationLoader(connection=None)
recorder = MigrationRecorder(connection)
- self.record_applied(recorder, 'migrations', '0001_initial')
- self.record_applied(recorder, 'migrations', '0002_second')
+ self.record_applied(recorder, "migrations", "0001_initial")
+ self.record_applied(recorder, "migrations", "0002_second")
loader.check_consistent_history(connection)
- self.record_applied(recorder, 'migrations', '0003_third')
+ self.record_applied(recorder, "migrations", "0003_third")
loader.check_consistent_history(connection)
- @override_settings(MIGRATION_MODULES={
- "app1": "migrations.test_migrations_squashed_ref_squashed.app1",
- "app2": "migrations.test_migrations_squashed_ref_squashed.app2",
- })
- @modify_settings(INSTALLED_APPS={'append': [
- "migrations.test_migrations_squashed_ref_squashed.app1",
- "migrations.test_migrations_squashed_ref_squashed.app2",
- ]})
+ @override_settings(
+ MIGRATION_MODULES={
+ "app1": "migrations.test_migrations_squashed_ref_squashed.app1",
+ "app2": "migrations.test_migrations_squashed_ref_squashed.app2",
+ }
+ )
+ @modify_settings(
+ INSTALLED_APPS={
+ "append": [
+ "migrations.test_migrations_squashed_ref_squashed.app1",
+ "migrations.test_migrations_squashed_ref_squashed.app2",
+ ]
+ }
+ )
def test_loading_squashed_ref_squashed(self):
"Tests loading a squashed migration with a new migration referencing it"
r"""
@@ -475,13 +528,13 @@ class LoaderTests(TestCase):
# Load with nothing applied: both migrations squashed.
loader.build_graph()
- plan = set(loader.graph.forwards_plan(('app1', '4_auto')))
+ plan = set(loader.graph.forwards_plan(("app1", "4_auto")))
plan = plan - loader.applied_migrations.keys()
expected_plan = {
- ('app1', '1_auto'),
- ('app2', '1_squashed_2'),
- ('app1', '2_squashed_3'),
- ('app1', '4_auto'),
+ ("app1", "1_auto"),
+ ("app2", "1_squashed_2"),
+ ("app1", "2_squashed_3"),
+ ("app1", "4_auto"),
}
self.assertEqual(plan, expected_plan)
@@ -490,72 +543,80 @@ class LoaderTests(TestCase):
loader.build_graph()
msg = "Node ('app1', '3_auto') not a valid node"
with self.assertRaisesMessage(NodeNotFoundError, msg):
- loader.graph.forwards_plan(('app1', '3_auto'))
+ loader.graph.forwards_plan(("app1", "3_auto"))
# Possible if loader.replace_migrations is False.
loader.replace_migrations = False
loader.build_graph()
- plan = set(loader.graph.forwards_plan(('app1', '3_auto')))
+ plan = set(loader.graph.forwards_plan(("app1", "3_auto")))
plan = plan - loader.applied_migrations.keys()
expected_plan = {
- ('app1', '1_auto'),
- ('app2', '1_auto'),
- ('app2', '2_auto'),
- ('app1', '2_auto'),
- ('app1', '3_auto'),
+ ("app1", "1_auto"),
+ ("app2", "1_auto"),
+ ("app2", "2_auto"),
+ ("app1", "2_auto"),
+ ("app1", "3_auto"),
}
self.assertEqual(plan, expected_plan)
loader.replace_migrations = True
# Fake-apply a few from app1: unsquashes migration in app1.
- self.record_applied(recorder, 'app1', '1_auto')
- self.record_applied(recorder, 'app1', '2_auto')
+ self.record_applied(recorder, "app1", "1_auto")
+ self.record_applied(recorder, "app1", "2_auto")
loader.build_graph()
- plan = set(loader.graph.forwards_plan(('app1', '4_auto')))
+ plan = set(loader.graph.forwards_plan(("app1", "4_auto")))
plan = plan - loader.applied_migrations.keys()
expected_plan = {
- ('app2', '1_squashed_2'),
- ('app1', '3_auto'),
- ('app1', '4_auto'),
+ ("app2", "1_squashed_2"),
+ ("app1", "3_auto"),
+ ("app1", "4_auto"),
}
self.assertEqual(plan, expected_plan)
# Fake-apply one from app2: unsquashes migration in app2 too.
- self.record_applied(recorder, 'app2', '1_auto')
+ self.record_applied(recorder, "app2", "1_auto")
loader.build_graph()
- plan = set(loader.graph.forwards_plan(('app1', '4_auto')))
+ plan = set(loader.graph.forwards_plan(("app1", "4_auto")))
plan = plan - loader.applied_migrations.keys()
expected_plan = {
- ('app2', '2_auto'),
- ('app1', '3_auto'),
- ('app1', '4_auto'),
+ ("app2", "2_auto"),
+ ("app1", "3_auto"),
+ ("app1", "4_auto"),
}
self.assertEqual(plan, expected_plan)
- @override_settings(MIGRATION_MODULES={'migrations': 'migrations.test_migrations_private'})
+ @override_settings(
+ MIGRATION_MODULES={"migrations": "migrations.test_migrations_private"}
+ )
def test_ignore_files(self):
"""Files prefixed with underscore, tilde, or dot aren't loaded."""
loader = MigrationLoader(connection)
loader.load_disk()
- migrations = [name for app, name in loader.disk_migrations if app == 'migrations']
- self.assertEqual(migrations, ['0001_initial'])
+ migrations = [
+ name for app, name in loader.disk_migrations if app == "migrations"
+ ]
+ self.assertEqual(migrations, ["0001_initial"])
@override_settings(
- MIGRATION_MODULES={'migrations': 'migrations.test_migrations_namespace_package'},
+ MIGRATION_MODULES={
+ "migrations": "migrations.test_migrations_namespace_package"
+ },
)
def test_loading_namespace_package(self):
"""Migration directories without an __init__.py file are ignored."""
loader = MigrationLoader(connection)
loader.load_disk()
- migrations = [name for app, name in loader.disk_migrations if app == 'migrations']
+ migrations = [
+ name for app, name in loader.disk_migrations if app == "migrations"
+ ]
self.assertEqual(migrations, [])
- @override_settings(MIGRATION_MODULES={'migrations': 'migrations.test_migrations'})
+ @override_settings(MIGRATION_MODULES={"migrations": "migrations.test_migrations"})
def test_loading_package_without__file__(self):
"""
To support frozen environments, MigrationLoader loads migrations from
regular packages with no __file__ attribute.
"""
- test_module = import_module('migrations.test_migrations')
+ test_module = import_module("migrations.test_migrations")
loader = MigrationLoader(connection)
# __file__ == __spec__.origin or the latter is None and former is
# undefined.
@@ -568,11 +629,9 @@ class LoaderTests(TestCase):
test_module.__spec__.has_location = False
loader.load_disk()
migrations = [
- name
- for app, name in loader.disk_migrations
- if app == 'migrations'
+ name for app, name in loader.disk_migrations if app == "migrations"
]
- self.assertCountEqual(migrations, ['0001_initial', '0002_second'])
+ self.assertCountEqual(migrations, ["0001_initial", "0002_second"])
finally:
test_module.__file__ = module_file
test_module.__spec__.origin = module_origin
@@ -580,30 +639,33 @@ class LoaderTests(TestCase):
class PycLoaderTests(MigrationTestBase):
-
def test_valid(self):
"""
To support frozen environments, MigrationLoader loads .pyc migrations.
"""
- with self.temporary_migration_module(module='migrations.test_migrations') as migration_dir:
+ with self.temporary_migration_module(
+ module="migrations.test_migrations"
+ ) as migration_dir:
# Compile .py files to .pyc files and delete .py files.
compileall.compile_dir(migration_dir, force=True, quiet=1, legacy=True)
for name in os.listdir(migration_dir):
- if name.endswith('.py'):
+ if name.endswith(".py"):
os.remove(os.path.join(migration_dir, name))
loader = MigrationLoader(connection)
- self.assertIn(('migrations', '0001_initial'), loader.disk_migrations)
+ self.assertIn(("migrations", "0001_initial"), loader.disk_migrations)
def test_invalid(self):
"""
MigrationLoader reraises ImportErrors caused by "bad magic number" pyc
files with a more helpful message.
"""
- with self.temporary_migration_module(module='migrations.test_migrations_bad_pyc') as migration_dir:
+ with self.temporary_migration_module(
+ module="migrations.test_migrations_bad_pyc"
+ ) as migration_dir:
# The -tpl suffix is to avoid the pyc exclusion in MANIFEST.in.
os.rename(
- os.path.join(migration_dir, '0001_initial.pyc-tpl'),
- os.path.join(migration_dir, '0001_initial.pyc'),
+ os.path.join(migration_dir, "0001_initial.pyc-tpl"),
+ os.path.join(migration_dir, "0001_initial.pyc"),
)
msg = (
r"Couldn't import '\w+.migrations.0001_initial' as it appears "