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 archinstall.lib.hardware import SysInfo
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.models.application import Audio, AudioConfiguration
|
||||
from archinstall.lib.models.users import User
|
||||
from archinstall.lib.output import debug
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from archinstall.lib.installer import Installer
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
from typing import TYPE_CHECKING
|
||||
|
||||
from archinstall.lib.output import debug
|
||||
from archinstall.lib.log import debug
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from archinstall.lib.installer import Installer
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
from typing import TYPE_CHECKING
|
||||
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.models.application import Firewall, FirewallConfiguration
|
||||
from archinstall.lib.output import debug
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from archinstall.lib.installer import Installer
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
from typing import TYPE_CHECKING
|
||||
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.models.application import FontsConfiguration
|
||||
from archinstall.lib.output import debug
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from archinstall.lib.installer import Installer
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
from typing import TYPE_CHECKING
|
||||
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.models.application import PowerManagement, PowerManagementConfiguration
|
||||
from archinstall.lib.output import debug
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from archinstall.lib.installer import Installer
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
from typing import TYPE_CHECKING
|
||||
|
||||
from archinstall.lib.output import debug
|
||||
from archinstall.lib.log import debug
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from archinstall.lib.installer import Installer
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
from typing import TYPE_CHECKING, Self, override
|
||||
|
||||
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.output import info
|
||||
from archinstall.lib.profile.profiles_handler import profile_handler
|
||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||
from archinstall.tui.result import ResultType
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
from typing import TYPE_CHECKING, Self, override
|
||||
|
||||
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.output import info
|
||||
from archinstall.lib.profile.profiles_handler import profile_handler
|
||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||
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 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.models.application import ApplicationConfiguration, ZramConfiguration
|
||||
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.profile import ProfileConfiguration
|
||||
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.translationhandler import Language, tr, translation_handler
|
||||
from archinstall.lib.version import get_version
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@ from pathlib import Path
|
|||
from typing import TYPE_CHECKING
|
||||
|
||||
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.users import User
|
||||
from archinstall.lib.output import debug, info
|
||||
from archinstall.lib.translationhandler import tr
|
||||
|
||||
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.models.authentication import AuthenticationConfiguration, U2FLoginConfiguration, U2FLoginMethod
|
||||
from archinstall.lib.models.users import Password, User
|
||||
from archinstall.lib.output import FormattedOutput
|
||||
from archinstall.lib.translationhandler import tr
|
||||
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.result import ResultType
|
||||
|
||||
|
|
@ -65,7 +65,7 @@ class AuthenticationMenu(AbstractSubMenu[AuthenticationConfiguration]):
|
|||
users: list[User] | None = item.value
|
||||
|
||||
if users:
|
||||
return FormattedOutput.as_table(users)
|
||||
return as_table(users)
|
||||
return 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.exceptions import SysCallError
|
||||
from archinstall.lib.output import error
|
||||
from archinstall.lib.log import error
|
||||
|
||||
|
||||
class Boot:
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ from types import TracebackType
|
|||
from typing import Any, Self, override
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -8,11 +8,12 @@ from pydantic import TypeAdapter
|
|||
|
||||
from archinstall.lib.args import ArchConfig, ArchConfigType
|
||||
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.util import get_password, prompt_dir
|
||||
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.utils.format import as_key_value_pair
|
||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||
from archinstall.tui.result import ResultType
|
||||
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ from pathlib import Path
|
|||
from cryptography.fernet import Fernet, InvalidToken
|
||||
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')
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ from archinstall.lib.disk.utils import (
|
|||
umount,
|
||||
)
|
||||
from archinstall.lib.exceptions import DiskError, SysCallError, UnknownFilesystemFormat
|
||||
from archinstall.lib.log import debug, error, info, log
|
||||
from archinstall.lib.models.device import (
|
||||
DEFAULT_ITER_TIME,
|
||||
BDevice,
|
||||
|
|
@ -35,7 +36,6 @@ from archinstall.lib.models.device import (
|
|||
_PartitionInfo,
|
||||
)
|
||||
from archinstall.lib.models.users import Password
|
||||
from archinstall.lib.output import debug, error, info, log
|
||||
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.encryption_menu import DiskEncryptionMenu
|
||||
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.helpers import Confirmation, Notify, Selection, Table
|
||||
from archinstall.lib.menu.util import prompt_dir
|
||||
|
|
@ -35,8 +36,8 @@ from archinstall.lib.models.device import (
|
|||
Unit,
|
||||
_DeviceInfo,
|
||||
)
|
||||
from archinstall.lib.output import FormattedOutput, debug
|
||||
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.result import ResultType
|
||||
|
||||
|
|
@ -221,7 +222,7 @@ class DiskLayoutConfigurationMenu(AbstractSubMenu[DiskMenuConfig]):
|
|||
|
||||
for mod in device_mods:
|
||||
# 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 += '{}: {}\n'.format(tr('Wipe'), mod.wipe)
|
||||
|
|
@ -230,7 +231,7 @@ class DiskLayoutConfigurationMenu(AbstractSubMenu[DiskMenuConfig]):
|
|||
# create btrfs table
|
||||
btrfs_partitions = [p for p in mod.partitions if p.btrfs_subvols]
|
||||
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
|
||||
return output.rstrip()
|
||||
|
|
@ -246,12 +247,12 @@ class DiskLayoutConfigurationMenu(AbstractSubMenu[DiskMenuConfig]):
|
|||
output = '{}: {}\n'.format(tr('Configuration'), lvm_config.config_type.display_msg())
|
||||
|
||||
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 += 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)
|
||||
|
||||
return output
|
||||
|
|
@ -302,7 +303,7 @@ async def select_devices(preset: list[BDevice] | None = []) -> list[BDevice] | N
|
|||
dev = device_handler.get_device(device.path)
|
||||
|
||||
if dev and dev.partition_infos:
|
||||
return FormattedOutput.as_table(dev.partition_infos)
|
||||
return as_table(dev.partition_infos)
|
||||
return None
|
||||
|
||||
if preset is None:
|
||||
|
|
|
|||
|
|
@ -17,8 +17,8 @@ from archinstall.lib.models.device import (
|
|||
PartitionModification,
|
||||
)
|
||||
from archinstall.lib.models.users import Password
|
||||
from archinstall.lib.output import FormattedOutput
|
||||
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.result import ResultType
|
||||
|
||||
|
|
@ -199,7 +199,7 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]):
|
|||
def _prev_partitions(self, item: MenuItem) -> str | None:
|
||||
if item.value:
|
||||
output = tr('Partitions to be encrypted') + '\n'
|
||||
output += FormattedOutput.as_table(item.value)
|
||||
output += as_table(item.value)
|
||||
return output.rstrip()
|
||||
|
||||
return None
|
||||
|
|
@ -207,7 +207,7 @@ class DiskEncryptionMenu(AbstractSubMenu[DiskEncryption]):
|
|||
def _prev_lvm_vols(self, item: MenuItem) -> str | None:
|
||||
if item.value:
|
||||
output = tr('LVM volumes to be encrypted') + '\n'
|
||||
output += FormattedOutput.as_table(item.value)
|
||||
output += as_table(item.value)
|
||||
return output.rstrip()
|
||||
|
||||
return None
|
||||
|
|
|
|||
|
|
@ -4,9 +4,9 @@ from typing import ClassVar
|
|||
|
||||
from archinstall.lib.command import SysCommand, SysCommandWorker
|
||||
from archinstall.lib.exceptions import SysCallError
|
||||
from archinstall.lib.log import error, info
|
||||
from archinstall.lib.models.device import Fido2Device
|
||||
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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ from archinstall.lib.disk.lvm import (
|
|||
lvm_vol_reduce,
|
||||
)
|
||||
from archinstall.lib.disk.utils import udev_sync
|
||||
from archinstall.lib.log import debug, info
|
||||
from archinstall.lib.models.device import (
|
||||
DiskEncryption,
|
||||
DiskLayoutConfiguration,
|
||||
|
|
@ -27,7 +28,6 @@ from archinstall.lib.models.device import (
|
|||
Size,
|
||||
Unit,
|
||||
)
|
||||
from archinstall.lib.output import debug, info
|
||||
|
||||
|
||||
class FilesystemHandler:
|
||||
|
|
|
|||
|
|
@ -7,9 +7,9 @@ from types import TracebackType
|
|||
from archinstall.lib.command import SysCommand, SysCommandWorker, run
|
||||
from archinstall.lib.disk.utils import get_lsblk_info, umount
|
||||
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.users import Password
|
||||
from archinstall.lib.output import debug, info
|
||||
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.disk.utils import udev_sync
|
||||
from archinstall.lib.exceptions import SysCallError
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.models.device import (
|
||||
LvmGroupInfo,
|
||||
LvmPVInfo,
|
||||
|
|
@ -17,7 +18,6 @@ from archinstall.lib.models.device import (
|
|||
Size,
|
||||
Unit,
|
||||
)
|
||||
from archinstall.lib.output import debug
|
||||
|
||||
|
||||
def _lvm_info(
|
||||
|
|
|
|||
|
|
@ -19,8 +19,8 @@ from archinstall.lib.models.device import (
|
|||
Size,
|
||||
Unit,
|
||||
)
|
||||
from archinstall.lib.output import FormattedOutput
|
||||
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.result import ResultType
|
||||
|
||||
|
|
@ -479,7 +479,7 @@ class PartitioningList(ListManager[DiskSegment]):
|
|||
sector_size = device_info.sector_size
|
||||
|
||||
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'
|
||||
|
||||
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.exceptions import DiskError, SysCallError
|
||||
from archinstall.lib.log import debug, info, warn
|
||||
from archinstall.lib.models.device import LsblkInfo
|
||||
from archinstall.lib.output import debug, info, warn
|
||||
|
||||
|
||||
class LsblkOutput(BaseModel):
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
from enum import Enum
|
||||
|
||||
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.output import warn
|
||||
from archinstall.lib.translationhandler import Language, tr
|
||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||
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.profile import ProfileConfiguration
|
||||
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.pacman.config import PacmanConfig
|
||||
from archinstall.lib.pacman.pacman_menu import PacmanMenu
|
||||
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.menu_item import MenuItem, MenuItemGroup
|
||||
|
||||
|
|
@ -299,7 +299,7 @@ class GlobalMenu(AbstractMenu[None]):
|
|||
if item.value:
|
||||
network_config: NetworkConfiguration = item.value
|
||||
if network_config.type == NicType.MANUAL:
|
||||
output = FormattedOutput.as_table(network_config.nics)
|
||||
output = as_table(network_config.nics)
|
||||
else:
|
||||
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'
|
||||
|
||||
if auth_config.users:
|
||||
output += FormattedOutput.as_table(auth_config.users) + '\n'
|
||||
output += as_table(auth_config.users) + '\n'
|
||||
|
||||
if auth_config.u2f_config:
|
||||
u2f_config = auth_config.u2f_config
|
||||
|
|
@ -612,7 +612,7 @@ class GlobalMenu(AbstractMenu[None]):
|
|||
|
||||
if mirror_config.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}'
|
||||
|
||||
return output.strip()
|
||||
|
|
|
|||
|
|
@ -6,8 +6,8 @@ from typing import Self
|
|||
|
||||
from archinstall.lib.command import SysCommand
|
||||
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.output import debug
|
||||
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.linux_path import LPath
|
||||
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.models.application import ZramAlgorithm
|
||||
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.pacman import PacmanConfiguration
|
||||
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.pacman.config import PacmanConfig
|
||||
from archinstall.lib.pacman.pacman import Pacman
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ from pathlib import Path
|
|||
|
||||
from archinstall.lib.command import SysCommand
|
||||
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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3,183 +3,18 @@ import os
|
|||
import sys
|
||||
import urllib.error
|
||||
import urllib.request
|
||||
from collections.abc import Callable
|
||||
from dataclasses import asdict, is_dataclass
|
||||
from datetime import UTC, datetime
|
||||
from enum import Enum
|
||||
from pathlib import Path
|
||||
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
|
||||
|
||||
|
||||
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)
|
||||
from archinstall.lib.utils.util import timestamp
|
||||
|
||||
|
||||
class Logger:
|
||||
def __init__(self, path: Path = Path('/var/log/archinstall')) -> None:
|
||||
self._path = path
|
||||
def __init__(self, path: Path | None = None) -> None:
|
||||
if path is None:
|
||||
path = Path('/var/log/archinstall')
|
||||
|
||||
self._path: Path = path
|
||||
|
||||
@property
|
||||
def path(self) -> Path:
|
||||
|
|
@ -212,7 +47,7 @@ class Logger:
|
|||
self._check_permissions()
|
||||
|
||||
with self.path.open('a') as f:
|
||||
ts = _timestamp()
|
||||
ts = timestamp()
|
||||
level_name = logging.getLevelName(level)
|
||||
f.write(f'[{ts}] - {level_name} - {content}\n')
|
||||
|
||||
|
|
@ -310,9 +145,20 @@ def _stylize_output(
|
|||
return f'\033[{ansi}m{text}\033[0m'
|
||||
|
||||
|
||||
def _timestamp() -> str:
|
||||
now = datetime.now(tz=UTC)
|
||||
return now.strftime('%Y-%m-%d %H:%M:%S')
|
||||
def journal_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)
|
||||
|
||||
|
||||
def info(
|
||||
|
|
@ -376,7 +222,7 @@ def log(
|
|||
if _supports_color():
|
||||
text = _stylize_output(text, fg, bg, reset, font)
|
||||
|
||||
Journald.log(text, level=level)
|
||||
journal_log(text, level=level)
|
||||
|
||||
if level != logging.DEBUG:
|
||||
print(text)
|
||||
|
|
@ -2,8 +2,8 @@ from enum import Enum
|
|||
from types import TracebackType
|
||||
from typing import Any, Self, override
|
||||
|
||||
from archinstall.lib.log import error
|
||||
from archinstall.lib.menu.helpers import Selection
|
||||
from archinstall.lib.output import error
|
||||
from archinstall.lib.translationhandler import tr
|
||||
from archinstall.tui.components import InstanceRunnable
|
||||
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
|
||||
|
||||
|
||||
|
|
@ -32,7 +32,7 @@ class MenuHelper[ValueT]:
|
|||
display_data: dict[str, ValueT | str | None] = {}
|
||||
|
||||
if data:
|
||||
table = FormattedOutput.as_table(data)
|
||||
table = as_table(data)
|
||||
rows = table.split('\n')
|
||||
|
||||
# these are the header rows of the table
|
||||
|
|
|
|||
|
|
@ -2,10 +2,10 @@ import time
|
|||
import urllib.parse
|
||||
from pathlib import Path
|
||||
|
||||
from archinstall.lib.log import debug, info
|
||||
from archinstall.lib.models import MirrorRegion
|
||||
from archinstall.lib.models.mirrors import MirrorStatusEntryV3, MirrorStatusListV3
|
||||
from archinstall.lib.networking import fetch_data_from_url
|
||||
from archinstall.lib.output import debug, info
|
||||
from archinstall.lib.pathnames import MIRRORLIST
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -13,8 +13,8 @@ from archinstall.lib.models.mirrors import (
|
|||
SignOption,
|
||||
)
|
||||
from archinstall.lib.models.packages import Repository
|
||||
from archinstall.lib.output import FormattedOutput
|
||||
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.result import ResultType
|
||||
|
||||
|
|
@ -281,7 +281,7 @@ class MirrorMenu(AbstractSubMenu[MirrorConfiguration]):
|
|||
return None
|
||||
|
||||
custom_mirrors: list[CustomRepository] = item.value
|
||||
output = FormattedOutput.as_table(custom_mirrors)
|
||||
output = as_table(custom_mirrors)
|
||||
return output.strip()
|
||||
|
||||
def _prev_custom_servers(self, item: MenuItem) -> str | None:
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ from dataclasses import dataclass
|
|||
from enum import Enum
|
||||
from typing import Any, Self, override
|
||||
|
||||
from archinstall.lib.log import warn
|
||||
from archinstall.lib.models.config import SubConfig
|
||||
from archinstall.lib.output import warn
|
||||
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 archinstall.lib.hardware import SysInfo
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.models.config import SubConfig
|
||||
from archinstall.lib.models.users import Password
|
||||
from archinstall.lib.output import debug
|
||||
from archinstall.lib.translationhandler import tr
|
||||
|
||||
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 archinstall.lib.log import debug
|
||||
from archinstall.lib.models.config import SubConfig
|
||||
from archinstall.lib.models.packages import Repository
|
||||
from archinstall.lib.networking import DownloadTimer, ping
|
||||
from archinstall.lib.output import debug
|
||||
from archinstall.lib.translationhandler import tr
|
||||
|
||||
if TYPE_CHECKING:
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ from dataclasses import dataclass, field
|
|||
from enum import Enum
|
||||
from typing import NotRequired, Self, TypedDict, override
|
||||
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.models.config import SubConfig
|
||||
from archinstall.lib.output import debug
|
||||
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.exceptions import SysCallError
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.models.network import WifiConfiguredNetwork, WifiNetwork
|
||||
from archinstall.lib.network.wpa_supplicant import WpaSupplicantConfig
|
||||
from archinstall.lib.output import debug
|
||||
from archinstall.lib.translationhandler import tr
|
||||
from archinstall.tui.components import ConfirmationScreen, InputScreen, InstanceRunnable, LoadingScreen, NotifyScreen, TableSelectionScreen, tui
|
||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
from dataclasses import dataclass, field
|
||||
from pathlib import Path
|
||||
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.models.network import WifiNetwork
|
||||
from archinstall.lib.output import debug
|
||||
|
||||
|
||||
@dataclass
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ from urllib.parse import urlencode
|
|||
from urllib.request import urlopen
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,9 +1,9 @@
|
|||
from functools import lru_cache
|
||||
|
||||
from archinstall.lib.exceptions import SysCallError
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.menu.helpers import Loading, Notify, Selection
|
||||
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.translationhandler import tr
|
||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ from pathlib import Path
|
|||
|
||||
from archinstall.lib.command import SysCommand
|
||||
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.plugins import plugins
|
||||
from archinstall.lib.translationhandler import tr
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import urllib.request
|
|||
from importlib import metadata
|
||||
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
|
||||
|
||||
plugins = {}
|
||||
|
|
|
|||
|
|
@ -9,9 +9,9 @@ from typing import TYPE_CHECKING, NotRequired, TypedDict
|
|||
|
||||
from archinstall.default_profiles.profile import CustomSetting, GreeterType, Profile
|
||||
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.networking import fetch_data_from_url
|
||||
from archinstall.lib.output import debug, error, info
|
||||
from archinstall.lib.translationhandler import tr
|
||||
|
||||
if TYPE_CHECKING:
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ from typing import override
|
|||
|
||||
from archinstall.lib.command import SysCommand
|
||||
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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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 string
|
||||
from datetime import UTC, datetime
|
||||
|
||||
from archinstall.lib.output import FormattedOutput
|
||||
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:
|
||||
|
|
@ -36,7 +42,7 @@ def format_cols(items: list[str], header: str | None = None) -> str:
|
|||
else:
|
||||
col = 4
|
||||
|
||||
text += FormattedOutput.as_columns(items, col)
|
||||
text += as_columns(items, col)
|
||||
# remove whitespaces on each row
|
||||
text = '\n'.join(t.strip() for t in text.split('\n'))
|
||||
return text
|
||||
|
|
|
|||
|
|
@ -11,10 +11,10 @@ from pathlib import Path
|
|||
from archinstall.lib.args import ArchConfigHandler, SubCommand
|
||||
from archinstall.lib.disk.utils import disk_layouts
|
||||
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.network.wifi_handler import WifiHandler
|
||||
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.pacman.pacman import Pacman
|
||||
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.global_menu import GlobalMenu
|
||||
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.mirror.mirror_handler import MirrorListHandler
|
||||
from archinstall.lib.models import Bootloader
|
||||
from archinstall.lib.models.device import DiskLayoutType, EncryptionType
|
||||
from archinstall.lib.models.users import User
|
||||
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.profile.profiles_handler import profile_handler
|
||||
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.filesystem import FilesystemHandler
|
||||
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.models import Bootloader
|
||||
from archinstall.lib.models.profile import ProfileConfiguration
|
||||
from archinstall.lib.models.users import Password, User
|
||||
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.translationhandler import tr
|
||||
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.global_menu import GlobalMenu
|
||||
from archinstall.lib.installer import Installer
|
||||
from archinstall.lib.log import debug, error
|
||||
from archinstall.lib.menu.util import delayed_warning
|
||||
from archinstall.lib.output import debug, error
|
||||
from archinstall.lib.translationhandler import tr
|
||||
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.worker import WorkerCancelled
|
||||
|
||||
from archinstall.lib.output import debug
|
||||
from archinstall.lib.log import debug
|
||||
from archinstall.lib.translationhandler import tr
|
||||
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
|
||||
from archinstall.tui.result import Result, ResultType
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ import pytest
|
|||
from hypothesis import HealthCheck, given, settings
|
||||
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(
|
||||
'{}://{}.{}/{}'.format,
|
||||
|
|
@ -55,7 +55,7 @@ def test_file_not_found(
|
|||
) -> None:
|
||||
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
|
||||
|
||||
|
||||
|
|
@ -64,8 +64,8 @@ def test_file_not_found(
|
|||
def test_empty_file(log_file: Path, paste_url: str, max_byte: int | None) -> None:
|
||||
log_file.write_bytes(b'')
|
||||
|
||||
with patch('archinstall.lib.output.logger._path', new=log_file.parent):
|
||||
# with patch('archinstall.lib.output.logger', _fake_logger(log_file)):
|
||||
with patch('archinstall.lib.log.logger._path', new=log_file.parent):
|
||||
# with patch('archinstall.lib.log.logger', _fake_logger(log_file)):
|
||||
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())
|
||||
|
||||
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),
|
||||
):
|
||||
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
|
||||
|
||||
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,
|
||||
):
|
||||
_ = 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')
|
||||
|
||||
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')),
|
||||
):
|
||||
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')
|
||||
|
||||
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),
|
||||
):
|
||||
assert share_install_log(paste_url, max_byte) is None
|
||||
|
|
|
|||
Loading…
Reference in New Issue