Changeset 389


Ignore:
Timestamp:
25/09/15 13:53:53 (4 years ago)
Author:
mjuckes
Message:

with elementTree parsing

Location:
CMIP6dreqbuild/trunk/src/framework
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • CMIP6dreqbuild/trunk/src/framework/Makefile

    r387 r389  
    5555        xmllint --noout --schema out/vocabSchema.xsd out/vocabSample.xml 
    5656 
    57 distrib: out/dreqDefn.xml  out/dreqSample.xml  out/dreqSchema.xsd 
    58         cp  out/dreqDefn.xml  out/dreqSample.xml  out/dreqSchema.xsd  ../../docs/vocabFrameworkSchema.xsd /data/tmp/svn3/exarch/CMIP6dreq/trunk/docs 
     57distrib: out/dreq2Defn.xml  out/dreq2Sample.xml  out/dreq2Schema.xsd 
     58        cp  out/dreq2Defn.xml  out/dreq2Sample.xml  out/dreq2Schema.xsd  ../../docs/vocabFrameworkSchema.xsd /data/tmp/svn3/exarch/CMIP6dreq/trunk/docs 
    5959        cp  out/vocabDefn.xml  out/vocabSample.xml  out/vocabSchema.xsd vocab.xml  /data/tmp/svn3/exarch/CMIP6dreq/trunk/docs 
    6060        echo "docs copied to /data/tmp/svn3/exarch/CMIP6dreq/trunk/docs" 
    61         cp scanDreq.py dreq.py htmlTemplates.py simpleCheck.py scope.py /data/tmp/svn3/exarch/CMIP6dreq/trunk/src        
     61        cp scanDreq.py dreq.py htmlTemplates.py simpleCheck.py scope.py example.py /data/tmp/svn3/exarch/CMIP6dreq/trunk/src     
    6262        cp vocabDemo.py /data/tmp/svn3/exarch/CMIP6dreq/trunk/src        
     63        cp annotated_20150731.xml /data/tmp/svn3/exarch/CMIP6dreq/trunk/docs/dreq.xml 
    6364        echo "source copied to /data/tmp/svn3/exarch/CMIP6dreq/trunk/src" 
    6465 
  • CMIP6dreqbuild/trunk/src/framework/dreq.py

    r387 r389  
    77import xml.dom 
    88import xml.dom.minidom 
    9 import re 
     9import re, shelve 
     10import sets 
    1011 
    1112class rechecks(object): 
     
    2627class dreqItemBase(object): 
    2728       __doc__ = """A base class used in the definition of records. Designed to be used via a class factory which sets "itemLabelMode" and "attributes" before the class is instantiated: attempting to instantiate the class before setting these will trigger an exception.""" 
    28        def __init__(self,dict=None,xmlMiniDom=None,id='defaultId'): 
     29       _indexInitialised = False 
     30       _inx = None 
     31       _urlBase = '' 
     32       _htmlStyle = {} 
     33 
     34       def __init__(self,dict=None,xmlMiniDom=None,id='defaultId',etree=False): 
    2935         dictMode = dict != None 
    3036         mdMode = xmlMiniDom != None 
     
    3743           self.dictInit( dict ) 
    3844         elif mdMode: 
    39            self.mdInit( xmlMiniDom ) 
     45           self.mdInit( xmlMiniDom, etree=etree ) 
    4046 
    4147       def __repr__(self): 
     
    5258           for a in self.__dict__.keys(): 
    5359             if a[0] != '_' or full: 
    54                print '    %s: %s' % ( a, self.__dict__[a] ) 
     60               if self._a[a].rClass == 'internalLink' and self._base._indexInitialised: 
     61                 targ = self._base._inx.uid[ self.__dict__[a] ][1] 
     62                 print '   %s: [%s]%s [%s]' % ( a, targ._h.label, targ.label, self.__dict__[a] ) 
     63               else: 
     64                 print '    %s: %s' % ( a, self.__dict__[a] ) 
    5565         else: 
    5666           print 'Item <%s>: uninitialised' % self.sectionLabel 
     67 
     68       def __href__(self,odir=""): 
     69         igns =  {'','__unset__'} 
     70         if self.__dict__.has_key( 'description' ) and string.strip( self.description ) not in igns: 
     71           ttl = self.description 
     72         elif self.__dict__.has_key( 'title' ) and string.strip( self.title ) not in igns: 
     73           ttl = self.title 
     74         else: 
     75           ttl = self.label 
     76         return '<span title="%s"><a href="%s%s.html">%s</a></span>' % (ttl,odir,self.uid,self.uid) 
     77 
     78       def __html__(self): 
     79         """Create html view""" 
     80         msg = [] 
     81         if self._contentInitialised: 
     82           sect = self._h.label 
     83           msg.append( '<h1>%s: [%s] %s</h1>' % (self._h.title,self.label,self.title) ) 
     84           msg.append( '<a href="../index.html">Home</a> &rarr; <a href="../index/%s.html">%s section index</a><br/>\n' % (sect, self._h.title) ) 
     85           msg.append( '<ul>' ) 
     86           for a in self.__dict__.keys(): 
     87             if a[0] != '_': 
     88               if self._a[a].rClass == 'internalLink' and self._base._indexInitialised: 
     89                 if self.__dict__[a] == '__unset__': 
     90                   m = '<li>%s: %s [missing link]</li>' % ( a, self.__dict__[a] ) 
     91                 else: 
     92                   targ = self._base._inx.uid[ self.__dict__[a] ][1] 
     93                   m = '<li>%s: [%s] %s [%s]</li>' % ( a, targ._h.label, targ.label, targ.__href__() ) 
     94               else: 
     95                 m = '<li>%s: %s</li>' % ( a, self.__dict__[a] ) 
     96               msg.append( m ) 
     97           msg.append( '</ul>' ) 
     98## 
     99## add list of inward references 
     100## 
     101           if self._base._indexInitialised: 
     102             f1 = self._htmlStyle.get( sect, {} ).get( 'getIrefs', None ) != None 
     103             if f1: 
     104               tl = [] 
     105               if f1: 
     106                 tl = self._htmlStyle[sect]['getIrefs'] 
     107               doall = '__all__' in tl 
     108               if doall: 
     109                 tl = self._inx.iref_by_sect[self.uid].a.keys() 
     110               am = [] 
     111               for t in tl: 
     112                 if self._inx.iref_by_sect[self.uid].a.has_key(t): 
     113                   am.append( '<h3>%s</h3>' % t ) 
     114                   am.append( '<ul>' ) 
     115                   items = [self._inx.uid[u][1] for  u in self._inx.iref_by_sect[self.uid].a[t] ] 
     116                   items.sort( ds('label').cmp ) 
     117                   for targ in items: 
     118                     m = '<li>%s:%s [%s]</li>' % ( targ._h.label, targ.label, targ.__href__() ) 
     119                     am.append( m ) 
     120                   am.append( '</ul>' ) 
     121               if len(am) > 0: 
     122                  msg.append( '<h2>Links from other sections</h2>' ) 
     123                  for m in am: 
     124                    msg.append(m) 
     125                
     126         else: 
     127           msg.append( '<b>Item %s: uninitialised</b>' % self.sectionLabel ) 
     128         return msg 
     129 
    57130 
    58131       def dictInit( self, dict ): 
     
    65138         self._contentInitialised = True 
    66139 
    67        def mdInit( self, el ): 
     140       def mdInit( self, el, etree=False ): 
    68141         __doc__ = """Initialisation from a mindom XML element. The list of attributes must be set by the class factory before the class is initialised""" 
    69142         deferredHandling=False 
    70143         nw1 = 0 
    71          for a in self._a.keys(): 
    72            if el.hasAttribute( a ): 
    73              v = str( el.getAttribute( a ) ) 
     144         tvtl = [] 
     145         if etree: 
     146           ks = sets.Set( el.keys() ) 
     147           for a in self._a.keys(): 
     148             if a in ks: 
     149               aa = '%s%s' % (self.ns,a) 
     150               tvtl.append( (a,True, str( el.get( a ) ) ) ) 
     151             else: 
     152               tvtl.append( (a,False,None) ) 
     153         else: 
     154           for a in self._a.keys(): 
     155             if el.hasAttribute( a ): 
     156               tvtl.append( (a,True, str( el.getAttribute( a ) ) ) ) 
     157             else: 
     158               tvtl.append( (a,False,None) ) 
     159        
     160         for a,tv,v in tvtl: 
     161           if tv: 
    74162             if self._a[a].type == u'xs:integer': 
    75163               if self._rc.isIntStr( v ): 
     
    97185               thissect = '%s [%s]' % (self._h.title,self._h.tag) 
    98186               print 'ERROR.020.0001: missing uid: %s' % thissect 
     187               if etree: 
     188                 print ks 
     189                 import sys 
     190                 sys.exit(0) 
    99191             self.__dict__[a] = self._d.defaults.get( a, self._d.glob ) 
    100192 
    101            if type( self.__dict__.get( 'rowIndex', 0 ) ) != type(0): 
    102              print 'Bad row index ', el.hasAttribute( 'rowIndex' ) 
    103              raise 
     193           ##if type( self.__dict__.get( 'rowIndex', 0 ) ) != type(0): 
     194             ##print 'Bad row index ', el.hasAttribute( 'rowIndex' ) 
     195             ##raise 
    104196           if deferredHandling: 
    105197             print msg 
     
    111203  """Read in a vocabulary collection configuration document and a vocabulary document""" 
    112204 
    113   def __init__(self, configdoc='out/dreqDefn.xml', thisdoc='../workbook/trial_20150724.xml'): 
     205  def __init__(self, configdoc='out/dreqDefn.xml', thisdoc='../workbook/trial_20150724.xml', useShelve=False): 
    114206    self.rc = rechecks() 
    115207    self.silent = True 
     
    124216    self.coll = {} 
    125217    doc = xml.dom.minidom.parse( self.vdef  ) 
     218## 
     219## elementTree parsing implemented for main document 
     220## 
     221    self.etree = False 
     222    self.etree = True 
     223    if self.etree: 
     224      import xml.etree.cElementTree as cel 
     225 
     226      self.contentDoc = cel.parse( self.vsamp ) 
     227      root = self.contentDoc.getroot() 
     228      bs = string.split( root.tag, '}' ) 
     229      if len( bs ) > 1: 
     230        self.ns = bs[0] + '}' 
     231      else: 
     232        self.ns = None 
     233    else: 
     234      self.contentDoc = xml.dom.minidom.parse( self.vsamp ) 
     235      self.ns = None 
     236 
    126237    vl = doc.getElementsByTagName( 'table' ) 
    127238    self.tables = {} 
     
    132243      t = self.parsevcfg(v) 
    133244      tables[t[0].label] = t 
    134       self.tableClasses[t[0].label] = self.itemClassFact( t ) 
    135  
    136     self.contentDoc = xml.dom.minidom.parse( self.vsamp ) 
     245      self.tableClasses[t[0].label] = self.itemClassFact( t, ns=self.ns ) 
     246 
     247 
    137248    self.recordAttributeDefn = tables 
    138249    for k in tables.keys(): 
    139       vl = self.contentDoc.getElementsByTagName( k ) 
    140       if len(vl) == 1: 
    141         v = vl[0] 
    142         t = v.getAttribute( 'title' ) 
    143         i = v.getAttribute( 'id' ) 
    144         il = v.getElementsByTagName( 'item' ) 
    145         self.info( '%s, %s, %s, %s' % ( k, t, i, len(il) ) ) 
     250      if self.etree: 
     251        vl = root.findall( './/%s%s' % (self.ns,k) ) 
     252        if len(vl) == 1: 
     253          v = vl[0] 
     254          t = v.get( 'title' ) 
     255          i = v.get( 'id' ) 
     256          il = v.findall( '%sitem' % self.ns ) 
     257          self.info( '%s, %s, %s, %s' % ( k, t, i, len(il) ) ) 
    146258  
    147         self.tables[k] = (i,t,len(il)) 
     259          self.tables[k] = (i,t,len(il)) 
    148260         
    149         for i in il: 
    150           ii = self.tableClasses[k](xmlMiniDom=i) 
    151           self.tableItems[k].append( ii ) 
    152       elif len(vl) > 1: 
    153         l1 = [] 
    154         l2 = [] 
    155         for v in vl: 
     261          for i in il: 
     262            ii = self.tableClasses[k](xmlMiniDom=i, etree=True) 
     263            self.tableItems[k].append( ii ) 
     264        elif len(vl) > 1: 
     265          assert False, 'not able to handle repeat sections with etree yet' 
     266      else: 
     267        vl = self.contentDoc.getElementsByTagName( k ) 
     268        if len(vl) == 1: 
     269          v = vl[0] 
    156270          t = v.getAttribute( 'title' ) 
    157271          i = v.getAttribute( 'id' ) 
    158272          il = v.getElementsByTagName( 'item' ) 
    159273          self.info( '%s, %s, %s, %s' % ( k, t, i, len(il) ) ) 
    160           l1.append( (i,t,len(il)) ) 
    161            
    162           l2i = [] 
     274  
     275          self.tables[k] = (i,t,len(il)) 
     276         
    163277          for i in il: 
    164278            ii = self.tableClasses[k](xmlMiniDom=i) 
    165             l2i.append( ii ) 
    166           l2.append( l2i ) 
    167         self.tables[k] = l1 
    168         self.tableItems[k] = l2 
     279            self.tableItems[k].append( ii ) 
     280        elif len(vl) > 1: 
     281          l1 = [] 
     282          l2 = [] 
     283          for v in vl: 
     284            t = v.getAttribute( 'title' ) 
     285            i = v.getAttribute( 'id' ) 
     286            il = v.getElementsByTagName( 'item' ) 
     287            self.info( '%s, %s, %s, %s' % ( k, t, i, len(il) ) ) 
     288            l1.append( (i,t,len(il)) ) 
     289           
     290            l2i = [] 
     291            for i in il: 
     292              ii = self.tableClasses[k](xmlMiniDom=i) 
     293              l2i.append( ii ) 
     294            l2.append( l2i ) 
     295          self.tables[k] = l1 
     296          self.tableItems[k] = l2 
    169297      self.coll[k] = self.ntf( self.recordAttributeDefn[k].header, self.recordAttributeDefn[k].attributes, self.tableItems[k] ) 
    170298  
     
    176304    return self.coll 
    177305 
    178   def itemClassFact(self, sectionInfo): 
     306  def itemClassFact(self, sectionInfo,ns=None): 
    179307     class dreqItem(dreqItemBase): 
    180308       """Inherits all methods from dreqItemBase. 
     
    188316object._h: a python named tuple describing the section. E.g. object.parent.header.title is the section title (E.g. "CMOR Variables") 
    189317""" 
     318       _base=dreqItemBase 
    190319        
    191320     dreqItem._h = sectionInfo.header 
     
    195324     ##dreqItem.attributes = attributes 
    196325     dreqItem._rc = self.rc 
     326     dreqItem.ns = ns 
    197327     return dreqItem 
    198328          
     
    286416            if id2 != '__unset__': 
    287417              sect = i._h.label 
    288               self.iref_by_uid[ id2 ].append( (k2,i.uid) ) 
     418              self.iref_by_uid[ id2 ].append( (sect,i.uid) ) 
    289419              self.iref_by_sect[ id2 ].a[sect].append( i.uid ) 
    290420              if self.uid.has_key( id2 ): 
     
    306436      print ss 
    307437 
     438class ds(object): 
     439  def __init__(self,k): 
     440    self.k = k 
     441  def cmp(self,x,y): 
     442    return cmp( x.__dict__[self.k], y.__dict__[self.k] ) 
    308443 
    309444src1 = '../workbook/trial_20150831.xml' 
    310445class loadDreq(object): 
    311   def __init__(self,dreqXML='annotated_20150731.xml',configdoc='out/dreq2Defn.xml' ): 
    312     self.c = config( thisdoc=dreqXML, configdoc=configdoc) 
     446  def __init__(self,dreqXML='annotated_20150731.xml',configdoc='out/dreq2Defn.xml', useShelve=False ): 
     447    self.c = config( thisdoc=dreqXML, configdoc=configdoc, useShelve=useShelve) 
    313448    self.coll = self.c.get() 
    314449    self.inx = index(self.coll) 
    315  
     450## 
     451## add index to Item base class .. so that it can be accessed by item instances 
     452## 
     453    dreqItemBase._inx = self.inx 
     454    dreqItemBase._indexInitialised = True 
     455    dreqItemBase._htmlStyle['CMORvar'] = {'getIrefs':['requestVar']} 
     456    dreqItemBase._htmlStyle['requestVarGroup'] = {'getIrefs':['requestVar','requestLink']} 
     457    dreqItemBase._htmlStyle['var'] = {'getIrefs':['CMORvar']} 
     458    dreqItemBase._htmlStyle['objective'] = {'getIrefs':['objectiveLink']} 
     459    dreqItemBase._htmlStyle['requestLink'] = {'getIrefs':['objectiveLink','requestItem']} 
     460    dreqItemBase._htmlStyle['exptgroup'] = {'getIrefs':['experiment']} 
     461    dreqItemBase._htmlStyle['remarks'] = {'getIrefs':['__all__']} 
     462##    dreqItemBase._htmlStyle['__general__'] = {'addRemarks':True} 
     463 
     464    self.pageTmpl = """<html><head><title>%s</title></head><body>%s</body></html>""" 
     465 
     466  def makeHtml(self,odir='./html'): 
     467    for k in self.inx.uid.keys(): 
     468      i = self.inx.uid[k][1] 
     469      ttl = 'Data Request Record: [%s]%s' % (i._h.label,i.label) 
     470      bdy = string.join( i.__html__( ), '\n' ) 
     471      oo = open( '%s/u/%s.html' % (odir,i.uid), 'w' ) 
     472      oo.write( self.pageTmpl % (ttl, bdy ) ) 
     473      oo.close() 
     474 
     475    ttl0 = 'Data Request Index' 
     476    msg0 = ['<h1>%s</h1>' % ttl0, '<ul>',] 
     477    ks = sorted( self.coll.keys() ) 
     478    for k in ks: 
     479## 
     480## sort on item label 
     481## 
     482      self.coll[k].items.sort( ds('label').cmp ) 
     483      ttl = 'Data Request Section: %s' % k 
     484      msg0.append( '<li><a href="index/%s.html">%s [%s]</a></li>\n' % (k,self.coll[k].header.title,k) ) 
     485      msg = ['<h1>%s</h1>\n' % ttl, '<ul>',] 
     486      msg.append( '<a href="../index.html">Home</a><br/>\n' ) 
     487      for i in self.coll[k].items: 
     488        m = '<li>%s: %s</li>' % ( i.label, i.__href__(odir='../u/') ) 
     489        msg.append( m ) 
     490      msg.append( '</ul>' ) 
     491      bdy = string.join( msg, '\n' ) 
     492      oo = open( '%s/index/%s.html' % (odir,k), 'w' ) 
     493      oo.write( self.pageTmpl % (ttl, bdy ) ) 
     494      oo.close() 
     495    msg0.append( '</ul>' ) 
     496    bdy = string.join( msg0, '\n' ) 
     497    oo = open( '%s/index.html' % odir, 'w' ) 
     498    oo.write( self.pageTmpl % (ttl, bdy ) ) 
     499    oo.close() 
     500     
    316501if __name__ == '__main__': 
    317502  dreq = loadDreq( ) 
  • CMIP6dreqbuild/trunk/src/framework/scope.py

    r387 r389  
    1313  def __repr__(self): 
    1414    return self.msg 
    15  
    1615 
    1716nt_mcfg = collections.namedtuple( 'mcfg', ['nho','nlo','nha','nla','nlas','nls','nh1'] ) 
     
    5150    self.mipls = sorted( list( self.mips ) ) 
    5251 
    53     self.mcfg = nt_mcfg._make( [259200,60,64800,40,20,5,100] ) 
     52    self.default_mcfg = nt_mcfg._make( [259200,60,64800,40,20,5,100] ) 
     53    self.mcfg = {} 
     54    for k in self.default_mcfg.__dict__.keys(): 
     55      self.mcfg[k] = self.default_mcfg.__dict__[k] 
    5456    self.szcfg() 
    5557 
     
    6870        if vd[:4] == 'olev' or vd == 'rho': 
    6971          type = 'o' 
    70           nz = self.mcfg.nlo 
     72          nz = self.mcfg['nlo'] 
    7173        elif vd[:4] == 'alev': 
    72           nz = self.mcfg.nla 
     74          nz = self.mcfg['nla'] 
    7375        elif vd in ['slevel','sdepth']: 
    74           nz = self.mcfg.nls 
     76          nz = self.mcfg['nls'] 
    7577        elif vd == 'aslevel': 
    76           nz = self.mcfg.nlas 
     78          nz = self.mcfg['nlas'] 
    7779        else: 
    7880          print 'Failed to parse dimensions %s' % i.dimensions 
     
    8486      if 'latitude' in dims and 'longitude' in dims: 
    8587        if type == 'o': 
    86           nh = self.mcfg.nho 
    87         else: 
    88           nh = self.mcfg.nha 
     88          nh = self.mcfg['nho'] 
     89        else: 
     90          nh = self.mcfg['nha'] 
    8991      else: 
    9092        nh = 10 
     
    147149    vars = {vid for vid in vars if inx.uid[vid][0] == u'CMORvar'} 
    148150 
    149 ###Total number of grid points output per model year: 
    150 ##    for v in vars: 
    151 ##    try: 
    152 ##      s = inx.uid[v][1].stid 
    153 ##    except: 
    154 ##      print 'no stid found for variable %s' % v 
    155 ##      inx.uid[v][1].__info__() 
    156 ##  ngpy = sum( [  self.sz[inx.uid[v][1].stid]*npy[inx.uid[v][1].frequency] for v in vars] ) 
    157  
    158151    e = {} 
    159152    for u in rql: 
     
    189182    if type(mip) in {type( '' ),type( u'') }: 
    190183      if mip not in self.mips: 
     184        print self.mips 
    191185        raise baseException( 'volByMip: Name of mip not recognised: %s' % mip ) 
    192186      l1 = [i for i in  self.dq.coll['requestItem'].items if i.mip == mip] 
Note: See TracChangeset for help on using the changeset viewer.