commit:     6c1000332491de2afe4d52ee7a380e5b2da2ddb8
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Sun Mar 28 02:11:59 2021 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Sun Mar 28 03:16:56 2021 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=6c100033

_get_eapi_attrs: cache eapi_* function calls via decorator

Decorate eapi_* functions so that calls use _get_eapi_attrs(eapi)
to cache results.

Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>

 lib/portage/eapi.py | 107 +++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 81 insertions(+), 26 deletions(-)

diff --git a/lib/portage/eapi.py b/lib/portage/eapi.py
index aca571ebd..796184644 100644
--- a/lib/portage/eapi.py
+++ b/lib/portage/eapi.py
@@ -1,7 +1,9 @@
-# Copyright 2010-2018 Gentoo Foundation
+# Copyright 2010-2021 Gentoo Authors
 # Distributed under the terms of the GNU General Public License v2
 
 import collections
+import operator
+import types
 
 from portage import eapi_is_supported
 
@@ -127,15 +129,63 @@ def eapi_has_sysroot(eapi):
 
 _eapi_attrs = collections.namedtuple('_eapi_attrs',
        'allows_package_provided '
-       'bdepend broot dots_in_PN dots_in_use_flags exports_EBUILD_PHASE_FUNC '
-       'exports_PORTDIR exports_ECLASSDIR '
+       'bdepend '
+       'broot '
+       'dots_in_PN dots_in_use_flags '
+       'exports_AA '
+       'exports_EBUILD_PHASE_FUNC '
+       'exports_ECLASSDIR '
+       'exports_KV '
+       'exports_merge_type '
+       'exports_PORTDIR '
+       'exports_replace_vars '
        'feature_flag_test '
        'iuse_defaults iuse_effective posixish_locale '
        'path_variables_end_with_trailing_slash '
+       'prefix '
        'repo_deps required_use required_use_at_most_one_of slot_operator 
slot_deps '
        'src_uri_arrows strong_blocks use_deps use_dep_defaults '
        'empty_groups_always_true sysroot')
 
+
+_eapi_attr_func_prefixes = (
+       'eapi_allows_',
+       'eapi_has_',
+       'eapi_requires_',
+       'eapi_supports_',
+       'eapi_',
+)
+
+
+def _eapi_func_decorator(func, attr_getter):
+       def wrapper(eapi):
+               return attr_getter(_get_eapi_attrs(eapi))
+       wrapper.func = func
+       wrapper.__doc__ = func.__doc__
+       return wrapper
+
+
+def _decorate_eapi_funcs():
+       """
+       Decorate eapi_* functions so that they use _get_eapi_attrs(eapi)
+       to cache results.
+       """
+       decorated = {}
+       for k, v in globals().items():
+               if not (isinstance(v, types.FunctionType) and 
k.startswith(_eapi_attr_func_prefixes)):
+                       continue
+               for prefix in _eapi_attr_func_prefixes:
+                       if k.startswith(prefix):
+                               attr_name = k[len(prefix):]
+                               if hasattr(_eapi_attrs, attr_name):
+                                       decorated[k] = _eapi_func_decorator(v, 
operator.attrgetter(attr_name))
+                                       break
+       globals().update(decorated)
+
+
+_decorate_eapi_funcs()
+
+
 _eapi_attrs_cache = {}
 
 def _get_eapi_attrs(eapi):
