45
45
import sys
46
46
import tempfile
47
47
import time
48
+ from typing import Optional
48
49
import uuid
49
50
import pyparsing
50
51
import zmq
@@ -105,20 +106,23 @@ def sendExpression(self, command, parsed=True):
105
106
"""
106
107
pass
107
108
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 )
110
119
111
120
if self ._readonly and question != 'getErrorString' :
112
121
# can use cache if readonly
113
122
if p in self ._omc_cache :
114
123
return self ._omc_cache [p ]
115
124
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 )
122
126
123
127
try :
124
128
res = self .sendExpression (expression , parsed = parsed )
@@ -133,118 +137,118 @@ def ask(self, question, opt=None, parsed=True):
133
137
134
138
# TODO: Open Modelica Compiler API functions. Would be nice to generate these.
135
139
def loadFile (self , filename ):
136
- return self .ask ( 'loadFile' , f'"{ filename } "' )
140
+ return self ._ask ( question = 'loadFile' , opt = [ f'"{ filename } "' ] )
137
141
138
142
def loadModel (self , className ):
139
- return self .ask ( 'loadModel' , className )
143
+ return self ._ask ( question = 'loadModel' , opt = [ className ] )
140
144
141
145
def isModel (self , className ):
142
- return self .ask ( 'isModel' , className )
146
+ return self ._ask ( question = 'isModel' , opt = [ className ] )
143
147
144
148
def isPackage (self , className ):
145
- return self .ask ( 'isPackage' , className )
149
+ return self ._ask ( question = 'isPackage' , opt = [ className ] )
146
150
147
151
def isPrimitive (self , className ):
148
- return self .ask ( 'isPrimitive' , className )
152
+ return self ._ask ( question = 'isPrimitive' , opt = [ className ] )
149
153
150
154
def isConnector (self , className ):
151
- return self .ask ( 'isConnector' , className )
155
+ return self ._ask ( question = 'isConnector' , opt = [ className ] )
152
156
153
157
def isRecord (self , className ):
154
- return self .ask ( 'isRecord' , className )
158
+ return self ._ask ( question = 'isRecord' , opt = [ className ] )
155
159
156
160
def isBlock (self , className ):
157
- return self .ask ( 'isBlock' , className )
161
+ return self ._ask ( question = 'isBlock' , opt = [ className ] )
158
162
159
163
def isType (self , className ):
160
- return self .ask ( 'isType' , className )
164
+ return self ._ask ( question = 'isType' , opt = [ className ] )
161
165
162
166
def isFunction (self , className ):
163
- return self .ask ( 'isFunction' , className )
167
+ return self ._ask ( question = 'isFunction' , opt = [ className ] )
164
168
165
169
def isClass (self , className ):
166
- return self .ask ( 'isClass' , className )
170
+ return self ._ask ( question = 'isClass' , opt = [ className ] )
167
171
168
172
def isParameter (self , className ):
169
- return self .ask ( 'isParameter' , className )
173
+ return self ._ask ( question = 'isParameter' , opt = [ className ] )
170
174
171
175
def isConstant (self , className ):
172
- return self .ask ( 'isConstant' , className )
176
+ return self ._ask ( question = 'isConstant' , opt = [ className ] )
173
177
174
178
def isProtected (self , className ):
175
- return self .ask ( 'isProtected' , className )
179
+ return self ._ask ( question = 'isProtected' , opt = [ className ] )
176
180
177
181
def getPackages (self , className = "AllLoadedClasses" ):
178
- return self .ask ( 'getPackages' , className )
182
+ return self ._ask ( question = 'getPackages' , opt = [ className ] )
179
183
180
184
def getClassRestriction (self , className ):
181
- return self .ask ( 'getClassRestriction' , className )
185
+ return self ._ask ( question = 'getClassRestriction' , opt = [ className ] )
182
186
183
187
def getDerivedClassModifierNames (self , className ):
184
- return self .ask ( 'getDerivedClassModifierNames' , className )
188
+ return self ._ask ( question = 'getDerivedClassModifierNames' , opt = [ className ] )
185
189
186
190
def getDerivedClassModifierValue (self , className , modifierName ):
187
- return self .ask ( 'getDerivedClassModifierValue' , f' { className } , { modifierName } ' )
191
+ return self ._ask ( question = 'getDerivedClassModifierValue' , opt = [ className , modifierName ] )
188
192
189
193
def typeNameStrings (self , className ):
190
- return self .ask ( 'typeNameStrings' , className )
194
+ return self ._ask ( question = 'typeNameStrings' , opt = [ className ] )
191
195
192
196
def getComponents (self , className ):
193
- return self .ask ( 'getComponents' , className )
197
+ return self ._ask ( question = 'getComponents' , opt = [ className ] )
194
198
195
199
def getClassComment (self , className ):
196
200
try :
197
- return self .ask ( 'getClassComment' , className )
201
+ return self ._ask ( question = 'getClassComment' , opt = [ className ] )
198
202
except pyparsing .ParseException as ex :
199
203
logger .warning ("Method 'getClassComment' failed for %s" , className )
200
204
logger .warning ('OMTypedParser error: %s' , ex .message )
201
205
return 'No description available'
202
206
203
207
def getNthComponent (self , className , comp_id ):
204
208
""" returns with (type, name, description) """
205
- return self .ask ( 'getNthComponent' , f' { className } , { comp_id } ' )
209
+ return self ._ask ( question = 'getNthComponent' , opt = [ className , comp_id ] )
206
210
207
211
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 ] )
209
213
210
214
def getImportCount (self , className ):
211
- return self .ask ( 'getImportCount' , className )
215
+ return self ._ask ( question = 'getImportCount' , opt = [ className ] )
212
216
213
217
def getNthImport (self , className , importNumber ):
214
218
# [Path, id, kind]
215
- return self .ask ( 'getNthImport' , f' { className } , { importNumber } ' )
219
+ return self ._ask ( question = 'getNthImport' , opt = [ className , importNumber ] )
216
220
217
221
def getInheritanceCount (self , className ):
218
- return self .ask ( 'getInheritanceCount' , className )
222
+ return self ._ask ( question = 'getInheritanceCount' , opt = [ className ] )
219
223
220
224
def getNthInheritedClass (self , className , inheritanceDepth ):
221
- return self .ask ( 'getNthInheritedClass' , f' { className } , { inheritanceDepth } ' )
225
+ return self ._ask ( question = 'getNthInheritedClass' , opt = [ className , inheritanceDepth ] )
222
226
223
227
def getParameterNames (self , className ):
224
228
try :
225
- return self .ask ( 'getParameterNames' , className )
229
+ return self ._ask ( question = 'getParameterNames' , opt = [ className ] )
226
230
except KeyError as ex :
227
231
logger .warning ('OMPython error: %s' , ex )
228
232
# FIXME: OMC returns with a different structure for empty parameter set
229
233
return []
230
234
231
235
def getParameterValue (self , className , parameterName ):
232
236
try :
233
- return self .ask ( 'getParameterValue' , f' { className } , { parameterName } ' )
237
+ return self ._ask ( question = 'getParameterValue' , opt = [ className , parameterName ] )
234
238
except pyparsing .ParseException as ex :
235
239
logger .warning ('OMTypedParser error: %s' , ex .message )
236
240
return ""
237
241
238
242
def getComponentModifierNames (self , className , componentName ):
239
- return self .ask ( 'getComponentModifierNames' , f' { className } , { componentName } ' )
243
+ return self ._ask ( question = 'getComponentModifierNames' , opt = [ className , componentName ] )
240
244
241
245
def getComponentModifierValue (self , className , componentName ):
242
246
try :
243
247
# 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 ] )
245
249
except pyparsing .ParseException as ex :
246
250
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 )
248
252
try :
249
253
answer = OMParser .check_for_values (result )
250
254
OMParser .result = {}
@@ -254,15 +258,12 @@ def getComponentModifierValue(self, className, componentName):
254
258
return result
255
259
256
260
def getExtendsModifierNames (self , className , componentName ):
257
- return self .ask ('getExtendsModifierNames' , f'{ className } , { componentName } ' )
258
-
259
- def getExtendsModifierValue (self , className , extendsName , modifierName ):
260
261
try :
261
262
# 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 ] )
263
264
except pyparsing .ParseException as ex :
264
265
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 )
266
267
try :
267
268
answer = OMParser .check_for_values (result )
268
269
OMParser .result = {}
@@ -276,7 +277,7 @@ def getNthComponentModification(self, className, comp_id):
276
277
277
278
# get {$Code(....)} field
278
279
# \{\$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 )
280
281
value = value .replace ("{$Code(" , "" )
281
282
return value [:- 3 ]
282
283
# return self.re_Code.findall(value)
@@ -292,15 +293,13 @@ def getNthComponentModification(self, className, comp_id):
292
293
# end getClassNames;
293
294
def getClassNames (self , className = None , recursive = False , qualified = False , sort = False , builtin = False ,
294
295
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
+ )
304
303
return value
305
304
306
305
0 commit comments