''' Date: june/29/2005 Description: Class and methods to use CMT with Python sources, based on the christian's python class. Simple usage: import CMT if __name__ == "__main__": cmt = CMT() package = 'CMTpy' package_root = cmt.macro_value (package + '_root') print package_root if cmt.tag (package + '_with_installarea'): print package + ' strategy is with installarea' print "Macros: ", cmt.macros , '\n' print "Tags: ", cmt.tags , '\n' print "Sets: ", cmt.sets , '\n' ''' __author__ = "Vincent Garonne" __email__ = "garonne at lal dot in2p3 dot fr" __version__ = "HEAD" __all__ = ["CMT"] import os import sys import string import popen2 import stat import re import commands from os import path #---------------------------------------------------- def execute (cmd): """Executing a shell command """ #print '> ' + cmd r, w, e = popen2.popen3(cmd) lines = [] for line in r.readlines(): ##print line line = string.rstrip (line) lines.append (line) #for line in e.readlines(): # line = string.rstrip (line) # lines.append (line) r.close() w.close() e.close() return lines class CMT: def __init__ (self): """Constructor """ # __init__ # Variables self.cmtexe = os.environ ['CMTROOT'] + '/' + os.environ ['CMTBIN'] + '/cmt.exe -tag_add=Doxygen ' self.macros = dict () self.tags = dict () self.sets = dict () self.uses = [] self.top_uses = [] # Initialyzation self.init_sets () self.init_macros () self.init_tags () self.init_uses () def expand_pattern (self, text, p1, p2): v = text rexp = '' for c in p1: rexp += r'[' + c + r']' rexp += '([^' + p2 + r']*)[' + p2 + r']' while True: ms = re.findall (rexp, v) if len(ms) == 0: break for m in ms: if m in self.macros: v = string.replace (v, p1 + m + p2, self.macros[m]) elif m in os.environ: v = string.replace (v, p1 + m + p2, os.environ [m]) else: v = string.replace (v, p1 + m + p2, '') # while True return (v) def expand (self, text): v = text v = self.expand_pattern (v, '$(', ')') v = self.expand_pattern (v, '${', '}') v = self.expand_pattern (v, '%', '%') return (v) # expand # Pre-fetch the macro values and expand all of them def init_macros (self): lines = execute (self.cmtexe + ' show macros') for line in lines: w = string.split (line, '=') name = w[0] if len(w)>=2: value = re.sub ('^[\']', '', w[1]) value = re.sub ('[\']$', '', value) self.macros [name] = value for key in self.macros.keys(): self.macros[key] = self.expand (self.macros[key]) #print key + '=' + v # for key in self.macros.keys(): # init_macros def init_sets (self): lines = execute (self.cmtexe + ' show sets') for line in lines: w = string.split (line, '=') name = w[0] if len(w)>=2: value = re.sub ('^[\']', '', w[1]) value = re.sub ('[\']$', '', value) self.macros [name] = value for key in self.macros.keys(): self.macros[key] = self.expand (self.macros[key]) #print key + '=' + v # for key in self.macros.keys(): # init_sets def init_tags (self): lines = execute (self.cmtexe + ' show tags') for line in lines: w = string.split (line, ' ') name = w[0] #print 'tag=' + name self.tags [name] = True # init_tags def init_uses (self): lines = execute (self.cmtexe + ' show uses') for line in lines: if line[0] == '#': if line[0:5] == '# use': w = string.split (line, ' ') #print 'init_uses> [' + w[2] + ']' self.top_uses.append (w[2]) continue self.uses.append (line) # init_uses def macro_value (self, name): if not self.macros.has_key (name): return '' return self.macros[name] # macro_value def tag (self, name): if not self.tags.has_key (name): return False return True # tag def do (self, cmd): execute (self.cmtexe + ' ' + cmd) # do ############################################################################## # Executing this module from the command line ############################################################################## if __name__ == "__main__": cmt = CMT() package = 'CMTpy' package_root = cmt.macro_value (package + '_root') print package_root if cmt.tag (package + '_with_installarea'): print package + ' strategy is with installarea' print "Macros: ", cmt.macros , '\n' print "Tags: ", cmt.tags , '\n' print "Sets: ", cmt.sets , '\n' #--------------------------------- EoF --------------------------------------#