Enable flake8-datetimez linting rules (#267)

See https://docs.astral.sh/ruff/rules/#flake8-datetimez-dtz.
This commit is contained in:
Marc Wrobel
2023-12-30 11:20:51 +01:00
parent 54e7091fd2
commit 798c298c59
10 changed files with 34 additions and 26 deletions

View File

@@ -7,6 +7,7 @@ select = [
"C4", # flake8-comprehensions "C4", # flake8-comprehensions
"C90", # mccabe "C90", # mccabe
"COM", # flake8-commas "COM", # flake8-commas
"DTZ", # flake8-commas
"E", # pycodestyle errors "E", # pycodestyle errors
"F", # pyflakes errors "F", # pyflakes errors
"I", # isort "I", # isort

View File

@@ -172,7 +172,8 @@ def update_product(name: str, product_dir: Path, releases_dir: Path) -> None:
# Print all unmatched versions released in the last 30 days # Print all unmatched versions released in the last 30 days
if len(product.unmatched_versions) != 0: if len(product.unmatched_versions) != 0:
for version, date in product.unmatched_versions.items(): for version, date in product.unmatched_versions.items():
days_since_release = (datetime.date.today() - date).days today = datetime.datetime.now(tz=datetime.timezone.utc).date()
days_since_release = (today - date).days
if days_since_release < 30: if days_since_release < 30:
logging.warning(f"{name}:{version} ({date}) not included") logging.warning(f"{name}:{version} ({date}) not included")
github_output(f"{name}:{version} ({date})\n") github_output(f"{name}:{version} ({date})\n")

View File

@@ -1,4 +1,3 @@
import datetime
from common import dates, endoflife from common import dates, endoflife
from requests_html import HTMLSession from requests_html import HTMLSession
@@ -21,7 +20,7 @@ for row in r.html.find('.informaltable tbody tr'):
# 7.29.9 release date is wrong on https://jfrog.com/help/r/jfrog-release-information/artifactory-end-of-life. # 7.29.9 release date is wrong on https://jfrog.com/help/r/jfrog-release-information/artifactory-end-of-life.
# Sent a mail to jfrog-help-center-feedback@jfrog.com to fix it, but in the meantime... # Sent a mail to jfrog-help-center-feedback@jfrog.com to fix it, but in the meantime...
product.replace_version('7.29.9', datetime.datetime(2022, 1, 11)) product.replace_version('7.29.9', dates.date(2022, 1, 11))
product.write() product.write()
print("::endgroup::") print("::endgroup::")

View File

@@ -1,7 +1,6 @@
import datetime
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from common import endoflife, http from common import dates, endoflife, http
"""Fetches AWS lambda runtimes from https://docs.aws.amazon.com. """Fetches AWS lambda runtimes from https://docs.aws.amazon.com.
@@ -34,7 +33,7 @@ for table in soup.find_all("table"):
if date is None: if date is None:
date = old_product.get_version_date(identifier) # else use the previously found date date = old_product.get_version_date(identifier) # else use the previously found date
if date is None: if date is None:
date = datetime.date.today() # else use today's date date = dates.today() # else use today's date
product.declare_version(identifier, date) product.declare_version(identifier, date)

View File

@@ -1,5 +1,4 @@
import re import re
from datetime import datetime
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from common import dates, endoflife, http from common import dates, endoflife, http
@@ -24,12 +23,12 @@ VERSION_AND_DATE_PATTERN = re.compile(r"Release Date[,|:]? (.*?)\).*?Build Numbe
# .0 release dates are not available in the release notes. # .0 release dates are not available in the release notes.
FIXED_VERSIONS = { FIXED_VERSIONS = {
"10.0.0": datetime(2012, 5, 15), # https://en.wikipedia.org/wiki/Adobe_ColdFusion#Adobe_ColdFusion_10 "10.0.0": dates.date(2012, 5, 15), # https://en.wikipedia.org/wiki/Adobe_ColdFusion#Adobe_ColdFusion_10
"11.0.0": datetime(2014, 4, 29), # https://en.wikipedia.org/wiki/Adobe_ColdFusion#Adobe_ColdFusion_11 "11.0.0": dates.date(2014, 4, 29), # https://en.wikipedia.org/wiki/Adobe_ColdFusion#Adobe_ColdFusion_11
"2016.0.0": datetime(2016, 2, 16), # https://en.wikipedia.org/wiki/Adobe_ColdFusion#Adobe_ColdFusion_(2016_Release) "2016.0.0": dates.date(2016, 2, 16), # https://en.wikipedia.org/wiki/Adobe_ColdFusion#Adobe_ColdFusion_(2016_Release)
"2018.0.0": datetime(2018, 7, 12), # https://coldfusion.adobe.com/2018/07/new-coldfusion-release-adds-performance-monitoring-toolset-for-measuring-monitoring-and-managing-high-performing-web-apps/ "2018.0.0": dates.date(2018, 7, 12), # https://coldfusion.adobe.com/2018/07/new-coldfusion-release-adds-performance-monitoring-toolset-for-measuring-monitoring-and-managing-high-performing-web-apps/
"2021.0.0": datetime(2020, 11, 11), # https://community.adobe.com/t5/coldfusion-discussions/introducing-adobe-coldfusion-2021-release/m-p/11585468 "2021.0.0": dates.date(2020, 11, 11), # https://community.adobe.com/t5/coldfusion-discussions/introducing-adobe-coldfusion-2021-release/m-p/11585468
"2023.0.0": datetime(2022, 5, 16), # https://coldfusion.adobe.com/2023/05/coldfusion2023-release/ "2023.0.0": dates.date(2022, 5, 16), # https://coldfusion.adobe.com/2023/05/coldfusion2023-release/
} }
product = endoflife.Product("coldfusion") product = endoflife.Product("coldfusion")

View File

@@ -44,10 +44,20 @@ def parse_datetime(text: str, formats: list[str] = frozenset([
text = text.strip().replace(", ", " ").replace(". ", " ").replace("(", "").replace(")", "") text = text.strip().replace(", ", " ").replace(". ", " ").replace("(", "").replace(")", "")
for fmt in formats: for fmt in formats:
try: try:
date = datetime.strptime(text, fmt) date = datetime.strptime(text, fmt) # NOQA: DTZ007, timezone is handled below
date = date.astimezone(timezone.utc) if to_utc else date date = date.astimezone(timezone.utc) if to_utc else date
return date return date
except ValueError: except ValueError:
pass pass
raise ValueError(f"'{text}' could not be parsed as a date with any of the formats: {str(formats)}") raise ValueError(f"'{text}' could not be parsed as a date with any of the formats: {str(formats)}")
def date(year: int, month: int, day: int) -> datetime:
"""Create a datetime object with the given year, month and day, at midnight."""
return datetime(year, month, day, tzinfo=timezone.utc)
def today() -> datetime:
"""Create a datetime object with today's date, at midnight."""
return datetime.now(tz=timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0)

View File

@@ -2,7 +2,7 @@ import json
import logging import logging
import os import os
import re import re
from datetime import datetime from datetime import datetime, timezone
from glob import glob from glob import glob
import frontmatter import frontmatter
@@ -84,7 +84,8 @@ class Product:
if not os.path.isfile(product.versions_path): if not os.path.isfile(product.versions_path):
with open(product.versions_path) as f: with open(product.versions_path) as f:
for version, date in json.load(f).items(): for version, date in json.load(f).items():
product.versions[version] = datetime.strptime(date, "%Y-%m-%d") date_obj = datetime.strptime(date, "%Y-%m-%d").replace(tzinfo=timezone.utc)
product.versions[version] = date_obj
logging.info(f"loaded versions data for {product.name} from {product.versions_path}") logging.info(f"loaded versions data for {product.name} from {product.versions_path}")
else: else:
logging.warning(f"no versions data found for {product.name} at {product.versions_path}") logging.warning(f"no versions data found for {product.name} at {product.versions_path}")

View File

@@ -1,5 +1,4 @@
import re import re
from datetime import datetime
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from common import dates, endoflife, http from common import dates, endoflife, http
@@ -13,10 +12,10 @@ Moreover dates are not accurate (only month and year are provided), so they are
URLS = "https://docs.couchbase.com/server" URLS = "https://docs.couchbase.com/server"
VERSION_AND_DATE_PATTERN = re.compile(r"^Release (?P<version>\d+\.\d+(\.\d+)?) \((?P<date>.+)\)$") VERSION_AND_DATE_PATTERN = re.compile(r"^Release (?P<version>\d+\.\d+(\.\d+)?) \((?P<date>.+)\)$")
MANUAL_VERSIONS = { MANUAL_VERSIONS = {
"6.0.0": datetime(2018, 10, 31), # https://www.couchbase.com/blog/announcing-couchbase-6-0/ "6.0.0": dates.date(2018, 10, 31), # https://www.couchbase.com/blog/announcing-couchbase-6-0/
"6.0.1": datetime(2019, 2, 15), # https://web.archive.org/web/20190307191211/https://docs.couchbase.com/server/6.0/release-notes/relnotes.html "6.0.1": dates.date(2019, 2, 15), # https://web.archive.org/web/20190307191211/https://docs.couchbase.com/server/6.0/release-notes/relnotes.html
"6.6.0": datetime(2020, 8, 12), # https://www.couchbase.com/blog/whats-new-and-improved-in-couchbase-server-6-6/ "6.6.0": dates.date(2020, 8, 12), # https://www.couchbase.com/blog/whats-new-and-improved-in-couchbase-server-6-6/
"7.2.0": datetime(2023, 6, 1), # https://www.couchbase.com/blog/couchbase-capella-spring-release-72/ "7.2.0": dates.date(2023, 6, 1), # https://www.couchbase.com/blog/couchbase-capella-spring-release-72/
} }
product = endoflife.Product("couchbase-server") product = endoflife.Product("couchbase-server")

View File

@@ -1,8 +1,7 @@
import re import re
from datetime import datetime
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from common import endoflife, http from common import dates, endoflife, http
CYCLE_PATTERN = re.compile(r"^(\d+\.\d+)/$") CYCLE_PATTERN = re.compile(r"^(\d+\.\d+)/$")
DATE_AND_VERSION_PATTERN = re.compile(r"^(\d{4})/(\d{2})/(\d{2})\s+:\s+(\d+\.\d+\.\d.?)$") # https://regex101.com/r/1JCnFC/1 DATE_AND_VERSION_PATTERN = re.compile(r"^(\d{4})/(\d{2})/(\d{2})\s+:\s+(\d+\.\d+\.\d.?)$") # https://regex101.com/r/1JCnFC/1
@@ -29,7 +28,7 @@ for changelog in http.fetch_urls(changelog_urls):
date_and_version_match = DATE_AND_VERSION_PATTERN.match(line) date_and_version_match = DATE_AND_VERSION_PATTERN.match(line)
if date_and_version_match: if date_and_version_match:
year, month, day, version = date_and_version_match.groups() year, month, day, version = date_and_version_match.groups()
product.declare_version(version, datetime(int(year), int(month), int(day))) product.declare_version(version, dates.date(int(year), int(month), int(day)))
product.write() product.write()
print("::endgroup::") print("::endgroup::")

View File

@@ -1,5 +1,5 @@
import datetime
import sys import sys
from datetime import datetime, timezone
from common import endoflife, http from common import endoflife, http
@@ -23,7 +23,7 @@ for product_name in endoflife.list_products(METHOD, p_filter):
version_match = config.first_match(row["v"]) version_match = config.first_match(row["v"])
if version_match: if version_match:
version = config.render(version_match) version = config.render(version_match)
date = datetime.datetime.utcfromtimestamp(row["timestamp"] / 1000) date = datetime.fromtimestamp(row["timestamp"] / 1000, tz=timezone.utc)
product.declare_version(version, date) product.declare_version(version, date)
start += 100 start += 100