[mypy] fixed all and added github action
Some checks failed
Python lint and test / linttest (push) Has been cancelled
Some checks failed
Python lint and test / linttest (push) Has been cancelled
This commit is contained in:
parent
cc2c381dbf
commit
d66eb8affa
10 changed files with 26 additions and 17 deletions
2
.github/workflows/python.yml
vendored
2
.github/workflows/python.yml
vendored
|
@ -30,5 +30,7 @@ jobs:
|
||||||
run: black --check fooder
|
run: black --check fooder
|
||||||
- name: Run flake8
|
- name: Run flake8
|
||||||
run: flake8 fooder
|
run: flake8 fooder
|
||||||
|
- name: Run mypy
|
||||||
|
run: mypy fooder
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: ./test.sh
|
run: ./test.sh
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -34,7 +34,7 @@ version:
|
||||||
.PHONY: create-venv
|
.PHONY: create-venv
|
||||||
create-venv:
|
create-venv:
|
||||||
python3 -m venv .venv --prompt="fooderapi-venv" --system-site-packages
|
python3 -m venv .venv --prompt="fooderapi-venv" --system-site-packages
|
||||||
bash -c "source .venv/bin/activate && pip install -r requirements_local.txt && (echo y | mypy --install-types)"
|
bash -c "source .venv/bin/activate && pip install -r requirements_local.txt"
|
||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test:
|
test:
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
from passlib.context import CryptContext
|
from passlib.context import CryptContext
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker
|
||||||
from sqlalchemy.ext.asyncio import async_sessionmaker
|
|
||||||
from jose import JWTError, jwt
|
from jose import JWTError, jwt
|
||||||
from fastapi.security import OAuth2PasswordBearer
|
from fastapi.security import OAuth2PasswordBearer
|
||||||
from fastapi import Depends, HTTPException
|
from fastapi import Depends, HTTPException
|
||||||
|
@ -108,10 +107,8 @@ async def create_refresh_token(session: AsyncSession, user: User) -> RefreshToke
|
||||||
return await RefreshToken.create(session, token=encoded_jwt, user_id=user.id)
|
return await RefreshToken.create(session, token=encoded_jwt, user_id=user.id)
|
||||||
|
|
||||||
|
|
||||||
async def get_current_user(
|
async def get_current_user(ssn: AsyncSessionDependency, token: TokenDependency) -> User:
|
||||||
session: AsyncSessionDependency, token: TokenDependency
|
async with ssn() as session:
|
||||||
) -> User:
|
|
||||||
async with session() as session:
|
|
||||||
try:
|
try:
|
||||||
payload = jwt.decode(
|
payload = jwt.decode(
|
||||||
token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]
|
token, settings.SECRET_KEY, algorithms=[settings.ALGORITHM]
|
||||||
|
@ -141,9 +138,7 @@ async def get_current_user(
|
||||||
return user
|
return user
|
||||||
|
|
||||||
|
|
||||||
async def authorize_api_key(
|
async def authorize_api_key(token: TokenDependency) -> None:
|
||||||
session: AsyncSessionDependency, token: TokenDependency
|
|
||||||
) -> None:
|
|
||||||
if token == settings.API_KEY:
|
if token == settings.API_KEY:
|
||||||
return None
|
return None
|
||||||
raise HTTPException(status_code=401, detail="Unathorized")
|
raise HTTPException(status_code=401, detail="Unathorized")
|
||||||
|
|
|
@ -8,7 +8,7 @@ from ..domain.user import User
|
||||||
|
|
||||||
AsyncSession = Annotated[async_sessionmaker, Depends(get_session)]
|
AsyncSession = Annotated[async_sessionmaker, Depends(get_session)]
|
||||||
UserDependency = Annotated[User, Depends(get_current_user)]
|
UserDependency = Annotated[User, Depends(get_current_user)]
|
||||||
ApiKeyDependency = Annotated[bool, Depends(authorize_api_key)]
|
ApiKeyDependency = Annotated[None, Depends(authorize_api_key)]
|
||||||
|
|
||||||
|
|
||||||
class BaseController:
|
class BaseController:
|
||||||
|
|
|
@ -39,7 +39,7 @@ class UpdateEntry(AuthorizedController):
|
||||||
|
|
||||||
|
|
||||||
class DeleteEntry(AuthorizedController):
|
class DeleteEntry(AuthorizedController):
|
||||||
async def call(self, entry_id: int) -> Entry:
|
async def call(self, entry_id: int) -> None:
|
||||||
async with self.async_session.begin() as session:
|
async with self.async_session.begin() as session:
|
||||||
entry = await DBEntry.get_by_id(session, self.user.id, entry_id)
|
entry = await DBEntry.get_by_id(session, self.user.id, entry_id)
|
||||||
if entry is None:
|
if entry is None:
|
||||||
|
|
|
@ -29,7 +29,7 @@ class CreateMeal(AuthorizedController):
|
||||||
|
|
||||||
|
|
||||||
class SaveMeal(AuthorizedController):
|
class SaveMeal(AuthorizedController):
|
||||||
async def call(self, meal_id: id, payload: SaveMealPayload) -> Preset:
|
async def call(self, meal_id: int, payload: SaveMealPayload) -> Preset:
|
||||||
async with self.async_session.begin() as session:
|
async with self.async_session.begin() as session:
|
||||||
meal = await DBMeal.get_by_id(session, self.user.id, meal_id)
|
meal = await DBMeal.get_by_id(session, self.user.id, meal_id)
|
||||||
if meal is None:
|
if meal is None:
|
||||||
|
@ -38,7 +38,10 @@ class SaveMeal(AuthorizedController):
|
||||||
try:
|
try:
|
||||||
return Preset.from_orm(
|
return Preset.from_orm(
|
||||||
await DBPreset.create(
|
await DBPreset.create(
|
||||||
session, user_id=self.user.id, name=payload.name, meal=meal
|
session,
|
||||||
|
user_id=self.user.id,
|
||||||
|
name=payload.name or meal.name,
|
||||||
|
meal=meal,
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
except AssertionError as e:
|
except AssertionError as e:
|
||||||
|
@ -46,7 +49,7 @@ class SaveMeal(AuthorizedController):
|
||||||
|
|
||||||
|
|
||||||
class DeleteMeal(AuthorizedController):
|
class DeleteMeal(AuthorizedController):
|
||||||
async def call(self, meal_id: id) -> None:
|
async def call(self, meal_id: int) -> None:
|
||||||
async with self.async_session.begin() as session:
|
async with self.async_session.begin() as session:
|
||||||
meal = await DBMeal.get_by_id(session, self.user.id, meal_id)
|
meal = await DBMeal.get_by_id(session, self.user.id, meal_id)
|
||||||
if meal is None:
|
if meal is None:
|
||||||
|
|
|
@ -32,7 +32,7 @@ class DeletePreset(AuthorizedController):
|
||||||
async def call(
|
async def call(
|
||||||
self,
|
self,
|
||||||
id: int,
|
id: int,
|
||||||
) -> AsyncIterator[Preset]:
|
) -> None:
|
||||||
async with self.async_session.begin() as session:
|
async with self.async_session.begin() as session:
|
||||||
preset = await DBPreset.get(session, self.user.id, id)
|
preset = await DBPreset.get(session, self.user.id, id)
|
||||||
|
|
||||||
|
|
|
@ -41,6 +41,11 @@ class RefreshToken(BaseController):
|
||||||
raise HTTPException(status_code=401, detail="Invalid token")
|
raise HTTPException(status_code=401, detail="Invalid token")
|
||||||
|
|
||||||
user = await DBUser.get(session, current_token.user_id)
|
user = await DBUser.get(session, current_token.user_id)
|
||||||
|
|
||||||
|
if user is None:
|
||||||
|
raise HTTPException(status_code=401, detail="Invalid token")
|
||||||
|
|
||||||
|
assert user is not None
|
||||||
await current_token.delete(session)
|
await current_token.delete(session)
|
||||||
|
|
||||||
refresh_token = await create_refresh_token(session, user)
|
refresh_token = await create_refresh_token(session, user)
|
||||||
|
|
4
mypy.ini
4
mypy.ini
|
@ -10,4 +10,6 @@ platform = linux
|
||||||
|
|
||||||
warn_unused_configs = True
|
warn_unused_configs = True
|
||||||
warn_unused_ignores = True
|
warn_unused_ignores = True
|
||||||
allow_redefinition = True
|
|
||||||
|
[mypy-fooder.controller.*]
|
||||||
|
disable_error_code=override
|
||||||
|
|
|
@ -15,3 +15,5 @@ httpx
|
||||||
aiosqlite
|
aiosqlite
|
||||||
mypy
|
mypy
|
||||||
types-requests
|
types-requests
|
||||||
|
types-passlib
|
||||||
|
types-python-jose
|
||||||
|
|
Loading…
Reference in a new issue