Skip to content

Commit

Permalink
Merge pull request #32 from flavien-hugs/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
flavien-hugs authored Aug 17, 2024
2 parents b9b2292 + 44419b7 commit 9b1c79c
Show file tree
Hide file tree
Showing 22 changed files with 94 additions and 32 deletions.
50 changes: 46 additions & 4 deletions .github/workflows/publish-ghrch.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,58 @@ on:
- "preprod"

jobs:
tests:
runs-on: ubuntu-latest
code-quality:
strategy:
fail-fast: false
matrix:
python-version:
- "3.x"
os: [ ubuntu-latest ]
runs-on: ${{ matrix.os }}
environment:
name: tests
name: code-quality
steps:
- name: Checkout code
uses: actions/checkout@v3

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v3
with:
python-version: ${{ matrix.python-version }}
architecture: 'x64'

- name: Install pipx, Poetry and Upgrade pip/setuptools
run: |
python --version
python -m pip install pipx
python -m pipx ensurepath
python -m pipx install poetry
export PATH=$PATH:/root/.local/bin
poetry env use python
poetry run pip install --upgrade pip setuptools
poetry add black flake8 bandit
- name: Run black
run: poetry run black . --check

- name: Run flake8
run: poetry run flake8 .

- name: Run bandit
run: poetry run bandit .

tests:
needs: [code-quality]
strategy:
fail-fast: false
max-parallel: 4
matrix:
python-version:
- "3.x"

os: [ubuntu-latest]
runs-on: ${{ matrix.os }}
environment:
name: tests
steps:
- name: Checkout code
uses: actions/checkout@v3
Expand Down
20 changes: 18 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@ pwdlib = {extras = ["argon2", "bcrypt"], version = "^0.2.0"}
pydantic-settings = "^2.4.0"
fastapi-jwt = "^0.3.0"
python-jose = "^3.3.0"
fastapi = {extras = ["all"], version = "^0.112.0"}
pyotp = "^2.9.0"
uvloop = "^0.19.0"
httptools = "^0.6.1"
fastapi = {extras = ["standard"], version = "^0.112.1"}
uvloop = "^0.20.0"


[tool.poetry.group.test.dependencies]
Expand All @@ -35,6 +35,11 @@ pytest-dotenv = "^0.5.2"
[tool.poetry.group.dev.dependencies]
pre-commit = "^3.8.0"
ipython = "^8.26.0"
black = "^24.8.0"
bandit = "^1.7.9"
safety = "^3.2.5"
flake8 = "^7.1.1"
flake8-pyproject = "^1.2.3"


[tool.poetry.scripts]
Expand All @@ -44,6 +49,16 @@ app = 'src.cli:app'
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

[tool.flake8]
max-line-length = 120
exclude = [
".git",
"*tests*",
"*common*",
"__pycache__"
]


[tool.black]
line-length = 120
include = '\.pyi?$'
Expand All @@ -62,6 +77,7 @@ exclude = '''
| buck-out
| build
| dist
| tests
)/
)
'''
Expand Down
3 changes: 1 addition & 2 deletions src/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
from contextlib import asynccontextmanager
from typing import TypedDict

from fastapi import FastAPI
from fastapi import HTTPException
from fastapi import FastAPI, HTTPException
from fastapi.encoders import jsonable_encoder
from fastapi.responses import RedirectResponse
from fastapi_pagination import add_pagination
Expand Down
1 change: 1 addition & 0 deletions src/config/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from fastapi import FastAPI

from src.common.helpers.mongodb import mongodb_client

from .settings import get_settings

logging.basicConfig(format="%(message)s", level=logging.INFO)
Expand Down
1 change: 0 additions & 1 deletion src/middleware/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from .auth import AuthorizedHTTPBearer, CheckPermissionsHandler, CustomAccessBearer


AuthorizedHTTPBearer = AuthorizedHTTPBearer()

__all__ = ["AuthorizedHTTPBearer", "CheckPermissionsHandler", "CustomAccessBearer"]
4 changes: 2 additions & 2 deletions src/middleware/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
from fastapi import Request, status
from fastapi.security import HTTPBearer
from fastapi_jwt import JwtAccessBearer
from jose import ExpiredSignatureError, jwt, JWTError
from jose import ExpiredSignatureError, JWTError, jwt
from pwdlib import PasswordHash
from pwdlib.hashers.argon2 import Argon2Hasher
from pwdlib.hashers.bcrypt import BcryptHasher

from src.common.helpers.exceptions import CustomHTTException
from src.config import jwt_settings
from src.services.roles import get_one_role
from src.shared.error_codes import AuthErrorCode
from src.shared import blacklist_token
from src.shared.error_codes import AuthErrorCode

logging.basicConfig(format="%(message)s", level=logging.INFO)

Expand Down
2 changes: 1 addition & 1 deletion src/models/mixins.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from datetime import datetime

from beanie import after_event, Update
from beanie import Update, after_event
from pydantic import Field


Expand Down
3 changes: 2 additions & 1 deletion src/models/roles.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
from typing import Dict, List, Optional

import pymongo
from beanie import before_event, Document, Indexed, Insert
from beanie import Document, Indexed, Insert, before_event
from slugify import slugify
from starlette import status

from src.common.helpers.exceptions import CustomHTTException
from src.config import settings
from src.schemas import RoleModel
from src.shared.error_codes import RoleErrorCode

from .mixins import DatetimeTimestamp


Expand Down
3 changes: 2 additions & 1 deletion src/models/users.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
from typing import Any, Dict

