Merge pull request #4219 from consideRatio/pr/stricter-flake8

pre-commit: add autoflake and make flake8 checks stricter
This commit is contained in:
Min RK
2022-11-21 15:10:14 +01:00
committed by GitHub
34 changed files with 67 additions and 55 deletions

View File

@@ -4,11 +4,8 @@
# W: style warnings # W: style warnings
# C: complexity # C: complexity
# D: docstring warnings (unused pydocstyle extension) # D: docstring warnings (unused pydocstyle extension)
# F401: module imported but unused
# F403: import *
# F811: redefinition of unused `name` from line `N`
# F841: local variable assigned but never used # F841: local variable assigned but never used
ignore = E, C, W, D, F401, F403, F811, F841 ignore = E, C, W, D, F841
builtins = c, get_config builtins = c, get_config
exclude = exclude =
.cache, .cache,

View File

@@ -17,6 +17,15 @@ repos:
args: args:
- --py36-plus - --py36-plus
# Autoformat: Python code
- repo: https://github.com/PyCQA/autoflake
rev: v1.7.7
hooks:
- id: autoflake
# args ref: https://github.com/PyCQA/autoflake#advanced-usage
args:
- --in-place
# Autoformat: Python code # Autoformat: Python code
- repo: https://github.com/pycqa/isort - repo: https://github.com/pycqa/isort
rev: 5.10.1 rev: 5.10.1

View File

@@ -3,7 +3,6 @@
import sys import sys
import tarfile import tarfile
from tarfile import TarFile
expected_files = [ expected_files = [
"docs/requirements.txt", "docs/requirements.txt",

View File

@@ -1,5 +1,4 @@
import os import os
from os.path import join
from pytablewriter import RstSimpleTableWriter from pytablewriter import RstSimpleTableWriter
from pytablewriter.style import Style from pytablewriter.style import Style

View File

@@ -171,7 +171,7 @@ if on_rtd:
# -- Spell checking ------------------------------------------------------- # -- Spell checking -------------------------------------------------------
try: try:
import sphinxcontrib.spelling import sphinxcontrib.spelling # noqa
except ImportError: except ImportError:
pass pass
else: else:

View File

@@ -1 +1,3 @@
from .app import app from .app import app
__all__ = ["app"]

View File

@@ -51,7 +51,7 @@ async def me(user: User = Depends(get_current_user)):
@router.get("/debug") @router.get("/debug")
async def index(request: Request, user: User = Depends(get_current_user)): async def debug(request: Request, user: User = Depends(get_current_user)):
""" """
Authenticated function that returns a few pieces of debug Authenticated function that returns a few pieces of debug
* Environ of the service process * Environ of the service process

View File

@@ -1 +1,3 @@
from ._version import __version__, version_info from ._version import __version__, version_info
__all__ = ["__version__", "version_info"]

View File

@@ -11,9 +11,6 @@ down_revision = None
branch_labels = None branch_labels = None
depends_on = None depends_on = None
import sqlalchemy as sa
from alembic import op
def upgrade(): def upgrade():
pass pass

View File

@@ -1,5 +1,5 @@
from . import auth, groups, hub, proxy, services, users from . import auth, groups, hub, proxy, services, users
from .base import * from .base import * # noqa
default_handlers = [] default_handlers = []
for mod in (auth, hub, proxy, users, groups, services): for mod in (auth, hub, proxy, users, groups, services):

View File

@@ -5,7 +5,6 @@ import json
import sys import sys
from tornado import web from tornado import web
from tornado.ioloop import IOLoop
from .._version import __version__ from .._version import __version__
from ..scopes import needs_scope from ..scopes import needs_scope

View File

@@ -776,8 +776,6 @@ def _deprecated_method(old_name, new_name, version):
return deprecated return deprecated
import types
# deprecate white/blacklist method names # deprecate white/blacklist method names
for _old_name, _new_name, _version in [ for _old_name, _new_name, _version in [
("check_whitelist", "check_allowed", "1.2"), ("check_whitelist", "check_allowed", "1.2"),

View File

@@ -1,6 +1,6 @@
from . import base, login, metrics, pages from . import base, login, metrics, pages
from .base import * from .base import * # noqa
from .login import * from .login import * # noqa
default_handlers = [] default_handlers = []
for mod in (base, pages, login, metrics): for mod in (base, pages, login, metrics):

View File

@@ -13,7 +13,6 @@ from ..scopes import (
_check_scopes_exist, _check_scopes_exist,
_resolve_requested_scopes, _resolve_requested_scopes,
access_scopes, access_scopes,
expand_scopes,
identify_scopes, identify_scopes,
) )
from ..utils import compare_token, hash_token from ..utils import compare_token, hash_token

View File

@@ -35,7 +35,6 @@ from sqlalchemy.orm import (
sessionmaker, sessionmaker,
) )
from sqlalchemy.pool import StaticPool from sqlalchemy.pool import StaticPool
from sqlalchemy.sql.expression import bindparam
from sqlalchemy.types import LargeBinary, Text, TypeDecorator from sqlalchemy.types import LargeBinary, Text, TypeDecorator
from tornado.log import app_log from tornado.log import app_log
@@ -996,7 +995,6 @@ def check_db_revision(engine):
).first()[0] ).first()[0]
if alembic_revision == head: if alembic_revision == head:
app_log.debug("database schema version found: %s", alembic_revision) app_log.debug("database schema version found: %s", alembic_revision)
pass
else: else:
raise DatabaseSchemaMismatch( raise DatabaseSchemaMismatch(
"Found database schema version {found} != {head}. " "Found database schema version {found} != {head}. "

View File

@@ -250,14 +250,12 @@ class Proxy(LoggingConfigurable):
The proxy implementation should also have a way to associate the fact that a The proxy implementation should also have a way to associate the fact that a
route came from JupyterHub. route came from JupyterHub.
""" """
pass
async def delete_route(self, routespec): async def delete_route(self, routespec):
"""Delete a route with a given routespec if it exists. """Delete a route with a given routespec if it exists.
**Subclasses must define this method** **Subclasses must define this method**
""" """
pass
async def get_all_routes(self): async def get_all_routes(self):
"""Fetch and return all the routes associated by JupyterHub from the """Fetch and return all the routes associated by JupyterHub from the
@@ -274,7 +272,6 @@ class Proxy(LoggingConfigurable):
'data': the attached data dict for this route (as specified in add_route) 'data': the attached data dict for this route (as specified in add_route)
} }
""" """
pass
async def get_route(self, routespec): async def get_route(self, routespec):
"""Return the route info for a given routespec. """Return the route info for a given routespec.
@@ -683,7 +680,6 @@ class ConfigurableHTTPProxy(Proxy):
os.remove(self.pid_file) os.remove(self.pid_file)
except FileNotFoundError: except FileNotFoundError:
self.log.debug("PID file %s already removed", self.pid_file) self.log.debug("PID file %s already removed", self.pid_file)
pass
def _get_ssl_options(self): def _get_ssl_options(self):
"""List of cmd proxy options to use internal SSL""" """List of cmd proxy options to use internal SSL"""

View File

@@ -35,7 +35,6 @@ import string
import time import time
import uuid import uuid
import warnings import warnings
from functools import partial
from http import HTTPStatus from http import HTTPStatus
from unittest import mock from unittest import mock
from urllib.parse import urlencode from urllib.parse import urlencode

View File

@@ -5,6 +5,13 @@ Contains default notebook-app subclass and mixins
from .app import SingleUserNotebookApp, main from .app import SingleUserNotebookApp, main
from .mixins import HubAuthenticatedHandler, make_singleuser_app from .mixins import HubAuthenticatedHandler, make_singleuser_app
__all__ = [
"SingleUserNotebookApp",
"main",
"HubAuthenticatedHandler",
"make_singleuser_app",
]
# backward-compatibility # backward-compatibility
JupyterHubLoginHandler = SingleUserNotebookApp.login_handler_class JupyterHubLoginHandler = SingleUserNotebookApp.login_handler_class
JupyterHubLogoutHandler = SingleUserNotebookApp.logout_handler_class JupyterHubLogoutHandler = SingleUserNotebookApp.logout_handler_class

View File

