Skip to content

Commit 57f8bf4

Browse files
committed
??? [OMCSessionBase.ask()] define opt as list
1 parent 712952e commit 57f8bf4

1 file changed

Lines changed: 58 additions & 60 deletions

File tree

OMPython/OMCSession.py

Lines changed: 58 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import sys
4646
import tempfile
4747
import time
48+
from typing import Optional
4849
import uuid
4950
import pyparsing
5051
import zmq
@@ -107,44 +108,45 @@ def sendExpression(self, command, parsed=True):
107108
"""
108109
pass
109110

110-
def ask(self, question, opt=None, parsed=True):
111-
# TODO: define opt as list
112-
p = (question, opt, parsed)
111+
def _ask(self, question: str, opt: Optional[list[str]] = None, parsed: Optional[bool] = True):
112+
113+
if opt is None:
114+
expression = question
115+
elif isinstance(opt, list):
116+
expression = f'{question}({','.join(opt)})'
117+
else:
118+
raise OMCSessionException(f"Invalid definition of options: {repr(opt)}")
119+
120+
p = (expression, parsed)
113121

114122
if self._readonly and question != 'getErrorString':
115123
# can use cache if readonly
116124
if p in self._omc_cache:
117125
return self._omc_cache[p]
118126

119-
if opt:
120-
expression = f'{question}({opt})'
121-
else:
122-
expression = question
123-
124-
logger.debug('OMC ask: %s - parsed: %s', expression, parsed)
127+
logger.debug('OMC ask: %s (parsed=%s)', expression, parsed)
125128

126129
try:
127130
res = self.sendExpression(expression, parsed=parsed)
128-
except OMCSessionException:
129-
logger.error("OMC failed: %s, %s, parsed=%s", question, opt, parsed)
130-
raise
131+
except OMCSessionException as ex:
132+
raise OMCSessionException("OMC ask failed: %s (parsed=%s)", expression, parsed) from ex
131133

132134
# save response
133135
self._omc_cache[p] = res
134136

135137
return res
136138

137-
def _ask_with_fallback(self, question: str, opt: str = None):
139+
def _ask_with_fallback(self, question: str, opt: Optional[list[str]] = None):
138140
"""
139141
Version of ask() with OMTypedParser as fallback for OMParser which is used in ask() => sendExpression() if
140142
parsed is set to True.
141143
"""
142144
try:
143145
# FIXME: OMPython exception UnboundLocalError exception for 'Modelica.Fluid.Machines.ControlledPump'
144-
return self.ask(question=question, opt=opt)
146+
return self._ask(question=question, opt=opt)
145147
except pyparsing.ParseException as ex:
146148
logger.warning('OMTypedParser error: %s', ex.msg)
147-
result = self.ask(question=question, opt=opt, parsed=False)
149+
result = self._ask(question=question, opt=opt, parsed=False)
148150
try:
149151
answer = om_parser_basic(result)
150152
return answer[2:]
@@ -154,128 +156,126 @@ def _ask_with_fallback(self, question: str, opt: str = None):
154156

155157
# TODO: Open Modelica Compiler API functions. Would be nice to generate these.
156158
def loadFile(self, filename):
157-
return self.ask('loadFile', f'"{filename}"')
159+
return self._ask(question='loadFile', opt=[f'"{filename}"'])
158160

159161
def loadModel(self, className):
160-
return self.ask('loadModel', className)
162+
return self._ask(question='loadModel', opt=[className])
161163

162164
def isModel(self, className):
163-
return self.ask('isModel', className)
165+
return self._ask(question='isModel', opt=[className])
164166

165167
def isPackage(self, className):
166-
return self.ask('isPackage', className)
168+
return self._ask(question='isPackage', opt=[className])
167169

168170
def isPrimitive(self, className):
169-
return self.ask('isPrimitive', className)
171+
return self._ask(question='isPrimitive', opt=[className])
170172

171173
def isConnector(self, className):
172-
return self.ask('isConnector', className)
174+
return self._ask(question='isConnector', opt=[className])
173175

174176
def isRecord(self, className):
175-
return self.ask('isRecord', className)
177+
return self._ask(question='isRecord', opt=[className])
176178

177179
def isBlock(self, className):
178-
return self.ask('isBlock', className)
180+
return self._ask(question='isBlock', opt=[className])
179181

180182
def isType(self, className):
181-
return self.ask('isType', className)
183+
return self._ask(question='isType', opt=[className])
182184

183185
def isFunction(self, className):
184-
return self.ask('isFunction', className)
186+
return self._ask(question='isFunction', opt=[className])
185187

186188
def isClass(self, className):
187-
return self.ask('isClass', className)
189+
return self._ask(question='isClass', opt=[className])
188190

189191
def isParameter(self, className):
190-
return self.ask('isParameter', className)
192+
return self._ask(question='isParameter', opt=[className])
191193

192194
def isConstant(self, className):
193-
return self.ask('isConstant', className)
195+
return self._ask(question='isConstant', opt=[className])
194196

195197
def isProtected(self, className):
196-
return self.ask('isProtected', className)
198+
return self._ask(question='isProtected', opt=[className])
197199

198200
def getPackages(self, className="AllLoadedClasses"):
199-
return self.ask('getPackages', className)
201+
return self._ask(question='getPackages', opt=[className])
200202

201203
def getClassRestriction(self, className):
202-
return self.ask('getClassRestriction', className)
204+
return self._ask(question='getClassRestriction', opt=[className])
203205

204206
def getDerivedClassModifierNames(self, className):
205-
return self.ask('getDerivedClassModifierNames', className)
207+
return self._ask(question='getDerivedClassModifierNames', opt=[className])
206208

207209
def getDerivedClassModifierValue(self, className, modifierName):
208-
return self.ask('getDerivedClassModifierValue', f'{className}, {modifierName}')
210+
return self._ask(question='getDerivedClassModifierValue', opt=[className, modifierName])
209211

210212
def typeNameStrings(self, className):
211-
return self.ask('typeNameStrings', className)
213+
return self._ask(question='typeNameStrings', opt=[className])
212214

213215
def getComponents(self, className):
214-
return self.ask('getComponents', className)
216+
return self._ask(question='getComponents', opt=[className])
215217

216218
def getClassComment(self, className):
217219
try:
218-
return self.ask('getClassComment', className)
220+
return self._ask(question='getClassComment', opt=[className])
219221
except pyparsing.ParseException as ex:
220222
logger.warning("Method 'getClassComment' failed for %s", className)
221223
logger.warning('OMTypedParser error: %s', ex.msg)
222224
return 'No description available'
223225

224226
def getNthComponent(self, className, comp_id):
225227
""" returns with (type, name, description) """
226-
return self.ask('getNthComponent', f'{className}, {comp_id}')
228+
return self._ask(question='getNthComponent', opt=[className, comp_id])
227229

228230
def getNthComponentAnnotation(self, className, comp_id):
229-
return self.ask('getNthComponentAnnotation', f'{className}, {comp_id}')
231+
return self._ask(question='getNthComponentAnnotation', opt=[className, comp_id])
230232

231233
def getImportCount(self, className):
232-
return self.ask('getImportCount', className)
234+
return self._ask(question='getImportCount', opt=[className])
233235

234236
def getNthImport(self, className, importNumber):
235237
# [Path, id, kind]
236-
return self.ask('getNthImport', f'{className}, {importNumber}')
238+
return self._ask(question='getNthImport', opt=[className, importNumber])
237239

238240
def getInheritanceCount(self, className):
239-
return self.ask('getInheritanceCount', className)
241+
return self._ask(question='getInheritanceCount', opt=[className])
240242

241243
def getNthInheritedClass(self, className, inheritanceDepth):
242-
return self.ask('getNthInheritedClass', f'{className}, {inheritanceDepth}')
244+
return self._ask(question='getNthInheritedClass', opt=[className, inheritanceDepth])
243245

244246
def getParameterNames(self, className):
245247
try:
246-
return self.ask('getParameterNames', className)
248+
return self._ask(question='getParameterNames', opt=[className])
247249
except KeyError as ex:
248250
logger.warning('OMPython error: %s', ex)
249251
# FIXME: OMC returns with a different structure for empty parameter set
250252
return []
251253

252254
def getParameterValue(self, className, parameterName):
253255
try:
254-
return self.ask('getParameterValue', f'{className}, {parameterName}')
256+
return self._ask(question='getParameterValue', opt=[className, parameterName])
255257
except pyparsing.ParseException as ex:
256258
logger.warning('OMTypedParser error: %s', ex.msg)
257259
return ""
258260

259261
def getComponentModifierNames(self, className, componentName):
260-
return self.ask('getComponentModifierNames', f'{className}, {componentName}')
262+
return self._ask(question='getComponentModifierNames', opt=[className, componentName])
261263

262264
def getComponentModifierValue(self, className, componentName):
263-
return self._ask_with_fallback(question='getComponentModifierValue',
264-
opt=f'{className}, {componentName}')
265+
return self._ask_with_fallback(question='getComponentModifierValue', opt=[className, componentName])
265266

266267
def getExtendsModifierNames(self, className, componentName):
267-
return self.ask('getExtendsModifierNames', f'{className}, {componentName}')
268+
return self._ask(question='getExtendsModifierNames', opt=[className, componentName])
268269

269270
def getExtendsModifierValue(self, className, extendsName, modifierName):
270-
return self._ask_with_fallback(question='getExtendsModifierValue',
271-
opt=f'{className}, {extendsName}, {modifierName}')
271+
return self._ask_with_fallback(question='getExtendsModifierValue', opt=[className, extendsName, modifierName])
272272

273273
def getNthComponentModification(self, className, comp_id):
274274
# FIXME: OMPython exception Results KeyError exception
275275

276276
# get {$Code(....)} field
277277
# \{\$Code\((\S*\s*)*\)\}
278-
value = self.ask('getNthComponentModification', f'{className}, {comp_id}', parsed=False)
278+
value = self._ask(question='getNthComponentModification', opt=[className, comp_id], parsed=False)
279279
value = value.replace("{$Code(", "")
280280
return value[:-3]
281281
# return self.re_Code.findall(value)
@@ -291,15 +291,13 @@ def getNthComponentModification(self, className, comp_id):
291291
# end getClassNames;
292292
def getClassNames(self, className=None, recursive=False, qualified=False, sort=False, builtin=False,
293293
showProtected=False):
294-
value = self.ask(
295-
'getClassNames',
296-
(f'{className}, ' if className else '') +
297-
f'recursive={str(recursive).lower()}, '
298-
f'qualified={str(qualified).lower()}, '
299-
f'sort={str(sort).lower()}, '
300-
f'builtin={str(builtin).lower()}, '
301-
f'showProtected={str(showProtected).lower()}'
302-
)
294+
value = self._ask(question='getClassNames',
295+
opt=[className] if className else [] + [f'recursive={str(recursive).lower()}',
296+
f'qualified={str(qualified).lower()}',
297+
f'sort={str(sort).lower()}',
298+
f'builtin={str(builtin).lower()}',
299+
f'showProtected={str(showProtected).lower()}']
300+
)
303301
return value
304302

305303

0 commit comments

Comments
 (0)