From deeea48e90bd14d879f9139c07f870ef1bef3603 Mon Sep 17 00:00:00 2001 From: Prinz23 Date: Wed, 20 May 2020 02:17:44 +0100 Subject: [PATCH] Change make Py3.9 preparations. Change cElementTree has been removed. Change base64.decodestring has been removed. Change create central etree only importer for py2/py3. Change improve central lxml_etree importer for py2/py3. --- CHANGES.md | 1 + lib/_23.py | 9 +++++++++ lib/adba/aniDBfileInfo.py | 2 +- lib/feedparser_py3/http.py | 5 ++--- lib/feedparser_py3/mixin.py | 4 +--- lib/lxml_etree/__init__.py | 31 +++++++++++++++++++------------ sickbeard/notifiers/kodi.py | 5 ++--- sickbeard/notifiers/nmj.py | 5 ++--- sickbeard/notifiers/nmjv2.py | 7 +++---- sickbeard/notifiers/plex.py | 5 ++--- sickbeard/notifiers/xbmc.py | 5 ++--- 11 files changed, 44 insertions(+), 35 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index cd91029..c960b1b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -40,6 +40,7 @@ * Change improve Popen resource usage under py2 * Add overall failure monitoring to History/Connect fails (renamed from "Provider fails") * Change log exception during updateCache in newznab +* Change make Py3.9 preparations [develop changelog] diff --git a/lib/_23.py b/lib/_23.py index 94a79fb..eb39013 100644 --- a/lib/_23.py +++ b/lib/_23.py @@ -155,6 +155,9 @@ if 2 != version_info[0]: # noinspection PyUnresolvedReferences from subprocess import Popen + # noinspection PyUnresolvedReferences + import xml.etree.ElementTree as etree + native_timestamp = datetime.datetime.timestamp # type: Callable[[datetime.datetime], float] def unquote(string, encoding='utf-8', errors='replace'): @@ -227,6 +230,12 @@ else: # noinspection PyUnresolvedReferences,PyDeprecation from inspect import getargspec + try: + # noinspection PyPep8Naming + import xml.etree.cElementTree as etree + except ImportError: + # noinspection PyPep8Naming + import xml.etree.ElementTree as etree def _totimestamp(dt=None): # type: (datetime.datetime) -> float diff --git a/lib/adba/aniDBfileInfo.py b/lib/adba/aniDBfileInfo.py index 809ff89..03eb518 100644 --- a/lib/adba/aniDBfileInfo.py +++ b/lib/adba/aniDBfileInfo.py @@ -24,8 +24,8 @@ import pickle import requests import sys import time -import xml.etree.cElementTree as etree +from _23 import etree logger = logging.getLogger('adba') logger.addHandler(logging.NullHandler()) diff --git a/lib/feedparser_py3/http.py b/lib/feedparser_py3/http.py index f637690..045246b 100644 --- a/lib/feedparser_py3/http.py +++ b/lib/feedparser_py3/http.py @@ -71,9 +71,8 @@ import base64 from .datetimes import _parse_date from .urls import convert_to_idn -# Python 3.1 deprecated decodestring in favor of decodebytes. -# This can be removed after Python 2.7 support is dropped. -_base64decode = getattr(base64, 'decodebytes', base64.decodestring) +_base64decode = base64.decodebytes + try: basestring diff --git a/lib/feedparser_py3/mixin.py b/lib/feedparser_py3/mixin.py index 7556506..d18c8bf 100644 --- a/lib/feedparser_py3/mixin.py +++ b/lib/feedparser_py3/mixin.py @@ -48,9 +48,7 @@ from .util import FeedParserDict from .urls import _urljoin, make_safe_absolute_uri, resolve_relative_uris -# Python 2.7 only offers "decodestring()". -# This name substitution can be removed when Python 2.7 support is dropped. -_base64decode = getattr(base64, 'decodebytes', base64.decodestring) +_base64decode = base64.decodebytes bytes_ = type(b'') diff --git a/lib/lxml_etree/__init__.py b/lib/lxml_etree/__init__.py index 69919df..bf4dec1 100644 --- a/lib/lxml_etree/__init__.py +++ b/lib/lxml_etree/__init__.py @@ -1,12 +1,19 @@ -try: - # noinspection PyPackageRequirements - from lxml import etree - is_lxml = True -except ImportError: - is_lxml = False - try: - # noinspection PyPep8Naming - import xml.etree.cElementTree as etree - except ImportError: - # noinspection PyPep8Naming - import xml.etree.ElementTree as etree +from sys import version_info + +try: + # noinspection PyPackageRequirements + from lxml import etree + is_lxml = True +except ImportError: + is_lxml = False + etree = None + if 2 == version_info[0]: + try: + # noinspection PyPep8Naming + import xml.etree.cElementTree as etree + except ImportError: + etree = None + +if not is_lxml and not etree: + # noinspection PyPep8Naming + import xml.etree.ElementTree as etree diff --git a/sickbeard/notifiers/kodi.py b/sickbeard/notifiers/kodi.py index 5ee1230..f12b941 100644 --- a/sickbeard/notifiers/kodi.py +++ b/sickbeard/notifiers/kodi.py @@ -22,7 +22,6 @@ try: except ImportError: from lib import simplejson as json import time -import xml.etree.cElementTree as XmlEtree from .generic import Notifier from .. import logger @@ -30,7 +29,7 @@ import sickbeard import sickbeard.helpers from exceptions_helper import ex -from _23 import decode_str, quote, unquote, unquote_plus +from _23 import decode_str, etree, quote, unquote, unquote_plus class KodiNotifier(Notifier): @@ -233,7 +232,7 @@ class KodiNotifier(Notifier): return False try: - et = XmlEtree.fromstring(quote(response, ':\\/<>')) + et = etree.fromstring(quote(response, ':\\/<>')) except SyntaxError as e: self._log_error(u'Unable to parse XML in response: %s' % ex(e)) return False diff --git a/sickbeard/notifiers/nmj.py b/sickbeard/notifiers/nmj.py index 3832e27..0eadb4e 100644 --- a/sickbeard/notifiers/nmj.py +++ b/sickbeard/notifiers/nmj.py @@ -18,13 +18,12 @@ import re import telnetlib -import xml.etree.cElementTree as XmlEtree from .generic import BaseNotifier import sickbeard from exceptions_helper import ex -from _23 import urlencode +from _23 import etree, urlencode # noinspection PyUnresolvedReferences from six.moves import urllib @@ -141,7 +140,7 @@ class NMJNotifier(BaseNotifier): # try to parse the resulting XML try: - et = XmlEtree.fromstring(response) + et = etree.fromstring(response) result = et.findtext('returnValue') except SyntaxError as e: self._log_error(u'Unable to parse XML returned from the Popcorn Hour: %s' % ex(e)) diff --git a/sickbeard/notifiers/nmjv2.py b/sickbeard/notifiers/nmjv2.py index ad0b897..ae30358 100644 --- a/sickbeard/notifiers/nmjv2.py +++ b/sickbeard/notifiers/nmjv2.py @@ -19,13 +19,12 @@ import time from xml.dom.minidom import parseString -import xml.etree.cElementTree as XmlEtree from .generic import BaseNotifier import sickbeard from exceptions_helper import ex -from _23 import urlencode +from _23 import etree, urlencode # noinspection PyUnresolvedReferences from six.moves import urllib @@ -133,14 +132,14 @@ class NMJv2Notifier(BaseNotifier): return False try: - et = XmlEtree.fromstring(response1) + et = etree.fromstring(response1) result1 = et.findtext('returnValue') except SyntaxError as e: self._log_error(u'Unable to parse XML returned from the Popcorn Hour: update_scandir, %s' % ex(e)) return False try: - et = XmlEtree.fromstring(response2) + et = etree.fromstring(response2) result2 = et.findtext('returnValue') except SyntaxError as e: self._log_error(u'Unable to parse XML returned from the Popcorn Hour: scanner_start, %s' % ex(e)) diff --git a/sickbeard/notifiers/plex.py b/sickbeard/notifiers/plex.py index 7748e28..80b7c93 100644 --- a/sickbeard/notifiers/plex.py +++ b/sickbeard/notifiers/plex.py @@ -17,14 +17,13 @@ # along with SickGear. If not, see . import re -import xml.etree.cElementTree as XmlEtree from .generic import Notifier import sickbeard from encodingKludge import fixStupidEncodings from exceptions_helper import ex -from _23 import b64encodestring, decode_str, filter_iter, list_values, unquote_plus, urlencode +from _23 import b64encodestring, decode_str, etree, filter_iter, list_values, unquote_plus, urlencode from six import iteritems, text_type, PY2 # noinspection PyUnresolvedReferences from six.moves import urllib @@ -175,7 +174,7 @@ class PLEXNotifier(Notifier): try: http_response_obj = urllib.request.urlopen(req) # PY2 http_response_obj has no `with` context manager - auth_tree = XmlEtree.parse(http_response_obj) + auth_tree = etree.parse(http_response_obj) http_response_obj.close() token = auth_tree.findall('.//authentication-token')[0].text token_arg = '?X-Plex-Token=' + token diff --git a/sickbeard/notifiers/xbmc.py b/sickbeard/notifiers/xbmc.py index 4629236..1db0964 100644 --- a/sickbeard/notifiers/xbmc.py +++ b/sickbeard/notifiers/xbmc.py @@ -22,14 +22,13 @@ except ImportError: from lib import simplejson as json import socket import time -import xml.etree.cElementTree as XmlEtree from .generic import Notifier import sickbeard from exceptions_helper import ex from encodingKludge import fixStupidEncodings -from _23 import b64encodestring, decode_str, quote, unquote, unquote_plus, urlencode +from _23 import b64encodestring, decode_str, etree, quote, unquote, unquote_plus, urlencode from six import PY2, text_type # noinspection PyUnresolvedReferences from six.moves import urllib @@ -238,7 +237,7 @@ class XBMCNotifier(Notifier): enc_sql_xml = quote(sql_xml, ':\\/<>') try: - et = XmlEtree.fromstring(enc_sql_xml) + et = etree.fromstring(enc_sql_xml) except SyntaxError as e: self._log_error(u'Unable to parse XML response: ' + ex(e)) return False