4545import sys
4646import tempfile
4747import time
48+ from typing import Optional
4849import uuid
4950import pyparsing
5051import zmq
@@ -105,20 +106,23 @@ def sendExpression(self, command, parsed=True):
105106 """
106107 pass
107108
108- def ask (self , question , opt = None , parsed = True ):
109- p = (question , opt , parsed )
109+ def _ask (self , question : str , opt : Optional [list [str ]] = None , parsed : Optional [bool ] = True ):
110+
111+ if opt is None :
112+ expression = question
113+ elif isinstance (opt , list ):
114+ expression = f"{ question } ({ ',' .join (opt )} )"
115+ else :
116+ raise Exception (f"Invalid definition of options for { repr (question )} : { repr (opt )} " )
117+
118+ p = (expression , parsed )
110119
111120 if self ._readonly and question != 'getErrorString' :
112121 # can use cache if readonly
113122 if p in self ._omc_cache :
114123 return self ._omc_cache [p ]
115124
116- if opt :
117- expression = f'{ question } ({ opt } )'
118- else :
119- expression = question
120-
121- logger .debug ('OMC ask: %s - parsed: %s' , expression , parsed )
125+ logger .debug ('OMC ask: %s (parsed=%s)' , expression , parsed )
122126
123127 try :
124128 res = self .sendExpression (expression , parsed = parsed )
@@ -133,118 +137,118 @@ def ask(self, question, opt=None, parsed=True):
133137
134138 # TODO: Open Modelica Compiler API functions. Would be nice to generate these.
135139 def loadFile (self , filename ):
136- return self .ask ( 'loadFile' , f'"{ filename } "' )
140+ return self ._ask ( question = 'loadFile' , opt = [ f'"{ filename } "' ] )
137141
138142 def loadModel (self , className ):
139- return self .ask ( 'loadModel' , className )
143+ return self ._ask ( question = 'loadModel' , opt = [ className ] )
140144
141145 def isModel (self , className ):
142- return self .ask ( 'isModel' , className )
146+ return self ._ask ( question = 'isModel' , opt = [ className ] )
143147
144148 def isPackage (self , className ):
145- return self .ask ( 'isPackage' , className )
149+ return self ._ask ( question = 'isPackage' , opt = [ className ] )
146150
147151 def isPrimitive (self , className ):
148- return self .ask ( 'isPrimitive' , className )
152+ return self ._ask ( question = 'isPrimitive' , opt = [ className ] )
149153
150154 def isConnector (self , className ):
151- return self .ask ( 'isConnector' , className )
155+ return self ._ask ( question = 'isConnector' , opt = [ className ] )
152156
153157 def isRecord (self , className ):
154- return self .ask ( 'isRecord' , className )
158+ return self ._ask ( question = 'isRecord' , opt = [ className ] )
155159
156160 def isBlock (self , className ):
157- return self .ask ( 'isBlock' , className )
161+ return self ._ask ( question = 'isBlock' , opt = [ className ] )
158162
159163 def isType (self , className ):
160- return self .ask ( 'isType' , className )
164+ return self ._ask ( question = 'isType' , opt = [ className ] )
161165
162166 def isFunction (self , className ):
163- return self .ask ( 'isFunction' , className )
167+ return self ._ask ( question = 'isFunction' , opt = [ className ] )
164168
165169 def isClass (self , className ):
166- return self .ask ( 'isClass' , className )
170+ return self ._ask ( question = 'isClass' , opt = [ className ] )
167171
168172 def isParameter (self , className ):
169- return self .ask ( 'isParameter' , className )
173+ return self ._ask ( question = 'isParameter' , opt = [ className ] )
170174
171175 def isConstant (self , className ):
172- return self .ask ( 'isConstant' , className )
176+ return self ._ask ( question = 'isConstant' , opt = [ className ] )
173177
174178 def isProtected (self , className ):
175- return self .ask ( 'isProtected' , className )
179+ return self ._ask ( question = 'isProtected' , opt = [ className ] )
176180
177181 def getPackages (self , className = "AllLoadedClasses" ):
178- return self .ask ( 'getPackages' , className )
182+ return self ._ask ( question = 'getPackages' , opt = [ className ] )
179183
180184 def getClassRestriction (self , className ):
181- return self .ask ( 'getClassRestriction' , className )
185+ return self ._ask ( question = 'getClassRestriction' , opt = [ className ] )
182186
183187 def getDerivedClassModifierNames (self , className ):
184- return self .ask ( 'getDerivedClassModifierNames' , className )
188+ return self ._ask ( question = 'getDerivedClassModifierNames' , opt = [ className ] )
185189
186190 def getDerivedClassModifierValue (self , className , modifierName ):
187- return self .ask ( 'getDerivedClassModifierValue' , f' { className } , { modifierName } ' )
191+ return self ._ask ( question = 'getDerivedClassModifierValue' , opt = [ className , modifierName ] )
188192
189193 def typeNameStrings (self , className ):
190- return self .ask ( 'typeNameStrings' , className )
194+ return self ._ask ( question = 'typeNameStrings' , opt = [ className ] )
191195
192196 def getComponents (self , className ):
193- return self .ask ( 'getComponents' , className )
197+ return self ._ask ( question = 'getComponents' , opt = [ className ] )
194198
195199 def getClassComment (self , className ):
196200 try :
197- return self .ask ( 'getClassComment' , className )
201+ return self ._ask ( question = 'getClassComment' , opt = [ className ] )
198202 except pyparsing .ParseException as ex :
199203 logger .warning ("Method 'getClassComment' failed for %s" , className )
200204 logger .warning ('OMTypedParser error: %s' , ex .message )
201205 return 'No description available'
202206
203207 def getNthComponent (self , className , comp_id ):
204208 """ returns with (type, name, description) """
205- return self .ask ( 'getNthComponent' , f' { className } , { comp_id } ' )
209+ return self ._ask ( question = 'getNthComponent' , opt = [ className , comp_id ] )
206210
207211 def getNthComponentAnnotation (self , className , comp_id ):
208- return self .ask ( 'getNthComponentAnnotation' , f' { className } , { comp_id } ' )
212+ return self ._ask ( question = 'getNthComponentAnnotation' , opt = [ className , comp_id ] )
209213
210214 def getImportCount (self , className ):
211- return self .ask ( 'getImportCount' , className )
215+ return self ._ask ( question = 'getImportCount' , opt = [ className ] )
212216
213217 def getNthImport (self , className , importNumber ):
214218 # [Path, id, kind]
215- return self .ask ( 'getNthImport' , f' { className } , { importNumber } ' )
219+ return self ._ask ( question = 'getNthImport' , opt = [ className , importNumber ] )
216220
217221 def getInheritanceCount (self , className ):
218- return self .ask ( 'getInheritanceCount' , className )
222+ return self ._ask ( question = 'getInheritanceCount' , opt = [ className ] )
219223
220224 def getNthInheritedClass (self , className , inheritanceDepth ):
221- return self .ask ( 'getNthInheritedClass' , f' { className } , { inheritanceDepth } ' )
225+ return self ._ask ( question = 'getNthInheritedClass' , opt = [ className , inheritanceDepth ] )
222226
223227 def getParameterNames (self , className ):
224228 try :
225- return self .ask ( 'getParameterNames' , className )
229+ return self ._ask ( question = 'getParameterNames' , opt = [ className ] )
226230 except KeyError as ex :
227231 logger .warning ('OMPython error: %s' , ex )
228232 # FIXME: OMC returns with a different structure for empty parameter set
229233 return []
230234
231235 def getParameterValue (self , className , parameterName ):
232236 try :
233- return self .ask ( 'getParameterValue' , f' { className } , { parameterName } ' )
237+ return self ._ask ( question = 'getParameterValue' , opt = [ className , parameterName ] )
234238 except pyparsing .ParseException as ex :
235239 logger .warning ('OMTypedParser error: %s' , ex .message )
236240 return ""
237241
238242 def getComponentModifierNames (self , className , componentName ):
239- return self .ask ( 'getComponentModifierNames' , f' { className } , { componentName } ' )
243+ return self ._ask ( question = 'getComponentModifierNames' , opt = [ className , componentName ] )
240244
241245 def getComponentModifierValue (self , className , componentName ):
242246 try :
243247 # FIXME: OMPython exception UnboundLocalError exception for 'Modelica.Fluid.Machines.ControlledPump'
244- return self .ask ('getComponentModifierValue' , f' { className } , { componentName } ' )
248+ return self ._ask ('getComponentModifierValue' , opt = [ className , componentName ] )
245249 except pyparsing .ParseException as ex :
246250 logger .warning ('OMTypedParser error: %s' , ex .message )
247- result = self .ask ('getComponentModifierValue' , f' { className } , { componentName } ' , parsed = False )
251+ result = self ._ask ('getComponentModifierValue' , opt = [ className , componentName ] , parsed = False )
248252 try :
249253 answer = OMParser .check_for_values (result )
250254 OMParser .result = {}
@@ -254,15 +258,12 @@ def getComponentModifierValue(self, className, componentName):
254258 return result
255259
256260 def getExtendsModifierNames (self , className , componentName ):
257- return self .ask ('getExtendsModifierNames' , f'{ className } , { componentName } ' )
258-
259- def getExtendsModifierValue (self , className , extendsName , modifierName ):
260261 try :
261262 # FIXME: OMPython exception UnboundLocalError exception for 'Modelica.Fluid.Machines.ControlledPump'
262- return self .ask ('getExtendsModifierValue' , f' { className } , { extendsName } , { modifierName } ' )
263+ return self ._ask ('getExtendsModifierValue' , opt = [ className , componentName ] )
263264 except pyparsing .ParseException as ex :
264265 logger .warning ('OMTypedParser error: %s' , ex .message )
265- result = self .ask ('getExtendsModifierValue' , f' { className } , { extendsName } , { modifierName } ' , parsed = False )
266+ result = self ._ask ('getExtendsModifierValue' , opt = [ className , componentName ] , parsed = False )
266267 try :
267268 answer = OMParser .check_for_values (result )
268269 OMParser .result = {}
@@ -276,7 +277,7 @@ def getNthComponentModification(self, className, comp_id):
276277
277278 # get {$Code(....)} field
278279 # \{\$Code\((\S*\s*)*\)\}
279- value = self .ask ( 'getNthComponentModification' , f' { className } , { comp_id } ' , parsed = False )
280+ value = self ._ask ( question = 'getNthComponentModification' , opt = [ className , comp_id ] , parsed = False )
280281 value = value .replace ("{$Code(" , "" )
281282 return value [:- 3 ]
282283 # return self.re_Code.findall(value)
@@ -292,15 +293,13 @@ def getNthComponentModification(self, className, comp_id):
292293 # end getClassNames;
293294 def getClassNames (self , className = None , recursive = False , qualified = False , sort = False , builtin = False ,
294295 showProtected = False ):
295- value = self .ask (
296- 'getClassNames' ,
297- (f'{ className } , ' if className else '' ) +
298- f'recursive={ str (recursive ).lower ()} , '
299- f'qualified={ str (qualified ).lower ()} , '
300- f'sort={ str (sort ).lower ()} , '
301- f'builtin={ str (builtin ).lower ()} , '
302- f'showProtected={ str (showProtected ).lower ()} '
303- )
296+ value = self ._ask (question = 'getClassNames' ,
297+ opt = [className ] if className else [] + [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+ )
304303 return value
305304
306305
0 commit comments