Skip to main content

Python decorators for contracts and augmenting OOP.

Project description

Augment
-------

Python decorators for contracts and augmenting OOP.
from distutils.core import setup


Contracts.
``````````

The syntax below should be self explanatory. It can be applied both to bound and unbound methods.

::

# Constraints on passed arguments.
# Constraints can be callables or regular expressions.
# Throws a `AugmentError` by default if contraints are violated.
# Optionally, an error handler can be specified which receives the errors.
@ensure_args(a=(lambda x: x > 10, 'must be greater than 10'),
b=r'^?-\d+(\.\d+)$',
c=lambda x: x < 5) # `c` will be picked from `kwargs`.
def foo(a, b, **kwargs):
pass

# Ensure at least one of the constraints is true.
@ensure_one_of(a=lambda x: x, b=lambda x: x)
def foo(a, b):
pass

# Ensures only one of the constraints is true.
@ensure_one_of(exclusive=True, c=lambda x: x, d=lambda x: x)
def foo(a, b):
pass

# Transform arguments.
@transform_args(a=lambda x: x * x)
def foo(a):
pass

# Bundling multiple constraints.
# Contracts run in inside out order
# i.e the one right above function will run first.
# In this case, `@ensure_args...` will be the first to run.
@transform_args(a=lambda x: x * x)
@ensure_one_of(c=lambda x: x, d=lambda x: x)
@ensure_args(a=lambda x: x > 10,
b=lambda x: hasattr(x, '__getitem__'),
c=lambda x: x < 5)
def foo(a, b, c=4, d=None):
pass


Function/method hooks.
``````````````````````

Basic function hooks to run on entering, leaving or both ways.

::

def login(root):
print "Logging in."

def logout(root):
print "Logging out"

# `login` will run before entering `home`.
# `logout` will run after exiting from `home`.
# `root` param passed to `home` will be passed to `login`, `logout`.
@enter(login)
@leave(logout)
def home(root):
print "Home page."


def tracer():
print "tracing"

# `tracer` will run both before entering `home` and after
# exiting `home`.
@around(tracer)
def inbox():
print "Inbox"

Please note that the hooks(`login` and `logout`) above are passed the arguments passed to the wrapped method(`home`).

Method hooks should be accepting the same arguments as wrapped method.


They work the same on bound functions.

::
class Foo:
def login(self):
print "Logging in."

def logout(self):
print "Logging out"

@leave(logout)
@enter(login)
def home(self, test=None):
print "Home page."

def tracer(self):
print "tracing"

@around(tracer)
def inbox(self):
print "Inbox"


Dynamic delgation.
``````````````````

::

class Foo:
def __init__(self):
self.a = 'a'
self.b = 'b'
self.c = 'c'

@delegate_to('foo_delegate', 'a', 'b')
class Bar:
def __init__(self):
self.foo_delegate = Foo()
b = Bar()
# `a` and `b` will be delegated to `Foo`.
print b.a
print b.b
# This will throw an AttributeError.
print b.c

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

Augment-0.4.tar.gz (4.5 kB view details)

Uploaded Source

File details

Details for the file Augment-0.4.tar.gz.

File metadata

  • Download URL: Augment-0.4.tar.gz
  • Upload date:
  • Size: 4.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for Augment-0.4.tar.gz
Algorithm Hash digest
SHA256 0003f7fa71905a64d6bf253fee3d2c079a8717f2d25e6931ed3b6c33b619d283
MD5 289ad62be145842ee6d046ef6ab4631d
BLAKE2b-256 6e822a46aec22709c59a7ae07fa692e51826ade384fa4cfc094c16200bca5e94

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page