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
Example #2
0
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