__init__.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. from __future__ import absolute_import
  2. # Copyright (c) 2010-2019 openpyxl
  3. from .base import *
  4. from .sequence import Sequence
  5. class MetaStrict(type):
  6. def __new__(cls, clsname, bases, methods):
  7. for k, v in methods.items():
  8. if isinstance(v, Descriptor):
  9. v.name = k
  10. return type.__new__(cls, clsname, bases, methods)
  11. class MetaSerialisable(type):
  12. def __new__(cls, clsname, bases, methods):
  13. attrs = []
  14. nested = []
  15. elements = []
  16. namespaced = []
  17. for k, v in methods.items():
  18. if isinstance(v, Descriptor):
  19. ns= getattr(v, 'namespace', None)
  20. if ns:
  21. namespaced.append((k, "{%s}%s" % (ns, k)))
  22. if getattr(v, 'nested', False):
  23. nested.append(k)
  24. elements.append(k)
  25. elif isinstance(v, Sequence):
  26. elements.append(k)
  27. elif isinstance(v, Typed):
  28. if hasattr(v.expected_type, 'to_tree'):
  29. elements.append(k)
  30. else:
  31. attrs.append(k)
  32. else:
  33. if not isinstance(v, Alias):
  34. attrs.append(k)
  35. if methods.get('__attrs__') is None:
  36. methods['__attrs__'] = tuple(attrs)
  37. methods['__namespaced__'] = tuple(namespaced)
  38. if methods.get('__nested__') is None:
  39. methods['__nested__'] = tuple(sorted(nested))
  40. if methods.get('__elements__') is None:
  41. methods['__elements__'] = tuple(sorted(elements))
  42. return MetaStrict.__new__(cls, clsname, bases, methods)
  43. Strict = MetaStrict('Strict', (object,), {})
  44. _Serialiasable = MetaSerialisable('_Serialisable', (object,), {})
  45. #del MetaStrict
  46. #del MetaSerialisable