Merge pull request #332 from felipee07/launch
Improve for recursive casting
This commit is contained in:
+60
-64
@@ -950,35 +950,24 @@ class AppBase:
|
|||||||
|
|
||||||
if "len" in thistype or "length" in thistype or "lenght" in thistype:
|
if "len" in thistype or "length" in thistype or "lenght" in thistype:
|
||||||
print(f"Trying to length-parse: {data}")
|
print(f"Trying to length-parse: {data}")
|
||||||
|
|
||||||
tmp = ""
|
|
||||||
try:
|
try:
|
||||||
tmp = json.loads(data)
|
tmp_len = json.loads(data, parse_float=str, parse_int=str, parse_constant=str)
|
||||||
except (NameError, KeyError, TypeError, json.decoder.JSONDecodeError) as e:
|
except (NameError, KeyError, TypeError, json.decoder.JSONDecodeError) as e:
|
||||||
try:
|
try:
|
||||||
print(f"[WARNING] INITIAL Parsing bug for length in app sdk: {e}")
|
print(f"[WARNING] INITIAL Parsing bug for length in app sdk: {e}")
|
||||||
#data = data.replace("\'", "\"")
|
# data = data.replace("\'", "\"")
|
||||||
data = data.replace("True", "true")
|
data = data.replace("True", "true")
|
||||||
data = data.replace("False", "false")
|
data = data.replace("False", "false")
|
||||||
data = data.replace("None", "null")
|
data = data.replace("None", "null")
|
||||||
data = data.replace("\"", "\\\"")
|
data = data.replace("\"", "\\\"")
|
||||||
data = data.replace("'", "\"")
|
data = data.replace("'", "\"")
|
||||||
|
|
||||||
tmp = json.loads(data)
|
tmp_len = json.loads(data, parse_float=str, parse_int=str, parse_constant=str)
|
||||||
except (NameError, KeyError, TypeError, json.decoder.JSONDecodeError) as e:
|
except (NameError, KeyError, TypeError, json.decoder.JSONDecodeError) as e:
|
||||||
print(f"[ERROR] Parsing bug for length in app sdk: {e}")
|
tmp_len = str(data)
|
||||||
pass
|
|
||||||
|
|
||||||
if tmp == "":
|
return str(len(tmp_len))
|
||||||
print("[WARNING] Length parsing: item wasn't parsed")
|
|
||||||
tmp = data
|
|
||||||
|
|
||||||
if isinstance(tmp, list):
|
|
||||||
return str(len(tmp))
|
|
||||||
elif isinstance(tmp, object):
|
|
||||||
return str(len(tmp))
|
|
||||||
|
|
||||||
return str(len(data))
|
|
||||||
if "parse" in thistype:
|
if "parse" in thistype:
|
||||||
splitvalues = []
|
splitvalues = []
|
||||||
default_error = """Error. Expected syntax: parse(["hello","test1"],0:1)"""
|
default_error = """Error. Expected syntax: parse(["hello","test1"],0:1)"""
|
||||||
@@ -1015,58 +1004,65 @@ class AppBase:
|
|||||||
def parse_wrapper(data):
|
def parse_wrapper(data):
|
||||||
try:
|
try:
|
||||||
if "(" not in data or ")" not in data:
|
if "(" not in data or ")" not in data:
|
||||||
return (data, False)
|
return data, False
|
||||||
except TypeError:
|
except TypeError:
|
||||||
return (data, False)
|
return data, False
|
||||||
|
|
||||||
#print("Running %s" % data)
|
wrappers = ["int", "number", "lower", "upper", "trim", "strip", "split", "parse", "len", "length", "lenght",
|
||||||
|
"join"]
|
||||||
# Look for the INNER wrapper first, then move out
|
|
||||||
wrappers = ["int", "number", "lower", "upper", "trim", "strip", "split", "parse", "len", "length", "lenght", "join"]
|
if not any(wrapper in data for wrapper in wrappers):
|
||||||
found = False
|
return data, False
|
||||||
for wrapper in wrappers:
|
|
||||||
if wrapper not in data.lower():
|
|
||||||
continue
|
|
||||||
|
|
||||||
found = True
|
|
||||||
break
|
|
||||||
|
|
||||||
if not found:
|
|
||||||
return (data, False)
|
|
||||||
|
|
||||||
# Do stuff here.
|
# Do stuff here.
|
||||||
innervalue = parse_nested_param(data, maxDepth(data)-0)
|
inner_value = parse_nested_param(data, maxDepth(data) - 0)
|
||||||
outervalue = parse_nested_param(data, maxDepth(data)-1)
|
outer_value = parse_nested_param(data, maxDepth(data) - 1)
|
||||||
print("INNER: ", innervalue)
|
|
||||||
print("OUTER: ", outervalue)
|
|
||||||
|
|
||||||
# FIXME: There is a known bug here with nested paranthesis
|
|
||||||
#if outervalue != innervalue:
|
|
||||||
# # FIXME: This line right here WILL break things when we
|
|
||||||
# # Do recursive paranthesis in the future
|
|
||||||
# innervalue = outervalue
|
|
||||||
|
|
||||||
# #print("Outer: ", outervalue, " inner: ", innervalue)
|
print("INNER: ", inner_value)
|
||||||
# for key in range(len(innervalue)):
|
print("OUTER: ", outer_value)
|
||||||
# # Replace OUTERVALUE[key] with INNERVALUE[key] in data.
|
|
||||||
# print("\nReplace %s\nwith\n%s\nin\n%s" % (outervalue[key], innervalue[key], data))
|
|
||||||
# data = data.replace(outervalue[key], innervalue[key])
|
|
||||||
#else:
|
|
||||||
if outervalue != innervalue:
|
|
||||||
print("Setting inner to outer")
|
|
||||||
innervalue = outervalue
|
|
||||||
|
|
||||||
for thistype in wrappers:
|
wrapper_group = "|".join(wrappers)
|
||||||
if thistype.lower() not in data.lower():
|
parse_string = data
|
||||||
continue
|
max_depth = maxDepth(parse_string)
|
||||||
|
|
||||||
parsed_value = parse_type(innervalue[0], thistype.lower())
|
if outer_value != inner_value:
|
||||||
print("Parsed value from %s: %s" % (thistype, parsed_value))
|
for casting_items in reversed(range(max_depth + 1)):
|
||||||
return (parsed_value, True)
|
c_parentheses = parse_nested_param(parse_string, casting_items)[0]
|
||||||
|
match_string = re.escape(c_parentheses)
|
||||||
#print("DATA: %s\n" % data)
|
custom_casting = re.findall(fr"({wrapper_group})\({match_string}", parse_string)
|
||||||
return (parse_wrapper(data)[0], True)
|
|
||||||
|
# no matching ; go next group
|
||||||
|
if len(custom_casting) == 0:
|
||||||
|
continue
|
||||||
|
|
||||||
|
inner_result = parse_type(c_parentheses, custom_casting[0])
|
||||||
|
|
||||||
|
# if result is a string then parse else return
|
||||||
|
if isinstance(inner_result, str):
|
||||||
|
parse_string = parse_string.replace(f"{custom_casting[0]}({c_parentheses})", inner_result)
|
||||||
|
elif isinstance(inner_result, list):
|
||||||
|
parse_string = parse_string.replace(f"{custom_casting[0]}({c_parentheses})",
|
||||||
|
json.dumps(inner_result))
|
||||||
|
else:
|
||||||
|
parse_string = inner_result
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
c_parentheses = parse_nested_param(parse_string, 0)[0]
|
||||||
|
match_string = re.escape(c_parentheses)
|
||||||
|
custom_casting = re.findall(fr"({wrapper_group})\({match_string}", parse_string)
|
||||||
|
|
||||||
|
# check if a wrapper was found
|
||||||
|
if len(custom_casting) != 0:
|
||||||
|
inner_result = parse_type(c_parentheses, custom_casting[0])
|
||||||
|
if isinstance(inner_result, str):
|
||||||
|
parse_string = parse_string.replace(f"{custom_casting[0]}({c_parentheses})", inner_result)
|
||||||
|
elif isinstance(inner_result, list):
|
||||||
|
parse_string = parse_string.replace(f"{custom_casting[0]}({c_parentheses})",
|
||||||
|
json.dumps(inner_result))
|
||||||
|
else:
|
||||||
|
parse_string = inner_result
|
||||||
|
|
||||||
|
return parse_string, True
|
||||||
|
|
||||||
# Looks for parantheses to grab special cases within a string, e.g:
|
# Looks for parantheses to grab special cases within a string, e.g:
|
||||||
# int(1) lower(HELLO) or length(what's the length)
|
# int(1) lower(HELLO) or length(what's the length)
|
||||||
|
|||||||
Reference in New Issue
Block a user