arelle-release 2.37.9__py3-none-any.whl → 2.37.11__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/_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.9'
21
- __version_tuple__ = version_tuple = (2, 37, 9)
20
+ __version__ = version = '2.37.11'
21
+ __version_tuple__ = version_tuple = (2, 37, 11)
arelle/oim/Load.py CHANGED
@@ -839,7 +839,21 @@ def _loadFromOIM(cntlr, error, warning, modelXbrl, oimFile, mappedUri):
839
839
  filepath = modelXbrl.modelManager.cntlr.webCache.getfilename(mappedUrl) # , reload=reloadCache, checkModifiedTime=kwargs.get("checkModifiedTime",False))
840
840
  if filepath:
841
841
  url = modelXbrl.modelManager.cntlr.webCache.normalizeUrl(filepath)
842
- if filepath and filepath.endswith(".csv") or ("metadata" in filepath and filepath.endswith(".json")):
842
+ if filepath is None:
843
+ if extendingFile is None:
844
+ raise OIMException(
845
+ "oime:unresolvableFile",
846
+ _("Unable to resolve file %(oimFile)s. A taxonomy package may be required to load this report."),
847
+ oimFile=oimFile,
848
+ )
849
+ else:
850
+ raise OIMException(
851
+ "xbrlce:unresolvableBaseMetadataFile",
852
+ _("Unable to resolve extended metadata file %(extendingFile)s, referenced from %(oimFile)s. A taxonomy package may be required to load this report."),
853
+ extendingFile=extendingFile,
854
+ oimFile=oimFile,
855
+ )
856
+ if filepath.endswith(".csv") or ("metadata" in filepath and filepath.endswith(".json")):
843
857
  errPrefix = "xbrlce"
844
858
  else:
845
859
  errPrefix = "xbrlje"
@@ -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
 
@@ -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
 
@@ -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
@@ -14,9 +14,12 @@ from arelle.FunctionIxt import ixtNamespaces
14
14
  from arelle.ModelInstanceObject import ModelUnit, ModelContext, ModelFact, ModelInlineFootnote
15
15
  from arelle.ModelValue import QName
16
16
  from arelle.ModelXbrl import ModelXbrl
17
+ from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
17
18
  from arelle.utils.PluginData import PluginData
18
19
  from arelle.XmlValidate import lexicalPatterns
19
20
 
21
+ from lxml.etree import EntityBase, _Comment, _ElementTree, _ProcessingInstruction
22
+
20
23
  XBRLI_IDENTIFIER_PATTERN = re.compile(r"^(?!00)\d{8}$")
21
24
  XBRLI_IDENTIFIER_SCHEMA = 'http://www.kvk.nl/kvk-id'
22
25
 
@@ -37,6 +40,7 @@ class ContextData:
37
40
  class FootnoteData:
38
41
  noMatchLangFootnotes: set[ModelInlineFootnote]
39
42
  orphanedFootnotes: set[ModelInlineFootnote]
43
+ factLangFootnotes: dict[ModelInlineFootnote, set[str]]
40
44
 
41
45
  @dataclass
42
46
  class PluginValidationDataExtension(PluginData):
@@ -103,6 +107,7 @@ class PluginValidationDataExtension(PluginData):
103
107
  footnotesRelationshipSet = modelXbrl.relationshipSet("XBRL-footnotes")
104
108
  orphanedFootnotes = set()
105
109
  noMatchLangFootnotes = set()
110
+ factLangFootnotes = defaultdict(set)
106
111
  for elts in modelXbrl.ixdsEltById.values(): # type: ignore[attr-defined]
107
112
  for elt in elts:
108
113
  if isinstance(elt, ModelInlineFootnote):
@@ -112,9 +117,14 @@ class PluginValidationDataExtension(PluginData):
112
117
  orphanedFootnotes.add(elt)
113
118
  if elt.xmlLang not in factLangs:
114
119
  noMatchLangFootnotes.add(elt)
