From 739d918f4e336af7537cc033f2411d622236059b Mon Sep 17 00:00:00 2001 From: natsukium Date: Fri, 28 Jul 2023 12:28:45 +0900 Subject: [PATCH] python311Packages.sopel: fix build --- .../python-modules/sopel/default.nix | 7 ++ .../sopel/python311-support.patch | 96 +++++++++++++++++++ 2 files changed, 103 insertions(+) create mode 100644 pkgs/development/python-modules/sopel/python311-support.patch diff --git a/pkgs/development/python-modules/sopel/default.nix b/pkgs/development/python-modules/sopel/default.nix index bd7efca27e6..93b942811c3 100644 --- a/pkgs/development/python-modules/sopel/default.nix +++ b/pkgs/development/python-modules/sopel/default.nix @@ -27,6 +27,13 @@ buildPythonPackage rec { hash = "sha256-IJ+ovLQv6/UU1oepmUQjzaWBG3Rdd3xvui7FjK85Urs="; }; + patches = [ + # https://github.com/sopel-irc/sopel/issues/2401 + # https://github.com/sopel-irc/sopel/commit/596adc44330939519784389cbb927435305ef758.patch + # rewrite the patch because there are too many patches needed to apply the above patch. + ./python311-support.patch + ]; + propagatedBuildInputs = [ dnspython geoip2 diff --git a/pkgs/development/python-modules/sopel/python311-support.patch b/pkgs/development/python-modules/sopel/python311-support.patch new file mode 100644 index 00000000000..dfa0283409a --- /dev/null +++ b/pkgs/development/python-modules/sopel/python311-support.patch @@ -0,0 +1,96 @@ +diff --git a/sopel/plugins/handlers.py b/sopel/plugins/handlers.py +index 76902aa0..05f0279d 100644 +--- a/sopel/plugins/handlers.py ++++ b/sopel/plugins/handlers.py +@@ -46,20 +46,15 @@ from __future__ import absolute_import, division, print_function, unicode_litera + + import imp + import importlib ++import importlib.util + import inspect + import itertools + import os ++import sys + + from sopel import loader + from . import exceptions + +-try: +- reload = importlib.reload +-except AttributeError: +- # py2: no reload function +- # TODO: imp is deprecated, to be removed when py2 support is dropped +- reload = imp.reload +- + + class AbstractPluginHandler(object): + """Base class for plugin handlers. +@@ -301,7 +296,7 @@ class PyModulePlugin(AbstractPluginHandler): + + This method assumes the plugin is already loaded. + """ +- self._module = reload(self._module) ++ self._module = importlib.reload(self._module) + + def is_loaded(self): + return self._module is not None +@@ -402,45 +397,31 @@ class PyFilePlugin(PyModulePlugin): + + if good_file: + name = os.path.basename(filename)[:-3] +- module_type = imp.PY_SOURCE ++ spec = importlib.util.spec_from_file_location( ++ name, ++ filename, ++ ) + elif good_dir: + name = os.path.basename(filename) +- module_type = imp.PKG_DIRECTORY ++ spec = importlib.util.spec_from_file_location( ++ name, ++ os.path.join(filename, '__init__.py'), ++ submodule_search_locations=filename, ++ ) + else: + raise exceptions.PluginError('Invalid Sopel plugin: %s' % filename) + + self.filename = filename + self.path = filename +- self.module_type = module_type ++ self.module_spec = spec + + super(PyFilePlugin, self).__init__(name) + + def _load(self): +- # The current implementation uses `imp.load_module` to perform the +- # load action, which also reloads the module. However, `imp` is +- # deprecated in Python 3, so that might need to be changed when the +- # support for Python 2 is dropped. +- # +- # However, the solution for Python 3 is non-trivial, since the +- # `importlib` built-in module does not have a similar function, +- # therefore requires to dive into its public internals +- # (``importlib.machinery`` and ``importlib.util``). +- # +- # All of that is doable, but represents a lot of work. As long as +- # Python 2 is supported, we can keep it for now. +- # +- # TODO: switch to ``importlib`` when Python2 support is dropped. +- if self.module_type == imp.PY_SOURCE: +- with open(self.path) as mod: +- description = ('.py', 'U', self.module_type) +- mod = imp.load_module(self.name, mod, self.path, description) +- elif self.module_type == imp.PKG_DIRECTORY: +- description = ('', '', self.module_type) +- mod = imp.load_module(self.name, None, self.path, description) +- else: +- raise TypeError('Unsupported module type') +- +- return mod ++ module = importlib.util.module_from_spec(self.module_spec) ++ sys.modules[self.name] = module ++ self.module_spec.loader.exec_module(module) ++ return module + + def get_meta_description(self): + """Retrieve a meta description for the plugin.