Skip to content

Commit

Permalink
refactor: replace @deprecated decorator with upcoming native support …
Browse files Browse the repository at this point in the history
…(via typing-extensions)
  • Loading branch information
erikwrede committed Sep 29, 2024
1 parent 48678af commit d09177d
Show file tree
Hide file tree
Showing 5 changed files with 6 additions and 132 deletions.
68 changes: 3 additions & 65 deletions graphene/utils/deprecated.py
Original file line number Diff line number Diff line change
@@ -1,67 +1,5 @@
import functools
import inspect
import warnings
from warnings import warn

string_types = (type(b""), type(""))


def warn_deprecation(text):
warnings.warn(text, category=DeprecationWarning, stacklevel=2)


def deprecated(reason):
"""
This is a decorator which can be used to mark functions
as deprecated. It will result in a warning being emitted
when the function is used.
"""

if isinstance(reason, string_types):
# The @deprecated is used with a 'reason'.
#
# .. code-block:: python
#
# @deprecated("please, use another function")
# def old_function(x, y):
# pass

def decorator(func1):
if inspect.isclass(func1):
fmt1 = f"Call to deprecated class {func1.__name__} ({reason})."
else:
fmt1 = f"Call to deprecated function {func1.__name__} ({reason})."

@functools.wraps(func1)
def new_func1(*args, **kwargs):
warn_deprecation(fmt1)
return func1(*args, **kwargs)

return new_func1

return decorator

elif inspect.isclass(reason) or inspect.isfunction(reason):
# The @deprecated is used without any 'reason'.
#
# .. code-block:: python
#
# @deprecated
# def old_function(x, y):
# pass

func2 = reason

if inspect.isclass(func2):
fmt2 = f"Call to deprecated class {func2.__name__}."
else:
fmt2 = f"Call to deprecated function {func2.__name__}."

@functools.wraps(func2)
def new_func2(*args, **kwargs):
warn_deprecation(fmt2)
return func2(*args, **kwargs)

return new_func2

else:
raise TypeError(repr(type(reason)))
def warn_deprecation(text: str):
warn(text, category=DeprecationWarning, stacklevel=2)
3 changes: 1 addition & 2 deletions graphene/utils/resolve_only_args.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from functools import wraps

from .deprecated import deprecated
from typing_extensions import deprecated


@deprecated("This function is deprecated")
Expand Down
64 changes: 0 additions & 64 deletions graphene/utils/tests/test_deprecated.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
from pytest import raises

from .. import deprecated
from ..deprecated import deprecated as deprecated_decorator
from ..deprecated import warn_deprecation


Expand All @@ -12,64 +9,3 @@ def test_warn_deprecation(mocker):
deprecated.warnings.warn.assert_called_with(
"OH!", stacklevel=2, category=DeprecationWarning
)


def test_deprecated_decorator(mocker):
mocker.patch.object(deprecated, "warn_deprecation")

@deprecated_decorator
def my_func():
return True

result = my_func()
assert result
deprecated.warn_deprecation.assert_called_with(
"Call to deprecated function my_func."
)


def test_deprecated_class(mocker):
mocker.patch.object(deprecated, "warn_deprecation")

@deprecated_decorator
class X:
pass

result = X()
assert result
deprecated.warn_deprecation.assert_called_with("Call to deprecated class X.")


def test_deprecated_decorator_text(mocker):
mocker.patch.object(deprecated, "warn_deprecation")

@deprecated_decorator("Deprecation text")
def my_func():
return True

result = my_func()
assert result
deprecated.warn_deprecation.assert_called_with(
"Call to deprecated function my_func (Deprecation text)."
)


def test_deprecated_class_text(mocker):
mocker.patch.object(deprecated, "warn_deprecation")

@deprecated_decorator("Deprecation text")
class X:
pass

result = X()
assert result
deprecated.warn_deprecation.assert_called_with(
"Call to deprecated class X (Deprecation text)."
)


def test_deprecated_other_object(mocker):
mocker.patch.object(deprecated, "warn_deprecation")

with raises(TypeError):
deprecated_decorator({})
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ def run_tests(self):
install_requires=[
"graphql-core>=3.1,<3.3",
"graphql-relay>=3.1,<3.3",
"typing-extensions>=4.7.1,<5",
],
tests_require=tests_require,
extras_require={"test": tests_require, "dev": dev_requires},
Expand Down
2 changes: 1 addition & 1 deletion tox.ini
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ commands =
[testenv:mypy]
basepython = python3.10
deps =
mypy>=0.950,<1
mypy>=1.10,<2
commands =
mypy graphene

Expand Down

0 comments on commit d09177d

Please sign in to comment.