120
+ for rel in footnotesRelationshipSet.toModelObject(elt):
121
+ if rel.fromModelObject is not None:
122
+ factLangFootnotes[rel.fromModelObject].add(elt.xmlLang)
123
+ factLangFootnotes.default_factory = None
115
124
  return FootnoteData(
116
125
  noMatchLangFootnotes=noMatchLangFootnotes,
117
126
  orphanedFootnotes=orphanedFootnotes,
127
+ factLangFootnotes=dict(factLangFootnotes),
118
128
  )
119
129
 
120
130
  @lru_cache(1)
@@ -155,6 +165,28 @@ class PluginValidationDataExtension(PluginData):
155
165
  def getOrphanedFootnotes(self, modelXbrl: ModelXbrl) -> set[ModelInlineFootnote]:
156
166
  return self.checkFootnotes(modelXbrl).orphanedFootnotes
157
167
 
168
+ def getFactLangFootnotes(self, modelXbrl: ModelXbrl) -> dict[ModelInlineFootnote, set[str]]:
169
+ return self.checkFootnotes(modelXbrl).factLangFootnotes
170
+
171
+ @lru_cache(1)
172
+ def getReportXmlLang(self, modelXbrl: ModelXbrl) -> str | None:
173
+ firstIxdsDoc = True
174
+ reportXmlLang = None
175
+ firstRootmostXmlLangDepth = 9999999
176
+ for ixdsHtmlRootElt in modelXbrl.ixdsHtmlElements:
177
+ for uncast_elt, depth in etreeIterWithDepth(ixdsHtmlRootElt):
178
+ elt = cast(Any, uncast_elt)
179
+ eltTag = elt.tag
180
+ if isinstance(elt, (_ElementTree, _Comment, _ProcessingInstruction, EntityBase)):
181
+ continue
182
+ if firstIxdsDoc and (not reportXmlLang or depth < firstRootmostXmlLangDepth):
183
+ xmlLang = elt.get("{http://www.w3.org/XML/1998/namespace}lang")
184
+ if xmlLang:
185
+ reportXmlLang = xmlLang
186
+ firstRootmostXmlLangDepth = depth
187
+ firstIxdsDoc = False
188
+ return reportXmlLang
189
+
158
190
  @lru_cache(1)
159
191
  def unitsByDocument(self, modelXbrl: ModelXbrl) -> dict[str, list[ModelUnit]]:
160
192
  unitsByDocument = defaultdict(list)
@@ -23,7 +23,6 @@ class ValidationPluginExtension(ValidationPlugin):
23
23
  jenvNamespace = 'http://www.nltaxonomie.nl/nt16/jenv/20211208/dictionary/jenv-bw2-data'
24
24
  kvkINamespace = 'http://www.nltaxonomie.nl/nt16/kvk/20211208/dictionary/kvk-data'
25
25
  nlTypesNamespace = 'http://www.nltaxonomie.nl/nt16/sbr/20210301/dictionary/nl-types'
26
- titel9Namespace = ''
27
26
  entrypointRoot = 'http://www.nltaxonomie.nl/nt16/kvk/20211208/entrypoints/'
