From bb6997c45e24f4391ed89be08b258aef1f2d872f Mon Sep 17 00:00:00 2001 From: Cory Benfield Date: Mon, 21 Mar 2016 09:31:27 +0000 Subject: Add __delattr__ to _ModuleWithDeprecations. --- src/cryptography/utils.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cryptography/utils.py b/src/cryptography/utils.py index 53795732..da7df76e 100644 --- a/src/cryptography/utils.py +++ b/src/cryptography/utils.py @@ -119,6 +119,9 @@ class _ModuleWithDeprecations(object): def __setattr__(self, attr, value): setattr(self._module, attr, value) + def __delattr__(self, attr): + delattr(self._module, attr) + def __dir__(self): return ["_module"] + dir(self._module) -- cgit v1.2.3 From 2d53db112cec047a7bf38896ddb32e71f60de2eb Mon Sep 17 00:00:00 2001 From: Cory Benfield Date: Mon, 21 Mar 2016 11:38:04 +0000 Subject: Warn when deleting deprecated attributes. --- src/cryptography/utils.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cryptography/utils.py b/src/cryptography/utils.py index da7df76e..64a1c785 100644 --- a/src/cryptography/utils.py +++ b/src/cryptography/utils.py @@ -120,6 +120,10 @@ class _ModuleWithDeprecations(object): setattr(self._module, attr, value) def __delattr__(self, attr): + obj = getattr(self._module, attr) + if isinstance(obj, _DeprecatedValue): + warnings.warn(obj.message, obj.warning_class, stacklevel=2) + delattr(self._module, attr) def __dir__(self): -- cgit v1.2.3 From beee981420164fb6f2a8e153081b261c11fddd99 Mon Sep 17 00:00:00 2001 From: Cory Benfield Date: Mon, 21 Mar 2016 11:38:20 +0000 Subject: Test deleting deprecated attributes. --- tests/test_warnings.py | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/tests/test_warnings.py b/tests/test_warnings.py index 9946baa7..d27e757f 100644 --- a/tests/test_warnings.py +++ b/tests/test_warnings.py @@ -8,6 +8,8 @@ import sys import types import warnings +import pytest + from cryptography.utils import deprecated @@ -45,3 +47,42 @@ class TestDeprecated(object): assert msg2.message.args == ("more deprecated text",) assert "Y" in dir(mod) + + def test_deleting_deprecated_members(self, monkeypatch): + mod = types.ModuleType("TestDeprecated/test_deprecated") + monkeypatch.setitem(sys.modules, mod.__name__, mod) + mod.X = deprecated( + value=1, + module_name=mod.__name__, + message="deprecated message text", + warning_class=DeprecationWarning + ) + mod.Y = deprecated( + value=2, + module_name=mod.__name__, + message="more deprecated text", + warning_class=PendingDeprecationWarning, + ) + mod = sys.modules[mod.__name__] + mod.Z = 3 + + with warnings.catch_warnings(record=True) as log: + warnings.simplefilter("always", PendingDeprecationWarning) + warnings.simplefilter("always", DeprecationWarning) + del mod.X + del mod.Y + del mod.Z + + [msg1, msg2] = log + assert msg1.category is DeprecationWarning + assert msg1.message.args == ("deprecated message text",) + + assert msg2.category is PendingDeprecationWarning + assert msg2.message.args == ("more deprecated text",) + + assert "X" not in dir(mod) + assert "Y" not in dir(mod) + assert "Z" not in dir(mod) + + with pytest.raises(AttributeError): + del mod.X -- cgit v1.2.3