source: CMIP6dreq/trunk/dreqPy/simpleCheck.py @ 1271

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/dreqPy/simpleCheck.py@1271
Revision 1271, 6.8 KB checked in by mjuckes, 12 months ago (diff)

fixed python 3 compatibility issue regarding obsolete use of string module

Line 
1scr = __name__ == '__main__'
2try:
3  from __init__ import DOC_DIR
4except:
5  from dreqPy.__init__ import DOC_DIR
6##if scr:
7  ##from __init__ import DOC_DIR
8##else:
9  ##from . import __init__
10  ##DOC_DIR = __init__.DOC_DIR
11
12import os, sys, collections
13
14usingPython3 = sys.version_info >= (3,0)
15
16try:
17  import pkgutil
18  l = pkgutil.iter_modules()
19  ll = map( lambda x: x[1], l )
20  pkgutilFailed=False
21except:
22  pkgutilFailed=True
23  print ( 'Failed to load pkgutil .. more limited tests on available modules will be done' )
24  ll = []
25
26requiredModules = ['xml']
27confirmed = []
28installFailed = []
29missingLib = []
30for x in requiredModules:
31  if x in ll or pkgutilFailed:
32      try:
33        __import__(x)
34        confirmed.append( x )
35      except:
36        installFailed.append( x )
37        print ( 'Failed to install %s' % x )
38  else:
39      missingLib.append( x )
40
41if len( missingLib ) > 0 or len(installFailed) > 0:
42  print ( 'Could not load all required python libraries' )
43  if len(missingLib) > 0:
44    print ( 'MISSING LIBRARIES: %s' % str(missingLib) )
45  if len(installFailed) > 0:
46    print ( 'LIBRARIES PRESENT BUT FAILED TO INSTALL:%s' % str(missingLib) )
47  all = False
48  exit(0)
49else:
50  print ( 'Required libraries present' )
51  all = True
52
53import inspect
54class checkbase(object):
55  def __init__(self,lab):
56    self.lab = lab
57    self.ok = True
58    self.entryPoint = sys.argv[0].split( '/' )[-1]
59    ##if os.path.isdir( 'out' ):
60      ##self.docdir = 'out'
61    ##elif os.path.isdir( 'docs' ):
62      ##self.docdir = 'docs'
63    ##else:
64      ##assert False, 'Document directory not found'
65
66#document directory
67    self.docdir = DOC_DIR
68#schema location
69    self.schema = '%s/dreq2Schema.xsd' % self.docdir
70#sample xml location
71    self.sampleXml = '%s/dreq2Sample.xml' % self.docdir
72#definition document xml location
73    self.defnXml = '%s/dreq2Defn.xml' % self.docdir
74
75    ml = inspect.getmembers( self, predicate=inspect.ismethod ) 
76    ok = True
77    for tag,m in ml:
78      if tag[:3] == '_ch':
79        try:
80          self.ok = False
81          m()
82          ok &= self.ok
83        except:
84          print ( 'Failed to complete check %s' % tag )
85          raise
86    if ok:
87      print ( '%s: All checks passed' % lab )
88    else: 
89      print ( '%s: Errors detected' % lab )
90       
91class check1(checkbase):
92  def _ch01_importDreq(self):
93    try:
94      import dreq
95    except:
96      from . import dreq
97    print ( 'Dreq software import checked' )
98    self.ok = True
99
100  def _ch02_importSample(self):
101    try:
102      import dreq
103    except:
104      from . import dreq
105    self.dq = dreq.loadDreq( manifest='%s/dreqManifest.txt' % self.docdir  )
106    print ( 'Dreq sample load checked' )
107    self.ok = True
108
109  def _ch03_linkCheck(self):
110    try:
111      import dreq
112    except:
113      from . import dreq
114
115    nn = 0
116    self.dq = dreq.loadDreq( manifest='%s/dreqManifest.txt' % self.docdir  )
117    for section in self.dq.coll :
118      ks=[k for k in self.dq.coll[section].attDefn.keys() if self.dq.coll[section].attDefn[k].useClass == 'internalLink']
119      nerr = 0
120      cc = collections.defaultdict( int )
121      for i in self.dq.coll[section].items:
122        for k in ks :
123          if k in i.__dict__:
124            if i.__dict__[k] not in self.dq.inx.uid:
125              nerr += 1
126              cc[k] += 1
127              print ('Bad link found: section: %s: %s   %s [%s]' % (section, k, i.__dict__[k], i.uid) )
128      if nerr > 0:
129           msg = ''
130           for k in cc:
131             msg += '%s: %s; ' % (k,cc[k])
132           print ( 'Section %s: bad links: %s %s' % (section,nerr,msg) )
133           nn += nerr
134      ##print section, ks, nerr
135    if nn == 0:
136      print ( 'Dreq links checked' )
137    self.ok = nn == 0
138
139class check2(checkbase):
140
141  def _clear_ch03(self):
142    os.unlink( '.simpleCheck_check2_err.txt' )
143    os.unlink( '.simpleCheck_check2.txt' )
144
145  def _clear_ch04(self):
146    os.unlink( '.simpleCheck_check2_err.txt' )
147    os.unlink( '.simpleCheck_check2.txt' )
148
149  def _getCmd(self):
150    if self.entryPoint == 'drq':
151       self.cmd = 'drq'
152    else:
153       if usingPython3:
154         self.cmd = 'python3 dreqCmdl.py'
155       else:
156         self.cmd = 'python dreqCmdl.py'
157
158  def _ch05_checkMcfg(self):
159    self._getCmd()
160    thisCmd = '%s -m CMIP -e historical --mcfg 259200,60,64800,40,20,5,100' % self.cmd
161    os.popen( '%s 2> .simpleCheck_check5_err.txt 1>.simpleCheck_check5.txt' % thisCmd ).readlines()
162
163    ii = open( '.simpleCheck_check5_err.txt' ).readlines()
164    if len(ii) > 0:
165      print ( 'WARNING[005]: failed to get volume est. with command line call' )
166      self.ok = False
167      ##self._clear_ch04()
168      return
169
170    ii = open( '.simpleCheck_check5.txt' ).readlines()
171    if len(ii) < 1:
172      print ( 'WARNING[006]: failed to get get volume est. with command line call' )
173      self.ok = False
174      ##self._clear_ch04()
175      return
176
177    self.ok = True
178    return
179
180  def _ch04_checkCmd(self):
181    import os
182    self._getCmd()
183
184    os.popen( '%s -v  2> .simpleCheck_check2_err.txt 1>.simpleCheck_check2.txt' % self.cmd ).readlines()
185
186    ii = open( '.simpleCheck_check2_err.txt' ).readlines()
187    if len(ii) > 0:
188      print ( 'WARNING[003]: failed to get version with command line call' )
189      self.ok = False
190      self._clear_ch04()
191      return
192
193    ii = open( '.simpleCheck_check2.txt' ).readlines()
194    if len(ii) < 1:
195      print ( 'WARNING[004]: failed to get version with command line call' )
196      self.ok = False
197      self._clear_ch04()
198      return
199
200    self.ok = True
201    return
202
203  def _ch03_checkXML(self):
204    import os
205    os.popen( 'which xmllint 2> .simpleCheck_check2_err.txt 1>.simpleCheck_check2.txt' ).readlines()
206    ii = open( '.simpleCheck_check2_err.txt' ).readlines()
207    if len(ii) > 0:
208      print ( 'WARNING[001]: failed to detect xmllint command line program' )
209      print ( 'optional checks omitted' )
210      self.ok = False
211      self._clear_ch03()
212      return
213    ii = open( '.simpleCheck_check2.txt' ).readlines()
214    if len(ii) < 1:
215      print ( 'WARNING[002]: failed to detect xmllint command line program' )
216      print ( 'Optional checks omitted' )
217      self.ok = False
218      self._clear_ch03()
219      return
220
221    cmd = 'xmllint --noout --schema %s %s  2> .simpleCheck_check2_err.txt 1>.simpleCheck_check2.txt' % (self.schema,self.sampleXml) 
222    os.popen( cmd ).readlines()
223    ii = open( '.simpleCheck_check2_err.txt' ).readlines()
224    if len(ii) == 0:
225      print ( 'WARNING[003]: Failed to capture xmllint response' )
226      print ( cmd )
227      self.ok = False
228      self._clear_ch03()
229      return
230    if ii[0].find('validates') != -1:
231      print ( 'Sample XML validated' )
232      self.ok = True
233      self._clear_ch03()
234    else:
235      print ( 'Sample XML failed to validate' )
236      print ( cmd )
237      self.ok = False
238    return
239   
240all &= check1('Suite 1 (dreq module)').ok
241all &= check2('Suite 2 (xmllint & command line)').ok
242
243if all:
244  print ( 'ALL CHECK PASSED' )
Note: See TracBrowser for help on using the repository browser.