in src/fmeval/data_loaders/json_parser.py [0:0]
def _validate_jmespath_result(result: Union[Any, List[Any], List[List[Any]]], args: ColumnParseArguments) -> None:
"""Validates that the JMESPath result is as expected.
For dataset columns in COLUMNS_WITH_LISTS, if `args.dataset_mime_type` is MIME_TYPE_JSON, then `result` is
expected to be a 2D array. If MIME_TYPE_JSON_LINES, then `result` is expected to be a 1D array (list).
For all other dataset columns, if `args.dataset_mime_type` is MIME_TYPE_JSON, then `result` is expected to be
a 1D array (list). If MIME_TYPE_JSON_LINES, then `result` is expected to be a single scalar value.
:param result: JMESPath query result to be validated.
:param args: See ColumnParseArguments docstring.
"""
if args.dataset_mime_type == MIME_TYPE_JSON:
require(
result and isinstance(result, list),
f"Expected to find a non-empty list of samples for the {args.column.value.name} column using "
f"JMESPath '{args.jmespath_parser.expression}' on {args.dataset_name}.",
)
require(
all(x is not None for x in result), # explicitly using "is not None" since values like 0 are false-y
f"Expected an array of non-null values using JMESPath '{args.jmespath_parser.expression}' for "
f"the {args.column.value.name} column of dataset `{args.dataset_name}`, but found at least "
"one value that is None.",
)
if args.column.value.name in COLUMNS_WITH_LISTS:
require(
all(isinstance(x, list) for x in result),
f"Expected a 2D array using JMESPath '{args.jmespath_parser.expression}' on dataset "
f"`{args.dataset_name}` but found at least one non-list object.",
)
else:
require(
all(not isinstance(x, list) for x in result),
f"Expected a 1D array using JMESPath '{args.jmespath_parser.expression}' on dataset "
f"`{args.dataset_name}`, where each element of the array is a sample's {args.column.value.name}, "
f"but found at least one nested array.",
)
elif args.dataset_mime_type == MIME_TYPE_JSONLINES:
require(
result is not None,
f"Found no values using {args.column.value.name} JMESPath '{args.jmespath_parser.expression}' "
f"on dataset `{args.dataset_name}`.",
)
if args.column.value.name in COLUMNS_WITH_LISTS:
require(
isinstance(result, list),
f"Expected to find a List using JMESPath '{args.jmespath_parser.expression}' on a dataset line in "
f"`{args.dataset_name}`, but found a non-list object instead.",
)
else:
require(
not isinstance(result, list),
f"Expected to find a single value using {args.column.value.name} JMESPath "
f"'{args.jmespath_parser.expression}' on a dataset line in "
f"dataset `{args.dataset_name}`, but found a list instead.",
)
else: # pragma: no cover
raise EvalAlgorithmInternalError(
f"args.dataset_mime_type is {args.dataset_mime_type}, but only JSON " "and JSON Lines are supported."
)