Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions compose_api/api/client/models/registered_package.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
from typing import cast

if TYPE_CHECKING:
from ..models.bi_graph_process import BiGraphProcess
from ..models.bi_graph_step import BiGraphStep
from ..models.bi_graph_process import BiGraphProcess


T = TypeVar("T", bound="RegisteredPackage")
Expand All @@ -36,8 +36,8 @@ class RegisteredPackage:
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)

def to_dict(self) -> dict[str, Any]:
from ..models.bi_graph_process import BiGraphProcess
from ..models.bi_graph_step import BiGraphStep
from ..models.bi_graph_process import BiGraphProcess

database_id = self.database_id

Expand Down Expand Up @@ -69,8 +69,8 @@ def to_dict(self) -> dict[str, Any]:

@classmethod
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
from ..models.bi_graph_process import BiGraphProcess
from ..models.bi_graph_step import BiGraphStep
from ..models.bi_graph_process import BiGraphProcess

d = dict(src_dict)
database_id = d.pop("database_id")
Expand Down
14 changes: 2 additions & 12 deletions compose_api/api/introspect_package.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@
def introspect_package(dependencies: ExperimentPrimaryDependencies) -> list[PackageOutline]:
package_outlines = []
for dep in dependencies.get_pypi_dependencies():
package_outlines.append(PackageOutline(package_type=PackageType.PYPI, name=dep, compute=[]))
package_outlines.append(PackageOutline(package_type=PackageType.PYPI, name=dep.get_name(), compute=[]))
for dep in dependencies.get_conda_dependencies():
package_outlines.append(PackageOutline(package_type=PackageType.CONDA, name=dep, compute=[]))
package_outlines.append(PackageOutline(package_type=PackageType.CONDA, name=dep.get_name(), compute=[]))
return package_outlines


Expand All @@ -38,13 +38,3 @@ def _get_package_github_origin(pypi_package: str) -> ParseResult:

# def _live_pypi_introspection(pypi_package: str) -> BiGraphPackage:
# return BiGraphPackage()


if __name__ == "__main__":
packages = introspect_package(
ExperimentPrimaryDependencies(
pypi_dependencies=["git+https://github.com/biosimulators/bspil-basico.git@initial_work"],
conda_dependencies=[],
)
)
print(packages)
24 changes: 16 additions & 8 deletions compose_api/api/routers/curated.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import logging
import os

from fastapi import APIRouter, BackgroundTasks, Depends, UploadFile
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, UploadFile
from jinja2 import Template

