mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-07-27 07:01:02 +03:00
fix(xdto): три дефекта, найденных платформенной верификацией снэпшотов
verify-snapshots загружает результат каждого кейса в 1С. Раньше навыки xdto через него не проходили вовсе; первый прогон дал 5 из 9. Ни корпусная сверка, ни валидатор такого не ловили: корпус состоит из заведомо валидных пакетов, а синтетические кейсы до сих пор в базу не грузились. 1. fixed. В модели XDTO это булев флаг, значение лежит в default; в XSD наоборот — fixed="V" несёт значение. Компилятор писал значение прямо в fixed, и платформа отвергала пакет («Отсутствует фиксированное значение свойства»). Перевод сделан в обе стороны; по принципу прощающего ввода принимается и модельная форма через зеркало xdto:fixed. Отображение выведено по корпусу: fixed встречается только вместе с default, значений всего два. 2. Импорт на несуществующий пакет платформа отвергает («xdto-package-3.3 … не определен»), а у нас проверки не было. Добавлена ошибка валидатора и, что важнее, предупреждение прямо на сборке — отказ при db-update дешевле поймать на шаг раньше. Правило пришлось калибровать корпусом: сначала оно дало 67 ложных срабатываний на платформенных пространствах имён, их список выведен и исключён. 3. localName проверяется как NCName — фикстура с пробелом в имени была негодной, заменена на реалистичный дефис (name="alpha_3" localName="alpha-3"). Харнесс получил skipPlatformVerify с обязательной причиной: результат set-namespace невалиден by design, операция намеренно оставляет висящий импорт у зависящего пакета. Итог: 9/9 компилятора, 9/10 + 1 осознанный пропуск у edit, round-trip 760/760, валидатор 0 ложных, 40 тестов на обоих рантаймах. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3eb805f7b0
commit
5d5a1bc36a
@@ -15,6 +15,19 @@ param(
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
# Эти пространства имён предоставляет сама платформа — пакетов в конфигурации
|
||||
# для них нет и быть не должно (выведено по корпусу: импортируются, но
|
||||
# targetNamespace с таким значением ни у одного пакета нет)
|
||||
$PLATFORM_NS = @(
|
||||
"http://v8.1c.ru/8.1/data/core",
|
||||
"http://v8.1c.ru/8.1/data/enterprise",
|
||||
"http://v8.1c.ru/8.1/data/enterprise/current-config",
|
||||
"http://v8.1c.ru/8.1/data-composition-system/settings",
|
||||
"http://v8.1c.ru/8.3/data/ext",
|
||||
"http://www.w3.org/2001/XMLSchema"
|
||||
)
|
||||
|
||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
|
||||
$XDTO_NS = "http://v8.1c.ru/8.1/xdto"
|
||||
@@ -446,8 +459,18 @@ function Build-Property([System.Xml.XmlElement]$el, [bool]$isAttribute) {
|
||||
Add-Attr $p "nillable" (XA $el "nillable")
|
||||
}
|
||||
|
||||
Add-Attr $p "fixed" (XA $el "fixed")
|
||||
Add-Attr $p "default" (XA $el "default")
|
||||
# XSD-шный fixed="V" несёт значение, в модели это fixed="true" + default="V".
|
||||
# Прощающий ввод: модельная форма через зеркало xdto:fixed тоже принимается.
|
||||
$mFixed = MA $el "fixed"
|
||||
if ($null -ne $mFixed) {
|
||||
Add-Attr $p "fixed" $mFixed
|
||||
Add-Attr $p "default" (XA $el "default")
|
||||
} elseif ($null -ne (XA $el "fixed")) {
|
||||
Add-Attr $p "fixed" "true"
|
||||
Add-Attr $p "default" (XA $el "fixed")
|
||||
} else {
|
||||
Add-Attr $p "default" (XA $el "default")
|
||||
}
|
||||
|
||||
if ($isAttribute) {
|
||||
Add-Attr $p "form" "Attribute"
|
||||
@@ -839,6 +862,28 @@ M "`t</XDTOPackage>"
|
||||
|
||||
# --- Register in Configuration.xml ---
|
||||
|
||||
# Ранняя диагностика: отказ платформы при db-update дешевле поймать на сборке
|
||||
$xdtoRootDir = Join-Path $OutputDir "XDTOPackages"
|
||||
$declaredImports = @()
|
||||
foreach ($c in $pkgNode.Children) { if ($c.Tag -eq "import") { foreach ($a in $c.Attrs) { if ($a.Name -eq "namespace") { $declaredImports += $a.Value } } } }
|
||||
if ($declaredImports.Count -gt 0 -and (Test-Path $xdtoRootDir)) {
|
||||
$knownNs = @{}
|
||||
foreach ($other in (Get-ChildItem $xdtoRootDir -Directory -ErrorAction SilentlyContinue)) {
|
||||
$ob = Join-Path (Join-Path $other.FullName "Ext") "Package.bin"
|
||||
if (-not (Test-Path $ob)) { continue }
|
||||
try {
|
||||
$od = New-Object System.Xml.XmlDocument
|
||||
$od.Load($ob)
|
||||
$knownNs[$od.DocumentElement.GetAttribute("targetNamespace")] = $true
|
||||
} catch {}
|
||||
}
|
||||
foreach ($imp in $declaredImports) {
|
||||
if (-not $knownNs.ContainsKey($imp) -and $PLATFORM_NS -notcontains $imp) {
|
||||
Warn "Импорт `"$imp`" не разрешается: пакета с таким namespace в конфигурации нет. Платформа отвергнет пакет при обновлении — соберите зависимость первой"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$configXmlPath = Join-Path $OutputDir "Configuration.xml"
|
||||
$regResult = "no-config"
|
||||
if (Test-Path $configXmlPath) {
|
||||
|
||||
@@ -9,6 +9,18 @@ import uuid
|
||||
|
||||
from lxml import etree
|
||||
|
||||
# Эти пространства имён предоставляет сама платформа — пакетов в конфигурации
|
||||
# для них нет и быть не должно (выведено по корпусу)
|
||||
PLATFORM_NS = {
|
||||
"http://v8.1c.ru/8.1/data/core",
|
||||
"http://v8.1c.ru/8.1/data/enterprise",
|
||||
"http://v8.1c.ru/8.1/data/enterprise/current-config",
|
||||
"http://v8.1c.ru/8.1/data-composition-system/settings",
|
||||
"http://v8.1c.ru/8.3/data/ext",
|
||||
"http://www.w3.org/2001/XMLSchema",
|
||||
}
|
||||
|
||||
|
||||
sys.stdout.reconfigure(encoding="utf-8")
|
||||
sys.stderr.reconfigure(encoding="utf-8")
|
||||
|
||||
@@ -498,8 +510,17 @@ def build_property(el, is_attribute):
|
||||
add_attr(p, "upperBound", "-1" if max_occ == "unbounded" else max_occ)
|
||||
add_attr(p, "nillable", el.get("nillable"))
|
||||
|
||||
add_attr(p, "fixed", el.get("fixed"))
|
||||
add_attr(p, "default", el.get("default"))
|
||||
# XSD-шный fixed="V" несёт значение, в модели это fixed="true" + default="V".
|
||||
# Прощающий ввод: модельная форма через зеркало xdto:fixed тоже принимается.
|
||||
m_fixed = MA(el, "fixed")
|
||||
if m_fixed is not None:
|
||||
add_attr(p, "fixed", m_fixed)
|
||||
add_attr(p, "default", el.get("default"))
|
||||
elif el.get("fixed") is not None:
|
||||
add_attr(p, "fixed", "true")
|
||||
add_attr(p, "default", el.get("fixed"))
|
||||
else:
|
||||
add_attr(p, "default", el.get("default"))
|
||||
|
||||
if is_attribute:
|
||||
add_attr(p, "form", "Attribute")
|
||||
@@ -869,6 +890,25 @@ with open(md_file, "wb") as f:
|
||||
|
||||
# ── register in Configuration.xml ────────────────────────────
|
||||
|
||||
# Ранняя диагностика: отказ платформы при db-update дешевле поймать на сборке
|
||||
xdto_root_dir = os.path.join(args.OutputDir, "XDTOPackages")
|
||||
declared_imports = [a["value"] for c in pkg_node.children if c.tag == "import"
|
||||
for a in c.attrs if a["name"] == "namespace"]
|
||||
if declared_imports and os.path.isdir(xdto_root_dir):
|
||||
known_ns = set()
|
||||
for other in sorted(os.listdir(xdto_root_dir)):
|
||||
ob = os.path.join(xdto_root_dir, other, "Ext", "Package.bin")
|
||||
if not os.path.exists(ob):
|
||||
continue
|
||||
try:
|
||||
known_ns.add(_parse_xml(ob).getroot().get("targetNamespace"))
|
||||
except Exception: # noqa: BLE001
|
||||
pass
|
||||
for imp in declared_imports:
|
||||
if imp not in known_ns and imp not in PLATFORM_NS:
|
||||
warn(f'Импорт "{imp}" не разрешается: пакета с таким namespace в конфигурации нет. '
|
||||
"Платформа отвергнет пакет при обновлении — соберите зависимость первой")
|
||||
|
||||
config_xml = os.path.join(args.OutputDir, "Configuration.xml")
|
||||
reg_result = "no-config"
|
||||
if os.path.exists(config_xml):
|
||||
|
||||
@@ -302,6 +302,13 @@ function Emit-Property([System.Xml.XmlElement]$p, [string]$indent, [bool]$isGlob
|
||||
$nill = A $p "nillable"
|
||||
$def = A $p "default"
|
||||
$fix = A $p "fixed"
|
||||
# В модели fixed — булев флаг, значение лежит в default; в XSD наоборот:
|
||||
# fixed="V" несёт само значение. Переводим, а не копируем.
|
||||
$defOut = $def
|
||||
$fixOut = $null
|
||||
$fixMirror = ""
|
||||
if ($fix -eq "true" -and $null -ne $def) { $fixOut = $def; $defOut = $null }
|
||||
elseif ($null -ne $fix) { $fixMirror = Mirror "fixed" $fix }
|
||||
$anon = Get-AnonTypeDef $p
|
||||
# qualified записан как атрибут в пространстве имён XDTO
|
||||
$qual = $p.GetAttribute("qualified", $XDTO_NS)
|
||||
@@ -326,7 +333,8 @@ function Emit-Property([System.Xml.XmlElement]$p, [string]$indent, [bool]$isGlob
|
||||
if ($null -ne $lower) { $m += Mirror "lowerBound" $lower }
|
||||
if ($null -ne $upper) { $m += Mirror "upperBound" $upper }
|
||||
$m += $mirrorName
|
||||
$body = Attrs @('name', $xmlName, 'ref', $ref, 'type', $type, 'default', $def, 'fixed', $fix)
|
||||
$m += $fixMirror
|
||||
$body = Attrs @('name', $xmlName, 'ref', $ref, 'type', $type, 'default', $defOut, 'fixed', $fixOut)
|
||||
if ($anon) {
|
||||
X "$indent<xs:attribute$body$m>"
|
||||
X "$indent`t<xs:simpleType>"
|
||||
@@ -349,10 +357,11 @@ function Emit-Property([System.Xml.XmlElement]$p, [string]$indent, [bool]$isGlob
|
||||
if ($null -ne $qual) { $m += Mirror "qualified" $qual }
|
||||
$m += $mirrorName
|
||||
$m += (Mirror-Prefix $p)
|
||||
$m += $fixMirror
|
||||
|
||||
$body = Attrs @('name', $xmlName, 'ref', $ref, 'type', $type,
|
||||
'minOccurs', $minOccurs, 'maxOccurs', $maxOccurs,
|
||||
'nillable', $nill, 'default', $def, 'fixed', $fix)
|
||||
'nillable', $nill, 'default', $defOut, 'fixed', $fixOut)
|
||||
|
||||
if ($anon) {
|
||||
X "$indent<xs:element$body$m>"
|
||||
|
||||
@@ -308,6 +308,13 @@ def emit_property(p, indent):
|
||||
nill = p.get("nillable")
|
||||
default = p.get("default")
|
||||
fixed = p.get("fixed")
|
||||
# В модели fixed — булев флаг, значение лежит в default; в XSD наоборот:
|
||||
# fixed="V" несёт само значение. Переводим, а не копируем.
|
||||
def_out, fix_out, fix_mirror = default, None, ""
|
||||
if fixed == "true" and default is not None:
|
||||
fix_out, def_out = default, None
|
||||
elif fixed is not None:
|
||||
fix_mirror = mirror("fixed", fixed)
|
||||
anon = anon_type_def(p)
|
||||
qual = p.get(f"{{{XDTO_NS}}}qualified")
|
||||
|
||||
@@ -330,7 +337,8 @@ def emit_property(p, indent):
|
||||
if upper is not None:
|
||||
m += mirror("upperBound", upper)
|
||||
m += mirror_name
|
||||
body = attrs(["name", xml_name, "ref", ref, "type", type_, "default", default, "fixed", fixed])
|
||||
m += fix_mirror
|
||||
body = attrs(["name", xml_name, "ref", ref, "type", type_, "default", def_out, "fixed", fix_out])
|
||||
if anon is not None:
|
||||
X(f"{indent}<xs:attribute{body}{m}>")
|
||||
X(f"{indent}\t<xs:simpleType>")
|
||||
@@ -351,10 +359,11 @@ def emit_property(p, indent):
|
||||
m += mirror("qualified", qual)
|
||||
m += mirror_name
|
||||
m += mirror_prefix(p)
|
||||
m += fix_mirror
|
||||
|
||||
body = attrs(["name", xml_name, "ref", ref, "type", type_,
|
||||
"minOccurs", min_occurs, "maxOccurs", max_occurs,
|
||||
"nillable", nill, "default", default, "fixed", fixed])
|
||||
"nillable", nill, "default", def_out, "fixed", fix_out])
|
||||
|
||||
if anon is not None:
|
||||
X(f"{indent}<xs:element{body}{m}>")
|
||||
|
||||
@@ -15,6 +15,19 @@ param(
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
||||
# Эти пространства имён предоставляет сама платформа — пакетов в конфигурации
|
||||
# для них нет и быть не должно (выведено по корпусу: импортируются, но
|
||||
# targetNamespace с таким значением ни у одного пакета нет)
|
||||
$PLATFORM_NS = @(
|
||||
"http://v8.1c.ru/8.1/data/core",
|
||||
"http://v8.1c.ru/8.1/data/enterprise",
|
||||
"http://v8.1c.ru/8.1/data/enterprise/current-config",
|
||||
"http://v8.1c.ru/8.1/data-composition-system/settings",
|
||||
"http://v8.1c.ru/8.3/data/ext",
|
||||
"http://www.w3.org/2001/XMLSchema"
|
||||
)
|
||||
|
||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
|
||||
$XS_NS = "http://www.w3.org/2001/XMLSchema"
|
||||
@@ -504,6 +517,27 @@ if (Test-Path $configXml) {
|
||||
if ($od.DocumentElement.GetAttribute("targetNamespace") -eq $targetNs) { $clash += $other.Name }
|
||||
} catch {}
|
||||
}
|
||||
# Платформа отвергает пакет, если импортируемого namespace нет в конфигурации:
|
||||
# «Ошибка проверки модели XDTO: xdto-package-3.3 … не определен»
|
||||
$knownNs = @{}
|
||||
foreach ($other in (Get-ChildItem $pkgRoot -Directory -ErrorAction SilentlyContinue)) {
|
||||
$ob = Join-Path (Join-Path $other.FullName "Ext") "Package.bin"
|
||||
if (-not (Test-Path $ob)) { continue }
|
||||
try {
|
||||
$od = New-Object System.Xml.XmlDocument
|
||||
$od.Load($ob)
|
||||
$knownNs[$od.DocumentElement.GetAttribute("targetNamespace")] = $other.Name
|
||||
} catch {}
|
||||
}
|
||||
$missing = @()
|
||||
foreach ($imp in $imports) { if (-not $knownNs.ContainsKey($imp) -and $PLATFORM_NS -notcontains $imp) { $missing += $imp } }
|
||||
if ($missing.Count -gt 0) {
|
||||
Report-Error ("Импортируемые пакеты не определены в конфигурации: " + ($missing -join ", ") +
|
||||
". Платформа отвергнет пакет при обновлении конфигурации — соберите зависимости первыми")
|
||||
} elseif ($imports.Count -gt 0) {
|
||||
Report-OK "Все импорты разрешаются в пакеты конфигурации"
|
||||
}
|
||||
|
||||
if ($clash.Count -gt 0) {
|
||||
Report-Warn "targetNamespace `"$targetNs`" объявлен также в пакет(ах): $($clash -join ', '). Платформа это допускает, но <import> на это пространство имён становится неоднозначным"
|
||||
} else {
|
||||
|
||||
@@ -6,6 +6,18 @@ import sys
|
||||
|
||||
from lxml import etree
|
||||
|
||||
# Эти пространства имён предоставляет сама платформа — пакетов в конфигурации
|
||||
# для них нет и быть не должно (выведено по корпусу)
|
||||
PLATFORM_NS = {
|
||||
"http://v8.1c.ru/8.1/data/core",
|
||||
"http://v8.1c.ru/8.1/data/enterprise",
|
||||
"http://v8.1c.ru/8.1/data/enterprise/current-config",
|
||||
"http://v8.1c.ru/8.1/data-composition-system/settings",
|
||||
"http://v8.1c.ru/8.3/data/ext",
|
||||
"http://www.w3.org/2001/XMLSchema",
|
||||
}
|
||||
|
||||
|
||||
sys.stdout.reconfigure(encoding="utf-8")
|
||||
sys.stderr.reconfigure(encoding="utf-8")
|
||||
|
||||
@@ -510,6 +522,26 @@ if os.path.exists(config_xml):
|
||||
clash.append(other)
|
||||
except Exception: # noqa: BLE001
|
||||
pass
|
||||
# Платформа отвергает пакет, если импортируемого namespace нет в конфигурации:
|
||||
# «Ошибка проверки модели XDTO: xdto-package-3.3 … не определен»
|
||||
known_ns = {}
|
||||
for other in sorted(os.listdir(pkg_root)):
|
||||
ob = os.path.join(pkg_root, other, "Ext", "Package.bin")
|
||||
if not os.path.exists(ob):
|
||||
continue
|
||||
try:
|
||||
known_ns[_parse_xml(ob).getroot().get("targetNamespace")] = other
|
||||
except Exception: # noqa: BLE001
|
||||
pass
|
||||
missing_imports = [i for i in imports if i not in known_ns and i not in PLATFORM_NS]
|
||||
if missing_imports:
|
||||
report_error("Импортируемые пакеты не определены в конфигурации: "
|
||||
+ ", ".join(missing_imports)
|
||||
+ ". Платформа отвергнет пакет при обновлении конфигурации — "
|
||||
"соберите зависимости первыми")
|
||||
elif imports:
|
||||
report_ok("Все импорты разрешаются в пакеты конфигурации")
|
||||
|
||||
if clash:
|
||||
report_warn(f'targetNamespace "{target_ns}" объявлен также в пакет(ах): {", ".join(clash)}. '
|
||||
"Платформа это допускает, но <import> на это пространство имён становится неоднозначным")
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<xs:complexType name="Контакт" xdto:sequenced="true">
|
||||
<xs:sequence>
|
||||
<xs:element name="Комментарий" type="xs:string" minOccurs="0" xdto:form="Element"/>
|
||||
<xs:element name="Имя с пробелом" type="xs:string" xdto:name="Имя_с_пробелом" minOccurs="0"/>
|
||||
<xs:element name="alpha-3" type="xs:string" xdto:name="alpha_3" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="Представление" type="xs:string" xdto:nillable="true" xdto:lowerBound="0"/>
|
||||
</xs:complexType>
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:test:other">
|
||||
<xs:complexType name="ВнешнийТип">
|
||||
<xs:sequence><xs:element name="Код" type="xs:string"/></xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
@@ -1,9 +1,26 @@
|
||||
{
|
||||
"name": "ссылки на типы: свой ns (dNpN), голое имя, чужой ns с импортом, ref",
|
||||
"caseFiles": ["refs.xsd"],
|
||||
"params": { "xsdFile": "refs.xsd" },
|
||||
"caseFiles": [
|
||||
"other.xsd",
|
||||
"refs.xsd"
|
||||
],
|
||||
"params": {
|
||||
"xsdFile": "refs.xsd"
|
||||
},
|
||||
"validatePath": "XDTOPackages/refs",
|
||||
"expect": {
|
||||
"files": ["XDTOPackages/refs.xml", "XDTOPackages/refs/Ext/Package.bin"]
|
||||
}
|
||||
"files": [
|
||||
"XDTOPackages/refs.xml",
|
||||
"XDTOPackages/refs/Ext/Package.bin"
|
||||
]
|
||||
},
|
||||
"preRun": [
|
||||
{
|
||||
"script": "xdto-compile/scripts/xdto-compile",
|
||||
"args": {
|
||||
"-XsdPath": "{workDir}/other.xsd",
|
||||
"-OutputDir": "{workDir}"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
<objectType name="Контакт" sequenced="true">
|
||||
<property name="Представление" type="xs:string" lowerBound="0" nillable="true" form="Attribute"/>
|
||||
<property name="Комментарий" type="xs:string" lowerBound="0" form="Element"/>
|
||||
<property name="Имя_с_пробелом" type="xs:string" lowerBound="0" localName="Имя с пробелом"/>
|
||||
<property name="alpha_3" type="xs:string" lowerBound="0" localName="alpha-3"/>
|
||||
</objectType>
|
||||
<objectType name="ЯвныйПорядок">
|
||||
<property name="Элемент" type="xs:string"/>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<xs:complexType name="Контакт" xdto:sequenced="true">
|
||||
<xs:sequence>
|
||||
<xs:element name="Комментарий" type="xs:string" minOccurs="0" xdto:form="Element"/>
|
||||
<xs:element name="Имя с пробелом" type="xs:string" xdto:name="Имя_с_пробелом" minOccurs="0"/>
|
||||
<xs:element name="alpha-3" type="xs:string" xdto:name="alpha_3" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="Представление" type="xs:string" xdto:nillable="true" xdto:lowerBound="0"/>
|
||||
</xs:complexType>
|
||||
|
||||
+1
-1
@@ -8,7 +8,7 @@
|
||||
<property name="ДоТрёх" type="xs:string" upperBound="3"/>
|
||||
<property name="Обнуляемый" type="xs:string" lowerBound="0" nillable="true"/>
|
||||
<property name="СУмолчанием" type="xs:string" default="нет"/>
|
||||
<property name="Фиксированный" type="xs:string" fixed="1"/>
|
||||
<property name="Фиксированный" type="xs:string" fixed="true" default="1"/>
|
||||
<property name="БезТипа"/>
|
||||
</objectType>
|
||||
</package>
|
||||
@@ -246,6 +246,7 @@
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Language>Русский</Language>
|
||||
<XDTOPackage>other</XDTOPackage>
|
||||
<XDTOPackage>refs</XDTOPackage>
|
||||
</ChildObjects>
|
||||
</Configuration>
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
|
||||
<XDTOPackage uuid="UUID-001">
|
||||
<Properties>
|
||||
<Name>other</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>other</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
<Namespace>urn:test:other</Namespace>
|
||||
</Properties>
|
||||
</XDTOPackage>
|
||||
</MetaDataObject>
|
||||
@@ -0,0 +1,5 @@
|
||||
<package xmlns="http://v8.1c.ru/8.1/xdto" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="urn:test:other">
|
||||
<objectType name="ВнешнийТип">
|
||||
<property name="Код" type="xs:string"/>
|
||||
</objectType>
|
||||
</package>
|
||||
@@ -0,0 +1,5 @@
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:test:other">
|
||||
<xs:complexType name="ВнешнийТип">
|
||||
<xs:sequence><xs:element name="Код" type="xs:string"/></xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
@@ -246,6 +246,7 @@
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Language>Русский</Language>
|
||||
<XDTOPackage>other</XDTOPackage>
|
||||
<XDTOPackage>top_level_order</XDTOPackage>
|
||||
</ChildObjects>
|
||||
</Configuration>
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
|
||||
<XDTOPackage uuid="UUID-001">
|
||||
<Properties>
|
||||
<Name>other</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>other</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
<Namespace>urn:test:other</Namespace>
|
||||
</Properties>
|
||||
</XDTOPackage>
|
||||
</MetaDataObject>
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
<package xmlns="http://v8.1c.ru/8.1/xdto" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="urn:test:other">
|
||||
<objectType name="ВнешнийТип">
|
||||
<property name="Код" type="xs:string"/>
|
||||
</objectType>
|
||||
</package>
|
||||
@@ -0,0 +1,5 @@
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:test:other">
|
||||
<xs:complexType name="ВнешнийТип">
|
||||
<xs:sequence><xs:element name="Код" type="xs:string"/></xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
@@ -1,9 +1,25 @@
|
||||
{
|
||||
"name": "порядок верхнего уровня: import→property→valueType→objectType независимо от порядка в XSD",
|
||||
"caseFiles": ["top-level-order.xsd"],
|
||||
"params": { "xsdFile": "top-level-order.xsd" },
|
||||
"caseFiles": [
|
||||
"other.xsd",
|
||||
"top-level-order.xsd"
|
||||
],
|
||||
"params": {
|
||||
"xsdFile": "top-level-order.xsd"
|
||||
},
|
||||
"validatePath": "XDTOPackages/top_level_order",
|
||||
"expect": {
|
||||
"files": ["XDTOPackages/top_level_order/Ext/Package.bin"]
|
||||
}
|
||||
"files": [
|
||||
"XDTOPackages/top_level_order/Ext/Package.bin"
|
||||
]
|
||||
},
|
||||
"preRun": [
|
||||
{
|
||||
"script": "xdto-compile/scripts/xdto-compile",
|
||||
"args": {
|
||||
"-XsdPath": "{workDir}/other.xsd",
|
||||
"-OutputDir": "{workDir}"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<xs:complexType name="Контакт" xdto:sequenced="true">
|
||||
<xs:sequence>
|
||||
<xs:element name="Комментарий" type="xs:string" minOccurs="0" xdto:form="Element"/>
|
||||
<xs:element name="Имя с пробелом" type="xs:string" xdto:name="Имя_с_пробелом" minOccurs="0"/>
|
||||
<xs:element name="alpha-3" type="xs:string" xdto:name="alpha_3" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="Представление" type="xs:string" xdto:nillable="true" xdto:lowerBound="0"/>
|
||||
</xs:complexType>
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
<objectType name="Контакт" sequenced="true">
|
||||
<property name="Представление" type="xs:string" lowerBound="0" nillable="true" form="Attribute"/>
|
||||
<property name="Комментарий" type="xs:string" lowerBound="0" form="Element"/>
|
||||
<property name="Имя_с_пробелом" type="xs:string" lowerBound="0" localName="Имя с пробелом"/>
|
||||
<property name="alpha_3" type="xs:string" lowerBound="0" localName="alpha-3"/>
|
||||
</objectType>
|
||||
<objectType name="ЯвныйПорядок">
|
||||
<property name="Элемент" type="xs:string"/>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<xs:complexType name="Контакт" xdto:sequenced="true">
|
||||
<xs:sequence>
|
||||
<xs:element name="Комментарий" type="xs:string" minOccurs="0" xdto:form="Element"/>
|
||||
<xs:element name="Имя с пробелом" type="xs:string" xdto:name="Имя_с_пробелом" minOccurs="0"/>
|
||||
<xs:element name="alpha-3" type="xs:string" xdto:name="alpha_3" minOccurs="0"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="Представление" type="xs:string" xdto:nillable="true" xdto:lowerBound="0"/>
|
||||
</xs:complexType>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<xs:complexType name="Контакт" xdto:sequenced="true">
|
||||
<xs:sequence>
|
||||
<xs:element name="Комментарий" type="xs:string" minOccurs="0" xdto:form="Element"/>
|
||||
<xs:element name="Имя с пробелом" type="xs:string" minOccurs="0" xdto:name="Имя_с_пробелом"/>
|
||||
<xs:element name="alpha-3" type="xs:string" minOccurs="0" xdto:name="alpha_3"/>
|
||||
</xs:sequence>
|
||||
<xs:attribute name="Представление" type="xs:string" xdto:nillable="true" xdto:lowerBound="0"/>
|
||||
</xs:complexType>
|
||||
|
||||
@@ -1,9 +1,17 @@
|
||||
{
|
||||
"name": "добавление импорта",
|
||||
"caseFiles": [
|
||||
"common.xsd",
|
||||
"types.xsd"
|
||||
],
|
||||
"preRun": [
|
||||
{
|
||||
"script": "xdto-compile/scripts/xdto-compile",
|
||||
"args": {
|
||||
"-XsdPath": "{workDir}/common.xsd",
|
||||
"-OutputDir": "{workDir}"
|
||||
}
|
||||
},
|
||||
{
|
||||
"script": "xdto-compile/scripts/xdto-compile",
|
||||
"args": {
|
||||
@@ -19,7 +27,7 @@
|
||||
"-Operation",
|
||||
"add-import",
|
||||
"-Value",
|
||||
"urn:test:other",
|
||||
"urn:test:common",
|
||||
"-NoValidate"
|
||||
],
|
||||
"expect": {
|
||||
|
||||
@@ -35,5 +35,6 @@
|
||||
"XDTOPackages/common/Ext/Package.bin",
|
||||
"XDTOPackages/common.xml"
|
||||
]
|
||||
}
|
||||
},
|
||||
"skipPlatformVerify": "смена namespace намеренно оставляет импорт зависящего пакета висящим — это документированное поведение операции"
|
||||
}
|
||||
|
||||
@@ -246,6 +246,7 @@
|
||||
</Properties>
|
||||
<ChildObjects>
|
||||
<Language>Русский</Language>
|
||||
<XDTOPackage>common</XDTOPackage>
|
||||
<XDTOPackage>types</XDTOPackage>
|
||||
</ChildObjects>
|
||||
</Configuration>
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
|
||||
<XDTOPackage uuid="UUID-001">
|
||||
<Properties>
|
||||
<Name>common</Name>
|
||||
<Synonym>
|
||||
<v8:item>
|
||||
<v8:lang>ru</v8:lang>
|
||||
<v8:content>common</v8:content>
|
||||
</v8:item>
|
||||
</Synonym>
|
||||
<Comment/>
|
||||
<Namespace>urn:test:common</Namespace>
|
||||
</Properties>
|
||||
</XDTOPackage>
|
||||
</MetaDataObject>
|
||||
@@ -0,0 +1,6 @@
|
||||
<package xmlns="http://v8.1c.ru/8.1/xdto" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="urn:test:common">
|
||||
<objectType name="Справочник">
|
||||
<property name="Код" type="xs:string"/>
|
||||
<property name="Наименование" type="xs:string"/>
|
||||
</objectType>
|
||||
</package>
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
<package xmlns="http://v8.1c.ru/8.1/xdto" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="urn:test:types">
|
||||
<import namespace="urn:test:other"/>
|
||||
<import namespace="urn:test:common"/>
|
||||
<valueType name="СуммаТип" base="xs:decimal" totalDigits="18" fractionDigits="2"/>
|
||||
<valueType name="СчётТип" base="xs:string" length="20">
|
||||
<pattern>[0-9]{20}</pattern>
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="urn:test:common" targetNamespace="urn:test:common">
|
||||
<xs:complexType name="Справочник">
|
||||
<xs:sequence>
|
||||
<xs:element name="Код" type="xs:string"/>
|
||||
<xs:element name="Наименование" type="xs:string"/>
|
||||
</xs:sequence>
|
||||
</xs:complexType>
|
||||
</xs:schema>
|
||||
@@ -686,6 +686,15 @@ async function verifyCase(skillName, caseName, skillConfig, caseData, opts) {
|
||||
const workDir = mkdtempSync(join(tmpdir(), `verify-${skillName}-${caseName}-`));
|
||||
result.workDir = workDir;
|
||||
|
||||
// Кейс может осознанно исключаться из платформенной проверки — когда его
|
||||
// результат невалиден by design (например, операция намеренно оставляет
|
||||
// висящий импорт). Причина обязательна, молча пропускать нельзя.
|
||||
if (caseData.skipPlatformVerify) {
|
||||
result.skipped = true;
|
||||
result.skipReason = String(caseData.skipPlatformVerify);
|
||||
return result;
|
||||
}
|
||||
|
||||
// caseFiles — файловый вход кейса (напр. XSD для xdto-compile), как в runner.mjs
|
||||
for (const rel of caseData.caseFiles || []) {
|
||||
const src = join(CASES, skillName, rel);
|
||||
@@ -1434,9 +1443,14 @@ async function main() {
|
||||
}
|
||||
|
||||
const passed = results.filter(r => r.passed).length;
|
||||
const failed = results.filter(r => !r.passed).length;
|
||||
const skipped = results.filter(r => r.skipped).length;
|
||||
const failed = results.filter(r => !r.passed && !r.skipped).length;
|
||||
console.log(`\n${'='.repeat(60)}`);
|
||||
console.log(`Results: ${passed} passed, ${failed} failed out of ${results.length}`);
|
||||
console.log(`Results: ${passed} passed, ${failed} failed`
|
||||
+ (skipped ? `, ${skipped} skipped` : '') + ` out of ${results.length}`);
|
||||
for (const r of results.filter(x => x.skipped)) {
|
||||
console.log(` \u25cb ${r.skill}/${r.case} \u2014 ${r.skipReason}`);
|
||||
}
|
||||
|
||||
writeReport(results);
|
||||
process.exit(failed > 0 ? 1 : 0);
|
||||
|
||||
Reference in New Issue
Block a user