Author: Matti Picus <matti.pi...@gmail.com> Branch: py3.6 Changeset: r96487:569233e35ecd Date: 2019-04-14 16:41 +0300 http://bitbucket.org/pypy/pypy/changeset/569233e35ecd/
Log: merge default into branch diff --git a/LICENSE b/LICENSE --- a/LICENSE +++ b/LICENSE @@ -110,6 +110,7 @@ Devin Jeanpierre Bob Ippolito Bruno Gola + Andrew Lawrence David Malcolm Squeaky Edd Barrett @@ -125,7 +126,6 @@ John Witulski Stefan Beyer Jeremy Thurgood - Andrew Lawrence Greg Price Ivan Sichmann Freitas Dario Bertini @@ -254,6 +254,7 @@ Omer Katz Jacek Generowicz Tomasz Dziopa + Lin Cheng Sylvain Thenault Jakub Stasiak Andrew Dalke @@ -403,6 +404,7 @@ Niclas Olofsson Chris Pressey Tobias Diaz + Paul Graydon Nikolaos-Digenis Karagiannis Kurt Griffiths Ben Mather diff --git a/pypy/doc/contributor.rst b/pypy/doc/contributor.rst --- a/pypy/doc/contributor.rst +++ b/pypy/doc/contributor.rst @@ -77,6 +77,7 @@ Devin Jeanpierre Bob Ippolito Bruno Gola + Andrew Lawrence David Malcolm Squeaky Edd Barrett @@ -92,7 +93,6 @@ John Witulski Stefan Beyer Jeremy Thurgood - Andrew Lawrence Greg Price Ivan Sichmann Freitas Dario Bertini @@ -221,6 +221,7 @@ Omer Katz Jacek Generowicz Tomasz Dziopa + Lin Cheng Sylvain Thenault Jakub Stasiak Andrew Dalke @@ -370,6 +371,7 @@ Niclas Olofsson Chris Pressey Tobias Diaz + Paul Graydon Nikolaos-Digenis Karagiannis Kurt Griffiths Ben Mather diff --git a/pypy/doc/release-v7.1.1.rst b/pypy/doc/release-v7.1.1.rst --- a/pypy/doc/release-v7.1.1.rst +++ b/pypy/doc/release-v7.1.1.rst @@ -79,6 +79,7 @@ (issue 2988_) * Cleanup and refactor JIT code to remove ``rpython.jit.metainterp.typesystem`` * Fix memoryviews of ctype structures with padding, (cpython issue 32780_) +* CFFI updated to as-yet-unreleased 1.12.3 Python 3.6 only @@ -89,8 +90,12 @@ * ``str.maketrans`` was broken (issue 2991_) * Raise a ``TypeError`` when using buffers and unicode such as ``''.strip(buffer)`` and ``'a' < buffer`` +* Support ``_overlapped`` and asyncio on win32 +* Fix an issue where ``''.join(list_of_strings)`` would rarely confuse utf8 and + bytes (issue 2997_) .. _2984: https://bitbucket.org/pypy/pypy/issues/2984 .. _2991: https://bitbucket.org/pypy/pypy/issues/2991 .. _2988: https://bitbucket.org/pypy/pypy/issues/2988 +.. _2997: https://bitbucket.org/pypy/pypy/issues/2997 .. _32780: https://bugs.python.org/issue32780 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,6 +362,7 @@ """), ], prologue='#include "datetime.h"\n') from datetime import tzinfo, datetime, timedelta, time + # copied from datetime documentation class GMT1(tzinfo): def __del__(self): @@ -315,6 +373,7 @@ 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