Changeset 387


Ignore:
Timestamp:
23/09/15 08:09:08 (4 years ago)
Author:
mjuckes
Message:

added scope.py

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

Legend:

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

    r385 r387  
    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 /data/tmp/svn3/exarch/CMIP6dreq/trunk/src         
     61        cp scanDreq.py dreq.py htmlTemplates.py simpleCheck.py scope.py /data/tmp/svn3/exarch/CMIP6dreq/trunk/src        
    6262        cp vocabDemo.py /data/tmp/svn3/exarch/CMIP6dreq/trunk/src        
    6363        echo "source copied to /data/tmp/svn3/exarch/CMIP6dreq/trunk/src" 
  • CMIP6dreqbuild/trunk/src/framework/dreq.py

    r385 r387  
    2626class dreqItemBase(object): 
    2727       __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',parent=None): 
     28       def __init__(self,dict=None,xmlMiniDom=None,id='defaultId'): 
    2929         dictMode = dict != None 
    30          self.parent = parent  
    3130         mdMode = xmlMiniDom != None 
    3231         assert not( dictMode and mdMode), 'Mode must be either dictionary of minidom: both assigned' 
    3332         assert dictMode or mdMode, 'Mode must be either dictionary of minidom: neither assigned' 
    34          self.defaults = { } 
    35          self.globalDefault = '__unset__' 
    36          self.contentInitialised = False 
     33         ##self._defaults = { } 
     34         ##self._globalDefault = '__unset__' 
     35         self._contentInitialised = False 
    3736         if dictMode: 
    3837           self.dictInit( dict ) 
     
    4140 
    4241       def __repr__(self): 
    43          if self.contentInitialised: 
    44            return 'Item <%s>: [%s] %s' % (self.parent.header.title,self.label,self.title) 
     42         """Provide a one line summary of identifying the object.""" 
     43         if self._contentInitialised: 
     44           return 'Item <%s>: [%s] %s' % (self._h.title,self.label,self.title) 
    4545         else: 
    46            return 'Item <%s>: uninitialised' % self.parent.header.title 
    47  
    48        def __info__(self): 
    49          if self.contentInitialised: 
    50            print 'Item <%s>: [%s] %s' % (self.parent.header.title,self.label,self.title) 
     46           return 'Item <%s>: uninitialised' % self._h.title 
     47 
     48       def __info__(self,full=False): 
     49         """Print a summary of the data held in the object as a list of key/value pairs""" 
     50         if self._contentInitialised: 
     51           print 'Item <%s>: [%s] %s' % (self._h.title,self.label,self.title) 
    5152           for a in self.__dict__.keys(): 
    52              if a != 'parent': 
     53             if a[0] != '_' or full: 
    5354               print '    %s: %s' % ( a, self.__dict__[a] ) 
    5455         else: 
     
    5758       def dictInit( self, dict ): 
    5859         __doc__ = """Initialise from a dictionary.""" 
    59          for a in self.attributes: 
     60         for a in self._a.keys(): 
    6061           if dict.has_key(a): 
    6162             self.__dict__[a] = dict[a] 
    6263           else: 
    63              self.__dict__[a] = self.defaults.get( a, self.globalDefault ) 
    64          self.contentInitialised = True 
     64             self.__dict__[a] = self._d.defaults.get( a, self._d.glob ) 
     65         self._contentInitialised = True 
    6566 
    6667       def mdInit( self, el ): 
     
    6869         deferredHandling=False 
    6970         nw1 = 0 
    70          for a in self.attributes: 
     71         for a in self._a.keys(): 
    7172           if el.hasAttribute( a ): 
    72              v = el.getAttribute( a ) 
    73              if self.parent.attributes[a].type == u'xs:integer': 
    74                if self.rc.isIntStr( v ): 
     73             v = str( el.getAttribute( a ) ) 
     74             if self._a[a].type == u'xs:integer': 
     75               if self._rc.isIntStr( v ): 
    7576                 v = int(v) 
    7677               else: 
    7778                 v = string.strip(v) 
    78                  thissect = '%s [%s]' % (self.parent.header.title,self.parent.header.tag) 
     79                 thissect = '%s [%s]' % (self._h.title,self._h.tag) 
    7980                 if v in { '',u'',' ', u' '}: 
    8081                   if nw1 < 20: 
     
    8990                     msg = 'ERROR: failed to convert integer: %s: %s: %s' % (thissect,a,v) 
    9091                     deferredHandling=True 
    91              elif self.parent.attributes[a].type == u'xs:boolean': 
    92                v = str(v) in {'true','1'} 
     92             elif self._a[a].type == u'xs:boolean': 
     93               v = v in {'true','1'} 
    9394             self.__dict__[a] = v 
    9495           else: 
    9596             if a in {'uid'}: 
    96                thissect = '%s [%s]' % (self.parent.header.title,self.parent.header.tag) 
     97               thissect = '%s [%s]' % (self._h.title,self._h.tag) 
    9798               print 'ERROR.020.0001: missing uid: %s' % thissect 
    98              self.__dict__[a] = self.defaults.get( a, self.globalDefault ) 
     99             self.__dict__[a] = self._d.defaults.get( a, self._d.glob ) 
    99100 
    100101           if type( self.__dict__.get( 'rowIndex', 0 ) ) != type(0): 
     
    103104           if deferredHandling: 
    104105             print msg 
    105              ##ee = {} 
    106              ##for a in self.attributes: 
    107                ##ee[a] = self.__dict__.get(a,'unset') 
    108              ##print ee 
    109          self.contentInitialised = True 
     106 
     107         self._contentInitialised = True 
    110108 
    111109     
     
    120118    self.nts = collections.namedtuple( 'sectdef', ['tag','label','title','id','itemLabelMode','level'] ) 
    121119    self.nti = collections.namedtuple( 'itemdef', ['tag','label','title','type','rClass','techNote'] ) 
    122     self.ntt = collections.namedtuple( 'sectinit', ['header','attributes'] ) 
     120    self.ntt = collections.namedtuple( 'sectinit', ['header','attributes','defaults'] ) 
     121    self.nt__default = collections.namedtuple( 'deflt', ['defaults','glob'] ) 
    123122    self.ntf = collections.namedtuple( 'sect', ['header','attDefn','items'] ) 
    124123 
    125124    self.coll = {} 
    126125    doc = xml.dom.minidom.parse( self.vdef  ) 
    127     self.contentDoc = xml.dom.minidom.parse( self.vsamp ) 
    128126    vl = doc.getElementsByTagName( 'table' ) 
    129     self.slist = [] 
    130127    self.tables = {} 
    131128    tables = {} 
     
    135132      t = self.parsevcfg(v) 
    136133      tables[t[0].label] = t 
    137       self.tableClasses[t[0].label] = self.itemClassFact( t.header.itemLabelMode, t.attributes.keys() ) 
    138       self.slist.append( t ) 
    139  
     134      self.tableClasses[t[0].label] = self.itemClassFact( t ) 
     135 
     136    self.contentDoc = xml.dom.minidom.parse( self.vsamp ) 
    140137    self.recordAttributeDefn = tables 
    141138    for k in tables.keys(): 
     
    151148         
    152149        for i in il: 
    153           ii = self.tableClasses[k](xmlMiniDom=i,parent=self.recordAttributeDefn[k]) 
     150          ii = self.tableClasses[k](xmlMiniDom=i) 
    154151          self.tableItems[k].append( ii ) 
    155152      elif len(vl) > 1: 
     
    179176    return self.coll 
    180177 
    181   def itemClassFact(self,itemLabelMode,attributes): 
     178  def itemClassFact(self, sectionInfo): 
    182179     class dreqItem(dreqItemBase): 
    183        """Inherits all methods from dreqItemBase""" 
     180       """Inherits all methods from dreqItemBase. 
     181 
     182USAGE 
     183----- 
     184The instanstiated object contains a single data record. The "_h" attribute links to information about the record and the section it belongs to.  
     185 
     186object._a: a python dictionary defining the attributes in each record. The keys in the dictionary correspond to the attribute names and the values are python "named tuples" (from the "collections" module). E.g. object._a['priority'].type contains the type of the 'priority' attribute. Type is expressed using XSD schema language, so "xs:integer" implies integer.  The "rClass" attribute carries information about usage. If object._a['xxx'].rClass = u'internalLink' then the record attribute provides a link to another element and object.xxx is the unique identifier of that element. 
     187 
     188object._h: a python named tuple describing the section. E.g. object.parent.header.title is the section title (E.g. "CMOR Variables") 
     189""" 
    184190        
    185      dreqItem.itemLabelMode = itemLabelMode 
    186      dreqItem.attributes = attributes 
    187      dreqItem.rc = self.rc 
     191     dreqItem._h = sectionInfo.header 
     192     dreqItem._a = sectionInfo.attributes 
     193     dreqItem._d = sectionInfo.defaults 
     194     ##dreqItem.itemLabelMode = itemLabelMode 
     195     ##dreqItem.attributes = attributes 
     196     dreqItem._rc = self.rc 
    188197     return dreqItem 
    189198          
     
    201210        tt = self.parseicfg(i) 
    202211        idict[tt.label] = tt 
    203       return self.ntt( vtt, idict ) 
     212      deflt = self.nt__default( {}, '__unset__' ) 
     213      return self.ntt( vtt, idict, deflt ) 
    204214 
    205215  def parseicfg(self,i): 
     
    259269    for k in dreq.keys(): 
    260270        for i in dreq[k].items: 
    261           assert i.__dict__.has_key('uid'), 'uid not found::\n%s\n%s' % (str(i.parent.header),str(i.__dict__) ) 
     271          assert i.__dict__.has_key('uid'), 'uid not found::\n%s\n%s' % (str(i._h),str(i.__dict__) ) 
    262272          if self.uid.has_key(i.uid): 
    263             print 'ERROR.100.0001: Duplicate uid: %s [%s]' % (i.uid,i.parent.header.title) 
     273            print 'ERROR.100.0001: Duplicate uid: %s [%s]' % (i.uid,i._h.title) 
    264274            self.uid2[i.uid].append( (k,i) ) 
    265275          else: 
     
    275285            id2 = i.__dict__.get( k2 ) 
    276286            if id2 != '__unset__': 
     287              sect = i._h.label 
    277288              self.iref_by_uid[ id2 ].append( (k2,i.uid) ) 
    278               self.iref_by_sect[ id2 ].a[k2].append( i.uid ) 
     289              self.iref_by_sect[ id2 ].a[sect].append( i.uid ) 
    279290              if self.uid.has_key( id2 ): 
    280291                n1 += 1 
  • CMIP6dreqbuild/trunk/src/framework/ptxt.py

    r385 r387  
    3636nt__itematt = collections.namedtuple( 'itematt', ['name','type','title','clss','techn'] ) 
    3737 
    38 vocab_elTmpl = '''<table label="%(label)s" title="%(title)s" id="%(id)s" itemLabelMode="%(ilm)s" level="%(sectLevel)s" maxOccurs="%(mxo)s" labUnique="%(labu)s"> 
     38vocab_elTmpl = '''<table label="%(label)s" uid="%(uid)s" title="%(title)s" id="%(id)s" itemLabelMode="%(ilm)s" level="%(sectLevel)s" maxOccurs="%(mxo)s" labUnique="%(labu)s"> 
    3939%(itemAttrList)s 
    4040</table> 
     
    4242ial_elTmpl = '  <rowAttribute label="%(label)s"%(wrappedType)s%(wrappedTitle)s%(wrappedClass)s%(wrappedTechn)s/>' 
    4343 
    44 expl_Tmpl = '''<%(label)s class="vocab" title="%(title)s" id="%(id)s"> 
     44expl_Tmpl = '''<%(label)s uid="%(uid)s" class="vocab" title="%(title)s" id="%(id)s"> 
    4545<!-- <info srcType="dummy" srcRef="ptxt.py">Dummy entries</info> --> 
    4646%(exampleItem)s 
     
    5151class vocab(object): 
    5252 
    53   def __init__( self, line, kk=0 ): 
     53  def __init__( self, line, kk=0, counter=None ): 
    5454     bits = map( string.strip, string.split(line, ';' ) ) 
    5555     assert len (bits) == 7, '[1] Cannot parse %s' % line 
     
    6666     self.itematts = [  nt__itematt( 'label','xs:string',None,None,None ), 
    6767                        nt__itematt( 'title','xs:string',None,None,None ) ] 
     68     self.counter = counter 
    6869 
    6970  def tmpl(self,oo=None,mode="defn"): 
     
    106107       mxo = self.mxo 
    107108       labu = self.labu 
     109       uid = "SECTION:%s" % label 
     110       if self.mxo > 1: 
     111         uid += '.xx' 
    108112       self.vocab = vocab_elTmpl % locals() 
    109113     else: 
     
    142146       id = self.id 
    143147       ilm =  self.ilt 
     148       uid = "SECTION:%s" % label 
     149       self.counter[label] += 1 
     150       if self.mxo > 1: 
     151         uid += '.%2.2i' % self.counter[label] 
    144152       self.vocab = expl_Tmpl % locals() 
    145153## 
     
    234242 - updProv {Proposer of update}''' 
    235243 
     244    counter = collections.defaultdict(int) 
    236245    for l in ii: 
    237246      if l[:5] == 'vocab': 
     
    239248          this.tmpl(oo=oo,mode=mode) 
    240249        kk+=1 
    241         this = vocab(l,kk=kk) 
     250        this = vocab(l,kk=kk,counter=counter) 
    242251        if mode in ['upd','updsamp']: 
    243252          for l1 in string.split( updExtra, '\n' ): 
  • CMIP6dreqbuild/trunk/src/framework/scanDreq.py

    r385 r387  
    477477    expl = dq.coll[k].items[0] 
    478478    atl = atlSort( expl.__dict__.keys() ) 
    479     atl.pop( atl.index('parent') ) 
    480     print k, atl 
     479    if 'parent' in atl: 
     480      atl.pop( atl.index('parent') ) 
    481481    dumpcsv( 'csv2/%s.csv' % k, k, atl ) 
    482482   
Note: See TracChangeset for help on using the changeset viewer.