source: hdldemo/trunk/hdldemo.py @ 559

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/hdldemo/trunk/hdldemo.py@559
Revision 559, 4.4 KB checked in by mjuckes, 3 years ago (diff)

added note

Line 
1"""
2Demonstration handle dump for CMIP/ESGF files ..
3
4 -h: print this message;
5 -v: print version;
6 -t: run a test;
7 -f <file name>: examine file, print path to replacement if this file is obsolete, print path to sibling files.
8"""
9## see https://www.handle.net/proxy_servlet.html for info on restfull API
10
11import string, collections, os
12import ncq3
13try:
14 import urllib
15 from urllib import request
16except:
17 import requests
18
19from testdata import *
20
21class phandle(object):
22 
23  def __init__(self, hdlDict, k='values'):
24    self.h = hdlDict
25    self.d = {}
26    try:
27      for r in hdlDict[k]:
28        self.d[r['type']] = r['data']
29    except:
30      print ( hdlDict[k] )
31      raise
32
33
34class ghandle(object):
35  def __init__(self,url):
36     try:
37       fh = request.urlopen( url )
38       msg = eval( fh.read() )
39     except:
40       r = requests.get( url )
41       msg = r.json()
42     assert type( msg ) == type( {} ), 'Response of wrong type'
43     for k in ['responseCode', 'handle']:
44       assert k in msg, 'Required key %s not found: %s' % (k, str( msg.keys() ) )
45
46     ###print ( 'url read ok' )
47     self.msg = msg
48
49class main(object):
50  knownargs0 = ['-h','-v','-t']
51  knownargs1 = ['-f']
52  def __init__(self, args):
53    self.htmpl = 'http://hdl.handle.net/api/handles/%s'
54    self.version = '0.01.01'
55    self.args = args
56    self.parseArgs()
57    if self.d.get( '-v', False ):
58      print ( self.version )
59      return
60
61    if self.d.get( '-h', False ):
62      print (self.version)
63      print ( __doc__ )
64      return
65
66    if self.d.get( '-t', False ):
67      self.runTest()
68      return
69
70    if '-f' in self.d:
71      fn = self.d['-f']
72      self.dumpF(fn)
73
74  def dumpF(self,fn):
75    assert os.path.isfile( fn ), 'File %s not found' % fn
76    f = ncHead( fn )
77    thisid = string.replace(f.ga['tracking_id'], 'hdl:999999', '10876.test' )
78    url = self.htmpl % thisid
79    g = ghandle( url )
80    self.p = phandle(  g.msg )
81    gp = ghandle( self.htmpl % self.p.d['parent']['value'] )
82    self.pp = phandle(  gp.msg )
83    if 'replaced_by' in self.p.d:
84      print '******* OBSOLETE FILE ******'
85      pr = phandle(  ghandle( self.htmpl % self.p.d['replaced_by']['value'] ).msg )
86      print 'REPLACED BY: ',pr.d['URL']['value']
87    else:
88      print 'File is current'
89
90    cl = eval( self.pp.d['children']['value'] )
91    thisfound=False
92    print '------- SIBLINGS -------'
93    for c in cl:
94      if c == thisid:
95        thisfound = True
96      else:
97        gc = ghandle( self.htmpl %  c )
98        pc = phandle( gc.msg )
99        if 'replaced_by' in pc.d:
100          pcr = phandle(  ghandle( self.htmpl % pc.d['replaced_by']['value'] ).msg )
101          print '>>>', pcr.d['URL']['value']
102        elif 'URL' in pc.d:
103          print pc.d['URL']['value']
104        else:
105          print 'Sibling url not found',pc.d.keys()
106
107  def runTest(self):
108    f = ncHead( fn1 )
109    url = self.htmpl % f.ga['tracking_id']
110    url = string.replace( url, 'hdl:999999', '10876.test' )
111    print url
112    g = ghandle( url )
113    self.p = phandle(  g.msg )
114    expected= ['creation_date', 'aggregation_level', 'HS_ADMIN', '10320/loc', 'checksum', 'URL', 'parent']
115    ## 'replaced_by' if obsolete
116    for k in expected:
117      assert k in self.p.d, 'Expected handle content key %s not found:: %s' % (k,str(self.p.d.keys()))
118    assert 'tracking_id' in self.p.d or 'trackingID' in self.p.d, 'No tracking id found: %s' % str(self.p.d.keys())
119    for k in expected:
120      print ('%s: %s' % (k,self.p.d[k]))
121
122    print ('PARSING PARENT ..... ' )
123    print ( self.htmpl % self.p.d['parent']['value'] )
124    g = ghandle( self.htmpl % self.p.d['parent']['value'] )
125    self.pp = phandle(  g.msg )
126    for k in self.pp.d.keys():
127      print ('%s: %s' % (k,self.pp.d[k]))
128    #'isReplacedBy' if obsolete
129    expected= ['creation_date', 'aggregation_level', 'HS_ADMIN', '10320/loc', 'checksum', 'URL', 'children', 'tracking_id']
130
131  def parseArgs(self):
132    self.d = {}
133    kn = self.knownargs0 + self.knownargs1
134    xx = []
135    al = self.args[1:]
136    while len(al) > 0:
137      a = al.pop(0)
138      if a not in kn:
139        xx.append(a)
140      elif a in self.knownargs1:
141         self.d[a] = al.pop(0)
142      else:
143         self.d[a] = True
144    if len(xx) > 0:
145      print ('ARGUMENTS NOT RECOGNISED: %s' % str(xx) )
146       
147class ncHead(object):
148  def __init__(self, fn):
149    nc0 = ncq3.open( fn )
150    nc0.getDigest()
151    self.ga = {}
152    for a in nc0.alla:
153      self.ga[a.name] = a.value
154     
155     
156if __name__ == "__main__":
157  import sys
158  m = main( sys.argv )
159
160
Note: See TracBrowser for help on using the repository browser.