No longer rely on pkg_resources

Signed-off-by: Katharina Dröge <kate@commandmc.de>
This commit is contained in:
Katharina Dröge
2025-09-24 21:52:02 +02:00
parent bc8b96d956
commit adab25986f
6 changed files with 13 additions and 46 deletions

View File

@@ -298,24 +298,8 @@ The available plugins can be listed with `whipper cd rip -h`. Specify a logger t
whipper cd rip -L eac whipper cd rip -L eac
``` ```
Whipper searches for logger plugins in the following paths: Whipper searches for logger plugins using `importlib.metadata.entry_points`, meaning any package visible to the Python
interpreter exporting a `whipper.logger` entry point will be loaded.
- `$XDG_DATA_HOME/whipper/plugins`
- Paths returned by the following Python instruction:
`[x + '/whipper/plugins' for x in site.getsitepackages()]`
- If whipper is run in a `virtualenv`, it will use these alternative instructions (from `distutils.sysconfig`):
- `get_python_lib(plat_specific=False, standard_lib=False, prefix='/usr/local') + '/whipper/plugins'`
- `get_python_lib(plat_specific=False, standard_lib=False) + '/whipper/plugins'`
On a default Debian/Ubuntu installation, the following paths are searched by whipper:
- `$HOME/.local/share/whipper/plugins`
- `/usr/local/lib/python3.X/dist-packages/whipper/plugins`
- `/usr/lib/python3.X/dist-packages/whipper/plugins`
Where `X` stands for the minor version of the Python 3 release available on the system.
Please note that locally installed logger plugins won't be recognized when whipper has been installed through the official Docker image. Please note that locally installed logger plugins won't be recognized when whipper has been installed through the official Docker image.

View File

@@ -4,3 +4,4 @@ pycdio>0.20
ruamel.yaml ruamel.yaml
setuptools_scm setuptools_scm
discid discid
packaging

View File

@@ -2,11 +2,11 @@ import logging
import os import os
import sys import sys
from pkg_resources import (get_distribution, from importlib.metadata import version, PackageNotFoundError
DistributionNotFound, RequirementParseError)
try: try:
__version__ = get_distribution(__name__).version __version__ = version('whipper')
except (DistributionNotFound, RequirementParseError): except PackageNotFoundError:
# not installed as package or is being run from source/git checkout # not installed as package or is being run from source/git checkout
from setuptools_scm import get_version from setuptools_scm import get_version
__version__ = get_version() __version__ = get_version()

View File

@@ -3,14 +3,11 @@
import os import os
import sys import sys
import pkg_resources
import musicbrainzngs import musicbrainzngs
import site
import whipper import whipper
from distutils.sysconfig import get_python_lib
from whipper.command import cd, offset, drive, image, accurip, mblookup from whipper.command import cd, offset, drive, image, accurip, mblookup
from whipper.command.basecommand import BaseCommand from whipper.command.basecommand import BaseCommand
from whipper.common import common, directory, config from whipper.common import common, config
from whipper.extern.task import task from whipper.extern.task import task
from whipper.program.utils import eject_device from whipper.program.utils import eject_device
@@ -35,22 +32,6 @@ def main():
"to make it work in whipper.", server['netloc']) "to make it work in whipper.", server['netloc'])
musicbrainzngs.set_hostname(server['netloc']) musicbrainzngs.set_hostname(server['netloc'])
# Find whipper's plugins paths (local paths have higher priority)
plugins_p = [directory.data_path('plugins')] # local path (in $HOME)
if hasattr(sys, 'real_prefix'): # no getsitepackages() in virtualenv
plugins_p.append(
get_python_lib(plat_specific=False, standard_lib=False,
prefix='/usr/local') + '/whipper/plugins')
plugins_p.append(get_python_lib(plat_specific=False,
standard_lib=False) + '/whipper/plugins')
else:
plugins_p += [x + '/whipper/plugins' for x in site.getsitepackages()]
# register plugins with pkg_resources
distributions, _ = pkg_resources.working_set.find_plugins(
pkg_resources.Environment(plugins_p)
)
list(map(pkg_resources.working_set.add, distributions))
try: try:
cmd = Whipper(sys.argv[1:], os.path.basename(sys.argv[0]), None) cmd = Whipper(sys.argv[1:], os.path.basename(sys.argv[0]), None)
ret = cmd.do() ret = cmd.do()

View File

@@ -27,6 +27,8 @@ import shutil
import time import time
from tempfile import NamedTemporaryFile from tempfile import NamedTemporaryFile
from packaging.version import Version
from whipper.common import accurip, checksum, common, mbngs, path from whipper.common import accurip, checksum, common, mbngs, path
from whipper.program import cdrdao, cdparanoia from whipper.program import cdrdao, cdparanoia
from whipper.result import result from whipper.result import result
@@ -99,9 +101,8 @@ class Program:
Also warn about buggy cdrdao versions. Also warn about buggy cdrdao versions.
""" """
from pkg_resources import parse_version as V
version = cdrdao.version() version = cdrdao.version()
if V(version) < V('1.2.3rc2'): if Version(version) < Version('1.2.3rc2'):
logger.warning('cdrdao older than 1.2.3 has a pre-gap length bug.' logger.warning('cdrdao older than 1.2.3 has a pre-gap length bug.'
' See http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=102171') # noqa: E501 ' See http://sourceforge.net/tracker/?func=detail&aid=604751&group_id=2171&atid=102171') # noqa: E501

View File

@@ -18,7 +18,7 @@
# You should have received a copy of the GNU General Public License # You should have received a copy of the GNU General Public License
# along with whipper. If not, see <http://www.gnu.org/licenses/>. # along with whipper. If not, see <http://www.gnu.org/licenses/>.
import pkg_resources from importlib.metadata import entry_points
import time import time
@@ -157,7 +157,7 @@ def getLoggers():
""" """
d = {} d = {}
pluggables = list(pkg_resources.iter_entry_points("whipper.logger")) pluggables = list(entry_points(group="whipper.logger"))
for entrypoint in [EntryPoint(), ] + pluggables: for entrypoint in [EntryPoint(), ] + pluggables:
plugin_class = entrypoint.load() plugin_class = entrypoint.load()
d[entrypoint.name] = plugin_class d[entrypoint.name] = plugin_class