From 68c57964449b880179aa25d6cc30f586bd97e197 Mon Sep 17 00:00:00 2001 From: Chiara Rasi Date: Wed, 15 Mar 2023 14:25:00 +0100 Subject: [PATCH 1/9] Move inner schug dir one level up --- CHANGELOG.md | 2 ++ pyproject.toml | 2 +- {src/schug => schug}/__init__.py | 0 {src/schug => schug}/cli/__init__.py | 0 {src/schug => schug}/cli/base.py | 0 {src/schug => schug}/cli/fetch.py | 0 {src/schug => schug}/cli/load.py | 0 {src/schug => schug}/cli/serve.py | 0 {src/schug => schug}/config.py | 0 {src/schug => schug}/database/__init__.py | 0 {src/schug => schug}/database/genes.py | 0 {src/schug => schug}/database/session.py | 0 {src/schug => schug}/demo/__init__.py | 0 {src/schug => schug}/demo/exons_37.tsv | 0 {src/schug => schug}/demo/exons_38.tsv | 0 {src/schug => schug}/demo/genes_37.tsv | 0 {src/schug => schug}/demo/genes_38.tsv | 0 {src/schug => schug}/demo/transcripts_37.tsv | 0 {src/schug => schug}/demo/transcripts_38.tsv | 0 {src/schug => schug}/endpoints/__init__.py | 0 {src/schug => schug}/endpoints/exons.py | 0 {src/schug => schug}/endpoints/genes.py | 0 {src/schug => schug}/endpoints/http_exceptions.py | 0 {src/schug => schug}/endpoints/transcripts.py | 0 {src/schug => schug}/load/__init__.py | 0 {src/schug => schug}/load/biomart.py | 0 {src/schug => schug}/load/demo.py | 0 {src/schug => schug}/load/ensembl.py | 0 {src/schug => schug}/load/fetch_resource.py | 0 {src/schug => schug}/load/gene_resources.py | 0 {src/schug => schug}/load/omim.py | 0 {src/schug => schug}/main.py | 0 {src/schug => schug}/models.py | 0 {src/schug => schug}/models/__init__.py | 0 {src/schug => schug}/models/common.py | 0 {src/schug => schug}/models/exon.py | 0 {src/schug => schug}/models/gene.py | 0 {src/schug => schug}/models/link_tables.py | 0 {src/schug => schug}/models/transcript.py | 0 39 files changed, 3 insertions(+), 1 deletion(-) rename {src/schug => schug}/__init__.py (100%) rename {src/schug => schug}/cli/__init__.py (100%) rename {src/schug => schug}/cli/base.py (100%) rename {src/schug => schug}/cli/fetch.py (100%) rename {src/schug => schug}/cli/load.py (100%) rename {src/schug => schug}/cli/serve.py (100%) rename {src/schug => schug}/config.py (100%) rename {src/schug => schug}/database/__init__.py (100%) rename {src/schug => schug}/database/genes.py (100%) rename {src/schug => schug}/database/session.py (100%) rename {src/schug => schug}/demo/__init__.py (100%) rename {src/schug => schug}/demo/exons_37.tsv (100%) rename {src/schug => schug}/demo/exons_38.tsv (100%) rename {src/schug => schug}/demo/genes_37.tsv (100%) rename {src/schug => schug}/demo/genes_38.tsv (100%) rename {src/schug => schug}/demo/transcripts_37.tsv (100%) rename {src/schug => schug}/demo/transcripts_38.tsv (100%) rename {src/schug => schug}/endpoints/__init__.py (100%) rename {src/schug => schug}/endpoints/exons.py (100%) rename {src/schug => schug}/endpoints/genes.py (100%) rename {src/schug => schug}/endpoints/http_exceptions.py (100%) rename {src/schug => schug}/endpoints/transcripts.py (100%) rename {src/schug => schug}/load/__init__.py (100%) rename {src/schug => schug}/load/biomart.py (100%) rename {src/schug => schug}/load/demo.py (100%) rename {src/schug => schug}/load/ensembl.py (100%) rename {src/schug => schug}/load/fetch_resource.py (100%) rename {src/schug => schug}/load/gene_resources.py (100%) rename {src/schug => schug}/load/omim.py (100%) rename {src/schug => schug}/main.py (100%) rename {src/schug => schug}/models.py (100%) rename {src/schug => schug}/models/__init__.py (100%) rename {src/schug => schug}/models/common.py (100%) rename {src/schug => schug}/models/exon.py (100%) rename {src/schug => schug}/models/gene.py (100%) rename {src/schug => schug}/models/link_tables.py (100%) rename {src/schug => schug}/models/transcript.py (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f7a271..55edbd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,6 @@ [unreleased] +### Changed +- Move the `schug` directory up in root dir folder ### Fixed - Use a memory database as default database in demo instance diff --git a/pyproject.toml b/pyproject.toml index 1235da2..b489b6a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "schug" -version = "0.1.0" +version = "1.0.0" description = "Keep track of genes, transcripts and exons from different sources" authors = ["moonso "] readme = "README.md" diff --git a/src/schug/__init__.py b/schug/__init__.py similarity index 100% rename from src/schug/__init__.py rename to schug/__init__.py diff --git a/src/schug/cli/__init__.py b/schug/cli/__init__.py similarity index 100% rename from src/schug/cli/__init__.py rename to schug/cli/__init__.py diff --git a/src/schug/cli/base.py b/schug/cli/base.py similarity index 100% rename from src/schug/cli/base.py rename to schug/cli/base.py diff --git a/src/schug/cli/fetch.py b/schug/cli/fetch.py similarity index 100% rename from src/schug/cli/fetch.py rename to schug/cli/fetch.py diff --git a/src/schug/cli/load.py b/schug/cli/load.py similarity index 100% rename from src/schug/cli/load.py rename to schug/cli/load.py diff --git a/src/schug/cli/serve.py b/schug/cli/serve.py similarity index 100% rename from src/schug/cli/serve.py rename to schug/cli/serve.py diff --git a/src/schug/config.py b/schug/config.py similarity index 100% rename from src/schug/config.py rename to schug/config.py diff --git a/src/schug/database/__init__.py b/schug/database/__init__.py similarity index 100% rename from src/schug/database/__init__.py rename to schug/database/__init__.py diff --git a/src/schug/database/genes.py b/schug/database/genes.py similarity index 100% rename from src/schug/database/genes.py rename to schug/database/genes.py diff --git a/src/schug/database/session.py b/schug/database/session.py similarity index 100% rename from src/schug/database/session.py rename to schug/database/session.py diff --git a/src/schug/demo/__init__.py b/schug/demo/__init__.py similarity index 100% rename from src/schug/demo/__init__.py rename to schug/demo/__init__.py diff --git a/src/schug/demo/exons_37.tsv b/schug/demo/exons_37.tsv similarity index 100% rename from src/schug/demo/exons_37.tsv rename to schug/demo/exons_37.tsv diff --git a/src/schug/demo/exons_38.tsv b/schug/demo/exons_38.tsv similarity index 100% rename from src/schug/demo/exons_38.tsv rename to schug/demo/exons_38.tsv diff --git a/src/schug/demo/genes_37.tsv b/schug/demo/genes_37.tsv similarity index 100% rename from src/schug/demo/genes_37.tsv rename to schug/demo/genes_37.tsv diff --git a/src/schug/demo/genes_38.tsv b/schug/demo/genes_38.tsv similarity index 100% rename from src/schug/demo/genes_38.tsv rename to schug/demo/genes_38.tsv diff --git a/src/schug/demo/transcripts_37.tsv b/schug/demo/transcripts_37.tsv similarity index 100% rename from src/schug/demo/transcripts_37.tsv rename to schug/demo/transcripts_37.tsv diff --git a/src/schug/demo/transcripts_38.tsv b/schug/demo/transcripts_38.tsv similarity index 100% rename from src/schug/demo/transcripts_38.tsv rename to schug/demo/transcripts_38.tsv diff --git a/src/schug/endpoints/__init__.py b/schug/endpoints/__init__.py similarity index 100% rename from src/schug/endpoints/__init__.py rename to schug/endpoints/__init__.py diff --git a/src/schug/endpoints/exons.py b/schug/endpoints/exons.py similarity index 100% rename from src/schug/endpoints/exons.py rename to schug/endpoints/exons.py diff --git a/src/schug/endpoints/genes.py b/schug/endpoints/genes.py similarity index 100% rename from src/schug/endpoints/genes.py rename to schug/endpoints/genes.py diff --git a/src/schug/endpoints/http_exceptions.py b/schug/endpoints/http_exceptions.py similarity index 100% rename from src/schug/endpoints/http_exceptions.py rename to schug/endpoints/http_exceptions.py diff --git a/src/schug/endpoints/transcripts.py b/schug/endpoints/transcripts.py similarity index 100% rename from src/schug/endpoints/transcripts.py rename to schug/endpoints/transcripts.py diff --git a/src/schug/load/__init__.py b/schug/load/__init__.py similarity index 100% rename from src/schug/load/__init__.py rename to schug/load/__init__.py diff --git a/src/schug/load/biomart.py b/schug/load/biomart.py similarity index 100% rename from src/schug/load/biomart.py rename to schug/load/biomart.py diff --git a/src/schug/load/demo.py b/schug/load/demo.py similarity index 100% rename from src/schug/load/demo.py rename to schug/load/demo.py diff --git a/src/schug/load/ensembl.py b/schug/load/ensembl.py similarity index 100% rename from src/schug/load/ensembl.py rename to schug/load/ensembl.py diff --git a/src/schug/load/fetch_resource.py b/schug/load/fetch_resource.py similarity index 100% rename from src/schug/load/fetch_resource.py rename to schug/load/fetch_resource.py diff --git a/src/schug/load/gene_resources.py b/schug/load/gene_resources.py similarity index 100% rename from src/schug/load/gene_resources.py rename to schug/load/gene_resources.py diff --git a/src/schug/load/omim.py b/schug/load/omim.py similarity index 100% rename from src/schug/load/omim.py rename to schug/load/omim.py diff --git a/src/schug/main.py b/schug/main.py similarity index 100% rename from src/schug/main.py rename to schug/main.py diff --git a/src/schug/models.py b/schug/models.py similarity index 100% rename from src/schug/models.py rename to schug/models.py diff --git a/src/schug/models/__init__.py b/schug/models/__init__.py similarity index 100% rename from src/schug/models/__init__.py rename to schug/models/__init__.py diff --git a/src/schug/models/common.py b/schug/models/common.py similarity index 100% rename from src/schug/models/common.py rename to schug/models/common.py diff --git a/src/schug/models/exon.py b/schug/models/exon.py similarity index 100% rename from src/schug/models/exon.py rename to schug/models/exon.py diff --git a/src/schug/models/gene.py b/schug/models/gene.py similarity index 100% rename from src/schug/models/gene.py rename to schug/models/gene.py diff --git a/src/schug/models/link_tables.py b/schug/models/link_tables.py similarity index 100% rename from src/schug/models/link_tables.py rename to schug/models/link_tables.py diff --git a/src/schug/models/transcript.py b/schug/models/transcript.py similarity index 100% rename from src/schug/models/transcript.py rename to schug/models/transcript.py From cf80026ef4a4f11f9840db6620290351ccb1fa4b Mon Sep 17 00:00:00 2001 From: Chiara Rasi Date: Wed, 15 Mar 2023 14:41:04 +0100 Subject: [PATCH 2/9] Fix some sonarcloud issues --- schug/demo/__init__.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/schug/demo/__init__.py b/schug/demo/__init__.py index be291ed..aeac1e6 100644 --- a/schug/demo/__init__.py +++ b/schug/demo/__init__.py @@ -3,13 +3,13 @@ import importlib_resources # Paths -EXONS_37_FILE_PATH: str = Path(importlib_resources.files("schug"), "demo", "exons_37.tsv") -EXONS_38_FILE_PATH: str = Path(importlib_resources.files("schug"), "demo", "exons_38.tsv") -GENES_37_FILE_PATH: str = Path(importlib_resources.files("schug"), "demo", "genes_37.tsv") -GENES_38_FILE_PATH: str = Path(importlib_resources.files("schug"), "demo", "genes_38.tsv") -TRANSCRIPTS_37_FILE_PATH: str = Path( +EXONS_37_FILE_PATH: Path = Path(importlib_resources.files("schug"), "demo", "exons_37.tsv") +EXONS_38_FILE_PATH: Path = Path(importlib_resources.files("schug"), "demo", "exons_38.tsv") +GENES_37_FILE_PATH: Path = Path(importlib_resources.files("schug"), "demo", "genes_37.tsv") +GENES_38_FILE_PATH: Path = Path(importlib_resources.files("schug"), "demo", "genes_38.tsv") +TRANSCRIPTS_37_FILE_PATH: Path = Path( importlib_resources.files("schug"), "demo", "transcripts_37.tsv" ) -TRANSCRIPTS_38_FILE_PATH: str = Path( +TRANSCRIPTS_38_FILE_PATH: Path = Path( importlib_resources.files("schug"), "demo", "transcripts_38.tsv" ) From ac396d8de2a50c542dafc07c56899f846eceefce Mon Sep 17 00:00:00 2001 From: Chiara Rasi Date: Wed, 15 Mar 2023 14:45:21 +0100 Subject: [PATCH 3/9] Fix typing of function --- schug/load/fetch_resource.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/schug/load/fetch_resource.py b/schug/load/fetch_resource.py index 38cc074..0d457b2 100644 --- a/schug/load/fetch_resource.py +++ b/schug/load/fetch_resource.py @@ -1,7 +1,7 @@ import logging import urllib import zlib -from typing import List +from typing import AsyncGenerator, List from urllib.request import urlopen from urllib.response import addinfourl @@ -61,7 +61,7 @@ def fetch_resource(url: str) -> List[str]: return data -async def stream_resource(url: str) -> bytes: +async def stream_resource(url: str) -> AsyncGenerator: """Stream a file from an external service""" async with httpx.AsyncClient(timeout=None) as client: async with client.stream("GET", url) as r: From 4357782f972f1e8b6be56b47a46531ec055c357a Mon Sep 17 00:00:00 2001 From: Chiara Rasi Date: Wed, 15 Mar 2023 14:49:22 +0100 Subject: [PATCH 4/9] Replace repeated string with constant --- schug/main.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/schug/main.py b/schug/main.py index e53850c..3b843ca 100644 --- a/schug/main.py +++ b/schug/main.py @@ -4,6 +4,7 @@ from .endpoints import exons, genes, transcripts app = FastAPI() +NOT_FOUND_MESSAGE = "Not found" ### REST API @@ -17,7 +18,7 @@ async def root(): genes.router, prefix="/genes", tags=["genes"], - responses={status.HTTP_404_NOT_FOUND: {"description": "Not found"}}, + responses={status.HTTP_404_NOT_FOUND: {"description": NOT_FOUND_MESSAGE}}, ) @@ -25,12 +26,12 @@ async def root(): transcripts.router, prefix="/transcripts", tags=["transcripts"], - responses={status.HTTP_404_NOT_FOUND: {"description": "Not found"}}, + responses={status.HTTP_404_NOT_FOUND: {"description": NOT_FOUND_MESSAGE}}, ) app.include_router( exons.router, prefix="/exons", tags=["exons"], - responses={status.HTTP_404_NOT_FOUND: {"description": "Not found"}}, + responses={status.HTTP_404_NOT_FOUND: {"description": NOT_FOUND_MESSAGE}}, ) From ec1a6844e9e7a31298623481aa943d71baf838ce Mon Sep 17 00:00:00 2001 From: Chiara Rasi Date: Wed, 15 Mar 2023 14:55:27 +0100 Subject: [PATCH 5/9] Some more fixes --- schug/load/gene_resources.py | 4 ++-- schug/models/gene.py | 8 ++++---- schug/models/transcript.py | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/schug/load/gene_resources.py b/schug/load/gene_resources.py index 6ff7b3b..593d0a7 100644 --- a/schug/load/gene_resources.py +++ b/schug/load/gene_resources.py @@ -31,7 +31,7 @@ def fetch_hgnc() -> List[str]: Returns: hgnc_gene_lines(list(str)) """ - url = "ftp://ftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt" + url = "sftp://ftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt" LOG.info("Fetching HGNC genes from %s", url) return fetch_resource(url) @@ -41,7 +41,7 @@ def fetch_exac_constraint() -> List[str]: """Fetch the file with exac constraint scores""" file_name = "fordist_cleaned_exac_r03_march16_z_pli_rec_null_data.txt" url = ( - "ftp://ftp.broadinstitute.org/pub/ExAC_release/release0.3/functional_gene_constraint" "/{0}" + "ftp://ftp.broadinstitute.org/pub/ExAC_release/release0.3/functional_gene_constraint/{0}" ).format(file_name) LOG.info("Fetching ExAC genes") diff --git a/schug/models/gene.py b/schug/models/gene.py index 6c6c986..0460507 100644 --- a/schug/models/gene.py +++ b/schug/models/gene.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, List, Optional, Literal +from typing import TYPE_CHECKING, List, Literal, Optional from pydantic import BaseModel from pydantic import Field as PydanticField @@ -50,10 +50,10 @@ def convert_to_none(cls, v): return None return v - @validator('hgnc_id', pre=True) + @validator("hgnc_id", pre=True) def modify_id(cls, v): if type(v) != int: - return v.replace('HGNC:', '') + return v.replace("HGNC:", "") return v @@ -63,7 +63,7 @@ class HgncGene(BaseModel): entrez_id: int hgnc_symbol: str = PydanticField(None, alias="HGNC symbol") hgnc_id: str - ccds_id: str = None + ccds_id: Optional[str] = None short_description: str = PydanticField(None, alias="alias_name") alias_symbol: str diff --git a/schug/models/transcript.py b/schug/models/transcript.py index e9a9dbf..48d88b8 100644 --- a/schug/models/transcript.py +++ b/schug/models/transcript.py @@ -51,7 +51,7 @@ class EnsemblTranscript(BaseModel): refseq_mrna: str = PydanticField(None, alias="RefSeq mRNA ID") refseq_mrna_predicted: str = PydanticField(None, alias="RefSeq mRNA predicted ID") refseq_ncrna_predicted: str = PydanticField(None, alias="RefSeq ncRNA ID") - refseq_id: str = None + refseq_id: Optional[str] = None @validator("refseq_id", always=True) def set_refseq_id(cls, _, values: dict) -> Optional[str]: From 1cef4e3ac7283e5e371484155ab7cf5dc096dab1 Mon Sep 17 00:00:00 2001 From: Chiara Rasi Date: Wed, 15 Mar 2023 14:59:48 +0100 Subject: [PATCH 6/9] Use sftp --- CHANGELOG.md | 1 + schug/load/gene_resources.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55edbd5..4260bb1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - Move the `schug` directory up in root dir folder ### Fixed - Use a memory database as default database in demo instance +- Issues flagged by SonarCloud [1.0.0] ### Added diff --git a/schug/load/gene_resources.py b/schug/load/gene_resources.py index 593d0a7..a6c6204 100644 --- a/schug/load/gene_resources.py +++ b/schug/load/gene_resources.py @@ -27,11 +27,11 @@ def fetch_genes_to_hpo_to_disease() -> List[str]: def fetch_hgnc() -> List[str]: """Fetch the hgnc genes file from - ftp://ftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt + ftp://sftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt Returns: hgnc_gene_lines(list(str)) """ - url = "sftp://ftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt" + url = "sftp://sftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt" LOG.info("Fetching HGNC genes from %s", url) return fetch_resource(url) @@ -41,7 +41,7 @@ def fetch_exac_constraint() -> List[str]: """Fetch the file with exac constraint scores""" file_name = "fordist_cleaned_exac_r03_march16_z_pli_rec_null_data.txt" url = ( - "ftp://ftp.broadinstitute.org/pub/ExAC_release/release0.3/functional_gene_constraint/{0}" + "ftp://sftp.broadinstitute.org/pub/ExAC_release/release0.3/functional_gene_constraint/{0}" ).format(file_name) LOG.info("Fetching ExAC genes") From b45d84484eacf6a9c9ddfc30a94d8f669e668398 Mon Sep 17 00:00:00 2001 From: Chiara Rasi Date: Wed, 15 Mar 2023 15:03:25 +0100 Subject: [PATCH 7/9] Nope, typo --- schug/load/gene_resources.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schug/load/gene_resources.py b/schug/load/gene_resources.py index a6c6204..c40ac16 100644 --- a/schug/load/gene_resources.py +++ b/schug/load/gene_resources.py @@ -31,7 +31,7 @@ def fetch_hgnc() -> List[str]: Returns: hgnc_gene_lines(list(str)) """ - url = "sftp://sftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt" + url = "ftp://sftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt" LOG.info("Fetching HGNC genes from %s", url) return fetch_resource(url) From 05e170f7a6c05be14928b3800c8148383d58ca94 Mon Sep 17 00:00:00 2001 From: Chiara Rasi Date: Wed, 15 Mar 2023 15:07:28 +0100 Subject: [PATCH 8/9] Ok whatever --- schug/load/gene_resources.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/schug/load/gene_resources.py b/schug/load/gene_resources.py index c40ac16..818177f 100644 --- a/schug/load/gene_resources.py +++ b/schug/load/gene_resources.py @@ -31,7 +31,7 @@ def fetch_hgnc() -> List[str]: Returns: hgnc_gene_lines(list(str)) """ - url = "ftp://sftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt" + url = "sftp://sftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt" LOG.info("Fetching HGNC genes from %s", url) return fetch_resource(url) @@ -41,7 +41,7 @@ def fetch_exac_constraint() -> List[str]: """Fetch the file with exac constraint scores""" file_name = "fordist_cleaned_exac_r03_march16_z_pli_rec_null_data.txt" url = ( - "ftp://sftp.broadinstitute.org/pub/ExAC_release/release0.3/functional_gene_constraint/{0}" + "sftp://sftp.broadinstitute.org/pub/ExAC_release/release0.3/functional_gene_constraint/{0}" ).format(file_name) LOG.info("Fetching ExAC genes") From 26eff77f13eda5214c936f14b1196823c5125c97 Mon Sep 17 00:00:00 2001 From: Chiara Rasi Date: Wed, 15 Mar 2023 15:11:47 +0100 Subject: [PATCH 9/9] Fix it also in comment --- schug/load/gene_resources.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/schug/load/gene_resources.py b/schug/load/gene_resources.py index 818177f..6efa327 100644 --- a/schug/load/gene_resources.py +++ b/schug/load/gene_resources.py @@ -27,7 +27,7 @@ def fetch_genes_to_hpo_to_disease() -> List[str]: def fetch_hgnc() -> List[str]: """Fetch the hgnc genes file from - ftp://sftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt + sftp://sftp.ebi.ac.uk/pub/databases/genenames/new/tsv/hgnc_complete_set.txt Returns: hgnc_gene_lines(list(str)) """