mirror of
https://github.com/spiral-project/ihatemoney.git
synced 2025-04-28 17:32:38 +02:00
Add isort support. (#561)
This commit is contained in:
parent
f0b40578ad
commit
299c64a48c
16 changed files with 113 additions and 107 deletions
13
.isort.cfg
Normal file
13
.isort.cfg
Normal file
|
@ -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/**
|
12
Makefile
12
Makefile
|
@ -41,11 +41,19 @@ serve: install ## Run the ihatemoney server
|
||||||
$(PYTHON) -m ihatemoney.manage runserver
|
$(PYTHON) -m ihatemoney.manage runserver
|
||||||
|
|
||||||
.PHONY: test
|
.PHONY: test
|
||||||
test: $(DEV_STAMP) ## Run the tests
|
test: install-dev ## Run the tests
|
||||||
$(VENV)/bin/tox
|
$(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
|
.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
|
$(VENV)/bin/fullrelease
|
||||||
|
|
||||||
.PHONY: compress-assets
|
.PHONY: compress-assets
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
# coding: utf8
|
# coding: utf8
|
||||||
import sys, os
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
templates_path = ["_templates"]
|
templates_path = ["_templates"]
|
||||||
source_suffix = ".rst"
|
source_suffix = ".rst"
|
||||||
|
|
|
@ -1,12 +1,13 @@
|
||||||
# coding: utf8
|
# 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 flask_restful import Resource, abort
|
||||||
|
from werkzeug.security import check_password_hash
|
||||||
from wtforms.fields.core import BooleanField
|
from wtforms.fields.core import BooleanField
|
||||||
|
|
||||||
from ihatemoney.models import db, Project, Person, Bill
|
from ihatemoney.forms import EditProjectForm, MemberForm, ProjectForm, get_billform_for
|
||||||
from ihatemoney.forms import ProjectForm, EditProjectForm, MemberForm, get_billform_for
|
from ihatemoney.models import Bill, Person, Project, db
|
||||||
from werkzeug.security import check_password_hash
|
|
||||||
from functools import wraps
|
|
||||||
|
|
||||||
|
|
||||||
def need_auth(f):
|
def need_auth(f):
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
# coding: utf8
|
# coding: utf8
|
||||||
from flask import Blueprint
|
from flask import Blueprint
|
||||||
from flask_restful import Api
|
|
||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
|
from flask_restful import Api
|
||||||
|
|
||||||
from ihatemoney.api.common import (
|
from ihatemoney.api.common import (
|
||||||
ProjectsHandler,
|
|
||||||
ProjectHandler,
|
|
||||||
TokenHandler,
|
|
||||||
MemberHandler,
|
|
||||||
ProjectStatsHandler,
|
|
||||||
MembersHandler,
|
|
||||||
BillHandler,
|
BillHandler,
|
||||||
BillsHandler,
|
BillsHandler,
|
||||||
|
MemberHandler,
|
||||||
|
MembersHandler,
|
||||||
|
ProjectHandler,
|
||||||
|
ProjectsHandler,
|
||||||
|
ProjectStatsHandler,
|
||||||
|
TokenHandler,
|
||||||
)
|
)
|
||||||
|
|
||||||
api = Blueprint("api", __name__, url_prefix="/api")
|
api = Blueprint("api", __name__, url_prefix="/api")
|
||||||
|
|
|
@ -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 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.core import SelectField, SelectMultipleField
|
||||||
from wtforms.fields.html5 import DateField, DecimalField, URLField
|
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 (
|
from wtforms.validators import (
|
||||||
Email,
|
|
||||||
DataRequired,
|
DataRequired,
|
||||||
ValidationError,
|
Email,
|
||||||
EqualTo,
|
EqualTo,
|
||||||
NumberRange,
|
NumberRange,
|
||||||
Optional,
|
Optional,
|
||||||
|
ValidationError,
|
||||||
)
|
)
|
||||||
from flask_wtf.file import FileField, FileAllowed, FileRequired
|
|
||||||
|
|
||||||
from flask_babel import lazy_gettext as _
|
from ihatemoney.models import LoggingMode, Person, Project
|
||||||
from flask import request
|
from ihatemoney.utils import eval_arithmetic_expression, slugify
|
||||||
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
|
|
||||||
|
|
||||||
|
|
||||||
def strip_filter(string):
|
def strip_filter(string):
|
||||||
|
|
|
@ -1,15 +1,7 @@
|
||||||
from flask_babel import gettext as _
|
from flask_babel import gettext as _
|
||||||
from sqlalchemy_continuum import (
|
from sqlalchemy_continuum import Operation, parent_class
|
||||||
Operation,
|
|
||||||
parent_class,
|
|
||||||
)
|
|
||||||
|
|
||||||
from ihatemoney.models import (
|
from ihatemoney.models import BillVersion, Person, PersonVersion, ProjectVersion
|
||||||
PersonVersion,
|
|
||||||
ProjectVersion,
|
|
||||||
BillVersion,
|
|
||||||
Person,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def get_history_queries(project):
|
def get_history_queries(project):
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
import getpass
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
import sys
|
import sys
|
||||||
import getpass
|
|
||||||
|
|
||||||
from flask_script import Manager, Command, Option
|
|
||||||
from flask_migrate import Migrate, MigrateCommand
|
from flask_migrate import Migrate, MigrateCommand
|
||||||
|
from flask_script import Command, Manager, Option
|
||||||
from werkzeug.security import generate_password_hash
|
from werkzeug.security import generate_password_hash
|
||||||
|
|
||||||
|
from ihatemoney.models import Project, db
|
||||||
from ihatemoney.run import create_app
|
from ihatemoney.run import create_app
|
||||||
from ihatemoney.models import db, Project
|
|
||||||
from ihatemoney.utils import create_jinja_env
|
from ihatemoney.utils import create_jinja_env
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,33 +1,29 @@
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import sqlalchemy
|
|
||||||
from flask_sqlalchemy import SQLAlchemy, BaseQuery
|
|
||||||
from flask import g, current_app
|
|
||||||
|
|
||||||
from debts import settle
|
from debts import settle
|
||||||
from sqlalchemy import orm
|
from flask import current_app, g
|
||||||
from sqlalchemy.sql import func
|
from flask_sqlalchemy import BaseQuery, SQLAlchemy
|
||||||
from itsdangerous import (
|
from itsdangerous import (
|
||||||
TimedJSONWebSignatureSerializer,
|
|
||||||
URLSafeSerializer,
|
|
||||||
BadSignature,
|
BadSignature,
|
||||||
SignatureExpired,
|
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.plugins import FlaskPlugin
|
||||||
from sqlalchemy_continuum import version_class
|
|
||||||
|
|
||||||
from ihatemoney.patch_sqlalchemy_continuum import PatchedBuilder
|
from ihatemoney.patch_sqlalchemy_continuum import PatchedBuilder
|
||||||
from ihatemoney.versioning import (
|
from ihatemoney.versioning import (
|
||||||
LoggingMode,
|
|
||||||
ConditionalVersioningManager,
|
ConditionalVersioningManager,
|
||||||
version_privacy_predicate,
|
LoggingMode,
|
||||||
get_ip_if_allowed,
|
get_ip_if_allowed,
|
||||||
|
version_privacy_predicate,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
make_versioned(
|
make_versioned(
|
||||||
user_cls=None,
|
user_cls=None,
|
||||||
manager=ConditionalVersioningManager(
|
manager=ConditionalVersioningManager(
|
||||||
|
|
|
@ -38,7 +38,7 @@ from sqlalchemy_continuum import Operation
|
||||||
from sqlalchemy_continuum.builder import Builder
|
from sqlalchemy_continuum.builder import Builder
|
||||||
from sqlalchemy_continuum.expression_reflector import VersionExpressionReflector
|
from sqlalchemy_continuum.expression_reflector import VersionExpressionReflector
|
||||||
from sqlalchemy_continuum.relationship_builder import RelationshipBuilder
|
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):
|
class PatchedRelationShipBuilder(RelationshipBuilder):
|
||||||
|
|
|
@ -2,12 +2,13 @@ import os
|
||||||
import os.path
|
import os.path
|
||||||
import warnings
|
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_babel import Babel
|
||||||
from flask_mail import Mail
|
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 werkzeug.middleware.proxy_fix import ProxyFix
|
||||||
|
|
||||||
|
from ihatemoney import default_settings
|
||||||
from ihatemoney.api.v1 import api as apiv1
|
from ihatemoney.api.v1 import api as apiv1
|
||||||
from ihatemoney.models import db
|
from ihatemoney.models import db
|
||||||
from ihatemoney.utils import (
|
from ihatemoney.utils import (
|
||||||
|
@ -19,8 +20,6 @@ from ihatemoney.utils import (
|
||||||
)
|
)
|
||||||
from ihatemoney.web import main as web_interface
|
from ihatemoney.web import main as web_interface
|
||||||
|
|
||||||
from ihatemoney import default_settings
|
|
||||||
|
|
||||||
|
|
||||||
def setup_database(app):
|
def setup_database(app):
|
||||||
"""Prepare the database. Create tables, run migrations etc."""
|
"""Prepare the database. Create tables, run migrations etc."""
|
||||||
|
|
|
@ -1,26 +1,23 @@
|
||||||
# coding: utf8
|
# coding: utf8
|
||||||
|
import base64
|
||||||
|
from collections import defaultdict
|
||||||
|
import datetime
|
||||||
|
import io
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
from time import sleep
|
||||||
import unittest
|
import unittest
|
||||||
from unittest.mock import patch
|
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 import session
|
||||||
from flask_testing import TestCase
|
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 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
|
# Unset configuration file env var if previously set
|
||||||
os.environ.pop("IHATEMONEY_SETTINGS_FILE_PATH", None)
|
os.environ.pop("IHATEMONEY_SETTINGS_FILE_PATH", None)
|
||||||
|
|
|
@ -1,19 +1,17 @@
|
||||||
import re
|
|
||||||
import os
|
|
||||||
import ast
|
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
|
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):
|
def slugify(value):
|
||||||
|
|
|
@ -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`
|
some shortcuts to make your life better when coding (see `pull_project`
|
||||||
and `add_project_id` for a quick overview)
|
and `add_project_id` for a quick overview)
|
||||||
"""
|
"""
|
||||||
|
from datetime import datetime
|
||||||
|
from functools import wraps
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
from functools import wraps
|
|
||||||
from smtplib import SMTPRecipientsRefused
|
from smtplib import SMTPRecipientsRefused
|
||||||
|
|
||||||
from dateutil.parser import parse
|
from dateutil.parser import parse
|
||||||
|
from dateutil.relativedelta import relativedelta
|
||||||
from flask import (
|
from flask import (
|
||||||
abort,
|
|
||||||
Blueprint,
|
Blueprint,
|
||||||
|
abort,
|
||||||
current_app,
|
current_app,
|
||||||
flash,
|
flash,
|
||||||
g,
|
g,
|
||||||
redirect,
|
redirect,
|
||||||
render_template,
|
render_template,
|
||||||
request,
|
request,
|
||||||
session,
|
|
||||||
url_for,
|
|
||||||
send_file,
|
send_file,
|
||||||
send_from_directory,
|
send_from_directory,
|
||||||
|
session,
|
||||||
|
url_for,
|
||||||
)
|
)
|
||||||
from flask_babel import get_locale, gettext as _
|
from flask_babel import get_locale, gettext as _
|
||||||
from flask_mail import Message
|
from flask_mail import Message
|
||||||
|
@ -42,23 +44,21 @@ from ihatemoney.forms import (
|
||||||
InviteForm,
|
InviteForm,
|
||||||
MemberForm,
|
MemberForm,
|
||||||
PasswordReminder,
|
PasswordReminder,
|
||||||
ResetPasswordForm,
|
|
||||||
ProjectForm,
|
ProjectForm,
|
||||||
get_billform_for,
|
ResetPasswordForm,
|
||||||
UploadForm,
|
UploadForm,
|
||||||
|
get_billform_for,
|
||||||
)
|
)
|
||||||
from ihatemoney.history import get_history_queries, get_history
|
from ihatemoney.history import get_history, get_history_queries
|
||||||
from ihatemoney.models import db, Project, Person, Bill, LoggingMode
|
from ihatemoney.models import Bill, LoggingMode, Person, Project, db
|
||||||
from ihatemoney.utils import (
|
from ihatemoney.utils import (
|
||||||
Redirect303,
|
|
||||||
list_of_dicts2json,
|
|
||||||
list_of_dicts2csv,
|
|
||||||
LoginThrottler,
|
LoginThrottler,
|
||||||
|
Redirect303,
|
||||||
get_members,
|
get_members,
|
||||||
|
list_of_dicts2csv,
|
||||||
|
list_of_dicts2json,
|
||||||
same_bill,
|
same_bill,
|
||||||
)
|
)
|
||||||
from datetime import datetime
|
|
||||||
from dateutil.relativedelta import relativedelta
|
|
||||||
|
|
||||||
main = Blueprint("main", __name__)
|
main = Blueprint("main", __name__)
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,7 @@ dev =
|
||||||
black==19.10b0 ; python_version >= '3.6'
|
black==19.10b0 ; python_version >= '3.6'
|
||||||
flake8==3.7.9
|
flake8==3.7.9
|
||||||
Flask-Testing==0.8.0
|
Flask-Testing==0.8.0
|
||||||
|
isort==4.3.21
|
||||||
pytest==5.4.1
|
pytest==5.4.1
|
||||||
tox==3.14.6
|
tox==3.14.6
|
||||||
zest.releaser==6.20.1
|
zest.releaser==6.20.1
|
||||||
|
|
4
tox.ini
4
tox.ini
|
@ -21,7 +21,9 @@ deps =
|
||||||
changedir = {toxinidir}
|
changedir = {toxinidir}
|
||||||
|
|
||||||
[testenv:black]
|
[testenv:black]
|
||||||
commands = black --check --target-version=py34 .
|
commands =
|
||||||
|
black --check --target-version=py34 .
|
||||||
|
isort -c -rc .
|
||||||
changedir = {toxinidir}
|
changedir = {toxinidir}
|
||||||
|
|
||||||
[testenv:flake8]
|
[testenv:flake8]
|
||||||
|
|
Loading…
Reference in a new issue