Skip to content

Instantly share code, notes, and snippets.

@nwjlyons
Last active November 20, 2020 17:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nwjlyons/b6ff99a13de29e73990d33bd4635d161 to your computer and use it in GitHub Desktop.
Save nwjlyons/b6ff99a13de29e73990d33bd4635d161 to your computer and use it in GitHub Desktop.
Adaptor pattern in Python
# storage/adaptor.py
class StorageAdaptor:
def save(self, *, path: str) -> None:
raise NotImplementedError
def delete(self, *, path: str) -> None:
raise NotImplementedError
# storage/adaptors/{local,s3}.py
class StorageAdaptorLocal(StorageAdaptor):
def __init__(self, *, storage_dir: str) -> None:
self.storage_dir = storage_dir
def save(self, path: str) -> None:
print("saves to local filesystem")
def delete(self, path: str) -> None:
print("deletes file from local filesystem")
class StorageAdaptorS3(StorageAdaptor):
def __init__(self, *, access_key: str, secret_access_key: str, bucket: str) -> None:
self.access_key = access_key
self.secret_access_key = secret_access_key
self.bucket = bucket
def save(self, path: str) -> None:
print("saves to S3")
def delete(self, path: str) -> None:
print("deletes file from S3")
# storage.py
class Storage:
def __init__(self, *, adaptor: StorageAdaptor) -> None:
self.adaptor = adaptor
def save(self, path: str) -> None:
self.adaptor.save(path=path)
def delete(self, path: str) -> None:
self.adaptor.delete(path=path)
@nwjlyons
Copy link
Author

nwjlyons commented Jul 18, 2020

In [1]: store = Storage(adaptor=StorageAdaptorLocal(storage_dir="/uploads"))                                                                                                                                                                   

In [2]: store.save(path="file.py")                                                                                                                                                                                                          
saves to local filesystem

In [3]: store = Storage(adaptor=StorageAdaptorS3(access_key="x", secret_access_key="x", bucket="x"))                                                                                                                                        

In [4]: store.save(path="file.py")                                                                                                                                                                                                          
saves to S3

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment