Guest User

Untitled

a guest
May 24th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.34 KB | None | 0 0
  1. def implements(interface):
  2. import sys
  3.  
  4. if not sys.flags.debug:
  5. return lambda func: func
  6.  
  7. import inspect
  8.  
  9. def get_filtered_members(item):
  10. return dict([(key, value) for key, value in inspect.getmembers(item)
  11. if not key.startswith('_')])
  12.  
  13. def build_contract(item):
  14. argspec = inspect.getargspec(item)
  15.  
  16. if argspec.defaults:
  17. num_keywords = len(argspec.defaults)
  18. args = ['_'] * (len(argspec.args) - num_keywords)
  19. args.extend(argspec.args[num_keywords-1:])
  20. else:
  21. args = ['_'] * len(argspec.args)
  22.  
  23. if argspec.varargs:
  24. args.append('*args')
  25.  
  26. if argspec.keywords:
  27. args.append('**kwargs')
  28.  
  29. return ', '.join(args)
  30.  
  31. def tester(klass):
  32. interface_elements = get_filtered_members(interface)
  33. class_elements = get_filtered_members(klass)
  34.  
  35. for key, value in interface_elements.items():
  36. try:
  37. element = class_elements[key]
  38. except KeyError:
  39. raise AssertionError("{0!r} is required but missing.".format(key))
  40.  
  41. if inspect.isfunction(value):
  42. assert build_contract(value) == build_contract(kspec), \
  43. "{0!r} doesn't conform to interface.".format(key)
  44.  
  45. return klass
  46.  
  47. return tester
Add Comment
Please, Sign In to add comment