@@ -14,7 +14,6 @@ import logging
import os import os
import random import random
import secrets import secrets
import ssl
import sys import sys
import warnings import warnings
from datetime import timezone from datetime import timezone

View File

@@ -896,7 +896,6 @@ class Spawner(LoggingConfigurable):
Override in subclasses to restore any extra state that is needed to track Override in subclasses to restore any extra state that is needed to track
the single-user server for that user. Subclasses should call super(). the single-user server for that user. Subclasses should call super().
""" """
pass
def get_state(self): def get_state(self):
"""Save state of spawner into database. """Save state of spawner into database.
@@ -1341,7 +1340,6 @@ class Spawner(LoggingConfigurable):
Stopping a server does *not* call this method. Stopping a server does *not* call this method.
""" """
pass
def add_poll_callback(self, callback, *args, **kwargs): def add_poll_callback(self, callback, *args, **kwargs):
"""Add a callback to fire when the single-user server stops""" """Add a callback to fire when the single-user server stops"""

View File

@@ -27,7 +27,6 @@ Fixtures to add functionality or spawning behavior
# Distributed under the terms of the Modified BSD License. # Distributed under the terms of the Modified BSD License.
import asyncio import asyncio
import copy import copy
import inspect
import os import os
import sys import sys
from functools import partial from functools import partial
@@ -36,7 +35,6 @@ from subprocess import TimeoutExpired
from unittest import mock from unittest import mock
from pytest import fixture, raises from pytest import fixture, raises
from tornado import ioloop
from tornado.httpclient import HTTPError from tornado.httpclient import HTTPError
from tornado.platform.asyncio import AsyncIOMainLoop from tornado.platform.asyncio import AsyncIOMainLoop

View File

@@ -36,7 +36,6 @@ from unittest import mock
from urllib.parse import urlparse from urllib.parse import urlparse
from pamela import PAMError from pamela import PAMError
from tornado.ioloop import IOLoop
from traitlets import Bool, Dict, default from traitlets import Bool, Dict, default
from .. import metrics, orm, roles from .. import metrics, orm, roles
@@ -45,7 +44,7 @@ from ..auth import PAMAuthenticator
from ..singleuser import SingleUserNotebookApp from ..singleuser import SingleUserNotebookApp
from ..spawner import SimpleLocalProcessSpawner from ..spawner import SimpleLocalProcessSpawner
from ..utils import random_port, utcnow from ..utils import random_port, utcnow
from .utils import async_requests, public_host, public_url, ssl_setup from .utils import async_requests, public_url, ssl_setup
def mock_authenticate(username, password, service, encoding): def mock_authenticate(username, password, service, encoding):

View File

@@ -4,7 +4,6 @@ Run with old versions of jupyterhub to test upgrade/downgrade
used in test_db.py used in test_db.py
""" """
import os
from datetime import datetime from datetime import datetime
from functools import partial from functools import partial

View File

@@ -1,6 +1,5 @@
import pytest import pytest
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.firefox.options import Options as FirefoxOptions
@pytest.fixture() @pytest.fixture()

View File

@@ -1,21 +1,14 @@
import asyncio import asyncio
import time
from functools import partial from functools import partial
import pytest import pytest
from selenium import webdriver from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import NoSuchElementException, TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support.ui import WebDriverWait
from tornado.escape import url_escape from tornado.escape import url_escape
from tornado.httputil import url_concat from tornado.httputil import url_concat
from jupyterhub.tests.selenium.locators import ( from jupyterhub.tests.selenium.locators import LoginPageLocators
HomePageLocators,
LoginPageLocators,
TokenPageLocators,
)
from jupyterhub.utils import exponential_backoff from jupyterhub.utils import exponential_backoff
from ...utils import url_path_join from ...utils import url_path_join

View File

@@ -19,8 +19,15 @@ from ..objects import Server
from ..utils import url_path_join as ujoin from ..utils import url_path_join as ujoin
from ..utils import utcnow from ..utils import utcnow
from .conftest import new_username from .conftest import new_username
from .mocking import public_host, public_url from .utils import (
from .utils import add_user, api_request, async_requests, auth_header, find_user add_user,
api_request,
async_requests,
auth_header,
find_user,
public_host,
public_url,
)
# -------------------- # --------------------
# Authentication tests # Authentication tests

