hashable built in func
This commit is contained in:
parent
da14fe072d
commit
17634dac0a
5 changed files with 31 additions and 8 deletions
|
|
@ -498,6 +498,8 @@ class _Parser:
|
||||||
raise MAP_KEY_WITH_NO_VALUE
|
raise MAP_KEY_WITH_NO_VALUE
|
||||||
if isinstance(key, NonHashable):
|
if isinstance(key, NonHashable):
|
||||||
raise MAP_KEY_NOT_HASHABLE
|
raise MAP_KEY_NOT_HASHABLE
|
||||||
|
if isinstance(key, BuiltInFunction) and issubclass(key.output_type(), NonHashable):
|
||||||
|
raise MAP_KEY_NOT_HASHABLE
|
||||||
if len(value_args) > 1:
|
if len(value_args) > 1:
|
||||||
raise MAP_KEY_MULTIPLE_VALUES
|
raise MAP_KEY_MULTIPLE_VALUES
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -291,3 +291,6 @@ class BuiltInFunction(Function, BuiltInFunctionType):
|
||||||
raise FunctionRuntimeException(
|
raise FunctionRuntimeException(
|
||||||
f"Runtime error occurred when executing the function %{self.name}: {str(exc)}"
|
f"Runtime error occurred when executing the function %{self.name}: {str(exc)}"
|
||||||
) from exc
|
) from exc
|
||||||
|
|
||||||
|
def __hash__(self):
|
||||||
|
return hash((self.name, *self.args))
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,9 @@ class ScriptUtils:
|
||||||
ast = parse(text=value).ast
|
ast = parse(text=value).ast
|
||||||
if len(ast) == 1:
|
if len(ast) == 1:
|
||||||
return ast[0]
|
return ast[0]
|
||||||
return BuiltInFunction(name="concat", args=ast)
|
return BuiltInFunction(
|
||||||
|
name="concat", args=[BuiltInFunction(name="string", args=[arg]) for arg in ast]
|
||||||
|
)
|
||||||
if isinstance(value, int):
|
if isinstance(value, int):
|
||||||
return Integer(value)
|
return Integer(value)
|
||||||
if isinstance(value, float):
|
if isinstance(value, float):
|
||||||
|
|
|
||||||
|
|
@ -198,3 +198,16 @@ class TestMap:
|
||||||
"key_variable": "{['non-hashable']}",
|
"key_variable": "{['non-hashable']}",
|
||||||
}
|
}
|
||||||
).resolve()
|
).resolve()
|
||||||
|
|
||||||
|
def test_map_key_is_function(self):
|
||||||
|
assert Script(
|
||||||
|
{
|
||||||
|
"dict": "{{ %concat('hi', %string(' world')) : 'value' }}",
|
||||||
|
"key_variable": "hashable",
|
||||||
|
}
|
||||||
|
).resolve() == ScriptOutput(
|
||||||
|
{
|
||||||
|
"key_variable": String("hashable"),
|
||||||
|
"dict": Map(value={String(value="hi world"): String(value="value")}),
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
|
||||||
|
|
@ -97,6 +97,7 @@ class TestUnstructuredDictFormatterValidator(object):
|
||||||
key5_bool = True
|
key5_bool = True
|
||||||
key6_map = {"{variable}_key": "value", "static_key": "{variable}_value"}
|
key6_map = {"{variable}_key": "value", "static_key": "{variable}_value"}
|
||||||
key7_list = ["list_1", "list_{variable_2}"]
|
key7_list = ["list_1", "list_{variable_2}"]
|
||||||
|
key8_many_vars = "string {variable1} with multiple {variable2}"
|
||||||
validator = dict_validator_class(
|
validator = dict_validator_class(
|
||||||
name="validator",
|
name="validator",
|
||||||
value={
|
value={
|
||||||
|
|
@ -107,17 +108,19 @@ class TestUnstructuredDictFormatterValidator(object):
|
||||||
"key5": key5_bool,
|
"key5": key5_bool,
|
||||||
"key6": key6_map,
|
"key6": key6_map,
|
||||||
"key7": key7_list,
|
"key7": key7_list,
|
||||||
|
"key8": key8_many_vars,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
assert len(validator.dict) == 7
|
assert len(validator.dict) == 8
|
||||||
assert all(isinstance(val, expected_formatter_class) for val in validator.dict.values())
|
assert all(isinstance(val, expected_formatter_class) for val in validator.dict.values())
|
||||||
assert validator.dict_with_format_strings == {
|
assert validator.dict_with_format_strings == {
|
||||||
"key1": "string with {variable}",
|
"key1": "{ %concat( %string( '''string with ''' ), %string( variable ) ) }",
|
||||||
"key2": "no variables",
|
"key2": "no variables",
|
||||||
"key3": "{%int(3)}",
|
"key3": "{ %int(3) }",
|
||||||
"key4": "{%float(4.132)}",
|
"key4": "{ %float(4.132) }",
|
||||||
"key5": "{%int(True)}",
|
"key5": "{ %int(True) }",
|
||||||
"key6": '{%from_json(\'\'\'{"static_key": "{variable}_value", "{variable}_key": "value"}\'\'\')}',
|
"key6": "{ { %concat( %string( variable ), %string( '''_key''' ) ): '''value''', '''static_key''': %concat( %string( variable ), %string( '''_value''' ) ) } }",
|
||||||
"key7": "{%from_json('''[\"list_1\", \"list_{variable_2}\"]''')}",
|
"key7": "{ [ '''list_1''', %concat( %string( '''list_''' ), %string( variable_2 ) ) ] }",
|
||||||
|
"key8": "{ %concat( %string( '''string ''' ), %string( variable1 ), %string( ''' with multiple ''' ), %string( variable2 ) ) }",
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue