From 48ed36026bc57c10c0408fcca85dd97e699caac6 Mon Sep 17 00:00:00 2001 From: Larry Hastings Date: Fri, 22 Jun 2012 12:58:36 -0700 Subject: Issue #14769: Incorporated mildly pedantic feedback from python-dev. Mostly documentation changes; the code changes are clarifications, not semantic changes. --- Lib/test/test_capi.py | 40 +++++++++++++++++++++------------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py index e24bd6f..2692b89d 100644 --- a/Lib/test/test_capi.py +++ b/Lib/test/test_capi.py @@ -222,36 +222,38 @@ class SkipitemTest(unittest.TestCase): in Python/getargs.c, but neglected to update our poor friend skipitem() in the same file. (If so, shame on you!) - This function brute-force tests all** ASCII characters (1 to 127 - inclusive) as format units, checking to see that - PyArg_ParseTupleAndKeywords() return consistent errors both when - the unit is attempted to be used and when it is skipped. If the - format unit doesn't exist, we'll get one of two specific error - messages (one for used, one for skipped); if it does exist we - *won't* get that error--we'll get either no error or some other - error. If we get the "does not exist" error for one test and - not for the other, there's a mismatch, and the test fails. - - ** Okay, it actually skips some ASCII characters. Some characters - have special funny semantics, and it would be difficult to - accomodate them here. + With a few exceptions**, this function brute-force tests all + printable ASCII*** characters (32 to 126 inclusive) as format units, + checking to see that PyArg_ParseTupleAndKeywords() return consistent + errors both when the unit is attempted to be used and when it is + skipped. If the format unit doesn't exist, we'll get one of two + specific error messages (one for used, one for skipped); if it does + exist we *won't* get that error--we'll get either no error or some + other error. If we get the specific "does not exist" error for one + test and not for the other, there's a mismatch, and the test fails. + + ** Some format units have special funny semantics and it would + be difficult to accomodate them here. Since these are all + 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 = () tuple_1 = (0,) dict_b = {'b':1} keywords = ["a", "b"] - # Python C source files must be ASCII, - # therefore we'll never have a format unit > 127 - for i in range(1, 128): + for i in range(32, 127): 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 'e', it's always a two-character code # skip '|' and '$', they don't represent arguments anyway - if (not c.isprintable()) or (c in '()e|$'): + if c in '()e|$': continue # test the format unit when not skipped -- cgit v0.12 From 93c9cd07b62371b99f712e41c7bec71dad1c86ec Mon Sep 17 00:00:00 2001 From: Alexander Belopolsky Date: Fri, 22 Jun 2012 16:04:19 -0400 Subject: Issue #9527: tm_gmtoff has 'correct' sign. --- Doc/library/time.rst | 2 +- Lib/datetime.py | 6 +++--- Lib/test/datetimetester.py | 6 ++++-- Modules/_datetimemodule.c | 10 +++------- 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/Doc/library/time.rst b/Doc/library/time.rst index 3faabf7..ac3fb5e 100644 --- a/Doc/library/time.rst +++ b/Doc/library/time.rst @@ -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_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 diff --git a/Lib/datetime.py b/Lib/datetime.py index e4d7161..a15c6b0 100644 --- a/Lib/datetime.py +++ b/Lib/datetime.py @@ -1510,13 +1510,13 @@ class datetime(date): # implied by tm_isdst. delta = local - datetime(*_time.gmtime(ts)[:6]) dst = _time.daylight and localtm.tm_isdst > 0 - gmtoff = _time.altzone if dst else _time.timezone - if delta == timedelta(seconds=-gmtoff): + gmtoff = -(_time.altzone if dst else _time.timezone) + if delta == timedelta(seconds=gmtoff): tz = timezone(delta, _time.tzname[dst]) else: tz = timezone(delta) else: - tz = timezone(timedelta(seconds=-gmtoff), zone) + tz = timezone(timedelta(seconds=gmtoff), zone) elif not isinstance(tz, tzinfo): raise TypeError("tz argument must be an instance of tzinfo") diff --git a/Lib/test/datetimetester.py b/Lib/test/datetimetester.py index 4181d4f..a417170d 100644 --- a/Lib/test/datetimetester.py +++ b/Lib/test/datetimetester.py @@ -3278,16 +3278,18 @@ class TestDateTimeTZ(TestDateTime, TZInfoBase, unittest.TestCase): self.assertEqual(dt.astimezone(None), 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') def test_astimezone_default_eastern(self): dt = self.theclass(2012, 11, 4, 6, 30, tzinfo=timezone.utc) local = dt.astimezone() 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) local = dt.astimezone() 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): cls = self.theclass diff --git a/Modules/_datetimemodule.c b/Modules/_datetimemodule.c index 149f573..6df5c03 100644 --- a/Modules/_datetimemodule.c +++ b/Modules/_datetimemodule.c @@ -4717,12 +4717,8 @@ local_timezone(PyDateTime_DateTime *utc_time) return NULL; timep = localtime(×tamp); #ifdef HAVE_STRUCT_TM_TM_ZONE - { - long offset; - offset = timep->tm_gmtoff; - zone = timep->tm_zone; - delta = new_delta(0, -offset, 0, 0); - } + zone = timep->tm_zone; + delta = new_delta(0, timep->tm_gmtoff, 0, 1); #else /* HAVE_STRUCT_TM_TM_ZONE */ { PyObject *local_time; @@ -4732,7 +4728,7 @@ local_timezone(PyDateTime_DateTime *utc_time) utc_time->tzinfo); if (local_time == NULL) 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 to the offset implied by timezone/altzone */ if (daylight && timep->tm_isdst >= 0) -- cgit v0.12 From ffd4d47d0b88a4b2ef8b1d0e3972a0f5d75fc102 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Fri, 22 Jun 2012 22:07:01 +0200 Subject: Add a docstring at the top of Tools/ssl/make_ssl_data.py --- Tools/ssl/make_ssl_data.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/Tools/ssl/make_ssl_data.py b/Tools/ssl/make_ssl_data.py index 87b3ec2..10244d1 100644 --- a/Tools/ssl/make_ssl_data.py +++ b/Tools/ssl/make_ssl_data.py @@ -1,5 +1,16 @@ #! /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 os import re -- cgit v0.12