diff --git a/CLAUDE.md b/CLAUDE.md index bad5c8a..86a6f5f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -15,8 +15,10 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co ## Команды +Запускать нужно интерпретатором из `.venv` — textual стоит там: + ```bash -python pg_stand_sync.py # TUI-пульт (основной режим) +.venv/Scripts/python.exe pg_stand_sync.py # TUI-пульт (основной режим) python pg_stand_sync.py --no-tui # то же текстовым меню python pg_stand_sync.py list # базы стенда — самая быстрая проверка связи python pg_stand_sync.py --dry-run sync DB # печатает все команды, к серверам не ходит diff --git a/README.md b/README.md index 76d69eb..9abbc4c 100644 --- a/README.md +++ b/README.md @@ -12,20 +12,20 @@ copy config.example.json config.json ``` -```powershell -.\run.ps1 -Setup -``` - Заполнить `source` (стенд) и `target` (локальная PG), затем: ```powershell -.\run.ps1 +.venv\Scripts\python.exe pg_stand_sync.py ``` -`run.ps1` — обёртка запуска: берёт интерпретатор из `.venv` (иначе системный), переключает -консоль в UTF-8 и пробрасывает остальные аргументы в скрипт (`.\run.ps1 list`, -`.\run.ps1 --dry-run sync zpas`). `-Setup` создаёт окружение и ставит зависимости, -`-Tests` прогоняет тесты. Без обёртки всё то же работает через `python pg_stand_sync.py`. +Окружение создаётся один раз: + +```powershell +python -m venv .venv; .venv\Scripts\python.exe -m pip install -r requirements.txt +``` + +В Windows Terminal заведён профиль **Tools → pg-stand-sync**: он вызывает +`.venv\Scripts\python.exe pg_stand_sync.py` напрямую, с `PYTHONUTF8=1` в окружении профиля. Откроется пульт: оба списка сразу на экране, отдельного шага «выбор действия» нет. diff --git a/run.ps1 b/run.ps1 deleted file mode 100644 index 7ca28bb..0000000 --- a/run.ps1 +++ /dev/null @@ -1,69 +0,0 @@ -<# -.SYNOPSIS - Запуск pg-stand-sync: находит интерпретатор, чинит кодировку консоли, пробрасывает аргументы. - -.EXAMPLE - .\run.ps1 # пульт (TUI) - .\run.ps1 list # базы на стенде - .\run.ps1 --dry-run sync zpas # проверка команд без выполнения - .\run.ps1 -Setup # создать .venv и поставить зависимости - .\run.ps1 -Tests # прогнать тесты -#> - -[CmdletBinding()] -param( - # Создать .venv и установить requirements.txt - [switch]$Setup, - # Прогнать tests_tui.py вместо запуска приложения - [switch]$Tests, - # Всё остальное уходит в pg_stand_sync.py как есть - [Parameter(ValueFromRemainingArguments = $true)] - [string[]]$Rest -) - -$ErrorActionPreference = 'Stop' -$root = $PSScriptRoot -$venvPython = Join-Path $root '.venv\Scripts\python.exe' - -# Русский лог и рамки Textual в cp866-консоли превращаются в мусор -[Console]::OutputEncoding = [Text.Encoding]::UTF8 -[Console]::InputEncoding = [Text.Encoding]::UTF8 -$env:PYTHONIOENCODING = 'utf-8' - -function Find-Python { - if (Test-Path $venvPython) { return $venvPython } - foreach ($name in 'python', 'py') { - $cmd = Get-Command $name -ErrorAction SilentlyContinue - if ($cmd) { return $cmd.Source } - } - throw 'Python не найден: поставьте его или создайте окружение через .\run.ps1 -Setup' -} - -if ($Setup) { - if (-not (Test-Path $venvPython)) { - $bootstrap = Find-Python - Write-Host "создаю .venv ($bootstrap)" -ForegroundColor Cyan - & $bootstrap -m venv (Join-Path $root '.venv') - if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - } - Write-Host 'ставлю зависимости' -ForegroundColor Cyan - & $venvPython -m pip install --disable-pip-version-check -r (Join-Path $root 'requirements.txt') - exit $LASTEXITCODE -} - -$python = Find-Python - -if ($Tests) { - & $python -m pytest (Join-Path $root 'tests_tui.py') -q @Rest - exit $LASTEXITCODE -} - -# Без textual приложение молча откатится в текстовое меню — предупредить, пока не поздно -& $python -c 'import textual' 2>$null -if ($LASTEXITCODE -ne 0) { - Write-Host 'textual не установлен — откроется текстовый режим. Полный пульт: .\run.ps1 -Setup' ` - -ForegroundColor Yellow -} - -& $python (Join-Path $root 'pg_stand_sync.py') @Rest -exit $LASTEXITCODE