From 62d4e96377ade47af19f0bbdc4e9b84cf6d3c6fc Mon Sep 17 00:00:00 2001 From: An Qiuyu Date: Fri, 5 Sep 2025 22:13:10 +0800 Subject: [PATCH 1/2] feat: Add Azure Blob Storage provider plugin configuration --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 38793a1b9..598c98f06 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -90,6 +90,7 @@ box = "waterbutler.providers.box:BoxProvider" googledrive = "waterbutler.providers.googledrive:GoogleDriveProvider" onedrive = "waterbutler.providers.onedrive:OneDriveProvider" googlecloud = "waterbutler.providers.googlecloud:GoogleCloudProvider" +azureblobstorage = "waterbutler.providers.azureblobstorage:AzureBlobStorageProvider" [tool.pytest.ini_options] asyncio_default_fixture_loop_scope = "function" From 1135da6ab6df8d96f77d944b70c8e5ff4079cfb4 Mon Sep 17 00:00:00 2001 From: An Qiuyu Date: Tue, 9 Sep 2025 08:20:35 +0800 Subject: [PATCH 2/2] fix: add metadata dehydrate/rehydrate for rename operation --- .../providers/azureblobstorage/test_metadata.py | 6 +++--- .../providers/azureblobstorage/metadata.py | 16 ++++++++++++---- .../providers/azureblobstorage/provider.py | 3 +-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/tests/providers/azureblobstorage/test_metadata.py b/tests/providers/azureblobstorage/test_metadata.py index a7307fb34..b65193530 100644 --- a/tests/providers/azureblobstorage/test_metadata.py +++ b/tests/providers/azureblobstorage/test_metadata.py @@ -19,7 +19,7 @@ def test_file_metadata_from_headers(self, blob_properties_headers): """Test creating file metadata from HTTP headers""" path = WaterButlerPath('/test-file.xlsx') - metadata = AzureBlobStorageFileMetadataHeaders(path.path, blob_properties_headers) + metadata = AzureBlobStorageFileMetadataHeaders(blob_properties_headers, path.path) assert metadata.name == 'test-file.xlsx' assert metadata.path == '/test-file.xlsx' @@ -74,7 +74,7 @@ def test_file_metadata_minimal(self): } path = WaterButlerPath('/minimal.txt') - metadata = AzureBlobStorageFileMetadataHeaders(path.path, headers) + metadata = AzureBlobStorageFileMetadataHeaders(headers, path.path) assert metadata.name == 'minimal.txt' assert metadata.size == 100 @@ -108,7 +108,7 @@ def test_file_metadata_serialization(self): } path = WaterButlerPath('/report.pdf') - metadata = AzureBlobStorageFileMetadataHeaders(path.path, headers) + metadata = AzureBlobStorageFileMetadataHeaders(headers, path.path) assert metadata.name == 'report.pdf' assert metadata.size == 2048000 diff --git a/waterbutler/providers/azureblobstorage/metadata.py b/waterbutler/providers/azureblobstorage/metadata.py index ccff59805..b1936cfdd 100644 --- a/waterbutler/providers/azureblobstorage/metadata.py +++ b/waterbutler/providers/azureblobstorage/metadata.py @@ -2,9 +2,6 @@ from waterbutler.core import utils from waterbutler.core import metadata -import logging - -logger = logging.getLogger(__name__) def strip_char(str, chars): @@ -30,10 +27,21 @@ def created_utc(self): class AzureBlobStorageFileMetadataHeaders(AzureBlobStorageMetadata, metadata.BaseFileMetadata): - def __init__(self, path, headers): + def __init__(self, headers, path): self._path = path super().__init__(dict(headers)) + def _dehydrate(self): + payload = super()._dehydrate() + payload['_path'] = self._path + return payload + + @classmethod + def _rehydrate(cls, payload): + args = super()._rehydrate(payload) + args.append(payload['_path']) + return args + @property def path(self): return '/' + strip_char(self._path, self.raw.get('base_folder', '')) diff --git a/waterbutler/providers/azureblobstorage/provider.py b/waterbutler/providers/azureblobstorage/provider.py index 261b8b488..965f1ed5f 100644 --- a/waterbutler/providers/azureblobstorage/provider.py +++ b/waterbutler/providers/azureblobstorage/provider.py @@ -327,7 +327,7 @@ async def _metadata_file(self, path, revision=None): expects=(200,), throws=exceptions.MetadataError ) - return AzureBlobStorageFileMetadataHeaders(path.path, resp.headers) + return AzureBlobStorageFileMetadataHeaders(resp.headers, path.path) async def _metadata_folder(self, path): """Get metadata for a folder (list contents).""" @@ -462,7 +462,6 @@ def _convert_xml_to_blob_list(self, xml_body): name_elem = prefix.find('Name') if name_elem is not None: result['BlobPrefix'].append({'Name': name_elem.text}) - logger.info(f'Parsed XML to blob list: {result}') return result except ET.ParseError as e: