Files
ray-project--ray/python/ray/tests/test_annotations.py
T
2026-07-13 13:17:40 +08:00

107 lines
2.9 KiB
Python

import sys
import warnings
import pytest
from ray._common.test_utils import run_string_as_driver
from ray.util.annotations import Deprecated
# Use default filterwarnings behavior for this test
@pytest.mark.filterwarnings("default")
@pytest.mark.parametrize("warning", [True, False])
def test_deprecated(warning):
class_deprecated_message = "class is deprecated"
class_method_deprecated_message = "class method is deprecated"
function_deprecated_message = "function is deprecated"
@Deprecated(message=class_deprecated_message, warning=warning)
class A:
def __init__(self):
self.i = 13
@Deprecated(message=class_method_deprecated_message, warning=warning)
def method(self):
self.i = 14
@Deprecated(message=function_deprecated_message, warning=warning)
def func():
return 15
with warnings.catch_warnings(record=True) as w:
a = A()
assert a.i == 13
assert class_deprecated_message in A.__doc__
if warning:
assert any(
class_deprecated_message in str(warning.message) for warning in w
)
else:
assert not w
with warnings.catch_warnings(record=True) as w:
a.method()
assert a.i == 14
assert class_method_deprecated_message in A.method.__doc__
if warning:
assert any(
class_method_deprecated_message in str(warning.message) for warning in w
)
else:
assert not w
with warnings.catch_warnings(record=True) as w:
ret = func()
assert ret == 15
assert function_deprecated_message in func.__doc__
if warning:
assert any(
function_deprecated_message in str(warning.message) for warning in w
)
else:
assert not w
# Use default filterwarnings behavior for this test
@pytest.mark.filterwarnings("default")
@pytest.mark.skipif(sys.platform == "win32", reason="Windows failed reading stdout")
def test_only_warn_once():
log = run_string_as_driver(
"""
from ray.util.annotations import Deprecated
@Deprecated(message="functionisdeprecated", warning=True)
def func():
return 15
for _ in range(3):
func()
"""
)
assert log.count("functionisdeprecated") == 1
# Use default filterwarnings behavior for this test
@pytest.mark.filterwarnings("default")
@pytest.mark.skipif(sys.platform == "win32", reason="Windows failed reading stdout")
def test_warn_suppressed():
log = run_string_as_driver(
"""
from ray.util.annotations import Deprecated
@Deprecated(message="functionisdeprecated", warning=True)
def func():
return 15
for _ in range(3):
func()
""",
env={"PYTHONWARNINGS": "ignore::DeprecationWarning"},
)
assert log.count("functionisdeprecated") == 0
if __name__ == "__main__":
sys.exit(pytest.main(["-sv", __file__]))