def test_get_single_id(self): """Tests the retrieval of information for one ID""" # Normal query res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1") assert len(res[0]['result']) == 8196 # Query with limit res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1", options={'limit': 2042}) assert len(res[0]['result']) == 2042 # Query with skip res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1", options={'skip': 3000}) assert len(res[0]['result']) == 5196 # Query with limit and skip res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1", options={'limit': 2000, 'skip': 42}) assert len(res[0]['result']) == 2000
def test_get_single_id(self): """Tests the retrieval of information for one ID""" # Normal query res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1') assert len(res[0]['result']) == 8140 # Query with limit res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1', options={'limit': 2042}) assert len(res[0]['result']) == 2042 # Query with skip res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1', options={'skip': 3000}) assert len(res[0]['result']) == 5140 # Query with limit and skip res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1', options={'limit': 2000, 'skip': 42}) assert len(res[0]['result']) == 2000
def test_url_creation(self): """Tests the correct creation of the url""" # Normal query res = get(session=self._session, host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1', options={'limit': 200}) assert len(res[0]['result']) == 200 # Query with a dict option res = get(session=self._session, host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1', options={ 'limit': 200, 'include': ['chromosome', 'start'] }) assert len(res[0]['result']) == 200
def test_url_creation(self): """Tests the correct creation of the url""" # Normal query res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1', options={'limit': 200}) assert len(res[0]['result']) == 200 # Query with a dict option res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1', options={'limit': 200, 'include': ['chromosome', 'start']}) assert len(res[0]['result']) == 200
def test_get_multiple_ids(self): """Tests the retrieval of information for multiple IDs""" # Normal query with string ids res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR') assert len(res) == 3 assert len(res[0]['result']) == 8140 assert len(res[1]['result']) == 10419 assert len(res[2]['result']) == 4108 # Normal query with list ids res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id=['BRCA1', 'BRCA2', 'LDLR']) assert len(res) == 3 assert len(res[0]['result']) == 8140 assert len(res[1]['result']) == 10419 assert len(res[2]['result']) == 4108 # Query with limit res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR', options={'limit': 8000}) assert len(res) == 3 assert len(res[0]['result']) == 8000 assert len(res[1]['result']) == 8000 assert len(res[2]['result']) == 4108 # Query with skip res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR', options={'skip': 4000}) assert len(res) == 3 assert len(res[0]['result']) == 4140 assert len(res[1]['result']) == 6419 assert len(res[2]['result']) == 108 # Query with limit and skip res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR', options={'limit': 6000, 'skip': 4000}) assert len(res) == 3 assert len(res[0]['result']) == 4140 assert len(res[1]['result']) == 6000 assert len(res[2]['result']) == 108
def test_multiple_threads(self): """Tests the retrieval of information with multiple threads""" # Modifying the number of ids needed for multithreading get.__globals__['_CALL_BATCH_SIZE'] = 2 # Normal query res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR') assert len(res) == 3 assert len(res[0]['result']) == 8140 assert len(res[1]['result']) == 10419 assert len(res[2]['result']) == 4108 # Query with limit res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR', options={'limit': 8000}) assert len(res) == 3 assert len(res[0]['result']) == 8000 assert len(res[1]['result']) == 8000 assert len(res[2]['result']) == 4108 # Query with skip res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR', options={'skip': 4000}) assert len(res) == 3 assert len(res[0]['result']) == 4140 assert len(res[1]['result']) == 6419 assert len(res[2]['result']) == 108 # Query with limit and skip res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR', options={'limit': 6000, 'skip': 4000}) assert len(res) == 3 assert len(res[0]['result']) == 4140 assert len(res[1]['result']) == 6000 assert len(res[2]['result']) == 108
def test_multiple_threads(self): # Modifying the number of ids needed for multithreading get.__globals__['_CALL_BATCH_SIZE'] = 2 # Normal query res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1,BRCA2,LDLR") assert len(res) == 3 assert len(res[0]['result']) == 8196 assert len(res[1]['result']) == 10519 assert len(res[2]['result']) == 4113 # Query with limit res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1,BRCA2,LDLR", options={'limit': 8000}) assert len(res) == 3 assert len(res[0]['result']) == 8000 assert len(res[1]['result']) == 8000 assert len(res[2]['result']) == 4113 # Query with skip res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1,BRCA2,LDLR", options={'skip': 4000}) assert len(res) == 3 assert len(res[0]['result']) == 4196 assert len(res[1]['result']) == 6519 assert len(res[2]['result']) == 113 # Query with limit and skip res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1,BRCA2,LDLR", options={'limit': 6000, 'skip': 4000}) assert len(res) == 3 assert len(res[0]['result']) == 4196 assert len(res[1]['result']) == 6000 assert len(res[2]['result']) == 113
def get_help(self, method_name=None, show_params=False, **options): # Getting swagger documentation response = get(session=self._session, host=self._configuration.host, version='swagger.json', species=None, category=None, subcategory=None, resource=None, options=options) sys.stdout.write(self.__class__.__name__ + '\n') # Getting class methods methods = [ func for func in dir(self) if callable(getattr(self, func)) and not func.startswith('_') ] text = '{indent}{bullet} {name}: {desc}\n' for method in methods: if method_name is not None and method_name != method: continue # Getting method info method_swag = (method[4:] if method.startswith('get_') else method) path_info = [ response['paths'][path] for path in response['paths'] if self._category in path and self._subcategory in path and method_swag in path ] if not path_info: continue if 'summary' not in path_info[0]['get']: continue desc = path_info[0]['get']['summary'] desc = desc.replace('http://bioinfo.hpc.cam.ac.uk/cellbase', self._configuration.host) sys.stdout.write( text.format(indent=' ' * 4, bullet='-', name=method, desc=desc)) # Getting method parameters if not show_params: continue for param in path_info[0]['get']['parameters']: if param['name'] in ['version', 'species', 'Output format']: continue desc = param['description'] if 'description' in param else '-' desc = desc.replace('http://bioinfo.hpc.cam.ac.uk/cellbase', self._configuration.host) sys.stdout.write( text.format(indent=' ' * 8, bullet='*', name=param['name'], desc=desc))
def test_get_multiple_ids(self): """Tests the retrieval of information for multiple ID""" # Normal query res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1,BRCA2,LDLR") assert len(res) == 3 assert len(res[0]['result']) == 8196 assert len(res[1]['result']) == 10519 assert len(res[2]['result']) == 4113 # Query with limit res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1,BRCA2,LDLR", options={'limit': 8000}) assert len(res) == 3 assert len(res[0]['result']) == 8000 assert len(res[1]['result']) == 8000 assert len(res[2]['result']) == 4113 # Query with skip res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1,BRCA2,LDLR", options={'skip': 4000}) assert len(res) == 3 assert len(res[0]['result']) == 4196 assert len(res[1]['result']) == 6519 assert len(res[2]['result']) == 113 # Query with limit and skip res = get(host=self._host, port=self._port, version=self._version, species=self._species, category="feature", subcategory="gene", resource="snp", query_id="BRCA1,BRCA2,LDLR", options={'limit': 6000, 'skip': 4000}) assert len(res) == 3 assert len(res[0]['result']) == 4196 assert len(res[1]['result']) == 6000 assert len(res[2]['result']) == 113
def test_get_multiple_ids_with_list_ids(self): """Normal query with list ids""" res = get(session=self._session, host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id=['BRCA1', 'BRCA2', 'LDLR']) self.check_counts(res)
def get(self, category, subcategory, resource, query_id=None, **options): """Creates the URL for querying the REST service""" response = get(host=self._configuration.host, version=self._configuration.version, species=self._configuration.species, category=category, subcategory=subcategory, query_id=query_id, resource=resource, options=options) return response
def _get(self, resource, query_id=None, options=None): """Queries the REST service and returns the result""" response = get(session=self._session, host=self._configuration.host, version=self._configuration.version, species=self._configuration.species, category=self._category, subcategory=self._subcategory, query_id=query_id, resource=resource, options=options) return response
def _get(self, resource, query_id=None, options=None): """Queries the REST service and returns the result""" response = get(host=self._configuration.host, version=self._configuration.version, species=self._configuration.species, category=self._category, subcategory=self._subcategory, query_id=query_id, resource=resource, options=options) return response
def get_versions(self, **options): # This particular REST endpoint follows the structure # /{version}/meta/{species}/versions """Returns source version metadata, including source urls""" response = get(session=self._session, host=self._configuration.host, version=self._configuration.version, species=None, category=self._category, subcategory=self._configuration.species, resource='versions', options=options) return response
def get_feature_type(self, **options): """Returns list of available regulatory feature types""" # This particular REST endpoint follows the structure # /{version}/{species}/regulatory/featureType response = get(session=self._session, host=self._configuration.host, version=self._configuration.version, species=self._configuration.species, category=self._category, subcategory=None, resource='featureType', options=options) return response
def get_info(self, **options): """Returns general information""" # This particular REST endpoint follows the structure # /{version}/{species}/info response = get(session=self._session, host=self._configuration.host, version=self._configuration.version, species=self._configuration.species, category=None, subcategory=None, resource='info', options=options) return response
def about(self, **options): # This particular REST endpoint follows the structure # /{version}/meta/about """Returns info about CellBase code""" response = get(session=self._session, host=self._configuration.host, version=self._configuration.version, species=None, category=self._category, subcategory=None, resource='about', options=options) return response
def search(self, **options): """Returns regulatory elements""" # This particular REST endpoint follows the structure # /{version}/{species}/regulatory/search response = get(session=self._session, host=self._configuration.host, version=self._configuration.version, species=self._configuration.species, category=self._category, subcategory=None, resource='search', options=options) return response
def ping(self, **options): """Checks if service is alive""" # This particular REST endpoint follows the structure # /{version}/meta/ping response = get(session=self._session, host=self._configuration.host, version=self._configuration.version, species=None, category=self._category, subcategory=None, resource='ping', options=options) return response
def get_species(self, **options): """Returns available species""" # This particular REST endpoint follows the structure # /{version}/meta/species response = get(session=self._session, host=self._configuration.host, version=self._configuration.version, species=None, category=self._category, subcategory=None, resource='species', options=options) return response
def test_get_multiple_ids(self): """Tests the retrieval of information for multiple IDs""" # Normal query with string ids res = get(session=self._session, host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR') self.check_counts(res)
def get_help(self, method_name=None, show_params=False, **options): # Getting swagger documentation response = get(session=self._session, host=self._configuration.host, version='swagger.json', species=None, category=None, subcategory=None, resource=None, options=options) sys.stdout.write(self.__class__.__name__ + '\n') # Getting class methods methods = [ func for func in dir(self) if callable(getattr(self, func)) and not func.startswith('_') ] text = '{indent}{bullet} {name}: {desc}\n' for method in methods: if method_name is not None and method_name != method: continue # Getting method info method_swag = (method[4:] if method.startswith('get_') else method) path_info = [response['paths'][path] for path in response['paths'] if self._category in path and method_swag in path] if not path_info: continue desc = path_info[0]['get']['summary'] desc = desc.replace('http://bioinfo.hpc.cam.ac.uk/cellbase', self._configuration.host) sys.stdout.write(text.format(indent=' ' * 4, bullet='-', name=method, desc=desc)) # Getting method parameters if not show_params: continue for param in path_info[0]['get']['parameters']: if param['name'] in ['version', 'species', 'Output format']: continue desc = param['description'] desc = desc.replace('http://bioinfo.hpc.cam.ac.uk/cellbase', self._configuration.host) sys.stdout.write(text.format(indent=' ' * 8, bullet='*', name=param['name'], desc=desc))
def test_duplicated_ids(self): """Tests the retrieval of information for duplicated IDs""" # Modifying the number of ids needed for multithreading get.__globals__['_CALL_BATCH_SIZE'] = 5 # Normal query n = 10 # Number of duplications res = get(host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id=','.join(['LDLR']*n)) assert len(res) == n # Checking that every response has the same number of results for i, r in enumerate(res): assert len(r['result']) == 4108
def test_multiple_threads_with_skip(self): """Tests the retrieval of information with multiple threads with skip""" res = get(session=self._session, host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR', options={'skip': 4000}) assert len(res) == 3 assert len(res[0]['result']) == 4152 assert len(res[1]['result']) == 6419 assert len(res[2]['result']) == 108
def test_get_multiple_ids_with_list_ids(self): """Query with skip""" res = get(session=self._session, host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR', options={'skip': 4000}) assert len(res) == 3 assert len(res[0]['result']) == 4152 assert len(res[1]['result']) == 6419 assert len(res[2]['result']) == 108
def test_multiple_threads(self): """Tests the retrieval of information with multiple threads""" # Modifying the number of ids needed for multithreading get.__globals__['_CALL_BATCH_SIZE'] = 2 # Normal query res = get(session=self._session, host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR') self.check_counts(res)
def test_multiple_threads_with_limit(self): """Tests the retrieval of information with multiple threads with limit""" # Query with limit res = get(session=self._session, host=self._host, version=self._version, species=self._species, category='feature', subcategory='gene', resource='snp', query_id='BRCA1,BRCA2,LDLR', options={'limit': 8000}) assert len(res) == 3 assert len(res[0]['result']) == 8000 assert len(res[1]['result']) == 8000 assert len(res[2]['result']) == 4108
def get_category(self, query_id, **options): # This particular REST endpoint follows the structure # /{version}/meta/{category} """Returns source version metadata, including source urls""" categories = ['feature', 'genomic', 'network', 'regulatory'] if query_id not in categories: msg = 'Query has to be one of the following: ' + str(categories) raise ValueError(msg) response = get(session=self._session, host=self._configuration.host, version=self._configuration.version, species=None, category=self._category, subcategory=None, resource=query_id, options=options) return response