Guest User

Untitled

a guest
Feb 20th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.48 KB | None | 0 0
  1. import types
  2.  
  3. __all__ = ('Field', 'Food')
  4.  
  5. class Field(object):
  6. """A field in a resource enforcing the type of its value"""
  7. def __init__(self, field_type, doc=None, default=None):
  8. self._field_type = field_type
  9. if not isinstance(default, (self._field_type, types.NoneType)):
  10. raise TypeError(default.__class__)
  11. self._default_value = default
  12. if not doc:
  13. doc = self._field_type.__doc__
  14. elif isinstance(doc, unicode):
  15. doc = doc.decode('utf-8')
  16. self.__doc__ = '%r: %s' % (self._field_type, doc)
  17.  
  18. def _set_field_name(self, name):
  19. self._field_name = name
  20.  
  21. def __get__(self, obj, type=None):
  22. return getattr(obj, self._field_name, self._default_value)
  23.  
  24. def __set__(self, obj, value):
  25. # if someone gives str and we want unicode (or viceversa) handle the
  26. # conversion automagically, this simplifies a lot
  27. if self._field_type is unicode and isinstance(value, str):
  28. value = value.decode('utf-8')
  29. elif self._field_type is str and isinstance(value, unicode):
  30. value = value.encode('utf-8')
  31. elif not isinstance(value, (self._field_type, types.NoneType)):
  32. raise TypeError('Expected %r, got %r' % (self._field_type,
  33. value.__class__))
  34. setattr(obj, self._field_name, value)
  35.  
  36.  
  37. class Food(object):
  38. """A single resource"""
  39. def __new__(cls, **kwargs):
  40. obj = super(Food, cls).__new__(cls)
  41. fields = []
  42. for xcls in cls.mro():
  43. for k,v in xcls.__dict__.iteritems():
  44. if isinstance(v, Field):
  45. field_name = '__field_%s' % k
  46. v._set_field_name(field_name)
  47. fields.append(k)
  48. obj._fields = tuple(fields)
  49. return obj
  50.  
  51. def __init__(self, **kwargs):
  52. super(Food, self).__init__()
  53. for k,v in kwargs.iteritems():
  54. if k in self._fields:
  55. setattr(self, k, v)
  56.  
  57.  
  58. @property
  59. def kind(self):
  60. """Kind is not a Field"""
  61. return self._kind
  62.  
  63. def values(self):
  64. d = dict(zip(self._fields, (getattr(self, k) for k in self._fields)))
  65. # kind is not a Field, but still it should be present on avery Food
  66. d['kind'] = self.kind
  67. return d
  68.  
  69. def __str__(self):
  70. return str(self.values())
  71.  
  72. def __eq__(self, other):
  73. return self.values() == other.values()
Add Comment
Please, Sign In to add comment