From ecdf65385d07fe1d3e6abe26790618364d5e174f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Gir=C3=A3o=20Serr=C3=A3o?= <5621605+rodrigogiraoserrao@users.noreply.github.com> Date: Thu, 26 Oct 2023 11:28:26 +0100 Subject: [PATCH 1/4] Add more pre-commit hooks. --- .pre-commit-config.yaml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b68fd5121..3bdb6ef56 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,10 +4,19 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.3.0 hooks: - - id: trailing-whitespace - - id: end-of-file-fixer + - id: check-ast + - id: check-builtin-literals + - id: check-case-conflict + - id: check-merge-conflict + - id: check-json + - id: check-toml - id: check-yaml args: [ '--unsafe' ] + - id: check-shebang-scripts-are-executable + - id: check-vcs-permalinks + - id: end-of-file-fixer + - id: mixed-line-ending + - id: trailing-whitespace - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: @@ -19,4 +28,9 @@ repos: rev: 23.1.0 hooks: - id: black + - repo: https://github.com/hadialqattan/pycln + rev: v2.3.0 + hooks: + - id: pycln + args: [--all] exclude: ^tests/snapshot_tests From ec44d17ccc5ac979c529dfd0a3ac82ade4417950 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Gir=C3=A3o=20Serr=C3=A3o?= <5621605+rodrigogiraoserrao@users.noreply.github.com> Date: Thu, 26 Oct 2023 11:55:22 +0100 Subject: [PATCH 2/4] Remove trailing whitespace hook. See https://github.com/Textualize/textual/pull/3595#discussion_r1372961156. --- .pre-commit-config.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3bdb6ef56..cf0a3df4f 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -16,7 +16,6 @@ repos: - id: check-vcs-permalinks - id: end-of-file-fixer - id: mixed-line-ending - - id: trailing-whitespace - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: From 6f00943c1474eae4d534e6b3e3eb27e4a649b7e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Gir=C3=A3o=20Serr=C3=A3o?= <5621605+rodrigogiraoserrao@users.noreply.github.com> Date: Thu, 26 Oct 2023 12:15:55 +0100 Subject: [PATCH 3/4] Fix imports. --- .../nonblocking01.py | 1 - docs/examples/events/on_decorator01.py | 1 - docs/examples/events/prevent.py | 1 - docs/examples/guide/reactivity/validate01.py | 2 +- docs/examples/styles/padding_all.py | 2 +- docs/examples/widgets/content_switcher.py | 2 -- src/textual/_parser.py | 2 -- src/textual/_types.py | 8 +------- src/textual/css/_style_properties.py | 2 +- src/textual/document/_document.py | 3 ++- src/textual/drivers/_input_reader_linux.py | 2 -- src/textual/drivers/linux_driver.py | 2 +- src/textual/message_pump.py | 1 - src/textual/widgets/_tabs.py | 1 - src/textual/widgets/_text_area.py | 3 +-- tests/css/test_programmatic_style_changes.py | 1 - tests/css/test_stylesheet.py | 1 - tests/input/test_input_validation.py | 1 - tests/test_reactive.py | 2 -- tests/test_screens.py | 4 ++-- tests/test_style_inheritance.py | 2 -- 21 files changed, 10 insertions(+), 34 deletions(-) diff --git a/docs/blog/snippets/2022-12-07-responsive-app-background-task/nonblocking01.py b/docs/blog/snippets/2022-12-07-responsive-app-background-task/nonblocking01.py index 20f2daba8..21e1760aa 100644 --- a/docs/blog/snippets/2022-12-07-responsive-app-background-task/nonblocking01.py +++ b/docs/blog/snippets/2022-12-07-responsive-app-background-task/nonblocking01.py @@ -1,5 +1,4 @@ import asyncio -import time from random import randint from textual.app import App, ComposeResult diff --git a/docs/examples/events/on_decorator01.py b/docs/examples/events/on_decorator01.py index ac8e2ccd2..6612d6ad6 100644 --- a/docs/examples/events/on_decorator01.py +++ b/docs/examples/events/on_decorator01.py @@ -1,4 +1,3 @@ -from textual import on from textual.app import App, ComposeResult from textual.widgets import Button diff --git a/docs/examples/events/prevent.py b/docs/examples/events/prevent.py index 39fe437c2..61e48780d 100644 --- a/docs/examples/events/prevent.py +++ b/docs/examples/events/prevent.py @@ -1,5 +1,4 @@ from textual.app import App, ComposeResult -from textual.containers import Horizontal from textual.widgets import Button, Input diff --git a/docs/examples/guide/reactivity/validate01.py b/docs/examples/guide/reactivity/validate01.py index 65d8113c0..e6ac1a75f 100644 --- a/docs/examples/guide/reactivity/validate01.py +++ b/docs/examples/guide/reactivity/validate01.py @@ -30,7 +30,7 @@ class ValidateApp(App): self.count += 1 else: self.count -= 1 - self.query_one(RichLog).write(f"{self.count=}") + self.query_one(RichLog).write(f"count = {self.count}") if __name__ == "__main__": diff --git a/docs/examples/styles/padding_all.py b/docs/examples/styles/padding_all.py index c857c26c1..01f1ac6a7 100644 --- a/docs/examples/styles/padding_all.py +++ b/docs/examples/styles/padding_all.py @@ -1,5 +1,5 @@ from textual.app import App -from textual.containers import Container, Grid +from textual.containers import Grid from textual.widgets import Placeholder diff --git a/docs/examples/widgets/content_switcher.py b/docs/examples/widgets/content_switcher.py index 82cb43aac..8e235fe56 100644 --- a/docs/examples/widgets/content_switcher.py +++ b/docs/examples/widgets/content_switcher.py @@ -1,5 +1,3 @@ -from rich.align import VerticalCenter - from textual.app import App, ComposeResult from textual.containers import Horizontal, VerticalScroll from textual.widgets import Button, ContentSwitcher, DataTable, Markdown diff --git a/src/textual/_parser.py b/src/textual/_parser.py index a1a187da4..812e06388 100644 --- a/src/textual/_parser.py +++ b/src/textual/_parser.py @@ -165,8 +165,6 @@ if __name__ == "__main__": test_parser = TestParser() - import time - for n in range(0, len(data), 5): for token in test_parser.feed(data[n : n + 5]): print(token) diff --git a/src/textual/_types.py b/src/textual/_types.py index 669950c5a..b1ad7972f 100644 --- a/src/textual/_types.py +++ b/src/textual/_types.py @@ -1,12 +1,6 @@ from typing import TYPE_CHECKING, Any, Awaitable, Callable, List, Union -from typing_extensions import ( - Literal, - Protocol, - SupportsIndex, - get_args, - runtime_checkable, -) +from typing_extensions import Protocol if TYPE_CHECKING: from rich.segment import Segment diff --git a/src/textual/css/_style_properties.py b/src/textual/css/_style_properties.py index 9667e97c6..7ad26dbbf 100644 --- a/src/textual/css/_style_properties.py +++ b/src/textual/css/_style_properties.py @@ -47,7 +47,7 @@ from .transition import Transition if TYPE_CHECKING: from .._layout import Layout - from .styles import Styles, StylesBase + from .styles import StylesBase from .types import AlignHorizontal, AlignVertical, DockEdge, EdgeType diff --git a/src/textual/document/_document.py b/src/textual/document/_document.py index 6fa234191..783a829e9 100644 --- a/src/textual/document/_document.py +++ b/src/textual/document/_document.py @@ -5,12 +5,13 @@ from dataclasses import dataclass from functools import lru_cache from typing import TYPE_CHECKING, NamedTuple, Tuple, overload +from typing_extensions import Literal, get_args + if TYPE_CHECKING: from tree_sitter import Node from tree_sitter.binding import Query from textual._cells import cell_len -from textual._types import Literal, get_args from textual.geometry import Size Newline = Literal["\r\n", "\n", "\r"] diff --git a/src/textual/drivers/_input_reader_linux.py b/src/textual/drivers/_input_reader_linux.py index 82c032e0b..04604d820 100644 --- a/src/textual/drivers/_input_reader_linux.py +++ b/src/textual/drivers/_input_reader_linux.py @@ -4,8 +4,6 @@ import sys from threading import Event from typing import Iterator -from textual import log - class InputReader: """Read input from stdin.""" diff --git a/src/textual/drivers/linux_driver.py b/src/textual/drivers/linux_driver.py index c64f9dcdd..cfc0c5d09 100644 --- a/src/textual/drivers/linux_driver.py +++ b/src/textual/drivers/linux_driver.py @@ -14,7 +14,7 @@ from typing import TYPE_CHECKING, Any import rich.repr import rich.traceback -from .. import events, log +from .. import events from .._xterm_parser import XTermParser from ..driver import Driver from ..geometry import Size diff --git a/src/textual/message_pump.py b/src/textual/message_pump.py index 673d75079..33c80fa80 100644 --- a/src/textual/message_pump.py +++ b/src/textual/message_pump.py @@ -26,7 +26,6 @@ from ._context import message_hook as message_hook_context_var from ._context import prevent_message_types_stack from ._on import OnNoWidget from ._time import time -from ._types import CallbackType from .case import camel_to_snake from .css.match import match from .errors import DuplicateKeyHandlers diff --git a/src/textual/widgets/_tabs.py b/src/textual/widgets/_tabs.py index ab54de158..e8b8b8378 100644 --- a/src/textual/widgets/_tabs.py +++ b/src/textual/widgets/_tabs.py @@ -1,7 +1,6 @@ from __future__ import annotations import asyncio -from asyncio import create_task from dataclasses import dataclass from typing import ClassVar diff --git a/src/textual/widgets/_text_area.py b/src/textual/widgets/_text_area.py index 0fbcba4c3..20b30ff7a 100644 --- a/src/textual/widgets/_text_area.py +++ b/src/textual/widgets/_text_area.py @@ -9,6 +9,7 @@ from typing import TYPE_CHECKING, Any, Iterable, Optional, Tuple from rich.style import Style from rich.text import Text +from typing_extensions import Literal, Protocol, runtime_checkable from textual._text_area_theme import TextAreaTheme from textual._tree_sitter import TREE_SITTER @@ -30,11 +31,9 @@ from textual.expand_tabs import expand_tabs_inline if TYPE_CHECKING: from tree_sitter import Language - from tree_sitter.binding import Query from textual import events, log from textual._cells import cell_len -from textual._types import Literal, Protocol, runtime_checkable from textual.binding import Binding from textual.events import Message, MouseEvent from textual.geometry import Offset, Region, Size, Spacing, clamp diff --git a/tests/css/test_programmatic_style_changes.py b/tests/css/test_programmatic_style_changes.py index f15ecdd55..c81d88fa3 100644 --- a/tests/css/test_programmatic_style_changes.py +++ b/tests/css/test_programmatic_style_changes.py @@ -2,7 +2,6 @@ import pytest from textual.app import App from textual.containers import Grid -from textual.screen import Screen from textual.widgets import Label diff --git a/tests/css/test_stylesheet.py b/tests/css/test_stylesheet.py index abb1afe91..3d0113811 100644 --- a/tests/css/test_stylesheet.py +++ b/tests/css/test_stylesheet.py @@ -1,5 +1,4 @@ from contextlib import nullcontext as does_not_raise -from typing import Any import pytest diff --git a/tests/input/test_input_validation.py b/tests/input/test_input_validation.py index cfbdf3292..c260a4318 100644 --- a/tests/input/test_input_validation.py +++ b/tests/input/test_input_validation.py @@ -2,7 +2,6 @@ import pytest from textual import on from textual.app import App, ComposeResult -from textual.events import Blur from textual.validation import Number, ValidationResult from textual.widgets import Input diff --git a/tests/test_reactive.py b/tests/test_reactive.py index 9ab1af192..8ee7861a2 100644 --- a/tests/test_reactive.py +++ b/tests/test_reactive.py @@ -298,8 +298,6 @@ async def test_reactive_inheritance(): class Tertiary(Secondary): baz = reactive("baz") - from rich import print - primary = Primary() secondary = Secondary() tertiary = Tertiary() diff --git a/tests/test_screens.py b/tests/test_screens.py index 2163a715e..83fcde493 100644 --- a/tests/test_screens.py +++ b/tests/test_screens.py @@ -6,10 +6,10 @@ import pytest from textual import work from textual.app import App, ComposeResult, ScreenStackError -from textual.events import MouseMove, MouseScrollDown, MouseScrollUp +from textual.events import MouseMove from textual.geometry import Offset from textual.screen import Screen -from textual.widgets import Button, DataTable, Input, Label +from textual.widgets import Button, Input, Label from textual.worker import NoActiveWorker skip_py310 = pytest.mark.skipif( diff --git a/tests/test_style_inheritance.py b/tests/test_style_inheritance.py index b6e264c9d..72b631a94 100644 --- a/tests/test_style_inheritance.py +++ b/tests/test_style_inheritance.py @@ -1,5 +1,3 @@ -from rich.style import Style - from textual.app import App, ComposeResult from textual.widgets import Button, Static From d9594f5adc6a5d35398989baa8b579a5fc3a8bb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rodrigo=20Gir=C3=A3o=20Serr=C3=A3o?= <5621605+rodrigogiraoserrao@users.noreply.github.com> Date: Thu, 26 Oct 2023 12:20:19 +0100 Subject: [PATCH 4/4] Comment what the hooks do. --- .pre-commit-config.yaml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cf0a3df4f..536e8c63b 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -4,18 +4,18 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.3.0 hooks: - - id: check-ast - - id: check-builtin-literals - - id: check-case-conflict - - id: check-merge-conflict - - id: check-json - - id: check-toml - - id: check-yaml - args: [ '--unsafe' ] - - id: check-shebang-scripts-are-executable - - id: check-vcs-permalinks - - id: end-of-file-fixer - - id: mixed-line-ending + - id: check-ast # simply checks whether the files parse as valid python + - id: check-builtin-literals # requires literal syntax when initializing empty or zero python builtin types + - id: check-case-conflict # checks for files that would conflict in case-insensitive filesystems + - id: check-merge-conflict # checks for files that contain merge conflict strings + - id: check-json # checks json files for parseable syntax + - id: check-toml # checks toml files for parseable syntax + - id: check-yaml # checks yaml files for parseable syntax + args: [ '--unsafe' ] # Instead of loading the files, simply parse them for syntax. + - id: check-shebang-scripts-are-executable # ensures that (non-binary) files with a shebang are executable + - id: check-vcs-permalinks # ensures that links to vcs websites are permalinks + - id: end-of-file-fixer # ensures that a file is either empty, or ends with one newline + - id: mixed-line-ending # replaces or checks mixed line ending - repo: https://github.com/pycqa/isort rev: 5.12.0 hooks: @@ -27,7 +27,7 @@ repos: rev: 23.1.0 hooks: - id: black - - repo: https://github.com/hadialqattan/pycln + - repo: https://github.com/hadialqattan/pycln # removes unused imports rev: v2.3.0 hooks: - id: pycln