]> SALOME platform Git repositories - tools/yacsgen.git/blob - module_generator/pycompo.py
Salome HOME
CCAR: add definition parameter "sources" to C++, F77, Python components.
[tools/yacsgen.git] / module_generator / pycompo.py
1 """
2   Module that defines PYComponent for SALOME components implemented in Python
3 """
4 from gener import Component, Invalid
5 from pyth_tmpl import pyinitService, pyService, pyCompoEXE, pyCompo
6 from pyth_tmpl import pycompoEXEMakefile, pycompoMakefile
7
8 class PYComponent(Component):
9   def __init__(self, name, services=None, python_path=None, kind="lib",
10                      sources=None):
11     self.python_path = python_path or []
12     Component.__init__(self, name, services, impl="PY", kind=kind,
13                              sources=sources)
14
15   def validate(self):
16     Component.validate(self)
17     kinds = ("lib","exe")
18     if self.kind not in kinds:
19       raise Invalid("kind must be one of %s" % kinds)
20
21   def makeCompo(self, gen):
22     pyfile = "%s.py" % self.name
23     sources = " ".join(self.sources)
24     if self.kind == "lib":
25       return {"Makefile.am":pycompoMakefile.substitute(module=gen.module.name, 
26                                                        component=self.name,
27                                                        sources=sources), 
28               pyfile:self.makepy(gen)
29              }
30     if self.kind == "exe":
31       return {"Makefile.am":pycompoEXEMakefile.substitute(module=gen.module.name, 
32                                                           component=self.name,
33                                                           sources=sources), 
34               self.name+".exe":self.makepyexe(gen),
35              }
36
37   def makepy(self, gen):
38     services = []
39     inits = []
40     defs = []
41     for serv in self.services:
42       defs.append(serv.defs)
43       params = []
44       pyparams = []
45       for name, typ in serv.inport:
46         params.append(name)
47         if typ == "pyobj":
48           pyparams.append("      %s=cPickle.loads(%s)" %(name, name))
49       inparams = ",".join(params)
50       convertinparams = '\n'.join(pyparams)
51
52       params = []
53       pyparams = []
54       for name, typ in serv.outport:
55         params.append(name)
56         if typ == "pyobj":
57           pyparams.append("      %s=cPickle.dumps(%s,-1)" %(name, name))
58       outparams = ",".join(params)
59       convertoutparams = '\n'.join(pyparams)
60       service = pyService.substitute(component=self.name, service=serv.name, inparams=inparams,
61                                      outparams=outparams, body=serv.body, 
62                                      convertinparams=convertinparams,
63                                      convertoutparams=convertoutparams)
64       streams = []
65       for name, typ, dep in serv.instream:
66         streams.append('       calcium.create_calcium_port(self.proxy,"%s","%s","IN","%s")'% (name, typ, dep))
67       instream = "\n".join(streams)
68       streams = []
69       for name, typ, dep in serv.outstream:
70         streams.append('       calcium.create_calcium_port(self.proxy,"%s","%s","OUT","%s")'% (name, typ, dep))
71       outstream = "\n".join(streams)
72
73       init = pyinitService.substitute(component=self.name, service=serv.name,
74                                       instream=instream, outstream=outstream)
75       services.append(service)
76       inits.append(init)
77
78     python_path = ",".join([repr(p) for p in self.python_path])
79     return pyCompo.substitute(component=self.name, module=gen.module.name,
80                               servicesdef="\n".join(defs), servicesimpl="\n".join(services), 
81                               initservice='\n'.join(inits),
82                               python_path=python_path)
83
84   def makepyexe(self, gen):
85     services = []
86     inits = []
87     defs = []
88     for serv in self.services:
89       defs.append(serv.defs)
90       params = []
91       pyparams = []
92       for name, typ in serv.inport:
93         params.append(name)
94         if typ == "pyobj":
95           pyparams.append("      %s=cPickle.loads(%s)" %(name, name))
96       inparams = ",".join(params)
97       convertinparams = '\n'.join(pyparams)
98
99       params = []
100       pyparams = []
101       for name, typ in serv.outport:
102         params.append(name)
103         if typ == "pyobj":
104           pyparams.append("      %s=cPickle.dumps(%s,-1)" %(name, name))
105       outparams = ",".join(params)
106       convertoutparams = '\n'.join(pyparams)
107       service = pyService.substitute(component=self.name, service=serv.name, 
108                                      inparams=inparams, outparams=outparams, 
109                                      body=serv.body, 
110                                      convertinparams=convertinparams,
111                                      convertoutparams=convertoutparams,
112                                     )
113       streams = []
114       for name, typ, dep in serv.instream:
115         streams.append('       calcium.create_calcium_port(self.proxy,"%s","%s","IN","%s")'% (name, typ, dep))
116       instream = "\n".join(streams)
117       streams = []
118       for name, typ, dep in serv.outstream:
119         streams.append('       calcium.create_calcium_port(self.proxy,"%s","%s","OUT","%s")'% (name, typ, dep))
120       outstream = "\n".join(streams)
121
122       init = pyinitService.substitute(component=self.name, service=serv.name,
123                                       instream=instream, outstream=outstream)
124       services.append(service)
125       inits.append(init)
126
127     python_path = ",".join([repr(p) for p in self.python_path])
128     return pyCompoEXE.substitute(component=self.name, module=gen.module.name,
129                                  servicesdef="\n".join(defs), 
130                                  servicesimpl="\n".join(services),
131                                  initservice='\n'.join(inits), 
132                                  python_path=python_path)
133
134
135