[ISSUE-3/4] Adds test container and tooling (#8)

* Adding black, isort, and flake8 to pytest

* Applying black, flake8, and isort to codebase
This commit is contained in:
Kyle Harrison
2019-07-29 13:19:03 +01:00
committed by Ajurna
parent 03a80b2458
commit b4d1c4c2cb
27 changed files with 156 additions and 54 deletions

View File

@@ -7,4 +7,5 @@
!comic !comic
!comic_auth !comic_auth
!manage.py !manage.py
!pytest !pyproject.toml
!setup.cfg

View File

@@ -7,7 +7,9 @@ verify_ssl = true
pdbpp = "*" pdbpp = "*"
pytest-django = "*" pytest-django = "*"
pytest-black = "*" pytest-black = "*"
pytest-cov = "*"
pytest-flake8 = "*" pytest-flake8 = "*"
pytest-isort = "*"
[packages] [packages]
ujson = "*" ujson = "*"

69
Pipfile.lock generated
View File

@@ -1,7 +1,7 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "6ac08e443037cce0633c9272ad59f12fc7924be76f4cc10222825dc09d16b661" "sha256": "94f40433522196e554c531ddae0e2491a8713bbd73132c710ae1844aed548f3d"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": { "requires": {
@@ -292,13 +292,41 @@
], ],
"version": "==7.0" "version": "==7.0"
}, },
"colorama": { "coverage": {
"hashes": [ "hashes": [
"sha256:05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", "sha256:3684fabf6b87a369017756b551cef29e505cb155ddb892a7a29277b978da88b9",
"sha256:f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48" "sha256:39e088da9b284f1bd17c750ac672103779f7954ce6125fd4382134ac8d152d74",
"sha256:3c205bc11cc4fcc57b761c2da73b9b72a59f8d5ca89979afb0c1c6f9e53c7390",
"sha256:465ce53a8c0f3a7950dfb836438442f833cf6663d407f37d8c52fe7b6e56d7e8",
"sha256:48020e343fc40f72a442c8a1334284620f81295256a6b6ca6d8aa1350c763bbe",
"sha256:5296fc86ab612ec12394565c500b412a43b328b3907c0d14358950d06fd83baf",
"sha256:5f61bed2f7d9b6a9ab935150a6b23d7f84b8055524e7be7715b6513f3328138e",
"sha256:68a43a9f9f83693ce0414d17e019daee7ab3f7113a70c79a3dd4c2f704e4d741",
"sha256:6b8033d47fe22506856fe450470ccb1d8ba1ffb8463494a15cfc96392a288c09",
"sha256:7ad7536066b28863e5835e8cfeaa794b7fe352d99a8cded9f43d1161be8e9fbd",
"sha256:7bacb89ccf4bedb30b277e96e4cc68cd1369ca6841bde7b005191b54d3dd1034",
"sha256:839dc7c36501254e14331bcb98b27002aa415e4af7ea039d9009409b9d2d5420",
"sha256:8f9a95b66969cdea53ec992ecea5406c5bd99c9221f539bca1e8406b200ae98c",
"sha256:932c03d2d565f75961ba1d3cec41ddde00e162c5b46d03f7423edcb807734eab",
"sha256:988529edadc49039d205e0aa6ce049c5ccda4acb2d6c3c5c550c17e8c02c05ba",
"sha256:998d7e73548fe395eeb294495a04d38942edb66d1fa61eb70418871bc621227e",
"sha256:9de60893fb447d1e797f6bf08fdf0dbcda0c1e34c1b06c92bd3a363c0ea8c609",
"sha256:9e80d45d0c7fcee54e22771db7f1b0b126fb4a6c0a2e5afa72f66827207ff2f2",
"sha256:a545a3dfe5082dc8e8c3eb7f8a2cf4f2870902ff1860bd99b6198cfd1f9d1f49",
"sha256:a5d8f29e5ec661143621a8f4de51adfb300d7a476224156a39a392254f70687b",
"sha256:aca06bfba4759bbdb09bf52ebb15ae20268ee1f6747417837926fae990ebc41d",
"sha256:bb23b7a6fd666e551a3094ab896a57809e010059540ad20acbeec03a154224ce",
"sha256:bfd1d0ae7e292105f29d7deaa9d8f2916ed8553ab9d5f39ec65bcf5deadff3f9",
"sha256:c62ca0a38958f541a73cf86acdab020c2091631c137bd359c4f5bddde7b75fd4",
"sha256:c709d8bda72cf4cd348ccec2a4881f2c5848fd72903c185f363d361b2737f773",
"sha256:c968a6aa7e0b56ecbd28531ddf439c2ec103610d3e2bf3b75b813304f8cb7723",
"sha256:df785d8cb80539d0b55fd47183264b7002077859028dfe3070cf6359bf8b2d9c",
"sha256:f406628ca51e0ae90ae76ea8398677a921b36f0bd71aab2099dfed08abd0322f",
"sha256:f46087bbd95ebae244a0eda01a618aff11ec7a069b15a3ef8f6b520db523dcf1",
"sha256:f8019c5279eb32360ca03e9fac40a12667715546eed5c5eb59eb381f2f501260",
"sha256:fc5f4d209733750afd2714e9109816a29500718b32dd9a5db01c0cb3a019b96a"
], ],
"markers": "sys_platform == 'win32'", "version": "==4.5.3"
"version": "==0.4.1"
}, },
"entrypoints": { "entrypoints": {
"hashes": [ "hashes": [
@@ -328,6 +356,13 @@
], ],
"version": "==0.18" "version": "==0.18"
}, },
"isort": {
"hashes": [
"sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1",
"sha256:6e811fcb295968434526407adb8796944f1988c5b65e8139058f2014cbe100fd"
],
"version": "==4.3.21"
},
"mccabe": { "mccabe": {
"hashes": [ "hashes": [
"sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
@@ -393,10 +428,10 @@
}, },
"pyparsing": { "pyparsing": {
"hashes": [ "hashes": [
"sha256:1873c03321fc118f4e9746baf201ff990ceb915f433f23b395f5580d1840cb2a", "sha256:43c5486cefefa536c9aab528881c992328f020eefe4f6d06332449c365218580",
"sha256:9b6323ef4ab914af344ba97510e966d64ba91055d6b9afa6b30799340e89cc03" "sha256:d6c5ffe9d0305b9b977f7a642d36b9370954d1da7ada4c62393382cbadad4265"
], ],
"version": "==2.4.0" "version": "==2.4.1.1"
}, },
"pyreadline": { "pyreadline": {
"hashes": [ "hashes": [
@@ -418,6 +453,14 @@
"index": "pypi", "index": "pypi",
"version": "==0.3.7" "version": "==0.3.7"
}, },
"pytest-cov": {
"hashes": [
"sha256:2b097cde81a302e1047331b48cadacf23577e431b61e9c6f49a1170bbe3d3da6",
"sha256:e00ea4fdde970725482f1f35630d12f074e121a23801aabf2ae154ec6bdd343a"
],
"index": "pypi",
"version": "==2.7.1"
},
"pytest-django": { "pytest-django": {
"hashes": [ "hashes": [
"sha256:264fb4c506db5d48a6364c311a0b00b7b48a52715bad8839b2d8bee9b99ed6bb", "sha256:264fb4c506db5d48a6364c311a0b00b7b48a52715bad8839b2d8bee9b99ed6bb",
@@ -434,6 +477,14 @@
"index": "pypi", "index": "pypi",
"version": "==1.0.4" "version": "==1.0.4"
}, },
"pytest-isort": {
"hashes": [
"sha256:3be60e0de277b420ff89303ca6494320c41f7819ffa898756b90ef976e4c636a",
"sha256:4bfee60dad1870b51700d55a85f5ceda766bd9d3d2878c1bbabee80e61b1be1a"
],
"index": "pypi",
"version": "==0.3.1"
},
"six": { "six": {
"hashes": [ "hashes": [
"sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c",

View File

@@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from comic.models import Setting, ComicBook, ComicPage, ComicStatus, Directory from comic.models import ComicBook, ComicPage, ComicStatus, Directory, Setting
@admin.register(Setting) @admin.register(Setting)

View File

@@ -3,7 +3,7 @@ from os.path import isdir
from django.core.management.base import BaseCommand from django.core.management.base import BaseCommand
from comic.models import Setting, Directory, ComicBook from comic.models import ComicBook, Directory, Setting
class Command(BaseCommand): class Command(BaseCommand):

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -2,7 +2,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
from django.conf import settings from django.conf import settings
from django.db import models, migrations from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import models, migrations from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -3,11 +3,12 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
from django.db import migrations, models
import django.db.models.deletion
from django.utils.timezone import utc
import uuid import uuid
import django.db.models.deletion
from django.db import migrations, models
from django.utils.timezone import utc
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -2,10 +2,10 @@
# Generated by Django 1.9.2 on 2016-03-31 10:40 # Generated by Django 1.9.2 on 2016-03-31 10:40
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations
import uuid import uuid
from django.db import migrations
def gen_uuid(apps, schema_editor): def gen_uuid(apps, schema_editor):
comicbook = apps.get_model("comic", "comicbook") comicbook = apps.get_model("comic", "comicbook")

View File

@@ -2,10 +2,10 @@
# Generated by Django 1.9.2 on 2016-03-31 10:40 # Generated by Django 1.9.2 on 2016-03-31 10:40
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models
import uuid import uuid
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -2,9 +2,10 @@
# Generated by Django 1.9.2 on 2016-04-01 08:49 # Generated by Django 1.9.2 on 2016-04-01 08:49
from __future__ import unicode_literals from __future__ import unicode_literals
from django.db import migrations, models
import uuid import uuid
from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -9,7 +9,7 @@ def gen_feeds(apps, schema_editor):
user_misc = apps.get_model("comic", "UserMisc") user_misc = apps.get_model("comic", "UserMisc")
User = apps.get_model("auth", "user") User = apps.get_model("auth", "user")
for user in User.objects.all(): for user in User.objects.all():
um = user_misc.objects.create(user=user) user_misc.objects.create(user=user)
class Migration(migrations.Migration): class Migration(migrations.Migration):

View File

@@ -1,6 +1,6 @@
import uuid import uuid
import zipfile import zipfile
from os import path, listdir from os import listdir, path
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User

View File

@@ -83,12 +83,15 @@ __all__ = ["is_rarfile", "RarInfo", "RarFile", "RarExtFile"]
## Imports and compat - support both Python 2.x and 3.x ## Imports and compat - support both Python 2.x and 3.x
## ##
import sys, os, struct, errno import errno
from struct import pack, unpack import os
import struct
import sys
from binascii import crc32 from binascii import crc32
from tempfile import mkstemp
from subprocess import Popen, PIPE, STDOUT
from datetime import datetime from datetime import datetime
from struct import pack, unpack
from subprocess import PIPE, STDOUT, Popen
from tempfile import mkstemp
# only needed for encryped headers # only needed for encryped headers
try: try:

View File

@@ -3,10 +3,10 @@ import os
from os import path from os import path
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.test import TestCase, Client from django.test import Client, TestCase
from django.utils.http import urlsafe_base64_encode from django.utils.http import urlsafe_base64_encode
from comic.models import ComicBook, ComicPage, Setting, ComicStatus, Directory from comic.models import ComicBook, ComicPage, ComicStatus, Directory, Setting
from comic.util import generate_directory from comic.util import generate_directory

View File

@@ -1,7 +1,6 @@
from django.conf.urls import url from django.conf.urls import url
from . import feeds from . import feeds, views
from . import views
urlpatterns = [ urlpatterns = [
url(r"^$", views.comic_list, name="index"), url(r"^$", views.comic_list, name="index"),

View File

@@ -1,10 +1,10 @@
from collections import OrderedDict from collections import OrderedDict
from os import path, listdir from os import listdir, path
from django.db.transaction import atomic from django.db.transaction import atomic
from django.utils.http import urlsafe_base64_encode from django.utils.http import urlsafe_base64_encode
from .models import ComicBook, Setting, ComicStatus, Directory from .models import ComicBook, ComicStatus, Directory, Setting
def generate_title_from_path(file_path): def generate_title_from_path(file_path):

View File

@@ -5,26 +5,26 @@ except ImportError:
import uuid import uuid
from os import path from os import path
from django.contrib.auth import login, authenticate from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required, user_passes_test from django.contrib.auth.decorators import login_required, user_passes_test
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.db.models import Max from django.db.models import Max
from django.db.transaction import atomic from django.db.transaction import atomic
from django.http import HttpResponse from django.http import HttpResponse
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import get_object_or_404, redirect, render
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from django.views.decorators.csrf import ensure_csrf_cookie from django.views.decorators.csrf import ensure_csrf_cookie
from django.views.decorators.http import require_POST from django.views.decorators.http import require_POST
from .forms import SettingsForm, AccountForm, EditUserForm, AddUserForm, InitialSetupForm from .forms import AccountForm, AddUserForm, EditUserForm, InitialSetupForm, SettingsForm
from .models import Setting, ComicBook, ComicStatus, Directory, ComicPage, UserMisc from .models import ComicBook, ComicPage, ComicStatus, Directory, Setting, UserMisc
from .util import ( from .util import (
generate_breadcrumbs_from_path,
generate_breadcrumbs_from_menu,
generate_title_from_path,
Menu, Menu,
generate_breadcrumbs_from_menu,
generate_breadcrumbs_from_path,
generate_directory, generate_directory,
generate_label, generate_label,
generate_title_from_path,
) )

View File

@@ -1,6 +1,6 @@
from django.contrib.auth import authenticate, login, logout from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.shortcuts import render, redirect from django.shortcuts import redirect, render
from comic_auth.forms import LoginForm from comic_auth.forms import LoginForm

View File

@@ -0,0 +1,24 @@
version: "3.7"
services:
tests:
build: .
environment:
- TEST_DATABASE_URL=postgres://admin:password@database:5432/cbwebreader_test
- DJANGO_SETTINGS_MODULE=cbreader.settings.base
links:
- database
command: >
pytest
-vvv
--isort
--flake8
--black
--cov=.
--cov-report=term-missing
--junitxml=/tmp/test-results.xml
volumes:
- ./cbreader:/src/cbreader
- ./comic:/src/comic
- ./comic_auth:/src/comic_auth
- ${COMIC_BOOK_VOLUME}:/data

View File

@@ -1,7 +1,6 @@
version: '3.7' version: "3.7"
services: services:
app: app:
build: . build: .
environment: environment:
@@ -15,11 +14,11 @@ services:
- database - database
ports: ports:
- "8000:8000" - "8000:8000"
# volumes: volumes:
# - ./cbreader:/src/cbreader - ./cbreader:/src/cbreader
# - ./comic:/src/comic - ./comic:/src/comic
# - ./comic_auth:/src/comic_auth - ./comic_auth:/src/comic_auth
# - ${COMIC_BOOK_VOLUME}:/data - ${COMIC_BOOK_VOLUME}:/data
command: python manage.py runserver 0.0.0.0:8000 command: python manage.py runserver 0.0.0.0:8000
database: database:

21
setup.cfg Normal file
View File

@@ -0,0 +1,21 @@
[tool:pytest]
addopts = -vv --black --isort --flake8
[flake8]
max-line-length = 119
ignore =
# Ignore rules which contradicts black's formatting choices:
* E501
* W503
* W504
* E266
exclude =
# Exclude these files
comic/rarfile.py
[tool:isort]
line_length = 119
indent = ' '
multi_line_output = 3
include_trailing_comma = 1