From 299c64a48cb6278eebe1d7cc54d878953ecc5fa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20HUBSCHER?= Date: Tue, 21 Apr 2020 13:59:41 +0200 Subject: [PATCH] Add isort support. (#561) --- .isort.cfg | 13 ++++++++++ Makefile | 12 ++++++++-- docs/conf.py | 3 ++- ihatemoney/api/common.py | 11 +++++---- ihatemoney/api/v1/resources.py | 14 +++++------ ihatemoney/forms.py | 30 +++++++++++------------- ihatemoney/history.py | 12 ++-------- ihatemoney/manage.py | 6 ++--- ihatemoney/models.py | 24 ++++++++----------- ihatemoney/patch_sqlalchemy_continuum.py | 2 +- ihatemoney/run.py | 7 +++--- ihatemoney/tests/tests.py | 29 ++++++++++------------- ihatemoney/utils.py | 26 ++++++++++---------- ihatemoney/web.py | 26 ++++++++++---------- setup.cfg | 1 + tox.ini | 4 +++- 16 files changed, 113 insertions(+), 107 deletions(-) create mode 100644 .isort.cfg diff --git a/.isort.cfg b/.isort.cfg new file mode 100644 index 00000000..ba73fb7a --- /dev/null +++ b/.isort.cfg @@ -0,0 +1,13 @@ +[settings] +# Needed for black compatibility +multi_line_output=3 +include_trailing_comma=True +force_grid_wrap=0 +line_length=88 +combine_as_imports=True + +# If set, imports will be sorted within their section independent to the import_type. +force_sort_within_sections=True + +# skip +skip_glob=.local,**/migrations/**,**/node_modules/**,**/node-forge/** diff --git a/Makefile b/Makefile index d21a1cf9..a6817094 100644 --- a/Makefile +++ b/Makefile @@ -41,11 +41,19 @@ serve: install ## Run the ihatemoney server $(PYTHON) -m ihatemoney.manage runserver .PHONY: test -test: $(DEV_STAMP) ## Run the tests +test: install-dev ## Run the tests $(VENV)/bin/tox +.PHONY: black +black: install-dev ## Run the tests + $(VENV)/bin/black --target-version=py34 . + +.PHONY: isort +isort: install-dev ## Run the tests + $(VENV)/bin/isort -rc . + .PHONY: release -release: $(DEV_STAMP) ## Release a new version (see https://ihatemoney.readthedocs.io/en/latest/contributing.html#how-to-release) +release: install-dev ## Release a new version (see https://ihatemoney.readthedocs.io/en/latest/contributing.html#how-to-release) $(VENV)/bin/fullrelease .PHONY: compress-assets diff --git a/docs/conf.py b/docs/conf.py index 82c0e03d..4789396e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -1,5 +1,6 @@ # coding: utf8 -import sys, os +import os +import sys templates_path = ["_templates"] source_suffix = ".rst" diff --git a/ihatemoney/api/common.py b/ihatemoney/api/common.py index 728d2a8e..51ce96e8 100644 --- a/ihatemoney/api/common.py +++ b/ihatemoney/api/common.py @@ -1,12 +1,13 @@ # coding: utf8 -from flask import request, current_app +from functools import wraps + +from flask import current_app, request from flask_restful import Resource, abort +from werkzeug.security import check_password_hash from wtforms.fields.core import BooleanField -from ihatemoney.models import db, Project, Person, Bill -from ihatemoney.forms import ProjectForm, EditProjectForm, MemberForm, get_billform_for -from werkzeug.security import check_password_hash -from functools import wraps +from ihatemoney.forms import EditProjectForm, MemberForm, ProjectForm, get_billform_for +from ihatemoney.models import Bill, Person, Project, db def need_auth(f): diff --git a/ihatemoney/api/v1/resources.py b/ihatemoney/api/v1/resources.py index 821ba2bd..87950f65 100644 --- a/ihatemoney/api/v1/resources.py +++ b/ihatemoney/api/v1/resources.py @@ -1,17 +1,17 @@ # coding: utf8 from flask import Blueprint -from flask_restful import Api from flask_cors import CORS +from flask_restful import Api from ihatemoney.api.common import ( - ProjectsHandler, - ProjectHandler, - TokenHandler, - MemberHandler, - ProjectStatsHandler, - MembersHandler, BillHandler, BillsHandler, + MemberHandler, + MembersHandler, + ProjectHandler, + ProjectsHandler, + ProjectStatsHandler, + TokenHandler, ) api = Blueprint("api", __name__, url_prefix="/api") diff --git a/ihatemoney/forms.py b/ihatemoney/forms.py index 495eefa1..989b3022 100644 --- a/ihatemoney/forms.py +++ b/ihatemoney/forms.py @@ -1,29 +1,27 @@ +from datetime import datetime +from re import match + +import email_validator +from flask import request +from flask_babel import lazy_gettext as _ +from flask_wtf.file import FileAllowed, FileField, FileRequired from flask_wtf.form import FlaskForm +from jinja2 import Markup +from werkzeug.security import check_password_hash, generate_password_hash from wtforms.fields.core import SelectField, SelectMultipleField from wtforms.fields.html5 import DateField, DecimalField, URLField -from wtforms.fields.simple import PasswordField, SubmitField, StringField, BooleanField +from wtforms.fields.simple import BooleanField, PasswordField, StringField, SubmitField from wtforms.validators import ( - Email, DataRequired, - ValidationError, + Email, EqualTo, NumberRange, Optional, + ValidationError, ) -from flask_wtf.file import FileField, FileAllowed, FileRequired -from flask_babel import lazy_gettext as _ -from flask import request -from werkzeug.security import generate_password_hash, check_password_hash - -from datetime import datetime -from re import match -from jinja2 import Markup - -import email_validator - -from ihatemoney.models import Project, Person, LoggingMode -from ihatemoney.utils import slugify, eval_arithmetic_expression +from ihatemoney.models import LoggingMode, Person, Project +from ihatemoney.utils import eval_arithmetic_expression, slugify def strip_filter(string): diff --git a/ihatemoney/history.py b/ihatemoney/history.py index cda141e4..40aa7619 100644 --- a/ihatemoney/history.py +++ b/ihatemoney/history.py @@ -1,15 +1,7 @@ from flask_babel import gettext as _ -from sqlalchemy_continuum import ( - Operation, - parent_class, -) +from sqlalchemy_continuum import Operation, parent_class -from ihatemoney.models import ( - PersonVersion, - ProjectVersion, - BillVersion, - Person, -) +from ihatemoney.models import BillVersion, Person, PersonVersion, ProjectVersion def get_history_queries(project): diff --git a/ihatemoney/manage.py b/ihatemoney/manage.py index 6343ee7c..a192844c 100755 --- a/ihatemoney/manage.py +++ b/ihatemoney/manage.py @@ -1,16 +1,16 @@ #!/usr/bin/env python +import getpass import os import random import sys -import getpass -from flask_script import Manager, Command, Option from flask_migrate import Migrate, MigrateCommand +from flask_script import Command, Manager, Option from werkzeug.security import generate_password_hash +from ihatemoney.models import Project, db from ihatemoney.run import create_app -from ihatemoney.models import db, Project from ihatemoney.utils import create_jinja_env diff --git a/ihatemoney/models.py b/ihatemoney/models.py index d765c93d..eae442ac 100644 --- a/ihatemoney/models.py +++ b/ihatemoney/models.py @@ -1,33 +1,29 @@ from collections import defaultdict - from datetime import datetime -import sqlalchemy -from flask_sqlalchemy import SQLAlchemy, BaseQuery -from flask import g, current_app - from debts import settle -from sqlalchemy import orm -from sqlalchemy.sql import func +from flask import current_app, g +from flask_sqlalchemy import BaseQuery, SQLAlchemy from itsdangerous import ( - TimedJSONWebSignatureSerializer, - URLSafeSerializer, BadSignature, SignatureExpired, + TimedJSONWebSignatureSerializer, + URLSafeSerializer, ) -from sqlalchemy_continuum import make_versioned +import sqlalchemy +from sqlalchemy import orm +from sqlalchemy.sql import func +from sqlalchemy_continuum import make_versioned, version_class from sqlalchemy_continuum.plugins import FlaskPlugin -from sqlalchemy_continuum import version_class from ihatemoney.patch_sqlalchemy_continuum import PatchedBuilder from ihatemoney.versioning import ( - LoggingMode, ConditionalVersioningManager, - version_privacy_predicate, + LoggingMode, get_ip_if_allowed, + version_privacy_predicate, ) - make_versioned( user_cls=None, manager=ConditionalVersioningManager( diff --git a/ihatemoney/patch_sqlalchemy_continuum.py b/ihatemoney/patch_sqlalchemy_continuum.py index e0680c6a..dbbd9083 100644 --- a/ihatemoney/patch_sqlalchemy_continuum.py +++ b/ihatemoney/patch_sqlalchemy_continuum.py @@ -38,7 +38,7 @@ from sqlalchemy_continuum import Operation from sqlalchemy_continuum.builder import Builder from sqlalchemy_continuum.expression_reflector import VersionExpressionReflector from sqlalchemy_continuum.relationship_builder import RelationshipBuilder -from sqlalchemy_continuum.utils import option, adapt_columns +from sqlalchemy_continuum.utils import adapt_columns, option class PatchedRelationShipBuilder(RelationshipBuilder): diff --git a/ihatemoney/run.py b/ihatemoney/run.py index 161761c0..c4b53234 100644 --- a/ihatemoney/run.py +++ b/ihatemoney/run.py @@ -2,12 +2,13 @@ import os import os.path import warnings -from flask import Flask, g, request, session, render_template +from flask import Flask, g, render_template, request, session from flask_babel import Babel from flask_mail import Mail -from flask_migrate import Migrate, upgrade, stamp +from flask_migrate import Migrate, stamp, upgrade from werkzeug.middleware.proxy_fix import ProxyFix +from ihatemoney import default_settings from ihatemoney.api.v1 import api as apiv1 from ihatemoney.models import db from ihatemoney.utils import ( @@ -19,8 +20,6 @@ from ihatemoney.utils import ( ) from ihatemoney.web import main as web_interface -from ihatemoney import default_settings - def setup_database(app): """Prepare the database. Create tables, run migrations etc.""" diff --git a/ihatemoney/tests/tests.py b/ihatemoney/tests/tests.py index 5dff64d9..b27fafcc 100644 --- a/ihatemoney/tests/tests.py +++ b/ihatemoney/tests/tests.py @@ -1,26 +1,23 @@ # coding: utf8 +import base64 +from collections import defaultdict +import datetime +import io +import json +import os +from time import sleep import unittest from unittest.mock import patch -import datetime -import os -import io -import json -import base64 - -from collections import defaultdict -from time import sleep - -from werkzeug.security import generate_password_hash, check_password_hash from flask import session from flask_testing import TestCase - -from ihatemoney.run import create_app, db, load_configuration -from ihatemoney.manage import GenerateConfig, GeneratePasswordHash, DeleteProject -from ihatemoney import models, history -from ihatemoney.versioning import LoggingMode -from ihatemoney import utils from sqlalchemy import orm +from werkzeug.security import check_password_hash, generate_password_hash + +from ihatemoney import history, models, utils +from ihatemoney.manage import DeleteProject, GenerateConfig, GeneratePasswordHash +from ihatemoney.run import create_app, db, load_configuration +from ihatemoney.versioning import LoggingMode # Unset configuration file env var if previously set os.environ.pop("IHATEMONEY_SETTINGS_FILE_PATH", None) diff --git a/ihatemoney/utils.py b/ihatemoney/utils.py index 0641d1c4..d8c887bb 100644 --- a/ihatemoney/utils.py +++ b/ihatemoney/utils.py @@ -1,19 +1,17 @@ -import re -import os import ast -import operator -from enum import Enum - -from io import BytesIO, StringIO - -import jinja2 -from json import dumps, JSONEncoder -from flask import redirect, current_app -from babel import Locale -from werkzeug.routing import HTTPException, RoutingException -from datetime import datetime, timedelta - import csv +from datetime import datetime, timedelta +from enum import Enum +from io import BytesIO, StringIO +from json import JSONEncoder, dumps +import operator +import os +import re + +from babel import Locale +from flask import current_app, redirect +import jinja2 +from werkzeug.routing import HTTPException, RoutingException def slugify(value): diff --git a/ihatemoney/web.py b/ihatemoney/web.py index 744d1bfa..a12eae19 100644 --- a/ihatemoney/web.py +++ b/ihatemoney/web.py @@ -8,25 +8,27 @@ Basically, this blueprint takes care of the authentication and provides some shortcuts to make your life better when coding (see `pull_project` and `add_project_id` for a quick overview) """ +from datetime import datetime +from functools import wraps import json import os -from functools import wraps from smtplib import SMTPRecipientsRefused from dateutil.parser import parse +from dateutil.relativedelta import relativedelta from flask import ( - abort, Blueprint, + abort, current_app, flash, g, redirect, render_template, request, - session, - url_for, send_file, send_from_directory, + session, + url_for, ) from flask_babel import get_locale, gettext as _ from flask_mail import Message @@ -42,23 +44,21 @@ from ihatemoney.forms import ( InviteForm, MemberForm, PasswordReminder, - ResetPasswordForm, ProjectForm, - get_billform_for, + ResetPasswordForm, UploadForm, + get_billform_for, ) -from ihatemoney.history import get_history_queries, get_history -from ihatemoney.models import db, Project, Person, Bill, LoggingMode +from ihatemoney.history import get_history, get_history_queries +from ihatemoney.models import Bill, LoggingMode, Person, Project, db from ihatemoney.utils import ( - Redirect303, - list_of_dicts2json, - list_of_dicts2csv, LoginThrottler, + Redirect303, get_members, + list_of_dicts2csv, + list_of_dicts2json, same_bill, ) -from datetime import datetime -from dateutil.relativedelta import relativedelta main = Blueprint("main", __name__) diff --git a/setup.cfg b/setup.cfg index 571f538b..be62af27 100644 --- a/setup.cfg +++ b/setup.cfg @@ -44,6 +44,7 @@ dev = black==19.10b0 ; python_version >= '3.6' flake8==3.7.9 Flask-Testing==0.8.0 + isort==4.3.21 pytest==5.4.1 tox==3.14.6 zest.releaser==6.20.1 diff --git a/tox.ini b/tox.ini index b5ff7055..7632ed83 100644 --- a/tox.ini +++ b/tox.ini @@ -21,7 +21,9 @@ deps = changedir = {toxinidir} [testenv:black] -commands = black --check --target-version=py34 . +commands = + black --check --target-version=py34 . + isort -c -rc . changedir = {toxinidir} [testenv:flake8]