From 76a6a86eacb36220b495a2ea3f0fe2b28e2ea50a Mon Sep 17 00:00:00 2001 From: Konstantinos Koukopoulos Date: Wed, 18 Jun 2014 10:46:20 +0300 Subject: [PATCH] add Model metaclass to collect model accessor methods from backend classes --- moto/backends.py | 7 +++++++ moto/core/models.py | 22 +++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/moto/backends.py b/moto/backends.py index e0756549..ed237401 100644 --- a/moto/backends.py +++ b/moto/backends.py @@ -25,3 +25,10 @@ BACKENDS = { 'sts': sts_backend, 'route53': route53_backend } + + +def get_model(name): + for backend in BACKENDS.values(): + models = getattr(backend.__class__, '__models__', {}) + if name in models: + return getattr(backend, models[name])() diff --git a/moto/core/models.py b/moto/core/models.py index c5c23d15..fe0161f8 100644 --- a/moto/core/models.py +++ b/moto/core/models.py @@ -65,8 +65,28 @@ class MockAWS(object): return wrapper -class BaseBackend(object): +class Model(type): + def __new__(self, clsname, bases, namespace): + cls = super(Model, self).__new__(self, clsname, bases, namespace) + cls.__models__ = {} + for name, value in namespace.iteritems(): + model = getattr(value, "__returns_model__", False) + if model is not False: + cls.__models__[model] = name + for base in bases: + cls.__models__.update(getattr(base, "__models__", {})) + return cls + @staticmethod + def prop(model_name): + """ decorator to mark a class method as returning model values """ + def dec(f): + f.__returns_model__ = model_name + return f + return dec + + +class BaseBackend(object): def reset(self): self.__dict__ = {} self.__init__()