feat: update version and dependencies in setup.py; add privilege management and process handling modules
- Updated version from 2026.05.31 to 2026.06.11 in setup.py - Replaced 'textual' with 'rich' in install_requires - Added privilege.py for managing sudo privileges with a keep-alive mechanism - Introduced process.py for handling subprocesses with enhanced control and output streaming - Created ui.py for unified console interactions and user prompts
This commit is contained in:
+14
-59
@@ -1,7 +1,6 @@
|
||||
import argparse
|
||||
from typing import List, Optional
|
||||
|
||||
from textual.app import App
|
||||
from cobot import ui
|
||||
|
||||
# Import each sub-command's run() so we can call them in sequence.
|
||||
# Импортируем run() каждой подкоманды, чтобы вызывать их по порядку.
|
||||
@@ -9,40 +8,6 @@ from cobot.commands.doc_setup import run as _doc_setup
|
||||
from cobot.commands.docker_setup import run as _docker_setup
|
||||
from cobot.commands.local_setup import run as _local_setup
|
||||
from cobot.commands.robot_setup import run as _robot_setup
|
||||
from cobot.tui import SCREEN_CSS, PickScreen
|
||||
|
||||
|
||||
# A minimal Textual app that asks a single question and exits with the chosen value.
|
||||
# We need this because Textual screens cannot run outside of an App context.
|
||||
# Минимальное Textual-приложение, которое задаёт один вопрос и выходит с выбранным значением.
|
||||
# Нам это нужно, потому что экраны Textual не могут работать вне контекста приложения.
|
||||
class _Ask(App[Optional[str]]):
|
||||
"""Minimal one-question Textual app. Pushes a PickScreen and exits with the chosen value.
|
||||
Минимальное однвопросное Textual-приложение. Открывает PickScreen и завершается с выбранным значением.
|
||||
"""
|
||||
CSS = SCREEN_CSS
|
||||
|
||||
def __init__(self, step: str, question: str, options: List[str], default: str):
|
||||
super().__init__()
|
||||
self._step = step
|
||||
self._question = question
|
||||
self._options = options
|
||||
self._default = default
|
||||
|
||||
def on_mount(self) -> None:
|
||||
self.push_screen(
|
||||
PickScreen(self._step, self._question, self._options, self._default),
|
||||
self.exit,
|
||||
)
|
||||
|
||||
|
||||
def _ask(step: str, question: str, options: List[str], default: str) -> Optional[str]:
|
||||
"""Show a PickScreen and return the selected value, or None if the user pressed Escape.
|
||||
Показывает PickScreen и возвращает выбранное значение или None если пользователь нажал Escape.
|
||||
"""
|
||||
# Returns None if the user pressed Escape to cancel the whole wizard.
|
||||
# Возвращает None если пользователь нажал Escape для отмены всего мастера.
|
||||
return _Ask(step, question, options, default).run()
|
||||
|
||||
|
||||
def register(subparsers):
|
||||
@@ -54,44 +19,34 @@ def register(subparsers):
|
||||
|
||||
|
||||
def run(args: argparse.Namespace) -> None:
|
||||
"""Run the three-step first-time setup wizard: doc server -> build env -> robot config.
|
||||
Запускает трёхшаговый мастер первоначальной настройки: сервер документации -> среда сборки -> конфиг.
|
||||
"""Run the three-step first-time setup wizard: docs -> build env -> robot config.
|
||||
Запускает трёхшаговый мастер первичной настройки: документация -> среда сборки -> конфиг.
|
||||
"""
|
||||
ui.header("Первичная настройка", "3 шага")
|
||||
|
||||
# Step 1 - documentation server.
|
||||
# Шаг 1 - сервер документации.
|
||||
v = _ask("Step 1 of 3", "Set up the documentation server?", ["Yes", "No"], "Yes")
|
||||
if v is None:
|
||||
return
|
||||
if v == "Yes":
|
||||
if ui.confirm("Шаг 1/3 — настроить сервер документации?", default=True):
|
||||
_doc_setup(args)
|
||||
|
||||
# Step 2 - build environment: local ROS2 or Docker.
|
||||
# Шаг 2 - среда сборки: локальный ROS2 или Docker.
|
||||
v = _ask(
|
||||
"Step 2 of 3",
|
||||
"How do you want to set up the build environment?",
|
||||
env_choice = ui.select(
|
||||
"Шаг 2/3 — как настроить среду сборки?",
|
||||
[
|
||||
"local-setup — install ROS2 Jazzy on this machine and build with colcon",
|
||||
"docker-setup — build a Docker image with ROS2 Jazzy pre-installed",
|
||||
"local-setup — установить ROS2 Jazzy на эту машину и собрать через colcon",
|
||||
"docker-setup — собрать Docker-образ с предустановленным ROS2 Jazzy",
|
||||
],
|
||||
"local-setup — install ROS2 Jazzy on this machine and build with colcon",
|
||||
"local-setup — установить ROS2 Jazzy на эту машину и собрать через colcon",
|
||||
)
|
||||
if v is None:
|
||||
if env_choice is None:
|
||||
return
|
||||
if v.startswith("local"):
|
||||
if env_choice.startswith("local"):
|
||||
_local_setup(args)
|
||||
else:
|
||||
_docker_setup(args)
|
||||
|
||||
# Step 3 - robot parameters in cobot-setting.yaml.
|
||||
# Шаг 3 - параметры робота в cobot-setting.yaml.
|
||||
v = _ask(
|
||||
"Step 3 of 3",
|
||||
"Configure robot parameters (cobot-setting.yaml)?",
|
||||
["Yes", "No"],
|
||||
"Yes",
|
||||
)
|
||||
if v is None:
|
||||
return
|
||||
if v == "Yes":
|
||||
if ui.confirm("Шаг 3/3 — настроить параметры робота (cobot-setting.yaml)?", default=True):
|
||||
_robot_setup(args)
|
||||
|
||||
Reference in New Issue
Block a user