from beanie import Document
from pydantic import field_validator, StrictBool
from pydantic import StrictBool, field_validator
from slugify import slugify

from src.config import settings
from src.schemas import CreateUser

from .mixins import DatetimeTimestamp


Expand Down
3 changes: 1 addition & 2 deletions src/routers/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@
from fastapi import APIRouter, BackgroundTasks, Body, Query, Request, Security
from starlette import status

from src.config import enable_endpoint
from src.middleware import AuthorizedHTTPBearer
from src.models import User
from src.schemas import ChangePassword, LoginUser, RequestChangePassword, UserBaseSchema
from src.services import auth
from src.config import enable_endpoint


auth_router = APIRouter(prefix="", tags=["AUTH"], redirect_slashes=False)

Expand Down
5 changes: 2 additions & 3 deletions src/routers/roles.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,12 @@
from fastapi_pagination.ext.beanie import paginate
from pymongo import ASCENDING, DESCENDING

from src.config import enable_endpoint
from src.middleware import AuthorizedHTTPBearer, CheckPermissionsHandler
from src.models import Role
from src.schemas import RoleModel
from src.services import roles
from src.shared.utils import customize_page, SortEnum
from src.config import enable_endpoint

from src.shared.utils import SortEnum, customize_page

role_router = APIRouter(prefix="/roles", tags=["ROLES"], redirect_slashes=False)

Expand Down
2 changes: 1 addition & 1 deletion src/routers/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from src.models import User, UserOut
from src.schemas import CreateUser, UpdateUser
from src.services import roles, users
from src.shared.utils import customize_page, SortEnum
from src.shared.utils import SortEnum, customize_page

user_router = APIRouter(prefix="/users", tags=["USERS"], redirect_slashes=False)

Expand Down
2 changes: 1 addition & 1 deletion src/schemas/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from .auth import ChangePassword, LoginUser, ManageAccount, RequestChangePassword
from .response import ResponseModelData
from .roles import RoleModel
from .users import UserBaseSchema, CreateUser, UpdateUser
from .users import CreateUser, UpdateUser, UserBaseSchema

__all__ = [
"UserBaseSchema",
Expand Down
2 changes: 1 addition & 1 deletion src/schemas/auth.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from hmac import compare_digest

from pydantic import BaseModel, EmailStr, model_validator, StrictBool
from pydantic import BaseModel, EmailStr, StrictBool, model_validator
from starlette import status

from src.common.helpers.exceptions import CustomHTTException
Expand Down
2 changes: 1 addition & 1 deletion src/schemas/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import pymongo
from beanie import Indexed, PydanticObjectId
from pydantic import BaseModel, EmailStr, Field, field_validator, StrictStr
from pydantic import BaseModel, EmailStr, Field, StrictStr, field_validator
from starlette import status

from src.common.helpers.exceptions import CustomHTTException
Expand Down
1 change: 1 addition & 0 deletions src/services/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
from src.shared import blacklist_token, mail_service
from src.shared.error_codes import AuthErrorCode, UserErrorCode
from src.shared.utils import password_hash, verify_password

from .roles import get_one_role
from .users import check_if_email_exist, get_one_user

Expand Down
10 changes: 6 additions & 4 deletions src/services/roles.py
Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
import logging
import os
from typing import Sequence, Set, Optional
from typing import Optional, Sequence, Set

from beanie import PydanticObjectId
from fastapi_pagination import paginate
from pymongo import ASCENDING, DESCENDING
from slugify import slugify
from starlette import status
from pymongo import ASCENDING, DESCENDING

from src.common.helpers.exceptions import CustomHTTException
from src.models import Role, User
from src.schemas import RoleModel
from src.shared.error_codes import RoleErrorCode
from .perms import get_all_permissions
from src.shared.utils import SortEnum
from fastapi_pagination import paginate

from .perms import get_all_permissions

logging.basicConfig(format="%(message)s", level=logging.INFO)
logger = logging.getLogger(__name__)
Expand Down
1 change: 1 addition & 0 deletions src/services/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from src.schemas import CreateUser, UpdateUser
from src.shared.error_codes import UserErrorCode
from src.shared.utils import password_hash

from .roles import get_one_role

logging.basicConfig(format="%(message)s", level=logging.INFO)
Expand Down
4 changes: 3 additions & 1 deletion src/shared/send_email.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import logging
import smtplib
import ssl
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

Expand Down Expand Up @@ -53,7 +54,8 @@ async def send_email(self, receiver_email: list[EmailStr], subject: str, body: s

try:
with smtplib.SMTP(host=self.smtp_server, port=self.smtp_port) as server:
server.starttls()
server.ehlo()
server.starttls(context=ssl.create_default_context())
server.login(user=self.email_address, password=self.email_password)
server.sendmail(from_addr=self.email_address, to_addrs=receiver_email, msg=message.as_string())
server.quit()
Expand Down
4 changes: 2 additions & 2 deletions src/shared/send_sms.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import httpx
import logging

import httpx
from starlette.background import BackgroundTasks

from src.config import sms_config


logging.basicConfig(format="%(message)s", level=logging.INFO)
_log = logging.getLogger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from httpx import AsyncClient
from mongomock_motor import AsyncMongoMockClient

from src.config import settings, jwt_settings
from src.config import jwt_settings, settings


@pytest.fixture
Expand Down
1 change: 0 additions & 1 deletion tests/routers/test_users_api.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import pytest
from starlette import status


# fake = faker.Faker()


Expand Down

0 comments on commit 9b1c79c

Please sign in to comment.