docs: def ingredient_from_dict(ingr_dict, selectable):
      """Create an ingredient from an dictionary.
  
      This object will be deserialized from yaml """
  
      # TODO: This is deprecated in favor of
      # ingredient_from_validated_dict
  
      # Describe the required params for each kind of ingredient
      # The key is the parameter name, the value is one of
      # field: A parse_field with aggregation=False
      # aggregated_field: A parse_field with aggregation=True
      # condition: A parse_condition
  
      params_lookup = {
          'Dimension': {
              'field': 'field'
          },
          'LookupDimension': {
              'field': 'field'
          },
          'IdValueDimension':
              OrderedDict(id_field='field', field='field'),
          'Metric': {
              'field': 'aggregated_field'
          },
          'DivideMetric':
              OrderedDict(
                  numerator_field='aggregated_field',
                  denominator_field='aggregated_field'
              ),
          'WtdAvgMetric':
              OrderedDict(field='field', weight='field')
      }
  
      format_lookup = {
          'comma': ',.0f',
          'dollar': '$,.0f',
          'percent': '.0%',
          'comma1': ',.1f',
          'dollar1': '$,.1f',
          'percent1': '.1%',
          'comma2': ',.2f',
          'dollar2': '$,.2f',
          'percent2': '.2%',
      }
  
      kind = ingr_dict.pop('kind', 'Metric')
      IngredientClass = ingredient_class_for_name(kind)
  
      if IngredientClass is None:
          raise BadIngredient('Unknown ingredient kind')
  
      params = params_lookup.get(kind, {'field': 'field'})
  
      args = []
      for k, v in iteritems(params):
          # All the params must be in the dict
          if k not in ingr_dict:
              raise BadIngredient(
                  '{} must be defined to make a {}'.format(k, kind)
              )
          if v == 'field':
              statement = parse_field(
                  ingr_dict.pop(k, None), selectable, aggregated=False
              )
          elif v == 'aggregated_field':
              statement = parse_field(
                  ingr_dict.pop(k, None), selectable, aggregated=True
              )
          elif v == 'condition':
              statement = parse_condition(
                  ingr_dict.pop(k, None), selectable, aggregated=True
              )
          else:
              raise BadIngredient('Do not know what this is')
  
          args.append(statement)
      # Remaining properties in ingr_dict are treated as keyword args
  
      # If the format string exists in format_lookup, use the value otherwise
      # use the original format
      if 'format' in ingr_dict:
          ingr_dict['format'] = format_lookup.get(
              ingr_dict['format'], ingr_dict['format']
          )
      return IngredientClass(*args, **ingr_dict)