Enable flake8-datetimez linting rules (#267)
See https://docs.astral.sh/ruff/rules/#flake8-datetimez-dtz.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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::")
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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}")
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|||||||
@@ -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::")
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user