Author: Matti Picus <matti.pi...@gmail.com> Branch: Changeset: r96486:2a381b55d56f Date: 2019-04-14 16:40 +0300 http://bitbucket.org/pypy/pypy/changeset/2a381b55d56f/
Log: merge datetime_api_27 which provides Date*_FromTimestamp diff --git a/pypy/doc/whatsnew-head.rst b/pypy/doc/whatsnew-head.rst --- a/pypy/doc/whatsnew-head.rst +++ b/pypy/doc/whatsnew-head.rst @@ -12,3 +12,7 @@ .. branch: jit-cleanup Remove rpython.jit.metainterp.typesystem and clean up related code in rpython/jit/ + +.. branch: datetime_api_27 + +Add ``DateTime_FromTimestamp`` and ``Date_FromTimestamp`` diff --git a/pypy/module/cpyext/cdatetime.py b/pypy/module/cpyext/cdatetime.py --- a/pypy/module/cpyext/cdatetime.py +++ b/pypy/module/cpyext/cdatetime.py @@ -67,6 +67,14 @@ _PyDelta_FromDelta.api_func.functype, _PyDelta_FromDelta.api_func.get_wrapper(space)) + datetimeAPI.c_DateTime_FromTimestamp = llhelper( + _PyDateTime_FromTimestamp.api_func.functype, + _PyDateTime_FromTimestamp.api_func.get_wrapper(space)) + + datetimeAPI.c_Date_FromTimestamp = llhelper( + _PyDate_FromTimestamp.api_func.functype, + _PyDate_FromTimestamp.api_func.get_wrapper(space)) + state.datetimeAPI.append(datetimeAPI) return state.datetimeAPI[0] @@ -243,8 +251,16 @@ """ w_datetime = PyImport_Import(space, space.newtext("datetime")) w_type = space.getattr(w_datetime, space.newtext("datetime")) + return _PyDateTime_FromTimestamp(space, w_type, w_args, None) + +@cpython_api([PyObject, PyObject, PyObject], PyObject) +def _PyDateTime_FromTimestamp(space, w_type, w_args, w_kwds): + """Implementation of datetime.fromtimestamp that matches the signature for + PyDateTimeCAPI.DateTime_FromTimestamp + """ w_method = space.getattr(w_type, space.newtext("fromtimestamp")) - return space.call(w_method, w_args) + + return space.call(w_method, w_args, w_kwds=w_kwds) @cpython_api([PyObject], PyObject) def PyDate_FromTimestamp(space, w_args): @@ -253,6 +269,12 @@ """ w_datetime = PyImport_Import(space, space.newtext("datetime")) w_type = space.getattr(w_datetime, space.newtext("date")) + return _PyDate_FromTimestamp(space, w_type, w_args) + +@cpython_api([PyObject, PyObject], PyObject) +def _PyDate_FromTimestamp(space, w_type, w_args): + """Implementation of date.fromtimestamp that matches the signature for + PyDateTimeCAPI.Date_FromTimestamp""" w_method = space.getattr(w_type, space.newtext("fromtimestamp")) return space.call(w_method, w_args) diff --git a/pypy/module/cpyext/parse/cpyext_datetime.h b/pypy/module/cpyext/parse/cpyext_datetime.h --- a/pypy/module/cpyext/parse/cpyext_datetime.h +++ b/pypy/module/cpyext/parse/cpyext_datetime.h @@ -13,6 +13,10 @@ PyObject*, PyTypeObject*); PyObject *(*Time_FromTime)(int, int, int, int, PyObject*, PyTypeObject*); PyObject *(*Delta_FromDelta)(int, int, int, int, PyTypeObject*); + + /* constructors for the DB API */ + PyObject *(*DateTime_FromTimestamp)(PyObject*, PyObject*, PyObject*); + PyObject *(*Date_FromTimestamp)(PyObject*, PyObject*); } PyDateTime_CAPI; typedef struct diff --git a/pypy/module/cpyext/test/test_datetime.py b/pypy/module/cpyext/test/test_datetime.py --- a/pypy/module/cpyext/test/test_datetime.py +++ b/pypy/module/cpyext/test/test_datetime.py @@ -146,6 +146,41 @@ 2000, 6, 6, 6, 6, 6, 6, Py_None, PyDateTimeAPI->DateTimeType); """), + ("new_datetime_fromtimestamp", "METH_NOARGS", + """ PyDateTime_IMPORT; + PyObject *ts = PyFloat_FromDouble(200000.0); + Py_INCREF(Py_None); + PyObject *tsargs = PyTuple_Pack(2, ts, Py_None); + PyObject *rv = PyDateTimeAPI->DateTime_FromTimestamp( + (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, NULL); + Py_DECREF(tsargs); + return rv; + """), + ("new_dt_fromts_tzinfo", "METH_O", + """ PyDateTime_IMPORT; + PyObject *ts = PyFloat_FromDouble(200000.0); + PyObject *tsargs = PyTuple_Pack(1, ts); + PyObject *tskwargs = PyDict_New(); + + Py_INCREF(args); + PyDict_SetItemString(tskwargs, "tz", args); + PyObject *rv = PyDateTimeAPI->DateTime_FromTimestamp( + (PyObject *)PyDateTimeAPI->DateTimeType, tsargs, tskwargs); + Py_DECREF(tsargs); + Py_DECREF(tskwargs); + return rv; + """), + ("new_date_fromtimestamp", "METH_NOARGS", + """ PyDateTime_IMPORT; + PyObject *ts = PyFloat_FromDouble(1430366400.0); + Py_INCREF(Py_None); + PyObject *tsargs = PyTuple_Pack(1, ts); + PyObject *rv = PyDateTimeAPI->Date_FromTimestamp( + (PyObject *)PyDateTimeAPI->DateType, tsargs); + Py_DECREF(tsargs); + return rv; + """), + ], prologue='#include "datetime.h"\n') import datetime assert module.new_date() == datetime.date(2000, 6, 6) @@ -153,6 +188,28 @@ assert module.new_datetime() == datetime.datetime( 2000, 6, 6, 6, 6, 6, 6) + class UTC(datetime.tzinfo): + def utcoffset(self, dt): + return datetime.timedelta(hours=0) + + def dst(self, dt): + return datetime.timedelta(0) + + def tzname(self, dt): + return "UTC" + + utc = UTC() + + # .fromtimestamp tests + assert (module.new_datetime_fromtimestamp() == + datetime.datetime.fromtimestamp(200000.0)) + + assert (module.new_dt_fromts_tzinfo(utc) == + datetime.datetime.fromtimestamp(200000.0, tz=utc)) + + assert (module.new_date_fromtimestamp() == + datetime.date.fromtimestamp(1430366400.0)) + def test_macros(self): module = self.import_extension('foo', [ ("test_date_macros", "METH_NOARGS", @@ -305,16 +362,18 @@ """), ], prologue='#include "datetime.h"\n') from datetime import tzinfo, datetime, timedelta, time + # copied from datetime documentation class GMT1(tzinfo): def __del__(self): - print 'deleting GMT1' + print('deleting GMT1') def utcoffset(self, dt): return timedelta(hours=1) + self.dst(dt) def dst(self, dt): return timedelta(0) def tzname(self,dt): return "GMT +1" + gmt1 = GMT1() dt1 = module.time_with_tzinfo(gmt1) assert dt1 == time(6, 6, 6, 6, gmt1) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit