use ruff instead of flake8 (#2278)

* add: use ruff instead of flake8

* Update ruff switches and remove flake8 plugins

* fix: ignore linting rules

* fix: ignore I001

* fix: spaces before noqa

---------

Co-authored-by: Kevin Chung <kchung@ctfd.io>
This commit is contained in:
Alper Berber
2023-04-11 18:20:48 +03:00
committed by GitHub
parent faa937020a
commit 23c7b2f90f
24 changed files with 52 additions and 55 deletions

View File

@@ -185,15 +185,15 @@ def create_app(config="CTFd.config.Config"):
app.jinja_loader = jinja2.ChoiceLoader(loaders) app.jinja_loader = jinja2.ChoiceLoader(loaders)
from CTFd.models import ( # noqa: F401 from CTFd.models import ( # noqa: F401
db,
Teams,
Solves,
Challenges, Challenges,
Fails, Fails,
Flags,
Tags,
Files, Files,
Flags,
Solves,
Tags,
Teams,
Tracking, Tracking,
db,
) )
url = create_database() url = create_database()
@@ -214,8 +214,8 @@ def create_app(config="CTFd.config.Config"):
# db.create_all call because tests use the in-memory SQLite # db.create_all call because tests use the in-memory SQLite
# database (each connection, including db creation, is a new db). # database (each connection, including db creation, is a new db).
# https://docs.sqlalchemy.org/en/13/dialects/sqlite.html#foreign-key-support # https://docs.sqlalchemy.org/en/13/dialects/sqlite.html#foreign-key-support
from sqlalchemy.engine import Engine
from sqlalchemy import event from sqlalchemy import event
from sqlalchemy.engine import Engine
@event.listens_for(Engine, "connect") @event.listens_for(Engine, "connect")
def set_sqlite_pragma(dbapi_connection, connection_record): def set_sqlite_pragma(dbapi_connection, connection_record):
@@ -275,16 +275,16 @@ def create_app(config="CTFd.config.Config"):
init_template_globals(app) init_template_globals(app)
# Importing here allows tests to use sensible names (e.g. api instead of api_bp) # Importing here allows tests to use sensible names (e.g. api instead of api_bp)
from CTFd.views import views
from CTFd.teams import teams
from CTFd.users import users
from CTFd.challenges import challenges
from CTFd.scoreboard import scoreboard
from CTFd.auth import auth
from CTFd.admin import admin from CTFd.admin import admin
from CTFd.api import api from CTFd.api import api
from CTFd.events import events from CTFd.auth import auth
from CTFd.challenges import challenges
from CTFd.errors import render_error from CTFd.errors import render_error
from CTFd.events import events
from CTFd.scoreboard import scoreboard
from CTFd.teams import teams
from CTFd.users import users
from CTFd.views import views
app.register_blueprint(views) app.register_blueprint(views)
app.register_blueprint(teams) app.register_blueprint(teams)

View File

