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

Files changed (26) hide show
  1. arelle/CntlrCmdLine.py +2 -2
  2. arelle/CntlrWebMain.py +6 -10
  3. arelle/DisclosureSystem.py +1 -1
  4. arelle/FileSource.py +31 -5
  5. arelle/XbrlConst.py +8 -3
  6. arelle/_version.py +2 -2
  7. arelle/api/Session.py +2 -6
  8. arelle/oim/Load.py +6 -7
  9. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +3 -0
  10. arelle/plugin/validate/EDINET/__init__.py +20 -1
  11. arelle/plugin/validate/EDINET/resources/config.xml +2 -0
  12. arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +60 -0
  13. arelle/plugin/validate/EDINET/rules/edinet.py +61 -0
  14. arelle/plugin/validate/EDINET/rules/frta.py +48 -0
  15. arelle/plugin/validate/EDINET/rules/gfm.py +76 -0
  16. arelle/plugin/validate/EDINET/rules/upload.py +4 -5
  17. arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +16 -3
  18. arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +31 -3
  19. arelle/plugin/validate/ESEF/resources/authority-validations.json +2 -0
  20. arelle/plugin/validate/NL/rules/nl_kvk.py +9 -11
  21. {arelle_release-2.37.32.dist-info → arelle_release-2.37.34.dist-info}/METADATA +1 -1
  22. {arelle_release-2.37.32.dist-info → arelle_release-2.37.34.dist-info}/RECORD +26 -22
  23. {arelle_release-2.37.32.dist-info → arelle_release-2.37.34.dist-info}/WHEEL +0 -0
  24. {arelle_release-2.37.32.dist-info → arelle_release-2.37.34.dist-info}/entry_points.txt +0 -0
  25. {arelle_release-2.37.32.dist-info → arelle_release-2.37.34.dist-info}/licenses/LICENSE.md +0 -0
  26. {arelle_release-2.37.32.dist-info → arelle_release-2.37.34.dist-info}/top_level.txt +0 -0
arelle/CntlrCmdLine.py CHANGED
@@ -634,7 +634,7 @@ class CntlrCmdLine(Cntlr.Cntlr):
634
634
  super().__init__(hasGui=False, uiLang=uiLang, disable_persistent_config=disable_persistent_config, logFileName=logFileName)
635
635
  self.preloadedPlugins = {}
636
636
 
637
- def run(self, options: RuntimeOptions, sourceZipStream=None, responseZipStream=None, sourceZipStreamFileName=None) -> bool:
637
+ def run(self, options: RuntimeOptions, sourceZipStream=None, responseZipStream=None) -> bool:
638
638
  """Process command line arguments or web service request, such as to load and validate an XBRL document, or start web server.
639
639
 
640
640
  When a web server has been requested, this method may be called multiple times, once for each web service (REST) request that requires processing.
@@ -998,7 +998,7 @@ class CntlrCmdLine(Cntlr.Cntlr):
998
998
  _entryPoints.append({"file":f})
999
999
  filesource = None # file source for all instances if not None
1000
1000
  if sourceZipStream:
1001
- filesource = FileSource.openFileSource(None, self, sourceZipStream=sourceZipStream, sourceZipStreamFileName=sourceZipStreamFileName)
1001
+ filesource = FileSource.openFileSource(None, self, sourceZipStream)
1002
1002
  elif len(_entryPoints) == 1 and "file" in _entryPoints[0]: # check if an archive and need to discover entry points (and not IXDS)
1003
1003
  entryPath = PackageManager.mappedUrl(_entryPoints[0]["file"])
1004
1004
  filesource = FileSource.openFileSource(entryPath, self, checkIfXmlIsEis=_checkIfXmlIsEis)
arelle/CntlrWebMain.py CHANGED
@@ -19,7 +19,7 @@ from bottle import Bottle, HTTPResponse, request, response, static_file # type:
19
19
 
20
20
  from arelle import Version
21
21
  from arelle.CntlrCmdLine import CntlrCmdLine
22
- from arelle.FileSource import FileNamedStringIO
22
+ from arelle.FileSource import FileNamedBytesIO, FileNamedStringIO
23
23
  from arelle.logging.formatters.LogFormatter import LogFormatter
24
24
  from arelle.logging.handlers.LogToBufferHandler import LogToBufferHandler
25
25
  from arelle.PluginManager import pluginClassMethods
@@ -263,19 +263,16 @@ def validation(file: str | None = None) -> str | bytes:
263
263
  isValidation = 'validation' == requestPathParts[-1] or 'validation' == requestPathParts[-2]
264
264
  view = request.query.view
265
265
  viewArcrole = request.query.viewArcrole
266
- sourceZipStreamFileName = None
267
266
  sourceZipStream = None
268
267
  if request.method == 'POST':
269
268
  mimeType = request.get_header("Content-Type")
270
269
  if mimeType and mimeType.startswith("multipart/form-data"):
271
270
  if upload := request.files.get("upload"):
272
- sourceZipStreamFileName = upload.filename
273
- sourceZipStream = upload.file
271
+ sourceZipStream = FileNamedBytesIO(upload.filename, upload.file.read())
274
272
  else:
275
273
  errors.append(_("POST 'multipart/form-data' request must include 'upload' part containing the XBRL file to process."))
276
274
  elif mimeType in ('application/zip', 'application/x-zip', 'application/x-zip-compressed', 'multipart/x-zip'):
277
- sourceZipStreamFileName = request.get_header("X-File-Name")
278
- sourceZipStream = request.body
275
+ sourceZipStream = FileNamedBytesIO(request.get_header("X-File-Name"), request.body.read())
279
276
  else:
280
277
  errors.append(_("POST request must provide an XBRL zip file to process. Content-Type '{0}' not recognized as a zip file.").format(mimeType))
281
278
  if not view and not viewArcrole:
@@ -349,14 +346,13 @@ def validation(file: str | None = None) -> str | bytes:
349
346
  viewFile = FileNamedStringIO(media)
350
347
  options.viewArcrole = viewArcrole
351
348
  options.viewFile = viewFile
352
- return runOptionsAndGetResult(options, media, viewFile, sourceZipStream, sourceZipStreamFileName)
349
+ return runOptionsAndGetResult(options, media, viewFile, sourceZipStream)
353
350
 
354
351
  def runOptionsAndGetResult(
355
352
  options: RuntimeOptions,
356
353
  media: str,
357
354
  viewFile: FileNamedStringIO | None,
358
- sourceZipStream: FileNamedStringIO | None = None,
359
- sourceZipStreamFileName: str | None = None,
355
+ sourceZipStream: FileNamedBytesIO | None = None,
360
356
  ) -> str | bytes:
361
357
  """Execute request according to options, for result in media, with *post*ed file in sourceZipStream, if any.
362
358
 
@@ -381,7 +377,7 @@ def runOptionsAndGetResult(
381
377
  else:
382
378
  responseZipStream = None
383
379
  cntlr = getCntlr()
384
- successful = cntlr.run(options, sourceZipStream, responseZipStream, sourceZipStreamFileName)
380
+ successful = cntlr.run(options, sourceZipStream, responseZipStream)
385
381
  if media == "xml":
386
382
  response.content_type = 'text/xml; charset=UTF-8'
387
383
  elif media == "csv":
@@ -438,7 +438,7 @@ class DisclosureSystem:
438
438
  return href in self.standardTaxonomiesDict
439
439
  return True # no standard taxonomies to test
440
440
 
441
- def hrefValidForDisclosureSystem(self, href):
441
+ def hrefValidForDisclosureSystem(self, href) -> bool:
442
442
  if self.validTaxonomiesUrl:
443
443
  return href in self.validTaxonomiesDict
444
444
  elif self.standardTaxonomiesUrl: # fallback to standard taxonomies dict
arelle/FileSource.py CHANGED
@@ -13,7 +13,7 @@ import struct
13
13
  import tarfile
14
14
  import zipfile
15
15
  import zlib
16
- from typing import IO, TYPE_CHECKING, Any, Optional, TextIO, cast
16
+ from typing import IO, TYPE_CHECKING, Any, BinaryIO, Optional, TextIO, cast
17
17
 
18
18
  import regex as re
19
19
  from lxml import etree
@@ -44,15 +44,17 @@ TAXONOMY_PACKAGE_FILE_NAMES = ('.taxonomyPackage.xml', 'catalog.xml') # pre-PWD
44
44
  def openFileSource(
45
45
  filename: str | None,
46
46
  cntlr: Cntlr | None = None,
47
- sourceZipStream: str | None = None,
47
+ sourceZipStream: BinaryIO | FileNamedBytesIO | None = None,
48
48
  checkIfXmlIsEis: bool = False,
49
49
  reloadCache: bool = False,
50
50
  base: str | None = None,
51
51
  sourceFileSource: FileSource | None = None,
52
- sourceZipStreamFileName: str | None = None,
53
52
  ) -> FileSource:
54
53
  if sourceZipStream:
55
- sourceZipStreamFileName = os.sep + (sourceZipStreamFileName or "POSTupload.zip")
54
+ if isinstance(sourceZipStream, FileNamedBytesIO) and sourceZipStream.fileName:
55
+ sourceZipStreamFileName = os.sep + sourceZipStream.fileName
56
+ else:
57
+ sourceZipStreamFileName = os.sep + "POSTupload.zip"
56
58
  filesource = FileSource(sourceZipStreamFileName, cntlr)
57
59
  filesource.openZipStream(sourceZipStream)
58
60
  if filename:
@@ -390,7 +392,7 @@ class FileSource:
390
392
  assert self.taxonomyPackage is not None
391
393
  self.mappedPaths = cast('dict[str, str]', self.taxonomyPackage.get("remappings"))
392
394
 
393
- def openZipStream(self, sourceZipStream: str) -> None:
395
+ def openZipStream(self, sourceZipStream: BinaryIO) -> None:
394
396
  if not self.isOpen:
395
397
  assert isinstance(self.url, str)
396
398
  self.basefile = self.url
@@ -655,6 +657,30 @@ class FileSource:
655
657
  else:
656
658
  return openXmlFileStream(self.cntlr, filepath, stripDeclaration)
657
659
 
660
+ def getBytesSize(self) -> int | None:
661
+ """
662
+ Get the size of the zip file in bytes.
663
+ :return: Size of the zip file in bytes, or None if not applicable.
664
+ """
665
+ if isinstance(self.basefile, str) and os.path.isfile(self.basefile):
666
+ return os.path.getsize(self.basefile)
667
+ # ZipFile.fp is a private field, but is currently the simplest way for us to
668
+ # access the internal stream
669
+ if isinstance(self.fs, zipfile.ZipFile) and (fp := getattr(self.fs, 'fp')) is not None:
670
+ stream = cast(IO[Any], fp)
671
+ stream.seek(0, 2) # Move to the end of the file
672
+ return stream.tell() # Report the current position, which is the size of the file
673
+ return None
674
+
675
+ def getBytesSizeEstimate(self) -> int | None:
676
+ """
677
+ Get an estimated size of the zip file in bytes.
678
+ :return: Estimated size of the zip file in bytes, or None if not applicable.
679
+ """
680
+ if not isinstance(self.fs, zipfile.ZipFile):
681
+ return None
682
+ return sum(zi.compress_size for zi in self.fs.infolist())
683
+
658
684
  def exists(self, filepath: str) -> bool:
659
685
  archiveFileSource = self.fileSourceContainingFilepath(filepath)
660
686
  if archiveFileSource is not None:
arelle/XbrlConst.py CHANGED
@@ -21,17 +21,22 @@ _tuple = tuple # type: ignore[type-arg]
21
21
 
22
22
  xsd = "http://www.w3.org/2001/XMLSchema"
23
23
  qnXsdComplexType = qname("{http://www.w3.org/2001/XMLSchema}xsd:complexType")
24
+ qnXsdDocumentation = qname("{http://www.w3.org/2001/XMLSchema}xsd:documentation")
25
+ qnXsdImport = qname("{http://www.w3.org/2001/XMLSchema}xsd:import")
24
26
  qnXsdSchema = qname("{http://www.w3.org/2001/XMLSchema}xsd:schema")
25
27
  qnXsdAppinfo = qname("{http://www.w3.org/2001/XMLSchema}xsd:appinfo")
26
28
  qnXsdDefaultType = qname("{http://www.w3.org/2001/XMLSchema}xsd:anyType")
27
29
  xsi = "http://www.w3.org/2001/XMLSchema-instance"
28
30
  qnXsiNil = qname(xsi, "xsi:nil") # need default prefix in qname
31
+ qnXsiType = qname(xsi, "xsi:type")
32
+ qnXsiSchemaLocation = qname(xsi, "xsi:schemaLocation")
33
+ qnXsiNoNamespaceSchemaLocation = qname(xsi, "xsi:noNamespaceSchemaLocation")
29
34
  qnXmlLang = qname("{http://www.w3.org/XML/1998/namespace}xml:lang")
30
35
  builtinAttributes = {
31
36
  qnXsiNil,
32
- qname(xsi, "xsi:type"),
33
- qname(xsi, "xsi:schemaLocation"),
34
- qname(xsi, "xsi:noNamespaceSchemaLocation"),
37
+ qnXsiType,
38
+ qnXsiSchemaLocation,
39
+ qnXsiNoNamespaceSchemaLocation,
35
40
  }
36
41
  xml = "http://www.w3.org/XML/1998/namespace"
37
42
  xbrli = "http://www.xbrl.org/2003/instance"
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.32'
21
- __version_tuple__ = version_tuple = (2, 37, 32)
20
+ __version__ = version = '2.37.34'
21
+ __version_tuple__ = version_tuple = (2, 37, 34)
arelle/api/Session.py CHANGED
@@ -12,6 +12,7 @@ from typing import Any, BinaryIO
12
12
 
13
13
  from arelle import PackageManager, PluginManager
14
14
  from arelle.CntlrCmdLine import CntlrCmdLine, createCntlrAndPreloadPlugins
15
+ from arelle.FileSource import FileNamedBytesIO
15
16
  from arelle.ModelXbrl import ModelXbrl
16
17
  from arelle.RuntimeOptions import RuntimeOptions
17
18
 
@@ -102,11 +103,10 @@ class Session:
102
103
  def run(
103
104
  self,
104
105
  options: RuntimeOptions,
105
- sourceZipStream: BinaryIO | None = None,
106
+ sourceZipStream: BinaryIO | FileNamedBytesIO | None = None,
106
107
  responseZipStream: BinaryIO | None = None,
107
108
  logHandler: logging.Handler | None = None,
108
109
  logFilters: list[logging.Filter] | None = None,
109
- sourceZipStreamFileName: str | None = None,
110
110
  ) -> bool:
111
111
  """
112
112
  Perform a run using the given options.
@@ -114,13 +114,10 @@ class Session:
114
114
  :param sourceZipStream: Optional stream to read source data from.
115
115
  :param responseZipStream: Options stream to write response data to.
116
116
  :param logHandler: Optional log handler to use for logging.
117
- :param sourceZipStreamFileName: Optional file name to use for the passed zip stream.
118
117
  :return: True if the run was successful, False otherwise.
119
118
  """
120
119
  with _session_lock:
121
120
  self._check_thread()
122
- if sourceZipStreamFileName is not None and sourceZipStream is None:
123
- raise ValueError("sourceZipStreamFileName may only be provided if sourceZipStream is not None.")
124
121
  PackageManager.reset()
125
122
  PluginManager.reset()
126
123
  if self._cntlr is None:
@@ -174,5 +171,4 @@ class Session:
174
171
  options,
175
172
  sourceZipStream=sourceZipStream,
176
173
  responseZipStream=responseZipStream,
177
- sourceZipStreamFileName=sourceZipStreamFileName,
178
174
  )
