diff --git a/archinstall/applications/audio.py b/archinstall/applications/audio.py index b749fe675d..e5d7971825 100644 --- a/archinstall/applications/audio.py +++ b/archinstall/applications/audio.py @@ -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 diff --git a/archinstall/applications/bluetooth.py b/archinstall/applications/bluetooth.py index a0ffbc75bc..6bd4999edc 100644 --- a/archinstall/applications/bluetooth.py +++ b/archinstall/applications/bluetooth.py @@ -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 diff --git a/archinstall/applications/firewall.py b/archinstall/applications/firewall.py index e450dbc6d7..dadaa05b16 100644 --- a/archinstall/applications/firewall.py +++ b/archinstall/applications/firewall.py @@ -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 diff --git a/archinstall/applications/fonts.py b/archinstall/applications/fonts.py index 3fa54c67d4..73eb326e07 100644 --- a/archinstall/applications/fonts.py +++ b/archinstall/applications/fonts.py @@ -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 diff --git a/archinstall/applications/power_management.py b/archinstall/applications/power_management.py index b9f32b05fa..744411f307 100644 --- a/archinstall/applications/power_management.py +++ b/archinstall/applications/power_management.py @@ -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 diff --git a/archinstall/applications/print_service.py b/archinstall/applications/print_service.py index 3e4913f042..fbe28f89d3 100644 --- a/archinstall/applications/print_service.py +++ b/archinstall/applications/print_service.py @@ -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 diff --git a/archinstall/default_profiles/desktop.py b/archinstall/default_profiles/desktop.py index daf70831cb..b70f9f11b2 100644 --- a/archinstall/default_profiles/desktop.py +++ b/archinstall/default_profiles/desktop.py @@ -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 diff --git a/archinstall/default_profiles/server.py b/archinstall/default_profiles/server.py index bdd3d0793c..0e2506e02e 100644 --- a/archinstall/default_profiles/server.py +++ b/archinstall/default_profiles/server.py @@ -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 diff --git a/archinstall/lib/args.py b/archinstall/lib/args.py index 14aff6c69c..e3729504dd 100644 --- a/archinstall/lib/args.py +++ b/archinstall/lib/args.py @@ -14,6 +14,7 @@ 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.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 diff --git a/archinstall/lib/authentication/authentication_handler.py b/archinstall/lib/authentication/authentication_handler.py index 3a3b8cd405..bae192fd25 100644 --- a/archinstall/lib/authentication/authentication_handler.py +++ b/archinstall/lib/authentication/authentication_handler.py @@ -3,9 +3,9 @@ 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: diff --git a/archinstall/lib/authentication/authentication_menu.py b/archinstall/lib/authentication/authentication_menu.py index 5453099fdd..497b925bdc 100644 --- a/archinstall/lib/authentication/authentication_menu.py +++ b/archinstall/lib/authentication/authentication_menu.py @@ -6,9 +6,9 @@ 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 @@ def _prev_users(self, item: MenuItem) -> str | None: 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: diff --git a/archinstall/lib/boot.py b/archinstall/lib/boot.py index b1e8c8882f..e8fa4c8865 100644 --- a/archinstall/lib/boot.py +++ b/archinstall/lib/boot.py @@ -6,7 +6,7 @@ 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: diff --git a/archinstall/lib/command.py b/archinstall/lib/command.py index b99854d2be..b0d45754d4 100644 --- a/archinstall/lib/command.py +++ b/archinstall/lib/command.py @@ -11,7 +11,7 @@ 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 diff --git a/archinstall/lib/configuration.py b/archinstall/lib/configuration.py index c40ef16166..f009687296 100644 --- a/archinstall/lib/configuration.py +++ b/archinstall/lib/configuration.py @@ -8,11 +8,12 @@ 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 diff --git a/archinstall/lib/crypt.py b/archinstall/lib/crypt.py index 99fa62d6ca..b7ad4edf49 100644 --- a/archinstall/lib/crypt.py +++ b/archinstall/lib/crypt.py @@ -6,7 +6,7 @@ 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') diff --git a/archinstall/lib/disk/device_handler.py b/archinstall/lib/disk/device_handler.py index 2e51d3d226..360cbfd16a 100644 --- a/archinstall/lib/disk/device_handler.py +++ b/archinstall/lib/disk/device_handler.py @@ -15,6 +15,7 @@ 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 @@ _PartitionInfo, ) from archinstall.lib.models.users import Password -from archinstall.lib.output import debug, error, info, log from archinstall.lib.pathnames import ARCHISO_MOUNTPOINT diff --git a/archinstall/lib/disk/disk_menu.py b/archinstall/lib/disk/disk_menu.py index 26aa145d38..f8e8e2e3f9 100644 --- a/archinstall/lib/disk/disk_menu.py +++ b/archinstall/lib/disk/disk_menu.py @@ -5,6 +5,7 @@ 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 @@ 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 @@ def _prev_disk_layouts(self, item: MenuItem) -> str | None: 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 @@ def _prev_disk_layouts(self, item: MenuItem) -> str | None: # 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 @@ def _prev_lvm_config(self, item: MenuItem) -> str | None: 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 @@ def _preview_device_selection(item: MenuItem) -> str | None: 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: diff --git a/archinstall/lib/disk/encryption_menu.py b/archinstall/lib/disk/encryption_menu.py index f5d4f0953f..53aa73fe37 100644 --- a/archinstall/lib/disk/encryption_menu.py +++ b/archinstall/lib/disk/encryption_menu.py @@ -17,8 +17,8 @@ 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 @@ def _prev_password(self, item: MenuItem) -> str | None: 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 @@ def _prev_partitions(self, item: MenuItem) -> str | None: 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 diff --git a/archinstall/lib/disk/fido.py b/archinstall/lib/disk/fido.py index 0538417f1a..6392b55c86 100644 --- a/archinstall/lib/disk/fido.py +++ b/archinstall/lib/disk/fido.py @@ -4,9 +4,9 @@ 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 diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py index 1afa8c6ee9..2c51b09d03 100644 --- a/archinstall/lib/disk/filesystem.py +++ b/archinstall/lib/disk/filesystem.py @@ -13,6 +13,7 @@ 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 @@ Size, Unit, ) -from archinstall.lib.output import debug, info class FilesystemHandler: diff --git a/archinstall/lib/disk/luks.py b/archinstall/lib/disk/luks.py index 275222f893..5d62abc890 100644 --- a/archinstall/lib/disk/luks.py +++ b/archinstall/lib/disk/luks.py @@ -7,9 +7,9 @@ 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 diff --git a/archinstall/lib/disk/lvm.py b/archinstall/lib/disk/lvm.py index 34ae9a2696..c2c5b6a61c 100644 --- a/archinstall/lib/disk/lvm.py +++ b/archinstall/lib/disk/lvm.py @@ -7,6 +7,7 @@ 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 @@ Size, Unit, ) -from archinstall.lib.output import debug def _lvm_info( diff --git a/archinstall/lib/disk/partitioning_menu.py b/archinstall/lib/disk/partitioning_menu.py index a524cf995d..b8ddd23177 100644 --- a/archinstall/lib/disk/partitioning_menu.py +++ b/archinstall/lib/disk/partitioning_menu.py @@ -19,8 +19,8 @@ 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 @@ def validate(value: str | None) -> str | None: 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) diff --git a/archinstall/lib/disk/utils.py b/archinstall/lib/disk/utils.py index 808ff451ed..900445e140 100644 --- a/archinstall/lib/disk/utils.py +++ b/archinstall/lib/disk/utils.py @@ -4,8 +4,8 @@ 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): diff --git a/archinstall/lib/general/general_menu.py b/archinstall/lib/general/general_menu.py index be5498d835..dcf7d8aab6 100644 --- a/archinstall/lib/general/general_menu.py +++ b/archinstall/lib/general/general_menu.py @@ -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 diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index eac936bdd0..dfd8bb2883 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -27,11 +27,11 @@ 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 @@ def _prev_network_config(self, item: MenuItem) -> str | 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 @@ def _prev_authentication(self, item: MenuItem) -> str | 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 @@ def _prev_mirror_config(self, item: MenuItem) -> str | 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() diff --git a/archinstall/lib/hardware.py b/archinstall/lib/hardware.py index 2cfdb7064a..f1587a3cdc 100644 --- a/archinstall/lib/hardware.py +++ b/archinstall/lib/hardware.py @@ -6,8 +6,8 @@ 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 diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 801eaee22b..614bbbabe6 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -29,6 +29,7 @@ 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.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 diff --git a/archinstall/lib/locale/utils.py b/archinstall/lib/locale/utils.py index 497e1fcb8d..31946028fa 100644 --- a/archinstall/lib/locale/utils.py +++ b/archinstall/lib/locale/utils.py @@ -3,7 +3,7 @@ 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 diff --git a/archinstall/lib/output.py b/archinstall/lib/log.py similarity index 50% rename from archinstall/lib/output.py rename to archinstall/lib/log.py index bc9bc7a3c1..bd060e99f1 100644 --- a/archinstall/lib/output.py +++ b/archinstall/lib/log.py @@ -3,183 +3,18 @@ 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 @@ def log(self, level: int, content: str) -> None: 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) diff --git a/archinstall/lib/menu/abstract_menu.py b/archinstall/lib/menu/abstract_menu.py index 590cabf1df..c37f565702 100644 --- a/archinstall/lib/menu/abstract_menu.py +++ b/archinstall/lib/menu/abstract_menu.py @@ -2,8 +2,8 @@ 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 diff --git a/archinstall/lib/menu/menu_helper.py b/archinstall/lib/menu/menu_helper.py index 6ca3b9531f..0d9a4032bb 100644 --- a/archinstall/lib/menu/menu_helper.py +++ b/archinstall/lib/menu/menu_helper.py @@ -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 @@ def _table_to_data_mapping(self, data: list[ValueT]) -> dict[str, ValueT | str | 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 diff --git a/archinstall/lib/mirror/mirror_handler.py b/archinstall/lib/mirror/mirror_handler.py index ef0ba1a9e6..8117605de2 100644 --- a/archinstall/lib/mirror/mirror_handler.py +++ b/archinstall/lib/mirror/mirror_handler.py @@ -2,10 +2,10 @@ 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 diff --git a/archinstall/lib/mirror/mirror_menu.py b/archinstall/lib/mirror/mirror_menu.py index 5158bffdec..2acf0bf211 100644 --- a/archinstall/lib/mirror/mirror_menu.py +++ b/archinstall/lib/mirror/mirror_menu.py @@ -13,8 +13,8 @@ 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 @@ def _prev_custom_mirror(self, item: MenuItem) -> str | None: 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: diff --git a/archinstall/lib/models/bootloader.py b/archinstall/lib/models/bootloader.py index 0dbd4268b7..bd6bce7ed1 100644 --- a/archinstall/lib/models/bootloader.py +++ b/archinstall/lib/models/bootloader.py @@ -3,8 +3,8 @@ 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 diff --git a/archinstall/lib/models/device.py b/archinstall/lib/models/device.py index a21f3c6fca..a50f7d8e62 100644 --- a/archinstall/lib/models/device.py +++ b/archinstall/lib/models/device.py @@ -12,9 +12,9 @@ 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' diff --git a/archinstall/lib/models/mirrors.py b/archinstall/lib/models/mirrors.py index 3ded2a9a7d..1d6783289f 100644 --- a/archinstall/lib/models/mirrors.py +++ b/archinstall/lib/models/mirrors.py @@ -9,10 +9,10 @@ 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: diff --git a/archinstall/lib/models/network.py b/archinstall/lib/models/network.py index 57a579c31a..bcbd288a0e 100644 --- a/archinstall/lib/models/network.py +++ b/archinstall/lib/models/network.py @@ -3,8 +3,8 @@ 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 diff --git a/archinstall/lib/network/wifi_handler.py b/archinstall/lib/network/wifi_handler.py index 4c858601da..b5590343bc 100644 --- a/archinstall/lib/network/wifi_handler.py +++ b/archinstall/lib/network/wifi_handler.py @@ -5,9 +5,9 @@ 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 diff --git a/archinstall/lib/network/wpa_supplicant.py b/archinstall/lib/network/wpa_supplicant.py index 935e9b4d5b..17ed3227e5 100644 --- a/archinstall/lib/network/wpa_supplicant.py +++ b/archinstall/lib/network/wpa_supplicant.py @@ -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 diff --git a/archinstall/lib/networking.py b/archinstall/lib/networking.py index e950a69704..97701e89a5 100644 --- a/archinstall/lib/networking.py +++ b/archinstall/lib/networking.py @@ -13,7 +13,7 @@ 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 diff --git a/archinstall/lib/packages/packages.py b/archinstall/lib/packages/packages.py index a742298671..5b276f7634 100644 --- a/archinstall/lib/packages/packages.py +++ b/archinstall/lib/packages/packages.py @@ -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 diff --git a/archinstall/lib/packages/util.py b/archinstall/lib/packages/util.py index 335d312eea..134592bb3a 100644 --- a/archinstall/lib/packages/util.py +++ b/archinstall/lib/packages/util.py @@ -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 diff --git a/archinstall/lib/pacman/pacman.py b/archinstall/lib/pacman/pacman.py index 83f8b40def..c78f6145d2 100644 --- a/archinstall/lib/pacman/pacman.py +++ b/archinstall/lib/pacman/pacman.py @@ -5,7 +5,7 @@ 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 diff --git a/archinstall/lib/plugins.py b/archinstall/lib/plugins.py index 919fcf2387..ac8383b117 100644 --- a/archinstall/lib/plugins.py +++ b/archinstall/lib/plugins.py @@ -7,7 +7,7 @@ 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 = {} diff --git a/archinstall/lib/profile/profiles_handler.py b/archinstall/lib/profile/profiles_handler.py index c75f95c0a3..d937a52048 100644 --- a/archinstall/lib/profile/profiles_handler.py +++ b/archinstall/lib/profile/profiles_handler.py @@ -9,9 +9,9 @@ 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: diff --git a/archinstall/lib/translationhandler.py b/archinstall/lib/translationhandler.py index 093ca6dea1..c2736f3551 100644 --- a/archinstall/lib/translationhandler.py +++ b/archinstall/lib/translationhandler.py @@ -9,7 +9,7 @@ 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 diff --git a/archinstall/lib/utils/format.py b/archinstall/lib/utils/format.py new file mode 100644 index 0000000000..2ac8c37749 --- /dev/null +++ b/archinstall/lib/utils/format.py @@ -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 diff --git a/archinstall/lib/utils/util.py b/archinstall/lib/utils/util.py index 574cc8d5a7..f94ca18c86 100644 --- a/archinstall/lib/utils/util.py +++ b/archinstall/lib/utils/util.py @@ -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 diff --git a/archinstall/main.py b/archinstall/main.py index f30b01d35b..e38b3d4845 100644 --- a/archinstall/main.py +++ b/archinstall/main.py @@ -11,10 +11,10 @@ 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 diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index aab02cfd4d..6f484910de 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -12,13 +12,13 @@ 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 diff --git a/archinstall/scripts/minimal.py b/archinstall/scripts/minimal.py index ee4b49c70d..c6eda03db8 100644 --- a/archinstall/scripts/minimal.py +++ b/archinstall/scripts/minimal.py @@ -4,12 +4,12 @@ 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 diff --git a/archinstall/scripts/only_hd.py b/archinstall/scripts/only_hd.py index 5df72965c2..c7349c51b6 100644 --- a/archinstall/scripts/only_hd.py +++ b/archinstall/scripts/only_hd.py @@ -7,8 +7,8 @@ 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 diff --git a/archinstall/tui/components.py b/archinstall/tui/components.py index 9fecf3c637..efbb64f92a 100644 --- a/archinstall/tui/components.py +++ b/archinstall/tui/components.py @@ -19,7 +19,7 @@ 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 diff --git a/tests/test_share_log.py b/tests/test_share_log.py index a6706da850..1a19ba26fb 100644 --- a/tests/test_share_log.py +++ b/tests/test_share_log.py @@ -9,7 +9,7 @@ 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