Changeset 3125 for exist/trunk


Ignore:
Timestamp:
06/12/07 14:57:56 (12 years ago)
Author:
lawrence
Message:

ndgUtils taking shape with test cases etc

Location:
exist/trunk/python
Files:
5 added
1 edited
8 copied
1 moved

Legend:

Unmodified
Added
Removed
  • exist/trunk/python/ndgUtils/ndgObject.py

    r3073 r3125  
     1from ndgRetrieve import ndgRetrieve 
    12class ndgObject: 
    2  
    33    ''' This class instantiates an ndgObject which describes the various ways of obtaining itself, primarily 
    44                (1) a downloadable xml representation from a repository, 
     
    66     
    77    def __init__(self,uri,config=None): 
    8         ''' Instantiate an ndg URI, and potentially methods for retrieving documents described by this URI 
    9         if a config file is available.  Three default views should be available: 
    10             (1) a rendered html version 
    11             (2) a downloadable xml representation, and 
    12             (3) a printable xml version. 
    13         Real services should also be available, and at some point of course the services should be looked up  
    14         at a service registry, but that's not yet available. ''' 
    15         uri=str(uri) #Dom had problem with unicode coming in here ... dunno why @@@@ 
    16         self.gettable=-1  # The specific record is not known to be gettable via any service 
    17                           # other values of gettable allowed are  
    18                           # 0: browseable, 1: discoverable  
    19                            
     8        ''' Parse the uri and prepare for obtaining the actual content''' 
     9         
     10        #Dom had problem with unicode coming in here ... dunno why @@@@ 
     11        uri=str(uri)  
     12         
     13        # a priori, assume we can't get content for this object 
     14        self.gettable=-1   
     15         
    2016        # handle all the known ways of doing an NDG URI ... 
    2117        bits=uri.split(':') 
     
    4238                # but if we do, the uri will need fixing too ... 
    4339            else: ok=0 
     40         
    4441        if not ok: 
    4542            # after all that, we don't think it's an NDG URI ... 
     
    4845            # yes, it is an NDG URI ... 
    4946            self.repository,self.schema,self.localID=repository,schema,localID 
     47         
    5048        self.setConfig(config) 
    5149         
    5250    def setConfig(self,config): 
    5351        ''' Set up the configuration for retrieving this document ''' 
     52        self.config=config 
    5453        if config is None: 
    5554            self.discoveryURL,self.baseURL,self.xmlURL,self.printableURL=None,None,None,None 
    5655            self.BURL=None 
    5756        else: 
    58             self.config=config 
     57            self.server=self.config.get('DISCOVERY','default') 
     58            server=self.server 
    5959            qs=None 
    6060            # This NDG object may itself be a discovery record, which makes life easy, but 
    6161            # it might not be, in which case we have to build up all the possible views upon it. 
    6262            # But remember only data entity b records have discovery records ... 
    63             server=self.config.get('DISCOVERY','default') 
    6463            self.viewService='%s/view/'%server 
    6564            discoveryBASE='%s%s__%s__%s'%(self.viewService,self.repository,self.schema,self.localID) 
     
    106105        return base+ss 
    107106             
    108     def get(self,type='xml'): 
     107    def get(self,securityCredentials=None): 
    109108        ''' Actually retrieve an ORIGINAL xml record corresponding to an ndg URI ''' 
    110         if self.gettable: 
    111             pass 
     109        if self.config is None: return None 
     110        status,xmlh=ndgRetrieve(self.uri,self.config) 
     111        if status: 
     112            return xmlh.xmls 
    112113        else: 
    113             pass 
    114          
     114            return status 
    115115         
    116116    def __str__(self): 
    117117        return self.uri 
    118118 
    119 import unittest 
    120  
    121 class TestCase(unittest.TestCase): 
    122     """ Tests as required """ 
    123      
    124     def getConfig(self): 
    125         from Utilities import myConfig 
    126         config=myConfig('ndgDiscovery.config') 
    127         return config 
    128      
    129     def testURI1(self): 
    130         ''' Testing the underscore ID type ''' 
    131         uri='badc.nerc.ac.uk__NDG-B0__local1' 
    132         n=ndgObject(uri) 
    133         self.__assertions(n) 
    134          
    135     def __assertions(self,uri): 
    136         self.assertEqual('badc.nerc.ac.uk',uri.repository) 
    137         self.assertEqual('NDG-B0',uri.schema) 
    138         self.assertEqual('local1',uri.localID) 
    139          
    140     def testURI2(self): 
    141         ''' Testing the colon form of ID ''' 
    142         uri='badc.nerc.ac.uk:NDG-B0:local1' 
    143         n=ndgObject(uri) 
    144         self.__assertions(n) 
    145      
    146     def notestURI3(self): 
    147         ''' Testing the default MOLES form of id ''' 
    148         uri='badc.nerc.ac.uk/local1' 
    149         n=ndgObject(uri) 
    150         self.__assertions(n) 
    151      
    152     def testMakeURL(self): 
    153         ''' Tests making a url via a configuration file ''' 
    154         uri='badc.nerc.ac.uk__NDG-B0__local1' 
    155         n=ndgObject(uri) 
    156         n.schema='DIF' 
    157         n.setConfig(self.getConfig()) 
    158         if n.gettable: 
    159             self.assertEqual(n.discoveryURL[0:5],'http:') 
    160             print n.discoveryURL 
    161      
    162     def testStubB(self): 
    163         ''' Test the url components of a stub-b ''' 
    164         uri='badc.nerc.ac.uk__NDG-B1__dataent_chablis' 
    165         n=ndgObject(uri,self.getConfig()) 
    166         print n.discoveryURL 
    167         print n.URL 
    168         print n.xmlURL 
    169         print n.printableURL 
    170  
    171     def testPMLuri(self): 
    172         '''Make sure the pml uris work in ndg object ''' 
    173         uri='npm.ac.uk__NDG-B1__dataent.692' 
    174         n=ndgObject(uri,self.getConfig()) 
    175         print n.URL 
    176  
    177     def testHorribleURI(self): 
    178         ''' tests __ in localID ''' 
    179         uri='repository__schema__something__else' 
    180         n=ndgObject(uri) 
    181         self.assertEqual(('repository','schema','something__else'), 
    182             (n.repository,n.schema,n.localID)) 
    183          
    184  
    185 if __name__=="__main__": 
    186     unittest.main() 
  • exist/trunk/python/ndgUtils/ndgRetrieve.py

    r3092 r3125  
    1 import DocumentRetrieve, ndgSearch, ndgObject, xmlHandler2 
     1import DocumentRetrieve, ndgObject, xmlHandler2 
    22import cgi,time 
    3 from Utilities import myConfig 
    4 from paste.deploy import CONFIG 
    5  
    63 
    74def ndgRetrieve(uri,config,logger=0,output='',remote=0): 
     
    2320        #    actual exist repository er. 
    2421        #    I'm sure this can be cleaned up further :-) 
    25         r=config.get('NDG_B_SERVICE',uri.repository) 
    26         sr=config.get('DEFAULT','repository') 
    27         er=config.get('NDG_EXIST',uri.repository) 
     22        try: 
     23            r=config.get('NDG_B_SERVICE',uri.repository) 
     24            sr=config.get('DEFAULT','repository') 
     25            er=config.get('NDG_EXIST',uri.repository) 
     26        except: 
     27            raise ValueError,'Config file not available or is incomplete' 
    2828        if r<> sr: 
    2929            if not remote: 
     
    3737        return 1,ws 
    3838     
    39     server=config.get('DEFAULT','server') 
    40     if uri.schema in ['DIF','MDIP']: 
    41         r=server 
    42         status,ws=1,ndgSearch.ndgSearch() 
    43     elif uri.schema[0:5]=='NDG-B' or uri.schema=='NumSim': 
    44         status,ws=getws(config,uri,remote) 
    45     elif uri.schema=='NDG-A0': 
    46         status,ws=getws(config,uri,remote) 
    47     else: 
    48         status=0 
    49         ws='<p> Invalid scheme in NDG format URI </p>' 
    50       
     39    try: 
     40        server=config.get('DEFAULT','server') 
     41    except: 
     42        raise ValueError('Config file not available or does not include "server" entry!') 
     43    status,ws=getws(config,uri,remote) 
     44   
    5145    if not status: return status,ws 
    5246            
    53     #try: 
    5447    if uri.schema=='NDG-A0': 
    5548        target='/db/ndg_A_metadata' 
     
    5851    else: 
    5952        target='/db/ndg_B_metadata' 
    60       
    61     if output=='': output=uri.schema  
    6253    
    6354    #do the actual retrieve: 
     
    6556    try: 
    6657        time1=time.time() 
    67         r=ws.get(uri.repository,uri.schema,uri.localID,format=output,targetCollection=target) 
     58        r=ws.get(uri.repository,uri.schema,uri.localID,targetCollection=target) 
    6859        time2=time.time()-time1 
    6960        logString='Document retrieve [%s] took [%s]'%(uri,time2) 
     
    9081                    Reason was [%s]</p>'''%(uri,cgi.escape(str(e))) 
    9182     
    92      
    93 import unittest 
    94  
    95 class TestCase(unittest.TestCase): 
    96      
    97     def setup(self): 
    98         self.c=myConfig('../../ndgDiscovery.config') 
    99      
    100     def testSOAP(self): 
    101         ''' test link to SOAP web service for DIF''' 
    102         self.setup() 
    103         doc='neodc.nerc.ac.uk__DIF__dataent_11707799142713994' 
    104         uri=ndgObject.ndgObject(doc) 
    105         status,xml=ndgRetrieve(uri,self.c) 
    106         if not status: raise ValueError(xml) 
    107          
    108     def testOriSOAP(self): 
    109         ''' test link to SOAP web service for DIF (original version)''' 
    110         self.setup() 
    111         doc='neodc.nerc.ac.uk__DIF__dataent_11707799142713994' 
    112         uri=ndgObject.ndgObject(doc) 
    113         status,xml=ndgRetrieve(uri,self.c,output='original') 
    114         if not status: raise ValueError(xml) 
    115  
    116     def testEXIST(self): 
    117         ''' test link to local exist via xml rpc. 
    118                 users will need to ensure that the document is actually  
    119                 in your exist database! ''' 
    120         self.setup() 
    121         doc='badc.nerc.ac.uk__NDG-B0__activity_activity_cwvc' 
    122         doc='neodc.nerc.ac.uk__NDG-B1__dataent_11924879127625221' 
    123         uri=ndgObject.ndgObject(doc) 
    124         status,xml=ndgRetrieve(uri,self.c) 
    125         if not status: raise ValueError(xml) 
    126          
    127     def testNoSOAP(self): 
    128         ''' Test that we get a sensible error if a DIF doesn't exist ''' 
    129         self.setup() 
    130         doc='badc.nerc.ac.uk__DIF__blah' 
    131         uri=ndgObject.ndgObject(doc) 
    132         status,xml=ndgRetrieve(uri,self.c) 
    133         if status: raise ValueError(' DIF [%s] should not exist [%s]'%(doc,xml)) 
    134          
    135     def testNoB(self): 
    136         ''' Test that we get a sensible error if a NDG-B doc doesn't exist ''' 
    137         self.setup() 
    138         doc='badc.nerc.ac.uk__NDG-B0__blah' 
    139         uri=ndgObject.ndgObject(doc) 
    140         status,xml=ndgRetrieve(uri,self.c) 
    141         if status: raise ValueError(' NDG-B0 [%s] should not exist [%s]'%(doc,xml) ) 
    142          
    143     def testXMLdif(self): 
    144         ''' Make sure we can encode and decode at least one DIF properly ''' 
    145         self.setup() 
    146         doc='neodc.nerc.ac.uk__DIF__NEODC_NEXTMAP' 
    147         doc='badc.nerc.ac.uk__DIF__dataent_11738019833217179' 
    148         uri=ndgObject.ndgObject(doc) 
    149         status,xml=ndgRetrieve(uri,self.c) 
    150         if status: s=str(xml) 
    151  
    152     def testRemoteGet(self): 
    153         ''' Attempt a remote get ''' 
    154         self.setup() 
    155         doc='www.npm.ac.uk__NDG-B1__data_entity.363' 
    156         uri=ndgObject.ndgObject(doc) 
    157         status,xml=ndgRetrieve(uri,self.c,remote=1) 
    158         if not status: print xml #ie print error message if there is one! 
    159         self.assertEqual(status,1) 
    160          
    161     def testNumSim(self): 
    162         '''Get a NumSim document ''' 
    163         self.setup() 
    164         doc='badc.nerc.ac.uk__NumSim__HadAM2_CodeBase' 
    165         doc='badc.nerc.ac.uk__NumSim__HadGEM1_Control_Experiment' 
    166         uri=ndgObject.ndgObject(doc) 
    167         status,xml=ndgRetrieve(uri,self.c) 
    168         self.assertEqual(status,1) 
    169          
    170     def testHTTPget(self): 
    171         ''' Try a remote get with no frills''' 
    172         s='http://www.google.co.uk' 
    173         x=DocumentRetrieve.genericHTTP(proxyServer='http://wwwcache3.rl.ac.uk:8080/') 
    174         y=x.get(s) 
    175          
    176     def testVocabServer(self): 
    177         ''' Test the vocabServer ''' 
    178         v=DocumentRetrieve.ndgVocabPOX(proxyServer="http://wwwcache3.rl.ac.uk:8080/") 
    179         print v.getRelated('rain') 
    180          
    181 if __name__=="__main__": 
    182  
    183     unittest.main() 
  • exist/trunk/python/ndgUtils/ndgXqueries.py

    r3118 r3125  
    77    def __init__(self,directory='xquery'): 
    88        ''' Loads up xqueries from the internal package directory ''' 
    9         files=pkg_resources.resource_listdir('ndgeXist',directory) 
     9        files=pkg_resources.resource_listdir('ndgUtils',directory) 
    1010        # this next bit to get rid of .svn and anything else in testing 
    1111        xq=[] 
    1212        for f in files: 
    1313            if f.find('.xq')!=-1: xq.append(f) 
    14         self.xq=dict([(f.strip('.xq'),pkg_resources.resource_string('ndgeXist','%s/%s'%(directory,f))) for f in xq]) 
     14        #remember that .rstrip doesn't quite do what you think it does :-) 
     15        self.xq=dict([(re.sub('.xq\Z','',f),pkg_resources.resource_string('ndgUtils','%s/%s'%(directory,f))) for f in xq]) 
    1516    def __setitem__(self,key,value): 
    1617        ''' Add a new xquery to the xquery database dynamically''' 
    1718        self.xq[key]=value 
    1819    def __getitem__(self,key): 
     20        ''' Given a key, return an xquery ''' 
    1921        return self.xq[key] 
    2022    def keys(self): 
     23        ''' Return a list of all the xqueries loaded into this instance ''' 
    2124        return self.xq.keys() 
    2225    def help(self,key): 
     
    2831            return xq[s+2:e] 
    2932        else: return 'No help available for [%s]'%key 
     33    def actual(self,key,targetCollection,repositoryID,localID): 
     34        ''' Return an actual xquery targetted for a specific localID, repositoryID and 
     35        targetCollection ''' 
     36        xq=self.xq[key] 
     37        xq=xq.replace('RepositoryID',repositoryID) 
     38        xq=xq.replace('LocalID',localID) 
     39        xq=xq.replace('TargetCollection',targetCollection) 
     40        return xq 
  • exist/trunk/python/setup.py

    r3110 r3125  
    44 
    55setup( 
    6         name='ndgeXist', 
     6        name='ndgUtils', 
    77        version='0.1', 
    88        packages=find_packages(), 
    99        test_suite='nose.collector', 
    10         package_data = {'ndgeXist':'xquery/*.xq'} 
     10        package_data = {'ndgUtils':'xquery/*.xq'} 
    1111) 
Note: See TracChangeset for help on using the changeset viewer.