Added experimental Python 3.13 compatibility. #2803

This commit is contained in:
morpheus65535 2025-04-11 13:05:18 -04:00
parent 4642db334a
commit 759da8a111
2 changed files with 37 additions and 9 deletions

View file

@ -3,7 +3,22 @@
import os
import argparse
from distutils.util import strtobool
def strtobool(val):
"""Convert a string representation of truth to true (1) or false (0).
True values are 'y', 'yes', 't', 'true', 'on', and '1'; false values
are 'n', 'no', 'f', 'false', 'off', and '0'. Raises ValueError if
'val' is anything else.
"""
val = val.lower()
if val in ('y', 'yes', 't', 'true', 'on', '1'):
return 1
elif val in ('n', 'no', 'f', 'false', 'off', '0'):
return 0
else:
raise ValueError(f"invalid truth value {val!r}")
no_update = os.environ.get("NO_UPDATE", "false").strip() == "true"
no_cli = os.environ.get("NO_CLI", "false").strip() == "true"

View file

@ -1,6 +1,8 @@
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from pkg_resources import EntryPoint
import re
from importlib.metadata import EntryPoint
from stevedore import ExtensionManager
@ -26,23 +28,23 @@ class RegistrableExtensionManager(ExtensionManager):
self.registered_extensions = []
#: Internal extensions with entry point syntax
self.internal_extensions = internal_extensions
self.internal_extensions = list(internal_extensions)
super(RegistrableExtensionManager, self).__init__(namespace, **kwargs)
super().__init__(namespace, **kwargs)
def list_entry_points(self):
# copy of default extensions
eps = list(super(RegistrableExtensionManager, self).list_entry_points())
eps = list(super().list_entry_points())
# internal extensions
for iep in self.internal_extensions:
ep = EntryPoint.parse(iep)
ep = parse_entry_point(iep, self.namespace)
if ep.name not in [e.name for e in eps]:
eps.append(ep)
# registered extensions
for rep in self.registered_extensions:
ep = EntryPoint.parse(rep)
ep = parse_entry_point(rep, self.namespace)
if ep.name not in [e.name for e in eps]:
eps.append(ep)
@ -58,7 +60,7 @@ class RegistrableExtensionManager(ExtensionManager):
if entry_point in self.registered_extensions:
raise ValueError('Extension already registered')
ep = EntryPoint.parse(entry_point)
ep = parse_entry_point(entry_point, self.namespace)
if ep.name in self.names():
raise ValueError('An extension with the same name already exist')
@ -77,7 +79,7 @@ class RegistrableExtensionManager(ExtensionManager):
if entry_point not in self.registered_extensions:
raise ValueError('Extension not registered')
ep = EntryPoint.parse(entry_point)
ep = parse_entry_point(entry_point, self.namespace)
self.registered_extensions.remove(entry_point)
if self._extensions_by_name is not None:
del self._extensions_by_name[ep.name]
@ -87,6 +89,17 @@ class RegistrableExtensionManager(ExtensionManager):
break
def parse_entry_point(src: str, group: str) -> EntryPoint:
"""Parse a string entry point."""
pattern = re.compile(r'\s*(?P<name>.+?)\s*=\s*(?P<value>.+)')
m = pattern.match(src)
if not m:
msg = "EntryPoint must be in the 'name = module:attrs' format"
raise ValueError(msg, src)
res = m.groupdict()
return EntryPoint(res['name'], res['value'], group)
#: Provider manager
provider_manager = RegistrableExtensionManager('subliminal.providers', [
'addic7ed = subliminal.providers.addic7ed:Addic7edProvider',