aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.isort.cfg13
-rw-r--r--Makefile12
-rw-r--r--docs/conf.py3
-rw-r--r--ihatemoney/api/common.py11
-rw-r--r--ihatemoney/api/v1/resources.py14
-rw-r--r--ihatemoney/forms.py30
-rw-r--r--ihatemoney/history.py14
-rwxr-xr-xihatemoney/manage.py6
-rw-r--r--ihatemoney/models.py24
-rw-r--r--ihatemoney/patch_sqlalchemy_continuum.py2
-rw-r--r--ihatemoney/run.py7
-rw-r--r--ihatemoney/tests/tests.py21
-rw-r--r--ihatemoney/utils.py18
-rw-r--r--ihatemoney/web.py26
-rw-r--r--setup.cfg1
-rw-r--r--tox.ini4
16 files changed, 106 insertions, 100 deletions
diff --git a/.isort.cfg b/.isort.cfg
new file mode 100644
index 0000000..ba73fb7
--- /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 d21a1cf..a681709 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 82c0e03..4789396 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 728d2a8..51ce96e 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 821ba2b..87950f6 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 495eefa..989b302 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 cda141e..40aa761 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 ihatemoney.models import (
- PersonVersion,
- ProjectVersion,
- BillVersion,
- Person,
-)
+from sqlalchemy_continuum import Operation, parent_class
+
+from ihatemoney.models import BillVersion, Person, PersonVersion, ProjectVersion
def get_history_queries(project):
diff --git a/ihatemoney/manage.py b/ihatemoney/manage.py
index 6343ee7..a192844 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 d765c93..eae442a 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 e0680c6..dbbd908 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 161761c..c4b5323 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 5dff64d..b27fafc 100644
--- a/ihatemoney/tests/tests.py
+++ b/ihatemoney/tests/tests.py
@@ -1,26 +1,23 @@
# coding: utf8
-import unittest
-from unittest.mock import patch
-
+import base64
+from collections import defaultdict
import datetime
-import os
import io
import json
-import base64
-
-from collections import defaultdict
+import os
from time import sleep
+import unittest
+from unittest.mock import patch
-from werkzeug.security import generate_password_hash, check_password_hash
from flask import session
from flask_testing import TestCase
+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.manage import GenerateConfig, GeneratePasswordHash, DeleteProject
-from ihatemoney import models, history
from ihatemoney.versioning import LoggingMode
-from ihatemoney import utils
-from sqlalchemy import orm
# 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 0641d1c..d8c887b 100644
--- a/ihatemoney/utils.py
+++ b/ihatemoney/utils.py
@@ -1,19 +1,17 @@
-import re
-import os
import ast
-import operator
+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
-import jinja2
-from json import dumps, JSONEncoder
-from flask import redirect, current_app
from babel import Locale
+from flask import current_app, redirect
+import jinja2
from werkzeug.routing import HTTPException, RoutingException
-from datetime import datetime, timedelta
-
-import csv
def slugify(value):
diff --git a/ihatemoney/web.py b/ihatemoney/web.py
index 744d1bf..a12eae1 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 571f538..be62af2 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 b5ff705..7632ed8 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]