Created
December 28, 2020 23:58
-
-
Save vitalizzare/5b351b213eaab19809b22d6e9b9c4cbb to your computer and use it in GitHub Desktop.
Single Responsibility Principle
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| ''' | |
| 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) |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://twitter.com/testdrivenio/status/1338959747769307140