From d15d81005cd1bb674eae1cd3fb1f8cf7e348bf52 Mon Sep 17 00:00:00 2001 From: Michael Baudis <675030+mbaudis@users.noreply.github.com> Date: Thu, 7 Mar 2024 10:49:20 +0100 Subject: [PATCH] 1.6.2 --- bycon/definitions/argument_definitions.yaml | 6 ++-- bycon/definitions/beacon_defaults.yaml | 7 ---- bycon/lib/beacon_response_generation.py | 34 ++++++++++++++++--- bycon/lib/bycon_helpers.py | 4 ++- bycon/lib/cgi_parsing.py | 3 +- bycon/lib/variant_mapping.py | 4 +-- .../progenetix-model/cohorts/endpoints.json | 24 ++----------- .../progenetix-model/datasets/endpoints.json | 24 ++----------- .../progenetix-model/cohorts/endpoints.yaml | 10 ++---- .../progenetix-model/datasets/endpoints.yaml | 10 ++---- docs/changes.md | 12 +++++++ local/beacon_defaults.yaml | 1 - setup.py | 2 +- updev.sh | 2 +- 14 files changed, 63 insertions(+), 80 deletions(-) diff --git a/bycon/definitions/argument_definitions.yaml b/bycon/definitions/argument_definitions.yaml index 193b40073..7dc2e6a10 100644 --- a/bycon/definitions/argument_definitions.yaml +++ b/bycon/definitions/argument_definitions.yaml @@ -69,7 +69,9 @@ include_resultset_responses: type: string cmdFlags: - --includeResultsetResponses - description: requested schema, e.g. biosample + description: >- + * include resultset responses, e.g. HIT, MISS + * kind of a holdover from Beacon pre-v1 # query / data selection @@ -120,7 +122,7 @@ assembly_id: cmdFlags: - --assemblyId description: assembly id - default: GRCh38 + # default: GRCh38 reference_name: type: string diff --git a/bycon/definitions/beacon_defaults.yaml b/bycon/definitions/beacon_defaults.yaml index 0cdd3f64b..a2755a0ae 100644 --- a/bycon/definitions/beacon_defaults.yaml +++ b/bycon/definitions/beacon_defaults.yaml @@ -71,7 +71,6 @@ entity_defaults: beacon_schema: entity_type: configuration schema: https://progenetix.org/services/schemas/beaconInfoResults/ - h->o_access_key: Null content: {} ################################################################################ @@ -85,7 +84,6 @@ entity_defaults: beacon_schema: entity_type: map schema: https://progenetix.org/services/schemas/beaconMapSchema/ - h->o_access_key: Null ################################################################################ @@ -98,7 +96,6 @@ entity_defaults: beacon_schema: entity_type: configuration schema: https://progenetix.org/services/schemas/beaconConfigurationSchema/ - h->o_access_key: Null ################################################################################ @@ -111,7 +108,6 @@ entity_defaults: beacon_schema: entity_type: entryType schema: https://progenetix.org/services/schemas/entryTypesSchema/ - h->o_access_key: Null ################################################################################ @@ -124,7 +120,6 @@ entity_defaults: beacon_schema: entity_type: filteringTerm schema: https://progenetix.org/services/schemas/filteringTermsSchema/ - h->o_access_key: Null ################################################################################ @@ -206,7 +201,6 @@ entity_defaults: pagination: skip: 0 limit: 10 - include_resultset_responses: false ############################################################################## @@ -222,5 +216,4 @@ entity_defaults: pagination: skip: 0 limit: 10 - include_resultset_responses: false diff --git a/bycon/lib/beacon_response_generation.py b/bycon/lib/beacon_response_generation.py index 939aa2b55..3893f70c7 100644 --- a/bycon/lib/beacon_response_generation.py +++ b/bycon/lib/beacon_response_generation.py @@ -164,14 +164,16 @@ def collectionsResponse(self): return colls, queries = ByconCollections(self.byc).populatedCollections() + colls = self.__collections_response_remap_cohorts(colls) self.data_response["response"].update({"collections": colls}) self.record_queries.update({"entities": queries}) self.__collections_response_update_summaries() self.__meta_add_received_request_summary_parameters() self.__meta_add_parameters() self.__meta_clean_parameters() - self.__response_clean_parameters() self.__check_switch_to_error_response() + # self.__response_clean_parameters() + self.data_response.get("meta", {}).get("received_request_summary", {}).pop("include_resultset_responses", None) return self.data_response @@ -224,6 +226,31 @@ def __resultSetResponse_force_autorized_granularities(self): self.data_response.pop("response", None) + # -------------------------------------------------------------------------# + + def __collections_response_remap_cohorts(self, colls=[]): + if not "cohort" in self.byc.get("response_entity_id", "___none___"): + return colls + pop_keys = ["_id", "child_terms", "code_matches", "count", "dataset_id", "db_key", "namespace_prefix", "ft_type", "collation_type", "hierarchy_paths", "parent_terms", "scope"] + for c in colls: + c_k = f'{c.get("scope", "")}.{c.get("db_key", "")}' + c.update({ + "id": c.get("id", "___none___"), + "cohort_type": "beacon-defined", + "cohort_size": c.get("count"), + "name": c.get("label", ""), + # "inclusion_criteria": { + # "description": c.get("description", "NA"), + # c_k: c.get("id"), + # "dataset_id": c.get("dataset_id") + # } + }) + for k in pop_keys: + c.pop(k, None) + + return colls + + # -------------------------------------------------------------------------# def __response_clean_parameters(self): @@ -235,9 +262,8 @@ def __response_clean_parameters(self): def __meta_clean_parameters(self): r_m = self.data_response.get("meta", {}) - - if "beaconCollectionsResponse" in self.response_schema: - r_m.get("received_request_summary", {}).pop("include_resultset_responses", None) + # TBD?! + # -------------------------------------------------------------------------# diff --git a/bycon/lib/bycon_helpers.py b/bycon/lib/bycon_helpers.py index 12fba1ca2..b3bd81ea5 100644 --- a/bycon/lib/bycon_helpers.py +++ b/bycon/lib/bycon_helpers.py @@ -40,7 +40,9 @@ def set_debug_state(debug=False) -> bool: def refactor_value_from_defined_type(parameter, values, definition): p_d_t = definition.get("type", "string") values = list(x for x in values if x is not None) - values = list(x for x in values if x != "None") + values = list(x for x in values if x.lower() not in ["none", "null"]) + if len(values) == 0: + return None if "array" in p_d_t: p_i_t = definition.get("items", "string") if "int" in p_i_t: diff --git a/bycon/lib/cgi_parsing.py b/bycon/lib/cgi_parsing.py index e8990c8fc..e4a2b8645 100644 --- a/bycon/lib/cgi_parsing.py +++ b/bycon/lib/cgi_parsing.py @@ -86,7 +86,8 @@ def parse_GET(byc): # CAVE: Only predefined parameters are accepted! if p_d in a_defs: values = form_return_listvalue(form_data, p) - BYC_PARS.update({p_d: refactor_value_from_defined_type(p, values, a_defs[p_d])}) + if (v := refactor_value_from_defined_type(p, values, a_defs[p_d])): + BYC_PARS.update({p_d: v}) else: w_m = '!!! Unmatched parameter {p_d}: {form_data.getvalue(p)}' BYC["WARNINGS"].append(w_m) diff --git a/bycon/lib/variant_mapping.py b/bycon/lib/variant_mapping.py index 1d919f114..7582224d2 100644 --- a/bycon/lib/variant_mapping.py +++ b/bycon/lib/variant_mapping.py @@ -149,7 +149,8 @@ def vrsVariant(self, variant): # TODO: since the vrs_variant has been created as a new object we now # add the annotation fields back (should empties be omitted?) for v_s in ("biosample_id", "callset_id", "id", "variant_internal_id"): - vrs_v.update({v_s: self.byc_variant.get(v_s)}) + if (v_v := self.byc_variant.get(v_s)): + vrs_v.update({v_s: v_v}) vrs_v.update({"variant_alternative_ids": self.byc_variant.get("variant_alternative_ids", [])}) for v_o in ("identifiers", "info", "molecular_attributes", "variant_level_data"): vrs_v.update({v_o: self.byc_variant.get(v_o, {})}) @@ -222,7 +223,6 @@ def __vrs_cnv(self): def __create_canonical_variant(self): v = self.byc_variant v.update({"errors": []}) - self.__byc_variant_normalize_type() self.__byc_variant_normalize_chromosome() self.__byc_variant_normalize_positions() diff --git a/bycon/schemas/models/json/progenetix-model/cohorts/endpoints.json b/bycon/schemas/models/json/progenetix-model/cohorts/endpoints.json index 9a2938083..b721f0ccb 100644 --- a/bycon/schemas/models/json/progenetix-model/cohorts/endpoints.json +++ b/bycon/schemas/models/json/progenetix-model/cohorts/endpoints.json @@ -274,17 +274,7 @@ "content": { "application/json": { "schema": { - "oneOf": [ - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconBooleanResponse.json" - }, - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCountResponse.json" - }, - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconResultsetsResponse.json" - } - ] + "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json" } } } @@ -294,17 +284,7 @@ "content": { "application/json": { "schema": { - "oneOf": [ - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconBooleanResponse.json" - }, - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCountResponse.json" - }, - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json" - } - ] + "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json" } } } diff --git a/bycon/schemas/models/json/progenetix-model/datasets/endpoints.json b/bycon/schemas/models/json/progenetix-model/datasets/endpoints.json index c2371629e..a56364544 100644 --- a/bycon/schemas/models/json/progenetix-model/datasets/endpoints.json +++ b/bycon/schemas/models/json/progenetix-model/datasets/endpoints.json @@ -397,17 +397,7 @@ "content": { "application/json": { "schema": { - "oneOf": [ - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconBooleanResponse.json" - }, - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCountResponse.json" - }, - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconResultsetsResponse.json" - } - ] + "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json" } } } @@ -417,17 +407,7 @@ "content": { "application/json": { "schema": { - "oneOf": [ - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconBooleanResponse.json" - }, - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCountResponse.json" - }, - { - "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json" - } - ] + "$ref": "https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json" } } } diff --git a/bycon/schemas/models/src/progenetix-model/cohorts/endpoints.yaml b/bycon/schemas/models/src/progenetix-model/cohorts/endpoints.yaml index e38a31bf6..bf9dea057 100644 --- a/bycon/schemas/models/src/progenetix-model/cohorts/endpoints.yaml +++ b/bycon/schemas/models/src/progenetix-model/cohorts/endpoints.yaml @@ -169,19 +169,13 @@ components: content: application/json: schema: - oneOf: - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconBooleanResponse.json - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCountResponse.json - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconResultsetsResponse.json + $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json CollectionsResponse: description: Successful collection list operation. content: application/json: schema: - oneOf: - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconBooleanResponse.json - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCountResponse.json - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json + $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json parameters: requestedSchema: name: requestedSchema diff --git a/bycon/schemas/models/src/progenetix-model/datasets/endpoints.yaml b/bycon/schemas/models/src/progenetix-model/datasets/endpoints.yaml index e47a5bb2d..c6075af0c 100644 --- a/bycon/schemas/models/src/progenetix-model/datasets/endpoints.yaml +++ b/bycon/schemas/models/src/progenetix-model/datasets/endpoints.yaml @@ -244,19 +244,13 @@ components: content: application/json: schema: - oneOf: - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconBooleanResponse.json - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCountResponse.json - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconResultsetsResponse.json + $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json CollectionsResponse: description: Successful collection list operation. content: application/json: schema: - oneOf: - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconBooleanResponse.json - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCountResponse.json - - $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json + $ref: https://raw.githubusercontent.com/ga4gh-beacon/beacon-v2/main/framework/json/responses/beaconCollectionsResponse.json parameters: requestedSchema: name: requestedSchema diff --git a/docs/changes.md b/docs/changes.md index 54ff60cf9..6c74dcdab 100644 --- a/docs/changes.md +++ b/docs/changes.md @@ -13,6 +13,18 @@ through the Perl based [**PGX** project](http://github.com/progenetix/PGX/). ## Changes Tracker +### 2024-03-07 (v1.6.2) + +* adding a `__collections_response_remap_cohorts(self, colls=[])` function + to reformat the collections response for cohorts from the collations format + - TODO: define cohorts as separate entities which are read in during collations + generation, with their additional parameters etc. +* fixed the openAPI endpoints for collation responses (datasets & cohorts); are + [incorrect in current Beacon spec.](https://github.com/ga4gh-beacon/beacon-v2/issues/116) +* bug fix `byconaut`: matrix export was broken since 1.6.1 +* exception capture for wrong form values: string values of "None", "none", "Null", + "null" from GET requests are now converted to logical `None` (i.e. removed) + ### 2024-03-06 (v1.6.1) * bug fix: individuals & phenopackets endpoints were broken in 1.6.0 due to missed diff --git a/local/beacon_defaults.yaml b/local/beacon_defaults.yaml index 55ef4d174..e884613ca 100644 --- a/local/beacon_defaults.yaml +++ b/local/beacon_defaults.yaml @@ -51,7 +51,6 @@ entity_defaults: beacon_schema: entity_type: configuration schema: https://progenetix.org/services/schemas/beaconInfoResults/ - h->o_access_key: Null # TODO: move `content` to `local` file. content: beacon_id: org.progenetix diff --git a/setup.py b/setup.py index 679e42035..6a89ac4db 100755 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ setup( name="bycon", - version="1.6.0", + version="1.6.2", description="A Python-based environment for the Beacon v2 genomics API", long_description=long_description, long_description_content_type="text/markdown", diff --git a/updev.sh b/updev.sh index fc33c4f37..66439ba13 100755 --- a/updev.sh +++ b/updev.sh @@ -9,6 +9,6 @@ BY=(./dist/*tar.gz) pip3 install $BY # pipreqs --force . # python3 -m build --wheel && twine upload dist/* -# git tag v1.6.0 & git push --tags +# git tag v1.6.2 & git push --tags ./install.py ../byconaut/install.py