Mailing List Archive

CVS: python/nondist/sandbox/datetime datetime.c,1.7,1.8 test_cdatetime.py,1.3,1.4
Update of /cvsroot/python/python/nondist/sandbox/datetime
In directory usw-pr-cvs1:/tmp/cvs-serv12964

Modified Files:
datetime.c test_cdatetime.py
Log Message:
Make the repr match that of the Python prototype.
Implement the datetime.now() constructor.


Index: datetime.c
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/datetime.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** datetime.c 12 Mar 2002 22:33:51 -0000 1.7
--- datetime.c 26 Mar 2002 22:22:50 -0000 1.8
***************
*** 6,9 ****
--- 6,11 ----
#include "modsupport.h"

+ #include <time.h>
+
#include "datetime.h"

***************
*** 117,126 ****
*/

! static PyObject *
datetime_compare(PyDateTime_Object *self, PyObject *other)
{
! PyErr_SetString(PyExc_NotImplementedError,
! "not yet implemented");
! return NULL;
}

--- 119,132 ----
*/

! static int
datetime_compare(PyDateTime_Object *self, PyObject *other)
{
! if (!PyType_IsSubtype(other->ob_type, &PyDateTime_Type)) {
! PyErr_SetString(PyExc_TypeError,
! "can't compare date to %s instance");
! return -1;
! }
! return memcmp(self->data, ((PyDateTime_Object *)other)->data,
! _PyDateTime_DATA_SIZE);
}

***************
*** 128,132 ****
datetime_repr(PyDateTime_Object *self)
{
! return PyString_FromString("<datetime.datetime instance>");
}

--- 134,161 ----
datetime_repr(PyDateTime_Object *self)
{
! char buffer[1028];
! char *typename;
!
! typename = self->ob_type->tp_name;
! if (GET_MICROSECOND(self)) {
! PyOS_snprintf(buffer, sizeof(buffer), "%s(%d, %d, %d, %d, %d, %d, %d)",
! typename,
! GET_YEAR(self), GET_MONTH(self), GET_DAY(self),
! GET_HOUR(self), GET_MINUTE(self), GET_SECOND(self),
! GET_MICROSECOND(self));
! }
! else if (GET_SECOND(self)) {
! PyOS_snprintf(buffer, sizeof(buffer), "%s(%d, %d, %d, %d, %d, %d)",
! typename,
! GET_YEAR(self), GET_MONTH(self), GET_DAY(self),
! GET_HOUR(self), GET_MINUTE(self), GET_SECOND(self));
! }
! else {
! PyOS_snprintf(buffer, sizeof(buffer), "%s(%d, %d, %d, %d, %d)",
! typename,
! GET_YEAR(self), GET_MONTH(self), GET_DAY(self),
! GET_HOUR(self), GET_MINUTE(self));
! }
! return PyString_FromString(buffer);
}

***************
*** 341,344 ****
--- 370,402 ----
};

+
+ static PyObject *
+ datetime_now(PyObject *self, PyObject *cls)
+ {
+ /* XXX need to create the instance by calling cls(y,mon,d,h,min,s,u) */
+ struct timeval t;
+ struct tm *tm;
+ time_t timet;
+
+ #ifdef GETTIMEOFDAY_NO_TZ
+ gettimeofday(&t);
+ #else /* !GETTIMEOFDAY_NO_TZ */
+ gettimeofday(&t, (struct timezone *)NULL);
+ #endif /* !GETTIMEOFDAY_NO_TZ */
+ timet = t.tv_sec;
+ tm = localtime(&timet);
+
+ return PyObject_CallFunction(cls, "iiiiiil",
+ tm->tm_year + 1900, tm->tm_mon + 1,
+ tm->tm_mday, tm->tm_hour, tm->tm_min,
+ tm->tm_sec, t.tv_usec);
+ }
+
+ static PyMethodDef datetime_now_mdef = {
+ "now", (PyCFunction)datetime_now, METH_O,
+ "Return a new datetime that represents the current time."
+ };
+
+
static char datetime_doc[] =
"Basic date/time type.";
***************
*** 348,352 ****
PyObject_HEAD_INIT(NULL)
0, /* ob_size */
! "datetime.datetime", /* tp_name */
sizeof(PyDateTime_Object), /* tp_basicsize */
0, /* tp_itemsize */
--- 406,410 ----
PyObject_HEAD_INIT(NULL)
0, /* ob_size */
! "datetime", /* tp_name */
sizeof(PyDateTime_Object), /* tp_basicsize */
0, /* tp_itemsize */
***************
*** 400,404 ****
{
PyObject *m;
! PyObject *d, *dt;

PyDateTime_Type.ob_type = &PyType_Type;
--- 458,463 ----
{
PyObject *m;
! PyObject *d, *dt, *tmp;
! int err;

PyDateTime_Type.ob_type = &PyType_Type;
***************
*** 416,419 ****
--- 475,490 ----
return;
Py_DECREF(dt);
+
+ dt = PyCFunction_New(&datetime_now_mdef, NULL);
+ if (dt == NULL)
+ return;
+ tmp = PyClassMethod_New(dt);
+ Py_DECREF(dt);
+ if (tmp == NULL)
+ return;
+ err = PyDict_SetItemString(d, "now", tmp);
+ Py_DECREF(tmp);
+ if (err < 0)
+ return;

m = Py_InitModule3("_datetime", functions,

Index: test_cdatetime.py
===================================================================
RCS file: /cvsroot/python/python/nondist/sandbox/datetime/test_cdatetime.py,v
retrieving revision 1.3
retrieving revision 1.4
diff -C2 -d -r1.3 -r1.4
*** test_cdatetime.py 6 Mar 2002 05:55:00 -0000 1.3
--- test_cdatetime.py 26 Mar 2002 22:22:50 -0000 1.4
***************
*** 35,38 ****
--- 35,52 ----
self.assertEqual(dt.microsecond, 8000)

+ def test_roundtrip(self):
+ for dt in (self.theclass(1, 2, 3, 4, 5, 6, 7),
+ self.theclass.now()):
+ # Verify dt -> string -> datetime identity.
+ s = repr(dt)
+ dt2 = eval(s)
+ self.assertEqual(dt, dt2)
+
+ # Verify identity via reconstructing from pieces.
+ dt2 = self.theclass(dt.year, dt.month, dt.day,
+ dt.hour, dt.minute, dt.second,
+ dt.microsecond)
+ self.assertEqual(dt, dt2)
+
def test_isocalendar(self):
# Check examples from