import json from collections import defaultdict from functools import wraps VALID_HTTP_METHODS = ['GET', 'POST'] class User: def __init__(self, name): self.name = name self.owes = defaultdict(float) self.owed_by = defaultdict(float) self.balance = 0.0 def lend(self, lender_name, amount): self.owed_by[lender_name] += amount if not self.owed_by[lender_name]: del self.owed_by[lender_name] def borrow(self, borrower_name, amount): self.owes[borrower_name] += amount if not self.owed_by[borrower_name]: del self.owed_by[borrower_name] def to_json(self): return json.dumps(self.__dict__) class Registry: def __init__(self): self.methods = {k: {} for k in VALID_HTTP_METHODS } def register_url(self, url, http_method): def actual_decorator(f): self.methods[http_method][url] = f @wraps(f) def _impl(f_self, *f_args, **f_kwargs): return f(f_self, *f_args, **f_kwargs) return actual_decorator class RestAPI: registry = Registry() def __init__(self, database=None): self._database = database if database else {} self._users = {} @registry.register_url('/users', 'GET') def users(self, payload=None): pass @registry.register_url('/add', 'POST') def add(self, payload=None): try: payload = json.loads(payload) user = User(payload['user']) self._users[user.name] = user return user.to_json() except: pass @registry.register_url('/iou', 'POST') def iou(self, payload=None): pass def get(self, url, payload=None): methods = self.registry.methods['GET'] if url in methods.keys(): return methods[url](self, payload) return '' # else: # raise Exception('Error 404') def post(self, url, payload=None): methods = self.registry.methods['POST'] if url in methods.keys(): return methods[url](self, payload) return '' # else: # raise Exception('Error 404')