Coverage for dj/api/engines.py: 100%

26 statements  

« prev     ^ index     » next       coverage.py v7.2.3, created at 2023-04-17 20:05 -0700

1""" 

2Engine related APIs. 

3""" 

4 

5from http import HTTPStatus 

6from typing import List 

7 

8from fastapi import APIRouter, Depends, HTTPException 

9from sqlmodel import Session, select 

10 

11from dj.api.helpers import get_engine 

12from dj.models.engine import Engine, EngineInfo 

13from dj.utils import get_session 

14 

15router = APIRouter() 

16 

17 

18@router.get("/engines/", response_model=List[EngineInfo]) 

19def list_engines(*, session: Session = Depends(get_session)) -> List[EngineInfo]: 

20 """ 

21 List all available engines 

22 """ 

23 return list(session.exec(select(Engine))) 

24 

25 

26@router.get("/engines/{name}/{version}/", response_model=EngineInfo) 

27def get_an_engine( 

28 name: str, version: str, *, session: Session = Depends(get_session) 

29) -> EngineInfo: 

30 """ 

31 Return an engine by name and version 

32 """ 

33 return get_engine(session, name, version) 

34 

35 

36@router.post("/engines/", response_model=EngineInfo, status_code=201) 

37def add_an_engine( 

38 data: EngineInfo, 

39 *, 

40 session: Session = Depends(get_session), 

41) -> EngineInfo: 

42 """ 

43 Add an Engine 

44 """ 

45 try: 

46 get_engine(session, data.name, data.version) 

47 except HTTPException: 

48 pass 

49 else: 

50 raise HTTPException( 

51 status_code=HTTPStatus.CONFLICT, 

52 detail=f"Engine already exists: `{data.name}` version `{data.version}`", 

53 ) 

54 

55 engine = Engine.from_orm(data) 

56 session.add(engine) 

57 session.commit() 

58 session.refresh(engine) 

59 

60 return engine