Custom features¶
New in version 0.5.0.
Architect supports custom features which can be used to add completely new functionality to a model or to redefine some built-in feature’s behaviour. A completely new feature can be created and installed as the following:
from architect.orms.bases import BaseFeature
class CustomFeature(BaseFeature):
orm = 'django'
name = 'my_feature'
decorate = ('bar',)
def foo(self):
"""Does something with a model"""
pass
@staticmethod
def _decorate_bar(method):
"""Decorates model's bar method"""
def wrapper(instance, *args, **kwargs):
# Do something before method invocation
method(instance, *args, **kwargs)
# Do something after method invocation
return wrapper
@architect.install('my_feature')
class Model(object):
pass
To be considered a feature class, a class should inherit from a BaseFeature or any other
class that itself inherits from a BaseFeature and implement orm and name attributes.
orm attribute is used to identify to which ORM this feature belongs to and name attribute
is used by Architect to identify this feature in an internal feature registry. If a feature class
should be considered a base for other feature classes simply don’t set an orm attribute and
it will defaults to None which tells Architect that this is a base feature class.
API ¶
BaseFeature class provides the following methods and attributes:
-
orm= None¶ which orm this feature belongs to
-
name= None¶ name that will be used to access this feature
-
decorate= ()¶ model methods that should be decorated by feature decorators
-
dependencies= ()¶ features that this feature depends on
-
__init__(model_obj, model_cls, **options)¶ Parameters: - model_obj (object) – (required). Model instance object to work with.
- model_cls (class) – (required). Model class to work with.
- options (dictionary) – (optional). Feature options if any.