arelle/oim/Load.py CHANGED
@@ -1532,7 +1532,7 @@ def _loadFromOIM(cntlr, error, warning, modelXbrl, oimFile, mappedUri):
1532
1532
  hasRowError = True
1533
1533
  elif propGrpColValue in propGrpObjects:
1534
1534
  rowPropGroups[propGrpName] = propGrpObjects[propGrpColValue]
1535
- else:
1535
+ elif propGrpColValue is not EMPTY_CELL:
1536
1536
  error("xbrlce:unknownPropertyGroup",
1537
1537
  _("Table %(table)s unknown property group row %(row)s column %(column)s group %(propertyGroup)s, url: %(url)s"),
1538
1538
  table=tableId, row=rowIndex+1, column=rowIdColName, url=tableUrl, propertyGroup=propGrpName)
@@ -1573,12 +1573,11 @@ def _loadFromOIM(cntlr, error, warning, modelXbrl, oimFile, mappedUri):
1573
1573
  if _isParamRef(val):
1574
1574
  rowPropGrpParamRefs.add(_getParamRefName(val))
1575
1575
  if factDimensions[colName] is None:
1576
- if colName in paramRefColNames:
1577
- value = _cellValue(row[colNameIndex[colName]])
1578
- if value:
1579
- paramColsWithValue.add(colName)
1580
- elif value is EMPTY_CELL or value is NONE_CELL:
1581
- emptyCols.add(colName)
1576
+ value = _cellValue(row[colNameIndex[colName]])
1577
+ if value is EMPTY_CELL or value is NONE_CELL:
1578
+ emptyCols.add(colName)
1579
+ elif colName in paramRefColNames:
1580
+ paramColsWithValue.add(colName)
1582
1581
  if not cellPropGroup:
1583
1582
  continue # not a fact column
1584
1583
  for rowPropGrpParamRef in rowPropGrpParamRefs:
@@ -131,3 +131,6 @@ class PluginValidationDataExtension(PluginData):
131
131
  )
132
132
  return False
133
133
  return True
134
+
135
+ def isStandardTaxonomyUrl(self, uri: str, modelXbrl: ModelXbrl) -> bool:
136
+ return modelXbrl.modelManager.disclosureSystem.hrefValidForDisclosureSystem(uri)
@@ -14,12 +14,21 @@ from lxml import etree
14
14
  from lxml.etree import _Element
15
15
 
16
16
  from arelle.FileSource import FileSource
17
+ from arelle.ModelXbrl import ModelXbrl
17
18
  from arelle.Version import authorLabel, copyrightLabel
18
19
  from .ValidationPluginExtension import ValidationPluginExtension
19
- from .rules import upload
20
+ from .rules import edinet, frta, gfm, upload
20
21
 
21
22
  PLUGIN_NAME = "Validate EDINET"
22
23
  DISCLOSURE_SYSTEM_VALIDATION_TYPE = "EDINET"
24
+ RELEVELER_MAP: dict[str, dict[str, tuple[str, str | None]]] = {
25
+ "ERROR": {
26
+ # Silence, duplicated by EDINET.EC5002E
27
+ "xbrl.4.8.2:sharesFactUnit-notSharesMeasure": ("ERROR", None),
28
+ # Silence, duplicated by EDINET.EC5002E
29
+ "xbrl.4.8.2:sharesFactUnit-notSingleMeasure": ("ERROR", None),
30
+ },
31
+ }
23
32
 
24
33
 
