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

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreq/trunk/dreqPy/simpleCheck.py@747
Revision 747, 5.8 KB checked in by mjuckes, 3 years ago (diff)

distribution cand

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