Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
9 changes: 2 additions & 7 deletions src/panel_live_server/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down
3 changes: 1 addition & 2 deletions src/panel_live_server/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
3 changes: 1 addition & 2 deletions src/panel_live_server/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down
3 changes: 1 addition & 2 deletions src/panel_live_server/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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")

Expand Down
22 changes: 5 additions & 17 deletions src/panel_live_server/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down
15 changes: 4 additions & 11 deletions src/panel_live_server/endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down
3 changes: 1 addition & 2 deletions src/panel_live_server/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
10 changes: 3 additions & 7 deletions src/panel_live_server/pages/view_page.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down
3 changes: 1 addition & 2 deletions src/panel_live_server/prompts.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)
Expand Down
3 changes: 1 addition & 2 deletions src/panel_live_server/screenshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
28 changes: 8 additions & 20 deletions src/panel_live_server/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)

Expand Down
3 changes: 1 addition & 2 deletions src/panel_live_server/usage.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__)
Expand Down
7 changes: 1 addition & 6 deletions tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = {
Expand Down
3 changes: 1 addition & 2 deletions tests/test_database.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
3 changes: 1 addition & 2 deletions tests/test_diagnostics.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
5 changes: 1 addition & 4 deletions tests/test_endpoints.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
42 changes: 22 additions & 20 deletions tests/test_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
3 changes: 1 addition & 2 deletions tests/test_manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 1 addition & 4 deletions tests/test_prompts.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
9 changes: 1 addition & 8 deletions tests/test_screenshot.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"]

Expand Down
6 changes: 2 additions & 4 deletions tests/test_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading
Loading