diff --git a/.claude/skills/subsystem-validate/scripts/subsystem-validate.ps1 b/.claude/skills/subsystem-validate/scripts/subsystem-validate.ps1 index 73db29caf..8093ff058 100644 --- a/.claude/skills/subsystem-validate/scripts/subsystem-validate.ps1 +++ b/.claude/skills/subsystem-validate/scripts/subsystem-validate.ps1 @@ -1,4 +1,4 @@ -# subsystem-validate v1.5 — Validate 1C subsystem XML structure +# subsystem-validate v1.6 — Validate 1C subsystem XML structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -11,6 +11,49 @@ param( $ErrorActionPreference = "Stop" [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 +# Штамп версии формата — атрибут version КОРНЕВОГО элемента файла. Копия общего эталона (семья +# root_version, авторитет — meta-validate). +function Get-RootVersion([string]$xmlPath) { + if (-not (Test-Path -LiteralPath $xmlPath -PathType Leaf)) { return $null } + $buf = New-Object byte[] 4096 + $fs = [System.IO.File]::OpenRead($xmlPath) + try { $len = $fs.Read($buf, 0, $buf.Length) } finally { $fs.Dispose() } + $head = [System.Text.Encoding]::UTF8.GetString($buf, 0, $len) + $m = [regex]::Match($head, '<[A-Za-z_][\w.:-]*(\s[^>]*)?/?>') + if (-not $m.Success) { return $null } + $v = [regex]::Match($m.Groups[1].Value, '(?:^|\s)version="([^"]*)"') + if ($v.Success) { return $v.Groups[1].Value } + return $null +} + +# Корень автономной внешней обработки/отчёта. Копия общего эталона (семья is_external_root, +# авторитет — cf-edit). +function Test-ExternalObjectRoot([string]$xmlPath) { + if (-not (Test-Path $xmlPath)) { return $false } + try { + [xml]$mx = Get-Content -Path $xmlPath -Encoding UTF8 + $el = $mx.DocumentElement.FirstChild + while ($el -and $el.NodeType -ne 'Element') { $el = $el.NextSibling } + if ($el) { return @('ExternalDataProcessor','ExternalReport') -contains $el.LocalName } + } catch {} + return $false +} + +# Якорь выгрузки: корень автономной EPF/ERF либо Configuration.xml, ближайший вверх. Копия общего +# эталона (семья find_dump_anchor, авторитет — meta-validate). +function Find-DumpAnchor([string]$startDir) { + $d = $startDir + for ($i = 0; $i -lt 15 -and $d; $i++) { + if (Test-ExternalObjectRoot "$d.xml") { return "$d.xml" } + $cfg = Join-Path $d "Configuration.xml" + if (Test-Path $cfg) { return $cfg } + $parent = [System.IO.Path]::GetDirectoryName($d) + if (-not $parent -or $parent -eq $d) { break } + $d = $parent + } + return $null +} + # --- Resolve path --- if (-not [System.IO.Path]::IsPathRooted($SubsystemPath)) { $SubsystemPath = Join-Path (Get-Location).Path $SubsystemPath @@ -331,6 +374,36 @@ if (-not $script:stopped) { } else { Report-OK "13. UseOneCommand: false (no constraint)" } + + # --- 14. Format version: тела Ext/*.xml — как у дескриптора; сверка с выгрузкой --- + # Дескриптор подсистемы и её штампованные тела (CommandInterface.xml, Help.xml) платформа загружает + # только в одной версии формата: «Версия формата загружаемого файла … отличается от версии формата + # ранее загруженных файлов». Вложенные подсистемы — отдельные объекты. С остальной выгрузкой + # подсистема может расходиться — платформа такое грузит, это лишь неоднородность выгрузки (типично + # после мержа веток, выгруженных разными платформами). + if ($version) { + $subExtDir = Join-Path (Join-Path $parentDir2 $baseName2) "Ext" + $verBodiesOk = 0 + $verErrors = 0 + if (Test-Path $subExtDir -PathType Container) { + $bodyNames = @(Get-ChildItem $subExtDir -Filter "*.xml" -File | ForEach-Object { $_.Name }) + [Array]::Sort($bodyNames, [StringComparer]::Ordinal) + foreach ($bn in $bodyNames) { + $bodyVer = Get-RootVersion (Join-Path $subExtDir $bn) + if (-not $bodyVer) { continue } + if ($bodyVer -eq $version) { $verBodiesOk++; continue } + $verErrors++ + Report-Error "14. Format version: $baseName2/Ext/$bn is stamped $bodyVer, the descriptor $version — the platform refuses to load parts of one object in different formats" + } + } + $dumpAnchor = Find-DumpAnchor $parentDir2 + $dumpVer = if ($dumpAnchor) { Get-RootVersion $dumpAnchor } else { $null } + if ($dumpVer -and $version -ne $dumpVer) { + Report-Warn "14. Format version $version differs from the dump ($dumpVer) — the platform loads it, but the dump is no longer uniform (typical after merging branches dumped by different platforms)" + } elseif ($verErrors -eq 0 -and ($verBodiesOk -gt 0 -or $dumpVer)) { + Report-OK "14. Format version: $version, matches the stamped parts and the dump" + } + } } # --- Finalize --- diff --git a/.claude/skills/subsystem-validate/scripts/subsystem-validate.py b/.claude/skills/subsystem-validate/scripts/subsystem-validate.py index 62411fa1d..f3eaa88ab 100644 --- a/.claude/skills/subsystem-validate/scripts/subsystem-validate.py +++ b/.claude/skills/subsystem-validate/scripts/subsystem-validate.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# subsystem-validate v1.5 — Validate 1C subsystem XML structure +# subsystem-validate v1.6 — Validate 1C subsystem XML structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Validates subsystem XML file structure, properties, content items, child objects.""" import sys, os, argparse, re @@ -98,6 +98,56 @@ def find_duplicates(items): return dupes +# Штамп версии формата — атрибут version КОРНЕВОГО элемента файла. Копия общего эталона (семья +# root_version, авторитет — meta-validate). +def root_version(xml_path): + if not os.path.isfile(xml_path): + return None + with open(xml_path, "rb") as f: + head = f.read(4096).decode("utf-8", errors="ignore") + m = re.search(r'<[A-Za-z_][\w.:-]*(\s[^>]*)?/?>', head) + if not m: + return None + v = re.search(r'(?:^|\s)version="([^"]*)"', m.group(1) or "") + if v: + return v.group(1) + return None + + +# Корень автономной внешней обработки/отчёта. Копия общего эталона (семья is_external_root, +# авторитет — cf-edit). +def _sg_is_external_root(xml_path): + if not os.path.isfile(xml_path): + return False + try: + mx = etree.parse(xml_path).getroot() + for child in mx: + if isinstance(child.tag, str): + return child.tag.split("}")[-1] in ("ExternalDataProcessor", "ExternalReport") + except Exception: + return False + return False + + +# Якорь выгрузки: корень автономной EPF/ERF либо Configuration.xml, ближайший вверх. Копия общего +# эталона (семья find_dump_anchor, авторитет — meta-validate). +def find_dump_anchor(start_dir): + d = start_dir + for _ in range(15): + if not d: + break + if _sg_is_external_root(d + ".xml"): + return d + ".xml" + cfg = os.path.join(d, "Configuration.xml") + if os.path.exists(cfg): + return cfg + parent = os.path.dirname(d) + if not parent or parent == d: + break + d = parent + return None + + def main(): sys.stdout.reconfigure(encoding="utf-8") sys.stderr.reconfigure(encoding="utf-8") @@ -368,6 +418,37 @@ def main(): else: r.ok('13. UseOneCommand: false (no constraint)') + # --- 14. Format version: тела Ext/*.xml — как у дескриптора; сверка с выгрузкой --- + # Дескриптор подсистемы и её штампованные тела (CommandInterface.xml, Help.xml) платформа загружает + # только в одной версии формата: «Версия формата загружаемого файла … отличается от версии формата + # ранее загруженных файлов». Вложенные подсистемы — отдельные объекты. С остальной выгрузкой + # подсистема может расходиться — платформа такое грузит, это лишь неоднородность выгрузки (типично + # после мержа веток, выгруженных разными платформами). + if version: + sub_ext_dir = os.path.join(parent_dir2, base_name2, 'Ext') + ver_bodies_ok = 0 + ver_errors = 0 + if os.path.isdir(sub_ext_dir): + body_names = sorted(n for n in os.listdir(sub_ext_dir) + if n.lower().endswith('.xml') and os.path.isfile(os.path.join(sub_ext_dir, n))) + for bn in body_names: + body_ver = root_version(os.path.join(sub_ext_dir, bn)) + if not body_ver: + continue + if body_ver == version: + ver_bodies_ok += 1 + continue + ver_errors += 1 + r.error(f'14. Format version: {base_name2}/Ext/{bn} is stamped {body_ver}, the descriptor {version} ' + '— the platform refuses to load parts of one object in different formats') + dump_anchor = find_dump_anchor(parent_dir2) + dump_ver = root_version(dump_anchor) if dump_anchor else None + if dump_ver and version != dump_ver: + r.warn(f'14. Format version {version} differs from the dump ({dump_ver}) — the platform loads it, ' + 'but the dump is no longer uniform (typical after merging branches dumped by different platforms)') + elif ver_errors == 0 and (ver_bodies_ok > 0 or dump_ver): + r.ok(f'14. Format version: {version}, matches the stamped parts and the dump') + # --- Finalize --- checks = r.ok_count + r.errors + r.warnings if r.errors == 0 and r.warnings == 0 and not detailed: diff --git a/tests/skills/cases/subsystem-validate/error-version-body-differs.json b/tests/skills/cases/subsystem-validate/error-version-body-differs.json new file mode 100644 index 000000000..24f9c3ed1 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/error-version-body-differs.json @@ -0,0 +1,9 @@ +{ + "name": "Командный интерфейс подсистемы 2.18 при дескрипторе 2.20 — ошибка: платформа такую подсистему не загрузит", + "setup": "fixture:subsystem-version-differs", + "params": { "subsystemPath": "Subsystems/Склад.xml" }, + "expectError": true, + "noSnapshot": "subsystem-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout", + "expect": { "stdoutContains": ["[ERROR] 14. Format version: Склад/Ext/CommandInterface.xml is stamped 2.18, the descriptor 2.20"] }, + "skipPlatformVerify": "фикстура намеренно не загружается: командный интерфейс и дескриптор подсистемы в разных версиях формата" +} diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары.xml new file mode 100644 index 000000000..24289f7ea --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары.xml @@ -0,0 +1,91 @@ + + + + + + 51817524-0f51-477b-a7c7-1d138827d74e + 97a1c4d0-6128-45db-ab0c-7266a602316f + + + cbb1f27e-a394-42ba-b66e-62302b91c23e + 797982e6-63e0-4d0a-8864-eba03a24b569 + + + a8195e0f-2517-447d-ae31-9963e54dce59 + 2ea7dad5-4eb4-4357-a778-4cacd99cf6fc + + + 7dee1910-f5a7-4ef8-8627-c2719a9a18a3 + 749266d7-1797-470b-8204-4cf8d8a65395 + + + a1d85fe4-e316-4ab4-9b2b-945d41e93893 + e7a7760f-05d2-4a1b-ba5a-31e71d50662d + + + + Товары + + + ru + Товары + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + Auto + InDialog + false + BothWays + + Catalog.Товары.StandardAttribute.Description + Catalog.Товары.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + Use + + + + + + Use + Auto + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Configuration.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Configuration.xml new file mode 100644 index 000000000..2fa0a5073 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Configuration.xml @@ -0,0 +1,257 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + 0ad62760-b331-4346-8e8b-3e42b90a60c4 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + 9614422d-809e-4c50-8feb-efef235571fb + + + e3687481-0a87-462c-a166-9f34594f9bba + 41f6317a-5456-43db-97a2-33c31681aee3 + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + 7bbf04ce-053d-4bd1-9502-df44d2c14b6d + + + 51f2d5d8-ea4d-4064-8892-82951750031e + 834b09af-82fa-42ed-9a97-05202b126864 + + + e68182ea-4237-4383-967f-90c1e3370bc7 + 1bdafb28-bc70-4011-8de1-63af7a7ebc07 + + + fb282519-d103-4dd3-bc12-cb271d631dfc + a6e1fc3f-c614-42cf-a681-36646a1f56b7 + + + + ПроверкаВерсий + + + ru + ПроверкаВерсий + + + + + Version8_3_27 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + TextToSpeech + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_27 + + + + Русский + Склад + Товары + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Ext/ClientApplicationInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..e10c2790c --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + cbab57f2-a0f3-4f0a-89ea-4cb19570ab75 + + + + + b553047f-c9aa-4157-978d-448ecad24248 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Languages/Русский.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Languages/Русский.xml new file mode 100644 index 000000000..39e8b5bd6 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад.xml new file mode 100644 index 000000000..d3c69ce44 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад.xml @@ -0,0 +1,24 @@ + + + + + Склад + + + ru + Склад + + + + true + true + false + + + + Catalog.Товары + + + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад/Ext/CommandInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад/Ext/CommandInterface.xml new file mode 100644 index 000000000..4e7d40103 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-agree/Subsystems/Склад/Ext/CommandInterface.xml @@ -0,0 +1,6 @@ + + + + false + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары.xml new file mode 100644 index 000000000..24289f7ea --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары.xml @@ -0,0 +1,91 @@ + + + + + + 51817524-0f51-477b-a7c7-1d138827d74e + 97a1c4d0-6128-45db-ab0c-7266a602316f + + + cbb1f27e-a394-42ba-b66e-62302b91c23e + 797982e6-63e0-4d0a-8864-eba03a24b569 + + + a8195e0f-2517-447d-ae31-9963e54dce59 + 2ea7dad5-4eb4-4357-a778-4cacd99cf6fc + + + 7dee1910-f5a7-4ef8-8627-c2719a9a18a3 + 749266d7-1797-470b-8204-4cf8d8a65395 + + + a1d85fe4-e316-4ab4-9b2b-945d41e93893 + e7a7760f-05d2-4a1b-ba5a-31e71d50662d + + + + Товары + + + ru + Товары + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + Auto + InDialog + false + BothWays + + Catalog.Товары.StandardAttribute.Description + Catalog.Товары.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + Use + + + + + + Use + Auto + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары/Ext/ObjectModule.bsl new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Catalogs/Товары/Ext/ObjectModule.bsl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Configuration.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Configuration.xml new file mode 100644 index 000000000..2fa0a5073 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Configuration.xml @@ -0,0 +1,257 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + 0ad62760-b331-4346-8e8b-3e42b90a60c4 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + 9614422d-809e-4c50-8feb-efef235571fb + + + e3687481-0a87-462c-a166-9f34594f9bba + 41f6317a-5456-43db-97a2-33c31681aee3 + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + 7bbf04ce-053d-4bd1-9502-df44d2c14b6d + + + 51f2d5d8-ea4d-4064-8892-82951750031e + 834b09af-82fa-42ed-9a97-05202b126864 + + + e68182ea-4237-4383-967f-90c1e3370bc7 + 1bdafb28-bc70-4011-8de1-63af7a7ebc07 + + + fb282519-d103-4dd3-bc12-cb271d631dfc + a6e1fc3f-c614-42cf-a681-36646a1f56b7 + + + + ПроверкаВерсий + + + ru + ПроверкаВерсий + + + + + Version8_3_27 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + TextToSpeech + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_27 + + + + Русский + Склад + Товары + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Ext/ClientApplicationInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..e10c2790c --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + cbab57f2-a0f3-4f0a-89ea-4cb19570ab75 + + + + + b553047f-c9aa-4157-978d-448ecad24248 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Languages/Русский.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Languages/Русский.xml new file mode 100644 index 000000000..39e8b5bd6 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад.xml new file mode 100644 index 000000000..d3c69ce44 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад.xml @@ -0,0 +1,24 @@ + + + + + Склад + + + ru + Склад + + + + true + true + false + + + + Catalog.Товары + + + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад/Ext/CommandInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад/Ext/CommandInterface.xml new file mode 100644 index 000000000..eab47eb6d --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-differs/Subsystems/Склад/Ext/CommandInterface.xml @@ -0,0 +1,6 @@ + + + + false + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары.xml new file mode 100644 index 000000000..24289f7ea --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары.xml @@ -0,0 +1,91 @@ + + + + + + 51817524-0f51-477b-a7c7-1d138827d74e + 97a1c4d0-6128-45db-ab0c-7266a602316f + + + cbb1f27e-a394-42ba-b66e-62302b91c23e + 797982e6-63e0-4d0a-8864-eba03a24b569 + + + a8195e0f-2517-447d-ae31-9963e54dce59 + 2ea7dad5-4eb4-4357-a778-4cacd99cf6fc + + + 7dee1910-f5a7-4ef8-8627-c2719a9a18a3 + 749266d7-1797-470b-8204-4cf8d8a65395 + + + a1d85fe4-e316-4ab4-9b2b-945d41e93893 + e7a7760f-05d2-4a1b-ba5a-31e71d50662d + + + + Товары + + + ru + Товары + + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + false + true + AsDescription + + Auto + InDialog + false + BothWays + + Catalog.Товары.StandardAttribute.Description + Catalog.Товары.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + Use + + + + + + Use + Auto + DontUse + false + false + + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары/Ext/ObjectModule.bsl new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Catalogs/Товары/Ext/ObjectModule.bsl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Configuration.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Configuration.xml new file mode 100644 index 000000000..2fa0a5073 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Configuration.xml @@ -0,0 +1,257 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + 0ad62760-b331-4346-8e8b-3e42b90a60c4 + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + 9614422d-809e-4c50-8feb-efef235571fb + + + e3687481-0a87-462c-a166-9f34594f9bba + 41f6317a-5456-43db-97a2-33c31681aee3 + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + 7bbf04ce-053d-4bd1-9502-df44d2c14b6d + + + 51f2d5d8-ea4d-4064-8892-82951750031e + 834b09af-82fa-42ed-9a97-05202b126864 + + + e68182ea-4237-4383-967f-90c1e3370bc7 + 1bdafb28-bc70-4011-8de1-63af7a7ebc07 + + + fb282519-d103-4dd3-bc12-cb271d631dfc + a6e1fc3f-c614-42cf-a681-36646a1f56b7 + + + + ПроверкаВерсий + + + ru + ПроверкаВерсий + + + + + Version8_3_27 + ManagedApplication + + PlatformApplication + + Russian + + + + + false + false + false + + + + + + + + + + + + + + + + + + + + + + Biometrics + true + + + Location + false + + + BackgroundLocation + false + + + BluetoothPrinters + false + + + WiFiPrinters + false + + + Contacts + false + + + Calendars + false + + + PushNotifications + false + + + LocalNotifications + false + + + InAppPurchases + false + + + PersonalComputerFileExchange + false + + + Ads + false + + + NumberDialing + false + + + CallProcessing + false + + + CallLog + false + + + AutoSendSMS + false + + + ReceiveSMS + false + + + SMSLog + false + + + Camera + false + + + Microphone + false + + + MusicLibrary + false + + + PictureAndVideoLibraries + false + + + AudioPlaybackAndVibration + false + + + BackgroundAudioPlaybackAndVibration + false + + + InstallPackages + false + + + OSBackup + true + + + ApplicationUsageStatistics + false + + + BarcodeScanning + false + + + BackgroundAudioRecording + false + + + AllFilesAccess + false + + + Videoconferences + false + + + NFC + false + + + DocumentScanning + false + + + SpeechToText + false + + + Geofences + false + + + IncomingShareRequests + false + + + AllIncomingShareRequestsTypesProcessing + false + + + TextToSpeech + false + + + + + + Normal + + + Language.Русский + + + + + + Managed + NotAutoFree + DontUse + DontUse + TaxiEnableVersion8_2 + DontUse + Version8_3_27 + + + + Русский + Склад + Товары + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Ext/ClientApplicationInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..e10c2790c --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Ext/ClientApplicationInterface.xml @@ -0,0 +1,18 @@ + + + + + cbab57f2-a0f3-4f0a-89ea-4cb19570ab75 + + + + + b553047f-c9aa-4157-978d-448ecad24248 + + + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Languages/Русский.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Languages/Русский.xml new file mode 100644 index 000000000..39e8b5bd6 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад.xml new file mode 100644 index 000000000..2eb3c9cee --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад.xml @@ -0,0 +1,24 @@ + + + + + Склад + + + ru + Склад + + + + true + true + false + + + + Catalog.Товары + + + + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад/Ext/CommandInterface.xml b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад/Ext/CommandInterface.xml new file mode 100644 index 000000000..eab47eb6d --- /dev/null +++ b/tests/skills/cases/subsystem-validate/fixtures/subsystem-version-older/Subsystems/Склад/Ext/CommandInterface.xml @@ -0,0 +1,6 @@ + + + + false + + \ No newline at end of file diff --git a/tests/skills/cases/subsystem-validate/valid-version-parts-agree.json b/tests/skills/cases/subsystem-validate/valid-version-parts-agree.json new file mode 100644 index 000000000..a67e60437 --- /dev/null +++ b/tests/skills/cases/subsystem-validate/valid-version-parts-agree.json @@ -0,0 +1,7 @@ +{ + "name": "Подсистема и её командный интерфейс в одной версии с выгрузкой — чисто", + "setup": "fixture:subsystem-version-agree", + "params": { "subsystemPath": "Subsystems/Склад.xml" }, + "noSnapshot": "subsystem-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout", + "expect": { "stdoutContains": ["=== Validation OK: Subsystem.Склад"] } +} diff --git a/tests/skills/cases/subsystem-validate/warn-version-differs-from-dump.json b/tests/skills/cases/subsystem-validate/warn-version-differs-from-dump.json new file mode 100644 index 000000000..7fc1c6b7d --- /dev/null +++ b/tests/skills/cases/subsystem-validate/warn-version-differs-from-dump.json @@ -0,0 +1,10 @@ +{ + "name": "Подсистема целиком в 2.18 в выгрузке 2.20 (мерж веток) — только предупреждение: платформа такое грузит", + "setup": "fixture:subsystem-version-older", + "params": { "subsystemPath": "Subsystems/Склад.xml" }, + "noSnapshot": "subsystem-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout", + "expect": { + "stdoutContains": ["[WARN] 14. Format version 2.18 differs from the dump (2.20) — the platform loads it"], + "stdoutNotContains": ["[ERROR]"] + } +} diff --git a/tests/skills/check-inline-drift.mjs b/tests/skills/check-inline-drift.mjs index 10beb2101..3b3920ab2 100644 --- a/tests/skills/check-inline-drift.mjs +++ b/tests/skills/check-inline-drift.mjs @@ -81,7 +81,7 @@ const FAMILIES = [ 'form-info', 'meta-info', 'mxl-info', 'role-info', 'skd-info', 'subsystem-info', // Валидаторы отличают автономную обработку от конфигурации: тот же корень — якорь выгрузки // для сверки штампа версии (find_dump_anchor) - 'form-validate', 'interface-validate', 'meta-validate', 'role-validate'] }, + 'form-validate', 'interface-validate', 'meta-validate', 'role-validate', 'subsystem-validate'] }, ], }, { @@ -130,13 +130,13 @@ const FAMILIES = [ { name: 'root_version', py: 'root_version', ps1: 'Get-RootVersion', variants: [ - { id: 'base', authority: 'meta-validate', consumers: ['cf-validate', 'form-validate', 'interface-validate', 'role-validate'] }, + { id: 'base', authority: 'meta-validate', consumers: ['cf-validate', 'form-validate', 'interface-validate', 'role-validate', 'subsystem-validate'] }, ], }, { name: 'find_dump_anchor', py: 'find_dump_anchor', ps1: 'Find-DumpAnchor', variants: [ - { id: 'base', authority: 'meta-validate', consumers: ['form-validate', 'interface-validate', 'role-validate'] }, + { id: 'base', authority: 'meta-validate', consumers: ['form-validate', 'interface-validate', 'role-validate', 'subsystem-validate'] }, ], }, {