arelle-release 2.37.4__py3-none-any.whl → 2.37.5__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.

@@ -396,7 +396,7 @@ class DisclosureSystem:
396
396
  level=logging.ERROR)
397
397
  etree.clear_error_log()
398
398
 
399
- def mappedUrl(self, url):
399
+ def mappedUrl(self, url: str) -> str:
400
400
  if url in self.mappedFiles:
401
401
  mappedUrl = self.mappedFiles[url]
402
402
  else: # handle mapped paths
@@ -407,6 +407,15 @@ class DisclosureSystem:
407
407
  break
408
408
  return mappedUrl
409
409
 
410
+ def isMappedUrl(self, url: str) -> bool:
411
+ if url in self.mappedFiles:
412
+ return True
413
+ else: # handle mapped paths
414
+ for mapFrom, mapTo in self.mappedPaths:
415
+ if url.startswith(mapFrom):
416
+ return True
417
+ return False
418
+
410
419
  def uriAuthorityValid(self, uri):
411
420
  if self.standardTaxonomiesUrl:
412
421
  return UrlUtil.authority(uri) in self.standardAuthorities
arelle/FileSource.py CHANGED
@@ -191,7 +191,11 @@ class FileSource:
191
191
  if not self.isZip:
192
192
  # Try to detect zip files with unrecognized file extensions.
193
193
  try:
194
- basefile = self.cntlr.webCache.getfilename(self.url) if self.cntlr is not None else self.url
194
+ if self.cntlr is not None and hasattr(self.cntlr, "modelManager"):
195
+ basefile = self.cntlr.webCache.getfilename( # cache remapping
196
+ self.cntlr.modelManager.disclosureSystem.mappedUrl(self.url)) # local remapping
197
+ else:
198
+ basefile = self.url
195
199
  if basefile:
196
200
  with openFileStream(self.cntlr, basefile, 'rb') as fileStream:
197
201
  self.isZip = zipfile.is_zipfile(fileStream)
@@ -213,7 +217,8 @@ class FileSource:
213
217
  elif checkIfXmlIsEis:
214
218
  try:
215
219
  assert self.cntlr is not None
216
- _filename = self.cntlr.webCache.getfilename(self.url)
220
+ _filename = self.cntlr.webCache.getfilename(
221
+ self.cntlr.modelManager.disclosureSystem.mappedUrl(self.url))
217
222
  assert _filename is not None
218
223
  file = open(_filename, errors='replace')
219
224
  l = file.read(256) # may have comments before first element
@@ -234,7 +239,8 @@ class FileSource:
234
239
  if self.isValid and not self.isOpen:
235
240
  if (self.isZip or self.isTarGz or self.isEis or self.isXfd or self.isRss or self.isInstalledTaxonomyPackage) and self.cntlr:
236
241
  assert isinstance(self.url, str)
237
- self.basefile = self.cntlr.webCache.getfilename(self.url, reload=reloadCache)
242
+ self.basefile = self.cntlr.webCache.getfilename(
243
+ self.cntlr.modelManager.disclosureSystem.mappedUrl(self.url), reload=reloadCache)
238
244
  else:
239
245
  self.basefile = self.url
240
246
  self.baseurl = self.url # url gets changed by selection
@@ -473,8 +479,11 @@ class FileSource:
473
479
 
474
480
  def isMappedUrl(self, url: str) -> bool:
475
481
  if self.mappedPaths is not None:
476
- return any(url.startswith(mapFrom)
477
- for mapFrom in self.mappedPaths)
482
+ if any(url.startswith(mapFrom)
483
+ for mapFrom in self.mappedPaths):
484
+ return True
485
+ if self.cntlr and self.cntlr.modelManager.disclosureSystem.isMappedUrl(url):
486
+ return True
478
487
  return False
479
488
 
480
489
  def mappedUrl(self, url: str) -> str:
@@ -483,6 +492,8 @@ class FileSource:
483
492
  if url.startswith(mapFrom):
484
493
  url = mapTo + url[len(mapFrom):]
485
494
  break
495
+ if self.cntlr:
496
+ return self.cntlr.modelManager.disclosureSystem.mappedUrl(url)
486
497
  return url
487
498
 
488
499
  def fileSourceContainingFilepath(self, filepath: str | None) -> FileSource | None:
@@ -807,11 +818,12 @@ def openFileStream(
807
818
  cntlr
808
819
  and hasattr(cntlr, "modelManager")
809
820
  ): # may be called early in initialization for PluginManager
810
- filepath = cntlr.modelManager.disclosureSystem.mappedUrl(filepath) # type: ignore[no-untyped-call]
821
+ filepath = cntlr.modelManager.disclosureSystem.mappedUrl(filepath)
811
822
  if archiveFilenameParts(filepath): # file is in an archive
