Replace more Optional instances with union syntax in lib/ (#2841)

This commit is contained in:
correctmost 2024-11-16 19:01:57 -05:00 committed by GitHub
parent 57e4362a49
commit 0dc77f8e8a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 135 additions and 137 deletions

View File

@ -1,4 +1,4 @@
from typing import Optional, TYPE_CHECKING
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from .general import SysCommandWorker
@ -17,7 +17,7 @@ class UnknownFilesystemFormat(Exception):
class SysCallError(Exception):
def __init__(self, message: str, exit_code: Optional[int] = None, worker: Optional['SysCommandWorker'] = None) -> None:
def __init__(self, message: str, exit_code: int | None = None, worker: 'SysCommandWorker | None' = None) -> None:
super().__init__(message)
self.message = message
self.exit_code = exit_code

View File

@ -17,7 +17,7 @@ import pathlib
from collections.abc import Callable, Iterator
from datetime import datetime, date
from enum import Enum
from typing import Optional, Any, Union, TYPE_CHECKING
from typing import Any, Union, TYPE_CHECKING
from select import epoll, EPOLLIN, EPOLLHUP
from shutil import which
@ -104,11 +104,11 @@ class SysCommandWorker:
def __init__(
self,
cmd: Union[str, list[str]],
callbacks: Optional[dict[str, Any]] = None,
peek_output: Optional[bool] = False,
environment_vars: Optional[dict[str, Any]] = None,
logfile: Optional[None] = None,
working_directory: Optional[str] = './',
callbacks: dict[str, Any] | None = None,
peek_output: bool | None = False,
environment_vars: dict[str, Any] | None = None,
logfile: None = None,
working_directory: str | None = './',
remove_vt100_escape_codes_from_lines: bool = True
):
callbacks = callbacks or {}
@ -129,13 +129,13 @@ class SysCommandWorker:
self.logfile = logfile
self.working_directory = working_directory
self.exit_code: Optional[int] = None
self.exit_code: int | None = None
self._trace_log = b''
self._trace_log_pos = 0
self.poll_object = epoll()
self.child_fd: Optional[int] = None
self.started: Optional[float] = None
self.ended: Optional[float] = None
self.child_fd: int | None = None
self.started: float | None = None
self.ended: float | None = None
self.remove_vt100_escape_codes_from_lines: bool = remove_vt100_escape_codes_from_lines
def __contains__(self, key: bytes) -> bool:
@ -349,10 +349,10 @@ class SysCommand:
self,
cmd: Union[str, list[str]],
callbacks: dict[str, Callable[[Any], Any]] = {},
start_callback: Optional[Callable[[Any], Any]] = None,
peek_output: Optional[bool] = False,
environment_vars: Optional[dict[str, Any]] = None,
working_directory: Optional[str] = './',
start_callback: Callable[[Any], Any] | None = None,
peek_output: bool | None = False,
environment_vars: dict[str, Any] | None = None,
working_directory: str | None = './',
remove_vt100_escape_codes_from_lines: bool = True):
self._callbacks = callbacks.copy()
@ -365,10 +365,10 @@ class SysCommand:
self.working_directory = working_directory
self.remove_vt100_escape_codes_from_lines = remove_vt100_escape_codes_from_lines
self.session: Optional[SysCommandWorker] = None
self.session: SysCommandWorker | None = None
self.create_session()
def __enter__(self) -> Optional[SysCommandWorker]:
def __enter__(self) -> SysCommandWorker | None:
return self.session
def __exit__(self, *args: str, **kwargs: dict[str, Any]) -> None:
@ -383,7 +383,7 @@ class SysCommand:
for line in self.session:
yield line
def __getitem__(self, key: slice) -> Optional[bytes]:
def __getitem__(self, key: slice) -> bytes | None:
if not self.session:
raise KeyError("SysCommand() does not have an active session.")
elif type(key) is slice:
@ -397,7 +397,7 @@ class SysCommand:
def __repr__(self, *args: list[Any], **kwargs: dict[str, Any]) -> str:
return self.decode('UTF-8', errors='backslashreplace') or ''
def __json__(self) -> dict[str, Union[str, bool, list[str], dict[str, Any], Optional[bool], Optional[dict[str, Any]]]]:
def __json__(self) -> dict[str, Union[str, bool, list[str], dict[str, Any], bool | None, dict[str, Any] | None]]:
return {
'cmd': self.cmd,
'callbacks': self._callbacks,
@ -454,14 +454,14 @@ class SysCommand:
return self.session._trace_log
@property
def exit_code(self) -> Optional[int]:
def exit_code(self) -> int | None:
if self.session:
return self.session.exit_code
else:
return None
@property
def trace_log(self) -> Optional[bytes]:
def trace_log(self) -> bytes | None:
if self.session:
return self.session._trace_log
return None
@ -496,7 +496,7 @@ def json_stream_to_structure(configuration_identifier: str, stream: str, target:
+configuration_identifier is just a parameter to get meaningful, but not so long messages
"""
raw: Optional[str] = None
raw: str | None = None
# Try using the stream as a URL that should be grabbed
if urllib.parse.urlparse(stream).scheme:
try:

View File

@ -1,6 +1,6 @@
from __future__ import annotations
from typing import Any, Optional, TYPE_CHECKING
from typing import Any, TYPE_CHECKING
from . import disk
from .general import secret
@ -275,8 +275,8 @@ class GlobalMenu(AbstractMenu):
if o.key is not None:
self._item_group.find_by_key(o.key).text = o.text
def _disk_encryption(self, preset: Optional[disk.DiskEncryption]) -> Optional[disk.DiskEncryption]:
disk_config: Optional[disk.DiskLayoutConfiguration] = self._item_group.find_by_key('disk_config').value
def _disk_encryption(self, preset: disk.DiskEncryption | None) -> disk.DiskEncryption | None:
disk_config: disk.DiskLayoutConfiguration | None = self._item_group.find_by_key('disk_config').value
if not disk_config:
# this should not happen as the encryption menu has the disk_config as dependency
@ -292,14 +292,14 @@ class GlobalMenu(AbstractMenu):
locale_config = LocaleMenu(preset).run()
return locale_config
def _prev_locale(self, item: MenuItem) -> Optional[str]:
def _prev_locale(self, item: MenuItem) -> str | None:
if not item.value:
return None
config: LocaleConfiguration = item.value
return config.preview()
def _prev_network_config(self, item: MenuItem) -> Optional[str]:
def _prev_network_config(self, item: MenuItem) -> str | None:
if item.value:
network_config: NetworkConfiguration = item.value
if network_config.type == NicType.MANUAL:
@ -310,31 +310,31 @@ class GlobalMenu(AbstractMenu):
return output
return None
def _prev_additional_pkgs(self, item: MenuItem) -> Optional[str]:
def _prev_additional_pkgs(self, item: MenuItem) -> str | None:
if item.value:
return format_cols(item.value, None)
return None
def _prev_additional_repos(self, item: MenuItem) -> Optional[str]:
def _prev_additional_repos(self, item: MenuItem) -> str | None:
if item.value:
repos = ', '.join(item.value)
return f'{_("Additional repositories")}: {repos}'
return None
def _prev_tz(self, item: MenuItem) -> Optional[str]:
def _prev_tz(self, item: MenuItem) -> str | None:
if item.value:
return f'{_("Timezone")}: {item.value}'
return None
def _prev_ntp(self, item: MenuItem) -> Optional[str]:
def _prev_ntp(self, item: MenuItem) -> str | None:
if item.value is not None:
output = f'{_("NTP")}: '
output += str(_('Enabled')) if item.value else str(_('Disabled'))
return output
return None
def _prev_disk_config(self, item: MenuItem) -> Optional[str]:
disk_layout_conf: Optional[disk.DiskLayoutConfiguration] = item.value
def _prev_disk_config(self, item: MenuItem) -> str | None:
disk_layout_conf: disk.DiskLayoutConfiguration | None = item.value
if disk_layout_conf:
output = str(_('Configuration type: {}')).format(disk_layout_conf.config_type.display_msg()) + '\n'
@ -349,55 +349,55 @@ class GlobalMenu(AbstractMenu):
return None
def _prev_swap(self, item: MenuItem) -> Optional[str]:
def _prev_swap(self, item: MenuItem) -> str | None:
if item.value is not None:
output = f'{_("Swap on zram")}: '
output += str(_('Enabled')) if item.value else str(_('Disabled'))
return output
return None
def _prev_uki(self, item: MenuItem) -> Optional[str]:
def _prev_uki(self, item: MenuItem) -> str | None:
if item.value is not None:
output = f'{str(_('Unified kernel images'))}: '
output += str(_('Enabled')) if item.value else str(_('Disabled'))
return output
return None
def _prev_hostname(self, item: MenuItem) -> Optional[str]:
def _prev_hostname(self, item: MenuItem) -> str | None:
if item.value is not None:
return f'{_("Hostname")}: {item.value}'
return None
def _prev_root_pwd(self, item: MenuItem) -> Optional[str]:
def _prev_root_pwd(self, item: MenuItem) -> str | None:
if item.value is not None:
return f'{_("Root password")}: {secret(item.value)}'
return None
def _prev_audio(self, item: MenuItem) -> Optional[str]:
def _prev_audio(self, item: MenuItem) -> str | None:
if item.value is not None:
config: AudioConfiguration = item.value
return f'{_("Audio")}: {config.audio.value}'
return None
def _prev_parallel_dw(self, item: MenuItem) -> Optional[str]:
def _prev_parallel_dw(self, item: MenuItem) -> str | None:
if item.value is not None:
return f'{_("Parallel Downloads")}: {item.value}'
return None
def _prev_kernel(self, item: MenuItem) -> Optional[str]:
def _prev_kernel(self, item: MenuItem) -> str | None:
if item.value:
kernel = ', '.join(item.value)
return f'{_("Kernel")}: {kernel}'
return None
def _prev_bootloader(self, item: MenuItem) -> Optional[str]:
def _prev_bootloader(self, item: MenuItem) -> str | None:
if item.value is not None:
return f'{_("Bootloader")}: {item.value.value}'
return None
def _prev_disk_encryption(self, item: MenuItem) -> Optional[str]:
disk_config: Optional[disk.DiskLayoutConfiguration] = self._item_group.find_by_key('disk_config').value
enc_config: Optional[disk.DiskEncryption] = item.value
def _prev_disk_encryption(self, item: MenuItem) -> str | None:
disk_config: disk.DiskLayoutConfiguration | None = self._item_group.find_by_key('disk_config').value
enc_config: disk.DiskEncryption | None = item.value
if disk_config and not disk.DiskEncryption.validate_enc(disk_config):
return str(_('LVM disk encryption with more than 2 partitions is currently not supported'))
@ -419,7 +419,7 @@ class GlobalMenu(AbstractMenu):
return None
def _validate_bootloader(self) -> Optional[str]:
def _validate_bootloader(self) -> str | None:
"""
Checks the selected bootloader is valid for the selected filesystem
type of the boot partition.
@ -431,7 +431,7 @@ class GlobalMenu(AbstractMenu):
shim if necessary.
"""
bootloader = self._item_group.find_by_key('bootloader').value
boot_partition: Optional[disk.PartitionModification] = None
boot_partition: disk.PartitionModification | None = None
if disk_config := self._item_group.find_by_key('disk_config').value:
for layout in disk_config.device_modifications:
@ -449,7 +449,7 @@ class GlobalMenu(AbstractMenu):
return None
def _prev_install_invalid_config(self, item: MenuItem) -> Optional[str]:
def _prev_install_invalid_config(self, item: MenuItem) -> str | None:
if missing := self._missing_configs():
text = str(_('Missing configurations:\n'))
for m in missing:
@ -461,15 +461,15 @@ class GlobalMenu(AbstractMenu):
return None
def _prev_users(self, item: MenuItem) -> Optional[str]:
users: Optional[list[User]] = item.value
def _prev_users(self, item: MenuItem) -> str | None:
users: list[User] | None = item.value
if users:
return FormattedOutput.as_table(users)
return None
def _prev_profile(self, item: MenuItem) -> Optional[str]:
profile_config: Optional[ProfileConfiguration] = item.value
def _prev_profile(self, item: MenuItem) -> str | None:
profile_config: ProfileConfiguration | None = item.value
if profile_config and profile_config.profile:
output = str(_('Profiles')) + ': '
@ -488,14 +488,14 @@ class GlobalMenu(AbstractMenu):
return None
def _set_root_password(self, preset: Optional[str] = None) -> Optional[str]:
def _set_root_password(self, preset: str | None = None) -> str | None:
password = get_password(text=str(_('Root password')), allow_skip=True)
return password
def _select_disk_config(
self,
preset: Optional[disk.DiskLayoutConfiguration] = None
) -> Optional[disk.DiskLayoutConfiguration]:
preset: disk.DiskLayoutConfiguration | None = None
) -> disk.DiskLayoutConfiguration | None:
disk_config = disk.DiskLayoutConfigurationMenu(preset).run()
if disk_config != preset:
@ -503,7 +503,7 @@ class GlobalMenu(AbstractMenu):
return disk_config
def _select_bootloader(self, preset: Optional[Bootloader]) -> Optional[Bootloader]:
def _select_bootloader(self, preset: Bootloader | None) -> Bootloader | None:
bootloader = ask_for_bootloader(preset)
if bootloader:
@ -516,21 +516,21 @@ class GlobalMenu(AbstractMenu):
return bootloader
def _select_profile(self, current_profile: Optional[ProfileConfiguration]):
def _select_profile(self, current_profile: ProfileConfiguration | None):
from .profile.profile_menu import ProfileMenu
profile_config = ProfileMenu(preset=current_profile).run()
return profile_config
def _create_user_account(self, preset: Optional[list[User]] = None) -> list[User]:
def _create_user_account(self, preset: list[User] | None = None) -> list[User]:
preset = [] if preset is None else preset
users = ask_for_additional_users(defined_users=preset)
return users
def _mirror_configuration(self, preset: Optional[MirrorConfiguration] = None) -> Optional[MirrorConfiguration]:
def _mirror_configuration(self, preset: MirrorConfiguration | None = None) -> MirrorConfiguration | None:
mirror_configuration = MirrorMenu(preset=preset).run()
return mirror_configuration
def _prev_mirror_config(self, item: MenuItem) -> Optional[str]:
def _prev_mirror_config(self, item: MenuItem) -> str | None:
if not item.value:
return None

View File

@ -2,7 +2,6 @@ from __future__ import annotations
from pathlib import Path
from typing import Any, TYPE_CHECKING
from typing import Optional
from .. import disk
from ..disk.device_model import BtrfsMountOption
@ -22,8 +21,8 @@ if TYPE_CHECKING:
_: Any
def select_devices(preset: Optional[list[disk.BDevice]] = []) -> list[disk.BDevice]:
def _preview_device_selection(selection: disk._DeviceInfo) -> Optional[str]:
def select_devices(preset: list[disk.BDevice] | None = []) -> list[disk.BDevice]:
def _preview_device_selection(selection: disk._DeviceInfo) -> str | None:
dev = disk.device_handler.get_device(selection.path)
if dev and dev.partition_infos:
return FormattedOutput.as_table(dev.partition_infos)
@ -62,7 +61,7 @@ def select_devices(preset: Optional[list[disk.BDevice]] = []) -> list[disk.BDevi
def get_default_partition_layout(
devices: list[disk.BDevice],
filesystem_type: Optional[disk.FilesystemType] = None,
filesystem_type: disk.FilesystemType | None = None,
advanced_option: bool = False
) -> list[disk.DeviceModification]:
if len(devices) == 1:
@ -98,9 +97,9 @@ def _manual_partitioning(
def select_disk_config(
preset: Optional[disk.DiskLayoutConfiguration] = None,
preset: disk.DiskLayoutConfiguration | None = None,
advanced_option: bool = False
) -> Optional[disk.DiskLayoutConfiguration]:
) -> disk.DiskLayoutConfiguration | None:
default_layout = disk.DiskLayoutType.Default.display_msg()
manual_mode = disk.DiskLayoutType.Manual.display_msg()
pre_mount_mode = disk.DiskLayoutType.Pre_mount.display_msg()
@ -174,8 +173,8 @@ def select_disk_config(
def select_lvm_config(
disk_config: disk.DiskLayoutConfiguration,
preset: Optional[disk.LvmConfiguration] = None,
) -> Optional[disk.LvmConfiguration]:
preset: disk.LvmConfiguration | None = None,
) -> disk.LvmConfiguration | None:
preset_value = preset.config_type.display_msg() if preset else None
default_mode = disk.LvmLayoutType.Default.display_msg()
@ -292,9 +291,9 @@ def process_root_partition_size(total_size: disk.Size, sector_size: disk.SectorS
def suggest_single_disk_layout(
device: disk.BDevice,
filesystem_type: Optional[disk.FilesystemType] = None,
filesystem_type: disk.FilesystemType | None = None,
advanced_options: bool = False,
separate_home: Optional[bool] = None
separate_home: bool | None = None
) -> disk.DeviceModification:
if not filesystem_type:
filesystem_type = select_main_filesystem_format(advanced_options)
@ -424,7 +423,7 @@ def suggest_single_disk_layout(
def suggest_multi_disk_layout(
devices: list[disk.BDevice],
filesystem_type: Optional[disk.FilesystemType] = None,
filesystem_type: disk.FilesystemType | None = None,
advanced_options: bool = False
) -> list[disk.DeviceModification]:
if not devices:
@ -453,7 +452,7 @@ def suggest_multi_disk_layout(
devices_delta[device] = delta
sorted_delta: list[tuple[disk.BDevice, Any]] = sorted(devices_delta.items(), key=lambda x: x[1])
root_device: Optional[disk.BDevice] = sorted_delta[0][0]
root_device: disk.BDevice | None = sorted_delta[0][0]
if home_device is None or root_device is None:
text = str(_('The selected drives do not have the minimum capacity required for an automatic suggestion\n'))
@ -531,7 +530,7 @@ def suggest_multi_disk_layout(
def suggest_lvm_layout(
disk_config: disk.DiskLayoutConfiguration,
filesystem_type: Optional[disk.FilesystemType] = None,
filesystem_type: disk.FilesystemType | None = None,
vg_grp_name: str = 'ArchinstallVg',
) -> disk.LvmConfiguration:
if disk_config.config_type != disk.DiskLayoutType.Default:
@ -574,7 +573,7 @@ def suggest_lvm_layout(
home_volume = False
boot_part: Optional[disk.PartitionModification] = None
boot_part: disk.PartitionModification | None = None
other_part: list[disk.PartitionModification] = []
for mod in disk_config.device_modifications:

View File

@ -1,7 +1,7 @@
from __future__ import annotations
import pathlib
from typing import Any, Optional, TYPE_CHECKING
from typing import Any, TYPE_CHECKING
from ..locale import list_timezones
from ..models.audio_configuration import Audio, AudioConfiguration
@ -45,7 +45,7 @@ def ask_ntp(preset: bool = True) -> bool:
raise ValueError('Unhandled return type')
def ask_hostname(preset: Optional[str] = None) -> Optional[str]:
def ask_hostname(preset: str | None = None) -> str | None:
result = EditMenu(
str(_('Hostname')),
alignment=Alignment.CENTER,
@ -65,7 +65,7 @@ def ask_hostname(preset: Optional[str] = None) -> Optional[str]:
raise ValueError('Unhandled result type')
def ask_for_a_timezone(preset: Optional[str] = None) -> Optional[str]:
def ask_for_a_timezone(preset: str | None = None) -> str | None:
default = 'UTC'
timezones = list_timezones()
@ -91,7 +91,7 @@ def ask_for_a_timezone(preset: Optional[str] = None) -> Optional[str]:
return result.get_value()
def ask_for_audio_selection(preset: Optional[AudioConfiguration] = None) -> Optional[AudioConfiguration]:
def ask_for_audio_selection(preset: AudioConfiguration | None = None) -> AudioConfiguration | None:
items = [MenuItem(a.value, value=a) for a in Audio]
group = MenuItemGroup(items)
@ -114,7 +114,7 @@ def ask_for_audio_selection(preset: Optional[AudioConfiguration] = None) -> Opti
raise ValueError('Unhandled result type')
def select_language(preset: Optional[str] = None) -> Optional[str]:
def select_language(preset: str | None = None) -> str | None:
from ..locale.locale_menu import select_kb_layout
# We'll raise an exception in an upcoming version.
@ -165,7 +165,7 @@ def ask_additional_packages_to_install(preset: list[str] = []) -> list[str]:
header += str(_('If you desire a web browser, such as firefox or chromium, you may specify it in the following prompt.')) + '\n'
header += str(_('Write additional packages to install (space separated, leave blank to skip)'))
def validator(value: str) -> Optional[str]:
def validator(value: str) -> str | None:
packages = value.split() if value else []
if len(packages) == 0:
@ -204,7 +204,7 @@ def ask_additional_packages_to_install(preset: list[str] = []) -> list[str]:
return packages.split(' ')
def add_number_of_parallel_downloads(preset: Optional[int] = None) -> Optional[int]:
def add_number_of_parallel_downloads(preset: int | None = None) -> int | None:
max_recommended = 5
header = str(_('This option enables the number of parallel downloads that can occur during package downloads')) + '\n'
@ -212,7 +212,7 @@ def add_number_of_parallel_downloads(preset: Optional[int] = None) -> Optional[i
header += str(_(' - Maximum recommended value : {} ( Allows {} parallel downloads at a time )')).format(max_recommended, max_recommended) + '\n'
header += str(_(' - Disable/Default : 0 ( Disables parallel downloading, allows only 1 download at a time )\n'))
def validator(s: str) -> Optional[str]:
def validator(s: str) -> str | None:
try:
value = int(s)
if value >= 0:

View File

@ -1,6 +1,6 @@
from __future__ import annotations
from typing import Any, TYPE_CHECKING, Optional
from typing import Any, TYPE_CHECKING
from ..hardware import SysInfo, GfxDriver
from ..models.bootloader import Bootloader
@ -50,7 +50,7 @@ def select_kernel(preset: list[str] = []) -> list[str]:
return result.get_values()
def ask_for_bootloader(preset: Optional[Bootloader]) -> Optional[Bootloader]:
def ask_for_bootloader(preset: Bootloader | None) -> Bootloader | None:
# Systemd is UEFI only
if not SysInfo.has_uefi():
options = [Bootloader.Grub, Bootloader.Limine]
@ -106,7 +106,7 @@ def ask_for_uki(preset: bool = True) -> bool:
raise ValueError('Unhandled result type')
def select_driver(options: list[GfxDriver] = [], preset: Optional[GfxDriver] = None) -> Optional[GfxDriver]:
def select_driver(options: list[GfxDriver] = [], preset: GfxDriver | None = None) -> GfxDriver | None:
"""
Some what convoluted function, whose job is simple.
Select a graphics driver from a pre-defined set of popular options.

View File

@ -1,5 +1,5 @@
from dataclasses import dataclass
from typing import Any, TYPE_CHECKING, Optional
from typing import Any, TYPE_CHECKING
from .utils import list_keyboard_languages, list_locales, set_kb_layout, get_kb_layout
from ..menu import AbstractSubMenu
@ -99,7 +99,7 @@ class LocaleMenu(AbstractSubMenu):
)
]
def _prev_locale(self, item: MenuItem) -> Optional[str]:
def _prev_locale(self, item: MenuItem) -> str | None:
temp_locale = LocaleConfiguration(
self._menu_item_group.find_by_key('keyboard-layout').get_value(),
self._menu_item_group.find_by_key('sys-language').get_value(),
@ -119,14 +119,14 @@ class LocaleMenu(AbstractSubMenu):
self._data_store['sys-encoding']
)
def _select_kb_layout(self, preset: Optional[str]) -> Optional[str]:
def _select_kb_layout(self, preset: str | None) -> str | None:
kb_lang = select_kb_layout(preset)
if kb_lang:
set_kb_layout(kb_lang)
return kb_lang
def select_locale_lang(preset: Optional[str] = None) -> Optional[str]:
def select_locale_lang(preset: str | None = None) -> str | None:
locales = list_locales()
locale_lang = set([locale.split()[0] for locale in locales])
@ -150,7 +150,7 @@ def select_locale_lang(preset: Optional[str] = None) -> Optional[str]:
raise ValueError('Unhandled return type')
def select_locale_enc(preset: Optional[str] = None) -> Optional[str]:
def select_locale_enc(preset: str | None = None) -> str | None:
locales = list_locales()
locale_enc = set([locale.split()[1] for locale in locales])
@ -174,7 +174,7 @@ def select_locale_enc(preset: Optional[str] = None) -> Optional[str]:
raise ValueError('Unhandled return type')
def select_kb_layout(preset: Optional[str] = None) -> Optional[str]:
def select_kb_layout(preset: str | None = None) -> str | None:
"""
Select keyboard layout

View File

@ -1,7 +1,7 @@
from __future__ import annotations
from collections.abc import Callable
from typing import Any, Optional, TYPE_CHECKING
from typing import Any, TYPE_CHECKING
from ..output import error
from ..output import unicode_ljust
@ -19,14 +19,14 @@ class Selector:
def __init__(
self,
description: str,
func: Optional[Callable[[Any], Any]] = None,
display_func: Optional[Callable] = None,
default: Optional[Any] = None,
func: Callable[[Any], Any] | None = None,
display_func: Callable | None = None,
default: Any | None = None,
enabled: bool = False,
dependencies: list[str] = [],
dependencies_not: list[str] = [],
exec_func: Optional[Callable] = None,
preview_func: Optional[Callable] = None,
exec_func: Callable | None = None,
preview_func: Callable | None = None,
mandatory: bool = False,
no_store: bool = False
):
@ -117,7 +117,7 @@ class Selector:
return f'{description} {current}'
def set_current_selection(self, current: Optional[Any]) -> None:
def set_current_selection(self, current: Any | None) -> None:
self.current_selection = current
def has_selection(self) -> bool:
@ -152,7 +152,7 @@ class AbstractMenu:
data_store: dict[str, Any],
auto_cursor: bool = True,
allow_reset: bool = False,
reset_warning: Optional[str] = None
reset_warning: str | None = None
):
self._menu_item_group = item_group
self._data_store = data_store
@ -211,7 +211,7 @@ class AbstractMenu:
for item in self._menu_item_group.items:
item.enabled = False
def run(self) -> Optional[Any]:
def run(self) -> Any | None:
self._sync_all_from_ds()
while True:

View File

@ -4,7 +4,6 @@ import http.client
import urllib.error
import urllib.parse
import urllib.request
from typing import Optional
from ..networking import ping, DownloadTimer
from ..output import debug
@ -89,7 +88,7 @@ class MirrorStatusEntryV3(BaseModel):
return self._latency
@field_validator('score', mode='before')
def validate_score(cls, value: int) -> Optional[int]:
def validate_score(cls, value: int) -> int | None:
if value is not None:
value = round(value)
debug(f" score: {value}")

View File

@ -2,7 +2,7 @@ from __future__ import annotations
from dataclasses import dataclass, field
from enum import Enum
from typing import Optional, Any, TYPE_CHECKING
from typing import Any, TYPE_CHECKING
from ..profile import ProfileConfiguration
@ -27,10 +27,10 @@ class NicType(Enum):
@dataclass
class Nic:
iface: Optional[str] = None
ip: Optional[str] = None
iface: str | None = None
ip: str | None = None
dhcp: bool = True
gateway: Optional[str] = None
gateway: str | None = None
dns: list[str] = field(default_factory=list)
def table_data(self) -> dict[str, Any]:
@ -102,7 +102,7 @@ class NetworkConfiguration:
return config
@staticmethod
def parse_arg(config: dict[str, Any]) -> Optional[NetworkConfiguration]:
def parse_arg(config: dict[str, Any]) -> NetworkConfiguration | None:
nic_type = config.get('type', None)
if not nic_type:
return None
@ -123,7 +123,7 @@ class NetworkConfiguration:
def install_network_config(
self,
installation: Any,
profile_config: Optional[ProfileConfiguration] = None
profile_config: ProfileConfiguration | None = None
) -> None:
match self.type:
case NicType.ISO:

View File

@ -1,6 +1,6 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Any, Optional
from typing import TYPE_CHECKING, Any
from archinstall.default_profiles.profile import Profile, GreeterType
from .profile_model import ProfileConfiguration
@ -21,7 +21,7 @@ if TYPE_CHECKING:
class ProfileMenu(AbstractSubMenu):
def __init__(
self,
preset: Optional[ProfileConfiguration] = None
preset: ProfileConfiguration | None = None
):
if preset:
self._preset = preset
@ -64,7 +64,7 @@ class ProfileMenu(AbstractSubMenu):
)
]
def run(self) -> Optional[ProfileConfiguration]:
def run(self) -> ProfileConfiguration | None:
super().run()
if self._data_store.get('profile', None):
@ -76,7 +76,7 @@ class ProfileMenu(AbstractSubMenu):
return None
def _select_profile(self, preset: Optional[Profile]) -> Optional[Profile]:
def _select_profile(self, preset: Profile | None) -> Profile | None:
profile = select_profile(preset)
if profile is not None:
@ -99,9 +99,9 @@ class ProfileMenu(AbstractSubMenu):
return profile
def _select_gfx_driver(self, preset: Optional[GfxDriver] = None) -> Optional[GfxDriver]:
def _select_gfx_driver(self, preset: GfxDriver | None = None) -> GfxDriver | None:
driver = preset
profile: Optional[Profile] = self._item_group.find_by_key('profile').value
profile: Profile | None = self._item_group.find_by_key('profile').value
if profile:
if profile.is_graphic_driver_supported():
@ -130,20 +130,20 @@ class ProfileMenu(AbstractSubMenu):
return driver
def _prev_gfx(self, item: MenuItem) -> Optional[str]:
def _prev_gfx(self, item: MenuItem) -> str | None:
if item.value:
driver = item.get_value().value
packages = item.get_value().packages_text()
return f'Driver: {driver}\n{packages}'
return None
def _prev_greeter(self, item: MenuItem) -> Optional[str]:
def _prev_greeter(self, item: MenuItem) -> str | None:
if item.value:
return f'{_("Greeter")}: {item.value.value}'
return None
def _preview_profile(self, item: MenuItem) -> Optional[str]:
profile: Optional[Profile] = item.value
def _preview_profile(self, item: MenuItem) -> str | None:
profile: Profile | None = item.value
text = ''
if profile:
@ -161,14 +161,14 @@ class ProfileMenu(AbstractSubMenu):
def select_greeter(
profile: Optional[Profile] = None,
preset: Optional[GreeterType] = None
) -> Optional[GreeterType]:
profile: Profile | None = None,
preset: GreeterType | None = None
) -> GreeterType | None:
if not profile or profile.is_greeter_supported():
items = [MenuItem(greeter.value, value=greeter) for greeter in GreeterType]
group = MenuItemGroup(items, sort_items=True)
default: Optional[GreeterType] = None
default: GreeterType | None = None
if preset is not None:
default = preset
elif profile is not None:
@ -196,10 +196,10 @@ def select_greeter(
def select_profile(
current_profile: Optional[Profile] = None,
header: Optional[str] = None,
current_profile: Profile | None = None,
header: str | None = None,
allow_reset: bool = True,
) -> Optional[Profile]:
) -> Profile | None:
from archinstall.lib.profile.profiles_handler import profile_handler
top_level_profiles = profile_handler.get_top_level_profiles()

View File

@ -1,7 +1,7 @@
from __future__ import annotations
from dataclasses import dataclass
from typing import TYPE_CHECKING, Any, Optional
from typing import TYPE_CHECKING, Any
from ..hardware import GfxDriver
from archinstall.default_profiles.profile import Profile, GreeterType
@ -12,9 +12,9 @@ if TYPE_CHECKING:
@dataclass
class ProfileConfiguration:
profile: Optional[Profile] = None
gfx_driver: Optional[GfxDriver] = None
greeter: Optional[GreeterType] = None
profile: Profile | None = None
gfx_driver: GfxDriver | None = None
greeter: GreeterType | None = None
def json(self) -> dict[str, Any]:
from .profiles_handler import profile_handler

View File

@ -8,7 +8,7 @@ from functools import cached_property
from pathlib import Path
from tempfile import NamedTemporaryFile
from types import ModuleType
from typing import TYPE_CHECKING, Any, Optional, Union
from typing import TYPE_CHECKING, Any, Union
from ...default_profiles.profile import Profile, GreeterType
from .profile_model import ProfileConfiguration
@ -26,14 +26,14 @@ if TYPE_CHECKING:
class ProfileHandler:
def __init__(self) -> None:
self._profiles_path: Path = storage['PROFILE']
self._profiles: Optional[list[Profile]] = None
self._profiles: list[Profile] | None = None
# special variable to keep track of a profile url configuration
# it is merely used to be able to export the path again when a user
# wants to save the configuration
self._url_path = None
def to_json(self, profile: Optional[Profile]) -> dict[str, Any]:
def to_json(self, profile: Profile | None) -> dict[str, Any]:
"""
Serialize the selected profile setting to JSON
"""
@ -51,11 +51,11 @@ class ProfileHandler:
return data
def parse_profile_config(self, profile_config: dict[str, Any]) -> Optional[Profile]:
def parse_profile_config(self, profile_config: dict[str, Any]) -> Profile | None:
"""
Deserialize JSON configuration for profile
"""
profile: Optional[Profile] = None
profile: Profile | None = None
# the order of these is important, we want to
# load all the default_profiles from url and custom
@ -154,7 +154,7 @@ class ProfileHandler:
remove_names = [p.name for p in profiles]
self._profiles = [p for p in self.profiles if p.name not in remove_names]
def get_profile_by_name(self, name: str) -> Optional[Profile]:
def get_profile_by_name(self, name: str) -> Profile | None:
return next(filter(lambda x: x.name == name, self.profiles), None) # type: ignore
def get_top_level_profiles(self) -> list[Profile]:

View File

@ -6,7 +6,7 @@ import gettext
from dataclasses import dataclass
from pathlib import Path
from typing import Any, TYPE_CHECKING, Optional
from typing import Any, TYPE_CHECKING
from .output import error, debug
@ -20,7 +20,7 @@ class Language:
name_en: str
translation: gettext.NullTranslations
translation_percent: int
translated_lang: Optional[str]
translated_lang: str | None
@property
def display_name(self) -> str: