4545import sys
4646import tempfile
4747import time
48+ from typing import Optional
4849import uuid
4950import pyparsing
5051import 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