diff --git a/archinstall/lib/exceptions.py b/archinstall/lib/exceptions.py index 022a1038..e7209aaf 100644 --- a/archinstall/lib/exceptions.py +++ b/archinstall/lib/exceptions.py @@ -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 diff --git a/archinstall/lib/general.py b/archinstall/lib/general.py index aa07705a..9beb6792 100644 --- a/archinstall/lib/general.py +++ b/archinstall/lib/general.py @@ -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: diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index e55b61f0..e047dcbb 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -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 diff --git a/archinstall/lib/interactions/disk_conf.py b/archinstall/lib/interactions/disk_conf.py index 098a8029..327592b9 100644 --- a/archinstall/lib/interactions/disk_conf.py +++ b/archinstall/lib/interactions/disk_conf.py @@ -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: diff --git a/archinstall/lib/interactions/general_conf.py b/archinstall/lib/interactions/general_conf.py index 431803dc..14fa3bf0 100644 --- a/archinstall/lib/interactions/general_conf.py +++ b/archinstall/lib/interactions/general_conf.py @@ -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: diff --git a/archinstall/lib/interactions/system_conf.py b/archinstall/lib/interactions/system_conf.py index acb8219f..bce3c3c6 100644 --- a/archinstall/lib/interactions/system_conf.py +++ b/archinstall/lib/interactions/system_conf.py @@ -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. diff --git a/archinstall/lib/locale/locale_menu.py b/archinstall/lib/locale/locale_menu.py index bf0109fa..5a52a6d3 100644 --- a/archinstall/lib/locale/locale_menu.py +++ b/archinstall/lib/locale/locale_menu.py @@ -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 diff --git a/archinstall/lib/menu/abstract_menu.py b/archinstall/lib/menu/abstract_menu.py index 6ec9bb75..f44ceccc 100644 --- a/archinstall/lib/menu/abstract_menu.py +++ b/archinstall/lib/menu/abstract_menu.py @@ -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: diff --git a/archinstall/lib/models/mirrors.py b/archinstall/lib/models/mirrors.py index be646cde..09850a81 100644 --- a/archinstall/lib/models/mirrors.py +++ b/archinstall/lib/models/mirrors.py @@ -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}") diff --git a/archinstall/lib/models/network_configuration.py b/archinstall/lib/models/network_configuration.py index b1238173..6fe8fd9c 100644 --- a/archinstall/lib/models/network_configuration.py +++ b/archinstall/lib/models/network_configuration.py @@ -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: diff --git a/archinstall/lib/profile/profile_menu.py b/archinstall/lib/profile/profile_menu.py index 960fcc7a..4b041456 100644 --- a/archinstall/lib/profile/profile_menu.py +++ b/archinstall/lib/profile/profile_menu.py @@ -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() diff --git a/archinstall/lib/profile/profile_model.py b/archinstall/lib/profile/profile_model.py index fb2d4dd5..606ef091 100644 --- a/archinstall/lib/profile/profile_model.py +++ b/archinstall/lib/profile/profile_model.py @@ -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 diff --git a/archinstall/lib/profile/profiles_handler.py b/archinstall/lib/profile/profiles_handler.py index 195cf013..43d34d53 100644 --- a/archinstall/lib/profile/profiles_handler.py +++ b/archinstall/lib/profile/profiles_handler.py @@ -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]: diff --git a/archinstall/lib/translationhandler.py b/archinstall/lib/translationhandler.py index 243417d5..4b480b64 100644 --- a/archinstall/lib/translationhandler.py +++ b/archinstall/lib/translationhandler.py @@ -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: