Addresses the following:
pyright
```
archinstall/lib/models/device.py:262:10 - error: Type "Literal[PartitionTable.GPT, PartitionTable.MBR]" is not assignable to return type "Self@PartitionTable"
Type "Literal[PartitionTable.GPT, PartitionTable.MBR]" is not assignable to type "Self@PartitionTable" (reportReturnType)
```
ty
```
error[invalid-return-type]: Return type does not match returned value
--> archinstall/lib/models/device.py:261:22
|
261 | def default(cls) -> Self:
| ---- Expected `Self@default` because of return type
262 | return cls.GPT if SysInfo.has_uefi() else cls.MBR
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `Self@default`, found `PartitionTable`
|
```
Addresses the following:
pyright
```
archinstall/lib/hardware.py:25:11 - error: Type "Literal[CpuVendor._Unknown]" is not assignable to return type "Self@CpuVendor"
Type "Literal[CpuVendor._Unknown]" is not assignable to type "Self@CpuVendor" (reportReturnType)
```
pyrefly
```
ERROR Returned type `Literal[CpuVendor._Unknown]` is not assignable to declared return type `Self@CpuVendor` [bad-return]
--> archinstall/lib/hardware.py:25:11
|
20 | def get_vendor(cls, name: str) -> Self:
| ---- declared return type
21 | if vendor := getattr(cls, name, None):
22 | return vendor
23 | else:
24 | debug(f"Unknown CPU vendor '{name}' detected.")
25 | return cls._Unknown
| ^^^^^^^^^^^^
|
```
ty
```
error[invalid-return-type]: Return type does not match returned value
--> archinstall/lib/hardware.py:20:36
|
20 | def get_vendor(cls, name: str) -> Self:
| ---- Expected `Self@get_vendor` because of return type
21 | if vendor := getattr(cls, name, None):
22 | return vendor
23 | else:
24 | debug(f"Unknown CPU vendor '{name}' detected.")
25 | return cls._Unknown
| ^^^^^^^^^^^^ expected `Self@get_vendor`, found `Literal[CpuVendor._Unknown]`
|
```
Addresses the following:
pyright
```
archinstall/lib/models/bootloader.py:42:11 - error: Type "Literal[Bootloader.NO_BOOTLOADER]" is not assignable to return type "Self@Bootloader"
Type "Literal[Bootloader.NO_BOOTLOADER]" is not assignable to type "Self@Bootloader" (reportReturnType)
archinstall/lib/models/bootloader.py:44:11 - error: Type "Literal[Bootloader.Systemd]" is not assignable to return type "Self@Bootloader"
Type "Literal[Bootloader.Systemd]" is not assignable to type "Self@Bootloader" (reportReturnType)
archinstall/lib/models/bootloader.py:46:11 - error: Type "Literal[Bootloader.Grub]" is not assignable to return type "Self@Bootloader"
Type "Literal[Bootloader.Grub]" is not assignable to type "Self@Bootloader" (reportReturnType)
```
pyrefly
```
ERROR Returned type `Literal[Bootloader.NO_BOOTLOADER]` is not assignable to declared return type `Self@Bootloader` [bad-return]
--> archinstall/lib/models/bootloader.py:42:11
|
40 | def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
| ---- declared return type
41 | if skip_boot:
42 | return cls.NO_BOOTLOADER
| ^^^^^^^^^^^^^^^^^
|
ERROR Returned type `Literal[Bootloader.Systemd]` is not assignable to declared return type `Self@Bootloader` [bad-return]
--> archinstall/lib/models/bootloader.py:44:11
|
40 | def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
| ---- declared return type
41 | if skip_boot:
42 | return cls.NO_BOOTLOADER
43 | elif uefi:
44 | return cls.Systemd
| ^^^^^^^^^^^
|
ERROR Returned type `Literal[Bootloader.Grub]` is not assignable to declared return type `Self@Bootloader`
[bad-return]
--> archinstall/lib/models/bootloader.py:46:11
|
40 | def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
| ---- declared return type
41 | if skip_boot:
42 | return cls.NO_BOOTLOADER
43 | elif uefi:
44 | return cls.Systemd
45 | else:
46 | return cls.Grub
| ^^^^^^^^
|
```
ty
```
error[invalid-return-type]: Return type does not match returned value
--> archinstall/lib/models/bootloader.py:40:63
|
40 | def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
| ---- Expected `Self@get_default` because of return type
41 | if skip_boot:
42 | return cls.NO_BOOTLOADER
| ^^^^^^^^^^^^^^^^^ expected `Self@get_default`, found `Literal[Bootloader.NO_BOOTLOADER]`
|
error[invalid-return-type]: Return type does not match returned value
--> archinstall/lib/models/bootloader.py:40:63
|
40 | def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
| ---- Expected `Self@get_default` because of return type
41 | if skip_boot:
42 | return cls.NO_BOOTLOADER
43 | elif uefi:
44 | return cls.Systemd
| ^^^^^^^^^^^ expected `Self@get_default`, found `Literal[Bootloader.Systemd]`
|
error[invalid-return-type]: Return type does not match returned value
--> archinstall/lib/models/bootloader.py:46:11
|
46 | return cls.Grub
| ^^^^^^^^ expected `Self@get_default`, found `Literal[Bootloader.Grub]`
|
::: archinstall/lib/models/bootloader.py:40:63
|
40 | def get_default(cls, uefi: bool, skip_boot: bool = False) -> Self:
| ---- Expected `Self@get_default` because of return type
|
```
* fix(applications): add ghostscript to print service packages
Selecting the print service installs cups, system-config-printer and
cups-pk-helper, but not ghostscript. cups relies on ghostscript for the
PDF/PostScript rendering filter, so driverless (IPP Everywhere) print
jobs fail out of the box with:
cfFilterGhostscript: Unable to launch Ghostscript: gs: No such file or directory
Add ghostscript to the package list and cover it with a regression test.
Closes#4595
* test: drop low-value print service package assertion
This will help catch incorrect translation placeholders, like those
fixed in commit dccd0c8cc.
This commit also removes custom checking code from the
locales_generator.sh script.
On aarch64 both the GRUB and Limine installers assume x86 and fail.
GRUB names its EFI target 'arm64', but platform.machine() returns
'aarch64', so passing --target=aarch64-efi is rejected. Map aarch64
to the arm64 target name expected by grub-install.
Limine ships architecture-specific default EFI binaries: BOOTAA64.EFI
on aarch64 versus BOOTIA32.EFI and BOOTX64.EFI on x86. Select the
correct binaries in the three places that reference them: when copying
them into the ESP, when building the pacman hook that refreshes them on
update, and when choosing the 64-bit EFI boot menu loader path.
Co-authored-by: Steev Klimaszewski <steev@parrotsec.org>
* Extract binding descriptions into base.pot and translate raw widget bindings (#4584)
xgettext only knew the tr keyword, so binding descriptions - translated
at runtime via tr(b.description) in _translate_bindings() - never made
it into base.pot. The strings added manually in #4363 were wiped by the
regeneration in #4557.
Teach the generator two more keywords: Binding:3 picks up our own
binding definitions, and tr_noop marks strings that only exist inside
the textual package, listed in the new tui/binding_descriptions.py.
The list walks the full MRO of the textual classes used in components.py,
since _translate_bindings() operates on the merged bindings map (e.g.
Scroll Up comes from ScrollView and carries live translations in 18
locales today).
Raw Input and Button widgets never went through _translate_bindings(),
so their help-panel descriptions stayed English regardless of .po
content - subclass them (_Input/_Button) following the _OptionList
pattern to make those translations real.
test_tooling/check_binding_descriptions.py verifies the list against
the installed textual after upgrades (manual, not wired into CI).
* Document key binding descriptions in the locales README
str.title() title-cased every label word, which is wrong outside
English: it turned the Ukrainian "Ім'я хоста" into "Ім'Я Хоста" and
broke acronyms ("NTP" -> "Ntp"). The source strings and their
translations are already written with the correct casing.
Capitalize only the first letter of each label instead.