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
arelle/CntlrCmdLine.py
CHANGED
|
@@ -5,35 +5,67 @@ This module is Arelle's controller in command line non-interactive mode
|
|
|
5
5
|
|
|
6
6
|
See COPYRIGHT.md for copyright information.
|
|
7
7
|
'''
|
|
8
|
-
from
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import datetime
|
|
11
|
+
import fnmatch
|
|
12
|
+
import gettext
|
|
13
|
+
import glob
|
|
14
|
+
import logging
|
|
15
|
+
import multiprocessing
|
|
16
|
+
import os
|
|
17
|
+
import platform
|
|
18
|
+
import shlex
|
|
19
|
+
import sys
|
|
20
|
+
import threading
|
|
21
|
+
import time
|
|
22
|
+
import traceback
|
|
23
|
+
from optparse import SUPPRESS_HELP, Option, OptionGroup, OptionParser
|
|
24
|
+
from pprint import pprint
|
|
25
|
+
|
|
11
26
|
import regex as re
|
|
12
|
-
from
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
27
|
+
from lxml import etree
|
|
28
|
+
|
|
29
|
+
from arelle import (
|
|
30
|
+
Cntlr,
|
|
31
|
+
FileSource,
|
|
32
|
+
ModelDocument,
|
|
33
|
+
PackageManager,
|
|
34
|
+
PluginManager,
|
|
35
|
+
ValidateDuplicateFacts,
|
|
36
|
+
Version,
|
|
37
|
+
ViewFileConcepts,
|
|
38
|
+
ViewFileDTS,
|
|
39
|
+
ViewFileFactList,
|
|
40
|
+
ViewFileFactTable,
|
|
41
|
+
ViewFileFormulae,
|
|
42
|
+
ViewFileRelationshipSet,
|
|
43
|
+
ViewFileRoleTypes,
|
|
44
|
+
ViewFileRssFeed,
|
|
45
|
+
ViewFileTests,
|
|
46
|
+
XbrlConst,
|
|
47
|
+
XmlUtil,
|
|
48
|
+
)
|
|
18
49
|
from arelle.BetaFeatures import BETA_FEATURES_AND_DESCRIPTIONS
|
|
19
|
-
from arelle.ModelValue import qname
|
|
20
50
|
from arelle.Locale import format_string, setApplicationLocale, setDisableRTL
|
|
21
51
|
from arelle.ModelFormulaObject import FormulaOptions
|
|
22
|
-
from arelle import
|
|
23
|
-
from arelle.
|
|
52
|
+
from arelle.ModelValue import qname
|
|
53
|
+
from arelle.ValidateFileSource import ValidateFileSource
|
|
54
|
+
from arelle.oim.xml.Save import saveOimReportToXmlInstance
|
|
55
|
+
from arelle.rendering import RenderingEvaluator
|
|
56
|
+
from arelle.RuntimeOptions import RuntimeOptions, RuntimeOptionsException
|
|
24
57
|
from arelle.SocketUtils import INTERNET_CONNECTIVITY, OFFLINE
|
|
58
|
+
from arelle.SystemInfo import PlatformOS, getSystemInfo, getSystemWordSize, hasWebServer, isCGI, isGAE
|
|
25
59
|
from arelle.typing import TypeGetText
|
|
26
|
-
from arelle.
|
|
27
|
-
from arelle.
|
|
60
|
+
from arelle.utils.EntryPointDetection import parseEntrypointFileInput
|
|
61
|
+
from arelle.ValidateXbrlDTS import ValidateBaseTaxonomiesMode
|
|
28
62
|
from arelle.WebCache import proxyTuple
|
|
29
|
-
|
|
30
|
-
from pprint import pprint
|
|
31
|
-
import logging
|
|
32
|
-
from lxml import etree
|
|
63
|
+
|
|
33
64
|
win32file = win32api = win32process = pywintypes = None
|
|
34
65
|
STILL_ACTIVE = 259 # MS Windows process status constants
|
|
35
66
|
PROCESS_QUERY_INFORMATION = 0x400
|
|
36
67
|
DISABLE_PERSISTENT_CONFIG_OPTION = "--disablePersistentConfig"
|
|
68
|
+
TESTCASE_EXPECTED_ERRORS_OPTION="testcaseExpectedErrors"
|
|
37
69
|
UILANG_OPTION = '--uiLang'
|
|
38
70
|
_: TypeGetText
|
|
39
71
|
|
|
@@ -46,16 +78,13 @@ def main():
|
|
|
46
78
|
:type message: [str]
|
|
47
79
|
"""
|
|
48
80
|
envArgs = os.getenv("ARELLE_ARGS")
|
|
49
|
-
if envArgs:
|
|
50
|
-
args = shlex.split(envArgs)
|
|
51
|
-
else:
|
|
52
|
-
args = sys.argv[1:]
|
|
81
|
+
args = shlex.split(envArgs) if envArgs else sys.argv[1:]
|
|
53
82
|
setApplicationLocale()
|
|
54
83
|
gettext.install("arelle")
|
|
55
84
|
parseAndRun(args)
|
|
56
85
|
|
|
57
86
|
|
|
58
|
-
def wsgiApplication(extraArgs=[]): # for example call wsgiApplication(["--plugins=
|
|
87
|
+
def wsgiApplication(extraArgs=[]): # for example call wsgiApplication(["--plugins=EDGAR/render"])
|
|
59
88
|
return parseAndRun( ["--webserver=::wsgi"] + extraArgs )
|
|
60
89
|
|
|
61
90
|
|
|
@@ -88,10 +117,10 @@ def parseArgs(args):
|
|
|
88
117
|
break
|
|
89
118
|
# Check if the config cache needs to be disabled prior to initializing the cntlr
|
|
90
119
|
disable_persistent_config = bool({DISABLE_PERSISTENT_CONFIG_OPTION, DISABLE_PERSISTENT_CONFIG_OPTION.lower()} & set(args))
|
|
91
|
-
cntlr =
|
|
120
|
+
cntlr = CntlrCmdLine(uiLang=uiLang, disable_persistent_config=disable_persistent_config) # This Cntlr is needed for translations and to enable the web cache. The cntlr is not used outside the parse function
|
|
92
121
|
usage = "usage: %prog [options]"
|
|
93
122
|
parser = OptionParser(usage,
|
|
94
|
-
version="Arelle(r) {
|
|
123
|
+
version=f"Arelle(r) {Version.__version__} ({getSystemWordSize()}bit)",
|
|
95
124
|
conflict_handler="resolve") # allow reloading plug-in options without errors
|
|
96
125
|
parser.add_option("-f", "--file", dest="entrypointFile",
|
|
97
126
|
help=_("FILENAME is an entry point, which may be "
|
|
@@ -128,6 +157,39 @@ def parseArgs(args):
|
|
|
128
157
|
"are individually so validated. "
|
|
129
158
|
"If formulae are present they will be validated and run unless --formula=none is specified. "
|
|
130
159
|
))
|
|
160
|
+
parser.add_option("--validateDuplicateFacts", "--validateduplicatefacts",
|
|
161
|
+
choices=[a.value for a in ValidateDuplicateFacts.DUPLICATE_TYPE_ARG_MAP],
|
|
162
|
+
dest="validateDuplicateFacts",
|
|
163
|
+
help=_("Select which types of duplicates should trigger warnings."))
|
|
164
|
+
parser.add_option("--baseTaxonomyValidation", "--basetaxonomyvalidation",
|
|
165
|
+
choices=("disclosureSystem", "none", "all"),
|
|
166
|
+
dest="baseTaxonomyValidationMode",
|
|
167
|
+
default="disclosureSystem",
|
|
168
|
+
help=_("""Specify if base taxonomies should be validated.
|
|
169
|
+
Skipping validation of base taxonomy files which are known to be valid can significantly reduce validation time.
|
|
170
|
+
disclosureSystem - (default) skip validation of base taxonomy files which are known to be valid by the disclosure system
|
|
171
|
+
none - skip validation of all base taxonomies
|
|
172
|
+
all - validate all base taxonomies"""))
|
|
173
|
+
parser.add_option("--saveOIMToXMLReport", "--saveoimtoxmlreport", "--saveOIMinstance", "--saveoiminstance",
|
|
174
|
+
action="store",
|
|
175
|
+
dest="saveOIMToXMLReport",
|
|
176
|
+
help=_("Save a report loaded from OIM into this file XML file name."))
|
|
177
|
+
parser.add_option("--validateXmlOim", "--validatexmloim", "--oim",
|
|
178
|
+
action="store_true",
|
|
179
|
+
dest="validateXmlOim",
|
|
180
|
+
help=_("Enables OIM validation for XML and iXBRL documents. OIM only formats (json, csv) are always OIM validated."))
|
|
181
|
+
parser.add_option("--reportPackage", "--reportPackage",
|
|
182
|
+
action="store_true",
|
|
183
|
+
dest="reportPackage",
|
|
184
|
+
help=_("Ignore detected file type and validate all files as Report Packages."))
|
|
185
|
+
parser.add_option("--deduplicateFacts", "--deduplicatefacts",
|
|
186
|
+
choices=[a.value for a in ValidateDuplicateFacts.DeduplicationType],
|
|
187
|
+
dest="deduplicateFacts",
|
|
188
|
+
help=_("When using '--saveDeduplicatedInstance' to save a deduplicated instance, check for duplicates of this type. "
|
|
189
|
+
"Defaults to 'complete'."))
|
|
190
|
+
parser.add_option("--saveDeduplicatedInstance", "--savededuplicatedinstance",
|
|
191
|
+
dest="saveDeduplicatedInstance",
|
|
192
|
+
help=_("Save an instance document with duplicates of the provided type ('--deduplicateFacts') deduplicated."))
|
|
131
193
|
parser.add_option("--noValidateTestcaseSchema", "--novalidatetestcaseschema", action="store_false", dest="validateTestcaseSchema", default=True,
|
|
132
194
|
help=_("Validate testcases against their schemas."))
|
|
133
195
|
betaGroup = OptionGroup(parser, "Beta Features",
|
|
@@ -161,7 +223,7 @@ def parseArgs(args):
|
|
|
161
223
|
" select disclosure system validation. "
|
|
162
224
|
"Enter --disclosureSystem=help for list of names or help-verbose for list of names and descriptions. "))
|
|
163
225
|
parser.add_option("--hmrc", action="store_true", dest="validateHMRC",
|
|
164
|
-
help=_("Select
|
|
226
|
+
help=_("Select HMRC disclosure system validation."))
|
|
165
227
|
parser.add_option("--utr", action="store_true", dest="utrValidate",
|
|
166
228
|
help=_("Select validation with respect to Unit Type Registry."))
|
|
167
229
|
parser.add_option("--utrUrl", "--utrurl", action="store", dest="utrUrl",
|
|
@@ -175,7 +237,7 @@ def parseArgs(args):
|
|
|
175
237
|
parser.add_option("--labelRole", "--labelrole", action="store", dest="labelRole",
|
|
176
238
|
help=_("Label role for labels in following file options (instead of standard label)"))
|
|
177
239
|
parser.add_option("--DTS", "--csvDTS", action="store", dest="DTSFile",
|
|
178
|
-
help=_("Write DTS tree into FILE
|
|
240
|
+
help=_("Write DTS tree into FILE"))
|
|
179
241
|
parser.add_option("--facts", "--csvFacts", action="store", dest="factsFile",
|
|
180
242
|
help=_("Write fact list into FILE"))
|
|
181
243
|
parser.add_option("--factListCols", action="store", dest="factListCols",
|
|
@@ -241,6 +303,8 @@ def parseArgs(args):
|
|
|
241
303
|
help=_("Log reference object properties (default)."), default=True)
|
|
242
304
|
parser.add_option("--logNoRefObjectProperties", "--lognorefobjectproperties", action="store_false", dest="logRefObjectProperties",
|
|
243
305
|
help=_("Do not log reference object properties."))
|
|
306
|
+
parser.add_option("--logXmlMaxAttributeLength", "--logxmlmaxattributelength", action="store", dest="logXmlMaxAttributeLength", type="int",
|
|
307
|
+
help=_("Truncate XML log file attribute values at length. The default is 4096000 for JSON content and 128 for everything else."))
|
|
244
308
|
parser.add_option("--statusPipe", action="store", dest="statusPipe", help=SUPPRESS_HELP)
|
|
245
309
|
parser.add_option("--monitorParentProcess", action="store", dest="monitorParentProcess", help=SUPPRESS_HELP)
|
|
246
310
|
parser.add_option("--outputAttribution", "--outputattribution", action="store", dest="outputAttribution", help=SUPPRESS_HELP)
|
|
@@ -255,6 +319,8 @@ def parseArgs(args):
|
|
|
255
319
|
"if this option is not specified, -v or --validate will validate and run formulas if present"))
|
|
256
320
|
parser.add_option("--formulaParamExprResult", "--formulaparamexprresult", action="store_true", dest="formulaParamExprResult", help=_("Specify formula tracing."))
|
|
257
321
|
parser.add_option("--formulaParamInputValue", "--formulaparaminputvalue", action="store_true", dest="formulaParamInputValue", help=_("Specify formula tracing."))
|
|
322
|
+
parser.add_option("--formulaMaximumMessageInterpolationLength", "--formulamaximummessageinterpolationlength", action="store", dest="formulaMaximumMessageInterpolationLength", type="int",
|
|
323
|
+
help=_("Truncate interpolated expressions in formula messages to this length."), default=1000)
|
|
258
324
|
parser.add_option("--formulaCallExprSource", "--formulacallexprsource", action="store_true", dest="formulaCallExprSource", help=_("Specify formula tracing."))
|
|
259
325
|
parser.add_option("--formulaCallExprCode", "--formulacallexprcode", action="store_true", dest="formulaCallExprCode", help=_("Specify formula tracing."))
|
|
260
326
|
parser.add_option("--formulaCallExprEval", "--formulacallexpreval", action="store_true", dest="formulaCallExprEval", help=_("Specify formula tracing."))
|
|
@@ -275,8 +341,13 @@ def parseArgs(args):
|
|
|
275
341
|
parser.add_option("--formulaVarExpressionResult", "--formulavarexpressionresult", action="store_true", dest="formulaVarExpressionResult", help=_("Specify formula tracing."))
|
|
276
342
|
parser.add_option("--formulaVarFilterWinnowing", "--formulavarfilterwinnowing", action="store_true", dest="formulaVarFilterWinnowing", help=_("Specify formula tracing."))
|
|
277
343
|
parser.add_option("--formulaVarFiltersResult", "--formulavarfiltersresult", action="store_true", dest="formulaVarFiltersResult", help=_("Specify formula tracing."))
|
|
344
|
+
parser.add_option("--testcaseExpectedErrors", "--testcaseexpectederrors", action="append", dest=TESTCASE_EXPECTED_ERRORS_OPTION,
|
|
345
|
+
help=_("For testcase results, specify comma separated additional expected errors by test case id. --testcaseExpectedErrors=testcase-index.xml:test_id1|IOerror,oime:invalidTaxonomy"))
|
|
346
|
+
parser.add_option("--testcaseFilter", "--testcasefilter", action="append", dest="testcaseFilters",
|
|
347
|
+
help=_("If any filters are provided, any testcase variation path in the form {testcaseFilepath}:{testcaseVariationId} that doesn't pass any filter "
|
|
348
|
+
"will be skipped." ))
|
|
278
349
|
parser.add_option("--testcaseResultsCaptureWarnings", "--testcaseresultscapturewarnings", action="store_true", dest="testcaseResultsCaptureWarnings",
|
|
279
|
-
help=_("For testcase variations capture warning results, default is inconsistency or warning if there is any warning expected result. "))
|
|
350
|
+
help=_("For testcase variations and RSS feed items, capture warning results, default is inconsistency or warning if there is any warning expected result. "))
|
|
280
351
|
parser.add_option("--testcaseResultOptions", choices=("match-any", "match-all"), action="store", dest="testcaseResultOptions",
|
|
281
352
|
help=_("For testcase results, default is match any expected result, options to match any or match all expected result(s). "))
|
|
282
353
|
parser.add_option("--formulaRunIDs", "--formularunids", action="store", dest="formulaRunIDs", help=_("Specify formula/assertion IDs to run, separated by a '|' character, or a regex expression."))
|
|
@@ -302,6 +373,8 @@ def parseArgs(args):
|
|
|
302
373
|
help=_("Specify no checking of internet secure connection certificate"))
|
|
303
374
|
parser.add_option("--httpsRedirectCache", "--httpsredirectcache", action="store_true", dest="httpsRedirectCache",
|
|
304
375
|
help=_("Treat http and https schemes interchangeably when looking up files from the webcache"))
|
|
376
|
+
parser.add_option("--cacheDirectory", "--cachedirectory", action="store", dest="cacheDirectory",
|
|
377
|
+
help=_("Override the default location of the cache directory"))
|
|
305
378
|
parser.add_option("--httpUserAgent", "--httpuseragent", action="store", dest="httpUserAgent",
|
|
306
379
|
help=_("Specify non-standard http header User-Agent value"))
|
|
307
380
|
parser.add_option(DISABLE_PERSISTENT_CONFIG_OPTION, DISABLE_PERSISTENT_CONFIG_OPTION.lower(), action="store_true", dest="disablePersistentConfig", help=_("Prohibits Arelle from reading and writing a config to the local cache."))
|
|
@@ -316,12 +389,10 @@ def parseArgs(args):
|
|
|
316
389
|
R" (e.g., 'http://arelle.org/files/hello_web.py', 'C:\Program Files\Arelle\examples\plugin\hello_dolly.py' to load, "
|
|
317
390
|
"or ../examples/plugin/hello_dolly.py for relative use of examples directory) "
|
|
318
391
|
"Local python files do not require .py suffix, e.g., hello_dolly without .py is sufficient, "
|
|
319
|
-
"Packaged plug-in urls are their directory's url (e.g., --plugins
|
|
320
|
-
parser.add_option("--packages", "--package", action="
|
|
321
|
-
help=_("
|
|
322
|
-
"
|
|
323
|
-
"Commands show, and module urls are '|' separated: "
|
|
324
|
-
"url specifies a package by its url or filename, please use full paths. "
|
|
392
|
+
"Packaged plug-in urls are their directory's url (e.g., --plugins EDGAR/render or --plugins xbrlDB). " ))
|
|
393
|
+
parser.add_option("--packages", "--package", action="append", dest="packages",
|
|
394
|
+
help=_("Load taxonomy packages. Option can be repeated for multiple files. "
|
|
395
|
+
"If a directory is specified, all .zip files in the directory will be loaded. "
|
|
325
396
|
"(Package settings from GUI are no longer shared with cmd line operation. "
|
|
326
397
|
"Cmd line package settings are not persistent.) " ))
|
|
327
398
|
parser.add_option("--packageManifestName", action="store", dest="packageManifestName",
|
|
@@ -335,7 +406,7 @@ def parseArgs(args):
|
|
|
335
406
|
if hasWebServer():
|
|
336
407
|
parser.add_option("--webserver", action="store", dest="webserver",
|
|
337
408
|
help=_("start web server on host:port[:server] for REST and web access, e.g., --webserver locahost:8080, "
|
|
338
|
-
"or specify nondefault a server name, such as
|
|
409
|
+
"or specify nondefault a server name, such as cheroot, --webserver locahost:8080:cheroot. "
|
|
339
410
|
"(It is possible to specify options to be defaults for the web server, such as disclosureSystem and validations, but not including file names.) "))
|
|
340
411
|
pluginOptionsIndex = len(parser.option_list)
|
|
341
412
|
pluginOptionsGroupIndex = len(parser.option_groups)
|
|
@@ -359,7 +430,7 @@ def parseArgs(args):
|
|
|
359
430
|
PluginManager.reset()
|
|
360
431
|
break
|
|
361
432
|
# add plug-in options
|
|
362
|
-
for optionsExtender in pluginClassMethods("CntlrCmdLine.Options"):
|
|
433
|
+
for optionsExtender in PluginManager.pluginClassMethods("CntlrCmdLine.Options"):
|
|
363
434
|
optionsExtender(parser)
|
|
364
435
|
pluginLastOptionIndex = len(parser.option_list)
|
|
365
436
|
pluginLastOptionsGroupIndex = len(parser.option_groups)
|
|
@@ -416,15 +487,14 @@ def parseArgs(args):
|
|
|
416
487
|
"\n Python(r) {pythonVersion} (c) 2001-2013 Python Software Foundation"
|
|
417
488
|
"\n PyParsing (c) 2003-2013 Paul T. McGuire"
|
|
418
489
|
"\n lxml {lxmlVersion} (c) 2004 Infrae, ElementTree (c) 1999-2004 by Fredrik Lundh"
|
|
419
|
-
"
|
|
490
|
+
"\n Bottle (c) 2009-2024 Marcel Hellkamp"
|
|
420
491
|
"\n May include installable plug-in modules with author-specific license terms").format(
|
|
421
492
|
version=Version.__version__,
|
|
422
493
|
wordSize=getSystemWordSize(),
|
|
423
494
|
platform=platform.machine(),
|
|
424
|
-
copyrightLabel=copyrightLabel,
|
|
495
|
+
copyrightLabel=Version.copyrightLabel,
|
|
425
496
|
pythonVersion=f'{sys.version_info[0]}.{sys.version_info[1]}.{sys.version_info[2]}',
|
|
426
497
|
lxmlVersion=f'{etree.LXML_VERSION[0]}.{etree.LXML_VERSION[1]}.{etree.LXML_VERSION[2]}',
|
|
427
|
-
bottleCopyright="\n Bottle (c) 2011-2013 Marcel Hellkamp" if hasWebServer() else ""
|
|
428
498
|
))
|
|
429
499
|
parser.exit() # Printing the message in parser.exit sends it to stderr NOT stdout
|
|
430
500
|
elif options.diagnostics:
|
|
@@ -453,15 +523,31 @@ def parseArgs(args):
|
|
|
453
523
|
if optionName in pluginOptionDestinations:
|
|
454
524
|
pluginOptions[optionName] = optionValue
|
|
455
525
|
else:
|
|
526
|
+
if optionName == TESTCASE_EXPECTED_ERRORS_OPTION and optionValue is not None:
|
|
527
|
+
expectedErrors = {}
|
|
528
|
+
for expectedError in optionValue:
|
|
529
|
+
expectedErrorSplit = expectedError.split('|')
|
|
530
|
+
if len(expectedErrorSplit) != 2:
|
|
531
|
+
parser.error(_("--testcaseExpectedErrors must be in the format '--testcaseExpectedErrors=testcase-index.xml:v-1|errorCode1,errorCode2,...'"))
|
|
532
|
+
expectedErrors[expectedErrorSplit[0]] = expectedErrorSplit[1].split(',')
|
|
533
|
+
optionValue = expectedErrors
|
|
456
534
|
baseOptions[optionName] = optionValue
|
|
457
535
|
try:
|
|
458
536
|
runtimeOptions = RuntimeOptions(pluginOptions=pluginOptions, **baseOptions)
|
|
459
537
|
except RuntimeOptionsException as e:
|
|
460
538
|
parser.error(f"{e}, please try\n python CntlrCmdLine.py --help")
|
|
539
|
+
if (
|
|
540
|
+
runtimeOptions.entrypointFile is None and
|
|
541
|
+
not runtimeOptions.proxy and
|
|
542
|
+
not runtimeOptions.plugins and
|
|
543
|
+
not pluginOptions and
|
|
544
|
+
not runtimeOptions.webserver
|
|
545
|
+
):
|
|
546
|
+
parser.error("No entrypoint specified, please try\n python CntlrCmdLine.py --help")
|
|
461
547
|
return runtimeOptions, arellePluginModules
|
|
462
548
|
|
|
463
549
|
|
|
464
|
-
def createCntlrAndPreloadPlugins(uiLang, disablePersistentConfig, arellePluginModules):
|
|
550
|
+
def createCntlrAndPreloadPlugins(uiLang, disablePersistentConfig, arellePluginModules) -> CntlrCmdLine:
|
|
465
551
|
"""
|
|
466
552
|
This function creates a cntlr and preloads all the necessary plugins.
|
|
467
553
|
:param uiLang: The UI Language
|
|
@@ -499,62 +585,46 @@ def configAndRunCntlr(options, arellePluginModules):
|
|
|
499
585
|
logFormat=(options.logFormat or "[%(messageCode)s] %(message)s - %(file)s"),
|
|
500
586
|
logLevel=(options.logLevel or "DEBUG"),
|
|
501
587
|
logToBuffer=getattr(options, "logToBuffer", False),
|
|
502
|
-
logTextMaxLength=options.logTextMaxLength, # e.g., used by
|
|
503
|
-
logRefObjectProperties=options.logRefObjectProperties
|
|
588
|
+
logTextMaxLength=options.logTextMaxLength, # e.g., used by EDGAR/render to require buffered logging
|
|
589
|
+
logRefObjectProperties=options.logRefObjectProperties,
|
|
590
|
+
logXmlMaxAttributeLength=options.logXmlMaxAttributeLength,
|
|
591
|
+
logPropagate=options.logPropagate)
|
|
504
592
|
cntlr.postLoggingInit() # Cntlr options after logging is started
|
|
505
593
|
cntlr.run(options)
|
|
506
594
|
return cntlr
|
|
507
595
|
|
|
508
596
|
|
|
509
|
-
def filesourceEntrypointFiles(filesource, entrypointFiles=[]):
|
|
510
|
-
if filesource.isArchive:
|
|
511
|
-
if filesource.isTaxonomyPackage: # if archive is also a taxonomy package, activate mappings
|
|
512
|
-
filesource.loadTaxonomyPackageMappings()
|
|
513
|
-
del entrypointFiles[:] # clear out archive from entrypointFiles
|
|
514
|
-
# attempt to find inline XBRL files before instance files, .xhtml before probing others (ESMA)
|
|
515
|
-
for _archiveFile in (filesource.dir or ()): # .dir might be none if IOerror
|
|
516
|
-
if _archiveFile.endswith(".xhtml") or _archiveFile.endswith(".html"):
|
|
517
|
-
filesource.select(_archiveFile)
|
|
518
|
-
if ModelDocument.Type.identify(filesource, filesource.url) in (ModelDocument.Type.INSTANCE, ModelDocument.Type.INLINEXBRL):
|
|
519
|
-
entrypointFiles.append({"file":filesource.url})
|
|
520
|
-
urlsByType = {}
|
|
521
|
-
if not entrypointFiles:
|
|
522
|
-
for _archiveFile in (filesource.dir or ()): # .dir might be none if IOerror
|
|
523
|
-
filesource.select(_archiveFile)
|
|
524
|
-
identifiedType = ModelDocument.Type.identify(filesource, filesource.url)
|
|
525
|
-
if identifiedType in (ModelDocument.Type.INSTANCE, ModelDocument.Type.INLINEXBRL, ModelDocument.Type.HTML):
|
|
526
|
-
urlsByType.setdefault(identifiedType, []).append(filesource.url)
|
|
527
|
-
# use inline instances, if any, else non-inline instances
|
|
528
|
-
for identifiedType in (ModelDocument.Type.INLINEXBRL, ModelDocument.Type.INSTANCE):
|
|
529
|
-
for url in urlsByType.get(identifiedType, []):
|
|
530
|
-
entrypointFiles.append({"file":url})
|
|
531
|
-
if entrypointFiles:
|
|
532
|
-
if identifiedType == ModelDocument.Type.INLINEXBRL:
|
|
533
|
-
for pluginXbrlMethod in pluginClassMethods("InlineDocumentSet.Discovery"):
|
|
534
|
-
pluginXbrlMethod(filesource, entrypointFiles) # group into IXDS if plugin feature is available
|
|
535
|
-
break # found inline (or non-inline) entrypoint files, don't look for any other type
|
|
536
|
-
# for ESEF non-consolidated xhtml documents accept an xhtml entry point
|
|
537
|
-
if not entrypointFiles:
|
|
538
|
-
for url in urlsByType.get(ModelDocument.Type.HTML, []):
|
|
539
|
-
entrypointFiles.append({"file":url})
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
elif os.path.isdir(filesource.url):
|
|
543
|
-
del entrypointFiles[:] # clear list
|
|
544
|
-
for _file in os.listdir(filesource.url):
|
|
545
|
-
_path = os.path.join(filesource.url, _file)
|
|
546
|
-
if os.path.isfile(_path) and ModelDocument.Type.identify(filesource, _path) in (ModelDocument.Type.INSTANCE, ModelDocument.Type.INLINEXBRL):
|
|
547
|
-
entrypointFiles.append({"file":_path})
|
|
548
|
-
return entrypointFiles
|
|
549
|
-
|
|
550
597
|
class ParserForDynamicPlugins:
|
|
551
598
|
def __init__(self, options):
|
|
599
|
+
self._long_opt = {}
|
|
600
|
+
self._short_opt = {}
|
|
601
|
+
self.conflict_handler = 'error'
|
|
602
|
+
self.defaults = {}
|
|
603
|
+
self.option_class = Option
|
|
552
604
|
self.options = options
|
|
605
|
+
|
|
553
606
|
def add_option(self, *args, **kwargs):
|
|
554
607
|
if 'dest' in kwargs:
|
|
555
608
|
_dest = kwargs['dest']
|
|
556
609
|
if not hasattr(self.options, _dest):
|
|
557
|
-
setattr(self.options, _dest, kwargs.get('default'
|
|
610
|
+
setattr(self.options, _dest, kwargs.get('default'))
|
|
611
|
+
|
|
612
|
+
def add_option_group(self, featureGroup, *args, **kwargs):
|
|
613
|
+
for opt in featureGroup.option_list:
|
|
614
|
+
if hasattr(opt, "dest"):
|
|
615
|
+
self.add_option(dest=opt.dest, default=getattr(opt, 'default', None))
|
|
616
|
+
|
|
617
|
+
def __getattr__(self, name: str) -> None:
|
|
618
|
+
return None
|
|
619
|
+
|
|
620
|
+
|
|
621
|
+
def _pluginHasCliOptions(moduleInfo):
|
|
622
|
+
if "CntlrCmdLine.Options" in moduleInfo["classMethods"]:
|
|
623
|
+
return True
|
|
624
|
+
if imports := moduleInfo.get("imports"):
|
|
625
|
+
return any(_pluginHasCliOptions(importedModule) for importedModule in imports)
|
|
626
|
+
return False
|
|
627
|
+
|
|
558
628
|
|
|
559
629
|
class CntlrCmdLine(Cntlr.Cntlr):
|
|
560
630
|
"""
|
|
@@ -564,10 +634,10 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
564
634
|
"""
|
|
565
635
|
|
|
566
636
|
def __init__(self, logFileName=None, uiLang=None, disable_persistent_config=False):
|
|
567
|
-
super(
|
|
637
|
+
super().__init__(hasGui=False, uiLang=uiLang, disable_persistent_config=disable_persistent_config, logFileName=logFileName)
|
|
568
638
|
self.preloadedPlugins = {}
|
|
569
639
|
|
|
570
|
-
def run(self, options, sourceZipStream=None, responseZipStream=None):
|
|
640
|
+
def run(self, options: RuntimeOptions, sourceZipStream=None, responseZipStream=None) -> bool:
|
|
571
641
|
"""Process command line arguments or web service request, such as to load and validate an XBRL document, or start web server.
|
|
572
642
|
|
|
573
643
|
When a web server has been requested, this method may be called multiple times, once for each web service (REST) request that requires processing.
|
|
@@ -576,24 +646,24 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
576
646
|
:param options: OptionParser options from parse_args of main argv arguments (when called from command line) or corresponding arguments from web service (REST) request.
|
|
577
647
|
:type options: optparse.Values
|
|
578
648
|
"""
|
|
579
|
-
for b in BETA_FEATURES_AND_DESCRIPTIONS
|
|
649
|
+
for b in BETA_FEATURES_AND_DESCRIPTIONS:
|
|
580
650
|
self.betaFeatures[b] = getattr(options, b)
|
|
581
651
|
if options.statusPipe or options.monitorParentProcess:
|
|
582
652
|
try:
|
|
583
653
|
global win32file, win32api, win32process, pywintypes
|
|
584
654
|
import win32file, win32api, win32process, pywintypes
|
|
585
655
|
except ImportError: # win32 not installed
|
|
586
|
-
self.addToLog("--statusPipe {} cannot be installed, packages for win32 missing"
|
|
656
|
+
self.addToLog(f"--statusPipe {options.statusPipe} cannot be installed, packages for win32 missing")
|
|
587
657
|
options.statusPipe = options.monitorParentProcess = None
|
|
588
658
|
if options.statusPipe:
|
|
589
659
|
try:
|
|
590
|
-
self.statusPipe = win32file.CreateFile("\\\\.\\pipe\\{
|
|
660
|
+
self.statusPipe = win32file.CreateFile(f"\\\\.\\pipe\\{options.statusPipe}",
|
|
591
661
|
win32file.GENERIC_READ | win32file.GENERIC_WRITE, 0, None, win32file.OPEN_EXISTING, win32file.FILE_FLAG_NO_BUFFERING, None)
|
|
592
662
|
self.showStatus = self.showStatusOnPipe
|
|
593
663
|
self.lastStatusTime = 0.0
|
|
594
664
|
self.parentProcessHandle = None
|
|
595
665
|
except pywintypes.error: # named pipe doesn't exist
|
|
596
|
-
self.addToLog("--statusPipe {} has not been created by calling program"
|
|
666
|
+
self.addToLog(f"--statusPipe {options.statusPipe} has not been created by calling program")
|
|
597
667
|
if options.monitorParentProcess:
|
|
598
668
|
try:
|
|
599
669
|
self.parentProcessHandle = win32api.OpenProcess(PROCESS_QUERY_INFORMATION, False, int(options.monitorParentProcess))
|
|
@@ -605,14 +675,14 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
605
675
|
_t.start()
|
|
606
676
|
monitorParentProcess()
|
|
607
677
|
except ImportError: # win32 not installed
|
|
608
|
-
self.addToLog("--monitorParentProcess {} cannot be installed, packages for win32api and win32process missing"
|
|
678
|
+
self.addToLog(f"--monitorParentProcess {options.monitorParentProcess} cannot be installed, packages for win32api and win32process missing")
|
|
609
679
|
except (ValueError, pywintypes.error): # parent process doesn't exist
|
|
610
|
-
self.addToLog("--monitorParentProcess Process {} Id is invalid"
|
|
680
|
+
self.addToLog(f"--monitorParentProcess Process {options.monitorParentProcess} Id is invalid")
|
|
611
681
|
sys.exit()
|
|
612
682
|
if options.showOptions: # debug options
|
|
613
683
|
for optName, optValue in sorted(options.__dict__.items(), key=lambda optItem: optItem[0]):
|
|
614
|
-
self.addToLog("Option {
|
|
615
|
-
self.addToLog("sys.argv {
|
|
684
|
+
self.addToLog(f"Option {optName}={optValue}", messageCode="info")
|
|
685
|
+
self.addToLog(f"sys.argv {sys.argv}", messageCode="info")
|
|
616
686
|
|
|
617
687
|
setDisableRTL(options.disableRtl) # not saved to config
|
|
618
688
|
|
|
@@ -642,7 +712,7 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
642
712
|
":****" if password else "",
|
|
643
713
|
"@" if (user or password) else "",
|
|
644
714
|
urlAddr,
|
|
645
|
-
":{
|
|
715
|
+
f":{urlPort}" if urlPort else ""), messageCode="info")
|
|
646
716
|
else:
|
|
647
717
|
self.addToLog(_("Proxy is disabled."), messageCode="info")
|
|
648
718
|
if options.noCertificateCheck:
|
|
@@ -651,10 +721,16 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
651
721
|
self.webCache.httpsRedirect = options.httpsRedirectCache
|
|
652
722
|
if options.httpUserAgent:
|
|
653
723
|
self.webCache.httpUserAgent = options.httpUserAgent
|
|
724
|
+
if options.redirectFallbacks:
|
|
725
|
+
for matchPattern, replaceFormat in options.redirectFallbacks.items():
|
|
726
|
+
self.webCache.redirectFallback(matchPattern, replaceFormat)
|
|
727
|
+
if options.cacheDirectory:
|
|
728
|
+
self.webCache.cacheDir = options.cacheDirectory
|
|
654
729
|
if options.plugins:
|
|
655
730
|
resetPlugins = False
|
|
656
731
|
savePluginChanges = True
|
|
657
732
|
showPluginModules = False
|
|
733
|
+
loadPluginOptions = False
|
|
658
734
|
for pluginCmd in options.plugins.split('|'):
|
|
659
735
|
cmd = pluginCmd.strip()
|
|
660
736
|
if cmd == "show":
|
|
@@ -667,8 +743,8 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
667
743
|
self.addToLog(_("Addition of plug-in {0} successful.").format(moduleInfo.get("name")),
|
|
668
744
|
messageCode="info", file=moduleInfo.get("moduleURL"))
|
|
669
745
|
resetPlugins = True
|
|
670
|
-
if
|
|
671
|
-
|
|
746
|
+
if _pluginHasCliOptions(moduleInfo):
|
|
747
|
+
loadPluginOptions = True
|
|
672
748
|
else:
|
|
673
749
|
self.addToLog(_("Unable to load plug-in."), messageCode="info", file=cmd[1:])
|
|
674
750
|
elif cmd.startswith("~"):
|
|
@@ -691,6 +767,8 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
691
767
|
moduleInfo = PluginManager.addPluginModule(cmd)
|
|
692
768
|
if moduleInfo:
|
|
693
769
|
resetPlugins = True
|
|
770
|
+
if _pluginHasCliOptions(moduleInfo):
|
|
771
|
+
loadPluginOptions = True
|
|
694
772
|
if moduleInfo:
|
|
695
773
|
self.addToLog(_("Activation of plug-in {0} successful, version {1}.").format(moduleInfo.get("name"), moduleInfo.get("version")),
|
|
696
774
|
messageCode="info", file=moduleInfo.get("moduleURL"))
|
|
@@ -702,11 +780,11 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
702
780
|
PluginManager.reset()
|
|
703
781
|
if savePluginChanges:
|
|
704
782
|
PluginManager.save(self)
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
783
|
+
if loadPluginOptions:
|
|
784
|
+
_optionsParser = ParserForDynamicPlugins(options)
|
|
785
|
+
# add plug-in options
|
|
786
|
+
for optionsExtender in PluginManager.pluginClassMethods("CntlrCmdLine.Options"):
|
|
787
|
+
optionsExtender(_optionsParser)
|
|
710
788
|
|
|
711
789
|
if showPluginModules:
|
|
712
790
|
self.addToLog(_("Plug-in modules:"), messageCode="info")
|
|
@@ -748,6 +826,17 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
748
826
|
else:
|
|
749
827
|
self.modelManager.disclosureSystem.select(None) # just load ordinary mappings
|
|
750
828
|
self.modelManager.validateDisclosureSystem = False
|
|
829
|
+
if self.modelManager.disclosureSystem.keepOpen:
|
|
830
|
+
# Force keepOpen if specified by disclosure system.
|
|
831
|
+
options.keepOpen = True
|
|
832
|
+
if options.baseTaxonomyValidationMode is not None:
|
|
833
|
+
self.modelManager.baseTaxonomyValidationMode = ValidateBaseTaxonomiesMode.fromName(options.baseTaxonomyValidationMode)
|
|
834
|
+
self.modelManager.validateXmlOim = bool(options.validateXmlOim)
|
|
835
|
+
if options.validateDuplicateFacts:
|
|
836
|
+
duplicateTypeArg = ValidateDuplicateFacts.DuplicateTypeArg(options.validateDuplicateFacts)
|
|
837
|
+
duplicateType = duplicateTypeArg.duplicateType()
|
|
838
|
+
self.modelManager.validateDuplicateFacts = duplicateType
|
|
839
|
+
self.modelManager.validateAllFilesAsReportPackages = bool(options.reportPackage)
|
|
751
840
|
if options.utrUrl: # override disclosureSystem utrUrl
|
|
752
841
|
self.modelManager.disclosureSystem.utrUrl = [options.utrUrl]
|
|
753
842
|
# can be set now because the utr is first loaded at validation time
|
|
@@ -814,6 +903,7 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
814
903
|
fo.parameterValues = dict(((qname(key, noPrefixIsNoNamespace=True),(None,value))
|
|
815
904
|
for param in options.parameters.split(parameterSeparator)
|
|
816
905
|
for key,sep,value in (param.partition('='),) ) )
|
|
906
|
+
fo.maximumMessageInterpolationLength = options.formulaMaximumMessageInterpolationLength
|
|
817
907
|
if options.formulaParamExprResult:
|
|
818
908
|
fo.traceParameterExpressionResult = True
|
|
819
909
|
if options.formulaParamInputValue:
|
|
@@ -858,7 +948,12 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
858
948
|
fo.traceVariableFilterWinnowing = True
|
|
859
949
|
if options.formulaVarFiltersResult:
|
|
860
950
|
fo.traceVariableFiltersResult = True
|
|
951
|
+
if options.testcaseExpectedErrors:
|
|
952
|
+
fo.testcaseExpectedErrors = options.testcaseExpectedErrors
|
|
953
|
+
if options.testcaseFilters:
|
|
954
|
+
fo.testcaseFilters = options.testcaseFilters
|
|
861
955
|
if options.testcaseResultsCaptureWarnings:
|
|
956
|
+
self.errorManager.setErrorCaptureLevel(logging._checkLevel("WARNING"))
|
|
862
957
|
fo.testcaseResultsCaptureWarnings = True
|
|
863
958
|
if options.testcaseResultOptions:
|
|
864
959
|
fo.testcaseResultOptions = options.testcaseResultOptions
|
|
@@ -874,7 +969,7 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
874
969
|
|
|
875
970
|
# run utility command line options that don't depend on entrypoint Files
|
|
876
971
|
hasUtilityPlugin = False
|
|
877
|
-
for pluginXbrlMethod in pluginClassMethods("CntlrCmdLine.Utility.Run"):
|
|
972
|
+
for pluginXbrlMethod in PluginManager.pluginClassMethods("CntlrCmdLine.Utility.Run"):
|
|
878
973
|
hasUtilityPlugin = True
|
|
879
974
|
try:
|
|
880
975
|
pluginXbrlMethod(self, options, sourceZipStream=sourceZipStream, responseZipStream=responseZipStream)
|
|
@@ -886,46 +981,36 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
886
981
|
if not (options.entrypointFile or sourceZipStream):
|
|
887
982
|
return True # success
|
|
888
983
|
|
|
984
|
+
entrypointParseResult = parseEntrypointFileInput(self, options.entrypointFile, sourceZipStream)
|
|
985
|
+
if not entrypointParseResult.success:
|
|
986
|
+
return False
|
|
987
|
+
filesource = entrypointParseResult.filesource
|
|
988
|
+
_entrypointFiles = entrypointParseResult.entrypointFiles
|
|
889
989
|
success = True
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
_entryPoints = []
|
|
893
|
-
_checkIfXmlIsEis = self.modelManager.disclosureSystem and self.modelManager.disclosureSystem.validationType == "EFM"
|
|
894
|
-
if options.entrypointFile:
|
|
895
|
-
_f = options.entrypointFile
|
|
896
|
-
try: # may be a json list
|
|
897
|
-
_entryPoints = json.loads(_f)
|
|
898
|
-
_checkIfXmlIsEis = False # json entry objects never specify an xml EIS archive
|
|
899
|
-
except ValueError as e:
|
|
900
|
-
# is it malformed json?
|
|
901
|
-
if _f.startswith("[{") or _f.endswith("]}") or '"file:"' in _f:
|
|
902
|
-
self.addToLog(_("File name parameter appears to be malformed JSON: {0}\n{1}".format(e, _f)),
|
|
903
|
-
messageCode="FileNameFormatError",
|
|
904
|
-
level=logging.ERROR)
|
|
905
|
-
success = False
|
|
906
|
-
else: # try as file names separated by '|'
|
|
907
|
-
for f in (_f or '').split('|'):
|
|
908
|
-
if not sourceZipStream and not isHttpUrl(f) and not os.path.isabs(f):
|
|
909
|
-
f = os.path.normpath(os.path.join(os.getcwd(), f)) # make absolute normed path
|
|
910
|
-
_entryPoints.append({"file":f})
|
|
911
|
-
filesource = None # file source for all instances if not None
|
|
912
|
-
if sourceZipStream:
|
|
913
|
-
filesource = FileSource.openFileSource(None, self, sourceZipStream)
|
|
914
|
-
elif len(_entryPoints) == 1 and "file" in _entryPoints[0]: # check if an archive and need to discover entry points (and not IXDS)
|
|
915
|
-
filesource = FileSource.openFileSource(_entryPoints[0].get("file",None), self, checkIfXmlIsEis=_checkIfXmlIsEis)
|
|
916
|
-
_entrypointFiles = _entryPoints
|
|
917
|
-
if filesource and not filesource.selection:
|
|
918
|
-
if not (sourceZipStream and len(_entrypointFiles) > 0):
|
|
919
|
-
filesourceEntrypointFiles(filesource, _entrypointFiles)
|
|
920
|
-
|
|
921
|
-
for pluginXbrlMethod in pluginClassMethods("CntlrCmdLine.Filing.Start"):
|
|
990
|
+
|
|
991
|
+
for pluginXbrlMethod in PluginManager.pluginClassMethods("CntlrCmdLine.Filing.Start"):
|
|
922
992
|
pluginXbrlMethod(self, options, filesource, _entrypointFiles, sourceZipStream=sourceZipStream, responseZipStream=responseZipStream)
|
|
993
|
+
|
|
994
|
+
if options.validate and filesource is not None:
|
|
995
|
+
ValidateFileSource(self, filesource).validate(options.reportPackage)
|
|
996
|
+
|
|
997
|
+
if len(_entrypointFiles) == 0 and not options.packages:
|
|
998
|
+
if options.entrypointFile:
|
|
999
|
+
msg = _("No XBRL entry points could be loaded from provided file: {}").format(options.entrypointFile)
|
|
1000
|
+
else:
|
|
1001
|
+
# web server post request does not have a file name.
|
|
1002
|
+
msg = _("No XBRL entry points could be loaded from provided input")
|
|
1003
|
+
self.addToLog(msg, messageCode="error", level=logging.ERROR)
|
|
1004
|
+
success = False
|
|
923
1005
|
for _entrypoint in _entrypointFiles:
|
|
924
1006
|
_entrypointFile = _entrypoint.get("file", None) if isinstance(_entrypoint,dict) else _entrypoint
|
|
925
1007
|
if filesource and filesource.isArchive:
|
|
926
1008
|
filesource.select(_entrypointFile)
|
|
927
1009
|
else:
|
|
1010
|
+
_entrypointFile = PackageManager.mappedUrl(_entrypointFile)
|
|
928
1011
|
filesource = FileSource.openFileSource(_entrypointFile, self, sourceZipStream)
|
|
1012
|
+
if options.validate:
|
|
1013
|
+
ValidateFileSource(self, filesource).validate(options.reportPackage)
|
|
929
1014
|
self.entrypointFile = _entrypointFile
|
|
930
1015
|
timeNow = XmlUtil.dateunionValue(datetime.datetime.now())
|
|
931
1016
|
firstStartedAt = startedAt = time.time()
|
|
@@ -934,6 +1019,9 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
934
1019
|
try:
|
|
935
1020
|
if filesource:
|
|
936
1021
|
modelXbrl = self.modelManager.load(filesource, _("views loading"), entrypoint=_entrypoint)
|
|
1022
|
+
if filesource.isArchive:
|
|
1023
|
+
# Keep archive filesource potentially used by multiple reports open.
|
|
1024
|
+
modelXbrl.closeFileSource = False
|
|
937
1025
|
except ModelDocument.LoadingException:
|
|
938
1026
|
pass
|
|
939
1027
|
except Exception as err:
|
|
@@ -967,11 +1055,20 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
967
1055
|
if modelXbrl.errors:
|
|
968
1056
|
success = False # loading errors, don't attempt to utilize loaded DTS
|
|
969
1057
|
if modelXbrl.modelDocument.type in ModelDocument.Type.TESTCASETYPES:
|
|
970
|
-
for pluginXbrlMethod in pluginClassMethods("Testcases.Start"):
|
|
1058
|
+
for pluginXbrlMethod in PluginManager.pluginClassMethods("Testcases.Start"):
|
|
971
1059
|
pluginXbrlMethod(self, options, modelXbrl)
|
|
972
1060
|
else: # not a test case, probably instance or DTS
|
|
973
|
-
for pluginXbrlMethod in pluginClassMethods("CntlrCmdLine.Xbrl.Loaded"):
|
|
1061
|
+
for pluginXbrlMethod in PluginManager.pluginClassMethods("CntlrCmdLine.Xbrl.Loaded"):
|
|
974
1062
|
pluginXbrlMethod(self, options, modelXbrl, _entrypoint, responseZipStream=responseZipStream)
|
|
1063
|
+
if options.saveOIMToXMLReport:
|
|
1064
|
+
if modelXbrl.loadedFromOIM and modelXbrl.modelDocument is not None:
|
|
1065
|
+
self.showStatus(_("Saving XBRL instance: {0}").format(modelXbrl.modelDocument.basename))
|
|
1066
|
+
saveOimReportToXmlInstance(modelXbrl.modelDocument, options.saveOIMToXMLReport, responseZipStream)
|
|
1067
|
+
else:
|
|
1068
|
+
self.addToLog(_("Report not loaded from OIM, not saving xBRL-XML report."),
|
|
1069
|
+
messageCode="NotOim",
|
|
1070
|
+
level=logging.INFO)
|
|
1071
|
+
|
|
975
1072
|
else:
|
|
976
1073
|
success = False
|
|
977
1074
|
if success and options.diffFile and options.versReportFile:
|
|
@@ -1002,83 +1099,84 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
1002
1099
|
success = False
|
|
1003
1100
|
except Exception as err:
|
|
1004
1101
|
success = False
|
|
1005
|
-
self.addToLog(_("[Exception] Failed to
|
|
1102
|
+
self.addToLog(_("[Exception] Failed to load diff file: \n{0} \n{1}").format(
|
|
1006
1103
|
err,
|
|
1007
1104
|
traceback.format_tb(sys.exc_info()[2])))
|
|
1008
1105
|
if success:
|
|
1009
1106
|
try:
|
|
1010
|
-
modelXbrl
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1038
|
-
|
|
1039
|
-
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
1107
|
+
for modelXbrl in [self.modelManager.modelXbrl] + getattr(self.modelManager.modelXbrl, "supplementalModelXbrls", []):
|
|
1108
|
+
hasFormulae = modelXbrl.hasFormulae
|
|
1109
|
+
isAlreadyValidated = False
|
|
1110
|
+
for pluginXbrlMethod in PluginManager.pluginClassMethods("ModelDocument.IsValidated"):
|
|
1111
|
+
if pluginXbrlMethod(modelXbrl): # e.g., streaming extensions already has validated
|
|
1112
|
+
isAlreadyValidated = True
|
|
1113
|
+
if options.validate and not isAlreadyValidated:
|
|
1114
|
+
startedAt = time.time()
|
|
1115
|
+
if options.formulaAction: # don't automatically run formulas
|
|
1116
|
+
modelXbrl.hasFormulae = False
|
|
1117
|
+
from arelle import Validate
|
|
1118
|
+
Validate.validate(modelXbrl)
|
|
1119
|
+
if options.formulaAction: # restore setting
|
|
1120
|
+
modelXbrl.hasFormulae = hasFormulae
|
|
1121
|
+
self.addToLog(format_string(self.modelManager.locale,
|
|
1122
|
+
_("validated in %.2f secs"),
|
|
1123
|
+
time.time() - startedAt),
|
|
1124
|
+
messageCode="info", file=self.entrypointFile)
|
|
1125
|
+
if (modelXbrl.modelDocument.type not in ModelDocument.Type.TESTCASETYPES and
|
|
1126
|
+
options.formulaAction in ("validate", "run") and # do nothing here if "none"
|
|
1127
|
+
not isAlreadyValidated): # formulas can't run if streaming has validated the instance
|
|
1128
|
+
from arelle import ValidateXbrlDimensions
|
|
1129
|
+
from arelle.formula import ValidateFormula
|
|
1130
|
+
startedAt = time.time()
|
|
1131
|
+
if not options.validate:
|
|
1132
|
+
ValidateXbrlDimensions.loadDimensionDefaults(modelXbrl)
|
|
1133
|
+
# setup fresh parameters from formula optoins
|
|
1134
|
+
modelXbrl.parameters = fo.typedParameters(modelXbrl.prefixedNamespaces)
|
|
1135
|
+
ValidateFormula.validate(modelXbrl, compileOnly=(options.formulaAction != "run"))
|
|
1136
|
+
self.addToLog(format_string(self.modelManager.locale,
|
|
1137
|
+
_("formula validation and execution in %.2f secs")
|
|
1138
|
+
if options.formulaAction == "run"
|
|
1139
|
+
else _("formula validation only in %.2f secs"),
|
|
1140
|
+
time.time() - startedAt),
|
|
1141
|
+
messageCode="info", file=self.entrypointFile)
|
|
1044
1142
|
|
|
1143
|
+
if options.testReport:
|
|
1144
|
+
ViewFileTests.viewTests(self.modelManager.modelXbrl, options.testReport, options.testReportCols)
|
|
1045
1145
|
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
for pluginXbrlMethod in pluginClassMethods("CntlrCmdLine.Xbrl.Run"):
|
|
1079
|
-
pluginXbrlMethod(self, options, modelXbrl, _entrypoint, responseZipStream=responseZipStream)
|
|
1146
|
+
if options.rssReport:
|
|
1147
|
+
ViewFileRssFeed.viewRssFeed(self.modelManager.modelXbrl, options.rssReport, options.rssReportCols)
|
|
1148
|
+
|
|
1149
|
+
if options.DTSFile:
|
|
1150
|
+
ViewFileDTS.viewDTS(modelXbrl, options.DTSFile)
|
|
1151
|
+
if options.factsFile:
|
|
1152
|
+
ViewFileFactList.viewFacts(modelXbrl, options.factsFile, labelrole=options.labelRole, lang=options.labelLang, cols=options.factListCols)
|
|
1153
|
+
if options.factTableFile:
|
|
1154
|
+
ViewFileFactTable.viewFacts(modelXbrl, options.factTableFile, labelrole=options.labelRole, lang=options.labelLang, cols=options.factTableCols)
|
|
1155
|
+
if options.conceptsFile:
|
|
1156
|
+
ViewFileConcepts.viewConcepts(modelXbrl, options.conceptsFile, labelrole=options.labelRole, lang=options.labelLang)
|
|
1157
|
+
if options.preFile:
|
|
1158
|
+
ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.preFile, "Presentation Linkbase", XbrlConst.parentChild, labelrole=options.labelRole, lang=options.labelLang, cols=options.relationshipCols)
|
|
1159
|
+
if options.tableFile:
|
|
1160
|
+
ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.tableFile, "Table Linkbase", "Table-rendering", labelrole=options.labelRole, lang=options.labelLang)
|
|
1161
|
+
if options.calFile:
|
|
1162
|
+
ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.calFile, "Calculation Linkbase", XbrlConst.summationItems, labelrole=options.labelRole, lang=options.labelLang, cols=options.relationshipCols)
|
|
1163
|
+
if options.dimFile:
|
|
1164
|
+
ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.dimFile, "Dimensions", "XBRL-dimensions", labelrole=options.labelRole, lang=options.labelLang, cols=options.relationshipCols)
|
|
1165
|
+
if options.anchFile:
|
|
1166
|
+
ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.anchFile, "Anchoring", XbrlConst.widerNarrower, labelrole=options.labelRole, lang=options.labelLang, cols=options.relationshipCols)
|
|
1167
|
+
if options.formulaeFile:
|
|
1168
|
+
ViewFileFormulae.viewFormulae(modelXbrl, options.formulaeFile, "Formulae", lang=options.labelLang)
|
|
1169
|
+
if options.viewArcrole and options.viewFile:
|
|
1170
|
+
ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.viewFile, os.path.basename(options.viewArcrole), options.viewArcrole, labelrole=options.labelRole, lang=options.labelLang, cols=options.relationshipCols)
|
|
1171
|
+
if options.roleTypesFile:
|
|
1172
|
+
ViewFileRoleTypes.viewRoleTypes(modelXbrl, options.roleTypesFile, "Role Types", isArcrole=False, lang=options.labelLang)
|
|
1173
|
+
if options.arcroleTypesFile:
|
|
1174
|
+
ViewFileRoleTypes.viewRoleTypes(modelXbrl, options.arcroleTypesFile, "Arcrole Types", isArcrole=True, lang=options.labelLang)
|
|
1175
|
+
|
|
1176
|
+
for pluginXbrlMethod in PluginManager.pluginClassMethods("CntlrCmdLine.Xbrl.Run"):
|
|
1177
|
+
pluginXbrlMethod(self, options, modelXbrl, _entrypoint, sourceZipStream=sourceZipStream, responseZipStream=responseZipStream)
|
|
1080
1178
|
|
|
1081
|
-
except
|
|
1179
|
+
except OSError as err:
|
|
1082
1180
|
self.addToLog(_("[IOError] Failed to save output:\n {0}").format(err),
|
|
1083
1181
|
messageCode="IOError",
|
|
1084
1182
|
file=options.entrypointFile,
|
|
@@ -1093,6 +1191,30 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
1093
1191
|
level=logging.CRITICAL)
|
|
1094
1192
|
success = False
|
|
1095
1193
|
if modelXbrl:
|
|
1194
|
+
if success:
|
|
1195
|
+
if options.saveDeduplicatedInstance:
|
|
1196
|
+
if options.deduplicateFacts:
|
|
1197
|
+
deduplicateFactsArg = ValidateDuplicateFacts.DeduplicationType(options.deduplicateFacts)
|
|
1198
|
+
else:
|
|
1199
|
+
deduplicateFactsArg = ValidateDuplicateFacts.DeduplicationType.COMPLETE
|
|
1200
|
+
if modelXbrl.modelDocument.type != ModelDocument.Type.INSTANCE:
|
|
1201
|
+
self.addToLog(_("Provided file must be a traditional XBRL instance document to save a deduplicated instance."),
|
|
1202
|
+
messageCode="error", file=modelXbrl.modelDocument.uri)
|
|
1203
|
+
else:
|
|
1204
|
+
# Deduplication modifies the underlying lxml tree and leaves the model in an undefined state.
|
|
1205
|
+
# Anything depending on the ModelXbrl that runs after this may encounter unexpected behavior,
|
|
1206
|
+
# so we'll run it as a final step in the CLI controller flow.
|
|
1207
|
+
ValidateDuplicateFacts.saveDeduplicatedInstance(modelXbrl, deduplicateFactsArg, options.saveDeduplicatedInstance)
|
|
1208
|
+
if options.keepOpen:
|
|
1209
|
+
success = False
|
|
1210
|
+
self.addToLog(_("Attempted to keep model connection open after saving deduplicated instance. "
|
|
1211
|
+
"Deduplication modifies the model in ways that can cause unexpected behavior on subsequent use."),
|
|
1212
|
+
messageCode="error", level=logging.CRITICAL)
|
|
1213
|
+
elif options.deduplicateFacts:
|
|
1214
|
+
success = False
|
|
1215
|
+
self.addToLog(_("'deduplicateFacts' can only be used with 'saveDeduplicatedInstance'"),
|
|
1216
|
+
messageCode="error", level=logging.CRITICAL)
|
|
1217
|
+
|
|
1096
1218
|
modelXbrl.profileStat(_("total"), time.time() - firstStartedAt)
|
|
1097
1219
|
if options.collectProfileStats and modelXbrl:
|
|
1098
1220
|
modelXbrl.logProfileStats()
|
|
@@ -1101,13 +1223,23 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
1101
1223
|
self.modelManager.close(modelDiffReport)
|
|
1102
1224
|
elif modelXbrl:
|
|
1103
1225
|
self.modelManager.close(modelXbrl)
|
|
1226
|
+
|
|
1227
|
+
if options.validate:
|
|
1228
|
+
for pluginXbrlMethod in PluginManager.pluginClassMethods("Validate.Complete"):
|
|
1229
|
+
pluginXbrlMethod(self, filesource)
|
|
1230
|
+
|
|
1231
|
+
if filesource is not None and not options.keepOpen:
|
|
1232
|
+
# Archive filesource potentially used by multiple reports may still be open.
|
|
1233
|
+
filesource.close()
|
|
1234
|
+
|
|
1104
1235
|
if success:
|
|
1105
1236
|
if options.validate:
|
|
1106
|
-
for pluginXbrlMethod in pluginClassMethods("CntlrCmdLine.Filing.Validate"):
|
|
1237
|
+
for pluginXbrlMethod in PluginManager.pluginClassMethods("CntlrCmdLine.Filing.Validate"):
|
|
1107
1238
|
pluginXbrlMethod(self, options, filesource, _entrypointFiles, sourceZipStream=sourceZipStream, responseZipStream=responseZipStream)
|
|
1108
|
-
for pluginXbrlMethod in pluginClassMethods("CntlrCmdLine.Filing.End"):
|
|
1239
|
+
for pluginXbrlMethod in PluginManager.pluginClassMethods("CntlrCmdLine.Filing.End"):
|
|
1109
1240
|
pluginXbrlMethod(self, options, filesource, _entrypointFiles, sourceZipStream=sourceZipStream, responseZipStream=responseZipStream)
|
|
1110
1241
|
self.username = self.password = None #dereference password
|
|
1242
|
+
self._clearPluginData()
|
|
1111
1243
|
|
|
1112
1244
|
if options.statusPipe and getattr(self, "statusPipe", None) is not None:
|
|
1113
1245
|
win32file.WriteFile(self.statusPipe, b" ") # clear status
|
|
@@ -1139,7 +1271,18 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
1139
1271
|
# fh.write("Status pipe exception {} {}\n".format(type(ex), ex))
|
|
1140
1272
|
system.exit()
|
|
1141
1273
|
|
|
1142
|
-
def
|
|
1274
|
+
def loadPackage(self, package: str, packageManifestName: str):
|
|
1275
|
+
from arelle import PackageManager
|
|
1276
|
+
packageInfo = PackageManager.addPackage(self, package, packageManifestName)
|
|
1277
|
+
if packageInfo:
|
|
1278
|
+
self.addToLog(_("Activation of package {0} successful.").format(packageInfo.get("name")),
|
|
1279
|
+
messageCode="info", file=packageInfo.get("URL"))
|
|
1280
|
+
else:
|
|
1281
|
+
self.addToLog(_("Unable to load package \"%(name)s\". "),
|
|
1282
|
+
messageCode="arelle:packageLoadingError",
|
|
1283
|
+
messageArgs={"name": package, "file": package}, level=logging.ERROR)
|
|
1284
|
+
|
|
1285
|
+
def loadPackages(self, packages: list[str], packageManifestName: str):
|
|
1143
1286
|
"""
|
|
1144
1287
|
Loads specified packages.
|
|
1145
1288
|
|
|
@@ -1149,7 +1292,9 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
1149
1292
|
from arelle import PackageManager
|
|
1150
1293
|
savePackagesChanges = True
|
|
1151
1294
|
showPackages = False
|
|
1152
|
-
|
|
1295
|
+
# For backwards compatibility, we allow '|' separated filenames/URLs
|
|
1296
|
+
# within a single --packages option.
|
|
1297
|
+
for packageCmd in [cmd for p in packages for cmd in p.split('|')]:
|
|
1153
1298
|
cmd = packageCmd.strip()
|
|
1154
1299
|
if cmd == "show":
|
|
1155
1300
|
showPackages = True
|
|
@@ -1172,16 +1317,13 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
1172
1317
|
self.addToLog(_("Deletion of package successful."), messageCode="info", file=cmd[1:])
|
|
1173
1318
|
else:
|
|
1174
1319
|
self.addToLog(_("Unable to delete package."), messageCode="info", file=cmd[1:])
|
|
1175
|
-
|
|
1320
|
+
elif os.path.isdir(cmd): # load all package files in a directory
|
|
1176
1321
|
savePackagesChanges = False
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
self.addToLog(_("Unable to load package \"%(name)s\". "),
|
|
1183
|
-
messageCode="arelle:packageLoadingError",
|
|
1184
|
-
messageArgs={"name": cmd, "file": cmd}, level=logging.ERROR)
|
|
1322
|
+
for package in glob.glob(os.path.join(cmd, "*.zip")):
|
|
1323
|
+
self.loadPackage(package, packageManifestName)
|
|
1324
|
+
else: # assume it is a module or package
|
|
1325
|
+
savePackagesChanges = False
|
|
1326
|
+
self.loadPackage(cmd, packageManifestName)
|
|
1185
1327
|
if PackageManager.packagesConfigChanged:
|
|
1186
1328
|
PackageManager.rebuildRemappings(self)
|
|
1187
1329
|
if savePackagesChanges:
|
|
@@ -1197,11 +1339,6 @@ class CntlrCmdLine(Cntlr.Cntlr):
|
|
|
1197
1339
|
messageCode="info", file=packageInfo.get("URL"))
|
|
1198
1340
|
|
|
1199
1341
|
if __name__ == "__main__":
|
|
1200
|
-
''
|
|
1201
|
-
|
|
1202
|
-
from arelle import CntlrComServer
|
|
1203
|
-
CntlrComServer.main()
|
|
1204
|
-
else:
|
|
1205
|
-
main()
|
|
1206
|
-
'''
|
|
1342
|
+
if getattr(sys, 'frozen', False):
|
|
1343
|
+
multiprocessing.freeze_support()
|
|
1207
1344
|
main()
|