BCF extensions.
(self)
| 92 | |
| 93 | @property |
| 94 | def extensions(self) -> Optional[mdl_extensions.Extensions]: |
| 95 | """BCF extensions.""" |
| 96 | |
| 97 | if not self._extensions and self.extension_schema: |
| 98 | import io |
| 99 | from xml.etree import ElementTree as etree |
| 100 | |
| 101 | extensions = mdl_extensions.Extensions() |
| 102 | |
| 103 | xs = "{http://www.w3.org/2001/XMLSchema}" |
| 104 | root = etree.parse(io.BytesIO(self.extension_schema)) |
| 105 | |
| 106 | attrs = bcf.agnostic.extensions.get_extensions_attributes(extensions) |
| 107 | xsd_to_attrs = {v.subattr_xsd_name: k for k, v in attrs.items()} |
| 108 | for node in root.findall(f".//{xs}restriction"): |
| 109 | attr_type = node.attrib.get("base") |
| 110 | if not attr_type: |
| 111 | continue |
| 112 | attr_name = xsd_to_attrs.get(attr_type) |
| 113 | if attr_name is None: |
| 114 | continue |
| 115 | values = [] |
| 116 | for enum in node.findall(f".//{xs}enumeration"): |
| 117 | values.append(enum.attrib["value"]) |
| 118 | if not values: |
| 119 | continue |
| 120 | attr_data = attrs[attr_name] |
| 121 | attr = attr_data.attr_type() |
| 122 | setattr(attr, attr_data.subattr_name, values) |
| 123 | setattr(extensions, attr_name, attr) |
| 124 | |
| 125 | self._extensions = extensions |
| 126 | return self._extensions |
| 127 | |
| 128 | @extensions.setter |
| 129 | def extensions(self, value: Optional[mdl_extensions.Extensions]) -> None: |