[PATCH 1 of 6] utils: stop using datetime.utcfromtimestamp() deprecated in Python 3.12

Mads Kiilerich mads at kiilerich.com
Thu Jun 29 18:07:53 UTC 2023


On 28/06/2023 16:43, Mads Kiilerich wrote:
> # HG changeset patch
> # User Mads Kiilerich <mads at kiilerich.com>
> # Date 1687866710 -7200
> #      Tue Jun 27 13:51:50 2023 +0200
> # Branch stable
> # Node ID ec46e9b39b2a6f5d0c59aa803e2eb5d9dfc44cc3
> # Parent  2b0598121a71fa19c2174e4eee3400ec3a3b1c26
> utils: stop using datetime.utcfromtimestamp() deprecated in Python 3.12
>
> Python3.12 made tests fail with warnings:
>    DeprecationWarning: datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.fromtimestamp(timestamp, datetime.UTC).
>
> Computing the diff while in timestamp seconds seems to preserve to the original
> intent from ae04af1ce78d.
>
> It would be nice to have some doctest coverage of this, with the problematic
> corner cases that has popped up over time...


Some potential test coverage that verified that the change preserve the 
fix from ae04af1ce78d:

     """Return a unix timestamp (or the current time) as a (unixtime,
     offset) tuple based off the local timezone.

     >>> import os, time
     >>> os.environ['TZ'] = 'Asia/Novokuznetsk'
     >>> time.tzset()

     >>> def dtu(*a):
     ...    return datetime.datetime(*a, tzinfo=datetime.timezone.utc)

     # Old winter timezone, +7
     >>> makedate(dtu(2010,  1,  1,  5,  0, 0).timestamp())
     (1262322000.0, -25200)

     # Same timezone in summer, +7, so no DST
     >>> makedate(dtu(2010,  7,  1,  5,  0, 0).timestamp())
     (1277960400.0, -25200)

     # Changing to new winter timezone, from +7 to +6 (ae04af1ce78d 
testcase)
     >>> makedate(dtu(2010, 10, 30, 20,  0, 0).timestamp() - 1)
     (1288468799.0, -25200)
     >>> makedate(dtu(2010, 10, 30, 20,  0, 0).timestamp())
     (1288468800.0, -21600)
     >>> makedate(dtu(2011,  1,  1,  5,  0, 0).timestamp())
     (1293858000.0, -21600)

     # Introducing DST, changing +6 to +7
     >>> makedate(dtu(2011,  3, 26, 20,  0, 0).timestamp() - 1)
     (1301169599.0, -21600)
     >>> makedate(dtu(2011,  3, 26, 20,  0, 0).timestamp())
     (1301169600.0, -25200)
     """

but it relies heavily on a corner case in the time database and setting 
the timezone globally, so it might be fragile and not a good candidate 
for adding to the test suite. The functions are already accidentally 
covered by the suite.

/Mads


More information about the Mercurial-devel mailing list