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

View File

@ -1,6 +1,6 @@
from enum import Enum from enum import Enum
from pathlib import Path from pathlib import Path
from typing import TYPE_CHECKING, Any, Optional from typing import TYPE_CHECKING, Any
import archinstall import archinstall
from archinstall import SysInfo, info, debug 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): if users := archinstall.arguments.get('!users', None):
installation.create_users(users) 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: if audio_config:
audio_config.install_audio_config(installation) audio_config.install_audio_config(installation)
else: else:

View File

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

View File

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

View File

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