812
823
  return openFileSource(filepath, cntlr).file(filepath, binary='b' in mode, encoding=encoding)[0]
813
824
  if isHttpUrl(filepath) and cntlr:
814
- _cacheFilepath = cntlr.webCache.getfilename(filepath, normalize=True) # normalize is separate step in ModelDocument retrieval, combined here
825
+ _cacheFilepath = cntlr.webCache.getfilename(
826
+ cntlr.modelManager.disclosureSystem.mappedUrl(filepath), normalize=True) # normalize is separate step in ModelDocument retrieval, combined here
815
827
  if _cacheFilepath is None:
816
828
  raise OSError(_("Unable to open file: {0}.").format(filepath))
817
829
  filepath = _cacheFilepath
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.4'
21
- __version_tuple__ = version_tuple = (2, 37, 4)
20
+ __version__ = version = '2.37.5'
21
+ __version_tuple__ = version_tuple = (2, 37, 5)
@@ -21,22 +21,25 @@ XBRLI_IDENTIFIER_SCHEMA = 'http://www.kvk.nl/kvk-id'
21
21
 
22
22
  @dataclass
23
23
  class PluginValidationDataExtension(PluginData):
24
- financialReportingPeriodCurrentStartDateQn: QName
25
- financialReportingPeriodCurrentEndDateQn: QName
26
- financialReportingPeriodPreviousStartDateQn: QName
27
- financialReportingPeriodPreviousEndDateQn: QName
28
- formattedExplanationItemTypeQn: QName
24
+ chamberOfCommerceRegistrationNumberQn: QName
29
25
  documentAdoptionDateQn: QName
30
26
  documentAdoptionStatusQn: QName
31
27
  documentResubmissionUnsurmountableInaccuraciesQn: QName
32
28
  entrypointRoot: str
33
29
  entrypoints: set[str]
30
+ financialReportingPeriodCurrentStartDateQn: QName
31
+ financialReportingPeriodCurrentEndDateQn: QName
32
+ financialReportingPeriodPreviousStartDateQn: QName
33
+ financialReportingPeriodPreviousEndDateQn: QName
34
+ formattedExplanationItemTypeQn: QName
34
35
  textFormattingSchemaPath: str
35
36
  textFormattingWrapper: str
36
37
 
37
38
  _contextsByDocument: dict[str, list[ModelContext]] | None = None
39
+ _contextsWithImproperContent: list[ModelContext | None] | None = None
38
40
  _contextsWithPeriodTime: list[ModelContext | None] | None = None
39
41
  _contextsWithPeriodTimeZone: list[ModelContext | None] | None = None
42
+ _contextsWithSegments: list[ModelContext | None] | None = None
40
43
  _entityIdentifiers: set[tuple[str, str]] | None = None
41
44
  _factsByDocument: dict[str, list[ModelFact]] | None = None
42
45
  _unitsByDocument: dict[str, list[ModelUnit]] | None = None
@@ -51,8 +54,10 @@ class PluginValidationDataExtension(PluginData):
51
54
  return self._contextsByDocument
52
55
 
53
56
  def checkContexts(self, allContexts: dict[str, list[ModelContext]]) -> None:
57
+ contextsWithImproperContent: list[ModelContext | None] = []
54
58
  contextsWithPeriodTime: list[ModelContext | None] = []
55
59
  contextsWithPeriodTimeZone: list[ModelContext | None] = []
60
+ contextsWithSegments: list[ModelContext | None] = []
56
61
  datetimePattern = lexicalPatterns["XBRLI_DATEUNION"]
57
62
  for contexts in allContexts.values():
58
63
  for context in contexts:
@@ -66,8 +71,14 @@ class PluginValidationDataExtension(PluginData):
66
71
  contextsWithPeriodTime.append(context)
67
72
  if m.group(3):
68
73
  contextsWithPeriodTimeZone.append(context)
74
+ if context.hasSegment:
75
+ contextsWithSegments.append(context)
76
+ if context.nonDimValues("scenario"): # type: ignore[no-untyped-call]
77
+ contextsWithImproperContent.append(context)
78
+ self._contextsWithImproperContent = contextsWithImproperContent
69
79
  self._contextsWithPeriodTime = contextsWithPeriodTime
70
80
  self._contextsWithPeriodTimeZone = contextsWithPeriodTimeZone
81
+ self._contextsWithSegments = contextsWithSegments
71
82
 
72
83
  def entityIdentifiersInDocument(self, modelXbrl: ModelXbrl) -> set[tuple[str, str]]:
73
84
  if self._entityIdentifiers is not None:
@@ -84,18 +95,30 @@ class PluginValidationDataExtension(PluginData):
84
95
  self._factsByDocument = dict(factsByDocument)
85
96
  return self._factsByDocument
86
97
 
87
- def getContextWithPeriodTime(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
98
+ def getContextsWithImproperContent(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
99
+ if self._contextsWithImproperContent is None:
100
+ self.checkContexts(self.contextsByDocument(modelXbrl))
101
+ assert(self._contextsWithImproperContent is not None)
102
+ return self._contextsWithImproperContent
103
+
104
+ def getContextsWithPeriodTime(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
88
105
  if self._contextsWithPeriodTime is None:
89
106
  self.checkContexts(self.contextsByDocument(modelXbrl))
90
107
  assert(self._contextsWithPeriodTime is not None)
91
108
  return self._contextsWithPeriodTime
92
109
 
93
- def getContextWithPeriodTimeZone(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
110
+ def getContextsWithPeriodTimeZone(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
94
111
  if self._contextsWithPeriodTimeZone is None:
95
112
  self.checkContexts(self.contextsByDocument(modelXbrl))
96
113
  assert (self._contextsWithPeriodTimeZone is not None)
97
114
  return self._contextsWithPeriodTimeZone
98
115
 
116
+ def getContextsWithSegments(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
117
+ if self._contextsWithSegments is None:
118
+ self.checkContexts(self.contextsByDocument(modelXbrl))
119
+ assert(self._contextsWithSegments is not None)
120
+ return self._contextsWithSegments
121
+
99
122
  def unitsByDocument(self, modelXbrl: ModelXbrl) -> dict[str, list[ModelUnit]]:
100
123
  if self._unitsByDocument is not None:
101
124
  return self._unitsByDocument
@@ -23,6 +23,7 @@ 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 = ''
26
27
  entrypointRoot = 'http://www.nltaxonomie.nl/nt16/kvk/20211208/entrypoints/'
27
28
  entrypoints = {entrypointRoot + e for e in [
28
29
  'kvk-rpt-jaarverantwoording-2021-ifrs-full.xsd',
@@ -59,6 +60,7 @@ class ValidationPluginExtension(ValidationPlugin):
59
60
  jenvNamespace = 'http://www.nltaxonomie.nl/nt17/jenv/20221214/dictionary/jenv-bw2-data'
60
61
  kvkINamespace = 'http://www.nltaxonomie.nl/nt17/kvk/20221214/dictionary/kvk-data'
61
62
  nlTypesNamespace = 'http://www.nltaxonomie.nl/nt17/sbr/20220301/dictionary/nl-types'
63
+ titel9Namespace = ''
62
64
  entrypointRoot = 'http://www.nltaxonomie.nl/nt17/kvk/20221214/entrypoints/'
63
65
  entrypoints = {entrypointRoot + e for e in [
64
66
  'kvk-rpt-jaarverantwoording-2022-ifrs-full.xsd',
@@ -96,6 +98,7 @@ class ValidationPluginExtension(ValidationPlugin):
96
98
  jenvNamespace = 'http://www.nltaxonomie.nl/nt18/jenv/20231213/dictionary/jenv-bw2-data'
97
99
  kvkINamespace = 'http://www.nltaxonomie.nl/nt18/kvk/20231213/dictionary/kvk-data'
98
100
  nlTypesNamespace = 'http://www.nltaxonomie.nl/nt18/sbr/20230301/dictionary/nl-types'
101
+ titel9Namespace = ''
99
102
  entrypointRoot = 'http://www.nltaxonomie.nl/nt18/kvk/20231213/entrypoints/'
100
103
  entrypoints = {entrypointRoot + e for e in [
101
104
  'kvk-rpt-jaarverantwoording-2023-ifrs-full.xsd',
@@ -133,6 +136,7 @@ class ValidationPluginExtension(ValidationPlugin):
133
136
  jenvNamespace = 'http://www.nltaxonomie.nl/nt19/jenv/20241211/dictionary/jenv-bw2-data'
134
137
  kvkINamespace = 'http://www.nltaxonomie.nl/nt19/kvk/20241211/dictionary/kvk-data'
135
138
  nlTypesNamespace = 'http://www.nltaxonomie.nl/nt19/sbr/20240301/dictionary/nl-types'
139
+ titel9Namespace = 'https://www.nltaxonomie.nl/jenv/2024-03-31/bw2-titel9-cor'
136
140
  entrypointRoot = 'http://www.nltaxonomie.nl/nt19/kvk/20241211/entrypoints/'
137
141
  entrypoints = {entrypointRoot + e for e in [
138
142
  'kvk-rpt-jaarverantwoording-2024-ifrs-full.xsd',
@@ -170,16 +174,17 @@ class ValidationPluginExtension(ValidationPlugin):
170
174
  raise ValueError(f'Invalid NL disclosure system: {disclosureSystem}')
171
175
  return PluginValidationDataExtension(
172
176
  self.name,
173
- financialReportingPeriodCurrentStartDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodCurrentStartDate'),
174
- financialReportingPeriodCurrentEndDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodCurrentEndDate'),
175
- financialReportingPeriodPreviousStartDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodPreviousStartDate'),
176
- financialReportingPeriodPreviousEndDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodPreviousEndDate'),
177
- formattedExplanationItemTypeQn=qname(f'{{{nlTypesNamespace}}}formattedExplanationItemType'),
177
+ chamberOfCommerceRegistrationNumberQn=qname(f'{{{titel9Namespace}}}ChamberOfCommerceRegistrationNumber'),
178
178
  documentAdoptionDateQn=qname(f'{{{jenvNamespace}}}DocumentAdoptionDate'),
179
179
  documentAdoptionStatusQn=qname(f'{{{jenvNamespace}}}DocumentAdoptionStatus'),
180
180
  documentResubmissionUnsurmountableInaccuraciesQn=qname(f'{{{kvkINamespace}}}DocumentResubmissionDueToUnsurmountableInaccuracies'),
181
181
  entrypointRoot=entrypointRoot,
182
182
  entrypoints=entrypoints,
183
+ financialReportingPeriodCurrentStartDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodCurrentStartDate'),
184
+ financialReportingPeriodCurrentEndDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodCurrentEndDate'),
185
+ financialReportingPeriodPreviousStartDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodPreviousStartDate'),
186
+ financialReportingPeriodPreviousEndDateQn=qname(f'{{{jenvNamespace}}}FinancialReportingPeriodPreviousEndDate'),
187
+ formattedExplanationItemTypeQn=qname(f'{{{nlTypesNamespace}}}formattedExplanationItemType'),
183
188
  textFormattingSchemaPath='sbr-text-formatting.xsd',
184
189
  textFormattingWrapper='<formattedText xmlns="http://www.nltaxonomie.nl/2017/xbrl/sbr-text-formatting">{}</formattedText>',
185
190
  )
@@ -4,6 +4,8 @@ See COPYRIGHT.md for copyright information.
4
4
  from __future__ import annotations
5
5
 
6
6
  from datetime import date, timedelta
7
+
8
+ from arelle.XmlValidateConst import VALID
7
9
  from dateutil import relativedelta
8
10
  from collections.abc import Iterable
9
11
  from typing import Any, cast, TYPE_CHECKING
@@ -109,7 +111,7 @@ def rule_nl_kvk_3_1_2_1(
109
111
  """
110
112
  NL-KVK.3.1.2.1: xbrli:startDate, xbrli:endDate, xbrli:instant formatted as yyyy-mm-dd without time.
111
113
  """
112
- contextsWithPeriodTime = pluginData.getContextWithPeriodTime(val.modelXbrl)
114
+ contextsWithPeriodTime = pluginData.getContextsWithPeriodTime(val.modelXbrl)
113
115
  if len(contextsWithPeriodTime) !=0:
114
116
  yield Validation.error(
115
117
  codes='NL.NL-KVK-3.1.2.1',
@@ -133,10 +135,112 @@ def rule_nl_kvk_3_1_2_2(
133
135
  """
134
136
  NL-KVK.3.1.2.1: xbrli:startDate, xbrli:endDate, xbrli:instant format to be formatted as yyyy-mm-dd without time zone.
135
137
  """
136
- contextsWithPeriodTimeZone = pluginData.getContextWithPeriodTimeZone(val.modelXbrl)
137
- if len(pluginData.getContextWithPeriodTimeZone(val.modelXbrl)) !=0:
138
+ contextsWithPeriodTimeZone = pluginData.getContextsWithPeriodTimeZone(val.modelXbrl)
139
+ if len(contextsWithPeriodTimeZone) !=0:
138
140
  yield Validation.error(
139
141
  codes='NL.NL-KVK-3.1.2.2',
140
142
  msg=_('xbrli:startDate, xbrli:endDate, xbrli:instant must be formatted as yyyy-mm-dd without time zone'),
141
143
  modelObject = contextsWithPeriodTimeZone
142
144
  )
145
+
146
+
147
+ @validation(
148
+ hook=ValidationHook.XBRL_FINALLY,
149
+ disclosureSystems=[
150
+ DISCLOSURE_SYSTEM_INLINE_NT19
151
+ ],
152
+ )
153
+ def rule_nl_kvk_3_1_3_1 (
154
+ pluginData: PluginValidationDataExtension,
155
+ val: ValidateXbrl,
156
+ *args: Any,
157
+ **kwargs: Any,
158
+ ) -> Iterable[Validation]:
159
+ """
160
+ NL-KVK.3.1.3.1: xbrli:segment must not be used in contexts.
161
+ """
162
+ contextsWithSegments = pluginData.getContextsWithSegments(val.modelXbrl)
163
+ if len(contextsWithSegments) !=0:
164
+ yield Validation.error(
165
+ codes='NL.NL-KVK-3.1.3.1',
166
+ msg=_('xbrli:segment must not be used in contexts.'),
167
+ modelObject = contextsWithSegments
168
+ )
169
+
170
+
171
+ @validation(
172
+ hook=ValidationHook.XBRL_FINALLY,
173
+ disclosureSystems=[
174
+ DISCLOSURE_SYSTEM_INLINE_NT19
175
+ ],
176
+ )
177
+ def rule_nl_kvk_3_1_3_2 (
178
+ pluginData: PluginValidationDataExtension,
179
+ val: ValidateXbrl,
180
+ *args: Any,
181
+ **kwargs: Any,
182
+ ) -> Iterable[Validation]:
183
+ """
184
+ NL-KVK.3.1.3.2: xbrli:scenario must only contain content defined in XBRL Dimensions specification.
185
+ """
186
+ contextsWithImproperContent = pluginData.getContextsWithImproperContent(val.modelXbrl)
187
+ if len(contextsWithImproperContent) !=0:
188
+ yield Validation.error(
189
+ codes='NL.NL-KVK-3.1.3.2',
190
+ msg=_('xbrli:scenario must only contain content defined in XBRL Dimensions specification.'),
191
+ modelObject = contextsWithImproperContent
192
+ )
193
+
194
+
195
+ @validation(
196
+ hook=ValidationHook.XBRL_FINALLY,
197
+ disclosureSystems=[
198
+ DISCLOSURE_SYSTEM_INLINE_NT19
199
+ ],
200
+ )
201
+ def rule_nl_kvk_3_1_4_1 (
202
+ pluginData: PluginValidationDataExtension,
203
+ val: ValidateXbrl,
204
+ *args: Any,
205
+ **kwargs: Any,
206
+ ) -> Iterable[Validation]:
207
+ """
208
+ NL-KVK.3.1.4.1: All entity identifiers and schemes must have identical content.
209
+ """
210
+ entityIdentifierValues = pluginData.entityIdentifiersInDocument(val.modelXbrl)
211
+ if len(entityIdentifierValues) >1:
212
+ yield Validation.error(
213
+ codes='NL.NL-KVK-3.1.4.1',
214
+ msg=_('All entity identifiers and schemes must have identical content.'),
215
+ modelObject = entityIdentifierValues
216
+ )
217
+
218
+
219
+
220
+ @validation(
221
+ hook=ValidationHook.XBRL_FINALLY,
222
+ disclosureSystems=[
223
+ DISCLOSURE_SYSTEM_INLINE_NT19
224
+ ],
225
+ )
226
+ def rule_nl_kvk_3_1_4_2 (
227
+ pluginData: PluginValidationDataExtension,
228
+ val: ValidateXbrl,
229
+ *args: Any,
230
+ **kwargs: Any,
231
+ ) -> Iterable[Validation]:
232
+ """
233
+ NL-KVK.3.1.4.2: xbrli:identifier value must be identical to bw2-titel9:ChamberOfCommerceRegistrationNumber fact value.
234
+ """
235
+ registrationNumberFacts = val.modelXbrl.factsByQname.get(pluginData.chamberOfCommerceRegistrationNumberQn, set())
236
+ if len(registrationNumberFacts) > 0:
237
+ regFact = next(iter(registrationNumberFacts))
238
+ if regFact.xValid >= VALID and regFact.xValue != regFact.context.entityIdentifier[1]:
239
+ yield Validation.error(
240
+ codes='NL-KVK.3.1.4.2',
241
+ msg=_("xbrli:identifier value must be identical to bw2-titel9:ChamberOfCommerceRegistrationNumber fact value.").format(
242
+ regFact.xValue,
243
+ regFact.context.entityIdentifier[1]
244
+ ),
245
+ modelObject=regFact
246
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.4
3
+ Version: 2.37.5
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License: Apache-2.0
@@ -20,8 +20,8 @@ arelle/DialogPluginManager.py,sha256=cr7GWNuYttg7H0pM5vaCPuxgDVgtZzR6ZamX957_1w8
20
20
  arelle/DialogRssWatch.py,sha256=mjc4pqyFDISY4tQtME0uSRQ3NlcWnNsOsMu9Zj8tTd0,13789
21
21
  arelle/DialogURL.py,sha256=JH88OPFf588E8RW90uMaieok7A_4kOAURQ8kHWVhnao,4354
22
22
  arelle/DialogUserPassword.py,sha256=kWPlCCihhwvsykDjanME9qBDtv6cxZlsrJyoMqiRep4,13769
23
- arelle/DisclosureSystem.py,sha256=hz3fWQ1Rh9iwOPevhTQwXUD_uUa5Q6w8sCg5XHYYJFs,24445
24
- arelle/FileSource.py,sha256=taHsKayOlZPOYXDsFPbTz7qTaPBgYNaXkczRh2is8r0,46012
23
+ arelle/DisclosureSystem.py,sha256=g3XXMjuyKJk2eoqvHGqoyIs2bMfcODwOeISDRCcY9gc,24749
24
+ arelle/FileSource.py,sha256=FXqXCd7FZ7p7DH4yAYDHYYZ_43P8H3nreT8LJpoWu1M,46643
25
25
  arelle/FunctionCustom.py,sha256=d1FsBG14eykvpLpgaXpN8IdxnlG54dfGcsXPYfdpA9Q,5880
26
26
  arelle/FunctionFn.py,sha256=BcZKah1rpfquSVPwjvknM1pgFXOnK4Hr1e_ArG_mcJY,38058
27
27
  arelle/FunctionIxt.py,sha256=8JELGh1l4o8Ul4_G7JgwX8Ebch9it2DblI6OkfL33Cw,80082
@@ -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=5SpVYrjJ8HXJESb6Hj4zVwSMneHW2U31a6HFjEleIz4,513
126
+ arelle/_version.py,sha256=rerVv2bkyHju_24j_qkXddEpdbpWMlSRnKzm4NdB1lc,513
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
@@ -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=VFMcO8GJ8kIqhOV5McyEejaGJOR5JrmeF8GdFuS9IZw,174
381
- arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=kqXQIj3HKadldzDSvTkAF70hAWaLfqZSkmCx0Zkr1Ss,4930
382
- arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=VuvveUzLJ-1oTB394MSD2c2JeoLyys8y2Z13COHEnPs,14909
381
+ arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=WuCXeiCYlDWDrQ--lRkTVTTuD_KTemgYsiWMxs6psxM,6259
382
+ arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=pRnKCXnHzwW3lDDZ_yk5d3Mia4d8a_qhqIvZK6kItTc,15216
383
383
  arelle/plugin/validate/NL/__init__.py,sha256=9NkkfosHnAzJhBa84KDAsoyU7vd4_DO3GYKTSvKuOk8,2554
384
384
  arelle/plugin/validate/NL/resources/config.xml,sha256=vu5pA-Iw6cgb5aep8LNLNPCkmG1QF6RTw3TCgEIest8,1102
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=WVPUTAnfkCyAsDGW7p5QTXjAuafyy0PDkK2hCy3ILrg,4811
390
+ arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=_eUzTAFaT_hH3EXW7MPJjM7dmBa-P14TqPMFDw4xVPc,8163
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
@@ -707,7 +707,7 @@ arelle/utils/validate/ValidationPlugin.py,sha256=_WeRPXZUTCcSN3FLbFwiAe_2pAUTxZZ
707
707
  arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
708
708
  arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
709
709
  arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
710
- arelle_release-2.37.4.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
710
+ arelle_release-2.37.5.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
711
711
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
712
712
  tests/integration_tests/download_cache.py,sha256=jVMIVICsZjcVc9DCPPu3fCjF9_cWSS3tqSynhFs3oAM,4097
713
713
  tests/integration_tests/integration_test_util.py,sha256=H7mncbv0T9ZeVyrtk9Hohe3k6jgcYykHkt-LGE-Q9aQ,10270
@@ -1154,7 +1154,7 @@ tests/resources/conformance_suites/nl_nt16/fr_nl/1-02-invalid.xbrl,sha256=Flu8pS
1154
1154
  tests/resources/conformance_suites/nl_nt16/fr_nl/1-02-testcase.xml,sha256=TINl7JVLw6r6SkjgBagEH1MCFNaIBrnpl--IAoB4OMw,924
1155
1155
  tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-invalid-doctype.xbrl,sha256=3Z3i7fLOjOFYj7tuX1w8lueek6bpQhj101Ephb6IVgE,129
1156
1156
  tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-testcase.xml,sha256=kmlnCY0ZtdEVrpKyU3oSC_6RM1kKlOoG81sxtwPECwY,926
1157
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-04-invalid.xbrl,sha256=nGr5voxDxGbS-VBXnMc_yByJEQSQXhESamogtuGu3p8,1188
1157
+ tests/resources/conformance_suites/nl_nt16/fr_nl/1-04-invalid.xbrl,sha256=9tRI4DoSXd7LHMLWLFnerIyOpxONPSsd-_0FsVozRlQ,1297
1158
1158
  tests/resources/conformance_suites/nl_nt16/fr_nl/1-04-testcase.xml,sha256=Nkgds7HDnz7y1b6padzxfbMAMMKp2rNQhrfvlH_IaEs,889
1159
1159
  tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-invalid-encoding.xbrl,sha256=dmjvwRnAM3ZiMlF0sDWAxa_Qb19sNtQ369kYEpDG7wU,194
1160
1160
  tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-testcase.xml,sha256=dJi2elHTSN2wL3oTnFR3MbhWEmkl00EichkpP4wQLdg,936
@@ -1252,7 +1252,7 @@ tests/resources/conformance_suites/nl_nt17/fr_nl/1-02-invalid.xbrl,sha256=Flu8pS
1252
1252
  tests/resources/conformance_suites/nl_nt17/fr_nl/1-02-testcase.xml,sha256=TINl7JVLw6r6SkjgBagEH1MCFNaIBrnpl--IAoB4OMw,924
1253
1253
  tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-invalid-doctype.xbrl,sha256=3Z3i7fLOjOFYj7tuX1w8lueek6bpQhj101Ephb6IVgE,129
1254
1254
  tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-testcase.xml,sha256=kmlnCY0ZtdEVrpKyU3oSC_6RM1kKlOoG81sxtwPECwY,926
1255
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-04-invalid.xbrl,sha256=nGr5voxDxGbS-VBXnMc_yByJEQSQXhESamogtuGu3p8,1188
1255
+ tests/resources/conformance_suites/nl_nt17/fr_nl/1-04-invalid.xbrl,sha256=9tRI4DoSXd7LHMLWLFnerIyOpxONPSsd-_0FsVozRlQ,1297
1256
1256
  tests/resources/conformance_suites/nl_nt17/fr_nl/1-04-testcase.xml,sha256=Nkgds7HDnz7y1b6padzxfbMAMMKp2rNQhrfvlH_IaEs,889
1257
1257
  tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-invalid-encoding.xbrl,sha256=dmjvwRnAM3ZiMlF0sDWAxa_Qb19sNtQ369kYEpDG7wU,194
1258
1258
  tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-testcase.xml,sha256=dJi2elHTSN2wL3oTnFR3MbhWEmkl00EichkpP4wQLdg,936
@@ -1350,7 +1350,7 @@ tests/resources/conformance_suites/nl_nt18/fr_nl/1-02-invalid.xbrl,sha256=Flu8pS
1350
1350
  tests/resources/conformance_suites/nl_nt18/fr_nl/1-02-testcase.xml,sha256=TINl7JVLw6r6SkjgBagEH1MCFNaIBrnpl--IAoB4OMw,924
1351
1351
  tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-invalid-doctype.xbrl,sha256=3Z3i7fLOjOFYj7tuX1w8lueek6bpQhj101Ephb6IVgE,129
1352
1352
  tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-testcase.xml,sha256=kmlnCY0ZtdEVrpKyU3oSC_6RM1kKlOoG81sxtwPECwY,926
1353
- tests/resources/conformance_suites/nl_nt18/fr_nl/1-04-invalid.xbrl,sha256=nGr5voxDxGbS-VBXnMc_yByJEQSQXhESamogtuGu3p8,1188
1353
+ tests/resources/conformance_suites/nl_nt18/fr_nl/1-04-invalid.xbrl,sha256=9tRI4DoSXd7LHMLWLFnerIyOpxONPSsd-_0FsVozRlQ,1297
1354
1354
  tests/resources/conformance_suites/nl_nt18/fr_nl/1-04-testcase.xml,sha256=Nkgds7HDnz7y1b6padzxfbMAMMKp2rNQhrfvlH_IaEs,889
1355
1355
  tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-invalid-encoding.xbrl,sha256=dmjvwRnAM3ZiMlF0sDWAxa_Qb19sNtQ369kYEpDG7wU,194
1356
1356
  tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-testcase.xml,sha256=dJi2elHTSN2wL3oTnFR3MbhWEmkl00EichkpP4wQLdg,936
@@ -1448,7 +1448,7 @@ tests/resources/conformance_suites/nl_nt19/fr_nl/1-02-invalid.xbrl,sha256=Flu8pS
1448
1448
  tests/resources/conformance_suites/nl_nt19/fr_nl/1-02-testcase.xml,sha256=TINl7JVLw6r6SkjgBagEH1MCFNaIBrnpl--IAoB4OMw,924
1449
1449
  tests/resources/conformance_suites/nl_nt19/fr_nl/1-03-invalid-doctype.xbrl,sha256=3Z3i7fLOjOFYj7tuX1w8lueek6bpQhj101Ephb6IVgE,129
1450
1450
  tests/resources/conformance_suites/nl_nt19/fr_nl/1-03-testcase.xml,sha256=kmlnCY0ZtdEVrpKyU3oSC_6RM1kKlOoG81sxtwPECwY,926
1451
- tests/resources/conformance_suites/nl_nt19/fr_nl/1-04-invalid.xbrl,sha256=nGr5voxDxGbS-VBXnMc_yByJEQSQXhESamogtuGu3p8,1188
1451
+ tests/resources/conformance_suites/nl_nt19/fr_nl/1-04-invalid.xbrl,sha256=9tRI4DoSXd7LHMLWLFnerIyOpxONPSsd-_0FsVozRlQ,1297
1452
1452
  tests/resources/conformance_suites/nl_nt19/fr_nl/1-04-testcase.xml,sha256=Nkgds7HDnz7y1b6padzxfbMAMMKp2rNQhrfvlH_IaEs,889
1453
1453
  tests/resources/conformance_suites/nl_nt19/fr_nl/1-05-invalid-encoding.xbrl,sha256=dmjvwRnAM3ZiMlF0sDWAxa_Qb19sNtQ369kYEpDG7wU,194
1454
1454
  tests/resources/conformance_suites/nl_nt19/fr_nl/1-05-testcase.xml,sha256=dJi2elHTSN2wL3oTnFR3MbhWEmkl00EichkpP4wQLdg,936
@@ -1555,8 +1555,8 @@ tests/unit_tests/arelle/oim/test_load.py,sha256=NxiUauQwJVfWAHbbpsMHGSU2d3Br8Pki
1555
1555
  tests/unit_tests/arelle/plugin/test_plugin_imports.py,sha256=bdhIs9frAnFsdGU113yBk09_jis-z43dwUItMFYuSYM,1064
1556
1556
  tests/unit_tests/arelle/plugin/validate/ESEF/ESEF_Current/test_validate_css_url.py,sha256=XHABmejQt7RlZ0udh7v42f2Xb2STGk_fSaIaJ9i2xo0,878
1557
1557
  tests/unit_tests/arelle/utils/validate/test_decorator.py,sha256=ZS8FqIY1g-2FCbjF4UYm609dwViax6qBMRJSi0vfuhY,2482
1558
- arelle_release-2.37.4.dist-info/METADATA,sha256=RBTxyp_I3ftToxojuqIQI1eN2Agy53wcni_WikFT8ac,9064
1559
- arelle_release-2.37.4.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
1560
- arelle_release-2.37.4.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1561
- arelle_release-2.37.4.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1562
- arelle_release-2.37.4.dist-info/RECORD,,
1558
+ arelle_release-2.37.5.dist-info/METADATA,sha256=4Kw7oBfKyh0aON2AEk16a98SktKugAPZNfo3jey0Oww,9064
1559
+ arelle_release-2.37.5.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
1560
+ arelle_release-2.37.5.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1561
+ arelle_release-2.37.5.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1562
+ arelle_release-2.37.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: setuptools (80.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,3 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE xbrl [
3
+ <!ENTITY reg "&#174;">
4
+ <!ENTITY plus "&#43;">
5
+ ]>
1
6
  <xbrl xmlns="http://www.xbrl.org/2003/instance" title="Test&reg;"> <!-- CAUSE: disallowed named reference, in attribute -->
2
7
  <!-- &#1080; &#1081; --> <!-- CAUSE: disallowed decimal numeric references, in comment -->
3
8
  <!-- &#x0000; &#x20D0; --> <!-- CAUSE: disallowed hexadecimal numeric references, in comment -->
@@ -1,3 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE xbrl [
3
+ <!ENTITY reg "&#174;">
4
+ <!ENTITY plus "&#43;">
5
+ ]>
1
6
  <xbrl xmlns="http://www.xbrl.org/2003/instance" title="Test&reg;"> <!-- CAUSE: disallowed named reference, in attribute -->
2
7
  <!-- &#1080; &#1081; --> <!-- CAUSE: disallowed decimal numeric references, in comment -->
3
8
  <!-- &#x0000; &#x20D0; --> <!-- CAUSE: disallowed hexadecimal numeric references, in comment -->
@@ -1,3 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE xbrl [
3
+ <!ENTITY reg "&#174;">
4
+ <!ENTITY plus "&#43;">
5
+ ]>
1
6
  <xbrl xmlns="http://www.xbrl.org/2003/instance" title="Test&reg;"> <!-- CAUSE: disallowed named reference, in attribute -->
2
7
  <!-- &#1080; &#1081; --> <!-- CAUSE: disallowed decimal numeric references, in comment -->
3
8
  <!-- &#x0000; &#x20D0; --> <!-- CAUSE: disallowed hexadecimal numeric references, in comment -->
@@ -1,3 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE xbrl [
3
+ <!ENTITY reg "&#174;">
4
+ <!ENTITY plus "&#43;">
5
+ ]>
1
6
  <xbrl xmlns="http://www.xbrl.org/2003/instance" title="Test&reg;"> <!-- CAUSE: disallowed named reference, in attribute -->
2
7
  <!-- &#1080; &#1081; --> <!-- CAUSE: disallowed decimal numeric references, in comment -->
3
8
  <!-- &#x0000; &#x20D0; --> <!-- CAUSE: disallowed hexadecimal numeric references, in comment -->