commit:     e1922b7f8cc9249823a0d99319d9fd1ce230aa6c
Author:     Julien Roy <julien <AT> jroy <DOT> ca>
AuthorDate: Tue May 14 23:42:26 2024 +0000
Commit:     Julien Roy <julien <AT> jroy <DOT> ca>
CommitDate: Wed May 15 00:44:43 2024 +0000
URL:        https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=e1922b7f

dev-python/oscrypto: enable py3.12

fix build on dev-libs/openssl-3.0.10

Closes: https://bugs.gentoo.org/931393
Signed-off-by: Julien Roy <julien <AT> jroy.ca>

 dev-python/oscrypto/files/openssl-3.0.10-fix.patch |  38 +
 dev-python/oscrypto/files/py3.12.patch             | 902 +++++++++++++++++++++
 ...to-1.3.0-r1.ebuild => oscrypto-1.3.0-r2.ebuild} |   7 +-
 3 files changed, 946 insertions(+), 1 deletion(-)

diff --git a/dev-python/oscrypto/files/openssl-3.0.10-fix.patch 
b/dev-python/oscrypto/files/openssl-3.0.10-fix.patch
new file mode 100644
index 0000000000..a1c2e44c41
--- /dev/null
+++ b/dev-python/oscrypto/files/openssl-3.0.10-fix.patch
@@ -0,0 +1,38 @@
+From ebbc944485b278192b60080ea1f495e287efb4f8 Mon Sep 17 00:00:00 2001
+From: Martin Journois <bibmar...@users.noreply.github.com>
+Date: Thu, 17 Aug 2023 13:09:31 +0200
+Subject: [PATCH] MJ: Fix #75 bug with openssl 3.0.10 (#76)
+
+* MJ: Fix #75 bug with openssl 3.0.10
+* MJ: Add fix suggested by @vcunat on _libcrypto_ctypes regex
+---
+ oscrypto/_openssl/_libcrypto_cffi.py   | 2 +-
+ oscrypto/_openssl/_libcrypto_ctypes.py | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/oscrypto/_openssl/_libcrypto_cffi.py 
b/oscrypto/_openssl/_libcrypto_cffi.py
+index 8aed03e..14eb576 100644
+--- a/oscrypto/_openssl/_libcrypto_cffi.py
++++ b/oscrypto/_openssl/_libcrypto_cffi.py
+@@ -37,7 +37,7 @@
+ 
+ is_libressl = 'LibreSSL' in version_string
+ 
+-version_match = re.search('\\b(\\d\\.\\d\\.\\d[a-z]*)\\b', version_string)
++version_match = re.search('\\b(\\d\\.\\d\\.\\d+[a-z]*)\\b', version_string)
+ if not version_match:
+     version_match = re.search('(?<=LibreSSL )(\\d\\.\\d(\\.\\d)?)\\b', 
version_string)
+ if not version_match:
+diff --git a/oscrypto/_openssl/_libcrypto_ctypes.py 
b/oscrypto/_openssl/_libcrypto_ctypes.py
+index e33ebbc..9cb294a 100644
+--- a/oscrypto/_openssl/_libcrypto_ctypes.py
++++ b/oscrypto/_openssl/_libcrypto_ctypes.py
+@@ -40,7 +40,7 @@
+ 
+ is_libressl = 'LibreSSL' in version_string
+ 
+-version_match = re.search('\\b(\\d\\.\\d\\.\\d[a-z]*)\\b', version_string)
++version_match = re.search('\\b(\\d\\.\\d\\.\\d+[a-z]*)\\b', version_string)
+ if not version_match:
+     version_match = re.search('(?<=LibreSSL )(\\d\\.\\d(\\.\\d)?)\\b', 
version_string)
+ if not version_match:

