@staticmethod
def from_material(*, project: Project, material: Union[(str, UUID, LinkByUID, MaterialRun)], mode: AutoConfigureMode=AutoConfigureMode.PLAIN, full_history: bool=True):
    "[ALPHA] Build a PlatformVocabulary from templates appearing in a material history.\n\n        All of the attribute templates that appear throughout the material's history\n        are extracted and converted into descriptors.\n\n        Descriptor keys are formatted according to the option set by mode.\n        For example, if a condition template with name 'Condition 1'\n        appears in a parent process with name 'Parent',\n        the mode option produces the following descriptor key:\n\n        mode = AutoConfigMode.PLAIN       --> 'Parent~Condition 1'\n        mode = AutoConfigMode.FORMULATION --> 'Condition 1'\n\n        Parameters\n        ----------\n        project: Project\n            Project to use when accessing the Citrine Platform.\n        material: Union[str, UUID, LinkByUID, MaterialRun]\n            A representation of the material to extract descriptors from.\n        mode: AutoConfigureMode\n            Formatting option for descriptor keys in the platform vocabulary.\n            Option AutoConfigMode.PLAIN includes headers from the parent object,\n            whereas option AutoConfigMode.FORMULATION does not.\n            Default: AutoConfigureMode.PLAIN\n        full_history: bool\n            Whether to extract descriptors from the full material history,\n            or only the provided (terminal) material.\n            Default: True\n\n        Returns\n        -------\n        PlatformVocabulary\n\n        "
    if (not isinstance(mode, AutoConfigureMode)):
        raise TypeError('mode must be an option from AutoConfigureMode')
    history = project.material_runs.get_history(id=material)
    if full_history:
        search_history = recursive_flatmap(history, (lambda x: [x]), unidirectional=False)
        set_uuids(search_history, 'id')
    else:
        search_history = [history.spec.template, history.process.template]
        search_history.extend([msr.template for msr in history.measurements])
        search_history = [x for x in search_history if (x is not None)]
    res = {}
    for obj in search_history:
        templates = []
        if isinstance(obj, HasPropertyTemplates):
            for property in obj.properties:
                templates.append(property[0])
        if isinstance(obj, HasConditionTemplates):
            for condition in obj.conditions:
                templates.append(condition[0])
        if isinstance(obj, HasParameterTemplates):
            for parameter in obj.parameters:
                templates.append(parameter[0])
        headers = []
        if (mode == AutoConfigureMode.PLAIN):
            headers.append(obj.name)
        for tmpl in templates:
            try:
                desc = template_to_descriptor(tmpl, headers=headers)
                res[desc.key] = desc
            except NoEquivalentDescriptorError:
                continue
    return PlatformVocabulary(entries=res)
[ALPHA] Build a PlatformVocabulary from templates appearing in a material history.

All of the attribute templates that appear throughout the material's history
are extracted and converted into descriptors.

Descriptor keys are formatted according to the option set by mode.
For example, if a condition template with name 'Condition 1'
appears in a parent process with name 'Parent',
the mode option produces the following descriptor key:

mode = AutoConfigMode.PLAIN       --> 'Parent~Condition 1'
mode = AutoConfigMode.FORMULATION --> 'Condition 1'

Parameters
----------
project: Project
    Project to use when accessing the Citrine Platform.
material: Union[str, UUID, LinkByUID, MaterialRun]
    A representation of the material to extract descriptors from.
mode: AutoConfigureMode
    Formatting option for descriptor keys in the platform vocabulary.
    Option AutoConfigMode.PLAIN includes headers from the parent object,
    whereas option AutoConfigMode.FORMULATION does not.
    Default: AutoConfigureMode.PLAIN
full_history: bool
    Whether to extract descriptors from the full material history,
    or only the provided (terminal) material.
    Default: True

Returns
-------
PlatformVocabulary
@staticmethod
def from_material(*, project: Project, material: Union[(str, UUID, LinkByUID, MaterialRun)], mode: AutoConfigureMode=AutoConfigureMode.PLAIN, full_history: bool=True):
    "[ALPHA] Build a PlatformVocabulary from templates appearing in a material history.\n\n        All of the attribute templates that appear throughout the material's history\n        are extracted and converted into descriptors.\n\n        Descriptor keys are formatted according to the option set by mode.\n        For example, if a condition template with name 'Condition 1'\n        appears in a parent process with name 'Parent',\n        the mode option produces the following descriptor key:\n\n        mode = AutoConfigMode.PLAIN       --> 'Parent~Condition 1'\n        mode = AutoConfigMode.FORMULATION --> 'Condition 1'\n\n        Parameters\n        ----------\n        project: Project\n            Project to use when accessing the Citrine Platform.\n        material: Union[str, UUID, LinkByUID, MaterialRun]\n            A representation of the material to extract descriptors from.\n        mode: AutoConfigureMode\n            Formatting option for descriptor keys in the platform vocabulary.\n            Option AutoConfigMode.PLAIN includes headers from the parent object,\n            whereas option AutoConfigMode.FORMULATION does not.\n            Default: AutoConfigureMode.PLAIN\n        full_history: bool\n            Whether to extract descriptors from the full material history,\n            or only the provided (terminal) material.\n            Default: True\n\n        Returns\n        -------\n        PlatformVocabulary\n\n        "
    if (not isinstance(mode, AutoConfigureMode)):
        raise TypeError('mode must be an option from AutoConfigureMode')
    history = project.material_runs.get_history(id=material)
    if full_history:
        search_history = recursive_flatmap(history, (lambda x: [x]), unidirectional=False)
        set_uuids(search_history, 'id')
    else:
        search_history = [history.spec.template, history.process.template]
        search_history.extend([msr.template for msr in history.measurements])
        search_history = [x for x in search_history if (x is not None)]
    res = {}
    for obj in search_history:
        templates = []
        if isinstance(obj, HasPropertyTemplates):
            for property in obj.properties:
                templates.append(property[0])
        if isinstance(obj, HasConditionTemplates):
            for condition in obj.conditions:
                templates.append(condition[0])
        if isinstance(obj, HasParameterTemplates):
            for parameter in obj.parameters:
                templates.append(parameter[0])
        headers = []
        if (mode == AutoConfigureMode.PLAIN):
            headers.append(obj.name)
        for tmpl in templates:
            try:
                desc = template_to_descriptor(tmpl, headers=headers)
                res[desc.key] = desc
            except NoEquivalentDescriptorError:
                continue
    return PlatformVocabulary(entries=res)