source: CMIP6dreqbuild/trunk/src/framework/dreqCompare.py @ 1113

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/dreqCompare.py@1291
Revision 1113, 4.0 KB checked in by mjuckes, 2 years ago (diff)

updates for port to new laptop

Line 
1import collections, shelve, os
2from dreqPy import dreq
3import requests
4import hashlib
5
6black = {'AERmon':{'siconc'} }
7
8class cmvIndex(object):
9  def __init__(self,oname='refCmvId',odir='inSh/',versions={'beta':[35,38,45],'1':[(0,1),(0,4)]},
10                      vdir='/data/svn/exarch/CMIP6dreq/tags/'):
11    assert os.path.isdir( odir ), 'Output directory not found: %s' % odir
12    self.oShName = '%s%s' % (odir, oname)
13
14    self.fns = []
15    for k in ['beta','1']:
16      for v in versions[k]:
17        if k == '1b':
18          thisv = '01.%s' % v
19        elif type(v) == type(1):
20          thisv = '01.beta.%2.2i' % v
21        else:
22          thisv = '01.%2.2i.%2.2i' % v
23        fn = '%s/%s/dreqPy/docs/dreq.xml' % (vdir,thisv)
24        cfn = '%s/%s/dreqPy/docs/dreq2Defn.xml' % (vdir,thisv)
25        for f in [fn,cfn]:
26          assert os.path.isfile( f), 'Input file not found: %s' % f
27        self.fns.append( (fn,cfn,thisv ) )
28
29  def getCmv(self):
30    self.fns.reverse()
31    cc = {}
32    ss = set()
33    for fn,cfn, vid in self.fns:
34      self.dq = dreq.loadDreq(dreqXML=fn, configdoc=cfn, manifest=None)
35      print fn, self.dq.version
36      for i in self.dq.coll['CMORvar'].items:
37        if not (i.mipTable in black and i.label in black[i.mipTable]) :
38          if (i.mipTable, i.label) not in cc:
39            if i.uid in ss:
40               print 'WARNING: duplicate uid found: %s . %s, %s, %s' % (i.uid,i.mipTable,i.label,i.vid)
41            else:
42               cc[(i.mipTable, i.label)] = (i.uid, vid )
43               ss.add(i.uid)
44
45    sh = shelve.open( self.oShName, 'n' )
46    for t,l in cc:
47      u,vv = cc[(t,l)]
48      sh[u] = (t,l,vv)
49    sh.close()
50
51class dqa(object):
52  def __init__(self,version='__current__',vdir='old'):
53    if version == '__current__':
54      self.dq = dreq.loadDreq()
55      self.name = 'current'
56    else:
57      self.dq = dreq.loadDreq(dreqXML='%s/%s/dreq.xml' % (vdir,version), configdoc='%s/%s/dreq2Defn.xml' % (vdir,version))
58      self.name = version
59
60    self.version = self.dq.version
61    self.ee = {}
62    self.ingest( 'CMORvar' )
63    self.ingest( 'var' )
64
65  def ingest(self,sect):
66    ff = {}
67    for i in self.dq.coll[sect].items:
68      if sect == 'CMORvar':
69        id = '%s.%s' % (i.mipTable,i.label)
70      else:
71        id = i.label
72      if id in ff:
73        print 'ERROR.001.0001: [%s:%s] duplicate of %s (%s,%s)' % (self.name,sect,id,ff[id],i.uid)
74      else:
75        ff[id] = i.uid
76    self.ee[sect] = ff
77
78  def saveCmv(self,ofile=None):
79    if ofile == None:
80      ofile = 'cmvRef_%s.csv' % self.version
81    oo = open( ofile, 'w' )
82    for i in self.dq.coll['CMORvar'].items:
83        oo.write( '\t'.join( [i.label,i.mipTable,i.title,i.uid,str(i.defaultPriority)] ) + '\n' )
84    oo.close()
85
86  def compare(self, oth,count=True,lst=False,sect='CMORvar' ):
87    n1 = 0
88    n2 = 0
89    for k in sorted( self.ee[sect].keys() ):
90      if k not in oth.ee[sect]:
91        n1 += 1
92        if lst:
93          print 'Only in %s: %s' % (self.name, k )
94      elif self.ee[sect][k] != oth.ee[sect][k]:
95        n2 += 1
96        if lst:
97          print 'UID CHANGED in %s -- %s: %s' % (self.name,oth.name, k )
98 
99    print 'Number only in %s.%s: %s' % (self.name,sect,n1)
100    print 'Number changed in %s.%s -- %s: %s' % (self.name,sect,oth.name,n2)
101
102class fetch(object):
103  files = ['dreq.xml', 'dreq2Defn.xml', 'dreqSupp.xml', 'dreqSuppDefn.xml']
104  utmpl = 'http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/tags/%s/dreqPy/docs/%s'
105  def __init__(self,version='01.beta.34', vdir='old'):
106    for f in self.files:
107      u = self.utmpl % (version,f)
108      page = requests.get(u)
109      md5 = hashlib.md5(page.text.encode('utf-8')).hexdigest()
110      print version, f, md5
111      oo = open( '%s/%s/%s' % (vdir,version,f), 'w' )
112      oo.write( page.text.encode('utf-8') )
113      oo.close()
114   
115if __name__ == '__main__':
116   md = 'index'
117   if md == 'index':
118     c = cmvIndex()
119     c.getCmv()
120   elif md == 'get':
121     f = fetch()
122   else:
123     version = '01.beta.32'
124     a = dqa()
125     b = dqa(version)
126     b.saveCmv()
127     a.compare(b)
128     b.compare(a,lst=True)
129     a.compare(b,sect='var')
Note: See TracBrowser for help on using the repository browser.