3 from gener import Component, Invalid, makedirs
5 from pyth_tmpl import pyinitEXEService, pyinitCEXEService, pyinitService
6 from aster_tmpl import asterCEXEService, asterEXEService
7 from aster_tmpl import asterService, asterEXECompo, asterCEXECompo, asterCompo
8 from aster_tmpl import asterexeMakefile, astercexeMakefile, astercompoMakefile
9 from aster_tmpl import comm, make_etude, cexe, exeaster
10 from aster_tmpl import container, component
12 class ASTERComponent(Component):
13 def __init__(self, name, services=None, libs="", rlibs="", aster_dir="",
14 python_path=None, argv=None, kind="lib", exe_path=None,
15 asrun=None, export_extras=""):
16 self.aster_dir = aster_dir
17 self.python_path = python_path or []
18 self.argv = argv or []
19 self.exe_path = exe_path
21 self.export_extras = export_extras
22 Component.__init__(self, name, services, impl="ASTER", libs=libs,
23 rlibs=rlibs, kind=kind)
26 Component.validate(self)
27 if not self.aster_dir:
28 raise Invalid("aster_dir must be defined for component %s" % self.name)
30 kinds = ("lib", "cexe", "exe")
31 if self.kind not in kinds:
32 raise Invalid("kind must be one of %s" % kinds)
33 if self.kind == "lib" and not self.python_path:
34 raise Invalid("python_path must be defined for component %s" % self.name)
35 if self.kind == "cexe" :
37 raise Invalid("exe_path must be defined for component %s" % self.name)
39 raise Invalid("asrun must be defined for component %s" % self.name)
40 if not os.path.exists(self.asrun):
41 raise Invalid("asrun does not exist for component %s" % self.name)
42 if self.kind == "exe" :
44 raise Invalid("exe_path must be defined for component %s" % self.name)
46 raise Invalid("asrun must be defined for component %s" % self.name)
47 if not os.path.exists(self.asrun):
48 raise Invalid("asrun does not exist for component %s" % self.name)
50 for serv in self.services:
51 #on ajoute un inport string de nom jdc en premier dans la liste des ports de chaque service
52 serv.inport.insert(0, ("jdc", "string"))
54 def makeCompo(self, gen):
55 filename = "%s.py" % self.name
56 #on suppose que les composants ASTER sont homogenes (utilisent meme install)
57 gen.aster = self.aster_dir
58 if self.kind == "lib":
59 return {"Makefile.am":astercompoMakefile.substitute(module=gen.module.name,
61 filename:self.makeaster(gen)}
62 elif self.kind == "cexe":
63 #creation de l'installation aster dans exe_path
64 self.makecexepath(gen)
65 return {"Makefile.am":astercexeMakefile.substitute(module=gen.module.name,
67 filename:self.makecexeaster(gen)}
68 elif self.kind == "exe":
69 #creation de l'installation aster dans exe_path
71 return {"Makefile.am":asterexeMakefile.substitute(module=gen.module.name,
73 self.name+".exe":exeaster.substitute(export=os.path.join(self.exe_path, "make_etude.export"), asrun=self.asrun),
74 self.name+"_module.py":self.makeexeaster(gen)}
76 def makeexepath(self, gen):
77 makedirs(self.exe_path)
79 fil = open(os.path.join(self.aster_dir, "bibpyt", "Execution", "E_SUPERV.py"))
81 esuperv = re.sub("j=self.JdC", "self.jdc=j=self.JdC", esuperv)
83 #utilisation d'un programme principal python different
84 fil = open(os.path.join(self.aster_dir, "config.txt"))
86 config = re.sub("Execution\/E_SUPERV.py", os.path.join(self.exe_path, "aster_component.py"), config)
90 "aster_component.py":component.substitute(component=self.name),
91 "make_etude.export":make_etude.substitute(config=os.path.join(self.exe_path, "config.txt"),
92 comm=os.path.join(self.exe_path, self.name+".comm"),
93 extras=self.export_extras),
94 self.name+".comm":comm,
96 "profile.sh":os.path.join(self.aster_dir, "profile.sh"),
97 "E_SUPERV.py":esuperv,
100 def makecexepath(self, gen):
101 makedirs(self.exe_path)
102 #patch to E_SUPERV.py
103 fil = open(os.path.join(self.aster_dir, "bibpyt", "Execution", "E_SUPERV.py"))
105 esuperv = re.sub("j=self.JdC", "self.jdc=j=self.JdC", esuperv)
107 #utilisation d'un programme principal python different
108 fil = open(os.path.join(self.aster_dir, "config.txt"))
110 config = re.sub("Execution\/E_SUPERV.py", os.path.join(self.exe_path, "aster_container.py"), config)
112 gen.makeFiles({self.name+".exe":cexe.substitute(export=os.path.join(self.exe_path, "make_etude.export"),
114 "aster_container.py":container,
115 "make_etude.export":make_etude.substitute(config=os.path.join(self.exe_path, "config.txt"),
116 comm=os.path.join(self.exe_path, self.name+".comm"),
117 extras=self.export_extras),
118 self.name+".comm":comm,
120 "profile.sh":os.path.join(self.aster_dir, "profile.sh"),
121 "E_SUPERV.py":esuperv,
124 os.chmod(os.path.join(self.exe_path, self.name+".exe"), 0777)
126 def makeexeaster(self, gen):
130 for serv in self.services:
131 defs.append(serv.defs)
134 for name, typ in serv.inport:
137 datas.append('"%s":cPickle.loads(%s)' % (name, name))
139 datas.append('"%s":%s' % (name, name))
140 #ajout de l'adresse du composant
141 datas.append('"component":self.proxy.ptr()')
142 dvars = "{"+','.join(datas)+"}"
143 inparams = ",".join(params)
147 for name, typ in serv.outport:
150 datas.append('cPickle.dumps(j.g_context["%s"],-1)'%name)
152 datas.append('j.g_context["%s"]'%name)
153 outparams = ",".join(params)
154 rvars = ",".join(datas)
156 service = asterEXEService.substitute(component=self.name,
161 dvars=dvars, rvars=rvars)
163 for name, typ, dep in serv.instream:
164 streams.append(' calcium.create_calcium_port(self.proxy,"%s","%s","IN","%s")'% (name, typ, dep))
165 instream = "\n".join(streams)
167 for name, typ, dep in serv.outstream:
168 streams.append(' calcium.create_calcium_port(self.proxy,"%s","%s","OUT","%s")'% (name, typ, dep))
169 outstream = "\n".join(streams)
171 init = pyinitEXEService.substitute(component=self.name, service=serv.name,
172 instream=instream, outstream=outstream)
173 services.append(service)
175 return asterEXECompo.substitute(component=self.name, module=gen.module.name,
176 servicesdef="\n".join(defs),
177 servicesimpl="\n".join(services),
178 initservice='\n'.join(inits),
179 aster_dir=self.aster_dir)
181 def makecexeaster(self, gen):
185 for serv in self.services:
186 defs.append(serv.defs)
189 for name, typ in serv.inport:
192 datas.append('"%s":cPickle.loads(%s)' % (name, name))
194 datas.append('"%s":%s' % (name, name))
195 #ajout de l'adresse du composant
196 datas.append('"component":self.proxy.ptr()')
197 dvars = "{"+','.join(datas)+"}"
198 inparams = ",".join(params)
202 for name, typ in serv.outport:
205 datas.append('cPickle.dumps(j.g_context["%s"],-1)'%name)
207 datas.append('j.g_context["%s"]'%name)
208 outparams = ",".join(params)
209 rvars = ",".join(datas)
211 service = asterCEXEService.substitute(component=self.name,
216 dvars=dvars, rvars=rvars)
218 for name, typ, dep in serv.instream:
219 streams.append(' calcium.create_calcium_port(self.proxy,"%s","%s","IN","%s")'% (name, typ, dep))
220 instream = "\n".join(streams)
222 for name, typ, dep in serv.outstream:
223 streams.append(' calcium.create_calcium_port(self.proxy,"%s","%s","OUT","%s")'% (name, typ, dep))
224 outstream = "\n".join(streams)
226 init = pyinitCEXEService.substitute(component=self.name,
230 services.append(service)
232 return asterCEXECompo.substitute(component=self.name,
233 module=gen.module.name,
234 servicesdef="\n".join(defs),
235 servicesimpl="\n".join(services),
236 initservice='\n'.join(inits),
237 aster_dir=self.aster_dir)
239 if self.kind == "cexe":
240 return "CEXE", os.path.join(self.exe_path, self.name+".exe")
244 def makeaster(self, gen):
248 for serv in self.services:
249 defs.append(serv.defs)
252 for name, typ in serv.inport:
255 datas.append('"%s":cPickle.loads(%s)' % (name, name))
257 datas.append('"%s":%s' % (name, name))
258 #ajout de l'adresse du composant
259 datas.append('"component":self.proxy.ptr()')
260 dvars = "{"+','.join(datas)+"}"
261 inparams = ",".join(params)
265 for name, typ in serv.outport:
268 datas.append('cPickle.dumps(j.g_context["%s"],-1)'%name)
270 datas.append('j.g_context["%s"]'%name)
271 outparams = ",".join(params)
272 rvars = ",".join(datas)
274 service = asterService.substitute(component=self.name, service=serv.name,
275 inparams=inparams, outparams=outparams,
277 dvars=dvars, rvars=rvars)
279 for name, typ, dep in serv.instream:
280 streams.append(' calcium.create_calcium_port(self.proxy,"%s","%s","IN","%s")'% (name, typ, dep))
281 instream = "\n".join(streams)
283 for name, typ, dep in serv.outstream:
284 streams.append(' calcium.create_calcium_port(self.proxy,"%s","%s","OUT","%s")'% (name, typ, dep))
285 outstream = "\n".join(streams)
287 init = pyinitService.substitute(component=self.name, service=serv.name,
288 instream=instream, outstream=outstream)
289 services.append(service)
292 python_path = ",".join([repr(p) for p in self.python_path])
293 argv = ",".join([repr(p) for p in self.argv])
294 return asterCompo.substitute(component=self.name, module=gen.module.name,
295 servicesdef="\n".join(defs),
296 servicesimpl="\n".join(services),
297 initservice='\n'.join(inits),
298 aster_dir=self.aster_dir,
299 python_path=python_path, argv=argv)