Skip to content

Commit ab55e5a

Browse files
authored
Merge pull request #173 from EGA-archive/urgentfixes
Patch to fix referenceName=X and referenceName=Y queries + pointing to map schema in $schema under /map
2 parents b530d3b + 8b1cd1d commit ab55e5a

6 files changed

Lines changed: 1662 additions & 20 deletions

File tree

beacon/conf/api_version.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
api_version: v2.1.1
1+
api_version: v2.1.2

beacon/connections/mongo/data/test/genomicVariations.json

Lines changed: 1627 additions & 1 deletion
Large diffs are not rendered by default.

beacon/framework/validator/v2_0_0/map.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def at_least_one_not_none(cls, values):
7575
return values
7676

7777
class MapSchema(BaseModel):
78-
schema: str = Field(alias="$schema", default="https://raw.githubusercontent.com/ga4gh-beacon/beacon-framework-v2/main/configuration/beaconConfigurationSchema.json")
78+
schema: str = Field(alias="$schema", default="https://raw.githubusercontent.com/ga4gh-beacon/beacon-framework-v2/main/configuration/beaconMapSchema.json")
7979
endpointSets: EndpointEntries
8080
def populate_endpoints(self):
8181
# Load all_modules and do a loop per populating EndpointEntries(loaded_module=Endpoint...) and loading the variables _lookup = True by name, getting endpoint_names per each lookup = True.

beacon/models/ga4gh/beacon_v2_default_model/connections/mongo/filters/request_parameters/alphanumeric.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def parse_request_parameters(self, query, filter):
88
# Processing the request parameters as filters, checking which is the id of the property mapped by the request parameter (where the requestParameter points at, several can apply to one property)
99
if filter.id == "identifiers.genomicHGVSId":
1010
# Initialize a dictionary to use for the chromosome query and create the list of chromosome values accepted that come from requestParameters
11-
list_chromosomes = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','X','Y','chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10','chr11','chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19','chr20','chr21','chr22','chr23','chr24','chrX','chrY']
11+
list_chromosomes = ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','X','Y','MT','chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10','chr11','chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19','chr20','chr21','chr22','chr23','chr24','chrX','chrY']
1212
dict_regex={}
1313
# Check if the value of the chromosome is accepted
1414
if filter.value in list_chromosomes:
@@ -25,18 +25,18 @@ def parse_request_parameters(self, query, filter):
2525
prehgvs='^NC_00000'
2626
if filter.value == 'X':
2727
if RequestAttributes.qparams.query.requestParameters["assemblyId"] == 'NCBI36':
28-
dict_regex['$regex']='^NC_000023'+filter.value+'.'+'9:g'
28+
dict_regex['$regex']='^NC_000023'+'.'+'9:g'
2929
elif RequestAttributes.qparams.query.requestParameters["assemblyId"] == 'GRCh37':
30-
dict_regex['$regex']='^NC_000023'+filter.value+'.'+'10:g'
30+
dict_regex['$regex']='^NC_000023'+'.'+'10:g'
3131
elif RequestAttributes.qparams.query.requestParameters["assemblyId"] == 'GRCh38':
32-
dict_regex['$regex']='^NC_000023'+filter.value+'.'+'11:g'
32+
dict_regex['$regex']='^NC_000023'+'.'+'11:g'
3333
elif filter.value == 'Y':
3434
if RequestAttributes.qparams.query.requestParameters["assemblyId"] == 'NCBI36':
35-
dict_regex['$regex']='^NC_000024'+filter.value+'.'+'8:g'
35+
dict_regex['$regex']='^NC_000024'+'.'+'8:g'
3636
elif RequestAttributes.qparams.query.requestParameters["assemblyId"] == 'GRCh37':
37-
dict_regex['$regex']='^NC_000024'+filter.value+'.'+'9:g'
37+
dict_regex['$regex']='^NC_000024'+'.'+'9:g'
3838
elif RequestAttributes.qparams.query.requestParameters["assemblyId"] == 'GRCh38':
39-
dict_regex['$regex']='^NC_000024'+filter.value+'.'+'10:g'
39+
dict_regex['$regex']='^NC_000024'+'.'+'10:g'
4040
elif filter.value in ['14', '21']:
4141
if RequestAttributes.qparams.query.requestParameters["assemblyId"] == 'NCBI36':
4242
dict_regex['$regex']=prehgvs+filter.value+'.'+'7:g'

