Changeset 1885:8d4623044732 in orange-bioinformatics for orangecontrib/bio/obiArrayExpress.py


Ignore:
Timestamp:
10/14/13 14:57:14 (6 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Fixes for Array Express caching.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • orangecontrib/bio/obiArrayExpress.py

    r1873 r1885  
    3232Low level Array Express query using REST services:: 
    3333 
    34     >>> from Orange.bioinformatics import obiArrayExpress 
     34    >>> from Orange.bio import obiArrayExpress 
    3535    >>> obiArrayExpress.query_experiments(accession='E-MEXP-31') 
    3636    {u'experiments': ... 
     
    5252 
    5353import os 
    54 import sys 
    5554import urllib2 
    5655import re 
    57  
    58 from Orange.orng import orngServerFiles 
    59  
    6056import warnings 
    6157import shelve 
     
    6965from functools import partial 
    7066from contextlib import closing 
     67 
     68from Orange.orng import orngServerFiles 
    7169 
    7270parse_json = json.load 
     
    107105 
    108106 
     107def _open_shelve(filename, flag="r"): 
     108    dirname = os.path.dirname(filename) 
     109    if not os.path.isdir(dirname): 
     110        os.makedirs(dirname) 
     111    exists = os.path.exists(filename) 
     112    if flag in ["r", "w"] and not exists: 
     113        # needs to be created first 
     114        # XXX: Race condition 
     115        s = shelve.open(filename, "c") 
     116        s.close() 
     117 
     118    return shelve.open(filename, flag) 
     119 
     120 
    109121class ArrayExpressConnection(object): 
    110     """ A connection to the ArrayExpress. Used to construct a REST query 
    111     and run it. 
    112  
    113     .. todo:: Implement user login. 
     122    """ 
     123    A connection to the Array Express. 
     124 
     125    Used to construct a REST query and run it. 
     126 
     127    :param address: Address of the ArrayExpress API. 
     128    :param timeout: Timeout for the socket connection. 
     129 
     130    .. todo:: 
     131        Implement user login (see Accessing Private Data in API docs) 
    114132 
    115133    """ 
     
    124142    def __init__(self, address=None, timeout=30, cache=None, 
    125143                 username=None, password=None): 
    126         """ Initialize the connection object. 
    127  
    128         :param address: Address of the ArrayExpress API 
    129         :param timeout: Timeout for the socket connection 
    130  
    131         .. todo:: Implement user login (see Accessing Private Data in API docs) 
    132  
    133         """ 
    134144        self.address = address if address is not None else self.DEFAULT_ADDRESS 
    135145        self.timeout = timeout 
     
    286296    def _cache_urlopen(self, url, timeout=30): 
    287297        if self.cache is not None: 
    288             with self.open_cache() as cache: 
    289                 cached = url in cache 
    290             if not cached: 
    291                 stream = urllib2.urlopen(url, timeout=timeout) 
    292                 data = stream.read() 
    293                 with self.open_cache() as cache: 
    294                     cache[url] = data 
    295             else: 
    296                 with self.open_cache() as cache: 
    297                     data = cache[url] 
     298            with self.open_cache("r") as cache: 
     299                if url in cache: 
     300                    return StringIO(cache[url]) 
     301 
     302            stream = urllib2.urlopen(url, timeout=timeout) 
     303            data = stream.read() 
     304            with self.open_cache("w") as cache: 
     305                cache[url] = data 
     306 
    298307            return StringIO(data) 
    299308        else: 
    300309            return urllib2.urlopen(url, timeout=timeout) 
    301          
    302     def open_cache(self): 
     310 
     311    def open_cache(self, flag="r"): 
    303312        if isinstance(self.cache, basestring): 
    304             return closing(shelve.open(self.cache)) 
     313            try: 
     314                return closing(_open_shelve(self.cache, flag)) 
     315            except Exception: 
     316                return fake_closing({}) 
    305317        elif hasattr(self.cache, "close"): 
    306318            return closing(self.cache) 
     
    309321        else: 
    310322            return fake_closing(self.cache) 
    311          
     323 
    312324from contextlib import contextmanager 
    313325 
     
    12501262""" 
    12511263 
     1264 
    12521265class GeneExpressionAtlasConenction(object): 
    1253     """ A connection to Gene Expression Atlas database. 
    1254     """ 
    1255     DEFAULT_ADDRESS = "http://www.ebi.ac.uk:80/gxa/" 
    1256     try: 
    1257         DEFAULT_CACHE = shelve.open(orngServerFiles.localpath("ArrayExpress", "GeneAtlasCache.shelve")) 
    1258     except Exception, ex: 
    1259         print ex 
    1260         DEFAULT_CACHE = {} 
     1266    """ 
     1267    A connection to Gene Expression Atlas database. 
     1268 
     1269    :param address: 
     1270        Address of the GXA server (default: http://www.ebi.ac.uk/gxa/api/deprecated). 
     1271    :param timeout: 
     1272        Socket timeout (default 30). 
     1273    :param cache: 
     1274        A dict like object to use as a cache. 
     1275 
     1276    """ 
     1277    DEFAULT_ADDRESS = "http://www.ebi.ac.uk/gxa/api/deprecated" 
     1278 
     1279    DEFAULT_CACHE = orngServerFiles.localpath( 
     1280        "ArrayExpress", "GeneAtlasCache.shelve") 
     1281 
    12611282    def __init__(self, address=None, timeout=30, cache=None): 
    1262         """ Initialize the conenction. 
    1263          
    1264         :param address: Address of the server. 
    1265         :param timeout: Socket timeout. 
    1266         :param cache : A dict like object to use as a cache. 
    1267          
     1283        """ 
     1284        Initialize the connection. 
     1285 
    12681286        """ 
    12691287        self.address = address if address is not None else self.DEFAULT_ADDRESS 
    12701288        self.timeout = timeout 
    1271         self.cache = cache if cache is not None else self.DEFAULT_CACHE 
    1272      
     1289        if cache is None: 
     1290            cache = self.DEFAULT_CACHE 
     1291 
     1292        self.cache = cache 
     1293 
    12731294    def query(self, condition, format="json", start=None, rows=None, indent=False): 
    1274         url = self.address + "api/vx?" + condition.rest() 
     1295        url = self.address + "?" + condition.rest() 
    12751296        if start is not None and rows is not None: 
    12761297            url += "&start={0}&rows={1}".format(start, rows) 
     
    12831304        else: 
    12841305            return urllib2.urlopen(url) 
    1285         return response 
    1286      
     1306 
    12871307    def _query_cached(self, url): 
    12881308        if self.cache is not None: 
    1289             if url not in self.cache: 
    1290                 response = urllib2.urlopen(url) 
    1291                 contents = response.read() 
    1292                 self.cache[url] = contents 
    1293                 if hasattr(self.cache, "sync"): 
    1294                     self.cache.sync() 
    1295             return StringIO(self.cache[url]) 
     1309            with self.open_cache("r") as cache: 
     1310                if url in cache: 
     1311                    return StringIO(cache[url]) 
     1312 
     1313            response = urllib2.urlopen(url) 
     1314            contents = response.read() 
     1315            with self.open_cache("w") as cache: 
     1316                cache[url] = contents 
     1317 
     1318            return StringIO(contents) 
    12961319        else: 
    12971320            return urllib2.urlopen(url) 
    1298                  
    1299      
     1321 
     1322    def open_cache(self, flag="r"): 
     1323        """ 
     1324        Return a context manager for a dict like object. 
     1325        """ 
     1326        if isinstance(self.cache, basestring): 
     1327            try: 
     1328                return closing(_open_shelve(self.cache, flag)) 
     1329            except Exception: 
     1330                return fake_closing({}) 
     1331        else: 
     1332            return fake_closing(self.cache) 
     1333 
     1334 
    13001335# Names of all Gene Property filter names 
    13011336GENE_FILTERS = \ 
Note: See TracChangeset for help on using the changeset viewer.