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
|
@@ -1,1282 +0,0 @@
|
|
|
1
|
-
'''
|
|
2
|
-
loadFromExcel.py is an example of a plug-in that will load an extension taxonomy from Excel
|
|
3
|
-
input and optionally save an (extension) DTS.
|
|
4
|
-
|
|
5
|
-
See COPYRIGHT.md for copyright information.
|
|
6
|
-
|
|
7
|
-
Example to run from web server:
|
|
8
|
-
|
|
9
|
-
1) POSTing excel in a zip, getting instance and log back in zip:
|
|
10
|
-
|
|
11
|
-
curl -k -v -X POST "-HContent-type: application/zip" -T /Users/hermf/Documents/blahblah.xlsx.zip "localhost:8080/rest/xbrl/open?media=zip&file=WIP_DETAILED_3.xlsx&plugins=loadFromOIM&saveOIMinstance=myinstance.xbrl" -o out.zip
|
|
12
|
-
|
|
13
|
-
2) POSTing json within an archive of XII test cases and log and instance back in zip
|
|
14
|
-
|
|
15
|
-
curl -k -v -X POST "-HContent-type: application/zip" -T test.zip "localhost:8080/rest/xbrl/open?media=zip&file=100-json/helloWorld.json&plugins=loadFromOIM&saveOIMinstance=myinstance.xbrl" -o out.zip
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
'''
|
|
19
|
-
import os, sys, io, time, traceback, json, csv, logging, math, zipfile
|
|
20
|
-
import regex as re
|
|
21
|
-
from collections import defaultdict, OrderedDict
|
|
22
|
-
from arelle.ModelDocument import Type, create as createModelDocument
|
|
23
|
-
from arelle import XbrlConst, ModelDocument, ModelXbrl, ValidateXbrlDimensions
|
|
24
|
-
from arelle.ModelDocument import Type, create as createModelDocument
|
|
25
|
-
from arelle.ModelValue import qname, dateTime, DATETIME
|
|
26
|
-
from arelle.PrototypeInstanceObject import DimValuePrototype
|
|
27
|
-
from arelle.PythonUtil import attrdict
|
|
28
|
-
from arelle.UrlUtil import isHttpUrl
|
|
29
|
-
from arelle.Version import authorLabel, copyrightLabel
|
|
30
|
-
from arelle.XbrlConst import (qnLinkLabel, standardLabelRoles, qnLinkReference, standardReferenceRoles,
|
|
31
|
-
qnLinkPart, gen, link, defaultLinkRole,
|
|
32
|
-
conceptLabel, elementLabel, conceptReference
|
|
33
|
-
)
|
|
34
|
-
from arelle.XmlUtil import addChild, addQnameValue
|
|
35
|
-
from arelle.XmlValidate import NCNamePattern, validate as xmlValidate
|
|
36
|
-
|
|
37
|
-
nsOim = "http://www.xbrl.org/CR/2018-12-12"
|
|
38
|
-
nsOims = (nsOim,
|
|
39
|
-
"http://www.xbrl.org/WGWD/YYYY-MM-DD",
|
|
40
|
-
"http://www.xbrl.org/PWD/2016-01-13/oim",
|
|
41
|
-
"http://www.xbrl.org/WGWD/YYYY-MM-DD/oim"
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
XLINKTYPE = "{http://www.w3.org/1999/xlink}type"
|
|
47
|
-
XLINKLABEL = "{http://www.w3.org/1999/xlink}label"
|
|
48
|
-
XLINKARCROLE = "{http://www.w3.org/1999/xlink}arcrole"
|
|
49
|
-
XLINKFROM = "{http://www.w3.org/1999/xlink}from"
|
|
50
|
-
XLINKTO = "{http://www.w3.org/1999/xlink}to"
|
|
51
|
-
XLINKHREF = "{http://www.w3.org/1999/xlink}href"
|
|
52
|
-
XMLLANG = "{http://www.w3.org/XML/1998/namespace}lang"
|
|
53
|
-
|
|
54
|
-
JSONdocumentType = "http://www.xbrl.org/WGWD/YYYY-MM-DD/xbrl-json"
|
|
55
|
-
CSVmetadata = "http://xbrl.org/YYYY/model#metadata"
|
|
56
|
-
CSVproperties = "http://xbrl.org/YYYY/model#properties"
|
|
57
|
-
CSVdocumentType = "http://xbrl.org/YYYY/xbrl-csv"
|
|
58
|
-
CSVtupleReferenceId = "http://xbrl.org/YYYY/model#tupleReferenceId"
|
|
59
|
-
CSVcolumnType = "http://xbrl.org/YYYY/model#columnType"
|
|
60
|
-
CSVcolumnProperty = "http://xbrl.org/YYYY/model#columnProperty"
|
|
61
|
-
|
|
62
|
-
JSONReservedPrefixes = {
|
|
63
|
-
"xbrl": nsOims,
|
|
64
|
-
"xbrli": (XbrlConst.xbrli,),
|
|
65
|
-
"footnotes": (XbrlConst.factFootnote,),
|
|
66
|
-
"explanatoryFact": (XbrlConst.factExplanatoryFact,),
|
|
67
|
-
"defaultGroup": (XbrlConst.defaultLinkRole,),
|
|
68
|
-
"xsd": (XbrlConst.xsd,),
|
|
69
|
-
"xbrlje": [ns + "/xbrl-json/error" for ns in nsOims]
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
oimConcept = "concept"
|
|
73
|
-
oimEntity = "entity"
|
|
74
|
-
oimPeriod = "period"
|
|
75
|
-
oimUnit = "unit"
|
|
76
|
-
oimLanguage = "language"
|
|
77
|
-
oimPrefix = "xbrl:"
|
|
78
|
-
oimSimpleFactProperties = {oimEntity, oimPeriod, oimUnit, "decimals"}
|
|
79
|
-
|
|
80
|
-
qnXbrlNote = qname(nsOim, "note")
|
|
81
|
-
|
|
82
|
-
DUPJSONKEY = "!@%duplicateKeys%@!"
|
|
83
|
-
DUPJSONVALUE = "!@%duplicateValues%@!"
|
|
84
|
-
|
|
85
|
-
EMPTYDICT = {}
|
|
86
|
-
|
|
87
|
-
PrefixedQName = re.compile(
|
|
88
|
-
"[_A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\xFF\u0100-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]"
|
|
89
|
-
r"[_\-\."
|
|
90
|
-
"\xB7A-Za-z0-9\xC0-\xD6\xD8-\xF6\xF8-\xFF\u0100-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u0300-\u036F\u203F-\u2040]*:"
|
|
91
|
-
"[_A-Za-z\xC0-\xD6\xD8-\xF6\xF8-\xFF\u0100-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]"
|
|
92
|
-
r"[_\-\."
|
|
93
|
-
"\xB7A-Za-z0-9\xC0-\xD6\xD8-\xF6\xF8-\xFF\u0100-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u0300-\u036F\u203F-\u2040]*")
|
|
94
|
-
UnitPrefixedQNameSubstitutionChar = "\x07" # replaces PrefixedQName in unit pattern
|
|
95
|
-
UnitPattern = re.compile(
|
|
96
|
-
# QNames are replaced by \x07 in these expressions
|
|
97
|
-
# numerator only (no parentheses)
|
|
98
|
-
"(^\x07$)|(^\x07([*]\x07)+$)|"
|
|
99
|
-
# numerator and optional denominator, with parentheses if more than one term in either
|
|
100
|
-
"(^((\x07)|([(]\x07([*]\x07)+[)]))([/]((\x07)|([(]\x07([*]\x07)+[)])))?$)"
|
|
101
|
-
)
|
|
102
|
-
|
|
103
|
-
xlUnicodePattern = re.compile("_x([0-9A-F]{4})_")
|
|
104
|
-
|
|
105
|
-
def xlUnicodeChar(match):
|
|
106
|
-
return chr(int(match.group(1), 16))
|
|
107
|
-
|
|
108
|
-
def xlValue(cell): # excel values may have encoded unicode, such as _0000D_
|
|
109
|
-
v = cell.value
|
|
110
|
-
if isinstance(v, str):
|
|
111
|
-
return xlUnicodePattern.sub(xlUnicodeChar, v).replace('\r\n','\n').replace('\r','\n')
|
|
112
|
-
return v
|
|
113
|
-
|
|
114
|
-
class OIMException(Exception):
|
|
115
|
-
def __init__(self, code, message, **kwargs):
|
|
116
|
-
self.code = code
|
|
117
|
-
self.message = message
|
|
118
|
-
self.msgArgs = kwargs
|
|
119
|
-
self.args = ( self.__repr__(), )
|
|
120
|
-
def __repr__(self):
|
|
121
|
-
return _('[{0}] exception {1}').format(self.code, self.message % self.msgArgs)
|
|
122
|
-
|
|
123
|
-
class NotOIMException(Exception):
|
|
124
|
-
def __init__(self, **kwargs):
|
|
125
|
-
self.args = ( self.__repr__(), )
|
|
126
|
-
def __repr__(self):
|
|
127
|
-
return _('[NotOIM] not an OIM document')
|
|
128
|
-
|
|
129
|
-
def csvCellValue(cellValue):
|
|
130
|
-
if cellValue == "#nil":
|
|
131
|
-
return None
|
|
132
|
-
elif cellValue == "#empty":
|
|
133
|
-
return ""
|
|
134
|
-
elif isinstance(cellValue, str) and cellValue.startswith("##"):
|
|
135
|
-
return cellValue[1:]
|
|
136
|
-
else:
|
|
137
|
-
return cellValue
|
|
138
|
-
|
|
139
|
-
def loadFromOIM(cntlr, error, warning, modelXbrl, oimFile, mappedUri, oimObject=None):
|
|
140
|
-
from openpyxl import load_workbook
|
|
141
|
-
from openpyxl.cell import Cell
|
|
142
|
-
from arelle import ModelDocument, ModelXbrl, XmlUtil
|
|
143
|
-
from arelle.ModelDocument import ModelDocumentReference
|
|
144
|
-
from arelle.ModelValue import qname
|
|
145
|
-
|
|
146
|
-
_return = None # modelDocument or an exception
|
|
147
|
-
|
|
148
|
-
try:
|
|
149
|
-
currentAction = "initializing"
|
|
150
|
-
startingErrorCount = len(modelXbrl.errors) if modelXbrl else 0
|
|
151
|
-
startedAt = time.time()
|
|
152
|
-
|
|
153
|
-
if not modelXbrl.fileSource.isArchive and os.path.isabs(oimFile):
|
|
154
|
-
# allow relative filenames to loading directory
|
|
155
|
-
priorCWD = os.getcwd()
|
|
156
|
-
os.chdir(os.path.dirname(oimFile))
|
|
157
|
-
else:
|
|
158
|
-
priorCWD = None
|
|
159
|
-
|
|
160
|
-
currentAction = "determining file type"
|
|
161
|
-
isXL = oimFile.endswith(".xlsx") or oimFile.endswith(".xls")
|
|
162
|
-
isJSON = False
|
|
163
|
-
isCSV = False # oimFile.endswith(".csv") # this option is not currently supported
|
|
164
|
-
isCSVorXL = isCSV or isXL
|
|
165
|
-
instanceFileName = os.path.splitext(oimFile)[0] + ".xbrl"
|
|
166
|
-
_csvwContext = None
|
|
167
|
-
anonymousFactId = 0
|
|
168
|
-
|
|
169
|
-
if not isXL: # try as JSON
|
|
170
|
-
errPrefix = "xbrlje"
|
|
171
|
-
currentAction = "loading and parsing JSON OIM file"
|
|
172
|
-
def loadDict(keyValuePairs):
|
|
173
|
-
_dict = OrderedDict() # preserve fact order in resulting instance
|
|
174
|
-
_valueKeyDict = {}
|
|
175
|
-
for key, value in keyValuePairs:
|
|
176
|
-
if isinstance(value, dict):
|
|
177
|
-
if DUPJSONKEY in value:
|
|
178
|
-
for _errKey, _errValue, _otherValue in value[DUPJSONKEY]:
|
|
179
|
-
if key == "prefixes":
|
|
180
|
-
error("xbrlje:invalidPrefixMap",
|
|
181
|
-
_("The prefix %(prefix)s is used on uri %(uri1)s and uri %(uri2)s"),
|
|
182
|
-
modelObject=modelXbrl, prefix=_errKey, uri1=_errValue, uri2=_otherValue)
|
|
183
|
-
del value[DUPJSONKEY]
|
|
184
|
-
if DUPJSONVALUE in value:
|
|
185
|
-
for _errValue, _errKey, _otherKey in value[DUPJSONVALUE]:
|
|
186
|
-
if key == "prefixes":
|
|
187
|
-
error("xbrlje:invalidPrefixMap",
|
|
188
|
-
_("The value %(uri)s is used on prefix %(prefix1)s and uri %(prefix2)s"),
|
|
189
|
-
modelObject=modelXbrl, prefix=_errValue, key1=_errKey, uri2=_otherKey)
|
|
190
|
-
del value[DUPJSONVALUE]
|
|
191
|
-
if key == "prefixes":
|
|
192
|
-
for _key, _value in value.items():
|
|
193
|
-
if _key in JSONReservedPrefixes and _value not in JSONReservedPrefixes[_key]:
|
|
194
|
-
error("xbrlje:invalidPrefixMap",
|
|
195
|
-
_("The value %(uri)s is used on standard prefix %(prefix)s which requires uri %(standardUri)s"),
|
|
196
|
-
modelObject=modelXbrl, prefix=_key, uri=_value, standardUri=JSONReservedPrefixes[_key][0])
|
|
197
|
-
elif _key.startswith("xbrl") and not _value.startswith("http://www.xbrl.org/"):
|
|
198
|
-
error("xbrlje:invalidPrefixMap",
|
|
199
|
-
_("The key %(key)s must be bound to an xbrl URI instead of %(uri)s"),
|
|
200
|
-
modelObject=modelXbrl, prefix=_key, uri=_value)
|
|
201
|
-
if key == "":
|
|
202
|
-
error("xbrlje:invalidPrefixMap",
|
|
203
|
-
_("The empty string prefix is used on uri %(uri)s"),
|
|
204
|
-
modelObject=modelXbrl, prefix="", uri=_errValue)
|
|
205
|
-
elif key in _dict:
|
|
206
|
-
if DUPJSONKEY not in _dict:
|
|
207
|
-
_dict[DUPJSONKEY] = []
|
|
208
|
-
_dict[DUPJSONKEY].append((key, value, _dict[key]))
|
|
209
|
-
elif isinstance(value, str) and value in _valueKeyDict:
|
|
210
|
-
if DUPJSONVALUE not in _dict:
|
|
211
|
-
_dict[DUPJSONVALUE] = []
|
|
212
|
-
_dict[DUPJSONVALUE].append((value, key, _valueKeyDict[value]))
|
|
213
|
-
else:
|
|
214
|
-
_dict[key] = value
|
|
215
|
-
if isinstance(value, str):
|
|
216
|
-
_valueKeyDict[value] = key
|
|
217
|
-
return _dict
|
|
218
|
-
if oimObject is None:
|
|
219
|
-
_file, encoding = modelXbrl.fileSource.file(oimFile, encoding='utf-8')
|
|
220
|
-
with _file as f:
|
|
221
|
-
oimObject = json.load(f, object_pairs_hook=loadDict)
|
|
222
|
-
isJSON = True # would raise exception before here if not json
|
|
223
|
-
# check if it's a CSVW metadata
|
|
224
|
-
_csvwContext = oimObject.get("@context")
|
|
225
|
-
if _csvwContext == "http://www.w3.org/ns/csvw" or (
|
|
226
|
-
isinstance(_csvwContext, list) and "http://www.w3.org/ns/csvw" in _csvwContext) or (
|
|
227
|
-
any(e in oimObject for e in (CSVmetadata, CSVproperties, "tables"))
|
|
228
|
-
):
|
|
229
|
-
isJSON = False
|
|
230
|
-
isCSV = True
|
|
231
|
-
else:
|
|
232
|
-
missing = [t for t in ("documentInfo", "facts") if t not in oimObject]
|
|
233
|
-
missing += [t for t in ("documentType", "taxonomy", "prefixes", "features") if t not in oimObject.get("documentInfo", {})]
|
|
234
|
-
if missing:
|
|
235
|
-
raise OIMException("xbrlje:missingJSONElements",
|
|
236
|
-
_("Required element(s) are missing from JSON input: %(missing)s"),
|
|
237
|
-
missing = ", ".join(missing))
|
|
238
|
-
oimDocumentInfo = oimObject["documentInfo"]
|
|
239
|
-
if oimDocumentInfo["documentType"] != JSONdocumentType:
|
|
240
|
-
raise OIMException("xbrlje:unrecognizedJSONDocumentType",
|
|
241
|
-
_("Required documentType is missing from JSON input"))
|
|
242
|
-
currentAction = "identifying JSON objects"
|
|
243
|
-
dtsReferences = oimDocumentInfo["taxonomy"]
|
|
244
|
-
prefixesDict = oimDocumentInfo["prefixes"]
|
|
245
|
-
prefixesList = prefixesDict.items()
|
|
246
|
-
featuresDict = oimDocumentInfo["features"]
|
|
247
|
-
facts = oimObject["facts"]
|
|
248
|
-
footnotes = oimObject["facts"].values() # shares this object
|
|
249
|
-
# add IDs if needed for footnotes
|
|
250
|
-
''' TBD, facts is now a dict
|
|
251
|
-
for fact in facts:
|
|
252
|
-
if isinstance(fact, dict) and fact.get("footnotes") and "id" not in fact:
|
|
253
|
-
anonymousFactId += 1
|
|
254
|
-
fact["id"] = "_f_{:02}".format(anonymousFactId)
|
|
255
|
-
'''
|
|
256
|
-
|
|
257
|
-
# pre-PWD names
|
|
258
|
-
global oimConcept, oimEntity, oimPeriod, oimUnit, oimLanguage
|
|
259
|
-
if isCSV or isXL:
|
|
260
|
-
oimConcept = "xbrl:concept"
|
|
261
|
-
oimEntity = "xbrl:entity"
|
|
262
|
-
oimPeriod = "xbrl:period"
|
|
263
|
-
oimUnit = "xbrl:unit"
|
|
264
|
-
oimLanguage = "xbrl:language"
|
|
265
|
-
|
|
266
|
-
if isCSV:
|
|
267
|
-
errPrefix = "xbrlce"
|
|
268
|
-
currentAction = "compiling metadata"
|
|
269
|
-
csvOpenMode = 'w'
|
|
270
|
-
csvOpenNewline = ''
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
# process CSV metadata
|
|
274
|
-
# mandatory sections of metadata file
|
|
275
|
-
oimMetadata = oimObject.get(CSVmetadata)
|
|
276
|
-
missing = [t for t in ("@context", CSVmetadata, "tables") if t not in oimObject]
|
|
277
|
-
missing += [t for t in ("documentType", "taxonomy", "prefixes") if t not in (oimMetadata or ())]
|
|
278
|
-
if missing:
|
|
279
|
-
raise OIMException("xbrlce:missingOIMMetadataProperties",
|
|
280
|
-
_("Required properties(s) are missing from CSV metadata: %(missing)s"),
|
|
281
|
-
missing = ", ".join(missing))
|
|
282
|
-
if oimMetadata.get("documentType") != CSVdocumentType:
|
|
283
|
-
raise OIMException("xbrlce:unrecognizedDocumentType",
|
|
284
|
-
_("Document type %(documentType)s not recognized, expecting %(expectedDocumentType)s"),
|
|
285
|
-
documentType=oimMetadata.get("documentType"), expectedDocumentType=CSVdocumentType)
|
|
286
|
-
|
|
287
|
-
dtsReferences = oimMetadata.get("taxonomy", {})
|
|
288
|
-
prefixesList = oimMetadata.get("prefixes", {}).items()
|
|
289
|
-
topLevelProperties = oimObject.get(CSVproperties, {})
|
|
290
|
-
|
|
291
|
-
currentAction = "loading CSV facts tables"
|
|
292
|
-
facts = OrderedDict()
|
|
293
|
-
footnotes = []
|
|
294
|
-
footnoteRefFactIds = defaultdict(set)
|
|
295
|
-
anonymousFootnoteId = 0 # integer always for anonymous (same row) footnotes
|
|
296
|
-
_dir = os.path.dirname(oimFile)
|
|
297
|
-
for oimTable in oimObject.get("tables", []):
|
|
298
|
-
tableLevelProperties = oimTable.get(CSVproperties, {})
|
|
299
|
-
tableUrl = oimTable.get("url")
|
|
300
|
-
tableColumns = oimTable.get("tableSchema",{}).get("columns", [])
|
|
301
|
-
# compile column dependencies
|
|
302
|
-
propertyCols = []
|
|
303
|
-
factCols = []
|
|
304
|
-
footnoteCols = []
|
|
305
|
-
for iCol, col in enumerate(tableColumns):
|
|
306
|
-
colProperty = col.get(CSVcolumnProperty)
|
|
307
|
-
if colProperty is not None:
|
|
308
|
-
propertyCols.append(iCol)
|
|
309
|
-
colType = col.get(CSVcolumnType)
|
|
310
|
-
if colType in ("tupleFact", "simpleFact", "numericSimpleFact", "textSimpleFact"):
|
|
311
|
-
factCols.append(iCol)
|
|
312
|
-
if colProperty is not None and isinstance(colProperty, dict) and "footnoteFor" in colProperty:
|
|
313
|
-
footnoteCols.append(iCol) # in-row fact footnotes
|
|
314
|
-
elif colType in ("textFootnote", "factFootnote"):
|
|
315
|
-
footnoteCols.append(iCol)
|
|
316
|
-
if not tableColumns:
|
|
317
|
-
error("xbrlce:noTableColumns",
|
|
318
|
-
_("Table has no columns, table URI %(uri)s."),
|
|
319
|
-
modelObject=modelXbrl, uri=_uri)
|
|
320
|
-
continue
|
|
321
|
-
tableProperties = topLevelProperties.copy()
|
|
322
|
-
for propertyName, propertyValue in tableLevelProperties.items():
|
|
323
|
-
if propertyName == "deleteInheritedProperties":
|
|
324
|
-
for prop in propertyValue:
|
|
325
|
-
tableProperties.pop(prop, None)
|
|
326
|
-
for propertyName, propertyValue in tableLevelProperties.items():
|
|
327
|
-
if propertyName in ("footnoteRefs",):
|
|
328
|
-
tableProperties[propertyName].extend(propertyValue)
|
|
329
|
-
elif propertyName != "deleteInheritedProperties":
|
|
330
|
-
tableProperties[propertyName] = propertyValue
|
|
331
|
-
filepath = os.path.join(_dir, tableUrl)
|
|
332
|
-
tupleIds = set()
|
|
333
|
-
_file, encoding = modelXbrl.fileSource.file(oimFile, encoding='utf-8-sig')
|
|
334
|
-
with _file as f:
|
|
335
|
-
csvReader = csv.reader(f)
|
|
336
|
-
for i, row in enumerate(csvReader):
|
|
337
|
-
if i == 0:
|
|
338
|
-
header = row
|
|
339
|
-
else:
|
|
340
|
-
colProperties = tableProperties.copy()
|
|
341
|
-
specificColProperties = defaultdict(dict)
|
|
342
|
-
for iCol in propertyCols:
|
|
343
|
-
value = row[iCol]
|
|
344
|
-
property = tableColumns[iCol][CSVcolumnProperty]
|
|
345
|
-
if isinstance(property, (str,list)): # applies to all cols
|
|
346
|
-
colProperties[property] = value
|
|
347
|
-
elif isinstance(property, dict): # applies to specific cols
|
|
348
|
-
for _property, _colNames in property.items():
|
|
349
|
-
if _colNames:
|
|
350
|
-
for _colName in _colNames:
|
|
351
|
-
specificColProperties[_colName][_property] = value
|
|
352
|
-
else:
|
|
353
|
-
specificColProperties['*'][_property] = value
|
|
354
|
-
for iCol in footnoteCols:
|
|
355
|
-
cellValue = row[iCol]
|
|
356
|
-
if cellValue == "": # no fact produced for this cell
|
|
357
|
-
continue
|
|
358
|
-
colDef = tableColumns[iCol]
|
|
359
|
-
colType = colDef.get(CSVcolumnType)
|
|
360
|
-
cellProperties = (colProperties,
|
|
361
|
-
specificColProperties.get("*", EMPTYDICT),
|
|
362
|
-
specificColProperties.get(colDef.get("name"), EMPTYDICT),
|
|
363
|
-
colDef.get(CSVproperties, EMPTYDICT))
|
|
364
|
-
footnote = {}
|
|
365
|
-
if colType == "textFootnote":
|
|
366
|
-
footnote["footnote"] = cellValue
|
|
367
|
-
elif colType == "factFootnote":
|
|
368
|
-
footnote["factRef"] = cellValue
|
|
369
|
-
for _properties in cellProperties:
|
|
370
|
-
if _properties:
|
|
371
|
-
for propertyName, propertyValue in _properties.items():
|
|
372
|
-
if propertyName == "deleteInheritedProperties":
|
|
373
|
-
for prop in propertyValue:
|
|
374
|
-
footnote({"footnoteGroup":"group"}.pop(prop,prop), None)
|
|
375
|
-
for propertyName, propertyValue in _properties.items():
|
|
376
|
-
if propertyName != "deleteInheritedProperties" and propertyName in ("footnoteId", "footnoteType", "footnoteGroup"):
|
|
377
|
-
footnote[{"footnoteGroup":"group"}.get(propertyName,propertyName)] = propertyValue
|
|
378
|
-
if "footnoteId" not in footnote:
|
|
379
|
-
anonymousFootnoteId += 1
|
|
380
|
-
footnote["footnoteId"] = "_f_{:02}".format(anonymousFootnoteId)
|
|
381
|
-
if colType.endswith("Fact"):
|
|
382
|
-
anonymousFootnoteId += 1
|
|
383
|
-
footnote["factRef"] = "_f_{:02}".format(anonymousFootnoteId)
|
|
384
|
-
refs = specificColProperties[colDef.get("name")].setdefault("footnoteRefs", [])
|
|
385
|
-
refs.append(footnote["factRef"])
|
|
386
|
-
colProperty = colDef.get(CSVcolumnProperty)
|
|
387
|
-
if isinstance(colProperty, dict) and "footnoteFor" in colProperty and isinstance(colProperty["footnoteFor"], list):
|
|
388
|
-
for footnoteForCol in colProperty["footnoteFor"]:
|
|
389
|
-
refs = specificColProperties[footnoteForCol].setdefault("footnoteRefs", [])
|
|
390
|
-
refs.append(footnote["footnoteId"])
|
|
391
|
-
footnotes.append(footnote)
|
|
392
|
-
for iCol in factCols:
|
|
393
|
-
if iCol >= len(row):
|
|
394
|
-
continue
|
|
395
|
-
cellValue = row[iCol]
|
|
396
|
-
if cellValue == "": # no fact produced for this cell
|
|
397
|
-
continue
|
|
398
|
-
colDef = tableColumns[iCol]
|
|
399
|
-
colType = colDef.get(CSVcolumnType)
|
|
400
|
-
cellProperties = (colProperties,
|
|
401
|
-
specificColProperties.get("*", EMPTYDICT),
|
|
402
|
-
specificColProperties.get(colDef.get("name"), EMPTYDICT),
|
|
403
|
-
tableColumns[iCol].get(CSVproperties, EMPTYDICT))
|
|
404
|
-
fact = {"dimensions": {}}
|
|
405
|
-
inapplicableProperties = set()
|
|
406
|
-
if colType == "tupleFact":
|
|
407
|
-
if cellValue:
|
|
408
|
-
if cellValue in tupleIds:
|
|
409
|
-
continue # don't duplicate parent tuple
|
|
410
|
-
fact["id"] = cellValue
|
|
411
|
-
tupleIds.add(cellValue) # prevent tuple duplication
|
|
412
|
-
elif colType in ("simpleFact", "numericSimpleFact", "textSimpleFact"):
|
|
413
|
-
fact["value"] = csvCellValue(cellValue)
|
|
414
|
-
|
|
415
|
-
if colType == "tupleFact":
|
|
416
|
-
inapplicableProperties.update(oimSimpleFactProperties)
|
|
417
|
-
for _properties in cellProperties:
|
|
418
|
-
for propertyName, propertyValue in _properties.items():
|
|
419
|
-
if not propertyName.startswith(oimPrefix):
|
|
420
|
-
inapplicableProperties.add(propertyName)
|
|
421
|
-
|
|
422
|
-
# block any row property produced by this column from this column's fact
|
|
423
|
-
_colProperty = colDef.get(CSVcolumnProperty)
|
|
424
|
-
if isinstance(_colProperty, str): # applies to all cols
|
|
425
|
-
inapplicableProperties.add(_colProperty)
|
|
426
|
-
|
|
427
|
-
footnoteRefs = set()
|
|
428
|
-
for _properties in cellProperties:
|
|
429
|
-
if _properties:
|
|
430
|
-
for propertyName, propertyValue in _properties.items():
|
|
431
|
-
if propertyName == "deleteInheritedProperties":
|
|
432
|
-
for prop in propertyValue:
|
|
433
|
-
if ":" in prop:
|
|
434
|
-
fact["dimensions"].pop(prop, None)
|
|
435
|
-
elif prop == "footnoteRefs":
|
|
436
|
-
footnoteRefs.clear()
|
|
437
|
-
elif prop not in ("datatype",):
|
|
438
|
-
fact.pop(prop, None)
|
|
439
|
-
for propertyName, propertyValue in _properties.items():
|
|
440
|
-
if propertyName != "deleteInheritedProperties" and propertyName not in inapplicableProperties and propertyValue != "":
|
|
441
|
-
if ":" in propertyName:
|
|
442
|
-
fact["dimensions"][propertyName] = csvCellValue(propertyValue)
|
|
443
|
-
elif propertyName == "footnoteRefs":
|
|
444
|
-
if isinstance(propertyValue, str): # obtained from column of blank-separated refs
|
|
445
|
-
propertyValue = propertyValue.split()
|
|
446
|
-
footnoteRefs.update(propertyValue)
|
|
447
|
-
else:
|
|
448
|
-
fact[propertyName] = propertyValue
|
|
449
|
-
if "id" not in fact:
|
|
450
|
-
anonymousFactId += 1
|
|
451
|
-
fact["id"] = "_f_{:02}".format(anonymousFactId)
|
|
452
|
-
if footnoteRefs:
|
|
453
|
-
factId = fact["id"]
|
|
454
|
-
for footnoteRef in footnoteRefs:
|
|
455
|
-
footnoteRefFactIds[footnoteRef].add(factId)
|
|
456
|
-
facts[fact["id"]] = fact
|
|
457
|
-
del tupleIds
|
|
458
|
-
|
|
459
|
-
elif isXL:
|
|
460
|
-
errPrefix = "xbrlce" # use same prefix as CSV since workbook is a use of xBRL-CSV specification
|
|
461
|
-
currentAction = "identifying workbook input worksheets"
|
|
462
|
-
_file, = modelXbrl.fileSource.file(oimFile, binary=True)
|
|
463
|
-
with _file as f:
|
|
464
|
-
oimWb = load_workbook(f, data_only=True)
|
|
465
|
-
sheetNames = oimWb.get_sheet_names()
|
|
466
|
-
if (not any(sheetName == "prefixes" for sheetName in sheetNames) or
|
|
467
|
-
not any(sheetName == "dtsReferences" for sheetName in sheetNames) or
|
|
468
|
-
not any("metadata" in sheetName for sheetName in sheetNames)):
|
|
469
|
-
raise OIMException("xbrlwe:missingWorkbookWorksheets",
|
|
470
|
-
_("Unable to identify worksheet tabs for dtsReferences, prefixes or metadata"))
|
|
471
|
-
currentAction = "loading worksheet: dtsReferences"
|
|
472
|
-
dtsReferences = []
|
|
473
|
-
for i, row in enumerate(oimWb["dtsReferences"]):
|
|
474
|
-
if i == 0:
|
|
475
|
-
header = [xlValue(col) for col in row]
|
|
476
|
-
elif any(col.value is not None for col in row): # skip entirely empty rows
|
|
477
|
-
dtsReferences.append(dict((header[j], col.value) for j, col in enumerate(row)))
|
|
478
|
-
currentAction = "loading worksheet: prefixes"
|
|
479
|
-
prefixesList = []
|
|
480
|
-
for i, row in enumerate(oimWb["prefixes"]):
|
|
481
|
-
if i == 0:
|
|
482
|
-
header = dict((xlValue(col),i) for i,col in enumerate(row))
|
|
483
|
-
elif any(col.value is not None for col in row): # skip entirely empty rows
|
|
484
|
-
prefixesList.append((row[header["prefix"]].value, row[header["URI"]].value))
|
|
485
|
-
tableMetadata = OrderedDict() # list of rows per table name
|
|
486
|
-
if "metadata" in sheetNames:
|
|
487
|
-
currentAction = "loading worksheet: metadata"
|
|
488
|
-
topLevelProperties = {}
|
|
489
|
-
missingTables = set()
|
|
490
|
-
missingRanges = set()
|
|
491
|
-
for i, row in enumerate(oimWb["metadata"]):
|
|
492
|
-
if i == 0:
|
|
493
|
-
metaTitles = [col.value for col in row]
|
|
494
|
-
metaHdr = dict((title,i) for i,title in enumerate(metaTitles))
|
|
495
|
-
missingCols = {"table", "column name", "column type"} - set(metaHdr.keys())
|
|
496
|
-
if missingCols:
|
|
497
|
-
raise OIMException("xbrlwe:missingMetadataColumns",
|
|
498
|
-
_("Required columns missing: %(missing)s"),
|
|
499
|
-
missing=", ".join(sorted(missingCols)))
|
|
500
|
-
metaColPropCols = [] # pairs of property name and applies to metadata column indices
|
|
501
|
-
for i, col in enumerate(metaTitles):
|
|
502
|
-
if col == "column property":
|
|
503
|
-
metaColPropCols.append([i, None])
|
|
504
|
-
elif col == "applies to" and metaColPropCols:
|
|
505
|
-
metaColPropCols[-1][1] = i
|
|
506
|
-
elif any(col.value is not None for col in row): # skip entirely empty rows
|
|
507
|
-
tableRangeName = xlValue(row[metaHdr["table"]])
|
|
508
|
-
if not tableRangeName: # top level properties
|
|
509
|
-
for col, iCol in metaHdr.items():
|
|
510
|
-
value = xlValue(row[iCol])
|
|
511
|
-
if col not in ("table", "column name", "column type", "column property", "applies to") and value is not None:
|
|
512
|
-
topLevelProperties[col] = value
|
|
513
|
-
else:
|
|
514
|
-
if tableRangeName not in tableMetadata: # first encounter of tableRangeName, check if it's a range
|
|
515
|
-
table, _sep, namedRange = tableRangeName.partition('!')
|
|
516
|
-
if table not in sheetNames:
|
|
517
|
-
missingTables.add(table)
|
|
518
|
-
elif namedRange:
|
|
519
|
-
if namedRange in oimWb.defined_names:
|
|
520
|
-
defn = oimWb.defined_names[namedRange]
|
|
521
|
-
if defn.type != "RANGE":
|
|
522
|
-
raise OIMException("xbrlwe:unusableRange",
|
|
523
|
-
_("Referenced range does not refer to a range: %(tableRange)s"),
|
|
524
|
-
tableRange=tableRangeName)
|
|
525
|
-
elif any(_table != table for _table, cellsRange in defn.destinations):
|
|
526
|
-
raise OIMException("xbrlwe:unusableRange",
|
|
527
|
-
_("Referenced range refers to a different table: %(tableRange)s"),
|
|
528
|
-
tableRange=tableRangeName)
|
|
529
|
-
else:
|
|
530
|
-
missingRanges.add(tableRangeName)
|
|
531
|
-
tableMetadata.setdefault(tableRangeName, []).append(row)
|
|
532
|
-
if missingTables:
|
|
533
|
-
raise OIMException("xbrlwe:missingTables",
|
|
534
|
-
_("Referenced table tab(s): %(missing)s"),
|
|
535
|
-
missing=", ".join(sorted(missingTables)))
|
|
536
|
-
if missingRanges:
|
|
537
|
-
raise OIMException("xbrlwe:missingTableNamedRanges",
|
|
538
|
-
_("Referenced named ranges tab(s): %(missing)s"),
|
|
539
|
-
missing=", ".join(sorted(missingRanges)))
|
|
540
|
-
facts = OrderedDict()
|
|
541
|
-
footnotes = []
|
|
542
|
-
footnoteRefFactIds = defaultdict(set)
|
|
543
|
-
anonymousFootnoteId = 0 # integer always for anonymous (same row) footnotes
|
|
544
|
-
# process by table
|
|
545
|
-
for tableRangeName, tableRows in tableMetadata.items():
|
|
546
|
-
# compile column dependencies
|
|
547
|
-
propertyCols = []
|
|
548
|
-
factCols = []
|
|
549
|
-
footnoteCols = []
|
|
550
|
-
# columns for tableName worksheet
|
|
551
|
-
tableLevelProperties = {}
|
|
552
|
-
tableLevelProperties = dict((col, xlValue(row[iCol]))
|
|
553
|
-
for row in tableRows
|
|
554
|
-
if row[metaHdr["column name"]].value in (None, '')
|
|
555
|
-
for col, iCol in metaHdr.items()
|
|
556
|
-
if col not in ("table", "column name", "datatype", "column type", "column property", "applies to") and row[iCol].value is not None)
|
|
557
|
-
colDefs = [] # column definitions
|
|
558
|
-
for iCol, row in enumerate(tableRows):
|
|
559
|
-
colDef = attrdict(colName=xlValue(row[metaHdr["column name"]]),
|
|
560
|
-
colType=xlValue(row[metaHdr["column type"]]),
|
|
561
|
-
colProperty={},
|
|
562
|
-
producedProperties=set())
|
|
563
|
-
colDefs.append(colDef)
|
|
564
|
-
# find column properties that apply to lists of column names
|
|
565
|
-
_firstColProp = True
|
|
566
|
-
for colPropName, colPropAppliesTo in metaColPropCols:
|
|
567
|
-
_colProperty = xlValue(row[colPropName])
|
|
568
|
-
if _colProperty:
|
|
569
|
-
colDef.colProperty[_colProperty] = (xlValue(row[colPropAppliesTo]) or "").split if colPropAppliesTo is not None else []
|
|
570
|
-
if _firstColProp:
|
|
571
|
-
propertyCols.append(iCol)
|
|
572
|
-
_firstColProp = False
|
|
573
|
-
colDef.producedProperties.add(colPropName)
|
|
574
|
-
# next apply properties specified for just this column
|
|
575
|
-
for col, hCol in metaHdr.items():
|
|
576
|
-
if col not in ("table", "column name", "datatype", "column type", "column property", "applies to") and row[hCol].value is not None:
|
|
577
|
-
colDef.colProperty[col] = xlValue(row[hCol])
|
|
578
|
-
if colDef.colType in ("tupleFact", "simpleFact", "numericSimpleFact", "textSimpleFact"):
|
|
579
|
-
factCols.append(iCol)
|
|
580
|
-
if "footnoteFor" in colDef.colProperty:
|
|
581
|
-
footnoteCols.append(iCol) # in-row fact footnotes
|
|
582
|
-
elif colDef.colType in ("textFootnote", "factFootnote"):
|
|
583
|
-
footnoteCols.append(iCol)
|
|
584
|
-
tableProperties = topLevelProperties.copy()
|
|
585
|
-
for propertyName, propertyValue in tableLevelProperties.items():
|
|
586
|
-
if propertyName == "deleteInheritedProperties":
|
|
587
|
-
for prop in propertyValue:
|
|
588
|
-
tableProperties.pop(prop, None)
|
|
589
|
-
for propertyName, propertyValue in tableLevelProperties.items():
|
|
590
|
-
if propertyName in ("footnoteRefs",):
|
|
591
|
-
tableProperties[propertyName].extend(propertyValue)
|
|
592
|
-
elif propertyName != "deleteInheritedProperties":
|
|
593
|
-
tableProperties[propertyName] = propertyValue
|
|
594
|
-
tupleIds = set()
|
|
595
|
-
tableName, _sep, namedRange = tableRangeName.partition('!')
|
|
596
|
-
rangeRows = []
|
|
597
|
-
if tableName in oimWb:
|
|
598
|
-
ws = oimWb[tableName]
|
|
599
|
-
if namedRange and oimWb.defined_names[namedRange].type == "RANGE":
|
|
600
|
-
for _tableName, cells_range in oimWb.defined_names[namedRange].destinations:
|
|
601
|
-
if _tableName == tableName:
|
|
602
|
-
rows = ws[cells_range]
|
|
603
|
-
if isinstance(rows, Cell):
|
|
604
|
-
rangeRows.append((rows, ))
|
|
605
|
-
else:
|
|
606
|
-
rangeRows.extend(rows)
|
|
607
|
-
else:
|
|
608
|
-
rangeRows = ws
|
|
609
|
-
for i, row in enumerate(rangeRows):
|
|
610
|
-
if i == 0 and not namedRange:
|
|
611
|
-
tblHdr = dict((col.value,j) for j,col in enumerate(row))
|
|
612
|
-
elif any(col.value is not None for col in row):
|
|
613
|
-
colProperties = tableProperties.copy()
|
|
614
|
-
specificColProperties = defaultdict(dict)
|
|
615
|
-
for iCol in propertyCols:
|
|
616
|
-
value = xlValue(row[iCol])
|
|
617
|
-
for _property, _colNames in colDefs[iCol].colProperty.items():
|
|
618
|
-
if _colNames and isinstance(_colNames, list):
|
|
619
|
-
for _colName in _colNames:
|
|
620
|
-
specificColProperties[_colName][_property] = value
|
|
621
|
-
else:
|
|
622
|
-
specificColProperties['*'][_property] = value
|
|
623
|
-
for iCol in footnoteCols:
|
|
624
|
-
cellValue = xlValue(row[iCol])
|
|
625
|
-
if cellValue is None or cellValue == "": # no fact produced for this cell
|
|
626
|
-
continue
|
|
627
|
-
colDef = colDefs[iCol]
|
|
628
|
-
cellProperties = (colProperties,
|
|
629
|
-
specificColProperties.get("*", EMPTYDICT),
|
|
630
|
-
specificColProperties[colDef.colName],
|
|
631
|
-
colDef.colProperty)
|
|
632
|
-
footnote = {}
|
|
633
|
-
if colDef.colType == "textFootnote":
|
|
634
|
-
footnote["footnote"] = cellValue
|
|
635
|
-
elif colDef.colType == "factFootnote":
|
|
636
|
-
footnote["factRef"] = cellValue
|
|
637
|
-
for _properties in cellProperties:
|
|
638
|
-
if _properties:
|
|
639
|
-
for propertyName, propertyValue in _properties.items():
|
|
640
|
-
if propertyName == "deleteInheritedProperties":
|
|
641
|
-
for prop in propertyValue:
|
|
642
|
-
footnote({"footnoteGroup":"group"}.pop(prop,prop), None)
|
|
643
|
-
for propertyName, propertyValue in _properties.items():
|
|
644
|
-
if propertyName != "deleteInheritedProperties" and propertyName in ("footnoteId", "footnoteType", "footnoteGroup"):
|
|
645
|
-
footnote[{"footnoteGroup":"group"}.get(propertyName,propertyName)] = propertyValue
|
|
646
|
-
if "footnoteId" not in footnote:
|
|
647
|
-
anonymousFootnoteId += 1
|
|
648
|
-
footnote["footnoteId"] = "_f_{:02}".format(anonymousFootnoteId)
|
|
649
|
-
if colDef.colType.endswith("Fact"):
|
|
650
|
-
anonymousFootnoteId += 1
|
|
651
|
-
footnote["factRef"] = "_f_{:02}".format(anonymousFootnoteId)
|
|
652
|
-
refs = specificColProperties[colDef.get("name")].setdefault("footnoteRefs", [])
|
|
653
|
-
refs.append(footnote["factRef"])
|
|
654
|
-
for footnoteForCol in (colDef.colProperty.get("footnoteFor") or "").split():
|
|
655
|
-
refs = specificColProperties[footnoteForCol].setdefault("footnoteRefs", [])
|
|
656
|
-
refs.append(footnote["footnoteId"])
|
|
657
|
-
footnotes.append(footnote)
|
|
658
|
-
for iCol in factCols:
|
|
659
|
-
if iCol >= len(row):
|
|
660
|
-
continue
|
|
661
|
-
cellValue = xlValue(row[iCol])
|
|
662
|
-
if cellValue is None or cellValue == "": # no fact produced for this cell
|
|
663
|
-
continue
|
|
664
|
-
colDef = colDefs[iCol]
|
|
665
|
-
cellProperties = (colProperties,
|
|
666
|
-
specificColProperties.get("*", EMPTYDICT),
|
|
667
|
-
specificColProperties.get(colDef.colName, EMPTYDICT),
|
|
668
|
-
colDef.colProperty)
|
|
669
|
-
fact = {"dimensions": {}}
|
|
670
|
-
inapplicableProperties = set()
|
|
671
|
-
if colDef.colType == "tupleFact":
|
|
672
|
-
if cellValue:
|
|
673
|
-
if cellValue in tupleIds:
|
|
674
|
-
continue # don't duplicate parent tuple
|
|
675
|
-
fact["id"] = cellValue
|
|
676
|
-
tupleIds.add(cellValue) # prevent tuple duplication
|
|
677
|
-
elif colDef.colType in ("simpleFact", "numericSimpleFact", "textSimpleFact"):
|
|
678
|
-
fact["value"] = csvCellValue(cellValue)
|
|
679
|
-
|
|
680
|
-
if colDef.colType == "tupleFact":
|
|
681
|
-
inapplicableProperties.update(oimSimpleFactProperties)
|
|
682
|
-
for _properties in cellProperties:
|
|
683
|
-
for propertyName, propertyValue in _properties.items():
|
|
684
|
-
if not propertyName.startswith(oimPrefix) and propertyName != "deleteInheritedProperties":
|
|
685
|
-
inapplicableProperties.add(propertyName)
|
|
686
|
-
|
|
687
|
-
# block any row property produced by this column from this column's fact
|
|
688
|
-
inapplicableProperties.update(colDef.producedProperties)
|
|
689
|
-
|
|
690
|
-
footnoteRefs = set()
|
|
691
|
-
for _properties in cellProperties:
|
|
692
|
-
if _properties:
|
|
693
|
-
for propertyName, propertyValue in _properties.items():
|
|
694
|
-
if propertyName == "deleteInheritedProperties":
|
|
695
|
-
for prop in propertyValue:
|
|
696
|
-
if ":" in prop:
|
|
697
|
-
fact["dimensions"].pop(prop, None)
|
|
698
|
-
elif prop == "footnoteRefs":
|
|
699
|
-
footnoteRefs.clear()
|
|
700
|
-
elif prop not in ("datatype",):
|
|
701
|
-
fact.pop(prop, None)
|
|
702
|
-
for propertyName, propertyValue in _properties.items():
|
|
703
|
-
if propertyName != "deleteInheritedProperties" and propertyName not in inapplicableProperties and propertyValue != "":
|
|
704
|
-
if ":" in propertyName:
|
|
705
|
-
fact["dimensions"][propertyName] = csvCellValue(propertyValue)
|
|
706
|
-
elif propertyName == "footnoteRefs":
|
|
707
|
-
if isinstance(propertyValue, str): # obtained from column of blank-separated refs
|
|
708
|
-
propertyValue = propertyValue.split()
|
|
709
|
-
footnoteRefs.update(propertyValue)
|
|
710
|
-
elif propertyName not in ("datatype",):
|
|
711
|
-
fact[propertyName] = propertyValue
|
|
712
|
-
if "id" not in fact:
|
|
713
|
-
anonymousFactId += 1
|
|
714
|
-
fact["id"] = "_f_{:02}".format(anonymousFactId)
|
|
715
|
-
factId = fact["id"]
|
|
716
|
-
if footnoteRefs:
|
|
717
|
-
for footnoteRef in footnoteRefs:
|
|
718
|
-
footnoteRefFactIds[footnoteRef].add(factId)
|
|
719
|
-
facts[fact["id"]] = fact
|
|
720
|
-
del tupleIds
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
currentAction = "identifying default dimensions"
|
|
724
|
-
if modelXbrl is not None:
|
|
725
|
-
ValidateXbrlDimensions.loadDimensionDefaults(modelXbrl) # needs dimension defaults
|
|
726
|
-
|
|
727
|
-
currentAction = "validating OIM"
|
|
728
|
-
prefixes = {}
|
|
729
|
-
prefixedUris = {}
|
|
730
|
-
for _prefix, _uri in prefixesList:
|
|
731
|
-
if not _prefix:
|
|
732
|
-
error("{}:emptyPrefix".format(errPrefix),
|
|
733
|
-
_("The empty string must not be used as a prefix, uri %(uri)s"),
|
|
734
|
-
modelObject=modelXbrl, uri=_uri)
|
|
735
|
-
elif not NCNamePattern.match(_prefix):
|
|
736
|
-
error("oime:invalidSQName",
|
|
737
|
-
_("The prefix %(prefix)s must match the NCName lexical pattern, uri %(uri)s"),
|
|
738
|
-
modelObject=modelXbrl, prefix=_prefix, uri=_uri)
|
|
739
|
-
elif _prefix in prefixes:
|
|
740
|
-
error("{}:duplicatedPrefix".format(errPrefix),
|
|
741
|
-
_("The prefix %(prefix)s is used on uri %(uri1)s and uri %(uri2)s"),
|
|
742
|
-
modelObject=modelXbrl, prefix=_prefix, uri1=prefixes[_prefix], uri2=_uri)
|
|
743
|
-
elif _uri in prefixedUris:
|
|
744
|
-
error("{}:duplicatedUri".format(errPrefix),
|
|
745
|
-
_("The uri %(uri)s is used on prefix %(prefix1)s and prefix %(prefix2)s"),
|
|
746
|
-
modelObject=modelXbrl, uri=_uri, prefix1=prefixedUris[_uri], prefix2=_prefix)
|
|
747
|
-
else:
|
|
748
|
-
prefixes[_prefix] = _uri
|
|
749
|
-
prefixedUris[_uri] = _prefix
|
|
750
|
-
|
|
751
|
-
if "xbrl" not in prefixes:
|
|
752
|
-
raise OIMException("oime:noXbrlPrefix",
|
|
753
|
-
_("The xbrl namespace must have a declared prefix"))
|
|
754
|
-
|
|
755
|
-
# create the instance document
|
|
756
|
-
currentAction = "creating instance document"
|
|
757
|
-
_schemaRefs = [dtsRef["href"]
|
|
758
|
-
for dtsRef in dtsReferences
|
|
759
|
-
if isinstance(dtsRef, dict) and dtsRef.get("type") == "schema" and dtsRef.get("href")
|
|
760
|
-
] + [
|
|
761
|
-
href for href in dtsReferences if isinstance(href, str)
|
|
762
|
-
]
|
|
763
|
-
if modelXbrl: # pull loader implementation
|
|
764
|
-
modelXbrl.blockDpmDBrecursion = True
|
|
765
|
-
modelXbrl.modelDocument = _return = createModelDocument(
|
|
766
|
-
modelXbrl,
|
|
767
|
-
Type.INSTANCE,
|
|
768
|
-
instanceFileName,
|
|
769
|
-
schemaRefs=_schemaRefs,
|
|
770
|
-
isEntry=True,
|
|
771
|
-
initialComment="extracted from OIM {}".format(mappedUri),
|
|
772
|
-
documentEncoding="utf-8")
|
|
773
|
-
modelXbrl.modelDocument.inDTS = True
|
|
774
|
-
else: # API implementation
|
|
775
|
-
modelXbrl = ModelXbrl.create(
|
|
776
|
-
cntlr.modelManager,
|
|
777
|
-
Type.INSTANCE,
|
|
778
|
-
instanceFileName,
|
|
779
|
-
schemaRefs=_schemaRefs,
|
|
780
|
-
isEntry=True,
|
|
781
|
-
initialComment="extracted from OIM {}".format(mappedUri))
|
|
782
|
-
_return = modelXbrl.modelDocument
|
|
783
|
-
|
|
784
|
-
# add linkbase, role and arcrole refs
|
|
785
|
-
''' deprecated
|
|
786
|
-
for refType in ("linkbase", "role", "arcrole"):
|
|
787
|
-
for dtsRef in dtsReferences:
|
|
788
|
-
if dtsRef.get("type") == refType and dtsRef.get("href"):
|
|
789
|
-
elt = addChild(modelXbrl.modelDocument.xmlRootElement,
|
|
790
|
-
qname(link, refType+"Ref"),
|
|
791
|
-
attributes=(("{http://www.w3.org/1999/xlink}href", dtsRef["href"]),
|
|
792
|
-
("{http://www.w3.org/1999/xlink}type", "simple")))
|
|
793
|
-
href = modelXbrl.modelDocument.discoverHref(elt)
|
|
794
|
-
if href:
|
|
795
|
-
_elt, hrefDoc, hrefId = href
|
|
796
|
-
_defElt = hrefDoc.idObjects.get(hrefId)
|
|
797
|
-
if _defElt is not None:
|
|
798
|
-
_uriAttrName = refType + "URI"
|
|
799
|
-
_uriAttrValue = _defElt.get(_uriAttrName)
|
|
800
|
-
if _uriAttrValue:
|
|
801
|
-
elt.set(_uriAttrName, _uriAttrValue)
|
|
802
|
-
'''
|
|
803
|
-
firstCntxUnitFactElt = None
|
|
804
|
-
|
|
805
|
-
cntxTbl = {}
|
|
806
|
-
unitTbl = {}
|
|
807
|
-
xbrlNoteTbl = {} # fact ID: note fact
|
|
808
|
-
|
|
809
|
-
currentAction = "creating facts"
|
|
810
|
-
factNum = 0 # for synthetic fact number
|
|
811
|
-
syntheticFactFormat = "_f{{:0{}}}".format(int(math.log10(len(facts)))) #want
|
|
812
|
-
|
|
813
|
-
for id, fact in facts.items():
|
|
814
|
-
|
|
815
|
-
dimensions = fact.get("dimensions")
|
|
816
|
-
if dimensions is None:
|
|
817
|
-
dimensions = fact.get("dimensions", EMPTYDICT)
|
|
818
|
-
if oimConcept not in dimensions:
|
|
819
|
-
error("{}:conceptQName".format(errPrefix),
|
|
820
|
-
_("The concept QName could not be determined, property xbrl:concept missing."),
|
|
821
|
-
modelObject=modelXbrl)
|
|
822
|
-
return
|
|
823
|
-
conceptSQName = dimensions[oimConcept]
|
|
824
|
-
conceptPrefix = conceptSQName.rpartition(":")[0]
|
|
825
|
-
if conceptPrefix not in prefixes:
|
|
826
|
-
error("xbrlje:unknownPrefix",
|
|
827
|
-
_("The concept QName prefix was not defined: %(concept)s."),
|
|
828
|
-
modelObject=modelXbrl, concept=conceptSQName)
|
|
829
|
-
continue
|
|
830
|
-
conceptQn = qname(conceptSQName, prefixes)
|
|
831
|
-
if conceptQn == qnXbrlNote:
|
|
832
|
-
xbrlNoteTbl[id] = fact
|
|
833
|
-
continue
|
|
834
|
-
concept = modelXbrl.qnameConcepts.get(conceptQn)
|
|
835
|
-
if concept is None:
|
|
836
|
-
error("xbrl:schemaImportMissing",
|
|
837
|
-
_("The concept QName could not be resolved with available DTS: %(concept)s."),
|
|
838
|
-
modelObject=modelXbrl, concept=conceptQn)
|
|
839
|
-
return
|
|
840
|
-
attrs = {}
|
|
841
|
-
if concept.isItem:
|
|
842
|
-
missingDimensions = []
|
|
843
|
-
if oimEntity not in dimensions:
|
|
844
|
-
missingDimensions.append(oimEntity)
|
|
845
|
-
if "xbrl:start" in dimensions and "xbrl:end" in dimensions:
|
|
846
|
-
pass
|
|
847
|
-
elif oimPeriod not in dimensions:
|
|
848
|
-
missingDimensions.append(oimPeriod)
|
|
849
|
-
if missingDimensions:
|
|
850
|
-
error("{}:missingDimensions".format(errPrefix),
|
|
851
|
-
_("The concept %(element)s is missing dimensions %(missingDimensions)s"),
|
|
852
|
-
modelObject=modelXbrl, element=conceptQn, missingDimensions=", ".join(missingDimensions))
|
|
853
|
-
return
|
|
854
|
-
if oimLanguage in dimensions:
|
|
855
|
-
attrs["{http://www.w3.org/XML/1998/namespace}lang"] = dimensions[oimLanguage]
|
|
856
|
-
entityAsQn = qname(dimensions[oimEntity], prefixes) or qname("error",fact[oimEntity])
|
|
857
|
-
if "xbrl:start" in dimensions and "xbrl:end" in dimensions:
|
|
858
|
-
# CSV/XL format
|
|
859
|
-
period = dimensions["xbrl:start"]
|
|
860
|
-
if period != dimensions["xbrl:end"]:
|
|
861
|
-
period += "/" + dimensions["xbrl:end"]
|
|
862
|
-
elif oimPeriod in dimensions:
|
|
863
|
-
period = dimensions[oimPeriod]
|
|
864
|
-
if not re.match(r"\d{4,}-[0-1][0-9]-[0-3][0-9]T(24:00:00|[0-1][0-9]:[0-5][0-9]:[0-5][0-9])"
|
|
865
|
-
r"(/\d{4,}-[0-1][0-9]-[0-3][0-9]T(24:00:00|[0-1][0-9]:[0-5][0-9]:[0-5][0-9]))?", period):
|
|
866
|
-
error("{}:periodDateTime".format(errPrefix),
|
|
867
|
-
_("The concept %(element)s has a lexically invalid period dateTime %(periodError)s"),
|
|
868
|
-
modelObject=modelXbrl, element=conceptQn, periodError=periodDate)
|
|
869
|
-
else:
|
|
870
|
-
period = "forever"
|
|
871
|
-
cntxKey = ( # hashable context key
|
|
872
|
-
("periodType", concept.periodType),
|
|
873
|
-
("entity", entityAsQn),
|
|
874
|
-
("period", period)) + tuple(sorted(
|
|
875
|
-
(dimName, dimVal["value"] if isinstance(dimVal,dict) else dimVal)
|
|
876
|
-
for dimName, dimVal in dimensions.items()
|
|
877
|
-
if ":" in dimName and not dimName.startswith(oimPrefix)))
|
|
878
|
-
if cntxKey in cntxTbl:
|
|
879
|
-
_cntx = cntxTbl[cntxKey]
|
|
880
|
-
else:
|
|
881
|
-
cntxId = 'c-{:02}'.format(len(cntxTbl) + 1)
|
|
882
|
-
qnameDims = {}
|
|
883
|
-
for dimName, dimVal in dimensions.items():
|
|
884
|
-
if ":" in dimName and not dimName.startswith(oimPrefix):
|
|
885
|
-
dimQname = qname(dimName, prefixes)
|
|
886
|
-
dimConcept = modelXbrl.qnameConcepts.get(dimQname)
|
|
887
|
-
if dimConcept is None:
|
|
888
|
-
error("xbrl:schemaDefinitionMissing",
|
|
889
|
-
_("The taxonomy defined aspect concept QName %(qname)s could not be determined"),
|
|
890
|
-
modelObject=modelXbrl, qname=dimQname)
|
|
891
|
-
continue
|
|
892
|
-
if dimVal is None:
|
|
893
|
-
memberAttrs = {"{http://www.w3.org/2001/XMLSchema-instance}nil": "true"}
|
|
894
|
-
else:
|
|
895
|
-
memberAttrs = None
|
|
896
|
-
if isinstance(dimVal, dict):
|
|
897
|
-
dimVal = dimVal["value"]
|
|
898
|
-
else:
|
|
899
|
-
dimVal = str(dimVal) # may be int or boolean
|
|
900
|
-
if isinstance(dimVal,str) and ":" in dimVal and dimVal.partition(':')[0] in prefixes:
|
|
901
|
-
mem = qname(dimVal, prefixes) # explicit dim
|
|
902
|
-
elif dimConcept.isTypedDimension:
|
|
903
|
-
# a modelObject xml element is needed for all of the instance functions to manage the typed dim
|
|
904
|
-
mem = addChild(modelXbrl.modelDocument, dimConcept.typedDomainElement.qname, text=dimVal, attributes=memberAttrs, appendChild=False)
|
|
905
|
-
else:
|
|
906
|
-
mem = None # absent typed dimension
|
|
907
|
-
if mem is not None:
|
|
908
|
-
qnameDims[dimQname] = DimValuePrototype(modelXbrl, None, dimQname, mem, "segment")
|
|
909
|
-
_cntx = modelXbrl.createContext(
|
|
910
|
-
entityAsQn.namespaceURI,
|
|
911
|
-
entityAsQn.localName,
|
|
912
|
-
"forever" if period == "forever" else concept.periodType,
|
|
913
|
-
None if concept.periodType == "instant" or period == "forever"
|
|
914
|
-
else dateTime(period.rpartition('/')[0], type=DATETIME),
|
|
915
|
-
None if period == "forever"
|
|
916
|
-
else dateTime(period.rpartition('/')[2], type=DATETIME),
|
|
917
|
-
None, # no dimensional validity checking (like formula does)
|
|
918
|
-
qnameDims, [], [],
|
|
919
|
-
id=cntxId)
|
|
920
|
-
cntxTbl[cntxKey] = _cntx
|
|
921
|
-
if firstCntxUnitFactElt is None:
|
|
922
|
-
firstCntxUnitFactElt = _cntx
|
|
923
|
-
if oimUnit in dimensions and concept.isNumeric:
|
|
924
|
-
unitKey = dimensions[oimUnit]
|
|
925
|
-
if unitKey in unitTbl:
|
|
926
|
-
_unit = unitTbl[unitKey]
|
|
927
|
-
else:
|
|
928
|
-
_unit = None
|
|
929
|
-
# validate unit
|
|
930
|
-
unitKeySub = PrefixedQName.sub(UnitPrefixedQNameSubstitutionChar, unitKey)
|
|
931
|
-
if not UnitPattern.match(unitKeySub):
|
|
932
|
-
error("{}:invalidUnitString".format(errPrefix),
|
|
933
|
-
_("Unit string representation is lexically invalid, %(unit)s"),
|
|
934
|
-
modelObject=modelXbrl, unit=unitKey)
|
|
935
|
-
else:
|
|
936
|
-
_mul, _sep, _div = unitKey.partition('/')
|
|
937
|
-
if _mul.startswith('('):
|
|
938
|
-
_mul = _mul[1:-1]
|
|
939
|
-
_muls = [u for u in _mul.split('*') if u]
|
|
940
|
-
if _div.startswith('('):
|
|
941
|
-
_div = _div[1:-1]
|
|
942
|
-
_divs = [u for u in _div.split('*') if u]
|
|
943
|
-
if _muls != sorted(_muls) or _divs != sorted(_divs):
|
|
944
|
-
error("{}:invalidUnitString".format(errPrefix),
|
|
945
|
-
_("Unit string representation measures are not in alphabetical order, %(unit)s"),
|
|
946
|
-
modelObject=modelXbrl, unit=unitKey)
|
|
947
|
-
try:
|
|
948
|
-
mulQns = [qname(u, prefixes, prefixException=OIMException("oime:unitPrefix",
|
|
949
|
-
_("Unit prefix is not declared: %(unit)s"),
|
|
950
|
-
unit=u))
|
|
951
|
-
for u in _muls]
|
|
952
|
-
divQns = [qname(u, prefixes, prefixException=OIMException("oime:unitPrefix",
|
|
953
|
-
_("Unit prefix is not declared: %(unit)s"),
|
|
954
|
-
unit=u))
|
|
955
|
-
for u in _divs]
|
|
956
|
-
unitId = 'u-{:02}'.format(len(unitTbl) + 1)
|
|
957
|
-
for _measures in mulQns, divQns:
|
|
958
|
-
for _measure in _measures:
|
|
959
|
-
addQnameValue(modelXbrl.modelDocument, _measure)
|
|
960
|
-
_unit = modelXbrl.createUnit(mulQns, divQns, id=unitId)
|
|
961
|
-
if firstCntxUnitFactElt is None:
|
|
962
|
-
firstCntxUnitFactElt = _unit
|
|
963
|
-
except OIMException as ex:
|
|
964
|
-
error(ex.code, ex.message, modelObject=modelXbrl, **ex.msgArgs)
|
|
965
|
-
unitTbl[unitKey] = _unit
|
|
966
|
-
else:
|
|
967
|
-
_unit = None
|
|
968
|
-
|
|
969
|
-
attrs["contextRef"] = _cntx.id
|
|
970
|
-
|
|
971
|
-
if fact.get("value") is None:
|
|
972
|
-
attrs[XbrlConst.qnXsiNil] = "true"
|
|
973
|
-
text = None
|
|
974
|
-
else:
|
|
975
|
-
text = fact["value"]
|
|
976
|
-
|
|
977
|
-
if concept.isNumeric:
|
|
978
|
-
if _unit is None:
|
|
979
|
-
return # skip creating fact because unit was invalid
|
|
980
|
-
attrs["unitRef"] = _unit.id
|
|
981
|
-
if "decimals" in attrs or attrs.get(XbrlConst.qnXsiNil, "false") != "true":
|
|
982
|
-
attrs["decimals"] = fact.get("decimals", "INF")
|
|
983
|
-
elif "accuracy" in attrs or attrs.get(XbrlConst.qnXsiNil, "false") != "true":
|
|
984
|
-
attrs["decimals"] = fact.get("accuracy", "INF")
|
|
985
|
-
else:
|
|
986
|
-
text = None #tuple
|
|
987
|
-
|
|
988
|
-
if not id:
|
|
989
|
-
id = syntheticFactFormat.format(factNum)
|
|
990
|
-
factNum += 1
|
|
991
|
-
attrs["id"] = id
|
|
992
|
-
if "id" not in fact: # needed for footnote generation
|
|
993
|
-
fact["id"] = id
|
|
994
|
-
|
|
995
|
-
# is value a QName?
|
|
996
|
-
if concept.baseXbrliType == "QNameItemType": # renormalize prefix of instance fact
|
|
997
|
-
text = addQnameValue(modelXbrl.modelDocument, qname(text.strip(), prefixes))
|
|
998
|
-
|
|
999
|
-
f = modelXbrl.createFact(conceptQn, attributes=attrs, text=text, validate=False)
|
|
1000
|
-
if firstCntxUnitFactElt is None:
|
|
1001
|
-
firstCntxUnitFactElt = f
|
|
1002
|
-
|
|
1003
|
-
xmlValidate(modelXbrl, f)
|
|
1004
|
-
|
|
1005
|
-
currentAction = "creating footnotes"
|
|
1006
|
-
footnoteLinks = OrderedDict() # ELR elements
|
|
1007
|
-
factLocs = {} # index by (linkrole, factId)
|
|
1008
|
-
footnoteNbr = 0
|
|
1009
|
-
locNbr = 0
|
|
1010
|
-
if isCSV or isXL:
|
|
1011
|
-
missingFootnotes = footnoteRefFactIds.keys() - set(
|
|
1012
|
-
footnote["footnoteId"] for footnote in footnotes) - set(
|
|
1013
|
-
footnote["factRef"] for footnote in footnotes if "factRef" in footnote)
|
|
1014
|
-
if missingFootnotes:
|
|
1015
|
-
error("xbrlce:footnoteNotDefined",
|
|
1016
|
-
_("FootnoteId(s) not defined %(footnoteIds)s."),
|
|
1017
|
-
modelObject=modelXbrl, footnoteIds=", ".join(sorted(missingFootnotes)))
|
|
1018
|
-
definedInstanceRoles = set()
|
|
1019
|
-
footnoteIdsNotReferenced = set()
|
|
1020
|
-
undefinedFootnoteTypes = set()
|
|
1021
|
-
undefinedFootnoteGroups = set()
|
|
1022
|
-
for factOrFootnote in footnotes:
|
|
1023
|
-
if isJSON:
|
|
1024
|
-
factFootnotes = []
|
|
1025
|
-
for ftType, ftGroups in factOrFootnote.get("links", {}).items():
|
|
1026
|
-
factIDs = (factOrFootnote["id"],)
|
|
1027
|
-
if ftType not in prefixesDict:
|
|
1028
|
-
undefinedFootnoteTypes.add(ftType)
|
|
1029
|
-
else:
|
|
1030
|
-
for ftGroup, ftTgtIds in ftGroups.items():
|
|
1031
|
-
if ftGroup not in prefixesDict:
|
|
1032
|
-
undefinedFootnoteGroups.add(ftGroup)
|
|
1033
|
-
else:
|
|
1034
|
-
footnote = {"group": prefixesDict[ftGroup],
|
|
1035
|
-
"footnoteType": prefixesDict[ftType]}
|
|
1036
|
-
if all(tgtId in xbrlNoteTbl for tgtId in ftTgtIds):
|
|
1037
|
-
# text footnote
|
|
1038
|
-
footnote["noteRefs"] = ftTgtIds
|
|
1039
|
-
else:
|
|
1040
|
-
# fact referencing footnote
|
|
1041
|
-
footnote["factRef"] = ftTgtIds
|
|
1042
|
-
factFootnotes.append(footnote)
|
|
1043
|
-
elif isCSV or isXL: # footnotes contains footnote objects
|
|
1044
|
-
factFootnotes = (factOrFootnote,)
|
|
1045
|
-
factIDs = tuple(sorted(footnoteRefFactIds[factOrFootnote.get("footnoteId")]))
|
|
1046
|
-
if not factIDs:
|
|
1047
|
-
footnoteIdsNotReferenced.add(factOrFootnote.get("footnoteId"))
|
|
1048
|
-
for footnote in factFootnotes:
|
|
1049
|
-
linkrole = footnote.get("group")
|
|
1050
|
-
arcrole = footnote.get("footnoteType")
|
|
1051
|
-
if not factIDs or not linkrole or not arcrole or not (
|
|
1052
|
-
footnote.get("factRef") or footnote.get("footnote") is not None or footnote.get("noteRefs") is not None):
|
|
1053
|
-
if not linkrole:
|
|
1054
|
-
warning("oime:footnoteMissingLinkrole",
|
|
1055
|
-
_("FootnoteId has no linkrole %(footnoteId)s."),
|
|
1056
|
-
modelObject=modelXbrl, footnoteId=footnote.get("footnoteId"))
|
|
1057
|
-
if not arcrole:
|
|
1058
|
-
warning("oime:footnoteMissingArcrole",
|
|
1059
|
-
_("FootnoteId has no arcrole %(footnoteId)s."),
|
|
1060
|
-
modelObject=modelXbrl, footnoteId=footnote.get("footnoteId"))
|
|
1061
|
-
continue
|
|
1062
|
-
for refType, refValue, roleTypes in (("role", linkrole, modelXbrl.roleTypes),
|
|
1063
|
-
("arcrole", arcrole, modelXbrl.arcroleTypes)):
|
|
1064
|
-
if (not XbrlConst.isStandardRole(refValue) or XbrlConst.isStandardArcrole(refValue)
|
|
1065
|
-
) and refValue in roleTypes and refValue not in definedInstanceRoles:
|
|
1066
|
-
definedInstanceRoles.add(refValue)
|
|
1067
|
-
hrefElt = roleTypes[refValue][0]
|
|
1068
|
-
href = hrefElt.modelDocument.uri + "#" + hrefElt.id
|
|
1069
|
-
elt = addChild(modelXbrl.modelDocument.xmlRootElement,
|
|
1070
|
-
qname(link, refType+"Ref"),
|
|
1071
|
-
attributes=(("{http://www.w3.org/1999/xlink}href", href),
|
|
1072
|
-
("{http://www.w3.org/1999/xlink}type", "simple")),
|
|
1073
|
-
beforeSibling=firstCntxUnitFactElt)
|
|
1074
|
-
href = modelXbrl.modelDocument.discoverHref(elt)
|
|
1075
|
-
if href:
|
|
1076
|
-
_elt, hrefDoc, hrefId = href
|
|
1077
|
-
_defElt = hrefDoc.idObjects.get(hrefId)
|
|
1078
|
-
if _defElt is not None:
|
|
1079
|
-
_uriAttrName = refType + "URI"
|
|
1080
|
-
_uriAttrValue = _defElt.get(_uriAttrName)
|
|
1081
|
-
if _uriAttrValue:
|
|
1082
|
-
elt.set(_uriAttrName, _uriAttrValue)
|
|
1083
|
-
if linkrole not in footnoteLinks:
|
|
1084
|
-
footnoteLinks[linkrole] = addChild(modelXbrl.modelDocument.xmlRootElement,
|
|
1085
|
-
XbrlConst.qnLinkFootnoteLink,
|
|
1086
|
-
attributes={"{http://www.w3.org/1999/xlink}type": "extended",
|
|
1087
|
-
"{http://www.w3.org/1999/xlink}role": linkrole})
|
|
1088
|
-
footnoteLink = footnoteLinks[linkrole]
|
|
1089
|
-
if (linkrole, factIDs) not in factLocs:
|
|
1090
|
-
locNbr += 1
|
|
1091
|
-
locLabel = "l_{:02}".format(locNbr)
|
|
1092
|
-
factLocs[(linkrole, factIDs)] = locLabel
|
|
1093
|
-
for factId in factIDs:
|
|
1094
|
-
addChild(footnoteLink, XbrlConst.qnLinkLoc,
|
|
1095
|
-
attributes={XLINKTYPE: "locator",
|
|
1096
|
-
XLINKHREF: "#" + factId,
|
|
1097
|
-
XLINKLABEL: locLabel})
|
|
1098
|
-
locFromLabel = factLocs[(linkrole, factIDs)]
|
|
1099
|
-
if footnote.get("footnote"):
|
|
1100
|
-
footnoteNbr += 1
|
|
1101
|
-
footnoteToLabel = "f_{:02}".format(footnoteNbr)
|
|
1102
|
-
attrs = {XLINKTYPE: "resource",
|
|
1103
|
-
XLINKLABEL: footnoteToLabel}
|
|
1104
|
-
if footnote.get("language"):
|
|
1105
|
-
attrs[XMLLANG] = footnote["language"]
|
|
1106
|
-
# note, for HTML will need to build an element structure
|
|
1107
|
-
addChild(footnoteLink, XbrlConst.qnLinkFootnote, attributes=attrs, text=footnote["footnote"])
|
|
1108
|
-
elif footnote.get("noteRefs"):
|
|
1109
|
-
footnoteNbr += 1
|
|
1110
|
-
footnoteToLabel = "f_{:02}".format(footnoteNbr)
|
|
1111
|
-
for noteId in footnote.get("noteRefs"):
|
|
1112
|
-
xbrlNote = xbrlNoteTbl[noteId]
|
|
1113
|
-
attrs = {XLINKTYPE: "resource",
|
|
1114
|
-
XLINKLABEL: footnoteToLabel}
|
|
1115
|
-
try:
|
|
1116
|
-
if "dimensions" in xbrlNote:
|
|
1117
|
-
attrs[XMLLANG] = xbrlNote["dimensions"]["language"]
|
|
1118
|
-
elif "aspects" in xbrlNote:
|
|
1119
|
-
attrs[XMLLANG] = xbrlNote["aspects"]["language"]
|
|
1120
|
-
except KeyError:
|
|
1121
|
-
pass
|
|
1122
|
-
# note, for HTML will need to build an element structure
|
|
1123
|
-
addChild(footnoteLink, XbrlConst.qnLinkFootnote, attributes=attrs, text=xbrlNote["value"])
|
|
1124
|
-
elif footnote.get("factRef"):
|
|
1125
|
-
factRef = footnote.get("factRef")
|
|
1126
|
-
if (isCSV or isXL) and factRef in footnoteRefFactIds:
|
|
1127
|
-
fact2IDs = tuple(sorted(footnoteRefFactIds[factRef]))
|
|
1128
|
-
else:
|
|
1129
|
-
fact2IDs = tuple(sorted(factRef))
|
|
1130
|
-
if (linkrole, fact2IDs) not in factLocs:
|
|
1131
|
-
locNbr += 1
|
|
1132
|
-
locLabel = "l_{:02}".format(locNbr)
|
|
1133
|
-
factLocs[(linkrole, fact2IDs)] = locLabel
|
|
1134
|
-
for factId in fact2IDs:
|
|
1135
|
-
addChild(footnoteLink, XbrlConst.qnLinkLoc,
|
|
1136
|
-
attributes={XLINKTYPE: "locator",
|
|
1137
|
-
XLINKHREF: "#" + factId,
|
|
1138
|
-
XLINKLABEL: locLabel})
|
|
1139
|
-
footnoteToLabel = factLocs[(linkrole, fact2IDs)]
|
|
1140
|
-
footnoteArc = addChild(footnoteLink,
|
|
1141
|
-
XbrlConst.qnLinkFootnoteArc,
|
|
1142
|
-
attributes={XLINKTYPE: "arc",
|
|
1143
|
-
XLINKARCROLE: arcrole,
|
|
1144
|
-
XLINKFROM: locFromLabel,
|
|
1145
|
-
XLINKTO: footnoteToLabel})
|
|
1146
|
-
if isCSV and footnoteIdsNotReferenced:
|
|
1147
|
-
warning("xbrlce:footnotesNotReferenced",
|
|
1148
|
-
_("FootnoteId(s) not referenced %(footnoteIds)s."),
|
|
1149
|
-
modelObject=modelXbrl, footnoteIds=", ".join(sorted(footnoteIdsNotReferenced)))
|
|
1150
|
-
if footnoteLinks:
|
|
1151
|
-
modelXbrl.modelDocument.linkbaseDiscover(footnoteLinks.values(), inInstance=True)
|
|
1152
|
-
|
|
1153
|
-
if undefinedFootnoteTypes:
|
|
1154
|
-
error("xbrlje:unknownPrefix",
|
|
1155
|
-
_("These footnote types are not defined in prefixes: %(ftTypes)s."),
|
|
1156
|
-
modelObject=modelXbrl, ftTypes=", ".join(sorted(undefinedFootnoteTypes)))
|
|
1157
|
-
if undefinedFootnoteGroups:
|
|
1158
|
-
error("xbrlje:unknownPrefix",
|
|
1159
|
-
_("These footnote groups are not defined in prefixes: %(ftGroups)s."),
|
|
1160
|
-
modelObject=modelXbrl, ftGroups=", ".join(sorted(undefinedFootnoteGroups)))
|
|
1161
|
-
|
|
1162
|
-
currentAction = "done loading facts and footnotes"
|
|
1163
|
-
|
|
1164
|
-
#cntlr.addToLog("Completed in {0:.2} secs".format(time.time() - startedAt),
|
|
1165
|
-
# messageCode="loadFromExcel:info")
|
|
1166
|
-
except NotOIMException as ex:
|
|
1167
|
-
_return = ex # not an OIM document
|
|
1168
|
-
except Exception as ex:
|
|
1169
|
-
_return = ex
|
|
1170
|
-
if isinstance(ex, OIMException):
|
|
1171
|
-
error(ex.code, ex.message, modelObject=modelXbrl, **ex.msgArgs)
|
|
1172
|
-
else:
|
|
1173
|
-
error("arelleOIMloader:error",
|
|
1174
|
-
"Error while %(action)s, error %(error)s\ntraceback %(traceback)s",
|
|
1175
|
-
modelObject=modelXbrl, action=currentAction, error=ex,
|
|
1176
|
-
traceback=traceback.format_tb(sys.exc_info()[2]))
|
|
1177
|
-
|
|
1178
|
-
if priorCWD:
|
|
1179
|
-
os.chdir(priorCWD) # restore prior current working directory startingErrorCount = len(modelXbrl.errors)
|
|
1180
|
-
|
|
1181
|
-
#if startingErrorCount < len(modelXbrl.errors):
|
|
1182
|
-
# # had errors, don't allow ModelDocument.load to continue
|
|
1183
|
-
# return OIMException("arelleOIMloader:unableToLoad", "Unable to load due to reported errors")
|
|
1184
|
-
|
|
1185
|
-
global lastFilePath, lastFilePath
|
|
1186
|
-
lastFilePath = None
|
|
1187
|
-
lastFilePathIsOIM = False
|
|
1188
|
-
return _return
|
|
1189
|
-
|
|
1190
|
-
lastFilePath = None
|
|
1191
|
-
lastFilePathIsOIM = False
|
|
1192
|
-
|
|
1193
|
-
def isOimLoadable(modelXbrl, mappedUri, normalizedUri, filepath, **kwargs):
|
|
1194
|
-
global lastFilePath, lastFilePathIsOIM
|
|
1195
|
-
lastFilePath = filepath
|
|
1196
|
-
lastFilePathIsOIM = False
|
|
1197
|
-
_ext = os.path.splitext(filepath)[1]
|
|
1198
|
-
if _ext in (".csv", ".json", ".xlsx", ".xls"):
|
|
1199
|
-
lastFilePathIsOIM = True
|
|
1200
|
-
elif isHttpUrl(normalizedUri) and '?' in _ext: # query parameters and not .json, may be JSON anyway
|
|
1201
|
-
with io.open(filepath, 'rt', encoding='utf-8') as f:
|
|
1202
|
-
_fileStart = f.read(4096)
|
|
1203
|
-
if _fileStart and re.match(r"\s*\{\s*\"documentType\":\s*\"http:\\+/\\+/www.xbrl.org\\+/WGWD\\+/YYYY-MM-DD\\+/xbrl-json\"", _fileStart):
|
|
1204
|
-
lastFilePathIsOIM = True
|
|
1205
|
-
return lastFilePathIsOIM
|
|
1206
|
-
|
|
1207
|
-
def oimLoader(modelXbrl, mappedUri, filepath, *args, **kwargs):
|
|
1208
|
-
if filepath != lastFilePath or not lastFilePathIsOIM:
|
|
1209
|
-
return None # not an OIM file
|
|
1210
|
-
|
|
1211
|
-
cntlr = modelXbrl.modelManager.cntlr
|
|
1212
|
-
cntlr.showStatus(_("Loading OIM file: {0}").format(os.path.basename(filepath)))
|
|
1213
|
-
doc = loadFromOIM(cntlr, modelXbrl.error, modelXbrl.warning, modelXbrl, filepath, mappedUri)
|
|
1214
|
-
if doc is None:
|
|
1215
|
-
return None # not an OIM file
|
|
1216
|
-
modelXbrl.loadedFromOIM = True
|
|
1217
|
-
return doc
|
|
1218
|
-
|
|
1219
|
-
def guiXbrlLoaded(cntlr, modelXbrl, attach, *args, **kwargs):
|
|
1220
|
-
if cntlr.hasGui and getattr(modelXbrl, "loadedFromOIM", False):
|
|
1221
|
-
from arelle import ModelDocument
|
|
1222
|
-
from tkinter.filedialog import askdirectory
|
|
1223
|
-
instanceFile = cntlr.uiFileDialog("save",
|
|
1224
|
-
title=_("arelle - Save XBRL instance document"),
|
|
1225
|
-
initialdir=cntlr.config.setdefault("outputInstanceDir","."),
|
|
1226
|
-
filetypes=[(_("XBRL file .xbrl"), "*.xbrl"), (_("XBRL file .xml"), "*.xml")],
|
|
1227
|
-
defaultextension=".xbrl")
|
|
1228
|
-
if not instanceFile:
|
|
1229
|
-
return False
|
|
1230
|
-
cntlr.config["outputInstanceDir"] = os.path.dirname(instanceFile)
|
|
1231
|
-
cntlr.saveConfig()
|
|
1232
|
-
if instanceFile:
|
|
1233
|
-
modelXbrl.modelDocument.save(instanceFile, updateFileHistory=False)
|
|
1234
|
-
cntlr.showStatus(_("Saving XBRL instance: {0}").format(os.path.basename(instanceFile)))
|
|
1235
|
-
cntlr.showStatus(_("OIM loading completed"), 3500)
|
|
1236
|
-
|
|
1237
|
-
def cmdLineXbrlLoaded(cntlr, options, modelXbrl, *args, **kwargs):
|
|
1238
|
-
if options.saveOIMinstance and getattr(modelXbrl, "loadedFromOIM", False):
|
|
1239
|
-
doc = modelXbrl.modelDocument
|
|
1240
|
-
cntlr.showStatus(_("Saving XBRL instance: {0}").format(doc.basename))
|
|
1241
|
-
responseZipStream = kwargs.get("responseZipStream")
|
|
1242
|
-
if responseZipStream is not None:
|
|
1243
|
-
_zip = zipfile.ZipFile(responseZipStream, "a", zipfile.ZIP_DEFLATED, True)
|
|
1244
|
-
else:
|
|
1245
|
-
_zip = None
|
|
1246
|
-
doc.save(options.saveOIMinstance, _zip)
|
|
1247
|
-
if responseZipStream is not None:
|
|
1248
|
-
_zip.close()
|
|
1249
|
-
responseZipStream.seek(0)
|
|
1250
|
-
|
|
1251
|
-
def excelLoaderOptionExtender(parser, *args, **kwargs):
|
|
1252
|
-
parser.add_option("--saveOIMinstance",
|
|
1253
|
-
action="store",
|
|
1254
|
-
dest="saveOIMinstance",
|
|
1255
|
-
help=_("Save a instance loaded from OIM into this file name."))
|
|
1256
|
-
|
|
1257
|
-
def oimJsonSaveXml(cntlr, oimJsonObject, jsonFileName, xbrlFileName):
|
|
1258
|
-
def _error(code, message, **kwargs):
|
|
1259
|
-
cntlr.addToLog(message, code, kwargs, level=logging.ERROR)
|
|
1260
|
-
def _warning(code, message, **kwargs):
|
|
1261
|
-
cntlr.addToLog(message, code, kwargs, level=logging.WARNING)
|
|
1262
|
-
|
|
1263
|
-
doc = loadFromOIM(cntlr, _error, _warning, None, jsonFileName, "OIM", oimJsonObject)
|
|
1264
|
-
if xbrlFileName:
|
|
1265
|
-
doc.save(xbrlFileName)
|
|
1266
|
-
doc.modelXbrl.close()
|
|
1267
|
-
|
|
1268
|
-
__pluginInfo__ = {
|
|
1269
|
-
'name': 'Load From OIM 2018',
|
|
1270
|
-
'version': '0.9',
|
|
1271
|
-
'description': "This plug-in loads XBRL instance data from OIM (JSON, CSV or Excel) and saves the resulting XBRL Instance.",
|
|
1272
|
-
'license': 'Apache-2',
|
|
1273
|
-
'author': authorLabel,
|
|
1274
|
-
'copyright': copyrightLabel,
|
|
1275
|
-
# classes of mount points (required)
|
|
1276
|
-
'ModelDocument.IsPullLoadable': isOimLoadable,
|
|
1277
|
-
'ModelDocument.PullLoader': oimLoader,
|
|
1278
|
-
'CntlrWinMain.Xbrl.Loaded': guiXbrlLoaded,
|
|
1279
|
-
'CntlrCmdLine.Options': excelLoaderOptionExtender,
|
|
1280
|
-
'CntlrCmdLine.Xbrl.Loaded': cmdLineXbrlLoaded,
|
|
1281
|
-
'OimJson.SaveXml': oimJsonSaveXml
|
|
1282
|
-
}
|