beacon/request/parameters.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class SequenceQuery(BaseModel, extra='forbid'):
3939
@model_validator(mode='after')
4040
@classmethod
4141
def referenceName_must_have_assemblyId_if_not_HGVSId(cls, values):
42-
if values.referenceName in ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','X','Y','MT','chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10','chr11','chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19','chr20','chr21','chr22','chr23','chrX','chrY','chrMT',1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]:
42+
if values.referenceName in ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','X','Y','MT','chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10','chr11','chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19','chr20','chr21','chr22','chr23','chr24','chrX','chrY','chrMT',1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]:
4343
if values.assemblyId == None:
4444
raise ValueError('if referenceName is just the chromosome: assemblyId parameter is required')
4545
else:
@@ -67,7 +67,7 @@ class RangeQuery(BaseModel, extra='forbid'):
6767
@model_validator(mode='after')
6868
@classmethod
6969
def referenceName_must_have_assemblyId_if_not_HGVSId_2(cls, values):
70-
if values.referenceName in ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','X','Y','MT','chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10','chr11','chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19','chr20','chr21','chr22','chr23','chrX','chrY','chrMT',1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]:
70+
if values.referenceName in ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','X','Y','MT','chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10','chr11','chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19','chr20','chr21','chr22','chr23','chr24','chrX','chrY','chrMT',1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]:
7171
if values.assemblyId == None:
7272
raise ValueError('if referenceName is just the chromosome: assemblyId parameter is required')
7373
else:
@@ -129,7 +129,7 @@ def end_must_be_array_of_integers(cls, v: list) -> list:
129129
@model_validator(mode='after')
130130
@classmethod
131131
def referenceName_must_have_assemblyId_if_not_HGVSId_3(cls, values):
132-
if values.referenceName in ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','X','Y','MT','chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10','chr11','chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19','chr20','chr21','chr22','chr23','chrX','chrY','chrMT',1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]:
132+
if values.referenceName in ['1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','X','Y','MT','chr1','chr2','chr3','chr4','chr5','chr6','chr7','chr8','chr9','chr10','chr11','chr12','chr13','chr14','chr15','chr16','chr17','chr18','chr19','chr20','chr21','chr22','chr23','chr24','chrX','chrY','chrMT',1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]:
133133
if values.assemblyId == None:
134134
raise ValueError('if referenceName is just the chromosome: assemblyId parameter is required')
135135
else:

