mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-08-13 15:03:20 +03:00
fix(mxl-compile): выводить идентификатор раскладки как корректный UUIDv3
Идентификатор колоночной раскладки выводится из имени детерминированно — это требование, а не оптимизация: случайный давал бы другой файл при каждой компиляции, снэпшоты не совпадали бы сами с собой, а повторная сборка того же определения порождала бы диф. Но выводился он неправильно: сырой хэш форматировался как UUID, без битов версии и варианта. В выдаваемом значении версия оказывалась 7, вариант 1 — таких не бывает, то есть формально это был не UUID, а шестнадцатеричная строка нужной формы. Платформа такое принимает (проверено сертификацией), но упереться в валидатор мы могли в любой момент — ровно того же сорта риск, что сертификация уже ловила в этой ветке. Теперь это штатный UUID версии 3 (имя + MD5, RFC 4122): для задачи «вывести идентификатор из имени» существует именно он. Детерминированность сохранена, оба порта дают одинаковое значение. Проверено: тесты 53/53 на обоих рантаймах, verify-snapshots 23/23. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
61199cfe9e
commit
66c7364c37
@@ -1,4 +1,4 @@
|
||||
# mxl-compile v1.21 — Compile 1C spreadsheet from JSON (+write_xml_file/write_utf8_bom: общий эталон записи)
|
||||
# mxl-compile v1.22 — Compile 1C spreadsheet from JSON (+write_xml_file/write_utf8_bom: общий эталон записи)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
param(
|
||||
[Parameter(Mandatory)]
|
||||
@@ -400,8 +400,13 @@ function ConvertTo-LayoutId {
|
||||
if ($name -match '^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$') {
|
||||
return $name
|
||||
}
|
||||
# UUID версии 3 (имя + MD5, RFC 4122): биты версии и варианта проставляются, иначе это
|
||||
# не UUID, а просто шестнадцатеричная строка нужной формы.
|
||||
$md5 = [System.Security.Cryptography.MD5]::Create()
|
||||
$h = ($md5.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($name)) | ForEach-Object { $_.ToString('x2') }) -join ''
|
||||
$b = $md5.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($name))
|
||||
$b[6] = [byte](($b[6] -band 0x0F) -bor 0x30) # версия 3
|
||||
$b[8] = [byte](($b[8] -band 0x3F) -bor 0x80) # вариант RFC 4122
|
||||
$h = ($b | ForEach-Object { $_.ToString('x2') }) -join ''
|
||||
return "$($h.Substring(0,8))-$($h.Substring(8,4))-$($h.Substring(12,4))-$($h.Substring(16,4))-$($h.Substring(20,12))"
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env python3
|
||||
# mxl-compile v1.21 — Compile 1C spreadsheet from JSON (+write_xml_file/write_utf8_bom: общий эталон записи)
|
||||
# mxl-compile v1.22 — Compile 1C spreadsheet from JSON (+write_xml_file/write_utf8_bom: общий эталон записи)
|
||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||
import argparse
|
||||
import hashlib
|
||||
@@ -504,7 +504,12 @@ def main():
|
||||
if re.match(r'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-'
|
||||
r'[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$', name):
|
||||
return name
|
||||
h = hashlib.md5(name.encode('utf-8')).hexdigest()
|
||||
# UUID версии 3 (имя + MD5, RFC 4122): биты версии и варианта проставляются, иначе это
|
||||
# не UUID, а просто шестнадцатеричная строка нужной формы.
|
||||
b = bytearray(hashlib.md5(name.encode('utf-8')).digest())
|
||||
b[6] = (b[6] & 0x0F) | 0x30 # версия 3
|
||||
b[8] = (b[8] & 0x3F) | 0x80 # вариант RFC 4122
|
||||
h = b.hex()
|
||||
return f'{h[0:8]}-{h[8:12]}-{h[12:16]}-{h[16:20]}-{h[20:32]}'
|
||||
|
||||
column_layouts = [{'Id': None, 'Name': None, 'Size': total_columns, 'Widths': col_width_map}]
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "Колоночные раскладки: своя ширина колонок у группы строк (id выводится из имени детерминированно, ожидаемый GUID = md5 от \"узкая\")",
|
||||
"name": "Колоночные раскладки: своя ширина колонок у группы строк (id выводится из имени детерминированно, ожидаемый = UUIDv3 от \"узкая\")",
|
||||
"input": {
|
||||
"columns": 3,
|
||||
"columnWidths": { "1-3": 20 },
|
||||
@@ -20,8 +20,8 @@
|
||||
"fileContains": {
|
||||
"file": "Template.xml",
|
||||
"text": [
|
||||
"<id>12320174-2b07-7806-1f7f-ec3834007fdb</id>",
|
||||
"<columnsID>12320174-2b07-7806-1f7f-ec3834007fdb</columnsID>"
|
||||
"<id>12320174-2b07-3806-9f7f-ec3834007fdb</id>",
|
||||
"<columnsID>12320174-2b07-3806-9f7f-ec3834007fdb</columnsID>"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
</columnsItem>
|
||||
</columns>
|
||||
<columns>
|
||||
<id>12320174-2b07-7806-1f7f-ec3834007fdb</id>
|
||||
<id>12320174-2b07-3806-9f7f-ec3834007fdb</id>
|
||||
<size>3</size>
|
||||
<columnsItem>
|
||||
<index>0</index>
|
||||
@@ -96,7 +96,7 @@
|
||||
<rowsItem>
|
||||
<index>1</index>
|
||||
<row>
|
||||
<columnsID>12320174-2b07-7806-1f7f-ec3834007fdb</columnsID>
|
||||
<columnsID>12320174-2b07-3806-9f7f-ec3834007fdb</columnsID>
|
||||
<c>
|
||||
<i>0</i>
|
||||
<c>
|
||||
|
||||
Reference in New Issue
Block a user