diff --git a/bedhost/__init__.py b/bedhost/__init__.py index 8eb6e03..b0a0bf0 100644 --- a/bedhost/__init__.py +++ b/bedhost/__init__.py @@ -1,5 +1,7 @@ -import logmuse import logging + +import logmuse + from .const import PKG_NAME _LOGGER = logmuse.init_logger(PKG_NAME) diff --git a/bedhost/cli.py b/bedhost/cli.py index d5a9f42..ce5e7c0 100644 --- a/bedhost/cli.py +++ b/bedhost/cli.py @@ -1,6 +1,7 @@ +from ubiquerg import VersionInHelpParser + from . import PKG_NAME from ._version import __version__ -from ubiquerg import VersionInHelpParser def build_parser(): diff --git a/bedhost/data_models.py b/bedhost/data_models.py index 1fe9fe3..cb524eb 100644 --- a/bedhost/data_models.py +++ b/bedhost/data_models.py @@ -1,6 +1,7 @@ +from enum import Enum + from fastapi import Path from pydantic import BaseModel -from enum import Enum RemoteClassEnum = Enum( "RemoteClassEnum", @@ -69,3 +70,10 @@ class ServiceInfoResponse(BaseModel): version: str component_versions: ComponentVersions embedding_models: EmbeddingModels + + +class BaseListResponse(BaseModel): + count: int + limit: int + offset: int + results: list diff --git a/bedhost/helpers.py b/bedhost/helpers.py index 363413f..1edbd1c 100644 --- a/bedhost/helpers.py +++ b/bedhost/helpers.py @@ -1,7 +1,7 @@ -from starlette.responses import FileResponse, RedirectResponse, JSONResponse +import os from bbconf.bbagent import BedBaseAgent -import os +from starlette.responses import FileResponse, JSONResponse, RedirectResponse from . import _LOGGER from .exceptions import BedHostException @@ -50,7 +50,7 @@ def attach_routers(app): _LOGGER.info("Mounting routers...") # importing routers here avoids circular imports - from .routers import bed_api, bedset_api, objects_api, base_api + from .routers import base_api, bed_api, bedset_api, objects_api app.include_router(base_api.router) app.include_router(bed_api.router) diff --git a/bedhost/main.py b/bedhost/main.py index b124b88..e5f24e7 100644 --- a/bedhost/main.py +++ b/bedhost/main.py @@ -1,34 +1,24 @@ import os import sys -import uvicorn - -from fastapi import FastAPI, Request -from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import HTMLResponse, RedirectResponse import markdown -from fastapi.templating import Jinja2Templates +import uvicorn from bbconf.exceptions import ( - MissingObjectError, - MissingThumbnailError, BEDFileNotFoundError, BedSetNotFoundError, + MissingObjectError, + MissingThumbnailError, ) - +from fastapi import FastAPI, Request +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import HTMLResponse, RedirectResponse +from fastapi.templating import Jinja2Templates from . import _LOGGER -from .helpers import ( - configure, - attach_routers, - drs_response, -) -from .cli import build_parser from ._version import __version__ as bedhost_version -from .const import ( - PKG_NAME, - STATIC_PATH, -) - +from .cli import build_parser +from .const import PKG_NAME, STATIC_PATH +from .helpers import attach_routers, configure, drs_response tags_metadata = [ { diff --git a/bedhost/routers/base_api.py b/bedhost/routers/base_api.py index 30596b7..307662c 100644 --- a/bedhost/routers/base_api.py +++ b/bedhost/routers/base_api.py @@ -1,26 +1,27 @@ try: - from typing import Annotated, Dict, Optional, List, Any + from typing import Annotated, Any, Dict, List, Optional except ImportError: from typing_extensions import Annotated from typing import Dict, Optional, List, Any -from fastapi import APIRouter - -from bbconf.models.base_models import StatsReturn from platform import python_version + from bbconf import __version__ as bbconf_version +from bbconf.models.base_models import StatsReturn +from fastapi import APIRouter from geniml import __version__ as geniml_version -from ..main import bbagent, app -from ..helpers import get_openapi_version +from .._version import __version__ as bedhost_version from ..data_models import ( - ServiceInfoResponse, - Type, - Organization, + BaseListResponse, ComponentVersions, EmbeddingModels, + Organization, + ServiceInfoResponse, + Type, ) -from .._version import __version__ as bedhost_version +from ..helpers import get_openapi_version +from ..main import app, bbagent router = APIRouter(prefix="/v1", tags=["base"]) @@ -39,6 +40,24 @@ async def get_bedbase_db_stats(): return bbagent.get_stats() +@router.get( + "/genomes", + summary="Get available genomes", + response_model=BaseListResponse, +) +async def get_bedbase_db_stats(): + """ + Returns statistics + """ + genomes = bbagent.get_list_genomes() + return BaseListResponse( + count=len(genomes), + limit=100, + offset=0, + results=genomes, + ) + + @router.get( "/service-info", summary="GA4GH service info", response_model=ServiceInfoResponse ) diff --git a/bedhost/routers/bed_api.py b/bedhost/routers/bed_api.py index 100b56c..67e8d85 100644 --- a/bedhost/routers/bed_api.py +++ b/bedhost/routers/bed_api.py @@ -1,43 +1,41 @@ import subprocess try: - from typing import Annotated, Dict, Optional, List, Any + from typing import Annotated, Any, Dict, List, Optional except ImportError: from typing_extensions import Annotated from typing import Dict, Optional, List, Any -from fastapi import APIRouter, HTTPException, Query, UploadFile, File -from fastapi.responses import PlainTextResponse - -from gtars.tokenizers import RegionSet - -import tempfile import os import shutil +import tempfile +from bbconf.exceptions import ( + BedBaseConfError, + BEDFileNotFoundError, + TokenizeFileNotExistError, +) from bbconf.models.bed_models import ( + BedClassification, # BedPEPHub, + BedEmbeddingResult, + BedFiles, BedListResult, + BedListSearchResult, BedMetadataAll, - BedFiles, - BedStatsModel, - BedPlots, - BedClassification, - # BedPEPHub, BedPEPHubRestrict, - BedListSearchResult, - TokenizedPathResponse, + BedPlots, + BedStatsModel, TokenizedBedResponse, - BedEmbeddingResult, + TokenizedPathResponse, ) -from bbconf.exceptions import BEDFileNotFoundError, TokenizeFileNotExistError +from fastapi import APIRouter, File, HTTPException, Query, UploadFile +from fastapi.responses import PlainTextResponse +from gtars.tokenizers import RegionSet from .. import _LOGGER -from ..main import bbagent -from ..data_models import ( - BedDigest, - CROM_NUMBERS, -) from ..const import EXAMPLE_BED +from ..data_models import CROM_NUMBERS, BaseListResponse, BedDigest +from ..main import bbagent router = APIRouter(prefix="/v1/bed", tags=["bed"]) @@ -238,6 +236,33 @@ async def embed_bed_file( return embedding.tolist()[0] +@router.get( + "/missing_plots", + summary="Get missing plots for a bed file.", + response_model=BaseListResponse, +) +async def missing_plots(plot_id: str): + """ + Get missing plots for a bed file + + example -> plot_id: gccontent + """ + + try: + bed_ids = bbagent.bed.get_missing_plots(plot_id, limit=100000, offset=0) + except BedBaseConfError as e: + raise HTTPException( + status_code=404, + detail=f"{e}", + ) + return BaseListResponse( + count=len(bed_ids), + limit=100000, + offset=0, + results=bed_ids, + ) + + @router.get( "/{bed_id}/regions/{chr_num}", summary="Get regions from a BED file that overlap a query region.", diff --git a/bedhost/routers/bedset_api.py b/bedhost/routers/bedset_api.py index 80e9591..bcf05d3 100644 --- a/bedhost/routers/bedset_api.py +++ b/bedhost/routers/bedset_api.py @@ -1,20 +1,19 @@ -from fastapi import APIRouter, HTTPException, Request, Response import logging +from bbconf.exceptions import BedSetNotFoundError from bbconf.models.bedset_models import ( - BedSetMetadata, - BedSetListResult, BedSetBedFiles, + BedSetListResult, + BedSetMetadata, BedSetPlots, BedSetStats, ) -from bbconf.exceptions import BedSetNotFoundError +from fastapi import APIRouter, HTTPException, Request, Response +from ..const import EXAMPLE_BEDSET, PKG_NAME from ..main import bbagent -from ..const import PKG_NAME, EXAMPLE_BEDSET from ..utils import zip_pep - router = APIRouter(prefix="/v1/bedset", tags=["bedset"]) _LOGGER = logging.getLogger(PKG_NAME) diff --git a/bedhost/routers/objects_api.py b/bedhost/routers/objects_api.py index 4bcf19f..157aba9 100644 --- a/bedhost/routers/objects_api.py +++ b/bedhost/routers/objects_api.py @@ -1,17 +1,16 @@ try: - from typing import Annotated, Dict, Optional, List, Any + from typing import Annotated, Any, Dict, List, Optional except ImportError: from typing_extensions import Annotated from typing import Dict, Optional, List, Any -from fastapi import APIRouter, HTTPException, Request +from urllib.parse import urlparse + from bbconf.models.drs_models import DRSModel +from fastapi import APIRouter, HTTPException, Request +from ..helpers import serve_file from ..main import bbagent -from ..helpers import ( - serve_file, -) -from urllib.parse import urlparse router = APIRouter(prefix="/v1/objects", tags=["objects"]) diff --git a/deployment/config/api-dev.bedbase.org.yaml b/deployment/config/api-dev.bedbase.org.yaml index 447c6d9..95c91b4 100644 --- a/deployment/config/api-dev.bedbase.org.yaml +++ b/deployment/config/api-dev.bedbase.org.yaml @@ -14,7 +14,7 @@ qdrant: host: $QDRANT_HOST port: 6333 api_key: $QDRANT_API_KEY - file_collection: bedbase2 + file_collection: bedbase text_collection: bed_text server: host: 0.0.0.0 diff --git a/deployment/config/api.bedbase.org.yaml b/deployment/config/api.bedbase.org.yaml index 0bcb491..5387d61 100644 --- a/deployment/config/api.bedbase.org.yaml +++ b/deployment/config/api.bedbase.org.yaml @@ -14,7 +14,7 @@ qdrant: host: $QDRANT_HOST port: 6333 api_key: $QDRANT_API_KEY - file_collection: bedbase2 + file_collection: bedbase text_collection: bed_text server: host: 0.0.0.0 diff --git a/requirements/requirements-all.txt b/requirements/requirements-all.txt index 7e97817..47e6589 100644 --- a/requirements/requirements-all.txt +++ b/requirements/requirements-all.txt @@ -1,5 +1,5 @@ -#bbconf @ git+https://github.com/databio/bbconf.git@dev#egg=bbconf -bbconf>=0.8.0 +bbconf @ git+https://github.com/databio/bbconf.git@dev#egg=bbconf +# bbconf>=0.9.0 fastapi>=0.103.0 logmuse>=0.2.7 markdown diff --git a/tests/test_fastapi/test_api.py b/tests/test_fastapi/test_api.py index 87c20ec..e744498 100644 --- a/tests/test_fastapi/test_api.py +++ b/tests/test_fastapi/test_api.py @@ -1,6 +1,7 @@ -from fastapi.testclient import TestClient import os + import pytest +from fastapi.testclient import TestClient # os.environ.setdefault("BEDBASE_CONFIG", os.path.abspath("test_config.yaml")) # from bedhost.main import app