def incomplete_filters(filters)
      filters.select { |filter|
        ['category', 'name', 'value'].any? { |f| !filter.include? f }
      }.map { |incomplete_filter|
        category, name, value = incomplete_filter.values_at('category', 'name', 'value')
        error = <<-MSG.gsub(/^\s+/, '').strip
          Incomplete filter, category:"#{category}", name:"#{name}", and value:"#{value}".
        MSG
        incomplete_filter.merge(:error => error)
      }
    end
def incomplete_filters(filters)
      filters.select { |filter|
        ['category', 'name', 'value'].any? { |f| !filter.include? f }
      }.map { |incomplete_filter|
        category, name, value = incomplete_filter.values_at('category', 'name', 'value')
        error = <<-MSG.gsub(/^\s+/, '').strip
          Incomplete filter, category:"#{category}", name:"#{name}", and value:"#{value}".
        MSG
        incomplete_filter.merge(:error => error)
      }
    end
Retrieve the filters that do not provide category, name, and value keys.

 The parsed, incomplete filters will contain an +:error+ key that provides
 an error message intended for the user.

 @param [Array<Hash>] filters an array of filter {Hash hashes}
 @return [Array<Hash>] an array of incomplete filter {Hash hashes} that
         contain a human-readable error at the +:error+ key