Ignore:
Timestamp:
28/01/16 16:04:07 (4 years ago)
Author:
mjuckes
Message:

candidate

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CMIP6dreq/trunk/dreqPy/dreq.py

    r540 r570  
    88import xml.dom.minidom 
    99import re, shelve 
    10 from __init__ import DOC_DIR 
     10try: 
     11  from __init__ import DOC_DIR 
     12except: 
     13  from dreqPy.__init__ import DOC_DIR 
    1114 
    1215jsh='''<link type="text/css" href="/css/jquery-ui-1.8.16.custom.css" rel="Stylesheet" /> 
     
    6568 
    6669       def __init__(self,idict=None,xmlMiniDom=None,id='defaultId',etree=False): 
     70         self._strictRead = True 
    6771         dictMode = idict != None 
    6872         mdMode = xmlMiniDom != None 
     
    220224         __doc__ = """Initialise from a dictionary.""" 
    221225         for a in self._a.keys(): 
     226           vv = False 
    222227           if a in idict: 
    223228             val = idict[a] 
     229             vv = True 
    224230           else: 
    225              val = self._d.defaults.get( a, self._d.glob ) 
    226            setattr( self, a, val ) 
     231             if type( self.__class__.__dict__[a] ) not in (type( ''), type( u'' )) and (not self.__class__.__dict__[a].required): 
     232               delattr( self, a ) 
     233             else: 
     234               val = self._d.defaults.get( a, self._d.glob ) 
     235               vv = True 
     236           if vv: 
     237             setattr( self, a, val ) 
    227238         self._contentInitialised = True 
    228239 
     
    238249               aa = '%s%s' % (self.ns,a) 
    239250               tvtl.append( (a,True, str( el.get( a ) ) ) ) 
     251             elif self._a[a].__dict__.get( 'required', True ) in [False,'false',u'false']: 
     252               tvtl.append( (a,True,None) ) 
    240253             else: 
    241254               tvtl.append( (a,False,None) ) 
     
    244257             if el.hasAttribute( a ): 
    245258               tvtl.append( (a,True, str( el.getAttribute( a ) ) ) ) 
    246              else: 
     259## 
     260## attributes are treated as required unless they have a required attribute set to false 
     261## 
     262             elif self._a[a].__dict__.get( 'required', True ) not in [False,'false',u'false']: 
    247263               tvtl.append( (a,False,None) ) 
    248264        
    249265         for a,tv,v in tvtl: 
    250266           if tv: 
    251              if self._a[a].type == u'xs:float': 
     267             erase = False 
     268             if v == None: 
     269               pass 
     270               erase = True 
     271             elif self._a[a].type == u'xs:float': 
    252272               if v == '': 
    253273                 v = None 
     
    258278                   print ( 'Failed to convert real number: %s,%s,%s' % (a,tv,v) ) 
    259279                   raise 
     280             elif self._a[a].type in [u'aa:st__floatList', u'aa:st__floatListMonInc']: 
     281                 v = [float(x) for x in v.split()] 
     282             elif self._a[a].type in [u'aa:st__integerList', u'aa:st__integerListMonInc']: 
     283                 ##print a,self._a[a].type,str(v) 
     284                 v = [int(x) for x in v.split()] 
     285                 if self._a[a].type in [u'aa:st__integerListMonInc'] and self._strictRead: 
     286                   ##print a,self._a[a].type,str(v) 
     287                   for i in range(len(v)-1): 
     288                     assert v[i] < v[i+1], 'Attribute %s of type %s with non-monotonic value: %s' % (a,self._a[a].type,str(v)) 
    260289             elif self._a[a].type == u'xs:integer': 
    261290               if self._rc.isIntStr( v ): 
     
    278307             elif self._a[a].type == u'xs:boolean': 
    279308               v = v in ['true','1'] 
    280              self.__dict__[a] = v 
     309             elif self._a[a].type not in [u'xs:string']: 
     310               print ('ERROR: Type %s not recognised' % self._a[a].type ) 
     311 
     312             if erase: 
     313               ### need to overwrite attribute (which is inherited from parent class) before deleting it. 
     314               ### this may not be needed in python3 
     315               self.__dict__[a] = '__tmp__' 
     316               delattr( self, a ) 
     317             else: 
     318               self.__dict__[a] = v 
    281319           else: 
    282320             if a in ['uid',]: 
     
    308346 
    309347    self.nts = collections.namedtuple( 'sectdef', ['tag','label','title','id','itemLabelMode','level','maxOccurs','labUnique','uid'] ) 
    310     self.nti = collections.namedtuple( 'itemdef', ['tag','label','title','type','useClass','techNote'] ) 
     348    self.nti = collections.namedtuple( 'itemdef', ['tag','label','title','type','useClass','techNote','required'] ) 
    311349    self.ntt = collections.namedtuple( 'sectinit', ['header','attributes','defaults'] ) 
    312350    self.nt__default = collections.namedtuple( 'deflt', ['defaults','glob'] ) 
     
    501539        idict = {'description':'An extended description of the object', 'title':'Record Description', \ 
    502540         'techNote':'', 'useClass':'__core__', 'superclass':'rdf:property',\ 
    503          'type':'xs:string', 'uid':'__core__:description', 'label':'label' } 
     541         'type':'xs:string', 'uid':'__core__:description', 'label':'label', 'required':'required' } 
    504542        if v == None: 
    505543          vtt = self.nts( '__core__', 'CoreAttributes', 'X.1 Core Attributes', '00000000', 'def', '0', '0', 'false', '__core__' ) 
     
    508546      elif v == '__sect__': 
    509547        idict = {'title':'Record Description', \ 
    510          'uid':'__core__:description', 'label':'label', 'useClass':'text', 'id':'id', 'maxOccurs':'', 'itemLabelMode':'', 'level':'', 'labUnique':'' } 
     548         'uid':'__core__:description', 'label':'label', 'useClass':'text', 'id':'id', 'maxOccurs':'', 'itemLabelMode':'', 'level':'', 'labUnique':'', 'required':'' } 
    511549        vtt = self.nts( '__sect__', 'sectionAttributes', 'X.3 Section Attributes', '00000000', 'def', '0', '0', 'false', '__sect__' ) 
    512550##<var label="var" uid="SECTION:var" useClass="vocab" title="MIP Variable" id="cmip.drv.001"> 
     
    533571      ll = [] 
    534572      ee = {} 
    535       for k in ['label','title','type','useClass','techNote','description','uid']: 
     573      for k in ['label','title','type','useClass','techNote','description','uid','required']: 
    536574        if i.hasAttribute( k ): 
    537575          ll.append( i.getAttribute( k ) ) 
     
    539577          ll.append( defs.get( k, None ) ) 
    540578        ee[k] = ll[-1] 
    541       l, t, ty, cls, tn, desc, uid = ll 
     579      l, t, ty, cls, tn, desc, uid, rq = ll 
    542580      self.lastTitle = t 
     581      if rq in ['0', 'false']: 
     582        rq = False 
     583      else: 
     584        rq = True 
     585      ee['required'] = rq 
    543586 
    544587      returnClass = True 
     
    546589        return self._tableClass0( idict=ee ) 
    547590      else: 
    548         return self.nti( i.nodeName, l,t,ty,cls,tn ) 
     591        return self.nti( i.nodeName, l,t,ty,cls,tn,rq ) 
    549592 
    550593class container(object): 
     
    715758 
    716759  def _sectionSortHelper(self,title): 
    717     ab = string.split( string.split(title)[0], '.' ) 
     760    ##ab = string.split( string.split(title)[0], '.' ) 
     761    ab = title.split( '.' )[0].split() 
    718762    if len( ab ) == 2: 
    719763      a,b = ab 
Note: See TracChangeset for help on using the changeset viewer.