from compose_api.common.gateway.models import RouterConfig, ServerMode
Expand All @@ -10,10 +10,11 @@
get_database_service,
)
from compose_api.simulation.handlers import (
run_pbif,
run_curated_pbif,
)
from compose_api.simulation.models import (
SimulationExperiment,
SimulationFileType,
)

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -42,11 +43,13 @@ async def run_copasi(
with open(os.path.dirname(__file__) + "/templates/copasi.jinja") as f:
template = Template(f.read())
render = template.render(start_time=start_time, duration=duration, num_data_points=num_data_points)
loaded_sbml = await get_file_from_uploaded_file(sbml)
return await run_pbif(
request = await get_file_from_uploaded_file(sbml)
if request.simulation_file_type is not SimulationFileType.SBML:
raise HTTPException(status_code=400, detail="Expected a SBML file.")
return await run_curated_pbif(
templated_pbif=render,
simulator_name="Copasi",
loaded_sbml=loaded_sbml,
loaded_sbml=request.request_file_path,
background_tasks=background_tasks,
use_interesting=True,
)
Expand All @@ -66,7 +69,12 @@ async def run_tellurium(
with open(os.path.dirname(__file__) + "/templates/tellurium.jinja") as f:
template = Template(f.read())
render = template.render(start_time=start_time, end_time=end_time, num_data_points=num_data_points)
loaded_sbml = await get_file_from_uploaded_file(sbml)
return await run_pbif(
templated_pbif=render, simulator_name="Tellurium", loaded_sbml=loaded_sbml, background_tasks=background_tasks
request = await get_file_from_uploaded_file(sbml)
if request.simulation_file_type is not SimulationFileType.SBML:
raise HTTPException(status_code=400, detail="Expected a SBML file.")
return await run_curated_pbif(
templated_pbif=render,
simulator_name="Tellurium",
loaded_sbml=request.request_file_path,
background_tasks=background_tasks,
)
4 changes: 1 addition & 3 deletions compose_api/api/routers/simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
from compose_api.simulation.models import (
PBAllowList,
SimulationExperiment,
SimulationRequest,
)

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -54,8 +53,7 @@ async def submit_simulation(background_tasks: BackgroundTasks, uploaded_file: Up
logger.warning("NO VALIDATION YET")
# Tmp file for future implementation

up_file = await get_file_from_uploaded_file(uploaded_file=uploaded_file)
simulation_request = SimulationRequest(omex_archive=up_file)
simulation_request = await get_file_from_uploaded_file(uploaded_file=uploaded_file)

try:
return await run_simulation(
Expand Down
2 changes: 1 addition & 1 deletion compose_api/api/spec/openapi_3_1_0_generated.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
openapi: 3.1.0
info:
title: compose-api
version: 0.2.4
version: 0.3.2
paths:
/curated/copasi:
post:
Expand Down
12 changes: 7 additions & 5 deletions compose_api/common/gateway/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from fastapi import HTTPException, UploadFile

from compose_api.db.database_service import DatabaseService
from compose_api.simulation.models import HpcRun, JobType
from compose_api.simulation.models import HpcRun, JobType, SimulationFileType, SimulationRequest

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -48,15 +48,17 @@ async def get_hpc_run_status(db_service: DatabaseService, ref_id: int, job_type:
return simulation_hpcrun


async def get_file_from_uploaded_file(uploaded_file: UploadFile) -> Path:
async def get_file_from_uploaded_file(uploaded_file: UploadFile) -> SimulationRequest:
if uploaded_file is None or uploaded_file.filename is None or uploaded_file.size == 0:
raise HTTPException(status_code=400, detail="Empty uploaded file")

# TODO Make the suffix dynamic
with tempfile.NamedTemporaryFile(delete=False, suffix="." + uploaded_file.filename.rsplit(".", 1)[1]) as tmp_file:
suffix = Path(uploaded_file.filename).suffix
with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as tmp_file:
contents = await uploaded_file.read()
tmp_file.write(contents)
return Path(tmp_file.name)
return SimulationRequest(
request_file_path=Path(tmp_file.name), simulation_file_type=SimulationFileType.get_file_type(suffix)
)


allow_list = [
Expand Down
52 changes: 26 additions & 26 deletions compose_api/db/services/packages_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,11 +60,11 @@ async def delete_bigraph_package(self, package_id: RegisteredPackage) -> None:
async def delete_bigraph_compute(self, compute: BiGraphCompute) -> None:
pass

@abstractmethod
async def dependencies_not_in_database(
self, dependencies: ExperimentPrimaryDependencies
) -> ExperimentPrimaryDependencies:
pass
# @abstractmethod
# async def dependencies_not_in_database(
# self, dependencies: ExperimentPrimaryDependencies
# ) -> ExperimentPrimaryDependencies:
# pass

@abstractmethod
async def list_packages_from_dependencies(
Expand Down Expand Up @@ -221,33 +221,33 @@ async def delete_bigraph_compute(self, compute: BiGraphCompute) -> None:
raise ValueError(f"Compute id: {compute.database_id} not found in database")
await session.delete(db_rep)

async def dependencies_not_in_database(
self, dependencies: ExperimentPrimaryDependencies
) -> ExperimentPrimaryDependencies:
async with self.async_session_maker() as session:
stmt = select(ORMPackage).where(ORMPackage.name.in_(dependencies.pypi_dependencies))
result: Result[tuple[ORMPackage]] = await session.execute(stmt)
orm_packages = result.scalars().all()
names: tuple[str, ...] = tuple(package.name for package in orm_packages)
pypi_not_in_database: list[str] = []
for pypi in dependencies.pypi_dependencies:
if pypi not in names:
pypi_not_in_database.append(pypi)
conda_not_in_database: list[str] = []
for conda in dependencies.conda_dependencies:
if conda not in names:
conda_not_in_database.append(conda)
return ExperimentPrimaryDependencies(
pypi_dependencies=pypi_not_in_database, conda_dependencies=conda_not_in_database
)
# async def dependencies_not_in_database(
# self, dependencies: ExperimentPrimaryDependencies
# ) -> ExperimentPrimaryDependencies:
# async with self.async_session_maker() as session:
# stmt = select(ORMPackage).where(ORMPackage.name.in_(dependencies.pypi_dependencies))
# result: Result[tuple[ORMPackage]] = await session.execute(stmt)
# orm_packages = result.scalars().all()
# names: tuple[str, ...] = tuple(package.name for package in orm_packages)
# pypi_not_in_database: list[str] = []
# for pypi in dependencies.pypi_dependencies:
# if pypi not in names:
# pypi_not_in_database.append(pypi)
# conda_not_in_database: list[str] = []
# for conda in dependencies.conda_dependencies:
# if conda not in names:
# conda_not_in_database.append(conda)
# return ExperimentPrimaryDependencies(
# pypi_dependencies=pypi_not_in_database, conda_dependencies=conda_not_in_database
# )

async def list_packages_from_dependencies(
self, dependencies: ExperimentPrimaryDependencies
) -> list[RegisteredPackage]:
async with self.async_session_maker() as session:
packages: list[RegisteredPackage] = []
for dep_type in (dependencies.pypi_dependencies, dependencies.conda_dependencies):
stmt = select(ORMPackage).where(ORMPackage.name.in_(dep_type))
for package in dependencies.get_pypi_dependencies() + dependencies.get_conda_dependencies():
stmt = select(ORMPackage).where(ORMPackage.name.in_(package.get_name()))
result: Result[tuple[ORMPackage]] = await session.execute(stmt)
orm_packages = result.scalars().all()
for row in orm_packages:
Expand Down
Loading