failed action results are now showing up together with success to make it easier to find
This commit is contained in:
+51
-21
@@ -858,11 +858,12 @@ class AppBase:
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
raise json.dumps({
|
raise Exception(json.dumps({
|
||||||
"success": False,
|
"success": False,
|
||||||
"reason": "You may be running an old version of this action. Please delete and remake the node.",
|
"reason": "You may be running an old version of this action. Please delete and remake the node.",
|
||||||
"exception": f"TypeError: {e}",
|
"exception": f"TypeError: {e}",
|
||||||
})
|
}))
|
||||||
|
break
|
||||||
|
|
||||||
|
|
||||||
except:
|
except:
|
||||||
@@ -1974,7 +1975,7 @@ class AppBase:
|
|||||||
try:
|
try:
|
||||||
return json.dumps(json.loads(returndata)), is_loop
|
return json.dumps(json.loads(returndata)), is_loop
|
||||||
except json.decoder.JSONDecodeError as e:
|
except json.decoder.JSONDecodeError as e:
|
||||||
print("Error in decoder: %s" % e)
|
print("[ERROR] Error in decoder: %s" % e)
|
||||||
return returndata, is_loop
|
return returndata, is_loop
|
||||||
|
|
||||||
# Sending self as it's not a normal function
|
# Sending self as it's not a normal function
|
||||||
@@ -2707,11 +2708,11 @@ class AppBase:
|
|||||||
for parameter in action["parameters"]:
|
for parameter in action["parameters"]:
|
||||||
check, value, is_loop = parse_params(action, fullexecution, parameter, self)
|
check, value, is_loop = parse_params(action, fullexecution, parameter, self)
|
||||||
if check:
|
if check:
|
||||||
raise json.dumps({
|
raise Exception(json.dumps({
|
||||||
"success": False,
|
"success": False,
|
||||||
"reason": "Parameter {parameter} has an issue",
|
"reason": "Parameter {parameter} has an issue",
|
||||||
"exception": f"Value Check Error: {check}",
|
"exception": f"Value Error: {check}",
|
||||||
})
|
}))
|
||||||
|
|
||||||
# Custom format for ${name[0,1,2,...]}$
|
# Custom format for ${name[0,1,2,...]}$
|
||||||
#submatch = "([${]{2}([0-9a-zA-Z_-]+)(\[.*\])[}$]{2})"
|
#submatch = "([${]{2}([0-9a-zA-Z_-]+)(\[.*\])[}$]{2})"
|
||||||
@@ -3045,32 +3046,55 @@ class AppBase:
|
|||||||
self.send_result(self.action_result, headers, stream_path)
|
self.send_result(self.action_result, headers, stream_path)
|
||||||
return
|
return
|
||||||
|
|
||||||
self.logger.info("[INFO] Running normal execution (not loop)\n")
|
self.logger.info("[INFO] Running normal execution (not loop)\n\n")
|
||||||
|
|
||||||
|
# Added literal evaluation of anything resembling a string
|
||||||
|
# The goal is to parse objects that e.g. use single quotes and the like
|
||||||
|
# FIXME: add this to Multi exec as well.
|
||||||
try:
|
try:
|
||||||
for key, value in params.items():
|
for key, value in params.items():
|
||||||
try:
|
try:
|
||||||
if isinstance(value, str) and ((value.startswith("{") and value.endswith("}")) or (value.startswith("[") and value.endswith("]"))):
|
if isinstance(value, str) and ((value.startswith("{") and value.endswith("}")) or (value.startswith("[") and value.endswith("]"))):
|
||||||
params[key] = ast.literal_eval(value)
|
params[key] = ast.literal_eval(value)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.info(f"[DEBUG] Failed parsing value with ast: {e}")
|
try:
|
||||||
continue
|
params[key] = json.loads(value)
|
||||||
|
except json.decoder.JSONDecodeError as e:
|
||||||
|
self.logger.info(f"[DEBUG] Failed parsing value with ast and json.loads - noncritical. Trying next: {e}")
|
||||||
|
continue
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.info("[DEBUG] Failed looping objects. Non critical: {e}")
|
self.logger.info("[DEBUG] Failed looping objects. Non critical: {e}")
|
||||||
|
|
||||||
#newres = await func(**params)
|
# Uncomment below to get the param input
|
||||||
#self.logger.info("PARAMS: %s" % params)
|
# self.logger.info(f"[DEBUG] PARAMS: {params}")
|
||||||
|
|
||||||
#newres = ""
|
#newres = ""
|
||||||
|
iteration_count = 0
|
||||||
while True:
|
while True:
|
||||||
|
iteration_count += 1
|
||||||
|
if iteration_count > 10:
|
||||||
|
newres = {
|
||||||
|
"success": False,
|
||||||
|
"reason": "Iteration count more than 10. This happens if the input to the action is wrong. Try remaking the action, and contact support@shuffler.io if this persists.",
|
||||||
|
}
|
||||||
|
break
|
||||||
|
|
||||||
try:
|
try:
|
||||||
#newres = await func(**params)
|
|
||||||
newres = func(**params)
|
newres = func(**params)
|
||||||
break
|
break
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
newres = ""
|
newres = ""
|
||||||
self.logger.info(f"[DEBUG] Got exec error: {e}")
|
self.logger.info(f"[DEBUG] Got exec error: {e}")
|
||||||
errorstring = f"{e}"
|
errorstring = f"{e}"
|
||||||
if "got an unexpected keyword argument" in errorstring:
|
|
||||||
|
if "the JSON object must be" in errorstring:
|
||||||
|
self.logger.info("[ERROR] Something is wrong with the input for this function. Are lists and JSON data handled parsed properly?")
|
||||||
|
raise Exception(json.dumps({
|
||||||
|
"success": False,
|
||||||
|
"reason": "An exception occurred while running this function. See exception for more details and contact support if this persists (support@shuffler.io)",
|
||||||
|
"exception": f"{e}",
|
||||||
|
}))
|
||||||
|
elif "got an unexpected keyword argument" in errorstring:
|
||||||
fieldsplit = errorstring.split("'")
|
fieldsplit = errorstring.split("'")
|
||||||
if len(fieldsplit) > 1:
|
if len(fieldsplit) > 1:
|
||||||
field = fieldsplit[1]
|
field = fieldsplit[1]
|
||||||
@@ -3081,11 +3105,18 @@ class AppBase:
|
|||||||
except KeyError:
|
except KeyError:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
raise json.dumps({
|
newres = json.dumps({
|
||||||
"success": False,
|
"success": False,
|
||||||
"reason": "You may be running an old version of this action. Please delete and remake the node.",
|
"reason": "You may be running an old version of this action. Please delete and remake the node.",
|
||||||
"exception": f"TypeError: {e}",
|
"exception": f"TypeError: {e}",
|
||||||
})
|
})
|
||||||
|
except Exception as e:
|
||||||
|
self.logger.info("[ERROR] Something is wrong with the input for this function. Are lists and JSON data handled parsed properly?")
|
||||||
|
raise Exception(json.dumps({
|
||||||
|
"success": False,
|
||||||
|
"reason": "An exception occurred while running this function. See exception for more details and contact support if this persists (support@shuffler.io)",
|
||||||
|
"exception": f"{e}",
|
||||||
|
}))
|
||||||
|
|
||||||
# Forcing async wait in case of old apps that use async (backwards compatibility)
|
# Forcing async wait in case of old apps that use async (backwards compatibility)
|
||||||
try:
|
try:
|
||||||
@@ -3104,7 +3135,7 @@ class AppBase:
|
|||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.logger.warning("[ERROR] Failed to parse coroutine value for old app: {e}")
|
self.logger.warning("[ERROR] Failed to parse coroutine value for old app: {e}")
|
||||||
|
|
||||||
self.logger.info("\n[INFO] Returned from execution with type(s) %s" % type(newres))
|
self.logger.info("\n\n\n[INFO] Returned from execution with type(s) %s" % type(newres))
|
||||||
#self.logger.info("\n[INFO] Returned from execution with %s of types %s" % (newres, type(newres)))#, newres)
|
#self.logger.info("\n[INFO] Returned from execution with %s of types %s" % (newres, type(newres)))#, newres)
|
||||||
if isinstance(newres, tuple):
|
if isinstance(newres, tuple):
|
||||||
self.logger.info(f"[INFO] Handling return as tuple: {newres}")
|
self.logger.info(f"[INFO] Handling return as tuple: {newres}")
|
||||||
@@ -3210,7 +3241,7 @@ class AppBase:
|
|||||||
self.logger.debug(f"[DEBUG] Executed {action['label']}-{action['id']}")#with result: {result}")
|
self.logger.debug(f"[DEBUG] Executed {action['label']}-{action['id']}")#with result: {result}")
|
||||||
#self.logger.debug(f"Data: %s" % action_result)
|
#self.logger.debug(f"Data: %s" % action_result)
|
||||||
except TypeError as e:
|
except TypeError as e:
|
||||||
self.logger.info("TypeError issue: %s" % e)
|
self.logger.info("[ERROR] TypeError issue: %s" % e)
|
||||||
self.action_result["status"] = "FAILURE"
|
self.action_result["status"] = "FAILURE"
|
||||||
self.action_result["result"] = "TypeError: %s" % str(e)
|
self.action_result["result"] = "TypeError: %s" % str(e)
|
||||||
else:
|
else:
|
||||||
@@ -3228,7 +3259,7 @@ class AppBase:
|
|||||||
self.action_result["result"] = json.dumps({
|
self.action_result["result"] = json.dumps({
|
||||||
"success": False,
|
"success": False,
|
||||||
"reason": f"Request error - failing silently. Details in detail section",
|
"reason": f"Request error - failing silently. Details in detail section",
|
||||||
"details": f"{e}",
|
"details": e,
|
||||||
})
|
})
|
||||||
except json.decoder.JSONDecodeError as e:
|
except json.decoder.JSONDecodeError as e:
|
||||||
self.action_result["result"] = f"Request error: {e}"
|
self.action_result["result"] = f"Request error: {e}"
|
||||||
@@ -3237,15 +3268,14 @@ class AppBase:
|
|||||||
self.logger.info(f"[ERROR] Failed to execute: {e}")
|
self.logger.info(f"[ERROR] Failed to execute: {e}")
|
||||||
self.logger.exception(f"[ERROR] Failed to execute {e}-{action['id']}")
|
self.logger.exception(f"[ERROR] Failed to execute {e}-{action['id']}")
|
||||||
self.action_result["status"] = "FAILURE"
|
self.action_result["status"] = "FAILURE"
|
||||||
#self.action_result["result"] = f"General exception: {e}"
|
|
||||||
self.action_result["result"] = json.dumps({
|
self.action_result["result"] = json.dumps({
|
||||||
"success": False,
|
"success": False,
|
||||||
"reason": f"General exception: {e}",
|
"reason": f"General exception.",
|
||||||
|
"details": e,
|
||||||
})
|
})
|
||||||
|
|
||||||
self.action_result["completed_at"] = int(time.time())
|
|
||||||
|
|
||||||
# Send the result :)
|
# Send the result :)
|
||||||
|
self.action_result["completed_at"] = int(time.time())
|
||||||
self.send_result(self.action_result, headers, stream_path)
|
self.send_result(self.action_result, headers, stream_path)
|
||||||
|
|
||||||
#try:
|
#try:
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
### DEFAULT
|
### DEFAULT
|
||||||
NAME=shuffle-app_sdk
|
NAME=shuffle-app_sdk
|
||||||
VERSION=0.9.65
|
VERSION=0.9.66
|
||||||
|
|
||||||
docker rmi docker.pkg.github.com/frikky/shuffle/$NAME:$VERSION --force
|
docker rmi docker.pkg.github.com/frikky/shuffle/$NAME:$VERSION --force
|
||||||
docker build . -f Dockerfile -t frikky/shuffle:app_sdk -t frikky/$NAME:$VERSION -t docker.pkg.github.com/frikky/shuffle/$NAME:$VERSION -t ghcr.io/frikky/$NAME:$VERSION -t ghcr.io/frikky/$NAME:nightly
|
docker build . -f Dockerfile -t frikky/shuffle:app_sdk -t frikky/$NAME:$VERSION -t docker.pkg.github.com/frikky/shuffle/$NAME:$VERSION -t ghcr.io/frikky/$NAME:$VERSION -t ghcr.io/frikky/$NAME:nightly
|
||||||
|
|||||||
@@ -1906,7 +1906,7 @@ const ParsedAction = (props) => {
|
|||||||
) : pathdata.type === "list" ? (
|
) : pathdata.type === "list" ? (
|
||||||
<FormatListNumberedIcon style={{marginLeft: 9, marginRight: 10, }} />
|
<FormatListNumberedIcon style={{marginLeft: 9, marginRight: 10, }} />
|
||||||
) : (
|
) : (
|
||||||
<Circle style={{marginLeft: 9, marginRight: 10, color: coverColor}}/>
|
<CircleIcon style={{marginLeft: 9, marginRight: 10, color: coverColor}}/>
|
||||||
);
|
);
|
||||||
//<ExpandMoreIcon style={iconStyle} />
|
//<ExpandMoreIcon style={iconStyle} />
|
||||||
|
|
||||||
|
|||||||
@@ -11978,13 +11978,13 @@ const parsedExecutionArgument = () => {
|
|||||||
executionData.results.length > 1 &&
|
executionData.results.length > 1 &&
|
||||||
executionData.results.find(
|
executionData.results.find(
|
||||||
(result) =>
|
(result) =>
|
||||||
result.status === "SKIPPED" || result.status === "FAILURE"
|
result.status === "SKIPPED"
|
||||||
) ? (
|
) ? (
|
||||||
<FormControlLabel
|
<FormControlLabel
|
||||||
style={{ color: "white", marginBottom: 10 }}
|
style={{ color: "white", marginBottom: 10 }}
|
||||||
label={
|
label={
|
||||||
<div style={{ color: "white" }}>
|
<div style={{ color: "white" }}>
|
||||||
Show failed / skipped actions
|
Show skipped actions
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
control={
|
control={
|
||||||
@@ -12024,7 +12024,7 @@ const parsedExecutionArgument = () => {
|
|||||||
if (
|
if (
|
||||||
executionData.results.length !== 1 &&
|
executionData.results.length !== 1 &&
|
||||||
!showSkippedActions &&
|
!showSkippedActions &&
|
||||||
(data.status === "SKIPPED" || data.status === "FAILURE")
|
(data.status === "SKIPPED")
|
||||||
) {
|
) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user