From d7f8f40e038ece3f9fa4ee7a8e43518892b4fd83 Mon Sep 17 00:00:00 2001 From: Thomas Oettli Date: Thu, 8 Sep 2022 16:23:45 +0200 Subject: [PATCH] python issue30681 is fixed with Python 3.10 --- pyquarantine/_runtime_patches.py | 126 ++++++++++++++++--------------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/pyquarantine/_runtime_patches.py b/pyquarantine/_runtime_patches.py index aef4656..8f55080 100644 --- a/pyquarantine/_runtime_patches.py +++ b/pyquarantine/_runtime_patches.py @@ -12,6 +12,7 @@ # along with pyquarantine. If not, see . # +from sys import version_info import encodings @@ -150,68 +151,6 @@ def get_obs_local_part(value): setattr(email._header_value_parser, "get_obs_local_part", get_obs_local_part) -# https://bugs.python.org/issue30681 -# -# fix: https://github.com/python/cpython/pull/22090 - -import email.errors -from email.errors import HeaderDefect - - -class InvalidDateDefect(HeaderDefect): - """Header has unparseable or invalid date""" - - -setattr(email.errors, "InvalidDateDefect", InvalidDateDefect) - - -import email.utils -from email.utils import _parsedate_tz -import datetime - - -def parsedate_to_datetime(data): - parsed_date_tz = _parsedate_tz(data) - if parsed_date_tz is None: - raise ValueError('Invalid date value or format "%s"' % str(data)) - *dtuple, tz = parsed_date_tz - if tz is None: - return datetime.datetime(*dtuple[:6]) - return datetime.datetime(*dtuple[:6], - tzinfo=datetime.timezone(datetime.timedelta(seconds=tz))) - - -setattr(email.utils, "parsedate_to_datetime", parsedate_to_datetime) - - -import email.headerregistry -from email import utils, _header_value_parser as parser - -@classmethod -def parse(cls, value, kwds): - if not value: - kwds['defects'].append(errors.HeaderMissingRequiredValue()) - kwds['datetime'] = None - kwds['decoded'] = '' - kwds['parse_tree'] = parser.TokenList() - return - if isinstance(value, str): - kwds['decoded'] = value - try: - value = utils.parsedate_to_datetime(value) - except ValueError: - kwds['defects'].append(errors.InvalidDateDefect('Invalid date value or format')) - kwds['datetime'] = None - kwds['parse_tree'] = parser.TokenList() - return - kwds['datetime'] = value - kwds['decoded'] = utils.format_datetime(kwds['datetime']) - kwds['parse_tree'] = cls.value_parser(kwds['decoded']) - - -setattr(email.headerregistry.DateHeader, "parse", parse) - - ####################################### # add charset alias for windows-874 # ####################################### @@ -227,3 +166,66 @@ for alias in ["windows-874", "windows_874"]: aliases[alias] = "cp874" setattr(encodings.aliases, "aliases", aliases) + + +if version_info.major == 3 and version_info.minor < 10: + # https://bugs.python.org/issue30681 + # + # fix: https://github.com/python/cpython/pull/22090 + + import email.errors + from email.errors import HeaderDefect + + + class InvalidDateDefect(HeaderDefect): + """Header has unparseable or invalid date""" + + + setattr(email.errors, "InvalidDateDefect", InvalidDateDefect) + + + import email.utils + from email.utils import _parsedate_tz + import datetime + + + def parsedate_to_datetime(data): + parsed_date_tz = _parsedate_tz(data) + if parsed_date_tz is None: + raise ValueError('Invalid date value or format "%s"' % str(data)) + *dtuple, tz = parsed_date_tz + if tz is None: + return datetime.datetime(*dtuple[:6]) + return datetime.datetime(*dtuple[:6], + tzinfo=datetime.timezone(datetime.timedelta(seconds=tz))) + + + setattr(email.utils, "parsedate_to_datetime", parsedate_to_datetime) + + + import email.headerregistry + from email import utils, _header_value_parser as parser + + @classmethod + def parse(cls, value, kwds): + if not value: + kwds['defects'].append(errors.HeaderMissingRequiredValue()) + kwds['datetime'] = None + kwds['decoded'] = '' + kwds['parse_tree'] = parser.TokenList() + return + if isinstance(value, str): + kwds['decoded'] = value + try: + value = utils.parsedate_to_datetime(value) + except ValueError: + kwds['defects'].append(errors.InvalidDateDefect('Invalid date value or format')) + kwds['datetime'] = None + kwds['parse_tree'] = parser.TokenList() + return + kwds['datetime'] = value + kwds['decoded'] = utils.format_datetime(kwds['datetime']) + kwds['parse_tree'] = cls.value_parser(kwds['decoded']) + + + setattr(email.headerregistry.DateHeader, "parse", parse)