Skip to content

Commit

Permalink
Implement our own naive UTC date handler functions
Browse files Browse the repository at this point in the history
Python 3.12 deprecated datetime.utcnow() and datetime.utcfromtimestamp() in an
attempt to move users away from the naive datetime representations. However, we
already do all our own UTC offset handling, and we need to continue to do so to
stay backwards compatible, cf commit: 5f15409 ("resultset: Guess timezone
offset from data instead of using system time"). So we really want to keep using
the naive representations; so implement our own versions of the deprecated
functions and keep using those.

Signed-off-by: Toke Høiland-Jørgensen <[email protected]>
  • Loading branch information
tohojo committed Sep 10, 2024
1 parent 52c69d5 commit 06812bf
Show file tree
Hide file tree
Showing 8 changed files with 28 additions and 24 deletions.
5 changes: 2 additions & 3 deletions flent/aggregators.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,11 @@
import resource

from collections import OrderedDict
from datetime import datetime
from threading import Event, Thread
from multiprocessing import Pool, Manager, cpu_count

from flent import runners, loggers
from flent.util import classname
from flent.util import classname, utcfromtimestamp

logger = loggers.get_logger(__name__)

Expand Down Expand Up @@ -371,7 +370,7 @@ def aggregate(self, results):
if steps > 10**6:
raise RuntimeError("Refusing to iterate more than 1 million steps during aggregation (got %d)" % steps)

results.meta('T0', datetime.utcfromtimestamp(t_0))
results.meta('T0', utcfromtimestamp(t_0))

for s in range(steps):
time_label = self.step * s
Expand Down
8 changes: 4 additions & 4 deletions flent/batch.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
import time
import uuid

from datetime import datetime, timedelta
from datetime import timedelta
from fnmatch import fnmatch
from collections import OrderedDict

Expand All @@ -43,7 +43,7 @@

from flent import aggregators, formatters, resultset, loggers
from flent.metadata import record_metadata, record_postrun_metadata
from flent.util import clean_path, format_date, token_split
from flent.util import clean_path, format_date, token_split, utcnow
from flent.settings import parser as SETTINGS_PARSER
from flent.settings import _LOG_DEFER

Expand Down Expand Up @@ -289,7 +289,7 @@ def expand_argsets(self, batch, argsets, batch_time, batch_name,
settings.FORMAT = 'null'
settings.BATCH_NAME = batch_name
settings.BATCH_TIME = batch_time
settings.TIME = datetime.utcnow()
settings.TIME = utcnow()

expand_vars = {'repetition': "%02d" % rep,
'batch_time': format_date(settings.BATCH_TIME,
Expand Down Expand Up @@ -609,7 +609,7 @@ def run(self):
raise
raise RuntimeError("Error while running batch '%s': %r."
% (b, e))
end_time = datetime.utcnow()
end_time = utcnow()
logger.info("Ended batch sequence at %s. %s %d tests in %s.",
format_date(end_time, fmt="%Y-%m-%d %H:%M:%S"),
"Ran" if not self.settings.BATCH_DRY else 'Would have run', # noqa: E501
Expand Down
6 changes: 3 additions & 3 deletions flent/combiners.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import math
import re

from datetime import datetime
from bisect import bisect_left, bisect_right
from collections import OrderedDict

Expand All @@ -33,7 +32,8 @@
except ImportError:
from itertools import zip_longest

from flent.util import classname, long_substr, Glob, format_date, mos_score
from flent.util import classname, long_substr, Glob, format_date, mos_score, \
utcnow
from flent.resultset import ResultSet
from flent.loggers import get_logger

Expand Down Expand Up @@ -112,7 +112,7 @@ def save_intermediate(self, new_results, config, orig_meta):
orig_meta = orig_meta.copy()
del orig_meta['TITLE']
if self.save_dir:
t = datetime.utcnow()
t = utcnow()
series = config['series']
# Can't serialise 'source' Glob objects
for s in series:
Expand Down
3 changes: 1 addition & 2 deletions flent/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import pickle

from argparse import SUPPRESS
from datetime import datetime
from itertools import chain
from multiprocessing import Pool, Queue

Expand Down Expand Up @@ -994,7 +993,7 @@ def run_test(self):
self.settings.EXTENDED_METADATA = self.extendedMetadata.isChecked()
self.settings.load_test(informational=True)
self.settings.FORMATTER = "null"
self.settings.TIME = datetime.utcnow()
self.settings.TIME = util.utcnow()

self.settings.DATA_FILENAME = None
res = resultset.new(self.settings)
Expand Down
4 changes: 2 additions & 2 deletions flent/resultset.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@

from flent import transformers
from flent.loggers import get_logger
from flent.util import parse_date, format_date
from flent.util import parse_date, format_date, utcnow

try:
import ujson as json
Expand Down Expand Up @@ -143,7 +143,7 @@ def __init__(self, SUFFIX=SUFFIX, **kwargs):
self.SUFFIX = SUFFIX
self._t0 = None
if 'TIME' not in self.metadata or self.metadata['TIME'] is None:
self.metadata['TIME'] = datetime.utcnow()
self.metadata['TIME'] = utcnow()
if 'NAME' not in self.metadata or self.metadata['NAME'] is None:
raise RuntimeError("Missing name for resultset")
if 'DATA_FILENAME' not in self.metadata \
Expand Down
10 changes: 5 additions & 5 deletions flent/runners.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@

from flent import util, transformers
from flent.build_info import DATA_DIR
from flent.util import classname, ENCODING, Glob, normalise_host
from flent.util import classname, ENCODING, Glob, normalise_host, utcnow
from flent.loggers import get_logger

try:
Expand Down Expand Up @@ -850,10 +850,10 @@ def parse_raw(self, data):
h, m, s = t.split(":")
# FIXME: This is definitely going to break if a test is run
# around midnight
dt = datetime.utcnow().replace(hour=int(h),
minute=int(m),
second=int(s),
microsecond=int(microsec))
dt = utcnow().replace(hour=int(h),
minute=int(m),
second=int(s),
microsecond=int(microsec))
times[v] = float(timegm(dt.timetuple())) + dt.microsecond / 10**6

raw_values.append({
Expand Down
5 changes: 3 additions & 2 deletions flent/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,8 @@
from flent.testenv import TestEnvironment, TEST_PATH
from flent.loggers import get_logger
from flent.util import FuncAction, Update, AddHost, append_host, keyval, \
keyval_int, keyval_transformer, ArgParser, token_split, global_cache
keyval_int, keyval_transformer, ArgParser, token_split, global_cache, \
utcnow
from flent.plotters import add_plotting_args
from flent import loggers, util, resultset, runners

Expand All @@ -59,7 +60,7 @@
'LOCAL_HOST': socket.gethostname(),
'DESCRIPTION': 'No description',
'PLOTS': {},
'TIME': datetime.utcnow(),
'TIME': utcnow(),
'BATCH_NAME': None,
'BATCH_UUID': None,
}
Expand Down
11 changes: 8 additions & 3 deletions flent/util.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@

from copy import copy
from calendar import timegm
from datetime import datetime, timedelta
from datetime import datetime, timedelta, UTC
from math import log10, exp, sqrt

from flent.loggers import get_logger
Expand Down Expand Up @@ -67,14 +67,19 @@ def uscore_to_camel(s):
def classname(s, suffix=''):
return uscore_to_camel(s) + suffix

def utcnow():
return datetime.now(UTC).replace(tzinfo=None)

def utcfromtimestamp(ts):
return datetime.fromtimestamp(ts, UTC).replace(tzinfo=None)

def format_date(dt, fmt="%Y-%m-%dT%H:%M:%S.%f", utc=False):
if utc:
return dt.strftime(fmt + "Z")
# The datetime object is already UTC, so use gmtime rather than mktime to
# get the timestamp from which to compute the UTC offset.
ts = timegm(dt.timetuple()) + dt.microsecond / 1000000.0
offset = datetime.fromtimestamp(ts) - datetime.utcfromtimestamp(ts)
offset = datetime.fromtimestamp(ts) - utcfromtimestamp(ts)
return (dt + offset).strftime(fmt)


Expand Down Expand Up @@ -127,7 +132,7 @@ def parse_date(timestring, min_t=None, offset=None):
else:
ts = time.mktime(dt.timetuple())
offset = (datetime.fromtimestamp(ts) -
datetime.utcfromtimestamp(ts))
utcfromtimestamp(ts))
logger.debug("Computed offset of %s from system timezone",
offset)

Expand Down

0 comments on commit 06812bf

Please sign in to comment.