From 1736be09039fd3b046f3bae19aff88aa19529451 Mon Sep 17 00:00:00 2001 From: Nick Shirokov Date: Sat, 26 Sep 2026 22:11:21 +0300 Subject: [PATCH] =?UTF-8?q?feat(role-validate):=20=D0=B2=D0=B5=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D1=8F=20=D1=84=D0=BE=D1=80=D0=BC=D0=B0=D1=82=D0=B0=20Rig?= =?UTF-8?q?hts.xml=20=E2=80=94=20=D0=BA=D0=B0=D0=BA=20=D1=83=20=D0=B4?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D1=80=D0=B0=20?= =?UTF-8?q?=D1=80=D0=BE=D0=BB=D0=B8;=20=D1=81=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0=20=D1=81=20=D0=B2=D1=8B=D0=B3=D1=80=D1=83=D0=B7=D0=BA?= =?UTF-8?q?=D0=BE=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Права и дескриптор роли платформа загружает только в одной версии формата («Версия формата загружаемого файла … отличается от версии формата ранее загруженных файлов»), проверено на 8.3.27.1859 в обе стороны. Rights.xml не в версии Roles/<Имя>.xml — ошибка. Роль целиком в другой версии, чем выгрузка, платформа грузит — это лишь неоднородность выгрузки (типично после мержа веток, выгруженных разными платформами), поэтому такое расхождение только предупреждение. Co-Authored-By: Sergei Pleshanov <2357qwr@gmail.com> Co-Authored-By: Claude Opus 5.5 (1M context) --- .../role-validate/scripts/role-validate.ps1 | 77 +++++- .../role-validate/scripts/role-validate.py | 88 +++++- ...error-version-differs-from-descriptor.json | 9 + .../role-version-agree/Catalogs/Товары.xml | 91 +++++++ .../Catalogs/Товары/Ext/ObjectModule.bsl | 1 + .../role-version-agree/Configuration.xml | 257 ++++++++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++ .../role-version-agree/Languages/Русский.xml | 16 ++ .../role-version-agree/Roles/Пользователь.xml | 15 + .../Roles/Пользователь/Ext/Rights.xml | 21 ++ .../role-version-older/Catalogs/Товары.xml | 91 +++++++ .../Catalogs/Товары/Ext/ObjectModule.bsl | 1 + .../role-version-older/Configuration.xml | 257 ++++++++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++ .../role-version-older/Languages/Русский.xml | 16 ++ .../role-version-older/Roles/Пользователь.xml | 15 + .../Roles/Пользователь/Ext/Rights.xml | 21 ++ .../Catalogs/Товары.xml | 91 +++++++ .../Catalogs/Товары/Ext/ObjectModule.bsl | 1 + .../Configuration.xml | 257 ++++++++++++++++++ .../Ext/ClientApplicationInterface.xml | 18 ++ .../Languages/Русский.xml | 16 ++ .../Roles/Пользователь.xml | 15 + .../Roles/Пользователь/Ext/Rights.xml | 21 ++ .../valid-version-matches-descriptor.json | 7 + .../warn-version-differs-from-dump.json | 10 + tests/skills/check-inline-drift.mjs | 8 +- 27 files changed, 1450 insertions(+), 6 deletions(-) create mode 100644 tests/skills/cases/role-validate/error-version-differs-from-descriptor.json create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-agree/Configuration.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-agree/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-agree/Languages/Русский.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь/Ext/Rights.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-older/Configuration.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-older/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-older/Languages/Русский.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь/Ext/Rights.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары/Ext/ObjectModule.bsl create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Configuration.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Ext/ClientApplicationInterface.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Languages/Русский.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь.xml create mode 100644 tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь/Ext/Rights.xml create mode 100644 tests/skills/cases/role-validate/valid-version-matches-descriptor.json create mode 100644 tests/skills/cases/role-validate/warn-version-differs-from-dump.json diff --git a/.claude/skills/role-validate/scripts/role-validate.ps1 b/.claude/skills/role-validate/scripts/role-validate.ps1 index 7476ab880..ff9b5d804 100644 --- a/.claude/skills/role-validate/scripts/role-validate.ps1 +++ b/.claude/skills/role-validate/scripts/role-validate.ps1 @@ -1,4 +1,4 @@ -# role-validate v1.6 — Validate 1C role structure +# role-validate v1.7 — Validate 1C role structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills [CmdletBinding(PositionalBinding=$false)] param( @@ -297,6 +297,61 @@ function Find-Similar { return $result } +# Штамп версии формата — атрибут 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 +} + +# Владелец тела X/Ext/<файл>.xml — дескриптор X.xml рядом с каталогом X. Копия общего эталона +# (семья ext_body_owner, авторитет — form-validate). +function Get-ExtBodyOwner([string]$bodyPath) { + $extDir = [System.IO.Path]::GetDirectoryName($bodyPath) + if ([System.IO.Path]::GetFileName($extDir) -cne "Ext") { return $null } + $objDir = [System.IO.Path]::GetDirectoryName($extDir) + if (Test-Path -LiteralPath "$objDir.xml" -PathType Leaf) { return "$objDir.xml" } + $cfg = Join-Path $objDir "Configuration.xml" + if (Test-Path -LiteralPath $cfg -PathType Leaf) { return $cfg } + return $null +} + # --- Resolve path --- if (-not [System.IO.Path]::IsPathRooted($RightsPath)) { $RightsPath = Join-Path (Get-Location).Path $RightsPath @@ -552,6 +607,26 @@ if (Test-Path $MetadataPath) { } } +# --- 4b. Format version: Rights.xml — как у дескриптора роли; сверка с выгрузкой --- +# Права и дескриптор роли платформа загружает только в одной версии формата: «Версия формата +# загружаемого файла … отличается от версии формата ранее загруженных файлов». С остальной выгрузкой +# роль может расходиться — платформа такое грузит, это лишь неоднородность выгрузки (типично после +# мержа веток, выгруженных разными платформами). +$rightsVer = $root.GetAttribute("version") +if ($rightsVer) { + $ownerPath = Get-ExtBodyOwner $resolvedRights + $ownerVer = if ($ownerPath) { Get-RootVersion $ownerPath } else { $null } + $dumpAnchor = Find-DumpAnchor (Split-Path $resolvedRights -Parent) + $dumpVer = if ($dumpAnchor) { Get-RootVersion $dumpAnchor } else { $null } + if ($ownerVer -and $rightsVer -ne $ownerVer) { + Report-Error "Format version $rightsVer differs from the role descriptor $([System.IO.Path]::GetFileName($ownerPath)) ($ownerVer) — the platform refuses to load parts of one object in different formats" + } elseif ($dumpVer -and $rightsVer -ne $dumpVer) { + Report-Warn "Format version $rightsVer 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 ($ownerVer -or $dumpVer) { + Report-OK "Format version: $rightsVer, matches the descriptor and the dump" + } +} + # --- 5. Check registration in Configuration.xml --- $configDir = Split-Path $rolesDir -Parent diff --git a/.claude/skills/role-validate/scripts/role-validate.py b/.claude/skills/role-validate/scripts/role-validate.py index f4c2ada40..307ab493d 100644 --- a/.claude/skills/role-validate/scripts/role-validate.py +++ b/.claude/skills/role-validate/scripts/role-validate.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# role-validate v1.6 — Validate 1C role Rights.xml structure +# role-validate v1.7 — Validate 1C role Rights.xml structure # Source: https://github.com/Nikolay-Shirokov/cc-1c-skills """Validates role Rights.xml: root element, global flags, objects, rights, RLS, templates.""" import sys, os, argparse, re @@ -298,6 +298,71 @@ def get_child_el(parent, local_name, ns): return None +# Штамп версии формата — атрибут 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 + + +# Владелец тела X/Ext/<файл>.xml — дескриптор X.xml рядом с каталогом X. Копия общего эталона +# (семья ext_body_owner, авторитет — form-validate). +def ext_body_owner(body_path): + ext_dir = os.path.dirname(body_path) + if os.path.basename(ext_dir) != "Ext": + return None + obj_dir = os.path.dirname(ext_dir) + if os.path.isfile(obj_dir + ".xml"): + return obj_dir + ".xml" + cfg = os.path.join(obj_dir, "Configuration.xml") + if os.path.isfile(cfg): + return cfg + return None + + def main(): sys.stdout.reconfigure(encoding="utf-8") sys.stderr.reconfigure(encoding="utf-8") @@ -600,6 +665,27 @@ def main(): except etree.XMLSyntaxError as e: report_error(f'Metadata XML parse error: {e}') + # --- 4b. Format version: Rights.xml — как у дескриптора роли; сверка с выгрузкой --- + # Права и дескриптор роли платформа загружает только в одной версии формата: «Версия формата + # загружаемого файла … отличается от версии формата ранее загруженных файлов». С остальной выгрузкой + # роль может расходиться — платформа такое грузит, это лишь неоднородность выгрузки (типично после + # мержа веток, выгруженных разными платформами). + rights_ver = root.get('version', '') + if rights_ver: + owner_path = ext_body_owner(resolved_path) + owner_ver = root_version(owner_path) if owner_path else None + dump_anchor = find_dump_anchor(os.path.dirname(resolved_path)) + dump_ver = root_version(dump_anchor) if dump_anchor else None + if owner_ver and rights_ver != owner_ver: + report_error(f'Format version {rights_ver} differs from the role descriptor ' + f'{os.path.basename(owner_path)} ({owner_ver}) ' + '— the platform refuses to load parts of one object in different formats') + elif dump_ver and rights_ver != dump_ver: + report_warn(f'Format version {rights_ver} 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 owner_ver or dump_ver: + report_ok(f'Format version: {rights_ver}, matches the descriptor and the dump') + # --- 5. Check registration in Configuration.xml --- config_dir = os.path.dirname(roles_dir) # config root config_xml_path = os.path.join(config_dir, 'Configuration.xml') diff --git a/tests/skills/cases/role-validate/error-version-differs-from-descriptor.json b/tests/skills/cases/role-validate/error-version-differs-from-descriptor.json new file mode 100644 index 000000000..6bf447593 --- /dev/null +++ b/tests/skills/cases/role-validate/error-version-differs-from-descriptor.json @@ -0,0 +1,9 @@ +{ + "name": "Rights.xml 2.18 при дескрипторе роли 2.20 — ошибка: платформа такую роль не загрузит", + "setup": "fixture:role-version-rights-differs", + "params": { "rightsPath": "Roles/Пользователь/Ext/Rights.xml" }, + "expectError": true, + "noSnapshot": "role-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout", + "expect": { "stdoutContains": ["Format version 2.18 differs from the role descriptor Пользователь.xml (2.20)"] }, + "skipPlatformVerify": "фикстура намеренно не загружается: права и дескриптор роли в разных версиях формата" +} diff --git a/tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары.xml new file mode 100644 index 000000000..5222eeabc --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары.xml @@ -0,0 +1,91 @@ + + + + + + 4cc74a39-0ac3-4986-af39-86de1e68dcc8 + 35a64904-a3dc-4c45-9241-3177c8319fca + + + 2406a38b-bc60-4e58-8f4f-8e031edfbfda + eb915d43-0b7e-4ae8-92cd-7c7aea239e17 + + + bedd8eca-9bfe-4eda-a377-3088cdaf2d39 + 2b694379-fd05-449e-85cb-4ca0937547fc + + + 3777ac4b-06c8-4a1a-82eb-1f67d2570807 + e8f8e58d-8ef1-4a69-8027-4c617b3fad95 + + + ec2ab36f-f905-4829-bdd5-7fcf10a87e7b + b2f8b1a9-f56e-43e4-a227-8757e6f82a07 + + + + Товары + + + 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/role-validate/fixtures/role-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Catalogs/Товары/Ext/ObjectModule.bsl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-agree/Configuration.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Configuration.xml new file mode 100644 index 000000000..d109570a9 --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Configuration.xml @@ -0,0 +1,257 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + 21f02fb0-500d-4b6f-ac46-342ec5f0e0bf + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + d6224327-f7d0-4afa-8873-ebe468a6e816 + + + e3687481-0a87-462c-a166-9f34594f9bba + 615275b4-f92f-4e16-bffa-218db24552bc + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + e96bc620-c6bf-4abd-9815-2cc8de050529 + + + 51f2d5d8-ea4d-4064-8892-82951750031e + cef4bcf2-bdd0-4a2d-9ad0-39fecd55235d + + + e68182ea-4237-4383-967f-90c1e3370bc7 + df527126-d976-4263-874c-b529dec2bdea + + + fb282519-d103-4dd3-bc12-cb271d631dfc + 3235a01a-a49f-4145-9d15-3092f0be8e41 + + + + ПроверкаВерсий + + + 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/role-validate/fixtures/role-version-agree/Ext/ClientApplicationInterface.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..dc56d730f --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-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/role-validate/fixtures/role-version-agree/Languages/Русский.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Languages/Русский.xml new file mode 100644 index 000000000..8f3faf0ff --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь.xml new file mode 100644 index 000000000..f2322914a --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь.xml @@ -0,0 +1,15 @@ + + + + + Пользователь + + + ru + Пользователь + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь/Ext/Rights.xml b/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь/Ext/Rights.xml new file mode 100644 index 000000000..2ff5c1b79 --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-agree/Roles/Пользователь/Ext/Rights.xml @@ -0,0 +1,21 @@ + + + false + true + false + + Catalog.Товары + + Read + true + + + View + true + + + InputByString + true + + + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары.xml new file mode 100644 index 000000000..5222eeabc --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары.xml @@ -0,0 +1,91 @@ + + + + + + 4cc74a39-0ac3-4986-af39-86de1e68dcc8 + 35a64904-a3dc-4c45-9241-3177c8319fca + + + 2406a38b-bc60-4e58-8f4f-8e031edfbfda + eb915d43-0b7e-4ae8-92cd-7c7aea239e17 + + + bedd8eca-9bfe-4eda-a377-3088cdaf2d39 + 2b694379-fd05-449e-85cb-4ca0937547fc + + + 3777ac4b-06c8-4a1a-82eb-1f67d2570807 + e8f8e58d-8ef1-4a69-8027-4c617b3fad95 + + + ec2ab36f-f905-4829-bdd5-7fcf10a87e7b + b2f8b1a9-f56e-43e4-a227-8757e6f82a07 + + + + Товары + + + 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/role-validate/fixtures/role-version-older/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары/Ext/ObjectModule.bsl new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Catalogs/Товары/Ext/ObjectModule.bsl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-older/Configuration.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Configuration.xml new file mode 100644 index 000000000..d109570a9 --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Configuration.xml @@ -0,0 +1,257 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + 21f02fb0-500d-4b6f-ac46-342ec5f0e0bf + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + d6224327-f7d0-4afa-8873-ebe468a6e816 + + + e3687481-0a87-462c-a166-9f34594f9bba + 615275b4-f92f-4e16-bffa-218db24552bc + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + e96bc620-c6bf-4abd-9815-2cc8de050529 + + + 51f2d5d8-ea4d-4064-8892-82951750031e + cef4bcf2-bdd0-4a2d-9ad0-39fecd55235d + + + e68182ea-4237-4383-967f-90c1e3370bc7 + df527126-d976-4263-874c-b529dec2bdea + + + fb282519-d103-4dd3-bc12-cb271d631dfc + 3235a01a-a49f-4145-9d15-3092f0be8e41 + + + + ПроверкаВерсий + + + 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/role-validate/fixtures/role-version-older/Ext/ClientApplicationInterface.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..dc56d730f --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-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/role-validate/fixtures/role-version-older/Languages/Русский.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Languages/Русский.xml new file mode 100644 index 000000000..8f3faf0ff --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь.xml new file mode 100644 index 000000000..305eb395d --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь.xml @@ -0,0 +1,15 @@ + + + + + Пользователь + + + ru + Пользователь + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь/Ext/Rights.xml b/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь/Ext/Rights.xml new file mode 100644 index 000000000..c3121d4a4 --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-older/Roles/Пользователь/Ext/Rights.xml @@ -0,0 +1,21 @@ + + + false + true + false + + Catalog.Товары + + Read + true + + + View + true + + + InputByString + true + + + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары.xml new file mode 100644 index 000000000..5222eeabc --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары.xml @@ -0,0 +1,91 @@ + + + + + + 4cc74a39-0ac3-4986-af39-86de1e68dcc8 + 35a64904-a3dc-4c45-9241-3177c8319fca + + + 2406a38b-bc60-4e58-8f4f-8e031edfbfda + eb915d43-0b7e-4ae8-92cd-7c7aea239e17 + + + bedd8eca-9bfe-4eda-a377-3088cdaf2d39 + 2b694379-fd05-449e-85cb-4ca0937547fc + + + 3777ac4b-06c8-4a1a-82eb-1f67d2570807 + e8f8e58d-8ef1-4a69-8027-4c617b3fad95 + + + ec2ab36f-f905-4829-bdd5-7fcf10a87e7b + b2f8b1a9-f56e-43e4-a227-8757e6f82a07 + + + + Товары + + + 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/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары/Ext/ObjectModule.bsl b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары/Ext/ObjectModule.bsl new file mode 100644 index 000000000..5f282702b --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Catalogs/Товары/Ext/ObjectModule.bsl @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Configuration.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Configuration.xml new file mode 100644 index 000000000..d109570a9 --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Configuration.xml @@ -0,0 +1,257 @@ + + + + + + 9cd510cd-abfc-11d4-9434-004095e12fc7 + 21f02fb0-500d-4b6f-ac46-342ec5f0e0bf + + + 9fcd25a0-4822-11d4-9414-008048da11f9 + d6224327-f7d0-4afa-8873-ebe468a6e816 + + + e3687481-0a87-462c-a166-9f34594f9bba + 615275b4-f92f-4e16-bffa-218db24552bc + + + 9de14907-ec23-4a07-96f0-85521cb6b53b + e96bc620-c6bf-4abd-9815-2cc8de050529 + + + 51f2d5d8-ea4d-4064-8892-82951750031e + cef4bcf2-bdd0-4a2d-9ad0-39fecd55235d + + + e68182ea-4237-4383-967f-90c1e3370bc7 + df527126-d976-4263-874c-b529dec2bdea + + + fb282519-d103-4dd3-bc12-cb271d631dfc + 3235a01a-a49f-4145-9d15-3092f0be8e41 + + + + ПроверкаВерсий + + + 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/role-validate/fixtures/role-version-rights-differs/Ext/ClientApplicationInterface.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Ext/ClientApplicationInterface.xml new file mode 100644 index 000000000..dc56d730f --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-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/role-validate/fixtures/role-version-rights-differs/Languages/Русский.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Languages/Русский.xml new file mode 100644 index 000000000..8f3faf0ff --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Languages/Русский.xml @@ -0,0 +1,16 @@ + + + + + Русский + + + ru + Русский + + + + ru + + + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь.xml new file mode 100644 index 000000000..f2322914a --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь.xml @@ -0,0 +1,15 @@ + + + + + Пользователь + + + ru + Пользователь + + + + + + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь/Ext/Rights.xml b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь/Ext/Rights.xml new file mode 100644 index 000000000..c3121d4a4 --- /dev/null +++ b/tests/skills/cases/role-validate/fixtures/role-version-rights-differs/Roles/Пользователь/Ext/Rights.xml @@ -0,0 +1,21 @@ + + + false + true + false + + Catalog.Товары + + Read + true + + + View + true + + + InputByString + true + + + \ No newline at end of file diff --git a/tests/skills/cases/role-validate/valid-version-matches-descriptor.json b/tests/skills/cases/role-validate/valid-version-matches-descriptor.json new file mode 100644 index 000000000..3f362f378 --- /dev/null +++ b/tests/skills/cases/role-validate/valid-version-matches-descriptor.json @@ -0,0 +1,7 @@ +{ + "name": "Rights.xml в версии дескриптора роли и выгрузки — чисто", + "setup": "fixture:role-version-agree", + "params": { "rightsPath": "Roles/Пользователь/Ext/Rights.xml" }, + "noSnapshot": "role-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout", + "expect": { "stdoutContains": ["=== Validation OK: Role.Пользователь"] } +} diff --git a/tests/skills/cases/role-validate/warn-version-differs-from-dump.json b/tests/skills/cases/role-validate/warn-version-differs-from-dump.json new file mode 100644 index 000000000..2def112e5 --- /dev/null +++ b/tests/skills/cases/role-validate/warn-version-differs-from-dump.json @@ -0,0 +1,10 @@ +{ + "name": "Роль целиком в 2.18 в выгрузке 2.20 (мерж веток) — только предупреждение: платформа такое грузит", + "setup": "fixture:role-version-older", + "params": { "rightsPath": "Roles/Пользователь/Ext/Rights.xml" }, + "noSnapshot": "role-validate только читает и печатает — эталон зафиксировал бы фикстуру, а не выход проверяемого навыка; проверяется stdout", + "expect": { + "stdoutContains": ["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 99e25150c..5f6f304b6 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', 'meta-validate'] }, + 'form-validate', 'meta-validate', 'role-validate'] }, ], }, { @@ -130,19 +130,19 @@ const FAMILIES = [ { name: 'root_version', py: 'root_version', ps1: 'Get-RootVersion', variants: [ - { id: 'base', authority: 'meta-validate', consumers: ['cf-validate', 'form-validate'] }, + { id: 'base', authority: 'meta-validate', consumers: ['cf-validate', 'form-validate', 'role-validate'] }, ], }, { name: 'find_dump_anchor', py: 'find_dump_anchor', ps1: 'Find-DumpAnchor', variants: [ - { id: 'base', authority: 'meta-validate', consumers: ['form-validate'] }, + { id: 'base', authority: 'meta-validate', consumers: ['form-validate', 'role-validate'] }, ], }, { name: 'ext_body_owner', py: 'ext_body_owner', ps1: 'Get-ExtBodyOwner', variants: [ - { id: 'base', authority: 'form-validate', consumers: [] }, + { id: 'base', authority: 'form-validate', consumers: ['role-validate'] }, ], }, {