diff --git a/pyproject.toml b/pyproject.toml index b09d400..91ac496 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -163,11 +163,9 @@ convention = "numpy" "tests/**" = ["D"] # Ignore all files that end in `_test.py`. "*_test.py" = ["D"] -# Allow grouped imports here: cli.py pulls 20+ names from panel_live_server.install alone. -"src/panel_live_server/cli.py" = ["I001"] [tool.ruff.lint.isort] -force-single-line = true +force-single-line = false [tool.pytest.ini_options] addopts = "--pyargs --doctest-ignore-import-errors --color=yes" diff --git a/src/panel_live_server/app.py b/src/panel_live_server/app.py index b03804f..0858ddb 100644 --- a/src/panel_live_server/app.py +++ b/src/panel_live_server/app.py @@ -7,14 +7,9 @@ import logging from urllib.parse import urlparse -from panel_live_server.config import get_config -from panel_live_server.config import reset_config +from panel_live_server.config import get_config, reset_config from panel_live_server.database import get_db -from panel_live_server.endpoints import EvaluateEndpoint -from panel_live_server.endpoints import HealthEndpoint -from panel_live_server.endpoints import ScreenshotEndpoint -from panel_live_server.endpoints import SnippetEditEndpoint -from panel_live_server.endpoints import SnippetEndpoint +from panel_live_server.endpoints import EvaluateEndpoint, HealthEndpoint, ScreenshotEndpoint, SnippetEditEndpoint, SnippetEndpoint logger = logging.getLogger(__name__) diff --git a/src/panel_live_server/cli.py b/src/panel_live_server/cli.py index c9fe091..e2e3c3c 100644 --- a/src/panel_live_server/cli.py +++ b/src/panel_live_server/cli.py @@ -22,8 +22,7 @@ import typer from panel_live_server import __version__ -from panel_live_server.config import default_panel_port -from panel_live_server.config import reset_config +from panel_live_server.config import default_panel_port, reset_config from panel_live_server.install import ( SERVER_NAME, InstallError, diff --git a/src/panel_live_server/client.py b/src/panel_live_server/client.py index 3e19069..87c81d8 100644 --- a/src/panel_live_server/client.py +++ b/src/panel_live_server/client.py @@ -11,8 +11,7 @@ import requests # type: ignore[import-untyped] -from panel_live_server import diagnostics -from panel_live_server import screenshot +from panel_live_server import diagnostics, screenshot logger = logging.getLogger(__name__) diff --git a/src/panel_live_server/config.py b/src/panel_live_server/config.py index 98214de..7a004ee 100644 --- a/src/panel_live_server/config.py +++ b/src/panel_live_server/config.py @@ -6,8 +6,7 @@ import sys from pathlib import Path -from pydantic import BaseModel -from pydantic import Field +from pydantic import BaseModel, Field logger = logging.getLogger("panel_live_server") diff --git a/src/panel_live_server/database.py b/src/panel_live_server/database.py index 640e410..2e4643e 100644 --- a/src/panel_live_server/database.py +++ b/src/panel_live_server/database.py @@ -11,27 +11,15 @@ import sqlite3 import uuid from contextlib import contextmanager -from datetime import datetime -from datetime import timedelta -from datetime import timezone +from datetime import datetime, timedelta, timezone from pathlib import Path -from typing import Generator -from typing import Literal -from typing import Optional +from typing import Generator, Literal, Optional -from pydantic import BaseModel -from pydantic import Field -from pydantic import field_validator +from pydantic import BaseModel, Field, field_validator from panel_live_server.config import get_config -from panel_live_server.utils import find_extensions -from panel_live_server.utils import find_requirements -from panel_live_server.utils import validate_code -from panel_live_server.utils import validate_extension_availability -from panel_live_server.validation import ast_check -from panel_live_server.validation import check_packages -from panel_live_server.validation import ruff_check -from panel_live_server.validation import ruff_format +from panel_live_server.utils import find_extensions, find_requirements, validate_code, validate_extension_availability +from panel_live_server.validation import ast_check, check_packages, ruff_check, ruff_format logger = logging.getLogger(__name__) diff --git a/src/panel_live_server/endpoints.py b/src/panel_live_server/endpoints.py index e9d617d..156cb73 100644 --- a/src/panel_live_server/endpoints.py +++ b/src/panel_live_server/endpoints.py @@ -11,22 +11,15 @@ import logging import sys import traceback -from datetime import datetime -from datetime import timezone +from datetime import datetime, timezone from tornado.web import RequestHandler -from panel_live_server import diagnostics -from panel_live_server import screenshot -from panel_live_server import usage +from panel_live_server import diagnostics, screenshot, usage from panel_live_server.config import get_config from panel_live_server.database import get_db -from panel_live_server.utils import execute_in_module -from panel_live_server.utils import extract_last_expression -from panel_live_server.utils import validate_code -from panel_live_server.validation import SecurityError -from panel_live_server.validation import ast_check -from panel_live_server.validation import ruff_format +from panel_live_server.utils import execute_in_module, extract_last_expression, validate_code +from panel_live_server.validation import SecurityError, ast_check, ruff_format logger = logging.getLogger(__name__) diff --git a/src/panel_live_server/install.py b/src/panel_live_server/install.py index 1f3147f..163516f 100644 --- a/src/panel_live_server/install.py +++ b/src/panel_live_server/install.py @@ -9,8 +9,7 @@ import tomlkit from tomlkit.exceptions import TOMLKitError -from tomlkit.items import AoT -from tomlkit.items import Table +from tomlkit.items import AoT, Table SERVER_NAME = "panel-live-server" diff --git a/src/panel_live_server/pages/view_page.py b/src/panel_live_server/pages/view_page.py index 3fbc96c..02b13e3 100644 --- a/src/panel_live_server/pages/view_page.py +++ b/src/panel_live_server/pages/view_page.py @@ -9,19 +9,15 @@ import logging import sys import traceback -from datetime import datetime -from datetime import timezone +from datetime import datetime, timezone import panel as pn from bokeh.events import DocumentReady from bokeh.models import CustomJS from panel_live_server import diagnostics -from panel_live_server.database import Snippet -from panel_live_server.database import get_db -from panel_live_server.utils import execute_in_module -from panel_live_server.utils import extract_last_expression -from panel_live_server.utils import find_extensions +from panel_live_server.database import Snippet, get_db +from panel_live_server.utils import execute_in_module, extract_last_expression, find_extensions logger = logging.getLogger(__name__) diff --git a/src/panel_live_server/prompts.py b/src/panel_live_server/prompts.py index 10ff65b..e703337 100644 --- a/src/panel_live_server/prompts.py +++ b/src/panel_live_server/prompts.py @@ -36,8 +36,7 @@ import sys from pathlib import Path -from jinja2 import FileSystemLoader -from jinja2 import nodes +from jinja2 import FileSystemLoader, nodes from jinja2.sandbox import SandboxedEnvironment logger = logging.getLogger(__name__) diff --git a/src/panel_live_server/screenshot.py b/src/panel_live_server/screenshot.py index 25a815a..96429ff 100644 --- a/src/panel_live_server/screenshot.py +++ b/src/panel_live_server/screenshot.py @@ -43,8 +43,7 @@ import os import subprocess import sys -from dataclasses import dataclass -from dataclasses import field +from dataclasses import dataclass, field from panel_live_server.config import get_config diff --git a/src/panel_live_server/server.py b/src/panel_live_server/server.py index e286c42..634fd60 100644 --- a/src/panel_live_server/server.py +++ b/src/panel_live_server/server.py @@ -13,36 +13,24 @@ import sys from contextlib import asynccontextmanager from pathlib import Path -from typing import Any -from typing import Literal +from typing import Any, Literal from urllib.parse import urlparse -from fastmcp import Context -from fastmcp import FastMCP +from fastmcp import Context, FastMCP from fastmcp.exceptions import ToolError -from fastmcp.server.apps import AppConfig -from fastmcp.server.apps import ResourceCSP +from fastmcp.server.apps import AppConfig, ResourceCSP from fastmcp.tools.tool import ToolResult from fastmcp.utilities.types import Image from mcp.types import TextContent from panel_live_server import diagnostics -from panel_live_server.client import BROWSER_UNAVAILABLE_PREFIX -from panel_live_server.client import DisplayClient +from panel_live_server.client import BROWSER_UNAVAILABLE_PREFIX, DisplayClient from panel_live_server.config import get_config from panel_live_server.manager import PanelServerManager -from panel_live_server.prompts import SCREENSHOT -from panel_live_server.prompts import render_instructions -from panel_live_server.prompts import render_prompt -from panel_live_server.screenshot import Capture -from panel_live_server.screenshot import is_browser_installed -from panel_live_server.utils import ExtensionError -from panel_live_server.utils import validate_extension_availability -from panel_live_server.validation import SecurityError -from panel_live_server.validation import ValidationError -from panel_live_server.validation import ast_check -from panel_live_server.validation import check_packages -from panel_live_server.validation import ruff_check +from panel_live_server.prompts import SCREENSHOT, render_instructions, render_prompt +from panel_live_server.screenshot import Capture, is_browser_installed +from panel_live_server.utils import ExtensionError, validate_extension_availability +from panel_live_server.validation import SecurityError, ValidationError, ast_check, check_packages, ruff_check logger = logging.getLogger(__name__) diff --git a/src/panel_live_server/usage.py b/src/panel_live_server/usage.py index 8919edb..1306ca6 100644 --- a/src/panel_live_server/usage.py +++ b/src/panel_live_server/usage.py @@ -27,8 +27,7 @@ import logging from collections import defaultdict -from datetime import datetime -from datetime import timezone +from datetime import datetime, timezone from threading import Lock logger = logging.getLogger(__name__) diff --git a/tests/test_config.py b/tests/test_config.py index 53aed97..134ad0c 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -5,12 +5,7 @@ import pytest -from panel_live_server.config import _PORT_BASE -from panel_live_server.config import _PORT_SPAN -from panel_live_server.config import _resolve_external_url -from panel_live_server.config import default_panel_port -from panel_live_server.config import get_config -from panel_live_server.config import reset_config +from panel_live_server.config import _PORT_BASE, _PORT_SPAN, _resolve_external_url, default_panel_port, get_config, reset_config # Env vars that must be absent by default to keep tests isolated _CLEAR_VARS = { diff --git a/tests/test_database.py b/tests/test_database.py index 55cc83f..d620423 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -5,8 +5,7 @@ import pytest -from panel_live_server.database import Snippet -from panel_live_server.database import SnippetDatabase +from panel_live_server.database import Snippet, SnippetDatabase from panel_live_server.utils import ExtensionError diff --git a/tests/test_diagnostics.py b/tests/test_diagnostics.py index 193314f..a14dd06 100644 --- a/tests/test_diagnostics.py +++ b/tests/test_diagnostics.py @@ -3,8 +3,7 @@ import sys from panel_live_server import diagnostics -from panel_live_server.config import get_config -from panel_live_server.config import reset_config +from panel_live_server.config import get_config, reset_config class TestRecordAndPop: diff --git a/tests/test_endpoints.py b/tests/test_endpoints.py index 84fce63..a6552ce 100644 --- a/tests/test_endpoints.py +++ b/tests/test_endpoints.py @@ -13,10 +13,7 @@ import panel_live_server.screenshot as screenshot_module from panel_live_server import usage from panel_live_server.database import SnippetDatabase -from panel_live_server.endpoints import HealthEndpoint -from panel_live_server.endpoints import ScreenshotEndpoint -from panel_live_server.endpoints import SnippetEditEndpoint -from panel_live_server.endpoints import SnippetEndpoint +from panel_live_server.endpoints import HealthEndpoint, ScreenshotEndpoint, SnippetEditEndpoint, SnippetEndpoint from panel_live_server.validation import SecurityError diff --git a/tests/test_install.py b/tests/test_install.py index e523773..42164b1 100644 --- a/tests/test_install.py +++ b/tests/test_install.py @@ -8,26 +8,28 @@ import pytest -from panel_live_server.install import InstallError -from panel_live_server.install import antigravity_config_path -from panel_live_server.install import claude_desktop_config_path -from panel_live_server.install import cline_config_path -from panel_live_server.install import codex_config_path -from panel_live_server.install import copilot_config_path -from panel_live_server.install import cursor_config_path -from panel_live_server.install import gemini_cli_config_path -from panel_live_server.install import jetbrains_config_path -from panel_live_server.install import kilo_code_config_path -from panel_live_server.install import kiro_config_path -from panel_live_server.install import merge_codex_server -from panel_live_server.install import merge_kilo_code_server -from panel_live_server.install import merge_mcp_server -from panel_live_server.install import merge_mistral_vibe_server -from panel_live_server.install import mistral_vibe_config_path -from panel_live_server.install import register_with_claude_code -from panel_live_server.install import resolve_pls_command -from panel_live_server.install import vscode_config_path -from panel_live_server.install import windsurf_config_path +from panel_live_server.install import ( + InstallError, + antigravity_config_path, + claude_desktop_config_path, + cline_config_path, + codex_config_path, + copilot_config_path, + cursor_config_path, + gemini_cli_config_path, + jetbrains_config_path, + kilo_code_config_path, + kiro_config_path, + merge_codex_server, + merge_kilo_code_server, + merge_mcp_server, + merge_mistral_vibe_server, + mistral_vibe_config_path, + register_with_claude_code, + resolve_pls_command, + vscode_config_path, + windsurf_config_path, +) class TestMergeMcpServer: diff --git a/tests/test_manager.py b/tests/test_manager.py index dd202f3..3740dac 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -7,8 +7,7 @@ import pytest import panel_live_server.manager as manager_module -from panel_live_server.manager import PanelServerManager -from panel_live_server.manager import _force_kill_pid +from panel_live_server.manager import PanelServerManager, _force_kill_pid # --------------------------------------------------------------------------- # Shared fake-psutil helpers diff --git a/tests/test_prompts.py b/tests/test_prompts.py index 8a4b168..490bcfb 100644 --- a/tests/test_prompts.py +++ b/tests/test_prompts.py @@ -5,10 +5,7 @@ import pytest from panel_live_server import prompts -from panel_live_server.prompts import SCREENSHOT -from panel_live_server.prompts import known_sections -from panel_live_server.prompts import render_instructions -from panel_live_server.prompts import render_prompt +from panel_live_server.prompts import SCREENSHOT, known_sections, render_instructions, render_prompt _PROMPTS_FILE_ENV = "PANEL_LIVE_SERVER_PROMPTS_FILE" diff --git a/tests/test_screenshot.py b/tests/test_screenshot.py index 7e5f26d..2befb5c 100644 --- a/tests/test_screenshot.py +++ b/tests/test_screenshot.py @@ -11,14 +11,7 @@ import pytest -from panel_live_server.screenshot import _MAX_META_BYTES -from panel_live_server.screenshot import ActionError -from panel_live_server.screenshot import Capture -from panel_live_server.screenshot import apply_meta -from panel_live_server.screenshot import check_actions -from panel_live_server.screenshot import decode_meta -from panel_live_server.screenshot import encode_meta -from panel_live_server.screenshot import tile_label +from panel_live_server.screenshot import _MAX_META_BYTES, ActionError, Capture, apply_meta, check_actions, decode_meta, encode_meta, tile_label CONTROLS = ["Overview", "Sales", "Costs"] diff --git a/tests/test_server.py b/tests/test_server.py index 26a351b..1d5b11e 100644 --- a/tests/test_server.py +++ b/tests/test_server.py @@ -11,12 +11,10 @@ import panel_live_server.server as server_module from panel_live_server.cli import app from panel_live_server.client import BROWSER_UNAVAILABLE_PREFIX -from panel_live_server.config import get_config -from panel_live_server.config import reset_config +from panel_live_server.config import get_config, reset_config from panel_live_server.screenshot import Capture from panel_live_server.server import mcp -from panel_live_server.validation import SecurityError -from panel_live_server.validation import ValidationError +from panel_live_server.validation import SecurityError, ValidationError @pytest.mark.asyncio diff --git a/tests/test_utils.py b/tests/test_utils.py index 3df8d38..01008c6 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -12,15 +12,17 @@ from panel.io.state import state import panel_live_server.utils as utils_module -from panel_live_server.utils import ExtensionError -from panel_live_server.utils import _run_execution -from panel_live_server.utils import execute_in_module -from panel_live_server.utils import extract_last_expression -from panel_live_server.utils import find_extensions -from panel_live_server.utils import find_requirements -from panel_live_server.utils import prepend_env_dll_paths -from panel_live_server.utils import validate_code -from panel_live_server.utils import validate_extension_availability +from panel_live_server.utils import ( + ExtensionError, + _run_execution, + execute_in_module, + extract_last_expression, + find_extensions, + find_requirements, + prepend_env_dll_paths, + validate_code, + validate_extension_availability, +) class TestPrependEnvDllPaths: diff --git a/tests/test_validation.py b/tests/test_validation.py index 66cf7c4..e527fd1 100644 --- a/tests/test_validation.py +++ b/tests/test_validation.py @@ -2,11 +2,7 @@ import pytest -from panel_live_server.validation import SecurityError -from panel_live_server.validation import ast_check -from panel_live_server.validation import check_packages -from panel_live_server.validation import ruff_check -from panel_live_server.validation import ruff_format +from panel_live_server.validation import SecurityError, ast_check, check_packages, ruff_check, ruff_format # --------------------------------------------------------------------------- # Layer 1: ast_check diff --git a/tests/test_view_page.py b/tests/test_view_page.py index ff8f464..36f497c 100644 --- a/tests/test_view_page.py +++ b/tests/test_view_page.py @@ -2,15 +2,12 @@ import tempfile from pathlib import Path -from unittest.mock import MagicMock -from unittest.mock import patch +from unittest.mock import MagicMock, patch import pytest -from panel_live_server.database import Snippet -from panel_live_server.database import SnippetDatabase -from panel_live_server.pages.view_page import _execute_code -from panel_live_server.pages.view_page import create_view +from panel_live_server.database import Snippet, SnippetDatabase +from panel_live_server.pages.view_page import _execute_code, create_view def _make_snippet(app: str, method: str = "inline") -> Snippet: