Gentoo Archives: gentoo-portage-dev

From: Matt Turner <mattst88@g.o>
To: gentoo-portage-dev@l.g.o
Cc: "Wolfgang E. Sanyer" <WolfgangESanyer@×××××.com>, Matt Turner <mattst88@g.o>
Subject: [gentoo-portage-dev] [PATCH 4/4] portage.eapi: use functools @lru_cache decorator instead of custom implementation
Date: Thu, 24 Feb 2022 04:15:18
Message-Id: 20220224041449.3746627-4-mattst88@gentoo.org
In Reply to: [gentoo-portage-dev] [PATCH 1/4] portage.dep.Atom: Clean up __new__ parameters by Matt Turner
1 From: "Wolfgang E. Sanyer" <WolfgangESanyer@×××××.com>
2
3 Reviewed-by: Matt Turner <mattst88@g.o>
4 Signed-off-by: Wolfgang E. Sanyer <WolfgangESanyer@×××××.com>
5 ---
6 lib/portage/eapi.py | 155 ++++++++++++++++++++------------------------
7 1 file changed, 72 insertions(+), 83 deletions(-)
8
9 diff --git a/lib/portage/eapi.py b/lib/portage/eapi.py
10 index 56e64620a..efcc6c2a0 100644
11 --- a/lib/portage/eapi.py
12 +++ b/lib/portage/eapi.py
13 @@ -2,12 +2,10 @@
14 # Distributed under the terms of the GNU General Public License v2
15
16 import collections
17 -import operator
18 -import types
19 -
20 -from portage import eapi_is_supported
21 +from functools import lru_cache
22
23
24 +@lru_cache(None)
25 def eapi_has_iuse_defaults(eapi):
26 if eapi is None:
27 return True
28 @@ -15,6 +13,7 @@ def eapi_has_iuse_defaults(eapi):
29 return eapi != "0"
30
31
32 +@lru_cache(None)
33 def eapi_has_iuse_effective(eapi):
34 if eapi is None:
35 return False
36 @@ -22,6 +21,7 @@ def eapi_has_iuse_effective(eapi):
37 return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi")
38
39
40 +@lru_cache(None)
41 def eapi_has_slot_deps(eapi):
42 if eapi is None:
43 return True
44 @@ -29,6 +29,7 @@ def eapi_has_slot_deps(eapi):
45 return eapi != "0"
46
47
48 +@lru_cache(None)
49 def eapi_has_slot_operator(eapi):
50 if eapi is None:
51 return True
52 @@ -36,6 +37,7 @@ def eapi_has_slot_operator(eapi):
53 return eapi not in ("0", "1", "2", "3", "4", "4-python")
54
55
56 +@lru_cache(None)
57 def eapi_has_src_uri_arrows(eapi):
58 if eapi is None:
59 return True
60 @@ -43,6 +45,7 @@ def eapi_has_src_uri_arrows(eapi):
61 return eapi not in ("0", "1")
62
63
64 +@lru_cache(None)
65 def eapi_has_selective_src_uri_restriction(eapi):
66 if eapi is None:
67 return True
68 @@ -62,6 +65,7 @@ def eapi_has_selective_src_uri_restriction(eapi):
69 )
70
71
72 +@lru_cache(None)
73 def eapi_has_use_deps(eapi):
74 if eapi is None:
75 return True
76 @@ -69,6 +73,7 @@ def eapi_has_use_deps(eapi):
77 return eapi not in ("0", "1")
78
79
80 +@lru_cache(None)
81 def eapi_has_strong_blocks(eapi):
82 if eapi is None:
83 return True
84 @@ -76,10 +81,12 @@ def eapi_has_strong_blocks(eapi):
85 return eapi not in ("0", "1")
86
87
88 +@lru_cache(None)
89 def eapi_has_src_prepare_and_src_configure(eapi):
90 return eapi not in ("0", "1")
91
92
93 +@lru_cache(None)
94 def eapi_supports_prefix(eapi):
95 if eapi is None:
96 return True
97 @@ -87,6 +94,7 @@ def eapi_supports_prefix(eapi):
98 return eapi not in ("0", "1", "2")
99
100
101 +@lru_cache(None)
102 def eapi_exports_AA(eapi):
103 if eapi is None:
104 return False
105 @@ -94,6 +102,7 @@ def eapi_exports_AA(eapi):
106 return eapi in ("0", "1", "2", "3")
107
108
109 +@lru_cache(None)
110 def eapi_exports_KV(eapi):
111 if eapi is None:
112 return False
113 @@ -101,6 +110,7 @@ def eapi_exports_KV(eapi):
114 return eapi in ("0", "1", "2", "3")
115
116
117 +@lru_cache(None)
118 def eapi_exports_merge_type(eapi):
119 if eapi is None:
120 return True
121 @@ -108,6 +118,7 @@ def eapi_exports_merge_type(eapi):
122 return eapi not in ("0", "1", "2", "3")
123
124
125 +@lru_cache(None)
126 def eapi_exports_replace_vars(eapi):
127 if eapi is None:
128 return True
129 @@ -115,6 +126,7 @@ def eapi_exports_replace_vars(eapi):
130 return eapi not in ("0", "1", "2", "3")
131
132
133 +@lru_cache(None)
134 def eapi_exports_EBUILD_PHASE_FUNC(eapi):
135 if eapi is None:
136 return True
137 @@ -122,6 +134,7 @@ def eapi_exports_EBUILD_PHASE_FUNC(eapi):
138 return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi")
139
140
141 +@lru_cache(None)
142 def eapi_exports_PORTDIR(eapi):
143 if eapi is None:
144 return True
145 @@ -140,6 +153,7 @@ def eapi_exports_PORTDIR(eapi):
146 )
147
148
149 +@lru_cache(None)
150 def eapi_exports_ECLASSDIR(eapi):
151 if eapi is None:
152 return False
153 @@ -158,22 +172,27 @@ def eapi_exports_ECLASSDIR(eapi):
154 )
155
156
157 +@lru_cache(None)
158 def eapi_exports_REPOSITORY(eapi):
159 return eapi in ("4-python", "5-progress")
160
161
162 +@lru_cache(None)
163 def eapi_has_pkg_pretend(eapi):
164 return eapi not in ("0", "1", "2", "3")
165
166
167 +@lru_cache(None)
168 def eapi_has_implicit_rdepend(eapi):
169 return eapi in ("0", "1", "2", "3")
170
171
172 +@lru_cache(None)
173 def eapi_has_dosed_dohard(eapi):
174 return eapi in ("0", "1", "2", "3")
175
176
177 +@lru_cache(None)
178 def eapi_has_required_use(eapi):
179 if eapi is None:
180 return True
181 @@ -181,6 +200,7 @@ def eapi_has_required_use(eapi):
182 return eapi not in ("0", "1", "2", "3")
183
184
185 +@lru_cache(None)
186 def eapi_has_required_use_at_most_one_of(eapi):
187 if eapi is None:
188 return True
189 @@ -188,6 +208,7 @@ def eapi_has_required_use_at_most_one_of(eapi):
190 return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi")
191
192
193 +@lru_cache(None)
194 def eapi_has_use_dep_defaults(eapi):
195 if eapi is None:
196 return True
197 @@ -195,6 +216,7 @@ def eapi_has_use_dep_defaults(eapi):
198 return eapi not in ("0", "1", "2", "3")
199
200
201 +@lru_cache(None)
202 def eapi_requires_posixish_locale(eapi):
203 if eapi is None:
204 return False
205 @@ -212,6 +234,7 @@ def eapi_requires_posixish_locale(eapi):
206 )
207
208
209 +@lru_cache(None)
210 def eapi_has_repo_deps(eapi):
211 if eapi is None:
212 return True
213 @@ -219,6 +242,7 @@ def eapi_has_repo_deps(eapi):
214 return eapi in ("4-python", "5-progress")
215
216
217 +@lru_cache(None)
218 def eapi_allows_dots_in_PN(eapi):
219 if eapi is None:
220 return True
221 @@ -226,6 +250,7 @@ def eapi_allows_dots_in_PN(eapi):
222 return eapi in ("4-python", "5-progress")
223
224
225 +@lru_cache(None)
226 def eapi_allows_dots_in_use_flags(eapi):
227 if eapi is None:
228 return True
229 @@ -233,22 +258,27 @@ def eapi_allows_dots_in_use_flags(eapi):
230 return eapi in ("4-python", "5-progress")
231
232
233 +@lru_cache(None)
234 def eapi_supports_stable_use_forcing_and_masking(eapi):
235 return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi")
236
237
238 +@lru_cache(None)
239 def eapi_allows_directories_on_profile_level_and_repository_level(eapi):
240 return eapi not in ("0", "1", "2", "3", "4", "4-slot-abi", "5", "6")
241
242
243 +@lru_cache(None)
244 def eapi_has_use_aliases(eapi):
245 return eapi in ("4-python", "5-progress")
246
247
248 +@lru_cache(None)
249 def eapi_has_automatic_unpack_dependencies(eapi):
250 return eapi in ("5-progress",)
251
252
253 +@lru_cache(None)
254 def eapi_allows_package_provided(eapi):
255 if eapi is None:
256 return True
257 @@ -267,6 +297,7 @@ def eapi_allows_package_provided(eapi):
258 )
259
260
261 +@lru_cache(None)
262 def eapi_has_bdepend(eapi):
263 if eapi is None:
264 return False
265 @@ -285,6 +316,7 @@ def eapi_has_bdepend(eapi):
266 )
267
268
269 +@lru_cache(None)
270 def eapi_has_idepend(eapi):
271 if eapi is None:
272 return False
273 @@ -304,6 +336,7 @@ def eapi_has_idepend(eapi):
274 )
275
276
277 +@lru_cache(None)
278 def eapi_empty_groups_always_true(eapi):
279 if eapi is None:
280 return False
281 @@ -322,6 +355,7 @@ def eapi_empty_groups_always_true(eapi):
282 )
283
284
285 +@lru_cache(None)
286 def eapi_path_variables_end_with_trailing_slash(eapi):
287 if eapi is None:
288 return False
289 @@ -340,6 +374,7 @@ def eapi_path_variables_end_with_trailing_slash(eapi):
290 )
291
292
293 +@lru_cache(None)
294 def eapi_has_broot(eapi):
295 if eapi is None:
296 return True
297 @@ -358,6 +393,7 @@ def eapi_has_broot(eapi):
298 )
299
300
301 +@lru_cache(None)
302 def eapi_has_sysroot(eapi):
303 if eapi is None:
304 return True
305 @@ -423,43 +459,7 @@ _eapi_attr_func_prefixes = (
306 )
307
308
309 -def _eapi_func_decorator(func, attr_getter):
310 - def wrapper(eapi):
311 - return attr_getter(_get_eapi_attrs(eapi))
312 -
313 - wrapper.func = func
314 - wrapper.__doc__ = func.__doc__
315 - return wrapper
316 -
317 -
318 -def _decorate_eapi_funcs():
319 - """
320 - Decorate eapi_* functions so that they use _get_eapi_attrs(eapi)
321 - to cache results.
322 - """
323 - decorated = {}
324 - for k, v in globals().items():
325 - if not (
326 - isinstance(v, types.FunctionType) and k.startswith(_eapi_attr_func_prefixes)
327 - ):
328 - continue
329 - for prefix in _eapi_attr_func_prefixes:
330 - if k.startswith(prefix):
331 - attr_name = k[len(prefix) :]
332 - if hasattr(_eapi_attrs, attr_name):
333 - decorated[k] = _eapi_func_decorator(
334 - v, operator.attrgetter(attr_name)
335 - )
336 - break
337 - globals().update(decorated)
338 -
339 -
340 -_decorate_eapi_funcs()
341 -
342 -
343 -_eapi_attrs_cache = {}
344 -
345 -
346 +@lru_cache(None)
347 def _get_eapi_attrs(eapi):
348 """
349 When eapi is None then validation is not as strict, since we want the
350 @@ -468,49 +468,38 @@ def _get_eapi_attrs(eapi):
351 be helpful for handling of corrupt EAPI metadata in essential functions
352 such as pkgsplit.
353 """
354 - eapi_attrs = _eapi_attrs_cache.get(eapi)
355 - if eapi_attrs is not None:
356 - return eapi_attrs
357 -
358 - orig_eapi = eapi
359 - if eapi is not None and not eapi_is_supported(eapi):
360 - eapi = None
361 -
362 - eapi_attrs = _eapi_attrs(
363 - allows_package_provided=eapi_allows_package_provided.func(eapi),
364 - bdepend=eapi_has_bdepend.func(eapi),
365 - broot=eapi_has_broot.func(eapi),
366 - dots_in_PN=eapi_allows_dots_in_PN.func(eapi),
367 - dots_in_use_flags=eapi_allows_dots_in_use_flags.func(eapi),
368 - empty_groups_always_true=eapi_empty_groups_always_true.func(eapi),
369 - exports_AA=eapi_exports_AA.func(eapi),
370 - exports_EBUILD_PHASE_FUNC=eapi_exports_EBUILD_PHASE_FUNC.func(eapi),
371 - exports_ECLASSDIR=eapi_exports_ECLASSDIR.func(eapi),
372 - exports_KV=eapi_exports_KV.func(eapi),
373 - exports_merge_type=eapi_exports_merge_type.func(eapi),
374 - exports_PORTDIR=eapi_exports_PORTDIR.func(eapi),
375 - exports_replace_vars=eapi_exports_replace_vars.func(eapi),
376 + return _eapi_attrs(
377 + allows_package_provided=eapi_allows_package_provided(eapi),
378 + bdepend=eapi_has_bdepend(eapi),
379 + broot=eapi_has_broot(eapi),
380 + dots_in_PN=eapi_allows_dots_in_PN(eapi),
381 + dots_in_use_flags=eapi_allows_dots_in_use_flags(eapi),
382 + empty_groups_always_true=eapi_empty_groups_always_true(eapi),
383 + exports_AA=eapi_exports_AA(eapi),
384 + exports_EBUILD_PHASE_FUNC=eapi_exports_EBUILD_PHASE_FUNC(eapi),
385 + exports_ECLASSDIR=eapi_exports_ECLASSDIR(eapi),
386 + exports_KV=eapi_exports_KV(eapi),
387 + exports_merge_type=eapi_exports_merge_type(eapi),
388 + exports_PORTDIR=eapi_exports_PORTDIR(eapi),
389 + exports_replace_vars=eapi_exports_replace_vars(eapi),
390 feature_flag_test=False,
391 - idepend=eapi_has_idepend.func(eapi),
392 - iuse_defaults=eapi_has_iuse_defaults.func(eapi),
393 - iuse_effective=eapi_has_iuse_effective.func(eapi),
394 - path_variables_end_with_trailing_slash=eapi_path_variables_end_with_trailing_slash.func(
395 + idepend=eapi_has_idepend(eapi),
396 + iuse_defaults=eapi_has_iuse_defaults(eapi),
397 + iuse_effective=eapi_has_iuse_effective(eapi),
398 + path_variables_end_with_trailing_slash=eapi_path_variables_end_with_trailing_slash(
399 eapi
400 ),
401 - posixish_locale=eapi_requires_posixish_locale.func(eapi),
402 - prefix=eapi_supports_prefix.func(eapi),
403 - repo_deps=eapi_has_repo_deps.func(eapi),
404 - required_use=eapi_has_required_use.func(eapi),
405 - required_use_at_most_one_of=eapi_has_required_use_at_most_one_of.func(eapi),
406 - selective_src_uri_restriction=eapi_has_selective_src_uri_restriction.func(eapi),
407 - slot_deps=eapi_has_slot_deps.func(eapi),
408 - slot_operator=eapi_has_slot_operator.func(eapi),
409 - src_uri_arrows=eapi_has_src_uri_arrows.func(eapi),
410 - strong_blocks=eapi_has_strong_blocks.func(eapi),
411 - sysroot=eapi_has_sysroot.func(eapi),
412 - use_deps=eapi_has_use_deps.func(eapi),
413 - use_dep_defaults=eapi_has_use_dep_defaults.func(eapi),
414 + posixish_locale=eapi_requires_posixish_locale(eapi),
415 + prefix=eapi_supports_prefix(eapi),
416 + repo_deps=eapi_has_repo_deps(eapi),
417 + required_use=eapi_has_required_use(eapi),
418 + required_use_at_most_one_of=eapi_has_required_use_at_most_one_of(eapi),
419 + selective_src_uri_restriction=eapi_has_selective_src_uri_restriction(eapi),
420 + slot_deps=eapi_has_slot_deps(eapi),
421 + slot_operator=eapi_has_slot_operator(eapi),
422 + src_uri_arrows=eapi_has_src_uri_arrows(eapi),
423 + strong_blocks=eapi_has_strong_blocks(eapi),
424 + sysroot=eapi_has_sysroot(eapi),
425 + use_deps=eapi_has_use_deps(eapi),
426 + use_dep_defaults=eapi_has_use_dep_defaults(eapi),
427 )
428 -
429 - _eapi_attrs_cache[orig_eapi] = eapi_attrs
430 - return eapi_attrs
431 --
432 2.34.1

Replies