diff --git a/dev-python/oscrypto/files/py3.12.patch 
b/dev-python/oscrypto/files/py3.12.patch
new file mode 100644
index 0000000000..0bb8cb0cda
--- /dev/null
+++ b/dev-python/oscrypto/files/py3.12.patch
@@ -0,0 +1,902 @@
+From 3be536e4a61ac5fbd403ee80cdb54cb666f34679 Mon Sep 17 00:00:00 2001
+From: Dominik 'Rathann' Mierzejewski <domi...@greysector.net>
+Date: Thu, 17 Aug 2023 09:05:29 +0200
+Subject: [PATCH 01/13] use `importlib` instead of deprecated `imp` module
+
+This fixes tests with python 3.12 where the `imp` module was
+[removed](https://docs.python.org/3.12/whatsnew/3.12.html#removed).
+
+This should fix issue #74.
+---
+ tests/__init__.py | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 4c65360..90bede4 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -1,7 +1,7 @@
+ # coding: utf-8
+ from __future__ import unicode_literals, division, absolute_import, 
print_function
+ 
+-import imp
++import importlib
+ import os
+ import unittest
+ 
+@@ -94,8 +94,7 @@ def _import_from(mod, path, mod_dir=None):
+         return None
+ 
+     try:
+-        mod_info = imp.find_module(mod_dir, [path])
+-        return imp.load_module(mod, *mod_info)
++        return importlib.import_module(mod)
+     except ImportError:
+         return None
+ 
+
+From 199f07eefb9c0d1d5ad8093c012fbdae1fefa633 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Thu, 17 Aug 2023 07:14:40 -0400
+Subject: [PATCH 02/13] Fix compatibility with Python 2.6
+
+---
+ tests/__init__.py | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 90bede4..3ca9334 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -1,10 +1,15 @@
+ # coding: utf-8
+ from __future__ import unicode_literals, division, absolute_import, 
print_function
+ 
+-import importlib
+ import os
++import sys
+ import unittest
+ 
++if sys.version_info < (3,):
++    import imp as importlib
++else:
++    import importlib
++
+ 
+ __version__ = '1.3.0'
+ __version_info__ = (1, 3, 0)
+
+From 19de26bdad3154dc30c6661b652c459438fa9be2 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Thu, 17 Aug 2023 07:25:49 -0400
+Subject: [PATCH 03/13] Fix both imp and importlib implementations
+
+---
+ tests/__init__.py | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 3ca9334..7aab84d 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -6,7 +6,7 @@
+ import unittest
+ 
+ if sys.version_info < (3,):
+-    import imp as importlib
++    import imp
+ else:
+     import importlib
+ 
+@@ -99,7 +99,12 @@ def _import_from(mod, path, mod_dir=None):
+         return None
+ 
+     try:
+-        return importlib.import_module(mod)
++        if sys.version_info < (3,):
++            mod_info = imp.find_module(mod_dir, [path])
++            return imp.load_module(mod, *mod_info)
++        else:
++            mod_info = importlib.machinery.PathFinder().find_spec(mod_dir, 
[path])
++            return importlib.import_module(mod, *mod_info)
+     except ImportError:
+         return None
+ 
+
+From 6973b915069babf665bc223979cd86b2dc262da4 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Thu, 17 Aug 2023 07:34:37 -0400
+Subject: [PATCH 04/13] More importlib fixes
+
+---
+ tests/__init__.py | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 7aab84d..957c083 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -103,8 +103,10 @@ def _import_from(mod, path, mod_dir=None):
+             mod_info = imp.find_module(mod_dir, [path])
+             return imp.load_module(mod, *mod_info)
+         else:
+-            mod_info = importlib.machinery.PathFinder().find_spec(mod_dir, 
[path])
+-            return importlib.import_module(mod, *mod_info)
++            spec = importlib.machinery.PathFinder().find_spec(mod_dir, [path])
++            module = importlib.util.module_from_spec(spec)
++            sys.modules[mod] = module
++            spec.loader.exec_module(module)
+     except ImportError:
+         return None
+ 
+
+From 8843c89acae8435a7ba731b42750e42caef87a70 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Thu, 17 Aug 2023 07:35:40 -0400
+Subject: [PATCH 05/13] Python 3.3 has a different importlib implementation
+
+---
+ tests/__init__.py | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 957c083..8339b5d 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -5,7 +5,7 @@
+ import sys
+ import unittest
+ 
+-if sys.version_info < (3,):
++if sys.version_info < (3, 5):
+     import imp
+ else:
+     import importlib
+@@ -99,7 +99,7 @@ def _import_from(mod, path, mod_dir=None):
+         return None
+ 
+     try:
+-        if sys.version_info < (3,):
++        if sys.version_info < (3, 5):
+             mod_info = imp.find_module(mod_dir, [path])
+             return imp.load_module(mod, *mod_info)
+         else:
+
+From 53fa3ca263ad6bc04e4a8a56f180b82bdc88aa03 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Thu, 17 Aug 2023 08:22:21 -0400
+Subject: [PATCH 06/13] Attempt a different importlib implementation
+
+---
+ tests/__init__.py | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 8339b5d..0eecf2f 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -103,7 +103,12 @@ def _import_from(mod, path, mod_dir=None):
+             mod_info = imp.find_module(mod_dir, [path])
+             return imp.load_module(mod, *mod_info)
+         else:
+-            spec = importlib.machinery.PathFinder().find_spec(mod_dir, [path])
++            loader_details = (
++                importlib.machinery.SourceFileLoader,
++                importlib.machinery.SOURCE_SUFFIXES
++            )
++            finder = importlib.machinery.FileFinder(path, loader_details)
++            spec = finder.find_spec(mod_dir)
+             module = importlib.util.module_from_spec(spec)
+             sys.modules[mod] = module
+             spec.loader.exec_module(module)
+
+From b013e440061c88dfe0301309b695c7b47bcc1e72 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Thu, 17 Aug 2023 15:52:30 -0400
+Subject: [PATCH 07/13] Hopefully some fully working Python 3.12-compatible
+ import backflips
+
+---
+ dev/_import.py    | 35 ++++++++++++++++++++++++++++++++---
+ tests/__init__.py |  4 ++++
+ 2 files changed, 36 insertions(+), 3 deletions(-)
+
+diff --git a/dev/_import.py b/dev/_import.py
+index d64c028..016c576 100644
+--- a/dev/_import.py
++++ b/dev/_import.py
+@@ -1,12 +1,19 @@
+ # coding: utf-8
+ from __future__ import unicode_literals, division, absolute_import, 
print_function
+ 
+-import imp
+ import sys
+ import os
+ 
+ from . import build_root, package_name, package_root
+ 
++if sys.version_info < (3, 5):
++    import imp
++else:
++    import importlib
++    import importlib.machinery
++    import importlib.util
++
++
+ if sys.version_info < (3,):
+     getcwd = os.getcwdu
+ else:
+@@ -34,6 +41,14 @@ def _import_from(mod, path, mod_dir=None, 
allow_error=False):
+         None if not loaded, otherwise the module
+     """
+ 
++    if mod in sys.modules:
++        return sys.modules[mod]
++
++    if mod_dir is None:
++        full_mod = mod
++    else:
++        full_mod = mod_dir
++
+     if mod_dir is None:
+         mod_dir = mod.replace('.', os.sep)
+ 
+@@ -49,8 +64,22 @@ def _import_from(mod, path, mod_dir=None, 
allow_error=False):
+         path = os.path.join(path, append)
+ 
+     try:
+-        mod_info = imp.find_module(mod_dir, [path])
+-        return imp.load_module(mod, *mod_info)
++        if sys.version_info < (3, 5):
++            mod_info = imp.find_module(mod_dir, [path])
++            return imp.load_module(mod, *mod_info)
++
++        else:
++            loader_details = (
++                importlib.machinery.SourceFileLoader,
++                importlib.machinery.SOURCE_SUFFIXES
++            )
++            finder = importlib.machinery.FileFinder(path, loader_details)
++            spec = finder.find_spec(full_mod)
++            module = importlib.util.module_from_spec(spec)
++            sys.modules[mod] = module
++            spec.loader.exec_module(module)
++            return module
++
+     except ImportError:
+         if allow_error:
+             raise
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 0eecf2f..9759ae3 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -89,6 +89,9 @@ def _import_from(mod, path, mod_dir=None):
+         None if not loaded, otherwise the module
+     """
+ 
++    if mod in sys.modules:
++        return sys.modules[mod]
++
+     if mod_dir is None:
+         mod_dir = mod
+ 
+@@ -112,6 +115,7 @@ def _import_from(mod, path, mod_dir=None):
+             module = importlib.util.module_from_spec(spec)
+             sys.modules[mod] = module
+             spec.loader.exec_module(module)
++            return module
+     except ImportError:
+         return None
+ 
+
+From 8ec71631b5adf6f6ab34c7cc3fe8e229a2bdcbd7 Mon Sep 17 00:00:00 2001
+From: Dominik Mierzejewski <domi...@greysector.net>
+Date: Fri, 18 Aug 2023 11:18:06 +0200
+Subject: [PATCH 08/13] Use importlib with python 3.5+
+
+This fixes `python run.py ci` under python 3.12.
+---
+ dev/coverage.py | 21 ++++++++++++++++++---
+ 1 file changed, 18 insertions(+), 3 deletions(-)
+
+diff --git a/dev/coverage.py b/dev/coverage.py
+index bb99a4f..6e669fe 100644
+--- a/dev/coverage.py
++++ b/dev/coverage.py
+@@ -4,7 +4,6 @@
+ import cgi
+ import codecs
+ import coverage
+-import imp
+ import json
+ import os
+ import unittest
+@@ -33,6 +32,11 @@
+ else:
+     Pattern = re.Pattern
+ 
++if sys.version_info < (3, 5):
++    import imp
++else:
++    import importlib
++
+ 
+ def run(ci=False):
+     """
+@@ -103,8 +107,19 @@ def _load_package_tests(name):
+     if not os.path.exists(package_dir):
+         return []
+ 
+-    tests_module_info = imp.find_module('tests', [package_dir])
+-    tests_module = imp.load_module('%s.tests' % name, *tests_module_info)
++    if sys.version_info < (3, 5):
++        tests_module_info = imp.find_module('tests', [package_dir])
++        tests_module = imp.load_module('%s.tests' % name, *tests_module_info)
++    else:
++        loader_details = (
++            importlib.machinery.SourceFileLoader,
++            importlib.machinery.SOURCE_SUFFIXES
++        )
++        finder = importlib.machinery.FileFinder(package_dir, loader_details)
++        spec = finder.find_spec('tests')
++        test_module = importlib.util.module_from_spec(spec)
++        sys.modules['%s.tests' % name] = test_module
++        spec.loader.exec_module(test_module)
+     return tests_module.test_classes()
+ 
+ 
+
+From 23d848a500413847a63df740af543e0fdaba5558 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Tue, 22 Aug 2023 06:56:36 -0400
+Subject: [PATCH 09/13] Reuse _import_from in coverage task, fixing module name
+
+---
+ dev/coverage.py | 21 ++-------------------
+ 1 file changed, 2 insertions(+), 19 deletions(-)
+
+diff --git a/dev/coverage.py b/dev/coverage.py
+index 6e669fe..00684d0 100644
+--- a/dev/coverage.py
++++ b/dev/coverage.py
+@@ -16,6 +16,7 @@
+ from fnmatch import fnmatch
+ 
+ from . import package_name, package_root, other_packages
++from ._import import _import_from
+ 
+ if sys.version_info < (3,):
+     str_cls = unicode  # noqa
+@@ -32,11 +33,6 @@
+ else:
+     Pattern = re.Pattern
+ 
+-if sys.version_info < (3, 5):
+-    import imp
+-else:
+-    import importlib
+-
+ 
+ def run(ci=False):
+     """
+@@ -107,20 +103,7 @@ def _load_package_tests(name):
+     if not os.path.exists(package_dir):
+         return []
+ 
+-    if sys.version_info < (3, 5):
+-        tests_module_info = imp.find_module('tests', [package_dir])
+-        tests_module = imp.load_module('%s.tests' % name, *tests_module_info)
+-    else:
+-        loader_details = (
+-            importlib.machinery.SourceFileLoader,
+-            importlib.machinery.SOURCE_SUFFIXES
+-        )
+-        finder = importlib.machinery.FileFinder(package_dir, loader_details)
+-        spec = finder.find_spec('tests')
+-        test_module = importlib.util.module_from_spec(spec)
+-        sys.modules['%s.tests' % name] = test_module
+-        spec.loader.exec_module(test_module)
+-    return tests_module.test_classes()
++    return _import_from('%s.tests' % name, package_dir, 
'tests').test_classes()
+ 
+ 
+ def _env_info():
+
+From 9941d3b96e8aa08622d00954d89005dcf6e94b94 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Tue, 22 Aug 2023 07:03:26 -0400
+Subject: [PATCH 10/13] Factor out remaining usage of imp module
+
+---
+ dev/build.py | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/dev/build.py b/dev/build.py
+index 4899594..f429fee 100644
+--- a/dev/build.py
++++ b/dev/build.py
+@@ -1,7 +1,6 @@
+ # coding: utf-8
+ from __future__ import unicode_literals, division, absolute_import, 
print_function
+ 
+-import imp
+ import os
+ import tarfile
+ import zipfile
+@@ -9,6 +8,7 @@
+ import setuptools.sandbox
+ 
+ from . import package_root, package_name, has_tests_package
++from ._import import _import_from
+ 
+ 
+ def _list_zip(filename):
+@@ -45,8 +45,8 @@ def run():
+ 
+     # Trying to call setuptools.sandbox.run_setup(setup, ['--version'])
+     # resulted in a segfault, so we do this instead
+-    module_info = imp.find_module('version', [os.path.join(package_root, 
package_name)])
+-    version_mod = imp.load_module('%s.version' % package_name, *module_info)
++    package_dir = os.path.join(package_root, package_name)
++    version_mod = _import_from('%s.version' % package_name, package_dir, 
'version')
+ 
+     pkg_name_info = (package_name, version_mod.__version__)
+     print('Building %s-%s' % pkg_name_info)
+
+From 799aa0d2f4a954d3fc120ab382c8dd4322758654 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Tue, 22 Aug 2023 16:29:39 -0400
+Subject: [PATCH 11/13] Rewrite importlib import mechanism
+
+---
+ dev/_import.py    | 69 ++++++++++++++++++++++++++++++++---------
+ tests/__init__.py | 79 ++++++++++++++++++++++++++++++++++++++++-------
+ 2 files changed, 122 insertions(+), 26 deletions(-)
+
+diff --git a/dev/_import.py b/dev/_import.py
+index 016c576..20720e7 100644
+--- a/dev/_import.py
++++ b/dev/_import.py
+@@ -10,7 +10,7 @@
+     import imp
+ else:
+     import importlib
+-    import importlib.machinery
++    import importlib.abc
+     import importlib.util
+ 
+ 
+@@ -20,6 +20,48 @@
+     getcwd = os.getcwd
+ 
+ 
++class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
++    def setup(self):
++        self.modules = {}
++        sys.meta_path.insert(0, self)
++
++    def add_module(self, package_name, package_path):
++        if package_name not in self.modules:
++            self.modules[package_name] = package_path
++
++    def find_spec(self, fullname, path, target=None):
++        name_parts = fullname.split('.')
++        if name_parts[0] not in self.modules:
++            return None
++
++        package = name_parts[0]
++        package_path = self.modules[package]
++
++        fullpath = os.path.join(package_path, *name_parts[1:])
++
++        if os.path.isdir(fullpath):
++            filename = os.path.join(fullpath, "__init__.py")
++            submodule_locations = [fullpath]
++        else:
++            filename = fullpath + ".py"
++            submodule_locations = None
++
++        if not os.path.exists(filename):
++            return None
++
++        return importlib.util.spec_from_file_location(
++            fullname,
++            filename,
++            loader=None,
++            submodule_search_locations=submodule_locations
++        )
++
++
++if sys.version_info >= (3, 5):
++    CUSTOM_FINDER = ModCryptoMetaFinder()
++    CUSTOM_FINDER.setup()
++
++
+ def _import_from(mod, path, mod_dir=None, allow_error=False):
+     """
+     Imports a module from a specific path
+@@ -47,7 +89,7 @@ def _import_from(mod, path, mod_dir=None, allow_error=False):
+     if mod_dir is None:
+         full_mod = mod
+     else:
+-        full_mod = mod_dir
++        full_mod = mod_dir.replace(os.sep, '.')
+ 
+     if mod_dir is None:
+         mod_dir = mod.replace('.', os.sep)
+@@ -55,8 +97,11 @@ def _import_from(mod, path, mod_dir=None, 
allow_error=False):
+     if not os.path.exists(path):
+         return None
+ 
+-    if not os.path.exists(os.path.join(path, mod_dir)) \
+-            and not os.path.exists(os.path.join(path, mod_dir + '.py')):
++    source_path = os.path.join(path, mod_dir, '__init__.py')
++    if not os.path.exists(source_path):
++        source_path = os.path.join(path, mod_dir + '.py')
++
++    if not os.path.exists(source_path):
+         return None
+ 
+     if os.sep in mod_dir:
+@@ -69,16 +114,12 @@ def _import_from(mod, path, mod_dir=None, 
allow_error=False):
+             return imp.load_module(mod, *mod_info)
+ 
+         else:
+-            loader_details = (
+-                importlib.machinery.SourceFileLoader,
+-                importlib.machinery.SOURCE_SUFFIXES
+-            )
+-            finder = importlib.machinery.FileFinder(path, loader_details)
+-            spec = finder.find_spec(full_mod)
+-            module = importlib.util.module_from_spec(spec)
+-            sys.modules[mod] = module
+-            spec.loader.exec_module(module)
+-            return module
++            package = mod.split('.', 1)[0]
++            package_dir = full_mod.split('.', 1)[0]
++            package_path = os.path.join(path, package_dir)
++            CUSTOM_FINDER.add_module(package, package_path)
++
++            return importlib.import_module(mod)
+ 
+     except ImportError:
+         if allow_error:
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 9759ae3..2e24046 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -9,6 +9,8 @@
+     import imp
+ else:
+     import importlib
++    import importlib.abc
++    import importlib.util
+ 
+ 
+ __version__ = '1.3.0'
+@@ -71,6 +73,48 @@ def local_oscrypto():
+     return (_asn1crypto_module, _oscrypto_module)
+ 
+ 
++class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
++    def setup(self):
++        self.modules = {}
++        sys.meta_path.insert(0, self)
++
++    def add_module(self, package_name, package_path):
++        if package_name not in self.modules:
++            self.modules[package_name] = package_path
++
++    def find_spec(self, fullname, path, target=None):
++        name_parts = fullname.split('.')
++        if name_parts[0] not in self.modules:
++            return None
++
++        package = name_parts[0]
++        package_path = self.modules[package]
++
++        fullpath = os.path.join(package_path, *name_parts[1:])
++
++        if os.path.isdir(fullpath):
++            filename = os.path.join(fullpath, "__init__.py")
++            submodule_locations = [fullpath]
++        else:
++            filename = fullpath + ".py"
++            submodule_locations = None
++
++        if not os.path.exists(filename):
++            return None
++
++        return importlib.util.spec_from_file_location(
++            fullname,
++            filename,
++            loader=None,
++            submodule_search_locations=submodule_locations
++        )
++
++
++if sys.version_info >= (3, 5):
++    CUSTOM_FINDER = ModCryptoMetaFinder()
++    CUSTOM_FINDER.setup()
++
++
+ def _import_from(mod, path, mod_dir=None):
+     """
+     Imports a module from a specific path
+@@ -93,29 +137,40 @@ def _import_from(mod, path, mod_dir=None):
+         return sys.modules[mod]
+ 
+     if mod_dir is None:
+-        mod_dir = mod
++        full_mod = mod
++    else:
++        full_mod = mod_dir.replace(os.sep, '.')
++
++    if mod_dir is None:
++        mod_dir = mod.replace('.', os.sep)
+ 
+     if not os.path.exists(path):
+         return None
+ 
+-    if not os.path.exists(os.path.join(path, mod_dir)):
++    source_path = os.path.join(path, mod_dir, '__init__.py')
++    if not os.path.exists(source_path):
++        source_path = os.path.join(path, mod_dir + '.py')
++
++    if not os.path.exists(source_path):
+         return None
+ 
++    if os.sep in mod_dir:
++        append, mod_dir = mod_dir.rsplit(os.sep, 1)
++        path = os.path.join(path, append)
++
+     try:
+         if sys.version_info < (3, 5):
+             mod_info = imp.find_module(mod_dir, [path])
+             return imp.load_module(mod, *mod_info)
++
+         else:
+-            loader_details = (
+-                importlib.machinery.SourceFileLoader,
+-                importlib.machinery.SOURCE_SUFFIXES
+-            )
+-            finder = importlib.machinery.FileFinder(path, loader_details)
+-            spec = finder.find_spec(mod_dir)
+-            module = importlib.util.module_from_spec(spec)
+-            sys.modules[mod] = module
+-            spec.loader.exec_module(module)
+-            return module
++            package = mod.split('.', 1)[0]
++            package_dir = full_mod.split('.', 1)[0]
++            package_path = os.path.join(path, package_dir)
++            CUSTOM_FINDER.add_module(package, package_path)
++
++            return importlib.import_module(mod)
++
+     except ImportError:
+         return None
+ 
+
+From 8a588fa0223f08f817e702f7f2cc4ef81017af26 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Tue, 22 Aug 2023 16:35:17 -0400
+Subject: [PATCH 12/13] Fix custom importlib code for Python < 3.5
+
+---
+ dev/_import.py    | 73 +++++++++++++++++++++++------------------------
+ tests/__init__.py | 58 ++++++++++++++++++-------------------
+ 2 files changed, 65 insertions(+), 66 deletions(-)
+
+diff --git a/dev/_import.py b/dev/_import.py
+index 20720e7..2d016db 100644
+--- a/dev/_import.py
++++ b/dev/_import.py
+@@ -19,45 +19,44 @@
+ else:
+     getcwd = os.getcwd
+ 
+-
+-class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
+-    def setup(self):
+-        self.modules = {}
+-        sys.meta_path.insert(0, self)
+-
+-    def add_module(self, package_name, package_path):
+-        if package_name not in self.modules:
+-            self.modules[package_name] = package_path
+-
+-    def find_spec(self, fullname, path, target=None):
+-        name_parts = fullname.split('.')
+-        if name_parts[0] not in self.modules:
+-            return None
+-
+-        package = name_parts[0]
+-        package_path = self.modules[package]
+-
+-        fullpath = os.path.join(package_path, *name_parts[1:])
+-
+-        if os.path.isdir(fullpath):
+-            filename = os.path.join(fullpath, "__init__.py")
+-            submodule_locations = [fullpath]
+-        else:
+-            filename = fullpath + ".py"
+-            submodule_locations = None
+-
+-        if not os.path.exists(filename):
+-            return None
+-
+-        return importlib.util.spec_from_file_location(
+-            fullname,
+-            filename,
+-            loader=None,
+-            submodule_search_locations=submodule_locations
+-        )
++if sys.version_info >= (3, 5):
++    class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
++        def setup(self):
++            self.modules = {}
++            sys.meta_path.insert(0, self)
++
++        def add_module(self, package_name, package_path):
++            if package_name not in self.modules:
++                self.modules[package_name] = package_path
++
++        def find_spec(self, fullname, path, target=None):
++            name_parts = fullname.split('.')
++            if name_parts[0] not in self.modules:
++                return None
++
++            package = name_parts[0]
++            package_path = self.modules[package]
++
++            fullpath = os.path.join(package_path, *name_parts[1:])
++
++            if os.path.isdir(fullpath):
++                filename = os.path.join(fullpath, "__init__.py")
++                submodule_locations = [fullpath]
++            else:
++                filename = fullpath + ".py"
++                submodule_locations = None
++
++            if not os.path.exists(filename):
++                return None
++
++            return importlib.util.spec_from_file_location(
++                fullname,
++                filename,
++                loader=None,
++                submodule_search_locations=submodule_locations
++            )
+ 
+ 
+-if sys.version_info >= (3, 5):
+     CUSTOM_FINDER = ModCryptoMetaFinder()
+     CUSTOM_FINDER.setup()
+ 
+diff --git a/tests/__init__.py b/tests/__init__.py
+index 2e24046..e1e92e6 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -73,44 +73,44 @@ def local_oscrypto():
+     return (_asn1crypto_module, _oscrypto_module)
+ 
+ 
+-class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
+-    def setup(self):
+-        self.modules = {}
+-        sys.meta_path.insert(0, self)
++if sys.version_info >= (3, 5):
++    class ModCryptoMetaFinder(importlib.abc.MetaPathFinder):
++        def setup(self):
++            self.modules = {}
++            sys.meta_path.insert(0, self)
+ 
+-    def add_module(self, package_name, package_path):
+-        if package_name not in self.modules:
+-            self.modules[package_name] = package_path
++        def add_module(self, package_name, package_path):
++            if package_name not in self.modules:
++                self.modules[package_name] = package_path
+ 
+-    def find_spec(self, fullname, path, target=None):
+-        name_parts = fullname.split('.')
+-        if name_parts[0] not in self.modules:
+-            return None
++        def find_spec(self, fullname, path, target=None):
++            name_parts = fullname.split('.')
++            if name_parts[0] not in self.modules:
++                return None
+ 
+-        package = name_parts[0]
+-        package_path = self.modules[package]
++            package = name_parts[0]
++            package_path = self.modules[package]
+ 
+-        fullpath = os.path.join(package_path, *name_parts[1:])
++            fullpath = os.path.join(package_path, *name_parts[1:])
+ 
+-        if os.path.isdir(fullpath):
+-            filename = os.path.join(fullpath, "__init__.py")
+-            submodule_locations = [fullpath]
+-        else:
+-            filename = fullpath + ".py"
+-            submodule_locations = None
++            if os.path.isdir(fullpath):
++                filename = os.path.join(fullpath, "__init__.py")
++                submodule_locations = [fullpath]
++            else:
++                filename = fullpath + ".py"
++                submodule_locations = None
+ 
+-        if not os.path.exists(filename):
+-            return None
++            if not os.path.exists(filename):
++                return None
+ 
+-        return importlib.util.spec_from_file_location(
+-            fullname,
+-            filename,
+-            loader=None,
+-            submodule_search_locations=submodule_locations
+-        )
++            return importlib.util.spec_from_file_location(
++                fullname,
++                filename,
++                loader=None,
++                submodule_search_locations=submodule_locations
++            )
+ 
+ 
+-if sys.version_info >= (3, 5):
+     CUSTOM_FINDER = ModCryptoMetaFinder()
+     CUSTOM_FINDER.setup()
+ 
+
+From d9f8e2ff88e722e3af6bf592c097298505a40381 Mon Sep 17 00:00:00 2001
+From: wbond <w...@wbond.net>
+Date: Tue, 22 Aug 2023 16:45:45 -0400
+Subject: [PATCH 13/13] Fix test loading
+
+---
+ dev/_import.py    | 1 -
+ dev/coverage.py   | 2 +-
+ tests/__init__.py | 1 -
+ 3 files changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/dev/_import.py b/dev/_import.py
+index 2d016db..c0a1983 100644
+--- a/dev/_import.py
++++ b/dev/_import.py
+@@ -56,7 +56,6 @@ def find_spec(self, fullname, path, target=None):
+                 submodule_search_locations=submodule_locations
+             )
+ 
+-
+     CUSTOM_FINDER = ModCryptoMetaFinder()
+     CUSTOM_FINDER.setup()
+ 
+diff --git a/dev/coverage.py b/dev/coverage.py
+index 00684d0..98f140b 100644
+--- a/dev/coverage.py
++++ b/dev/coverage.py
+@@ -103,7 +103,7 @@ def _load_package_tests(name):
+     if not os.path.exists(package_dir):
+         return []
+ 
+-    return _import_from('%s.tests' % name, package_dir, 
'tests').test_classes()
++    return _import_from('%s_tests' % name, package_dir, 
'tests').test_classes()
+ 
+ 
+ def _env_info():
+diff --git a/tests/__init__.py b/tests/__init__.py
+index e1e92e6..3ae721d 100644
+--- a/tests/__init__.py
++++ b/tests/__init__.py
+@@ -110,7 +110,6 @@ def find_spec(self, fullname, path, target=None):
+                 submodule_search_locations=submodule_locations
+             )
+ 
+-
+     CUSTOM_FINDER = ModCryptoMetaFinder()
+     CUSTOM_FINDER.setup()
+ 

diff --git a/dev-python/oscrypto/oscrypto-1.3.0-r1.ebuild 
b/dev-python/oscrypto/oscrypto-1.3.0-r2.ebuild
similarity index 87%
rename from dev-python/oscrypto/oscrypto-1.3.0-r1.ebuild
rename to dev-python/oscrypto/oscrypto-1.3.0-r2.ebuild
index 145e19a73a..3bb5f584ed 100644
--- a/dev-python/oscrypto/oscrypto-1.3.0-r1.ebuild
+++ b/dev-python/oscrypto/oscrypto-1.3.0-r2.ebuild
@@ -3,7 +3,7 @@
 
 EAPI=8
 
-PYTHON_COMPAT=( python3_{10..11} pypy3 )
+PYTHON_COMPAT=( python3_{10..12} pypy3 )
 DISTUTILS_USE_PEP517=setuptools
 inherit edo distutils-r1 optfeature
 
@@ -30,6 +30,11 @@ BDEPEND="
 
 DOCS=( docs {changelog,readme}.md )
 
+PATCHES=(
+       "${FILESDIR}"/openssl-3.0.10-fix.patch
+       "${FILESDIR}"/py3.12.patch
+)
+
 distutils_enable_tests unittest
 
 python_test() {

Reply via email to