diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1f2d22e..839fe4a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -2,18 +2,17 @@ exclude: 'docs|node_modules|migrations|.git|.tox' repos: - repo: https://github.com/ambv/black - rev: 22.12.0 + rev: 23.3.0 hooks: - id: black language_version: python3.11 - repo: https://github.com/charliermarsh/ruff-pre-commit - rev: 'v0.0.216' + rev: 'v0.0.267' hooks: - id: ruff - args: ["--force-exclude"] - repo: https://github.com/crate-ci/typos - rev: v1.13.6 + rev: typos-dict-v0.9.26 hooks: - id: typos diff --git a/app/main.py b/app/main.py index 0f36687..4d69f66 100644 --- a/app/main.py +++ b/app/main.py @@ -6,16 +6,18 @@ import time from typing import AsyncIterator, Optional import uuid +from fastapi import APIRouter, FastAPI, File, Form, HTTPException, UploadFile, status +from fastapi.responses import StreamingResponse + import aiofiles import aiofiles.os import aiofiles.ospath -from fastapi import APIRouter, FastAPI, File, Form, HTTPException, UploadFile, status -from fastapi.responses import StreamingResponse from fastapi_utils.tasks import repeat_every import sentry_sdk from config import env_config + if env_config.SENTRY_DSN: sentry_sdk.init( env_config.SENTRY_DSN, diff --git a/docker/build.dockerfile b/docker/build.dockerfile index 899bd12..8dcdaa1 100644 --- a/docker/build.dockerfile +++ b/docker/build.dockerfile @@ -39,4 +39,4 @@ COPY ./scripts/healthcheck.py /root/healthcheck.py EXPOSE 8080 -CMD gunicorn -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8080 --timeout 600 +CMD uvicorn main:app --host 0.0.0.0 --port 8080 --loop uvloop --timeout-keep-alive 600 diff --git a/poetry.lock b/poetry.lock index 82baaac..25d388e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -98,14 +98,14 @@ files = [ [[package]] name = "fastapi" -version = "0.95.0" +version = "0.95.1" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "fastapi-0.95.0-py3-none-any.whl", hash = "sha256:daf73bbe844180200be7966f68e8ec9fd8be57079dff1bacb366db32729e6eb5"}, - {file = "fastapi-0.95.0.tar.gz", hash = "sha256:99d4fdb10e9dd9a24027ac1d0bd4b56702652056ca17a6c8721eec4ad2f14e18"}, + {file = "fastapi-0.95.1-py3-none-any.whl", hash = "sha256:a870d443e5405982e1667dfe372663abf10754f246866056336d7f01c21dab07"}, + {file = "fastapi-0.95.1.tar.gz", hash = "sha256:9569f0a381f8a457ec479d90fa01005cfddaae07546eb1f3fa035bc4797ae7d5"}, ] [package.dependencies] @@ -225,27 +225,6 @@ files = [ docs = ["Sphinx", "docutils (<0.18)"] test = ["objgraph", "psutil"] -[[package]] -name = "gunicorn" -version = "20.1.0" -description = "WSGI HTTP Server for UNIX" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, - {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, -] - -[package.dependencies] -setuptools = ">=3.0" - -[package.extras] -eventlet = ["eventlet (>=0.24.1)"] -gevent = ["gevent (>=1.4.0)"] -setproctitle = ["setproctitle"] -tornado = ["tornado (>=0.2)"] - [[package]] name = "h11" version = "0.12.0" @@ -336,25 +315,25 @@ test = ["Cython (>=0.29.24,<0.30.0)"] [[package]] name = "httpx" -version = "0.23.3" +version = "0.24.0" description = "The next generation HTTP client." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"}, - {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"}, + {file = "httpx-0.24.0-py3-none-any.whl", hash = "sha256:447556b50c1921c351ea54b4fe79d91b724ed2b027462ab9a329465d147d5a4e"}, + {file = "httpx-0.24.0.tar.gz", hash = "sha256:507d676fc3e26110d41df7d35ebd8b3b8585052450f4097401c9be59d928c63e"}, ] [package.dependencies] certifi = "*" -httpcore = ">=0.15.0,<0.17.0" -rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]} +httpcore = ">=0.15.0,<0.18.0" +idna = "*" sniffio = "*" [package.extras] brotli = ["brotli", "brotlicffi"] -cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"] +cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (>=1.0.0,<2.0.0)"] @@ -568,39 +547,21 @@ files = [ {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, ] -[[package]] -name = "rfc3986" -version = "1.5.0" -description = "Validating URI References per RFC 3986" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"}, - {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"}, -] - -[package.dependencies] -idna = {version = "*", optional = true, markers = "extra == \"idna2008\""} - -[package.extras] -idna2008 = ["idna"] - [[package]] name = "sentry-sdk" -version = "1.17.0" +version = "1.22.2" description = "Python client for Sentry (https://sentry.io)" category = "main" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.17.0.tar.gz", hash = "sha256:ad40860325c94d1a656da70fba5a7c4dbb2f6809d3cc2d00f74ca0b608330f14"}, - {file = "sentry_sdk-1.17.0-py2.py3-none-any.whl", hash = "sha256:3c4e898f7a3edf5a2042cd0dcab6ee124e2112189228c272c08ad15d3850c201"}, + {file = "sentry-sdk-1.22.2.tar.gz", hash = "sha256:5932c092c6e6035584eb74d77064e4bce3b7935dfc4a331349719a40db265840"}, + {file = "sentry_sdk-1.22.2-py2.py3-none-any.whl", hash = "sha256:cf89a5063ef84278d186aceaed6fb595bfe67d099298e537634a323664265669"}, ] [package.dependencies] certifi = "*" -urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} +urllib3 = {version = ">=1.26.11,<2.0.0", markers = "python_version >= \"3.6\""} [package.extras] aiohttp = ["aiohttp (>=3.5)"] @@ -613,6 +574,7 @@ django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] flask = ["blinker (>=1.1)", "flask (>=0.11)"] +grpcio = ["grpcio (>=1.21.1)"] httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] @@ -631,7 +593,7 @@ tornado = ["tornado (>=5)"] name = "setuptools" version = "65.5.1" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -775,14 +737,14 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "uvicorn" -version = "0.21.1" +version = "0.22.0" description = "The lightning-fast ASGI server." category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "uvicorn-0.21.1-py3-none-any.whl", hash = "sha256:e47cac98a6da10cd41e6fd036d472c6f58ede6c5dbee3dbee3ef7a100ed97742"}, - {file = "uvicorn-0.21.1.tar.gz", hash = "sha256:0fac9cb342ba099e0d582966005f3fdba5b0290579fed4a6266dc702ca7bb032"}, + {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, ] [package.dependencies] @@ -978,4 +940,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.11" -content-hash = "11c345fd8a8befc3cff372d466f4d677037ee0015f01fa920d5ab107d2bb158c" +content-hash = "99802049383d02d30e33a53dedbbf3a76d0ea50fe24b6b450903d5f0d738dac1" diff --git a/pyproject.toml b/pyproject.toml index d3de4d7..d56a4c0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,14 +6,13 @@ authors = ["Kurbanov Bulat "] [tool.poetry.dependencies] python = "^3.11" -fastapi = "^0.95.0" +fastapi = "^0.95.1" python-multipart = "^0.0.6" aiofiles = "^23.1.0" -uvicorn = {extras = ["standard"], version = "^0.21.1"} -httpx = "^0.23.3" +uvicorn = {extras = ["standard"], version = "^0.22.0"} +httpx = "^0.24.0" uvloop = "^0.17.0" -gunicorn = "^20.1.0" -sentry-sdk = "^1.17.0" +sentry-sdk = "^1.22.2" fastapi-utils = "^0.2.1" pydantic = "^1.10.7" @@ -59,14 +58,15 @@ extend-immutable-calls = ["fastapi.File", "fastapi.Form"] max-complexity = 15 [tool.ruff.isort] +known-first-party = ["core", "app"] force-sort-within-sections = true -# only_sections = true -# force_sort_within_sections = true -# lines_after_imports = 2 -# lexicographical = true -# sections = ["FUTURE", "STDLIB", "BASEFRAMEWORK", "FRAMEWORKEXT", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"] -# known_baseframework = ["fastapi",] -# known_frameworkext = ["starlette",] +force-wrap-aliases = true +section-order = ["future", "standard-library", "base_framework", "framework_ext", "third-party", "first-party", "local-folder"] +lines-after-imports = 2 + +[tool.ruff.isort.sections] +base_framework = ["fastapi",] +framework_ext = ["starlette"] [tool.ruff.pyupgrade] keep-runtime-typing = true diff --git a/scripts/healthcheck.py b/scripts/healthcheck.py index 9091896..6f2f501 100644 --- a/scripts/healthcheck.py +++ b/scripts/healthcheck.py @@ -1,5 +1,6 @@ import httpx + response = httpx.get( "http://localhost:8080/healthcheck", )