Commit ebd1b1dc authored by Martin v. Löwis's avatar Martin v. Löwis

Merge heads

parents 7c771ca4 1326e8f3
...@@ -545,7 +545,7 @@ The module defines the following functions and data items: ...@@ -545,7 +545,7 @@ The module defines the following functions and data items:
+-------+-------------------+---------------------------------+ +-------+-------------------+---------------------------------+
| N/A | :attr:`tm_zone` | abbreviation of timezone name | | N/A | :attr:`tm_zone` | abbreviation of timezone name |
+-------+-------------------+---------------------------------+ +-------+-------------------+---------------------------------+
| N/A | :attr:`tm_gmtoff` | offset from UTC in seconds | | N/A | :attr:`tm_gmtoff` | offset east of UTC in seconds |
+-------+-------------------+---------------------------------+ +-------+-------------------+---------------------------------+
Note that unlike the C structure, the month value is a range of [1, 12], not Note that unlike the C structure, the month value is a range of [1, 12], not
......
...@@ -1510,13 +1510,13 @@ class datetime(date): ...@@ -1510,13 +1510,13 @@ class datetime(date):
# implied by tm_isdst. # implied by tm_isdst.
delta = local - datetime(*_time.gmtime(ts)[:6]) delta = local - datetime(*_time.gmtime(ts)[:6])
dst = _time.daylight and localtm.tm_isdst > 0 dst = _time.daylight and localtm.tm_isdst > 0
gmtoff = _time.altzone if dst else _time.timezone gmtoff = -(_time.altzone if dst else _time.timezone)
if delta == timedelta(seconds=-gmtoff): if delta == timedelta(seconds=gmtoff):
tz = timezone(delta, _time.tzname[dst]) tz = timezone(delta, _time.tzname[dst])
else: else:
tz = timezone(delta) tz = timezone(delta)
else: else:
tz = timezone(timedelta(seconds=-gmtoff), zone) tz = timezone(timedelta(seconds=gmtoff), zone)
elif not isinstance(tz, tzinfo): elif not isinstance(tz, tzinfo):
raise TypeError("tz argument must be an instance of tzinfo") raise TypeError("tz argument must be an instance of tzinfo")
......
...@@ -3278,16 +3278,18 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase): ...@@ -3278,16 +3278,18 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase):
self.assertEqual(dt.astimezone(None), dt) self.assertEqual(dt.astimezone(None), dt)
self.assertEqual(dt.astimezone(), dt) self.assertEqual(dt.astimezone(), dt)
# Note that offset in TZ variable has the opposite sign to that
# produced by %z directive.
@support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0') @support.run_with_tz('EST+05EDT,M3.2.0,M11.1.0')
def test_astimezone_default_eastern(self): def test_astimezone_default_eastern(self):
dt = self.theclass(2012, 11, 4, 6, 30, tzinfo=timezone.utc) dt = self.theclass(2012, 11, 4, 6, 30, tzinfo=timezone.utc)
local = dt.astimezone() local = dt.astimezone()
self.assertEqual(dt, local) self.assertEqual(dt, local)
self.assertEqual(local.strftime("%z %Z"), "+0500 EST") self.assertEqual(local.strftime("%z %Z"), "-0500 EST")
dt = self.theclass(2012, 11, 4, 5, 30, tzinfo=timezone.utc) dt = self.theclass(2012, 11, 4, 5, 30, tzinfo=timezone.utc)
local = dt.astimezone() local = dt.astimezone()
self.assertEqual(dt, local) self.assertEqual(dt, local)
self.assertEqual(local.strftime("%z %Z"), "+0400 EDT") self.assertEqual(local.strftime("%z %Z"), "-0400 EDT")
def test_aware_subtract(self): def test_aware_subtract(self):
cls = self.theclass cls = self.theclass
......
...@@ -222,36 +222,38 @@ class SkipitemTest(unittest.TestCase): ...@@ -222,36 +222,38 @@ class SkipitemTest(unittest.TestCase):
in Python/getargs.c, but neglected to update our poor friend in Python/getargs.c, but neglected to update our poor friend
skipitem() in the same file. (If so, shame on you!) skipitem() in the same file. (If so, shame on you!)
This function brute-force tests all** ASCII characters (1 to 127 With a few exceptions**, this function brute-force tests all
inclusive) as format units, checking to see that printable ASCII*** characters (32 to 126 inclusive) as format units,
PyArg_ParseTupleAndKeywords() return consistent errors both when checking to see that PyArg_ParseTupleAndKeywords() return consistent
the unit is attempted to be used and when it is skipped. If the errors both when the unit is attempted to be used and when it is
format unit doesn't exist, we'll get one of two specific error skipped. If the format unit doesn't exist, we'll get one of two
messages (one for used, one for skipped); if it does exist we specific error messages (one for used, one for skipped); if it does
*won't* get that error--we'll get either no error or some other exist we *won't* get that error--we'll get either no error or some
error. If we get the "does not exist" error for one test and other error. If we get the specific "does not exist" error for one
not for the other, there's a mismatch, and the test fails. test and not for the other, there's a mismatch, and the test fails.
** Okay, it actually skips some ASCII characters. Some characters ** Some format units have special funny semantics and it would
have special funny semantics, and it would be difficult to be difficult to accomodate them here. Since these are all
accomodate them here. well-established and properly skipped in skipitem() we can
get away with not testing them--this test is really intended
to catch *new* format units.
*** Python C source files must be ASCII. Therefore it's impossible
to have non-ASCII format units.
""" """
empty_tuple = () empty_tuple = ()
tuple_1 = (0,) tuple_1 = (0,)
dict_b = {'b':1} dict_b = {'b':1}
keywords = ["a", "b"] keywords = ["a", "b"]
# Python C source files must be ASCII, for i in range(32, 127):
# therefore we'll never have a format unit > 127
for i in range(1, 128):
c = chr(i) c = chr(i)
# skip non-printable characters, no one is insane enough to define
# one as a format unit
# skip parentheses, the error reporting is inconsistent about them # skip parentheses, the error reporting is inconsistent about them
# skip 'e', it's always a two-character code # skip 'e', it's always a two-character code
# skip '|' and '$', they don't represent arguments anyway # skip '|' and '$', they don't represent arguments anyway
if (not c.isprintable()) or (c in '()e|$'): if c in '()e|$':
continue continue
# test the format unit when not skipped # test the format unit when not skipped
......
...@@ -4717,12 +4717,8 @@ local_timezone(PyDateTime_DateTime *utc_time) ...@@ -4717,12 +4717,8 @@ local_timezone(PyDateTime_DateTime *utc_time)
return NULL; return NULL;
timep = localtime(&timestamp); timep = localtime(&timestamp);
#ifdef HAVE_STRUCT_TM_TM_ZONE #ifdef HAVE_STRUCT_TM_TM_ZONE
{ zone = timep->tm_zone;
long offset; delta = new_delta(0, timep->tm_gmtoff, 0, 1);
offset = timep->tm_gmtoff;
zone = timep->tm_zone;
delta = new_delta(0, -offset, 0, 0);
}
#else /* HAVE_STRUCT_TM_TM_ZONE */ #else /* HAVE_STRUCT_TM_TM_ZONE */
{ {
PyObject *local_time; PyObject *local_time;
...@@ -4732,7 +4728,7 @@ local_timezone(PyDateTime_DateTime *utc_time) ...@@ -4732,7 +4728,7 @@ local_timezone(PyDateTime_DateTime *utc_time)
utc_time->tzinfo); utc_time->tzinfo);
if (local_time == NULL) if (local_time == NULL)
goto error; goto error;
delta = datetime_subtract((PyObject*)utc_time, local_time); delta = datetime_subtract(local_time, (PyObject*)utc_time);
/* XXX: before relying on tzname, we should compare delta /* XXX: before relying on tzname, we should compare delta
to the offset implied by timezone/altzone */ to the offset implied by timezone/altzone */
if (daylight && timep->tm_isdst >= 0) if (daylight && timep->tm_isdst >= 0)
......
#! /usr/bin/env python3 #! /usr/bin/env python3
"""
This script should be called *manually* when we want to upgrade SSLError
`library` and `reason` mnemnonics to a more recent OpenSSL version.
It takes two arguments:
- the path to the OpenSSL include files' directory
(e.g. openssl-1.0.1-beta3/include/openssl/)
- the path to the C file to be generated
(probably Modules/_ssl_data.h)
"""
import datetime import datetime
import os import os
import re import re
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment