Source code for fastapi_app

"""This module defines web services that compute FizzBuzz sequence.
To run a server instance for manual testing use script ``run_fastapi_server.sh`` located in project root folder.
Then, in a web browser, open http://localhost:8000/docs or http://localhost:8000/redoc to see available services.
"""

from fastapi import Depends, FastAPI, Query
from fizzbuzz_lib import classic_fizzbuzz_as_gen_text, classic_fizzbuzz_as_text
from starlette.responses import PlainTextResponse, StreamingResponse

from fastapi_app.constants import (CLASSIC_FIZZBUZZ_PREFIX, N_ARGS_NAME,
                                   SEP_ARGS_NAME, STREAM_PATH)

app = FastAPI()

_classic_fizzbuzz_tag = 'Classic FizzBuzz'


class _ClassicFizzBuzzParams:
    def __init__(
        self,
        n: int = Query(..., description="The maximum number of the sequence",
                       alias=N_ARGS_NAME),
        sep: str = Query(' ', description="The separator of each element in the sequence",
                         alias=SEP_ARGS_NAME)
    ) -> None:
        self.n = n
        self.sep = sep


[docs]@app.get(f'/{CLASSIC_FIZZBUZZ_PREFIX}/', tags=[_classic_fizzbuzz_tag], response_class=PlainTextResponse) async def get_classic_fizzbuzz_as_text(params: _ClassicFizzBuzzParams = Depends()): """Gives classic FizzBuzz result as a single plain text """ return classic_fizzbuzz_as_text(params.n, params.sep)
[docs]@app.get(f'/{CLASSIC_FIZZBUZZ_PREFIX}/{STREAM_PATH}', tags=[_classic_fizzbuzz_tag]) async def get_classic_fizzbuzz_as_stream(params: _ClassicFizzBuzzParams = Depends()): """Gives classic FizzBuzz result as a stream """ async def f(): for x in classic_fizzbuzz_as_gen_text(params.n, params.sep): yield x return StreamingResponse(f(), media_type='text/plain')