source: CMIP6dreqbuild/trunk/src/framework/dreq.py @ 361

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/dreq.py@361
Revision 361, 4.5 KB checked in by mjuckes, 5 years ago (diff)

more updates

Line 
1import xml, string, collections
2import xml.dom
3import xml.dom.minidom
4class dreqItemBase(object):
5       def __init__(self,dict=None,xmlMiniDom=None,id='defaultId'):
6         dictMode = dict != None
7         mdMode = xmlMiniDom != None
8         assert not( dictMode and mdMode), 'Mode must be either dictionary of minidom: both assigned'
9         assert dictMode or mdMode, 'Mode must be either dictionary of minidom: neither assigned'
10         self.defaults = {}
11         self.globalDefault = '__unset__'
12         if dictMode:
13           self.dictInit( dict )
14         elif mdMode:
15           self.mdInit( xmlMiniDom )
16
17       def dictInit( self, dict ):
18         for a in self.attributes:
19           if dict.has_key(a):
20             self.__dict__[a] = dict[a]
21           else:
22             self.__dict__[a] = self.defaults.get( a, self.globalDefault )
23
24       def mdInit( self, el ):
25         __doc__ = """Initialisation from a mindom XML element. The list of attributes must be set by the class factory before the class is initialised"""
26         for a in self.attributes:
27           if el.hasAttribute( a ):
28             v = el.getAttribute( a )
29             self.__dict__[a] = v
30           else:
31             self.__dict__[a] = self.defaults.get( a, self.globalDefault )
32
33class config(object):
34
35  def __init__(self):
36    self.vdef = 'out/dreqDefn.xml' 
37    self.vsamp = 'out/vocabSample.xml'
38    self.vsamp = '../workbook/trial.xml'
39    self.vsamp = '../workbook/trial_20150724.xml'
40    self.nts = collections.namedtuple( 'sectdef', ['tag','label','title','id','itemLabelMode'] )
41    self.nti = collections.namedtuple( 'itemdef', ['tag','label','title','type','rClass','techNote'] )
42    self.ntt = collections.namedtuple( 'sect', ['header','attributes'] )
43
44    doc = xml.dom.minidom.parse( self.vdef  )
45    self.contentDoc = xml.dom.minidom.parse( self.vsamp )
46##<vocab label="institute" title="Institute" id="cmip.drv.001" itemLabelMode="def">
47##  <itemAttribute label="label"/>
48    vl = doc.getElementsByTagName( 'table' )
49    print len(vl)
50    self.slist = []
51    self.tables = {}
52    tables = {}
53    self.tableClasses = {}
54    self.tableItems = collections.defaultdict( list )
55    for v in vl:
56      t = self.parsevcfg(v)
57      tables[t[0].label] = t
58      self.tableClasses[t[0].label] = self.itemClassFact( t.header.itemLabelMode, t.attributes.keys() )
59      self.slist.append( t )
60
61    for k in tables.keys():
62      vl = self.contentDoc.getElementsByTagName( k )
63      if len(vl) == 1:
64        v = vl[0]
65        t = v.getAttribute( 'title' )
66        i = v.getAttribute( 'id' )
67        il = v.getElementsByTagName( 'item' )
68        print k, t, i, len(il)
69        self.tables[k] = (i,t,len(il))
70       
71        for i in il:
72          ii = self.tableClasses[k](xmlMiniDom=i)
73          self.tableItems[k].append( ii )
74      elif len(vl) > 1:
75        l1 = []
76        l2 = []
77        print '#### %s: %s' % (k,len(vl) )
78        for v in vl:
79          t = v.getAttribute( 'title' )
80          i = v.getAttribute( 'id' )
81          il = v.getElementsByTagName( 'item' )
82          print k, t, i, len(il)
83          l1.append( (i,t,len(il)) )
84         
85          l2i = []
86          for i in il:
87            ii = self.tableClasses[k](xmlMiniDom=i)
88            l2i.append( ii )
89          l2.append( l2i )
90        self.tables[k] = l1
91        self.tableItems[k] = l2
92
93  def itemClassFact(self,itemLabelMode,attributes):
94     class dreqItem(dreqItemBase):
95       """Inherits all methods from dreqItemBase"""
96       
97     dreqItem.itemLabelMode = itemLabelMode
98     dreqItem.attributes = attributes
99     return dreqItem
100         
101  def parsevcfg(self,v):
102      l = v.getAttribute( 'label' )
103      t = v.getAttribute( 'title' )
104      i = v.getAttribute( 'id' )
105      ilm = v.getAttribute( 'itemLabelMode' )
106      il = v.getElementsByTagName( 'rowAttribute' )
107      vtt = self.nts( v.nodeName, l,t,i,ilm )
108      ll = []
109      idict = {}
110      for i in il:
111        tt = self.parseicfg(i)
112        idict[tt.label] = tt
113        ll.append(tt)
114      return self.ntt( vtt, idict )
115
116  def parseicfg(self,i):
117      l = i.getAttribute( 'label' )
118      if i.hasAttribute( 'title' ):
119        t = i.getAttribute( 'title' )
120        self.lastTitle = t
121      else:
122        t = None
123      if i.hasAttribute( 'type' ):
124        ty = i.getAttribute( 'type' )
125      else:
126        ty = "xs:string"
127      if i.hasAttribute( 'class' ):
128        cls = i.getAttribute( 'class' )
129      else:
130        cls = None
131      if i.hasAttribute( 'techNote' ):
132        tn = i.getAttribute( 'techNote' )
133      else:
134        tn = None
135      return self.nti( i.nodeName, l,t,ty,cls,tn )
136
137c = config()
Note: See TracBrowser for help on using the repository browser.