Refactor logging and formatting logic (#4542)
* Refactor logging and formatting * Refactor logging and formatting * Refactor logging and formatting * Updaet
This commit is contained in:
parent
5fd2f9b627
commit
ac4bc442de
|
|
@ -1,9 +1,9 @@
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from archinstall.lib.hardware import SysInfo
|
from archinstall.lib.hardware import SysInfo
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.models.application import Audio, AudioConfiguration
|
from archinstall.lib.models.application import Audio, AudioConfiguration
|
||||||
from archinstall.lib.models.users import User
|
from archinstall.lib.models.users import User
|
||||||
from archinstall.lib.output import debug
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from archinstall.lib.installer import Installer
|
from archinstall.lib.installer import Installer
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from archinstall.lib.output import debug
|
from archinstall.lib.log import debug
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from archinstall.lib.installer import Installer
|
from archinstall.lib.installer import Installer
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.models.application import Firewall, FirewallConfiguration
|
from archinstall.lib.models.application import Firewall, FirewallConfiguration
|
||||||
from archinstall.lib.output import debug
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from archinstall.lib.installer import Installer
|
from archinstall.lib.installer import Installer
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.models.application import FontsConfiguration
|
from archinstall.lib.models.application import FontsConfiguration
|
||||||
from archinstall.lib.output import debug
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from archinstall.lib.installer import Installer
|
from archinstall.lib.installer import Installer
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.models.application import PowerManagement, PowerManagementConfiguration
|
from archinstall.lib.models.application import PowerManagement, PowerManagementConfiguration
|
||||||
from archinstall.lib.output import debug
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from archinstall.lib.installer import Installer
|
from archinstall.lib.installer import Installer
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from archinstall.lib.output import debug
|
from archinstall.lib.log import debug
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from archinstall.lib.installer import Installer
|
from archinstall.lib.installer import Installer
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from typing import TYPE_CHECKING, Self, override
|
from typing import TYPE_CHECKING, Self, override
|
||||||
|
|
||||||
from archinstall.default_profiles.profile import DisplayServerType, GreeterType, Profile, ProfileType, SelectResult
|
from archinstall.default_profiles.profile import DisplayServerType, GreeterType, Profile, ProfileType, SelectResult
|
||||||
|
from archinstall.lib.log import info
|
||||||
from archinstall.lib.menu.helpers import Selection
|
from archinstall.lib.menu.helpers import Selection
|
||||||
from archinstall.lib.output import info
|
|
||||||
from archinstall.lib.profile.profiles_handler import profile_handler
|
from archinstall.lib.profile.profiles_handler import profile_handler
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
from archinstall.tui.result import ResultType
|
from archinstall.tui.result import ResultType
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from typing import TYPE_CHECKING, Self, override
|
from typing import TYPE_CHECKING, Self, override
|
||||||
|
|
||||||
from archinstall.default_profiles.profile import Profile, ProfileType, SelectResult
|
from archinstall.default_profiles.profile import Profile, ProfileType, SelectResult
|
||||||
|
from archinstall.lib.log import info
|
||||||
from archinstall.lib.menu.helpers import Selection
|
from archinstall.lib.menu.helpers import Selection
|
||||||
from archinstall.lib.output import info
|
|
||||||
from archinstall.lib.profile.profiles_handler import profile_handler
|
from archinstall.lib.profile.profiles_handler import profile_handler
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
from archinstall.tui.result import ResultType
|
from archinstall.tui.result import ResultType
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ from urllib.request import Request, urlopen
|
||||||
from pydantic.dataclasses import dataclass as p_dataclass
|
from pydantic.dataclasses import dataclass as p_dataclass
|
||||||
|
|
||||||
from archinstall.lib.crypt import decrypt
|
from archinstall.lib.crypt import decrypt
|
||||||
|
from archinstall.lib.log import debug, error, logger, warn
|
||||||
from archinstall.lib.menu.util import get_password
|
from archinstall.lib.menu.util import get_password
|
||||||
from archinstall.lib.models.application import ApplicationConfiguration, ZramConfiguration
|
from archinstall.lib.models.application import ApplicationConfiguration, ZramConfiguration
|
||||||
from archinstall.lib.models.authentication import AuthenticationConfiguration
|
from archinstall.lib.models.authentication import AuthenticationConfiguration
|
||||||
|
|
@ -28,7 +29,6 @@ from archinstall.lib.models.packages import Repository
|
||||||
from archinstall.lib.models.pacman import PacmanConfiguration
|
from archinstall.lib.models.pacman import PacmanConfiguration
|
||||||
from archinstall.lib.models.profile import ProfileConfiguration
|
from archinstall.lib.models.profile import ProfileConfiguration
|
||||||
from archinstall.lib.models.users import Password, User, UserSerialization
|
from archinstall.lib.models.users import Password, User, UserSerialization
|
||||||
from archinstall.lib.output import debug, error, logger, warn
|
|
||||||
from archinstall.lib.plugins import load_plugin
|
from archinstall.lib.plugins import load_plugin
|
||||||
from archinstall.lib.translationhandler import Language, tr, translation_handler
|
from archinstall.lib.translationhandler import Language, tr, translation_handler
|
||||||
from archinstall.lib.version import get_version
|
from archinstall.lib.version import get_version
|
||||||
|
|
|
||||||
|
|
@ -3,9 +3,9 @@ from pathlib import Path
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING
|
||||||
|
|
||||||
from archinstall.lib.command import SysCommandWorker
|
from archinstall.lib.command import SysCommandWorker
|
||||||
|
from archinstall.lib.log import debug, info
|
||||||
from archinstall.lib.models.authentication import AuthenticationConfiguration, U2FLoginConfiguration, U2FLoginMethod
|
from archinstall.lib.models.authentication import AuthenticationConfiguration, U2FLoginConfiguration, U2FLoginMethod
|
||||||
from archinstall.lib.models.users import User
|
from archinstall.lib.models.users import User
|
||||||
from archinstall.lib.output import debug, info
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@ from archinstall.lib.menu.helpers import Confirmation, Selection
|
||||||
from archinstall.lib.menu.util import get_password
|
from archinstall.lib.menu.util import get_password
|
||||||
from archinstall.lib.models.authentication import AuthenticationConfiguration, U2FLoginConfiguration, U2FLoginMethod
|
from archinstall.lib.models.authentication import AuthenticationConfiguration, U2FLoginConfiguration, U2FLoginMethod
|
||||||
from archinstall.lib.models.users import Password, User
|
from archinstall.lib.models.users import Password, User
|
||||||
from archinstall.lib.output import FormattedOutput
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
from archinstall.lib.user.user_menu import select_users
|
from archinstall.lib.user.user_menu import select_users
|
||||||
|
from archinstall.lib.utils.format import as_table
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
from archinstall.tui.result import ResultType
|
from archinstall.tui.result import ResultType
|
||||||
|
|
||||||
|
|
@ -65,7 +65,7 @@ class AuthenticationMenu(AbstractSubMenu[AuthenticationConfiguration]):
|
||||||
users: list[User] | None = item.value
|
users: list[User] | None = item.value
|
||||||
|
|
||||||
if users:
|
if users:
|
||||||
return FormattedOutput.as_table(users)
|
return as_table(users)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _prev_root_pwd(self, item: MenuItem) -> str | None:
|
def _prev_root_pwd(self, item: MenuItem) -> str | None:
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ from typing import ClassVar, Self
|
||||||
|
|
||||||
from archinstall.lib.command import SysCommand, SysCommandWorker
|
from archinstall.lib.command import SysCommand, SysCommandWorker
|
||||||
from archinstall.lib.exceptions import SysCallError
|
from archinstall.lib.exceptions import SysCallError
|
||||||
from archinstall.lib.output import error
|
from archinstall.lib.log import error
|
||||||
|
|
||||||
|
|
||||||
class Boot:
|
class Boot:
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ from types import TracebackType
|
||||||
from typing import Any, Self, override
|
from typing import Any, Self, override
|
||||||
|
|
||||||
from archinstall.lib.exceptions import RequirementError, SysCallError
|
from archinstall.lib.exceptions import RequirementError, SysCallError
|
||||||
from archinstall.lib.output import debug, error, logger
|
from archinstall.lib.log import debug, error, logger
|
||||||
from archinstall.lib.utils.encoding import clear_vt100_escape_codes
|
from archinstall.lib.utils.encoding import clear_vt100_escape_codes
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,11 +8,12 @@ from pydantic import TypeAdapter
|
||||||
|
|
||||||
from archinstall.lib.args import ArchConfig, ArchConfigType
|
from archinstall.lib.args import ArchConfig, ArchConfigType
|
||||||
from archinstall.lib.crypt import encrypt
|
from archinstall.lib.crypt import encrypt
|
||||||
|
from archinstall.lib.log import debug, logger, warn
|
||||||
from archinstall.lib.menu.helpers import Confirmation, Selection
|
from archinstall.lib.menu.helpers import Confirmation, Selection
|
||||||
from archinstall.lib.menu.util import get_password, prompt_dir
|
from archinstall.lib.menu.util import get_password, prompt_dir
|
||||||
from archinstall.lib.models.network import NetworkConfiguration
|
from archinstall.lib.models.network import NetworkConfiguration
|
||||||
from archinstall.lib.output import as_key_value_pair, debug, logger, warn
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
from archinstall.lib.utils.format import as_key_value_pair
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
from archinstall.tui.result import ResultType
|
from archinstall.tui.result import ResultType
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ from pathlib import Path
|
||||||
from cryptography.fernet import Fernet, InvalidToken
|
from cryptography.fernet import Fernet, InvalidToken
|
||||||
from cryptography.hazmat.primitives.kdf.argon2 import Argon2id
|
from cryptography.hazmat.primitives.kdf.argon2 import Argon2id
|
||||||
|
|
||||||
from archinstall.lib.output import debug
|
from archinstall.lib.log import debug
|
||||||
|
|
||||||
libcrypt = ctypes.CDLL('libcrypt.so')
|
libcrypt = ctypes.CDLL('libcrypt.so')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@ from archinstall.lib.disk.utils import (
|
||||||
umount,
|
umount,
|
||||||
)
|
)
|
||||||
from archinstall.lib.exceptions import DiskError, SysCallError, UnknownFilesystemFormat
|
from archinstall.lib.exceptions import DiskError, SysCallError, UnknownFilesystemFormat
|
||||||
|
from archinstall.lib.log import debug, error, info, log
|
||||||
from archinstall.lib.models.device import (
|
from archinstall.lib.models.device import (
|
||||||
DEFAULT_ITER_TIME,
|
DEFAULT_ITER_TIME,
|
||||||
BDevice,
|
BDevice,
|
||||||
|
|
@ -35,7 +36,6 @@ from archinstall.lib.models.device import (
|
||||||
_PartitionInfo,
|
_PartitionInfo,
|
||||||
)
|
)
|
||||||
from archinstall.lib.models.users import Password
|
from archinstall.lib.models.users import Password
|
||||||
from archinstall.lib.output import debug, error, info, log
|
|
||||||
from archinstall.lib.pathnames import ARCHISO_MOUNTPOINT
|
from archinstall.lib.pathnames import ARCHISO_MOUNTPOINT
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@ from typing import override
|
||||||
from archinstall.lib.disk.device_handler import device_handler
|
from archinstall.lib.disk.device_handler import device_handler
|
||||||
from archinstall.lib.disk.encryption_menu import DiskEncryptionMenu
|
from archinstall.lib.disk.encryption_menu import DiskEncryptionMenu
|
||||||
from archinstall.lib.disk.partitioning_menu import manual_partitioning
|
from archinstall.lib.disk.partitioning_menu import manual_partitioning
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.menu.abstract_menu import AbstractSubMenu
|
from archinstall.lib.menu.abstract_menu import AbstractSubMenu
|
||||||
from archinstall.lib.menu.helpers import Confirmation, Notify, Selection, Table
|
from archinstall.lib.menu.helpers import Confirmation, Notify, Selection, Table
|
||||||
from archinstall.lib.menu.util import prompt_dir
|
from archinstall.lib.menu.util import prompt_dir
|
||||||
|
|
@ -35,8 +36,8 @@ from archinstall.lib.models.device import (
|
||||||
Unit,
|
Unit,
|
||||||
_DeviceInfo,
|
_DeviceInfo,
|
||||||
)
|
)
|
||||||
from archinstall.lib.output import FormattedOutput, debug
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
from archinstall.lib.utils.format import as_table
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
from archinstall.tui.result import ResultType
|
from archinstall.tui.result import ResultType
|
||||||
|
|
||||||
|
|
@ -221,7 +222,7 @@ class DiskLayoutConfigurationMenu(AbstractSubMenu[DiskMenuConfig]):
|
||||||
|
|
||||||
for mod in device_mods:
|
for mod in device_mods:
|
||||||
# create partition table
|
# create partition table
|
||||||
partition_table = FormattedOutput.as_table(mod.partitions)
|
partition_table = as_table(mod.partitions)
|
||||||
|
|
||||||
output_partition += f'{mod.device_path}: {mod.device.device_info.model}\n'
|
output_partition += f'{mod.device_path}: {mod.device.device_info.model}\n'
|
||||||
output_partition += '{}: {}\n'.format(tr('Wipe'), mod.wipe)
|
output_partition += '{}: {}\n'.format(tr('Wipe'), mod.wipe)
|
||||||
|
|
@ -230,7 +231,7 @@ class DiskLayoutConfigurationMenu(AbstractSubMenu[DiskMenuConfig]):
|
||||||
# create btrfs table
|
# create btrfs table
|
||||||
btrfs_partitions = [p for p in mod.partitions if p.btrfs_subvols]
|
btrfs_partitions = [p for p in mod.partitions if p.btrfs_subvols]
|
||||||
for partition in btrfs_partitions:
|
for partition in btrfs_partitions:
|
||||||
output_btrfs += FormattedOutput.as_table(partition.btrfs_subvols) + '\n'
|
output_btrfs += as_table(partition.btrfs_subvols) + '\n'
|
||||||
|
|
||||||
output = output_partition + output_btrfs
|
output = output_partition + output_btrfs
|
||||||
return output.rstrip()
|
return output.rstrip()
|
||||||
|
|
@ -246,12 +247,12 @@ class DiskLayoutConfigurationMenu(AbstractSubMenu[DiskMenuConfig]):
|
||||||
output = '{}: {}\n'.format(tr('Configuration'), lvm_config.config_type.display_msg())
|
output = '{}: {}\n'.format(tr('Configuration'), lvm_config.config_type.display_msg())
|
||||||
|
|
||||||
for vol_gp in lvm_config.vol_groups:
|
for vol_gp in lvm_config.vol_groups:
|
||||||
pv_table = FormattedOutput.as_table(vol_gp.pvs)
|
pv_table = as_table(vol_gp.pvs)
|
||||||
output += '{}:\n{}'.format(tr('Physical volumes'), pv_table)
|
output += '{}:\n{}'.format(tr('Physical volumes'), pv_table)
|
||||||
|
|
||||||
output += f'\nVolume Group: {vol_gp.name}'
|
output += f'\nVolume Group: {vol_gp.name}'
|
||||||
|
|
||||||
lvm_volumes = FormattedOutput.as_table(vol_gp.volumes)
|
lvm_volumes = as_table(vol_gp.volumes)
|
||||||
output += '\n\n{}:\n{}'.format(tr('Volumes'), lvm_volumes)
|
output += '\n\n{}:\n{}'.format(tr('Volumes'), lvm_volumes)
|
||||||
|
|
||||||
return output
|
return output
|
||||||
|
|
@ -302,7 +303,7 @@ async def select_devices(preset: list[BDevice] | None = []) -> list[BDevice] | N
|
||||||
dev = device_handler.get_device(device.path)
|
dev = device_handler.get_device(device.path)
|
||||||
|
|
||||||
if dev and dev.partition_infos:
|
if dev and dev.partition_infos:
|
||||||
return FormattedOutput.as_table(dev.partition_infos)
|
return as_table(dev.partition_infos)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if preset is None:
|
if preset is None:
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@ from archinstall.lib.models.device import (
|
||||||
PartitionModification,
|
PartitionModification,
|
||||||
)
|
)
|
||||||
from archinstall.lib.models.users import Password
|
from archinstall.lib.models.users import Password
|
||||||
from archinstall.lib.output import FormattedOutput
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
from archinstall.lib.utils.format import as_table
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
from archinstall.tui.result import ResultType
|
from archinstall.tui.result import ResultType
|
||||||
|
|
||||||
|
|
@ -199,7 +199,7 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]):
|
||||||
def _prev_partitions(self, item: MenuItem) -> str | None:
|
def _prev_partitions(self, item: MenuItem) -> str | None:
|
||||||
if item.value:
|
if item.value:
|
||||||
output = tr('Partitions to be encrypted') + '\n'
|
output = tr('Partitions to be encrypted') + '\n'
|
||||||
output += FormattedOutput.as_table(item.value)
|
output += as_table(item.value)
|
||||||
return output.rstrip()
|
return output.rstrip()
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
@ -207,7 +207,7 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]):
|
||||||
def _prev_lvm_vols(self, item: MenuItem) -> str | None:
|
def _prev_lvm_vols(self, item: MenuItem) -> str | None:
|
||||||
if item.value:
|
if item.value:
|
||||||
output = tr('LVM volumes to be encrypted') + '\n'
|
output = tr('LVM volumes to be encrypted') + '\n'
|
||||||
output += FormattedOutput.as_table(item.value)
|
output += as_table(item.value)
|
||||||
return output.rstrip()
|
return output.rstrip()
|
||||||
|
|
||||||
return None
|
return None
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,9 @@ from typing import ClassVar
|
||||||
|
|
||||||
from archinstall.lib.command import SysCommand, SysCommandWorker
|
from archinstall.lib.command import SysCommand, SysCommandWorker
|
||||||
from archinstall.lib.exceptions import SysCallError
|
from archinstall.lib.exceptions import SysCallError
|
||||||
|
from archinstall.lib.log import error, info
|
||||||
from archinstall.lib.models.device import Fido2Device
|
from archinstall.lib.models.device import Fido2Device
|
||||||
from archinstall.lib.models.users import Password
|
from archinstall.lib.models.users import Password
|
||||||
from archinstall.lib.output import error, info
|
|
||||||
from archinstall.lib.utils.encoding import clear_vt100_escape_codes_from_str
|
from archinstall.lib.utils.encoding import clear_vt100_escape_codes_from_str
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ from archinstall.lib.disk.lvm import (
|
||||||
lvm_vol_reduce,
|
lvm_vol_reduce,
|
||||||
)
|
)
|
||||||
from archinstall.lib.disk.utils import udev_sync
|
from archinstall.lib.disk.utils import udev_sync
|
||||||
|
from archinstall.lib.log import debug, info
|
||||||
from archinstall.lib.models.device import (
|
from archinstall.lib.models.device import (
|
||||||
DiskEncryption,
|
DiskEncryption,
|
||||||
DiskLayoutConfiguration,
|
DiskLayoutConfiguration,
|
||||||
|
|
@ -27,7 +28,6 @@ from archinstall.lib.models.device import (
|
||||||
Size,
|
Size,
|
||||||
Unit,
|
Unit,
|
||||||
)
|
)
|
||||||
from archinstall.lib.output import debug, info
|
|
||||||
|
|
||||||
|
|
||||||
class FilesystemHandler:
|
class FilesystemHandler:
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,9 @@ from types import TracebackType
|
||||||
from archinstall.lib.command import SysCommand, SysCommandWorker, run
|
from archinstall.lib.command import SysCommand, SysCommandWorker, run
|
||||||
from archinstall.lib.disk.utils import get_lsblk_info, umount
|
from archinstall.lib.disk.utils import get_lsblk_info, umount
|
||||||
from archinstall.lib.exceptions import DiskError, SysCallError
|
from archinstall.lib.exceptions import DiskError, SysCallError
|
||||||
|
from archinstall.lib.log import debug, info
|
||||||
from archinstall.lib.models.device import DEFAULT_ITER_TIME
|
from archinstall.lib.models.device import DEFAULT_ITER_TIME
|
||||||
from archinstall.lib.models.users import Password
|
from archinstall.lib.models.users import Password
|
||||||
from archinstall.lib.output import debug, info
|
|
||||||
from archinstall.lib.utils.util import generate_password
|
from archinstall.lib.utils.util import generate_password
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ from typing import Literal, overload
|
||||||
from archinstall.lib.command import SysCommand, SysCommandWorker
|
from archinstall.lib.command import SysCommand, SysCommandWorker
|
||||||
from archinstall.lib.disk.utils import udev_sync
|
from archinstall.lib.disk.utils import udev_sync
|
||||||
from archinstall.lib.exceptions import SysCallError
|
from archinstall.lib.exceptions import SysCallError
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.models.device import (
|
from archinstall.lib.models.device import (
|
||||||
LvmGroupInfo,
|
LvmGroupInfo,
|
||||||
LvmPVInfo,
|
LvmPVInfo,
|
||||||
|
|
@ -17,7 +18,6 @@ from archinstall.lib.models.device import (
|
||||||
Size,
|
Size,
|
||||||
Unit,
|
Unit,
|
||||||
)
|
)
|
||||||
from archinstall.lib.output import debug
|
|
||||||
|
|
||||||
|
|
||||||
def _lvm_info(
|
def _lvm_info(
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ from archinstall.lib.models.device import (
|
||||||
Size,
|
Size,
|
||||||
Unit,
|
Unit,
|
||||||
)
|
)
|
||||||
from archinstall.lib.output import FormattedOutput
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
from archinstall.lib.utils.format import as_table
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
from archinstall.tui.result import ResultType
|
from archinstall.tui.result import ResultType
|
||||||
|
|
||||||
|
|
@ -479,7 +479,7 @@ class PartitioningList(ListManager[DiskSegment]):
|
||||||
sector_size = device_info.sector_size
|
sector_size = device_info.sector_size
|
||||||
|
|
||||||
text = tr('Selected free space segment on device {}:').format(device_info.path) + '\n\n'
|
text = tr('Selected free space segment on device {}:').format(device_info.path) + '\n\n'
|
||||||
free_space_table = FormattedOutput.as_table([free_space])
|
free_space_table = as_table([free_space])
|
||||||
prompt = text + free_space_table + '\n'
|
prompt = text + free_space_table + '\n'
|
||||||
|
|
||||||
max_sectors = free_space.length.format_size(Unit.sectors, sector_size)
|
max_sectors = free_space.length.format_size(Unit.sectors, sector_size)
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ from pydantic import BaseModel
|
||||||
|
|
||||||
from archinstall.lib.command import SysCommand
|
from archinstall.lib.command import SysCommand
|
||||||
from archinstall.lib.exceptions import DiskError, SysCallError
|
from archinstall.lib.exceptions import DiskError, SysCallError
|
||||||
|
from archinstall.lib.log import debug, info, warn
|
||||||
from archinstall.lib.models.device import LsblkInfo
|
from archinstall.lib.models.device import LsblkInfo
|
||||||
from archinstall.lib.output import debug, info, warn
|
|
||||||
|
|
||||||
|
|
||||||
class LsblkOutput(BaseModel):
|
class LsblkOutput(BaseModel):
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
||||||
from archinstall.lib.locale.utils import list_timezones
|
from archinstall.lib.locale.utils import list_timezones
|
||||||
|
from archinstall.lib.log import warn
|
||||||
from archinstall.lib.menu.helpers import Confirmation, Input, Selection
|
from archinstall.lib.menu.helpers import Confirmation, Input, Selection
|
||||||
from archinstall.lib.output import warn
|
|
||||||
from archinstall.lib.translationhandler import Language, tr
|
from archinstall.lib.translationhandler import Language, tr
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
from archinstall.tui.result import ResultType
|
from archinstall.tui.result import ResultType
|
||||||
|
|
|
||||||
|
|
@ -27,11 +27,11 @@ from archinstall.lib.models.packages import Repository
|
||||||
from archinstall.lib.models.pacman import PacmanConfiguration
|
from archinstall.lib.models.pacman import PacmanConfiguration
|
||||||
from archinstall.lib.models.profile import ProfileConfiguration
|
from archinstall.lib.models.profile import ProfileConfiguration
|
||||||
from archinstall.lib.network.network_menu import select_network
|
from archinstall.lib.network.network_menu import select_network
|
||||||
from archinstall.lib.output import FormattedOutput
|
|
||||||
from archinstall.lib.packages.packages import list_available_packages, select_additional_packages
|
from archinstall.lib.packages.packages import list_available_packages, select_additional_packages
|
||||||
from archinstall.lib.pacman.config import PacmanConfig
|
from archinstall.lib.pacman.config import PacmanConfig
|
||||||
from archinstall.lib.pacman.pacman_menu import PacmanMenu
|
from archinstall.lib.pacman.pacman_menu import PacmanMenu
|
||||||
from archinstall.lib.translationhandler import Language, tr, translation_handler
|
from archinstall.lib.translationhandler import Language, tr, translation_handler
|
||||||
|
from archinstall.lib.utils.format import as_table
|
||||||
from archinstall.tui.components import tui
|
from archinstall.tui.components import tui
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
|
|
||||||
|
|
@ -299,7 +299,7 @@ class GlobalMenu(AbstractMenu[None]):
|
||||||
if item.value:
|
if item.value:
|
||||||
network_config: NetworkConfiguration = item.value
|
network_config: NetworkConfiguration = item.value
|
||||||
if network_config.type == NicType.MANUAL:
|
if network_config.type == NicType.MANUAL:
|
||||||
output = FormattedOutput.as_table(network_config.nics)
|
output = as_table(network_config.nics)
|
||||||
else:
|
else:
|
||||||
output = f'{tr("Network configuration")}:\n{network_config.type.display_msg()}'
|
output = f'{tr("Network configuration")}:\n{network_config.type.display_msg()}'
|
||||||
|
|
||||||
|
|
@ -321,7 +321,7 @@ class GlobalMenu(AbstractMenu[None]):
|
||||||
output += f'{tr("Root password")}: {auth_config.root_enc_password.hidden()}\n'
|
output += f'{tr("Root password")}: {auth_config.root_enc_password.hidden()}\n'
|
||||||
|
|
||||||
if auth_config.users:
|
if auth_config.users:
|
||||||
output += FormattedOutput.as_table(auth_config.users) + '\n'
|
output += as_table(auth_config.users) + '\n'
|
||||||
|
|
||||||
if auth_config.u2f_config:
|
if auth_config.u2f_config:
|
||||||
u2f_config = auth_config.u2f_config
|
u2f_config = auth_config.u2f_config
|
||||||
|
|
@ -612,7 +612,7 @@ class GlobalMenu(AbstractMenu[None]):
|
||||||
|
|
||||||
if mirror_config.custom_repositories:
|
if mirror_config.custom_repositories:
|
||||||
title = tr('Custom repositories')
|
title = tr('Custom repositories')
|
||||||
table = FormattedOutput.as_table(mirror_config.custom_repositories)
|
table = as_table(mirror_config.custom_repositories)
|
||||||
output += f'{title}:\n\n{table}'
|
output += f'{title}:\n\n{table}'
|
||||||
|
|
||||||
return output.strip()
|
return output.strip()
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@ from typing import Self
|
||||||
|
|
||||||
from archinstall.lib.command import SysCommand
|
from archinstall.lib.command import SysCommand
|
||||||
from archinstall.lib.exceptions import SysCallError
|
from archinstall.lib.exceptions import SysCallError
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.networking import enrich_iface_types, list_interfaces
|
from archinstall.lib.networking import enrich_iface_types, list_interfaces
|
||||||
from archinstall.lib.output import debug
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ from archinstall.lib.exceptions import DiskError, HardwareIncompatibilityError,
|
||||||
from archinstall.lib.hardware import SysInfo
|
from archinstall.lib.hardware import SysInfo
|
||||||
from archinstall.lib.linux_path import LPath
|
from archinstall.lib.linux_path import LPath
|
||||||
from archinstall.lib.locale.utils import verify_keyboard_layout, verify_x11_keyboard_layout
|
from archinstall.lib.locale.utils import verify_keyboard_layout, verify_x11_keyboard_layout
|
||||||
|
from archinstall.lib.log import debug, error, info, log, logger, warn
|
||||||
from archinstall.lib.mirror.mirror_handler import MirrorListHandler
|
from archinstall.lib.mirror.mirror_handler import MirrorListHandler
|
||||||
from archinstall.lib.models.application import ZramAlgorithm
|
from archinstall.lib.models.application import ZramAlgorithm
|
||||||
from archinstall.lib.models.bootloader import Bootloader, BootloaderConfiguration
|
from archinstall.lib.models.bootloader import Bootloader, BootloaderConfiguration
|
||||||
|
|
@ -52,7 +53,6 @@ from archinstall.lib.models.package_types import DEFAULT_KERNEL, Kernel
|
||||||
from archinstall.lib.models.packages import Repository
|
from archinstall.lib.models.packages import Repository
|
||||||
from archinstall.lib.models.pacman import PacmanConfiguration
|
from archinstall.lib.models.pacman import PacmanConfiguration
|
||||||
from archinstall.lib.models.users import User
|
from archinstall.lib.models.users import User
|
||||||
from archinstall.lib.output import debug, error, info, log, logger, warn
|
|
||||||
from archinstall.lib.packages.packages import installed_package
|
from archinstall.lib.packages.packages import installed_package
|
||||||
from archinstall.lib.pacman.config import PacmanConfig
|
from archinstall.lib.pacman.config import PacmanConfig
|
||||||
from archinstall.lib.pacman.pacman import Pacman
|
from archinstall.lib.pacman.pacman import Pacman
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ from pathlib import Path
|
||||||
|
|
||||||
from archinstall.lib.command import SysCommand
|
from archinstall.lib.command import SysCommand
|
||||||
from archinstall.lib.exceptions import ServiceException, SysCallError
|
from archinstall.lib.exceptions import ServiceException, SysCallError
|
||||||
from archinstall.lib.output import error
|
from archinstall.lib.log import error
|
||||||
from archinstall.lib.utils.util import running_from_iso
|
from archinstall.lib.utils.util import running_from_iso
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,183 +3,18 @@ import os
|
||||||
import sys
|
import sys
|
||||||
import urllib.error
|
import urllib.error
|
||||||
import urllib.request
|
import urllib.request
|
||||||
from collections.abc import Callable
|
|
||||||
from dataclasses import asdict, is_dataclass
|
|
||||||
from datetime import UTC, datetime
|
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import TYPE_CHECKING, Any
|
|
||||||
|
|
||||||
from archinstall.lib.utils.encoding import unicode_ljust, unicode_rjust
|
from archinstall.lib.utils.util import timestamp
|
||||||
from archinstall.tui.rich import BaseRichTable
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from _typeshed import DataclassInstance
|
|
||||||
|
|
||||||
|
|
||||||
class FormattedOutput:
|
|
||||||
@staticmethod
|
|
||||||
def _get_values(
|
|
||||||
o: DataclassInstance,
|
|
||||||
class_formatter: str | Callable | None = None, # type: ignore[type-arg] # pyright: ignore[reportMissingTypeArgument]
|
|
||||||
filter_list: list[str] = [],
|
|
||||||
) -> dict[str, Any]:
|
|
||||||
"""
|
|
||||||
the original values returned a dataclass as dict thru the call to some specific methods
|
|
||||||
this version allows thru the parameter class_formatter to call a dynamically selected formatting method.
|
|
||||||
Can transmit a filter list to the class_formatter,
|
|
||||||
"""
|
|
||||||
if class_formatter:
|
|
||||||
# if invoked per reference it has to be a standard function or a classmethod.
|
|
||||||
# A method of an instance does not make sense
|
|
||||||
if callable(class_formatter):
|
|
||||||
return class_formatter(o, filter_list)
|
|
||||||
# if is invoked by name we restrict it to a method of the class. No need to mess more
|
|
||||||
elif hasattr(o, class_formatter) and callable(getattr(o, class_formatter)):
|
|
||||||
func = getattr(o, class_formatter)
|
|
||||||
return func(filter_list)
|
|
||||||
|
|
||||||
raise ValueError('Unsupported formatting call')
|
|
||||||
elif hasattr(o, 'table_data'):
|
|
||||||
return o.table_data()
|
|
||||||
elif hasattr(o, 'json'):
|
|
||||||
return o.json()
|
|
||||||
elif is_dataclass(o):
|
|
||||||
return asdict(o)
|
|
||||||
else:
|
|
||||||
return o.__dict__ # type: ignore[unreachable]
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def as_table(
|
|
||||||
cls,
|
|
||||||
obj: list[Any],
|
|
||||||
class_formatter: str | Callable | None = None, # type: ignore[type-arg]
|
|
||||||
filter_list: list[str] = [],
|
|
||||||
capitalize: bool = False,
|
|
||||||
) -> str:
|
|
||||||
"""variant of as_table (subtly different code) which has two additional parameters
|
|
||||||
filter which is a list of fields which will be shown
|
|
||||||
class_formatter a special method to format the outgoing data
|
|
||||||
|
|
||||||
A general comment, the format selected for the output (a string where every data record is separated by newline)
|
|
||||||
is for compatibility with a print statement
|
|
||||||
As_table_filter can be a drop in replacement for as_table
|
|
||||||
"""
|
|
||||||
raw_data = [cls._get_values(o, class_formatter, filter_list) for o in obj]
|
|
||||||
|
|
||||||
# determine the maximum column size
|
|
||||||
column_width: dict[str, int] = {}
|
|
||||||
for o in raw_data:
|
|
||||||
for k, v in o.items():
|
|
||||||
if not filter_list or k in filter_list:
|
|
||||||
column_width.setdefault(k, 0)
|
|
||||||
column_width[k] = max([column_width[k], len(str(v)), len(k)])
|
|
||||||
|
|
||||||
if not filter_list:
|
|
||||||
filter_list = list(column_width.keys())
|
|
||||||
|
|
||||||
# create the header lines
|
|
||||||
output = ''
|
|
||||||
key_list = []
|
|
||||||
for key in filter_list:
|
|
||||||
width = column_width[key]
|
|
||||||
key = key.replace('!', '').replace('_', ' ')
|
|
||||||
|
|
||||||
if capitalize:
|
|
||||||
key = key.capitalize()
|
|
||||||
|
|
||||||
key_list.append(unicode_ljust(key, width))
|
|
||||||
|
|
||||||
output += ' | '.join(key_list) + '\n'
|
|
||||||
output += '-' * len(output) + '\n'
|
|
||||||
|
|
||||||
# create the data lines
|
|
||||||
for record in raw_data:
|
|
||||||
obj_data = []
|
|
||||||
for key in filter_list:
|
|
||||||
width = column_width.get(key, len(key))
|
|
||||||
value = record.get(key, '')
|
|
||||||
|
|
||||||
if '!' in key:
|
|
||||||
value = '*' * len(value)
|
|
||||||
|
|
||||||
if isinstance(value, (int, float)) or (isinstance(value, str) and value.isnumeric()):
|
|
||||||
obj_data.append(unicode_rjust(str(value), width))
|
|
||||||
else:
|
|
||||||
obj_data.append(unicode_ljust(str(value), width))
|
|
||||||
|
|
||||||
output += ' | '.join(obj_data) + '\n'
|
|
||||||
|
|
||||||
return output
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def as_columns(entries: list[str], cols: int) -> str:
|
|
||||||
"""
|
|
||||||
Will format a list into a given number of columns
|
|
||||||
"""
|
|
||||||
chunks = []
|
|
||||||
output = ''
|
|
||||||
|
|
||||||
for i in range(0, len(entries), cols):
|
|
||||||
chunks.append(entries[i : i + cols])
|
|
||||||
|
|
||||||
for row in chunks:
|
|
||||||
out_fmt = '{: <30} ' * len(row)
|
|
||||||
output += out_fmt.format(*row) + '\n'
|
|
||||||
|
|
||||||
return output
|
|
||||||
|
|
||||||
|
|
||||||
def as_key_value_pair(
|
|
||||||
entries: dict[str, str | list[str] | bool],
|
|
||||||
ignore_empty: bool = True,
|
|
||||||
) -> str:
|
|
||||||
"""
|
|
||||||
Formats key-values as a Rich Table:
|
|
||||||
key1 : value1
|
|
||||||
key2 : value2
|
|
||||||
...
|
|
||||||
"""
|
|
||||||
table = BaseRichTable()
|
|
||||||
table.add_column('key', style='bold', no_wrap=True)
|
|
||||||
table.add_column('value', style='white', max_width=70)
|
|
||||||
|
|
||||||
for label, value in entries.items():
|
|
||||||
if ignore_empty and not value:
|
|
||||||
continue
|
|
||||||
|
|
||||||
if isinstance(value, bool):
|
|
||||||
value = 'Yes' if value else 'No'
|
|
||||||
|
|
||||||
if isinstance(value, list):
|
|
||||||
value = '\n '.join(str(val) for val in value)
|
|
||||||
|
|
||||||
table.add_row(label.title(), f': {value}')
|
|
||||||
|
|
||||||
return table.stringify()
|
|
||||||
|
|
||||||
|
|
||||||
class Journald:
|
|
||||||
@staticmethod
|
|
||||||
def log(message: str, level: int = logging.DEBUG) -> None:
|
|
||||||
try:
|
|
||||||
import systemd.journal # type: ignore[import-not-found]
|
|
||||||
except ModuleNotFoundError:
|
|
||||||
return
|
|
||||||
|
|
||||||
log_adapter = logging.getLogger('archinstall')
|
|
||||||
log_fmt = logging.Formatter('[%(levelname)s]: %(message)s')
|
|
||||||
log_ch = systemd.journal.JournalHandler()
|
|
||||||
log_ch.setFormatter(log_fmt)
|
|
||||||
log_adapter.addHandler(log_ch)
|
|
||||||
log_adapter.setLevel(logging.DEBUG)
|
|
||||||
|
|
||||||
log_adapter.log(level, message)
|
|
||||||
|
|
||||||
|
|
||||||
class Logger:
|
class Logger:
|
||||||
def __init__(self, path: Path = Path('/var/log/archinstall')) -> None:
|
def __init__(self, path: Path | None = None) -> None:
|
||||||
self._path = path
|
if path is None:
|
||||||
|
path = Path('/var/log/archinstall')
|
||||||
|
|
||||||
|
self._path: Path = path
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def path(self) -> Path:
|
def path(self) -> Path:
|
||||||
|
|
@ -212,7 +47,7 @@ class Logger:
|
||||||
self._check_permissions()
|
self._check_permissions()
|
||||||
|
|
||||||
with self.path.open('a') as f:
|
with self.path.open('a') as f:
|
||||||
ts = _timestamp()
|
ts = timestamp()
|
||||||
level_name = logging.getLevelName(level)
|
level_name = logging.getLevelName(level)
|
||||||
f.write(f'[{ts}] - {level_name} - {content}\n')
|
f.write(f'[{ts}] - {level_name} - {content}\n')
|
||||||
|
|
||||||
|
|
@ -310,9 +145,20 @@ def _stylize_output(
|
||||||
return f'\033[{ansi}m{text}\033[0m'
|
return f'\033[{ansi}m{text}\033[0m'
|
||||||
|
|
||||||
|
|
||||||
def _timestamp() -> str:
|
def journal_log(message: str, level: int = logging.DEBUG) -> None:
|
||||||
now = datetime.now(tz=UTC)
|
try:
|
||||||
return now.strftime('%Y-%m-%d %H:%M:%S')
|
import systemd.journal # type: ignore[import-not-found]
|
||||||
|
except ModuleNotFoundError:
|
||||||
|
return
|
||||||
|
|
||||||
|
log_adapter = logging.getLogger('archinstall')
|
||||||
|
log_fmt = logging.Formatter('[%(levelname)s]: %(message)s')
|
||||||
|
log_ch = systemd.journal.JournalHandler()
|
||||||
|
log_ch.setFormatter(log_fmt)
|
||||||
|
log_adapter.addHandler(log_ch)
|
||||||
|
log_adapter.setLevel(logging.DEBUG)
|
||||||
|
|
||||||
|
log_adapter.log(level, message)
|
||||||
|
|
||||||
|
|
||||||
def info(
|
def info(
|
||||||
|
|
@ -376,7 +222,7 @@ def log(
|
||||||
if _supports_color():
|
if _supports_color():
|
||||||
text = _stylize_output(text, fg, bg, reset, font)
|
text = _stylize_output(text, fg, bg, reset, font)
|
||||||
|
|
||||||
Journald.log(text, level=level)
|
journal_log(text, level=level)
|
||||||
|
|
||||||
if level != logging.DEBUG:
|
if level != logging.DEBUG:
|
||||||
print(text)
|
print(text)
|
||||||
|
|
@ -2,8 +2,8 @@ from enum import Enum
|
||||||
from types import TracebackType
|
from types import TracebackType
|
||||||
from typing import Any, Self, override
|
from typing import Any, Self, override
|
||||||
|
|
||||||
|
from archinstall.lib.log import error
|
||||||
from archinstall.lib.menu.helpers import Selection
|
from archinstall.lib.menu.helpers import Selection
|
||||||
from archinstall.lib.output import error
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
from archinstall.tui.components import InstanceRunnable
|
from archinstall.tui.components import InstanceRunnable
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
from archinstall.lib.output import FormattedOutput
|
from archinstall.lib.utils.format import as_table
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -32,7 +32,7 @@ class MenuHelper[ValueT]:
|
||||||
display_data: dict[str, ValueT | str | None] = {}
|
display_data: dict[str, ValueT | str | None] = {}
|
||||||
|
|
||||||
if data:
|
if data:
|
||||||
table = FormattedOutput.as_table(data)
|
table = as_table(data)
|
||||||
rows = table.split('\n')
|
rows = table.split('\n')
|
||||||
|
|
||||||
# these are the header rows of the table
|
# these are the header rows of the table
|
||||||
|
|
|
||||||
|
|
@ -2,10 +2,10 @@ import time
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
from archinstall.lib.log import debug, info
|
||||||
from archinstall.lib.models import MirrorRegion
|
from archinstall.lib.models import MirrorRegion
|
||||||
from archinstall.lib.models.mirrors import MirrorStatusEntryV3, MirrorStatusListV3
|
from archinstall.lib.models.mirrors import MirrorStatusEntryV3, MirrorStatusListV3
|
||||||
from archinstall.lib.networking import fetch_data_from_url
|
from archinstall.lib.networking import fetch_data_from_url
|
||||||
from archinstall.lib.output import debug, info
|
|
||||||
from archinstall.lib.pathnames import MIRRORLIST
|
from archinstall.lib.pathnames import MIRRORLIST
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@ from archinstall.lib.models.mirrors import (
|
||||||
SignOption,
|
SignOption,
|
||||||
)
|
)
|
||||||
from archinstall.lib.models.packages import Repository
|
from archinstall.lib.models.packages import Repository
|
||||||
from archinstall.lib.output import FormattedOutput
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
from archinstall.lib.utils.format import as_table
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
from archinstall.tui.result import ResultType
|
from archinstall.tui.result import ResultType
|
||||||
|
|
||||||
|
|
@ -281,7 +281,7 @@ class MirrorMenu(AbstractSubMenu[MirrorConfiguration]):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
custom_mirrors: list[CustomRepository] = item.value
|
custom_mirrors: list[CustomRepository] = item.value
|
||||||
output = FormattedOutput.as_table(custom_mirrors)
|
output = as_table(custom_mirrors)
|
||||||
return output.strip()
|
return output.strip()
|
||||||
|
|
||||||
def _prev_custom_servers(self, item: MenuItem) -> str | None:
|
def _prev_custom_servers(self, item: MenuItem) -> str | None:
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ from dataclasses import dataclass
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Any, Self, override
|
from typing import Any, Self, override
|
||||||
|
|
||||||
|
from archinstall.lib.log import warn
|
||||||
from archinstall.lib.models.config import SubConfig
|
from archinstall.lib.models.config import SubConfig
|
||||||
from archinstall.lib.output import warn
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,9 @@ from parted import Disk, Geometry, Partition
|
||||||
from pydantic import BaseModel, Field, ValidationInfo, field_serializer, field_validator
|
from pydantic import BaseModel, Field, ValidationInfo, field_serializer, field_validator
|
||||||
|
|
||||||
from archinstall.lib.hardware import SysInfo
|
from archinstall.lib.hardware import SysInfo
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.models.config import SubConfig
|
from archinstall.lib.models.config import SubConfig
|
||||||
from archinstall.lib.models.users import Password
|
from archinstall.lib.models.users import Password
|
||||||
from archinstall.lib.output import debug
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
|
||||||
ENC_IDENTIFIER = 'ainst'
|
ENC_IDENTIFIER = 'ainst'
|
||||||
|
|
|
||||||
|
|
@ -9,10 +9,10 @@ from typing import TYPE_CHECKING, Any, Self, TypedDict, override
|
||||||
|
|
||||||
from pydantic import BaseModel, ValidationInfo, field_validator, model_validator
|
from pydantic import BaseModel, ValidationInfo, field_validator, model_validator
|
||||||
|
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.models.config import SubConfig
|
from archinstall.lib.models.config import SubConfig
|
||||||
from archinstall.lib.models.packages import Repository
|
from archinstall.lib.models.packages import Repository
|
||||||
from archinstall.lib.networking import DownloadTimer, ping
|
from archinstall.lib.networking import DownloadTimer, ping
|
||||||
from archinstall.lib.output import debug
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,8 @@ from dataclasses import dataclass, field
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import NotRequired, Self, TypedDict, override
|
from typing import NotRequired, Self, TypedDict, override
|
||||||
|
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.models.config import SubConfig
|
from archinstall.lib.models.config import SubConfig
|
||||||
from archinstall.lib.output import debug
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,9 @@ from typing import assert_never, override
|
||||||
|
|
||||||
from archinstall.lib.command import SysCommand
|
from archinstall.lib.command import SysCommand
|
||||||
from archinstall.lib.exceptions import SysCallError
|
from archinstall.lib.exceptions import SysCallError
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.models.network import WifiConfiguredNetwork, WifiNetwork
|
from archinstall.lib.models.network import WifiConfiguredNetwork, WifiNetwork
|
||||||
from archinstall.lib.network.wpa_supplicant import WpaSupplicantConfig
|
from archinstall.lib.network.wpa_supplicant import WpaSupplicantConfig
|
||||||
from archinstall.lib.output import debug
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
from archinstall.tui.components import ConfirmationScreen, InputScreen, InstanceRunnable, LoadingScreen, NotifyScreen, TableSelectionScreen, tui
|
from archinstall.tui.components import ConfirmationScreen, InputScreen, InstanceRunnable, LoadingScreen, NotifyScreen, TableSelectionScreen, tui
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.models.network import WifiNetwork
|
from archinstall.lib.models.network import WifiNetwork
|
||||||
from archinstall.lib.output import debug
|
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ from urllib.parse import urlencode
|
||||||
from urllib.request import urlopen
|
from urllib.request import urlopen
|
||||||
|
|
||||||
from archinstall.lib.exceptions import DownloadTimeout, SysCallError
|
from archinstall.lib.exceptions import DownloadTimeout, SysCallError
|
||||||
from archinstall.lib.output import debug, error, info
|
from archinstall.lib.log import debug, error, info
|
||||||
from archinstall.lib.pacman.pacman import Pacman
|
from archinstall.lib.pacman.pacman import Pacman
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,9 @@
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
|
|
||||||
from archinstall.lib.exceptions import SysCallError
|
from archinstall.lib.exceptions import SysCallError
|
||||||
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.menu.helpers import Loading, Notify, Selection
|
from archinstall.lib.menu.helpers import Loading, Notify, Selection
|
||||||
from archinstall.lib.models.packages import AvailablePackage, LocalPackage, PackageGroup, Repository
|
from archinstall.lib.models.packages import AvailablePackage, LocalPackage, PackageGroup, Repository
|
||||||
from archinstall.lib.output import debug
|
|
||||||
from archinstall.lib.pacman.pacman import Pacman
|
from archinstall.lib.pacman.pacman import Pacman
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
from functools import lru_cache
|
from functools import lru_cache
|
||||||
|
|
||||||
from archinstall.lib.output import debug
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.packages.packages import check_package_upgrade
|
from archinstall.lib.packages.packages import check_package_upgrade
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ from pathlib import Path
|
||||||
|
|
||||||
from archinstall.lib.command import SysCommand
|
from archinstall.lib.command import SysCommand
|
||||||
from archinstall.lib.exceptions import RequirementError
|
from archinstall.lib.exceptions import RequirementError
|
||||||
from archinstall.lib.output import error, info, warn
|
from archinstall.lib.log import error, info, warn
|
||||||
from archinstall.lib.pathnames import PACMAN_CONF
|
from archinstall.lib.pathnames import PACMAN_CONF
|
||||||
from archinstall.lib.plugins import plugins
|
from archinstall.lib.plugins import plugins
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ import urllib.request
|
||||||
from importlib import metadata
|
from importlib import metadata
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
from archinstall.lib.output import error, info, warn
|
from archinstall.lib.log import error, info, warn
|
||||||
from archinstall.lib.version import get_version
|
from archinstall.lib.version import get_version
|
||||||
|
|
||||||
plugins = {}
|
plugins = {}
|
||||||
|
|
|
||||||
|
|
@ -9,9 +9,9 @@ from typing import TYPE_CHECKING, NotRequired, TypedDict
|
||||||
|
|
||||||
from archinstall.default_profiles.profile import CustomSetting, GreeterType, Profile
|
from archinstall.default_profiles.profile import CustomSetting, GreeterType, Profile
|
||||||
from archinstall.lib.hardware import GfxDriver, GfxPackage
|
from archinstall.lib.hardware import GfxDriver, GfxPackage
|
||||||
|
from archinstall.lib.log import debug, error, info
|
||||||
from archinstall.lib.models.profile import ProfileConfiguration
|
from archinstall.lib.models.profile import ProfileConfiguration
|
||||||
from archinstall.lib.networking import fetch_data_from_url
|
from archinstall.lib.networking import fetch_data_from_url
|
||||||
from archinstall.lib.output import debug, error, info
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ from typing import override
|
||||||
|
|
||||||
from archinstall.lib.command import SysCommand
|
from archinstall.lib.command import SysCommand
|
||||||
from archinstall.lib.exceptions import SysCallError
|
from archinstall.lib.exceptions import SysCallError
|
||||||
from archinstall.lib.output import debug
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.utils.util import running_from_iso
|
from archinstall.lib.utils.util import running_from_iso
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,148 @@
|
||||||
|
from collections.abc import Callable
|
||||||
|
from dataclasses import asdict, is_dataclass
|
||||||
|
from typing import TYPE_CHECKING, Any
|
||||||
|
|
||||||
|
from archinstall.lib.utils.encoding import unicode_ljust, unicode_rjust
|
||||||
|
from archinstall.tui.rich import BaseRichTable
|
||||||
|
|
||||||
|
if TYPE_CHECKING:
|
||||||
|
from _typeshed import DataclassInstance
|
||||||
|
|
||||||
|
|
||||||
|
def as_key_value_pair(
|
||||||
|
entries: dict[str, str | list[str] | bool],
|
||||||
|
ignore_empty: bool = True,
|
||||||
|
) -> str:
|
||||||
|
"""
|
||||||
|
Formats key-values as a Rich Table:
|
||||||
|
key1 : value1
|
||||||
|
key2 : value2
|
||||||
|
...
|
||||||
|
"""
|
||||||
|
table = BaseRichTable()
|
||||||
|
table.add_column('key', style='bold', no_wrap=True)
|
||||||
|
table.add_column('value', style='white', max_width=70)
|
||||||
|
|
||||||
|
for label, value in entries.items():
|
||||||
|
if ignore_empty and not value:
|
||||||
|
continue
|
||||||
|
|
||||||
|
if isinstance(value, bool):
|
||||||
|
value = 'Yes' if value else 'No'
|
||||||
|
|
||||||
|
if isinstance(value, list):
|
||||||
|
value = '\n '.join(str(val) for val in value)
|
||||||
|
|
||||||
|
table.add_row(label.title(), f': {value}')
|
||||||
|
|
||||||
|
return table.stringify()
|
||||||
|
|
||||||
|
|
||||||
|
def as_columns(entries: list[str], cols: int) -> str:
|
||||||
|
"""
|
||||||
|
Will format a list into a given number of columns
|
||||||
|
"""
|
||||||
|
chunks: list[list[str]] = []
|
||||||
|
output = ''
|
||||||
|
|
||||||
|
for i in range(0, len(entries), cols):
|
||||||
|
chunks.append(entries[i : i + cols])
|
||||||
|
|
||||||
|
for row in chunks:
|
||||||
|
out_fmt = '{: <30} ' * len(row)
|
||||||
|
output += out_fmt.format(*row) + '\n'
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
||||||
|
|
||||||
|
def _get_values(
|
||||||
|
o: DataclassInstance,
|
||||||
|
class_formatter: str | Callable | None = None, # type: ignore[type-arg] # pyright: ignore[reportMissingTypeArgument]
|
||||||
|
filter_list: list[str] = [],
|
||||||
|
) -> dict[str, Any]:
|
||||||
|
"""
|
||||||
|
the original values returned a dataclass as dict thru the call to some specific methods
|
||||||
|
this version allows thru the parameter class_formatter to call a dynamically selected formatting method.
|
||||||
|
Can transmit a filter list to the class_formatter,
|
||||||
|
"""
|
||||||
|
if class_formatter:
|
||||||
|
# if invoked per reference it has to be a standard function or a classmethod.
|
||||||
|
# A method of an instance does not make sense
|
||||||
|
if callable(class_formatter):
|
||||||
|
return class_formatter(o, filter_list)
|
||||||
|
# if is invoked by name we restrict it to a method of the class. No need to mess more
|
||||||
|
elif hasattr(o, class_formatter) and callable(getattr(o, class_formatter)):
|
||||||
|
func = getattr(o, class_formatter)
|
||||||
|
return func(filter_list)
|
||||||
|
|
||||||
|
raise ValueError('Unsupported formatting call')
|
||||||
|
elif hasattr(o, 'table_data'):
|
||||||
|
return o.table_data()
|
||||||
|
elif hasattr(o, 'json'):
|
||||||
|
return o.json()
|
||||||
|
elif is_dataclass(o):
|
||||||
|
return asdict(o)
|
||||||
|
else:
|
||||||
|
return o.__dict__ # type: ignore[unreachable]
|
||||||
|
|
||||||
|
|
||||||
|
def as_table(
|
||||||
|
obj: list[Any],
|
||||||
|
class_formatter: str | Callable | None = None, # type: ignore[type-arg]
|
||||||
|
filter_list: list[str] = [],
|
||||||
|
capitalize: bool = False,
|
||||||
|
) -> str:
|
||||||
|
"""variant of as_table (subtly different code) which has two additional parameters
|
||||||
|
filter which is a list of fields which will be shown
|
||||||
|
class_formatter a special method to format the outgoing data
|
||||||
|
|
||||||
|
A general comment, the format selected for the output (a string where every data record is separated by newline)
|
||||||
|
is for compatibility with a print statement
|
||||||
|
As_table_filter can be a drop in replacement for as_table
|
||||||
|
"""
|
||||||
|
raw_data = [_get_values(o, class_formatter, filter_list) for o in obj]
|
||||||
|
|
||||||
|
# determine the maximum column size
|
||||||
|
column_width: dict[str, int] = {}
|
||||||
|
for o in raw_data:
|
||||||
|
for k, v in o.items():
|
||||||
|
if not filter_list or k in filter_list:
|
||||||
|
column_width.setdefault(k, 0)
|
||||||
|
column_width[k] = max([column_width[k], len(str(v)), len(k)])
|
||||||
|
|
||||||
|
if not filter_list:
|
||||||
|
filter_list = list(column_width.keys())
|
||||||
|
|
||||||
|
# create the header lines
|
||||||
|
output = ''
|
||||||
|
key_list = []
|
||||||
|
for key in filter_list:
|
||||||
|
width = column_width[key]
|
||||||
|
key = key.replace('!', '').replace('_', ' ')
|
||||||
|
|
||||||
|
if capitalize:
|
||||||
|
key = key.capitalize()
|
||||||
|
|
||||||
|
key_list.append(unicode_ljust(key, width))
|
||||||
|
|
||||||
|
output += ' | '.join(key_list) + '\n'
|
||||||
|
output += '-' * len(output) + '\n'
|
||||||
|
|
||||||
|
# create the data lines
|
||||||
|
for record in raw_data:
|
||||||
|
obj_data = []
|
||||||
|
for key in filter_list:
|
||||||
|
width = column_width.get(key, len(key))
|
||||||
|
value = record.get(key, '')
|
||||||
|
|
||||||
|
if '!' in key:
|
||||||
|
value = '*' * len(value)
|
||||||
|
|
||||||
|
if isinstance(value, (int, float)) or (isinstance(value, str) and value.isnumeric()):
|
||||||
|
obj_data.append(unicode_rjust(str(value), width))
|
||||||
|
else:
|
||||||
|
obj_data.append(unicode_ljust(str(value), width))
|
||||||
|
|
||||||
|
output += ' | '.join(obj_data) + '\n'
|
||||||
|
|
||||||
|
return output
|
||||||
|
|
@ -1,8 +1,14 @@
|
||||||
import secrets
|
import secrets
|
||||||
import string
|
import string
|
||||||
|
from datetime import UTC, datetime
|
||||||
|
|
||||||
from archinstall.lib.output import FormattedOutput
|
|
||||||
from archinstall.lib.pathnames import ARCHISO_MOUNTPOINT
|
from archinstall.lib.pathnames import ARCHISO_MOUNTPOINT
|
||||||
|
from archinstall.lib.utils.format import as_columns
|
||||||
|
|
||||||
|
|
||||||
|
def timestamp() -> str:
|
||||||
|
now = datetime.now(tz=UTC)
|
||||||
|
return now.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
|
|
||||||
def running_from_iso() -> bool:
|
def running_from_iso() -> bool:
|
||||||
|
|
@ -36,7 +42,7 @@ def format_cols(items: list[str], header: str | None = None) -> str:
|
||||||
else:
|
else:
|
||||||
col = 4
|
col = 4
|
||||||
|
|
||||||
text += FormattedOutput.as_columns(items, col)
|
text += as_columns(items, col)
|
||||||
# remove whitespaces on each row
|
# remove whitespaces on each row
|
||||||
text = '\n'.join(t.strip() for t in text.split('\n'))
|
text = '\n'.join(t.strip() for t in text.split('\n'))
|
||||||
return text
|
return text
|
||||||
|
|
|
||||||
|
|
@ -11,10 +11,10 @@ from pathlib import Path
|
||||||
from archinstall.lib.args import ArchConfigHandler, SubCommand
|
from archinstall.lib.args import ArchConfigHandler, SubCommand
|
||||||
from archinstall.lib.disk.utils import disk_layouts
|
from archinstall.lib.disk.utils import disk_layouts
|
||||||
from archinstall.lib.hardware import SysInfo
|
from archinstall.lib.hardware import SysInfo
|
||||||
|
from archinstall.lib.log import debug, error, info, logger, share_install_log, warn
|
||||||
from archinstall.lib.menu.helpers import Confirmation
|
from archinstall.lib.menu.helpers import Confirmation
|
||||||
from archinstall.lib.network.wifi_handler import WifiHandler
|
from archinstall.lib.network.wifi_handler import WifiHandler
|
||||||
from archinstall.lib.networking import ping
|
from archinstall.lib.networking import ping
|
||||||
from archinstall.lib.output import debug, error, info, logger, share_install_log, warn
|
|
||||||
from archinstall.lib.packages.util import check_version_upgrade
|
from archinstall.lib.packages.util import check_version_upgrade
|
||||||
from archinstall.lib.pacman.pacman import Pacman
|
from archinstall.lib.pacman.pacman import Pacman
|
||||||
from archinstall.lib.translationhandler import tr, translation_handler
|
from archinstall.lib.translationhandler import tr, translation_handler
|
||||||
|
|
|
||||||
|
|
@ -12,13 +12,13 @@ from archinstall.lib.disk.utils import disk_layouts
|
||||||
from archinstall.lib.general.general_menu import PostInstallationAction, select_post_installation
|
from archinstall.lib.general.general_menu import PostInstallationAction, select_post_installation
|
||||||
from archinstall.lib.global_menu import GlobalMenu
|
from archinstall.lib.global_menu import GlobalMenu
|
||||||
from archinstall.lib.installer import Installer, accessibility_tools_in_use, run_custom_user_commands
|
from archinstall.lib.installer import Installer, accessibility_tools_in_use, run_custom_user_commands
|
||||||
|
from archinstall.lib.log import debug, error, info
|
||||||
from archinstall.lib.menu.util import delayed_warning
|
from archinstall.lib.menu.util import delayed_warning
|
||||||
from archinstall.lib.mirror.mirror_handler import MirrorListHandler
|
from archinstall.lib.mirror.mirror_handler import MirrorListHandler
|
||||||
from archinstall.lib.models import Bootloader
|
from archinstall.lib.models import Bootloader
|
||||||
from archinstall.lib.models.device import DiskLayoutType, EncryptionType
|
from archinstall.lib.models.device import DiskLayoutType, EncryptionType
|
||||||
from archinstall.lib.models.users import User
|
from archinstall.lib.models.users import User
|
||||||
from archinstall.lib.network.network_handler import install_network_config
|
from archinstall.lib.network.network_handler import install_network_config
|
||||||
from archinstall.lib.output import debug, error, info
|
|
||||||
from archinstall.lib.packages.util import check_version_upgrade
|
from archinstall.lib.packages.util import check_version_upgrade
|
||||||
from archinstall.lib.profile.profiles_handler import profile_handler
|
from archinstall.lib.profile.profiles_handler import profile_handler
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,12 @@ from archinstall.lib.configuration import ConfigurationOutput
|
||||||
from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu
|
from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu
|
||||||
from archinstall.lib.disk.filesystem import FilesystemHandler
|
from archinstall.lib.disk.filesystem import FilesystemHandler
|
||||||
from archinstall.lib.installer import Installer
|
from archinstall.lib.installer import Installer
|
||||||
|
from archinstall.lib.log import debug, error, info
|
||||||
from archinstall.lib.menu.util import delayed_warning
|
from archinstall.lib.menu.util import delayed_warning
|
||||||
from archinstall.lib.models import Bootloader
|
from archinstall.lib.models import Bootloader
|
||||||
from archinstall.lib.models.profile import ProfileConfiguration
|
from archinstall.lib.models.profile import ProfileConfiguration
|
||||||
from archinstall.lib.models.users import Password, User
|
from archinstall.lib.models.users import Password, User
|
||||||
from archinstall.lib.network.network_handler import install_network_config
|
from archinstall.lib.network.network_handler import install_network_config
|
||||||
from archinstall.lib.output import debug, error, info
|
|
||||||
from archinstall.lib.profile.profiles_handler import profile_handler
|
from archinstall.lib.profile.profiles_handler import profile_handler
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
from archinstall.tui.components import tui
|
from archinstall.tui.components import tui
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@ from archinstall.lib.disk.filesystem import FilesystemHandler
|
||||||
from archinstall.lib.disk.utils import disk_layouts
|
from archinstall.lib.disk.utils import disk_layouts
|
||||||
from archinstall.lib.global_menu import GlobalMenu
|
from archinstall.lib.global_menu import GlobalMenu
|
||||||
from archinstall.lib.installer import Installer
|
from archinstall.lib.installer import Installer
|
||||||
|
from archinstall.lib.log import debug, error
|
||||||
from archinstall.lib.menu.util import delayed_warning
|
from archinstall.lib.menu.util import delayed_warning
|
||||||
from archinstall.lib.output import debug, error
|
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
from archinstall.tui.components import tui
|
from archinstall.tui.components import tui
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ from textual.widgets.option_list import Option
|
||||||
from textual.widgets.selection_list import Selection
|
from textual.widgets.selection_list import Selection
|
||||||
from textual.worker import WorkerCancelled
|
from textual.worker import WorkerCancelled
|
||||||
|
|
||||||
from archinstall.lib.output import debug
|
from archinstall.lib.log import debug
|
||||||
from archinstall.lib.translationhandler import tr
|
from archinstall.lib.translationhandler import tr
|
||||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||||
from archinstall.tui.result import Result, ResultType
|
from archinstall.tui.result import Result, ResultType
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import pytest
|
||||||
from hypothesis import HealthCheck, given, settings
|
from hypothesis import HealthCheck, given, settings
|
||||||
from hypothesis import strategies as st
|
from hypothesis import strategies as st
|
||||||
|
|
||||||
from archinstall.lib.output import share_install_log
|
from archinstall.lib.log import share_install_log
|
||||||
|
|
||||||
urls = st.builds(
|
urls = st.builds(
|
||||||
'{}://{}.{}/{}'.format,
|
'{}://{}.{}/{}'.format,
|
||||||
|
|
@ -55,7 +55,7 @@ def test_file_not_found(
|
||||||
) -> None:
|
) -> None:
|
||||||
missing_log = tmp_path / sub_path / 'install.log'
|
missing_log = tmp_path / sub_path / 'install.log'
|
||||||
|
|
||||||
with patch('archinstall.lib.output.logger._path', new=missing_log):
|
with patch('archinstall.lib.log.logger._path', new=missing_log):
|
||||||
assert share_install_log(paste_url, max_byte) is None
|
assert share_install_log(paste_url, max_byte) is None
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -64,8 +64,8 @@ def test_file_not_found(
|
||||||
def test_empty_file(log_file: Path, paste_url: str, max_byte: int | None) -> None:
|
def test_empty_file(log_file: Path, paste_url: str, max_byte: int | None) -> None:
|
||||||
log_file.write_bytes(b'')
|
log_file.write_bytes(b'')
|
||||||
|
|
||||||
with patch('archinstall.lib.output.logger._path', new=log_file.parent):
|
with patch('archinstall.lib.log.logger._path', new=log_file.parent):
|
||||||
# with patch('archinstall.lib.output.logger', _fake_logger(log_file)):
|
# with patch('archinstall.lib.log.logger', _fake_logger(log_file)):
|
||||||
assert share_install_log(paste_url, max_byte) is None
|
assert share_install_log(paste_url, max_byte) is None
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -76,7 +76,7 @@ def test_successful_upload(log_file: Path, resp_url: str, paste_url: str, max_by
|
||||||
fake_response = BytesIO(resp_url.encode())
|
fake_response = BytesIO(resp_url.encode())
|
||||||
|
|
||||||
with (
|
with (
|
||||||
patch('archinstall.lib.output.logger._path', new=log_file.parent),
|
patch('archinstall.lib.log.logger._path', new=log_file.parent),
|
||||||
patch('urllib.request.urlopen', return_value=fake_response),
|
patch('urllib.request.urlopen', return_value=fake_response),
|
||||||
):
|
):
|
||||||
result = share_install_log(paste_url, max_byte)
|
result = share_install_log(paste_url, max_byte)
|
||||||
|
|
@ -93,7 +93,7 @@ def test_truncation(log_file: Path, resp_url: str, paste_url: str, max_byte: int
|
||||||
exptected_byte = len(content) if max_byte is None else max_byte
|
exptected_byte = len(content) if max_byte is None else max_byte
|
||||||
|
|
||||||
with (
|
with (
|
||||||
patch('archinstall.lib.output.logger._path', new=log_file.parent),
|
patch('archinstall.lib.log.logger._path', new=log_file.parent),
|
||||||
patch('urllib.request.urlopen', return_value=fake_response) as mock_open,
|
patch('urllib.request.urlopen', return_value=fake_response) as mock_open,
|
||||||
):
|
):
|
||||||
_ = share_install_log(paste_url, max_byte)
|
_ = share_install_log(paste_url, max_byte)
|
||||||
|
|
@ -108,7 +108,7 @@ def test_network_error(log_file: Path, paste_url: str, max_byte: int | None) ->
|
||||||
log_file.write_text('some log content')
|
log_file.write_text('some log content')
|
||||||
|
|
||||||
with (
|
with (
|
||||||
patch('archinstall.lib.output.logger._path', new=log_file.parent),
|
patch('archinstall.lib.log.logger._path', new=log_file.parent),
|
||||||
patch('urllib.request.urlopen', side_effect=urllib.error.URLError('no network')),
|
patch('urllib.request.urlopen', side_effect=urllib.error.URLError('no network')),
|
||||||
):
|
):
|
||||||
assert share_install_log(paste_url, max_byte) is None
|
assert share_install_log(paste_url, max_byte) is None
|
||||||
|
|
@ -121,7 +121,7 @@ def test_unexpected_response(log_file: Path, paste_url: str, max_byte: int | Non
|
||||||
fake_response = BytesIO(b'ERROR: something went wrong')
|
fake_response = BytesIO(b'ERROR: something went wrong')
|
||||||
|
|
||||||
with (
|
with (
|
||||||
patch('archinstall.lib.output.logger._path', new=log_file.parent),
|
patch('archinstall.lib.log.logger._path', new=log_file.parent),
|
||||||
patch('urllib.request.urlopen', return_value=fake_response),
|
patch('urllib.request.urlopen', return_value=fake_response),
|
||||||
):
|
):
|
||||||
assert share_install_log(paste_url, max_byte) is None
|
assert share_install_log(paste_url, max_byte) is None
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue