git: c6b11c8202d1 - main - sysutils/py-mitogen: update to 0.3.2

From: Dave Cottlehuber <dch_at_FreeBSD.org>
Date: Tue, 24 May 2022 13:17:14 UTC
The branch main has been updated by dch:

URL: https://cgit.FreeBSD.org/ports/commit/?id=c6b11c8202d18d5327584d6f2f1338a8e82b5419

commit c6b11c8202d18d5327584d6f2f1338a8e82b5419
Author:     Dave Cottlehuber <dch@FreeBSD.org>
AuthorDate: 2022-05-24 13:16:23 +0000
Commit:     Dave Cottlehuber <dch@FreeBSD.org>
CommitDate: 2022-05-24 13:16:54 +0000

    sysutils/py-mitogen: update to 0.3.2
    
    This drops ansible 2.x compatibility as upstream ansible version
    is also no longer supported. Includes backported fix for #906,
    which breaks mitogen if py-distro is also installed.
    
    https://github.com/mitogen-hq/mitogen/issues/906
    
    Sponsored by:   SkunkWerks, GmbH
---
 sysutils/py-mitogen/Makefile                      |   5 +-
 sysutils/py-mitogen/distinfo                      |   8 +-
 sysutils/py-mitogen/files/patch-mitogen_core.py   |  32 ++++
 sysutils/py-mitogen/files/patch-mitogen_master.py | 214 ++++++++++++++++++++++
 4 files changed, 255 insertions(+), 4 deletions(-)

diff --git a/sysutils/py-mitogen/Makefile b/sysutils/py-mitogen/Makefile
index 692e82bdf5ae..258ba5b37a29 100644
--- a/sysutils/py-mitogen/Makefile
+++ b/sysutils/py-mitogen/Makefile
@@ -1,9 +1,12 @@
 PORTNAME=	mitogen
-DISTVERSION=	0.2.9
+DISTVERSION=	0.3.2
 CATEGORIES=	sysutils python
 MASTER_SITES=	CHEESESHOP
 PKGNAMEPREFIX=	${PYTHON_PKGNAMEPREFIX}
 
+# PATCH_SITES=	https://github.com/mitogen-hq/${PORTNAME}/pull/
+# PATCHFILES+=	913.patch:-p1 # https://github.com/mitogen-hq/mitogen/pull/913.patch
+
 MAINTAINER=	dch@FreeBSD.org
 COMMENT=	Ansible accelerator & python library for writing distributed programs
 
