Skip to content

Commit 6e93d06

Browse files
authored
feat: [sc-47448] implement bookmark methods in Transfer v2 client (#1379)
2 parents f8a4a27 + 2bed618 commit 6e93d06

16 files changed

Lines changed: 625 additions & 20 deletions
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Added
2+
-----
3+
4+
- Support for managing bookmarks via the Transfer v2 client (:pr:`NUMBER`)

src/globus_sdk/experimental/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import typing as t
44

55
__all__ = (
6+
"BookmarkCreateDocument",
7+
"BookmarkUpdateDocument",
68
"TransferClientV2",
79
"TunnelCreateDocument",
810
"TunnelUpdateDocument",
@@ -14,13 +16,17 @@
1416
# components which do not need it
1517
if t.TYPE_CHECKING:
1618
from .transfer_v2 import (
19+
BookmarkCreateDocument,
20+
BookmarkUpdateDocument,
1721
TransferClientV2,
1822
TunnelCreateDocument,
1923
TunnelUpdateDocument,
2024
)
2125
else:
2226
_LAZY_IMPORT_TABLE = {
2327
"transfer_v2": {
28+
"BookmarkCreateDocument",
29+
"BookmarkUpdateDocument",
2430
"TransferClientV2",
2531
"TunnelCreateDocument",
2632
"TunnelUpdateDocument",

src/globus_sdk/experimental/transfer_v2/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
from .client import TransferClientV2
2-
from .data import TunnelCreateDocument, TunnelUpdateDocument
2+
from .data import (
3+
BookmarkCreateDocument,
4+
BookmarkUpdateDocument,
5+
TunnelCreateDocument,
6+
TunnelUpdateDocument,
7+
)
38

49
__all__ = (
10+
"BookmarkCreateDocument",
11+
"BookmarkUpdateDocument",
512
"TransferClientV2",
613
"TunnelCreateDocument",
714
"TunnelUpdateDocument",

src/globus_sdk/experimental/transfer_v2/client.py

Lines changed: 170 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,12 @@
1010
from globus_sdk.services.transfer.errors import TransferAPIError
1111
from globus_sdk.transport import RetryConfig
1212

13-
from .data import TunnelCreateDocument, TunnelUpdateDocument
13+
from .data import (
14+
BookmarkCreateDocument,
15+
BookmarkUpdateDocument,
16+
TunnelCreateDocument,
17+
TunnelUpdateDocument,
18+
)
1419
from .transport import TRANSFER_V2_DEFAULT_RETRY_CHECKS
1520

1621
log = logging.getLogger(__name__)
@@ -72,7 +77,7 @@ def create_tunnel(
7277
7378
.. code-block:: python
7479
75-
tc = globus_sdk.experimental.TrasferClientV2(...)
80+
tc = globus_sdk.experimental.TransferClientV2(...)
7681
data = globus_sdk.experimental.TunnelCreateDocument(...)
7782
result = tc.create_tunnel(data)
7883
print(result["data"]["id"])
@@ -81,7 +86,7 @@ def create_tunnel(
8186
8287
``POST /v2/tunnels``
8388
"""
84-
log.debug("TransferClientV2.create_tunnel(...)")
89+
log.debug(f"{self.__class__.__name__}.create_tunnel(...)")
8590
r = self.post("/v2/tunnels", data=data)
8691
return r
8792

@@ -100,7 +105,7 @@ def update_tunnel(
100105
101106
.. code-block:: python
102107
103-
tc = globus_sdk.experimental.TrasferClientV2(...)
108+
tc = globus_sdk.experimental.TransferClientV2(...)
104109
data = globus_sdk.experimental.TunnelUpdateDocument(...)
105110
result = tc.update_tunnel(tunnel_id, data)
106111
print(result["data"])
@@ -109,7 +114,7 @@ def update_tunnel(
109114
110115
``PATCH /v2/tunnels/<tunnel_id>``
111116
"""
112-
log.debug(f"TransferClientV2.update_tunnel({tunnel_id}, {update_doc})")
117+
log.debug(f"{self.__class__.__name__}.update_tunnel({tunnel_id}, {update_doc})")
113118
r = self.patch(f"/v2/tunnels/{tunnel_id}", data=update_doc)
114119
return r
115120

@@ -130,15 +135,15 @@ def get_tunnel(
130135
131136
.. code-block:: python
132137
133-
tc = globus_sdk.experimental.TrasferClientV2(...)
134-
result = tc.show_tunnel(tunnel_id)
138+
tc = globus_sdk.experimental.TransferClientV2(...)
139+
result = tc.get_tunnel(tunnel_id)
135140
print(result["data"])
136141
137142
.. tab-item:: API Info
138143
139144
``GET /v2/tunnels/<tunnel_id>``
140145
"""
141-
log.debug("TransferClientV2.get_tunnel({tunnel_id}, {query_params})")
146+
log.debug(f"{self.__class__.__name__}.get_tunnel({tunnel_id}, {query_params})")
142147
r = self.get(f"/v2/tunnels/{tunnel_id}", query_params=query_params)
143148
return r
144149

@@ -158,14 +163,14 @@ def delete_tunnel(
158163
159164
.. code-block:: python
160165
161-
tc = globus_sdk.experimental.TrasferClientV2(...)
166+
tc = globus_sdk.experimental.TransferClientV2(...)
162167
tc.delete_tunnel(tunnel_id)
163168
164169
.. tab-item:: API Info
165170
166171
``DELETE /v2/tunnels/<tunnel_id>``
167172
"""
168-
log.debug(f"TransferClientV2.delete_tunnel({tunnel_id})")
173+
log.debug(f"{self.__class__.__name__}.delete_tunnel({tunnel_id})")
169174
r = self.delete(f"/v2/tunnels/{tunnel_id}")
170175
return r
171176

@@ -186,14 +191,14 @@ def list_tunnels(
186191
187192
.. code-block:: python
188193
189-
tc = globus_sdk.experimental.TrasferClientV2(...)
194+
tc = globus_sdk.experimental.TransferClientV2(...)
190195
tc.list_tunnels(tunnel_id)
191196
192197
.. tab-item:: API Info
193198
194199
``GET /v2/tunnels/``
195200
"""
196-
log.debug(f"TransferClientV2.list_tunnels({query_params})")
201+
log.debug(f"{self.__class__.__name__}.list_tunnels({query_params})")
197202
r = self.get("/v2/tunnels", query_params=query_params)
198203
return IterableJSONAPIResponse(r)
199204

@@ -214,15 +219,17 @@ def get_tunnel_events(
214219
215220
.. code-block:: python
216221
217-
tc = globus_sdk.experimental.TrasferClientV2(...)
222+
tc = globus_sdk.experimental.TransferClientV2(...)
218223
result = tc.get_tunnel_events(tunnel_id)
219224
print(result["data"])
220225
221226
.. tab-item:: API Info
222227
223228
``GET /v2/tunnels/<tunnel_id>/events``
224229
"""
225-
log.debug(f"TransferClientV2.get_tunnel_events({tunnel_id}, {query_params})")
230+
log.debug(
231+
f"{self.__class__.__name__}.get_tunnel_events({tunnel_id}, {query_params})"
232+
)
226233
r = self.get(f"/v2/tunnels/{tunnel_id}/events", query_params=query_params)
227234
return IterableJSONAPIResponse(r)
228235

@@ -247,15 +254,16 @@ def get_stream_access_point(
247254
248255
.. code-block:: python
249256
250-
tc = globus_sdk.experimental.TrasferClientV2(...)
257+
tc = globus_sdk.experimental.TransferClientV2(...)
251258
tc.get_stream_access_point(stream_ap_id)
252259
253260
.. tab-item:: API Info
254261
255262
``GET /v2/stream_access_points/<stream_ap_id>``
256263
"""
257264
log.debug(
258-
f"TransferClientV2.get_stream_access_point({stream_ap_id}, {query_params})"
265+
f"{self.__class__.__name__}."
266+
f"get_stream_access_point({stream_ap_id}, {query_params})"
259267
)
260268
r = self.get(
261269
f"/v2/stream_access_points/{stream_ap_id}", query_params=query_params
@@ -280,13 +288,157 @@ def list_stream_access_points(
280288
281289
.. code-block:: python
282290
283-
tc = globus_sdk.experimental.TrasferClientV2(...)
291+
tc = globus_sdk.experimental.TransferClientV2(...)
284292
tc.list_stream_access_points()
285293
286294
.. tab-item:: API Info
287295
288296
``GET /v2/stream_access_points``
289297
"""
290-
log.debug(f"TransferClientV2.list_stream_access_points({query_params})")
298+
log.debug(
299+
f"{self.__class__.__name__}.list_stream_access_points({query_params})"
300+
)
291301
r = self.get("/v2/stream_access_points", query_params=query_params)
292302
return IterableJSONAPIResponse(r)
303+
304+
def create_bookmark(
305+
self, data: dict[str, t.Any] | BookmarkCreateDocument
306+
) -> response.GlobusHTTPResponse:
307+
"""
308+
:param data: Parameters for bookmark creation
309+
310+
.. tab-set::
311+
312+
.. tab-item:: Example Usage
313+
314+
.. code-block:: python
315+
316+
tc = globus_sdk.experimental.TransferClientV2(...)
317+
data = globus_sdk.experimental.BookmarkCreateDocument(...)
318+
result = tc.create_bookmark(data)
319+
print(result["data"]["id"])
320+
321+
.. tab-item:: API Info
322+
323+
``POST /v2/bookmarks``
324+
"""
325+
log.debug(f"{self.__class__.__name__}.create_bookmark(...)")
326+
r = self.post("/v2/bookmarks", data=data)
327+
return r
328+
329+
def update_bookmark(
330+
self,
331+
bookmark_id: uuid.UUID | str,
332+
update_document: dict[str, t.Any] | BookmarkUpdateDocument,
333+
) -> response.GlobusHTTPResponse:
334+
r"""
335+
:param bookmark_id: The ID of the Bookmark.
336+
:param update_document: The document that will be sent to the patch API.
337+
338+
.. tab-set::
339+
340+
.. tab-item:: Example Usage
341+
342+
.. code-block:: python
343+
344+
tc = globus_sdk.experimental.TransferClientV2(...)
345+
data = globus_sdk.experimental.BookmarkUpdateDocument(...)
346+
result = tc.update_bookmark(bookmark_id, data)
347+
print(result["data"])
348+
349+
.. tab-item:: API Info
350+
351+
``PATCH /v2/bookmarks/<bookmark_id>``
352+
"""
353+
log.debug(
354+
f"{self.__class__.__name__}."
355+
f"update_bookmark({bookmark_id}, {update_document})"
356+
)
357+
r = self.patch(f"/v2/bookmarks/{bookmark_id}", data=update_document)
358+
return r
359+
360+
def get_bookmark(
361+
self,
362+
bookmark_id: uuid.UUID | str,
363+
*,
364+
query_params: dict[str, t.Any] | None = None,
365+
) -> response.GlobusHTTPResponse:
366+
"""
367+
:param bookmark_id: The ID of the Bookmark for which we are fetching details.
368+
:param query_params: Any additional parameters will be passed through
369+
as request parameters on the URL.
370+
371+
.. tab-set::
372+
373+
.. tab-item:: Example Usage
374+
375+
.. code-block:: python
376+
377+
tc = globus_sdk.experimental.TransferClientV2(...)
378+
query_params = {"include": "collection"}
379+
result = tc.get_bookmark(bookmark_id, query_params)
380+
print(result["data"])
381+
382+
.. tab-item:: API Info
383+
384+
``GET /v2/bookmarks/<bookmark_id>``
385+
"""
386+
log.debug(
387+
f"{self.__class__.__name__}.get_bookmark({bookmark_id}, {query_params})"
388+
)
389+
r = self.get(f"/v2/bookmarks/{bookmark_id}", query_params=query_params)
390+
return r
391+
392+
def delete_bookmark(
393+
self,
394+
bookmark_id: uuid.UUID | str,
395+
) -> response.GlobusHTTPResponse:
396+
"""
397+
:param bookmark_id: The ID of the Bookmark to be deleted.
398+
399+
.. tab-set::
400+
401+
.. tab-item:: Example Usage
402+
403+
.. code-block:: python
404+
405+
tc = globus_sdk.experimental.TransferClientV2(...)
406+
tc.delete_bookmark(bookmark_id)
407+
408+
.. tab-item:: API Info
409+
410+
``DELETE /v2/bookmarks/<bookmark_id>``
411+
"""
412+
log.debug(f"{self.__class__.__name__}.delete_bookmark({bookmark_id})")
413+
r = self.delete(f"/v2/bookmarks/{bookmark_id}")
414+
return r
415+
416+
def list_bookmarks(
417+
self,
418+
*,
419+
query_params: dict[str, t.Any] | None = None,
420+
) -> IterableJSONAPIResponse:
421+
"""
422+
:param query_params: Any additional parameters will be passed through
423+
as request parameters on the URL.
424+
425+
This will list all Bookmarks created by the authenticated user's primary
426+
and linked identities.
427+
428+
.. tab-set::
429+
430+
.. tab-item:: Example Usage
431+
432+
.. code-block:: python
433+
434+
tc = globus_sdk.experimental.TransferClientV2(...)
435+
query_params = {"include": "collection"}
436+
tc.list_bookmarks(query_params)
437+
438+
.. tab-item:: API Info
439+
440+
``GET /v2/bookmarks``
441+
"""
442+
log.debug(f"{self.__class__.__name__}.list_bookmarks({query_params})")
443+
r = self.get("/v2/bookmarks", query_params=query_params)
444+
return IterableJSONAPIResponse(r)

src/globus_sdk/experimental/transfer_v2/data/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@
44
:class:`TransferClient <globus_sdk.TransferClient>` methods without conversion.
55
"""
66

7+
from .bookmark_documents import BookmarkCreateDocument, BookmarkUpdateDocument
78
from .tunnel_documents import TunnelCreateDocument, TunnelUpdateDocument
89

9-
__all__ = ("TunnelCreateDocument", "TunnelUpdateDocument")
10+
__all__ = (
11+
"BookmarkCreateDocument",
12+
"BookmarkUpdateDocument",
13+
"TunnelCreateDocument",
14+
"TunnelUpdateDocument",
15+
)

0 commit comments

Comments
 (0)