arelle-release 2.17.1__py3-none-any.whl → 2.37.71__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.
- arelle/Aspect.py +6 -3
- arelle/BetaFeatures.py +3 -0
- arelle/Cntlr.py +117 -413
- arelle/CntlrCmdLine.py +364 -227
- arelle/CntlrQuickBooks.py +4 -2
- arelle/CntlrWebMain.py +179 -119
- arelle/CntlrWinMain.py +342 -124
- arelle/DialogAbout.py +1 -1
- arelle/DialogArcroleGroup.py +1 -1
- arelle/DialogFind.py +1 -1
- arelle/DialogFormulaParameters.py +2 -2
- arelle/DialogLanguage.py +45 -36
- arelle/DialogNewFactItem.py +1 -1
- arelle/DialogOpenArchive.py +30 -34
- arelle/DialogPackageManager.py +11 -8
- arelle/DialogPluginManager.py +43 -89
- arelle/DialogRssWatch.py +2 -2
- arelle/DialogURL.py +1 -1
- arelle/DialogUserPassword.py +1 -1
- arelle/DisclosureSystem.py +69 -1
- arelle/ErrorManager.py +321 -0
- arelle/FileSource.py +201 -99
- arelle/FunctionFn.py +44 -5
- arelle/FunctionIxt.py +16 -13
- arelle/FunctionUtil.py +1 -1
- arelle/FunctionXfi.py +68 -24
- arelle/FunctionXs.py +1 -1
- arelle/HtmlUtil.py +5 -4
- arelle/LeiUtil.py +63 -43
- arelle/LinkbaseType.py +94 -0
- arelle/LocalViewer.py +8 -2
- arelle/Locale.py +239 -79
- arelle/ModelDocument.py +180 -48
- arelle/ModelDtsObject.py +32 -27
- arelle/ModelFormulaObject.py +14 -6
- arelle/ModelInstanceObject.py +43 -14
- arelle/ModelManager.py +6 -1
- arelle/ModelObject.py +12 -8
- arelle/ModelObjectFactory.py +18 -2
- arelle/ModelRelationshipSet.py +46 -3
- arelle/ModelRenderingObject.py +899 -951
- arelle/ModelRssItem.py +2 -4
- arelle/ModelTestcaseObject.py +41 -4
- arelle/ModelValue.py +42 -14
- arelle/ModelVersReport.py +1 -1
- arelle/ModelXbrl.py +133 -273
- arelle/PackageManager.py +202 -176
- arelle/PluginManager.py +551 -239
- arelle/PluginUtils.py +54 -0
- arelle/PrototypeInstanceObject.py +53 -12
- arelle/PythonUtil.py +166 -25
- arelle/RuntimeOptions.py +32 -18
- arelle/SocketUtils.py +3 -0
- arelle/SystemInfo.py +1 -1
- arelle/TkTableWrapper.py +33 -5
- arelle/UITkTable.py +27 -21
- arelle/Updater.py +7 -3
- arelle/UrlUtil.py +6 -2
- arelle/Validate.py +596 -402
- arelle/ValidateDuplicateFacts.py +584 -0
- arelle/ValidateFileSource.py +38 -0
- arelle/ValidateFilingText.py +46 -29
- arelle/ValidateInfoset.py +104 -32
- arelle/ValidateUtr.py +31 -4
- arelle/ValidateXbrl.py +144 -120
- arelle/ValidateXbrlCalcs.py +51 -66
- arelle/ValidateXbrlDTS.py +98 -29
- arelle/Version.py +2 -7
- arelle/ViewFile.py +2 -0
- arelle/ViewFileDTS.py +7 -2
- arelle/ViewFileFactList.py +1 -1
- arelle/ViewFileFactTable.py +4 -4
- arelle/ViewFileRelationshipSet.py +36 -19
- arelle/ViewFileRenderedGrid.py +164 -753
- arelle/ViewFileRenderedLayout.py +174 -0
- arelle/ViewFileRenderedStructure.py +108 -0
- arelle/ViewWinDTS.py +4 -1
- arelle/ViewWinFactList.py +1 -1
- arelle/ViewWinFactTable.py +1 -1
- arelle/ViewWinRelationshipSet.py +14 -8
- arelle/ViewWinRenderedGrid.py +397 -287
- arelle/ViewWinRssFeed.py +4 -0
- arelle/ViewWinTree.py +15 -9
- arelle/ViewWinXml.py +1 -1
- arelle/WebCache.py +510 -272
- arelle/XbrlConst.py +202 -196
- arelle/XbrlUtil.py +2 -1
- arelle/XhtmlValidate.py +9 -23
- arelle/XmlUtil.py +24 -19
- arelle/XmlValidate.py +95 -67
- arelle/XmlValidateParticles.py +4 -4
- arelle/_version.py +33 -3
- arelle/api/Session.py +183 -0
- arelle/config/creationSoftwareNames.json +24 -10
- arelle/config/disclosuresystems.xml +1 -1
- arelle/config/disclosuresystems.xsd +3 -0
- arelle/config/sbr-text-formatting.xsd +737 -0
- arelle/conformance/CSVTestcaseLoader.py +102 -0
- arelle/formula/FactAspectsCache.py +10 -4
- arelle/formula/ValidateFormula.py +82 -194
- arelle/formula/XPathContext.py +42 -28
- arelle/formula/XPathParser.py +15 -9
- arelle/locale/ar_EG/LC_MESSAGES/ar_EG.po +3 -4
- arelle/locale/messages.pot +1 -2
- arelle/locale/ru/LC_MESSAGES/ru.po +2 -2
- arelle/logging/formatters/LogFormatter.py +47 -0
- arelle/logging/handlers/LogHandlerWithXml.py +94 -0
- arelle/logging/handlers/LogToBufferHandler.py +20 -0
- arelle/logging/handlers/LogToPrintHandler.py +41 -0
- arelle/logging/handlers/LogToXmlHandler.py +244 -0
- arelle/logging/handlers/StructuredMessageLogHandler.py +74 -0
- arelle/model/CommentBase.py +3 -0
- arelle/model/ElementBase.py +3 -0
- arelle/model/PIBase.py +3 -0
- arelle/model/__init__.py +3 -0
- arelle/oim/Load.py +2869 -0
- arelle/oim/Validate.py +155 -0
- arelle/oim/xml/Save.py +21 -0
- arelle/packages/PackageConst.py +7 -0
- arelle/packages/PackageType.py +13 -0
- arelle/packages/PackageUtils.py +22 -0
- arelle/packages/PackageValidation.py +200 -0
- arelle/packages/report/DetectReportPackage.py +13 -0
- arelle/packages/report/ReportPackage.py +265 -0
- arelle/packages/report/ReportPackageConst.py +79 -0
- arelle/packages/report/ReportPackageValidator.py +207 -0
- arelle/plugin/EdgarRendererAllReports.py +12 -12
- arelle/plugin/OimTaxonomy/ModelValueMore.py +15 -0
- arelle/plugin/OimTaxonomy/ValidateDTS.py +484 -0
- arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +239 -0
- arelle/plugin/OimTaxonomy/XbrlAbstract.py +16 -0
- arelle/plugin/OimTaxonomy/XbrlConcept.py +68 -0
- arelle/plugin/OimTaxonomy/XbrlConst.py +261 -0
- arelle/plugin/OimTaxonomy/XbrlCube.py +91 -0
- arelle/plugin/OimTaxonomy/XbrlDimension.py +38 -0
- arelle/plugin/OimTaxonomy/XbrlDts.py +152 -0
- arelle/plugin/OimTaxonomy/XbrlEntity.py +16 -0
- arelle/plugin/OimTaxonomy/XbrlGroup.py +22 -0
- arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +22 -0
- arelle/plugin/OimTaxonomy/XbrlLabel.py +31 -0
- arelle/plugin/OimTaxonomy/XbrlNetwork.py +100 -0
- arelle/plugin/OimTaxonomy/XbrlProperty.py +28 -0
- arelle/plugin/OimTaxonomy/XbrlReference.py +33 -0
- arelle/plugin/OimTaxonomy/XbrlReport.py +24 -0
- arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +35 -0
- arelle/plugin/OimTaxonomy/XbrlTaxonomy.py +93 -0
- arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py +154 -0
- arelle/plugin/OimTaxonomy/XbrlTransform.py +17 -0
- arelle/plugin/OimTaxonomy/XbrlTypes.py +23 -0
- arelle/plugin/OimTaxonomy/XbrlUnit.py +17 -0
- arelle/plugin/OimTaxonomy/__init__.py +1037 -0
- arelle/plugin/OimTaxonomy/resources/iso4217.json +4479 -0
- arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json +935 -0
- arelle/plugin/OimTaxonomy/resources/ref.json +333 -0
- arelle/plugin/OimTaxonomy/resources/transform-types.json +2481 -0
- arelle/plugin/OimTaxonomy/resources/types.json +727 -0
- arelle/plugin/OimTaxonomy/resources/utr.json +3046 -0
- arelle/plugin/OimTaxonomy/resources/xbrlSpec.json +1082 -0
- arelle/plugin/formulaLoader.py +3 -3
- arelle/plugin/formulaSaver.py +4 -4
- arelle/plugin/inlineXbrlDocumentSet.py +331 -102
- arelle/plugin/internet/proxyNTLM/HTTPNtlmAuthHandler.py +1 -1
- arelle/plugin/loadFromExcel.py +13 -10
- arelle/plugin/loadFromOIM.py +16 -3096
- arelle/plugin/logging/saveMessages.py +1 -1
- arelle/plugin/saveHtmlEBAtables.py +293 -213
- arelle/plugin/saveLoadableOIM.py +652 -361
- arelle/plugin/saveOIMTaxonomy.py +311 -0
- arelle/plugin/streamingExtensions.py +1 -1
- arelle/plugin/systemInfo.py +46 -0
- arelle/plugin/transforms/tester.py +4 -4
- arelle/plugin/validate/CIPC/Const.py +18 -0
- arelle/plugin/validate/CIPC/__init__.py +34 -13
- arelle/plugin/validate/DBA/DisclosureSystems.py +12 -0
- arelle/plugin/validate/DBA/PluginValidationDataExtension.py +165 -0
- arelle/plugin/validate/DBA/ValidationPluginExtension.py +545 -0
- arelle/plugin/validate/DBA/__init__.py +49 -0
- arelle/plugin/validate/DBA/resources/config.xml +21 -0
- arelle/plugin/validate/DBA/rules/__init__.py +323 -0
- arelle/plugin/validate/DBA/rules/fr.py +1377 -0
- arelle/plugin/validate/DBA/rules/tc.py +45 -0
- arelle/plugin/validate/DBA/rules/th.py +172 -0
- arelle/plugin/validate/DBA/rules/tm.py +351 -0
- arelle/plugin/validate/DBA/rules/tr.py +373 -0
- arelle/plugin/validate/EBA/__init__.py +11 -12
- arelle/plugin/validate/EDINET/Constants.py +208 -0
- arelle/plugin/validate/EDINET/ContextRequirement.py +58 -0
- arelle/plugin/validate/EDINET/ControllerPluginData.py +298 -0
- arelle/plugin/validate/EDINET/CoverItemRequirements.py +42 -0
- arelle/plugin/validate/EDINET/DeiRequirements.py +118 -0
- arelle/plugin/validate/EDINET/DisclosureSystems.py +1 -0
- arelle/plugin/validate/EDINET/FilingFormat.py +275 -0
- arelle/plugin/validate/EDINET/FormType.py +134 -0
- arelle/plugin/validate/EDINET/ManifestInstance.py +236 -0
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +640 -0
- arelle/plugin/validate/EDINET/ReportFolderType.py +162 -0
- arelle/plugin/validate/EDINET/Statement.py +139 -0
- arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +493 -0
- arelle/plugin/validate/EDINET/UploadContents.py +48 -0
- arelle/plugin/validate/EDINET/ValidationPluginExtension.py +64 -0
- arelle/plugin/validate/EDINET/__init__.py +109 -0
- arelle/plugin/validate/EDINET/resources/config.xml +22 -0
- arelle/plugin/validate/EDINET/resources/cover-item-requirements.json +793 -0
- arelle/plugin/validate/EDINET/resources/dei-requirements.csv +27 -0
- arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +62 -0
- arelle/plugin/validate/EDINET/rules/contexts.py +547 -0
- arelle/plugin/validate/EDINET/rules/edinet.py +1991 -0
- arelle/plugin/validate/EDINET/rules/frta.py +301 -0
- arelle/plugin/validate/EDINET/rules/gfm.py +2394 -0
- arelle/plugin/validate/EDINET/rules/manifests.py +88 -0
- arelle/plugin/validate/EDINET/rules/upload.py +1370 -0
- arelle/plugin/validate/ESEF/Const.py +16 -75
- arelle/plugin/validate/ESEF/Dimensions.py +2 -2
- arelle/plugin/validate/ESEF/ESEF_2021/DTS.py +6 -1
- arelle/plugin/validate/ESEF/ESEF_2021/Image.py +7 -4
- arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +80 -57
- arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +60 -22
- arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +272 -133
- arelle/plugin/validate/ESEF/Util.py +5 -19
- arelle/plugin/validate/ESEF/__init__.py +61 -46
- arelle/plugin/validate/ESEF/resources/authority-validations.json +120 -10
- arelle/plugin/validate/ESEF/resources/config.xml +44 -3
- arelle/plugin/validate/FERC/__init__.py +31 -18
- arelle/plugin/validate/FERC/config.xml +18 -18
- arelle/plugin/validate/NL/DisclosureSystems.py +19 -3
- arelle/plugin/validate/NL/PluginValidationDataExtension.py +710 -7
- arelle/plugin/validate/NL/ValidationPluginExtension.py +117 -12
- arelle/plugin/validate/NL/__init__.py +21 -10
- arelle/plugin/validate/NL/resources/config.xml +27 -6
- arelle/plugin/validate/NL/rules/br_kvk.py +81 -21
- arelle/plugin/validate/NL/rules/fg_nl.py +292 -0
- arelle/plugin/validate/NL/rules/fr_kvk.py +60 -7
- arelle/plugin/validate/NL/rules/fr_nl.py +705 -24
- arelle/plugin/validate/NL/rules/nl_kvk.py +2182 -0
- arelle/plugin/validate/ROS/DisclosureSystems.py +1 -0
- arelle/plugin/validate/ROS/PluginValidationDataExtension.py +109 -0
- arelle/plugin/validate/ROS/ValidationPluginExtension.py +27 -0
- arelle/plugin/validate/ROS/__init__.py +28 -341
- arelle/plugin/validate/ROS/resources/config.xml +20 -0
- arelle/plugin/validate/ROS/rules/__init__.py +56 -0
- arelle/plugin/validate/ROS/rules/ros.py +393 -0
- arelle/plugin/validate/UK/ValidateUK.py +1372 -0
- arelle/plugin/validate/{HMRC → UK}/__init__.py +195 -189
- arelle/plugin/validate/{HMRC → UK}/config.xml +1 -1
- arelle/plugin/xbrlDB/SqlDb.py +1 -1
- arelle/plugin/xbrlDB/XbrlOpenSqlDB.py +5 -5
- arelle/plugin/xbrlDB/XbrlPublicPostgresDB.py +1 -1
- arelle/plugin/xbrlDB/XbrlSemanticJsonDB.py +1 -1
- arelle/plugin/xbrlDB/XbrlSemanticRdfDB.py +1 -1
- arelle/plugin/xbrlDB/__init__.py +4 -1
- arelle/{RenderingEvaluator.py → rendering/RenderingEvaluator.py} +120 -99
- arelle/rendering/RenderingLayout.py +476 -0
- arelle/rendering/RenderingResolution.py +814 -0
- arelle/resources/cache/http/www.eurofiling.info/eu/fr/xbrl/ext/filing-indicators.xsd +20 -0
- arelle/resources/cache/http/www.w3.org/2001/03/xml.xsd +117 -0
- arelle/resources/cache/http/www.w3.org/2001/XMLSchema.xsd +2534 -0
- arelle/resources/cache/http/www.w3.org/2001/xml.xsd +287 -0
- arelle/resources/cache/http/www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd +779 -0
- arelle/resources/cache/http/www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd +486 -0
- arelle/resources/cache/http/www.xbrl.org/2003/xl-2003-12-31.xsd +251 -0
- arelle/resources/cache/http/www.xbrl.org/2003/xlink-2003-12-31.xsd +121 -0
- arelle/resources/cache/http/www.xbrl.org/2004/ref-2004-08-10.xsd +129 -0
- arelle/resources/cache/http/www.xbrl.org/2005/xbrldt-2005.xsd +53 -0
- arelle/resources/cache/http/www.xbrl.org/2006/ref-2006-02-27.xsd +120 -0
- arelle/resources/cache/http/www.xbrl.org/2006/xbrldi-2006.xsd +41 -0
- arelle/resources/cache/http/www.xbrl.org/2008/boolean-filter.xsd +51 -0
- arelle/resources/cache/http/www.xbrl.org/2008/concept-filter.xsd +127 -0
- arelle/resources/cache/http/www.xbrl.org/2008/conformance.xsd +116 -0
- arelle/resources/cache/http/www.xbrl.org/2008/conformanceFunction.xsd +51 -0
- arelle/resources/cache/http/www.xbrl.org/2008/consistency-assertion.xsd +66 -0
- arelle/resources/cache/http/www.xbrl.org/2008/dimension-filter.xsd +86 -0
- arelle/resources/cache/http/www.xbrl.org/2008/entity-filter.xsd +92 -0
- arelle/resources/cache/http/www.xbrl.org/2008/existence-assertion.xsd +44 -0
- arelle/resources/cache/http/www.xbrl.org/2008/formula.xsd +261 -0
- arelle/resources/cache/http/www.xbrl.org/2008/function.xsd +90 -0
- arelle/resources/cache/http/www.xbrl.org/2008/general-filter.xsd +38 -0
- arelle/resources/cache/http/www.xbrl.org/2008/generic-label.xsd +80 -0
- arelle/resources/cache/http/www.xbrl.org/2008/generic-link.xsd +81 -0
- arelle/resources/cache/http/www.xbrl.org/2008/generic-reference.xsd +63 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xl-2003-12-31.xsd +248 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xlink-2003-12-31.xsd +117 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xframes-1.xsd +166 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-applet-1.xsd +66 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-attribs-1.xsd +72 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-base-1.xsd +36 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-form-1.xsd +195 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-table-1.xsd +169 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-model-1.xsd +376 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-modules-1.xsd +259 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10.xsd +98 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-bdo-1.xsd +78 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkphras-1.xsd +161 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkpres-1.xsd +37 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkstruct-1.xsd +49 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-charent-1.xsd +38 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-copyright-1.xsd +29 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-csismap-1.xsd +96 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-datatypes-1.xsd +128 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-edit-1.xsd +39 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-events-1.xsd +130 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-form-1.xsd +326 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-frames-1.xsd +113 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-framework-1.xsd +66 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-hypertext-1.xsd +47 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-iframe-1.xsd +68 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-image-1.xsd +45 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlphras-1.xsd +163 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlpres-1.xsd +39 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstruct-1.xsd +50 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstyle-1.xsd +27 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-legacy-1.xsd +97 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-link-1.xsd +45 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-list-1.xsd +99 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-meta-1.xsd +42 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-misc-1.xsd +441 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-nameident-1.xsd +63 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-notations-1.xsd +69 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-object-1.xsd +76 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-param-1.xsd +51 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-pres-1.xsd +51 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-1.xsd +171 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-basic-1.xsd +89 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-script-1.xsd +70 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ssismap-1.xsd +43 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-struct-1.xsd +112 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-style-1.xsd +52 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-table-1.xsd +272 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-target-1.xsd +53 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-text-1.xsd +67 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-model-1.xsd +677 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-module-redefines-1.xsd +335 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-modules-1.xsd +528 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11.xsd +104 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml2.xsd +21 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-1.xsd +73 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-2.xsd +74 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-1.xsd +73 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-2.xsd +75 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-1.xsd +34 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-2.xsd +34 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-handlers-2.xsd +98 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-definitions.xsd +225 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-model.xsd +681 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-modules.xsd +535 -0
- arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0.xsd +40 -0
- arelle/resources/cache/http/www.xbrl.org/2008/match-filter.xsd +94 -0
- arelle/resources/cache/http/www.xbrl.org/2008/period-filter.xsd +86 -0
- arelle/resources/cache/http/www.xbrl.org/2008/registry.xsd +145 -0
- arelle/resources/cache/http/www.xbrl.org/2008/relative-filter.xsd +38 -0
- arelle/resources/cache/http/www.xbrl.org/2008/segment-scenario-filter.xsd +41 -0
- arelle/resources/cache/http/www.xbrl.org/2008/tuple-filter.xsd +83 -0
- arelle/resources/cache/http/www.xbrl.org/2008/unit-filter.xsd +58 -0
- arelle/resources/cache/http/www.xbrl.org/2008/validation.xsd +78 -0
- arelle/resources/cache/http/www.xbrl.org/2008/value-assertion.xsd +43 -0
- arelle/resources/cache/http/www.xbrl.org/2008/value-filter.xsd +43 -0
- arelle/resources/cache/http/www.xbrl.org/2008/variable.xsd +240 -0
- arelle/resources/cache/http/www.xbrl.org/2010/aspect-cover-filter.xsd +67 -0
- arelle/resources/cache/http/www.xbrl.org/2010/concept-relation-filter.xsd +108 -0
- arelle/resources/cache/http/www.xbrl.org/2010/custom-function-implementation.xsd +71 -0
- arelle/resources/cache/http/www.xbrl.org/2010/generic-message.xsd +68 -0
- arelle/resources/cache/http/www.xbrl.org/2010/validation-message.xsd +50 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xl-2003-12-31.xsd +248 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xlink-2003-12-31.xsd +117 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xframes-1.xsd +166 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-applet-1.xsd +66 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-attribs-1.xsd +72 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-base-1.xsd +36 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-form-1.xsd +195 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-table-1.xsd +169 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-model-1.xsd +376 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-modules-1.xsd +259 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10.xsd +98 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-bdo-1.xsd +78 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkphras-1.xsd +161 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkpres-1.xsd +37 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkstruct-1.xsd +49 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-charent-1.xsd +38 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-copyright-1.xsd +29 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-csismap-1.xsd +96 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-datatypes-1.xsd +128 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-edit-1.xsd +39 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-events-1.xsd +130 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-form-1.xsd +326 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-frames-1.xsd +113 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-framework-1.xsd +66 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-hypertext-1.xsd +47 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-iframe-1.xsd +68 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-image-1.xsd +45 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlphras-1.xsd +163 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlpres-1.xsd +39 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstruct-1.xsd +50 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstyle-1.xsd +27 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-legacy-1.xsd +97 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-link-1.xsd +45 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-list-1.xsd +99 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-meta-1.xsd +42 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-misc-1.xsd +441 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-nameident-1.xsd +63 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-notations-1.xsd +69 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-object-1.xsd +76 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-param-1.xsd +51 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-pres-1.xsd +51 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-1.xsd +171 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-basic-1.xsd +89 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-script-1.xsd +70 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ssismap-1.xsd +43 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-struct-1.xsd +112 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-style-1.xsd +52 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-table-1.xsd +272 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-target-1.xsd +53 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-text-1.xsd +67 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-model-1.xsd +677 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-module-redefines-1.xsd +335 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-modules-1.xsd +528 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11.xsd +104 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml2.xsd +21 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-1.xsd +73 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-2.xsd +74 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-1.xsd +73 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-2.xsd +75 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-1.xsd +34 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-2.xsd +34 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-handlers-2.xsd +98 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-definitions.xsd +252 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-model.xsd +681 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-modules.xsd +535 -0
- arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1.xsd +40 -0
- arelle/resources/cache/http/www.xbrl.org/2013/match-filter.xsd +94 -0
- arelle/resources/cache/http/www.xbrl.org/2013/preferred-label.xsd +12 -0
- arelle/resources/cache/http/www.xbrl.org/2013/versioning-base.xsd +142 -0
- arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-details.xsd +143 -0
- arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-use.xsd +64 -0
- arelle/resources/cache/http/www.xbrl.org/2013/versioning-dimensions.xsd +162 -0
- arelle/resources/cache/http/www.xbrl.org/2014/extensible-enumerations.xsd +27 -0
- arelle/resources/cache/http/www.xbrl.org/2014/table.xsd +356 -0
- arelle/resources/cache/http/www.xbrl.org/2014/tablemodel.xsd +156 -0
- arelle/resources/cache/http/www.xbrl.org/2016/assertion-severity.xsd +29 -0
- arelle/resources/cache/http/www.xbrl.org/2016/severities.xml +21 -0
- arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package-catalog.xsd +38 -0
- arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package.xsd +154 -0
- arelle/resources/cache/http/www.xbrl.org/2022/assertion-severity.xsd +43 -0
- arelle/resources/cache/http/www.xbrl.org/2022/severities.xml +21 -0
- arelle/resources/cache/http/www.xbrl.org/dtr/type/nonNumeric-2009-12-16.xsd +76 -0
- arelle/resources/cache/http/www.xbrl.org/dtr/type/numeric-2009-12-16.xsd +78 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/accounting-arcrole-2023-01-04.xsd +39 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/deprecated-2009-12-16.xsd +29 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/esma-arcrole-2018-11-21.xsd +14 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/factExplanatory-2009-12-16.xsd +13 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/jpfr-arcrole-2007-11-07.xsd +27 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/parent-child-2013-09-19.xsd +12 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/role/deprecated-2009-12-16.xsd +17 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/role/jpfr-role-2007-11-07.xsd +47 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2008-03-31.xsd +30 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2009-12-16.xsd +33 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/role/negative-2009-12-16.xsd +25 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/role/net-2009-12-16.xsd +13 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/role/positive-2009-12-16.xsd +25 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/role/property-2022-09-28.xsd +15 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/role/reference-2009-12-16.xsd +21 -0
- arelle/resources/cache/http/www.xbrl.org/lrr/role/restated-2006-02-21.xsd +19 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2012-01-30/utr.xml +4543 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2012-10-31/utr.xml +4510 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2012-11-30/utr.xml +4567 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2013-02-28/utr.xml +5180 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2013-05-17/utr.xml +5349 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2016-08-10/utr.xml +5363 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2017-07-12/utr.xml +6164 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2021-02-16/utr.xml +6370 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2021-12-08/utr.xml +6493 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2022-02-16/utr.xml +6551 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2022-07-20/utr.xml +6638 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2023-12-20/utr.xml +6680 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2024-01-31/utr.xml +6680 -0
- arelle/resources/cache/http/www.xbrl.org/utr/2024-10-22/utr.xml +6693 -0
- arelle/resources/cache/http/www.xbrl.org/utr/utr.xml +6693 -0
- arelle/resources/cache/https/www.xbrl.org/2005/conformance.xsd +87 -0
- arelle/resources/cache/https/www.xbrl.org/2020/extensible-enumerations-2.0.xsd +51 -0
- arelle/resources/cache/https/www.xbrl.org/2023/calculation-1.1.xsd +27 -0
- arelle/resources/cache/https/www.xbrl.org/dtr/type/2020-01-21/types.xsd +812 -0
- arelle/resources/cache/https/www.xbrl.org/dtr/type/2022-03-31/types.xsd +847 -0
- arelle/resources/cache/https/www.xbrl.org/dtr/type/2024-01-31/types.xsd +897 -0
- arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-def.xml +68 -0
- arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-label.xml +84 -0
- arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators.xsd +67 -0
- arelle/resources/libs/Tktable2.11/linux-x86_64/README.txt +149 -0
- arelle/resources/libs/Tktable2.11/linux-x86_64/html/tkTable.html +2039 -0
- arelle/resources/libs/Tktable2.11/linux-x86_64/libTktable2.11.so +0 -0
- arelle/resources/libs/Tktable2.11/linux-x86_64/license.txt +51 -0
- arelle/resources/libs/Tktable2.11/linux-x86_64/pkgIndex.tcl +3 -0
- arelle/resources/libs/Tktable2.11/linux-x86_64/tkTable.tcl +825 -0
- arelle/resources/libs/Tktable2.11/linux-x86_64/tktable.py +674 -0
- arelle/resources/libs/Tktable2.11/macos-arm64/README.txt +149 -0
- arelle/resources/libs/Tktable2.11/macos-arm64/html/tkTable.html +2039 -0
- arelle/resources/libs/Tktable2.11/macos-arm64/libTktable2.11.dylib +0 -0
- arelle/resources/libs/Tktable2.11/macos-arm64/license.txt +51 -0
- arelle/resources/libs/Tktable2.11/macos-arm64/pkgIndex.tcl +2 -0
- arelle/resources/libs/Tktable2.11/macos-arm64/tkTable.tcl +825 -0
- arelle/resources/libs/Tktable2.11/macos-arm64/tktable.py +674 -0
- arelle/resources/libs/Tktable2.11/macos-x86_64/README.txt +149 -0
- arelle/resources/libs/Tktable2.11/macos-x86_64/html/tkTable.html +2039 -0
- arelle/resources/libs/Tktable2.11/macos-x86_64/libTktable2.11.dylib +0 -0
- arelle/resources/libs/Tktable2.11/macos-x86_64/license.txt +51 -0
- arelle/resources/libs/Tktable2.11/macos-x86_64/pkgIndex.tcl +2 -0
- arelle/resources/libs/Tktable2.11/macos-x86_64/tkTable.tcl +825 -0
- arelle/resources/libs/Tktable2.11/macos-x86_64/tktable.py +674 -0
- arelle/resources/libs/Tktable2.11/win-x86_64/Tktable.dll +0 -0
- arelle/resources/libs/Tktable2.11/win-x86_64/pkgIndex.tcl +2 -0
- arelle/resources/libs/Tktable2.11/win-x86_64/tkTable.tcl +825 -0
- arelle/typing.py +9 -4
- arelle/utils/Contexts.py +38 -0
- arelle/utils/EntryPointDetection.py +139 -0
- arelle/utils/Equivalence.py +22 -0
- arelle/utils/{validate/PluginValidationData.py → PluginData.py} +5 -2
- arelle/utils/PluginHooks.py +256 -5
- arelle/utils/Units.py +36 -0
- arelle/utils/validate/Decorator.py +5 -3
- arelle/utils/validate/DetectScriptsInXhtml.py +99 -0
- arelle/utils/validate/ESEFImage.py +283 -0
- arelle/utils/validate/Validation.py +9 -1
- arelle/utils/validate/ValidationPlugin.py +74 -11
- arelle/utils/validate/ValidationUtil.py +55 -0
- arelle/webserver/bottle.py +5 -4424
- {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/METADATA +51 -42
- arelle_release-2.37.71.dist-info/RECORD +697 -0
- {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/WHEEL +1 -1
- {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info/licenses}/LICENSE.md +1 -4
- {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/top_level.txt +0 -1
- arelle/DialogOpenTaxonomyPackage.py +0 -1
- arelle/RenderingResolver.py +0 -624
- arelle/examples/.pydevproject +0 -5
- arelle/examples/CustomLogger.py +0 -43
- arelle/examples/LoadEFMvalidate.py +0 -32
- arelle/examples/LoadSavePreLbCsv.py +0 -26
- arelle/examples/LoadValidate.cs +0 -31
- arelle/examples/LoadValidate.py +0 -36
- arelle/examples/LoadValidateCmdLine.java +0 -69
- arelle/examples/LoadValidatePostedZip.java +0 -57
- arelle/examples/LoadValidateWebService.java +0 -34
- arelle/examples/SaveTableToExelle.py +0 -140
- arelle/examples/TR3toTR4.py +0 -88
- arelle/examples/plugin/bigInstance.py +0 -394
- arelle/examples/plugin/cmdWebServerExtension.py +0 -42
- arelle/examples/plugin/crashTest.py +0 -38
- arelle/examples/plugin/formulaSuiteConverter.py +0 -212
- arelle/examples/plugin/functionsCustom.py +0 -59
- arelle/examples/plugin/hello_dolly.py +0 -64
- arelle/examples/plugin/hello_i18n.pot +0 -26
- arelle/examples/plugin/hello_i18n.py +0 -32
- arelle/examples/plugin/importTestChild1.py +0 -21
- arelle/examples/plugin/importTestChild2.py +0 -22
- arelle/examples/plugin/importTestGrandchild1.py +0 -21
- arelle/examples/plugin/importTestGrandchild2.py +0 -21
- arelle/examples/plugin/importTestImported1.py +0 -23
- arelle/examples/plugin/importTestImported11.py +0 -22
- arelle/examples/plugin/importTestParent.py +0 -48
- arelle/examples/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
- arelle/examples/plugin/packagedImportTest/__init__.py +0 -47
- arelle/examples/plugin/packagedImportTest/importTestChild1.py +0 -21
- arelle/examples/plugin/packagedImportTest/importTestChild2.py +0 -22
- arelle/examples/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
- arelle/examples/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
- arelle/examples/plugin/packagedImportTest/importTestImported1.py +0 -24
- arelle/examples/plugin/packagedImportTest/importTestImported11.py +0 -21
- arelle/examples/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
- arelle/examples/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
- arelle/examples/plugin/sakaCalendar.py +0 -215
- arelle/examples/plugin/saveInstanceInfoset.py +0 -121
- arelle/examples/plugin/streamingExtensions.py +0 -335
- arelle/examples/plugin/testcaseCalc11ValidateSetup.py +0 -32
- arelle/examples/plugin/testcaseIxExpectedHtmlFixup.py +0 -45
- arelle/examples/plugin/updateTableLB.py +0 -242
- arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
- arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
- arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
- arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
- arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
- arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -109
- arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -58
- arelle/examples/plugin/validateSchemaLxml.py +0 -156
- arelle/examples/plugin/validateTableInfoset.py +0 -52
- arelle/examples/us-gaap-dei-docType-extraction-frm.xml +0 -90
- arelle/examples/us-gaap-dei-ratio-cash-frm.xml +0 -150
- arelle/plugin/functionsXmlCreation.py +0 -106
- arelle/plugin/instanceInfo.py +0 -306
- arelle/plugin/loadFromOIM-2018.py +0 -1282
- arelle/plugin/objectmaker.py +0 -285
- arelle/plugin/sphinx/FormulaGenerator.py +0 -823
- arelle/plugin/sphinx/SphinxContext.py +0 -404
- arelle/plugin/sphinx/SphinxEvaluator.py +0 -783
- arelle/plugin/sphinx/SphinxMethods.py +0 -1287
- arelle/plugin/sphinx/SphinxParser.py +0 -1093
- arelle/plugin/sphinx/SphinxValidator.py +0 -163
- arelle/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
- arelle/plugin/sphinx/__init__.py +0 -285
- arelle/plugin/transforms/SEC/__init__.py +0 -308
- arelle/plugin/transforms/SEC/conf/README.md +0 -39
- arelle/plugin/transforms/SEC/conf/extractTestcase.sh +0 -2
- arelle/plugin/transforms/SEC/conf/extractTestcase.xsl +0 -109
- arelle/plugin/transforms/SEC/conf/runIxtSecTests.sh +0 -16
- arelle/plugin/transforms/SEC/conf/saxon9.jar +0 -0
- arelle/plugin/transforms/SEC/conf/testcase.xml +0 -7117
- arelle/plugin/transforms/SEC/conf/tests.xml +0 -848
- arelle/plugin/transforms/SEC/text2num.py +0 -110
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-boolballotbox.xml +0 -66
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-countrynameen.xml +0 -65
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-datequarterend.xml +0 -66
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durday.xml +0 -61
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durhour.xml +0 -69
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durmonth.xml +0 -71
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durweek.xml +0 -70
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durwordsen.xml +0 -56
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-duryear.xml +0 -64
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-edgarprovcountryen.xml +0 -65
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-entityfilercategoryen.xml +0 -63
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-exchnameen.xml +0 -86
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-numwordsen.xml +0 -55
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-stateprovnameen.xml +0 -64
- arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-yesnoballotbox.xml +0 -66
- arelle/plugin/transforms/SEC/transformationRegistry/registry/transform-registry.xml +0 -314
- arelle/plugin/transforms/SEC/transformationRegistry/schema/inlinexbrl-sec-transformation.xsd +0 -418
- arelle/plugin/validate/EFM/Consts.py +0 -362
- arelle/plugin/validate/EFM/DTS.py +0 -569
- arelle/plugin/validate/EFM/Dimensions.py +0 -264
- arelle/plugin/validate/EFM/Document.py +0 -206
- arelle/plugin/validate/EFM/Filing.py +0 -4383
- arelle/plugin/validate/EFM/IsolateSeparateIXDSes.py +0 -19
- arelle/plugin/validate/EFM/MessageNumericId.py +0 -142
- arelle/plugin/validate/EFM/PreCalAlignment.py +0 -324
- arelle/plugin/validate/EFM/Util.py +0 -688
- arelle/plugin/validate/EFM/__init__.py +0 -843
- arelle/plugin/validate/EFM/config.xml +0 -333
- arelle/plugin/validate/EFM/resources/README.md +0 -57
- arelle/plugin/validate/EFM/resources/axiswarnings.json +0 -27
- arelle/plugin/validate/EFM/resources/cef-deprecated-concepts.json +0 -8
- arelle/plugin/validate/EFM/resources/country-deprecated-concepts.json +0 -19
- arelle/plugin/validate/EFM/resources/currency-deprecated-concepts.json +0 -7
- arelle/plugin/validate/EFM/resources/dei-deprecated-concepts.json +0 -8
- arelle/plugin/validate/EFM/resources/dei-validations.json +0 -2884
- arelle/plugin/validate/EFM/resources/dqc-us-rules.json +0 -1389
- arelle/plugin/validate/EFM/resources/ecd-deprecated-concepts.json +0 -1
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-16-4.xml +0 -115
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-0-4.xml +0 -300
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-1.xml +0 -304
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-2.xml +0 -290
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-3-1.xml +0 -294
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.1.xml +0 -549
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.2.xml +0 -506
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.3.xml +0 -496
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-1.xml +0 -662
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-2.xml +0 -3761
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-3.xml +0 -3577
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-1.xml +0 -4020
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-2.xml +0 -3320
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-3.xml +0 -2998
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2012.xml +0 -957
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2013.xml +0 -982
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2014.xml +0 -1001
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2015.xml +0 -1076
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2016.xml +0 -120
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-1.xml +0 -3329
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-2.xml +0 -1230
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-3.xml +0 -1113
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-4.xml +0 -1321
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1-preview.xml +0 -1721
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1.xml +0 -1841
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2-2.xml +0 -1450
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2.xml +0 -1429
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-4.xml +0 -1527
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1-1.xml +0 -2049
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1.xml +0 -2065
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-2.xml +0 -1674
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-3.xml +0 -1715
- arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-all-years.xml +0 -10671
- arelle/plugin/validate/EFM/resources/edgartaxonomies/erxl.xsd +0 -69
- arelle/plugin/validate/EFM/resources/edgartaxonomies/extendedtaxonomies-all-years.xml +0 -18
- arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrs-taxonomies.xml +0 -3126
- arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrstaxonomies-all-years.xml +0 -22
- arelle/plugin/validate/EFM/resources/ex26-validations.json +0 -255
- arelle/plugin/validate/EFM/resources/exch-deprecated-concepts.json +0 -163
- arelle/plugin/validate/EFM/resources/ifrs-full-deprecated-concepts.json +0 -204
- arelle/plugin/validate/EFM/resources/invest-deprecated-concepts.json +0 -99
- arelle/plugin/validate/EFM/resources/ixbrl-transform-registries.json +0 -16
- arelle/plugin/validate/EFM/resources/naics-deprecated-concepts.json +0 -295
- arelle/plugin/validate/EFM/resources/oef-deprecated-concepts.json +0 -59
- arelle/plugin/validate/EFM/resources/other-standard-taxonomies.json +0 -12
- arelle/plugin/validate/EFM/resources/rr-deprecated-concepts.json +0 -14
- arelle/plugin/validate/EFM/resources/rxp-deprecated-concepts.json +0 -1
- arelle/plugin/validate/EFM/resources/shr-deprecated-concepts.json +0 -1
- arelle/plugin/validate/EFM/resources/sic-deprecated-concepts.json +0 -1
- arelle/plugin/validate/EFM/resources/signwarnings.json +0 -112
- arelle/plugin/validate/EFM/resources/srt-deprecated-concepts.json +0 -1
- arelle/plugin/validate/EFM/resources/stpr-deprecated-concepts.json +0 -1
- arelle/plugin/validate/EFM/resources/taxonomy-compatibility.json +0 -79
- arelle/plugin/validate/EFM/resources/us-gaap-deprecated-concepts.json +0 -2886
- arelle/plugin/validate/EFM/resources/us-gaap-rels-2020.json +0 -29068
- arelle/plugin/validate/EFM/resources/us-gaap-rels-2021.json +0 -29598
- arelle/plugin/validate/EFM/resources/us-gaap-rels-2022.json +0 -29141
- arelle/plugin/validate/EFM/resources/us-gaap-rels-2023.json +0 -29400
- arelle/plugin/validate/EFM/resources/vip-deprecated-concepts.json +0 -1
- arelle/plugin/validate/EFM/tools/CheckTxmyRefs.py +0 -180
- arelle/plugin/validate/EFM-htm/Const.py +0 -205
- arelle/plugin/validate/EFM-htm/__init__.py +0 -217
- arelle/plugin/validate/EFM-htm/config.xml +0 -17
- arelle/plugin/validate/EFM-htm/resources/efm-htm.dtd +0 -664
- arelle/plugin/validate/ESEF/ESEF_Current/Image.py +0 -199
- arelle/plugin/validate/ESEF_2022/__init__.py +0 -47
- arelle/plugin/validate/GFM/__init__.py +0 -59
- arelle/plugin/validate/GFM/config.xml +0 -82
- arelle/plugin/validate/SBRnl/CustomLoader.py +0 -19
- arelle/plugin/validate/SBRnl/DTS.py +0 -305
- arelle/plugin/validate/SBRnl/Dimensions.py +0 -357
- arelle/plugin/validate/SBRnl/Document.py +0 -799
- arelle/plugin/validate/SBRnl/Filing.py +0 -467
- arelle/plugin/validate/SBRnl/__init__.py +0 -75
- arelle/plugin/validate/SBRnl/config.xml +0 -26
- arelle/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
- arelle/plugin/validate/USBestPractices.py +0 -570
- arelle/plugin/validate/USCorpAction.py +0 -557
- arelle/plugin/validate/USSecTagging.py +0 -337
- arelle/plugin/validate/XDC/__init__.py +0 -77
- arelle/plugin/validate/XDC/config.xml +0 -20
- arelle/plugin/validate/XFsyntax/__init__.py +0 -64
- arelle/plugin/validate/XFsyntax/xf.py +0 -2227
- arelle/plugin/validate/__init__.py +0 -20
- arelle/plugin/validate/calc2.py +0 -536
- arelle/plugin/validateSBRnl.py +0 -530
- arelle/scripts-macOS/startWebServer.command +0 -3
- arelle/scripts-unix/startWebServer.sh +0 -1
- arelle/scripts-windows/startWebServer.bat +0 -5
- arelle_release-2.17.1.dist-info/RECORD +0 -676
- tests/__init__.py +0 -0
- tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/ArelleGUITest.csproj +0 -30
- tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Tests.cs +0 -381
- tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Usings.cs +0 -1
- tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest.sln +0 -31
- tests/integration_tests/ui_tests/resources/workiva.zip +0 -0
- tests/integration_tests/validation/README.md +0 -50
- tests/integration_tests/validation/conformance_suite_config.py +0 -59
- tests/integration_tests/validation/conformance_suite_configs.py +0 -63
- tests/integration_tests/validation/conformance_suite_configurations/efm_current.py +0 -261
- tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2021.py +0 -85
- tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2022.py +0 -90
- tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2021.py +0 -15
- tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2022.py +0 -15
- tests/integration_tests/validation/conformance_suite_configurations/nl_nt16.py +0 -13
- tests/integration_tests/validation/conformance_suite_configurations/nl_nt17.py +0 -13
- tests/integration_tests/validation/conformance_suite_configurations/nl_nt18.py +0 -13
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_2_1.py +0 -34
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_calculations_1_1.py +0 -40
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_dimensions_1_0.py +0 -28
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_1_0.py +0 -10
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_2_0.py +0 -10
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0.py +0 -9
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_assertion_severity_2_0.py +0 -9
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_function_registry.py +0 -14
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_ixbrl_1_1.py +0 -22
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_link_role_registry_1_0.py +0 -11
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_oim_1_0.py +0 -19
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_table_linkbase_1_0.py +0 -296
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_taxonomy_packages_1_0.py +0 -13
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_3.py +0 -13
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_4.py +0 -13
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_5.py +0 -13
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_malformed_1_0.py +0 -31
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_registry_1_0.py +0 -22
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_structure_1_0.py +0 -18
- tests/integration_tests/validation/conftest.py +0 -24
- tests/integration_tests/validation/discover_tests.py +0 -22
- tests/integration_tests/validation/download_conformance_suites.py +0 -47
- tests/integration_tests/validation/run_conformance_suites.py +0 -175
- tests/integration_tests/validation/test_conformance_suites.py +0 -14
- tests/integration_tests/validation/validation_util.py +0 -271
- tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-invalid-period.xbrl +0 -63
- tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-missing.xbrl +0 -53
- tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-multiple.xbrl +0 -60
- tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-testcase.xml +0 -33
- tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-invalid.xbrl +0 -57
- tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-invalid.xbrl +0 -58
- tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-invalid.xbrl +0 -63
- tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-missing.xbrl +0 -61
- tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-invalid-date.xbrl +0 -89
- tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-invalid-file-extension.xml +0 -56
- tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-invalid-lang.xbrl +0 -56
- tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-missing-lang.xbrl +0 -55
- tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-testcase.xml +0 -33
- tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-entrypoint.xsd +0 -6
- tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
- tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
- tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
- tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-file.xbrl +0 -2
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-zip.zip +0 -0
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-testcase.xml +0 -33
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-invalid-doctype.xbrl +0 -4
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-invalid-encoding.xbrl +0 -0
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-06-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt16/fr_nl/1-06.invalid.xbrl +0 -2
- tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-file.xbrl +0 -8
- tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-zip.zip +0 -0
- tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-testcase.xml +0 -33
- tests/resources/conformance_suites/nl_nt16/index.xml +0 -20
- tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-invalid-period.xbrl +0 -63
- tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-missing.xbrl +0 -53
- tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-multiple.xbrl +0 -60
- tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-testcase.xml +0 -33
- tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-invalid.xbrl +0 -57
- tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-invalid.xbrl +0 -58
- tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-invalid.xbrl +0 -63
- tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-missing.xbrl +0 -61
- tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-invalid-date.xbrl +0 -89
- tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-invalid-file-extension.xml +0 -56
- tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-invalid-lang.xbrl +0 -56
- tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-missing-lang.xbrl +0 -55
- tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-testcase.xml +0 -33
- tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-entrypoint.xsd +0 -6
- tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
- tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
- tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
- tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-file.xbrl +0 -2
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-zip.zip +0 -0
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-testcase.xml +0 -33
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-invalid-doctype.xbrl +0 -4
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-invalid-encoding.xbrl +0 -0
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-testcases.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-06-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt17/fr_nl/1-06.invalid.xbrl +0 -2
- tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-file.xbrl +0 -8
- tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-zip.zip +0 -0
- tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-testcase.xml +0 -33
- tests/resources/conformance_suites/nl_nt17/index.xml +0 -20
- tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-invalid-doctype.xbrl +0 -4
- tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-invalid-encoding.xbrl +0 -0
- tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-testcases.xml +0 -22
- tests/resources/conformance_suites/nl_nt18/fr_nl/1-06-testcase.xml +0 -22
- tests/resources/conformance_suites/nl_nt18/fr_nl/1-06.invalid.xbrl +0 -2
- tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-file.xbrl +0 -2
- tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-zip.zip +0 -0
- tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-testcase.xml +0 -33
- tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-file.xbrl +0 -8
- tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-zip.zip +0 -0
- tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-testcase.xml +0 -33
- tests/resources/conformance_suites/nl_nt18/index.xml +0 -8
- tests/unit_tests/arelle/conftest.py +0 -16
- tests/unit_tests/arelle/formula/test_fact_aspects_cache.py +0 -170
- tests/unit_tests/arelle/plugin/test_loadfromoim.py +0 -40
- tests/unit_tests/arelle/plugin/test_plugin_imports.py +0 -27
- tests/unit_tests/arelle/test_betafeatures.py +0 -81
- tests/unit_tests/arelle/test_cntlr.py +0 -28
- tests/unit_tests/arelle/test_import.py +0 -40
- tests/unit_tests/arelle/test_locale.py +0 -73
- tests/unit_tests/arelle/test_modelmanager.py +0 -15
- tests/unit_tests/arelle/test_packagemanager.py +0 -65
- tests/unit_tests/arelle/test_pluginmanager.py +0 -176
- tests/unit_tests/arelle/test_qname.py +0 -140
- tests/unit_tests/arelle/test_runtimeoptions.py +0 -56
- tests/unit_tests/arelle/test_system_info.py +0 -26
- tests/unit_tests/arelle/test_updater.py +0 -507
- tests/unit_tests/arelle/test_urlutil.py +0 -49
- tests/unit_tests/arelle/test_version.py +0 -46
- tests/unit_tests/arelle/utils/validate/test_decorator.py +0 -59
- /arelle/{examples/plugin/validate/XYZ → plugin/validate/EDINET}/rules/__init__.py +0 -0
- /arelle/plugin/validate/{HMRC → UK}/consistencyChecksByName.json +0 -0
- /arelle/plugin/validate/{HMRC → UK}/hmrc-taxonomies.xml +0 -0
- {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/entry_points.txt +0 -0
|
@@ -0,0 +1,1370 @@
|
|
|
1
|
+
"""
|
|
2
|
+
See COPYRIGHT.md for copyright information.
|
|
3
|
+
"""
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from collections import defaultdict
|
|
7
|
+
from collections.abc import Iterable
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import TYPE_CHECKING, Any
|
|
10
|
+
|
|
11
|
+
import regex
|
|
12
|
+
|
|
13
|
+
from arelle import UrlUtil, XbrlConst
|
|
14
|
+
from arelle.Cntlr import Cntlr
|
|
15
|
+
from arelle.FileSource import FileSource
|
|
16
|
+
from arelle.ModelDocument import Type as ModelDocumentType
|
|
17
|
+
from arelle.ModelInstanceObject import ModelFact, ModelInlineFact
|
|
18
|
+
from arelle.ModelObject import ModelObject
|
|
19
|
+
from arelle.typing import TypeGetText
|
|
20
|
+
from arelle.utils.PluginHooks import ValidationHook
|
|
21
|
+
from arelle.utils.validate.Decorator import validation
|
|
22
|
+
from arelle.utils.validate.Validation import Validation
|
|
23
|
+
from arelle.ValidateXbrl import ValidateXbrl
|
|
24
|
+
from arelle.XmlValidateConst import VALID
|
|
25
|
+
|
|
26
|
+
from ..Constants import JAPAN_LANGUAGE_CODES
|
|
27
|
+
from ..DisclosureSystems import DISCLOSURE_SYSTEM_EDINET
|
|
28
|
+
from ..FilingFormat import Ordinance, Taxonomy
|
|
29
|
+
from ..PluginValidationDataExtension import PluginValidationDataExtension
|
|
30
|
+
from ..ReportFolderType import HTML_EXTENSIONS, IMAGE_EXTENSIONS, ReportFolderType
|
|
31
|
+
|
|
32
|
+
if TYPE_CHECKING:
|
|
33
|
+
from ..ControllerPluginData import ControllerPluginData
|
|
34
|
+
|
|
35
|
+
_: TypeGetText
|
|
36
|
+
|
|
37
|
+
ALLOWED_ROOT_FOLDERS = {
|
|
38
|
+
"AttachDoc",
|
|
39
|
+
"AuditDoc",
|
|
40
|
+
"PrivateAttach",
|
|
41
|
+
"PrivateDoc",
|
|
42
|
+
"PublicAttach",
|
|
43
|
+
"PublicDoc",
|
|
44
|
+
"XBRL",
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
FILE_COUNT_LIMITS = {
|
|
48
|
+
Path("AttachDoc"): 990,
|
|
49
|
+
Path("AuditDoc"): 990,
|
|
50
|
+
Path("PrivateDoc"): 9_990,
|
|
51
|
+
Path("PublicDoc"): 9_990,
|
|
52
|
+
Path("XBRL") / "AttachDoc": 990,
|
|
53
|
+
Path("XBRL") / "AuditDoc": 990,
|
|
54
|
+
Path("XBRL") / "PrivateDoc": 9_990,
|
|
55
|
+
Path("XBRL") / "PublicDoc": 9_990,
|
|
56
|
+
Path("XBRL"): 99_990,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
FILENAME_STEM_PATTERN = regex.compile(r'[a-zA-Z0-9_-]*')
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@validation(
|
|
63
|
+
hook=ValidationHook.FILESOURCE,
|
|
64
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
65
|
+
)
|
|
66
|
+
def rule_EC0100E(
|
|
67
|
+
pluginData: ControllerPluginData,
|
|
68
|
+
cntlr: Cntlr,
|
|
69
|
+
fileSource: FileSource,
|
|
70
|
+
*args: Any,
|
|
71
|
+
**kwargs: Any,
|
|
72
|
+
) -> Iterable[Validation]:
|
|
73
|
+
"""
|
|
74
|
+
EDINET.EC0100E: An illegal directory is found directly under the transferred directory.
|
|
75
|
+
Only the following root folders are allowed:
|
|
76
|
+
AttachDoc
|
|
77
|
+
AuditDoc*
|
|
78
|
+
PrivateAttach
|
|
79
|
+
PrivateDoc*
|
|
80
|
+
PublicAttach
|
|
81
|
+
PublicDoc*
|
|
82
|
+
XBRL
|
|
83
|
+
* Only when reporting corrections
|
|
84
|
+
|
|
85
|
+
NOTE: since we do not have access to the submission type, we can't determine if the submission is a correction or not.
|
|
86
|
+
For this implementation, we will allow all directories that may be valid for at least one submission type.
|
|
87
|
+
This allows for a false-negative outcome when a non-correction submission has a correction-only root directory.
|
|
88
|
+
"""
|
|
89
|
+
uploadContents = pluginData.getUploadContents()
|
|
90
|
+
if uploadContents is None:
|
|
91
|
+
return
|
|
92
|
+
for path, pathInfo in uploadContents.uploadPathsByPath.items():
|
|
93
|
+
if pathInfo.isRoot and path.name not in ALLOWED_ROOT_FOLDERS:
|
|
94
|
+
yield Validation.error(
|
|
95
|
+
codes='EDINET.EC0100E',
|
|
96
|
+
msg=_("An illegal directory is found directly under the transferred directory. "
|
|
97
|
+
"Directory name or file name: '%(rootDirectory)s'. "
|
|
98
|
+
"Delete all folders except the following folders that exist directly "
|
|
99
|
+
"under the root folder, and then upload again: %(allowedDirectories)s."),
|
|
100
|
+
rootDirectory=path.name,
|
|
101
|
+
allowedDirectories=', '.join(f"'{d}'" for d in ALLOWED_ROOT_FOLDERS)
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@validation(
|
|
106
|
+
hook=ValidationHook.FILESOURCE,
|
|
107
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
108
|
+
)
|
|
109
|
+
def rule_EC0124E_EC0187E(
|
|
110
|
+
pluginData: ControllerPluginData,
|
|
111
|
+
cntlr: Cntlr,
|
|
112
|
+
fileSource: FileSource,
|
|
113
|
+
*args: Any,
|
|
114
|
+
**kwargs: Any,
|
|
115
|
+
) -> Iterable[Validation]:
|
|
116
|
+
"""
|
|
117
|
+
EDINET.EC0124E: There are no empty root directories.
|
|
118
|
+
EDINET.EC0187E: There are no empty subdirectories.
|
|
119
|
+
"""
|
|
120
|
+
uploadFilepaths = pluginData.getUploadFilepaths(fileSource)
|
|
121
|
+
emptyDirectories = []
|
|
122
|
+
for path, zipPath in uploadFilepaths.items():
|
|
123
|
+
if not zipPath.is_dir():
|
|
124
|
+
continue
|
|
125
|
+
if not any(path in p.parents for p in uploadFilepaths):
|
|
126
|
+
emptyDirectories.append(path)
|
|
127
|
+
for emptyDirectory in emptyDirectories:
|
|
128
|
+
if len(emptyDirectory.parts) <= 1:
|
|
129
|
+
yield Validation.error(
|
|
130
|
+
codes='EDINET.EC0124E',
|
|
131
|
+
msg=_("There is no file directly under '%(emptyDirectory)s'. "
|
|
132
|
+
"No empty root folders. "
|
|
133
|
+
"Please store the file in the appropriate folder or delete the folder and upload again."),
|
|
134
|
+
emptyDirectory=str(emptyDirectory),
|
|
135
|
+
)
|
|
136
|
+
else:
|
|
137
|
+
yield Validation.error(
|
|
138
|
+
codes='EDINET.EC0187E',
|
|
139
|
+
msg=_("'%(parentDirectory)s' contains a subordinate directory ('%(emptyDirectory)s') with no files. "
|
|
140
|
+
"Please store the file in the corresponding subfolder or delete the subfolder and upload again."),
|
|
141
|
+
parentDirectory=str(emptyDirectory.parent),
|
|
142
|
+
emptyDirectory=str(emptyDirectory),
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
@validation(
|
|
147
|
+
hook=ValidationHook.FILESOURCE,
|
|
148
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
149
|
+
)
|
|
150
|
+
def rule_EC0129E(
|
|
151
|
+
pluginData: ControllerPluginData,
|
|
152
|
+
cntlr: Cntlr,
|
|
153
|
+
fileSource: FileSource,
|
|
154
|
+
*args: Any,
|
|
155
|
+
**kwargs: Any,
|
|
156
|
+
) -> Iterable[Validation]:
|
|
157
|
+
"""
|
|
158
|
+
EDINET.EC0129E: Limit the number of subfolders to 3 or less from the XBRL directory.
|
|
159
|
+
"""
|
|
160
|
+
startingDirectory = 'XBRL'
|
|
161
|
+
uploadFilepaths = pluginData.getUploadFilepaths(fileSource)
|
|
162
|
+
for path in uploadFilepaths:
|
|
163
|
+
parents = [parent.name for parent in path.parents]
|
|
164
|
+
if startingDirectory in parents:
|
|
165
|
+
parents = parents[:parents.index(startingDirectory)]
|
|
166
|
+
else:
|
|
167
|
+
# TODO: Do we validate amendment subfolders too? These aren't placed beneath the XBRL directory.
|
|
168
|
+
continue
|
|
169
|
+
depth = len(parents)
|
|
170
|
+
if depth > 3:
|
|
171
|
+
yield Validation.error(
|
|
172
|
+
codes='EDINET.EC0129E',
|
|
173
|
+
msg=_("The subordinate directories of %(path)s go up to the level %(depth)s (directories: %(parents)s). "
|
|
174
|
+
"Please limit the number of subfolders to 3 or less and upload again."),
|
|
175
|
+
path=str(path),
|
|
176
|
+
depth=depth,
|
|
177
|
+
parents=', '.join(f"'{parent}'" for parent in reversed(parents)),
|
|
178
|
+
file=str(path)
|
|
179
|
+
)
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
@validation(
|
|
183
|
+
hook=ValidationHook.FILESOURCE,
|
|
184
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
185
|
+
)
|
|
186
|
+
def rule_EC0130E(
|
|
187
|
+
pluginData: ControllerPluginData,
|
|
188
|
+
cntlr: Cntlr,
|
|
189
|
+
fileSource: FileSource,
|
|
190
|
+
*args: Any,
|
|
191
|
+
**kwargs: Any,
|
|
192
|
+
) -> Iterable[Validation]:
|
|
193
|
+
"""
|
|
194
|
+
EDINET.EC0130E: File extensions must match the file extensions allowed in Figure 2-1-3 and Figure 2-1-5.
|
|
195
|
+
"""
|
|
196
|
+
uploadContents = pluginData.getUploadContents()
|
|
197
|
+
if uploadContents is None:
|
|
198
|
+
return
|
|
199
|
+
for path, pathInfo in uploadContents.uploadPathsByPath.items():
|
|
200
|
+
if pathInfo.reportFolderType is None or pathInfo.isDirectory:
|
|
201
|
+
continue
|
|
202
|
+
validExtensions = pathInfo.reportFolderType.getValidExtensions(pathInfo.isCorrection, pathInfo.isSubdirectory)
|
|
203
|
+
if validExtensions is None:
|
|
204
|
+
continue
|
|
205
|
+
ext = path.suffix
|
|
206
|
+
if ext not in validExtensions:
|
|
207
|
+
yield Validation.error(
|
|
208
|
+
codes='EDINET.EC0130E',
|
|
209
|
+
msg=_("The file extension '%(ext)s' is not valid at '%(path)s'. "
|
|
210
|
+
"Valid extensions at this location are: %(validExtensions)s. "
|
|
211
|
+
"Please change the file extension to a configurable extension and upload it again. "
|
|
212
|
+
"For information on configurable file extensions, please refer to 'Table 2-1-3 Storable File Formats (1)' "
|
|
213
|
+
"in the 'Document File Specifications' and 'Table 2-1-5 Storable File Formats (2)' in the "
|
|
214
|
+
"'Document File Specifications'."),
|
|
215
|
+
ext=ext,
|
|
216
|
+
path=str(path),
|
|
217
|
+
validExtensions=', '.join(f"'{e}'" for e in validExtensions),
|
|
218
|
+
file=str(path)
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
@validation(
|
|
223
|
+
hook=ValidationHook.FILESOURCE,
|
|
224
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
225
|
+
)
|
|
226
|
+
def rule_EC0132E(
|
|
227
|
+
pluginData: ControllerPluginData,
|
|
228
|
+
cntlr: Cntlr,
|
|
229
|
+
fileSource: FileSource,
|
|
230
|
+
*args: Any,
|
|
231
|
+
**kwargs: Any,
|
|
232
|
+
) -> Iterable[Validation]:
|
|
233
|
+
"""
|
|
234
|
+
EDINET.EC0132E: Cover page or manifest file is missing.
|
|
235
|
+
|
|
236
|
+
Note: Cover page is not required in AuditDoc.
|
|
237
|
+
"""
|
|
238
|
+
uploadContents = pluginData.getUploadContents()
|
|
239
|
+
if uploadContents is None:
|
|
240
|
+
return
|
|
241
|
+
for reportFolderType, paths in uploadContents.reports.items():
|
|
242
|
+
if reportFolderType.isAttachment:
|
|
243
|
+
# These rules don't apply to "Attach" directories
|
|
244
|
+
continue
|
|
245
|
+
coverPageFound = False
|
|
246
|
+
manifestFound = False
|
|
247
|
+
for path in paths:
|
|
248
|
+
pathInfo = uploadContents.uploadPathsByPath[path]
|
|
249
|
+
if pathInfo.isCoverPage:
|
|
250
|
+
coverPageFound = True
|
|
251
|
+
if path == reportFolderType.manifestPath:
|
|
252
|
+
manifestFound = True
|
|
253
|
+
if not coverPageFound and reportFolderType != ReportFolderType.AUDIT_DOC:
|
|
254
|
+
yield Validation.error(
|
|
255
|
+
codes='EDINET.EC0132E',
|
|
256
|
+
msg=_("Cover page does not exist in '%(expectedManifestDirectory)s'. "
|
|
257
|
+
"Please store the cover file directly under the relevant folder and upload it again. "),
|
|
258
|
+
expectedManifestDirectory=str(reportFolderType.manifestPath.parent),
|
|
259
|
+
)
|
|
260
|
+
if not manifestFound:
|
|
261
|
+
yield Validation.error(
|
|
262
|
+
codes='EDINET.EC0132E',
|
|
263
|
+
msg=_("'%(expectedManifestName)s' does not exist in '%(expectedManifestDirectory)s'. "
|
|
264
|
+
"Please store the manifest file directly under the relevant folder and upload it again. "),
|
|
265
|
+
expectedManifestName=reportFolderType.manifestPath.name,
|
|
266
|
+
expectedManifestDirectory=str(reportFolderType.manifestPath.parent),
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
@validation(
|
|
271
|
+
hook=ValidationHook.FILESOURCE,
|
|
272
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
273
|
+
)
|
|
274
|
+
def rule_EC0183E(
|
|
275
|
+
pluginData: ControllerPluginData,
|
|
276
|
+
cntlr: Cntlr,
|
|
277
|
+
fileSource: FileSource,
|
|
278
|
+
*args: Any,
|
|
279
|
+
**kwargs: Any,
|
|
280
|
+
) -> Iterable[Validation]:
|
|
281
|
+
"""
|
|
282
|
+
EDINET.EC0183E: The compressed file size exceeds 55MB.
|
|
283
|
+
"""
|
|
284
|
+
size = fileSource.getBytesSize()
|
|
285
|
+
if size is None:
|
|
286
|
+
return # File size is not available, cannot validate
|
|
287
|
+
if size > 55_000_000: # Interpretting MB as megabytes (1,000,000 bytes)
|
|
288
|
+
yield Validation.error(
|
|
289
|
+
codes='EDINET.EC0183E',
|
|
290
|
+
msg=_("The compressed file size exceeds 55MB. "
|
|
291
|
+
"Please compress the file to a size of 55MB or less and upload it again."),
|
|
292
|
+
)
|
|
293
|
+
|
|
294
|
+
|
|
295
|
+
@validation(
|
|
296
|
+
hook=ValidationHook.FILESOURCE,
|
|
297
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
298
|
+
)
|
|
299
|
+
def rule_EC0188E(
|
|
300
|
+
pluginData: ControllerPluginData,
|
|
301
|
+
cntlr: Cntlr,
|
|
302
|
+
fileSource: FileSource,
|
|
303
|
+
*args: Any,
|
|
304
|
+
**kwargs: Any,
|
|
305
|
+
) -> Iterable[Validation]:
|
|
306
|
+
"""
|
|
307
|
+
EDINET.EC0188E: There is an HTML file directly under PublicDoc or PrivateDoc whose first 7 characters are not numbers.
|
|
308
|
+
"""
|
|
309
|
+
pattern = regex.compile(r'^\d{7}')
|
|
310
|
+
uploadFilepaths = pluginData.getUploadFilepaths(fileSource)
|
|
311
|
+
docFolders = frozenset({"PublicDoc", "PrivateDoc"})
|
|
312
|
+
for path in uploadFilepaths:
|
|
313
|
+
if path.suffix not in HTML_EXTENSIONS:
|
|
314
|
+
continue
|
|
315
|
+
if path.parent.name not in docFolders:
|
|
316
|
+
continue
|
|
317
|
+
if pattern.match(path.name) is None:
|
|
318
|
+
yield Validation.error(
|
|
319
|
+
codes='EDINET.EC0188E',
|
|
320
|
+
msg=_("There is an html file directly under PublicDoc or PrivateDoc whose first 7 characters are not numbers: '%(path)s'."
|
|
321
|
+
"Please change the first 7 characters of the file name of the file directly under the folder to numbers "
|
|
322
|
+
"and upload it again."),
|
|
323
|
+
path=str(path),
|
|
324
|
+
file=str(path),
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
@validation(
|
|
329
|
+
hook=ValidationHook.FILESOURCE,
|
|
330
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
331
|
+
)
|
|
332
|
+
def rule_EC0192E(
|
|
333
|
+
pluginData: ControllerPluginData,
|
|
334
|
+
cntlr: Cntlr,
|
|
335
|
+
fileSource: FileSource,
|
|
336
|
+
*args: Any,
|
|
337
|
+
**kwargs: Any,
|
|
338
|
+
) -> Iterable[Validation]:
|
|
339
|
+
"""
|
|
340
|
+
EDINET.EC0192E: The cover file for PrivateDoc cannot be set because it uses a
|
|
341
|
+
PublicDoc cover file. Please delete the cover file from PrivateDoc and upload
|
|
342
|
+
it again.
|
|
343
|
+
"""
|
|
344
|
+
uploadContents = pluginData.getUploadContents()
|
|
345
|
+
if uploadContents is None:
|
|
346
|
+
return
|
|
347
|
+
for path, pathInfo in uploadContents.uploadPathsByPath.items():
|
|
348
|
+
if not pathInfo.isCoverPage:
|
|
349
|
+
continue
|
|
350
|
+
# Only applies to PrivateDoc correction reports
|
|
351
|
+
if pathInfo.isCorrection and pathInfo.reportFolderType == ReportFolderType.PRIVATE_DOC:
|
|
352
|
+
yield Validation.error(
|
|
353
|
+
codes='EDINET.EC0192E',
|
|
354
|
+
msg=_("The cover file for PrivateDoc ('%(file)s') cannot be set because it uses a PublicDoc cover file. "
|
|
355
|
+
"Please delete the cover file from PrivateDoc and upload it again."),
|
|
356
|
+
file=str(path),
|
|
357
|
+
)
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
@validation(
|
|
361
|
+
hook=ValidationHook.FILESOURCE,
|
|
362
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
363
|
+
)
|
|
364
|
+
def rule_EC0198E(
|
|
365
|
+
pluginData: ControllerPluginData,
|
|
366
|
+
cntlr: Cntlr,
|
|
367
|
+
fileSource: FileSource,
|
|
368
|
+
*args: Any,
|
|
369
|
+
**kwargs: Any,
|
|
370
|
+
) -> Iterable[Validation]:
|
|
371
|
+
"""
|
|
372
|
+
EDINET.EC0198E: The number of files in the total submission and directories can not exceed the upper limit.
|
|
373
|
+
"""
|
|
374
|
+
fileCounts: dict[Path, int] = defaultdict(int)
|
|
375
|
+
uploadFilepaths = pluginData.getUploadFilepaths(fileSource)
|
|
376
|
+
for path, zipPath in uploadFilepaths.items():
|
|
377
|
+
if zipPath.is_dir():
|
|
378
|
+
continue
|
|
379
|
+
for directory in FILE_COUNT_LIMITS.keys():
|
|
380
|
+
if directory in path.parents:
|
|
381
|
+
fileCounts[directory] += 1
|
|
382
|
+
break
|
|
383
|
+
for directory, limit in FILE_COUNT_LIMITS.items():
|
|
384
|
+
actual = fileCounts[directory]
|
|
385
|
+
if actual > limit:
|
|
386
|
+
yield Validation.error(
|
|
387
|
+
codes='EDINET.EC0198E',
|
|
388
|
+
msg=_("The number of files in %(directory)s exceeds the upper limit (%(actual)s > %(limit)s). "
|
|
389
|
+
"Please reduce the number of files in the folder to below the maximum and try uploading again."),
|
|
390
|
+
directory=str(directory),
|
|
391
|
+
actual="{:,}".format(actual),
|
|
392
|
+
limit="{:,}".format(limit),
|
|
393
|
+
)
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
@validation(
|
|
397
|
+
hook=ValidationHook.FILESOURCE,
|
|
398
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
399
|
+
)
|
|
400
|
+
def rule_EC0233E(
|
|
401
|
+
pluginData: ControllerPluginData,
|
|
402
|
+
cntlr: Cntlr,
|
|
403
|
+
fileSource: FileSource,
|
|
404
|
+
*args: Any,
|
|
405
|
+
**kwargs: Any,
|
|
406
|
+
) -> Iterable[Validation]:
|
|
407
|
+
"""
|
|
408
|
+
EDINET.EC0233E: There is a file in the report directory that comes before the cover file
|
|
409
|
+
in file name sort order.
|
|
410
|
+
|
|
411
|
+
NOTE: This includes files in subdirectories. For example, PublicDoc/00000000_images/image.png
|
|
412
|
+
comes before PublicDoc/0000000_header_*.htm
|
|
413
|
+
"""
|
|
414
|
+
uploadContents = pluginData.getUploadContents()
|
|
415
|
+
if uploadContents is None:
|
|
416
|
+
return
|
|
417
|
+
directories = defaultdict(list)
|
|
418
|
+
for path in uploadContents.sortedPaths:
|
|
419
|
+
pathInfo = uploadContents.uploadPathsByPath[path]
|
|
420
|
+
if pathInfo.isDirectory:
|
|
421
|
+
continue
|
|
422
|
+
if pathInfo.reportFolderType in (ReportFolderType.PRIVATE_DOC, ReportFolderType.PUBLIC_DOC):
|
|
423
|
+
directories[pathInfo.reportPath].append(pathInfo)
|
|
424
|
+
for reportPath, pathInfos in directories.items():
|
|
425
|
+
coverPagePath = next(iter(p for p in pathInfos if p.isCoverPage), None)
|
|
426
|
+
if coverPagePath is None:
|
|
427
|
+
continue
|
|
428
|
+
errorPathInfos = pathInfos[:pathInfos.index(coverPagePath)]
|
|
429
|
+
for pathInfo in errorPathInfos:
|
|
430
|
+
yield Validation.error(
|
|
431
|
+
codes='EDINET.EC0233E',
|
|
432
|
+
msg=_("There is a file in the report directory in '%(reportPath)s' that comes before the cover "
|
|
433
|
+
"file ('%(coverPage)s') in file name sort order. "
|
|
434
|
+
"Directory name or file name: '%(path)s'. "
|
|
435
|
+
"Please make sure that there are no files that come before the cover file in the file "
|
|
436
|
+
"name sort order, and then upload again."),
|
|
437
|
+
reportPath=str(reportPath),
|
|
438
|
+
coverPage=str(coverPagePath.path.name),
|
|
439
|
+
path=str(pathInfo.path),
|
|
440
|
+
)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
@validation(
|
|
444
|
+
hook=ValidationHook.FILESOURCE,
|
|
445
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
446
|
+
)
|
|
447
|
+
def rule_EC0234E(
|
|
448
|
+
pluginData: ControllerPluginData,
|
|
449
|
+
cntlr: Cntlr,
|
|
450
|
+
fileSource: FileSource,
|
|
451
|
+
*args: Any,
|
|
452
|
+
**kwargs: Any,
|
|
453
|
+
) -> Iterable[Validation]:
|
|
454
|
+
"""
|
|
455
|
+
EDINET.EC0234E: A cover file exists in an unsupported subdirectory.
|
|
456
|
+
"""
|
|
457
|
+
uploadContents = pluginData.getUploadContents()
|
|
458
|
+
if uploadContents is None:
|
|
459
|
+
return
|
|
460
|
+
for path, pathInfo in uploadContents.uploadPathsByPath.items():
|
|
461
|
+
if pathInfo.isDirectory:
|
|
462
|
+
continue
|
|
463
|
+
if pathInfo.reportFolderType not in (ReportFolderType.PRIVATE_DOC, ReportFolderType.PUBLIC_DOC):
|
|
464
|
+
continue
|
|
465
|
+
if pathInfo.isSubdirectory and pathInfo.isCoverPage:
|
|
466
|
+
yield Validation.error(
|
|
467
|
+
codes='EDINET.EC0234E',
|
|
468
|
+
msg=_("A cover file ('%(coverPage)s') exists in an unsupported subdirectory. "
|
|
469
|
+
"Directory: '%(directory)s'. "
|
|
470
|
+
"Please make sure there is no cover file in the subfolder and upload again."),
|
|
471
|
+
coverPage=str(path.name),
|
|
472
|
+
directory=str(path.parent),
|
|
473
|
+
)
|
|
474
|
+
|
|
475
|
+
|
|
476
|
+
@validation(
|
|
477
|
+
hook=ValidationHook.FILESOURCE,
|
|
478
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
479
|
+
)
|
|
480
|
+
def rule_EC0237E(
|
|
481
|
+
pluginData: ControllerPluginData,
|
|
482
|
+
cntlr: Cntlr,
|
|
483
|
+
fileSource: FileSource,
|
|
484
|
+
*args: Any,
|
|
485
|
+
**kwargs: Any,
|
|
486
|
+
) -> Iterable[Validation]:
|
|
487
|
+
"""
|
|
488
|
+
EDINET.EC0237E: The directory or file path to the lowest level exceeds the maximum value (259 characters).
|
|
489
|
+
"""
|
|
490
|
+
uploadFilepaths = pluginData.getUploadFilepaths(fileSource)
|
|
491
|
+
for path in uploadFilepaths:
|
|
492
|
+
if len(str(path)) <= 259:
|
|
493
|
+
continue
|
|
494
|
+
yield Validation.error(
|
|
495
|
+
codes='EDINET.EC0237E',
|
|
496
|
+
msg=_("The directory or file path ('%(path)s') to the lowest level exceeds the maximum value (259 characters). "
|
|
497
|
+
"Please shorten the absolute path of the folder (or file) "
|
|
498
|
+
"to 259 characters or less and try uploading again."),
|
|
499
|
+
path=str(path),
|
|
500
|
+
file=str(path),
|
|
501
|
+
)
|
|
502
|
+
|
|
503
|
+
|
|
504
|
+
@validation(
|
|
505
|
+
hook=ValidationHook.FILESOURCE,
|
|
506
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
507
|
+
)
|
|
508
|
+
def rule_EC0206E(
|
|
509
|
+
pluginData: ControllerPluginData,
|
|
510
|
+
cntlr: Cntlr,
|
|
511
|
+
fileSource: FileSource,
|
|
512
|
+
*args: Any,
|
|
513
|
+
**kwargs: Any,
|
|
514
|
+
) -> Iterable[Validation]:
|
|
515
|
+
"""
|
|
516
|
+
EDINET.EC0206E: Empty files are not permitted.
|
|
517
|
+
"""
|
|
518
|
+
for path, size in pluginData.getUploadFileSizes(fileSource).items():
|
|
519
|
+
if size > 0:
|
|
520
|
+
continue
|
|
521
|
+
yield Validation.error(
|
|
522
|
+
codes='EDINET.EC0206E',
|
|
523
|
+
msg=_("An empty file exists. "
|
|
524
|
+
"File name: '%(path)s'. "
|
|
525
|
+
"Please delete the empty file and upload again."),
|
|
526
|
+
path=str(path),
|
|
527
|
+
file=str(path),
|
|
528
|
+
)
|
|
529
|
+
|
|
530
|
+
|
|
531
|
+
@validation(
|
|
532
|
+
hook=ValidationHook.FILESOURCE,
|
|
533
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
534
|
+
)
|
|
535
|
+
def rule_EC0349E(
|
|
536
|
+
pluginData: ControllerPluginData,
|
|
537
|
+
cntlr: Cntlr,
|
|
538
|
+
fileSource: FileSource,
|
|
539
|
+
*args: Any,
|
|
540
|
+
**kwargs: Any,
|
|
541
|
+
) -> Iterable[Validation]:
|
|
542
|
+
"""
|
|
543
|
+
EDINET.EC0349E: An unexpected directory or file exists directly beneath the XBRL directory.
|
|
544
|
+
Only PublicDoc, PrivateDoc, or AuditDoc directories may exist directly beneath the XBRL directory.
|
|
545
|
+
"""
|
|
546
|
+
uploadContents = pluginData.getUploadContents()
|
|
547
|
+
if uploadContents is None:
|
|
548
|
+
return
|
|
549
|
+
xbrlDirectoryPath = Path('XBRL')
|
|
550
|
+
allowedPaths = {p.xbrlDirectory for p in (
|
|
551
|
+
ReportFolderType.AUDIT_DOC,
|
|
552
|
+
ReportFolderType.PRIVATE_DOC,
|
|
553
|
+
ReportFolderType.PUBLIC_DOC,
|
|
554
|
+
)}
|
|
555
|
+
for path, pathInfo in uploadContents.uploadPathsByPath.items():
|
|
556
|
+
if path.parent != xbrlDirectoryPath:
|
|
557
|
+
continue
|
|
558
|
+
if path not in allowedPaths:
|
|
559
|
+
yield Validation.error(
|
|
560
|
+
codes='EDINET.EC0349E',
|
|
561
|
+
msg=_("An unexpected directory or file exists directly beneath the XBRL directory. "
|
|
562
|
+
"Directory or file name: '%(file)s'."),
|
|
563
|
+
file=path.name,
|
|
564
|
+
)
|
|
565
|
+
|
|
566
|
+
|
|
567
|
+
@validation(
|
|
568
|
+
hook=ValidationHook.FILESOURCE,
|
|
569
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
570
|
+
)
|
|
571
|
+
def rule_EC0352E(
|
|
572
|
+
pluginData: ControllerPluginData,
|
|
573
|
+
cntlr: Cntlr,
|
|
574
|
+
fileSource: FileSource,
|
|
575
|
+
*args: Any,
|
|
576
|
+
**kwargs: Any,
|
|
577
|
+
) -> Iterable[Validation]:
|
|
578
|
+
"""
|
|
579
|
+
EDINET.EC0352E: An XBRL file with an invalid name exists.
|
|
580
|
+
"""
|
|
581
|
+
uploadContents = pluginData.getUploadContents()
|
|
582
|
+
if uploadContents is None:
|
|
583
|
+
return
|
|
584
|
+
for path, pathInfo in uploadContents.uploadPathsByPath.items():
|
|
585
|
+
if (
|
|
586
|
+
pathInfo.isDirectory or
|
|
587
|
+
pathInfo.isCorrection or
|
|
588
|
+
pathInfo.isSubdirectory or
|
|
589
|
+
pathInfo.isAttachment or
|
|
590
|
+
pathInfo.reportFolderType is None or
|
|
591
|
+
any(path == t.manifestPath for t in ReportFolderType)
|
|
592
|
+
):
|
|
593
|
+
continue
|
|
594
|
+
patterns = pathInfo.reportFolderType.ixbrlFilenamePatterns
|
|
595
|
+
if not any(pattern.fullmatch(path.name) for pattern in patterns):
|
|
596
|
+
yield Validation.error(
|
|
597
|
+
codes='EDINET.EC0352E',
|
|
598
|
+
msg=_("A file with an invalid name exists. "
|
|
599
|
+
"File path: '%(path)s'."),
|
|
600
|
+
path=str(path),
|
|
601
|
+
)
|
|
602
|
+
|
|
603
|
+
|
|
604
|
+
@validation(
|
|
605
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
606
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
607
|
+
)
|
|
608
|
+
def rule_cover_items(
|
|
609
|
+
pluginData: PluginValidationDataExtension,
|
|
610
|
+
val: ValidateXbrl,
|
|
611
|
+
*args: Any,
|
|
612
|
+
**kwargs: Any,
|
|
613
|
+
) -> Iterable[Validation]:
|
|
614
|
+
"""
|
|
615
|
+
EDINET.EC1000E: Cover page must contain "【表紙】".
|
|
616
|
+
EDINET.EC1001E: A required item is missing from the cover page.
|
|
617
|
+
EDINET.EC1002E: A duplicate item is included on the cover page.
|
|
618
|
+
EDINET.EC1003E: An unnecessary item is included on the cover page.
|
|
619
|
+
EDINET.EC1004E: An item on the cover page is out of order.
|
|
620
|
+
EDINET.EC1005E: A required item on the cover page is missing a valid value.
|
|
621
|
+
"""
|
|
622
|
+
uploadContents = pluginData.getUploadContents(val.modelXbrl)
|
|
623
|
+
if uploadContents is None:
|
|
624
|
+
return
|
|
625
|
+
for url, doc in val.modelXbrl.urlDocs.items():
|
|
626
|
+
path = Path(url)
|
|
627
|
+
pathInfo = uploadContents.uploadPathsByFullPath.get(path)
|
|
628
|
+
if pathInfo is None or not pathInfo.isCoverPage:
|
|
629
|
+
continue
|
|
630
|
+
rootElt = doc.xmlRootElement
|
|
631
|
+
coverPageTextFound = False
|
|
632
|
+
for elt in rootElt.iterdescendants():
|
|
633
|
+
if not coverPageTextFound and elt.text and '【表紙】' in elt.text:
|
|
634
|
+
coverPageTextFound = True
|
|
635
|
+
break
|
|
636
|
+
if not coverPageTextFound:
|
|
637
|
+
yield Validation.error(
|
|
638
|
+
codes='EDINET.EC1000E',
|
|
639
|
+
msg=_("There is no '【表紙】' on the cover page. "
|
|
640
|
+
"File name: '%(file)s'. "
|
|
641
|
+
"Please add '【表紙】' to the relevant file."),
|
|
642
|
+
file=doc.basename,
|
|
643
|
+
)
|
|
644
|
+
filingFormat = pluginData.getFilingFormat(val.modelXbrl)
|
|
645
|
+
if filingFormat is None:
|
|
646
|
+
return
|
|
647
|
+
allCoverItems = pluginData.getCoverItems(val.modelXbrl)
|
|
648
|
+
requiredCoverItems = pluginData.getCoverItemRequirements(val.modelXbrl)
|
|
649
|
+
if requiredCoverItems is None:
|
|
650
|
+
return
|
|
651
|
+
prohibitedCoverItems = allCoverItems - set(requiredCoverItems)
|
|
652
|
+
sequenceQueue = list(requiredCoverItems)
|
|
653
|
+
|
|
654
|
+
ixNStag = doc.ixNStag
|
|
655
|
+
rootElt = doc.xmlRootElement
|
|
656
|
+
foundFactsByQname = defaultdict(list)
|
|
657
|
+
outOfSequence = False
|
|
658
|
+
seenInSequence = set()
|
|
659
|
+
for elt in rootElt.iterdescendants(ixNStag + "nonNumeric", ixNStag + "nonFraction", ixNStag + "fraction"):
|
|
660
|
+
if not isinstance(elt, ModelFact):
|
|
661
|
+
continue
|
|
662
|
+
if not elt.qname in allCoverItems:
|
|
663
|
+
continue
|
|
664
|
+
if elt.qname in prohibitedCoverItems:
|
|
665
|
+
yield Validation.error(
|
|
666
|
+
codes='EDINET.EC1003E',
|
|
667
|
+
msg=_("Cover item %(localName)s is not necessary. "
|
|
668
|
+
"File name: '%(file)s' (line %(line)s). "
|
|
669
|
+
"Please add the cover item %(localName)s to the relevant file."),
|
|
670
|
+
localName=elt.qname.localName,
|
|
671
|
+
file=doc.basename,
|
|
672
|
+
line=elt.sourceline,
|
|
673
|
+
modelObject=elt,
|
|
674
|
+
)
|
|
675
|
+
continue
|
|
676
|
+
foundFactsByQname[elt.qname].append(elt)
|
|
677
|
+
if elt.qname in seenInSequence:
|
|
678
|
+
yield Validation.error(
|
|
679
|
+
codes='EDINET.EC1002E',
|
|
680
|
+
msg=_("Cover item %(localName)s is duplicated. "
|
|
681
|
+
"File name: '%(file)s'. "
|
|
682
|
+
"Please check the cover item %(localName)s of the relevant file "
|
|
683
|
+
"and make sure there are no duplicates."),
|
|
684
|
+
localName=elt.qname.localName,
|
|
685
|
+
file=doc.basename,
|
|
686
|
+
modelObject=elt,
|
|
687
|
+
)
|
|
688
|
+
continue
|
|
689
|
+
seenInSequence.add(elt.qname)
|
|
690
|
+
if len(sequenceQueue) == 0:
|
|
691
|
+
continue
|
|
692
|
+
if outOfSequence:
|
|
693
|
+
continue
|
|
694
|
+
if not sequenceQueue[0] == elt.qname:
|
|
695
|
+
outOfSequence = True
|
|
696
|
+
yield Validation.error(
|
|
697
|
+
codes='EDINET.EC1004E',
|
|
698
|
+
msg=_("Cover item %(localName)s is not in the correct order. "
|
|
699
|
+
"File name: '%(file)s'. "
|
|
700
|
+
"Please correct the order of cover items in the appropriate file."),
|
|
701
|
+
localName=elt.qname.localName,
|
|
702
|
+
file=doc.basename,
|
|
703
|
+
modelObject=elt,
|
|
704
|
+
)
|
|
705
|
+
if elt.qname in sequenceQueue:
|
|
706
|
+
sequenceQueue.remove(elt.qname)
|
|
707
|
+
|
|
708
|
+
for qname in requiredCoverItems:
|
|
709
|
+
foundFacts = foundFactsByQname.get(qname, [])
|
|
710
|
+
# No facts found.
|
|
711
|
+
if len(foundFacts) == 0:
|
|
712
|
+
yield Validation.error(
|
|
713
|
+
codes='EDINET.EC1001E',
|
|
714
|
+
msg=_("Cover item %(localName)s is missing. "
|
|
715
|
+
"File name: '%(file)s'. "
|
|
716
|
+
"Please add the cover item %(localName)s to the relevant file."),
|
|
717
|
+
localName=qname.localName,
|
|
718
|
+
file=doc.basename,
|
|
719
|
+
)
|
|
720
|
+
# Fact(s) found, but no valid, non-nil value.
|
|
721
|
+
elif not any(f.xValid >= VALID and not f.isNil for f in foundFacts):
|
|
722
|
+
yield Validation.error(
|
|
723
|
+
codes='EDINET.EC1005E',
|
|
724
|
+
msg=_("Cover item %(localName)s is missing a valid value. "
|
|
725
|
+
"File name: '%(file)s'. "
|
|
726
|
+
"Please enter a valid value for %(localName)s in the relevant file."),
|
|
727
|
+
localName=qname.localName,
|
|
728
|
+
file=doc.basename,
|
|
729
|
+
modelObject=foundFacts,
|
|
730
|
+
)
|
|
731
|
+
|
|
732
|
+
|
|
733
|
+
@validation(
|
|
734
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
735
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
736
|
+
)
|
|
737
|
+
def rule_EC1006E(
|
|
738
|
+
pluginData: PluginValidationDataExtension,
|
|
739
|
+
val: ValidateXbrl,
|
|
740
|
+
*args: Any,
|
|
741
|
+
**kwargs: Any,
|
|
742
|
+
) -> Iterable[Validation]:
|
|
743
|
+
"""
|
|
744
|
+
EDINET.EC1006E: Prohibited tag is used in HTML.
|
|
745
|
+
"""
|
|
746
|
+
for doc in val.modelXbrl.urlDocs.values():
|
|
747
|
+
for elt in pluginData.getProhibitedTagElements(doc):
|
|
748
|
+
yield Validation.error(
|
|
749
|
+
codes='EDINET.EC1006E',
|
|
750
|
+
msg=_("Prohibited tag (%(tag)s) is used in HTML. File name: %(file)s (line %(line)s). "
|
|
751
|
+
"Please correct the prohibited tags for the relevant files. "
|
|
752
|
+
"For information on prohibited tags, please refer to \"4-1-4 Prohibited Rules\" "
|
|
753
|
+
"in the Validation Guidelines."),
|
|
754
|
+
tag=elt.qname.localName,
|
|
755
|
+
file=doc.basename,
|
|
756
|
+
line=elt.sourceline,
|
|
757
|
+
modelObject=elt,
|
|
758
|
+
)
|
|
759
|
+
|
|
760
|
+
|
|
761
|
+
@validation(
|
|
762
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
763
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
764
|
+
)
|
|
765
|
+
def rule_uri_references(
|
|
766
|
+
pluginData: PluginValidationDataExtension,
|
|
767
|
+
val: ValidateXbrl,
|
|
768
|
+
*args: Any,
|
|
769
|
+
**kwargs: Any,
|
|
770
|
+
) -> Iterable[Validation]:
|
|
771
|
+
"""
|
|
772
|
+
EDINET.EC1007E: A URI in an HTML file must not be a URL or absolute path.
|
|
773
|
+
EDINET.EC1013E: A URI in an HTML file directly beneath a report folder
|
|
774
|
+
must specify a path under a subdirectory.
|
|
775
|
+
EDINET.EC1014E: A URI in an HTML file must not specify a path to a directory.
|
|
776
|
+
EDINET.EC1015E: A URI in an HTML file within a subdirectory
|
|
777
|
+
must not specify a path directly beneath the report folder.
|
|
778
|
+
EDINET.EC1021E: A URI in an HTML file must not specify a path to a file that doesn't exist.
|
|
779
|
+
EDINET.EC1023E: A URI in an HTML file must not specify a path to a PDF file.
|
|
780
|
+
EDINET.EC1035E: A URI in an HTML file must not specify a path to a location higher than the report path.
|
|
781
|
+
|
|
782
|
+
Note: See "図表 3-4-8 PublicDoc フォルダ全体のイメージ" in "File Specification for EDINET".
|
|
783
|
+
"""
|
|
784
|
+
uploadContents = pluginData.getUploadContents(val.modelXbrl)
|
|
785
|
+
if uploadContents is None:
|
|
786
|
+
return
|
|
787
|
+
for uriReference in pluginData.uriReferences:
|
|
788
|
+
if UrlUtil.isAbsolute(uriReference.attributeValue):
|
|
789
|
+
yield Validation.error(
|
|
790
|
+
codes='EDINET.EC1007E',
|
|
791
|
+
msg=_("The URI in the HTML specifies a URL or absolute path. "
|
|
792
|
+
"File name: '%(file)s' (line %(line)s). "
|
|
793
|
+
"Please change the links in the files to relative paths."),
|
|
794
|
+
file=uriReference.document.basename,
|
|
795
|
+
line=uriReference.element.sourceline,
|
|
796
|
+
modelObject=uriReference.element,
|
|
797
|
+
)
|
|
798
|
+
continue
|
|
799
|
+
|
|
800
|
+
uriPath = Path(uriReference.attributeValue)
|
|
801
|
+
documentFullPath = Path(uriReference.document.uri)
|
|
802
|
+
referenceFullPath = (documentFullPath.parent / uriPath).resolve()
|
|
803
|
+
documentPathInfo = uploadContents.uploadPathsByFullPath.get(documentFullPath)
|
|
804
|
+
assert documentPathInfo is not None # Should always be present, as it must exist to have a uriReference discovered.
|
|
805
|
+
reportFullPath = Path(str(val.modelXbrl.fileSource.baseurl)) / (documentPathInfo.reportPath or "")
|
|
806
|
+
|
|
807
|
+
if reportFullPath not in referenceFullPath.parents:
|
|
808
|
+
yield Validation.error(
|
|
809
|
+
codes='EDINET.EC1035E',
|
|
810
|
+
msg=_("The URI in the HTML specifies a path that navigates "
|
|
811
|
+
"outside of the report folder '%(reportPath)s'. "
|
|
812
|
+
"File name: '%(file)s' (line %(line)s). "
|
|
813
|
+
"You cannot create a link from a subfolder to a parent folder. "
|
|
814
|
+
"Please delete the link."),
|
|
815
|
+
reportPath=str(documentPathInfo.reportPath),
|
|
816
|
+
file=uriReference.document.basename,
|
|
817
|
+
line=uriReference.element.sourceline,
|
|
818
|
+
modelObject=uriReference.element,
|
|
819
|
+
)
|
|
820
|
+
continue
|
|
821
|
+
|
|
822
|
+
if not documentPathInfo.isSubdirectory:
|
|
823
|
+
if documentFullPath.parent not in referenceFullPath.parent.parents:
|
|
824
|
+
yield Validation.error(
|
|
825
|
+
codes='EDINET.EC1013E',
|
|
826
|
+
msg=_("The URI in the HTML file directly beneath '%(reportPath)s' "
|
|
827
|
+
"specifies a path not under a subdirectory. "
|
|
828
|
+
"File name: '%(file)s' (line %(line)s). "
|
|
829
|
+
"Please move the referenced file into a subfolder beneath "
|
|
830
|
+
"'%(reportPath)s', or correct the URI."),
|
|
831
|
+
reportPath=str(documentPathInfo.reportPath),
|
|
832
|
+
file=uriReference.document.basename,
|
|
833
|
+
line=uriReference.element.sourceline,
|
|
834
|
+
modelObject=uriReference.element,
|
|
835
|
+
)
|
|
836
|
+
continue
|
|
837
|
+
|
|
838
|
+
elif referenceFullPath.parent == reportFullPath:
|
|
839
|
+
yield Validation.error(
|
|
840
|
+
codes='EDINET.EC1015E',
|
|
841
|
+
msg=_("The URI in the HTML file within a subdirectory specifies a "
|
|
842
|
+
"path to a file located directly beneath '%(reportPath)s'. "
|
|
843
|
+
"File name: '%(file)s' (line %(line)s). "
|
|
844
|
+
"You cannot create a link from a subfolder to this parent folder. "
|
|
845
|
+
"Please correct the relevant link."),
|
|
846
|
+
reportPath=str(documentPathInfo.reportPath),
|
|
847
|
+
file=uriReference.document.basename,
|
|
848
|
+
line=uriReference.element.sourceline,
|
|
849
|
+
modelObject=uriReference.element,
|
|
850
|
+
)
|
|
851
|
+
continue
|
|
852
|
+
|
|
853
|
+
referencePathInfo = uploadContents.uploadPathsByFullPath.get(referenceFullPath)
|
|
854
|
+
if referencePathInfo is not None and referencePathInfo.isDirectory:
|
|
855
|
+
yield Validation.error(
|
|
856
|
+
codes='EDINET.EC1014E',
|
|
857
|
+
msg=_("The URI in the HTML specifies a path to a directory. "
|
|
858
|
+
"File name: '%(file)s' (line %(line)s). "
|
|
859
|
+
"Please update the URI to reference a file."),
|
|
860
|
+
file=uriReference.document.basename,
|
|
861
|
+
line=uriReference.element.sourceline,
|
|
862
|
+
modelObject=uriReference.element,
|
|
863
|
+
)
|
|
864
|
+
continue
|
|
865
|
+
|
|
866
|
+
if referenceFullPath.suffix.lower() == '.pdf':
|
|
867
|
+
yield Validation.error(
|
|
868
|
+
codes='EDINET.EC1023E',
|
|
869
|
+
msg=_("The URI in the HTML specifies a path to a PDF file. "
|
|
870
|
+
"File name: '%(file)s' (line %(line)s). "
|
|
871
|
+
"Please remove the link from the relevant file."),
|
|
872
|
+
file=uriReference.document.basename,
|
|
873
|
+
line=uriReference.element.sourceline,
|
|
874
|
+
modelObject=uriReference.element,
|
|
875
|
+
)
|
|
876
|
+
continue
|
|
877
|
+
|
|
878
|
+
if not val.modelXbrl.fileSource.exists(str(referenceFullPath)):
|
|
879
|
+
yield Validation.error(
|
|
880
|
+
codes='EDINET.EC1021E',
|
|
881
|
+
msg=_("The linked file ('%(path)s') does not exist. "
|
|
882
|
+
"File name: '%(file)s' (line %(line)s). "
|
|
883
|
+
"Please update the URI to reference a file."),
|
|
884
|
+
path=str(uriPath),
|
|
885
|
+
file=uriReference.document.basename,
|
|
886
|
+
line=uriReference.element.sourceline,
|
|
887
|
+
modelObject=uriReference.element,
|
|
888
|
+
)
|
|
889
|
+
continue
|
|
890
|
+
|
|
891
|
+
|
|
892
|
+
@validation(
|
|
893
|
+
hook=ValidationHook.FILESOURCE,
|
|
894
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
895
|
+
)
|
|
896
|
+
def rule_EC1009R(
|
|
897
|
+
pluginData: ControllerPluginData,
|
|
898
|
+
cntlr: Cntlr,
|
|
899
|
+
fileSource: FileSource,
|
|
900
|
+
*args: Any,
|
|
901
|
+
**kwargs: Any,
|
|
902
|
+
) -> Iterable[Validation]:
|
|
903
|
+
"""
|
|
904
|
+
EDINET.EC1009R: The HTML file size must be 2.5MB (megabytes) or less.
|
|
905
|
+
"""
|
|
906
|
+
for path, size in pluginData.getUploadFileSizes(fileSource).items():
|
|
907
|
+
if path.suffix not in HTML_EXTENSIONS:
|
|
908
|
+
continue
|
|
909
|
+
if size > 2_500_000:
|
|
910
|
+
yield Validation.warning(
|
|
911
|
+
codes='EDINET.EC1009R',
|
|
912
|
+
msg=_("The HTML file size exceeds the maximum limit. "
|
|
913
|
+
"File name: '%(path)s'. "
|
|
914
|
+
"Please split the file so that the file size is 2.5MB or less."),
|
|
915
|
+
path=str(path),
|
|
916
|
+
)
|
|
917
|
+
|
|
918
|
+
|
|
919
|
+
@validation(
|
|
920
|
+
hook=ValidationHook.FILESOURCE,
|
|
921
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
922
|
+
)
|
|
923
|
+
def rule_EC1016E(
|
|
924
|
+
pluginData: ControllerPluginData,
|
|
925
|
+
cntlr: Cntlr,
|
|
926
|
+
fileSource: FileSource,
|
|
927
|
+
*args: Any,
|
|
928
|
+
**kwargs: Any,
|
|
929
|
+
) -> Iterable[Validation]:
|
|
930
|
+
"""
|
|
931
|
+
EDINET.EC1016E: The image file is over 300KB.
|
|
932
|
+
"""
|
|
933
|
+
for path, size in pluginData.getUploadFileSizes(fileSource).items():
|
|
934
|
+
if path.suffix not in IMAGE_EXTENSIONS:
|
|
935
|
+
continue
|
|
936
|
+
if size <= 300_000: # Interpretting KB as kilobytes (1,000 bytes)
|
|
937
|
+
continue
|
|
938
|
+
yield Validation.error(
|
|
939
|
+
codes='EDINET.EC1016E',
|
|
940
|
+
msg=_("The image file is over 300KB. "
|
|
941
|
+
"File name: '%(path)s'. "
|
|
942
|
+
"Please create an image file with a size of 300KB or less."),
|
|
943
|
+
path=str(path),
|
|
944
|
+
file=str(path),
|
|
945
|
+
)
|
|
946
|
+
|
|
947
|
+
|
|
948
|
+
@validation(
|
|
949
|
+
hook=ValidationHook.COMPLETE,
|
|
950
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
951
|
+
)
|
|
952
|
+
def rule_EC1017E(
|
|
953
|
+
pluginData: ControllerPluginData,
|
|
954
|
+
cntlr: Cntlr,
|
|
955
|
+
fileSource: FileSource,
|
|
956
|
+
*args: Any,
|
|
957
|
+
**kwargs: Any,
|
|
958
|
+
) -> Iterable[Validation]:
|
|
959
|
+
"""
|
|
960
|
+
EDINET.EC1017E: There is an unused file.
|
|
961
|
+
"""
|
|
962
|
+
uploadContents = pluginData.getUploadContents()
|
|
963
|
+
if uploadContents is None:
|
|
964
|
+
return
|
|
965
|
+
existingSubdirectoryFilepaths = {
|
|
966
|
+
path
|
|
967
|
+
for path, pathInfo in uploadContents.uploadPathsByPath.items()
|
|
968
|
+
if pathInfo.isSubdirectory and not pathInfo.isDirectory
|
|
969
|
+
}
|
|
970
|
+
usedFilepaths = pluginData.getUsedFilepaths()
|
|
971
|
+
unusedSubdirectoryFilepaths = existingSubdirectoryFilepaths - usedFilepaths
|
|
972
|
+
for path in unusedSubdirectoryFilepaths:
|
|
973
|
+
yield Validation.error(
|
|
974
|
+
codes='EDINET.EC1017E',
|
|
975
|
+
msg=_("There is an unused file. "
|
|
976
|
+
"File name: '%(file)s'. "
|
|
977
|
+
"Please remove the file or reference it in the HTML."),
|
|
978
|
+
file=str(path),
|
|
979
|
+
)
|
|
980
|
+
|
|
981
|
+
|
|
982
|
+
@validation(
|
|
983
|
+
hook=ValidationHook.COMPLETE,
|
|
984
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
985
|
+
)
|
|
986
|
+
def rule_toc(
|
|
987
|
+
pluginData: ControllerPluginData,
|
|
988
|
+
cntlr: Cntlr,
|
|
989
|
+
fileSource: FileSource,
|
|
990
|
+
*args: Any,
|
|
991
|
+
**kwargs: Any,
|
|
992
|
+
) -> Iterable[Validation]:
|
|
993
|
+
"""
|
|
994
|
+
Performs validation via controller-level TableOfContentsBuilder.
|
|
995
|
+
"""
|
|
996
|
+
tocBuilder = pluginData.getTableOfContentsBuilder()
|
|
997
|
+
yield from tocBuilder.validate()
|
|
998
|
+
|
|
999
|
+
|
|
1000
|
+
@validation(
|
|
1001
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
1002
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
1003
|
+
)
|
|
1004
|
+
def rule_toc_pre(
|
|
1005
|
+
pluginData: PluginValidationDataExtension,
|
|
1006
|
+
val: ValidateXbrl,
|
|
1007
|
+
*args: Any,
|
|
1008
|
+
**kwargs: Any,
|
|
1009
|
+
) -> Iterable[Validation]:
|
|
1010
|
+
"""
|
|
1011
|
+
Doesn't perform validations, but prepares data for TableOfContentsBuilder.
|
|
1012
|
+
"""
|
|
1013
|
+
manifestInstance = pluginData.getManifestInstance(val.modelXbrl)
|
|
1014
|
+
if manifestInstance is not None and manifestInstance.type == ReportFolderType.PUBLIC_DOC.value:
|
|
1015
|
+
pluginData.addToTableOfContents(val.modelXbrl)
|
|
1016
|
+
return iter(())
|
|
1017
|
+
|
|
1018
|
+
|
|
1019
|
+
@validation(
|
|
1020
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
1021
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
1022
|
+
)
|
|
1023
|
+
def rule_html_elements(
|
|
1024
|
+
pluginData: PluginValidationDataExtension,
|
|
1025
|
+
val: ValidateXbrl,
|
|
1026
|
+
*args: Any,
|
|
1027
|
+
**kwargs: Any,
|
|
1028
|
+
) -> Iterable[Validation]:
|
|
1029
|
+
"""
|
|
1030
|
+
EDINET.EC1011E: The HTML lang attribute is not Japanese.
|
|
1031
|
+
EDINET.EC1020E: When writing a DOCTYPE declaration, do not define it multiple times.
|
|
1032
|
+
Also, please modify the relevant file so that there is only one html tag, one head tag, and one body tag each.
|
|
1033
|
+
|
|
1034
|
+
Note: Some violations of EC1020E (such as multiple DOCTYPE declarations) prevent Arelle from parsing
|
|
1035
|
+
the XML at all, and thus an XML schema error will be triggered rather than this validation error.
|
|
1036
|
+
"""
|
|
1037
|
+
checkNames = frozenset({'body', 'head', 'html'})
|
|
1038
|
+
for modelDocument in val.modelXbrl.urlDocs.values():
|
|
1039
|
+
path = Path(modelDocument.uri)
|
|
1040
|
+
if path.suffix not in HTML_EXTENSIONS:
|
|
1041
|
+
continue
|
|
1042
|
+
rootElt = modelDocument.xmlRootElement
|
|
1043
|
+
eltCounts = {
|
|
1044
|
+
rootElt.qname.localName: 1
|
|
1045
|
+
}
|
|
1046
|
+
for elt in rootElt.iterdescendants():
|
|
1047
|
+
if not isinstance(elt, ModelObject):
|
|
1048
|
+
continue
|
|
1049
|
+
name = elt.qname.localName
|
|
1050
|
+
if name in checkNames:
|
|
1051
|
+
eltCounts[name] = eltCounts.get(name, 0) + 1
|
|
1052
|
+
if not isinstance(elt, ModelFact):
|
|
1053
|
+
lang = elt.get(XbrlConst.qnXmlLang.clarkNotation)
|
|
1054
|
+
if lang is not None and lang not in JAPAN_LANGUAGE_CODES:
|
|
1055
|
+
yield Validation.error(
|
|
1056
|
+
codes='EDINET.EC1011E',
|
|
1057
|
+
msg=_("The language setting is not Japanese. "
|
|
1058
|
+
"File name: %(file)s (line %(line)s). "
|
|
1059
|
+
"Please set the lang attribute on the given line of the "
|
|
1060
|
+
"relevant file to one of the following: %(langValues)s."),
|
|
1061
|
+
file=modelDocument.basename,
|
|
1062
|
+
line=elt.sourceline,
|
|
1063
|
+
langValues=', '.join(JAPAN_LANGUAGE_CODES),
|
|
1064
|
+
)
|
|
1065
|
+
|
|
1066
|
+
if any(count > 1 for count in eltCounts.values()):
|
|
1067
|
+
yield Validation.error(
|
|
1068
|
+
codes='EDINET.EC1020E',
|
|
1069
|
+
msg=_("The HTML syntax is incorrect. "
|
|
1070
|
+
"File name: '%(path)s'. "
|
|
1071
|
+
"When writing a DOCTYPE declaration, do not define it multiple times. "
|
|
1072
|
+
"Also, please modify the relevant file so that there is only one html tag, "
|
|
1073
|
+
"one head tag, and one body tag each."),
|
|
1074
|
+
path=str(path),
|
|
1075
|
+
file=str(path),
|
|
1076
|
+
)
|
|
1077
|
+
|
|
1078
|
+
|
|
1079
|
+
@validation(
|
|
1080
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
1081
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
1082
|
+
)
|
|
1083
|
+
def rule_EC1031E(
|
|
1084
|
+
pluginData: PluginValidationDataExtension,
|
|
1085
|
+
val: ValidateXbrl,
|
|
1086
|
+
*args: Any,
|
|
1087
|
+
**kwargs: Any,
|
|
1088
|
+
) -> Iterable[Validation]:
|
|
1089
|
+
"""
|
|
1090
|
+
EDINET.EC1031E: Prohibited attribute is used in HTML.
|
|
1091
|
+
"""
|
|
1092
|
+
for doc in val.modelXbrl.urlDocs.values():
|
|
1093
|
+
for elt, attributeName in pluginData.getProhibitedAttributeElements(doc):
|
|
1094
|
+
yield Validation.error(
|
|
1095
|
+
codes='EDINET.EC1031E',
|
|
1096
|
+
msg=_("Prohibited attribute '%(attributeName)s' is used in HTML. "
|
|
1097
|
+
"File name: %(file)s (line %(line)s). "
|
|
1098
|
+
"Please correct the tag attributes of the relevant file."),
|
|
1099
|
+
attributeName=attributeName,
|
|
1100
|
+
file=doc.basename,
|
|
1101
|
+
line=elt.sourceline,
|
|
1102
|
+
modelObject=elt,
|
|
1103
|
+
)
|
|
1104
|
+
|
|
1105
|
+
|
|
1106
|
+
@validation(
|
|
1107
|
+
hook=ValidationHook.FILESOURCE,
|
|
1108
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
1109
|
+
)
|
|
1110
|
+
def rule_EC5032E(
|
|
1111
|
+
pluginData: ControllerPluginData,
|
|
1112
|
+
cntlr: Cntlr,
|
|
1113
|
+
fileSource: FileSource,
|
|
1114
|
+
*args: Any,
|
|
1115
|
+
**kwargs: Any,
|
|
1116
|
+
) -> Iterable[Validation]:
|
|
1117
|
+
"""
|
|
1118
|
+
EDINET.EC5032E: A manifest file for an IFRS submission must not define multiple instances.
|
|
1119
|
+
"""
|
|
1120
|
+
instances = pluginData.getManifestInstances()
|
|
1121
|
+
instancesByManifest = defaultdict(list)
|
|
1122
|
+
for instance in instances:
|
|
1123
|
+
instancesByManifest[instance.path].append(instance)
|
|
1124
|
+
for manifestPath, instances in instancesByManifest.items():
|
|
1125
|
+
if len(instances) < 2:
|
|
1126
|
+
continue
|
|
1127
|
+
for instance in instances:
|
|
1128
|
+
if instance.filingFormat is None:
|
|
1129
|
+
continue
|
|
1130
|
+
if (
|
|
1131
|
+
instance.filingFormat.ordinance == Ordinance.IFRS or
|
|
1132
|
+
Taxonomy.IFRS in instance.filingFormat.taxonomies
|
|
1133
|
+
):
|
|
1134
|
+
yield Validation.error(
|
|
1135
|
+
codes='EDINET.EC5032E',
|
|
1136
|
+
msg=_("A manifest file for an IFRS submission defines multiple instances. "
|
|
1137
|
+
"File: '%(path)s'. "
|
|
1138
|
+
"If you use the IFRS taxonomy, please specify only one instance."),
|
|
1139
|
+
path=str(manifestPath),
|
|
1140
|
+
)
|
|
1141
|
+
break
|
|
1142
|
+
|
|
1143
|
+
|
|
1144
|
+
@validation(
|
|
1145
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
1146
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
1147
|
+
)
|
|
1148
|
+
def rule_EC8023W(
|
|
1149
|
+
pluginData: PluginValidationDataExtension,
|
|
1150
|
+
val: ValidateXbrl,
|
|
1151
|
+
*args: Any,
|
|
1152
|
+
**kwargs: Any,
|
|
1153
|
+
) -> Iterable[Validation]:
|
|
1154
|
+
"""
|
|
1155
|
+
EDINET.EC8023W: In IXBRL files, 'nonFraction' elements should be immediately preceded by
|
|
1156
|
+
'△' if and only if the sign attribute is '-'.
|
|
1157
|
+
|
|
1158
|
+
* Tagging using International Financial Reporting Standards taxonomy elements is not checked.
|
|
1159
|
+
* Tagging using Japanese GAAP notes or IFRS financial statement filer-specific additional elements
|
|
1160
|
+
may be identified as an exception and a warning displayed, even if the data content is correct.
|
|
1161
|
+
|
|
1162
|
+
Note: This implementation interprets "immediately preceded" to mean that the symbol is present in the text
|
|
1163
|
+
immediately before the target element, not nested within, or separated by, siblings elements. The use of
|
|
1164
|
+
this symbol in sample filings support this interpretation.
|
|
1165
|
+
"""
|
|
1166
|
+
negativeChar = '△'
|
|
1167
|
+
for fact in val.modelXbrl.facts:
|
|
1168
|
+
if not isinstance(fact, ModelInlineFact):
|
|
1169
|
+
continue
|
|
1170
|
+
if fact.localName != 'nonFraction':
|
|
1171
|
+
continue
|
|
1172
|
+
if fact.qname.namespaceURI == pluginData.jpigpNamespace:
|
|
1173
|
+
continue
|
|
1174
|
+
|
|
1175
|
+
precedingChar = None
|
|
1176
|
+
precedingSibling = fact.getprevious()
|
|
1177
|
+
# Check for the tail of the preceding sibling first.
|
|
1178
|
+
if precedingSibling is not None:
|
|
1179
|
+
if precedingSibling.tail:
|
|
1180
|
+
strippedText = precedingSibling.tail.strip()
|
|
1181
|
+
if strippedText:
|
|
1182
|
+
precedingChar = strippedText[-1]
|
|
1183
|
+
# If nothing found, check the parent element if this is the first child.
|
|
1184
|
+
elif (parent := fact.getparent()) is not None:
|
|
1185
|
+
if fact == list(parent)[0] and parent.text:
|
|
1186
|
+
strippedText = parent.text.strip()
|
|
1187
|
+
if strippedText:
|
|
1188
|
+
precedingChar = strippedText[-1]
|
|
1189
|
+
|
|
1190
|
+
if fact.sign == '-' :
|
|
1191
|
+
if precedingChar != negativeChar:
|
|
1192
|
+
yield Validation.error(
|
|
1193
|
+
codes='EDINET.EC8023W',
|
|
1194
|
+
msg=_("In an inline XBRL file, if the sign attribute of the ix:nonFraction "
|
|
1195
|
+
"element is set to \"-\" (minus), you must set \"△\" immediately "
|
|
1196
|
+
"before the ix:nonFraction element tag."),
|
|
1197
|
+
modelObject=fact,
|
|
1198
|
+
)
|
|
1199
|
+
else:
|
|
1200
|
+
if precedingChar == negativeChar:
|
|
1201
|
+
yield Validation.error(
|
|
1202
|
+
codes='EDINET.EC8023W',
|
|
1203
|
+
msg=_("In an inline XBRL file, if the sign attribute of the ix:nonFraction "
|
|
1204
|
+
"element is not set to \"-\" (minus), there is no need to set \"△\" "
|
|
1205
|
+
"immediately before the ix:nonFraction element tag."),
|
|
1206
|
+
modelObject=fact,
|
|
1207
|
+
)
|
|
1208
|
+
|
|
1209
|
+
|
|
1210
|
+
|
|
1211
|
+
@validation(
|
|
1212
|
+
hook=ValidationHook.FILESOURCE,
|
|
1213
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
1214
|
+
)
|
|
1215
|
+
def rule_filenames(
|
|
1216
|
+
pluginData: ControllerPluginData,
|
|
1217
|
+
cntlr: Cntlr,
|
|
1218
|
+
fileSource: FileSource,
|
|
1219
|
+
*args: Any,
|
|
1220
|
+
**kwargs: Any,
|
|
1221
|
+
) -> Iterable[Validation]:
|
|
1222
|
+
"""
|
|
1223
|
+
EDINET.EC0121E: There is a directory or file that contains
|
|
1224
|
+
more than 31 characters or uses characters other than those allowed (alphanumeric characters,
|
|
1225
|
+
'-' and '_').
|
|
1226
|
+
Note: Applies to everything EXCEPT files directly beneath non-correction report folders.
|
|
1227
|
+
|
|
1228
|
+
EDINET.EC0200E: There is a file that uses characters other
|
|
1229
|
+
than those allowed (alphanumeric characters, '-' and '_').
|
|
1230
|
+
Note: Applies ONLY to files directly beneath non-correction report folders.
|
|
1231
|
+
"""
|
|
1232
|
+
uploadContents = pluginData.getUploadContents()
|
|
1233
|
+
if uploadContents is None:
|
|
1234
|
+
return
|
|
1235
|
+
for path, pathInfo in uploadContents.uploadPathsByPath.items():
|
|
1236
|
+
isReportFile = (
|
|
1237
|
+
not pathInfo.isAttachment and
|
|
1238
|
+
not pathInfo.isCorrection and
|
|
1239
|
+
not pathInfo.isDirectory and
|
|
1240
|
+
not pathInfo.isSubdirectory
|
|
1241
|
+
)
|
|
1242
|
+
charactersAreValid = FILENAME_STEM_PATTERN.fullmatch(path.stem)
|
|
1243
|
+
lengthIsValid = isReportFile or (len(path.name) <= 31)
|
|
1244
|
+
if charactersAreValid and lengthIsValid:
|
|
1245
|
+
continue
|
|
1246
|
+
if isReportFile:
|
|
1247
|
+
yield Validation.error(
|
|
1248
|
+
codes='EDINET.EC0200E',
|
|
1249
|
+
msg=_("There is a file inside the XBRL directory that uses characters "
|
|
1250
|
+
"other than those allowed (alphanumeric characters, '-' and '_'). "
|
|
1251
|
+
"File: '%(path)s'. "
|
|
1252
|
+
"Please change the filename to usable characters, and upload again."),
|
|
1253
|
+
path=str(path)
|
|
1254
|
+
)
|
|
1255
|
+
else:
|
|
1256
|
+
yield Validation.error(
|
|
1257
|
+
codes='EDINET.EC0121E',
|
|
1258
|
+
msg=_("There is a directory or file in '%(directory)s' that contains more "
|
|
1259
|
+
"than 31 characters or uses characters other than those allowed "
|
|
1260
|
+
"(alphanumeric characters, '-' and '_'). "
|
|
1261
|
+
"Directory or filename: '%(basename)s'. "
|
|
1262
|
+
"Please change the file name (or folder name) to within 31 characters and to usable "
|
|
1263
|
+
"characters, and upload again."),
|
|
1264
|
+
directory=str(path.parent),
|
|
1265
|
+
basename=path.name,
|
|
1266
|
+
)
|
|
1267
|
+
|
|
1268
|
+
|
|
1269
|
+
@validation(
|
|
1270
|
+
hook=ValidationHook.FILESOURCE,
|
|
1271
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
1272
|
+
)
|
|
1273
|
+
def rule_manifest_preferredFilename(
|
|
1274
|
+
pluginData: ControllerPluginData,
|
|
1275
|
+
cntlr: Cntlr,
|
|
1276
|
+
fileSource: FileSource,
|
|
1277
|
+
*args: Any,
|
|
1278
|
+
**kwargs: Any,
|
|
1279
|
+
) -> Iterable[Validation]:
|
|
1280
|
+
"""
|
|
1281
|
+
EDINET.EC5804E: The preferredFilename attribute must be set on the instance
|
|
1282
|
+
element in the manifest file.
|
|
1283
|
+
|
|
1284
|
+
EDINET.EC5805E: The instance file extension is not ".xbrl". File name: xxx
|
|
1285
|
+
Please change the extension of the instance name set in the preferredFilename
|
|
1286
|
+
attribute value of the instance element in the manifest file to ".xbrl".
|
|
1287
|
+
|
|
1288
|
+
EDINET.EC5806E: The same instance file name is set multiple times. File name: xxx
|
|
1289
|
+
The preferredFilename attribute value of the instance element in the manifest
|
|
1290
|
+
file must be unique within the same file.
|
|
1291
|
+
|
|
1292
|
+
EDINET.EC8008W: The file name of the report instance set in the manifest file
|
|
1293
|
+
does not conform to the rules.
|
|
1294
|
+
|
|
1295
|
+
EDINET.EC8009W: The file name of the audit report instance set in the manifest file
|
|
1296
|
+
does not conform to the rules.
|
|
1297
|
+
"""
|
|
1298
|
+
instances = pluginData.getManifestInstances()
|
|
1299
|
+
preferredFilenames: dict[Path, set[str]] = defaultdict(set)
|
|
1300
|
+
duplicateFilenames = defaultdict(set)
|
|
1301
|
+
for instance in instances:
|
|
1302
|
+
if len(instance.preferredFilename) == 0:
|
|
1303
|
+
yield Validation.error(
|
|
1304
|
+
codes='EDINET.EC5804E',
|
|
1305
|
+
msg=_("The instance file name is not set. "
|
|
1306
|
+
"Set the instance name as the preferredFilename attribute value "
|
|
1307
|
+
"of the instance element in the manifest file. (manifest: '%(manifest)s', id: %(id)s)"),
|
|
1308
|
+
manifest=str(instance.path),
|
|
1309
|
+
id=instance.id,
|
|
1310
|
+
)
|
|
1311
|
+
continue
|
|
1312
|
+
|
|
1313
|
+
preferredFilename = Path(instance.preferredFilename)
|
|
1314
|
+
if preferredFilename.suffix != '.xbrl':
|
|
1315
|
+
yield Validation.error(
|
|
1316
|
+
codes='EDINET.EC5805E',
|
|
1317
|
+
msg=_("The instance file extension is not '.xbrl'. "
|
|
1318
|
+
"File name: '%(preferredFilename)s'. "
|
|
1319
|
+
"Please change the extension of the instance name set in the "
|
|
1320
|
+
"preferredFilename attribute value of the instance element in "
|
|
1321
|
+
"the manifest file to '.xbrl'. (manifest: '%(manifest)s', id: %(id)s)"),
|
|
1322
|
+
preferredFilename=instance.preferredFilename,
|
|
1323
|
+
manifest=str(instance.path),
|
|
1324
|
+
id=instance.id,
|
|
1325
|
+
)
|
|
1326
|
+
continue
|
|
1327
|
+
|
|
1328
|
+
reportFolderType = ReportFolderType.parse(instance.type)
|
|
1329
|
+
match = True if reportFolderType is None else any(
|
|
1330
|
+
pattern.fullmatch(preferredFilename.name)
|
|
1331
|
+
for pattern in reportFolderType.xbrlFilenamePatterns
|
|
1332
|
+
)
|
|
1333
|
+
if not match:
|
|
1334
|
+
if reportFolderType == ReportFolderType.AUDIT_DOC:
|
|
1335
|
+
yield Validation.warning(
|
|
1336
|
+
codes='EDINET.EC8009W',
|
|
1337
|
+
msg=_("The file name of the audit report instance set in the manifest "
|
|
1338
|
+
"file does not conform to the rules. "
|
|
1339
|
+
"File name: '%(file)s'. "
|
|
1340
|
+
"Please set the file name of the corresponding audit report instance "
|
|
1341
|
+
"according to the rules. Please correct the contents of the manifest file."),
|
|
1342
|
+
file=preferredFilename.name,
|
|
1343
|
+
)
|
|
1344
|
+
else:
|
|
1345
|
+
yield Validation.warning(
|
|
1346
|
+
codes='EDINET.EC8008W',
|
|
1347
|
+
msg=_("The file name of the report instance set in the manifest "
|
|
1348
|
+
"file does not comply with the regulations. "
|
|
1349
|
+
"File name: '%(file)s'. "
|
|
1350
|
+
"Please set the file name of the corresponding report instance "
|
|
1351
|
+
"according to the rules. Please correct the contents of the manifest file."),
|
|
1352
|
+
file=preferredFilename.name,
|
|
1353
|
+
)
|
|
1354
|
+
|
|
1355
|
+
if instance.preferredFilename in preferredFilenames[instance.path]:
|
|
1356
|
+
duplicateFilenames[instance.path].add(instance.preferredFilename)
|
|
1357
|
+
continue
|
|
1358
|
+
preferredFilenames[instance.path].add(instance.preferredFilename)
|
|
1359
|
+
for path, filenames in duplicateFilenames.items():
|
|
1360
|
+
for filename in filenames:
|
|
1361
|
+
yield Validation.error(
|
|
1362
|
+
codes='EDINET.EC5806E',
|
|
1363
|
+
msg=_("The same instance file name is set multiple times. "
|
|
1364
|
+
"File name: '%(preferredFilename)s'. "
|
|
1365
|
+
"The preferredFilename attribute value of the instance "
|
|
1366
|
+
"element in the manifest file must be unique within the "
|
|
1367
|
+
"same file. (manifest: '%(manifest)s')"),
|
|
1368
|
+
manifest=str(path),
|
|
1369
|
+
preferredFilename=filename,
|
|
1370
|
+
)
|