Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def implements(interface):
- import sys
- if not sys.flags.debug:
- return lambda func: func
- import inspect
- def get_filtered_members(item):
- return dict([(key, value) for key, value in inspect.getmembers(item)
- if not key.startswith('_')])
- def build_contract(item):
- argspec = inspect.getargspec(item)
- if argspec.defaults:
- num_keywords = len(argspec.defaults)
- args = ['_'] * (len(argspec.args) - num_keywords)
- args.extend(argspec.args[num_keywords-1:])
- else:
- args = ['_'] * len(argspec.args)
- if argspec.varargs:
- args.append('*args')
- if argspec.keywords:
- args.append('**kwargs')
- return ', '.join(args)
- def tester(klass):
- interface_elements = get_filtered_members(interface)
- class_elements = get_filtered_members(klass)
- for key, value in interface_elements.items():
- try:
- element = class_elements[key]
- except KeyError:
- raise AssertionError("{0!r} is required but missing.".format(key))
- if inspect.isfunction(value):
- assert build_contract(value) == build_contract(kspec), \
- "{0!r} doesn't conform to interface.".format(key)
- return klass
- return tester
Add Comment
Please, Sign In to add comment