mirror of
https://github.com/django/django.git
synced 2025-08-04 10:59:45 +00:00
Massive migration optimiser improvements + RenameModel opn
This commit is contained in:
parent
8265323c91
commit
106b019dc9
7 changed files with 520 additions and 19 deletions
|
@ -1,4 +1,5 @@
|
|||
# encoding: utf8
|
||||
import operator
|
||||
from django.test import TestCase
|
||||
from django.db.migrations.optimizer import MigrationOptimizer
|
||||
from django.db import migrations
|
||||
|
@ -64,7 +65,7 @@ class OptimizerTests(TestCase):
|
|||
self.assertOptimizesTo(
|
||||
[migrations.DeleteModel("Foo")],
|
||||
[migrations.DeleteModel("Foo")],
|
||||
exact=1,
|
||||
exact = 1,
|
||||
)
|
||||
|
||||
def test_create_delete_model(self):
|
||||
|
@ -79,6 +80,34 @@ class OptimizerTests(TestCase):
|
|||
[],
|
||||
)
|
||||
|
||||
def test_create_rename_model(self):
|
||||
"""
|
||||
CreateModel should absorb RenameModels.
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]),
|
||||
migrations.RenameModel("Foo", "Bar"),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Bar", [("name", models.CharField(max_length=255))]),
|
||||
],
|
||||
)
|
||||
|
||||
def test_rename_model_self(self):
|
||||
"""
|
||||
RenameModels should absorb themselves.
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.RenameModel("Foo", "Baa"),
|
||||
migrations.RenameModel("Baa", "Bar"),
|
||||
],
|
||||
[
|
||||
migrations.RenameModel("Foo", "Bar"),
|
||||
],
|
||||
)
|
||||
|
||||
def test_create_alter_delete_model(self):
|
||||
"""
|
||||
CreateModel, AlterModelTable, AlterUniqueTogether, and DeleteModel should collapse into nothing.
|
||||
|
@ -154,3 +183,167 @@ class OptimizerTests(TestCase):
|
|||
migrations.DeleteModel("Foo"),
|
||||
],
|
||||
)
|
||||
|
||||
def test_create_model_add_field(self):
|
||||
"""
|
||||
AddField should optimize into CreateModel.
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]),
|
||||
migrations.AddField("Foo", "age", models.IntegerField()),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("name", models.CharField(max_length=255)),
|
||||
("age", models.IntegerField()),
|
||||
]),
|
||||
],
|
||||
)
|
||||
|
||||
def test_create_model_alter_field(self):
|
||||
"""
|
||||
AlterField should optimize into CreateModel.
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]),
|
||||
migrations.AlterField("Foo", "name", models.IntegerField()),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("name", models.IntegerField()),
|
||||
]),
|
||||
],
|
||||
)
|
||||
|
||||
def test_create_model_rename_field(self):
|
||||
"""
|
||||
RenameField should optimize into CreateModel.
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]),
|
||||
migrations.RenameField("Foo", "name", "title"),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("title", models.CharField(max_length=255)),
|
||||
]),
|
||||
],
|
||||
)
|
||||
|
||||
def test_add_field_rename_field(self):
|
||||
"""
|
||||
RenameField should optimize into AddField
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.AddField("Foo", "name", models.CharField(max_length=255)),
|
||||
migrations.RenameField("Foo", "name", "title"),
|
||||
],
|
||||
[
|
||||
migrations.AddField("Foo", "title", models.CharField(max_length=255)),
|
||||
],
|
||||
)
|
||||
|
||||
def test_alter_field_rename_field(self):
|
||||
"""
|
||||
RenameField should optimize to the other side of AlterField,
|
||||
and into itself.
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.AlterField("Foo", "name", models.CharField(max_length=255)),
|
||||
migrations.RenameField("Foo", "name", "title"),
|
||||
migrations.RenameField("Foo", "title", "nom"),
|
||||
],
|
||||
[
|
||||
migrations.RenameField("Foo", "name", "nom"),
|
||||
migrations.AlterField("Foo", "nom", models.CharField(max_length=255)),
|
||||
],
|
||||
)
|
||||
|
||||
def test_create_model_remove_field(self):
|
||||
"""
|
||||
RemoveField should optimize into CreateModel.
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("name", models.CharField(max_length=255)),
|
||||
("age", models.IntegerField()),
|
||||
]),
|
||||
migrations.RemoveField("Foo", "age"),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Foo", [
|
||||
("name", models.CharField(max_length=255)),
|
||||
]),
|
||||
],
|
||||
)
|
||||
|
||||
def test_add_field_alter_field(self):
|
||||
"""
|
||||
AlterField should optimize into AddField.
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.AddField("Foo", "age", models.IntegerField()),
|
||||
migrations.AlterField("Foo", "age", models.FloatField(default=2.4)),
|
||||
],
|
||||
[
|
||||
migrations.AddField("Foo", "age", models.FloatField(default=2.4)),
|
||||
],
|
||||
)
|
||||
|
||||
def test_add_field_delete_field(self):
|
||||
"""
|
||||
RemoveField should cancel AddField
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.AddField("Foo", "age", models.IntegerField()),
|
||||
migrations.RemoveField("Foo", "age"),
|
||||
],
|
||||
[],
|
||||
)
|
||||
|
||||
def test_alter_field_delete_field(self):
|
||||
"""
|
||||
RemoveField should absorb AlterField
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.AlterField("Foo", "age", models.IntegerField()),
|
||||
migrations.RemoveField("Foo", "age"),
|
||||
],
|
||||
[
|
||||
migrations.RemoveField("Foo", "age"),
|
||||
],
|
||||
)
|
||||
|
||||
def test_optimize_through_fields(self):
|
||||
"""
|
||||
Checks that field-level through checking is working.
|
||||
This should manage to collapse model Foo to nonexistence,
|
||||
and model Bar to a single IntegerField called "width".
|
||||
"""
|
||||
self.assertOptimizesTo(
|
||||
[
|
||||
migrations.CreateModel("Foo", [("name", models.CharField(max_length=255))]),
|
||||
migrations.CreateModel("Bar", [("size", models.IntegerField())]),
|
||||
migrations.AddField("Foo", "age", models.IntegerField()),
|
||||
migrations.AddField("Bar", "width", models.IntegerField()),
|
||||
migrations.AlterField("Foo", "age", models.IntegerField()),
|
||||
migrations.RenameField("Bar", "size", "dimensions"),
|
||||
migrations.RemoveField("Foo", "age"),
|
||||
migrations.RenameModel("Foo", "Phou"),
|
||||
migrations.RemoveField("Bar", "dimensions"),
|
||||
migrations.RenameModel("Phou", "Fou"),
|
||||
migrations.DeleteModel("Fou"),
|
||||
],
|
||||
[
|
||||
migrations.CreateModel("Bar", [("width", models.IntegerField())]),
|
||||
],
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue