[pypy-commit] pypy issue2062: Fixed #2062 -- Treated date/datetime/time/timedelta repr like on CPython

MarkusH noreply at buildbot.pypy.org
Mon Jun 8 20:41:50 CEST 2015


Author: Markus Holtermann <info at markusholtermann.eu>
Branch: issue2062
Changeset: r77964:a5b003f9b84e
Date: 2015-06-08 20:29 +0200
http://bitbucket.org/pypy/pypy/changeset/a5b003f9b84e/

Log:	Fixed #2062 -- Treated date/datetime/time/timedelta repr like on
	CPython

diff --git a/lib_pypy/datetime.py b/lib_pypy/datetime.py
--- a/lib_pypy/datetime.py
+++ b/lib_pypy/datetime.py
@@ -536,16 +536,17 @@
         return self
 
     def __repr__(self):
+        module = "datetime." if self.__class__ is timedelta else ""
         if self._microseconds:
-            return "%s(%d, %d, %d)" % ('datetime.' + self.__class__.__name__,
+            return "%s(%d, %d, %d)" % (module + self.__class__.__name__,
                                        self._days,
                                        self._seconds,
                                        self._microseconds)
         if self._seconds:
-            return "%s(%d, %d)" % ('datetime.' + self.__class__.__name__,
+            return "%s(%d, %d)" % (module + self.__class__.__name__,
                                    self._days,
                                    self._seconds)
-        return "%s(%d)" % ('datetime.' + self.__class__.__name__, self._days)
+        return "%s(%d)" % (module + self.__class__.__name__, self._days)
 
     def __str__(self):
         mm, ss = divmod(self._seconds, 60)
@@ -798,7 +799,8 @@
         >>> repr(dt)
         'datetime.datetime(2010, 1, 1, 0, 0, tzinfo=datetime.timezone.utc)'
         """
-        return "%s(%d, %d, %d)" % ('datetime.' + self.__class__.__name__,
+        module = "datetime." if self.__class__ is date else ""
+        return "%s(%d, %d, %d)" % (module + self.__class__.__name__,
                                    self._year,
                                    self._month,
                                    self._day)
@@ -1286,7 +1288,8 @@
             s = ", %d" % self._second
         else:
             s = ""
-        s= "%s(%d, %d%s)" % ('datetime.' + self.__class__.__name__,
+        module = "datetime." if self.__class__ is time else ""
+        s= "%s(%d, %d%s)" % (module + self.__class__.__name__,
                              self._hour, self._minute, s)
         if self._tzinfo is not None:
             assert s[-1:] == ")"
@@ -1698,7 +1701,8 @@
         if L[-1] == 0:
             del L[-1]
         s = ", ".join(map(str, L))
-        s = "%s(%s)" % ('datetime.' + self.__class__.__name__, s)
+        module = "datetime." if self.__class__ is datetime else ""
+        s = "%s(%s)" % (module + self.__class__.__name__, s)
         if self._tzinfo is not None:
             assert s[-1:] == ")"
             s = s[:-1] + ", tzinfo=%r" % self._tzinfo + ")"
diff --git a/pypy/module/test_lib_pypy/test_datetime.py b/pypy/module/test_lib_pypy/test_datetime.py
--- a/pypy/module/test_lib_pypy/test_datetime.py
+++ b/pypy/module/test_lib_pypy/test_datetime.py
@@ -10,6 +10,36 @@
         expected = "datetime.datetime(1, 2, 3, 0, 0)"
         assert repr(datetime.datetime(1,2,3)) == expected
 
+    def test_repr_overridden(self):
+        class date_safe(datetime.date):
+            pass
+
+        class datetime_safe(datetime.datetime):
+            pass
+
+        class time_safe(datetime.time):
+            pass
+
+        class timedelta_safe(datetime.timedelta):
+            pass
+
+        checks = (
+            (datetime.date(2015, 6, 8), "datetime.date(2015, 6, 8)"),
+            (datetime.datetime(2015, 6, 8, 12, 34, 56), "datetime.datetime(2015, 6, 8, 12, 34, 56)"),
+            (datetime.time(12, 34, 56), "datetime.time(12, 34, 56)"),
+            (datetime.timedelta(1), "datetime.timedelta(1)"),
+            (datetime.timedelta(1, 2), "datetime.timedelta(1, 2)"),
+            (datetime.timedelta(1, 2, 3), "datetime.timedelta(1, 2, 3)"),
+            (date_safe(2015, 6, 8), "date_safe(2015, 6, 8)"),
+            (datetime_safe(2015, 6, 8, 12, 34, 56), "datetime_safe(2015, 6, 8, 12, 34, 56)"),
+            (time_safe(12, 34, 56), "time_safe(12, 34, 56)"),
+            (timedelta_safe(1), "timedelta_safe(1)"),
+            (timedelta_safe(1, 2), "timedelta_safe(1, 2)"),
+            (timedelta_safe(1, 2, 3), "timedelta_safe(1, 2, 3)"),
+        )
+        for obj, expected in checks:
+            assert repr(obj) == expected
+
     def test_attributes(self):
         for x in [datetime.date.today(),
                   datetime.time(),


More information about the pypy-commit mailing list