diff --git a/Dockerfile b/Dockerfile index 397532f..98fc6e8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,11 +16,11 @@ RUN pip3 --no-cache-dir install -r requirements.txt # the mariadb plugin directory seems to be misconfigured # bei default. In order to work properly we manually adjust # the path. -ENV MARIADB_PLUGIN_DIR /usr/lib/mariadb/plugin +ENV MARIADB_PLUGIN_DIR=/usr/lib/mariadb/plugin # EXPOSE 5000 # CMD ["python3", "server.py"] #run the command to start uWSGI -CMD ["uwsgi", "app.ini"] +CMD ["gunicorn", "-k", "uvicorn.workers.UvicornWorker", "-b", "0.0.0.0:5000", "-w", "4", "server:connex_app"] diff --git a/TestCases/test_ceRNAInteraction_findAll.py b/TestCases/test_ceRNAInteraction_findAll.py index 8cefbfd..fa32534 100644 --- a/TestCases/test_ceRNAInteraction_findAll.py +++ b/TestCases/test_ceRNAInteraction_findAll.py @@ -1,5 +1,7 @@ from config import * -import models, geneInteraction, unittest +import models, unittest +with app.app_context(): + import geneInteraction from flask import abort import sqlalchemy as sa from werkzeug.exceptions import HTTPException @@ -41,9 +43,10 @@ def test_read_all_genes(disease_name=None, ensg_number=None, gene_symbol=None, g queries_2 = [] # if specific disease_name is given: if disease_name is not None: - run = models.SpongeRun.query.join(models.Dataset, models.Dataset.dataset_ID == models.SpongeRun.dataset_ID) \ - .filter(models.Dataset.disease_name.like("%" + disease_name + "%")) \ - .all() + with app.app_context(): + run = models.SpongeRun.query.join(models.Dataset, models.Dataset.dataset_ID == models.SpongeRun.dataset_ID) \ + .filter(models.Dataset.disease_name.like("%" + disease_name + "%")) \ + .all() if len(run) > 0: run_IDs = [i.sponge_run_ID for i in run] @@ -143,7 +146,7 @@ def test_read_all_genes(disease_name=None, ensg_number=None, gene_symbol=None, g else: # Serialize the data for the response depending on parameter all schema = models.GeneInteractionDatasetShortSchema(many=True) - return schema.dump(interaction_result).data + return schema.dump(interaction_result) else: abort(404, "No information with given parameters found") @@ -153,66 +156,51 @@ def test_read_all_genes(disease_name=None, ensg_number=None, gene_symbol=None, g class TestDataset(unittest.TestCase): - def test_abort_error_disease(self): + def setUp(self): app.config["TESTING"] = True self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + def tearDown(self): + self.app_context.pop() + + def test_abort_error_disease(self): with self.assertRaises(HTTPException) as http_error: # retrieve current API response to request self.assertEqual(geneInteraction.read_all_genes(disease_name="foobar", pValue = None), 404) def test_abort_error_limit(self): - app.config["TESTING"] = True - self.app = app.test_client() - with self.assertRaises(HTTPException) as http_error: # retrieve current API response to request self.assertEqual(geneInteraction.read_all_genes(disease_name="foobar", limit = 20000, pValue = None), 404) def test_abort_error_ensg(self): - app.config["TESTING"] = True - self.app = app.test_client() - with self.assertRaises(HTTPException) as http_error: # retrieve current API response to request self.assertEqual(geneInteraction.read_all_genes(ensg_number=["ENSGfoobar"], pValue = None), 404) def test_abort_error_gene_symbol(self): - app.config["TESTING"] = True - self.app = app.test_client() - with self.assertRaises(HTTPException) as http_error: # retrieve current API response to request self.assertEqual(geneInteraction.read_all_genes(gene_symbol=["foobar"], pValue = None), 404) def test_abort_error_ensg_and_gene_symbol(self): - app.config["TESTING"] = True - self.app = app.test_client() - with self.assertRaises(HTTPException) as http_error: # retrieve current API response to request self.assertEqual(geneInteraction.read_all_genes(ensg_number=["ENSGfoobar"],gene_symbol=["foobar"], pValue = None), 404) def test_abort_error_gene_type(self): - app.config["TESTING"] = True - self.app = app.test_client() - with self.assertRaises(HTTPException) as http_error: # retrieve current API response to request self.assertEqual(geneInteraction.read_all_genes(gene_type="foobar", pValue = None), 404) def test_abort_error_no_data(self): - app.config["TESTING"] = True - self.app = app.test_client() - with self.assertRaises(HTTPException) as http_error: # retrieve current API response to request self.assertEqual(geneInteraction.read_all_genes(disease_name="bladder urothelial carcinoma", ensg_number=['ENSG00000023041'], pValue = None), 404) def test_findAll_disease_and_ensg(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', ensg_number=['ENSG00000172137','ENSG00000078237'], limit=50, pValue = None) @@ -223,9 +211,6 @@ def test_findAll_disease_and_ensg(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_gene_symbol(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', gene_symbol=['CALB2','TIGAR'], limit=50, pValue = None) @@ -236,9 +221,6 @@ def test_findAll_disease_and_gene_symbol(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_ensg_pValue_smaller(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', ensg_number=['ENSG00000172137', 'ENSG00000078237'], limit=50, pValue=0.5, pValueDirection="<", sorting="pValue") @@ -251,9 +233,6 @@ def test_findAll_disease_and_ensg_pValue_smaller(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_ensg_pValue_greater(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', ensg_number=['ENSG00000172137', 'ENSG00000078237'], limit=50, pValue=0.5, pValueDirection=">", sorting="pValue") @@ -266,9 +245,6 @@ def test_findAll_disease_and_ensg_pValue_greater(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_gene_symbol_pValue_smaller(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', gene_symbol=['CALB2', 'TIGAR'], limit=50, pValue=0.5, pValueDirection="<", sorting="pValue") @@ -281,9 +257,6 @@ def test_findAll_disease_and_gene_symbol_pValue_smaller(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_gene_symbol_pValue_greater(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', gene_symbol=['CALB2', 'TIGAR'], limit=50, pValue=0.5, pValueDirection=">", sorting="pValue") @@ -297,9 +270,6 @@ def test_findAll_disease_and_gene_symbol_pValue_greater(self): def test_findAll_disease_and_ensg_correlation_smaller(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', ensg_number=['ENSG00000172137', 'ENSG00000078237'], limit=50, correlation=0.2, correlationDirection="<", sorting="correlation", pValue = None) @@ -312,9 +282,6 @@ def test_findAll_disease_and_ensg_correlation_smaller(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_ensg_correlation_greater(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', ensg_number=['ENSG00000172137', 'ENSG00000078237'], limit=50, correlation=0.1, correlationDirection=">", sorting="correlation", pValue = None) @@ -327,9 +294,6 @@ def test_findAll_disease_and_ensg_correlation_greater(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_gene_symbol_correlation_smaller(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', gene_symbol=['CALB2', 'TIGAR'], limit=50, correlation=0.2, correlationDirection="<", sorting="correlation",pValue = None) @@ -342,9 +306,6 @@ def test_findAll_disease_and_gene_symbol_correlation_smaller(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_gene_symbol_correlation_greater(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', gene_symbol=['CALB2', 'TIGAR'], limit=50, correlation=0.1, correlationDirection=">", sorting="correlation",pValue = None) @@ -358,9 +319,6 @@ def test_findAll_disease_and_gene_symbol_correlation_greater(self): def test_findAll_disease_and_ensg_mscor_smaller(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', ensg_number=['ENSG00000172137', 'ENSG00000078237'], limit=50, mscor=0.02, mscorDirection="<", sorting="mscor",pValue = None) @@ -373,9 +331,6 @@ def test_findAll_disease_and_ensg_mscor_smaller(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_ensg_mscor_greater(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', ensg_number=['ENSG00000172137', 'ENSG00000078237'], limit=50, mscor=0.01, mscorDirection=">", sorting="mscor", pValue = None) @@ -388,9 +343,6 @@ def test_findAll_disease_and_ensg_mscor_greater(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_gene_symbol_mscor_smaller(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', gene_symbol=['CALB2', 'TIGAR'], limit=50, mscor=0.02, mscorDirection="<", sorting="mscor", pValue = None) @@ -403,9 +355,6 @@ def test_findAll_disease_and_gene_symbol_mscor_smaller(self): self.assertEqual(mock_response, api_response) def test_findAll_disease_and_gene_symbol_mscor_greater(self): - app.config["TESTING"] = True - self.app = app.test_client() - # retrieve correct database response to request mock_response = test_read_all_genes(disease_name='bladder urothelial carcinoma', gene_symbol=['CALB2', 'TIGAR'], limit=50, mscor=0.01, mscorDirection=">", sorting="mscor", pValue = None) diff --git a/TestCases/test_ceRNAInteraction_findSpecific.py b/TestCases/test_ceRNAInteraction_findSpecific.py index efadfd8..7cb9290 100644 --- a/TestCases/test_ceRNAInteraction_findSpecific.py +++ b/TestCases/test_ceRNAInteraction_findSpecific.py @@ -1,5 +1,7 @@ from config import * -import models, geneInteraction, unittest +import models, unittest +with app.app_context(): + import geneInteraction from flask import abort import sqlalchemy as sa from werkzeug.exceptions import HTTPException @@ -74,7 +76,7 @@ def test_read_specific_interaction(disease_name=None, ensg_number=None, gene_sym if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all - return models.GeneInteractionDatasetShortSchema(many=True).dump(interaction_result).data + return models.GeneInteractionDatasetShortSchema(many=True).dump(interaction_result) else: abort(404, "No information with given parameters found") @@ -84,6 +86,16 @@ def test_read_specific_interaction(disease_name=None, ensg_number=None, gene_sym ######################################################################################################################## class TestDataset(unittest.TestCase): + + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_abort_error_disease(self): app.config["TESTING"] = True self.app = app.test_client() diff --git a/TestCases/test_findceRNA.py b/TestCases/test_findceRNA.py index 9788393..548eb3c 100644 --- a/TestCases/test_findceRNA.py +++ b/TestCases/test_findceRNA.py @@ -1,11 +1,13 @@ from config import * -import models, geneInteraction, unittest +import models, unittest +with app.app_context(): + import geneInteraction from flask import abort from werkzeug.exceptions import HTTPException def test_read_all_gene_network_analysis(disease_name=None, ensg_number=None, gene_symbol=None, gene_type=None, minBetweenness=None, minNodeDegree=None, minEigenvector=None, - sorting=None, descending=True, limit=100, offset=0): + sorting=None, descending=True, limit=100, offset=0, db_version=2): """ This function responds to a request for /sponge/findceRNA and returns all interactions the given identification (ensg_number or gene_symbol) in all available datasets is in involved and satisfies the given filters @@ -21,6 +23,7 @@ def test_read_all_gene_network_analysis(disease_name=None, ensg_number=None, gen :param limit: number of results that shouls be shown :param offset: startpoint from where results should be shown :return: all ceRNAInteractions in the dataset of interest that satisfy the given filters + :db_version: database version """ # test limit @@ -76,6 +79,8 @@ def test_read_all_gene_network_analysis(disease_name=None, ensg_number=None, gen queries.append(models.networkAnalysis.eigenvector > minEigenvector) if gene_type is not None: queries.append(models.Gene.gene_type == gene_type) + if db_version is not None: + queries.append(models.Dataset.version == db_version) # add all sorting if given: sort = [models.networkAnalysis.sponge_run_ID] @@ -105,7 +110,7 @@ def test_read_all_gene_network_analysis(disease_name=None, ensg_number=None, gen if len(result) > 0: schema = models.networkAnalysisSchema(many=True) - return schema.dump(result).data + return schema.dump(result) else: abort(404, "Not data found that satisfies the given filters") @@ -114,6 +119,16 @@ def test_read_all_gene_network_analysis(disease_name=None, ensg_number=None, gen ######################################################################################################################## class TestDataset(unittest.TestCase): + + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_abort_error_disease(self): app.config["TESTING"] = True self.app = app.test_client() @@ -151,7 +166,7 @@ def test_findceRNA_disease_and_type(self): self.app = app.test_client() # retrieve correct database response to request - mock_response = test_read_all_gene_network_analysis(disease_name='bladder urothelial carcinoma', gene_type='protein_coding', limit=50) + mock_response = test_read_all_gene_network_analysis(disease_name='bladder urothelial carcinoma', gene_type='protein_coding', limit=50, db_version=1) # retrieve current API response to request api_response = geneInteraction.read_all_gene_network_analysis(disease_name='bladder urothelial carcinoma', diff --git a/TestCases/test_getDataset.py b/TestCases/test_getDataset.py index 12cdd45..f35eba6 100644 --- a/TestCases/test_getDataset.py +++ b/TestCases/test_getDataset.py @@ -1,5 +1,7 @@ from config import * -import models, dataset, unittest +import models, unittest +with app.app_context(): + import dataset from flask import abort from werkzeug.exceptions import HTTPException @@ -25,7 +27,7 @@ def test_read(disease_name=None): # Did we find a dataset? if len(data) > 0: # Serialize the data for the response - return models.DatasetSchema(many=True).dump(data).data + return models.DatasetSchema(many=True).dump(data) else: abort(404, 'No data found for name: {disease_name}'.format(disease_name=disease_name)) @@ -35,6 +37,15 @@ def test_read(disease_name=None): class TestDataset(unittest.TestCase): + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_get_dataset_information_all(self): app.config["TESTING"] = True self.app = app.test_client() diff --git a/TestCases/test_getGeneExpression.py b/TestCases/test_getGeneExpression.py index 047a0a6..828c9f5 100644 --- a/TestCases/test_getGeneExpression.py +++ b/TestCases/test_getGeneExpression.py @@ -1,13 +1,16 @@ from config import * -import models, expressionValues, unittest +import models, unittest +with app.app_context(): + import expressionValues from flask import abort from werkzeug.exceptions import HTTPException -def test_get_gene_expr(disease_name=None, ensg_number=None, gene_symbol=None): +def test_get_gene_expr(disease_name=None, ensg_number=None, gene_symbol=None, db_version=2): """ :param disease_name: disease_name of interest :param ensg_number: esng number of the gene of interest :param gene_symbol: gene symbol of the gene of interest + :param db_version: database version :return: all expression values for the genes of interest """ @@ -42,6 +45,7 @@ def test_get_gene_expr(disease_name=None, ensg_number=None, gene_symbol=None): if disease_name is not None: dataset = models.Dataset.query \ .filter(models.Dataset.disease_name.like("%" + disease_name + "%")) \ + .filter(models.Dataset.version == db_version) \ .all() if len(dataset) > 0: @@ -55,7 +59,7 @@ def test_get_gene_expr(disease_name=None, ensg_number=None, gene_symbol=None): .all() if len(result) > 0: - return models.geneExpressionSchema(many=True).dump(result).data + return models.geneExpressionSchema(many=True).dump(result) else: abort(404, "No data found.") @@ -65,6 +69,15 @@ def test_get_gene_expr(disease_name=None, ensg_number=None, gene_symbol=None): class TestDataset(unittest.TestCase): + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_abort_error_disease(self): app.config["TESTING"] = True self.app = app.test_client() diff --git a/TestCases/test_getRunInformation.py b/TestCases/test_getRunInformation.py index 080802e..e666fe5 100644 --- a/TestCases/test_getRunInformation.py +++ b/TestCases/test_getRunInformation.py @@ -1,5 +1,7 @@ from config import * -import models, dataset, unittest +import models, unittest +with app.app_context(): + import dataset from flask import abort from werkzeug.exceptions import HTTPException @@ -19,7 +21,7 @@ def test_read_runInformation(disease_name=None): if len(data) > 0: # Serialize the data for the response - return models.SpongeRunSchema(many=True).dump(data).data + return models.SpongeRunSchema(many=True).dump(data) else: abort(404, 'No data found for name: {disease_name}'.format(disease_name=disease_name)) @@ -29,6 +31,15 @@ def test_read_runInformation(disease_name=None): class TestDataset(unittest.TestCase): + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_get_dataset_information(self): app.config["TESTING"] = True self.app = app.test_client() @@ -37,7 +48,7 @@ def test_get_dataset_information(self): mock_response = test_read_runInformation(disease_name="breast invasive carcinoma") # retrieve current API response to request - api_response = dataset.read_runInformation(disease_name="breast invasive carcinoma") + api_response = dataset.read_spongeRunInformation(disease_name="breast invasive carcinoma") # assert that the two output the same self.assertEqual(mock_response, api_response) @@ -49,4 +60,4 @@ def test_get_dataset_infomration_404(self): with self.assertRaises(HTTPException) as http_error: # retrieve current API response to request - self.assertEqual(dataset.read_runInformation(disease_name="foobar"), 404) \ No newline at end of file + self.assertEqual(dataset.read_spongeRunInformation(disease_name="foobar"), 404) \ No newline at end of file diff --git a/TestCases/test_getmiRNAExpression.py b/TestCases/test_getmiRNAExpression.py index e2f4921..4ff3c6e 100644 --- a/TestCases/test_getmiRNAExpression.py +++ b/TestCases/test_getmiRNAExpression.py @@ -1,5 +1,7 @@ from config import * -import models, expressionValues, unittest +import models, unittest +with app.app_context(): + import expressionValues from flask import abort from werkzeug.exceptions import HTTPException @@ -55,7 +57,7 @@ def test_get_mirna_expr(disease_name=None, mimat_number=None, hs_number=None): .all() if len(result) > 0: - return models.miRNAExpressionSchema(many=True).dump(result).data + return models.miRNAExpressionSchema(many=True).dump(result) else: abort(404, "No data found.") @@ -65,6 +67,15 @@ def test_get_mirna_expr(disease_name=None, mimat_number=None, hs_number=None): class TestDataset(unittest.TestCase): + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_abort_error_disease(self): app.config["TESTING"] = True self.app = app.test_client() diff --git a/TestCases/test_miRNAInteraction_findceRNA.py b/TestCases/test_miRNAInteraction_findceRNA.py index fd4d3f9..f33d03e 100644 --- a/TestCases/test_miRNAInteraction_findceRNA.py +++ b/TestCases/test_miRNAInteraction_findceRNA.py @@ -1,7 +1,10 @@ from config import * -import models, geneInteraction, unittest +import models, unittest +with app.app_context(): + import geneInteraction from flask import abort import sqlalchemy as sa +from sqlalchemy.sql import text from werkzeug.exceptions import HTTPException def test_read_mirna_for_specific_interaction(disease_name=None, ensg_number=None, gene_symbol=None, between=False): @@ -71,12 +74,10 @@ def test_read_mirna_for_specific_interaction(disease_name=None, ensg_number=None session = Session() # test for each dataset if the gene(s) of interest are included in the ceRNA network - print() - - mirna_filter = session.execute("select mirna_ID from interacting_miRNAs where run_ID IN ( " + mirna_filter = session.execute(text("select mirna_ID from interactions_genemirna where sponge_run_ID IN ( " + ','.join(str(e) for e in run_IDs) + ") and gene_ID IN ( " + ','.join(str(e) for e in gene_IDs) - + ") group by mirna_ID HAVING count(mirna_ID) >= 2;").fetchall() + + ") group by mirna_ID HAVING count(mirna_ID) >= 2;")).fetchall() session.close() some_engine.dispose() @@ -97,7 +98,7 @@ def test_read_mirna_for_specific_interaction(disease_name=None, ensg_number=None if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all - return models.miRNAInteractionSchema(many=True).dump(interaction_result).data + return models.miRNAInteractionSchema(many=True).dump(interaction_result) else: abort(404, "No data found with input parameter") @@ -108,6 +109,15 @@ def test_read_mirna_for_specific_interaction(disease_name=None, ensg_number=None class TestDataset(unittest.TestCase): + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_abort_error_disease(self): app.config["TESTING"] = True self.app = app.test_client() diff --git a/TestCases/test_miRNAInteraction_getOccurences.py b/TestCases/test_miRNAInteraction_getOccurences.py index e93c338..d5fcb9e 100644 --- a/TestCases/test_miRNAInteraction_getOccurences.py +++ b/TestCases/test_miRNAInteraction_getOccurences.py @@ -1,11 +1,13 @@ from config import * -import models, geneInteraction, unittest +import models, unittest +with app.app_context(): + import geneInteraction from flask import abort from sqlalchemy import desc from werkzeug.exceptions import HTTPException def test_read_all_mirna(disease_name=None, mimat_number=None, hs_number=None, occurences=None, sorting=None, descending=None, - limit=15000, offset=0): + limit=15000, offset=0, db_version=2): """ :param disease_name: disease_name of interest :param mimat_number: comma-separated list of mimat_id(s) of miRNA of interest @@ -57,6 +59,10 @@ def test_read_all_mirna(disease_name=None, mimat_number=None, hs_number=None, oc queries.append(models.OccurencesMiRNA.sponge_run_ID.in_(run_IDs)) else: abort(404, "No dataset with given disease_name found") + + # database version + if db_version is not None: + queries.append(models.Dataset.version == db_version) if occurences is not None: queries.append(models.OccurencesMiRNA.occurences > occurences) @@ -77,7 +83,7 @@ def test_read_all_mirna(disease_name=None, mimat_number=None, hs_number=None, oc if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all - return models.occurencesMiRNASchema(many=True).dump(interaction_result).data + return models.occurencesMiRNASchema(many=True).dump(interaction_result) else: abort(404, "No information with given parameters found") @@ -87,6 +93,15 @@ def test_read_all_mirna(disease_name=None, mimat_number=None, hs_number=None, oc class TestDataset(unittest.TestCase): + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_abort_error_disease(self): app.config["TESTING"] = True self.app = app.test_client() @@ -134,7 +149,7 @@ def test_abort_error_no_data(self): with self.assertRaises(HTTPException) as http_error: # retrieve current API response to request - self.assertEqual(geneInteraction.read_all_mirna(disease_name="head and neck squamous cell carcinoma", mimat_number=['MIMAT0004482']), 404) + self.assertEqual(geneInteraction.read_all_mirna(disease_name="head and neck squamous cell carcinoma", mimat_number=['MIMAT0004482'], db_version=1), 404) def test_miRNA_Interaction_getOccurences_disease_and_mimat_number(self): app.config["TESTING"] = True diff --git a/TestCases/test_stringSearch.py b/TestCases/test_stringSearch.py index 6a56443..6de3a41 100644 --- a/TestCases/test_stringSearch.py +++ b/TestCases/test_stringSearch.py @@ -1,6 +1,8 @@ from config import * from werkzeug.exceptions import HTTPException -import models, externalInformation, unittest +import models, unittest +with app.app_context(): + import externalInformation from flask import abort def test_getAutocomplete(searchString): @@ -16,7 +18,7 @@ def test_getAutocomplete(searchString): .all() print(data) if len(data) > 0: - return models.GeneSchemaENSG(many=True).dump(data).data + return models.GeneSchemaENSG(many=True).dump(data) else: abort(404, "No ensg number found for the given String") elif searchString.startswith("HSA") or searchString.startswith("hsa"): @@ -24,7 +26,7 @@ def test_getAutocomplete(searchString): .filter(models.miRNA.hs_nr.ilike(searchString + "%")) \ .all() if len(data) > 0: - return models.miRNASchemaHS(many=True).dump(data).data + return models.miRNASchemaHS(many=True).dump(data) else: abort(404, "No hsa number found for the given String") elif searchString.startswith("MIMAT") or searchString.startswith("mimat"): @@ -32,7 +34,7 @@ def test_getAutocomplete(searchString): .filter(models.miRNA.mir_ID.ilike(searchString + "%")) \ .all() if len(data) > 0: - return models.miRNASchemaMimat(many=True).dump(data).data + return models.miRNASchemaMimat(many=True).dump(data) else: abort(404, "No mimat number found for the given String") else: @@ -40,7 +42,7 @@ def test_getAutocomplete(searchString): .filter(models.Gene.gene_symbol.ilike(searchString + "%")) \ .all() if len(data) > 0: - return models.GeneSchemaSymbol(many=True).dump(data).data + return models.GeneSchemaSymbol(many=True).dump(data) else: abort(404, "No gene symbol found for the given String") @@ -50,6 +52,15 @@ def test_getAutocomplete(searchString): class TestDataset(unittest.TestCase): + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_abort_error_no_ensg(self): app.config["TESTING"] = True self.app = app.test_client() diff --git a/TestCases/test_survivalAnalysis_getPValue.py b/TestCases/test_survivalAnalysis_getPValue.py index a229d69..d3dcc77 100644 --- a/TestCases/test_survivalAnalysis_getPValue.py +++ b/TestCases/test_survivalAnalysis_getPValue.py @@ -1,6 +1,8 @@ from config import * from werkzeug.exceptions import HTTPException -import models, survivalAnalysis, unittest +import models, unittest +with app.app_context(): + import survivalAnalysis from flask import abort def test_get_survival_pValue(disease_name, ensg_number = None, gene_symbol = None): @@ -54,7 +56,7 @@ def test_get_survival_pValue(disease_name, ensg_number = None, gene_symbol = Non .all() if len(result) > 0: - return models.SurvivalPValueSchema(many=True).dump(result).data + return models.SurvivalPValueSchema(many=True).dump(result) else: abort(404, "No data found.") @@ -64,6 +66,15 @@ def test_get_survival_pValue(disease_name, ensg_number = None, gene_symbol = Non class TestDataset(unittest.TestCase): + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_abort_error_disease(self): app.config["TESTING"] = True self.app = app.test_client() @@ -102,7 +113,7 @@ def test_abort_error_no_data(self): with self.assertRaises(HTTPException) as http_error: # retrieve current API response to request - self.assertEqual(survivalAnalysis.get_survival_pValue(disease_name="bladder urothelial carcinoma", ensg_number=['ENSG00000023041']), 404) + self.assertEqual(survivalAnalysis.get_survival_pValue(disease_name="bladder urothelial carcinoma", ensg_number=['ENSG00000023041'], db_version=1), 404) def test_surivalAnalysis_getPValue_disease_and_ensg(self): app.config["TESTING"] = True diff --git a/TestCases/test_survivalAnalysis_sampleInformation.py b/TestCases/test_survivalAnalysis_sampleInformation.py index d34ddd0..ec935c1 100644 --- a/TestCases/test_survivalAnalysis_sampleInformation.py +++ b/TestCases/test_survivalAnalysis_sampleInformation.py @@ -1,6 +1,8 @@ from config import * from werkzeug.exceptions import HTTPException -import models, survivalAnalysis, unittest +import models, unittest +with app.app_context(): + import survivalAnalysis from flask import abort def test_get_patient_information(disease_name=None, sample_ID=None): @@ -11,6 +13,7 @@ def test_get_patient_information(disease_name=None, sample_ID=None): """ # if specific disease_name is given: + queries = [] if disease_name is not None: dataset = models.Dataset.query \ .filter(models.Dataset.disease_name.like("%" + disease_name + "%")) \ @@ -23,14 +26,14 @@ def test_get_patient_information(disease_name=None, sample_ID=None): abort(404, "No dataset with given disease_name found") if (sample_ID is not None): - queries = [models.PatientInformation.sample_ID.in_(sample_ID)] + queries.append(models.PatientInformation.sample_ID.in_(sample_ID)) result = models.PatientInformation.query \ .filter(*queries) \ .all() if len(result) > 0: - return models.PatientInformationSchema(many=True).dump(result).data + return models.PatientInformationSchema(many=True).dump(result) else: abort(404, "No data found.") @@ -41,6 +44,15 @@ def test_get_patient_information(disease_name=None, sample_ID=None): class TestDataset(unittest.TestCase): + def setUp(self): + app.config["TESTING"] = True + self.app = app.test_client() + self.app_context = app.app_context() + self.app_context.push() + + def tearDown(self): + self.app_context.pop() + def test_abort_error_disease(self): app.config["TESTING"] = True self.app = app.test_client() diff --git a/alternativeSplicing.py b/alternativeSplicing.py index 9b2ef5b..50f73f8 100644 --- a/alternativeSplicing.py +++ b/alternativeSplicing.py @@ -27,7 +27,7 @@ def get_transcript_events(enst_number): if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all - return models.AlternativeSplicingEventTranscripts(many=True).dump(interaction_result).data + return models.AlternativeSplicingEventTranscripts(many=True).dump(interaction_result) else: return Response("{" "\"detail\": \"No event types with given parameters found!\"," @@ -87,7 +87,7 @@ def get_exons_for_position(start_pos: int, end_pos: int): .all() if len(result) > 0: schema = models.networkAnalysisSchema(many=True) - return schema.dump(result).data + return schema.dump(result) else: abort(404, "No data found that satisfies the given filters") diff --git a/app.ini b/app.ini index 519070e..27cc5cf 100644 --- a/app.ini +++ b/app.ini @@ -1,6 +1,6 @@ [uwsgi] wsgi-file = server.py -callable = connex_app +callable = app http = :5000 processes = 4 threads = 2 diff --git a/comparison.py b/comparison.py index d84bccd..05ea9e5 100644 --- a/comparison.py +++ b/comparison.py @@ -31,6 +31,6 @@ def get_comparison(disease_name=None, disease_subtype=None): .all() if len(result) > 0: - return models.ComparisonSchema(many=True).dump(result).data + return models.ComparisonSchema(many=True).dump(result) else: abort(404, "No data found.") diff --git a/config.py b/config.py index 1213e03..0afa7fb 100644 --- a/config.py +++ b/config.py @@ -1,17 +1,30 @@ import os -import connexion +from connexion import FlaskApp from flask_cors import CORS from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy +from connexion.middleware import MiddlewarePosition +from starlette.middleware.cors import CORSMiddleware basedir = os.path.abspath(os.path.dirname(__file__)) # Create the Connexion application instance -connex_app = connexion.App(__name__, specification_dir=basedir) +connex_app = FlaskApp(__name__, specification_dir=basedir) # Get the underlying Flask app instance app = connex_app.app -CORS(app) + +# CORS(connex_app) +connex_app.add_middleware( + CORSMiddleware, + position=MiddlewarePosition.BEFORE_EXCEPTION, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + + # change port to whatever is needed PORT = 5555 UPLOAD_DIR = os.getenv("SPONGE_DB_UPLOAD_DIR") @@ -20,10 +33,10 @@ # Configure the SQLAlchemy part of the app instance app.config['SQLALCHEMY_ECHO'] = False -app.config['SQLALCHEMY_DATABASE_URI'] = os.getenv("SPONGE_DB_URI") +app.config['SQLALCHEMY_DATABASE_URI'] = "mysql://root:spongebob@10.162.163.20:9669/SPONGEdb_v2" # os.getenv("SPONGE_DB_URI") app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False -app.config['DEBUG '] = True -app.config['TESTING '] = True +app.config['DEBUG'] = True +app.config['TESTING'] = True app.config['UPLOAD_FOLDER'] = UPLOAD_DIR @app.after_request diff --git a/dataset.py b/dataset.py index b5730ed..0108bea 100644 --- a/dataset.py +++ b/dataset.py @@ -26,7 +26,7 @@ def get_datasets(data_origin=None): # Did we find a source? if len(data) > 0: # Serialize the data for the response - return models.DatasetSchema(many=True).dump(data).data + return models.DatasetSchema(many=True).dump(data) else: abort(404, 'No data found for name: {data_origin}'.format(data_origin=data_origin)) @@ -52,7 +52,7 @@ def read(disease_name=None): # Did we find a dataset? if len(data) > 0: # Serialize the data for the response - return models.DatasetSchema(many=True).dump(data).data + return models.DatasetSchema(many=True).dump(data) else: abort(404, 'No data found for name: {disease_name}'.format(disease_name=disease_name)) @@ -73,6 +73,6 @@ def read_spongeRunInformation(disease_name=None): if len(data) > 0: # Serialize the data for the response - return models.SpongeRunSchema(many=True).dump(data).data + return models.SpongeRunSchema(many=True).dump(data) else: abort(404, 'No data found for name: {disease_name}'.format(disease_name=disease_name)) diff --git a/diffExpression.py b/diffExpression.py index 5e5e4f2..ba8c6a4 100644 --- a/diffExpression.py +++ b/diffExpression.py @@ -108,7 +108,7 @@ def get_diff_expr(disease_name_1=None, disease_name_2=None, disease_subtype_1=No result = result.all() if len(result) > 0: - out = models.DESchema(many=True).dump(result).data + out = models.DESchema(many=True).dump(result) if reverse: for i in range(len(out)): out[i]["log2FoldChange"] = -out[i]["log2FoldChange"] @@ -216,7 +216,7 @@ def get_diff_expr_transcript(disease_name_1=None, disease_name_2=None, disease_s result = result.all() if len(result) > 0: - out = models.DETranscriptSchema(many=True).dump(result).data + out = models.DETranscriptSchema(many=True).dump(result) if reverse: for i in range(len(out)): out[i]["log2FoldChange"] = -out[i]["log2FoldChange"] diff --git a/expressionValues.py b/expressionValues.py index e3da345..f3766f9 100644 --- a/expressionValues.py +++ b/expressionValues.py @@ -56,7 +56,7 @@ def get_gene_expr(disease_name=None, ensg_number=None, gene_symbol=None, sponge_ .all() if len(result) > 0: - return models.geneExpressionSchema(many=True).dump(result).data + return models.geneExpressionSchema(many=True).dump(result) else: abort(404, "No data found.") @@ -121,7 +121,7 @@ def get_transcript_expression(disease_name: str, enst_number: str = None, ensg_n .all() if len(result) > 0: - return models.ExpressionDataTranscriptSchema(many=True).dump(result).data + return models.ExpressionDataTranscriptSchema(many=True).dump(result) else: abort(404, "No transcript expression data found for the given filters.") @@ -178,6 +178,6 @@ def get_mirna_expr(disease_name=None, mimat_number=None, hs_number=None): .all() if len(result) > 0: - return models.miRNAExpressionSchema(many=True).dump(result).data + return models.miRNAExpressionSchema(many=True).dump(result) else: abort(404, "No data found.") diff --git a/externalInformation.py b/externalInformation.py index c2ca23b..141ce16 100644 --- a/externalInformation.py +++ b/externalInformation.py @@ -15,7 +15,7 @@ def getAutocomplete(searchString): .filter(models.Gene.ensg_number.ilike(searchString + "%")) \ .all() if len(data) > 0: - return models.GeneSchemaShort(many=True).dump(data).data + return models.GeneSchemaShort(many=True).dump(data) else: abort(404, "No ensg number found for the given String") elif searchString.startswith("HSA") or searchString.startswith("hsa"): @@ -23,7 +23,7 @@ def getAutocomplete(searchString): .filter(models.miRNA.hs_nr.ilike(searchString + "%")) \ .all() if len(data) > 0: - return models.miRNASchemaShort(many=True).dump(data).data + return models.miRNASchemaShort(many=True).dump(data) else: abort(404, "No hsa number found for the given String") elif searchString.startswith("MIMAT") or searchString.startswith("mimat"): @@ -31,7 +31,7 @@ def getAutocomplete(searchString): .filter(models.miRNA.mir_ID.ilike(searchString + "%")) \ .all() if len(data) > 0: - return models.miRNASchemaShort(many=True).dump(data).data + return models.miRNASchemaShort(many=True).dump(data) else: abort(404, "No mimat number found for the given String") else: @@ -39,7 +39,7 @@ def getAutocomplete(searchString): .filter(models.Gene.gene_symbol.ilike(searchString + "%")) \ .all() if len(data) > 0: - return models.GeneSchemaShort(many=True).dump(data).data + return models.GeneSchemaShort(many=True).dump(data) else: abort(404, "No gene symbol found for the given String") @@ -68,7 +68,7 @@ def getGeneInformation(ensg_number=None, gene_symbol=None): .all() if len(data) > 0: - return models.GeneSchema(many=True).dump(data).data + return models.GeneSchema(many=True).dump(data) else: abort(404, "No gene(s) found with: " + ''.join(ensg_number)) @@ -78,7 +78,7 @@ def getGeneInformation(ensg_number=None, gene_symbol=None): .all() if len(data) > 0: - return models.GeneSchema(many=True).dump(data).data + return models.GeneSchema(many=True).dump(data) else: abort(404, "No gene found with: " + ''.join(gene_symbol)) @@ -98,7 +98,7 @@ def getTranscriptInformation(enst_number): .all() if len(data) > 0: - return models.TranscriptSchema(many=True).dump(data).data + return models.TranscriptSchema(many=True).dump(data) else: abort(404, "No transcript found with: " + enst_number) @@ -135,7 +135,7 @@ def getOverallCount(): some_engine.dispose() schema = models.OverallCountSchema(many=True) - return schema.dump(count).data + return schema.dump(count) def getGeneOntology(gene_symbol): """ @@ -162,7 +162,7 @@ def getGeneOntology(gene_symbol): if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all - return models.GeneOntologySchema(many=True).dump(interaction_result).data + return models.GeneOntologySchema(many=True).dump(interaction_result) else: return Response("{" "\"detail\": \"No GO terms with given parameters found!\"," @@ -197,7 +197,7 @@ def getHallmark(gene_symbol): if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all - return models.HallmarksSchema(many=True).dump(interaction_result).data + return models.HallmarksSchema(many=True).dump(interaction_result) else: return Response("{" "\"detail\": \"No hallmark associated for gene(s) of interest!\"," @@ -231,7 +231,7 @@ def getWikipathway(gene_symbol): if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all - return models.WikipathwaySchema(many=True).dump(interaction_result).data + return models.WikipathwaySchema(many=True).dump(interaction_result) else: return Response("{" "\"detail\": \"No wikipathway key associated for gene(s) of interest!\"," @@ -256,7 +256,7 @@ def getTranscriptGene(enst_number): .all() if len(data) > 0: - return models.TranscriptSchema(many=True).dump(data).data + return models.TranscriptSchema(many=True).dump(data) else: abort(404, "No transcript found with: " + enst_number) @@ -265,7 +265,7 @@ def getTranscriptGene(enst_number): .all() if len(interaction_result) > 0: - return models.GeneSchema(many=True).dump(interaction_result).data + return models.GeneSchema(many=True).dump(interaction_result) else: return Response("{" "\"detail\": \"No gene(s) associated for transcript(s) of interest!\"," @@ -290,7 +290,7 @@ def getGeneTranscripts(ensg_number): .all() if len(data) > 0: - return models.GeneSchema(many=True).dump(data).data + return models.GeneSchema(many=True).dump(data) else: abort(404, "No gene found with: " + ensg_number) @@ -299,7 +299,7 @@ def getGeneTranscripts(ensg_number): .all() if len(interaction_result) > 0: - return models.TranscriptSchema(many=True).dump(interaction_result).data + return models.TranscriptSchema(many=True).dump(interaction_result) else: return Response("{" "\"detail\": \"No transcript(s) associated for gene(s) of interest!\"," diff --git a/geneInteraction.py b/geneInteraction.py index 84e8493..fce4b93 100644 --- a/geneInteraction.py +++ b/geneInteraction.py @@ -2,6 +2,7 @@ import os from flask import abort from sqlalchemy import desc +from sqlalchemy.sql import text import models @@ -48,8 +49,8 @@ def read_all_genes(disease_name=None, ensg_number=None, gene_symbol=None, gene_t if len(run) > 0: run_IDs = [i.sponge_run_ID for i in run] - queries_1.append(models.GeneInteraction.sponge_run_id.in_(run_IDs)) - queries_2.append(models.GeneInteraction.sponge_run_id.in_(run_IDs)) + queries_1.append(models.GeneInteraction.sponge_run_ID.in_(run_IDs)) + queries_2.append(models.GeneInteraction.sponge_run_ID.in_(run_IDs)) else: abort(404, "No dataset with given disease_name found") @@ -144,7 +145,7 @@ def read_all_genes(disease_name=None, ensg_number=None, gene_symbol=None, gene_t else: # Serialize the data for the response depending on parameter all schema = models.GeneInteractionDatasetShortSchema(many=True) - return schema.dump(interaction_result).data + return schema.dump(interaction_result) else: abort(404, "No information with given parameters found") @@ -201,7 +202,7 @@ def read_specific_interaction(disease_name=None, ensg_number=None, gene_symbol=N if len(run) > 0: run_IDs = [i.sponge_run_ID for i in run] - queries.append(models.GeneInteraction.sponge_run_id.in_(run_IDs)) + queries.append(models.GeneInteraction.sponge_run_ID.in_(run_IDs)) else: abort(404, "No dataset with given disease_name found") @@ -219,7 +220,7 @@ def read_specific_interaction(disease_name=None, ensg_number=None, gene_symbol=N if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all - return models.GeneInteractionDatasetShortSchema(many=True).dump(interaction_result).data + return models.GeneInteractionDatasetShortSchema(many=True).dump(interaction_result) else: abort(404, "No information with given parameters found") @@ -259,7 +260,7 @@ def read_all_gene_network_analysis(disease_name=None, ensg_number=None, gene_sym if len(run) > 0: run_IDs = [i.sponge_run_ID for i in run] - queries.append(models.networkAnalysis.sponge_run_id.in_(run_IDs)) + queries.append(models.networkAnalysis.sponge_run_ID.in_(run_IDs)) else: abort(404, "No dataset with given disease_name found") @@ -299,7 +300,7 @@ def read_all_gene_network_analysis(disease_name=None, ensg_number=None, gene_sym queries.append(models.Gene.gene_type == gene_type) # add all sorting if given: - sort = [models.networkAnalysis.sponge_run_id] + sort = [models.networkAnalysis.sponge_run_ID] if sorting is not None: if sorting == "betweenness": if descending: @@ -323,10 +324,10 @@ def read_all_gene_network_analysis(disease_name=None, ensg_number=None, gene_sym .order_by(*sort) \ .slice(offset, offset + limit) \ .all() - + if len(result) > 0: schema = models.networkAnalysisSchema(many=True) - return schema.dump(result).data + return schema.dump(result) else: abort(404, "Not data found that satisfies the given filters") @@ -372,24 +373,24 @@ def testGeneInteraction(ensg_number=None, gene_symbol=None): abort(404, "No gene found for given ensg_number(s) or gene_symbol(s)") # test for each dataset if the gene(s) of interest are included in the ceRNA network - run = session.execute("SELECT * from dataset join run where dataset.dataset_ID = run.dataset_ID").fetchall() + run = session.execute(text("SELECT * from dataset join run where dataset.dataset_ID = run.dataset_ID")).fetchall() result = [] for r in run: - tmp = session.execute("SELECT EXISTS(SELECT * FROM interactions_genegene where sponge_run_id = " + str(r.sponge_run_ID) + - " and gene_ID1 = " + str(gene_ID[0]) + " limit 1) as include;").fetchone() + tmp = session.execute(text("SELECT EXISTS(SELECT * FROM interactions_genegene where sponge_run_ID = " + str(r.sponge_run_ID) + + " and gene_ID1 = " + str(gene_ID[0]) + " limit 1) as include;")).fetchone() if (tmp[0] == 1): - check = {"data_origin": r.data_origin, "disease_name": r.disease_name, "sponge_run_id": r.sponge_run_ID, + check = {"data_origin": r.data_origin, "disease_name": r.disease_name, "sponge_run_ID": r.sponge_run_ID, "include": tmp[0]} else: - tmp2 = session.execute("SELECT EXISTS(SELECT * FROM interactions_genegene where sponge_run_id = " + str(r.sponge_run_ID) + - " and gene_ID2 = " + str(gene_ID[0]) + " limit 1) as include;").fetchone() + tmp2 = session.execute(text("SELECT EXISTS(SELECT * FROM interactions_genegene where sponge_run_ID = " + str(r.sponge_run_ID) + + " and gene_ID2 = " + str(gene_ID[0]) + " limit 1) as include;")).fetchone() if (tmp2[0] == 1): - check = {"data_origin": r.data_origin, "disease_name": r.disease_name, "sponge_run_id": r.sponge_run_ID, + check = {"data_origin": r.data_origin, "disease_name": r.disease_name, "sponge_run_ID": r.sponge_run_ID, "include": 1} else: - check = {"data_origin": r.data_origin, "disease_name": r.disease_name, "sponge_run_id": r.sponge_run_ID, + check = {"data_origin": r.data_origin, "disease_name": r.disease_name, "sponge_run_ID": r.sponge_run_ID, "include": 0} result.append(check) @@ -397,7 +398,7 @@ def testGeneInteraction(ensg_number=None, gene_symbol=None): session.close() schema = models.checkGeneInteractionProCancer(many=True) - return schema.dump(result).data + return schema.dump(result) def read_all_to_one_mirna(disease_name=None, mimat_number=None, hs_number=None, pValue=0.05, @@ -455,8 +456,8 @@ def read_all_to_one_mirna(disease_name=None, mimat_number=None, hs_number=None, if len(run) > 0: run_IDs = [i.sponge_run_ID for i in run] - queriesmirnaInteraction.append(models.miRNAInteraction.sponge_run_id.in_(run_IDs)) - queriesGeneInteraction.append(models.GeneInteraction.sponge_run_id.in_(run_IDs)) + queriesmirnaInteraction.append(models.miRNAInteraction.sponge_run_ID.in_(run_IDs)) + queriesGeneInteraction.append(models.GeneInteraction.sponge_run_ID.in_(run_IDs)) else: abort(404, "No dataset with given disease_name found") @@ -500,7 +501,7 @@ def read_all_to_one_mirna(disease_name=None, mimat_number=None, hs_number=None, if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all schema = models.GeneInteractionDatasetLongSchema(many=True) - return schema.dump(interaction_result).data + return schema.dump(interaction_result) else: abort(404, "No data found with input parameter") @@ -553,7 +554,7 @@ def read_all_mirna(disease_name=None, mimat_number=None, hs_number=None, occuren .all() if len(run) > 0: run_IDs = [i.sponge_run_ID for i in run] - queries.append(models.OccurencesMiRNA.sponge_run_id.in_(run_IDs)) + queries.append(models.OccurencesMiRNA.sponge_run_ID.in_(run_IDs)) else: abort(404, "No dataset with given disease_name found") @@ -576,7 +577,7 @@ def read_all_mirna(disease_name=None, mimat_number=None, hs_number=None, occuren if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all - return models.occurencesMiRNASchema(many=True).dump(interaction_result).data + return models.occurencesMiRNASchema(many=True).dump(interaction_result) else: abort(404, "No information with given parameters found") @@ -613,7 +614,7 @@ def read_mirna_for_specific_interaction(disease_name=None, ensg_number=None, gen if len(run) > 0: run_IDs = [i.sponge_run_ID for i in run] - queries.append(models.miRNAInteraction.sponge_run_id.in_(run_IDs)) + queries.append(models.miRNAInteraction.sponge_run_ID.in_(run_IDs)) else: abort(404, "No dataset with given disease_name found") @@ -648,10 +649,10 @@ def read_mirna_for_specific_interaction(disease_name=None, ensg_number=None, gen session = Session() # test for each dataset if the gene(s) of interest are included in the ceRNA network - mirna_filter = session.execute("select mirna_ID from interacting_miRNAs where sponge_run_ID IN ( " + mirna_filter = session.execute(text(text("select mirna_ID from interactions_genemirna where sponge_run_ID IN ( " + ','.join(str(e) for e in run_IDs) + ") and gene_ID IN ( " + ','.join(str(e) for e in gene_IDs) - + ") group by mirna_ID HAVING count(mirna_ID) >= 2;").fetchall() + + ") group by mirna_ID HAVING count(mirna_ID) >= 2;"))).fetchall() session.close() some_engine.dispose() @@ -672,7 +673,7 @@ def read_mirna_for_specific_interaction(disease_name=None, ensg_number=None, gen if len(interaction_result) > 0: # Serialize the data for the response depending on parameter all - return models.miRNAInteractionSchema(many=True).dump(interaction_result).data + return models.miRNAInteractionSchema(many=True).dump(interaction_result) else: abort(404, "No data found with input parameter") @@ -709,7 +710,7 @@ def getGeneCounts(disease_name=None, ensg_number=None, gene_symbol=None, minCoun if len(run) > 0: run_IDs = [i.sponge_run_ID for i in run] - queries.append(models.GeneCount.sponge_run_id.in_(run_IDs)) + queries.append(models.GeneCount.sponge_run_ID.in_(run_IDs)) else: abort(404, "No dataset with given disease_name found") @@ -750,7 +751,7 @@ def getGeneCounts(disease_name=None, ensg_number=None, gene_symbol=None, minCoun if len(result) > 0: # Serialize the data for the response depending on parameter all - return models.GeneCountSchema(many=True).dump(result).data + return models.GeneCountSchema(many=True).dump(result) else: abort(404, "No data found with input parameter") @@ -788,11 +789,11 @@ def get_distinc_ceRNA_sets(disease_name): - id1 = session.execute("SELECT DISTINCT gene_ID1 FROM interactions_genegene where sponge_run_ID IN (" + - ','.join(str(e) for e in run_IDs) + ") AND p_value <= 0.05") + id1 = session.execute(text("SELECT DISTINCT gene_ID1 FROM interactions_genegene where sponge_run_ID IN (" + + ','.join(str(e) for e in run_IDs) + ") AND p_value <= 0.05")) print("first ids ready") - #id2 = session.execute("SELECT DISTINCT gene_ID2 FROM interactions_genegene where sponge_run_id IN (" + + #id2 = session.execute("SELECT DISTINCT gene_ID2 FROM interactions_genegene where sponge_run_ID IN (" + # ','.join(str(e) for e in run_IDs) + ") AND p_value <= 0.05").fetchall() diff --git a/gsea.py b/gsea.py index d53a7b8..ee80b30 100644 --- a/gsea.py +++ b/gsea.py @@ -88,7 +88,7 @@ def gsea_sets(disease_name_1=None, disease_name_2=None, disease_subtype_1=None, .all() if len(result) > 0: - return [dict(s) for s in set(frozenset(d.items()) for d in models.GseaSetSchema(many=True).dump(result).data)] + return [dict(s) for s in set(frozenset(d.items()) for d in models.GseaSetSchema(many=True).dump(result))] else: abort(404, "No data found.") @@ -175,7 +175,7 @@ def gsea_terms(disease_name_1=None, disease_name_2=None, disease_subtype_1=None, .all() # TODO: maybe replace with _in(term) if len(result) > 0: - return [dict(s) for s in set(frozenset(d.items()) for d in models.GseaTermsSchema(many=True).dump(result).data)] + return [dict(s) for s in set(frozenset(d.items()) for d in models.GseaTermsSchema(many=True).dump(result))] else: abort(404, "No data found.") @@ -266,7 +266,7 @@ def gsea_results(disease_name_1=None, disease_name_2=None, disease_subtype_1=Non result = result.all() if len(result) > 0: - result = models.GseaSchema(many=True).dump(result).data + result = models.GseaSchema(many=True).dump(result) for r in result: r.update({"tag_percent": f"{len(r['lead_genes'])}/{len(r['matched_genes'])}"}) @@ -365,7 +365,7 @@ def gsea_plot(disease_name_1=None, disease_name_2=None, disease_subtype_1=None, if len(gsea) > 0: - gsea = models.GseaSchemaPlot(many=True).dump(gsea).data + gsea = models.GseaSchemaPlot(many=True).dump(gsea) gene_map = models.Gene.query \ .filter(models.Gene.gene_ID.in_([x["gene_ID"] for x in gsea[0]["gsea_ranking_genes"]])) \ @@ -377,7 +377,7 @@ def gsea_plot(disease_name_1=None, disease_name_2=None, disease_subtype_1=None, .filter(models.DifferentialExpression.gene_ID.in_(ranking_gene_ids)) \ .all() - de = models.DESchemaShort(many=True).dump(de).data + de = models.DESchemaShort(many=True).dump(de) ranking = [y for y in sorted(de, key= lambda x: x["log2FoldChange"], reverse=not reverse)] ranking_ids = [x["gene_ID"] for x in ranking] diff --git a/gunicorn.conf b/gunicorn.conf new file mode 100644 index 0000000..6f53b48 --- /dev/null +++ b/gunicorn.conf @@ -0,0 +1,47 @@ +# gunicorn.conf.py + +# Server socket +bind = '0.0.0.0:5000' +backlog = 2048 + +# Worker processes +workers = 4 +threads = 2 +worker_class = 'gthread' + +# Logging +accesslog = '-' +errorlog = '-' +loglevel = 'info' + +# Security +limit_request_line = 4094 +limit_request_fields = 100 +limit_request_field_size = 8190 + +# Process naming +proc_name = 'myapp' + +# Server mechanics +preload_app = True +daemon = False +pidfile = '/tmp/gunicorn.pid' +umask = 0 +user = None +group = None + +# Debugging +reload = True + +# Environment +raw_env = [ + 'DJANGO_SETTINGS_MODULE=myproject.settings', + 'SECRET_KEY=your_secret_key', +] + +# Hooks +def on_starting(server): + print("Starting Gunicorn...") + +def on_exit(server): + print("Stopping Gunicorn...") diff --git a/models.py b/models.py index 7a885e6..1b5fa59 100644 --- a/models.py +++ b/models.py @@ -12,6 +12,7 @@ class Dataset(db.Model): disease_type = db.Column(db.String(32)) download_url = db.Column(db.String(32)) disease_subtype = db.Column(db.String(32)) + version = db.Column(db.Integer) class SpongeRun(db.Model): @@ -35,17 +36,6 @@ class SpongeRun(db.Model): sponge_db_version = db.Column(db.Integer) -class SelectedGenes(db.Model): - __tablename__ = "selected_genes" - selected_genes_ID = db.Column(db.Integer, primary_key=True) - - sponge_run_ID = db.Column(db.Integer, db.ForeignKey('sponge_run.sponge_run_ID'), nullable=False) - sponge_run = relationship("SpongeRun", foreign_keys=[sponge_run_ID]) - - gene_ID = db.Column(db.Integer, db.ForeignKey('gene.gene_ID'), nullable=False) - gene = relationship("Gene", foreign_keys=[gene_ID]) - - class TargetDatabases(db.Model): __tablename__ = "target_databases" target_databases_ID = db.Column(db.Integer, primary_key=True) @@ -74,8 +64,8 @@ class GeneInteraction(db.Model): correlation = db.Column(db.Float) class miRNAInteraction(db.Model): - __tablename__ = "interacting_miRNAs" - interacting_miRNAs_ID = db.Column(db.Integer, primary_key=True) + __tablename__ = "interactions_genemirna" + interactions_genemirna_ID = db.Column(db.Integer, primary_key=True) sponge_run_ID = db.Column(db.Integer, db.ForeignKey('sponge_run.sponge_run_ID'), nullable=False) sponge_run = relationship("SpongeRun", foreign_keys=[sponge_run_ID]) @@ -88,6 +78,21 @@ class miRNAInteraction(db.Model): coefficient = db.Column(db.Float) +class miRNAInteractionTranscript(db.Model): + __tablename__ = "interactions_transcriptmirna" + interactions_transcriptmirna_ID = db.Column(db.Integer, primary_key=True) + + sponge_run_ID = db.Column(db.Integer, db.ForeignKey('sponge_run.sponge_run_ID'), nullable=False) + sponge_run = relationship("SpongeRun", foreign_keys=[sponge_run_ID]) + + transcript_ID = db.Column(db.Integer, db.ForeignKey('transcript.transcript_ID'), nullable=False) + transcript = relationship("Transcript", foreign_keys=[transcript_ID]) + + miRNA_ID = db.Column(db.Integer, db.ForeignKey('mirna.miRNA_ID'), nullable=False) + mirna = relationship("miRNA", foreign_keys=[miRNA_ID]) + + coefficient = db.Column(db.Float) + class Gene(db.Model): __tablename__ = "gene" gene_ID = db.Column(db.Integer, primary_key=True) @@ -152,11 +157,20 @@ class MiRNAExpressionValues(db.Model): class OccurencesMiRNA(db.Model): - __tablename__ = "occurences_miRNA" - occurences_miRNA_ID = db.Column(db.Integer, primary_key=True) + __tablename__ = "occurences_mirna_gene" + occurences_mirna_gene_ID = db.Column(db.Integer, primary_key=True, nullable=False) + miRNA_ID = db.Column(db.Integer, db.ForeignKey('mirna.miRNA_ID'), nullable=False) + mirna = relationship("miRNA", foreign_keys=[miRNA_ID]) + occurences = db.Column(db.Integer, nullable=False) + sponge_run_ID = db.Column(db.Integer, db.ForeignKey('sponge_run.sponge_run_ID'), nullable=False) + sponge_run = relationship("SpongeRun", foreign_keys=[sponge_run_ID]) + +class OccurencesMiRNATranscript(db.Model): + __tablename__ = "occurences_mirna_transcript" + occurences_mirna_transcript_ID = db.Column(db.Integer, primary_key=True, nullable=False) miRNA_ID = db.Column(db.Integer, db.ForeignKey('mirna.miRNA_ID'), nullable=False) mirna = relationship("miRNA", foreign_keys=[miRNA_ID]) - occurences = db.Column(db.Integer) + occurences = db.Column(db.Integer, nullable=False) sponge_run_ID = db.Column(db.Integer, db.ForeignKey('sponge_run.sponge_run_ID'), nullable=False) sponge_run = relationship("SpongeRun", foreign_keys=[sponge_run_ID]) @@ -181,7 +195,7 @@ class SurvivalRate(db.Model): overexpression = db.Column(db.Integer) class SurvivalPValue(db.Model): - __tablename__ = "survival_pValue" + __tablename__ = "survival_pvalue" survival_pValue_ID = db.Column(db.Integer, primary_key=True) dataset_ID = db.Column(db.Integer, db.ForeignKey('dataset.dataset_ID'), nullable=False) dataset = relationship("Dataset", foreign_keys=[dataset_ID]) @@ -260,6 +274,7 @@ class TranscriptElementPositions(db.Model): start_pos = db.Column(db.Integer) end_pos = db.Column(db.Integer) + order_number = db.Column(db.Integer) class AlternativeSplicingEventTranscriptElements(db.Model): __tablename__ = "alternative_splicing_event_transcript_elements" @@ -331,6 +346,7 @@ class SpongEffectsRun(db.Model): method = db.Column(db.String(32)) cv_folds = db.Column(db.Integer) level = db.Column(db.String(32)) + methods = db.Column(db.String(32)) class SpongEffectsRunPerformance(db.Model): __tablename__ = "spongEffects_run_performance" @@ -388,12 +404,10 @@ class ExpressionDataTranscript(db.Model): transcript_ID = db.Column(db.Integer, db.ForeignKey('transcript.transcript_ID'), nullable=False) transcript = relationship("Transcript", foreign_keys=[transcript_ID]) - - gene_ID = db.Column(db.Integer, db.ForeignKey("gene.gene_ID"), nullable=False) - gene = relationship("Gene", foreign_keys=[gene_ID]) - + expr_value = db.Column(db.Float) sample_ID = db.Column(db.String(32)) + normal_cancer = db.Column(db.String(32)) class NetworkResults(db.Model): tablename = 'network_results' @@ -428,9 +442,6 @@ class EnrichmentScoreTranscript(db.Model): nullable=False) spongEffects_transcript_module = relationship('SpongEffectsTranscriptModule', foreign_keys=[spongEffects_transcript_module_ID]) - transcript_ID = db.Column(db.Integer, db.ForeignKey('transcript.transcript_ID'), nullable=False) - transcript = relationship("Transcript", foreign_keys=[transcript_ID]) - score_value = db.Column(db.Float) sample_ID = db.Column(db.String(32)) @@ -472,9 +483,6 @@ class EnrichmentScoreGene(db.Model): db.ForeignKey('spongEffects_gene_module.spongEffects_gene_module_ID'), nullable=False) spongEffects_gene_module = relationship('SpongEffectsGeneModule', foreign_keys=[spongEffects_gene_module_ID]) - gene_ID = db.Column(db.Integer, db.ForeignKey('gene.gene_ID'), nullable=False) - gene = relationship("Gene", foreign_keys=[gene_ID]) - score_value = db.Column(db.Float) sample_ID = db.Column(db.String(32)) @@ -532,10 +540,6 @@ class DifferentialExpressionTranscript(db.Model): class Gsea(db.Model): __tablename__ = "gsea" gsea_ID = db.Column(db.Integer, primary_key=True) - lead_genes = db.relationship('GseaLeadGenes') - matched_genes = db.relationship('GseaMatchedGenes') - res = db.relationship('GseaRes') - gsea_ranking_genes = db.relationship('GseaRankingGenes') comparison_ID = db.Column(db.Integer, db.ForeignKey('comparison.comparison_ID'), nullable=False) comparison = relationship("Comparison", foreign_keys=[comparison_ID]) @@ -552,19 +556,23 @@ class Gsea(db.Model): class GseaLeadGenes(db.Model): __tablename__ = "gsea_lead_genes" - gsea_ID = db.Column(db.Integer, db.ForeignKey('gsea.gsea_ID'), primary_key=True) + gsea_lead_genes_ID = db.Column(db.Integer, nullable=False, primary_key=True) + + gsea_ID = db.Column(db.Integer, db.ForeignKey('gsea.gsea_ID')) gsea = relationship("Gsea", foreign_keys=[gsea_ID]) - gene_ID = db.Column(db.Integer, db.ForeignKey('gene.gene_ID'), primary_key=True) + gene_ID = db.Column(db.Integer, db.ForeignKey('gene.gene_ID')) gene_symbol = relationship("Gene", foreign_keys=[gene_ID]) class GseaMatchedGenes(db.Model): __tablename__ = "gsea_matched_genes" - gsea_ID = db.Column(db.Integer, db.ForeignKey('gsea.gsea_ID'), primary_key=True) + gsea_matched_genes_ID = db.Column(db.Integer, nullable=False, primary_key=True) + + gsea_ID = db.Column(db.Integer, db.ForeignKey('gsea.gsea_ID')) gsea = relationship("Gsea", foreign_keys=[gsea_ID]) - gene_ID = db.Column(db.Integer, db.ForeignKey('gene.gene_ID'), primary_key=True) + gene_ID = db.Column(db.Integer, db.ForeignKey('gene.gene_ID')) gene_symbol = relationship("Gene", foreign_keys=[gene_ID]) class GseaRes(db.Model): @@ -577,46 +585,39 @@ class GseaRes(db.Model): class GseaRankingGenes(db.Model): __tablename__ = "gsea_ranking_genes" - gsea_ID = db.Column(db.Integer, db.ForeignKey('gsea.gsea_ID'), primary_key=True) + gsea_ranking_genes_ID = db.Column(db.Integer, nullable=False, primary_key=True) + + gsea_ID = db.Column(db.Integer, db.ForeignKey('gsea.gsea_ID')) gsea = relationship("Gsea", foreign_keys=[gsea_ID]) - gene_ID = db.Column(db.Integer, db.ForeignKey('gene.gene_ID'), primary_key=True) + gene_ID = db.Column(db.Integer, db.ForeignKey('gene.gene_ID')) gene_symbol = relationship("Gene", foreign_keys=[gene_ID]) -class DatasetSchema(ma.ModelSchema): +class DatasetSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Dataset sqla_session = db.session -class SpongeRunSchema(ma.ModelSchema): +class SpongeRunSchema(ma.SQLAlchemyAutoSchema): class Meta: model = SpongeRun sqla_session = db.session - dataset = ma.Nested(DatasetSchema, only=("dataset_ID", "disease_name", "data_origin")) + dataset = ma.Nested(lambda: DatasetSchema(only=("dataset_ID", "disease_name", "data_origin"))) -class GeneSchema(ma.ModelSchema): +class GeneSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Gene sqla_session = db.session fields = ["chromosome_name", "description", "end_pos", "ensg_number", "gene_symbol", "gene_type", "start_pos", "cytoband"] -class GeneSchemaShort(ma.ModelSchema): +class GeneSchemaShort(ma.SQLAlchemyAutoSchema): class Meta: model = Gene sqla_session = db.session fields = ["ensg_number","gene_symbol"] -class SelectedGenesSchema(ma.ModelSchema): - class Meta: - model = SelectedGenes - sqla_session = db.session - - sponge_run = ma.Nested(SpongeRunSchema) - gene = ma.Nested(GeneSchema, only=("ensg_number")) - - -class TargetDatabasesSchema(ma.ModelSchema): +class TargetDatabasesSchema(ma.SQLAlchemyAutoSchema): class Meta: model = TargetDatabases sqla_session = db.session @@ -626,152 +627,151 @@ class Meta: class AllSpongeRunInformationSchema(Schema): sponge_run = fields.Nested(SpongeRunSchema) - target_databases = fields.Nested(TargetDatabasesSchema, only=("db_used", "url", "version")) - selected_genes = fields.Nested(SelectedGenesSchema, only="gene") + target_databases = fields.Nested(lambda: TargetDatabasesSchema(only=("db_used", "url", "version"))) -class GeneInteractionLongSchema(ma.ModelSchema): +class GeneInteractionLongSchema(ma.SQLAlchemyAutoSchema): class Meta: model = GeneInteraction sqla_session = db.session - sponge_run = ma.Nested(SpongeRunSchema, only=("sponge_run_ID")) - gene1 = ma.Nested(GeneSchema, exclude=("gene_ID")) - gene2 = ma.Nested(GeneSchema, exclude=("gene_ID")) + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID"))) + gene1 = ma.Nested(lambda: GeneSchema(exclude=("gene_ID"))) + gene2 = ma.Nested(lambda: GeneSchema(exclude=("gene_ID"))) -class GeneInteractionShortSchema(ma.ModelSchema): +class GeneInteractionShortSchema(ma.SQLAlchemyAutoSchema): class Meta: model = GeneInteraction sqla_session = db.session - sponge_run = ma.Nested(SpongeRunSchema, only=("sponge_run_ID")) - gene1 = ma.Nested(GeneSchema, only=("ensg_number")) - gene2 = ma.Nested(GeneSchema, only=("ensg_number")) + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID"))) + gene1 = ma.Nested(lambda: GeneSchema(only=("ensg_number"))) + gene2 = ma.Nested(lambda: GeneSchema(only=("ensg_number"))) -class GeneInteractionDatasetLongSchema(ma.ModelSchema): +class GeneInteractionDatasetLongSchema(ma.SQLAlchemyAutoSchema): class Meta: model = GeneInteraction sqla_session = db.session fields = ["correlation", "mscor", "p_value", "run", "gene1", "gene2"] - sponge_run = ma.Nested(SpongeRunSchema, only=("sponge_run_ID", "dataset")) + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID", "dataset"))) gene1 = ma.Nested(GeneSchema) gene2 = ma.Nested(GeneSchema) -class GeneInteractionDatasetShortSchema(ma.ModelSchema): +class GeneInteractionDatasetShortSchema(ma.SQLAlchemyAutoSchema): class Meta: model = GeneInteraction sqla_session = db.session fields = ["correlation", "mscor", "p_value", "sponge_run", "gene1", "gene2"] - sponge_run = ma.Nested(SpongeRunSchema, only=("sponge_run_ID", "dataset")) - gene1 = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) - gene2 = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID", "dataset"))) + gene1 = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) + gene2 = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class miRNASchema(ma.ModelSchema): +class miRNASchema(ma.SQLAlchemyAutoSchema): class Meta: model = miRNA sqla_session = db.session fields = ["hs_nr", "id_type", "mir_ID", "seq", "chr", "start_position", "end_position", "cytoband"] -class miRNASchemaShort(ma.ModelSchema): +class miRNASchemaShort(ma.SQLAlchemyAutoSchema): class Meta: model = miRNA sqla_session = db.session fields = ["hs_nr","mir_ID"] -class SpongeRunForMirnaSchema(ma.ModelSchema): +class SpongeRunForMirnaSchema(ma.SQLAlchemyAutoSchema): class Meta: model = SpongeRun sqla_session = db.session - dataset = ma.Nested(DatasetSchema, only=("disease_name")) + dataset = ma.Nested(lambda: DatasetSchema(only=("disease_name", ))) -class GeneInteractionDatasetForMiRNSchema(ma.ModelSchema): +class GeneInteractionDatasetForMiRNSchema(ma.SQLAlchemyAutoSchema): class Meta: model = GeneInteraction sqla_session = db.session - sponge_run = ma.Nested(SpongeRunForMirnaSchema, only=("sponge_run_ID","dataset")) - gene1 = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) - gene2 = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + sponge_run = ma.Nested(lambda: SpongeRunForMirnaSchema(only=("sponge_run_ID","dataset"))) + gene1 = ma.Nested(lambda:GeneSchema(only=("ensg_number", "gene_symbol"))) + gene2 = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class miRNAInteractionSchema(ma.ModelSchema): +class miRNAInteractionSchema(ma.SQLAlchemyAutoSchema): class Meta: model = miRNAInteraction sqla_session = db.session fields = ["sponge_run", "gene", "mirna", "coefficient"] - sponge_run = ma.Nested(SpongeRunForMirnaSchema, only=("sponge_run_ID", "dataset")) - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) - mirna = ma.Nested(miRNASchema, only=("mir_ID", "hs_nr")) + sponge_run = ma.Nested(lambda: SpongeRunForMirnaSchema(only=("sponge_run_ID", "dataset"))) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) + mirna = ma.Nested(lambda: miRNASchema(only=("mir_ID", "hs_nr"))) -class networkAnalysisSchema(ma.ModelSchema): +class networkAnalysisSchema(ma.SQLAlchemyAutoSchema): class Meta: model = networkAnalysis sqla_session = db.session fields = ["betweenness", "eigenvector", "gene", "node_degree", "sponge_run"] - sponge_run = ma.Nested(SpongeRunSchema, only=("sponge_run_ID", "dataset")) - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID", "dataset"))) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class geneExpressionSchema(ma.ModelSchema): +class geneExpressionSchema(ma.SQLAlchemyAutoSchema): class Meta: model = GeneExpressionValues sqla_session = db.session fields = ["dataset", "expr_value", "gene", "sample_ID"] - dataset = ma.Nested(DatasetSchema, only=("disease_name")) - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + dataset = ma.Nested(lambda: DatasetSchema(only=("disease_name", ))) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class miRNAExpressionSchema(ma.ModelSchema): +class miRNAExpressionSchema(ma.SQLAlchemyAutoSchema): class Meta: model = MiRNAExpressionValues sqla_session = db.session fields = ["dataset", "expr_value", "mirna", "sample_ID"] - dataset = ma.Nested(DatasetSchema, only=("disease_name")) - mirna = ma.Nested(miRNASchema, only=("mir_ID", "hs_nr")) + dataset = ma.Nested(lambda: DatasetSchema(only=("disease_name", ))) + mirna = ma.Nested(lambda: miRNASchema(only=("mir_ID", "hs_nr"))) -class occurencesMiRNASchema(ma.ModelSchema): +class occurencesMiRNASchema(ma.SQLAlchemyAutoSchema): class Meta: model = OccurencesMiRNA sqla_session = db.session fields = ["mirna", "occurences", "sponge_run"] - sponge_run = ma.Nested(SpongeRunSchema, only=("sponge_run_ID", "dataset")) - mirna = ma.Nested(miRNASchema, only=("mir_ID", "hs_nr")) + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID", "dataset"))) + mirna = ma.Nested(lambda: miRNASchema(only=("mir_ID", "hs_nr"))) -class PatientInformationSchema(ma.ModelSchema): +class PatientInformationSchema(ma.SQLAlchemyAutoSchema): class Meta: model = PatientInformation sqla_session = db.session fields = ["dataset", "sample_ID", "disease_status", "survival_time"] - dataset = ma.Nested(DatasetSchema, only=("disease_name")) + dataset = ma.Nested(lambda: DatasetSchema(only=("disease_name", ))) -class SurvivalRateSchema(ma.ModelSchema): +class SurvivalRateSchema(ma.SQLAlchemyAutoSchema): class Meta: model = SurvivalRate sql_session = db.session fields = ["dataset", "gene", "overexpression", "patient_information"] - dataset = ma.Nested(DatasetSchema, only=("disease_name")) - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) - patient_information = ma.Nested(PatientInformationSchema, only=("sample_ID", "disease_status", "survival_time")) + dataset = ma.Nested(lambda: DatasetSchema(only=("disease_name", ))) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) + patient_information = ma.Nested(lambda: PatientInformationSchema(only=("sample_ID", "disease_status", "survival_time"))) -class SurvivalPValueSchema(ma.ModelSchema): +class SurvivalPValueSchema(ma.SQLAlchemyAutoSchema): class Meta: model = SurvivalPValue sql_session = db.session fields = ["dataset", "gene", "pValue"] - dataset = ma.Nested(DatasetSchema, only=("disease_name")) - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + dataset = ma.Nested(lambda: DatasetSchema(only=("disease_name", ))) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class checkGeneInteractionProCancer(ma.ModelSchema): +class checkGeneInteractionProCancer(ma.SQLAlchemyAutoSchema): class Meta: strict = True @@ -780,16 +780,16 @@ class Meta: sponge_run_ID = fields.Integer() include = fields.Integer() -class GeneCountSchema(ma.ModelSchema): +class GeneCountSchema(ma.SQLAlchemyAutoSchema): class Meta: model = GeneCount sql_session = db.session fields = ["sponge_run", "gene", "count_all", "count_sign"] - sponge_run = ma.Nested(SpongeRunSchema, only=("sponge_run_ID", "dataset")) - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID", "dataset"))) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class OverallCountSchema(ma.ModelSchema): +class OverallCountSchema(ma.SQLAlchemyAutoSchema): class Meta: strict = True @@ -799,31 +799,31 @@ class Meta: disease_name = fields.String() count_shared_miRNAs = fields.Integer() -class GeneOntologySchema(ma.ModelSchema): +class GeneOntologySchema(ma.SQLAlchemyAutoSchema): class Meta: model = GeneOntology sql_session = db.session fields = ["gene", "gene_ontology_symbol", "description"] - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class HallmarksSchema(ma.ModelSchema): +class HallmarksSchema(ma.SQLAlchemyAutoSchema): class Meta: model = hallmarks sql_session = db.session fields = ["gene", "hallmark"] - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class WikipathwaySchema(ma.ModelSchema): +class WikipathwaySchema(ma.SQLAlchemyAutoSchema): class Meta: model = wikipathways sql_session = db.session fields = ["gene", "wp_key"] - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class DistinctGeneSetSchema(ma.ModelSchema): +class DistinctGeneSetSchema(ma.SQLAlchemyAutoSchema): #class Meta: # strict = True @@ -833,134 +833,134 @@ class Meta: sqla_session = db.session fields = ["gene1", "gene2"] - gene1 = ma.Nested(GeneSchema, only=("ensg_number")) - gene2 = ma.Nested(GeneSchema, only=("ensg_number")) + gene1 = ma.Nested(lambda: GeneSchema(only=("ensg_number"))) + gene2 = ma.Nested(lambda: GeneSchema(only=("ensg_number"))) -class TranscriptSchema(ma.ModelSchema): +class TranscriptSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Transcript sqla_session = db.session fields = ["gene", "enst_number", "transcript_type", "start_pos", "end_pos", "canonical_transcript"] - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class SpongEffectsRunSchema(ma.ModelSchema): +class SpongEffectsRunSchema(ma.SQLAlchemyAutoSchema): class Meta: model = SpongEffectsRun sqla_session = db.session sponge_run = ma.Nested(SpongeRunSchema) -class SpongEffectsRunPerformanceSchema(ma.ModelSchema): +class SpongEffectsRunPerformanceSchema(ma.SQLAlchemyAutoSchema): class Meta: model = SpongEffectsRunPerformance sqla_session = db.session spongEffects_run = ma.Nested(SpongEffectsRunSchema) -class SpongEffectsRunClassPerformanceSchema(ma.ModelSchema): +class SpongEffectsRunClassPerformanceSchema(ma.SQLAlchemyAutoSchema): class Meta: model = SpongEffectsRunClassPerformance sqla_session = db.session - spongEffects_run = ma.Nested(SpongEffectsRunPerformanceSchema, only=("model_type", "split_type")) + spongEffects_run = ma.Nested(lambda: SpongEffectsRunPerformanceSchema(only=("model_type", "split_type"))) -class TranscriptInteractionLongSchema(ma.ModelSchema): +class TranscriptInteractionLongSchema(ma.SQLAlchemyAutoSchema): class Meta: model = InteractionsTranscriptTranscript sqla_session = db.session - sponge_run = ma.Nested(SpongeRunSchema, only="sponge_run_ID") - transcript1 = ma.Nested(TranscriptSchema, exclude="transcript_ID") - transcript2 = ma.Nested(TranscriptSchema, exclude="transcript_ID") + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID", ))) + transcript1 = ma.Nested(lambda: TranscriptSchema(exclude="transcript_ID")) + transcript2 = ma.Nested(lambda: TranscriptSchema(exclude="transcript_ID")) -class TranscriptInteractionShortSchema(ma.ModelSchema): +class TranscriptInteractionShortSchema(ma.SQLAlchemyAutoSchema): class Meta: model = InteractionsTranscriptTranscript sqla_session = db.session - sponge_run = ma.Nested(SpongeRunSchema, only="sponge_run_ID") - transcript1 = ma.Nested(TranscriptSchema, only="transcript_ID") - transcript2 = ma.Nested(TranscriptSchema, only="transcript_ID") + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID", ))) + transcript1 = ma.Nested(lambda: TranscriptSchema(only=("transcript_ID", ))) + transcript2 = ma.Nested(lambda: TranscriptSchema(only=("transcript_ID", ))) -class TranscriptInteractionDatasetLongSchema(ma.ModelSchema): +class TranscriptInteractionDatasetLongSchema(ma.SQLAlchemyAutoSchema): class Meta: model = InteractionsTranscriptTranscript sqla_session = db.session fields = ["correlation", "mscor", "p_value", "sponge_run", "transcript1", "transcript2"] - sponge_run = ma.Nested(SpongeRunSchema, only=("sponge_run_ID", "dataset")) + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID", "dataset"))) transcript1 = ma.Nested(TranscriptSchema) transcript2 = ma.Nested(TranscriptSchema) -class TranscriptInteractionDatasetShortSchema(ma.ModelSchema): +class TranscriptInteractionDatasetShortSchema(ma.SQLAlchemyAutoSchema): class Meta: model = InteractionsTranscriptTranscript sqla_session = db.session fields = ["correlation", "mscor", "p_value", "sponge_run", "transcript1", "transcript2"] - sponge_run = ma.Nested(SpongeRunSchema, only=("sponge_run_ID", "dataset")) - transcript1 = ma.Nested(TranscriptSchema, only="enst_number") - transcript2 = ma.Nested(TranscriptSchema, only="enst_number") + sponge_run = ma.Nested(lambda: SpongeRunSchema(only=("sponge_run_ID", "dataset"))) + transcript1 = ma.Nested(lambda: TranscriptSchema(only=("enst_number", ))) + transcript2 = ma.Nested(lambda: TranscriptSchema(only=("enst_number"))) -class GeneEnrichmentScoreSchema(ma.ModelSchema): +class GeneEnrichmentScoreSchema(ma.SQLAlchemyAutoSchema): class Meta: model = EnrichmentScoreGene sqla_session = db.session fields = ["spongEffects_run", "gene", "score_value", "sample_ID"] - spongeEffects_run = ma.Nested(SpongEffectsRun, only=("spongEffects_run_ID", "sponge_run_ID")) - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + spongeEffects_run = ma.Nested(lambda: SpongEffectsRun(only=("spongEffects_run_ID", "sponge_run_ID"))) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class TranscriptEnrichmentScoreSchema(ma.ModelSchema): +class TranscriptEnrichmentScoreSchema(ma.SQLAlchemyAutoSchema): class Meta: model = EnrichmentScoreTranscript sqla_session = db.session fields = ["spongEffects_run", "transcript", "score_value", "sample_ID"] - spongeEffects_run = ma.Nested(SpongEffectsRun, only=("spongEffects_run_ID", "sponge_run_ID")) - transcript = ma.Nested(TranscriptSchema, only="enst_number") + spongeEffects_run = ma.Nested(lambda: SpongEffectsRun(only=("spongEffects_run_ID", "sponge_run_ID"))) + transcript = ma.Nested(lambda: TranscriptSchema(only=("enst_number", ))) -class TranscriptCountSchema(ma.ModelSchema): +class TranscriptCountSchema(ma.SQLAlchemyAutoSchema): class Meta: model = TranscriptCounts sqla_session = db.session fields = ["spongEffects_run", "transcript", "count_all", "count_sign"] - spongeEffects_run = ma.Nested(SpongEffectsRun, only=("spongEffects_run_ID", "sponge_run_ID")) - transcript = ma.Nested(TranscriptSchema, only="enst_number") + spongeEffects_run = ma.Nested(lambda: SpongEffectsRun(only=("spongEffects_run_ID", "sponge_run_ID"))) + transcript = ma.Nested(lambda: TranscriptSchema(only=("enst_number", ))) -class ExpressionDataTranscriptSchema(ma.ModelSchema): +class ExpressionDataTranscriptSchema(ma.SQLAlchemyAutoSchema): class Meta: model = ExpressionDataTranscript sqla_session = db.session fields = ["dataset", "transcript", "expr_value", "sample_ID"] - dataset = ma.Nested(DatasetSchema, only="disease_name") - transcript = ma.Nested(TranscriptSchema, only="enst_number") - gene = ma.Nested(GeneSchema, only=("ensg_number", "gene_symbol")) + dataset = ma.Nested(lambda: DatasetSchema(only=("disease_name", ))) + transcript = ma.Nested(lambda: TranscriptSchema(only=("enst_number", ))) + gene = ma.Nested(lambda: GeneSchema(only=("ensg_number", "gene_symbol"))) -class AlternativeSplicingEventsTranscriptsSchema(ma.ModelSchema): +class AlternativeSplicingEventsTranscriptsSchema(ma.SQLAlchemyAutoSchema): class Meta: model = AlternativeSplicingEventTranscripts sqla_session = db.session fields = ["transcript", "event_name", "event_type"] - transcript = ma.Nested(TranscriptSchema, only="enst_number") + transcript = ma.Nested(lambda: TranscriptSchema(only=("enst_number", ))) -class TranscriptElementPositionsSchema(ma.ModelSchema): +class TranscriptElementPositionsSchema(ma.SQLAlchemyAutoSchema): class Meta: model = TranscriptElementPositions sqla_session = db.session fields = ["start_pos", "end_pos"] -class AlternativeSplicingEventsTranscriptElementsSchema(ma.ModelSchema): +class AlternativeSplicingEventsTranscriptElementsSchema(ma.SQLAlchemyAutoSchema): class Meta: model = AlternativeSplicingEventTranscriptElements sqla_session = db.session @@ -970,7 +970,7 @@ class Meta: transcript_element_positions = ma.Nested(TranscriptElementPositionsSchema) -class TranscriptElementSchema(ma.ModelSchema): +class TranscriptElementSchema(ma.SQLAlchemyAutoSchema): class Meta: model = TranscriptElement sqla_session = db.session @@ -979,13 +979,13 @@ class Meta: transcript_element_positions = ma.Nested(TranscriptElementPositionsSchema) -class SpongEffectsEnrichmentClassDensitySchema(ma.ModelSchema): +class SpongEffectsEnrichmentClassDensitySchema(ma.SQLAlchemyAutoSchema): class Meta: model = SpongEffectsEnrichmentClassDensity sqla_session = db.session -class SpongEffectsTranscriptModuleSchema(ma.ModelSchema): +class SpongEffectsTranscriptModuleSchema(ma.SQLAlchemyAutoSchema): class Meta: model = SpongEffectsTranscriptModule sqla_session = db.session @@ -996,7 +996,7 @@ class Meta: chromosome_name = fields.String() description = fields.String() -class SpongEffectsGeneModuleSchema(ma.ModelSchema): +class SpongEffectsGeneModuleSchema(ma.SQLAlchemyAutoSchema): class Meta: model = SpongEffectsGeneModule sqla_session = db.session @@ -1007,7 +1007,7 @@ class Meta: description = fields.String() -class SpongEffectsGeneModuleMembersSchema(ma.ModelSchema): +class SpongEffectsGeneModuleMembersSchema(ma.SQLAlchemyAutoSchema): class Meta: strict = True @@ -1017,7 +1017,7 @@ class Meta: member_gene_symbol = fields.String() -class SpongEffectsTranscriptModuleMembersSchema(ma.ModelSchema): +class SpongEffectsTranscriptModuleMembersSchema(ma.SQLAlchemyAutoSchema): class Meta: strict = True @@ -1029,76 +1029,76 @@ class Meta: member_ensg_number = fields.String() member_gene_symbol = fields.String() -class DESchema(ma.ModelSchema): +class DESchema(ma.SQLAlchemyAutoSchema): class Meta: model = DifferentialExpression sqla_session = db.session - gene = ma.Nested(GeneSchemaShort, only=("gene_symbol")) + gene = ma.Nested(lambda: GeneSchemaShort(only=("gene_symbol"))) -class DETranscriptSchema(ma.ModelSchema): +class DETranscriptSchema(ma.SQLAlchemyAutoSchema): class Meta: model = DifferentialExpression sqla_session = db.session - transcript = ma.Nested(GeneSchemaShort, only=("enst_number")) + transcript = ma.Nested(lambda: GeneSchemaShort(only=("enst_number"))) -class DESchemaShort(ma.ModelSchema): +class DESchemaShort(ma.SQLAlchemyAutoSchema): class Meta: model = DifferentialExpression sqla_session = db.session fields = ["gene_ID", "log2FoldChange"] -class GseaResSchema(ma.ModelSchema): +class GseaResSchema(ma.SQLAlchemyAutoSchema): class Meta: model = GseaRes sqla_session = db.session -class GseaLeadGenesSchema(ma.ModelSchema): +class GseaLeadGenesSchema(ma.SQLAlchemyAutoSchema): class Meta: model = GseaLeadGenes sqla_session = db.session - gene_symbol = ma.Nested(GeneSchemaShort, only=("gene_symbol")) + gene_symbol = ma.Nested(lambda: GeneSchemaShort(only=("gene_symbol"))) -class GseaMatchedGenesSchema(ma.ModelSchema): +class GseaMatchedGenesSchema(ma.SQLAlchemyAutoSchema): class Meta: model = GseaLeadGenes sqla_session = db.session - gene_symbol = ma.Nested(GeneSchemaShort, only=("gene_symbol")) + gene_symbol = ma.Nested(lambda: GeneSchemaShort(only=("gene_symbol"))) -class GseaSchema(ma.ModelSchema): +class GseaSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Gsea sqla_session = db.session fields = ["term", "es", "nes", "pvalue", "fdr", "fwerp", "gene_percent", "lead_genes", "matched_genes", "res"] - lead_genes = ma.Nested(GseaLeadGenesSchema, many=True, only=("gene_symbol")) - matched_genes = ma.Nested(GseaMatchedGenesSchema, many=True, only=("gene_symbol")) - res = ma.Nested(GseaResSchema, many=True, only=("res_ID", "score")) + lead_genes = ma.Nested(lambda: GseaLeadGenesSchema(only=("gene_symbol")), many=True) + matched_genes = ma.Nested(lambda: GseaMatchedGenesSchema(only=("gene_symbol")), many=True) + res = ma.Nested(lambda: GseaResSchema(only=("res_ID", "score")), many=True) -class GseaSchemaPlot(ma.ModelSchema): +class GseaSchemaPlot(ma.SQLAlchemyAutoSchema): class Meta: model = Gsea sqla_session = db.session fields = ["term", "nes", "pvalue", "fdr", "res", "matched_genes", "gsea_ranking_genes"] - res = ma.Nested(GseaResSchema, many=True, only=("res_ID", "score")) + res = ma.Nested(lambda: GseaResSchema(only=("res_ID", "score")), many=True) -class GseaTermsSchema(ma.ModelSchema): +class GseaTermsSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Gsea sqla_session = db.session fields = ["term"] -class GseaSetSchema(ma.ModelSchema): +class GseaSetSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Gsea sqla_session = db.session fields = ["gene_set"] -class ComparisonSchema(ma.ModelSchema): +class ComparisonSchema(ma.SQLAlchemyAutoSchema): class Meta: model = Comparison sqla_session = db.session diff --git a/requirements.txt b/requirements.txt index b363f1d..271b563 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,32 +1,87 @@ +anyio==4.6.0 +asgiref==3.8.1 +attrs==24.2.0 +blinker==1.8.2 +Brotli==1.1.0 certifi==2024.8.30 +cffi==1.17.1 chardet==5.2.0 +charset-normalizer==3.3.2 click==8.1.3 clickclick==1.2.2 connexion[flask]==3.1.0 -flask-cors==4.0.0 +contourpy==1.3.0 +cycler==0.12.1 +exceptiongroup==1.2.2 +Flask==3.0.3 +Flask-Cors==4.0.0 flask-marshmallow==1.2.1 -flask-sqlalchemy==3.1.1 -flask==3.0.3 +Flask-SQLAlchemy==3.1.1 +fonttools==4.54.1 +greenlet==3.1.1 +gunicorn==23.0.0 +h11==0.14.0 +h2==4.1.0 +hpack==4.0.0 +httpcore==1.0.5 +httpx==0.27.2 +hyperframe==6.0.1 idna==3.10 +importlib_metadata==8.5.0 +importlib_resources==6.4.5 inflection==0.5.1 itsdangerous==2.2.0 -jinja2==3.1.4 +Jinja2==3.1.4 +joblib==1.4.2 jsonschema==4.23.0 -markupsafe==2.1.5 -marshmallow-sqlalchemy==1.0.0 +jsonschema-path==0.3.3 +jsonschema-specifications==2023.12.1 +kiwisolver==1.4.7 +lazy-object-proxy==1.10.0 +MarkupSafe==2.1.5 marshmallow==3.22.0 +marshmallow-sqlalchemy==1.0.0 matplotlib==3.9.2 +munkres==1.1.4 mysqlclient==2.2.4 numpy==2.1.1 +openapi-schema-validator==0.6.2 openapi-spec-validator==0.7.1 +packaging==24.1 pandas==2.2.3 -pyyaml==6.0.2 +pathable==0.4.3 +pillow==10.4.0 +pip==24.2 +pkgutil_resolve_name==1.3.10 +pycparser==2.22 +pyparsing==3.1.4 +PySide6==6.7.2 +PySocks==1.7.1 +python-dateutil==2.9.0 +python-multipart==0.0.10 +pytz==2024.1 +PyYAML==6.0.2 +referencing==0.35.1 requests==2.32.3 +rfc3339-validator==0.1.4 +rpds-py==0.20.0 scikit-learn==1.5.2 scipy==1.14.1 +setuptools==75.1.0 +shiboken6==6.7.2 six==1.16.0 -sqlalchemy==2.0.35 -swagger-ui-bundle==1.1.0 +sniffio==1.3.1 +SQLAlchemy==2.0.35 +starlette==0.39.1 +swagger_ui_bundle==1.1.0 +threadpoolctl==3.5.0 +tornado==6.4.1 +typing_extensions==4.12.2 +tzdata==2024.2 urllib3==2.2.3 -uwsgi==2.0.23 -werkzeug==3.0.4 \ No newline at end of file +uvicorn==0.30.6 +uWSGI==2.0.23 +Werkzeug==3.0.4 +wheel==0.44.0 +zipp==3.20.2 +zstandard==0.23.0 diff --git a/spongEffects.py b/spongEffects.py index 00db564..5cc90a1 100644 --- a/spongEffects.py +++ b/spongEffects.py @@ -57,7 +57,7 @@ def get_run_performance(disease_name: str, level: str): .all() if len(query) > 0: - return models.SpongEffectsRunPerformanceSchema(many=True).dump(query).data + return models.SpongEffectsRunPerformanceSchema(many=True).dump(query) else: abort(404, 'No spongEffects model performance found for name: {disease_name}'.format(disease_name=disease_name)) @@ -70,7 +70,7 @@ def get_run_class_performance(disease_name: str, level: str, sponge_db_version: .filter(models.SpongEffectsRunPerformance.spongEffects_run_ID == spongEffects_run_ID) \ .all() if len(query) > 0: - return models.SpongEffectsRunClassPerformanceSchema(many=True).dump(query).data + return models.SpongEffectsRunClassPerformanceSchema(many=True).dump(query) else: abort(404, f'No spongEffects run class performance found for name: {disease_name}') @@ -94,7 +94,7 @@ def get_enrichment_score_class_distributions(disease_name: str, level: str, spon .filter(models.SpongEffectsEnrichmentClassDensity.spongEffects_run_ID == spongEffects_run_ID) \ .all() if len(query) > 0: - return models.SpongEffectsEnrichmentClassDensitySchema(many=True).dump(query).data + return models.SpongEffectsEnrichmentClassDensitySchema(many=True).dump(query) else: abort(404, 'No spongEffects class enrichment score distribution data found for given parameters') @@ -119,7 +119,7 @@ def get_gene_modules(disease_name: str, sponge_db_version: int = 2): session.close() some_engine.dispose() if len(query) > 0: - return models.SpongEffectsGeneModuleSchema(many=True).dump(query).data + return models.SpongEffectsGeneModuleSchema(many=True).dump(query) else: abort(404, "No spongEffects modules found for given disease") @@ -169,7 +169,7 @@ def get_gene_module_members(disease_name: str, ensg_number: str = None, gene_sym session.close() some_engine.dispose() if len(query) > 0: - return models.SpongEffectsGeneModuleMembersSchema(many=True).dump(query).data + return models.SpongEffectsGeneModuleMembersSchema(many=True).dump(query) else: abort(404, "No module members found for given disease name and gene identifier") @@ -195,7 +195,7 @@ def get_transcript_modules(disease_name: str, sponge_db_version: int = 2): session.close() some_engine.dispose() if len(query) > 0: - return models.SpongEffectsTranscriptModuleSchema(many=True).dump(query).data + return models.SpongEffectsTranscriptModuleSchema(many=True).dump(query) else: abort(404, "No spongEffects modules found for given disease") @@ -250,7 +250,7 @@ def get_transcript_module_members(disease_name: str, enst_number: str = None, en session.close() some_engine.dispose() if len(query) > 0: - return models.SpongEffectsGeneModuleMembersSchema(many=True).dump(query).data + return models.SpongEffectsGeneModuleMembersSchema(many=True).dump(query) else: abort(404, "No module members found for given disease name and gene identifier") diff --git a/survivalAnalysis.py b/survivalAnalysis.py index a444e16..c16cba1 100644 --- a/survivalAnalysis.py +++ b/survivalAnalysis.py @@ -1,7 +1,7 @@ from flask import abort import models -def get_patient_information(disease_name=None, sample_ID=None): +def get_patient_information(disease_name=None, sample_ID=None, db_version=2): """ :param disease_name: disease_name of interest :param sample_ID: sample ID of the patient of interest @@ -34,18 +34,23 @@ def get_patient_information(disease_name=None, sample_ID=None): abort(404, "No dataset with given disease_name found") if (sample_ID is not None): - queries.append(models.PatientInformation.sample_ID.in_(sample_ID)) + queries.append(models.PatientInformation.sample_ID.in_([sample_ID])) + + # database version + if db_version is not None: + queries.append(models.Dataset.version == db_version) + result = models.PatientInformation.query \ .filter(*queries) \ .all() if len(result) > 0: - return models.PatientInformationSchema(many=True).dump(result).data + return models.PatientInformationSchema(many=True).dump(result) else: abort(404, "No data found.") -def get_survival_rate(disease_name, ensg_number = None, gene_symbol = None, sample_ID = None): +def get_survival_rate(disease_name, ensg_number = None, gene_symbol = None, sample_ID = None, db_version=2): """ :param disease_name: disease_name of interest :param ensg_number: esng number of the gene of interest @@ -105,21 +110,26 @@ def get_survival_rate(disease_name, ensg_number = None, gene_symbol = None, samp queries.append(models.SurvivalRate.dataset_ID.in_(dataset_IDs)) else: abort(404, "No dataset with given disease_name found") + + # database version + if db_version is not None: + result = models.SurvivalRate.query \ .filter(*queries) \ .all() if len(result) > 0: - return models.SurvivalRateSchema(many=True).dump(result).data + return models.SurvivalRateSchema(many=True).dump(result) else: abort(404, "No data found.") -def get_survival_pValue(disease_name, ensg_number = None, gene_symbol = None): +def get_survival_pValue(disease_name, ensg_number = None, gene_symbol = None, db_version=2): """ :param disease_name: disease_name of interest :param ensg_number: esng number of the gene of interest :param gene_symbol: gene symbol of the gene of interest + :param db_version: database version :return: all pValues for genes of interest for plotting kaplan meier plots """ # test if any of the two identification possibilites is given @@ -161,12 +171,16 @@ def get_survival_pValue(disease_name, ensg_number = None, gene_symbol = None): else: abort(404, "No dataset with given disease_name found") + # database version + if db_version is not None: + queries.append(models.Dataset.version == db_version) + result = models.SurvivalPValue.query \ .filter(*queries) \ .all() if len(result) > 0: - return models.SurvivalPValueSchema(many=True).dump(result).data + return models.SurvivalPValueSchema(many=True).dump(result) else: abort(404, "No data found.")