28
27
  entrypoints = {entrypointRoot + e for e in [
29
28
  'kvk-rpt-jaarverantwoording-2021-ifrs-full.xsd',
@@ -60,7 +59,6 @@ class ValidationPluginExtension(ValidationPlugin):
60
59
  jenvNamespace = 'http://www.nltaxonomie.nl/nt17/jenv/20221214/dictionary/jenv-bw2-data'
61
60
  kvkINamespace = 'http://www.nltaxonomie.nl/nt17/kvk/20221214/dictionary/kvk-data'
62
61
  nlTypesNamespace = 'http://www.nltaxonomie.nl/nt17/sbr/20220301/dictionary/nl-types'
63
- titel9Namespace = ''
64
62
  entrypointRoot = 'http://www.nltaxonomie.nl/nt17/kvk/20221214/entrypoints/'
65
63
  entrypoints = {entrypointRoot + e for e in [
66
64
  'kvk-rpt-jaarverantwoording-2022-ifrs-full.xsd',
@@ -98,7 +96,6 @@ class ValidationPluginExtension(ValidationPlugin):
98
96
  jenvNamespace = 'http://www.nltaxonomie.nl/nt18/jenv/20231213/dictionary/jenv-bw2-data'
99
97
  kvkINamespace = 'http://www.nltaxonomie.nl/nt18/kvk/20231213/dictionary/kvk-data'
100
98
  nlTypesNamespace = 'http://www.nltaxonomie.nl/nt18/sbr/20230301/dictionary/nl-types'
101
- titel9Namespace = ''
102
99
  entrypointRoot = 'http://www.nltaxonomie.nl/nt18/kvk/20231213/entrypoints/'
103
100
  entrypoints = {entrypointRoot + e for e in [
104
101
  'kvk-rpt-jaarverantwoording-2023-ifrs-full.xsd',
@@ -132,11 +129,10 @@ class ValidationPluginExtension(ValidationPlugin):
132
129
  'kvk-rpt-jaarverantwoording-2023-nlgaap-verzekeringsmaatschappijen.xsd',
133
130
  'kvk-rpt-jaarverantwoording-2023-nlgaap-zorginstellingen.xsd',
134
131
  ]}
135
- elif disclosureSystem == DISCLOSURE_SYSTEM_NT19 or disclosureSystem == DISCLOSURE_SYSTEM_NL_INLINE_2024:
132
+ elif disclosureSystem == DISCLOSURE_SYSTEM_NT19:
136
133
  jenvNamespace = 'http://www.nltaxonomie.nl/nt19/jenv/20241211/dictionary/jenv-bw2-data'
137
134
  kvkINamespace = 'http://www.nltaxonomie.nl/nt19/kvk/20241211/dictionary/kvk-data'
138
135
  nlTypesNamespace = 'http://www.nltaxonomie.nl/nt19/sbr/20240301/dictionary/nl-types'
139
- titel9Namespace = 'https://www.nltaxonomie.nl/bw2-titel9/2024-12-31/bw2-titel9-cor' if disclosureSystem == DISCLOSURE_SYSTEM_NL_INLINE_2024 else ''
140
136
  entrypointRoot = 'http://www.nltaxonomie.nl/nt19/kvk/20241211/entrypoints/'
141
137
  entrypoints = {entrypointRoot + e for e in [
142
138
  'kvk-rpt-jaarverantwoording-2024-ifrs-full.xsd',
@@ -170,11 +166,21 @@ class ValidationPluginExtension(ValidationPlugin):
170
166
  'kvk-rpt-jaarverantwoording-2024-nlgaap-verzekeringsmaatschappijen.xsd',
171
167
  'kvk-rpt-jaarverantwoording-2024-nlgaap-zorginstellingen.xsd',
172
168
  ]}
169
+ elif disclosureSystem == DISCLOSURE_SYSTEM_NL_INLINE_2024:
170
+ jenvNamespace = 'https://www.nltaxonomie.nl/bw2-titel9/2024-12-31/bw2-titel9-cor'
171
+ kvkINamespace = None
172
+ nlTypesNamespace = None
173
+ entrypointRoot = 'http://www.nltaxonomie.nl/kvk/2024-12-31/'
174
+ entrypoints = {entrypointRoot + e for e in [
175
+ 'kvk-annual-report-ifrs-ext.xsd',
176
+ 'kvk-annual-report-nlgaap-ext.xsd',
177
+ 'kvk-annual-report-other-gaap.xsd',
178
+ ]}
173
179
  else:
174
180
  raise ValueError(f'Invalid NL disclosure system: {disclosureSystem}')
175
181
  return PluginValidationDataExtension(
176
182
  self.name,
177
- chamberOfCommerceRegistrationNumberQn=qname(f'{{{titel9Namespace}}}ChamberOfCommerceRegistrationNumber'),
183
+ chamberOfCommerceRegistrationNumberQn=qname(f'{{{jenvNamespace}}}ChamberOfCommerceRegistrationNumber'),
178
184
  documentAdoptionDateQn=qname(f'{{{jenvNamespace}}}DocumentAdoptionDate'),
179
185
  documentAdoptionStatusQn=qname(f'{{{jenvNamespace}}}DocumentAdoptionStatus'),
180
186
  documentResubmissionUnsurmountableInaccuraciesQn=qname(f'{{{kvkINamespace}}}DocumentResubmissionDueToUnsurmountableInaccuracies'),
@@ -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
+ )
@@ -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.9
3
+ Version: 2.37.11
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
@@ -123,7 +123,7 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
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=WqJGozqqREBJBA6fQjhQdUwehAER6_LId_HFTAbXLC0,513
126
+ arelle/_version.py,sha256=UX5PNNTrOLUsl7iAia9CpK-Esl9BSjjx3ISlTR1ywcY,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
@@ -294,7 +294,7 @@ arelle/model/CommentBase.py,sha256=NtC2lFd9Mt1y7kzWwrpvexwqBdfSe1nvGFiIJeio3rU,1
294
294
  arelle/model/ElementBase.py,sha256=pZX836d4-s-OvzPMUusvEDezI9D_6YKO7_j6iDcUXm4,404
295
295
  arelle/model/PIBase.py,sha256=easZ3pKXJ5wq3NFB2pDtBeXNDcjwMAXylpXz6mnumOg,257
296
296
  arelle/model/__init__.py,sha256=RLmC1rTus3T_2Vvnu3yHtdw1r0wrZCHZoqxe8BLg_wE,595
297
- arelle/oim/Load.py,sha256=TX5lA0MsN1Vig0A6ozlY-eOa9z0OaAxBcsICu_jrlk0,182158
297
+ arelle/oim/Load.py,sha256=kqKvs3q6VE6fKxCv9X0kxnyTywKMyC_qGGAB__v51TU,182910
298
298
  arelle/oim/Validate.py,sha256=IaBClr2KYMiVC_GKYy4_A9gF7hcnm-lxXpQrDCqIWGs,9012
299
299
  arelle/oim/xml/Save.py,sha256=MdaJiGcEo4nbQCX9sRgWfVIoxp6fd2N-wuLiDAS9D-I,607
300
300
  arelle/packages/PackageConst.py,sha256=iIIF-Ic8zlMPiiCq3PcV57aWci6ispBtilSG4W7ZW4U,121
@@ -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=wrIjd1XsA3iAGwlULca4LxrEaeDj5vB7aldyPG9ycZE,62871
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=aP4tVQudMAXDXLD3M121BAfQ1DtH2dox6kdBvhlyDho,73157
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,8 +378,8 @@ 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
382
- arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=JpJ4AZTa_wnDXeW2XfqL70a4y1EpuTsLpvfQku2gs1g,15295
381
+ arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=0zdBf1mTfR9YCquvk1p_t67Guhjb7XgM8bwBgMpmcvs,8730
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
385
385
  arelle/plugin/validate/NL/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -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
@@ -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.9.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
711
+ arelle_release-2.37.11.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.9.dist-info/METADATA,sha256=-mjEWbH5BRJPTW798T2ZdN8F6p35MzK1zEEZS5eThAM,9064
1560
- arelle_release-2.37.9.dist-info/WHEEL,sha256=DnLRTWE75wApRYVsjgc6wsVswC54sMSJhAEd4xhDpBk,91
1561
- arelle_release-2.37.9.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1562
- arelle_release-2.37.9.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1563
- arelle_release-2.37.9.dist-info/RECORD,,
1560
+ arelle_release-2.37.11.dist-info/METADATA,sha256=Oo7fwuP5YONoSo93bQ9Kv9yPSXy-9PSG1SxlzYVk_D8,9065
1561
+ arelle_release-2.37.11.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
1562
+ arelle_release-2.37.11.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1563
+ arelle_release-2.37.11.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1564
+ arelle_release-2.37.11.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.4.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',