From c376ab6faa8bf9bd9e8cbc30d95ec845786f2262 Mon Sep 17 00:00:00 2001 From: Daniel Girtler Date: Tue, 1 Jul 2025 20:57:08 +1000 Subject: [PATCH 01/14] Move root password menu into authentication menu --- archinstall/lib/args.py | 19 +++++++--- .../lib/authentication/authentication_menu.py | 19 ++++++++++ archinstall/lib/global_menu.py | 38 +++++++------------ archinstall/lib/models/authentication.py | 5 +++ archinstall/lib/models/users.py | 8 ++-- archinstall/scripts/guided.py | 4 +- tests/test_args.py | 11 ++++-- 7 files changed, 63 insertions(+), 41 deletions(-) diff --git a/archinstall/lib/args.py b/archinstall/lib/args.py index 85d8914a3a..6094f57c8d 100644 --- a/archinstall/lib/args.py +++ b/archinstall/lib/args.py @@ -22,7 +22,7 @@ from archinstall.lib.models.network_configuration import NetworkConfiguration from archinstall.lib.models.packages import Repository from archinstall.lib.models.profile_model import ProfileConfiguration -from archinstall.lib.models.users import Password, User +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 @@ -78,14 +78,15 @@ class ArchConfig: # Special fields that should be handle with care due to security implications users: list[User] = field(default_factory=list) - root_enc_password: Password | None = None def unsafe_json(self) -> dict[str, Any]: - config = { + config: dict[str, list[UserSerialization] | str | None] = { 'users': [user.json() for user in self.users], - 'root_enc_password': self.root_enc_password.enc_password if self.root_enc_password else None, } + if self.auth_config and self.auth_config.root_enc_password: + config['root_enc_password'] = self.auth_config.root_enc_password.enc_password + if self.disk_config: disk_encryption = self.disk_config.disk_encryption if disk_encryption and disk_encryption.encryption_password: @@ -222,11 +223,17 @@ def from_config(cls, args_config: dict[str, Any]) -> 'ArchConfig': arch_config.services = services # DEPRECATED: backwards compatibility + root_password = None if root_password := args_config.get('!root-password', None): - arch_config.root_enc_password = Password(plaintext=root_password) + root_password = Password(plaintext=root_password) if enc_password := args_config.get('root_enc_password', None): - arch_config.root_enc_password = Password(enc_password=enc_password) + root_password = Password(enc_password=enc_password) + + if root_password is not None: + if arch_config.auth_config is None: + arch_config.auth_config = AuthenticationConfiguration() + arch_config.auth_config.root_enc_password = root_password if custom_commands := args_config.get('custom_commands', []): arch_config.custom_commands = custom_commands diff --git a/archinstall/lib/authentication/authentication_menu.py b/archinstall/lib/authentication/authentication_menu.py index e8852bbb74..736c9e03fd 100644 --- a/archinstall/lib/authentication/authentication_menu.py +++ b/archinstall/lib/authentication/authentication_menu.py @@ -3,7 +3,9 @@ from archinstall.lib.disk.fido import Fido2 from archinstall.lib.menu.abstract_menu import AbstractSubMenu from archinstall.lib.models.authentication import AuthenticationConfiguration, U2FLoginConfiguration, U2FLoginMethod +from archinstall.lib.models.users import Password from archinstall.lib.translationhandler import tr +from archinstall.lib.utils.util import get_password from archinstall.tui.curses_menu import SelectMenu from archinstall.tui.menu_item import MenuItem, MenuItemGroup from archinstall.tui.result import ResultType @@ -33,6 +35,12 @@ def run(self, additional_title: str | None = None) -> AuthenticationConfiguratio def _define_menu_options(self) -> list[MenuItem]: return [ + MenuItem( + text=tr('Root password'), + action=select_root_password, + preview_action=self._prev_root_pwd, + key='root_enc_password', + ), MenuItem( text=tr('U2F login setup'), action=setup_u2f_login, @@ -43,6 +51,12 @@ def _define_menu_options(self) -> list[MenuItem]: ), ] + def _prev_root_pwd(self, item: MenuItem) -> str | None: + if item.value is not None: + password: Password = item.value + return f'{tr("Root password")}: {password.hidden()}' + return None + def _depends_on_u2f(self) -> bool: devices = Fido2.get_fido2_devices() if not devices: @@ -63,6 +77,11 @@ def _prev_u2f_login(self, item: MenuItem) -> str | None: return None +def select_root_password(preset: str | None = None) -> Password | None: + password = get_password(text=tr('Root password'), allow_skip=True) + return password + + def setup_u2f_login(preset: U2FLoginConfiguration) -> U2FLoginConfiguration | None: items = [] for method in U2FLoginMethod: diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index f0df3ef4c5..41a80d2ec3 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -33,11 +33,10 @@ from .models.network_configuration import NetworkConfiguration, NicType from .models.packages import Repository from .models.profile_model import ProfileConfiguration -from .models.users import Password, User +from .models.users import User from .output import FormattedOutput from .pacman.config import PacmanConfig from .translationhandler import Language, tr, translation_handler -from .utils.util import get_password class GlobalMenu(AbstractMenu[None]): @@ -110,16 +109,9 @@ def _get_menu_options(self) -> list[MenuItem]: preview_action=self._prev_hostname, key='hostname', ), - MenuItem( - text=tr('Root password'), - action=self._set_root_password, - preview_action=self._prev_root_pwd, - key='root_enc_password', - ), MenuItem( text=tr('Authentication'), action=self._select_authentication, - value=[], preview_action=self._prev_authentication, key='auth_config', ), @@ -230,13 +222,16 @@ def has_superuser() -> bool: missing = set() + item: MenuItem = self._item_group.find_by_key('auth_config') + auth_config: AuthenticationConfiguration | None = item.value + + if (auth_config is None or auth_config.root_enc_password is None) and not has_superuser(): + missing.add( + tr('Either root-password or at least 1 user with sudo privileges must be specified'), + ) + for item in self._item_group.items: - if item.key in ['root_enc_password', 'users']: - if not check('root_enc_password') and not has_superuser(): - missing.add( - tr('Either root-password or at least 1 user with sudo privileges must be specified'), - ) - elif item.mandatory: + if item.mandatory: assert item.key is not None if not check(item.key): missing.add(item.text) @@ -314,6 +309,9 @@ def _prev_authentication(self, item: MenuItem) -> str | None: auth_config: AuthenticationConfiguration = item.value output = '' + if auth_config.root_enc_password: + output += f'{tr("Root password")}: {auth_config.root_enc_password.hidden()}\n' + if auth_config.u2f_config: u2f_config = auth_config.u2f_config login_method = u2f_config.u2f_login_method.display_value() @@ -400,12 +398,6 @@ def _prev_hostname(self, item: MenuItem) -> str | None: return f'{tr("Hostname")}: {item.value}' return None - def _prev_root_pwd(self, item: MenuItem) -> str | None: - if item.value is not None: - password: Password = item.value - return f'{tr("Root password")}: {password.hidden()}' - return None - def _prev_parallel_dw(self, item: MenuItem) -> str | None: if item.value is not None: return f'{tr("Parallel Downloads")}: {item.value}' @@ -510,10 +502,6 @@ def _prev_profile(self, item: MenuItem) -> str | None: return None - def _set_root_password(self, preset: str | None = None) -> Password | None: - password = get_password(text=tr('Root password'), allow_skip=True) - return password - def _select_disk_config( self, preset: DiskLayoutConfiguration | None = None, diff --git a/archinstall/lib/models/authentication.py b/archinstall/lib/models/authentication.py index 6acbcc4cd0..7e07608de8 100644 --- a/archinstall/lib/models/authentication.py +++ b/archinstall/lib/models/authentication.py @@ -2,6 +2,7 @@ from enum import Enum from typing import Any, NotRequired, TypedDict +from archinstall.lib.models.users import Password from archinstall.lib.translationhandler import tr @@ -58,6 +59,7 @@ def parse_arg(args: dict[str, Any]) -> 'U2FLoginConfiguration | None': @dataclass class AuthenticationConfiguration: + root_enc_password: Password | None = None u2f_config: U2FLoginConfiguration | None = None @staticmethod @@ -67,6 +69,9 @@ def parse_arg(args: dict[str, Any]) -> 'AuthenticationConfiguration': if (u2f_config := args.get('u2f_config')) is not None: auth_config.u2f_config = U2FLoginConfiguration.parse_arg(u2f_config) + if enc_password := args.get('root_enc_password'): + auth_config.root_enc_password = Password(enc_password=enc_password) + return auth_config def json(self) -> AuthenticationSerialization: diff --git a/archinstall/lib/models/users.py b/archinstall/lib/models/users.py index e6a338410a..3f18f52d09 100644 --- a/archinstall/lib/models/users.py +++ b/archinstall/lib/models/users.py @@ -100,8 +100,8 @@ def _check_password_strength( return PasswordStrength.VERY_WEAK -_UserSerialization = TypedDict( - '_UserSerialization', +UserSerialization = TypedDict( + 'UserSerialization', { 'username': str, '!password': NotRequired[str], @@ -173,7 +173,7 @@ def table_data(self) -> dict[str, str | bool | list[str]]: 'groups': self.groups, } - def json(self) -> _UserSerialization: + def json(self) -> UserSerialization: return { 'username': self.username, 'enc_password': self.password.enc_password, @@ -184,7 +184,7 @@ def json(self) -> _UserSerialization: @classmethod def parse_arguments( cls, - args: list[_UserSerialization], + args: list[UserSerialization], ) -> list['User']: users: list[User] = [] diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index 2c2173a760..bae07878db 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -138,8 +138,8 @@ def perform_installation(mountpoint: Path) -> None: if accessibility_tools_in_use(): installation.enable_espeakup() - if root_pw := config.root_enc_password: - root_user = User('root', root_pw, False) + if config.auth_config and config.auth_config.root_enc_password: + root_user = User('root', config.auth_config.root_enc_password, False) installation.set_user_password(root_user) if (profile_config := config.profile_config) and profile_config.profile: diff --git a/tests/test_args.py b/tests/test_args.py index 5a6d61f0bb..0b9af8bb4a 100644 --- a/tests/test_args.py +++ b/tests/test_args.py @@ -134,6 +134,7 @@ def test_config_file_parsing( audio_config=AudioConfiguration(audio=Audio.PIPEWIRE), ), auth_config=AuthenticationConfiguration( + root_enc_password=Password(enc_password='password_hash'), u2f_config=U2FLoginConfiguration( u2f_login_method=U2FLoginMethod.Passwordless, passwordless_sudo=True, @@ -223,7 +224,6 @@ def test_config_file_parsing( ), ], services=['service_1', 'service_2'], - root_enc_password=Password(enc_password='password_hash'), custom_commands=["echo 'Hello, World!'"], ) @@ -280,7 +280,8 @@ def test_deprecated_creds_config_parsing( handler = ArchConfigHandler() arch_config = handler.config - assert arch_config.root_enc_password == Password(plaintext='rootPwd') + assert arch_config.auth_config is not None + assert arch_config.auth_config.root_enc_password == Password(plaintext='rootPwd') assert arch_config.users == [ User( @@ -331,7 +332,8 @@ def test_encrypted_creds_with_arg( handler = ArchConfigHandler() arch_config = handler.config - assert arch_config.root_enc_password == Password(enc_password='$y$j9T$FWCInXmSsS.8KV4i7O50H.$Hb6/g.Sw1ry888iXgkVgc93YNuVk/Rw94knDKdPVQw7') + assert arch_config.auth_config is not None + assert arch_config.auth_config.root_enc_password == Password(enc_password='$y$j9T$FWCInXmSsS.8KV4i7O50H.$Hb6/g.Sw1ry888iXgkVgc93YNuVk/Rw94knDKdPVQw7') assert arch_config.users == [ User( username='t', @@ -359,7 +361,8 @@ def test_encrypted_creds_with_env_var( handler = ArchConfigHandler() arch_config = handler.config - assert arch_config.root_enc_password == Password(enc_password='$y$j9T$FWCInXmSsS.8KV4i7O50H.$Hb6/g.Sw1ry888iXgkVgc93YNuVk/Rw94knDKdPVQw7') + assert arch_config.auth_config is not None + assert arch_config.auth_config.root_enc_password == Password(enc_password='$y$j9T$FWCInXmSsS.8KV4i7O50H.$Hb6/g.Sw1ry888iXgkVgc93YNuVk/Rw94knDKdPVQw7') assert arch_config.users == [ User( username='t', From 30f0693ce7932d9be23050e1a47e352ecbcf6615 Mon Sep 17 00:00:00 2001 From: Matteo <130925283+vanmatten@users.noreply.github.com> Date: Thu, 3 Jul 2025 00:42:30 +0200 Subject: [PATCH 02/14] Update Italian translation (#3651) --- archinstall/locales/base.pot | 3 - archinstall/locales/it/LC_MESSAGES/base.mo | Bin 51660 -> 53553 bytes archinstall/locales/it/LC_MESSAGES/base.po | 66 +++++++++++++-------- 3 files changed, 40 insertions(+), 29 deletions(-) diff --git a/archinstall/locales/base.pot b/archinstall/locales/base.pot index 2b5602aef8..f18f2f48e3 100644 --- a/archinstall/locales/base.pot +++ b/archinstall/locales/base.pot @@ -971,9 +971,6 @@ msgstr "" msgid "Default: 10000ms, Recommended range: 1000-60000" msgstr "" -msgid "Iteration time" -msgstr "" - msgid "Iteration time cannot be empty" msgstr "" diff --git a/archinstall/locales/it/LC_MESSAGES/base.mo b/archinstall/locales/it/LC_MESSAGES/base.mo index 85f95c1bedb73ed3e9b16f098980741c0f76db83..b71071a9d029dbe2d48243b4d7f416848d5d3fc9 100644 GIT binary patch delta 12774 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 Rvp4b|ySGYV$sLDk{tqZn{wDwc delta 11070 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 R2HwxN^bhn7+I6hx{{W8P Date: Fri, 4 Jul 2025 18:49:11 +1000 Subject: [PATCH 03/14] fix(deps): update dependency ruff to v0.12.2 (#3653) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 847ca275e3..8af4e9036a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ dev = [ "mypy==1.16.1", "flake8==7.3.0", "pre-commit==4.2.0", - "ruff==0.12.1", + "ruff==0.12.2", "pylint==3.3.7", "pylint-pydantic==0.3.5", "pytest==8.4.1", From 9b0b5e8af26d79e7769c4ac334750058301a97ee Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 5 Jul 2025 08:32:21 +1000 Subject: [PATCH 04/14] chore(deps): update pre-commit hook astral-sh/ruff-pre-commit to v0.12.2 (#3652) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a2df56069c..1cad755fe5 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ default_stages: ['pre-commit'] repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.12.1 + rev: v0.12.2 hooks: # fix unused imports and sort them - id: ruff From eb5512f5cdfecdc7a00be00a3cb83272b918bd83 Mon Sep 17 00:00:00 2001 From: Muhammad Salman Date: Tue, 8 Jul 2025 15:12:57 +0500 Subject: [PATCH 05/14] Install inotify-tools when using grub with btrfs config (#3656) --- archinstall/lib/installer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 652482ed49..5884361739 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -956,6 +956,7 @@ def setup_btrfs_snapshot( if bootloader and bootloader == Bootloader.Grub: self.pacman.strap('grub-btrfs') + self.pacman.strap('inotify-tools') self.enable_service('grub-btrfsd.service') def setup_swap(self, kind: str = 'zram') -> None: From 725b95c5a604c34dadbd766a7e80d2f900083e46 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 12 Jul 2025 12:22:04 +1000 Subject: [PATCH 06/14] chore(deps): update pre-commit hook astral-sh/ruff-pre-commit to v0.12.3 (#3663) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 1cad755fe5..e23056fcbf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ default_stages: ['pre-commit'] repos: - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.12.2 + rev: v0.12.3 hooks: # fix unused imports and sort them - id: ruff From b73aa794156793eff597f6583d8a70121f782d1e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sat, 12 Jul 2025 12:22:35 +1000 Subject: [PATCH 07/14] fix(deps): update dependency ruff to v0.12.3 (#3664) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 8af4e9036a..f4b8247462 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ dev = [ "mypy==1.16.1", "flake8==7.3.0", "pre-commit==4.2.0", - "ruff==0.12.2", + "ruff==0.12.3", "pylint==3.3.7", "pylint-pydantic==0.3.5", "pytest==8.4.1", From 703c9548c06f9f2f4427f356ed7c20b795585c9e Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 08:06:55 +1000 Subject: [PATCH 08/14] chore(deps): update astral-sh/ruff-action action to v3.5.0 (#3667) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/ruff-format.yaml | 2 +- .github/workflows/ruff-lint.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ruff-format.yaml b/.github/workflows/ruff-format.yaml index 9897145b29..ad6650ab93 100644 --- a/.github/workflows/ruff-format.yaml +++ b/.github/workflows/ruff-format.yaml @@ -5,5 +5,5 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - uses: astral-sh/ruff-action@eaf0ecdd668ceea36159ff9d91882c9795d89b49 # v3.4.0 + - uses: astral-sh/ruff-action@0c50076f12c38c3d0115b7b519b54a91cb9cf0ad # v3.5.0 - run: ruff format --diff diff --git a/.github/workflows/ruff-lint.yaml b/.github/workflows/ruff-lint.yaml index 5d11a5982b..7f9c5df0dd 100644 --- a/.github/workflows/ruff-lint.yaml +++ b/.github/workflows/ruff-lint.yaml @@ -5,4 +5,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - uses: astral-sh/ruff-action@eaf0ecdd668ceea36159ff9d91882c9795d89b49 # v3.4.0 + - uses: astral-sh/ruff-action@0c50076f12c38c3d0115b7b519b54a91cb9cf0ad # v3.5.0 From 96aaf5b6acf7ac1e159ea7a94fae6adf951c0051 Mon Sep 17 00:00:00 2001 From: Daniel Girtler Date: Tue, 15 Jul 2025 17:29:58 +1000 Subject: [PATCH 09/14] Rename module device_model -> device (#3639) --- archinstall/lib/args.py | 2 +- archinstall/lib/disk/device_handler.py | 2 +- archinstall/lib/disk/disk_menu.py | 2 +- archinstall/lib/disk/encryption_menu.py | 4 ++-- archinstall/lib/disk/fido.py | 2 +- archinstall/lib/disk/filesystem.py | 2 +- archinstall/lib/disk/partitioning_menu.py | 2 +- archinstall/lib/disk/subvolume_menu.py | 2 +- archinstall/lib/disk/utils.py | 2 +- archinstall/lib/global_menu.py | 2 +- archinstall/lib/installer.py | 2 +- archinstall/lib/interactions/disk_conf.py | 2 +- archinstall/lib/luks.py | 2 +- archinstall/lib/models/__init__.py | 2 +- archinstall/lib/models/{device_model.py => device.py} | 0 archinstall/scripts/guided.py | 2 +- docs/examples/python.rst | 6 +++--- examples/auto_discovery_mounted.py | 2 +- examples/full_automated_installation.py | 2 +- tests/test_args.py | 2 +- 20 files changed, 22 insertions(+), 22 deletions(-) rename archinstall/lib/models/{device_model.py => device.py} (100%) diff --git a/archinstall/lib/args.py b/archinstall/lib/args.py index 85d8914a3a..e75ed795a7 100644 --- a/archinstall/lib/args.py +++ b/archinstall/lib/args.py @@ -16,7 +16,7 @@ from archinstall.lib.models.application import ApplicationConfiguration from archinstall.lib.models.authentication import AuthenticationConfiguration from archinstall.lib.models.bootloader import Bootloader -from archinstall.lib.models.device_model import DiskEncryption, DiskLayoutConfiguration +from archinstall.lib.models.device import DiskEncryption, DiskLayoutConfiguration from archinstall.lib.models.locale import LocaleConfiguration from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network_configuration import NetworkConfiguration diff --git a/archinstall/lib/disk/device_handler.py b/archinstall/lib/disk/device_handler.py index 836c64a1f4..8492ed14ae 100644 --- a/archinstall/lib/disk/device_handler.py +++ b/archinstall/lib/disk/device_handler.py @@ -13,7 +13,7 @@ from ..exceptions import DiskError, SysCallError, UnknownFilesystemFormat from ..general import SysCommand, SysCommandWorker from ..luks import Luks2 -from ..models.device_model import ( +from ..models.device import ( DEFAULT_ITER_TIME, BDevice, BtrfsMountOption, diff --git a/archinstall/lib/disk/disk_menu.py b/archinstall/lib/disk/disk_menu.py index ddbaf047e6..35ad1503fd 100644 --- a/archinstall/lib/disk/disk_menu.py +++ b/archinstall/lib/disk/disk_menu.py @@ -2,7 +2,7 @@ from typing import override from archinstall.lib.disk.encryption_menu import DiskEncryptionMenu -from archinstall.lib.models.device_model import ( +from archinstall.lib.models.device import ( DEFAULT_ITER_TIME, BtrfsOptions, DiskEncryption, diff --git a/archinstall/lib/disk/encryption_menu.py b/archinstall/lib/disk/encryption_menu.py index 151f14236c..9375a06b1f 100644 --- a/archinstall/lib/disk/encryption_menu.py +++ b/archinstall/lib/disk/encryption_menu.py @@ -2,7 +2,7 @@ from typing import override from archinstall.lib.menu.menu_helper import MenuHelper -from archinstall.lib.models.device_model import ( +from archinstall.lib.models.device import ( DeviceModification, DiskEncryption, EncryptionType, @@ -17,7 +17,7 @@ from archinstall.tui.types import Alignment, FrameProperties from ..menu.abstract_menu import AbstractSubMenu -from ..models.device_model import DEFAULT_ITER_TIME, Fido2Device +from ..models.device import DEFAULT_ITER_TIME, Fido2Device from ..models.users import Password from ..output import FormattedOutput from ..utils.util import get_password diff --git a/archinstall/lib/disk/fido.py b/archinstall/lib/disk/fido.py index b6676db41d..2358b16d69 100644 --- a/archinstall/lib/disk/fido.py +++ b/archinstall/lib/disk/fido.py @@ -4,7 +4,7 @@ from pathlib import Path from typing import ClassVar -from archinstall.lib.models.device_model import Fido2Device +from archinstall.lib.models.device import Fido2Device from ..exceptions import SysCallError from ..general import SysCommand, SysCommandWorker, clear_vt100_escape_codes_from_str diff --git a/archinstall/lib/disk/filesystem.py b/archinstall/lib/disk/filesystem.py index e1f9504302..432b3ecfeb 100644 --- a/archinstall/lib/disk/filesystem.py +++ b/archinstall/lib/disk/filesystem.py @@ -9,7 +9,7 @@ from ..interactions.general_conf import ask_abort from ..luks import Luks2 -from ..models.device_model import ( +from ..models.device import ( DiskEncryption, DiskLayoutConfiguration, DiskLayoutType, diff --git a/archinstall/lib/disk/partitioning_menu.py b/archinstall/lib/disk/partitioning_menu.py index ff33ce1c43..baac9f7745 100644 --- a/archinstall/lib/disk/partitioning_menu.py +++ b/archinstall/lib/disk/partitioning_menu.py @@ -4,7 +4,7 @@ from pathlib import Path from typing import override -from archinstall.lib.models.device_model import ( +from archinstall.lib.models.device import ( BtrfsMountOption, DeviceModification, FilesystemType, diff --git a/archinstall/lib/disk/subvolume_menu.py b/archinstall/lib/disk/subvolume_menu.py index af448a30e3..5b66334cc7 100644 --- a/archinstall/lib/disk/subvolume_menu.py +++ b/archinstall/lib/disk/subvolume_menu.py @@ -1,7 +1,7 @@ from pathlib import Path from typing import assert_never, override -from archinstall.lib.models.device_model import SubvolumeModification +from archinstall.lib.models.device import SubvolumeModification from archinstall.lib.translationhandler import tr from archinstall.tui.curses_menu import EditMenu from archinstall.tui.result import ResultType diff --git a/archinstall/lib/disk/utils.py b/archinstall/lib/disk/utils.py index fa9f3c3173..95a0871f54 100644 --- a/archinstall/lib/disk/utils.py +++ b/archinstall/lib/disk/utils.py @@ -4,7 +4,7 @@ from archinstall.lib.exceptions import DiskError, SysCallError from archinstall.lib.general import SysCommand -from archinstall.lib.models.device_model import LsblkInfo +from archinstall.lib.models.device import LsblkInfo from archinstall.lib.output import debug, warn diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index f0df3ef4c5..c9725bc78e 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -5,7 +5,7 @@ from archinstall.lib.disk.disk_menu import DiskLayoutConfigurationMenu from archinstall.lib.models.application import ApplicationConfiguration from archinstall.lib.models.authentication import AuthenticationConfiguration -from archinstall.lib.models.device_model import DiskLayoutConfiguration, DiskLayoutType, EncryptionType, FilesystemType, PartitionModification +from archinstall.lib.models.device import DiskLayoutConfiguration, DiskLayoutType, EncryptionType, FilesystemType, PartitionModification from archinstall.lib.packages import list_available_packages from archinstall.tui.menu_item import MenuItem, MenuItemGroup diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index 5884361739..a8a36058a0 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -16,7 +16,7 @@ from archinstall.lib.disk.device_handler import device_handler from archinstall.lib.disk.fido import Fido2 from archinstall.lib.disk.utils import get_lsblk_by_mountpoint, get_lsblk_info -from archinstall.lib.models.device_model import ( +from archinstall.lib.models.device import ( DiskEncryption, DiskLayoutConfiguration, EncryptionType, diff --git a/archinstall/lib/interactions/disk_conf.py b/archinstall/lib/interactions/disk_conf.py index 3a75624cbe..1f3497869a 100644 --- a/archinstall/lib/interactions/disk_conf.py +++ b/archinstall/lib/interactions/disk_conf.py @@ -4,7 +4,7 @@ from archinstall.lib.disk.device_handler import device_handler from archinstall.lib.disk.partitioning_menu import manual_partitioning from archinstall.lib.menu.menu_helper import MenuHelper -from archinstall.lib.models.device_model import ( +from archinstall.lib.models.device import ( BDevice, BtrfsMountOption, DeviceModification, diff --git a/archinstall/lib/luks.py b/archinstall/lib/luks.py index 5845f84330..075bef9e6f 100644 --- a/archinstall/lib/luks.py +++ b/archinstall/lib/luks.py @@ -7,7 +7,7 @@ from types import TracebackType from archinstall.lib.disk.utils import get_lsblk_info, umount -from archinstall.lib.models.device_model import DEFAULT_ITER_TIME +from archinstall.lib.models.device import DEFAULT_ITER_TIME from .exceptions import DiskError, SysCallError from .general import SysCommand, SysCommandWorker, generate_password, run diff --git a/archinstall/lib/models/__init__.py b/archinstall/lib/models/__init__.py index 74ca3b67cc..b36a759b25 100644 --- a/archinstall/lib/models/__init__.py +++ b/archinstall/lib/models/__init__.py @@ -5,7 +5,7 @@ BluetoothConfiguration, ) from .bootloader import Bootloader -from .device_model import ( +from .device import ( BDevice, DeviceGeometry, DeviceModification, diff --git a/archinstall/lib/models/device_model.py b/archinstall/lib/models/device.py similarity index 100% rename from archinstall/lib/models/device_model.py rename to archinstall/lib/models/device.py diff --git a/archinstall/scripts/guided.py b/archinstall/scripts/guided.py index 2c2173a760..88a92978e5 100644 --- a/archinstall/scripts/guided.py +++ b/archinstall/scripts/guided.py @@ -12,7 +12,7 @@ from archinstall.lib.installer import Installer, accessibility_tools_in_use, run_custom_user_commands from archinstall.lib.interactions.general_conf import PostInstallationAction, ask_post_installation from archinstall.lib.models import Bootloader -from archinstall.lib.models.device_model import ( +from archinstall.lib.models.device import ( DiskLayoutType, EncryptionType, ) diff --git a/docs/examples/python.rst b/docs/examples/python.rst index 59f27f00a2..9050b9bcb4 100644 --- a/docs/examples/python.rst +++ b/docs/examples/python.rst @@ -53,9 +53,9 @@ After running ``python -m archinstall test_installer`` it should print something total_size=Size(value=512110190592, unit=, sector_size=SectorSize(value=512, unit=)), free_space_regions=[ - , - , - ], + , + , + ], sector_size=SectorSize(value=512, unit=), read_only=False, dirty=False diff --git a/examples/auto_discovery_mounted.py b/examples/auto_discovery_mounted.py index df792bb2b0..51180504be 100644 --- a/examples/auto_discovery_mounted.py +++ b/examples/auto_discovery_mounted.py @@ -1,7 +1,7 @@ from pathlib import Path from archinstall.lib.disk.device_handler import device_handler -from archinstall.lib.models.device_model import DiskLayoutConfiguration, DiskLayoutType +from archinstall.lib.models.device import DiskLayoutConfiguration, DiskLayoutType root_mount_dir = Path('/mnt/archinstall') diff --git a/examples/full_automated_installation.py b/examples/full_automated_installation.py index d172978388..c9c042b305 100644 --- a/examples/full_automated_installation.py +++ b/examples/full_automated_installation.py @@ -4,7 +4,7 @@ from archinstall.lib.disk.device_handler import device_handler from archinstall.lib.disk.filesystem import FilesystemHandler from archinstall.lib.installer import Installer -from archinstall.lib.models.device_model import ( +from archinstall.lib.models.device import ( DeviceModification, DiskEncryption, DiskLayoutConfiguration, diff --git a/tests/test_args.py b/tests/test_args.py index 5a6d61f0bb..5a693af1a4 100644 --- a/tests/test_args.py +++ b/tests/test_args.py @@ -9,7 +9,7 @@ from archinstall.lib.models.application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration from archinstall.lib.models.authentication import AuthenticationConfiguration, U2FLoginConfiguration, U2FLoginMethod from archinstall.lib.models.bootloader import Bootloader -from archinstall.lib.models.device_model import DiskLayoutConfiguration, DiskLayoutType +from archinstall.lib.models.device import DiskLayoutConfiguration, DiskLayoutType from archinstall.lib.models.locale import LocaleConfiguration from archinstall.lib.models.mirrors import CustomRepository, CustomServer, MirrorConfiguration, MirrorRegion, SignCheck, SignOption from archinstall.lib.models.network_configuration import NetworkConfiguration, Nic, NicType From 47f4e63006557b78758614415d7d9e2569759741 Mon Sep 17 00:00:00 2001 From: Daniel Girtler Date: Tue, 15 Jul 2025 17:30:15 +1000 Subject: [PATCH 10/14] Rename profile_model -> profile (#3640) --- archinstall/lib/args.py | 2 +- archinstall/lib/global_menu.py | 2 +- archinstall/lib/models/__init__.py | 2 +- archinstall/lib/models/network_configuration.py | 2 +- archinstall/lib/models/{profile_model.py => profile.py} | 0 archinstall/lib/profile/profile_menu.py | 2 +- archinstall/lib/profile/profiles_handler.py | 2 +- archinstall/scripts/minimal.py | 2 +- examples/full_automated_installation.py | 2 +- tests/test_args.py | 2 +- 10 files changed, 9 insertions(+), 9 deletions(-) rename archinstall/lib/models/{profile_model.py => profile.py} (100%) diff --git a/archinstall/lib/args.py b/archinstall/lib/args.py index e75ed795a7..4360879e46 100644 --- a/archinstall/lib/args.py +++ b/archinstall/lib/args.py @@ -21,7 +21,7 @@ from archinstall.lib.models.mirrors import MirrorConfiguration from archinstall.lib.models.network_configuration import NetworkConfiguration from archinstall.lib.models.packages import Repository -from archinstall.lib.models.profile_model import ProfileConfiguration +from archinstall.lib.models.profile import ProfileConfiguration from archinstall.lib.models.users import Password, User from archinstall.lib.output import debug, error, logger, warn from archinstall.lib.plugins import load_plugin diff --git a/archinstall/lib/global_menu.py b/archinstall/lib/global_menu.py index c9725bc78e..8014a64388 100644 --- a/archinstall/lib/global_menu.py +++ b/archinstall/lib/global_menu.py @@ -32,7 +32,7 @@ from .models.mirrors import MirrorConfiguration from .models.network_configuration import NetworkConfiguration, NicType from .models.packages import Repository -from .models.profile_model import ProfileConfiguration +from .models.profile import ProfileConfiguration from .models.users import Password, User from .output import FormattedOutput from .pacman.config import PacmanConfig diff --git a/archinstall/lib/models/__init__.py b/archinstall/lib/models/__init__.py index b36a759b25..b938543001 100644 --- a/archinstall/lib/models/__init__.py +++ b/archinstall/lib/models/__init__.py @@ -36,7 +36,7 @@ from .mirrors import CustomRepository, MirrorConfiguration, MirrorRegion from .network_configuration import NetworkConfiguration, Nic, NicType from .packages import LocalPackage, PackageSearch, PackageSearchResult, Repository -from .profile_model import ProfileConfiguration +from .profile import ProfileConfiguration from .users import PasswordStrength, User __all__ = [ diff --git a/archinstall/lib/models/network_configuration.py b/archinstall/lib/models/network_configuration.py index e470ec8341..993169d826 100644 --- a/archinstall/lib/models/network_configuration.py +++ b/archinstall/lib/models/network_configuration.py @@ -6,7 +6,7 @@ from archinstall.lib.translationhandler import tr -from ..models.profile_model import ProfileConfiguration +from ..models.profile import ProfileConfiguration if TYPE_CHECKING: from archinstall.lib.installer import Installer diff --git a/archinstall/lib/models/profile_model.py b/archinstall/lib/models/profile.py similarity index 100% rename from archinstall/lib/models/profile_model.py rename to archinstall/lib/models/profile.py diff --git a/archinstall/lib/profile/profile_menu.py b/archinstall/lib/profile/profile_menu.py index 882b47e3c1..ca12246cc8 100644 --- a/archinstall/lib/profile/profile_menu.py +++ b/archinstall/lib/profile/profile_menu.py @@ -12,7 +12,7 @@ from ..hardware import GfxDriver from ..interactions.system_conf import select_driver from ..menu.abstract_menu import AbstractSubMenu -from ..models.profile_model import ProfileConfiguration +from ..models.profile import ProfileConfiguration class ProfileMenu(AbstractSubMenu[ProfileConfiguration]): diff --git a/archinstall/lib/profile/profiles_handler.py b/archinstall/lib/profile/profiles_handler.py index 25522240e2..4ef3e4f2cb 100644 --- a/archinstall/lib/profile/profiles_handler.py +++ b/archinstall/lib/profile/profiles_handler.py @@ -14,7 +14,7 @@ from ...default_profiles.profile import GreeterType, Profile from ..hardware import GfxDriver -from ..models.profile_model import ProfileConfiguration +from ..models.profile import ProfileConfiguration from ..networking import fetch_data_from_url, list_interfaces from ..output import debug, error, info diff --git a/archinstall/scripts/minimal.py b/archinstall/scripts/minimal.py index fe52334467..18bcaaa941 100644 --- a/archinstall/scripts/minimal.py +++ b/archinstall/scripts/minimal.py @@ -7,7 +7,7 @@ from archinstall.lib.disk.filesystem import FilesystemHandler from archinstall.lib.installer import Installer from archinstall.lib.models import Bootloader -from archinstall.lib.models.profile_model import ProfileConfiguration +from archinstall.lib.models.profile import ProfileConfiguration from archinstall.lib.models.users import Password, User from archinstall.lib.output import debug, error, info from archinstall.lib.profile.profiles_handler import profile_handler diff --git a/examples/full_automated_installation.py b/examples/full_automated_installation.py index c9c042b305..760d492689 100644 --- a/examples/full_automated_installation.py +++ b/examples/full_automated_installation.py @@ -18,7 +18,7 @@ Size, Unit, ) -from archinstall.lib.models.profile_model import ProfileConfiguration +from archinstall.lib.models.profile import ProfileConfiguration from archinstall.lib.models.users import Password, User from archinstall.lib.profile.profiles_handler import profile_handler diff --git a/tests/test_args.py b/tests/test_args.py index 5a693af1a4..a8666be72b 100644 --- a/tests/test_args.py +++ b/tests/test_args.py @@ -14,7 +14,7 @@ from archinstall.lib.models.mirrors import CustomRepository, CustomServer, MirrorConfiguration, MirrorRegion, SignCheck, SignOption from archinstall.lib.models.network_configuration import NetworkConfiguration, Nic, NicType from archinstall.lib.models.packages import Repository -from archinstall.lib.models.profile_model import ProfileConfiguration +from archinstall.lib.models.profile import ProfileConfiguration from archinstall.lib.models.users import Password, User from archinstall.lib.profile.profiles_handler import profile_handler from archinstall.lib.translationhandler import translation_handler From 231530d5f9a5fb41b0dadf10ede35f064d23c345 Mon Sep 17 00:00:00 2001 From: Daniel Girtler Date: Tue, 15 Jul 2025 17:35:54 +1000 Subject: [PATCH 11/14] Handle no U2F device available (#3648) --- .../lib/authentication/authentication_menu.py | 20 ++++++++++--------- archinstall/lib/disk/fido.py | 5 ++++- archinstall/lib/installer.py | 4 ++-- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/archinstall/lib/authentication/authentication_menu.py b/archinstall/lib/authentication/authentication_menu.py index e8852bbb74..b88853e4e5 100644 --- a/archinstall/lib/authentication/authentication_menu.py +++ b/archinstall/lib/authentication/authentication_menu.py @@ -35,20 +35,13 @@ def _define_menu_options(self) -> list[MenuItem]: return [ MenuItem( text=tr('U2F login setup'), - action=setup_u2f_login, + action=select_u2f_login, value=self._auth_config.u2f_config, preview_action=self._prev_u2f_login, - dependencies=[self._depends_on_u2f], key='u2f_config', ), ] - def _depends_on_u2f(self) -> bool: - devices = Fido2.get_fido2_devices() - if not devices: - return False - return True - def _prev_u2f_login(self, item: MenuItem) -> str | None: if item.value is not None: u2f_config: U2FLoginConfiguration = item.value @@ -60,10 +53,19 @@ def _prev_u2f_login(self, item: MenuItem) -> str | None: output += tr('Passwordless sudo: ') + (tr('Enabled') if u2f_config.passwordless_sudo else tr('Disabled')) return output + + devices = Fido2.get_fido2_devices() + if not devices: + return tr('No U2F devices found') + return None -def setup_u2f_login(preset: U2FLoginConfiguration) -> U2FLoginConfiguration | None: +def select_u2f_login(preset: U2FLoginConfiguration) -> U2FLoginConfiguration | None: + devices = Fido2.get_fido2_devices() + if not devices: + return None + items = [] for method in U2FLoginMethod: items.append(MenuItem(method.display_value(), value=method)) diff --git a/archinstall/lib/disk/fido.py b/archinstall/lib/disk/fido.py index 2358b16d69..a46f1405e8 100644 --- a/archinstall/lib/disk/fido.py +++ b/archinstall/lib/disk/fido.py @@ -36,7 +36,10 @@ def get_fido2_devices(cls) -> list[Fido2Device]: fido_devices = clear_vt100_escape_codes_from_str(ret) - for line in fido_devices.split('\r\n'): + if not fido_devices: + return [] + + for line in fido_devices.splitlines(): path, details = line.replace(',', '').split(':', maxsplit=1) _, product, manufacturer = details.strip().split(' ', maxsplit=2) diff --git a/archinstall/lib/installer.py b/archinstall/lib/installer.py index a8a36058a0..96d642fbbb 100644 --- a/archinstall/lib/installer.py +++ b/archinstall/lib/installer.py @@ -1507,7 +1507,7 @@ def _add_efistub_bootloader( parent_dev_path = device_handler.get_parent_device_path(boot_partition.safe_dev_path) - cmd_template = [ + cmd_template = ( 'efibootmgr', '--create', '--disk', @@ -1521,7 +1521,7 @@ def _add_efistub_bootloader( '--unicode', *cmdline, '--verbose', - ] + ) for kernel in self.kernels: # Setup the firmware entry From 9f83d67c9edc8d9e44374eaf7f5ba546d9c9877d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 10:16:27 +1000 Subject: [PATCH 12/14] chore(deps): update pre-commit hook pre-commit/mirrors-mypy to v1.17.0 (#3669) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e23056fcbf..93dbd44bed 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,7 +31,7 @@ repos: args: [--config=.flake8] fail_fast: true - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.16.1 + rev: v1.17.0 hooks: - id: mypy args: [ From f059d897fb3a67c0a50bf11d3bdf040e7de6f665 Mon Sep 17 00:00:00 2001 From: utuhiro78 <34818411+utuhiro78@users.noreply.github.com> Date: Wed, 16 Jul 2025 09:16:55 +0900 Subject: [PATCH 13/14] Update Japanese translation (#3670) --- archinstall/locales/ja/LC_MESSAGES/base.mo | Bin 57885 -> 58867 bytes archinstall/locales/ja/LC_MESSAGES/base.po | 24 +++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/archinstall/locales/ja/LC_MESSAGES/base.mo b/archinstall/locales/ja/LC_MESSAGES/base.mo index a489476278f7237fadf6c0e25d70903a390c82c1..714febb2adc15886d0acfcdc96afc3654665f409 100644 GIT binary patch delta 12047 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 afQ+Dd-}+??S>&HRebunR8HLv!FY|v5wD+|D diff --git a/archinstall/locales/ja/LC_MESSAGES/base.po b/archinstall/locales/ja/LC_MESSAGES/base.po index d46c3d59d3..e031ea0020 100644 --- a/archinstall/locales/ja/LC_MESSAGES/base.po +++ b/archinstall/locales/ja/LC_MESSAGES/base.po @@ -938,6 +938,30 @@ msgstr "全体のサイズ: {}" msgid "Encryption type" msgstr "暗号化のタイプ" +msgid "Iteration time" +msgstr "反復時間" + +msgid "Enter iteration time for LUKS encryption (in milliseconds)" +msgstr "LUKS 暗号化のイテレーション時間(ミリ秒単位)を入力" + +msgid "Higher values increase security but slow down boot time" +msgstr "値を大きくするとセキュリティは向上しますが、起動時間が遅くなります" + +msgid "Default: 10000ms, Recommended range: 1000-60000" +msgstr "デフォルト: 10000ms, 推奨範囲: 1000-60000" + +msgid "Iteration time cannot be empty" +msgstr "イテレーション時間は空にできません" + +msgid "Iteration time must be at least 100ms" +msgstr "イテレーション時間は最低 100ms にしてください" + +msgid "Iteration time must be at most 120000ms" +msgstr "イテレーション時間は最大 120000ms にしてください" + +msgid "Please enter a valid number" +msgstr "有効な数字を入力してください" + msgid "Partitions" msgstr "パーティション" From 8736926fb26218b5aeaf9491efb376127a557246 Mon Sep 17 00:00:00 2001 From: correctmost <134317971+correctmost@users.noreply.github.com> Date: Wed, 16 Jul 2025 22:37:06 -0400 Subject: [PATCH 14/14] Update mypy to 1.17.0 (#3671) This commit also removes a type ignore comment that is no longer needed after python/mypy#18976. --- archinstall/lib/profile/profiles_handler.py | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/archinstall/lib/profile/profiles_handler.py b/archinstall/lib/profile/profiles_handler.py index 4ef3e4f2cb..0043e704e3 100644 --- a/archinstall/lib/profile/profiles_handler.py +++ b/archinstall/lib/profile/profiles_handler.py @@ -164,7 +164,7 @@ def remove_custom_profiles(self, profiles: Profile | list[Profile]) -> None: self._profiles = [p for p in self.profiles if p.name not in remove_names] def get_profile_by_name(self, name: str) -> Profile | None: - return next(filter(lambda x: x.name == name, self.profiles), None) # type: ignore[arg-type, union-attr] + return next(filter(lambda x: x.name == name, self.profiles), None) def get_top_level_profiles(self) -> list[Profile]: return [p for p in self.profiles if p.is_top_level_profile()] diff --git a/pyproject.toml b/pyproject.toml index f4b8247462..0aa16f3c97 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ Source = "https://github.com/archlinux/archinstall" [project.optional-dependencies] log = ["systemd_python==235"] dev = [ - "mypy==1.16.1", + "mypy==1.17.0", "flake8==7.3.0", "pre-commit==4.2.0", "ruff==0.12.3",