[Python-checkins] CVS: python/nondist/sandbox/datetime datetime.c,1.7,1.8 test_cdatetime.py,1.3,1.4

Fred L. Drake fdrake@users.sourceforge.net
Tue, 26 Mar 2002 14:22:53 -0800


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