summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniël van Noord <13665637+DanielNoord@users.noreply.github.com>2023-04-01 21:51:17 +0200
committerDaniël van Noord <13665637+DanielNoord@users.noreply.github.com>2023-04-01 22:16:36 +0200
commitcff437ab3bfed3ec04958765ce4bd560a22c9220 (patch)
tree4b0f0e429f4c31a126eb8b662ac437ba6393b87b
parentc7b2be1c137847fa78df6d6bf7a1e2f75f0577d6 (diff)
downloadastroid-git-cff437ab3bfed3ec04958765ce4bd560a22c9220.tar.gz
Remove dependency on ``wrapt``
-rw-r--r--ChangeLog2
-rw-r--r--astroid/decorators.py81
-rw-r--r--astroid/inference_tip.py40
-rw-r--r--pyproject.toml3
4 files changed, 70 insertions, 56 deletions
diff --git a/ChangeLog b/ChangeLog
index 82a95b32..2dcc8e91 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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