diff --git a/docs/usage/layout.rst b/docs/usage/layout.rst index 245b5325..a86c6c10 100644 --- a/docs/usage/layout.rst +++ b/docs/usage/layout.rst @@ -360,6 +360,8 @@ Operation - :py:meth:`ee.Asset.unlink `: :docstring:`geetools.Asset.unlink` - :py:meth:`ee.Asset.delete `: :docstring:`geetools.Asset.delete` - :py:meth:`ee.Asset.copy `: :docstring:`geetools.Asset.copy` +- :py:meth:`ee.Asset.glob `: :docstring:`geetools.Asset.glob` +- :py:meth:`ee.Asset.rglob `: :docstring:`geetools.Asset.rglob` Property ######## diff --git a/geetools/Asset/__init__.py b/geetools/Asset/__init__.py index 6479fc08..81cb6502 100644 --- a/geetools/Asset/__init__.py +++ b/geetools/Asset/__init__.py @@ -682,3 +682,31 @@ def copy(self, new_asset: Asset, overwrite: bool = False) -> Asset: ee.data.copyAsset(self.as_posix(), new_asset.as_posix(), allowOverwrite=True) return new_asset + + def glob(self, pattern: str) -> list: + """Return a list of assets matching the pattern. + + Args: + pattern: The pattern to match with the asset name. + + Examples: + .. code-block:: python + + asset = ee.Asset("projects/ee-geetools/assets/folder") + asset.glob("image_*") + """ + return [a for a in self.iterdir(recursive=False) if a.match(pattern)] + + def rglob(self, pattern: str) -> list: + """Return a list of assets matching the pattern recursively. + + Args: + pattern: The pattern to match with the asset name. + + Examples: + .. code-block:: python + + asset = ee.Asset("projects/ee-geetools/assets/folder") + asset.rglob("image_*") + """ + return [a for a in self.iterdir(recursive=True) if a.match(pattern)] diff --git a/tests/test_Asset.py b/tests/test_Asset.py index ff0c00c7..4df146b5 100644 --- a/tests/test_Asset.py +++ b/tests/test_Asset.py @@ -216,6 +216,22 @@ def test_iterdir_nodir(self, gee_test_folder): with pytest.raises(ValueError): (ee.Asset(gee_test_folder) / "folder" / "image").iterdir() + def test_glob(self, gee_test_folder, gee_hash, data_regression): + folder = ee.Asset(gee_test_folder) / "folder" + assets = [ + str(a).replace(EARTHENGINE_PROJECT, "ee-project").replace(gee_hash, "hash") + for a in folder.glob("*/image") + ] + data_regression.check(assets) + + def test_rglob(self, gee_test_folder, gee_hash, data_regression): + folder = ee.Asset(gee_test_folder) / "folder" + assets = [ + str(a).replace(EARTHENGINE_PROJECT, "ee-project").replace(gee_hash, "hash") + for a in folder.rglob("*/image") + ] + data_regression.check(assets) + def test_mkdir(self, gee_test_folder): gee_test_folder = ee.Asset(gee_test_folder) asset = (gee_test_folder / "new_mkdir_folder").mkdir() diff --git a/tests/test_Asset/test_glob.yml b/tests/test_Asset/test_glob.yml new file mode 100644 index 00000000..5f21f759 --- /dev/null +++ b/tests/test_Asset/test_glob.yml @@ -0,0 +1 @@ +- projects/ee-project/assets/hash/folder/image diff --git a/tests/test_Asset/test_rglob.yml b/tests/test_Asset/test_rglob.yml new file mode 100644 index 00000000..8f013e97 --- /dev/null +++ b/tests/test_Asset/test_rglob.yml @@ -0,0 +1,2 @@ +- projects/ee-project/assets/hash/folder/image +- projects/ee-project/assets/hash/folder/subfolder/image