beacon/tests/__main__.py

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,7 +1026,7 @@ async def test_check_cohorts_g_variants_endpoint_is_working():
10261026
responsetext=await resp.text()
10271027
responsedict=json.loads(responsetext)
10281028
assert responsedict["responseSummary"]["exists"] == True
1029-
assert responsedict["responseSummary"]["numTotalResults"] == 40
1029+
assert responsedict["responseSummary"]["numTotalResults"] == 41
10301030
loop.run_until_complete(test_check_cohorts_g_variants_endpoint_is_working())
10311031
loop.run_until_complete(client.close())
10321032
def test_main_check_datasets_with_limit_endpoint_is_working(self):
@@ -1089,7 +1089,7 @@ async def test_check_datasets_g_variants_endpoint_is_working():
10891089
responsetext=await resp.text()
10901090
responsedict=json.loads(responsetext)
10911091
assert responsedict["responseSummary"]["exists"] == True
1092-
assert responsedict["responseSummary"]["numTotalResults"] == 40
1092+
assert responsedict["responseSummary"]["numTotalResults"] == 41
10931093
loop.run_until_complete(test_check_datasets_g_variants_endpoint_is_working())
10941094
loop.run_until_complete(client.close())
10951095
def test_main_check_datasets_biosamples_endpoint_is_working(self):
@@ -1511,7 +1511,7 @@ async def test_check_datasets_g_variants_endpoint_is_working():
15111511
assert resp.status == 200
15121512
responsetext=await resp.text()
15131513
responsedict=json.loads(responsetext)
1514-
assert responsedict["responseSummary"]["numTotalResults"] == 40
1514+
assert responsedict["responseSummary"]["numTotalResults"] == 41
15151515
loop.run_until_complete(test_check_datasets_g_variants_endpoint_is_working())
15161516
loop.run_until_complete(client.close())
15171517
def test_main_check_alphanumeric_equal_query_is_working(self):
@@ -2881,20 +2881,36 @@ async def test_check_g_variants_endpoint_with_parameters_is_working():
28812881
assert resp.status == 200
28822882
responsetext=await resp.text()
28832883
responsedict=json.loads(responsetext)
2884-
assert responsedict["responseSummary"]["exists"] == False
2884+
assert responsedict["responseSummary"]["exists"] == True
2885+
assert responsedict["responseSummary"]["numTotalResults"] == 1
28852886
loop.run_until_complete(test_check_g_variants_endpoint_with_parameters_is_working())
28862887
loop.run_until_complete(client.close())
2887-
def test_main_check_g_variants_range_query_chrY(self):
2888+
def test_main_check_g_variants_sequence_query_chrX(self):
28882889
with loop_context() as loop:
28892890
app = create_app()
28902891
client = TestClient(TestServer(app), loop=loop)
28912892
loop.run_until_complete(client.start_server())
28922893
async def test_check_g_variants_endpoint_with_parameters_is_working():
2893-
resp = await client.get(conf_override.config.uri_subpath+"/"+genomicVariant["genomicVariant"]["endpoint_name"]+"?start=31120923&referenceName=Y&assemblyId=GRCh37&end=31121924&testMode=true")
2894+
resp = await client.get(conf_override.config.uri_subpath+"/"+genomicVariant["genomicVariant"]["endpoint_name"]+"?start=31121923&referenceName=X&assemblyId=GRCh37&referenceBases=T&alternateBases=C&testMode=true")
28942895
assert resp.status == 200
28952896
responsetext=await resp.text()
28962897
responsedict=json.loads(responsetext)
2897-
assert responsedict["responseSummary"]["exists"] == False
2898+
assert responsedict["responseSummary"]["exists"] == True
2899+
assert responsedict["responseSummary"]["numTotalResults"] == 1
2900+
loop.run_until_complete(test_check_g_variants_endpoint_with_parameters_is_working())
2901+
loop.run_until_complete(client.close())
2902+
def test_main_check_g_variants_range_sequence_chrY(self):
2903+
with loop_context() as loop:
2904+
app = create_app()
2905+
client = TestClient(TestServer(app), loop=loop)
2906+
loop.run_until_complete(client.start_server())
2907+
async def test_check_g_variants_endpoint_with_parameters_is_working():
2908+
resp = await client.get(conf_override.config.uri_subpath+"/"+genomicVariant["genomicVariant"]["endpoint_name"]+"?start=14191773&referenceBases=A&alternateBases=G&assemblyId=GRCh37&referenceName=Y")
2909+
assert resp.status == 200
2910+
responsetext=await resp.text()
2911+
responsedict=json.loads(responsetext)
2912+
assert responsedict["responseSummary"]["exists"] == True
2913+
assert responsedict["responseSummary"]["numTotalResults"] == 1
28982914
loop.run_until_complete(test_check_g_variants_endpoint_with_parameters_is_working())
28992915
loop.run_until_complete(client.close())
29002916
def test_main_check_limit_query_is_working(self):

0 commit comments

Comments
 (0)