diff --git a/sysutils/py-mitogen/distinfo b/sysutils/py-mitogen/distinfo
index 643135251318..d34920fb5b9e 100644
--- a/sysutils/py-mitogen/distinfo
+++ b/sysutils/py-mitogen/distinfo
@@ -1,3 +1,5 @@
-TIMESTAMP = 1587412579
-SHA256 (mitogen-0.2.9.tar.gz) = 76cb9afef92596818a4639afb2a0bb0384ce7b6699b353af55662057b08b1e57
-SIZE (mitogen-0.2.9.tar.gz) = 210868
+TIMESTAMP = 1653396026
+SHA256 (mitogen-0.3.2.tar.gz) = 49e1e391cb4fa3627e290fea656a3c38cce990778137f013291d7e7085304c3d
+SIZE (mitogen-0.3.2.tar.gz) = 218661
+SHA256 (913.patch) = 29e678a1eb6fbea615b25f3114f17cd5504ae2a11bb691124bef253ca2e9ba98
+SIZE (913.patch) = 16016
diff --git a/sysutils/py-mitogen/files/patch-mitogen_core.py b/sysutils/py-mitogen/files/patch-mitogen_core.py
new file mode 100644
index 000000000000..66abd739671b
--- /dev/null
+++ b/sysutils/py-mitogen/files/patch-mitogen_core.py
@@ -0,0 +1,32 @@
+--- mitogen/core.py.orig	2022-01-12 07:45:19 UTC
++++ mitogen/core.py
+@@ -1357,6 +1357,16 @@ class Importer(object):
+             fp.close()
+ 
+     def find_module(self, fullname, path=None):
++        """
++        Return a loader (ourself) or None, for the module with fullname.
++
++        Implements importlib.abc.MetaPathFinder.find_module().
++        Deprecrated in Python 3.4+, replaced by find_spec().
++        Raises ImportWarning in Python 3.10+.
++
++        fullname    A (fully qualified?) module name, e.g. "os.path".
++        path        __path__ of parent packge. None for a top level module.
++        """
+         if hasattr(_tls, 'running'):
+             return None
+ 
+@@ -1478,6 +1488,12 @@ class Importer(object):
+             callback()
+ 
+     def load_module(self, fullname):
++        """
++        Return the loaded module specified by fullname.
++
++        Implements importlib.abc.Loader.load_module().
++        Deprecated in Python 3.4+, replaced by create_module() & exec_module().
++        """
+         fullname = to_text(fullname)
+         _v and self._log.debug('requesting %s', fullname)
+         self._refuse_imports(fullname)
diff --git a/sysutils/py-mitogen/files/patch-mitogen_master.py b/sysutils/py-mitogen/files/patch-mitogen_master.py
new file mode 100644
index 000000000000..6e669e792c55
--- /dev/null
+++ b/sysutils/py-mitogen/files/patch-mitogen_master.py
@@ -0,0 +1,214 @@
+--- mitogen/master.py.orig	2022-01-12 07:45:19 UTC
++++ mitogen/master.py
+@@ -122,6 +122,13 @@ def is_stdlib_name(modname):
+     """
+     Return :data:`True` if `modname` appears to come from the standard library.
+     """
++    # `imp.is_builtin()` isn't a documented as part of Python's stdlib API.
++    #
++    # """
++    # Main is a little special - imp.is_builtin("__main__") will return False,
++    # but BuiltinImporter is still the most appropriate initial setting for
++    # its __loader__ attribute.
++    # """ -- comment in CPython pylifecycle.c:add_main_module()
+     if imp.is_builtin(modname) != 0:
+         return True
+ 
+@@ -512,42 +519,57 @@ class PkgutilMethod(FinderMethod):
+         Find `fullname` using :func:`pkgutil.find_loader`.
+         """
+         try:
++            # If fullname refers to a submodule that's not already imported
++            # then the containing package is imported.
+             # Pre-'import spec' this returned None, in Python3.6 it raises
+             # ImportError.
+             loader = pkgutil.find_loader(fullname)
+         except ImportError:
+             e = sys.exc_info()[1]
+-            LOG.debug('%r._get_module_via_pkgutil(%r): %s',
+-                      self, fullname, e)
++            LOG.debug('%r: find_loader(%r) failed: %s', self, fullname, e)
+             return None
+ 
+-        IOLOG.debug('%r._get_module_via_pkgutil(%r) -> %r',
+-                    self, fullname, loader)
+         if not loader:
++            LOG.debug('%r: find_loader(%r) returned %r, aborting',
++                      self, fullname, loader)
+             return
+ 
+         try:
+-            path, is_special = _py_filename(loader.get_filename(fullname))
+-            source = loader.get_source(fullname)
+-            is_pkg = loader.is_package(fullname)
+-
+-            # workaround for special python modules that might only exist in memory
+-            if is_special and is_pkg and not source:
+-                source = '\n'
++            path = loader.get_filename(fullname)
+         except (AttributeError, ImportError):
+-            # - Per PEP-302, get_source() and is_package() are optional,
+-            #   calling them may throw AttributeError.
+             # - get_filename() may throw ImportError if pkgutil.find_loader()
+             #   picks a "parent" package's loader for some crap that's been
+             #   stuffed in sys.modules, for example in the case of urllib3:
+             #       "loader for urllib3.contrib.pyopenssl cannot handle
+             #        requests.packages.urllib3.contrib.pyopenssl"
+             e = sys.exc_info()[1]
+-            LOG.debug('%r: loading %r using %r failed: %s',
+-                      self, fullname, loader, e)
++            LOG.debug('%r: %r.get_file_name(%r) failed: %r', self, loader, fullname, e)
+             return
+ 
++        path, is_special = _py_filename(path)
++
++        try:
++            source = loader.get_source(fullname)
++        except AttributeError:
++            # Per PEP-302, get_source() is optional,
++            e = sys.exc_info()[1]
++            LOG.debug('%r: %r.get_source() failed: %r', self, loader, fullname, e)
++            return
++
++        try:
++            is_pkg = loader.is_package(fullname)
++        except AttributeError:
++            # Per PEP-302, is_package() is optional,
++            e = sys.exc_info()[1]
++            LOG.debug('%r: %r.is_package(%r) failed: %r', self, loader, fullname, e)
++            return
++
++        # workaround for special python modules that might only exist in memory
++        if is_special and is_pkg and not source:
++            source = '\n'
++
+         if path is None or source is None:
++            LOG.debug('%r: path=%r, source=%r, aborting', self, path, source)
+             return
+ 
+         if isinstance(source, mitogen.core.UnicodeType):
+@@ -567,23 +589,37 @@ class SysModulesMethod(FinderMethod):
+         """
+         Find `fullname` using its :data:`__file__` attribute.
+         """
+-        module = sys.modules.get(fullname)
++        try:
++            module = sys.modules[fullname]
++        except KeyError:
++            LOG.debug('%r: sys.modules[%r] absent, aborting', self, fullname)
++            return
++
+         if not isinstance(module, types.ModuleType):
+-            LOG.debug('%r: sys.modules[%r] absent or not a regular module',
+-                      self, fullname)
++            LOG.debug('%r: sys.modules[%r] is %r, aborting',
++                      self, fullname, module)
+             return
+ 
+-        LOG.debug('_get_module_via_sys_modules(%r) -> %r', fullname, module)
+-        alleged_name = getattr(module, '__name__', None)
+-        if alleged_name != fullname:
+-            LOG.debug('sys.modules[%r].__name__ is incorrect, assuming '
+-                      'this is a hacky module alias and ignoring it. '
+-                      'Got %r, module object: %r',
+-                      fullname, alleged_name, module)
++        try:
++            resolved_name = module.__name__
++        except AttributeError:
++            LOG.debug('%r: %r has no __name__, aborting', self, module)
+             return
+ 
+-        path, _ = _py_filename(getattr(module, '__file__', ''))
++        if resolved_name != fullname:
++            LOG.debug('%r: %r.__name__ is %r, aborting',
++                      self, module, resolved_name)
++            return
++
++        try:
++            path = module.__file__
++        except AttributeError:
++            LOG.debug('%r: %r has no __file__, aborting', self, module)
++            return
++
++        path, _ = _py_filename(path)
+         if not path:
++            LOG.debug('%r: %r.__file__ is %r, aborting', self, module, path)
+             return
+ 
+         LOG.debug('%r: sys.modules[%r]: found %s', self, fullname, path)
+@@ -628,10 +664,24 @@ class ParentEnumerationMethod(FinderMethod):
+     module object or any parent package's :data:`__path__`, since they have all
+     been overwritten. Some men just want to watch the world burn.
+     """
++
++    @staticmethod
++    def _iter_parents(fullname):
++        """
++        >>> list(ParentEnumerationMethod._iter_parents('a'))
++        [('', 'a')]
++        >>> list(ParentEnumerationMethod._iter_parents('a.b.c'))
++        [('a.b', 'c'), ('a', 'b'), ('', 'a')]
++        """
++        while fullname:
++            fullname, _, modname = str_rpartition(fullname, u'.')
++            yield fullname, modname
++
+     def _find_sane_parent(self, fullname):
+         """
+         Iteratively search :data:`sys.modules` for the least indirect parent of
+-        `fullname` that is loaded and contains a :data:`__path__` attribute.
++        `fullname` that's from the same package and has a :data:`__path__`
++        attribute.
+ 
+         :return:
+             `(parent_name, path, modpath)` tuple, where:
+@@ -644,21 +694,40 @@ class ParentEnumerationMethod(FinderMethod):
+                 * `modpath`: list of module name components leading from `path`
+                    to the target module.
+         """
+-        path = None
+         modpath = []
+-        while True:
+-            pkgname, _, modname = str_rpartition(to_text(fullname), u'.')
++        for pkgname, modname in self._iter_parents(fullname):
+             modpath.insert(0, modname)
+             if not pkgname:
+                 return [], None, modpath
+ 
+-            pkg = sys.modules.get(pkgname)
+-            path = getattr(pkg, '__path__', None)
+-            if pkg and path:
+-                return pkgname.split('.'), path, modpath
++            try:
++                pkg = sys.modules[pkgname]
++            except KeyError:
++                LOG.debug('%r: sys.modules[%r] absent, skipping', self, pkgname)
++                continue
+ 
+-            LOG.debug('%r: %r lacks __path__ attribute', self, pkgname)
+-            fullname = pkgname
++            try:
++                resolved_pkgname = pkg.__name__
++            except AttributeError:
++                LOG.debug('%r: %r has no __name__, skipping', self, pkg)
++                continue
++
++            if resolved_pkgname != pkgname:
++                LOG.debug('%r: %r.__name__ is %r, skipping',
++                          self, pkg, resolved_pkgname)
++                continue
++
++            try:
++                path = pkg.__path__
++            except AttributeError:
++                LOG.debug('%r: %r has no __path__, skipping', self, pkg)
++                continue
++
++            if not path:
++                LOG.debug('%r: %r.__path__ is %r, skipping', self, pkg, path)
++                continue
++
++            return pkgname.split('.'), path, modpath
+ 
+     def _found_package(self, fullname, path):
+         path = os.path.join(path, '__init__.py')