3 # Copyright (C) 2007-2016 CEA/DEN, EDF R&D, OPEN CASCADE
5 # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
6 # CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
8 # This library is free software; you can redistribute it and/or
9 # modify it under the terms of the GNU Lesser General Public
10 # License as published by the Free Software Foundation; either
11 # version 2.1 of the License, or (at your option) any later version.
13 # This library is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 # Lesser General Public License for more details.
18 # You should have received a copy of the GNU Lesser General Public
19 # License along with this library; if not, write to the Free Software
20 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
26 class FunctionProperties:
27 def __init__(self, function_name):
28 self.name = function_name
35 result = "Function:" + self.name + "\n"
36 result+= " Inputs:" + str(self.inputs) + "\n"
37 result+= " Outputs:"+ str(self.outputs) + "\n"
38 result+= " Errors:" + str(self.errors) + "\n"
39 result+= " Imports:"+ str(self.imports) + "\n"
42 class v(ast.NodeVisitor):
43 def visit_Module(self, node):
44 #print type(node).__name__, ":"
45 accepted_tokens = ["Import", "ImportFrom", "FunctionDef", "ClassDef"]
49 type_name = type(e).__name__
50 if type_name not in accepted_tokens:
51 error="py2yacs error at line %s: not accepted statement '%s'." % (
53 self.global_errors.append(error)
55 #print "------------------------------------------------------------------"
60 self.generic_visit(node)
62 def visit_FunctionDef(self, node):
63 #print type(node).__name__, ":", node.name
65 self.lastfn = FunctionProperties(node.name)
66 self.functions.append(self.lastfn)
69 self.generic_visit(node)
74 def visit_arguments(self, node):
75 #print type(node).__name__, ":"
77 self.generic_visit(node)
80 def visit_Name(self, node):
82 #print type(node).__name__, ":", node.id
84 self.generic_visit(node)
86 def visit_Param(self, node):
87 #print type(node).__name__, ":", self.lastname
88 self.lastfn.inputs.append(self.lastname)
90 def visit_Return(self, node):
91 #print type(node).__name__, ":", node.value
92 if self.lastfn.outputs is not None :
93 error="py2yacs error at line %s: multiple returns." % node.lineno
94 self.lastfn.errors.append(error)
96 self.lastfn.outputs = []
97 if node.value is None :
99 elif 'Tuple' == type(node.value).__name__ :
100 for e in node.value.elts:
101 if 'Name' == type(e).__name__ :
102 self.lastfn.outputs.append(e.id)
104 error="py2yacs error at line %s: invalid type returned '%s'." % (
105 node.lineno, type(e).__name__)
106 self.lastfn.errors.append(error)
108 if 'Name' == type(node.value).__name__ :
109 self.lastfn.outputs.append(node.value.id)
111 error="py2yacs error at line %s: invalid type returned '%s'." %(
112 node.lineno, type(node.value).__name__)
113 self.lastfn.errors.append(error)
118 def visit_ClassDef(self, node):
119 # just ignore classes
122 def visit_Import(self, node):
125 self.lastfn.imports.append(n.name)
126 def visit_ImportFrom(self, node):
130 self.lastfn.imports.append(m+"."+n.name)
132 class vtest(ast.NodeVisitor):
133 def generic_visit(self, node):
134 #print type(node).__name__
135 ast.NodeVisitor.generic_visit(self, node)
137 def create_yacs_schema(text, fn_name, fn_args, fn_returns, file_name):
141 SALOMERuntime.RuntimeSALOME_setRuntime()
142 runtime = pilot.getRuntime()
143 schema = runtime.createProc("schema")
144 node = runtime.createFuncNode("", "default_name")
145 schema.edAddChild(node)
146 fncall = "\n%s=%s(%s)\n"%(",".join(fn_returns),
149 node.setScript(text+fncall)
150 node.setFname(fn_name)
151 td=schema.getTypeCode("double")
153 node.edAddInputPort(p, td)
155 node.edAddOutputPort(p, td)
156 schema.saveSchema(file_name)
158 def get_properties(text_file):
159 bt=ast.parse(text_file)
162 return w.functions, w.global_errors
164 if __name__ == '__main__':
166 parser = argparse.ArgumentParser(description="Generate a YACS schema from a python file containing a function to run.")
167 parser.add_argument("file", help='Path to the python file')
168 parser.add_argument("-o","--output",
169 help='Path to the output file (yacs_schema.xml by default)',
170 default='yacs_schema.xml')
171 parser.add_argument("-d","--def_name",
172 help='Name of the function to call in the yacs node (_exec by default)',
174 args = parser.parse_args()
175 with open(args.file, 'r') as f:
177 #bt=ast.parse(text_file)
181 #print "global errors:", w.global_errors
182 #for f in w.functions:
185 fn_name = args.def_name
186 functions,errors = get_properties(text_file)
187 print "global errors:", errors
191 fn_properties = next((f for f in functions if f.name == fn_name), None)
192 if fn_properties is not None :
193 if not fn_properties.errors :
194 create_yacs_schema(text_file, fn_name,
195 fn_properties.inputs, fn_properties.outputs,
198 print "\n".join(fn_properties.errors)
200 print "Function not found:", fn_name