Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 14 additions & 17 deletions syft/sync/connections/drive/drive_cached_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -295,16 +295,11 @@ def reset_caches(self) -> None:

def get_syftbox_folder_id(self) -> str:
"""/SyftBox"""
# cached
if self._syftbox_folder_id:
return self._syftbox_folder_id
else:
syftbox_folder_id = self.get_syftbox_folder_id_from_drive()
if syftbox_folder_id:
self._syftbox_folder_id = syftbox_folder_id
return self._syftbox_folder_id
else:
return self.create_syftbox_folder()
if self._syftbox_folder_id is None:
self._syftbox_folder_id = (
self.get_syftbox_folder_id_from_drive() or self.create_syftbox_folder()
)
return self._syftbox_folder_id

def get_syftbox_folder_id_from_drive(self) -> str | None:
query = f"name='{SYFTBOX_FOLDER}' and mimeType='application/vnd.google-apps.folder' and 'me' in owners and trashed=false"
Expand All @@ -323,8 +318,14 @@ def create_syftbox_folder(self) -> str:

def get_personal_syftbox_folder_id(self) -> str:
"""/SyftBox/{version}#{email}"""
if self._personal_syftbox_folder_id:
return self._personal_syftbox_folder_id
if self._personal_syftbox_folder_id is None:
self._personal_syftbox_folder_id = (
self.get_personal_syftbox_folder_id_from_drive()
or self.create_personal_syftbox_folder()
)
return self._personal_syftbox_folder_id

def get_personal_syftbox_folder_id_from_drive(self) -> str | None:
folders = self.client.find_folders(
name_contains=[f"#{self.email}"],
parent_id=self.get_syftbox_folder_id(),
Expand All @@ -334,14 +335,10 @@ def get_personal_syftbox_folder_id(self) -> str:
# '#{peer}#{type}#{email}'. Personal folder shape is exactly
# '{version}#{email}', so require a single '#'.
folders = [(fid, name) for fid, name in folders if name.count("#") == 1]
folder_id = self.find_or_adopt_versioned_folder(
return self.find_or_adopt_versioned_folder(
folders,
current_name=GdrivePersonalSyftboxFolder(email=self.email).as_string(),
)
if folder_id:
self._personal_syftbox_folder_id = folder_id
return folder_id
return self.create_personal_syftbox_folder()

def create_personal_syftbox_folder(self) -> str:
"""Creates /SyftBox/{version}#{email}"""
Expand Down
14 changes: 14 additions & 0 deletions tests/unit/test_drive_connections.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import syft.sync.connections.connection_router as connection_router_module
from syft.sync.connections.connection_router import ConnectionRouter
from syft.sync.connections.drive import mock_drive_service
from syft.sync.connections.drive.drive_cached_client import DriveCachedClient
from syft.sync.connections.drive.drive_collections import (
CollectionFolder,
DriveCollections,
Expand All @@ -28,6 +29,8 @@
from syft.sync.connections.drive.gdrive_client import GDriveClient
from syft.sync.connections.drive.mock_drive_service import (
MockDeleteRequest,
MockDriveBackingStore,
MockDriveService,
http_error,
pair_with_mock_service,
)
Expand Down Expand Up @@ -93,6 +96,17 @@ def test_drive_transport_does_every_job():
assert isinstance(transport.platform, GdriveFilesPlatform)


def test_login_on_new_account_searches_each_folder_once(monkeypatch):
calls = _count_drive_calls(monkeypatch)
service = MockDriveService(MockDriveBackingStore(), DO)
cached_client = DriveCachedClient.from_service(DO, service)
cached_client.get_syftbox_folder_id()
cached_client.get_personal_syftbox_folder_id()

# One search for /SyftBox and one for the personal folder; login creates both.
assert calls == Counter(list=2)


# -- P2PConnection ----------------------------------------------------------------


Expand Down
Loading