#24779 closed Bug (wontfix)
django-1.8.1 fails test with pypy - FAIL: test_serialize_datetime_safe (migrations.test_writer.WriterTests)
| Reported by: | Justin | Owned by: | nobody |
|---|---|---|---|
| Component: | Migrations | Version: | 1.8 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Accepted | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description (last modified by )
This happens with pypy-2.5.1 and python-dateutil-2.4.2
test_written_spooled_temp (files.tests.SpooledTempTests) ... ok
======================================================================
ERROR: test_serialize_datetime (migrations.test_writer.WriterTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/tests/migrations/test_writer.py", line 240, in test_serialize_datetime
self.assertSerializedEqual(datetime.datetime.utcnow)
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/tests/migrations/test_writer.py", line 176, in assertSerializedEqual
self.assertEqual(self.serialize_round_trip(value), value)
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/tests/migrations/test_writer.py", line 172, in serialize_round_trip
string, imports = MigrationWriter.serialize(value)
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/django/db/migrations/writer.py", line 465, in serialize
"topics/migrations/#migration-serializing" % (value, get_docs_version())
ValueError: Cannot serialize: <bound method type.utcnow of <class 'datetime.datetime'>>
There are some values Django cannot serialize into migration files.
For more, see https://docs.djangoproject.com/en/1.8/topics/migrations/#migration-serializing
======================================================================
ERROR: test_simple_migration (migrations.test_writer.WriterTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/tests/migrations/test_writer.py", line 425, in test_simple_migration
output = writer.as_string()
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/django/db/migrations/writer.py", line 166, in as_string
operation_string, operation_imports = OperationWriter(operation).serialize()
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/django/db/migrations/writer.py", line 124, in serialize
_write(arg_name, arg_value)
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/django/db/migrations/writer.py", line 75, in _write
arg_string, arg_imports = MigrationWriter.serialize(item)
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/django/db/migrations/writer.py", line 303, in serialize
item_string, item_imports = cls.serialize(item)
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/django/db/migrations/writer.py", line 377, in serialize
return cls.serialize_deconstructed(path, args, kwargs)
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/django/db/migrations/writer.py", line 268, in serialize_deconstructed
arg_string, arg_imports = cls.serialize(arg)
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/django/db/migrations/writer.py", line 465, in serialize
"topics/migrations/#migration-serializing" % (value, get_docs_version())
ValueError: Cannot serialize: <bound method type.utcnow of <class 'datetime.datetime'>>
There are some values Django cannot serialize into migration files.
For more, see https://docs.djangoproject.com/en/1.8/topics/migrations/#migration-serializing
======================================================================
FAIL: test_serialize_datetime_safe (migrations.test_writer.WriterTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/tests/migrations/test_writer.py", line 263, in test_serialize_datetime_safe
("datetime.date(2014, 3, 31)", {'import datetime'})
File "/var/tmp/portage/dev-python/django-1.8.1/work/Django-1.8.1/tests/migrations/test_writer.py", line 179, in assertSerializedResultEqual
self.assertEqual(MigrationWriter.serialize(value), target)
AssertionError: Tuples differ: (u'datetime.datetime.date(2014... != (u'datetime.date(2014, 3, 31)'...
First differing element 0:
datetime.datetime.date(2014, 3, 31)
datetime.date(2014, 3, 31)
- (u'datetime.datetime.date(2014, 3, 31)', set([u'import datetime']))
? ---------
+ (u'datetime.date(2014, 3, 31)', set([u'import datetime']))
----------------------------------------------------------------------
Change History (5)
comment:1 by , 11 years ago
| Component: | Testing framework → Migrations |
|---|---|
| Description: | modified (diff) |
comment:2 by , 11 years ago
| Triage Stage: | Unreviewed → Accepted |
|---|
comment:3 by , 10 years ago
comment:4 by , 10 years ago
| Resolution: | → wontfix |
|---|---|
| Status: | new → closed |
After a brief talk to Maciej Fijalkowski in #pypy on IRC, his response was "we can probably fix it". I documented the inconsistency in PyPy's issue tracker: https://bitbucket.org/pypy/pypy/issue/2062 . Hence I'm closing this issue here.
comment:5 by , 10 years ago
Fix is committed to PyPy: https://bitbucket.org/pypy/pypy/commits/8c313d798d123b85636a20f1c5a28c4eb8b5162b
Note:
See TracTickets
for help on using tickets.
I've discovered the problem, I think it's a bug in PyPy. But I don't know if there is any Python API specification where this is specified in.
The difference lies in the way the
__repr__is made for date, time and datetime classes.In pypy the
__repr__is determined as follows:date: https://bitbucket.org/pypy/pypy/src/5d676752ae6613d0b423f4c1028ac47e1571d5fa/lib_pypy/datetime.py?at=default#cl-790
time: https://bitbucket.org/pypy/pypy/src/5d676752ae6613d0b423f4c1028ac47e1571d5fa/lib_pypy/datetime.py?at=default#cl-1281
datetime: https://bitbucket.org/pypy/pypy/src/5d676752ae6613d0b423f4c1028ac47e1571d5fa/lib_pypy/datetime.py?at=default#cl-1692
While in cpython it is done like this:
date: https://github.com/python/cpython/blob/master/Modules/_datetimemodule.c#L2633
time: https://github.com/python/cpython/blob/master/Modules/_datetimemodule.c#L3581
datetime: https://github.com/python/cpython/blob/master/Modules/_datetimemodule.c#L4442
Which causes the date, datetime and time classes in datetime_safe module to return the wrong repr value.
e.g. in cpython 2 and 3 repr(datetime_safe.date(2015, 1, 1)) would return:
While in pypy this would return:
And the same would happen for datetime and time.
There are three solutions I can think of:
__repr__function in datetime_safe.{date,time,datetime} which return the representation consistently for both PyPy and cpython.