@@ -1,7 +1,7 @@
import csv import csv # noqa: I001
import datetime import datetime
import os
from io import StringIO from io import StringIO
import os
from flask import Blueprint, abort from flask import Blueprint, abort
from flask import current_app as app from flask import current_app as app
@@ -18,14 +18,14 @@ from flask import (
admin = Blueprint("admin", __name__) admin = Blueprint("admin", __name__)
# isort:imports-firstparty # isort:imports-firstparty
from CTFd.admin import challenges # noqa: F401 from CTFd.admin import challenges # noqa: F401,I001
from CTFd.admin import notifications # noqa: F401 from CTFd.admin import notifications # noqa: F401,I001
from CTFd.admin import pages # noqa: F401 from CTFd.admin import pages # noqa: F401,I001
from CTFd.admin import scoreboard # noqa: F401 from CTFd.admin import scoreboard # noqa: F401,I001
from CTFd.admin import statistics # noqa: F401 from CTFd.admin import statistics # noqa: F401,I001
from CTFd.admin import submissions # noqa: F401 from CTFd.admin import submissions # noqa: F401,I001
from CTFd.admin import teams # noqa: F401 from CTFd.admin import teams # noqa: F401,I001
from CTFd.admin import users # noqa: F401 from CTFd.admin import users # noqa: F401,I001
from CTFd.cache import ( from CTFd.cache import (
cache, cache,
clear_challenges, clear_challenges,

View File

@@ -1,4 +1,4 @@
from typing import List from typing import List # noqa: I001
from flask import abort, render_template, request, url_for from flask import abort, render_template, request, url_for
from flask_restx import Namespace, Resource from flask_restx import Namespace, Resource

View File

@@ -5,7 +5,7 @@ statistics_namespace = Namespace(
) )
# isort:imports-firstparty # isort:imports-firstparty
from CTFd.api.v1.statistics import challenges # noqa: F401 from CTFd.api.v1.statistics import challenges # noqa: F401,I001
from CTFd.api.v1.statistics import scores # noqa: F401 from CTFd.api.v1.statistics import scores # noqa: F401
from CTFd.api.v1.statistics import submissions # noqa: F401 from CTFd.api.v1.statistics import submissions # noqa: F401
from CTFd.api.v1.statistics import teams # noqa: F401 from CTFd.api.v1.statistics import teams # noqa: F401

View File

@@ -1,4 +1,4 @@
import base64 import base64 # noqa: I001
import requests import requests
from flask import Blueprint, abort from flask import Blueprint, abort

View File

@@ -60,7 +60,7 @@ def clear_config():
def clear_standings(): def clear_standings():
from CTFd.models import Users, Teams from CTFd.models import Users, Teams # noqa: I001
from CTFd.constants.static import CacheKeys from CTFd.constants.static import CacheKeys
from CTFd.utils.scores import get_standings, get_team_standings, get_user_standings from CTFd.utils.scores import get_standings, get_team_standings, get_user_standings
from CTFd.api.v1.scoreboard import ScoreboardDetail, ScoreboardList from CTFd.api.v1.scoreboard import ScoreboardDetail, ScoreboardList
@@ -99,7 +99,7 @@ def clear_standings():
def clear_challenges(): def clear_challenges():
from CTFd.utils.challenges import get_all_challenges from CTFd.utils.challenges import get_all_challenges # noqa: I001
from CTFd.utils.challenges import get_solves_for_challenge_id from CTFd.utils.challenges import get_solves_for_challenge_id
from CTFd.utils.challenges import get_solve_ids_for_user_id from CTFd.utils.challenges import get_solve_ids_for_user_id
from CTFd.utils.challenges import get_solve_counts_for_challenges from CTFd.utils.challenges import get_solve_counts_for_challenges
@@ -124,7 +124,7 @@ def clear_user_recent_ips(user_id):
def clear_user_session(user_id): def clear_user_session(user_id):
from CTFd.utils.user import ( from CTFd.utils.user import ( # noqa: I001
get_user_attrs, get_user_attrs,
get_user_place, get_user_place,
get_user_score, get_user_score,
@@ -138,7 +138,7 @@ def clear_user_session(user_id):
def clear_all_user_sessions(): def clear_all_user_sessions():
from CTFd.utils.user import ( from CTFd.utils.user import ( # noqa: I001
get_user_attrs, get_user_attrs,
get_user_place, get_user_place,
get_user_score, get_user_score,

View File

@@ -501,7 +501,7 @@ class Users(db.Model):
to no imports within the CTFd application as importing from the to no imports within the CTFd application as importing from the
application itself will result in a circular import. application itself will result in a circular import.
""" """
from CTFd.utils.scores import get_user_standings from CTFd.utils.scores import get_user_standings # noqa: I001
from CTFd.utils.humanize.numbers import ordinalize from CTFd.utils.humanize.numbers import ordinalize
standings = get_user_standings(admin=admin) standings = get_user_standings(admin=admin)
@@ -618,7 +618,7 @@ class Teams(db.Model):
] ]
def get_invite_code(self): def get_invite_code(self):
from flask import current_app from flask import current_app # noqa: I001
from CTFd.utils.security.signing import serialize, hmac from CTFd.utils.security.signing import serialize, hmac
secret_key = current_app.config["SECRET_KEY"] secret_key = current_app.config["SECRET_KEY"]
@@ -637,7 +637,7 @@ class Teams(db.Model):
@classmethod @classmethod
def load_invite_code(cls, code): def load_invite_code(cls, code):
from flask import current_app from flask import current_app # noqa: I001
from CTFd.utils.security.signing import ( from CTFd.utils.security.signing import (
unserialize, unserialize,
hmac, hmac,
@@ -736,7 +736,7 @@ class Teams(db.Model):
to no imports within the CTFd application as importing from the to no imports within the CTFd application as importing from the
application itself will result in a circular import. application itself will result in a circular import.
""" """
from CTFd.utils.scores import get_team_standings from CTFd.utils.scores import get_team_standings # noqa: I001
from CTFd.utils.humanize.numbers import ordinalize from CTFd.utils.humanize.numbers import ordinalize
standings = get_team_standings(admin=admin) standings = get_team_standings(admin=admin)

View File

@@ -1,4 +1,4 @@
import inspect import inspect # noqa: I001
import os import os
from alembic.config import Config from alembic.config import Config

View File

@@ -52,7 +52,7 @@ def init_template_filters(app):
def init_template_globals(app): def init_template_globals(app):
from CTFd.constants import JINJA_ENUMS from CTFd.constants import JINJA_ENUMS # noqa: I001
from CTFd.constants.assets import Assets from CTFd.constants.assets import Assets
from CTFd.constants.config import Configs from CTFd.constants.config import Configs
from CTFd.constants.plugins import Plugins from CTFd.constants.plugins import Plugins

View File

@@ -1,4 +1,4 @@
import datetime import datetime # noqa: I001
import re import re
from flask import abort from flask import abort

View File

@@ -1,4 +1,4 @@
import os import os # noqa: I001
from flask import Blueprint, abort from flask import Blueprint, abort
from flask import current_app as app from flask import current_app as app

View File

@@ -1,5 +1,5 @@
lint: lint:
flake8 --ignore=E402,E501,E712,W503,E203 --exclude=CTFd/uploads CTFd/ migrations/ tests/ ruff check --select E,F,W,B,C4,I --ignore E402,E501,E712,B904,B905 --exclude=CTFd/uploads CTFd/ migrations/ tests/
yarn lint yarn lint
black --check --diff --exclude=CTFd/uploads --exclude=node_modules . black --check --diff --exclude=CTFd/uploads --exclude=node_modules .
prettier --check 'CTFd/themes/**/assets/**/*' prettier --check 'CTFd/themes/**/assets/**/*'

View File

@@ -3,7 +3,7 @@ pip-tools==5.4.0
pytest==5.4.2 pytest==5.4.2
pytest-randomly==3.4.0 pytest-randomly==3.4.0
coverage==5.1 coverage==5.1
flake8==3.8.2 ruff==0.0.260
psycopg2-binary==2.8.6 psycopg2-binary==2.8.6
codecov==2.1.7 codecov==2.1.7
moto==1.3.16 moto==1.3.16
@@ -14,10 +14,7 @@ pytest-cov==2.9.0
sphinx_rtd_theme==0.4.3 sphinx_rtd_theme==0.4.3
flask-debugtoolbar==0.11.0 flask-debugtoolbar==0.11.0
isort==4.3.21 isort==4.3.21
flake8-isort==3.0.0
Faker==4.1.0 Faker==4.1.0
pipdeptree==2.2.0 pipdeptree==2.2.0
black==19.10b0 black==19.10b0
pytest-sugar==0.9.4 pytest-sugar==0.9.4
flake8-comprehensions==3.3.1
flake8-bugbear==20.11.1

View File

@@ -1,4 +1,4 @@
from __future__ import with_statement from __future__ import with_statement # noqa: I001
import logging import logging
from logging.config import fileConfig from logging.config import fileConfig

View File

@@ -5,7 +5,7 @@ Revises: 1093835a1051
Create Date: 2020-08-14 00:46:54.161120 Create Date: 2020-08-14 00:46:54.161120
""" """
from alembic import op from alembic import op # noqa: I001
import sqlalchemy as sa import sqlalchemy as sa

View File

@@ -5,7 +5,7 @@ Revises: 75e8ab9a0014
Create Date: 2021-06-15 19:57:37.410152 Create Date: 2021-06-15 19:57:37.410152
""" """
from alembic import op from alembic import op # noqa: I001
import sqlalchemy as sa import sqlalchemy as sa

View File

@@ -5,7 +5,7 @@ Revises: 4d3c1b59d011
Create Date: 2022-11-01 23:27:44.620893 Create Date: 2022-11-01 23:27:44.620893
""" """
from alembic import op from alembic import op # noqa: I001
from sqlalchemy.dialects import mysql from sqlalchemy.dialects import mysql

View File

@@ -5,7 +5,7 @@ Revises: 6012fe8de495
Create Date: 2022-04-07 03:53:27.554190 Create Date: 2022-04-07 03:53:27.554190
""" """
from alembic import op from alembic import op # noqa: I001
import sqlalchemy as sa import sqlalchemy as sa

View File

@@ -5,7 +5,7 @@ Revises: ef87d69ec29a
Create Date: 2021-07-30 03:50:54.219124 Create Date: 2021-07-30 03:50:54.219124
""" """
from alembic import op from alembic import op # noqa: I001
import sqlalchemy as sa import sqlalchemy as sa

View File

@@ -5,7 +5,7 @@ Revises: 0366ba6575ca
Create Date: 2020-08-19 00:36:17.579497 Create Date: 2020-08-19 00:36:17.579497
""" """
from alembic import op from alembic import op # noqa: I001
import sqlalchemy as sa import sqlalchemy as sa

View File

@@ -5,7 +5,7 @@ Revises: 080d29b15cd3
Create Date: 2020-02-13 01:10:16.430424 Create Date: 2020-02-13 01:10:16.430424
""" """
from alembic import op from alembic import op # noqa: I001
from sqlalchemy.sql import column, table from sqlalchemy.sql import column, table
from CTFd.models import db from CTFd.models import db

View File

@@ -5,7 +5,7 @@ Revises: 07dfbe5e1edc
Create Date: 2021-07-29 23:22:39.345426 Create Date: 2021-07-29 23:22:39.345426
""" """
from alembic import op from alembic import op # noqa: I001
import sqlalchemy as sa import sqlalchemy as sa

View File

@@ -60,7 +60,7 @@ def test_deleting_challenge_clears_cache_solves():
data = req.get_json()["data"] data = req.get_json()["data"]
challenge = data[0] challenge = data[0]
assert challenge["solves"] == 1 assert challenge["solves"] == 1
from CTFd.utils.challenges import ( from CTFd.utils.challenges import ( # noqa: I001
get_solves_for_challenge_id, get_solves_for_challenge_id,
get_solve_counts_for_challenges, get_solve_counts_for_challenges,
) )
@@ -100,7 +100,7 @@ def test_deleting_solve_clears_cache():
data = req.get_json()["data"] data = req.get_json()["data"]
challenge = data[0] challenge = data[0]
assert challenge["solves"] == 1 assert challenge["solves"] == 1
from CTFd.utils.challenges import ( from CTFd.utils.challenges import ( # noqa: I001
get_solves_for_challenge_id, get_solves_for_challenge_id,
get_solve_counts_for_challenges, get_solve_counts_for_challenges,
) )

View File

@@ -24,7 +24,7 @@ def test_RawEnum():
def test_JSEnum(): def test_JSEnum():
from CTFd.constants import JS_ENUMS from CTFd.constants import JS_ENUMS # noqa: I001
import json import json
@JSEnum @JSEnum