mirror of
https://github.com/clinton-hall/nzbToMedia.git
synced 2025-08-20 05:13:16 -07:00
Add Python 3.12 and fix Radarr handling (#1989)
* Added Python3.12 and future 3.13 * Fix Radarr result handling * remove py2.7 and py3.7 support
This commit is contained in:
parent
b802aca7e1
commit
f98d6fff65
173 changed files with 17498 additions and 21001 deletions
|
@ -1,42 +1,44 @@
|
|||
"""Wheels support."""
|
||||
|
||||
from distutils.util import get_platform
|
||||
from distutils import log
|
||||
import email
|
||||
import itertools
|
||||
import functools
|
||||
import os
|
||||
import posixpath
|
||||
import re
|
||||
import zipfile
|
||||
import contextlib
|
||||
|
||||
from distutils.util import get_platform
|
||||
|
||||
import pkg_resources
|
||||
import setuptools
|
||||
from pkg_resources import parse_version
|
||||
from setuptools.extern.packaging.version import Version as parse_version
|
||||
from setuptools.extern.packaging.tags import sys_tags
|
||||
from setuptools.extern.packaging.utils import canonicalize_name
|
||||
from setuptools.extern.six import PY3
|
||||
from setuptools.command.egg_info import write_requirements
|
||||
|
||||
|
||||
__metaclass__ = type
|
||||
from setuptools.command.egg_info import write_requirements, _egg_basename
|
||||
from setuptools.archive_util import _unpack_zipfile_obj
|
||||
|
||||
|
||||
WHEEL_NAME = re.compile(
|
||||
r"""^(?P<project_name>.+?)-(?P<version>\d.*?)
|
||||
((-(?P<build>\d.*?))?-(?P<py_version>.+?)-(?P<abi>.+?)-(?P<platform>.+?)
|
||||
)\.whl$""",
|
||||
re.VERBOSE).match
|
||||
re.VERBOSE,
|
||||
).match
|
||||
|
||||
NAMESPACE_PACKAGE_INIT = '''\
|
||||
try:
|
||||
__import__('pkg_resources').declare_namespace(__name__)
|
||||
except ImportError:
|
||||
__path__ = __import__('pkgutil').extend_path(__path__, __name__)
|
||||
'''
|
||||
NAMESPACE_PACKAGE_INIT = "__import__('pkg_resources').declare_namespace(__name__)\n"
|
||||
|
||||
|
||||
@functools.lru_cache(maxsize=None)
|
||||
def _get_supported_tags():
|
||||
# We calculate the supported tags only once, otherwise calling
|
||||
# this method on thousands of wheels takes seconds instead of
|
||||
# milliseconds.
|
||||
return {(t.interpreter, t.abi, t.platform) for t in sys_tags()}
|
||||
|
||||
|
||||
def unpack(src_dir, dst_dir):
|
||||
'''Move everything under `src_dir` to `dst_dir`, and delete the former.'''
|
||||
"""Move everything under `src_dir` to `dst_dir`, and delete the former."""
|
||||
for dirpath, dirnames, filenames in os.walk(src_dir):
|
||||
subdir = os.path.relpath(dirpath, src_dir)
|
||||
for f in filenames:
|
||||
|
@ -57,8 +59,21 @@ def unpack(src_dir, dst_dir):
|
|||
os.rmdir(dirpath)
|
||||
|
||||
|
||||
class Wheel:
|
||||
@contextlib.contextmanager
|
||||
def disable_info_traces():
|
||||
"""
|
||||
Temporarily disable info traces.
|
||||
"""
|
||||
from distutils import log
|
||||
|
||||
saved = log.set_threshold(log.WARN)
|
||||
try:
|
||||
yield
|
||||
finally:
|
||||
log.set_threshold(saved)
|
||||
|
||||
|
||||
class Wheel:
|
||||
def __init__(self, filename):
|
||||
match = WHEEL_NAME(os.path.basename(filename))
|
||||
if match is None:
|
||||
|
@ -68,7 +83,7 @@ class Wheel:
|
|||
setattr(self, k, v)
|
||||
|
||||
def tags(self):
|
||||
'''List tags (py_version, abi, platform) supported by this wheel.'''
|
||||
"""List tags (py_version, abi, platform) supported by this wheel."""
|
||||
return itertools.product(
|
||||
self.py_version.split('.'),
|
||||
self.abi.split('.'),
|
||||
|
@ -76,28 +91,31 @@ class Wheel:
|
|||
)
|
||||
|
||||
def is_compatible(self):
|
||||
'''Is the wheel is compatible with the current platform?'''
|
||||
supported_tags = set((t.interpreter, t.abi, t.platform) for t in sys_tags())
|
||||
return next((True for t in self.tags() if t in supported_tags), False)
|
||||
"""Is the wheel compatible with the current platform?"""
|
||||
return next((True for t in self.tags() if t in _get_supported_tags()), False)
|
||||
|
||||
def egg_name(self):
|
||||
return pkg_resources.Distribution(
|
||||
project_name=self.project_name, version=self.version,
|
||||
platform=(None if self.platform == 'any' else get_platform()),
|
||||
).egg_name() + '.egg'
|
||||
return (
|
||||
_egg_basename(
|
||||
self.project_name,
|
||||
self.version,
|
||||
platform=(None if self.platform == 'any' else get_platform()),
|
||||
)
|
||||
+ ".egg"
|
||||
)
|
||||
|
||||
def get_dist_info(self, zf):
|
||||
# find the correct name of the .dist-info dir in the wheel file
|
||||
for member in zf.namelist():
|
||||
dirname = posixpath.dirname(member)
|
||||
if (dirname.endswith('.dist-info') and
|
||||
canonicalize_name(dirname).startswith(
|
||||
canonicalize_name(self.project_name))):
|
||||
if dirname.endswith('.dist-info') and canonicalize_name(dirname).startswith(
|
||||
canonicalize_name(self.project_name)
|
||||
):
|
||||
return dirname
|
||||
raise ValueError("unsupported wheel format. .dist-info not found")
|
||||
|
||||
def install_as_egg(self, destination_eggdir):
|
||||
'''Install wheel as an egg directory.'''
|
||||
"""Install wheel as an egg directory."""
|
||||
with zipfile.ZipFile(self.filename) as zf:
|
||||
self._install_as_egg(destination_eggdir, zf)
|
||||
|
||||
|
@ -113,27 +131,26 @@ class Wheel:
|
|||
|
||||
@staticmethod
|
||||
def _convert_metadata(zf, destination_eggdir, dist_info, egg_info):
|
||||
import pkg_resources
|
||||
|
||||
def get_metadata(name):
|
||||
with zf.open(posixpath.join(dist_info, name)) as fp:
|
||||
value = fp.read().decode('utf-8') if PY3 else fp.read()
|
||||
value = fp.read().decode('utf-8')
|
||||
return email.parser.Parser().parsestr(value)
|
||||
|
||||
wheel_metadata = get_metadata('WHEEL')
|
||||
# Check wheel format version is supported.
|
||||
wheel_version = parse_version(wheel_metadata.get('Wheel-Version'))
|
||||
wheel_v1 = (
|
||||
parse_version('1.0') <= wheel_version < parse_version('2.0dev0')
|
||||
)
|
||||
wheel_v1 = parse_version('1.0') <= wheel_version < parse_version('2.0dev0')
|
||||
if not wheel_v1:
|
||||
raise ValueError(
|
||||
'unsupported wheel format version: %s' % wheel_version)
|
||||
raise ValueError('unsupported wheel format version: %s' % wheel_version)
|
||||
# Extract to target directory.
|
||||
os.mkdir(destination_eggdir)
|
||||
zf.extractall(destination_eggdir)
|
||||
_unpack_zipfile_obj(zf, destination_eggdir)
|
||||
# Convert metadata.
|
||||
dist_info = os.path.join(destination_eggdir, dist_info)
|
||||
dist = pkg_resources.Distribution.from_location(
|
||||
destination_eggdir, dist_info,
|
||||
destination_eggdir,
|
||||
dist_info,
|
||||
metadata=pkg_resources.PathMetadata(destination_eggdir, dist_info),
|
||||
)
|
||||
|
||||
|
@ -143,13 +160,14 @@ class Wheel:
|
|||
def raw_req(req):
|
||||
req.marker = None
|
||||
return str(req)
|
||||
install_requires = list(sorted(map(raw_req, dist.requires())))
|
||||
|
||||
install_requires = list(map(raw_req, dist.requires()))
|
||||
extras_require = {
|
||||
extra: sorted(
|
||||
extra: [
|
||||
req
|
||||
for req in map(raw_req, dist.requires((extra,)))
|
||||
if req not in install_requires
|
||||
)
|
||||
]
|
||||
for extra in dist.extras
|
||||
}
|
||||
os.rename(dist_info, egg_info)
|
||||
|
@ -163,17 +181,12 @@ class Wheel:
|
|||
extras_require=extras_require,
|
||||
),
|
||||
)
|
||||
# Temporarily disable info traces.
|
||||
log_threshold = log._global_log.threshold
|
||||
log.set_threshold(log.WARN)
|
||||
try:
|
||||
with disable_info_traces():
|
||||
write_requirements(
|
||||
setup_dist.get_command_obj('egg_info'),
|
||||
None,
|
||||
os.path.join(egg_info, 'requires.txt'),
|
||||
)
|
||||
finally:
|
||||
log.set_threshold(log_threshold)
|
||||
|
||||
@staticmethod
|
||||
def _move_data_entries(destination_eggdir, dist_data):
|
||||
|
@ -181,8 +194,7 @@ class Wheel:
|
|||
dist_data = os.path.join(destination_eggdir, dist_data)
|
||||
dist_data_scripts = os.path.join(dist_data, 'scripts')
|
||||
if os.path.exists(dist_data_scripts):
|
||||
egg_info_scripts = os.path.join(
|
||||
destination_eggdir, 'EGG-INFO', 'scripts')
|
||||
egg_info_scripts = os.path.join(destination_eggdir, 'EGG-INFO', 'scripts')
|
||||
os.mkdir(egg_info_scripts)
|
||||
for entry in os.listdir(dist_data_scripts):
|
||||
# Remove bytecode, as it's not properly handled
|
||||
|
@ -195,18 +207,20 @@ class Wheel:
|
|||
os.path.join(egg_info_scripts, entry),
|
||||
)
|
||||
os.rmdir(dist_data_scripts)
|
||||
for subdir in filter(os.path.exists, (
|
||||
os.path.join(dist_data, d)
|
||||
for d in ('data', 'headers', 'purelib', 'platlib')
|
||||
)):
|
||||
for subdir in filter(
|
||||
os.path.exists,
|
||||
(
|
||||
os.path.join(dist_data, d)
|
||||
for d in ('data', 'headers', 'purelib', 'platlib')
|
||||
),
|
||||
):
|
||||
unpack(subdir, destination_eggdir)
|
||||
if os.path.exists(dist_data):
|
||||
os.rmdir(dist_data)
|
||||
|
||||
@staticmethod
|
||||
def _fix_namespace_packages(egg_info, destination_eggdir):
|
||||
namespace_packages = os.path.join(
|
||||
egg_info, 'namespace_packages.txt')
|
||||
namespace_packages = os.path.join(egg_info, 'namespace_packages.txt')
|
||||
if os.path.exists(namespace_packages):
|
||||
with open(namespace_packages) as fp:
|
||||
namespace_packages = fp.read().split()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue