Hide keyboard shortcuts

Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1# Copyright (c) 2010-2020 openpyxl 

2 

3from .base import * 

4from .sequence import Sequence 

5 

6 

7class MetaStrict(type): 

8 

9 def __new__(cls, clsname, bases, methods): 

10 for k, v in methods.items(): 

11 if isinstance(v, Descriptor): 

12 v.name = k 

13 return type.__new__(cls, clsname, bases, methods) 

14 

15 

16class MetaSerialisable(type): 

17 

18 def __new__(cls, clsname, bases, methods): 

19 attrs = [] 

20 nested = [] 

21 elements = [] 

22 namespaced = [] 

23 for k, v in methods.items(): 

24 if isinstance(v, Descriptor): 

25 ns= getattr(v, 'namespace', None) 

26 if ns: 

27 namespaced.append((k, "{%s}%s" % (ns, k))) 

28 if getattr(v, 'nested', False): 

29 nested.append(k) 

30 elements.append(k) 

31 elif isinstance(v, Sequence): 

32 elements.append(k) 

33 elif isinstance(v, Typed): 

34 if hasattr(v.expected_type, 'to_tree'): 

35 elements.append(k) 

36 else: 

37 attrs.append(k) 

38 else: 

39 if not isinstance(v, Alias): 

40 attrs.append(k) 

41 

42 if methods.get('__attrs__') is None: 

43 methods['__attrs__'] = tuple(attrs) 

44 methods['__namespaced__'] = tuple(namespaced) 

45 if methods.get('__nested__') is None: 

46 methods['__nested__'] = tuple(sorted(nested)) 

47 if methods.get('__elements__') is None: 

48 methods['__elements__'] = tuple(sorted(elements)) 

49 return MetaStrict.__new__(cls, clsname, bases, methods) 

50 

51 

52Strict = MetaStrict('Strict', (object,), {}) 

53 

54_Serialiasable = MetaSerialisable('_Serialisable', (object,), {}) 

55 

56#del MetaStrict 

57#del MetaSerialisable