Skip to content

Commit

Permalink
Add Python 3.12 and fix Radarr handling (#1989)
Browse files Browse the repository at this point in the history
* Added Python3.12 and future 3.13

* Fix Radarr result handling

* remove py2.7 and py3.7 support
  • Loading branch information
clinton-hall authored Feb 28, 2024
1 parent b802aca commit f98d6ff
Show file tree
Hide file tree
Showing 173 changed files with 17,503 additions and 21,006 deletions.
2 changes: 1 addition & 1 deletion .bumpversion.cfg
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[bumpversion]
current_version = 12.1.12
current_version = 12.1.13
commit = True
tag = False

Expand Down
8 changes: 5 additions & 3 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@ jobs:
vmImage: 'Ubuntu-latest'
strategy:
matrix:
Python37:
python.version: '3.7'
Python38:
python.version: '3.8'
Python39:
Expand All @@ -23,6 +21,8 @@ jobs:
python.version: '3.10'
Python311:
python.version: '3.11'
Python312:
python.version: '3.12'
maxParallel: 3

steps:
Expand Down Expand Up @@ -68,5 +68,7 @@ jobs:
versionSpec: '3.x'
architecture: 'x64'

- script: python setup.py sdist
- script: |
python -m pip install setuptools
python setup.py sdist
displayName: 'Build sdist'
2 changes: 1 addition & 1 deletion core/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@
wake_up,
)

__version__ = '12.1.12'
__version__ = '12.1.13'

# Client Agents
NZB_CLIENTS = ['sabnzbd', 'nzbget', 'manual']
Expand Down
5 changes: 4 additions & 1 deletion core/auto_process/movies.py
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,10 @@ def process(section, dir_name, input_name=None, status=0, client_agent='manual',
)
elif section == 'Radarr':
try:
scan_id = int(result['id'])
if isinstance(result, list):
scan_id = int(result[0]['id'])
else:
scan_id = int(result['id'])
logger.debug('Scan started with id: {0}'.format(scan_id), section)
except Exception as e:
logger.warning('No scan id was returned due to: {0}'.format(e), section)
Expand Down
4 changes: 3 additions & 1 deletion eol.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ def date(string, fmt='%Y-%m-%d'):
# https://devguide.python.org/
# https://devguide.python.org/devcycle/#devcycle
PYTHON_EOL = {
(3, 13): date('2029-10-1'),
(3, 12): date('2028-10-1'),
(3, 11): date('2027-10-1'),
(3, 10): date('2026-10-01'),
(3, 9): date('2025-10-05'),
Expand Down Expand Up @@ -99,7 +101,7 @@ def check(version=None, grace_period=0):
:return: None
"""
try:
warn_for_status(version, grace_period)
raise_for_status(version, grace_period)
except LifetimeError as error:
print('Please use a newer version of Python.')
print_statuses()
Expand Down
1 change: 1 addition & 0 deletions libs/common/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

17 changes: 17 additions & 0 deletions libs/common/importlib_resources/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""Read resources contained within a package."""

from ._common import (
as_file,
files,
Package,
)

from .abc import ResourceReader


__all__ = [
'Package',
'ResourceReader',
'as_file',
'files',
]
168 changes: 168 additions & 0 deletions libs/common/importlib_resources/_adapters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
from contextlib import suppress
from io import TextIOWrapper

from . import abc


class SpecLoaderAdapter:
"""
Adapt a package spec to adapt the underlying loader.
"""

def __init__(self, spec, adapter=lambda spec: spec.loader):
self.spec = spec
self.loader = adapter(spec)

def __getattr__(self, name):
return getattr(self.spec, name)


class TraversableResourcesLoader:
"""
Adapt a loader to provide TraversableResources.
"""

def __init__(self, spec):
self.spec = spec

def get_resource_reader(self, name):
return CompatibilityFiles(self.spec)._native()


def _io_wrapper(file, mode='r', *args, **kwargs):
if mode == 'r':
return TextIOWrapper(file, *args, **kwargs)
elif mode == 'rb':
return file
raise ValueError(f"Invalid mode value '{mode}', only 'r' and 'rb' are supported")


class CompatibilityFiles:
"""
Adapter for an existing or non-existent resource reader
to provide a compatibility .files().
"""

class SpecPath(abc.Traversable):
"""
Path tied to a module spec.
Can be read and exposes the resource reader children.
"""

def __init__(self, spec, reader):
self._spec = spec
self._reader = reader

def iterdir(self):
if not self._reader:
return iter(())
return iter(
CompatibilityFiles.ChildPath(self._reader, path)
for path in self._reader.contents()
)

def is_file(self):
return False

is_dir = is_file

def joinpath(self, other):
if not self._reader:
return CompatibilityFiles.OrphanPath(other)
return CompatibilityFiles.ChildPath(self._reader, other)

@property
def name(self):
return self._spec.name

def open(self, mode='r', *args, **kwargs):
return _io_wrapper(self._reader.open_resource(None), mode, *args, **kwargs)

class ChildPath(abc.Traversable):
"""
Path tied to a resource reader child.
Can be read but doesn't expose any meaningful children.
"""

def __init__(self, reader, name):
self._reader = reader
self._name = name

def iterdir(self):
return iter(())

def is_file(self):
return self._reader.is_resource(self.name)

def is_dir(self):
return not self.is_file()

def joinpath(self, other):
return CompatibilityFiles.OrphanPath(self.name, other)

@property
def name(self):
return self._name

def open(self, mode='r', *args, **kwargs):
return _io_wrapper(
self._reader.open_resource(self.name), mode, *args, **kwargs
)

class OrphanPath(abc.Traversable):
"""
Orphan path, not tied to a module spec or resource reader.
Can't be read and doesn't expose any meaningful children.
"""

def __init__(self, *path_parts):
if len(path_parts) < 1:
raise ValueError('Need at least one path part to construct a path')
self._path = path_parts

def iterdir(self):
return iter(())

def is_file(self):
return False

is_dir = is_file

def joinpath(self, other):
return CompatibilityFiles.OrphanPath(*self._path, other)

@property
def name(self):
return self._path[-1]

def open(self, mode='r', *args, **kwargs):
raise FileNotFoundError("Can't open orphan path")

def __init__(self, spec):
self.spec = spec

@property
def _reader(self):
with suppress(AttributeError):
return self.spec.loader.get_resource_reader(self.spec.name)

def _native(self):
"""
Return the native reader if it supports files().
"""
reader = self._reader
return reader if hasattr(reader, 'files') else self

def __getattr__(self, attr):
return getattr(self._reader, attr)

def files(self):
return CompatibilityFiles.SpecPath(self.spec, self._reader)


def wrap_spec(package):
"""
Construct a package spec with traversable compatibility
on the spec/loader/reader.
"""
return SpecLoaderAdapter(package.__spec__, TraversableResourcesLoader)
Loading

0 comments on commit f98d6ff

Please sign in to comment.