Source code for py_gql.utilities.untyped_value_from_ast
# -*- coding: utf-8 -*-
from typing import Any, Dict, Optional, Union
from ..exc import UnknownVariable
from ..lang import ast as _ast
[docs]def untyped_value_from_ast(
node: Union[_ast.Value, _ast.Variable],
variables: Optional[Dict[str, Any]] = None,
) -> Any:
"""
Convert an ast value node into a valid python value without type validation.
Warning:
No validation is done with regard to the variable values which are
assumed to have been validated before.
Args:
node: The value node
variables: Variables mapping
Returns:
Extracted value
Raises:
TypeError: when node is not a value node
UnknownVariable: if a variable is required and doesn't exist
"""
if isinstance(node, _ast.NullValue):
return None
elif isinstance(node, _ast.IntValue):
return int(node.value, 10)
elif isinstance(node, _ast.FloatValue):
return float(node.value)
elif isinstance(
node, (_ast.StringValue, _ast.EnumValue, _ast.BooleanValue)
):
return node.value
elif isinstance(node, _ast.ListValue):
return [
untyped_value_from_ast(item, variables=variables)
for item in node.values
]
elif isinstance(node, _ast.ObjectValue):
return {
f.name.value: untyped_value_from_ast(f.value, variables=variables)
for f in node.fields
}
elif isinstance(node, _ast.Variable):
varname = node.name.value
if not variables or varname not in variables:
raise UnknownVariable(varname, [node])
return variables[varname]
raise TypeError("Unexpected node %s" % node.__class__)