arelle-release 2.37.3__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.

arelle/CntlrCmdLine.py CHANGED
@@ -405,7 +405,7 @@ def parseArgs(args):
405
405
  if hasWebServer():
406
406
  parser.add_option("--webserver", action="store", dest="webserver",
407
407
  help=_("start web server on host:port[:server] for REST and web access, e.g., --webserver locahost:8080, "
408
- "or specify nondefault a server name, such as cherrypy, --webserver locahost:8080:cherrypy. "
408
+ "or specify nondefault a server name, such as cheroot, --webserver locahost:8080:cheroot. "
409
409
  "(It is possible to specify options to be defaults for the web server, such as disclosureSystem and validations, but not including file names.) "))
410
410
  pluginOptionsIndex = len(parser.option_list)
411
411
  pluginOptionsGroupIndex = len(parser.option_groups)
arelle/CntlrWinMain.py CHANGED
@@ -1487,7 +1487,6 @@ class CntlrWinMain (Cntlr.Cntlr):
1487
1487
  "\n PyParsing \u00a9 2003-2013 Paul T. McGuire"
1488
1488
  "\n lxml {lxmlVersion} \u00a9 2004 Infrae, ElementTree \u00a9 1999-2004 by Fredrik Lundh"
1489
1489
  "\n Bottle \u00a9 2009-2024 Marcel Hellkamp"
