From 5b889cffc78b0159f76bc767967d2b539c3b34b4 Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Wed, 29 Jan 2025 10:56:17 +0100 Subject: [PATCH 01/23] add limit and offset to show_folder --- bioblend/_tests/TestGalaxyFolders.py | 21 ++++++++++++++++++++- bioblend/_tests/TestGalaxyHistories.py | 3 +-- bioblend/_tests/TestGalaxyTools.py | 3 +-- bioblend/_tests/test_util.py | 3 +-- bioblend/galaxy/folders/__init__.py | 18 +++++++++++++++--- 5 files changed, 38 insertions(+), 10 deletions(-) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index d519fb8dc..a589eb018 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -3,7 +3,10 @@ List, ) -from . import GalaxyTestBase +from . import ( + GalaxyTestBase, + test_util, +) FOO_DATA = "foo\nbar\n" @@ -36,6 +39,22 @@ def test_show_folder_contents(self): assert "metadata" in f2 assert self.name == f2["metadata"]["folder_name"] + @test_util.skip_unless_galaxy("release_21.05") + def test_show_folder_contents_limit(self): + subfolders = [] + for i in range(12): + subfolders.append(self.gi.folders.create_folder(self.folder["id"], f"{self.name} {i}")) + + # check defaults for limit and offset + f2 = self.gi.folders.show_folder(self.folder["id"], contents=True) + assert len(f2["folder_contents"]) == 10 + assert f2["folder_contents"][0]["name"] == f"{self.name} 0" + + # check non defaults + f2 = self.gi.folders.show_folder(self.folder["id"], contents=True, limit=1, offset=1) + assert len(f2["folder_contents"]) == 1 + assert f2["folder_contents"][0]["name"] == f"{self.name} 1" + def test_delete_folder(self): self.sub_folder = self.gi.folders.create_folder(self.folder["id"], self.name) self.gi.folders.delete_folder(self.sub_folder["id"]) diff --git a/bioblend/_tests/TestGalaxyHistories.py b/bioblend/_tests/TestGalaxyHistories.py index b1ae681b9..7d8ec1ee8 100644 --- a/bioblend/_tests/TestGalaxyHistories.py +++ b/bioblend/_tests/TestGalaxyHistories.py @@ -1,5 +1,4 @@ -""" -""" +""" """ import os import shutil diff --git a/bioblend/_tests/TestGalaxyTools.py b/bioblend/_tests/TestGalaxyTools.py index 2b3892a3c..b545f01f5 100644 --- a/bioblend/_tests/TestGalaxyTools.py +++ b/bioblend/_tests/TestGalaxyTools.py @@ -1,5 +1,4 @@ -""" -""" +""" """ import os from typing import ( diff --git a/bioblend/_tests/test_util.py b/bioblend/_tests/test_util.py index cdf1e8eeb..1cc47cd15 100644 --- a/bioblend/_tests/test_util.py +++ b/bioblend/_tests/test_util.py @@ -1,5 +1,4 @@ -""" General support infrastructure not tied to any particular test. -""" +"""General support infrastructure not tied to any particular test.""" import os import random diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index 99f1c5bde..e7ed43326 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -45,7 +45,9 @@ def create_folder(self, parent_folder_id: str, name: str, description: Optional[ payload["description"] = description return self._post(payload=payload, id=parent_folder_id) - def show_folder(self, folder_id: str, contents: bool = False) -> Dict[str, Any]: + def show_folder( + self, folder_id: str, contents: bool = False, limit: Optional[int] = 10, offset: Optional[int] = 0 + ) -> Dict[str, Any]: """ Display information about a folder. @@ -56,11 +58,21 @@ def show_folder(self, folder_id: str, contents: bool = False) -> Dict[str, Any]: :param contents: True to get the contents of the folder, rather than just the folder details. + :type limit: int + :param limit: Maximum number of contents to return (default: 10). + + :type offset: int + :param contents: Return contents from this specified position (default: 0). + :rtype: dict :return: dictionary including details of the folder """ - - return self._get(id=folder_id, contents=contents) + params = {} + if limit: + params["limit"] = limit + if offset: + params["offset"] = offset + return self._get(id=folder_id, contents=contents, params=params) def delete_folder(self, folder_id: str, undelete: bool = False) -> Dict[str, Any]: """ From c49b94aa4ce38189b0cdfe296b1fd4a17b235db1 Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Thu, 30 Jan 2025 15:33:09 +0100 Subject: [PATCH 02/23] add include_deleted --- bioblend/galaxy/folders/__init__.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index e7ed43326..b2c3c992f 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -46,7 +46,12 @@ def create_folder(self, parent_folder_id: str, name: str, description: Optional[ return self._post(payload=payload, id=parent_folder_id) def show_folder( - self, folder_id: str, contents: bool = False, limit: Optional[int] = 10, offset: Optional[int] = 0 + self, + folder_id: str, + contents: bool = False, + limit: Optional[int] = 10, + offset: Optional[int] = 0, + include_deleted: bool = False, ) -> Dict[str, Any]: """ Display information about a folder. @@ -64,10 +69,13 @@ def show_folder( :type offset: int :param contents: Return contents from this specified position (default: 0). + :type include_deleted: bool + :param include_deleted: Returns also deleted contents. + :rtype: dict :return: dictionary including details of the folder """ - params = {} + params: Dict[str, Any] = {"include_deleted": include_deleted} if limit: params["limit"] = limit if offset: From f5a26d67812cb0ea74599358e063eaa9a3bd93ed Mon Sep 17 00:00:00 2001 From: M Bernt Date: Thu, 30 Jan 2025 18:32:38 +0100 Subject: [PATCH 03/23] Simply test subfolder creation Co-authored-by: Nicola Soranzo --- bioblend/_tests/TestGalaxyFolders.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index a589eb018..078f27584 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -41,9 +41,7 @@ def test_show_folder_contents(self): @test_util.skip_unless_galaxy("release_21.05") def test_show_folder_contents_limit(self): - subfolders = [] - for i in range(12): - subfolders.append(self.gi.folders.create_folder(self.folder["id"], f"{self.name} {i}")) + subfolders = [self.gi.folders.create_folder(self.folder["id"], f"{self.name} {i}") for i in range(12)] # check defaults for limit and offset f2 = self.gi.folders.show_folder(self.folder["id"], contents=True) From 107d985bdb55aec7da69a4593f0c96d3fc3ba3cb Mon Sep 17 00:00:00 2001 From: M Bernt Date: Thu, 30 Jan 2025 18:33:43 +0100 Subject: [PATCH 04/23] Just use the upstream default values Co-authored-by: Nicola Soranzo --- bioblend/galaxy/folders/__init__.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index b2c3c992f..0d7f53287 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -49,8 +49,8 @@ def show_folder( self, folder_id: str, contents: bool = False, - limit: Optional[int] = 10, - offset: Optional[int] = 0, + limit: int = 10, + offset: int = 0, include_deleted: bool = False, ) -> Dict[str, Any]: """ @@ -75,11 +75,11 @@ def show_folder( :rtype: dict :return: dictionary including details of the folder """ - params: Dict[str, Any] = {"include_deleted": include_deleted} - if limit: - params["limit"] = limit - if offset: - params["offset"] = offset + params = { + "limit": limit, + "offset": offset, + "include_deleted": include_deleted, + } return self._get(id=folder_id, contents=contents, params=params) def delete_folder(self, folder_id: str, undelete: bool = False) -> Dict[str, Any]: From 82dc9cbc498ecfad7f3893e6b954f49c38cfa54c Mon Sep 17 00:00:00 2001 From: M Bernt Date: Thu, 30 Jan 2025 18:38:10 +0100 Subject: [PATCH 05/23] Revert to loop and drop subfolders variable Co-authored-by: Nicola Soranzo --- bioblend/_tests/TestGalaxyFolders.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index 078f27584..53ad5aeb6 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -41,7 +41,8 @@ def test_show_folder_contents(self): @test_util.skip_unless_galaxy("release_21.05") def test_show_folder_contents_limit(self): - subfolders = [self.gi.folders.create_folder(self.folder["id"], f"{self.name} {i}") for i in range(12)] + for i in range(12): + self.gi.folders.create_folder(self.folder["id"], f"{self.name} {i}") # check defaults for limit and offset f2 = self.gi.folders.show_folder(self.folder["id"], contents=True) From 5f22c37490a23569a60583813d8d9ee3da323a09 Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Thu, 30 Jan 2025 18:38:38 +0100 Subject: [PATCH 06/23] add test for include_deleted --- bioblend/_tests/TestGalaxyFolders.py | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index 078f27584..29541a862 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -53,6 +53,37 @@ def test_show_folder_contents_limit(self): assert len(f2["folder_contents"]) == 1 assert f2["folder_contents"][0]["name"] == f"{self.name} 1" + def test_show_folder_contents_include_deleted(self): + history = self.gi.histories.create_history(name="Test History") + self._test_dataset(history["id"]) + contents = self.gi.histories.show_history(history["id"], contents=True, types=["dataset"]) + hda = contents[0] + + # create 2 library data sets within a new folder in the library + subfolder = self.gi.folders.create_folder(self.folder["id"], f"{self.name}") + ldda1 = self.gi.libraries.copy_from_dataset( + library_id=self.library["id"], dataset_id=hda["id"], folder_id=subfolder["id"], message="Added HDA" + ) + ldda2 = self.gi.libraries.copy_from_dataset( + library_id=self.library["id"], dataset_id=hda["id"], folder_id=subfolder["id"], message="Added HDA" + ) + subfolder_info = self.gi.folders.show_folder(subfolder["id"], contents=True) + assert len(subfolder_info["folder_contents"]) == 2 + assert subfolder_info["folder_contents"][0]["type"] == "file" + + # delete the library datasets and check if include_deleted works + self.gi.libraries.delete_library_dataset(self.library["id"], ldda1["id"]) + self.gi.libraries.delete_library_dataset(self.library["id"], ldda2["id"], purged=True) + subfolder_info = self.gi.folders.show_folder(subfolder["id"], contents=True, include_deleted=True) + assert len(subfolder_info["folder_contents"]) == 2 + subfolder_info = self.gi.folders.show_folder(subfolder["id"], contents=True) + assert len(subfolder_info["folder_contents"]) == 0 + + # delete the library folder + self.gi.folders.delete_folder(subfolder["id"]) + self.gi.histories.delete_dataset(history["id"], hda["id"]) + self.gi.histories.delete_history(history["id"]) + def test_delete_folder(self): self.sub_folder = self.gi.folders.create_folder(self.folder["id"], self.name) self.gi.folders.delete_folder(self.sub_folder["id"]) From 7a36f0aa8522007d2fb2986944bdb5c2dcb864fc Mon Sep 17 00:00:00 2001 From: M Bernt Date: Thu, 30 Jan 2025 19:42:13 +0100 Subject: [PATCH 07/23] Simplify test Co-authored-by: Nicola Soranzo --- bioblend/_tests/TestGalaxyFolders.py | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index a802cf9e6..808518294 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -56,29 +56,26 @@ def test_show_folder_contents_limit(self): def test_show_folder_contents_include_deleted(self): history = self.gi.histories.create_history(name="Test History") - self._test_dataset(history["id"]) - contents = self.gi.histories.show_history(history["id"], contents=True, types=["dataset"]) - hda = contents[0] + hda_id = self._test_dataset(history["id"]) - # create 2 library data sets within a new folder in the library - subfolder = self.gi.folders.create_folder(self.folder["id"], f"{self.name}") + # Create 2 library datasets into the library folder ldda1 = self.gi.libraries.copy_from_dataset( - library_id=self.library["id"], dataset_id=hda["id"], folder_id=subfolder["id"], message="Added HDA" + library_id=self.library["id"], dataset_id=hda_id, folder_id=self.folder["id"], message="Added HDA" ) ldda2 = self.gi.libraries.copy_from_dataset( - library_id=self.library["id"], dataset_id=hda["id"], folder_id=subfolder["id"], message="Added HDA" + library_id=self.library["id"], dataset_id=hda_id, folder_id=self.folder["id"], message="Added HDA" ) - subfolder_info = self.gi.folders.show_folder(subfolder["id"], contents=True) - assert len(subfolder_info["folder_contents"]) == 2 - assert subfolder_info["folder_contents"][0]["type"] == "file" + folder_info = self.gi.folders.show_folder(self.folder["id"], contents=True) + assert len(folder_info["folder_contents"]) == 2 + assert folder_info["folder_contents"][0]["type"] == "file" - # delete the library datasets and check if include_deleted works + # Delete the library datasets and check if include_deleted works self.gi.libraries.delete_library_dataset(self.library["id"], ldda1["id"]) self.gi.libraries.delete_library_dataset(self.library["id"], ldda2["id"], purged=True) - subfolder_info = self.gi.folders.show_folder(subfolder["id"], contents=True, include_deleted=True) - assert len(subfolder_info["folder_contents"]) == 2 - subfolder_info = self.gi.folders.show_folder(subfolder["id"], contents=True) - assert len(subfolder_info["folder_contents"]) == 0 + folder_info = self.gi.folders.show_folder(self.folder["id"], contents=True, include_deleted=True) + assert len(folder_info["folder_contents"]) == 2 + folder_info = self.gi.folders.show_folder(self.folder["id"], contents=True) + assert len(folder_info["folder_contents"]) == 0 # delete the library folder self.gi.folders.delete_folder(subfolder["id"]) From 40a7810d5df1f5b409a5e1db1ba4604444ed81b8 Mon Sep 17 00:00:00 2001 From: M Bernt Date: Thu, 30 Jan 2025 19:42:28 +0100 Subject: [PATCH 08/23] Simplify test Co-authored-by: Nicola Soranzo --- bioblend/_tests/TestGalaxyFolders.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index 808518294..e810a5a40 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -77,9 +77,6 @@ def test_show_folder_contents_include_deleted(self): folder_info = self.gi.folders.show_folder(self.folder["id"], contents=True) assert len(folder_info["folder_contents"]) == 0 - # delete the library folder - self.gi.folders.delete_folder(subfolder["id"]) - self.gi.histories.delete_dataset(history["id"], hda["id"]) self.gi.histories.delete_history(history["id"]) def test_delete_folder(self): From e64a4caf248d38844bccf7a1e57e2c8606921cb2 Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Thu, 30 Jan 2025 20:26:19 +0100 Subject: [PATCH 09/23] test content counts --- bioblend/_tests/TestGalaxyFolders.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index e810a5a40..1659d4103 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -73,9 +73,18 @@ def test_show_folder_contents_include_deleted(self): self.gi.libraries.delete_library_dataset(self.library["id"], ldda1["id"]) self.gi.libraries.delete_library_dataset(self.library["id"], ldda2["id"], purged=True) folder_info = self.gi.folders.show_folder(self.folder["id"], contents=True, include_deleted=True) + # check if there are 2 contents and the number is correct assert len(folder_info["folder_contents"]) == 2 + assert folder_info["metadata"]["total_rows"] == 2 + # if called without contents=True an item_count is reported .. lets also check this + folder_info = self.gi.folders.show_folder(self.folder["id"], include_deleted=True) + assert folder_info["item_count"] == 2 + folder_info = self.gi.folders.show_folder(self.folder["id"], contents=True) assert len(folder_info["folder_contents"]) == 0 + assert folder_info["metadata"]["total_rows"] == 0 + folder_info = self.gi.folders.show_folder(self.folder["id"]) + assert folder_info["item_count"] == 0 self.gi.histories.delete_history(history["id"]) From a7c2ff6c9504fdbeff1b9ae40e7479ae7ff43e5c Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Thu, 30 Jan 2025 22:05:01 +0100 Subject: [PATCH 10/23] fix test and add docs --- bioblend/_tests/TestGalaxyFolders.py | 3 ++- bioblend/galaxy/folders/__init__.py | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index 1659d4103..0317254e8 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -83,8 +83,9 @@ def test_show_folder_contents_include_deleted(self): folder_info = self.gi.folders.show_folder(self.folder["id"], contents=True) assert len(folder_info["folder_contents"]) == 0 assert folder_info["metadata"]["total_rows"] == 0 + # show folders with contents=False does not respect include_deleted folder_info = self.gi.folders.show_folder(self.folder["id"]) - assert folder_info["item_count"] == 0 + assert folder_info["item_count"] == 2 self.gi.histories.delete_history(history["id"]) diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index 0d7f53287..db730ba71 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -65,12 +65,15 @@ def show_folder( :type limit: int :param limit: Maximum number of contents to return (default: 10). + Only considered for contents=True. :type offset: int :param contents: Return contents from this specified position (default: 0). + Only considered for contents=True. :type include_deleted: bool :param include_deleted: Returns also deleted contents. + Only considered for contents=True. :rtype: dict :return: dictionary including details of the folder From 11e879307346ca7588775e6ddab5a55557307f2a Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Fri, 31 Jan 2025 09:53:35 +0100 Subject: [PATCH 11/23] total_rows became available only after https://github.com/galaxyproject/galaxy/pull/10204 --- bioblend/_tests/TestGalaxyFolders.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index 0317254e8..332c38e73 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -54,6 +54,7 @@ def test_show_folder_contents_limit(self): assert len(f2["folder_contents"]) == 1 assert f2["folder_contents"][0]["name"] == f"{self.name} 1" + @test_util.skip_unless_galaxy("release_21.01") def test_show_folder_contents_include_deleted(self): history = self.gi.histories.create_history(name="Test History") hda_id = self._test_dataset(history["id"]) From 30c4c91e5b931effeaf15b5af9d1df5275e6049b Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Fri, 31 Jan 2025 12:11:26 +0100 Subject: [PATCH 12/23] add contents generator --- bioblend/_tests/TestGalaxyFolders.py | 15 ++++++++++++ bioblend/galaxy/datasets/__init__.py | 7 ++++++ bioblend/galaxy/folders/__init__.py | 35 ++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index 332c38e73..dc393e9f7 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -54,6 +54,21 @@ def test_show_folder_contents_limit(self): assert len(f2["folder_contents"]) == 1 assert f2["folder_contents"][0]["name"] == f"{self.name} 1" + @test_util.skip_unless_galaxy("release_21.05") + def test_folder_contents(self): + for i in range(12): + self.gi.folders.create_folder(self.folder["id"], f"{self.name} {i}") + + # check defaults for limit and offset + f2 = list(self.gi.folders.contents(self.folder["id"])) + assert len(f2) == 12 + assert f2[0]["name"] == f"{self.name} 0" + + # check non defaults + f2 = list(self.gi.folders.contents(self.folder["id"], limit=1)) + assert len(f2) == 12 + assert f2[0]["name"] == f"{self.name} 0" + @test_util.skip_unless_galaxy("release_21.01") def test_show_folder_contents_include_deleted(self): history = self.gi.histories.create_history(name="Test History") diff --git a/bioblend/galaxy/datasets/__init__.py b/bioblend/galaxy/datasets/__init__.py index f164fddeb..c4cdad1ac 100644 --- a/bioblend/galaxy/datasets/__init__.py +++ b/bioblend/galaxy/datasets/__init__.py @@ -64,6 +64,13 @@ def show_dataset(self, dataset_id: str, hda_ldda: HdaLdda = "hda") -> Dict[str, } return self._get(id=dataset_id, params=params) + # def delete(self, dataset_ids, hda_ldda: HdaLdda = "hda", purge: bool = False) -> Dict[str, Any]: + # datasets = [] + # for dataset_id in dataset_ids: + # datasets.append({"src": hda_ldda, "id": dataset_id}) + # payload = {"datasets": datasets, "purge": purge} + # return self._delete(payload=payload) + def _initiate_download( self, dataset_id: str, stream_content: bool, require_ok_state: bool = True, maxwait: float = 12000 ) -> Tuple[Dict[str, Any], str, Response]: diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index db730ba71..45495a404 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -5,6 +5,7 @@ from typing import ( Any, Dict, + Iterable, List, Literal, Optional, @@ -85,6 +86,40 @@ def show_folder( } return self._get(id=folder_id, contents=contents, params=params) + def contents( + self, + folder_id: str, + limit: int = 10, + include_deleted: bool = False, + ) -> Iterable[Dict[str, Any]]: + """ + Iterate over folder contents. + + :type folder_id: str + :param folder_id: the folder's encoded id, prefixed by 'F' + + :type limit: int + :param limit: Batch size to be used internally (default: 10). + + :type include_deleted: bool + :param include_deleted: Include also deleted contents. + + :rtype: dict + :return: A generator for the folder contents + """ + total_rows: Optional[int] = None + params = { + "limit": limit, + "offset": 0, + "include_deleted": include_deleted, + } + + while total_rows is None or params["offset"] <= total_rows: + chunk = self._get(id=folder_id, contents=True, params=params) + total_rows = chunk["metadata"]["total_rows"] + yield from chunk["folder_contents"] + params["offset"] += limit + def delete_folder(self, folder_id: str, undelete: bool = False) -> Dict[str, Any]: """ Marks the folder with the given ``id`` as `deleted` (or removes the From 4a46da3b1e79a647b8d1cba9effdb9f10f906f03 Mon Sep 17 00:00:00 2001 From: M Bernt Date: Sat, 1 Feb 2025 14:33:09 +0100 Subject: [PATCH 13/23] Rename content to content_iter Co-authored-by: Nicola Soranzo --- bioblend/_tests/TestGalaxyFolders.py | 6 +++--- bioblend/galaxy/folders/__init__.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index dc393e9f7..8110734e7 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -55,17 +55,17 @@ def test_show_folder_contents_limit(self): assert f2["folder_contents"][0]["name"] == f"{self.name} 1" @test_util.skip_unless_galaxy("release_21.05") - def test_folder_contents(self): + def test_folder_contents_iter(self): for i in range(12): self.gi.folders.create_folder(self.folder["id"], f"{self.name} {i}") # check defaults for limit and offset - f2 = list(self.gi.folders.contents(self.folder["id"])) + f2 = list(self.gi.folders.contents_iter(self.folder["id"])) assert len(f2) == 12 assert f2[0]["name"] == f"{self.name} 0" # check non defaults - f2 = list(self.gi.folders.contents(self.folder["id"], limit=1)) + f2 = list(self.gi.folders.contents_iter(self.folder["id"], limit=1)) assert len(f2) == 12 assert f2[0]["name"] == f"{self.name} 0" diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index 45495a404..3eb9d449b 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -86,7 +86,7 @@ def show_folder( } return self._get(id=folder_id, contents=contents, params=params) - def contents( + def contents_iter( self, folder_id: str, limit: int = 10, From 687d281c008244447288aebb48a7535889d815cc Mon Sep 17 00:00:00 2001 From: M Bernt Date: Tue, 4 Feb 2025 09:11:30 +0100 Subject: [PATCH 14/23] Use sys.maxsize for iteration Co-authored-by: Nicola Soranzo --- bioblend/galaxy/folders/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index 3eb9d449b..c210f6f64 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -2,6 +2,7 @@ Contains possible interactions with the Galaxy library folders """ +import sys from typing import ( Any, Dict, @@ -107,14 +108,14 @@ def contents_iter( :rtype: dict :return: A generator for the folder contents """ - total_rows: Optional[int] = None + total_rows = sys.maxsize params = { "limit": limit, "offset": 0, "include_deleted": include_deleted, } - while total_rows is None or params["offset"] <= total_rows: + while params["offset"] <= total_rows: chunk = self._get(id=folder_id, contents=True, params=params) total_rows = chunk["metadata"]["total_rows"] yield from chunk["folder_contents"] From 2f93514ed6242125035ccabe35daeafa0334f8c7 Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Tue, 4 Feb 2025 09:21:04 +0100 Subject: [PATCH 15/23] overload show_folder --- bioblend/galaxy/folders/__init__.py | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index c210f6f64..3ec97c08c 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -10,6 +10,7 @@ List, Literal, Optional, + overload, TYPE_CHECKING, Union, ) @@ -47,6 +48,22 @@ def create_folder(self, parent_folder_id: str, name: str, description: Optional[ payload["description"] = description return self._post(payload=payload, id=parent_folder_id) + @overload + def show_folder( + self, + folder_id: str, + ) -> Dict[str, Any]: ... + + @overload + def show_folder( + self, + folder_id: str, + contents: bool = False, + limit: int = 10, + offset: int = 0, + include_deleted: bool = False, + ) -> Dict[str, Any]: ... + def show_folder( self, folder_id: str, @@ -78,7 +95,13 @@ def show_folder( Only considered for contents=True. :rtype: dict - :return: dictionary including details of the folder + :return: dictionary including details of the folder. + For contents=False the dict contains infos on the folder. + For contents=True the dict contains the keys "metadata" (a dict with + infos on the folder) and "folder_contents" (a list of dicts with info + on the childs). + + Notes: For iterating over folder contents there is also contents_iter. """ params = { "limit": limit, From a90a19da1093c66974e1f8786a30ae4f9831ea1d Mon Sep 17 00:00:00 2001 From: M Bernt Date: Tue, 4 Feb 2025 13:11:11 +0100 Subject: [PATCH 16/23] Apply suggestions from code review Co-authored-by: Nicola Soranzo --- bioblend/galaxy/folders/__init__.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index 3ec97c08c..40de1f4de 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -52,13 +52,14 @@ def create_folder(self, parent_folder_id: str, name: str, description: Optional[ def show_folder( self, folder_id: str, + contents: Literal[False] = False, ) -> Dict[str, Any]: ... @overload def show_folder( self, folder_id: str, - contents: bool = False, + contents: Literal[True], limit: int = 10, offset: int = 0, include_deleted: bool = False, @@ -83,16 +84,15 @@ def show_folder( than just the folder details. :type limit: int - :param limit: Maximum number of contents to return (default: 10). - Only considered for contents=True. + :param limit: When ``contents=True``, maximum number of items to return. :type offset: int - :param contents: Return contents from this specified position (default: 0). - Only considered for contents=True. + :param contents: When ``contents=True``, number of items to skip. Return + contents starting with item offset+1. :type include_deleted: bool - :param include_deleted: Returns also deleted contents. - Only considered for contents=True. + :param include_deleted: When ``contents=True``, whether to include + deleted items. :rtype: dict :return: dictionary including details of the folder. @@ -123,10 +123,10 @@ def contents_iter( :param folder_id: the folder's encoded id, prefixed by 'F' :type limit: int - :param limit: Batch size to be used internally (default: 10). + :param limit: Batch size to be used internally. :type include_deleted: bool - :param include_deleted: Include also deleted contents. + :param include_deleted: Whether to include deleted items. :rtype: dict :return: A generator for the folder contents From 9317cb127735935072838cda27d0a724b99c2969 Mon Sep 17 00:00:00 2001 From: M Bernt Date: Tue, 4 Feb 2025 13:31:29 +0100 Subject: [PATCH 17/23] Update bioblend/_tests/TestGalaxyFolders.py Co-authored-by: Nicola Soranzo --- bioblend/_tests/TestGalaxyFolders.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index 8110734e7..89ad515be 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -92,9 +92,6 @@ def test_show_folder_contents_include_deleted(self): # check if there are 2 contents and the number is correct assert len(folder_info["folder_contents"]) == 2 assert folder_info["metadata"]["total_rows"] == 2 - # if called without contents=True an item_count is reported .. lets also check this - folder_info = self.gi.folders.show_folder(self.folder["id"], include_deleted=True) - assert folder_info["item_count"] == 2 folder_info = self.gi.folders.show_folder(self.folder["id"], contents=True) assert len(folder_info["folder_contents"]) == 0 From b442c174864ea260b52b976e2e314befbde5fb9c Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Tue, 4 Feb 2025 15:55:12 +0100 Subject: [PATCH 18/23] revert accidental change --- bioblend/galaxy/datasets/__init__.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/bioblend/galaxy/datasets/__init__.py b/bioblend/galaxy/datasets/__init__.py index c4cdad1ac..f164fddeb 100644 --- a/bioblend/galaxy/datasets/__init__.py +++ b/bioblend/galaxy/datasets/__init__.py @@ -64,13 +64,6 @@ def show_dataset(self, dataset_id: str, hda_ldda: HdaLdda = "hda") -> Dict[str, } return self._get(id=dataset_id, params=params) - # def delete(self, dataset_ids, hda_ldda: HdaLdda = "hda", purge: bool = False) -> Dict[str, Any]: - # datasets = [] - # for dataset_id in dataset_ids: - # datasets.append({"src": hda_ldda, "id": dataset_id}) - # payload = {"datasets": datasets, "purge": purge} - # return self._delete(payload=payload) - def _initiate_download( self, dataset_id: str, stream_content: bool, require_ok_state: bool = True, maxwait: float = 12000 ) -> Tuple[Dict[str, Any], str, Response]: From 080f24a3a489833b0179ee91379436cf65c10c46 Mon Sep 17 00:00:00 2001 From: M Bernt Date: Tue, 4 Feb 2025 15:58:09 +0100 Subject: [PATCH 19/23] rewording Co-authored-by: Nicola Soranzo --- bioblend/galaxy/folders/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index 40de1f4de..5dc46abb0 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -88,7 +88,7 @@ def show_folder( :type offset: int :param contents: When ``contents=True``, number of items to skip. Return - contents starting with item offset+1. + contents starting from item offset+1. :type include_deleted: bool :param include_deleted: When ``contents=True``, whether to include From 136fc5ec7dfd2f36ebe37594fcc67da9a84c2d97 Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Tue, 4 Feb 2025 17:00:28 +0100 Subject: [PATCH 20/23] return is Iterator --- bioblend/galaxy/folders/__init__.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index 40de1f4de..c1a2a2796 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -6,7 +6,7 @@ from typing import ( Any, Dict, - Iterable, + Iterator, List, Literal, Optional, @@ -115,7 +115,7 @@ def contents_iter( folder_id: str, limit: int = 10, include_deleted: bool = False, - ) -> Iterable[Dict[str, Any]]: + ) -> Iterator[Dict[str, Any]]: """ Iterate over folder contents. @@ -127,9 +127,6 @@ def contents_iter( :type include_deleted: bool :param include_deleted: Whether to include deleted items. - - :rtype: dict - :return: A generator for the folder contents """ total_rows = sys.maxsize params = { From 7a6ee4a5c89c634c31d31b059eeb2a65387bb8d3 Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Tue, 4 Feb 2025 17:02:44 +0100 Subject: [PATCH 21/23] rename limit --- bioblend/galaxy/folders/__init__.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index c1a2a2796..26d4f18a0 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -113,7 +113,7 @@ def show_folder( def contents_iter( self, folder_id: str, - limit: int = 10, + batch_size: int = 10, include_deleted: bool = False, ) -> Iterator[Dict[str, Any]]: """ @@ -122,7 +122,7 @@ def contents_iter( :type folder_id: str :param folder_id: the folder's encoded id, prefixed by 'F' - :type limit: int + :type batch_size: int :param limit: Batch size to be used internally. :type include_deleted: bool @@ -130,7 +130,7 @@ def contents_iter( """ total_rows = sys.maxsize params = { - "limit": limit, + "limit": batch_size, "offset": 0, "include_deleted": include_deleted, } From 9ce501387f4f585273fcdd5043309c5cc20f7e2d Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Tue, 4 Feb 2025 17:08:48 +0100 Subject: [PATCH 22/23] finish parameter renaming --- bioblend/galaxy/folders/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bioblend/galaxy/folders/__init__.py b/bioblend/galaxy/folders/__init__.py index 35710007d..9c1fc79ad 100644 --- a/bioblend/galaxy/folders/__init__.py +++ b/bioblend/galaxy/folders/__init__.py @@ -123,7 +123,7 @@ def contents_iter( :param folder_id: the folder's encoded id, prefixed by 'F' :type batch_size: int - :param limit: Batch size to be used internally. + :param batch_size: Batch size to be used internally. :type include_deleted: bool :param include_deleted: Whether to include deleted items. @@ -139,7 +139,7 @@ def contents_iter( chunk = self._get(id=folder_id, contents=True, params=params) total_rows = chunk["metadata"]["total_rows"] yield from chunk["folder_contents"] - params["offset"] += limit + params["offset"] += batch_size def delete_folder(self, folder_id: str, undelete: bool = False) -> Dict[str, Any]: """ From a0b9337ae87365ff1e907d3143534a21a1c3525b Mon Sep 17 00:00:00 2001 From: Matthias Bernt Date: Tue, 4 Feb 2025 17:12:49 +0100 Subject: [PATCH 23/23] more missing renaming --- bioblend/_tests/TestGalaxyFolders.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bioblend/_tests/TestGalaxyFolders.py b/bioblend/_tests/TestGalaxyFolders.py index 89ad515be..4c1a8e98e 100644 --- a/bioblend/_tests/TestGalaxyFolders.py +++ b/bioblend/_tests/TestGalaxyFolders.py @@ -65,7 +65,7 @@ def test_folder_contents_iter(self): assert f2[0]["name"] == f"{self.name} 0" # check non defaults - f2 = list(self.gi.folders.contents_iter(self.folder["id"], limit=1)) + f2 = list(self.gi.folders.contents_iter(self.folder["id"], batch_size=1)) assert len(f2) == 12 assert f2[0]["name"] == f"{self.name} 0"