62 lines
1.5 KiB
Python
62 lines
1.5 KiB
Python
|
from ...cloudpath import CloudImplementation
|
||
|
from ..localclient import LocalClient
|
||
|
from ..localpath import LocalPath
|
||
|
|
||
|
|
||
|
local_s3_implementation = CloudImplementation()
|
||
|
"""Replacement for "s3" CloudImplementation meta object in cloudpathlib.implementation_registry"""
|
||
|
|
||
|
|
||
|
class LocalS3Client(LocalClient):
|
||
|
"""Replacement for S3Client that uses the local file system. Intended as a monkeypatch
|
||
|
substitute when writing tests.
|
||
|
"""
|
||
|
|
||
|
_cloud_meta = local_s3_implementation
|
||
|
|
||
|
|
||
|
LocalS3Client.S3Path = LocalS3Client.CloudPath # type: ignore
|
||
|
|
||
|
|
||
|
class LocalS3Path(LocalPath):
|
||
|
"""Replacement for S3Path that uses the local file system. Intended as a monkeypatch substitute
|
||
|
when writing tests.
|
||
|
"""
|
||
|
|
||
|
cloud_prefix: str = "s3://"
|
||
|
_cloud_meta = local_s3_implementation
|
||
|
|
||
|
@property
|
||
|
def drive(self) -> str:
|
||
|
return self.bucket
|
||
|
|
||
|
def mkdir(self, parents=False, exist_ok=False):
|
||
|
# not possible to make empty directory on s3
|
||
|
pass
|
||
|
|
||
|
@property
|
||
|
def bucket(self) -> str:
|
||
|
return self._no_prefix.split("/", 1)[0]
|
||
|
|
||
|
@property
|
||
|
def key(self) -> str:
|
||
|
key = self._no_prefix_no_drive
|
||
|
|
||
|
# key should never have starting slash for
|
||
|
# use with boto, etc.
|
||
|
if key.startswith("/"):
|
||
|
key = key[1:]
|
||
|
|
||
|
return key
|
||
|
|
||
|
@property
|
||
|
def etag(self):
|
||
|
return self.client._md5(self)
|
||
|
|
||
|
|
||
|
LocalS3Path.__name__ = "S3Path"
|
||
|
|
||
|
local_s3_implementation.name = "s3"
|
||
|
local_s3_implementation._client_class = LocalS3Client
|
||
|
local_s3_implementation._path_class = LocalS3Path
|