diff --git a/changelog.d/20250929_092604_kurtmckee_update_auth_get_my_groups.rst b/changelog.d/20250929_092604_kurtmckee_update_auth_get_my_groups.rst new file mode 100644 index 000000000..6f00a409e --- /dev/null +++ b/changelog.d/20250929_092604_kurtmckee_update_auth_get_my_groups.rst @@ -0,0 +1,4 @@ +Added +----- + +- Add the ``statuses`` parameter to ``GroupsClient.get_my_groups()``. (:pr:`NUMBER`) diff --git a/src/globus_sdk/services/groups/client.py b/src/globus_sdk/services/groups/client.py index 98ef41db4..a9e94baff 100644 --- a/src/globus_sdk/services/groups/client.py +++ b/src/globus_sdk/services/groups/client.py @@ -1,5 +1,6 @@ from __future__ import annotations +import sys import typing as t import uuid @@ -9,6 +10,21 @@ from .data import BatchMembershipActions, GroupPolicies from .errors import GroupsAPIError +if sys.version_info >= (3, 10): + from typing import TypeAlias +else: + from typing_extensions import TypeAlias + +_VALID_STATUSES_T: TypeAlias = t.Literal[ + "active", + "declined", + "invited", + "left", + "pending", + "rejected", + "removed", +] + class GroupsClient(client.BaseClient): """ @@ -36,11 +52,19 @@ def default_scope_requirements(self) -> list[Scope]: return [Scope(GroupsScopes.view_my_groups_and_memberships)] def get_my_groups( - self, *, query_params: dict[str, t.Any] | None = None + self, + *, + statuses: _VALID_STATUSES_T | t.Iterable[_VALID_STATUSES_T] | None = None, + query_params: dict[str, t.Any] | None = None, ) -> response.ArrayResponse: """ Return a list of groups your identity belongs to. + :param statuses: + If provided, only groups containing memberships with the given status + are returned. + Valid values are ``active``, ``invited``, ``pending``, ``rejected``, + ``removed``, ``left``, and ``declined``. :param query_params: Additional passthrough query parameters .. tab-set:: @@ -53,6 +77,10 @@ def get_my_groups( :service: groups :ref: get_my_groups_and_memberships_v2_groups_my_groups_get """ + if query_params is None: + query_params = {} + if statuses is not None: + query_params["statuses"] = ",".join(utils.safe_strseq_iter(statuses)) return response.ArrayResponse( self.get("/groups/my_groups", query_params=query_params) ) diff --git a/tests/functional/services/groups/test_get_my_groups.py b/tests/functional/services/groups/test_get_my_groups.py index 6eaa2e375..178bbf7b2 100644 --- a/tests/functional/services/groups/test_get_my_groups.py +++ b/tests/functional/services/groups/test_get_my_groups.py @@ -1,13 +1,19 @@ -from globus_sdk._testing import load_response +import urllib.parse + +from globus_sdk._testing import get_last_request, load_response from globus_sdk.response import ArrayResponse def test_get_my_groups(groups_client): meta = load_response(groups_client.get_my_groups).metadata - res = groups_client.get_my_groups() + res = groups_client.get_my_groups(statuses="active") assert res.http_status == 200 + req = get_last_request() + parsed_qs = urllib.parse.parse_qs(urllib.parse.urlparse(req.url).query) + assert parsed_qs["statuses"] == ["active"] + assert isinstance(res, ArrayResponse) assert isinstance(res.data, list) assert set(meta["group_names"]) == {g["name"] for g in res}