Skip to content

Instantly share code, notes, and snippets.

@johanvergeer
Last active July 11, 2021 13:00
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 johanvergeer/290fbd8a8c0fbd912f65164dcf8da87a to your computer and use it in GitHub Desktop.
Save johanvergeer/290fbd8a8c0fbd912f65164dcf8da87a to your computer and use it in GitHub Desktop.
class PersonService:
@property
def person_repo(self) -> PersonRepo:
return PersonRepoFactory().create()
def set_name(self, person_id: int, new_name: str) -> None:
p = self.person_repo.find(person_id)
p.name = new_name
self.person_repo.add_or_update(p)
class PersonRepo(Protocol):
@abstractmethod
def add_or_update(self, person: Person) -> None:
...
@abstractmethod
def remove(self, person_id: int) -> None:
...
@abstractmethod
def find(self, person_id: int) -> None:
...
class PersonRepoJson(PersonRepo):
def __init__(self, file: Path) -> None:
self.__file = file
def add_or_update(self, person: Person) -> None:
"""add person to file"""
def remove(self, person_id: int) -> None:
"""remove person from file"""
def find(self, person_id: int) -> None:
"""find person in file"""
class PersonRepoSql(PersonRepo):
def add_or_update(self, person: Person) -> None:
"""add person to database"""
def remove(self, person_id: int) -> None:
"""remove person from database"""
def find(self, person_id: int) -> None:
"""find person in database"""
class PersonRepoFactory:
def create(self) -> PersonRepo:
if os.getenv("PERSON_REPO_TYPE") == "json":
return PersonRepoJson(Path(os.getenv("PERSON_REPO_PATH")))
elif os.getenv("PERSON_REPO_TYPE) == "sql":
return PersonRepoSql()
else:
raise ValueError()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment