Replace Optional with union syntax in scripts/ and tui/ (#2839)

This commit is contained in:
correctmost 2024-11-16 17:49:10 -05:00 committed by GitHub
parent 25172bd0f8
commit 6383b5e82f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 68 additions and 64 deletions

View File

@ -1,5 +1,5 @@
from pathlib import Path
from typing import Any, TYPE_CHECKING, Optional
from typing import Any, TYPE_CHECKING
import archinstall
from archinstall import info, debug
@ -100,7 +100,7 @@ def perform_installation(mountpoint: Path) -> None:
# If user selected to copy the current ISO network configuration
# Perform a copy of the config
network_config: Optional[NetworkConfiguration] = archinstall.arguments.get('network_config', None)
network_config: NetworkConfiguration | None = archinstall.arguments.get('network_config', None)
if network_config:
network_config.install_network_config(
@ -111,7 +111,7 @@ def perform_installation(mountpoint: Path) -> None:
if users := archinstall.arguments.get('!users', None):
installation.create_users(users)
audio_config: Optional[AudioConfiguration] = archinstall.arguments.get('audio_config', None)
audio_config: AudioConfiguration | None = archinstall.arguments.get('audio_config', None)
if audio_config:
audio_config.install_audio_config(installation)
else:

View File

@ -1,6 +1,6 @@
from enum import Enum
from pathlib import Path
from typing import TYPE_CHECKING, Any, Optional
from typing import TYPE_CHECKING, Any
import archinstall
from archinstall import SysInfo, info, debug
@ -184,7 +184,7 @@ def perform_installation(mountpoint: Path, exec_mode: ExecutionMode) -> None:
if users := archinstall.arguments.get('!users', None):
installation.create_users(users)
audio_config: Optional[AudioConfiguration] = archinstall.arguments.get('audio_config', None)
audio_config: AudioConfiguration | None = archinstall.arguments.get('audio_config', None)
if audio_config:
audio_config.install_audio_config(installation)
else:

View File

@ -1,3 +1,5 @@
from __future__ import annotations
import sys
import curses
import dataclasses
@ -9,7 +11,7 @@ from collections.abc import Callable
from curses.textpad import Textbox
from dataclasses import dataclass
from types import FrameType, TracebackType
from typing import Any, Optional, TYPE_CHECKING, Literal
from typing import Any, TYPE_CHECKING, Literal
from .help import Help
from .menu_item import MenuItem, MenuItemGroup
@ -93,7 +95,7 @@ class AbstractCurses(metaclass=ABCMeta):
def get_header_entries(
self,
header: Optional[str],
header: str | None,
offset: int = 0
) -> list[ViewportEntry]:
cur_row = 0
@ -125,7 +127,7 @@ class AbstractViewport:
max_width: int,
max_height: int,
frame: FrameProperties,
scroll_pct: Optional[int] = None
scroll_pct: int | None = None
) -> list[ViewportEntry]:
if not entries:
return []
@ -164,7 +166,7 @@ class AbstractViewport:
def _get_right_frame(
self,
dim: _FrameDim,
scroll_percentage: Optional[int] = None
scroll_percentage: int | None = None
) -> list[ViewportEntry]:
right_frame = {}
scroll_height = int(dim.height * scroll_percentage // 100) if scroll_percentage else 0
@ -189,7 +191,7 @@ class AbstractViewport:
dim: _FrameDim,
h_bar: str,
frame: FrameProperties,
scroll_percentage: Optional[int] = None
scroll_percentage: int | None = None
) -> ViewportEntry:
top = self._replace_str(h_bar, 1, f' {frame.header} ') if frame.header else h_bar
@ -204,7 +206,7 @@ class AbstractViewport:
self,
dim: _FrameDim,
h_bar: str,
scroll_pct: Optional[int] = None
scroll_pct: int | None = None
) -> ViewportEntry:
if scroll_pct is None:
bottom = Chars.Lower_left + h_bar + Chars.Lower_right
@ -293,7 +295,7 @@ class EditViewport(AbstractViewport):
edit_height: int,
x_start: int,
y_start: int,
process_key: Callable[[int], Optional[int]],
process_key: Callable[[int], int | None],
frame: FrameProperties,
alignment: Alignment = Alignment.CENTER,
hide_input: bool = False
@ -312,9 +314,9 @@ class EditViewport(AbstractViewport):
self._alignment = alignment
self._hide_input = hide_input
self._main_win: Optional['curses._CursesWindow'] = None
self._edit_win: Optional['curses._CursesWindow'] = None
self._textbox: Optional[Textbox] = None
self._main_win: 'curses._CursesWindow | None' = None
self._edit_win: 'curses._CursesWindow | None' = None
self._textbox: Textbox | None = None
self._init_wins()
@ -366,7 +368,7 @@ class EditViewport(AbstractViewport):
self._main_win.erase()
self._main_win.refresh()
def edit(self, default_text: Optional[str] = None) -> None:
def edit(self, default_text: str | None = None) -> None:
assert self._edit_win and self._main_win
self._edit_win.erase()
@ -387,8 +389,8 @@ class EditViewport(AbstractViewport):
class ViewportState:
cur_pos: int
displayed_entries: list[ViewportEntry]
scroll_pct: Optional[int]
scroll_pos: Optional[int] = 0
scroll_pct: int | None
scroll_pos: int | None = 0
def offset(self) -> int:
return min([entry.row for entry in self.displayed_entries], default=0)
@ -409,7 +411,7 @@ class Viewport(AbstractViewport):
x_start: int,
y_start: int,
enable_scroll: bool = False,
frame: Optional[FrameProperties] = None,
frame: FrameProperties | None = None,
alignment: Alignment = Alignment.LEFT
):
super().__init__()
@ -426,7 +428,7 @@ class Viewport(AbstractViewport):
self._main_win.nodelay(False)
self._main_win.standout()
self._state: Optional[ViewportState] = None
self._state: ViewportState | None = None
def getch(self) -> int:
return self._main_win.getch()
@ -439,7 +441,7 @@ class Viewport(AbstractViewport):
self,
lines: list[ViewportEntry],
cur_pos: int = 0,
scroll_pos: Optional[int] = None
scroll_pos: int | None = None
) -> None:
self._state = self._get_viewport_state(lines, cur_pos, scroll_pos)
visible_entries = self._adjust_entries_row(self._state.displayed_entries)
@ -478,7 +480,7 @@ class Viewport(AbstractViewport):
self, total: int,
available_rows: int,
scroll_pos: int
) -> Optional[int]:
) -> int | None:
if total <= available_rows:
return None
@ -493,7 +495,7 @@ class Viewport(AbstractViewport):
self,
entries: list[ViewportEntry],
cur_pos: int,
scroll_pos: Optional[int] = 0
scroll_pos: int | None = 0
) -> ViewportState:
if not entries:
return ViewportState(cur_pos, [], 0)
@ -539,7 +541,7 @@ class Viewport(AbstractViewport):
entries: list[ViewportEntry],
cur_pos: int,
screen_rows: int,
scroll_pos: Optional[int],
scroll_pos: int | None,
total_rows: int
) -> list[ViewportEntry]:
if scroll_pos is not None:
@ -595,13 +597,13 @@ class EditMenu(AbstractCurses):
self,
title: str,
edit_width: int = 50,
header: Optional[str] = None,
validator: Optional[Callable[[str], Optional[str]]] = None,
header: str | None = None,
validator: Callable[[str], str | None] | None = None,
allow_skip: bool = False,
allow_reset: bool = False,
reset_warning_msg: Optional[str] = None,
reset_warning_msg: str | None = None,
alignment: Alignment = Alignment.CENTER,
default_text: Optional[str] = None,
default_text: str | None = None,
hide_input: bool = False
):
super().__init__()
@ -625,14 +627,14 @@ class EditMenu(AbstractCurses):
title = f'* {title}' if not self._allow_skip else title
self._frame = FrameProperties(title, FrameStyle.MAX)
self._help_vp: Optional[Viewport] = None
self._header_vp: Optional[Viewport] = None
self._input_vp: Optional[EditViewport] = None
self._error_vp: Optional[Viewport] = None
self._help_vp: Viewport | None = None
self._header_vp: Viewport | None = None
self._input_vp: EditViewport | None = None
self._error_vp: Viewport | None = None
self._init_viewports()
self._last_state: Optional[Result] = None
self._last_state: Result | None = None
self._help_active = False
self._real_input = ""
@ -683,7 +685,7 @@ class EditMenu(AbstractCurses):
if self._error_vp:
self._error_vp.erase()
def _get_input_text(self) -> Optional[str]:
def _get_input_text(self) -> str | None:
assert self._input_vp
assert self._error_vp
@ -737,7 +739,7 @@ class EditMenu(AbstractCurses):
return self._last_state
def _process_edit_key(self, key: int) -> Optional[int]:
def _process_edit_key(self, key: int) -> int | None:
key_handles = MenuKeys.from_ord(key)
if self._help_active:
@ -812,10 +814,10 @@ class SelectMenu(AbstractCurses):
search_enabled: bool = True,
allow_skip: bool = False,
allow_reset: bool = False,
reset_warning_msg: Optional[str] = None,
reset_warning_msg: str | None = None,
preview_style: PreviewStyle = PreviewStyle.NONE,
preview_size: float | Literal['auto'] = 0.2,
preview_frame: Optional[FrameProperties] = None,
preview_frame: FrameProperties | None = None,
):
super().__init__()
@ -850,16 +852,16 @@ class SelectMenu(AbstractCurses):
self._row_entries: list[list[MenuCell]] = []
self._prev_scroll_pos: int = 0
self._cur_pos: Optional[int] = None
self._cur_pos: int | None = None
self._visible_entries: list[ViewportEntry] = []
self._max_height, self._max_width = Tui.t().max_yx
self._help_vp: Optional[Viewport] = None
self._header_vp: Optional[Viewport] = None
self._footer_vp: Optional[Viewport] = None
self._menu_vp: Optional[Viewport] = None
self._preview_vp: Optional[Viewport] = None
self._help_vp: Viewport | None = None
self._header_vp: Viewport | None = None
self._footer_vp: Viewport | None = None
self._menu_vp: Viewport | None = None
self._preview_vp: Viewport | None = None
self._init_viewports(preview_size)
@ -1218,7 +1220,7 @@ class SelectMenu(AbstractCurses):
return True
def _process_input_key(self, key: int) -> Optional[Result]:
def _process_input_key(self, key: int) -> Result | None:
key_handles = MenuKeys.from_ord(key)
if self._help_active:
@ -1356,7 +1358,7 @@ class SelectMenu(AbstractCurses):
class Tui:
_t: Optional['Tui'] = None
_t: Tui | None = None
def __enter__(self) -> None:
if Tui._t is None:
@ -1424,7 +1426,7 @@ class Tui:
text: str,
row: int = 0,
col: int = 0,
endl: Optional[str] = '\n',
endl: str | None = '\n',
clear_screen: bool = False
) -> None:
if Tui._t is None:

