Skip to content

Commit 2656786

Browse files
authored
[OMCSessionZMQ] fix sendExpression() (#300)
do not use else or elif after returns - cleanup of code / reduced indent
1 parent 8d5ca52 commit 2656786

File tree

1 file changed

+72
-68
lines changed

1 file changed

+72
-68
lines changed

OMPython/OMCSession.py

Lines changed: 72 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -570,72 +570,76 @@ def sendExpression(self, command, parsed=True):
570570
self._omc.close()
571571
self._omc = None
572572
return None
573-
else:
574-
result = self._omc.recv_string()
575573

576-
if command == "getErrorString()":
577-
# no error handling if 'getErrorString()' is called
578-
pass
579-
elif command == "getMessagesStringInternal()":
580-
# no error handling if 'getMessagesStringInternal()' is called; parsing NOT possible!
581-
if parsed:
582-
logger.warning("Result of 'getMessagesStringInternal()' cannot be parsed - set parsed to False!")
583-
parsed = False
584-
else:
585-
# allways check for error
586-
self._omc.send_string('getMessagesStringInternal()', flags=zmq.NOBLOCK)
587-
error_raw = self._omc.recv_string()
588-
# run error handling only if there is something to check
589-
if error_raw != "{}\n":
590-
if not self._re_log_entries:
591-
self._re_log_entries = re.compile(pattern=r'record OpenModelica\.Scripting\.ErrorMessage'
592-
'(.*?)'
593-
r'end OpenModelica\.Scripting\.ErrorMessage;',
594-
flags=re.MULTILINE | re.DOTALL)
595-
if not self._re_log_raw:
596-
self._re_log_raw = re.compile(
597-
pattern=r"\s+message = \"(.*?)\",\n" # message
598-
r"\s+kind = .OpenModelica.Scripting.ErrorKind.(.*?),\n" # kind
599-
r"\s+level = .OpenModelica.Scripting.ErrorLevel.(.*?),\n" # level
600-
r"\s+id = (.*?)" # id
601-
"(,\n|\n)", # end marker
602-
flags=re.MULTILINE | re.DOTALL)
603-
604-
# extract all ErrorMessage records
605-
log_entries = self._re_log_entries.findall(string=error_raw)
606-
for log_entry in reversed(log_entries):
607-
log_raw = self._re_log_raw.findall(string=log_entry)
608-
if len(log_raw) != 1 or len(log_raw[0]) != 5:
609-
logger.warning("Invalid ErrorMessage record returned by 'getMessagesStringInternal()':"
610-
f" {repr(log_entry)}!")
611-
612-
log_message = log_raw[0][0].encode().decode('unicode_escape')
613-
log_kind = log_raw[0][1]
614-
log_level = log_raw[0][2]
615-
log_id = log_raw[0][3]
616-
617-
msg = (f"[OMC log for 'sendExpression({command}, {parsed})']: "
618-
f"[{log_kind}:{log_level}:{log_id}] {log_message}")
619-
620-
# response according to the used log level
621-
# see: https://build.openmodelica.org/Documentation/OpenModelica.Scripting.ErrorLevel.html
622-
if log_level == 'error':
623-
raise OMCSessionException(msg)
624-
elif log_level == 'warning':
625-
logger.warning(msg)
626-
elif log_level == 'notification':
627-
logger.info(msg)
628-
else: # internal
629-
logger.debug(msg)
630-
631-
if parsed is True:
632-
try:
633-
return om_parser_typed(result)
634-
except pyparsing.ParseException as ex:
635-
logger.warning('OMTypedParser error: %s. Returning the basic parser result.', ex.msg)
636-
try:
637-
return om_parser_basic(result)
638-
except (TypeError, UnboundLocalError) as ex:
639-
raise OMCSessionException("Cannot parse OMC result") from ex
640-
else:
641-
return result
574+
result = self._omc.recv_string()
575+
576+
if command == "getErrorString()":
577+
# no error handling if 'getErrorString()' is called
578+
if parsed:
579+
logger.warning("Result of 'getErrorString()' cannot be parsed!")
580+
return result
581+
582+
if command == "getMessagesStringInternal()":
583+
# no error handling if 'getMessagesStringInternal()' is called
584+
if parsed:
585+
logger.warning("Result of 'getMessagesStringInternal()' cannot be parsed!")
586+
return result
587+
588+
# always check for error
589+
self._omc.send_string('getMessagesStringInternal()', flags=zmq.NOBLOCK)
590+
error_raw = self._omc.recv_string()
591+
# run error handling only if there is something to check
592+
if error_raw != "{}\n":
593+
if not self._re_log_entries:
594+
self._re_log_entries = re.compile(pattern=r'record OpenModelica\.Scripting\.ErrorMessage'
595+
'(.*?)'
596+
r'end OpenModelica\.Scripting\.ErrorMessage;',
597+
flags=re.MULTILINE | re.DOTALL)
598+
if not self._re_log_raw:
599+
self._re_log_raw = re.compile(
600+
pattern=r"\s+message = \"(.*?)\",\n" # message
601+
r"\s+kind = .OpenModelica.Scripting.ErrorKind.(.*?),\n" # kind
602+
r"\s+level = .OpenModelica.Scripting.ErrorLevel.(.*?),\n" # level
603+
r"\s+id = (.*?)" # id
604+
"(,\n|\n)", # end marker
605+
flags=re.MULTILINE | re.DOTALL)
606+
607+
# extract all ErrorMessage records
608+
log_entries = self._re_log_entries.findall(string=error_raw)
609+
for log_entry in reversed(log_entries):
610+
log_raw = self._re_log_raw.findall(string=log_entry)
611+
if len(log_raw) != 1 or len(log_raw[0]) != 5:
612+
logger.warning("Invalid ErrorMessage record returned by 'getMessagesStringInternal()':"
613+
f" {repr(log_entry)}!")
614+
continue
615+
616+
log_message = log_raw[0][0].encode().decode('unicode_escape')
617+
log_kind = log_raw[0][1]
618+
log_level = log_raw[0][2]
619+
log_id = log_raw[0][3]
620+
621+
msg = (f"[OMC log for 'sendExpression({command}, {parsed})']: "
622+
f"[{log_kind}:{log_level}:{log_id}] {log_message}")
623+
624+
# response according to the used log level
625+
# see: https://build.openmodelica.org/Documentation/OpenModelica.Scripting.ErrorLevel.html
626+
if log_level == 'error':
627+
raise OMCSessionException(msg)
628+
elif log_level == 'warning':
629+
logger.warning(msg)
630+
elif log_level == 'notification':
631+
logger.info(msg)
632+
else: # internal
633+
logger.debug(msg)
634+
635+
if parsed is False:
636+
return result
637+
638+
try:
639+
return om_parser_typed(result)
640+
except pyparsing.ParseException as ex:
641+
logger.warning('OMTypedParser error: %s. Returning the basic parser result.', ex.msg)
642+
try:
643+
return om_parser_basic(result)
644+
except (TypeError, UnboundLocalError) as ex:
645+
raise OMCSessionException("Cannot parse OMC result") from ex

0 commit comments

Comments
 (0)