Source code for intermine.idresolution

import weakref
import time

# Use core json for 2.6+, simplejson for <=2.5
try:
    import json
except ImportError:
    import simplejson as json

[docs]def get_json(service, path, key): text = service.opener.read(service.root + path) data = json.loads(text) if data['error'] is not None: raise Exception(data['error']) if key not in data: raise Exception(key + " not returned from " + path) return data[key]
ONE_MINUTE = 60 COMPLETED = set(["SUCCESS", "ERROR"])
[docs]class Job(object): """ A Representation of an Identifier Resolution Job ================================================ Users can submit requests to resolve sets of IDs to objects in the data-store. These jobs begin in a PENDING state, and transition through RUNNING to either SUCCESS or ERROR. Upon completion, the results of the job may be fetched, and the job may be deleted on the server. """ INITIAL_DECAY = 1.25 INITIAL_BACKOFF = 0.05 MAX_BACKOFF = ONE_MINUTE def __init__(self, service, uid): self.service = weakref.proxy(service) self.uid = uid self.status = None self.backoff = Job.INITIAL_BACKOFF self.decay = Job.INITIAL_DECAY self.max_backoff = Job.MAX_BACKOFF if self.uid is None: raise Exception("No uid found")
[docs] def poll(self): """ Check to see if the job has been completed, updating the status of the job in the process. @return: Boolean Whether or not the job is complete. """ if self.status not in COMPLETED: backoff = self.backoff self.backoff = min(self.max_backoff, backoff * self.decay) time.sleep(backoff) self.status = self.fetch_status() return self.status in COMPLETED
[docs] def fetch_status(self): """ Retrieve the results of this completed job from the server. @rtype: dict """ return get_json(self.service, "/ids/{0}/status".format(self.uid), "status")
[docs] def delete(self): """ Delete the job from the server. The job should not be used again once this method has been invoked. """ path = "/ids/" + self.uid response = self.service.opener.delete(self.service.root + path) response_data = json.loads(response) if response_data['error'] is not None: raise Exception(response_data['error'])
[docs] def fetch_results(self): """ Retrieve the current status of this job from the server. @rtype String """ return get_json(self.service, "/ids/{0}/result".format(self.uid), "results")