25
34
  validationPlugin = ValidationPluginExtension(
@@ -27,6 +36,9 @@ validationPlugin = ValidationPluginExtension(
27
36
  disclosureSystemConfigUrl=Path(__file__).parent / "resources" / "config.xml",
28
37
  validationTypes=[DISCLOSURE_SYSTEM_VALIDATION_TYPE],
29
38
  validationRuleModules=[
39
+ edinet,
40
+ frta,
41
+ gfm,
30
42
  upload,
31
43
  ],
32
44
  )
@@ -90,6 +102,12 @@ def fileSourceEntrypointFiles(filesource: FileSource, inlineOnly: bool, *args: A
90
102
  return entrypointFiles
91
103
 
92
104
 
105
+ def loggingSeverityReleveler(modelXbrl: ModelXbrl, level: str, messageCode: str, args: Any, **kwargs: Any) -> tuple[str | None, str | None]:
106
+ if level in RELEVELER_MAP:
107
+ return RELEVELER_MAP[level].get(messageCode, (level, messageCode))
108
+ return level, messageCode
109
+
110
+
93
111
  def modelXbrlLoadComplete(*args: Any, **kwargs: Any) -> None:
94
112
  return validationPlugin.modelXbrlLoadComplete(*args, **kwargs)
95
113
 
@@ -113,6 +131,7 @@ __pluginInfo__ = {
113
131
  "DisclosureSystem.Types": disclosureSystemTypes,
114
132
  "DisclosureSystem.ConfigURL": disclosureSystemConfigURL,
115
133
  "FileSource.EntrypointFiles": fileSourceEntrypointFiles,
134
+ "Logging.Severity.Releveler": loggingSeverityReleveler,
116
135
  "ModelXbrl.LoadComplete": modelXbrlLoadComplete,
117
136
  "Validate.XBRL.Finally": validateXbrlFinally,
118
137
  "ValidateFormula.Finished": validateFinally,
@@ -6,7 +6,9 @@
6
6
  <DisclosureSystem
7
7
  names="EDINET|edinet"
8
8
  description="Checks for EDINET."
9
+ blockDisallowedReferences="true"
9
10
  validationType="EDINET"
11
+ validTaxonomiesUrl="edinet-taxonomies.xml"
10
12
  exclusiveTypesPattern="EFM|GFM|FERC|HMRC|SBR.NL|EBA|EIOPA|ESEF"
11
13
  />
12
14
  </DisclosureSystems>
@@ -0,0 +1,60 @@
1
+ <?xml version='1.0' encoding='utf-8'?>
2
+ <Erxl version="1">
3
+ <Loc><Family>BASE</Family><Version>2008</Version><Href>http://www.xbrl.org/2008/generic-label.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://xbrl.org/2008/label</Namespace><Prefix>label</Prefix></Loc>
4
+ <Loc><Family>BASE</Family><Version>2008</Version><Href>http://www.xbrl.org/2008/generic-link.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://xbrl.org/2008/generic</Namespace><Prefix>gen</Prefix></Loc>
5
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/2003/instance</Namespace><Prefix>xbrli</Prefix></Loc>
6
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/2003/linkbase</Namespace><Prefix>link</Prefix></Loc>
7
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/2003/xl-2003-12-31.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/2003/XLink</Namespace><Prefix>xl</Prefix></Loc>
8
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/2003/xlink-2003-12-31.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://www.w3.org/1999/xlink</Namespace><Prefix>xlink</Prefix></Loc>
9
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/2004/ref-2004-08-10.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/2004/ref</Namespace><Prefix>ref</Prefix></Loc>
10
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/2005/xbrldt-2005.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://xbrl.org/2005/xbrldt</Namespace><Prefix>xbrldt</Prefix></Loc>
11
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/2006/ref-2006-02-27.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/2006/ref</Namespace><Prefix>ref</Prefix></Loc>
12
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/2006/xbrldi-2006.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://xbrl.org/2006/xbrldi</Namespace><Prefix>xbrldi</Prefix></Loc>
13
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/dtr/type/nonNumeric-2009-12-16.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/dtr/type/non-numeric</Namespace><Prefix>nonnum</Prefix></Loc>
14
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/dtr/type/numeric-2009-12-16.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/dtr/type/numeric</Namespace><Prefix>num</Prefix></Loc>
15
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/lrr/arcrole/deprecated-2009-12-16.xsd</Href><AttType>SCH</AttType><FileTypeName>Roles/Arcroles</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/2009/arcrole/deprecated</Namespace></Loc>
16
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/lrr/arcrole/factExplanatory-2009-12-16.xsd</Href><AttType>SCH</AttType><FileTypeName>Roles/Arcroles</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/2009/arcrole/fact-explanatoryFact</Namespace></Loc>
17
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/lrr/role/deprecated-2009-12-16.xsd</Href><AttType>SCH</AttType><FileTypeName>Roles/Arcroles</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/2009/role/deprecated</Namespace></Loc>
18
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/lrr/role/negated-2009-12-16.xsd</Href><AttType>SCH</AttType><FileTypeName>Roles/Arcroles</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/2009/role/negated</Namespace></Loc>
19
+ <Loc><Family>BASE</Family><Version>2010</Version><Href>http://www.xbrl.org/lrr/role/net-2009-12-16.xsd</Href><AttType>SCH</AttType><FileTypeName>Roles/Arcroles</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/2009/role/net</Namespace></Loc>
20
+ <Loc><Family>BASE</Family><Version>2014</Version><Href>http://www.xbrl.org/2014/extensible-enumerations.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://xbrl.org/2014/extensible-enumerations</Namespace><Prefix>enum</Prefix></Loc>
21
+ <Loc><Family>BASE</Family><Version>2020</Version><Href>http://www.xbrl.org/dtr/type/2020-01-21/types.xsd</Href><AttType>SCH</AttType><FileTypeName>Roles/Arcroles</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/dtr/type/2020-01-21</Namespace></Loc>
22
+ <Loc><Family>BASE</Family><Version>2022</Version><Href>http://www.xbrl.org/dtr/type/2022-03-31/types.xsd</Href><AttType>SCH</AttType><FileTypeName>Roles/Arcroles</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/dtr/type/2022-03-31</Namespace></Loc>
23
+ <Loc><Family>BASE</Family><Version>2023</Version><Href>http://www.xbrl.org/2023/calculation-1.1.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>https://xbrl.org/2023/calculation-1.1</Namespace></Loc>
24
+ <Loc><Family>BASE</Family><Version>2024</Version><Href>http://www.xbrl.org/dtr/type/2024-01-31/types.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>0</Elements> <Namespace>http://www.xbrl.org/dtr/type/2024-01-31</Namespace></Loc>
25
+ <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/common/2013-08-31/identificationAndOrdering_2013-08-31.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/common/2013-08-31/iod</Namespace><Prefix>common</Prefix></Loc>
26
+ <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_cor_2013-08-31.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_cor</Namespace><Prefix>jpdei</Prefix></Loc>
27
+ <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_rt_2013-08-31.xsd</Href><AttType>SCH</AttType><FileTypeName>Entry Point</FileTypeName><Elements>0</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_rt</Namespace><Prefix>jpdei</Prefix></Loc>
28
+ <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/label/jpdei_2013-08-31_gla.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
29
+ <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/label/jpdei_2024-11-01_lab-en.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
30
+ <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/label/jpdei_2024-11-01_lab.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
31
+ <Loc><Family>FSA</Family><Version>2013</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/r/jpdei_000100-000_2013-08-31_def.xml</Href><AttType>DEF</AttType><FileTypeName>Definition, Dimensions</FileTypeName><Elements>0</Elements></Loc>
32
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/jpcrp-esr_cor_2024-11-01.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/jpcrp-esr_cor</Namespace><Prefix>jpcrp-esr</Prefix></Loc>
33
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/jpcrp-esr_rt_2024-11-01.xsd</Href><AttType>SCH</AttType><FileTypeName>Entry Point</FileTypeName><Elements>0</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/jpcrp-esr_rt</Namespace><Prefix>jpcrp-esr</Prefix></Loc>
34
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/label/jpcrp-esr_2024-11-01_gla.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
35
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/label/jpcrp-esr_2024-11-01_lab-en.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
36
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/label/jpcrp-esr_2024-11-01_lab.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
37
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/jpcrp_cor_2024-11-01.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/jpcrp_cor</Namespace><Prefix>jpcrp</Prefix></Loc>
38
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/jpcrp_rt_2024-11-01.xsd</Href><AttType>SCH</AttType><FileTypeName>Entry Point</FileTypeName><Elements>0</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/jpcrp_rt</Namespace><Prefix>jpcrp</Prefix></Loc>
39
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/label/jpcrp_2024-11-01_gla.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
40
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/label/jpcrp_2024-11-01_lab-en.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
41
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/label/jpcrp_2024-11-01_lab.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
42
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/jpigp_cor_2024-11-01.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/jpigp_cor</Namespace><Prefix>jpigp</Prefix></Loc>
43
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/jpigp_rt_2024-11-01.xsd</Href><AttType>SCH</AttType><FileTypeName>Entry Point</FileTypeName><Elements>0</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/jpigp_rt</Namespace><Prefix>jpigp</Prefix></Loc>
44
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/label/jpigp_2024-11-01_gla.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
45
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/label/jpigp_2024-11-01_lab-en.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
46
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/label/jpigp_2024-11-01_lab.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
47
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/jppfs_cor_2024-11-01.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/jppfs_cor</Namespace><Prefix>jppfs</Prefix></Loc>
48
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/jppfs_pe_2012.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2012/jppfs_pe</Namespace><Prefix>jppfs</Prefix></Loc>
49
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/jppfs_rt_2024-11-01.xsd</Href><AttType>SCH</AttType><FileTypeName>Entry Point</FileTypeName><Elements>0</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/jppfs_rt</Namespace><Prefix>jppfs</Prefix></Loc>
50
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/label/jppfs_2024-11-01_gla.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
51
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/label/jppfs_2024-11-01_lab-en.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
52
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/label/jppfs_2024-11-01_lab.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
53
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/jpsps_cor_2024-11-01.xsd</Href><AttType>SCH</AttType><FileTypeName>Schema</FileTypeName><Elements>1</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/jpsps_cor</Namespace><Prefix>jppfs</Prefix></Loc>
54
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/jpsps_rt_2024-11-01.xsd</Href><AttType>SCH</AttType><FileTypeName>Entry Point</FileTypeName><Elements>0</Elements> <Namespace>http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/jpsps_rt</Namespace><Prefix>jpsps</Prefix></Loc>
55
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/label/jpsps_2024-11-01_gla.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
56
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/label/jpsps_2024-11-01_lab-en.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
57
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/label/jpsps_2024-11-01_lab.xml</Href><AttType>LAB</AttType><FileTypeName>Labels</FileTypeName><Elements>0</Elements></Loc>
58
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/r/jpsps-dei_000100-000_2024-11-01_def.xml</Href><AttType>DEF</AttType><FileTypeName>Definition, Dimensions</FileTypeName><Elements>0</Elements></Loc>
59
+ <Loc><Family>FSA</Family><Version>2024</Version><Href>http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/r/jpsps-dei_000200-000_2024-11-01_def.xml</Href><AttType>DEF</AttType><FileTypeName>Definition, Dimensions</FileTypeName><Elements>0</Elements></Loc>
60
+ </Erxl>
@@ -0,0 +1,61 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from collections.abc import Iterable
7
+ from typing import Any
8
+
9
+ from arelle import XbrlConst
10
+ from arelle.ValidateXbrl import ValidateXbrl
11
+ from arelle.typing import TypeGetText
12
+ from arelle.utils.PluginHooks import ValidationHook
13
+ from arelle.utils.validate.Decorator import validation
14
+ from arelle.utils.validate.Validation import Validation
15
+ from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
16
+ from ..PluginValidationDataExtension import PluginValidationDataExtension
17
+
18
+ _: TypeGetText
19
+
20
+
21
+ @validation(
22
+ hook=ValidationHook.XBRL_FINALLY,
23
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
24
+ )
25
+ def rule_EC5002E(
26
+ pluginData: PluginValidationDataExtension,
27
+ val: ValidateXbrl,
28
+ *args: Any,
29
+ **kwargs: Any,
30
+ ) -> Iterable[Validation]:
31
+ """
32
+ EDINET.EC5002E: A unit other than number of shares (xbrli:shares) has been set for the
33
+ Number of Shares (xbrli:sharesItemType) item '{xxx}yyy'.
34
+ Please check the units and enter the correct information.
35
+
36
+ Similar to "xbrl.4.8.2:sharesFactUnit-notSharesMeasure" and "xbrl.4.8.2:sharesFactUnit-notSingleMeasure"
37
+ TODO: Consolidate this rule with the above two rules if possible.
38
+ """
39
+ errorFacts = []
40
+ for fact in val.modelXbrl.facts:
41
+ concept = fact.concept
42
+ if not concept.isShares:
43
+ continue
44
+ unit = fact.unit
45
+ measures = unit.measures
46
+ if (
47
+ not measures or
48
+ len(measures[0]) != 1 or
49
+ len(measures[1]) != 0 or
50
+ measures[0][0] != XbrlConst.qnXbrliShares
51
+ ):
52
+ errorFacts.append(fact)
53
+ for fact in errorFacts:
54
+ yield Validation.error(
55
+ codes='EDINET.EC5002E',
56
+ msg=_("A unit other than number of shares (xbrli:shares) has been set for "
57
+ "the Number of Shares (xbrli:sharesItemType) item '%(qname)s'. "
58
+ "Please check the units and enter the correct information."),
59
+ qname=fact.qname.clarkNotation,
60
+ modelObject=fact,
61
+ )
@@ -0,0 +1,48 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from collections.abc import Iterable
7
+ from typing import Any
8
+
9
+ from arelle import XbrlConst
10
+ from arelle.ValidateXbrl import ValidateXbrl
11
+ from arelle.typing import TypeGetText
12
+ from arelle.utils.PluginHooks import ValidationHook
13
+ from arelle.utils.validate.Decorator import validation
14
+ from arelle.utils.validate.Validation import Validation
15
+ from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
16
+ from ..PluginValidationDataExtension import PluginValidationDataExtension
17
+
18
+ _: TypeGetText
19
+
20
+
21
+ @validation(
22
+ hook=ValidationHook.XBRL_FINALLY,
23
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
24
+ )
25
+ def rule_frta_2_1_9(
26
+ pluginData: PluginValidationDataExtension,
27
+ val: ValidateXbrl,
28
+ *args: Any,
29
+ **kwargs: Any,
30
+ ) -> Iterable[Validation]:
31
+ """
32
+ EDINET.EC5710W: [FRTA.2.1.9] All documentation of a concept must be contained
33
+ in XBRL linkbases. Do not use the xsd:documentation element in an element definition.
34
+ """
35
+ errors = []
36
+ for modelDocument in val.modelXbrl.urlDocs.values():
37
+ if pluginData.isStandardTaxonomyUrl(modelDocument.uri, val.modelXbrl):
38
+ continue
39
+ rootElt = modelDocument.xmlRootElement
40
+ for elt in rootElt.iterdescendants(XbrlConst.qnXsdDocumentation.clarkNotation):
41
+ errors.append(elt)
42
+ if len(errors) > 0:
43
+ yield Validation.error(
44
+ codes='EDINET.EC5710W.FRTA.2.1.9',
45
+ msg=_("All documentation of a concept must be contained in XBRL linkbases. "
46
+ "Taxonomy element declarations should not use the XML Schema documentation element."),
47
+ modelObject=errors,
48
+ )
@@ -0,0 +1,76 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from collections.abc import Iterable
7
+ from typing import Any
8
+
9
+ from arelle import XbrlConst, XmlUtil
10
+ from arelle.UrlUtil import isHttpUrl, splitDecodeFragment
11
+ from arelle.ValidateXbrl import ValidateXbrl
12
+ from arelle.typing import TypeGetText
13
+ from arelle.utils.PluginHooks import ValidationHook
14
+ from arelle.utils.validate.Decorator import validation
15
+ from arelle.utils.validate.Validation import Validation
16
+ from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
17
+ from ..PluginValidationDataExtension import PluginValidationDataExtension
18
+
19
+ _: TypeGetText
20
+
21
+
22
+ @validation(
23
+ hook=ValidationHook.XBRL_FINALLY,
24
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
25
+ )
26
+ def rule_gfm_1_1_3(
27
+ pluginData: PluginValidationDataExtension,
28
+ val: ValidateXbrl,
29
+ *args: Any,
30
+ **kwargs: Any,
31
+ ) -> Iterable[Validation]:
32
+ """
33
+ EDINET.EC5700W: [GFM 1.1.3] The URI content of the xlink:href attribute,
34
+ the xsi:schemaLocation attribute and the schemaLocation attribute must
35
+ be relative and contain no forward slashes, or a recognized external
36
+ location of a standard taxonomy schema file, or a "#" followed by a
37
+ shorthand xpointer.
38
+ """
39
+ values = []
40
+ for modelDocument in val.modelXbrl.urlDocs.values():
41
+ if pluginData.isStandardTaxonomyUrl(modelDocument.uri, val.modelXbrl):
42
+ continue
43
+ rootElt = modelDocument.xmlRootElement
44
+ for elt in rootElt.iterdescendants(XbrlConst.qnLinkLoc.clarkNotation):
45
+ uri = elt.attrib.get(XbrlConst.qnXlinkHref.clarkNotation)
46
+ values.append((modelDocument, elt, uri))
47
+ for elt in rootElt.iterdescendants(XbrlConst.qnXsdImport.clarkNotation):
48
+ uri = elt.attrib.get('schemaLocation')
49
+ values.append((modelDocument, elt, uri))
50
+ for elt in rootElt.iterdescendants(XbrlConst.qnLinkLinkbase.clarkNotation):
51
+ uri = elt.attrib.get(XbrlConst.qnXsiSchemaLocation.clarkNotation)
52
+ values.append((modelDocument, elt, uri))
53
+ for modelDocument, elt, uri in values:
54
+ if uri is None:
55
+ continue
56
+ if not isHttpUrl(uri):
57
+ if '/' not in uri:
58
+ continue # Valid relative path
59
+ if pluginData.isStandardTaxonomyUrl(uri, val.modelXbrl):
60
+ continue # Valid external URL
61
+ splitUri, hrefId = splitDecodeFragment(uri)
62
+ if pluginData.isStandardTaxonomyUrl(splitUri, val.modelXbrl):
63
+ if hrefId is None or len(hrefId) == 0:
64
+ continue # Valid external URL
65
+ if not any(scheme == "element" for scheme, __ in XmlUtil.xpointerSchemes(hrefId)):
66
+ continue # Valid shorthand xpointer
67
+ yield Validation.error(
68
+ codes='EDINET.EC5700W.GFM.1.1.3',
69
+ msg=_("The URI content of the xlink:href attribute, the xsi:schemaLocation "
70
+ "attribute and the schemaLocation attribute must be relative and "
71
+ "contain no forward slashes, or a recognized external location of "
72
+ "a standard taxonomy schema file, or a '#' followed by a shorthand "
73
+ "xpointer. The URI '%(uri)s' is not valid."),
74
+ uri=uri,
75
+ modelObject=elt,
76
+ )
@@ -238,11 +238,10 @@ def rule_EC0183E(
238
238
  """
239
239
  if not pluginData.shouldValidateUpload(val):
240
240
  return
241
- zipFile = cast(zipfile.ZipFile, val.modelXbrl.fileSource.fs)
242
- file = cast(IO[Any], zipFile.fp)
243
- file.seek(0, 2) # Move to the end of the file
244
- size = file.tell()
245
- if size > 55 * 1000 * 1000: # Interpretting MB as megabytes (1,000,000 bytes)
241
+ size = val.modelXbrl.fileSource.getBytesSize()
242
+ if size is None:
243
+ return # File size is not available, cannot validate
244
+ if size > 55_000_000: # Interpretting MB as megabytes (1,000,000 bytes)
246
245
  yield Validation.error(
247
246
  codes='EDINET.EC0183E',
248
247
  msg=_("The compressed file size exceeds 55MB. "
@@ -88,12 +88,25 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
88
88
  if reportPackageMaxMB is not None and modelXbrl.fileSource.fs: # must be a zip to be a report package
89
89
  assert isinstance(modelXbrl.fileSource.fs, zipfile.ZipFile)
90
90
  maxMB = float(reportPackageMaxMB)
91
+ _size: int | None = None
92
+ _sizeExact = True
91
93
  if val.authParam["reportPackageMeasurement"] == "unzipped":
92
94
  _size = sum(zi.file_size for zi in modelXbrl.fileSource.fs.infolist())
95
+ _sizeExact = False
93
96
  else:
94
- _size = sum(zi.compress_size for zi in modelXbrl.fileSource.fs.infolist())
95
- # not usable because zip may be posted or streamed: _size = os.path.getsize(modelXbrl.fileSource.basefile)
96
- if _size > maxMB * 1048576:
97
+ try:
98
+ _size = modelXbrl.fileSource.getBytesSize()
99
+ except Exception:
100
+ pass
101
+ if _size is None:
102
+ _size = modelXbrl.fileSource.getBytesSizeEstimate()
103
+ _sizeExact = False
104
+ modelXbrl.info("arelle.ESEF.reportPackageSize",
105
+ _("The %(estimated)s report package %(reportPackageMeasurement)s size is %(size)s bytes."),
106
+ estimated=_("exact") if _sizeExact else _("estimated"),
107
+ reportPackageMeasurement=_(val.authParam["reportPackageMeasurement"]) or _("zipped"),
108
+ size=_size)
109
+ if _size is not None and _size > maxMB * 1048576:
97
110
  modelXbrl.error("arelle.ESEF.maximumReportPackageSize",
98
111
  _("The authority %(authority)s requires a report package size under %(maxSize)s MB, size is %(size)s."),
99
112
  modelObject=modelXbrl, authority=val.authority, maxSize=reportPackageMaxMB, size=_size)
@@ -93,12 +93,25 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
93
93
  assert isinstance(modelXbrl.fileSource.fs, zipfile.ZipFile)
94
94
 
95
95
  maxMB = float(reportPackageMaxMB)
96
+ _size: int | None = None
97
+ _sizeExact = True
96
98
  if val.authParam["reportPackageMeasurement"] == "unzipped":
97
99
  _size = sum(zi.file_size for zi in modelXbrl.fileSource.fs.infolist())
100
+ _sizeExact = False
98
101
  else:
99
- _size = sum(zi.compress_size for zi in modelXbrl.fileSource.fs.infolist())
100
- # not usable because zip may be posted or streamed: _size = os.path.getsize(modelXbrl.fileSource.basefile)
101
- if _size > maxMB * 1048576:
102
+ try:
103
+ _size = modelXbrl.fileSource.getBytesSize()
104
+ except Exception:
105
+ pass
106
+ if _size is None:
107
+ _size = modelXbrl.fileSource.getBytesSizeEstimate()
108
+ _sizeExact = False
109
+ modelXbrl.info("arelle.ESEF.reportPackageSize",
110
+ _("The %(estimated)s report package %(reportPackageMeasurement)s size is %(size)s bytes."),
111
+ estimated=_("exact") if _sizeExact else _("estimated"),
112
+ reportPackageMeasurement=_(val.authParam["reportPackageMeasurement"]) or _("zipped"),
113
+ size=_size)
114
+ if _size is not None and _size > maxMB * 1048576:
102
115
  modelXbrl.error("arelle.ESEF.maximumReportPackageSize",
103
116
  _("The authority %(authority)s requires a report package size under %(maxSize)s MB, size is %(size)s."),
104
117
  modelObject=modelXbrl, authority=val.authority, maxSize=reportPackageMaxMB, size=_size)
@@ -1096,6 +1109,21 @@ def validateXbrlFinally(val: ValidateXbrl, *args: Any, **kwargs: Any) -> None:
1096
1109
  _("Extension elements must not duplicate the existing elements from the core taxonomy and be identifiable %(qname)s."),
1097
1110
  modelObject=(c,_i), qname=c.qname)
1098
1111
 
1112
+ extensionTaxonomyDirectoryPrefix = val.authParam["reportPackageExtensionTaxonomyDirectoryPrefix"]
1113
+ if extensionTaxonomyDirectoryPrefix is not None and val.modelXbrl.fileSource.dir is not None:
1114
+ for filepath in val.modelXbrl.fileSource.dir:
1115
+ filepath_parts = filepath.split('/')
1116
+ if filepath_parts[1] in ['META-INF', 'reports']:
1117
+ continue
1118
+ if not filepath_parts[1].startswith(extensionTaxonomyDirectoryPrefix):
1119
+ modelXbrl.error(
1120
+ 'arelle.ESEF.reportPackageExtensionTaxonomyDirectoryPrefix',
1121
+ _('The XBRL linkbase files must live within the report package under a directory that starts '
1122
+ 'with `{}`').format(extensionTaxonomyDirectoryPrefix),
1123
+ modelObject=val.modelXbrl
1124
+ )
1125
+ break
1126
+
1099
1127
  modelXbrl.profileActivity(_statusMsg, minTimeToShow=0.0)
1100
1128
  modelXbrl.modelManager.showStatus(None)
1101
1129
 
@@ -42,6 +42,7 @@
42
42
  ],
43
43
  "comment": "default parameters where not specified by authority",
44
44
  "reportPackageMaxMB": null,
45
+ "reportPackageExtensionTaxonomyDirectoryPrefix": null,
45
46
  "identiferScheme": "http://standards.iso.org/iso/17442",
46
47
  "ixTargetUsage": "warning",
47
48
  "extensionAbstractContexts": "warning",
@@ -171,6 +172,7 @@
171
172
  },
172
173
  "DBA": {
173
174
  "name": "Danish Business Authority",
175
+ "reportPackageExtensionTaxonomyDirectoryPrefix": "xbrl.",
174
176
  "reportPackageMaxMB": "2000",
175
177
  "reportPackageMeasurement": "unzipped",
176
178
  "ixTargetUsage": "allowed",
@@ -1785,17 +1785,15 @@ def rule_nl_kvk_6_1_1_1(
1785
1785
  """
1786
1786
  NL-KVK.6.1.1.1: The size of the report package MUST NOT exceed 100 MB.
1787
1787
  """
1788
- if val.modelXbrl.fileSource.fs and isinstance(val.modelXbrl.fileSource.fs, zipfile.ZipFile):
1789
- maxMB = float(MAX_REPORT_PACKAGE_SIZE_MBS)
1790
- # The following code computes report package size by adding the compressed file sizes within the package.
1791
- # This method of computation is over 99% accurate and gets more accurate the larger the filesize is.
1792
- _size = sum(zi.compress_size for zi in val.modelXbrl.fileSource.fs.infolist())
1793
- if _size > maxMB * 1000000:
1794
- yield Validation.error(
1795
- codes='NL.NL-KVK.6.1.1.1.reportPackageMaximumSizeExceeded',
1796
- msg=_('The size of the report package must not exceed %(maxSize)s MBs, size is %(size)s MBs.'),
1797
- modelObject=val.modelXbrl, maxSize=MAX_REPORT_PACKAGE_SIZE_MBS, size=int(_size/1000000)
1798
- )
1788
+ size = val.modelXbrl.fileSource.getBytesSize()
1789
+ if size is None:
1790
+ return # File size is not available, cannot validate
1791
+ if size > MAX_REPORT_PACKAGE_SIZE_MBS * 1_000_000: # Interpretting MB as megabytes (1,000,000 bytes)
1792
+ yield Validation.error(
1793
+ codes='NL.NL-KVK.6.1.1.1.reportPackageMaximumSizeExceeded',
1794
+ msg=_('The size of the report package must not exceed %(maxSize)s MBs, size is %(size)s MBs.'),
1795
+ modelObject=val.modelXbrl, maxSize=MAX_REPORT_PACKAGE_SIZE_MBS, size=int(size/1000000)
1796
+ )
1799
1797
 
1800
1798
 
1801
1799
  @validation(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.32
3
+ Version: 2.37.34
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License-Expression: Apache-2.0
@@ -1,11 +1,11 @@
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=uCpv_MaDGwMX1A3EZdN5h678aDaI0MTgRCQwOEKlimY,90250
4
+ arelle/CntlrCmdLine.py,sha256=tSbTlREbJkppAZ9HlB_99KpDKx3EwWBV9veWnXg6hVQ,90155
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
- arelle/CntlrWebMain.py,sha256=x5vtiopqGdp6L5s7PrUTEABXCGqtb5oy7yqWIVePtgE,50860
8
+ arelle/CntlrWebMain.py,sha256=_jhosP0Pg-erutBRzTVsL0cmWVgbc6z0WIIlNO-z1N4,50712
9
9
  arelle/CntlrWinMain.py,sha256=53lRaGTh8-4vG-hpuNVkxUhFa60u0jIHM9WvFdwdv-o,97273
10
10
  arelle/CntlrWinTooltip.py,sha256=6MzoAIfkYnNu_bl_je8n0adhwmKxAIcymkg9Tij9Z4M,7951
11
11
  arelle/DialogAbout.py,sha256=XXzMV0fO4BQ3-l1Puirzmn7EZEdmgJg7JNYdJm1FueM,1987
@@ -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=g3XXMjuyKJk2eoqvHGqoyIs2bMfcODwOeISDRCcY9gc,24749
24
- arelle/FileSource.py,sha256=OHWArRo30BfqC4vmNsSsUVOjRXvhDGlW4EVmE5uG9ZM,46652
23
+ arelle/DisclosureSystem.py,sha256=mQlz8eezPpJuG6gHBV-x4-5Hne3LVh8TQf-Qm9jiFxI,24757
24
+ arelle/FileSource.py,sha256=S19Rll9CoRPZ2zJCAlNHv1jt2UUfiLbSgI2tDdJq5Xc,47899
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
@@ -114,7 +114,7 @@ arelle/ViewWinVersReport.py,sha256=aYfsOgynVZpMzl6f2EzQCBLzdihYGycwb5SiTghkgMQ,9
114
114
  arelle/ViewWinXml.py,sha256=4ZGKtjaoCwU9etKYm9ZAS7jSmUxba1rqNEdv0OIyjTY,1250
115
115
  arelle/WatchRss.py,sha256=5Ih4igH2MM4hpOuAXy9eO0QAyZ7jZR3S5bPzo2sdFpw,14097
116
116
  arelle/WebCache.py,sha256=HlF4vfjxO0bSFHqMPfjnmkrzc7RK9XT714a7g3XFTDY,45192
117
- arelle/XbrlConst.py,sha256=gKYJECjuOEn0z0RRAaHpVCqh2NnBMfPLGxoLohYGGH4,57657
117
+ arelle/XbrlConst.py,sha256=k-cingAiunkqPd7YkFMgF6y5syj9GRWP84DTK2aDrCY,57935
118
118
  arelle/XbrlUtil.py,sha256=s2Vmrh-sZI5TeuqsziKignOc3ao-uUgnCNoelP4dDj0,9212
119
119
  arelle/XhtmlValidate.py,sha256=0gtm7N-kXK0RB5o3c1AQXjfFuRp1w2fKZZAeyruNANw,5727
120
120
  arelle/XmlUtil.py,sha256=1VToOOylF8kbEorEdZLThmq35j9bmuF_DS2q9NthnHU,58774
@@ -123,9 +123,9 @@ 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=m-gO1caTwfeHVfdBB-QTMwoN7CB9yG_i_tAd7ghMNoo,515
126
+ arelle/_version.py,sha256=UdKRHaB3pyxyxupZQ1MDG4KdlqxGBWeWxgwroLH2N_g,515
127
127
  arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
128
- arelle/api/Session.py,sha256=5KPjCIPiNuanKrz1MdFdKIx8Bg40Pk9sf2cL9OU4x-E,7770
128
+ arelle/api/Session.py,sha256=27HVuK3Bz1_21l4_RLn1IQg6v0MNsUEYrHajymyWwxI,7429
129
129
  arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
130
130
  arelle/archive/LoadEFMvalidate.py,sha256=HR1ZJmOvWGUlWEsWd0tGCa2TTtZSNzeL6tgN1TFfrl0,986
131
131
  arelle/archive/LoadSavePreLbCsv.py,sha256=mekr1R6OE5d3xdUCZIVfSeolyet0HO8R6wsHnW4eyaA,767
@@ -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=kqKvs3q6VE6fKxCv9X0kxnyTywKMyC_qGGAB__v51TU,182910
297
+ arelle/oim/Load.py,sha256=jLDidnntV78Pwzw0MvOLWSHXC8QxDkHO41TrdmsQuOQ,182874
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
@@ -394,24 +394,28 @@ arelle/plugin/validate/EBA/__init__.py,sha256=1kW-04W32sStSAL8wvW1ZpXnjlFv6KLbfE
394
394
  arelle/plugin/validate/EBA/config.xml,sha256=37wMVUAObK-XEqakqD8zPNog20emYt4a_yfL1AKubF8,2022
395
395
  arelle/plugin/validate/EDINET/DisclosureSystems.py,sha256=3rKG42Eg-17Xx_KXU_V5yHW6I3LTwQunvf4a44C9k_4,36
396
396
  arelle/plugin/validate/EDINET/FormType.py,sha256=pJfKjdjqFcRLFgH6xbEixvpwatZBBHI8uI3xjjhaPI0,3175
397
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=jW4BcDJnedzy-D2rOPq8p_rIAmJIEcgC0tiStjbygAA,4894
397
+ arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=VSSffANEC5kuvLC54pWYQ7w8fuSKo5LGdiuZ3NwWktg,5061
398
398
  arelle/plugin/validate/EDINET/ValidationPluginExtension.py,sha256=HIGOpBOyuVs5SEh573M3IzdouRdEuNIBkdumieZi8r0,959
399
- arelle/plugin/validate/EDINET/__init__.py,sha256=1kJUaV2AbNZdakKSa_v3opdyCRKO3gva62RpHVOrpIE,4398
400
- arelle/plugin/validate/EDINET/resources/config.xml,sha256=7uxn_HZT3USgbs2GQkew-dCUzlEgUGs62PiqEfljPgk,514
399
+ arelle/plugin/validate/EDINET/__init__.py,sha256=7Z3IdTdx0OdSm65jYYeRx_0B_zSvUKQubgXpa76OlvA,5164
400
+ arelle/plugin/validate/EDINET/resources/config.xml,sha256=GmLcW7UIj5koXJkN19P6Nq5EZJcs6gKQLQ5f2V6u78w,614
401
+ arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml,sha256=997I3RGTLg5OY3vn5hQxVFAAxOmDSOYpuyQe6VnWSY0,16285
401
402
  arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
402
- arelle/plugin/validate/EDINET/rules/upload.py,sha256=KehSxCyqC9aujaPYucK4b5VpXmjT7L6Gz_D0u82w6GY,17096
403
+ arelle/plugin/validate/EDINET/rules/edinet.py,sha256=hm5T8PiQbOKP58BiSV9UFvKQX10uNBpxUZ06ORSU1cE,2117
404
+ arelle/plugin/validate/EDINET/rules/frta.py,sha256=l7BQHOenDjYrpCX6bsXyUHgyvkjbfvJWfbpBthCHmBI,1713
405
+ arelle/plugin/validate/EDINET/rules/gfm.py,sha256=rj1ylvRIoauyzlEW1z1UxOkgO6fzvoMl5myRKkEZzY4,3295
406
+ arelle/plugin/validate/EDINET/rules/upload.py,sha256=sZFDSRWukJZEEBfg_RsG1q3Qw1IHhD0LZjl9LL1i9Ao,17048
403
407
  arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
404
408
  arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
405
409
  arelle/plugin/validate/ESEF/Util.py,sha256=QH3btcGqBpr42M7WSKZLSdNXygZaZLfEiEjlxoG21jE,7950
406
410
  arelle/plugin/validate/ESEF/__init__.py,sha256=LL7uYOcGPHgjwTlcfW2oWMqWiqrZ5yABzcKkJZFrZis,20391
407
411
  arelle/plugin/validate/ESEF/ESEF_2021/DTS.py,sha256=6Za7BANwwc_egxLCgbgWzwUGOXZv9IF1I7JCkDNt2Tw,26277
408
412
  arelle/plugin/validate/ESEF/ESEF_2021/Image.py,sha256=4bnhuy5viBU0viPjb4FhcRRjVVKlNdnKLFdSGg3sZvs,4871
409
- arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py,sha256=l4Nl-QuYJlM4WDpg87YjTwMUh05VP7tNq86gLFhWHyE,63380
413
+ arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py,sha256=Oh_Qy2Shug3wN1-uwct0BCnuNe36RoCQvLEJxdmE1HY,63941
410
414
  arelle/plugin/validate/ESEF/ESEF_2021/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
411
415
  arelle/plugin/validate/ESEF/ESEF_Current/DTS.py,sha256=epp-PBh1NJzQqgxUE6C468HmoDc2w3j54rMwfiOAry4,29334
412
- arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=tGoQSorcO-lhuL37aqrfSDBBRtsMyHQuwILAiFbzwHs,73769
416
+ arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=XMFlRc9X-dwMkyaEMWxmNWnTRBlFjzpA8JsyMWknzvs,75251
413
417
  arelle/plugin/validate/ESEF/ESEF_Current/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
414
- arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=JriLZ45KmUYlQiPbXJCAahobqdrst64Ay77bofZhB5Q,14940
418
+ arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=ou4Hd7P237vSmck0MMLdNvN9J4DzzWawbDmrRnsIj-4,15069
415
419
  arelle/plugin/validate/ESEF/resources/config.xml,sha256=t3STU_-QYM7Ay8YwZRPapnohiWVWhjfr4L2Rjx9xN9U,3902
416
420
  arelle/plugin/validate/FERC/__init__.py,sha256=V4fXcFKBsjFFPs9_1NhvDjWpEQCoQM0tRQMS0I1Ua7U,11462
417
421
  arelle/plugin/validate/FERC/config.xml,sha256=bn9b8eCqJA1J62rYq1Nz85wJrMGAahVmmnIUQZyerjo,1919
@@ -427,7 +431,7 @@ arelle/plugin/validate/NL/rules/br_kvk.py,sha256=0SwKieWzTDm3YMsXPS6zTdgbk7_Z9Cz
427
431
  arelle/plugin/validate/NL/rules/fg_nl.py,sha256=4Puq5wAjtK_iNd4wisH_R0Z_EKJ7MT2OCai5g4t1MPE,10714
428
432
  arelle/plugin/validate/NL/rules/fr_kvk.py,sha256=kYqXt45S6eM32Yg9ii7pUhOMfJaHurgYqQ73FyQALs8,8171
429
433
  arelle/plugin/validate/NL/rules/fr_nl.py,sha256=-M1WtXp06khhtkfOVPCa-b8UbC281gk4YfDhvtAVlnI,31424
430
- arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=oDEFuHtrTsHyTFncJ0haWYifNxr6LcQ7Q4JDm0cUxWQ,90426
434
+ arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=WW56HvQNSAqGOkPKTAFSuzZEXz-ECAYKvJlNKvZmsKM,90151
431
435
  arelle/plugin/validate/ROS/DisclosureSystems.py,sha256=rJ81mwQDYTi6JecFZ_zhqjjz3VNQRgjHNSh0wcQWAQE,18
432
436
  arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=IV7ILhNvgKwQXqbpSA6HRNt9kEnejCyMADI3wyyIgk0,4036
433
437
  arelle/plugin/validate/ROS/ValidationPluginExtension.py,sha256=FBhEp8t396vGdvCbMEimfcxmGiGnhXMen-yVLWnkFaI,758
@@ -750,9 +754,9 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
750
754
  arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
751
755
  arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
752
756
  arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
753
- arelle_release-2.37.32.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
754
- arelle_release-2.37.32.dist-info/METADATA,sha256=iMCJccDRHFwxm12EgJp0s1_-vKC9Z77dQUKe1Pc5MzQ,9137
755
- arelle_release-2.37.32.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
756
- arelle_release-2.37.32.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
757
- arelle_release-2.37.32.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
758
- arelle_release-2.37.32.dist-info/RECORD,,
757
+ arelle_release-2.37.34.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
758
+ arelle_release-2.37.34.dist-info/METADATA,sha256=580O6L8VeM_RIhUWVmkF7s_ifRMpg3mYX3e_8G3u33I,9137
759
+ arelle_release-2.37.34.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
760
+ arelle_release-2.37.34.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
761
+ arelle_release-2.37.34.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
762
+ arelle_release-2.37.34.dist-info/RECORD,,