aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLouis Burda <dev@sinitax.com>2026-02-28 18:54:19 +0100
committerLouis Burda <dev@sinitax.com>2026-02-28 18:54:19 +0100
commitbe1dd21f8e4fbd5361531b4d8727a0d0d243e8ec (patch)
treee7b540012e0510d1304d2dac8e137545ae103f75 /src
parentd70a199a72bf9a69eb4a3fcf166b0435918b2e33 (diff)
downloadselectui-main.tar.gz
selectui-main.zip
Add tests and justfileHEADmain
Diffstat (limited to 'src')
-rw-r--r--src/selectui/__init__.py29
-rw-r--r--src/selectui/models.py6
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")