7 Author : Valentin Kuznetsov <vkuznet@gmail.com>
8 Description: AbstractGenerator class provides basic functionality
9 to generate CMSSW class from given template
19 from FWCore.Skeletons.utils
import parse_word, functor, user_info, tree
23 AbstractPkg takes care how to generate code from template/PKG
24 package area. The PKG can be any directory which may include
25 any types of files, e.g. C++ (.cc), python (.py), etc.
26 This class relies on specific logic which we outline here:
28 - each template may use tags defined with double underscores
29 enclosure, e.g. __class__, __record__, etc.
30 - each template may have example tags, such tags should
31 start with @example_. While processing template user may
32 choose to strip them off or keep the code behind those tags
33 - in addition user may specify pure python code which can
34 operate with user defined tags. This code snipped should
35 be enclosed with #python_begin and #python_end lines
36 which declares start and end of python block
44 self.
pname = self.config.get(
'pname',
None)
45 self.
tmpl = self.config.get(
'tmpl',
None)
46 self.
debug = self.config.get(
'debug', 0)
47 self.
tdir = self.config.get(
'tmpl_dir')
49 self.
date = time.strftime(
"%a, %d %b %Y %H:%M:%S GMT", time.gmtime())
54 "Scan template files and return example tags"
56 sdir =
'%s/%s' % (self.
tdir, self.
tmpl)
57 for name
in os.listdir(sdir):
62 fname = os.path.join(sdir, name)
63 with open(fname,
'r') as stream:
64 for line
in stream.readlines():
65 if line.find(
'@example_') != -1:
66 keys += [k
for k
in line.split()
if \
67 k.find(
'@example_') != -1]
71 "Print out template example tags"
76 "Scan template files and return template tags"
78 sdir =
'%s/%s' % (self.
tdir, self.
tmpl)
79 for name
in os.listdir(sdir):
84 fname = os.path.join(sdir, name)
85 with open(fname,
'r') as stream:
86 for line
in stream.readlines():
87 if line.find(
'__') != -1:
92 "Print out template keys"
98 Determine either skip or keep given line based on class tags
102 keep_etags = self.config.get(
'tmpl_etags', [])
103 for tag
in tmpl_etags:
105 for valid_tag
in keep_etags:
106 if line.find(valid_tag) != -1:
107 line = line.replace(valid_tag,
'')
110 if line.find(tag) != -1:
111 line = line.replace(tag,
'')
116 def write(self, fname, tmpl_name, kwds):
117 "Create new file from given template name and set of arguments"
120 with open(fname,
'w')
as stream:
121 for line
in open(tmpl_name,
'r').readlines():
125 if line.find(
'#python_begin') != -1:
128 if line.find(
'#python_end') != -1:
132 if code
and not read_code:
138 for key, val
in kwds.items():
139 if isinstance(val, basestring):
140 line = line.replace(key, val)
144 "Return keyword arguments to be used in methods"
145 kwds = {
'__pkgname__': self.config.get(
'pkgname',
'Package'),
146 '__author__': self.
author,
147 '__user__': os.getlogin(),
148 '__date__': self.
date,
149 '__class__': self.
pname,
150 '__name__': self.
pname,
151 '__rcsid__': self.
rcsid,
152 '__subsys__': self.config.get(
'subsystem',
'Subsystem')}
153 args = self.config.get(
'args',
None)
156 print "Template tags:"
161 "Generate package templates in a given directory"
167 tmpl_files = self.config.get(
'tmpl_files',
'all')
174 if os.path.isdir(self.
pname):
175 msg =
"Can't create package '%s'\n" % self.
pname
176 msg +=
"Directory %s is already exists" % self.
pname
179 os.makedirs(self.
pname)
183 sdir = os.path.join(self.
tdir, self.
tmpl)
184 sources = [s
for s
in os.listdir(sdir) \
185 if s !=
'Driver.dir' and s.find(
'~') == -1]
186 driver = os.path.join(sdir,
'Driver.dir')
187 if os.path.isfile(driver):
188 sources = [s.replace(
'\n',
'')
for s
in open(driver,
'r').readlines()]
190 sources.remove(
'CVS')
194 names = set([s.split(
'.')[0]
for s
in sources])
195 if names == set([
'Skeleton']):
196 if self.pname.find(
'.') != -1:
197 _, ext = os.path.splitext(self.
pname)
198 sources = [s
for s
in sources
if s.rfind(ext) != -1]
199 self.
pname = self.pname.replace(ext,
'')
202 msg =
'Unable to find skeleton for extension "%s"' % ext
205 bdir = os.environ.get(
'CMSSW_BASE',
'')
207 ldir = os.getcwd().
split(
'/')[-1]
209 subsys = kwds[
'__subsys__']
210 pkgname = kwds[
'__pkgname__']
211 if sources == [
'Skeleton.cc',
'Skeleton.h']:
212 if ldir ==
'interface' and os.getcwd().
find(bdir) != -1:
213 idir =
'%s/%s/interface/' % (subsys, pkgname)
216 elif sources == [
'Skeleton.cc']
and \
217 len(dirs) == 5
and dirs[0] ==
'' and dirs[1] ==
'src':
218 idir =
'%s/%s/interface/' % (subsys, pkgname)
219 elif sources == [
'Skeleton.h']
and ldir ==
'interface' and \
220 len(dirs) == 5
and dirs[0] ==
'' and dirs[1] ==
'src':
221 idir =
'%s/%s/interface/' % (subsys, pkgname)
222 kwds.update({
'__incdir__': idir})
228 if tmpl_files !=
'all':
229 fname, ext = os.path.splitext(src)
230 if tmpl_files != ext:
232 src = src.split(
'/')[-1]
235 items = src.split(
'/')
239 tmpl_name = os.path.join(sdir, items[-1])
240 if os.path.isfile(tmpl_name):
245 if tname.split(
'.')[0] == self.
tmpl:
246 name2gen = name2gen.replace(self.
tmpl, self.
pname)
247 name2gen = os.path.join(os.getcwd(), name2gen)
249 print "Create", name2gen
251 if not os.path.isdir(name2gen):
252 os.makedirs(name2gen)
254 fdir = os.path.dirname(name2gen)
255 if not os.path.isdir(fdir):
257 self.
write(name2gen, tmpl_name, kwds)
258 gen_files.append(name2gen.split(
'/')[-1])
260 msg =
'New package "%s" of %s type is successfully generated' \
263 msg =
'Generated %s file' %
', '.
join(gen_files)
264 if len(gen_files) > 1:
269 if msg.find(
'New package') != -1:
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
static std::string join(char **cmd)