summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMoayad Mardini <moayad.m@gmail.com>2014-05-22 14:29:30 +0300
committerBaptiste Mispelon <bmispelon@gmail.com>2014-05-22 16:20:21 +0200
commit7d4a51e239bcde34d1614877accb3aa5f5589e0c (patch)
tree0cc0048bb03db5ab453ba51a4d7fcd4893f08096
parentfb45e666c204d7188c38469ca1f661a9b113b85b (diff)
[1.7.x] Fixed #22679 -- Fixed empty tuple serialization in MigrationWriter.
Thanks rockallite.wulf for the report. Backport of ad994a3c5b5911a12a5e2f2a8d06c036be1b8ad8 from master.
-rw-r--r--django/db/migrations/writer.py8
-rw-r--r--tests/migrations/test_writer.py12
2 files changed, 18 insertions, 2 deletions
diff --git a/django/db/migrations/writer.py b/django/db/migrations/writer.py
index da6aed4308..c8a3a6cf76 100644
--- a/django/db/migrations/writer.py
+++ b/django/db/migrations/writer.py
@@ -206,7 +206,9 @@ class MigrationWriter(object):
if isinstance(value, set):
format = "set([%s])"
elif isinstance(value, tuple):
- format = "(%s)" if len(value) > 1 else "(%s,)"
+ # When len(value)==0, the empty tuple should be serialized as
+ # "()", not "(,)" because (,) is invalid Python syntax.
+ format = "(%s)" if len(value) != 1 else "(%s,)"
else:
format = "[%s]"
return format % (", ".join(strings)), imports
@@ -296,7 +298,9 @@ class MigrationWriter(object):
item_string, item_imports = cls.serialize(item)
imports.update(item_imports)
strings.append(item_string)
- format = "(%s)" if len(strings) > 1 else "(%s,)"
+ # When len(strings)==0, the empty iterable should be serialized as
+ # "()", not "(,)" because (,) is invalid Python syntax.
+ format = "(%s)" if len(strings) != 1 else "(%s,)"
return format % (", ".join(strings)), imports
# Uh oh.
else:
diff --git a/tests/migrations/test_writer.py b/tests/migrations/test_writer.py
index 58b5aa6cac..f73f08fb9c 100644
--- a/tests/migrations/test_writer.py
+++ b/tests/migrations/test_writer.py
@@ -125,6 +125,18 @@ class WriterTests(TestCase):
)
)
+ def test_serialize_empty_nonempty_tuple(self):
+ """
+ Ticket #22679: makemigrations generates invalid code for (an empty
+ tuple) default_permissions = ()
+ """
+ empty_tuple = ()
+ one_item_tuple = ('a')
+ many_items_tuple = ('a', 'b', 'c')
+ self.assertSerializedEqual(empty_tuple)
+ self.assertSerializedEqual(one_item_tuple)
+ self.assertSerializedEqual(many_items_tuple)
+
def test_simple_migration(self):
"""
Tests serializing a simple migration.