diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..77d6e14 --- /dev/null +++ b/.flake8 @@ -0,0 +1,8 @@ +[flake8] +max-line-length = 88 +exclude = + .git, + __pycache__, + __init__.py, + .pytest_cache + migrations \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..b9762fb --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +repos: + - repo: local + hooks: + - id: lint-check + name: Lint check + entry: ./scripts/lint.sh + language: system + always_run: true + pass_filenames: false \ No newline at end of file diff --git a/apis/books/models.py b/apis/books/models.py index 37fdf6d..c33b784 100644 --- a/apis/books/models.py +++ b/apis/books/models.py @@ -1,6 +1,5 @@ -from sqlalchemy import Column, String, Integer, Text - from extensions import Base +from sqlalchemy import Column, Integer, String, Text class Book(Base): diff --git a/apis/books/views.py b/apis/books/views.py index 4a0c048..0869867 100644 --- a/apis/books/views.py +++ b/apis/books/views.py @@ -1,12 +1,12 @@ -from flask_apispec import use_kwargs, marshal_with, MethodResource, doc +from extensions import db, security_params +from flask_apispec import MethodResource, doc, marshal_with, use_kwargs from flask_restful import Resource from marshmallow import Schema +from utils.helpers import auth_required from webargs import fields from apis.books.models import Book from apis.users.models import PermissionEnum -from extensions import db, security_params -from utils.helpers import auth_required class BookModel(Schema): diff --git a/apis/rest.py b/apis/rest.py index 32de719..bf8756f 100644 --- a/apis/rest.py +++ b/apis/rest.py @@ -1,9 +1,8 @@ +from extensions import db, docs, jwt from flask_restful import Api -from apis.books.views import Books from apis.urls import urls from apis.users.models import User -from extensions import docs, jwt, db api = Api() diff --git a/apis/urls.py b/apis/urls.py index 830df8b..8420169 100644 --- a/apis/urls.py +++ b/apis/urls.py @@ -1,5 +1,5 @@ from apis.books.views import Books -from apis.users.views import Signup, Refresh, Login +from apis.users.views import Login, Refresh, Signup class API: diff --git a/apis/users/models.py b/apis/users/models.py index 6d1cc3e..656a4c2 100644 --- a/apis/users/models.py +++ b/apis/users/models.py @@ -1,10 +1,9 @@ from enum import Enum +from extensions import Base from sqlalchemy import Column, Integer, String from sqlalchemy_utils import ChoiceType, PasswordType -from extensions import Base - class PermissionEnum(Enum): user = "user" diff --git a/apis/users/views.py b/apis/users/views.py index a53062d..656055a 100644 --- a/apis/users/views.py +++ b/apis/users/views.py @@ -1,12 +1,16 @@ +from extensions import db, security_params from flask_apispec import MethodResource, doc, use_kwargs -from flask_jwt_extended import create_access_token, create_refresh_token, \ - jwt_required, get_jwt_identity +from flask_jwt_extended import ( + create_access_token, + create_refresh_token, + get_jwt_identity, + jwt_required, +) from flask_restful import Resource from marshmallow import Schema from webargs import fields from apis.users.models import User -from extensions import db, docs, security_params class SignupRequest(Schema): diff --git a/config.py b/config.py index 3427520..d0d26bc 100644 --- a/config.py +++ b/config.py @@ -2,7 +2,6 @@ from apispec import APISpec from apispec.ext.marshmallow import MarshmallowPlugin -from apispec_webframeworks.flask import FlaskPlugin from pydantic import BaseSettings from pydantic.config import Optional diff --git a/flask_app.py b/flask_app.py index e7db64a..2a0319a 100644 --- a/flask_app.py +++ b/flask_app.py @@ -2,7 +2,7 @@ from apis.rest import api, init_routes from config import settings -from extensions import session, Base, db, exc, docs, jwt +from extensions import db, docs, exc, jwt, session from utils.log import configure_logging diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..b0eeb46 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,11 @@ +[tool.black] +line-length = 88 + +#extend-exclude = ["migrations" ] + +[tool.isort] +multi_line_output = 3 +include_trailing_comma = true +force_grid_wrap = 0 +line_length = 88 +src_paths = ["apis", "tests"] \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 075b6e0..ed9d837 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,9 +3,15 @@ aniso8601==9.0.1 apispec==5.2.2 apispec-webframeworks==0.5.2 attrs==22.1.0 +autoflake==1.7.7 beautifulsoup4==4.11.1 +black==22.10.0 blinker==1.5 +cfgv==3.3.1 click==8.1.3 +distlib==0.3.6 +filelock==3.8.0 +flake8==5.0.4 Flask==2.1.2 flask-apispec==0.11.4 Flask-JWT-Extended==4.4.4 @@ -13,20 +19,30 @@ Flask-RESTful==0.3.9 Flask-WebTest==0.0.9 greenlet==1.1.3 gunicorn==20.1.0 +identify==2.5.8 importlib-metadata==4.12.0 iniconfig==1.1.1 +isort==5.10.1 itsdangerous==2.1.2 Jinja2==3.1.2 jsonschema==4.14.0 Mako==1.2.2 MarkupSafe==2.1.1 marshmallow==3.17.1 +mccabe==0.7.0 +mypy-extensions==0.4.3 +nodeenv==1.7.0 packaging==21.3 passlib==1.7.4 +pathspec==0.10.2 +platformdirs==2.5.4 pluggy==1.0.0 +pre-commit==2.20.0 psycopg2-binary==2.9.3 py==1.11.0 +pycodestyle==2.9.1 pydantic==1.9.2 +pyflakes==2.5.0 PyJWT==2.4.0 pyparsing==3.0.9 pyrsistent==0.18.1 @@ -38,8 +54,10 @@ six==1.16.0 soupsieve==2.3.2.post1 SQLAlchemy==1.4.40 SQLAlchemy-Utils==0.38.3 +toml==0.10.2 tomli==2.0.1 typing_extensions==4.3.0 +virtualenv==20.16.7 waitress==2.1.2 webargs==8.2.0 WebOb==1.8.7 diff --git a/scripts/lint.sh b/scripts/lint.sh new file mode 100755 index 0000000..bf710c0 --- /dev/null +++ b/scripts/lint.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +set -e +set -x + +#black --check . +isort --check-only apis +flake8 . \ No newline at end of file diff --git a/scripts/lint_fix.sh b/scripts/lint_fix.sh new file mode 100755 index 0000000..7f4c27a --- /dev/null +++ b/scripts/lint_fix.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env bash + +set -x +autoflake --remove-all-unused-imports --recursive --remove-unused-variables --in-place . --exclude=__init__.py +#black apis +isort apis \ No newline at end of file