arelle-release 2.37.10__py3-none-any.whl → 2.37.12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of arelle-release might be problematic. Click here for more details.
- arelle/CntlrWinMain.py +33 -27
- arelle/PackageManager.py +1 -1
- arelle/ValidateFilingText.py +3 -3
- arelle/XmlValidate.py +1 -1
- arelle/_version.py +2 -2
- arelle/plugin/validate/CIPC/__init__.py +2 -2
- arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +7 -5
- arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +6 -5
- arelle/plugin/validate/ESEF/Util.py +1 -11
- arelle/plugin/validate/NL/PluginValidationDataExtension.py +34 -4
- arelle/plugin/validate/NL/rules/nl_kvk.py +58 -0
- arelle/plugin/validate/ROS/rules/ros.py +2 -2
- arelle/utils/validate/ValidationUtil.py +23 -0
- {arelle_release-2.37.10.dist-info → arelle_release-2.37.12.dist-info}/METADATA +1 -1
- {arelle_release-2.37.10.dist-info → arelle_release-2.37.12.dist-info}/RECORD +20 -19
- {arelle_release-2.37.10.dist-info → arelle_release-2.37.12.dist-info}/WHEEL +1 -1
- tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py +20 -6
- {arelle_release-2.37.10.dist-info → arelle_release-2.37.12.dist-info}/entry_points.txt +0 -0
- {arelle_release-2.37.10.dist-info → arelle_release-2.37.12.dist-info}/licenses/LICENSE.md +0 -0
- {arelle_release-2.37.10.dist-info → arelle_release-2.37.12.dist-info}/top_level.txt +0 -0
arelle/CntlrWinMain.py
CHANGED
|
@@ -467,6 +467,8 @@ class CntlrWinMain (Cntlr.Cntlr):
|
|
|
467
467
|
if not self.modelManager.disclosureSystem.select(self.config.setdefault("disclosureSystem", None)):
|
|
468
468
|
self.validateDisclosureSystem.set(False)
|
|
469
469
|
self.modelManager.validateDisclosureSystem = False
|
|
470
|
+
self.config["validateDisclosureSystem"] = False
|
|
471
|
+
self.config["disclosureSystem"] = None
|
|
470
472
|
|
|
471
473
|
# load argv overrides for modelManager options
|
|
472
474
|
lastArg = None
|
|
@@ -1111,36 +1113,40 @@ class CntlrWinMain (Cntlr.Cntlr):
|
|
|
1111
1113
|
self.fileOpenFile(fileHistory[0])
|
|
1112
1114
|
|
|
1113
1115
|
def validate(self):
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1116
|
+
if not self.modelManager.loadedModelXbrls:
|
|
1117
|
+
tkinter.messagebox.showwarning(
|
|
1118
|
+
_("arelle - Warning"),
|
|
1119
|
+
_("No XBRL loaded to validate"),
|
|
1120
|
+
parent=self.parent,
|
|
1121
|
+
)
|
|
1122
|
+
return
|
|
1123
|
+
if self.modelManager.validateDisclosureSystem and not self.modelManager.disclosureSystem.selection:
|
|
1124
|
+
tkinter.messagebox.showwarning(
|
|
1125
|
+
_("arelle - Warning"),
|
|
1126
|
+
_("Validation - disclosure system checks requested but no disclosure system is selected, please select one by validation - select disclosure system."),
|
|
1127
|
+
parent=self.parent,
|
|
1128
|
+
)
|
|
1129
|
+
return
|
|
1130
|
+
threading.Thread(target=self.backgroundValidate, daemon=True).start()
|
|
1126
1131
|
|
|
1127
1132
|
def backgroundValidate(self):
|
|
1128
1133
|
from arelle import Validate
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
1141
|
-
|
|
1142
|
-
|
|
1143
|
-
|
|
1134
|
+
for loadedModelXbrl in self.modelManager.loadedModelXbrls:
|
|
1135
|
+
if loadedModelXbrl.modelDocument:
|
|
1136
|
+
startedAt = time.time()
|
|
1137
|
+
if loadedModelXbrl.modelDocument.type in ModelDocument.Type.TESTCASETYPES:
|
|
1138
|
+
for pluginXbrlMethod in pluginClassMethods("Testcases.Start"):
|
|
1139
|
+
pluginXbrlMethod(self, None, loadedModelXbrl)
|
|
1140
|
+
for modelXbrl in [loadedModelXbrl] + getattr(loadedModelXbrl, "supplementalModelXbrls", []):
|
|
1141
|
+
priorOutputInstance = modelXbrl.formulaOutputInstance
|
|
1142
|
+
modelXbrl.formulaOutputInstance = None # prevent closing on background thread by validateFormula
|
|
1143
|
+
try:
|
|
1144
|
+
Validate.validate(modelXbrl)
|
|
1145
|
+
except Exception as err:
|
|
1146
|
+
self.addToLog(_("[exception] Validation exception: {0} at {1}").format(err, traceback.format_tb(sys.exc_info()[2])))
|
|
1147
|
+
self.addToLog(format_string(self.modelManager.locale, _("validated in %.2f secs: %s"), (time.time() - startedAt, modelXbrl.displayUri)))
|
|
1148
|
+
if not modelXbrl.isClosed and (priorOutputInstance or modelXbrl.formulaOutputInstance):
|
|
1149
|
+
self.uiThreadQueue.put((self.showFormulaOutputInstance, [priorOutputInstance, modelXbrl.formulaOutputInstance]))
|
|
1144
1150
|
|
|
1145
1151
|
self.uiThreadQueue.put((self.logSelect, []))
|
|
1146
1152
|
|
arelle/PackageManager.py
CHANGED
|
@@ -130,7 +130,7 @@ def _parsePackageMetadata(
|
|
|
130
130
|
try:
|
|
131
131
|
metadataFileContent = filesource.file(metadataFile)[0] # URL in zip, plain file in file system or web
|
|
132
132
|
tree = _parseFile(cntlr, parser, metadataFile, metadataFileContent, TP_XSD)
|
|
133
|
-
except (etree.XMLSyntaxError, etree.DocumentInvalid) as err:
|
|
133
|
+
except (etree.XMLSyntaxError, etree.DocumentInvalid, etree.XMLSchemaError) as err:
|
|
134
134
|
cntlr.addToLog(_("Taxonomy package file syntax error %(error)s"),
|
|
135
135
|
messageArgs={"error": str(err)},
|
|
136
136
|
messageCode="tpe:invalidMetaDataFile",
|
arelle/ValidateFilingText.py
CHANGED
|
@@ -3,7 +3,7 @@ See COPYRIGHT.md for copyright information.
|
|
|
3
3
|
'''
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
#import xml.sax, xml.sax.handler
|
|
6
|
-
from lxml.etree import XML, DTD, SubElement, _ElementTree, _Comment, _ProcessingInstruction, XMLSyntaxError, XMLParser
|
|
6
|
+
from lxml.etree import XML, DTD, SubElement, _ElementTree, _Comment, _ProcessingInstruction, _Entity, XMLSyntaxError, XMLParser
|
|
7
7
|
from dataclasses import dataclass
|
|
8
8
|
from PIL import Image as pilImage
|
|
9
9
|
import os, io, base64
|
|
@@ -604,7 +604,7 @@ def validateTextBlockFacts(modelXbrl):
|
|
|
604
604
|
eltTag = elt.tag
|
|
605
605
|
if isinstance(elt, ModelObject) and elt.namespaceURI == xhtml:
|
|
606
606
|
eltTag = elt.localName
|
|
607
|
-
elif isinstance(elt, (_ElementTree, _Comment, _ProcessingInstruction)):
|
|
607
|
+
elif isinstance(elt, (_ElementTree, _Comment, _ProcessingInstruction, _Entity)):
|
|
608
608
|
continue # comment or other non-parsed element
|
|
609
609
|
else:
|
|
610
610
|
eltTag = elt.tag
|
|
@@ -730,7 +730,7 @@ def validateHtmlContent(modelXbrl, referenceElt, htmlEltTree, validatedObjectLab
|
|
|
730
730
|
for elt in htmlEltTree.iter():
|
|
731
731
|
if isinstance(elt, ModelObject) and elt.namespaceURI == xhtml:
|
|
732
732
|
eltTag = elt.localName
|
|
733
|
-
elif isinstance(elt, (_ElementTree, _Comment, _ProcessingInstruction)):
|
|
733
|
+
elif isinstance(elt, (_ElementTree, _Comment, _ProcessingInstruction, _Entity)):
|
|
734
734
|
continue # comment or other non-parsed element
|
|
735
735
|
else:
|
|
736
736
|
eltTag = elt.tag
|
arelle/XmlValidate.py
CHANGED
|
@@ -777,7 +777,7 @@ def lxmlSchemaValidate(modelDocument: ModelDocument, extraSchema : str | None =
|
|
|
777
777
|
file=modelDocument.basename,
|
|
778
778
|
level=logging.ERROR)
|
|
779
779
|
modelDocument.modelXbrl.errors.append(msgCode)
|
|
780
|
-
except etree.XMLSyntaxError as err:
|
|
780
|
+
except (etree.XMLSyntaxError, etree.XMLSchemaError) as err:
|
|
781
781
|
msgCode = "lxml.schemaError"
|
|
782
782
|
cntlr.addToLog(_("XML file syntax error %(error)s"),
|
|
783
783
|
messageArgs={"error": str(err)},
|
arelle/_version.py
CHANGED
|
@@ -12,7 +12,7 @@ Taxonomy packages:
|
|
|
12
12
|
"""
|
|
13
13
|
import os
|
|
14
14
|
import regex as re
|
|
15
|
-
from lxml.etree import _ElementTree, _Comment, _ProcessingInstruction
|
|
15
|
+
from lxml.etree import _ElementTree, _Comment, _ProcessingInstruction, _Entity
|
|
16
16
|
from arelle import ModelDocument, XbrlConst
|
|
17
17
|
from arelle.ModelDtsObject import ModelResource
|
|
18
18
|
from arelle.ModelInstanceObject import ModelFact, ModelInlineFact, ModelInlineFootnote
|
|
@@ -125,7 +125,7 @@ def validateXbrlFinally(val, *args, **kwargs):
|
|
|
125
125
|
eltTag = elt.tag
|
|
126
126
|
if isinstance(elt, ModelObject) and elt.namespaceURI == xhtml:
|
|
127
127
|
eltTag = elt.localName
|
|
128
|
-
elif isinstance(elt, (_ElementTree, _Comment, _ProcessingInstruction)):
|
|
128
|
+
elif isinstance(elt, (_ElementTree, _Comment, _ProcessingInstruction, _Entity)):
|
|
129
129
|
continue # comment or other non-parsed element
|
|
130
130
|
else:
|
|
131
131
|
eltTag = elt.tag
|
|
@@ -11,7 +11,7 @@ from math import isnan
|
|
|
11
11
|
from typing import Any, cast
|
|
12
12
|
|
|
13
13
|
import regex as re
|
|
14
|
-
from lxml.etree import
|
|
14
|
+
from lxml.etree import _Comment, _Element, _ElementTree, _Entity, _ProcessingInstruction
|
|
15
15
|
|
|
16
16
|
from arelle import LeiUtil, ModelDocument, XbrlConst
|
|
17
17
|
from arelle.ModelDtsObject import ModelConcept
|
|
@@ -22,6 +22,7 @@ from arelle.ModelInstanceObject import ModelInlineFootnote
|
|
|
22
22
|
from arelle.ModelObject import ModelObject
|
|
23
23
|
from arelle.ModelRelationshipSet import ModelRelationshipSet
|
|
24
24
|
from arelle.ModelValue import QName, qname
|
|
25
|
+
from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
|
|
25
26
|
from arelle.PythonUtil import isLegacyAbs, strTruncate
|
|
26
27
|
from arelle.utils.validate.DetectScriptsInXhtml import containsScriptMarkers
|
|
27
28
|
from arelle.UrlUtil import decodeBase64DataImage, isHttpUrl, scheme
|
|
@@ -61,7 +62,8 @@ from ..Const import (
|
|
|
61
62
|
untransformableTypes,
|
|
62
63
|
)
|
|
63
64
|
from ..Dimensions import checkFilingDimensions
|
|
64
|
-
from ..Util import
|
|
65
|
+
from ..Util import isExtension
|
|
66
|
+
|
|
65
67
|
|
|
66
68
|
_: TypeGetText # Handle gettext
|
|
67
69
|
|
|
@@ -273,7 +275,7 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
|
|
|
273
275
|
elt = cast(Any, uncast_elt)
|
|
274
276
|
|
|
275
277
|
eltTag = elt.tag
|
|
276
|
-
if isinstance(elt, (_ElementTree,
|
|
278
|
+
if isinstance(elt, (_Comment, _ElementTree, _Entity, _ProcessingInstruction)):
|
|
277
279
|
continue # comment or other non-parsed element
|
|
278
280
|
else:
|
|
279
281
|
eltTag = elt.tag
|
|
@@ -724,12 +726,12 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
|
|
|
724
726
|
_("The xlink:role attribute of a link:footnote and link:footnoteLink element as well as xlink:arcrole attribute of a link:footnoteArc MUST be defined in the XBRL Specification 2.1."),
|
|
725
727
|
modelObject=footnoteRoleErrors)
|
|
726
728
|
|
|
727
|
-
nonStdFootnoteElts = list()
|
|
729
|
+
nonStdFootnoteElts: list[_Element] = list()
|
|
728
730
|
for modelLink in modelXbrl.baseSets[("XBRL-footnotes",None,None,None)]:
|
|
729
731
|
for uncast_elt in modelLink.iterchildren():
|
|
730
732
|
elt = cast(Any, uncast_elt)
|
|
731
733
|
|
|
732
|
-
if isinstance(elt, (_ElementTree,
|
|
734
|
+
if isinstance(elt, (_Comment, _ElementTree, _Entity, _ProcessingInstruction)):
|
|
733
735
|
continue # comment or other non-parsed element
|
|
734
736
|
if elt.qname not in FOOTNOTE_LINK_CHILDREN:
|
|
735
737
|
nonStdFootnoteElts.append(elt)
|
|
@@ -12,7 +12,7 @@ from typing import Any, cast
|
|
|
12
12
|
|
|
13
13
|
import regex as re
|
|
14
14
|
import tinycss2.ast # type: ignore[import-untyped]
|
|
15
|
-
from lxml.etree import
|
|
15
|
+
from lxml.etree import _Comment, _Element, _ElementTree, _Entity, _ProcessingInstruction
|
|
16
16
|
|
|
17
17
|
from arelle import LeiUtil, ModelDocument, XbrlConst
|
|
18
18
|
from arelle.ModelDtsObject import ModelConcept
|
|
@@ -26,6 +26,7 @@ from arelle.ModelValue import QName
|
|
|
26
26
|
from arelle.ModelValue import qname
|
|
27
27
|
from arelle.ModelXbrl import ModelXbrl
|
|
28
28
|
|
|
29
|
+
from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
|
|
29
30
|
from arelle.PythonUtil import isLegacyAbs, normalizeSpace
|
|
30
31
|
from arelle.PythonUtil import strTruncate
|
|
31
32
|
from arelle.utils.validate.DetectScriptsInXhtml import containsScriptMarkers
|
|
@@ -66,7 +67,7 @@ from ..Const import (
|
|
|
66
67
|
untransformableTypes,
|
|
67
68
|
)
|
|
68
69
|
from ..Dimensions import checkFilingDimensions
|
|
69
|
-
from ..Util import checkForMultiLangDuplicates,
|
|
70
|
+
from ..Util import checkForMultiLangDuplicates, getEsefNotesStatementConcepts, isExtension, getDisclosureSystemYear
|
|
70
71
|
|
|
71
72
|
_: TypeGetText # Handle gettext
|
|
72
73
|
|
|
@@ -318,7 +319,7 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
|
|
|
318
319
|
elt = cast(Any, uncast_elt)
|
|
319
320
|
|
|
320
321
|
eltTag = elt.tag
|
|
321
|
-
if isinstance(elt, (_ElementTree, _Comment, _ProcessingInstruction,
|
|
322
|
+
if isinstance(elt, (_ElementTree, _Comment, _ProcessingInstruction, _Entity)):
|
|
322
323
|
continue # comment or other non-parsed element
|
|
323
324
|
else:
|
|
324
325
|
eltTag = elt.tag
|
|
@@ -807,12 +808,12 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
|
|
|
807
808
|
_("The xlink:role attribute of a link:footnote and link:footnoteLink element as well as xlink:arcrole attribute of a link:footnoteArc MUST be defined in the XBRL Specification 2.1."),
|
|
808
809
|
modelObject=footnoteRoleErrors)
|
|
809
810
|
|
|
810
|
-
nonStdFootnoteElts = list()
|
|
811
|
+
nonStdFootnoteElts: list[_Element] = list()
|
|
811
812
|
for modelLink in modelXbrl.baseSets[("XBRL-footnotes",None,None,None)]:
|
|
812
813
|
for uncast_elt in modelLink.iterchildren():
|
|
813
814
|
elt = cast(Any, uncast_elt)
|
|
814
815
|
|
|
815
|
-
if isinstance(elt, (_ElementTree,
|
|
816
|
+
if isinstance(elt, (_Comment, _ElementTree, _Entity, _ProcessingInstruction)):
|
|
816
817
|
continue # comment or other non-parsed element
|
|
817
818
|
if elt.qname not in FOOTNOTE_LINK_CHILDREN:
|
|
818
819
|
nonStdFootnoteElts.append(elt)
|
|
@@ -6,7 +6,7 @@ from __future__ import annotations
|
|
|
6
6
|
import json
|
|
7
7
|
import os
|
|
8
8
|
from collections import defaultdict
|
|
9
|
-
from collections.abc import Collection
|
|
9
|
+
from collections.abc import Collection
|
|
10
10
|
from typing import Any, Union, cast
|
|
11
11
|
import regex as re
|
|
12
12
|
|
|
@@ -177,13 +177,3 @@ def _hasEventAttributes(elt: Any, attributes: Collection[str]) -> bool:
|
|
|
177
177
|
if isinstance(elt, _Element):
|
|
178
178
|
return any(a in attributes for a in elt.keys())
|
|
179
179
|
return False
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
def etreeIterWithDepth(
|
|
183
|
-
node: ModelObject | _Element,
|
|
184
|
-
depth: int = 0,
|
|
185
|
-
) -> Generator[tuple[ModelObject | _Element, int], None, None]:
|
|
186
|
-
yield node, depth
|
|
187
|
-
for child in node.iterchildren():
|
|
188
|
-
for n_d in etreeIterWithDepth(child, depth + 1):
|
|
189
|
-
yield n_d
|
|
@@ -3,18 +3,20 @@ See COPYRIGHT.md for copyright information.
|
|
|
3
3
|
"""
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
-
from typing import cast, Any
|
|
7
|
-
|
|
8
|
-
import regex as re
|
|
9
6
|
from collections import defaultdict
|
|
10
7
|
from dataclasses import dataclass
|
|
11
8
|
from functools import lru_cache
|
|
9
|
+
from typing import Any, cast
|
|
10
|
+
|
|
11
|
+
import regex as re
|
|
12
|
+
from lxml.etree import _Comment, _ElementTree, _Entity, _ProcessingInstruction
|
|
12
13
|
|
|
13
14
|
from arelle.FunctionIxt import ixtNamespaces
|
|
14
|
-
from arelle.ModelInstanceObject import
|
|
15
|
+
from arelle.ModelInstanceObject import ModelContext, ModelFact, ModelInlineFootnote, ModelUnit
|
|
15
16
|
from arelle.ModelValue import QName
|
|
16
17
|
from arelle.ModelXbrl import ModelXbrl
|
|
17
18
|
from arelle.utils.PluginData import PluginData
|
|
19
|
+
from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
|
|
18
20
|
from arelle.XmlValidate import lexicalPatterns
|
|
19
21
|
|
|
20
22
|
XBRLI_IDENTIFIER_PATTERN = re.compile(r"^(?!00)\d{8}$")
|
|
@@ -37,6 +39,7 @@ class ContextData:
|
|
|
37
39
|
class FootnoteData:
|
|
38
40
|
noMatchLangFootnotes: set[ModelInlineFootnote]
|
|
39
41
|
orphanedFootnotes: set[ModelInlineFootnote]
|
|
42
|
+
factLangFootnotes: dict[ModelInlineFootnote, set[str]]
|
|
40
43
|
|
|
41
44
|
@dataclass
|
|
42
45
|
class PluginValidationDataExtension(PluginData):
|
|
@@ -103,6 +106,7 @@ class PluginValidationDataExtension(PluginData):
|
|
|
103
106
|
footnotesRelationshipSet = modelXbrl.relationshipSet("XBRL-footnotes")
|
|
104
107
|
orphanedFootnotes = set()
|
|
105
108
|
noMatchLangFootnotes = set()
|
|
109
|
+
factLangFootnotes = defaultdict(set)
|
|
106
110
|
for elts in modelXbrl.ixdsEltById.values(): # type: ignore[attr-defined]
|
|
107
111
|
for elt in elts:
|
|
108
112
|
if isinstance(elt, ModelInlineFootnote):
|
|
@@ -112,9 +116,14 @@ class PluginValidationDataExtension(PluginData):
|
|
|
112
116
|
orphanedFootnotes.add(elt)
|
|
113
117
|
if elt.xmlLang not in factLangs:
|
|
114
118
|
noMatchLangFootnotes.add(elt)
|
|
119
|
+
for rel in footnotesRelationshipSet.toModelObject(elt):
|
|
120
|
+
if rel.fromModelObject is not None:
|
|
121
|
+
factLangFootnotes[rel.fromModelObject].add(elt.xmlLang)
|
|
122
|
+
factLangFootnotes.default_factory = None
|
|
115
123
|
return FootnoteData(
|
|
116
124
|
noMatchLangFootnotes=noMatchLangFootnotes,
|
|
117
125
|
orphanedFootnotes=orphanedFootnotes,
|
|
126
|
+
factLangFootnotes=dict(factLangFootnotes),
|
|
118
127
|
)
|
|
119
128
|
|
|
120
129
|
@lru_cache(1)
|
|
@@ -155,6 +164,27 @@ class PluginValidationDataExtension(PluginData):
|
|
|
155
164
|
def getOrphanedFootnotes(self, modelXbrl: ModelXbrl) -> set[ModelInlineFootnote]:
|
|
156
165
|
return self.checkFootnotes(modelXbrl).orphanedFootnotes
|
|
157
166
|
|
|
167
|
+
def getFactLangFootnotes(self, modelXbrl: ModelXbrl) -> dict[ModelInlineFootnote, set[str]]:
|
|
168
|
+
return self.checkFootnotes(modelXbrl).factLangFootnotes
|
|
169
|
+
|
|
170
|
+
@lru_cache(1)
|
|
171
|
+
def getReportXmlLang(self, modelXbrl: ModelXbrl) -> str | None:
|
|
172
|
+
firstIxdsDoc = True
|
|
173
|
+
reportXmlLang = None
|
|
174
|
+
firstRootmostXmlLangDepth = 9999999
|
|
175
|
+
for ixdsHtmlRootElt in modelXbrl.ixdsHtmlElements:
|
|
176
|
+
for uncast_elt, depth in etreeIterWithDepth(ixdsHtmlRootElt):
|
|
177
|
+
elt = cast(Any, uncast_elt)
|
|
178
|
+
if isinstance(elt, (_Comment, _ElementTree, _Entity, _ProcessingInstruction)):
|
|
179
|
+
continue
|
|
180
|
+
if firstIxdsDoc and (not reportXmlLang or depth < firstRootmostXmlLangDepth):
|
|
181
|
+
xmlLang = elt.get("{http://www.w3.org/XML/1998/namespace}lang")
|
|
182
|
+
if xmlLang:
|
|
183
|
+
reportXmlLang = xmlLang
|
|
184
|
+
firstRootmostXmlLangDepth = depth
|
|
185
|
+
firstIxdsDoc = False
|
|
186
|
+
return reportXmlLang
|
|
187
|
+
|
|
158
188
|
@lru_cache(1)
|
|
159
189
|
def unitsByDocument(self, modelXbrl: ModelXbrl) -> dict[str, list[ModelUnit]]:
|
|
160
190
|
unitsByDocument = defaultdict(list)
|
|
@@ -401,3 +401,61 @@ def rule_nl_kvk_3_3_1_2 (
|
|
|
401
401
|
msg=_('The xml:lang attribute of each footnote matches the language of at least one textual fact.'),
|
|
402
402
|
modelObject = noMatchLangFootnotes
|
|
403
403
|
)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
@validation(
|
|
407
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
408
|
+
disclosureSystems=[
|
|
409
|
+
DISCLOSURE_SYSTEM_NL_INLINE_2024
|
|
410
|
+
],
|
|
411
|
+
)
|
|
412
|
+
def rule_nl_kvk_3_3_1_3 (
|
|
413
|
+
pluginData: PluginValidationDataExtension,
|
|
414
|
+
val: ValidateXbrl,
|
|
415
|
+
*args: Any,
|
|
416
|
+
**kwargs: Any,
|
|
417
|
+
) -> Iterable[Validation]:
|
|
418
|
+
"""
|
|
419
|
+
NL-KVK.3.3.1.3: At least one footnote in the footnote relationship is in the language of the report.
|
|
420
|
+
"""
|
|
421
|
+
factLangFootnotes = pluginData.getFactLangFootnotes(val.modelXbrl)
|
|
422
|
+
reportXmlLang = pluginData.getReportXmlLang(val.modelXbrl)
|
|
423
|
+
nonDefLangFtFacts = set(f for f,langs in factLangFootnotes.items() if reportXmlLang not in langs)
|
|
424
|
+
if len(nonDefLangFtFacts) > 0:
|
|
425
|
+
yield Validation.error(
|
|
426
|
+
codes='NL.NL-KVK.3.3.1.3.footnoteOnlyInLanguagesOtherThanLanguageOfAReport',
|
|
427
|
+
msg=_('At least one footnote must have the same language as the report\'s language.'),
|
|
428
|
+
modelObject=nonDefLangFtFacts
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
@validation(
|
|
433
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
434
|
+
disclosureSystems=[
|
|
435
|
+
DISCLOSURE_SYSTEM_NL_INLINE_2024
|
|
436
|
+
],
|
|
437
|
+
)
|
|
438
|
+
def rule_nl_kvk_3_5_2_2(
|
|
439
|
+
pluginData: PluginValidationDataExtension,
|
|
440
|
+
val: ValidateXbrl,
|
|
441
|
+
*args: Any,
|
|
442
|
+
**kwargs: Any,
|
|
443
|
+
) -> Iterable[Validation]:
|
|
444
|
+
"""
|
|
445
|
+
NL-KVK.3.5.2.2: All tagged text facts MUST be provided in at least the language of the report.
|
|
446
|
+
"""
|
|
447
|
+
reportXmlLang = pluginData.getReportXmlLang(val.modelXbrl)
|
|
448
|
+
factsWithWrongLang = set()
|
|
449
|
+
for fact in val.modelXbrl.facts:
|
|
450
|
+
if (fact is not None and
|
|
451
|
+
fact.concept is not None and
|
|
452
|
+
fact.concept.type is not None and
|
|
453
|
+
fact.concept.type.isOimTextFactType and
|
|
454
|
+
fact.xmlLang != reportXmlLang):
|
|
455
|
+
factsWithWrongLang.add(fact)
|
|
456
|
+
if len(factsWithWrongLang) > 0:
|
|
457
|
+
yield Validation.error(
|
|
458
|
+
codes='NL.NL-KVK.3.5.2.2.taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport',
|
|
459
|
+
msg=_('Tagged text facts MUST be provided in the language of the report.'),
|
|
460
|
+
modelObject=factsWithWrongLang
|
|
461
|
+
)
|
|
@@ -13,7 +13,7 @@ from arelle.typing import TypeGetText
|
|
|
13
13
|
from arelle.ValidateXbrl import ValidateXbrl
|
|
14
14
|
from collections import defaultdict
|
|
15
15
|
from math import isnan
|
|
16
|
-
from lxml.etree import _ElementTree,
|
|
16
|
+
from lxml.etree import _Comment, _ElementTree, _Entity, _ProcessingInstruction
|
|
17
17
|
from arelle import ModelDocument
|
|
18
18
|
from arelle.ModelInstanceObject import ModelInlineFact, ModelUnit
|
|
19
19
|
from arelle.ModelValue import qname
|
|
@@ -86,7 +86,7 @@ def rule_main(
|
|
|
86
86
|
ixTargets = set()
|
|
87
87
|
for ixdsHtmlRootElt in modelXbrl.ixdsHtmlElements:
|
|
88
88
|
for elt in ixdsHtmlRootElt.iter():
|
|
89
|
-
if isinstance(elt, (_ElementTree,
|
|
89
|
+
if isinstance(elt, (_Comment, _ElementTree, _Entity, _ProcessingInstruction)):
|
|
90
90
|
continue # comment or other non-parsed element
|
|
91
91
|
if isinstance(elt, ModelInlineFact):
|
|
92
92
|
if elt.format is not None and elt.format.namespaceURI not in TR_NAMESPACES:
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"""
|
|
2
|
+
See COPYRIGHT.md for copyright information.
|
|
3
|
+
"""
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from collections.abc import Generator
|
|
7
|
+
|
|
8
|
+
from lxml.etree import _Element
|
|
9
|
+
|
|
10
|
+
from arelle.ModelObject import ModelObject
|
|
11
|
+
from arelle.typing import TypeGetText
|
|
12
|
+
|
|
13
|
+
_: TypeGetText
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def etreeIterWithDepth(
|
|
17
|
+
node: ModelObject | _Element,
|
|
18
|
+
depth: int = 0,
|
|
19
|
+
) -> Generator[tuple[ModelObject | _Element, int], None, None]:
|
|
20
|
+
yield node, depth
|
|
21
|
+
for child in node.iterchildren():
|
|
22
|
+
for n_d in etreeIterWithDepth(child, depth + 1):
|
|
23
|
+
yield n_d
|
|
@@ -6,7 +6,7 @@ arelle/CntlrComServer.py,sha256=h1KPf31uMbErpxTZn_iklDqUMGFgQnjZkFkFjd8gtLQ,1888
|
|
|
6
6
|
arelle/CntlrProfiler.py,sha256=2VQJudiUhxryVypxjODx2ccP1-n60icTiWs5lSEokhQ,972
|
|
7
7
|
arelle/CntlrQuickBooks.py,sha256=BMqd5nkNQOZyNFPefkTeWUUDCYNS6BQavaG8k1Lepu4,31543
|
|
8
8
|
arelle/CntlrWebMain.py,sha256=x5vtiopqGdp6L5s7PrUTEABXCGqtb5oy7yqWIVePtgE,50860
|
|
9
|
-
arelle/CntlrWinMain.py,sha256=
|
|
9
|
+
arelle/CntlrWinMain.py,sha256=h30F1aNj1Mggsaqe6__d1JCQe6wIfBI_z_4rCfc-eQc,96894
|
|
10
10
|
arelle/CntlrWinTooltip.py,sha256=6MzoAIfkYnNu_bl_je8n0adhwmKxAIcymkg9Tij9Z4M,7951
|
|
11
11
|
arelle/DialogAbout.py,sha256=XXzMV0fO4BQ3-l1Puirzmn7EZEdmgJg7JNYdJm1FueM,1987
|
|
12
12
|
arelle/DialogArcroleGroup.py,sha256=r81OT3LFmMkoROpFenk97oVEyQhibKZ1QgDHvMsyCl0,7547
|
|
@@ -50,7 +50,7 @@ arelle/ModelValue.py,sha256=6Vko4aytXg2Ajv7rI6houQb-ZX39-tcjQ4N90ZxZvE8,39430
|
|
|
50
50
|
arelle/ModelVersObject.py,sha256=cPD1IzhkCfuV1eMgVFWes88DH_6WkUj5kj7sgGF2M0I,26062
|
|
51
51
|
arelle/ModelVersReport.py,sha256=bXEA9K3qkH57aABn5l-m3CTY0FAcF1yX6O4fo-URjl8,73326
|
|
52
52
|
arelle/ModelXbrl.py,sha256=7rz4rxIGopwRDQTD12P0sdqzvPPoMhGgkg5qkMD6TDQ,72109
|
|
53
|
-
arelle/PackageManager.py,sha256=
|
|
53
|
+
arelle/PackageManager.py,sha256=BvPExMcxh8rHMxogOag-PGbX6vXdhCiXAHcDLA6Ypsc,32592
|
|
54
54
|
arelle/PluginManager.py,sha256=foSgWvRI1Ret-6KVRQMFSv4RtpEf_0UB7468N_NjPGU,42116
|
|
55
55
|
arelle/PluginUtils.py,sha256=0vFQ29wVVpU0cTY3YOBL6FhNQhhCTwShBH4qTJGLnvc,2426
|
|
56
56
|
arelle/PrototypeDtsObject.py,sha256=0lf60VcXR_isx57hBPrc7vEMkFpYkVuK4JVBSmopzkQ,7989
|
|
@@ -67,7 +67,7 @@ arelle/Updater.py,sha256=ho8Z_9GOL39H1jHL3Gaw5uc6av7J8ZBB6dR_X-nF_e0,7124
|
|
|
67
67
|
arelle/UrlUtil.py,sha256=HrxZSG59EUMGMMGmWPuZkPi5-0BGqY3jAMkp7V4IdZo,32400
|
|
68
68
|
arelle/Validate.py,sha256=_7lDoGtUCyHgWK1Ak375D-kuPBZmDCNfSr_wsTLq10k,55328
|
|
69
69
|
arelle/ValidateDuplicateFacts.py,sha256=074y-VWCOBHoi6iV6wDL_IXBtdz9oeI1uPvjEcC1oDs,21717
|
|
70
|
-
arelle/ValidateFilingText.py,sha256=
|
|
70
|
+
arelle/ValidateFilingText.py,sha256=xnXc0xgdNiHQk0eyP7VSSpvw7qr-pRFRwqqoUb569is,54051
|
|
71
71
|
arelle/ValidateInfoset.py,sha256=Rz_XBi5Ha43KpxXYhjLolURcWVx5qmqyjLxw48Yt9Dg,20396
|
|
72
72
|
arelle/ValidateUtr.py,sha256=oxOPrOa1XEzBay4miXvx6eRLTnVFYUIJC9ueWUk4EkI,13633
|
|
73
73
|
arelle/ValidateVersReport.py,sha256=RMe7GlcyZV0HoVFHL0qOGrKm4et-6yPq5dmikkhnvoU,43196
|
|
@@ -118,12 +118,12 @@ arelle/XbrlConst.py,sha256=YDvnf0gQ3IY5v07d8wxAHTxDmvcHIpl2mSMZeTgvKmk,56695
|
|
|
118
118
|
arelle/XbrlUtil.py,sha256=s2Vmrh-sZI5TeuqsziKignOc3ao-uUgnCNoelP4dDj0,9212
|
|
119
119
|
arelle/XhtmlValidate.py,sha256=0gtm7N-kXK0RB5o3c1AQXjfFuRp1w2fKZZAeyruNANw,5727
|
|
120
120
|
arelle/XmlUtil.py,sha256=1VToOOylF8kbEorEdZLThmq35j9bmuF_DS2q9NthnHU,58774
|
|
121
|
-
arelle/XmlValidate.py,sha256=
|
|
121
|
+
arelle/XmlValidate.py,sha256=5tXC60dy3aI1sSoGp7rbB-nix_AB3q_nonbOPwMglNg,45881
|
|
122
122
|
arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,338
|
|
123
123
|
arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
|
|
124
124
|
arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
|
|
125
125
|
arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
126
|
-
arelle/_version.py,sha256=
|
|
126
|
+
arelle/_version.py,sha256=cinilF0XSPQghRi3cWKXaBHJTfQDo12BMn5RYEOmz6Q,515
|
|
127
127
|
arelle/typing.py,sha256=Ct5lrNKRow_o9CraMEXNza8nFsJ_iGIKoUeGfPs2dxI,1084
|
|
128
128
|
arelle/api/Session.py,sha256=O8zpg7MJys9uxwwHf8OsSlZxpPdq7A3ONyY39Q4A3Kc,6218
|
|
129
129
|
arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
|
|
@@ -345,7 +345,7 @@ arelle/plugin/security/cryptAES_CBC.py,sha256=S94AdMqu4jdLrprl0FLT2w7tG6IgxTGxRf
|
|
|
345
345
|
arelle/plugin/security/cryptAES_EAX.py,sha256=TAL_kpu_2WMMpHOWrxA8Y7UuTAcbbTY6DK0VYQZGWF0,5952
|
|
346
346
|
arelle/plugin/transforms/tester.py,sha256=57relfBci8FttRSxHtdUaxlaQPrBhJglssImDecQPow,12501
|
|
347
347
|
arelle/plugin/validate/CIPC/Const.py,sha256=GSiODyiK8V9P-pV0_DPEKYAhe2wqgcYJP2Qt6xaIyA4,11425
|
|
348
|
-
arelle/plugin/validate/CIPC/__init__.py,sha256=
|
|
348
|
+
arelle/plugin/validate/CIPC/__init__.py,sha256=R6KVETICUpfW--TvVkFNDo-67Kq_KpWz3my2ECkiKxM,14699
|
|
349
349
|
arelle/plugin/validate/CIPC/config.xml,sha256=4pyn40JAvQQeoRC8I046gZ4ZcmUnekX3TNfYpC5yonI,667
|
|
350
350
|
arelle/plugin/validate/DBA/DisclosureSystems.py,sha256=Dp_r-Pa3tahtCfDha2Zc97N0iyrY4Zagb8w2D9ErILg,294
|
|
351
351
|
arelle/plugin/validate/DBA/PluginValidationDataExtension.py,sha256=uDSu-xtKExJvlB5qNU4RXIorb4dbgh_Q8Ss_FbJ1RVg,6832
|
|
@@ -362,15 +362,15 @@ arelle/plugin/validate/EBA/__init__.py,sha256=1kW-04W32sStSAL8wvW1ZpXnjlFv6KLbfE
|
|
|
362
362
|
arelle/plugin/validate/EBA/config.xml,sha256=37wMVUAObK-XEqakqD8zPNog20emYt4a_yfL1AKubF8,2022
|
|
363
363
|
arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
|
|
364
364
|
arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
|
|
365
|
-
arelle/plugin/validate/ESEF/Util.py,sha256=
|
|
365
|
+
arelle/plugin/validate/ESEF/Util.py,sha256=QH3btcGqBpr42M7WSKZLSdNXygZaZLfEiEjlxoG21jE,7950
|
|
366
366
|
arelle/plugin/validate/ESEF/__init__.py,sha256=LL7uYOcGPHgjwTlcfW2oWMqWiqrZ5yABzcKkJZFrZis,20391
|
|
367
367
|
arelle/plugin/validate/ESEF/ESEF_2021/DTS.py,sha256=6Za7BANwwc_egxLCgbgWzwUGOXZv9IF1I7JCkDNt2Tw,26277
|
|
368
368
|
arelle/plugin/validate/ESEF/ESEF_2021/Image.py,sha256=4bnhuy5viBU0viPjb4FhcRRjVVKlNdnKLFdSGg3sZvs,4871
|
|
369
|
-
arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py,sha256=
|
|
369
|
+
arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py,sha256=k3-7Htx0V8VGlqLnzVVwsR-QoPtNn5VJSgKjCwqRQBs,62900
|
|
370
370
|
arelle/plugin/validate/ESEF/ESEF_2021/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
371
371
|
arelle/plugin/validate/ESEF/ESEF_Current/DTS.py,sha256=epp-PBh1NJzQqgxUE6C468HmoDc2w3j54rMwfiOAry4,29334
|
|
372
372
|
arelle/plugin/validate/ESEF/ESEF_Current/Image.py,sha256=w36sCTy8QbsuKABjkK6PTWce2A4zFN_rMnEM2wi5WEc,11364
|
|
373
|
-
arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=
|
|
373
|
+
arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=PjdUCKrUBXkDdOUdzdhT10UhcqE-JeCQnILz2F_zhpE,73186
|
|
374
374
|
arelle/plugin/validate/ESEF/ESEF_Current/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
375
375
|
arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=JriLZ45KmUYlQiPbXJCAahobqdrst64Ay77bofZhB5Q,14940
|
|
376
376
|
arelle/plugin/validate/ESEF/resources/config.xml,sha256=t3STU_-QYM7Ay8YwZRPapnohiWVWhjfr4L2Rjx9xN9U,3902
|
|
@@ -378,7 +378,7 @@ arelle/plugin/validate/FERC/__init__.py,sha256=V4fXcFKBsjFFPs9_1NhvDjWpEQCoQM0tR
|
|
|
378
378
|
arelle/plugin/validate/FERC/config.xml,sha256=bn9b8eCqJA1J62rYq1Nz85wJrMGAahVmmnIUQZyerjo,1919
|
|
379
379
|
arelle/plugin/validate/FERC/resources/ferc-utr.xml,sha256=OCRj9IUpdXATCBXKbB71apYx9kxcNtZW-Hq4s-avsRY,2663
|
|
380
380
|
arelle/plugin/validate/NL/DisclosureSystems.py,sha256=kTjpxkgwn58wHCbaLRBInirOy-2cpK9MLWEFJ_193y4,180
|
|
381
|
-
arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=
|
|
381
|
+
arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=pbFSndg59-l6SS708c1zXFLgTJ9sVD82XU4YakU0uA0,8690
|
|
382
382
|
arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=2qvvOqBkgk2LwERTHDuxtrRupYz3yRyhH71XQLbl9F4,15507
|
|
383
383
|
arelle/plugin/validate/NL/__init__.py,sha256=99uMv4ESHwyJqA-Xq_hBvHygm0BQ3NxcmAJnVYUkSgg,3104
|
|
384
384
|
arelle/plugin/validate/NL/resources/config.xml,sha256=i_ns2wHmQYjhkRItevRR8tzfkl31ASfbWlc5t6pDB-w,1117
|
|
@@ -387,7 +387,7 @@ arelle/plugin/validate/NL/rules/br_kvk.py,sha256=0SwKieWzTDm3YMsXPS6zTdgbk7_Z9Cz
|
|
|
387
387
|
arelle/plugin/validate/NL/rules/fg_nl.py,sha256=4Puq5wAjtK_iNd4wisH_R0Z_EKJ7MT2OCai5g4t1MPE,10714
|
|
388
388
|
arelle/plugin/validate/NL/rules/fr_kvk.py,sha256=-_BLeWGoZ_f56p5VO4X40S45Ny3Ej-WK6Srei1KVSxU,8170
|
|
389
389
|
arelle/plugin/validate/NL/rules/fr_nl.py,sha256=-M1WtXp06khhtkfOVPCa-b8UbC281gk4YfDhvtAVlnI,31424
|
|
390
|
-
arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=
|
|
390
|
+
arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=gCmOZP3sYJBBzuFoZSg4T4M5bB2MnThduS1no4BWSqc,16062
|
|
391
391
|
arelle/plugin/validate/ROS/DisclosureSystems.py,sha256=rJ81mwQDYTi6JecFZ_zhqjjz3VNQRgjHNSh0wcQWAQE,18
|
|
392
392
|
arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=IV7ILhNvgKwQXqbpSA6HRNt9kEnejCyMADI3wyyIgk0,4036
|
|
393
393
|
arelle/plugin/validate/ROS/ValidationPluginExtension.py,sha256=FBhEp8t396vGdvCbMEimfcxmGiGnhXMen-yVLWnkFaI,758
|
|
@@ -395,7 +395,7 @@ arelle/plugin/validate/ROS/__init__.py,sha256=KuWg1MHVzA2S6eaHFptvP3Vu_5gQWf3OUY
|
|
|
395
395
|
arelle/plugin/validate/ROS/config.xml,sha256=ZCpCFgr1ZAjoUuhb1eRpDnmKrae-sXA9yl6SOWnrfm8,654
|
|
396
396
|
arelle/plugin/validate/ROS/resources/config.xml,sha256=HXWume5HlrAqOx5AtiWWqgADbRatA8YSfm_JvZGwdgQ,657
|
|
397
397
|
arelle/plugin/validate/ROS/rules/__init__.py,sha256=wW7BUAIb7sRkOxC1Amc_ZKrz03FM-Qh1TyZe6wxYaAU,1567
|
|
398
|
-
arelle/plugin/validate/ROS/rules/ros.py,sha256=
|
|
398
|
+
arelle/plugin/validate/ROS/rules/ros.py,sha256=se4i-wTVGecXgK6EXrP_FSDau0O4KNsp9lq1h4k5KkM,19941
|
|
399
399
|
arelle/plugin/validate/UK/ValidateUK.py,sha256=0UhSwsY1lrY-EAEBJJR9QY38YXGBZ6PEgmuC5gQfBlI,57813
|
|
400
400
|
arelle/plugin/validate/UK/__init__.py,sha256=WOAbzcogxP2hD3HmNnVIrvUO4w0Cv36447AoPrMa7KU,30548
|
|
401
401
|
arelle/plugin/validate/UK/config.xml,sha256=mUFhWDfBzGTn7v0ZSmf4HaweQTMJh_4ZcJmD9mzCHrA,1547
|
|
@@ -704,10 +704,11 @@ arelle/utils/validate/Decorator.py,sha256=8LGmA171HZgKrALtsMKyHqMNM-XCdwJOv6KpZz
|
|
|
704
704
|
arelle/utils/validate/DetectScriptsInXhtml.py,sha256=JOgsUP0_kvE6O3TuhzKxqKG1ZFP9LrUYZBgrar6JEm0,2178
|
|
705
705
|
arelle/utils/validate/Validation.py,sha256=n6Ag7VeCj_VO5nqzw_P53hOfXXeT2APK0Enb3UQqBns,832
|
|
706
706
|
arelle/utils/validate/ValidationPlugin.py,sha256=_WeRPXZUTCcSN3FLbFwiAe_2pAUTxZZk1061qMoDW8w,11527
|
|
707
|
+
arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txrxRFgh8FxIs,548
|
|
707
708
|
arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
708
709
|
arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
709
710
|
arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
|
|
710
|
-
arelle_release-2.37.
|
|
711
|
+
arelle_release-2.37.12.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
|
|
711
712
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
712
713
|
tests/integration_tests/download_cache.py,sha256=jVMIVICsZjcVc9DCPPu3fCjF9_cWSS3tqSynhFs3oAM,4097
|
|
713
714
|
tests/integration_tests/integration_test_util.py,sha256=H7mncbv0T9ZeVyrtk9Hohe3k6jgcYykHkt-LGE-Q9aQ,10270
|
|
@@ -762,7 +763,7 @@ tests/integration_tests/validation/conformance_suite_configurations/kvk_nt16.py,
|
|
|
762
763
|
tests/integration_tests/validation/conformance_suite_configurations/kvk_nt17.py,sha256=lmEZonthFm0YKFmp1dwXtdJ2T7txUeSpL4mbAo8fl4Y,1292
|
|
763
764
|
tests/integration_tests/validation/conformance_suite_configurations/kvk_nt18.py,sha256=EG2RQVkvFENhzUF3fl3QvDnH7ZPYS1n1Fo8bhfmSczM,1205
|
|
764
765
|
tests/integration_tests/validation/conformance_suite_configurations/kvk_nt19.py,sha256=FAzf9RhRmn_8yowpplJho2zEspX9FxJiVq8SjZT3Dsc,1199
|
|
765
|
-
tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py,sha256=
|
|
766
|
+
tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py,sha256=5WbjM571b4Va8JbW8nuBp_XU7K-LecvNxFfpVyKfVM0,11095
|
|
766
767
|
tests/integration_tests/validation/conformance_suite_configurations/nl_nt16.py,sha256=O_LFVBZPkjxmbrU7_C7VTLtrdoCUx2bYXOXw6_MlRtQ,846
|
|
767
768
|
tests/integration_tests/validation/conformance_suite_configurations/nl_nt17.py,sha256=aTN3Ez6lPsZsuypHZP84DneOtYxUZSjUiGypHy6ofHQ,846
|
|
768
769
|
tests/integration_tests/validation/conformance_suite_configurations/nl_nt18.py,sha256=sqHLjrHc95dTu0guTgKkphaKM1zNfKGnN4GKkZDLzeU,845
|
|
@@ -1556,8 +1557,8 @@ tests/unit_tests/arelle/oim/test_load.py,sha256=NxiUauQwJVfWAHbbpsMHGSU2d3Br8Pki
|
|
|
1556
1557
|
tests/unit_tests/arelle/plugin/test_plugin_imports.py,sha256=bdhIs9frAnFsdGU113yBk09_jis-z43dwUItMFYuSYM,1064
|
|
1557
1558
|
tests/unit_tests/arelle/plugin/validate/ESEF/ESEF_Current/test_validate_css_url.py,sha256=XHABmejQt7RlZ0udh7v42f2Xb2STGk_fSaIaJ9i2xo0,878
|
|
1558
1559
|
tests/unit_tests/arelle/utils/validate/test_decorator.py,sha256=ZS8FqIY1g-2FCbjF4UYm609dwViax6qBMRJSi0vfuhY,2482
|
|
1559
|
-
arelle_release-2.37.
|
|
1560
|
-
arelle_release-2.37.
|
|
1561
|
-
arelle_release-2.37.
|
|
1562
|
-
arelle_release-2.37.
|
|
1563
|
-
arelle_release-2.37.
|
|
1560
|
+
arelle_release-2.37.12.dist-info/METADATA,sha256=HRYC-wPK2dvdAehLuqUvqbFGfsljI-F9gHXbwTH5qXA,9065
|
|
1561
|
+
arelle_release-2.37.12.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
|
|
1562
|
+
arelle_release-2.37.12.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
|
|
1563
|
+
arelle_release-2.37.12.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
|
|
1564
|
+
arelle_release-2.37.12.dist-info/RECORD,,
|
|
@@ -18,9 +18,17 @@ config = ConformanceSuiteConfig(
|
|
|
18
18
|
*NL_PACKAGES['NL-INLINE-2024'],
|
|
19
19
|
],
|
|
20
20
|
expected_additional_testcase_errors={f"conformance-suite-2024-sbr-domein-handelsregister/tests/{s}": val for s, val in {
|
|
21
|
-
'
|
|
22
|
-
'
|
|
23
|
-
|
|
21
|
+
'G3-2-4_2/index.xml:TC3_valid': {
|
|
22
|
+
'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 1,
|
|
23
|
+
},
|
|
24
|
+
'G4-1-2_1/index.xml:TC2_valid': {
|
|
25
|
+
'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 1,
|
|
26
|
+
},
|
|
27
|
+
'RTS_Annex_II_Par_1_RTS_Annex_IV_par_7/index.xml:TC2_valid': {
|
|
28
|
+
'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 1,
|
|
29
|
+
},
|
|
30
|
+
'RTS_Annex_II_Par_1_RTS_Annex_IV_par_7/index.xml:TC4_invalid': {
|
|
31
|
+
'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 1,
|
|
24
32
|
},
|
|
25
33
|
'RTS_Annex_IV_Par_1_G3-1-4_1/index.xml:TC2_invalid': {
|
|
26
34
|
'message:valueKvKIdentifier': 13,
|
|
@@ -29,18 +37,25 @@ config = ConformanceSuiteConfig(
|
|
|
29
37
|
'RTS_Annex_IV_Par_1_G3-1-4_2/index.xml:TC2_invalid': {
|
|
30
38
|
'message:valueKvKIdentifier': 13,
|
|
31
39
|
},
|
|
40
|
+
'RTS_Annex_IV_Par_2_G3-1-1_2/index.xml:TC2_invalid': {
|
|
41
|
+
'message:lei-identifier-format': 105,
|
|
42
|
+
'message:valueKvKIdentifierScheme': 105,
|
|
43
|
+
},
|
|
44
|
+
'RTS_Annex_IV_Par_6/index.xml:TC2_valid': {
|
|
45
|
+
'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 1,
|
|
46
|
+
},
|
|
32
47
|
}.items()},
|
|
33
48
|
expected_failure_ids=frozenset([
|
|
34
49
|
# Conformance Suite Errors
|
|
50
|
+
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-3-1_2/index.xml:TC3_invalid', # Expects an error code with a preceding double quote. G3-3-1_3 expects the same code without the typo.
|
|
35
51
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_2_G3-1-1_1/index.xml:TC2_invalid', # Expects NonIdenticalIdentifier instead of nonIdenticalIdentifier (note the cap N)
|
|
36
52
|
|
|
53
|
+
|
|
37
54
|
# Not Implemented
|
|
38
55
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-2-7_1/index.xml:TC4_invalid',
|
|
39
56
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-2-7_1/index.xml:TC5_invalid',
|
|
40
57
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-2-7_1/index.xml:TC6_invalid',
|
|
41
58
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-2-7_1/index.xml:TC7_invalid',
|
|
42
|
-
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-3-1_2/index.xml:TC3_invalid', # Expects an error code with a preceding double quote. G3-3-1_3 expects the same code without the typo.
|
|
43
|
-
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-3-1_3/index.xml:TC2_invalid',
|
|
44
59
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-4-1_1/index.xml:TC2_invalid',
|
|
45
60
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-4-1_2/index.xml:TC2_invalid',
|
|
46
61
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-4-1_3/index.xml:TC2_invalid',
|
|
@@ -56,7 +71,6 @@ config = ConformanceSuiteConfig(
|
|
|
56
71
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_5/index.xml:TC2_invalid',
|
|
57
72
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_5/index.xml:TC3_invalid',
|
|
58
73
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-2_1/index.xml:TC3_invalid',
|
|
59
|
-
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-2_2/index.xml:TC2_invalid',
|
|
60
74
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-3_1/index.xml:TC2_invalid',
|
|
61
75
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-4_1/index.xml:TC2_invalid',
|
|
62
76
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-6-2_1/index.xml:TC2_invalid',
|
|
File without changes
|
|
File without changes
|
|
File without changes
|