Skip to content

Instantly share code, notes, and snippets.

@vitalizzare
Created December 28, 2020 23:58
Show Gist options
  • Select an option

  • Save vitalizzare/5b351b213eaab19809b22d6e9b9c4cbb to your computer and use it in GitHub Desktop.

Select an option

Save vitalizzare/5b351b213eaab19809b22d6e9b9c4cbb to your computer and use it in GitHub Desktop.
Single Responsibility Principle
'''
https://twitter.com/jangiacomelli/status/1343676834085543936
'''
from datetime import datetime, timedelta
import logging
class User:
def __init__(self, username):
self.name = username
def __repr__(self):
return f'{self.__class__.__name__}({self.name!r})'
class UserRepository:
def __init__(self, database):
self.name = database
def __repr__(self):
return f'{self.__class__.__name__}({self.name!r})'
def save(self, user):
logging.info(f'Saving {user!r} to {self!r}')
class Moderator:
def __init__(self, user_repository, default_penalty=7):
self.repo = user_repository
self.penalty = timedelta(days=default_penalty)
def add(self, user):
user.banned_until = None
self.repo.save(user)
logging.info(f'{user!r} added to {self.repo!r}')
def ban(self, user):
user.banned_until = datetime.today() + self.penalty
logging.warning(f'{user!r} is banned until {user.banned_until:%B %d, %Y}')
self.repo.save(user)
class Bookkeeper:
def __init__(self, system):
self.system = system
def charge(self, user):
logging.info(f'Charge credit card of {user!r} using {self.system}')
if __name__ == '__main__':
logging.getLogger().setLevel(logging.INFO)
users = UserRepository('PostgreSQL')
logging.info(f'Connected to {users!r} at {datetime.today():%B %d, %Y}')
moderator = Moderator(users)
bookkeeper = Bookkeeper('Stripe')
mike = User('Mike')
logging.info(f'{mike!r} came in.')
moderator.add(mike)
bookkeeper.charge(mike)
moderator.ban(mike)
@vitalizzare
Copy link
Author

vitalizzare commented Dec 29, 2020

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