]> granicus.if.org Git - python/commitdiff
Fix datetime and its test.
authorGuido van Rossum <guido@python.org>
Wed, 23 May 2007 21:24:35 +0000 (21:24 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 23 May 2007 21:24:35 +0000 (21:24 +0000)
Lib/test/test_datetime.py
Modules/datetimemodule.c

index 4ab2f7bc69f8d59f483e94f46dae587894a8a49f..89c126fec1c53a69954c052fdb598f5f135c51ed 100644 (file)
@@ -1098,7 +1098,8 @@ class TestDate(HarmlessMixedComparison, unittest.TestCase):
             # This shouldn't blow up because of the month byte alone.  If
             # the implementation changes to do more-careful checking, it may
             # blow up because other fields are insane.
-            self.theclass(base[:2] + chr(ord_byte) + base[3:])
+            # XXX Maybe this will have to become bytes?
+            self.theclass(str8(base[:2] + chr(ord_byte) + base[3:]))
 
 #############################################################################
 # datetime tests
index f31b44c058d191459bb004b9a42f851cb442274e..5190175dfbfd16eb37d9db553e22c98c1b003a76 100644 (file)
@@ -927,7 +927,8 @@ call_dst(PyObject *tzinfo, PyObject *tzinfoarg, int *none)
 /* Call tzinfo.tzname(tzinfoarg), and return the result.  tzinfo must be
  * an instance of the tzinfo class or None.  If tzinfo isn't None, and
  * tzname() doesn't return None or a string, TypeError is raised and this
- * returns NULL.
+ * returns NULL.  If the result is a string, we ensure it is a Unicode
+ * string.
  */
 static PyObject *
 call_tzname(PyObject *tzinfo, PyObject *tzinfoarg)
@@ -945,12 +946,19 @@ call_tzname(PyObject *tzinfo, PyObject *tzinfoarg)
        else
                result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg);
 
-       if (result != NULL && result != Py_None && ! PyString_Check(result)) {
-               PyErr_Format(PyExc_TypeError, "tzinfo.tzname() must "
-                            "return None or a string, not '%s'",
-                            result->ob_type->tp_name);
-               Py_DECREF(result);
-               result = NULL;
+       if (result != NULL && result != Py_None) {
+               if (!PyString_Check(result) && !PyUnicode_Check(result)) {
+                       PyErr_Format(PyExc_TypeError, "tzinfo.tzname() must "
+                                    "return None or a string, not '%s'",
+                                    result->ob_type->tp_name);
+                       Py_DECREF(result);
+                       result = NULL;
+               }
+               else if (!PyUnicode_Check(result)) {
+                       PyObject *temp = PyUnicode_FromObject(result);
+                       Py_DECREF(result);
+                       result = temp;
+               }
        }
        return result;
 }
@@ -1241,7 +1249,7 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
                                        temp = call_tzname(tzinfo, tzinfoarg);
                                        if (temp == NULL) goto Done;
                                        if (temp != Py_None) {
-                                               assert(PyString_Check(temp));
+                                               assert(PyUnicode_Check(temp));
                                                /* Since the tzname is getting
                                                 * stuffed into the format, we
                                                 * have to double any % signs
@@ -1255,6 +1263,11 @@ wrap_strftime(PyObject *object, PyObject *format, PyObject *timetuple,
                                                Py_DECREF(temp);
                                                if (Zreplacement == NULL)
                                                        goto Done;
+                                               if (PyUnicode_Check(Zreplacement)) {
+                                                       Zreplacement = _PyUnicode_AsDefaultEncodedString(Zreplacement, NULL);
+                                                       if (Zreplacement == NULL)
+                                                               goto Done;
+                                               }
                                                if (!PyString_Check(Zreplacement)) {
                                                        PyErr_SetString(PyExc_TypeError, "tzname.replace() did not return a string");
                                                        goto Done;