1490
- "\n CherryPy \u00a9 2004-2019 CherryPy Team"
1491
1490
  "\n May include installable plug-in modules with author-specific license terms").format(
1492
1491
  version=Version.__version__,
1493
1492
  wordSize=self.systemWordSize,
@@ -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.3'
21
- __version_tuple__ = version_tuple = (2, 37, 3)
20
+ __version__ = version = '2.37.5'
21
+ __version_tuple__ = version_tuple = (2, 37, 5)
@@ -520,13 +520,13 @@ msgstr "تجميع إحصاءات تعريفية، مثل توقيتات اعم
520
520
  msgid ""
521
521
  "start web server on host:port[:server] for REST and web access, e.g., --"
522
522
  "webserver locahost:8080, or specify nondefault a server name, such as "
523
- "cherrypy, --webserver locahost:8080:cherrypy. (It is possible to specify "
523
+ "cheroot, --webserver locahost:8080:cheroot. (It is possible to specify "
524
524
  "options to be defaults for the web server, such as disclosureSystem and "
525
525
  "validations, but not including file names.) "
526
526
  msgstr ""
527
527
  "تشغيل الويب سيرفير على عنوان host:port[:server] لعمليات REST، مثال webserver "
528
- "locahost:8080--، او تحديد نوع سيرفير اخر مثل cherrypy على سبيل المثال "
529
- "webserver locahost:8080:cherrypy--. (يمكن تحديد خيارات مفترضة للويب سيرفير "
528
+ "locahost:8080--، او تحديد نوع سيرفير اخر مثل cheroot على سبيل المثال "
529
+ "webserver locahost:8080:cheroot--. (يمكن تحديد خيارات مفترضة للويب سيرفير "
530
530
  "مثل disclosureSystem و validations ولا يتضمن ذلك اسم الملف.) "
531
531
 
532
532
  #: CntlrCmdLine.py:379
@@ -2599,7 +2599,6 @@ msgstr ""
2599
2599
  msgid ""
2600
2600
  "\n"
2601
2601
  " Bottle \\u00a9 2011-2013 Marcel Hellkamp\n"
2602
- " CherryPy \\u00a9 2002-2013 CherryPy Team"
2603
2602
  msgstr ""
2604
2603
 
2605
2604
  #: CntlrWinMain.py:1343
@@ -297,7 +297,7 @@ msgid "Collect profile statistics, such as timing of validation activities and f
297
297
  msgstr ""
298
298
 
299
299
  #: arelle\CntlrCmdLine.py:328
300
- msgid "start web server on host:port[:server] for REST and web access, e.g., --webserver locahost:8080, or specify nondefault a server name, such as cherrypy, --webserver locahost:8080:cherrypy. (It is possible to specify options to be defaults for the web server, such as disclosureSystem and validations, but not including file names.) "
300
+ msgid "start web server on host:port[:server] for REST and web access, e.g., --webserver locahost:8080, or specify nondefault a server name, such as cheroot, --webserver locahost:8080:cheroot. (It is possible to specify options to be defaults for the web server, such as disclosureSystem and validations, but not including file names.) "
301
301
  msgstr ""
302
302
 
303
303
  #: arelle\CntlrCmdLine.py:356
@@ -1572,7 +1572,6 @@ msgstr ""
1572
1572
  msgid ""
1573
1573
  "\n"
1574
1574
  " Bottle © 2011-2013 Marcel Hellkamp\n"
1575
- " CherryPy © 2002-2013 CherryPy Team"
1576
1575
  msgstr ""
1577
1576
 
1578
1577
  #: arelle\CntlrWinMain.py:1327
@@ -261,8 +261,8 @@ msgid "Collect profile statistics, such as timing of validation activities and f
261
261
  msgstr "Собирать статистику профиля, например, время исполнения валидации."
262
262
 
263
263
  #: arelle\CntlrCmdLine.py:308
264
- msgid "start web server on host:port[:server] for REST and web access, e.g., --webserver locahost:8080, or specify nondefault a server name, such as cherrypy, --webserver locahost:8080:cherrypy. (It is possible to specify options to be defaults for the web server, such as disclosureSystem and validations, but not including file names.) "
265
- msgstr "запустите веб-сервер на host:port[:server] для REST и веб-доступа, например, --webserver locahost:8080, или укажите имя сервера не по умолчанию, например cherrypy, --webserver locahost:8080:cherrypy. (Можно указать параметры по умолчанию для веб-сервера, такие как системы раскрытия информации и валиидаций, но не включая имена файлов.) "
264
+ msgid "start web server on host:port[:server] for REST and web access, e.g., --webserver locahost:8080, or specify nondefault a server name, such as cheroot, --webserver locahost:8080:cheroot. (It is possible to specify options to be defaults for the web server, such as disclosureSystem and validations, but not including file names.) "
265
+ msgstr "запустите веб-сервер на host:port[:server] для REST и веб-доступа, например, --webserver locahost:8080, или укажите имя сервера не по умолчанию, например cheroot, --webserver locahost:8080:cheroot. (Можно указать параметры по умолчанию для веб-сервера, такие как системы раскрытия информации и валиидаций, но не включая имена файлов.) "
266
266
 
267
267
  #: arelle\CntlrCmdLine.py:336
268
268
  msgid "Show product version, copyright, and license."
@@ -20,7 +20,6 @@ mustNotBeHiddenElements = [
20
20
  "cipc-ca:DisclosureOfDirectorsResponsibilityExplanatory",
21
21
  "cipc-ca:FullRegisteredNameOfCompany",
22
22
  "cipc-ca:RegistrationNumberOfCompany",
23
- "cipc-ca-enum:DescriptionOfNatureOfFinancialStatements",
24
23
  "ifrs-full:DateOfEndOfReportingPeriod2013",
25
24
  "ifrs-full:DescriptionOfNatureOfFinancialStatements",
26
25
  "ifrs-full:DescriptionOfPresentationCurrency",
@@ -3,6 +3,8 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from __future__ import annotations
5
5
 
6
+ from typing import cast, Any
7
+
6
8
  import regex as re
7
9
  from collections import defaultdict
8
10
  from dataclasses import dataclass
@@ -11,6 +13,7 @@ from arelle.ModelInstanceObject import ModelUnit, ModelContext, ModelFact
11
13
  from arelle.ModelValue import QName
12
14
  from arelle.ModelXbrl import ModelXbrl
13
15
  from arelle.utils.PluginData import PluginData
16
+ from arelle.XmlValidate import lexicalPatterns
14
17
 
15
18
 
16
19
  XBRLI_IDENTIFIER_PATTERN = re.compile(r"^(?!00)\d{8}$")
@@ -18,20 +21,25 @@ XBRLI_IDENTIFIER_SCHEMA = 'http://www.kvk.nl/kvk-id'
18
21
 
19
22
  @dataclass
20
23
  class PluginValidationDataExtension(PluginData):
21
- financialReportingPeriodCurrentStartDateQn: QName
22
- financialReportingPeriodCurrentEndDateQn: QName
23
- financialReportingPeriodPreviousStartDateQn: QName
24
- financialReportingPeriodPreviousEndDateQn: QName
25
- formattedExplanationItemTypeQn: QName
24
+ chamberOfCommerceRegistrationNumberQn: QName
26
25
  documentAdoptionDateQn: QName
27
26
  documentAdoptionStatusQn: QName
28
27
  documentResubmissionUnsurmountableInaccuraciesQn: QName
29
28
  entrypointRoot: str
30
29
  entrypoints: set[str]
30
+ financialReportingPeriodCurrentStartDateQn: QName
31
+ financialReportingPeriodCurrentEndDateQn: QName
32
+ financialReportingPeriodPreviousStartDateQn: QName
33
+ financialReportingPeriodPreviousEndDateQn: QName
34
+ formattedExplanationItemTypeQn: QName
31
35
  textFormattingSchemaPath: str
32
36
  textFormattingWrapper: str
33
37
 
34
38
  _contextsByDocument: dict[str, list[ModelContext]] | None = None
39
+ _contextsWithImproperContent: list[ModelContext | None] | None = None
40
+ _contextsWithPeriodTime: list[ModelContext | None] | None = None
41
+ _contextsWithPeriodTimeZone: list[ModelContext | None] | None = None
42
+ _contextsWithSegments: list[ModelContext | None] | None = None
35
43
  _entityIdentifiers: set[tuple[str, str]] | None = None
36
44
  _factsByDocument: dict[str, list[ModelFact]] | None = None
37
45
  _unitsByDocument: dict[str, list[ModelUnit]] | None = None
@@ -45,6 +53,33 @@ class PluginValidationDataExtension(PluginData):
45
53
  self._contextsByDocument = dict(contextsByDocument)
46
54
  return self._contextsByDocument
47
55
 
56
+ def checkContexts(self, allContexts: dict[str, list[ModelContext]]) -> None:
57
+ contextsWithImproperContent: list[ModelContext | None] = []
58
+ contextsWithPeriodTime: list[ModelContext | None] = []
59
+ contextsWithPeriodTimeZone: list[ModelContext | None] = []
60
+ contextsWithSegments: list[ModelContext | None] = []
61
+ datetimePattern = lexicalPatterns["XBRLI_DATEUNION"]
62
+ for contexts in allContexts.values():
63
+ for context in contexts:
64
+ for uncastElt in context.iterdescendants("{http://www.xbrl.org/2003/instance}startDate",
65
+ "{http://www.xbrl.org/2003/instance}endDate",
66
+ "{http://www.xbrl.org/2003/instance}instant"):
67
+ elt = cast(Any, uncastElt)
68
+ m = datetimePattern.match(elt.stringValue)
69
+ if m:
70
+ if m.group(1):
71
+ contextsWithPeriodTime.append(context)
72
+ if m.group(3):
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
79
+ self._contextsWithPeriodTime = contextsWithPeriodTime
80
+ self._contextsWithPeriodTimeZone = contextsWithPeriodTimeZone
81
+ self._contextsWithSegments = contextsWithSegments
82
+
48
83
  def entityIdentifiersInDocument(self, modelXbrl: ModelXbrl) -> set[tuple[str, str]]:
49
84
  if self._entityIdentifiers is not None:
50
85
  return self._entityIdentifiers
@@ -60,6 +95,30 @@ class PluginValidationDataExtension(PluginData):
60
95
  self._factsByDocument = dict(factsByDocument)
61
96
  return self._factsByDocument
62
97
 
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]:
105
+ if self._contextsWithPeriodTime is None:
106
+ self.checkContexts(self.contextsByDocument(modelXbrl))
107
+ assert(self._contextsWithPeriodTime is not None)
108
+ return self._contextsWithPeriodTime
109
+
110
+ def getContextsWithPeriodTimeZone(self, modelXbrl: ModelXbrl) -> list[ModelContext | None]:
111
+ if self._contextsWithPeriodTimeZone is None:
112
+ self.checkContexts(self.contextsByDocument(modelXbrl))
113
+ assert (self._contextsWithPeriodTimeZone is not None)
114
+ return self._contextsWithPeriodTimeZone
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
+
63
122
  def unitsByDocument(self, modelXbrl: ModelXbrl) -> dict[str, list[ModelUnit]]:
64
123
  if self._unitsByDocument is not None:
65
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
@@ -92,3 +94,153 @@ def rule_nl_kvk_3_1_1_2(
92
94
  modelObject = val.modelXbrl
93
95
  )
94
96
  return
97
+
98
+
99
+ @validation(
100
+ hook=ValidationHook.XBRL_FINALLY,
101
+ disclosureSystems=[
102
+ DISCLOSURE_SYSTEM_INLINE_NT19
103
+ ],
104
+ )
105
+ def rule_nl_kvk_3_1_2_1(
106
+ pluginData: PluginValidationDataExtension,
107
+ val: ValidateXbrl,
108
+ *args: Any,
109
+ **kwargs: Any,
110
+ ) -> Iterable[Validation]:
111
+ """
112
+ NL-KVK.3.1.2.1: xbrli:startDate, xbrli:endDate, xbrli:instant formatted as yyyy-mm-dd without time.
113
+ """
114
+ contextsWithPeriodTime = pluginData.getContextsWithPeriodTime(val.modelXbrl)
115
+ if len(contextsWithPeriodTime) !=0:
116
+ yield Validation.error(
117
+ codes='NL.NL-KVK-3.1.2.1',
118
+ msg=_('xbrli:startDate, xbrli:endDate, xbrli:instant must be formatted as yyyy-mm-dd without time'),
119
+ modelObject = contextsWithPeriodTime
120
+ )
121
+
122
+
123
+ @validation(
124
+ hook=ValidationHook.XBRL_FINALLY,
125
+ disclosureSystems=[
126
+ DISCLOSURE_SYSTEM_INLINE_NT19
127
+ ],
128
+ )
129
+ def rule_nl_kvk_3_1_2_2(
130
+ pluginData: PluginValidationDataExtension,
131
+ val: ValidateXbrl,
132
+ *args: Any,
133
+ **kwargs: Any,
134
+ ) -> Iterable[Validation]:
135
+ """
136
+ NL-KVK.3.1.2.1: xbrli:startDate, xbrli:endDate, xbrli:instant format to be formatted as yyyy-mm-dd without time zone.
137
+ """
138
+ contextsWithPeriodTimeZone = pluginData.getContextsWithPeriodTimeZone(val.modelXbrl)
139
+ if len(contextsWithPeriodTimeZone) !=0:
140
+ yield Validation.error(
141
+ codes='NL.NL-KVK-3.1.2.2',
142
+ msg=_('xbrli:startDate, xbrli:endDate, xbrli:instant must be formatted as yyyy-mm-dd without time zone'),
143
+ modelObject = contextsWithPeriodTimeZone
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.3
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
@@ -56,7 +56,6 @@ Provides-Extra: objectmaker
56
56
  Requires-Dist: graphviz==0.*; extra == "objectmaker"
57
57
  Provides-Extra: webserver
58
58
  Requires-Dist: cheroot<11,>=8; extra == "webserver"
59
- Requires-Dist: CherryPy==18.*; extra == "webserver"
60
59
  Requires-Dist: tornado==6.*; extra == "webserver"
61
60
  Dynamic: license-file
62
61
 
@@ -1,12 +1,12 @@
1
1
  arelle/Aspect.py,sha256=Pn9I91D1os1RTVj6htuxTfRzVMhmVDtrbKvV_zy9xMI,5470
2
2
  arelle/BetaFeatures.py,sha256=T_tPac-FiozHyYLCemt0RoHJ1JahUE71L-0tHmIRKpE,858
3
3
  arelle/Cntlr.py,sha256=sf5Xe19t5E0wKzhdlXl1p5r6gMtCmPhYAi8RVY0jz7Y,30449
4
- arelle/CntlrCmdLine.py,sha256=8KgbLDT9WBV4fWzUEg5S9MVKPxljfPtOl4gwWjZxXd4,94192
4
+ arelle/CntlrCmdLine.py,sha256=50acj2edwwIxVjMnQ3MdxuCq1B89g6peCogPi1Ox_OI,94190
5
5
  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=4Q5WhwDpp6s_5mIxRYPPPc7Q5j_FIcQnODNOyCca7bk,96688
9
+ arelle/CntlrWinMain.py,sha256=qG1nSN9cMafrZNZgIlA6W_iMsmTwIcpUqb_S1J6YR9k,96611
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
@@ -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=T8z9f1Pg6RHF4_5AUnOcOyNFPucZFFTCQ36SUSW8RRI,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
@@ -276,14 +276,14 @@ arelle/images/xbrl128.gif,sha256=wb1K8SeKyYV63EUVYG0j7W6veY0moD8L8YrjAhnyRdI,927
276
276
  arelle/images/xbrl16.ico,sha256=n4GcRLd-_sTpT0PML7rPSUd8lHCGNWYftrJ7WhhcMaQ,1150
277
277
  arelle/images/xbrl32.ico,sha256=ubVPZKTkX7lsJhHz1vEKsIbWY7g0k1asxvwgT8Nbzxw,4286
278
278
  arelle/locale/messages.mo,sha256=1fb0KAYAzYLGV0tuFvfzDHMj_fYtNYEpqS2rUkZSf3Y,398
279
- arelle/locale/messages.pot,sha256=tO4mHem4QXX2YJHRScbetmx-nN1siSgz9UaVsNYyGRw,249762
280
- arelle/locale/ar_EG/LC_MESSAGES/ar_EG.po,sha256=cffTCuTgVrckEA_Omyz6k2TmTqZhN4o3ykvXJO4qvAQ,341883
279
+ arelle/locale/messages.pot,sha256=rSm-zzgA-4oDOrMELAQwrFAJpwV2yGP-81Ij6Uoc-uw,249718
280
+ arelle/locale/ar_EG/LC_MESSAGES/ar_EG.po,sha256=UboUT0k6DtALtn_Lsu5Ts8wCxiyaotYjA4OoSkfooBQ,341833
281
281
  arelle/locale/ar_EG/LC_MESSAGES/arelle.mo,sha256=J_v2J5ED3FDhIpk4WxnWXo2THNTqfgAwd2NOa8erB8I,185904
282
282
  arelle/locale/es/LC_MESSAGES/arelle.mo,sha256=iB8uYP_vhdqll3c8O08KBsaZ3hlf4YHwZFxc3-nC3k8,149331
283
283
  arelle/locale/fr/LC_MESSAGES/arelle.mo,sha256=HsXvnKEsnhqJqH6H9SlGBy451fnQTaizbZCyCN_Qbwg,118897
284
284
  arelle/locale/fr/LC_MESSAGES/fr.po,sha256=D2WHLI9NktcxgmGx91fRLNLoVjvO3Z0jjS9AJlroOCE,168077
285
285
  arelle/locale/ru/LC_MESSAGES/arelle.mo,sha256=i004xdiJMpXus5DnSz2y708H5vPt78Pu5ApkrdC9Fqw,375378
286
- arelle/locale/ru/LC_MESSAGES/ru.po,sha256=pPACN6dXlimkr2KJ5l-B0fv4PhlijWAz3fVYJ5h3SaM,449579
286
+ arelle/locale/ru/LC_MESSAGES/ru.po,sha256=aOQv5MfenTHo_y_RbkRen2SvgBQDTnmxOkKOZsUE3LQ,449575
287
287
  arelle/logging/formatters/LogFormatter.py,sha256=emXkUWLRZ65-qu9K-BcYrT2ueR8R-YchA8bwPY3yA60,1968
288
288
  arelle/logging/handlers/LogHandlerWithXml.py,sha256=xj-m6aNh4gksxP9AjN0xkECxVdx9m7ElCC0lXkhFcUQ,4318
289
289
  arelle/logging/handlers/LogToBufferHandler.py,sha256=tTzHRw9tn1Osrpc5rcKxk2iTEE3uIq5wb792z5RVYAs,612
@@ -344,7 +344,7 @@ arelle/plugin/logging/saveMessages.py,sha256=h6XNFJZq3q1WLn_Y3_DI-l8Qn_-IZa2JBk-
344
344
  arelle/plugin/security/cryptAES_CBC.py,sha256=S94AdMqu4jdLrprl0FLT2w7tG6IgxTGxRfRuYR9x43w,6078
345
345
  arelle/plugin/security/cryptAES_EAX.py,sha256=TAL_kpu_2WMMpHOWrxA8Y7UuTAcbbTY6DK0VYQZGWF0,5952
346
346
  arelle/plugin/transforms/tester.py,sha256=57relfBci8FttRSxHtdUaxlaQPrBhJglssImDecQPow,12501
347
- arelle/plugin/validate/CIPC/Const.py,sha256=Z0WHyC_QG9ktzO1N3GNXXT6gtZfKBGWL0nHSn98p5FU,11486
347
+ arelle/plugin/validate/CIPC/Const.py,sha256=GSiODyiK8V9P-pV0_DPEKYAhe2wqgcYJP2Qt6xaIyA4,11425
348
348
  arelle/plugin/validate/CIPC/__init__.py,sha256=OMLc0DgKulsyQlVhU9Wjlt_1VMpNJiUWBH16KV6TLtA,14681
349
349
  arelle/plugin/validate/CIPC/config.xml,sha256=4pyn40JAvQQeoRC8I046gZ4ZcmUnekX3TNfYpC5yonI,667
350
350
  arelle/plugin/validate/DBA/DisclosureSystems.py,sha256=Dp_r-Pa3tahtCfDha2Zc97N0iyrY4Zagb8w2D9ErILg,294
@@ -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=HSC78vmyI_W7MMaLXgZbKGd9IdwtirbCK0Q1H8p9j9k,2922
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=JUlnK9-ib0y7bGG6apJ8i60TMEdoe6y_hL33s22rYw4,3164
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.3.dist-info/licenses/LICENSE.md,sha256=rMbWwFLGzPgLoEjEu8LCmkpWDTqsvfOI-wzLSfeJsis,4107
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.3.dist-info/METADATA,sha256=__sBDh5sAxLpS_XRuOIO7tAG0c5YFdLKLf-gaL9XRMY,9116
1559
- arelle_release-2.37.3.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
1560
- arelle_release-2.37.3.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1561
- arelle_release-2.37.3.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1562
- arelle_release-2.37.3.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 (78.1.0)
2
+ Generator: setuptools (80.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -24,9 +24,6 @@ Python®: Copyright (c) 2001-2022 Python Software Foundation; All Rights Reserve
24
24
  aniso8601: Copyright (c) 2021, Brandon Nielsen, All rights reserved.
25
25
  [License](https://github.com/sloanlance/aniso8601/blob/master/LICENSE)
26
26
 
27
- cherrypy: cheroot Copyright © 2004-2020, CherryPy Team. All rights reserved.
28
- [License](https://github.com/cherrypy/cherrypy/blob/main/LICENSE.md)
29
-
30
27
  cx_Freeze: Copyright © 2020-2022, Marcelo Duarte, 2007-2020, Anthony Tuininga,
31
28
  2001-2006, Computronix (Canada) Ltd., Edmonton, Alberta, Canada. All rights reserved.
32
29
  [License](https://cx-freeze.readthedocs.io/en/latest/license.html)
@@ -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 -->