View File

@@ -7,7 +7,6 @@ authentication can expire in a number of ways:
- doesn't need refresh - doesn't need refresh
- needs refresh and cannot be refreshed without new login - needs refresh and cannot be refreshed without new login
""" """
from contextlib import contextmanager
from unittest import mock from unittest import mock
from urllib.parse import parse_qs, urlparse from urllib.parse import parse_qs, urlparse

View File

@@ -14,8 +14,6 @@ import jsonschema
import pytest import pytest
from traitlets.config import Config from traitlets.config import Config
from .mocking import MockHub
# To test new schemas, add them to the `valid_events` # To test new schemas, add them to the `valid_events`
# and `invalid_events` dictionary below. # and `invalid_events` dictionary below.

View File

@@ -11,9 +11,9 @@ from tornado.httputil import url_concat
from .. import orm from .. import orm
from ..utils import url_escape_path, url_path_join from ..utils import url_escape_path, url_path_join
from .mocking import FormSpawner, public_url from .mocking import FormSpawner
from .test_api import TIMESTAMP, add_user, api_request, fill_user, normalize_user from .test_api import TIMESTAMP, add_user, api_request, fill_user, normalize_user
from .utils import async_requests, get_page from .utils import async_requests, get_page, public_url
@pytest.fixture @pytest.fixture

View File

@@ -7,7 +7,6 @@ from datetime import datetime, timedelta
from unittest import mock from unittest import mock
import pytest import pytest
from tornado import gen
from .. import crypto, objects, orm, roles from .. import crypto, objects, orm, roles
from ..emptyclass import EmptyClass from ..emptyclass import EmptyClass

View File

@@ -6,8 +6,6 @@ from subprocess import Popen
from async_generator import asynccontextmanager from async_generator import asynccontextmanager
from .. import orm
from ..roles import roles_to_scopes
from ..utils import ( from ..utils import (
exponential_backoff, exponential_backoff,
maybe_future, maybe_future,

View File

@@ -1,7 +1,7 @@
"""Tests for jupyterhub.singleuser""" """Tests for jupyterhub.singleuser"""
import os import os
import sys import sys
from contextlib import contextmanager, nullcontext from contextlib import nullcontext
from subprocess import CalledProcessError, check_output from subprocess import CalledProcessError, check_output
from unittest import mock from unittest import mock
from urllib.parse import urlencode, urlparse from urllib.parse import urlencode, urlparse

View File

@@ -527,7 +527,6 @@ def print_stacks(file=sys.stderr):
""" """
# local imports because these will not be used often, # local imports because these will not be used often,
# no need to add them to startup # no need to add them to startup
import asyncio
import traceback import traceback
from .log import coroutine_frames from .log import coroutine_frames

View File

@@ -1,6 +1,26 @@
# autoflake is used for autoformatting Python code
#
# ref: https://github.com/PyCQA/autoflake#readme
#
[tool.autoflake]
ignore-init-module-imports = true
remove-all-unused-imports = true
remove-duplicate-keys = true
#remove-unused-variables = true
# isort is used for autoformatting Python code
#
# ref: https://pycqa.github.io/isort/
#
[tool.isort] [tool.isort]
profile = "black" profile = "black"
# black is used for autoformatting Python code
#
# ref: https://black.readthedocs.io/en/stable/
#
[tool.black] [tool.black]
skip-string-normalization = true skip-string-normalization = true
# target-version should be all supported versions, see # target-version should be all supported versions, see
@@ -12,6 +32,12 @@ target_version = [
"py310", "py310",
] ]
# tbump is used to simplify and standardize the release process when updating
# the version, making a git commit and tag, and pushing changes.
#
# ref: https://github.com/your-tools/tbump#readme
#
[tool.tbump] [tool.tbump]
# Uncomment this if your project is hosted on GitHub: # Uncomment this if your project is hosted on GitHub:
github_url = "https://github.com/jupyterhub/jupyterhub" github_url = "https://github.com/jupyterhub/jupyterhub"