View File

@ -1,6 +1,8 @@
from __future__ import annotations
from collections.abc import Callable
from dataclasses import dataclass, field
from typing import Any, Optional, TYPE_CHECKING
from typing import Any, TYPE_CHECKING
from typing import ClassVar
from ..lib.output import unicode_ljust
@ -12,18 +14,18 @@ if TYPE_CHECKING:
@dataclass
class MenuItem:
text: str
value: Optional[Any] = None
action: Optional[Callable[[Any], Any]] = None
value: Any | None = None
action: Callable[[Any], Any] | None = None
enabled: bool = True
mandatory: bool = False
dependencies: list[str | Callable[[], bool]] = field(default_factory=list)
dependencies_not: list[str] = field(default_factory=list)
display_action: Optional[Callable[[Any], str]] = None
preview_action: Optional[Callable[[Any], Optional[str]]] = None
key: Optional[str] = None
display_action: Callable[[Any], str] | None = None
preview_action: Callable[[Any], str | None] | None = None
key: str | None = None
_yes: ClassVar[Optional['MenuItem']] = None
_no: ClassVar[Optional['MenuItem']] = None
_yes: ClassVar[MenuItem | None] = None
_no: ClassVar[MenuItem | None] = None
def get_value(self) -> Any:
assert self.value is not None
@ -56,7 +58,7 @@ class MenuItem:
else:
return True
def get_display_value(self) -> Optional[str]:
def get_display_value(self) -> str | None:
if self.display_action is not None:
return self.display_action(self.value)
@ -66,8 +68,8 @@ class MenuItem:
@dataclass
class MenuItemGroup:
menu_items: list[MenuItem]
focus_item: Optional[MenuItem] = None
default_item: Optional[MenuItem] = None
focus_item: MenuItem | None = None
default_item: MenuItem | None = None
selected_items: list[MenuItem] = field(default_factory=list)
sort_items: bool = False
checkmarks: bool = False
@ -104,7 +106,7 @@ class MenuItemGroup:
sort_items=True
)
def set_preview_for_all(self, action: Callable[[Any], Optional[str]]) -> None:
def set_preview_for_all(self, action: Callable[[Any], str | None]) -> None:
for item in self.items:
item.preview_action = action
@ -120,7 +122,7 @@ class MenuItemGroup:
self.default_item = item
break
def set_selected_by_value(self, values: Optional[Any | list[Any]]) -> None:
def set_selected_by_value(self, values: Any | list[Any] | None) -> None:
if values is None:
return
@ -247,7 +249,7 @@ class MenuItemGroup:
else:
return item == self.focus_item
def _first(self, items: list[MenuItem], ignore_empty: bool) -> Optional[MenuItem]:
def _first(self, items: list[MenuItem], ignore_empty: bool) -> MenuItem | None:
for item in items:
if not ignore_empty:
return item
@ -257,10 +259,10 @@ class MenuItemGroup:
return None
def get_first_item(self, ignore_empty: bool = True) -> Optional[MenuItem]:
def get_first_item(self, ignore_empty: bool = True) -> MenuItem | None:
return self._first(self.items, ignore_empty)
def get_last_item(self, ignore_empty: bool = True) -> Optional[MenuItem]:
def get_last_item(self, ignore_empty: bool = True) -> MenuItem | None:
items = self.items
rev_items = list(reversed(items))
return self._first(rev_items, ignore_empty)

View File

@ -1,7 +1,7 @@
import curses
from dataclasses import dataclass
from enum import Enum, auto
from typing import Optional, Any
from typing import Any
from .menu_item import MenuItem
@ -139,7 +139,7 @@ class Chars:
@dataclass
class Result:
type_: ResultType
_item: Optional[MenuItem | list[MenuItem] | str]
_item: MenuItem | list[MenuItem] | str | None
def has_item(self) -> bool:
return self._item is not None