Skip to content

Commit ecdf800

Browse files
committed
Do not remove Permission.destroy(), instead deprecate it (usage in existing cookbook)
1 parent 8269629 commit ecdf800

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

src/posit/connect/_deprecated.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import warnings
2+
3+
4+
# From https://github.com/posit-dev/py-shiny/blob/f6b92d8cf49a90f3b3dbb636cd6d7fdeee244cfd/shiny/_deprecated.py#L15C1-L28C1
5+
# Create our own warning class instead of using built-in DeprecationWarning, because we
6+
# want to be able to control display of these messages without interfering with the
7+
# user's control of DeprecationWarning.
8+
# 2024-11: Change base class to DeprecationWarning
9+
class PositConnectDeprecationWarning(DeprecationWarning):
10+
pass
11+
12+
13+
# By default DeprecationWarnings aren't shown; we want to always show them.
14+
warnings.simplefilter("always", PositConnectDeprecationWarning)
15+
16+
17+
def warn_deprecated(message: str, stacklevel: int = 3):
18+
warnings.warn(message, PositConnectDeprecationWarning, stacklevel=stacklevel)
19+
20+
21+
def warn_deprecated_and_removed_in_future(message: str, stacklevel: int = 3):
22+
message += " This method will be removed in a future release."
23+
warnings.warn(message, PositConnectDeprecationWarning, stacklevel=stacklevel)

src/posit/connect/permissions.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
from requests.sessions import Session as Session
88

9+
from ._deprecated import warn_deprecated_and_removed_in_future
910
from .resources import Resource, ResourceParameters, Resources
1011

1112
if TYPE_CHECKING:
@@ -14,8 +15,14 @@
1415

1516

1617
class Permission(Resource):
18+
def delete(self) -> None:
19+
"""[Deprecated] Delete the permission."""
20+
warn_deprecated_and_removed_in_future("Please use .destroy() instead of .delete().")
21+
22+
self.destroy()
23+
1724
def destroy(self) -> None:
18-
"""Delete the permission."""
25+
"""Destroy the permission."""
1926
path = f"v1/content/{self['content_guid']}/permissions/{self['id']}"
2027
url = self.params.url + path
2128
self.params.session.delete(url)

tests/posit/connect/test_permissions.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import responses
77
from responses import matchers
88

9+
from posit.connect._deprecated import PositConnectDeprecationWarning
910
from posit.connect.groups import Group
1011
from posit.connect.permissions import Permission, Permissions
1112
from posit.connect.resources import ResourceParameters
@@ -15,7 +16,7 @@
1516
from .api import load_mock, load_mock_dict, load_mock_list
1617

1718

18-
class TestPermissionDelete:
19+
class TestPermissionDestroy:
1920
@responses.activate
2021
def test(self):
2122
# data
@@ -38,6 +39,29 @@ def test(self):
3839
# assert
3940
assert mock_delete.call_count == 1
4041

42+
@responses.activate
43+
def test_destroy_deprecated(self):
44+
# data
45+
uid = "94"
46+
content_guid = "f2f37341-e21d-3d80-c698-a935ad614066"
47+
48+
# behavior
49+
mock_delete = responses.delete(
50+
f"https://connect.example/__api__/v1/content/{content_guid}/permissions/{uid}",
51+
)
52+
53+
# setup
54+
params = ResourceParameters(requests.Session(), Url("https://connect.example/__api__"))
55+
fake_permission = load_mock_dict(f"v1/content/{content_guid}/permissions/{uid}.json")
56+
permission = Permission(params, **fake_permission)
57+
58+
# invoke
59+
with pytest.warns(PositConnectDeprecationWarning, match="destroy"):
60+
permission.delete()
61+
62+
# assert
63+
assert mock_delete.call_count == 1
64+
4165

4266
class TestPermissionUpdate:
4367
@responses.activate

0 commit comments

Comments
 (0)