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 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
- modelXbrl = self.modelManager.modelXbrl
1115
- if modelXbrl and modelXbrl.modelDocument:
1116
- if (modelXbrl.modelManager.validateDisclosureSystem and
1117
- not modelXbrl.modelManager.disclosureSystem.selection):
1118
- tkinter.messagebox.showwarning(_("arelle - Warning"),
1119
- _("Validation - disclosure system checks is requested but no disclosure system is selected, please select one by validation - select disclosure system."),
1120
- parent=self.parent)
1121
- else:
1122
- if modelXbrl.modelDocument.type in ModelDocument.Type.TESTCASETYPES:
1123
- for pluginXbrlMethod in pluginClassMethods("Testcases.Start"):
1124
- pluginXbrlMethod(self, None, modelXbrl)
1125
- thread = threading.Thread(target=self.backgroundValidate, daemon=True).start()
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
- startedAt = time.time()
1130
- for modelXbrl in [self.modelManager.modelXbrl] + getattr(self.modelManager.modelXbrl, "supplementalModelXbrls", []):
1131
- priorOutputInstance = modelXbrl.formulaOutputInstance
1132
- modelXbrl.formulaOutputInstance = None # prevent closing on background thread by validateFormula
1133
- try:
1134
- Validate.validate(modelXbrl)
1135
- except Exception as err:
1136
- self.addToLog(_("[exception] Validation exception: {0} at {1}").format(
1137
- err,
1138
- traceback.format_tb(sys.exc_info()[2])))
1139
- self.addToLog(format_string(self.modelManager.locale,
1140
- _("validated in %.2f secs"),
1141
- time.time() - startedAt))
1142
- if not modelXbrl.isClosed and (priorOutputInstance or modelXbrl.formulaOutputInstance):
1143
- self.uiThreadQueue.put((self.showFormulaOutputInstance, [priorOutputInstance, modelXbrl.formulaOutputInstance]))
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",
@@ -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
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '2.37.10'
21
- __version_tuple__ = version_tuple = (2, 37, 10)
20
+ __version__ = version = '2.37.12'
21
+ __version_tuple__ = version_tuple = (2, 37, 12)
@@ -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 EntityBase, _Comment, _ElementTree, _ProcessingInstruction
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 etreeIterWithDepth, isExtension
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, _Comment, _ProcessingInstruction, EntityBase)):
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, _Comment, _ProcessingInstruction)):
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 EntityBase, _Comment, _ElementTree, _ProcessingInstruction
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, etreeIterWithDepth, getEsefNotesStatementConcepts, isExtension, getDisclosureSystemYear
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, EntityBase)):
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, _Comment, _ProcessingInstruction)):
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, Generator
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 ModelUnit, ModelContext, ModelFact, ModelInlineFootnote
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, _Comment, _ProcessingInstruction
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, _Comment, _ProcessingInstruction)):
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.10
3
+ Version: 2.37.12
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License: Apache-2.0
@@ -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=qG1nSN9cMafrZNZgIlA6W_iMsmTwIcpUqb_S1J6YR9k,96611
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=B68B_3sUdy5rhi2HEKQwkTC1DmHAbJGEc8ewkTl4Gnw,32570
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=qBDrS3O9xtvGLn8Qfmjedg4iaClmeDA-ti7KM4JXY0A,54024
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=TL72yUQA0PqdcFgw7rW8uxUWw6i1pN7q6V42Uk6gMYY,45857
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=iV7pCtMGFdowMnJ9Enx0EMr8MXyKfpbuw_YEjFfm9Rc,515
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=OMLc0DgKulsyQlVhU9Wjlt_1VMpNJiUWBH16KV6TLtA,14681
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=pNwtMG2pIQsGpuc0X4oopXdqnIu9HI16Ado2Dp7SSKw,8244
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=AGjPhegfY9hgKDAwjo7wF8dFzwo3FIVWszMmN30dYbg,62822
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=z0ZAjDbt6jhGmcSSjfaW-MiR8jO8_ovVGXfGEk43060,73109
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=dJjfHb3QMK2LlGKTwSz_IxFLYXejFPgLZlVgTPxgFPI,7074
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=OSryY5fT1UCTqahJbIv0jlsWKITPeUckEw2C44K8uRo,13974
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=z73XGmFHfxeD8SO4cVjuazerguaF4MBfG6Jf5TJZkKw,19923
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.10.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
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=kVK0obRRXZrakg9BE4aXCtuV7C39GiKPFNWC3ywKS7k,10584
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.10.dist-info/METADATA,sha256=DFJI_rtWLKg0WZcg8-DGlJjNJStGQ6md6klHzFXc3Vw,9065
1560
- arelle_release-2.37.10.dist-info/WHEEL,sha256=A8Eltl-h0W-qZDVezsLjjslosEH_pdYC2lQ0JcbgCzs,91
1561
- arelle_release-2.37.10.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1562
- arelle_release-2.37.10.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1563
- arelle_release-2.37.10.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.7.0)
2
+ Generator: setuptools (80.7.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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
- 'RTS_Annex_IV_Par_2_G3-1-1_2/index.xml:TC2_invalid': {
22
- 'message:lei-identifier-format': 105,
23
- 'message:valueKvKIdentifierScheme': 105,
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',