diff options
| author | Louis Burda <dev@sinitax.com> | 2026-02-28 18:54:19 +0100 |
|---|---|---|
| committer | Louis Burda <dev@sinitax.com> | 2026-02-28 18:54:19 +0100 |
| commit | be1dd21f8e4fbd5361531b4d8727a0d0d243e8ec (patch) | |
| tree | e7b540012e0510d1304d2dac8e137545ae103f75 /src | |
| parent | d70a199a72bf9a69eb4a3fcf166b0435918b2e33 (diff) | |
| download | selectui-main.tar.gz selectui-main.zip | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/selectui/__init__.py | 29 | ||||
| -rw-r--r-- | src/selectui/models.py | 6 |
2 files changed, 18 insertions, 17 deletions
diff --git a/src/selectui/__init__.py b/src/selectui/__init__.py index 4afdd56..182ecd1 100644 --- a/src/selectui/__init__.py +++ b/src/selectui/__init__.py @@ -4,24 +4,22 @@ Terminal UI for selecting items with search functionality. Built with Textual. """ -import sys -import os -import json import argparse -import asyncio -import subprocess +import json +import os import shlex -from typing import List, Dict, Any, Optional, IO, Union +import subprocess +import sys +from typing import Any, Dict, List, Optional, Union +from rich.cells import cell_len +from rich.markup import escape as rich_escape +from textual import events, work from textual.app import App, ComposeResult -from textual.containers import Container, Vertical, Horizontal, VerticalScroll -from textual.widgets import Input, Static from textual.binding import Binding +from textual.containers import Horizontal, VerticalScroll from textual.reactive import reactive -from textual import events, work -from rich.text import Text -from rich.cells import cell_len -from rich.markup import escape as rich_escape +from textual.widgets import Input, Static from thefuzz import fuzz from .models import SelectItem @@ -371,12 +369,12 @@ class SelectUI(App): if isinstance(items[0], SelectItem): # Convert SelectItem instances to dicts, preserving key mappings return [ - self._selectitem_to_dict(item, title_key, subtitle_key, info_key) + self._selectitem_to_dict(item, title_key, subtitle_key, info_key) # type: ignore[arg-type] for item in items ] else: # Already dicts, return as-is - return list(items) + return list(items) # type: ignore[arg-type] def _selectitem_to_dict( self, @@ -432,6 +430,7 @@ class SelectUI(App): def _start_stdin_reader(self) -> None: """Read JSON objects line-by-line from stdin in a background thread.""" try: + assert self.stdin_fd is not None # Type guard stdin_file = os.fdopen(self.stdin_fd, 'r') for line in stdin_file: line = line.strip() @@ -550,6 +549,7 @@ class SelectUI(App): self.call_from_thread(self._mark_command_running, True) # Build command (replace {} with shell-quoted input) + assert self.command_template is not None # Type guard cmd = self.command_template.replace("{}", shlex.quote(input_text)) try: @@ -560,6 +560,7 @@ class SelectUI(App): # Read output lines as JSONL or plain text items = [] + assert self._command_process.stdout is not None # Type guard for line in self._command_process.stdout: line = line.strip() if not line: diff --git a/src/selectui/models.py b/src/selectui/models.py index 100f2b9..ca4384e 100644 --- a/src/selectui/models.py +++ b/src/selectui/models.py @@ -1,5 +1,6 @@ from typing import Any, Dict, Optional -from pydantic import BaseModel, Field, field_validator + +from pydantic import BaseModel, ConfigDict, Field, field_validator class SelectItem(BaseModel): @@ -93,5 +94,4 @@ class SelectItem(BaseModel): data=data.copy() ) - class Config: - extra = "forbid" + model_config = ConfigDict(extra="forbid") |
