Migrate to ruff

This commit is contained in:
2023-01-07 23:13:00 +01:00
parent 14e9347047
commit ce1010f590
14 changed files with 675 additions and 402 deletions

View File

@@ -6,15 +6,14 @@ repos:
hooks:
- id: black
language_version: python3.11
- repo: https://github.com/pycqa/isort
rev: v5.11.3
- repo: https://github.com/charliermarsh/ruff-pre-commit
rev: 'v0.0.213'
hooks:
- id: isort
- repo: https://github.com/csachs/pyproject-flake8
rev: v6.0.0.post1
- id: ruff
args: ["--force-exclude"]
- repo: https://github.com/crate-ci/typos
rev: v1.13.6
hooks:
- id: pyproject-flake8
additional_dependencies: [
'-e', 'git+https://github.com/pycqa/pyflakes@b37f91a#egg=pyflakes',
'-e', 'git+https://github.com/pycqa/pycodestyle@1063db8#egg=pycodestyle',
]
- id: typos

949
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -5,22 +5,25 @@ description = ""
authors = ["Kurbanov Bulat <kurbanovbul@gmail.com>"]
[tool.poetry.dependencies]
python = "^3.9"
fastapi = "^0.85.1"
fastapi-pagination = {extras = ["ormar"], version = "^0.10.0"}
alembic = "^1.8.1"
python = "^3.11"
fastapi = "^0.89.0"
fastapi-pagination = {extras = ["ormar"], version = "^0.11.1"}
alembic = "^1.9.1"
ormar = {extras = ["postgresql"], version = "^0.12.0"}
uvicorn = {extras = ["standart"], version = "^0.19.0"}
httpx = "^0.23.0"
orjson = "^3.8.1"
uvicorn = {extras = ["standard"], version = "^0.20.0"}
httpx = "^0.23.3"
orjson = "^3.8.4"
prometheus-fastapi-instrumentator = "^5.9.1"
uvloop = "^0.17.0"
gunicorn = "^20.1.0"
sentry-sdk = "^1.10.1"
redis = {extras = ["hiredis"], version = "^4.3.4"}
sentry-sdk = "^1.12.1"
redis = {extras = ["hiredis"], version = "^4.4.0"}
[tool.poetry.dev-dependencies]
[tool.poetry.group.dev.dependencies]
pre-commit = "^2.21.0"
[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
@@ -36,31 +39,38 @@ exclude = '''
)/
'''
[tool.flake8]
ignore = [
# Whitespace before ':' ( https://www.flake8rules.com/rules/E203.html )
"E203"
]
max-line-length=88
max-complexity = 15
select = "B,C,E,F,W,T4,B9"
[tool.ruff]
fix = true
target-version = "py311"
src = ["app"]
line-length=88
ignore = []
select = ["B", "C", "E", "F", "W", "B9", "I001"]
exclude = [
# No need to traverse our git directory
".git",
# There's no value in checking cache directories
"__pycache__",
# The conf file is mostly autogenerated, ignore it
"src/app/alembic/*",
# The old directory contains Flake8 2.0
"src/app/alembic",
]
[tool.isort]
profile = "black"
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",]
src_paths = ["src"]
[tool.ruff.flake8-bugbear]
extend-immutable-calls = ["fastapi.File", "fastapi.Form", "fastapi.Security"]
[tool.ruff.mccabe]
max-complexity = 15
[tool.ruff.isort]
known-first-party = ["core", "app"]
# 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",]
[tool.ruff.pyupgrade]
keep-runtime-typing = true

View File

@@ -1,6 +1,5 @@
import httpx
response = httpx.get("http://localhost:8080/healthcheck")
print(f"HEALTHCHECK STATUS: {response.status_code}")
exit(0 if response.status_code == 200 else 1)

View File

@@ -2,10 +2,8 @@ import os
import sys
from alembic import context
from sqlalchemy.engine import create_engine
from core.db import DATABASE_URL
from sqlalchemy.engine import create_engine
myPath = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, myPath + "/../../")
@@ -15,7 +13,6 @@ config = context.config
from app.models import BaseMeta
target_metadata = BaseMeta.metadata

View File

@@ -1,4 +1,4 @@
from fastapi import Security, HTTPException, status
from fastapi import HTTPException, Security, status
from core.auth import default_security
from core.config import env_config

View File

@@ -2,7 +2,7 @@ from datetime import datetime
import ormar
from core.db import metadata, database
from core.db import database, metadata
class BaseMeta(ormar.ModelMeta):

View File

@@ -1,12 +1,12 @@
from typing import cast
from app.models import User, Language
from app.models import Language, User
async def update_user_allowed_langs(user: User, new_allowed_langs: list[str]) -> bool:
user_allowed_langs = cast(list[Language], user.allowed_langs)
exists_langs = set(lang.code for lang in user_allowed_langs)
exists_langs = {lang.code for lang in user_allowed_langs}
new_langs = set(new_allowed_langs)
to_delete = exists_langs - new_langs

View File

@@ -1,8 +1,7 @@
from typing import Optional, Union
from fastapi import HTTPException, status
import orjson
from fastapi import HTTPException, status
from redis import asyncio as aioredis
from app.models import User
@@ -134,9 +133,9 @@ class UsersDataManager:
if new_data[key] != old_data[key]:
return True
if allowed_langs and set(allowed_langs) != set(
[lang.code for lang in old_user.allowed_langs]
):
if allowed_langs and set(allowed_langs) != {
lang.code for lang in old_user.allowed_langs
}:
return True
return False

View File

@@ -1,23 +1,21 @@
from datetime import datetime
from fastapi import APIRouter, HTTPException, status, Depends, Request
from fastapi import APIRouter, Depends, HTTPException, Request, status
from fastapi_pagination import Page, Params
from fastapi_pagination.ext.ormar import paginate
from redis import asyncio as aioredis
from app.depends import check_token
from app.models import User, Language, UserActivity
from app.models import Language, User, UserActivity
from app.serializers import (
UserCreateOrUpdate,
UserUpdate,
UserDetail,
CreateLanguage,
LanguageDetail,
UserCreateOrUpdate,
UserDetail,
UserUpdate,
)
from app.services.users_data_manager import UsersDataManager
users_router = APIRouter(
prefix="/users", tags=["users"], dependencies=[Depends(check_token)]
)

View File

@@ -1,11 +1,10 @@
from fastapi import FastAPI
from fastapi.responses import ORJSONResponse
from fastapi_pagination import add_pagination
from prometheus_fastapi_instrumentator import Instrumentator
from redis import asyncio as aioredis
from app.views import users_router, languages_router, healthcheck_router
from app.views import healthcheck_router, languages_router, users_router
from core.config import env_config
from core.db import database

View File

@@ -1,4 +1,3 @@
from fastapi.security import APIKeyHeader
default_security = APIKeyHeader(name="Authorization")

View File

@@ -5,7 +5,6 @@ from sqlalchemy import MetaData
from core.config import env_config
DATABASE_URL = (
f"postgresql://{env_config.POSTGRES_USER}:{quote(env_config.POSTGRES_PASSWORD)}@"
f"{env_config.POSTGRES_HOST}:{env_config.POSTGRES_PORT}/{env_config.POSTGRES_DB}"

View File

@@ -4,7 +4,6 @@ from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
from core.app import start_app
from core.config import env_config
sentry_sdk.init(dsn=env_config.SENTRY_SDN)
app = SentryAsgiMiddleware(start_app())