Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-12-01 23:40:21

0001 #!/usr/bin/env python3
0002 #-*- coding: utf-8 -*-
0003 #pylint: disable-msg=
0004 """
0005 File       : Skeleton.py
0006 Author     : Valentin Kuznetsov <vkuznet@gmail.com>
0007 Description:
0008 """
0009 
0010 # system modules
0011 import os
0012 import sys
0013 import pprint
0014 from optparse import OptionParser
0015 
0016 # package modules
0017 from FWCore.Skeletons.utils import code_generator, test_env, template_directory
0018 
0019 if  sys.version_info < (2, 6):
0020     raise Exception("This script requires python 2.6 or greater")
0021 
0022 class SkeletonOptionParser:
0023     "Skeleton option parser"
0024     def __init__(self):
0025         cname  = os.environ.get('MKTMPL_CMD', 'main.py')
0026         usage  = "Usage: %s [options]\n" % cname
0027         self.parser = OptionParser(usage=usage)
0028         msg  = "debug output"
0029         self.parser.add_option("--debug", action="store_true",
0030                 default=False, dest="debug", help=msg)
0031         msg  = "specify template, e.g. EDProducer"
0032         self.parser.add_option("--tmpl", action="store", type="string",
0033                 default='', dest="tmpl", help=msg)
0034         msg  = "specify package name, e.g. MyProducer"
0035         self.parser.add_option("--name", action="store", type="string",
0036                 default="TestPkg", dest="pname", help=msg)
0037         msg  = "specify author name"
0038         self.parser.add_option("--author", action="store", type="string",
0039                 default="", dest="author", help=msg)
0040         msg  = "specify file type to generate, "
0041         msg += "e.g. --ftype=header, default is all files"
0042         self.parser.add_option("--ftype", action="store", type="string",
0043                 default="all", dest="ftype", help=msg)
0044         msg  = "list examples tags which should be kept in "
0045         msg += "generate code, e.g. "
0046         msg += "--keep-etags='@example_trac,@example_hist'"
0047         self.parser.add_option("--keep-etags", action="store", type="string",
0048                 default=None, dest="ketags", help=msg)
0049         msg  = "list template tags"
0050         self.parser.add_option("--tags", action="store_true",
0051                 default=False, dest="tags", help=msg)
0052         msg  = "list template example tags"
0053         self.parser.add_option("--etags", action="store_true",
0054                 default=False, dest="etags", help=msg)
0055         msg  = "list supported templates"
0056         self.parser.add_option("--templates", action="store_true",
0057                 default=False, dest="templates", help=msg)
0058     def get_opt(self):
0059         "Returns parse list of options"
0060         return self.parser.parse_args()
0061 
0062 def parse_args(args):
0063     "Parse input arguments"
0064     output = {}
0065     for arg in args:
0066         key, val = arg.split('=')
0067         key = key.strip()
0068         val = val.strip()
0069         if  val[0] == '[' and val[-1] == ']':
0070             val = eval(val, { "__builtins__": None }, {})
0071         output[key] = val
0072     return output
0073 
0074 def generator():
0075     """
0076     Code generator function, parse user arguments and load appropriate
0077     template module. Once loaded, run its data method depending on
0078     user requested input parameter, e.g. print_etags, print_tags or
0079     generate template code.
0080     """
0081     optmgr = SkeletonOptionParser()
0082     opts, args = optmgr.get_opt()
0083     test_env(os.path.join(opts.tdir, opts.tmpl), opts.tmpl)
0084     config = {'pname': opts.pname, 'tmpl': opts.tmpl, 'author': opts.author,
0085               'args': parse_args(args), 'debug': opts.debug,
0086               'ftype': opts.ftype}
0087     if  opts.ketags:
0088         etags = opts.ketags.split(',')
0089         config.update({'tmpl_etags': etags})
0090     else:
0091         config.update({'tmpl_etags': []})
0092     obj = code_generator(config)
0093     if  opts.etags:
0094         obj.print_etags()
0095         sys.exit(0)
0096     elif opts.tags:
0097         obj.print_tags()
0098         sys.exit(0)
0099     elif opts.templates:
0100         for name in os.listdir(template_directory()):
0101             print(name)
0102         sys.exit(0)
0103     obj.generate()
0104 
0105 if __name__ == '__main__':
0106     generator()