diff options
author | Daniël van Noord <13665637+DanielNoord@users.noreply.github.com> | 2023-04-01 21:51:17 +0200 |
---|---|---|
committer | Daniël van Noord <13665637+DanielNoord@users.noreply.github.com> | 2023-04-01 22:16:36 +0200 |
commit | cff437ab3bfed3ec04958765ce4bd560a22c9220 (patch) | |
tree | 4b0f0e429f4c31a126eb8b662ac437ba6393b87b | |
parent | c7b2be1c137847fa78df6d6bf7a1e2f75f0577d6 (diff) | |
download | astroid-git-cff437ab3bfed3ec04958765ce4bd560a22c9220.tar.gz |
Remove dependency on ``wrapt``
-rw-r--r-- | ChangeLog | 2 | ||||
-rw-r--r-- | astroid/decorators.py | 81 | ||||
-rw-r--r-- | astroid/inference_tip.py | 40 | ||||
-rw-r--r-- | pyproject.toml | 3 |
4 files changed, 70 insertions, 56 deletions
@@ -10,6 +10,8 @@ Release date: TBA Closes #1780 +* Remove dependency on ``wrapt``. + What's New in astroid 2.15.2? ============================= diff --git a/astroid/decorators.py b/astroid/decorators.py index abeaed4a..a32f7f84 100644 --- a/astroid/decorators.py +++ b/astroid/decorators.py @@ -13,11 +13,10 @@ import warnings from collections.abc import Callable, Generator from typing import TypeVar -import wrapt - from astroid import util from astroid.context import InferenceContext from astroid.exceptions import InferenceError +from astroid.typing import InferenceResult if sys.version_info >= (3, 10): from typing import ParamSpec @@ -108,39 +107,51 @@ def path_wrapper(func): return wrapped -@wrapt.decorator -def yes_if_nothing_inferred(func, instance, args, kwargs): - generator = func(*args, **kwargs) - - try: - yield next(generator) - except StopIteration: - # generator is empty - yield util.Uninferable - return - - yield from generator - - -@wrapt.decorator -def raise_if_nothing_inferred(func, instance, args, kwargs): - generator = func(*args, **kwargs) - try: - yield next(generator) - except StopIteration as error: - # generator is empty - if error.args: - # pylint: disable=not-a-mapping - raise InferenceError(**error.args[0]) from error - raise InferenceError( - "StopIteration raised without any error information." - ) from error - except RecursionError as error: - raise InferenceError( - f"RecursionError raised with limit {sys.getrecursionlimit()}." - ) from error - - yield from generator +def yes_if_nothing_inferred( + func: Callable[_P, Generator[InferenceResult, None, None]] +) -> Callable[_P, Generator[InferenceResult, None, None]]: + def inner( + *args: _P.args, **kwargs: _P.kwargs + ) -> Generator[InferenceResult, None, None]: + generator = func(*args, **kwargs) + + try: + yield next(generator) + except StopIteration: + # generator is empty + yield util.Uninferable + return + + yield from generator + + return inner + + +def raise_if_nothing_inferred( + func: Callable[_P, Generator[InferenceResult, None, None]], +) -> Callable[_P, Generator[InferenceResult, None, None]]: + def inner( + *args: _P.args, **kwargs: _P.kwargs + ) -> Generator[InferenceResult, None, None]: + generator = func(*args, **kwargs) + try: + yield next(generator) + except StopIteration as error: + # generator is empty + if error.args: + # pylint: disable=not-a-mapping + raise InferenceError(**error.args[0]) from error + raise InferenceError( + "StopIteration raised without any error information." + ) from error + except RecursionError as error: + raise InferenceError( + f"RecursionError raised with limit {sys.getrecursionlimit()}." + ) from error + + yield from generator + + return inner # Expensive decorators only used to emit Deprecation warnings. diff --git a/astroid/inference_tip.py b/astroid/inference_tip.py index 4a5d4d01..041c0a68 100644 --- a/astroid/inference_tip.py +++ b/astroid/inference_tip.py @@ -6,15 +6,16 @@ from __future__ import annotations -import typing -from collections.abc import Iterator +from collections.abc import Callable, Iterator -import wrapt +from typing_extensions import ParamSpec from astroid.exceptions import InferenceOverwriteError, UseInferenceDefault from astroid.nodes import NodeNG from astroid.typing import InferenceResult, InferFn +_P = ParamSpec("_P") + _cache: dict[tuple[InferFn, NodeNG], list[InferenceResult] | None] = {} @@ -23,23 +24,26 @@ def clear_inference_tip_cache() -> None: _cache.clear() -@wrapt.decorator def _inference_tip_cached( - func: InferFn, instance: None, args: typing.Any, kwargs: typing.Any -) -> Iterator[InferenceResult]: + func: Callable[_P, Iterator[InferenceResult]], +) -> Callable[_P, Iterator[InferenceResult]]: """Cache decorator used for inference tips.""" - node = args[0] - try: - result = _cache[func, node] - # If through recursion we end up trying to infer the same - # func + node we raise here. - if result is None: - raise UseInferenceDefault() - except KeyError: - _cache[func, node] = None - result = _cache[func, node] = list(func(*args, **kwargs)) - assert result - return iter(result) + + def inner(*args: _P.args, **kwargs: _P.kwargs) -> Iterator[InferenceResult]: + node = args[0] + try: + result = _cache[func, node] + # If through recursion we end up trying to infer the same + # func + node we raise here. + if result is None: + raise UseInferenceDefault() + except KeyError: + _cache[func, node] = None + result = _cache[func, node] = list(func(*args, **kwargs)) + assert result + return iter(result) + + return inner def inference_tip(infer_function: InferFn, raise_on_overwrite: bool = False) -> InferFn: diff --git a/pyproject.toml b/pyproject.toml index 7b212755..807c450c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,8 +34,6 @@ classifiers = [ requires-python = ">=3.7.2" dependencies = [ "lazy_object_proxy>=1.4.0", - "wrapt>=1.14,<2;python_version>='3.11'", - "wrapt>=1.11,<2;python_version<'3.11'", "typed-ast>=1.4.0,<2.0;implementation_name=='cpython' and python_version<'3.8'", "typing-extensions>=4.0.0;python_version<'3.11'", ] @@ -83,7 +81,6 @@ module = [ "numpy.*", "pytest", "setuptools", - "wrapt.*", ] ignore_missing_imports = true |