Compare commits

...

2 Commits

Author SHA1 Message Date
dw-0
84e5359895 refactor: replace os.path with Pathlib
- use config paths as type Paths instead of strings.
- tweak some menu visuals.

Signed-off-by: Dominik Willner <th33xitus@gmail.com>
2025-02-09 15:43:10 +01:00
dw-0
e7141f91e8 chore: clean up and sort imports
Signed-off-by: Dominik Willner <th33xitus@gmail.com>
2025-02-09 15:05:33 +01:00
4 changed files with 68 additions and 50 deletions

View File

@@ -7,6 +7,7 @@
# This file may be distributed under the terms of the GNU GPLv3 license #
# ======================================================================= #
import re
from pathlib import Path
from subprocess import (
DEVNULL,
PIPE,
@@ -173,7 +174,7 @@ def start_flash_process(flash_options: FlashOptions) -> None:
Logger.print_error("See the console output above!", end="\n\n")
def run_make_clean(kconfig = '.config') -> None:
def run_make_clean(kconfig=Path(KLIPPER_DIR.joinpath(".config"))) -> None:
try:
run(
f"make KCONFIG_CONFIG={kconfig} clean",
@@ -186,7 +187,7 @@ def run_make_clean(kconfig = '.config') -> None:
raise
def run_make_menuconfig(kconfig = '.config') -> None:
def run_make_menuconfig(kconfig=Path(KLIPPER_DIR.joinpath(".config"))) -> None:
try:
run(
f"make PYTHON=python3 KCONFIG_CONFIG={kconfig} menuconfig",
@@ -199,7 +200,7 @@ def run_make_menuconfig(kconfig = '.config') -> None:
raise
def run_make(kconfig = '.config') -> None:
def run_make(kconfig=Path(KLIPPER_DIR.joinpath(".config"))) -> None:
try:
run(
f"make PYTHON=python3 KCONFIG_CONFIG={kconfig}",

View File

@@ -9,9 +9,9 @@
from __future__ import annotations
import textwrap
from typing import List, Set, Type
from os import path, listdir, mkdir
from pathlib import Path
from shutil import copyfile
from typing import List, Set, Type
from components.klipper import KLIPPER_DIR, KLIPPER_KCONFIGS_DIR
from components.klipper_firmware.firmware_utils import (
@@ -22,14 +22,14 @@ from components.klipper_firmware.firmware_utils import (
from components.klipper_firmware.flash_options import FlashOptions
from core.logger import DialogType, Logger
from core.menus import Option
from core.menus.base_menu import BaseMenu, print_back_footer
from core.menus.base_menu import BaseMenu
from core.types.color import Color
from utils.input_utils import get_confirm, get_string_input
from utils.sys_utils import (
check_package_install,
install_system_packages,
update_system_package_lists,
)
from utils.input_utils import get_confirm, get_string_input, get_selection_input
# noinspection PyUnusedLocal
@@ -42,8 +42,11 @@ class KlipperKConfigMenu(BaseMenu):
self.previous_menu: Type[BaseMenu] | None = previous_menu
self.flash_options = FlashOptions()
self.kconfigs_dirname = KLIPPER_KCONFIGS_DIR
self.kconfig_default = path.join(KLIPPER_DIR, ".config")
self.kconfig = self.kconfig_default if not path.isdir(self.kconfigs_dirname) else None
self.kconfig_default = KLIPPER_DIR.joinpath(".config")
self.configs: List[Path] = []
self.kconfig = (
self.kconfig_default if not Path(self.kconfigs_dirname).is_dir() else None
)
def run(self) -> None:
if not self.kconfig:
@@ -59,46 +62,53 @@ class KlipperKConfigMenu(BaseMenu):
)
def set_options(self) -> None:
if not path.isdir(self.kconfigs_dirname):
if not Path(self.kconfigs_dirname).is_dir():
return
self.input_label_txt = "Select config or action to continue (default=n)"
self.default_option = Option(method=self.select_config, opt_data=self.kconfig_default)
self.input_label_txt = "Select config or action to continue (default=N)"
self.default_option = Option(
method=self.select_config, opt_data=self.kconfig_default
)
self.configs = []
option_index = 1
for kconfig in listdir(self.kconfigs_dirname):
if not kconfig.endswith(".config"):
for kconfig in Path(self.kconfigs_dirname).iterdir():
if not kconfig.name.endswith(".config"):
continue
kconfig_path = path.join(self.kconfigs_dirname, kconfig)
if path.isfile(kconfig_path):
kconfig_path = self.kconfigs_dirname.joinpath(kconfig)
if Path(kconfig_path).is_file():
self.configs += [kconfig]
self.options[str(option_index)] = Option(method=self.select_config, opt_data=kconfig_path)
self.options[str(option_index)] = Option(
method=self.select_config, opt_data=kconfig_path
)
option_index += 1
self.options['n'] = Option(method=self.select_config, opt_data=self.kconfig_default)
self.options["n"] = Option(
method=self.select_config, opt_data=self.kconfig_default
)
def print_menu(self) -> None:
cfg_found_str = Color.apply(
"Previously saved firmware configs found!", Color.GREEN
)
menu = textwrap.dedent(
"""
f"""
╟───────────────────────────────────────────────────────╢
Found previously saved firmware configs
║ ║
║ You can select existing firmware config or create a ║
║ new one. ║
{cfg_found_str:^62}
║ ║
║ Select an existing config or create a new one. ║
╟───────────────────────────────────────────────────────╢
║ Available firmware configs: ║
"""
)[1:]
start_index = 1
for i, s in enumerate(self.configs):
line = f"{start_index + i}) {s}"
line = f"{start_index + i}) {s.name}"
menu += f"{line:<54}\n"
new_config = Color.apply("n) New firmware config", Color.YELLOW)
menu += f"{new_config:<63}\n"
new_config = Color.apply("N) Create new firmware config", Color.GREEN)
menu += "║ ║\n"
menu += f"{new_config:<62}\n"
menu += "╟───────────────────────────────────────────────────────╢\n"
print(menu, end="")
@@ -107,14 +117,17 @@ class KlipperKConfigMenu(BaseMenu):
selection: str | None = kwargs.get("opt_data", None)
if selection is None:
raise Exception("opt_data is None")
if not path.isfile(selection) and selection != self.kconfig_default:
if not Path(selection).is_file() and selection != self.kconfig_default:
raise Exception("opt_data does not exists")
self.kconfig = selection
# noinspection PyUnusedLocal
# noinspection PyMethodMayBeStatic
class KlipperBuildFirmwareMenu(BaseMenu):
def __init__(self, kconfig: str | None = None, previous_menu: Type[BaseMenu] | None = None):
def __init__(
self, kconfig: str | None = None, previous_menu: Type[BaseMenu] | None = None
):
super().__init__()
self.title = "Build Firmware Menu"
self.title_color = Color.CYAN
@@ -123,7 +136,7 @@ class KlipperBuildFirmwareMenu(BaseMenu):
self.missing_deps: List[str] = check_package_install(self.deps)
self.flash_options = FlashOptions()
self.kconfigs_dirname = KLIPPER_KCONFIGS_DIR
self.kconfig_default = path.join(KLIPPER_DIR, ".config")
self.kconfig_default = KLIPPER_DIR.joinpath(".config")
self.kconfig = self.flash_options.selected_kconfig
def set_previous_menu(self, previous_menu: Type[BaseMenu] | None) -> None:
@@ -202,7 +215,7 @@ class KlipperBuildFirmwareMenu(BaseMenu):
finally:
if self.previous_menu is not None:
self.previous_menu().run()
def save_firmware_config(self) -> None:
Logger.print_dialog(
DialogType.CUSTOM,
@@ -212,7 +225,9 @@ class KlipperBuildFirmwareMenu(BaseMenu):
],
custom_title="Save firmware config",
)
if not get_confirm("Do you want to save firmware config?", default_choice=False):
if not get_confirm(
"Do you want to save firmware config?", default_choice=False
):
return
filename = self.kconfig_default
@@ -231,28 +246,31 @@ class KlipperBuildFirmwareMenu(BaseMenu):
"Enter the new firmware config name",
regex=r"^[a-z0-9]+([a-z0-9-]*[a-z0-9])?$",
)
filename = path.join(self.kconfigs_dirname, f"{input_name}.config")
filename = self.kconfigs_dirname.joinpath(f"{input_name}.config")
if path.isfile(filename):
if get_confirm(f"Firmware config {input_name} already exists, overwrite?", default_choice=False):
if Path(filename).is_file():
if get_confirm(
f"Firmware config {input_name} already exists, overwrite?",
default_choice=False,
):
break
if path.isdir(filename):
if Path(filename).is_dir():
Logger.print_error(f"Path {filename} exists and it's a directory")
if not path.exists(filename):
if not Path(filename).exists():
break
if not get_confirm(f"Save firmware config to '{filename}'?", default_choice=True):
if not get_confirm(
f"Save firmware config to '{filename}'?", default_choice=True
):
Logger.print_info("Aborted saving firmware config ...")
return
if not path.exists(self.kconfigs_dirname):
mkdir(self.kconfigs_dirname)
if not Path(self.kconfigs_dirname).exists():
Path(self.kconfigs_dirname).mkdir()
copyfile(self.kconfig_default, filename)
Logger.print_ok()
Logger.print_ok(f"Firmware config successfully saved to {filename}")

View File

@@ -10,8 +10,8 @@ from __future__ import annotations
import textwrap
import time
from pathlib import Path
from typing import Type
from os.path import basename
from components.klipper_firmware.firmware_utils import (
find_firmware_file,
@@ -37,7 +37,6 @@ from components.klipper_firmware.menus.klipper_flash_help_menu import (
KlipperFlashMethodHelpMenu,
KlipperMcuConnectionHelpMenu,
)
from components.klipper_firmware.menus.klipper_build_menu import KlipperKConfigMenu
from core.logger import DialogType, Logger
from core.menus import FooterType, Option
from core.menus.base_menu import BaseMenu, MenuTitleStyle
@@ -422,7 +421,7 @@ class KlipperFlashOverviewMenu(BaseMenu):
mcu = self.flash_options.selected_mcu.split("/")[-1]
board = self.flash_options.selected_board
baudrate = self.flash_options.selected_baudrate
kconfig = basename(self.flash_options.selected_kconfig)
kconfig = Path(self.flash_options.selected_kconfig).name
color = Color.CYAN
subheader = f"[{Color.apply('Overview', color)}]"
menu = textwrap.dedent(

View File

@@ -14,8 +14,8 @@ from typing import Type
from components.klipper import KLIPPER_DIR
from components.klipper.klipper import Klipper
from components.klipper_firmware.menus.klipper_build_menu import (
KlipperKConfigMenu,
KlipperBuildFirmwareMenu,
KlipperKConfigMenu,
)
from components.klipper_firmware.menus.klipper_flash_menu import (
KlipperFlashMethodMenu,