def new_descriptor_cls(type_key, archetype_key, order, fields, info_containers, constraints, validations ): """Generate and setup new custom descriptor from configuration. """ archetype_ti = capi.get_type_info(archetype_key) archetype_descriptor_key = archetype_ti.descriptor_key or archetype_ti.type_key descriptor_archetype = \ get_localizable_descriptor_class(DESCRIPTOR_MODULE, archetype_descriptor_key) assert descriptor_archetype.scope in ("archetype", "custom"), \ "Custom descriptor %r specifies an invalid archetype %r" % ( type_key, archetype_key) descriptor_cls_name = naming.descriptor_class_name(type_key) cls = type(descriptor_cls_name, (descriptor_archetype,), { "scope": "custom", "__module__": DESCRIPTOR_MODULE.__name__, "order": order, "fields": fields, "info_containers": info_containers, "schema_invariants": constraints, "custom_validators": validations, "default_field_order": [ f.name for f in fields ], }) # set on DESCRIPTOR_MODULE, register as the ti.descriptor_model setattr(DESCRIPTOR_MODULE, descriptor_cls_name, cls) ti = capi.get_type_info(type_key) ti.descriptor_model = cls log.info("generated descriptor [type=%s] %s.%s", type_key, DESCRIPTOR_MODULE.__name__, descriptor_cls_name) return cls
def get_localizable_descriptor_class(module, type_key): """Retrieve an existing localizable descriptor class from module. AttributeError -> not existing, descriptor to be created. AssertionError -> exists but either not a descriptor cls or not localizable. """ descriptor_cls_name = naming.descriptor_class_name(type_key) cls = getattr(module, descriptor_cls_name) # raises AttributeError assert is_descriptor(cls), \ "Invalid descriptor [%s]" % (descriptor_cls_name) assert cls.localizable, \ "May not localize a non-localizable descriptor [%s]" % ( descriptor_cls_name) return cls
def get_localizable_descriptor_class(module, descriptor_key): """Retrieve an existing localizable descriptor class from module. AttributeError -> not existing, descriptor to be created. AssertionError -> exists but either not a descriptor cls or not localizable. """ descriptor_cls_name = naming.descriptor_class_name(descriptor_key) cls = getattr(module, descriptor_cls_name) # raises AttributeError assert is_descriptor(cls), \ "Invalid descriptor [%s]" % (descriptor_cls_name) assert cls.localizable, \ "May not localize a non-localizable descriptor [%s]" % ( descriptor_cls_name) return cls