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