From a8f2d5795328c30fe95cd76c4a599f4cdb89009e Mon Sep 17 00:00:00 2001 From: Erik Sundell Date: Wed, 31 May 2023 16:42:36 +0200 Subject: [PATCH 1/3] pre-commit: add pyupgrade and autoflake, simplify flake8 config --- .flake8 | 10 ++-------- .pre-commit-config.yaml | 25 +++++++++++++++++++++++++ pyproject.toml | 11 +++++++++++ tests/conftest.py | 2 +- 4 files changed, 39 insertions(+), 9 deletions(-) diff --git a/.flake8 b/.flake8 index ba89aca6..f1c6db6a 100644 --- a/.flake8 +++ b/.flake8 @@ -3,14 +3,8 @@ # E: style errors # W: style warnings # C: complexity -# F401: module imported but unused -# F403: import * -# F811: redefinition of unused `name` from line `N` -# F841: local variable assigned but never used -# E402: module level import not at top of file -# I100: Import statements are in the wrong order -# I101: Imported names are in the wrong order. Should be -ignore = E, C, W, F401, F403, F811, F841, E402, I100, I101, D400 +# D: docstring warnings (unused pydocstyle extension) +ignore = E, C, W, D builtins = c, get_config exclude = .cache, diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cbf5d676..5572323e 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,4 +1,29 @@ +# +# Config reference: https://pre-commit.com/#pre-commit-configyaml---top-level +# +# Common tasks +# +# - Run on all files: pre-commit run --all-files +# - Register git hooks: pre-commit install --install-hooks +# repos: + # Autoformat: Python code, syntax patterns are modernized + - repo: https://github.com/asottile/pyupgrade + rev: v3.4.0 + hooks: + - id: pyupgrade + args: + - --py38-plus + + # Autoformat: Python code + - repo: https://github.com/PyCQA/autoflake + rev: v2.1.1 + hooks: + - id: autoflake + # args ref: https://github.com/PyCQA/autoflake#advanced-usage + args: + - --in-place + # Autoformat: Python - repo: https://github.com/pycqa/isort rev: 5.12.0 diff --git a/pyproject.toml b/pyproject.toml index 004f96e5..efed1102 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,3 +1,14 @@ +# 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/ diff --git a/tests/conftest.py b/tests/conftest.py index d846be1f..adaabdb5 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -57,7 +57,7 @@ def pytest_collection_modifyitems(items): @pytest.fixture -def app(jupyterhub_app): +def app(jupyterhub_app): # noqa: F811 app = jupyterhub_app app.config.DockerSpawner.prefix = "dockerspawner-test" # If it's a prerelease e.g. (2, 0, 0, 'rc4', '') use full tag From 3cea02631394079057cad34469981318c2b7bea9 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 1 Jun 2023 09:42:35 +0000 Subject: [PATCH 2/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- dockerspawner/dockerspawner.py | 10 ++++++---- dockerspawner/swarmspawner.py | 3 +-- dockerspawner/systemuserspawner.py | 8 ++++---- examples/internal-ssl/jupyterhub_config.py | 3 --- setup.py | 2 -- tests/test_dockerspawner.py | 6 ++---- tests/test_swarmspawner.py | 1 - tests/test_systemuserspawner.py | 1 - tests/volumes_test.py | 1 - 9 files changed, 13 insertions(+), 22 deletions(-) diff --git a/dockerspawner/dockerspawner.py b/dockerspawner/dockerspawner.py index 777db921..f2debe0a 100644 --- a/dockerspawner/dockerspawner.py +++ b/dockerspawner/dockerspawner.py @@ -46,7 +46,7 @@ def validate(self, obj, value): if value is False: return value - return super(UnicodeOrFalse, self).validate(obj, value) + return super().validate(obj, value) import jupyterhub @@ -888,7 +888,7 @@ def _object_name_default(self): return self._render_templates(self.name_template) def load_state(self, state): - super(DockerSpawner, self).load_state(state) + super().load_state(state) if "container_id" in state: # backward-compatibility for dockerspawner < 0.10 self.object_id = state.get("container_id") @@ -906,7 +906,7 @@ def load_state(self, state): ) def get_state(self): - state = super(DockerSpawner, self).get_state() + state = super().get_state() if self.object_id: state["object_id"] = self.object_id # persist object_name if running @@ -1046,7 +1046,9 @@ async def check_allowed(self, image): if image not in allowed_images: raise web.HTTPError( 400, - "Image %s not in allowed list: %s" % (image, ', '.join(allowed_images)), + "Image {} not in allowed list: {}".format( + image, ', '.join(allowed_images) + ), ) # resolve image alias to actual image name return allowed_images[image] diff --git a/dockerspawner/swarmspawner.py b/dockerspawner/swarmspawner.py index 3b1dad78..15c5a7e8 100644 --- a/dockerspawner/swarmspawner.py +++ b/dockerspawner/swarmspawner.py @@ -296,7 +296,7 @@ async def start_object(self): break if state != "running": raise RuntimeError( - "Service %s not running: %s" % (self.service_name, pformat(status)) + "Service {} not running: {}".format(self.service_name, pformat(status)) ) async def stop_object(self): @@ -304,7 +304,6 @@ async def stop_object(self): There is no separate stop action for services """ - pass async def get_ip_and_port(self): """Queries Docker daemon for service's IP and port. diff --git a/dockerspawner/systemuserspawner.py b/dockerspawner/systemuserspawner.py index 2f760b78..70a4dbea 100644 --- a/dockerspawner/systemuserspawner.py +++ b/dockerspawner/systemuserspawner.py @@ -113,7 +113,7 @@ def volume_mount_points(self): Returns a list of all the values in self.volumes or self.read_only_volumes. """ - mount_points = super(SystemUserSpawner, self).volume_mount_points + mount_points = super().volume_mount_points mount_points.append(self.homedir) return mount_points @@ -128,12 +128,12 @@ def volume_binds(self): host_location: {'bind': container_location, 'ro': True} } """ - volumes = super(SystemUserSpawner, self).volume_binds + volumes = super().volume_binds volumes[self.host_homedir] = {'bind': self.homedir, 'ro': False} return volumes def get_env(self): - env = super(SystemUserSpawner, self).get_env() + env = super().get_env() # relies on NB_USER and NB_UID handling in jupyter/docker-stacks env.update( dict( @@ -223,4 +223,4 @@ def start(self, *, image=None, extra_create_kwargs=None, extra_host_config=None) f"user_id for {self.user.name} not set, but group_id is {self.group_id}. This will have no effect." ) - return super(SystemUserSpawner, self).start() + return super().start() diff --git a/examples/internal-ssl/jupyterhub_config.py b/examples/internal-ssl/jupyterhub_config.py index 2086ae2b..a86350a2 100644 --- a/examples/internal-ssl/jupyterhub_config.py +++ b/examples/internal-ssl/jupyterhub_config.py @@ -1,7 +1,4 @@ import os -import socket -import sys -import time c = get_config() # noqa c.JupyterHub.authenticator_class = 'dummy' diff --git a/setup.py b/setup.py index 9ca575bc..655b6395 100644 --- a/setup.py +++ b/setup.py @@ -1,11 +1,9 @@ #!/usr/bin/env python -# coding: utf-8 # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. # ----------------------------------------------------------------------------- # Minimal Python version sanity check (from IPython/Jupyterhub) # ----------------------------------------------------------------------------- -from __future__ import print_function import os import sys diff --git a/tests/test_dockerspawner.py b/tests/test_dockerspawner.py index 9da02c24..9c970c5f 100644 --- a/tests/test_dockerspawner.py +++ b/tests/test_dockerspawner.py @@ -169,14 +169,12 @@ async def test_image_pull_policy(dockerspawner_configured_app): tag = "1.29.1" # a version that's definitely not latest # ensure image isn't present try: - await asyncio.wrap_future( - spawner.docker("remove_image", "{}:{}".format(repo, tag)) - ) + await asyncio.wrap_future(spawner.docker("remove_image", f"{repo}:{tag}")) except docker.errors.ImageNotFound: pass spawner.pull_policy = "ifnotpresent" - image = "{}:{}".format(repo, tag) + image = f"{repo}:{tag}" # should trigger a pull await spawner.pull_image(image) # verify that the image exists now diff --git a/tests/test_swarmspawner.py b/tests/test_swarmspawner.py index 3450bc20..02d47288 100644 --- a/tests/test_swarmspawner.py +++ b/tests/test_swarmspawner.py @@ -1,7 +1,6 @@ """Tests for SwarmSpawner""" import asyncio -import pytest from jupyterhub.tests.mocking import public_url from jupyterhub.tests.test_api import add_user, api_request from jupyterhub.utils import url_path_join diff --git a/tests/test_systemuserspawner.py b/tests/test_systemuserspawner.py index 0ea567f7..eff4783b 100644 --- a/tests/test_systemuserspawner.py +++ b/tests/test_systemuserspawner.py @@ -1,7 +1,6 @@ """Tests for SwarmSpawner""" from getpass import getuser -import pytest from jupyterhub.tests.mocking import public_url from jupyterhub.tests.test_api import add_user, api_request from jupyterhub.utils import url_path_join diff --git a/tests/volumes_test.py b/tests/volumes_test.py index c0c33fca..e4f521c3 100644 --- a/tests/volumes_test.py +++ b/tests/volumes_test.py @@ -1,6 +1,5 @@ """Test volume manipulation logic """ -from __future__ import absolute_import, division, print_function import types From b31192914af7c3a67958f233a01d71d1a3218aaf Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 1 Jun 2023 09:43:13 +0000 Subject: [PATCH 3/3] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- dockerspawner/swarmspawner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dockerspawner/swarmspawner.py b/dockerspawner/swarmspawner.py index 15c5a7e8..45c156da 100644 --- a/dockerspawner/swarmspawner.py +++ b/dockerspawner/swarmspawner.py @@ -296,7 +296,7 @@ async def start_object(self): break if state != "running": raise RuntimeError( - "Service {} not running: {}".format(self.service_name, pformat(status)) + f"Service {self.service_name} not running: {pformat(status)}" ) async def stop_object(self):