From db5c87270376b46f8ccfe28bf49709543d6b6d3f Mon Sep 17 00:00:00 2001 From: AnsahMohammad Date: Fri, 21 Feb 2025 21:31:39 +0530 Subject: [PATCH 1/6] fix: Replace deprecated datetime.utcnow() with timezone-aware alternative Replaced instances of datetime.datetime.utcnow() with datetime.datetime.now(datetime.UTC) to address deprecation warnings in Python 3.12+. Signed-off-by: AnsahMohammad --- src/taskgraph/optimize/base.py | 2 +- src/taskgraph/util/time.py | 7 ++++--- test/test_optimize.py | 13 +++++++++---- test/test_util_time.py | 6 +++--- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/taskgraph/optimize/base.py b/src/taskgraph/optimize/base.py index c6e84a5be..c5b9d1556 100644 --- a/src/taskgraph/optimize/base.py +++ b/src/taskgraph/optimize/base.py @@ -333,7 +333,7 @@ def replace_tasks( dependents = [target_task_graph.tasks[l] for l in dependents_of[label]] deadline = None if dependents: - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.UTC) deadline = max( resolve_timestamps(now, task.task["deadline"]) for task in dependents # type: ignore diff --git a/src/taskgraph/util/time.py b/src/taskgraph/util/time.py index 6639e5ddd..fec7bfde0 100644 --- a/src/taskgraph/util/time.py +++ b/src/taskgraph/util/time.py @@ -88,7 +88,7 @@ def json_time_from_now(input_str, now=None, datetime_format=False): """ if now is None: - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.UTC) time = now + value_of(input_str) @@ -106,8 +106,9 @@ def current_json_time(datetime_format=False): :param boolean datetime_format: Set `True` to get a `datetime` output :returns: JSON string representation of the current time. """ + now = datetime.datetime.now(datetime.UTC) if datetime_format is True: - return datetime.datetime.utcnow() + return now else: # Microseconds are excluded (see bug 1381801) - return datetime.datetime.utcnow().isoformat(timespec="milliseconds") + "Z" + return now.isoformat(timespec="milliseconds").replace("+00:00", "") + "Z" diff --git a/test/test_optimize.py b/test/test_optimize.py index 17a7b0ccb..26325719b 100644 --- a/test/test_optimize.py +++ b/test/test_optimize.py @@ -2,7 +2,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -from datetime import datetime, timedelta +import datetime from functools import partial import pytest @@ -28,9 +28,14 @@ def should_remove_task(self, task, params, arg): class Replace(OptimizationStrategy): def should_replace_task(self, task, params, deadline, taskid): - expires = datetime.utcnow() + timedelta(days=1) - if deadline and expires < datetime.strptime(deadline, "%Y-%m-%dT%H:%M:%S.%fZ"): - return False + expires = datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=1) + if deadline: + deadline_dt = datetime.datetime.strptime( + deadline.replace("+00:00Z", "Z"), "%Y-%m-%dT%H:%M:%S.%fZ" + ).replace(tzinfo=datetime.UTC) + + if expires < deadline_dt: + return False return taskid diff --git a/test/test_util_time.py b/test/test_util_time.py index 8fd0e23ab..38ab18fa4 100755 --- a/test/test_util_time.py +++ b/test/test_util_time.py @@ -4,7 +4,7 @@ import unittest -from datetime import datetime +from datetime import datetime, UTC from unittest.mock import patch from taskgraph.util.time import ( @@ -53,8 +53,8 @@ def test_json_from_now(self): def test_current_json_time(self): with patch("taskgraph.util.time.datetime.datetime") as mock_datetime: - mock_datetime.utcnow.return_value = datetime(2014, 1, 1) + mock_datetime.now.return_value = datetime(2014, 1, 1, tzinfo=UTC) mock_datetime.side_effect = datetime assert current_json_time() == "2014-01-01T00:00:00.000Z" - assert current_json_time(True) == datetime(2014, 1, 1) + assert current_json_time(True) == datetime(2014, 1, 1, tzinfo=UTC) From 727a9845b3674c8eb96fca12e74b86a20b87e681 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 21 Feb 2025 16:07:01 +0000 Subject: [PATCH 2/6] style: pre-commit.ci auto fixes [...] --- test/test_util_time.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_util_time.py b/test/test_util_time.py index 38ab18fa4..eb8b08bee 100755 --- a/test/test_util_time.py +++ b/test/test_util_time.py @@ -4,7 +4,7 @@ import unittest -from datetime import datetime, UTC +from datetime import UTC, datetime from unittest.mock import patch from taskgraph.util.time import ( From 8267fa45fabee5b0f22338504a88ba34f0b84645 Mon Sep 17 00:00:00 2001 From: AnsahMohammad Date: Fri, 21 Feb 2025 22:03:58 +0530 Subject: [PATCH 3/6] fix: change datetime.UTC to datetime.timezone.utc Signed-off-by: AnsahMohammad --- src/taskgraph/optimize/base.py | 2 +- src/taskgraph/util/time.py | 4 ++-- test/test_optimize.py | 4 +++- test/test_util_time.py | 6 +++--- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/taskgraph/optimize/base.py b/src/taskgraph/optimize/base.py index c5b9d1556..517c3e578 100644 --- a/src/taskgraph/optimize/base.py +++ b/src/taskgraph/optimize/base.py @@ -333,7 +333,7 @@ def replace_tasks( dependents = [target_task_graph.tasks[l] for l in dependents_of[label]] deadline = None if dependents: - now = datetime.datetime.now(datetime.UTC) + now = datetime.datetime.now(datetime.timezone.utc) deadline = max( resolve_timestamps(now, task.task["deadline"]) for task in dependents # type: ignore diff --git a/src/taskgraph/util/time.py b/src/taskgraph/util/time.py index fec7bfde0..a75ad4980 100644 --- a/src/taskgraph/util/time.py +++ b/src/taskgraph/util/time.py @@ -88,7 +88,7 @@ def json_time_from_now(input_str, now=None, datetime_format=False): """ if now is None: - now = datetime.datetime.now(datetime.UTC) + now = datetime.datetime.now(datetime.timezone.utc) time = now + value_of(input_str) @@ -106,7 +106,7 @@ def current_json_time(datetime_format=False): :param boolean datetime_format: Set `True` to get a `datetime` output :returns: JSON string representation of the current time. """ - now = datetime.datetime.now(datetime.UTC) + now = datetime.datetime.now(datetime.timezone.utc) if datetime_format is True: return now else: diff --git a/test/test_optimize.py b/test/test_optimize.py index 26325719b..51f2c3aa7 100644 --- a/test/test_optimize.py +++ b/test/test_optimize.py @@ -28,7 +28,9 @@ def should_remove_task(self, task, params, arg): class Replace(OptimizationStrategy): def should_replace_task(self, task, params, deadline, taskid): - expires = datetime.datetime.now(datetime.UTC) + datetime.timedelta(days=1) + expires = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta( + days=1 + ) if deadline: deadline_dt = datetime.datetime.strptime( deadline.replace("+00:00Z", "Z"), "%Y-%m-%dT%H:%M:%S.%fZ" diff --git a/test/test_util_time.py b/test/test_util_time.py index eb8b08bee..166d2130d 100755 --- a/test/test_util_time.py +++ b/test/test_util_time.py @@ -4,7 +4,7 @@ import unittest -from datetime import UTC, datetime +from datetime import datetime, timezone from unittest.mock import patch from taskgraph.util.time import ( @@ -53,8 +53,8 @@ def test_json_from_now(self): def test_current_json_time(self): with patch("taskgraph.util.time.datetime.datetime") as mock_datetime: - mock_datetime.now.return_value = datetime(2014, 1, 1, tzinfo=UTC) + mock_datetime.now.return_value = datetime(2014, 1, 1, tzinfo=timezone.utc) mock_datetime.side_effect = datetime assert current_json_time() == "2014-01-01T00:00:00.000Z" - assert current_json_time(True) == datetime(2014, 1, 1, tzinfo=UTC) + assert current_json_time(True) == datetime(2014, 1, 1, tzinfo=timezone.utc) From c3c16d0bf0d8f4245dde0c8549c93820e70aa231 Mon Sep 17 00:00:00 2001 From: Julien Cristau Date: Mon, 3 Mar 2025 15:31:00 +0100 Subject: [PATCH 4/6] Fix json_time_from_now with a timezone-aware argument --- src/taskgraph/util/time.py | 4 ++-- test/test_util_time.py | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/taskgraph/util/time.py b/src/taskgraph/util/time.py index a75ad4980..a613f9e83 100644 --- a/src/taskgraph/util/time.py +++ b/src/taskgraph/util/time.py @@ -98,7 +98,7 @@ def json_time_from_now(input_str, now=None, datetime_format=False): # Sorta a big hack but the json schema validator for date does not like the # ISO dates until 'Z' (for timezone) is added... # Microseconds are excluded (see bug 1381801) - return time.isoformat(timespec="milliseconds") + "Z" + return time.replace(tzinfo=None).isoformat(timespec="milliseconds") + "Z" def current_json_time(datetime_format=False): @@ -111,4 +111,4 @@ def current_json_time(datetime_format=False): return now else: # Microseconds are excluded (see bug 1381801) - return now.isoformat(timespec="milliseconds").replace("+00:00", "") + "Z" + return now.replace(tzinfo=None).isoformat(timespec="milliseconds") + "Z" diff --git a/test/test_util_time.py b/test/test_util_time.py index 166d2130d..af9447f10 100755 --- a/test/test_util_time.py +++ b/test/test_util_time.py @@ -58,3 +58,8 @@ def test_current_json_time(self): assert current_json_time() == "2014-01-01T00:00:00.000Z" assert current_json_time(True) == datetime(2014, 1, 1, tzinfo=timezone.utc) + + def test_json_from_now_tzinfo(self): + now = datetime(2014, 1, 1, tzinfo=timezone.utc) + self.assertEqual(json_time_from_now("1 years", now), "2015-01-01T00:00:00.000Z") + self.assertEqual(json_time_from_now("6 days", now), "2014-01-07T00:00:00.000Z") From 32efc85e553a58f68fece925a801a2afe92d2f51 Mon Sep 17 00:00:00 2001 From: AnsahMohammad Date: Mon, 3 Mar 2025 23:55:59 +0530 Subject: [PATCH 5/6] fix: replace timezone.UTC with timezone.utc --- test/test_optimize.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_optimize.py b/test/test_optimize.py index 51f2c3aa7..47a3c899a 100644 --- a/test/test_optimize.py +++ b/test/test_optimize.py @@ -34,7 +34,7 @@ def should_replace_task(self, task, params, deadline, taskid): if deadline: deadline_dt = datetime.datetime.strptime( deadline.replace("+00:00Z", "Z"), "%Y-%m-%dT%H:%M:%S.%fZ" - ).replace(tzinfo=datetime.UTC) + ).replace(tzinfo=datetime.timezone.utc) if expires < deadline_dt: return False From 5f83b35cc7b756baed5b333ea396a586cf0bf49b Mon Sep 17 00:00:00 2001 From: AnsahMohammad Date: Tue, 4 Mar 2025 22:44:15 +0530 Subject: [PATCH 6/6] refactor: simplified the test case --- test/test_optimize.py | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/test/test_optimize.py b/test/test_optimize.py index 47a3c899a..af9924f7e 100644 --- a/test/test_optimize.py +++ b/test/test_optimize.py @@ -2,7 +2,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -import datetime +from datetime import datetime, timedelta, timezone from functools import partial import pytest @@ -28,16 +28,11 @@ def should_remove_task(self, task, params, arg): class Replace(OptimizationStrategy): def should_replace_task(self, task, params, deadline, taskid): - expires = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta( - days=1 - ) - if deadline: - deadline_dt = datetime.datetime.strptime( - deadline.replace("+00:00Z", "Z"), "%Y-%m-%dT%H:%M:%S.%fZ" - ).replace(tzinfo=datetime.timezone.utc) - - if expires < deadline_dt: - return False + expires = datetime.now(timezone.utc) + timedelta(days=1) + if deadline and expires.replace(tzinfo=None) < datetime.strptime( + deadline, "%Y-%m-%dT%H:%M:%S.%fZ" + ): + return False return taskid