Replace pytz dependency with zoneinfo. Fix #2958 (#3161)

This commit is contained in:
Will Thong 2023-07-26 16:29:43 +01:00 committed by GitHub
commit 1d2bf8e96e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 33 additions and 23 deletions

View file

@ -4,10 +4,15 @@ import locale
import logging import logging
import os import os
import re import re
from datetime import timezone
from html import unescape from html import unescape
from urllib.parse import unquote, urljoin, urlparse, urlunparse from urllib.parse import unquote, urljoin, urlparse, urlunparse
import pytz try:
import zoneinfo
except ModuleNotFoundError:
from backports import zoneinfo
from pelican.plugins import signals from pelican.plugins import signals
from pelican.settings import DEFAULT_CONFIG from pelican.settings import DEFAULT_CONFIG
@ -120,9 +125,9 @@ class Content:
self.date_format = self.date_format[1] self.date_format = self.date_format[1]
# manage timezone # manage timezone
default_timezone = settings.get('TIMEZONE', 'UTC') default_timezone = settings.get("TIMEZONE", "UTC")
timezone = getattr(self, 'timezone', default_timezone) timezone = getattr(self, "timezone", default_timezone)
self.timezone = pytz.timezone(timezone) self.timezone = zoneinfo.ZoneInfo(timezone)
if hasattr(self, 'date'): if hasattr(self, 'date'):
self.date = set_date_tzinfo(self.date, timezone) self.date = set_date_tzinfo(self.date, timezone)
@ -525,7 +530,7 @@ class Article(Content):
if self.date.tzinfo is None: if self.date.tzinfo is None:
now = datetime.datetime.now() now = datetime.datetime.now()
else: else:
now = datetime.datetime.utcnow().replace(tzinfo=pytz.utc) now = datetime.datetime.utcnow().replace(tzinfo=timezone.utc)
if self.date > now: if self.date > now:
self.status = 'draft' self.status = 'draft'

View file

@ -7,7 +7,10 @@ from typing import Mapping
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
import pytz try:
import zoneinfo
except ModuleNotFoundError:
from backports import zoneinfo
try: try:
import readline # NOQA import readline # NOQA
@ -17,8 +20,8 @@ except ImportError:
try: try:
import tzlocal import tzlocal
_DEFAULT_TIMEZONE = tzlocal.get_localzone().zone _DEFAULT_TIMEZONE = tzlocal.get_localzone().zone
except ImportError: except ModuleNotFoundError:
_DEFAULT_TIMEZONE = 'Europe/Rome' _DEFAULT_TIMEZONE = "Europe/Rome"
from pelican import __version__ from pelican import __version__
@ -158,16 +161,15 @@ def ask(question, answer=str, default=None, length=None):
def ask_timezone(question, default, tzurl): def ask_timezone(question, default, tzurl):
"""Prompt for time zone and validate input""" """Prompt for time zone and validate input"""
lower_tz = [tz.lower() for tz in pytz.all_timezones] tz_dict = {tz.lower(): tz for tz in zoneinfo.available_timezones()}
while True: while True:
r = ask(question, str, default) r = ask(question, str, default)
r = r.strip().replace(' ', '_').lower() r = r.strip().replace(" ", "_").lower()
if r in lower_tz: if r in tz_dict.keys():
r = pytz.all_timezones[lower_tz.index(r)] r = tz_dict[r]
break break
else: else:
print('Please enter a valid time zone:\n' print("Please enter a valid time zone:\n" " (check [{}])".format(tzurl))
' (check [{}])'.format(tzurl))
return r return r

View file

@ -18,10 +18,12 @@ from operator import attrgetter
import dateutil.parser import dateutil.parser
try:
import zoneinfo
except ModuleNotFoundError:
from backports import zoneinfo
from markupsafe import Markup from markupsafe import Markup
import pytz
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -919,10 +921,11 @@ class FileSystemWatcher:
def set_date_tzinfo(d, tz_name=None): def set_date_tzinfo(d, tz_name=None):
"""Set the timezone for dates that don't have tzinfo""" """Set the timezone for dates that don't have tzinfo"""
if tz_name and not d.tzinfo: if tz_name and not d.tzinfo:
tz = pytz.timezone(tz_name) timezone = zoneinfo.ZoneInfo(tz_name)
d = tz.localize(d) d = d.replace(tzinfo=timezone)
return SafeDatetime(d.year, d.month, d.day, d.hour, d.minute, d.second, return SafeDatetime(
d.microsecond, d.tzinfo) d.year, d.month, d.day, d.hour, d.minute, d.second, d.microsecond, d.tzinfo
)
return d return d

View file

@ -37,10 +37,10 @@ feedgenerator = ">=1.9"
jinja2 = ">=2.7" jinja2 = ">=2.7"
pygments = ">=2.6" pygments = ">=2.6"
python-dateutil = ">=2.8" python-dateutil = ">=2.8"
pytz = ">=2020.1"
rich = ">=10.1" rich = ">=10.1"
unidecode = ">=1.1" unidecode = ">=1.1"
markdown = {version = ">=3.1", optional = true} markdown = {version = ">=3.1", optional = true}
backports-zoneinfo = {version = "^0.2.1", python = "<3.9"}
[tool.poetry.dev-dependencies] [tool.poetry.dev-dependencies]
BeautifulSoup4 = "^4.9" BeautifulSoup4 = "^4.9"

View file

@ -9,8 +9,8 @@ from setuptools import find_packages, setup
version = "4.8.0" version = "4.8.0"
requires = ['feedgenerator >= 1.9', 'jinja2 >= 2.7', 'pygments', requires = ['feedgenerator >= 1.9', 'jinja2 >= 2.7', 'pygments',
'docutils>=0.15', 'pytz >= 0a', 'blinker', 'unidecode', 'docutils>=0.15', 'blinker', 'unidecode', 'python-dateutil',
'python-dateutil', 'rich'] 'rich', 'backports-zoneinfo[tzdata] >= 0.2; python_version<"3.9"']
entry_points = { entry_points = {
'console_scripts': [ 'console_scripts': [