mirror of
https://github.com/deepset-ai/haystack.git
synced 2025-07-21 07:51:40 +00:00

* Make mypy check also ui and rest_api, fix ui * Remove explicit type packages from extras, mypy now downloads them * Make pylint and mypy run on every file except tests * Rename tasks * Change cache key * Fix mypy errors in rest_api * Normalize python versions to avoid cache misses * Add all exclusions to make pylint pass * Run mypy on rest_api and ui as well * test if installing the package really changes outcome * Comment out installation of packages * Experiment: randomize tests * Add fallback installation steps on cache misses * Remove randomization * Add comment on cache Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
50 lines
1.3 KiB
Python
50 lines
1.3 KiB
Python
import inspect
|
|
from contextlib import contextmanager
|
|
from threading import Semaphore
|
|
from typing import Type, NewType
|
|
|
|
from fastapi import Form, HTTPException
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class RequestLimiter:
|
|
def __init__(self, limit):
|
|
self.semaphore = Semaphore(limit - 1)
|
|
|
|
@contextmanager
|
|
def run(self):
|
|
acquired = self.semaphore.acquire(blocking=False)
|
|
if not acquired:
|
|
raise HTTPException(status_code=503, detail="The server is busy processing requests.")
|
|
try:
|
|
yield acquired
|
|
finally:
|
|
self.semaphore.release()
|
|
|
|
|
|
StringId = NewType("StringId", str)
|
|
|
|
|
|
def as_form(cls: Type[BaseModel]):
|
|
"""
|
|
Adds an as_form class method to decorated models. The as_form class method
|
|
can be used with FastAPI endpoints
|
|
"""
|
|
new_params = [
|
|
inspect.Parameter(
|
|
field.alias,
|
|
inspect.Parameter.POSITIONAL_ONLY,
|
|
default=(Form(field.default) if not field.required else Form(...)),
|
|
)
|
|
for field in cls.__fields__.values()
|
|
]
|
|
|
|
async def _as_form(**data):
|
|
return cls(**data)
|
|
|
|
sig = inspect.signature(_as_form)
|
|
sig = sig.replace(parameters=new_params)
|
|
_as_form.__signature__ = sig # type: ignore
|
|
setattr(cls, "as_form", _as_form)
|
|
return cls
|