Simple implementation of `chain of responsibilities` pattern
Project description
hxss.responsibility
Simple implementation of chain of responsibilities
pattern.
result = chain(request) [ & DefaultLinkClass] [ | <callable|Link>] | chain
Installation
pip: hxss.responsibility
aur: python-hxss-responsibility
Usage
from hxss.responsibility import chain
def none(value):
pass
def increment(value):
return value + 1
def decrement(value):
return value - 1
request = 1
result = chain(request) | none | increment | decrement | chain
assert(result == 2)
result = chain(request) | none | decrement | increment | chain
assert(result == 0)
result = chain(request) | none | none | none | chain
assert(result == None)
Basics
Chain of responsibilities sequentially handles request by every link until response returned.
By default every not None
value considered as valid response(some kind of Null coalescing operator):
handled = []
def wrap(func):
def wrapper(value):
handled.append(func.__name__)
return func(value)
return wrapper
result = chain(request) \
| wrap(none) \
| wrap(increment) \
| wrap(decrement) \
| chain
assert(result == 2)
assert(handled == ['none', 'increment'])
Lifecycle
chain
function creates newRequest
- every
callable
passed toRequest
by|
operator wraps intoLink
which handles the request - once
Link
returns validResponse
all nextcallables
will be ignored | chain
operator forces to return raw response value
Customization
- custom result validation:
from hxss.responsibility import Link
class FinalLink(Link):
def _validate_result(self, result): # see default Link implementation
return self._response(result)
result = chain(1) | FinalLink(none) | increment | decrement | chain
assert(result == None)
- custom independent link:
class CustomLink(Link):
def __init__(self):
pass
def handle(self, request):
result = calc_result(request)
return self._response(result)
result = chain(1) | increment | CustomLink() | decrement | chain
- custom default link:
class InversedLink(Link):
def _validate_result(self, result):
if (result is None):
return self._response(result)
result = chain(1) & InversedLink | increment | CustomLink() | decrement | chain
assert(result == None)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Close
Hashes for hxss.responsibility-0.1.1.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | b7c020e6031fa5373cec0c09ae7bf4ae07a2224b20e4312e00a0e282795a4e92 |
|
MD5 | 5038b0cb5f4bff67ea0baa42bf0e8dea |
|
BLAKE2b-256 | 9107d34b25944d1d655f55eaae2c56e708d1143690de8b61ac21f7cc58b4bb3a |
Close
Hashes for hxss.responsibility-0.1.1-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5d3e6d4dd63f3e40c60e147d1f42cd87ebac92fa104bf6a2ec3c0532c2c63b1d |
|
MD5 | 31cdfac14d43e89b32460599bdefcb35 |
|
BLAKE2b-256 | e842e0d8a0203f3c10d8c4cbcd39fc15b4fa593414d5e16d3ca1adeacc9d5cf7 |