1# Copyright (c) 2010-2024 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 Strict(metaclass=MetaStrict):
17
18 pass
19
20
21class MetaSerialisable(type):
22
23 def __new__(cls, clsname, bases, methods):
24 attrs = []
25 nested = []
26 elements = []
27 namespaced = []
28 for k, v in methods.items():
29 if isinstance(v, Descriptor):
30 ns= getattr(v, 'namespace', None)
31 if ns:
32 namespaced.append((k, "{%s}%s" % (ns, k)))
33 if getattr(v, 'nested', False):
34 nested.append(k)
35 elements.append(k)
36 elif isinstance(v, Sequence):
37 elements.append(k)
38 elif isinstance(v, Typed):
39 if hasattr(v.expected_type, 'to_tree'):
40 elements.append(k)
41 elif isinstance(v.expected_type, tuple):
42 if any((hasattr(el, "to_tree") for el in v.expected_type)):
43 # don't bind elements as attrs
44 continue
45 else:
46 attrs.append(k)
47 else:
48 if not isinstance(v, Alias):
49 attrs.append(k)
50
51 if methods.get('__attrs__') is None:
52 methods['__attrs__'] = tuple(attrs)
53 methods['__namespaced__'] = tuple(namespaced)
54 if methods.get('__nested__') is None:
55 methods['__nested__'] = tuple(sorted(nested))
56 if methods.get('__elements__') is None:
57 methods['__elements__'] = tuple(sorted(elements))
58 return MetaStrict.__new__(cls, clsname, bases, methods)