mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-30 16:36:56 +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:
co-authored by
Claude Opus 4.6
parent
97fc6dbd7f
commit
19667caccb
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: meta-validate
|
name: meta-validate
|
||||||
description: Валидация объекта метаданных 1С. Используй после создания или модификации объекта конфигурации для проверки корректности
|
description: Валидация объекта метаданных 1С. Используй после создания или модификации объекта конфигурации для проверки корректности
|
||||||
argument-hint: <ObjectPath> [-MaxErrors 30]
|
argument-hint: <ObjectPath> [-MaxErrors 30] — pipe-separated paths for batch
|
||||||
allowed-tools:
|
allowed-tools:
|
||||||
- Bash
|
- Bash
|
||||||
- Read
|
- Read
|
||||||
@@ -16,18 +16,21 @@ allowed-tools:
|
|||||||
|
|
||||||
```
|
```
|
||||||
/meta-validate <ObjectPath>
|
/meta-validate <ObjectPath>
|
||||||
|
/meta-validate path1.xml|path2.xml|path3.xml — batch mode
|
||||||
```
|
```
|
||||||
|
|
||||||
## Параметры
|
## Параметры
|
||||||
|
|
||||||
| Параметр | Обязательный | По умолчанию | Описание |
|
| Параметр | Обязательный | По умолчанию | Описание |
|
||||||
|------------|:------------:|--------------|-------------------------------------------------|
|
|------------|:------------:|--------------|-------------------------------------------------|
|
||||||
| ObjectPath | да | — | Путь к XML-файлу или каталогу объекта |
|
| ObjectPath | да | — | Путь к XML-файлу или каталогу объекта. Несколько путей через `\|` для batch |
|
||||||
| MaxErrors | нет | 30 | Остановиться после N ошибок |
|
| MaxErrors | нет | 30 | Остановиться после N ошибок (per object) |
|
||||||
| OutFile | нет | — | Записать результат в файл (UTF-8 BOM) |
|
| OutFile | нет | — | Записать результат в файл (UTF-8 BOM) |
|
||||||
|
|
||||||
`ObjectPath` авторезолв: если указана директория — ищет `<dirName>/<dirName>.xml`.
|
`ObjectPath` авторезолв: если указана директория — ищет `<dirName>/<dirName>.xml`.
|
||||||
|
|
||||||
|
**Batch mode**: при нескольких путях через `|` каждый объект валидируется отдельно, в конце выводится сводка `=== Batch: N objects, X passed, Y failed ===`.
|
||||||
|
|
||||||
## Команда
|
## Команда
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
@@ -94,6 +97,9 @@ Errors: 1, Warnings: 1
|
|||||||
|
|
||||||
# С записью в файл
|
# С записью в файл
|
||||||
... -ObjectPath Catalogs/Номенклатура.xml -OutFile result.txt
|
... -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
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
@@ -12,6 +12,31 @@ param(
|
|||||||
$ErrorActionPreference = "Stop"
|
$ErrorActionPreference = "Stop"
|
||||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
[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 ---
|
# --- Resolve path ---
|
||||||
|
|
||||||
if (-not [System.IO.Path]::IsPathRooted($ObjectPath)) {
|
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
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
from lxml import etree
|
from lxml import etree
|
||||||
@@ -18,10 +19,32 @@ parser.add_argument("-MaxErrors", type=int, default=30)
|
|||||||
parser.add_argument("-OutFile", default="")
|
parser.add_argument("-OutFile", default="")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
object_path = args.ObjectPath
|
|
||||||
max_errors = args.MaxErrors
|
max_errors = args.MaxErrors
|
||||||
out_file = args.OutFile
|
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 ─────────────────────────────────────────────
|
# ── resolve path ─────────────────────────────────────────────
|
||||||
|
|
||||||
if not os.path.isabs(object_path):
|
if not os.path.isabs(object_path):
|
||||||
|
|||||||
Reference in New Issue
Block a user