mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-06-12 17:04:57 +03:00
feat(meta-validate): add batch mode — pipe-separated paths
Accept multiple object paths via pipe separator (|) in -ObjectPath. Each object is validated separately with individual results, followed by a summary line: "Batch: N objects, X passed, Y failed". Single-path mode unchanged. Version bumped to v1.1. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
---
|
||||
name: meta-validate
|
||||
description: Валидация объекта метаданных 1С. Используй после создания или модификации объекта конфигурации для проверки корректности
|
||||
argument-hint: <ObjectPath> [-MaxErrors 30]
|
||||
argument-hint: <ObjectPath> [-MaxErrors 30] — pipe-separated paths for batch
|
||||
allowed-tools:
|
||||
- Bash
|
||||
- Read
|
||||
@@ -16,18 +16,21 @@ allowed-tools:
|
||||
|
||||
```
|
||||
/meta-validate <ObjectPath>
|
||||
/meta-validate path1.xml|path2.xml|path3.xml — batch mode
|
||||
```
|
||||
|
||||
## Параметры
|
||||
|
||||
| Параметр | Обязательный | По умолчанию | Описание |
|
||||
|------------|:------------:|--------------|-------------------------------------------------|
|
||||
| ObjectPath | да | — | Путь к XML-файлу или каталогу объекта |
|
||||
| MaxErrors | нет | 30 | Остановиться после N ошибок |
|
||||
| ObjectPath | да | — | Путь к XML-файлу или каталогу объекта. Несколько путей через `\|` для batch |
|
||||
| MaxErrors | нет | 30 | Остановиться после N ошибок (per object) |
|
||||
| OutFile | нет | — | Записать результат в файл (UTF-8 BOM) |
|
||||
|
||||
`ObjectPath` авторезолв: если указана директория — ищет `<dirName>/<dirName>.xml`.
|
||||
|
||||
**Batch mode**: при нескольких путях через `|` каждый объект валидируется отдельно, в конце выводится сводка `=== Batch: N objects, X passed, Y failed ===`.
|
||||
|
||||
## Команда
|
||||
|
||||
```powershell
|
||||
@@ -94,6 +97,9 @@ Errors: 1, Warnings: 1
|
||||
|
||||
# С записью в файл
|
||||
... -ObjectPath Catalogs/Номенклатура.xml -OutFile result.txt
|
||||
|
||||
# Batch: несколько объектов через |
|
||||
... -ObjectPath "Catalogs/Банки.xml|Documents/Заказ.xml|Enums/ВидДоговора.xml"
|
||||
```
|
||||
|
||||
## Верификация
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# meta-validate v1.0 — Validate 1C metadata object structure
|
||||
# meta-validate v1.1 — Validate 1C metadata object structure
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
@@ -12,6 +12,31 @@ param(
|
||||
$ErrorActionPreference = "Stop"
|
||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
|
||||
# --- Batch mode: pipe-separated paths (comma reserved by PowerShell) ---
|
||||
|
||||
$pathList = @($ObjectPath -split '\|' | ForEach-Object { $_.Trim() } | Where-Object { $_ })
|
||||
if ($pathList.Count -gt 1) {
|
||||
$batchOk = 0
|
||||
$batchFail = 0
|
||||
foreach ($singlePath in $pathList) {
|
||||
$callArgs = @{ ObjectPath = $singlePath; MaxErrors = $MaxErrors }
|
||||
if ($OutFile) {
|
||||
$baseName = [System.IO.Path]::GetFileNameWithoutExtension($OutFile)
|
||||
$ext = [System.IO.Path]::GetExtension($OutFile)
|
||||
$dir = Split-Path $OutFile
|
||||
if (-not $dir) { $dir = "." }
|
||||
$objLeaf = [System.IO.Path]::GetFileNameWithoutExtension($singlePath)
|
||||
$callArgs.OutFile = Join-Path $dir "$baseName`_$objLeaf$ext"
|
||||
}
|
||||
& $PSCommandPath @callArgs
|
||||
if ($LASTEXITCODE -eq 0) { $batchOk++ } else { $batchFail++ }
|
||||
}
|
||||
Write-Host ""
|
||||
Write-Host "=== Batch: $($pathList.Count) objects, $batchOk passed, $batchFail failed ==="
|
||||
if ($batchFail -gt 0) { exit 1 }
|
||||
exit 0
|
||||
}
|
||||
|
||||
# --- Resolve path ---
|
||||
|
||||
if (-not [System.IO.Path]::IsPathRooted($ObjectPath)) {
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
# meta-validate v1.0 — Validate 1C metadata object structure (Python port)
|
||||
# meta-validate v1.1 — Validate 1C metadata object structure (Python port)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import os
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
|
||||
from lxml import etree
|
||||
@@ -18,10 +19,32 @@ parser.add_argument("-MaxErrors", type=int, default=30)
|
||||
parser.add_argument("-OutFile", default="")
|
||||
args = parser.parse_args()
|
||||
|
||||
object_path = args.ObjectPath
|
||||
max_errors = args.MaxErrors
|
||||
out_file = args.OutFile
|
||||
|
||||
# ── batch mode: pipe-separated paths ─────────────────────────
|
||||
|
||||
path_list = [p.strip() for p in args.ObjectPath.split('|') if p.strip()]
|
||||
if len(path_list) > 1:
|
||||
batch_ok = 0
|
||||
batch_fail = 0
|
||||
for single_path in path_list:
|
||||
cmd = [sys.executable, __file__, "-ObjectPath", single_path, "-MaxErrors", str(max_errors)]
|
||||
if out_file:
|
||||
base, ext = os.path.splitext(out_file)
|
||||
obj_leaf = os.path.splitext(os.path.basename(single_path))[0]
|
||||
cmd += ["-OutFile", f"{base}_{obj_leaf}{ext}"]
|
||||
rc = subprocess.call(cmd)
|
||||
if rc == 0:
|
||||
batch_ok += 1
|
||||
else:
|
||||
batch_fail += 1
|
||||
print()
|
||||
print(f"=== Batch: {len(path_list)} objects, {batch_ok} passed, {batch_fail} failed ===")
|
||||
sys.exit(1 if batch_fail > 0 else 0)
|
||||
|
||||
object_path = path_list[0]
|
||||
|
||||
# ── resolve path ─────────────────────────────────────────────
|
||||
|
||||
if not os.path.isabs(object_path):
|
||||
|
||||
Reference in New Issue
Block a user