diff --git a/app.py b/app.py index 31f782d..167fa07 100644 --- a/app.py +++ b/app.py @@ -4,9 +4,9 @@ from sqlalchemy import MetaData, event from sqlalchemy.engine import Engine from flask_migrate import Migrate import version -from lib import cachebust +from lib.cachebust import cachebust from flask_limiter import Limiter -from lib import get_viewer +from lib.session import get_viewer import os import mimetypes diff --git a/dodo.py b/dodo.py index 916633a..05fcd84 100644 --- a/dodo.py +++ b/dodo.py @@ -7,44 +7,46 @@ def reltouch(source_filename, dest_filename): utime(dest_filename, ns=(stat_res.st_atime_ns, stat_res.st_mtime_ns)) -def resize_image(basename, width, format): +def resize_image(basename, width, image_format): from PIL import Image with Image.open('assets/{}.png'.format(basename)) as im: - if 'A' in im.getbands() and format != 'jpeg': + if 'A' in im.getbands() and image_format != 'jpeg': im = im.convert('RGBA') else: im = im.convert('RGB') height = im.height * width // im.width new = im.resize((width, height), resample=Image.LANCZOS) - if format == 'jpeg': + if image_format == 'jpeg': kwargs = dict( optimize=True, progressive=True, quality=80, ) - elif format == 'webp': + elif image_format == 'webp': kwargs = dict( quality=79, ) - elif format == 'png': + elif image_format == 'png': kwargs = dict( optimize=True, ) - new.save('static/{}-{}.{}'.format(basename, width, format), **kwargs) + new.save('static/{}-{}.{}'.format(basename, width, image_format), + **kwargs) reltouch('assets/{}.png'.format(basename), - 'static/{}-{}.{}'.format(basename, width, format)) + 'static/{}-{}.{}'.format(basename, width, image_format)) def task_logotype(): """resize and convert logotype""" widths = (200, 400, 600, 800) - formats = ('jpeg', 'webp') + image_formats = ('jpeg', 'webp') for width in widths: - for format in formats: + for image_format in image_formats: yield dict( - name='{}.{}'.format(width, format), - actions=[(resize_image, ('logotype', width, format))], - targets=[f'static/logotype-{width}.{format}'], + name='{}.{}'.format(width, image_format), + actions=[(resize_image, + ('logotype', width, image_format))], + targets=[f'static/logotype-{width}.{image_format}'], file_dep=['assets/logotype.png'], clean=True, ) @@ -55,13 +57,14 @@ def task_service_icon(): widths = (20, 40, 80) formats = ('webp', 'png') for width in widths: - for format in formats: + for image_format in formats: for basename in ('twitter', 'mastodon'): yield dict( - name='{}-{}.{}'.format(basename, width, format), - actions=[(resize_image, (basename, width, format))], + name='{}-{}.{}'.format(basename, width, image_format), + actions=[(resize_image, (basename, width, image_format))], targets=[ - 'static/{}-{}.{}'.format(basename, width, format)], + 'static/{}-{}.{}'.format(basename, width, + image_format)], file_dep=['assets/{}.png'.format(basename)], clean=True, ) diff --git a/lib/__init__.py b/lib/__init__.py index 2dbc7bc..e69de29 100644 --- a/lib/__init__.py +++ b/lib/__init__.py @@ -1,10 +0,0 @@ -from .interval import decompose_interval -from .interval import SCALES as interval_scales -from .cachebust import cachebust -from .session import set_session_cookie, get_viewer_session, get_viewer -from . import auth -from . import brotli -from . import cachebust -from . import interval -from . import session -from . import settings diff --git a/lib/brotli.py b/lib/brotli.py index 5cabf08..84498bc 100644 --- a/lib/brotli.py +++ b/lib/brotli.py @@ -8,7 +8,9 @@ import mimetypes class BrotliCache(object): - def __init__(self, redis_kwargs={}, max_wait=0.020, expire=60*60*6): + def __init__(self, redis_kwargs=None, max_wait=0.020, expire=60*60*6): + if not redis_kwargs: + redis_kwargs = {} self.redis = redis.StrictRedis(**redis_kwargs) self.max_wait = max_wait self.expire = expire diff --git a/lib/cachebust.py b/lib/cachebust.py index aff4262..47e7860 100644 --- a/lib/cachebust.py +++ b/lib/cachebust.py @@ -3,6 +3,8 @@ import os def cachebust(app): + # pylint: disable=unused-variable + @app.route('/static-cb//') def static_cachebust(timestamp, filename): path = os.path.join(app.static_folder, filename) diff --git a/lib/interval.py b/lib/interval.py index a64b956..69e38a3 100644 --- a/lib/interval.py +++ b/lib/interval.py @@ -24,7 +24,7 @@ def decompose_interval(attrname): @scale.setter def scale(self, value): - if(type(value) != timedelta): + if not isinstance(value, timedelta): value = timedelta(seconds=float(value)) setattr(self, attrname, max(1, getattr(self, sig_name)) * value) @@ -34,7 +34,7 @@ def decompose_interval(attrname): @significand.setter def significand(self, value): - if type(value) == str and value.strip() == '': + if isinstance(value, str) and value.strip() == '': value = 0 try: diff --git a/model.py b/model.py index cf32a7e..c02348c 100644 --- a/model.py +++ b/model.py @@ -2,7 +2,7 @@ from datetime import timedelta, datetime from app import db import secrets -from lib import decompose_interval +from lib.interval import decompose_interval class TimestampMixin(object): @@ -33,8 +33,8 @@ class RemoteIDMixin(object): return self.id.split(":")[1] @twitter_id.setter - def twitter_id(self, id): - self.id = "twitter:{}".format(id) + def twitter_id(self, id_): + self.id = "twitter:{}".format(id_) @property def mastodon_instance(self): @@ -61,8 +61,8 @@ class RemoteIDMixin(object): return self.id.split(":", 1)[1].split('@')[0] @mastodon_id.setter - def mastodon_id(self, id): - self.id = "mastodon:{}@{}".format(id, self.mastodon_instance) + def mastodon_id(self, id_): + self.id = "mastodon:{}@{}".format(id_, self.mastodon_instance) @decompose_interval('policy_delete_every') @@ -121,9 +121,10 @@ class Account(TimestampMixin, RemoteIDMixin): self.next_delete = datetime.now() + value return value + # pylint: disable=R0201 @db.validates('policy_keep_latest') def validate_empty_string_is_zero(self, key, value): - if type(value) == str and value.strip() == '': + if isinstance(value, str) and value.strip() == '': return 0 return value diff --git a/routes.py b/routes.py index 58325a2..a2c5444 100644 --- a/routes.py +++ b/routes.py @@ -3,10 +3,8 @@ from flask import render_template, url_for, redirect, request, g, Response,\ from datetime import datetime, timedelta import lib.twitter import lib.mastodon -import lib from lib.auth import require_auth, require_auth_api, csrf -from lib import set_session_cookie -from lib import get_viewer_session, get_viewer +from lib.session import set_session_cookie, get_viewer_session, get_viewer from model import Session, TwitterArchive, MastodonApp, MastodonInstance from app import app, db, sentry, limiter import tasks @@ -15,6 +13,7 @@ from twitter import TwitterError from urllib.error import URLError import version import lib.version +import lib.brotli @app.before_request diff --git a/tasks.py b/tasks.py index 24276c8..176201b 100644 --- a/tasks.py +++ b/tasks.py @@ -52,8 +52,8 @@ def noop(*args, **kwargs): @app.task(autoretry_for=(TwitterError, URLError, MastodonRatelimitError)) -def fetch_acc(id, cursor=None): - acc = Account.query.get(id) +def fetch_acc(id_, cursor=None): + acc = Account.query.get(id_) print(f'fetching {acc}') try: action = noop @@ -63,7 +63,7 @@ def fetch_acc(id, cursor=None): action = lib.mastodon.fetch_acc cursor = action(acc, cursor) if cursor: - fetch_acc.si(id, cursor).apply_async() + fetch_acc.si(id_, cursor).apply_async() finally: db.session.rollback() acc.touch_fetch() @@ -188,8 +188,8 @@ def delete_from_account(account_id): action = lib.twitter.delete posts = refresh_posts(posts) if posts: - eligible = list( # nosec - (post for post in posts if + eligible = list(( # nosec + post for post in posts if (not account.policy_keep_favourites or not post.favourite) and (not account.policy_keep_media or not post.has_media) ))