@@ -155,31 +205,36 @@ def _get_eapi_attrs(eapi):
                eapi = None
 
        eapi_attrs = _eapi_attrs(
-               allows_package_provided=(eapi is None or 
eapi_allows_package_provided(eapi)),
-               bdepend = (eapi is not None and eapi_has_bdepend(eapi)),
-               broot = (eapi is None or eapi_has_broot(eapi)),
-               dots_in_PN = (eapi is None or eapi_allows_dots_in_PN(eapi)),
-               dots_in_use_flags = (eapi is None or 
eapi_allows_dots_in_use_flags(eapi)),
-               empty_groups_always_true = (eapi is not None and 
eapi_empty_groups_always_true(eapi)),
-               exports_EBUILD_PHASE_FUNC = (eapi is None or 
eapi_exports_EBUILD_PHASE_FUNC(eapi)),
-               exports_PORTDIR = (eapi is None or eapi_exports_PORTDIR(eapi)),
-               exports_ECLASSDIR = (eapi is not None and 
eapi_exports_ECLASSDIR(eapi)),
+               allows_package_provided=(eapi is None or 
eapi_allows_package_provided.func(eapi)),
+               bdepend = (eapi is not None and eapi_has_bdepend.func(eapi)),
+               broot = (eapi is None or eapi_has_broot.func(eapi)),
+               dots_in_PN = (eapi is None or 
eapi_allows_dots_in_PN.func(eapi)),
+               dots_in_use_flags = (eapi is None or 
eapi_allows_dots_in_use_flags.func(eapi)),
+               empty_groups_always_true = (eapi is not None and 
eapi_empty_groups_always_true.func(eapi)),
+               exports_AA = (eapi is not None and eapi_exports_AA.func(eapi)),
+               exports_EBUILD_PHASE_FUNC = (eapi is None or 
eapi_exports_EBUILD_PHASE_FUNC.func(eapi)),
+               exports_ECLASSDIR = (eapi is not None and 
eapi_exports_ECLASSDIR.func(eapi)),
+               exports_KV = (eapi is not None and eapi_exports_KV.func(eapi)),
+               exports_merge_type = (eapi is None or 
eapi_exports_merge_type.func(eapi)),
+               exports_PORTDIR = (eapi is None or 
eapi_exports_PORTDIR.func(eapi)),
+               exports_replace_vars = (eapi is None or 
eapi_exports_replace_vars.func(eapi)),
                feature_flag_test = False,
-               iuse_defaults = (eapi is None or eapi_has_iuse_defaults(eapi)),
-               iuse_effective = (eapi is not None and 
eapi_has_iuse_effective(eapi)),
+               iuse_defaults = (eapi is None or 
eapi_has_iuse_defaults.func(eapi)),
+               iuse_effective = (eapi is not None and 
eapi_has_iuse_effective.func(eapi)),
                path_variables_end_with_trailing_slash = (eapi is not None and
-                       eapi_path_variables_end_with_trailing_slash(eapi)),
-               posixish_locale = (eapi is not None and 
eapi_requires_posixish_locale(eapi)),
-               repo_deps = (eapi is None or eapi_has_repo_deps(eapi)),
-               required_use = (eapi is None or eapi_has_required_use(eapi)),
-               required_use_at_most_one_of = (eapi is None or 
eapi_has_required_use_at_most_one_of(eapi)),
-               slot_deps = (eapi is None or eapi_has_slot_deps(eapi)),
-               slot_operator = (eapi is None or eapi_has_slot_operator(eapi)),
-               src_uri_arrows = (eapi is None or 
eapi_has_src_uri_arrows(eapi)),
-               strong_blocks = (eapi is None or eapi_has_strong_blocks(eapi)),
-               sysroot = (eapi is None or eapi_has_sysroot(eapi)),
-               use_deps = (eapi is None or eapi_has_use_deps(eapi)),
-               use_dep_defaults = (eapi is None or 
eapi_has_use_dep_defaults(eapi))
+                       eapi_path_variables_end_with_trailing_slash.func(eapi)),
+               posixish_locale = (eapi is not None and 
eapi_requires_posixish_locale.func(eapi)),
+               prefix = (eapi is None or eapi_supports_prefix.func(eapi)),
+               repo_deps = (eapi is None or eapi_has_repo_deps.func(eapi)),
+               required_use = (eapi is None or 
eapi_has_required_use.func(eapi)),
+               required_use_at_most_one_of = (eapi is None or 
eapi_has_required_use_at_most_one_of.func(eapi)),
+               slot_deps = (eapi is None or eapi_has_slot_deps.func(eapi)),
+               slot_operator = (eapi is None or 
eapi_has_slot_operator.func(eapi)),
+               src_uri_arrows = (eapi is None or 
eapi_has_src_uri_arrows.func(eapi)),
+               strong_blocks = (eapi is None or 
eapi_has_strong_blocks.func(eapi)),
+               sysroot = (eapi is None or eapi_has_sysroot.func(eapi)),
+               use_deps = (eapi is None or eapi_has_use_deps.func(eapi)),
+               use_dep_defaults = (eapi is None or 
eapi_has_use_dep_defaults.func(eapi))
        )
 
        _eapi_attrs_cache[orig_eapi] = eapi_attrs

Reply via email to