homeconsole-cli 0.0.7__tar.gz → 0.0.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/PKG-INFO +1 -1
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/env.py +75 -3
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/PKG-INFO +1 -1
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/pyproject.toml +1 -1
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/README.md +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/__init__.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/api.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/capabilities.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/client.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/__init__.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/_client_helpers.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/_compose_helpers.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/auth.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/connect.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/core.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/deploy.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/doctor.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/install.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/logs.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/marketplace.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/module.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/ping.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/plugin.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/__init__.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/compose.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/config.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/core.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/db.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/mode.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/redis.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/recovery/ui.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/remove.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/reset.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/search.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/secrets.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/setup.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/setup_wizard.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/status.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/commands/update.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/config.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/constants.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/core_ops.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/core_source.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/env_bootstrap.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/errors.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/main.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/marketplace_operation.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/native_core.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/repl.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/setup_runner.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/shell.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/hc/update_check.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/SOURCES.txt +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/dependency_links.txt +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/entry_points.txt +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/requires.txt +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/top_level.txt +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/setup.cfg +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_config_roundtrip.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_core_ops.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_env_bootstrap.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_main_root_callback.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_marketplace_operation_parse.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_native_core_helpers.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_nav_cli.py +0 -0
- {homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/tests/test_setup_runner.py +0 -0
|
@@ -212,6 +212,47 @@ def _get_running_services(compose_file: Path, cwd: Path) -> set[str]:
|
|
|
212
212
|
return set()
|
|
213
213
|
|
|
214
214
|
|
|
215
|
+
def _warn_orphan_volumes(console: Console, cwd: Path) -> None:
|
|
216
|
+
"""After down -v, check for volumes that compose didn't remove (not in top-level volumes:)."""
|
|
217
|
+
try:
|
|
218
|
+
r = subprocess.run( # noqa: S603
|
|
219
|
+
["docker", "volume", "ls", "--format", "{{.Name}}"],
|
|
220
|
+
capture_output=True, text=True, check=False, timeout=5,
|
|
221
|
+
)
|
|
222
|
+
project = cwd.name # compose project name = directory name
|
|
223
|
+
orphans = [
|
|
224
|
+
v for v in r.stdout.splitlines()
|
|
225
|
+
if v.startswith(f"{project}_") or v.startswith("dev_")
|
|
226
|
+
]
|
|
227
|
+
if orphans:
|
|
228
|
+
console.print(f"[yellow]![/yellow] Volumes не удалены (нет в top-level volumes секции compose):")
|
|
229
|
+
for v in orphans:
|
|
230
|
+
console.print(f" [dim]docker volume rm {v}[/dim]")
|
|
231
|
+
except Exception: # noqa: BLE001
|
|
232
|
+
pass
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
def _detect_active_profiles(running: set[str]) -> set[str]:
|
|
236
|
+
"""Return compose profiles that have at least one running container."""
|
|
237
|
+
profiles: set[str] = set()
|
|
238
|
+
for svcs in _SERVICES.values():
|
|
239
|
+
for s in svcs:
|
|
240
|
+
if s.compose_profile and s.name in running:
|
|
241
|
+
profiles.add(s.compose_profile)
|
|
242
|
+
for opt in _DB_OPTIONS:
|
|
243
|
+
if opt.compose_profile and opt.service and opt.service in running:
|
|
244
|
+
profiles.add(opt.compose_profile)
|
|
245
|
+
return profiles
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
def _detect_active_db(running: set[str]) -> str:
|
|
249
|
+
"""Return the DB key ('postgres' | 'sqlite') based on running containers."""
|
|
250
|
+
for opt in _DB_OPTIONS:
|
|
251
|
+
if opt.service and opt.service in running:
|
|
252
|
+
return opt.key
|
|
253
|
+
return "sqlite"
|
|
254
|
+
|
|
255
|
+
|
|
215
256
|
def _pick_services_interactive(available: list[_Svc], running: set[str]) -> list[_Svc]:
|
|
216
257
|
try:
|
|
217
258
|
import questionary
|
|
@@ -520,7 +561,7 @@ def register(app: typer.Typer) -> None:
|
|
|
520
561
|
mode: str = typer.Option(_MODE_DEFAULT, "--mode", "-m", help=_MODE_HELP),
|
|
521
562
|
volumes: bool = typer.Option(False, "--volumes", "-v", help="Удалить volumes (БД, кэш)"),
|
|
522
563
|
) -> None:
|
|
523
|
-
"""Остановить dev
|
|
564
|
+
"""Остановить dev-окружение (автоматически определяет активные профили)."""
|
|
524
565
|
console = Console()
|
|
525
566
|
try:
|
|
526
567
|
require_docker(console)
|
|
@@ -528,13 +569,44 @@ def register(app: typer.Typer) -> None:
|
|
|
528
569
|
src = _resolve_source(console)
|
|
529
570
|
project = compose_project_from_source(console, src, mode=mode)
|
|
530
571
|
|
|
531
|
-
|
|
532
|
-
|
|
572
|
+
# Detect which profiles are actually running so we stop them too.
|
|
573
|
+
running = _get_running_services(project.compose_file, project.cwd)
|
|
574
|
+
active_profiles = _detect_active_profiles(running)
|
|
575
|
+
active_db = _detect_active_db(running)
|
|
576
|
+
|
|
577
|
+
profile_hint = f" profiles=[bold]{', '.join(sorted(active_profiles))}[/bold]" if active_profiles else ""
|
|
578
|
+
console.print(f"[cyan]→[/cyan] env down mode=[bold]{mode}[/bold] db=[bold]{active_db}[/bold]{profile_hint}")
|
|
579
|
+
|
|
580
|
+
cmd = ["docker", "compose", "-f", str(project.compose_file)]
|
|
581
|
+
for profile in sorted(active_profiles):
|
|
582
|
+
cmd += ["--profile", profile]
|
|
583
|
+
cmd.append("down")
|
|
584
|
+
|
|
533
585
|
if volumes:
|
|
586
|
+
if active_db == "sqlite" and sys.stdin.isatty():
|
|
587
|
+
console.print(
|
|
588
|
+
"[yellow]![/yellow] SQLite хранит данные в volume [bold]core-data[/bold] — "
|
|
589
|
+
"они будут удалены вместе с остальными volumes."
|
|
590
|
+
)
|
|
591
|
+
try:
|
|
592
|
+
import questionary
|
|
593
|
+
confirmed = questionary.confirm(
|
|
594
|
+
"Удалить volumes (данные SQLite будут потеряны)?",
|
|
595
|
+
default=False,
|
|
596
|
+
).ask()
|
|
597
|
+
except ImportError:
|
|
598
|
+
confirmed = True
|
|
599
|
+
if not confirmed:
|
|
600
|
+
console.print("[dim]Volumes оставлены.[/dim]")
|
|
601
|
+
raise typer.Exit(code=0)
|
|
534
602
|
cmd.append("-v")
|
|
603
|
+
|
|
535
604
|
_run(cmd, cwd=project.cwd)
|
|
536
605
|
console.print("[green]✓[/green] env down ok")
|
|
537
606
|
|
|
607
|
+
if volumes:
|
|
608
|
+
_warn_orphan_volumes(console, project.cwd)
|
|
609
|
+
|
|
538
610
|
except HcCliError as e:
|
|
539
611
|
console.print(f"[red]Ошибка:[/red] {e.message}")
|
|
540
612
|
if e.hint:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{homeconsole_cli-0.0.7 → homeconsole_cli-0.0.8}/homeconsole_cli.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|