Merge pull request #2846 from reaperhulk/deprecation-dance

complete deprecation of CRLExtensionOID in favor of CRLEntryExtensionOID
diff --git a/src/cryptography/utils.py b/src/cryptography/utils.py
index 3407bfe..4c00627 100644
--- a/src/cryptography/utils.py
+++ b/src/cryptography/utils.py
@@ -118,6 +118,13 @@
     def __setattr__(self, attr, value):
         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):
         return ["_module"] + dir(self._module)
 
diff --git a/tests/test_warnings.py b/tests/test_warnings.py
index 9946baa..d27e757 100644
--- a/tests/test_warnings.py
+++ b/tests/test_warnings.py
@@ -8,6 +8,8 @@
 import types
 import warnings
 
+import pytest
+
 from cryptography.utils import deprecated
 
 
@@ -45,3 +47,42 @@
         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