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.
Files changed (893) hide show
  1. arelle/Aspect.py +6 -3
  2. arelle/BetaFeatures.py +3 -0
  3. arelle/Cntlr.py +117 -413
  4. arelle/CntlrCmdLine.py +364 -227
  5. arelle/CntlrQuickBooks.py +4 -2
  6. arelle/CntlrWebMain.py +179 -119
  7. arelle/CntlrWinMain.py +342 -124
  8. arelle/DialogAbout.py +1 -1
  9. arelle/DialogArcroleGroup.py +1 -1
  10. arelle/DialogFind.py +1 -1
  11. arelle/DialogFormulaParameters.py +2 -2
  12. arelle/DialogLanguage.py +45 -36
  13. arelle/DialogNewFactItem.py +1 -1
  14. arelle/DialogOpenArchive.py +30 -34
  15. arelle/DialogPackageManager.py +11 -8
  16. arelle/DialogPluginManager.py +43 -89
  17. arelle/DialogRssWatch.py +2 -2
  18. arelle/DialogURL.py +1 -1
  19. arelle/DialogUserPassword.py +1 -1
  20. arelle/DisclosureSystem.py +69 -1
  21. arelle/ErrorManager.py +321 -0
  22. arelle/FileSource.py +201 -99
  23. arelle/FunctionFn.py +44 -5
  24. arelle/FunctionIxt.py +16 -13
  25. arelle/FunctionUtil.py +1 -1
  26. arelle/FunctionXfi.py +68 -24
  27. arelle/FunctionXs.py +1 -1
  28. arelle/HtmlUtil.py +5 -4
  29. arelle/LeiUtil.py +63 -43
  30. arelle/LinkbaseType.py +94 -0
  31. arelle/LocalViewer.py +8 -2
  32. arelle/Locale.py +239 -79
  33. arelle/ModelDocument.py +180 -48
  34. arelle/ModelDtsObject.py +32 -27
  35. arelle/ModelFormulaObject.py +14 -6
  36. arelle/ModelInstanceObject.py +43 -14
  37. arelle/ModelManager.py +6 -1
  38. arelle/ModelObject.py +12 -8
  39. arelle/ModelObjectFactory.py +18 -2
  40. arelle/ModelRelationshipSet.py +46 -3
  41. arelle/ModelRenderingObject.py +899 -951
  42. arelle/ModelRssItem.py +2 -4
  43. arelle/ModelTestcaseObject.py +41 -4
  44. arelle/ModelValue.py +42 -14
  45. arelle/ModelVersReport.py +1 -1
  46. arelle/ModelXbrl.py +133 -273
  47. arelle/PackageManager.py +202 -176
  48. arelle/PluginManager.py +551 -239
  49. arelle/PluginUtils.py +54 -0
  50. arelle/PrototypeInstanceObject.py +53 -12
  51. arelle/PythonUtil.py +166 -25
  52. arelle/RuntimeOptions.py +32 -18
  53. arelle/SocketUtils.py +3 -0
  54. arelle/SystemInfo.py +1 -1
  55. arelle/TkTableWrapper.py +33 -5
  56. arelle/UITkTable.py +27 -21
  57. arelle/Updater.py +7 -3
  58. arelle/UrlUtil.py +6 -2
  59. arelle/Validate.py +596 -402
  60. arelle/ValidateDuplicateFacts.py +584 -0
  61. arelle/ValidateFileSource.py +38 -0
  62. arelle/ValidateFilingText.py +46 -29
  63. arelle/ValidateInfoset.py +104 -32
  64. arelle/ValidateUtr.py +31 -4
  65. arelle/ValidateXbrl.py +144 -120
  66. arelle/ValidateXbrlCalcs.py +51 -66
  67. arelle/ValidateXbrlDTS.py +98 -29
  68. arelle/Version.py +2 -7
  69. arelle/ViewFile.py +2 -0
  70. arelle/ViewFileDTS.py +7 -2
  71. arelle/ViewFileFactList.py +1 -1
  72. arelle/ViewFileFactTable.py +4 -4
  73. arelle/ViewFileRelationshipSet.py +36 -19
  74. arelle/ViewFileRenderedGrid.py +164 -753
  75. arelle/ViewFileRenderedLayout.py +174 -0
  76. arelle/ViewFileRenderedStructure.py +108 -0
  77. arelle/ViewWinDTS.py +4 -1
  78. arelle/ViewWinFactList.py +1 -1
  79. arelle/ViewWinFactTable.py +1 -1
  80. arelle/ViewWinRelationshipSet.py +14 -8
  81. arelle/ViewWinRenderedGrid.py +397 -287
  82. arelle/ViewWinRssFeed.py +4 -0
  83. arelle/ViewWinTree.py +15 -9
  84. arelle/ViewWinXml.py +1 -1
  85. arelle/WebCache.py +510 -272
  86. arelle/XbrlConst.py +202 -196
  87. arelle/XbrlUtil.py +2 -1
  88. arelle/XhtmlValidate.py +9 -23
  89. arelle/XmlUtil.py +24 -19
  90. arelle/XmlValidate.py +95 -67
  91. arelle/XmlValidateParticles.py +4 -4
  92. arelle/_version.py +33 -3
  93. arelle/api/Session.py +183 -0
  94. arelle/config/creationSoftwareNames.json +24 -10
  95. arelle/config/disclosuresystems.xml +1 -1
  96. arelle/config/disclosuresystems.xsd +3 -0
  97. arelle/config/sbr-text-formatting.xsd +737 -0
  98. arelle/conformance/CSVTestcaseLoader.py +102 -0
  99. arelle/formula/FactAspectsCache.py +10 -4
  100. arelle/formula/ValidateFormula.py +82 -194
  101. arelle/formula/XPathContext.py +42 -28
  102. arelle/formula/XPathParser.py +15 -9
  103. arelle/locale/ar_EG/LC_MESSAGES/ar_EG.po +3 -4
  104. arelle/locale/messages.pot +1 -2
  105. arelle/locale/ru/LC_MESSAGES/ru.po +2 -2
  106. arelle/logging/formatters/LogFormatter.py +47 -0
  107. arelle/logging/handlers/LogHandlerWithXml.py +94 -0
  108. arelle/logging/handlers/LogToBufferHandler.py +20 -0
  109. arelle/logging/handlers/LogToPrintHandler.py +41 -0
  110. arelle/logging/handlers/LogToXmlHandler.py +244 -0
  111. arelle/logging/handlers/StructuredMessageLogHandler.py +74 -0
  112. arelle/model/CommentBase.py +3 -0
  113. arelle/model/ElementBase.py +3 -0
  114. arelle/model/PIBase.py +3 -0
  115. arelle/model/__init__.py +3 -0
  116. arelle/oim/Load.py +2869 -0
  117. arelle/oim/Validate.py +155 -0
  118. arelle/oim/xml/Save.py +21 -0
  119. arelle/packages/PackageConst.py +7 -0
  120. arelle/packages/PackageType.py +13 -0
  121. arelle/packages/PackageUtils.py +22 -0
  122. arelle/packages/PackageValidation.py +200 -0
  123. arelle/packages/report/DetectReportPackage.py +13 -0
  124. arelle/packages/report/ReportPackage.py +265 -0
  125. arelle/packages/report/ReportPackageConst.py +79 -0
  126. arelle/packages/report/ReportPackageValidator.py +207 -0
  127. arelle/plugin/EdgarRendererAllReports.py +12 -12
  128. arelle/plugin/OimTaxonomy/ModelValueMore.py +15 -0
  129. arelle/plugin/OimTaxonomy/ValidateDTS.py +484 -0
  130. arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +239 -0
  131. arelle/plugin/OimTaxonomy/XbrlAbstract.py +16 -0
  132. arelle/plugin/OimTaxonomy/XbrlConcept.py +68 -0
  133. arelle/plugin/OimTaxonomy/XbrlConst.py +261 -0
  134. arelle/plugin/OimTaxonomy/XbrlCube.py +91 -0
  135. arelle/plugin/OimTaxonomy/XbrlDimension.py +38 -0
  136. arelle/plugin/OimTaxonomy/XbrlDts.py +152 -0
  137. arelle/plugin/OimTaxonomy/XbrlEntity.py +16 -0
  138. arelle/plugin/OimTaxonomy/XbrlGroup.py +22 -0
  139. arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +22 -0
  140. arelle/plugin/OimTaxonomy/XbrlLabel.py +31 -0
  141. arelle/plugin/OimTaxonomy/XbrlNetwork.py +100 -0
  142. arelle/plugin/OimTaxonomy/XbrlProperty.py +28 -0
  143. arelle/plugin/OimTaxonomy/XbrlReference.py +33 -0
  144. arelle/plugin/OimTaxonomy/XbrlReport.py +24 -0
  145. arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +35 -0
  146. arelle/plugin/OimTaxonomy/XbrlTaxonomy.py +93 -0
  147. arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py +154 -0
  148. arelle/plugin/OimTaxonomy/XbrlTransform.py +17 -0
  149. arelle/plugin/OimTaxonomy/XbrlTypes.py +23 -0
  150. arelle/plugin/OimTaxonomy/XbrlUnit.py +17 -0
  151. arelle/plugin/OimTaxonomy/__init__.py +1037 -0
  152. arelle/plugin/OimTaxonomy/resources/iso4217.json +4479 -0
  153. arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json +935 -0
  154. arelle/plugin/OimTaxonomy/resources/ref.json +333 -0
  155. arelle/plugin/OimTaxonomy/resources/transform-types.json +2481 -0
  156. arelle/plugin/OimTaxonomy/resources/types.json +727 -0
  157. arelle/plugin/OimTaxonomy/resources/utr.json +3046 -0
  158. arelle/plugin/OimTaxonomy/resources/xbrlSpec.json +1082 -0
  159. arelle/plugin/formulaLoader.py +3 -3
  160. arelle/plugin/formulaSaver.py +4 -4
  161. arelle/plugin/inlineXbrlDocumentSet.py +331 -102
  162. arelle/plugin/internet/proxyNTLM/HTTPNtlmAuthHandler.py +1 -1
  163. arelle/plugin/loadFromExcel.py +13 -10
  164. arelle/plugin/loadFromOIM.py +16 -3096
  165. arelle/plugin/logging/saveMessages.py +1 -1
  166. arelle/plugin/saveHtmlEBAtables.py +293 -213
  167. arelle/plugin/saveLoadableOIM.py +652 -361
  168. arelle/plugin/saveOIMTaxonomy.py +311 -0
  169. arelle/plugin/streamingExtensions.py +1 -1
  170. arelle/plugin/systemInfo.py +46 -0
  171. arelle/plugin/transforms/tester.py +4 -4
  172. arelle/plugin/validate/CIPC/Const.py +18 -0
  173. arelle/plugin/validate/CIPC/__init__.py +34 -13
  174. arelle/plugin/validate/DBA/DisclosureSystems.py +12 -0
  175. arelle/plugin/validate/DBA/PluginValidationDataExtension.py +165 -0
  176. arelle/plugin/validate/DBA/ValidationPluginExtension.py +545 -0
  177. arelle/plugin/validate/DBA/__init__.py +49 -0
  178. arelle/plugin/validate/DBA/resources/config.xml +21 -0
  179. arelle/plugin/validate/DBA/rules/__init__.py +323 -0
  180. arelle/plugin/validate/DBA/rules/fr.py +1377 -0
  181. arelle/plugin/validate/DBA/rules/tc.py +45 -0
  182. arelle/plugin/validate/DBA/rules/th.py +172 -0
  183. arelle/plugin/validate/DBA/rules/tm.py +351 -0
  184. arelle/plugin/validate/DBA/rules/tr.py +373 -0
  185. arelle/plugin/validate/EBA/__init__.py +11 -12
  186. arelle/plugin/validate/EDINET/Constants.py +208 -0
  187. arelle/plugin/validate/EDINET/ContextRequirement.py +58 -0
  188. arelle/plugin/validate/EDINET/ControllerPluginData.py +298 -0
  189. arelle/plugin/validate/EDINET/CoverItemRequirements.py +42 -0
  190. arelle/plugin/validate/EDINET/DeiRequirements.py +118 -0
  191. arelle/plugin/validate/EDINET/DisclosureSystems.py +1 -0
  192. arelle/plugin/validate/EDINET/FilingFormat.py +275 -0
  193. arelle/plugin/validate/EDINET/FormType.py +134 -0
  194. arelle/plugin/validate/EDINET/ManifestInstance.py +236 -0
  195. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +640 -0
  196. arelle/plugin/validate/EDINET/ReportFolderType.py +162 -0
  197. arelle/plugin/validate/EDINET/Statement.py +139 -0
  198. arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +493 -0
  199. arelle/plugin/validate/EDINET/UploadContents.py +48 -0
  200. arelle/plugin/validate/EDINET/ValidationPluginExtension.py +64 -0
  201. arelle/plugin/validate/EDINET/__init__.py +109 -0
  202. arelle/plugin/validate/EDINET/resources/config.xml +22 -0
  203. arelle/plugin/validate/EDINET/resources/cover-item-requirements.json +793 -0
  204. arelle/plugin/validate/EDINET/resources/dei-requirements.csv +27 -0
  205. arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +62 -0
  206. arelle/plugin/validate/EDINET/rules/contexts.py +547 -0
  207. arelle/plugin/validate/EDINET/rules/edinet.py +1991 -0
  208. arelle/plugin/validate/EDINET/rules/frta.py +301 -0
  209. arelle/plugin/validate/EDINET/rules/gfm.py +2394 -0
  210. arelle/plugin/validate/EDINET/rules/manifests.py +88 -0
  211. arelle/plugin/validate/EDINET/rules/upload.py +1370 -0
  212. arelle/plugin/validate/ESEF/Const.py +16 -75
  213. arelle/plugin/validate/ESEF/Dimensions.py +2 -2
  214. arelle/plugin/validate/ESEF/ESEF_2021/DTS.py +6 -1
  215. arelle/plugin/validate/ESEF/ESEF_2021/Image.py +7 -4
  216. arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +80 -57
  217. arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +60 -22
  218. arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +272 -133
  219. arelle/plugin/validate/ESEF/Util.py +5 -19
  220. arelle/plugin/validate/ESEF/__init__.py +61 -46
  221. arelle/plugin/validate/ESEF/resources/authority-validations.json +120 -10
  222. arelle/plugin/validate/ESEF/resources/config.xml +44 -3
  223. arelle/plugin/validate/FERC/__init__.py +31 -18
  224. arelle/plugin/validate/FERC/config.xml +18 -18
  225. arelle/plugin/validate/NL/DisclosureSystems.py +19 -3
  226. arelle/plugin/validate/NL/PluginValidationDataExtension.py +710 -7
  227. arelle/plugin/validate/NL/ValidationPluginExtension.py +117 -12
  228. arelle/plugin/validate/NL/__init__.py +21 -10
  229. arelle/plugin/validate/NL/resources/config.xml +27 -6
  230. arelle/plugin/validate/NL/rules/br_kvk.py +81 -21
  231. arelle/plugin/validate/NL/rules/fg_nl.py +292 -0
  232. arelle/plugin/validate/NL/rules/fr_kvk.py +60 -7
  233. arelle/plugin/validate/NL/rules/fr_nl.py +705 -24
  234. arelle/plugin/validate/NL/rules/nl_kvk.py +2182 -0
  235. arelle/plugin/validate/ROS/DisclosureSystems.py +1 -0
  236. arelle/plugin/validate/ROS/PluginValidationDataExtension.py +109 -0
  237. arelle/plugin/validate/ROS/ValidationPluginExtension.py +27 -0
  238. arelle/plugin/validate/ROS/__init__.py +28 -341
  239. arelle/plugin/validate/ROS/resources/config.xml +20 -0
  240. arelle/plugin/validate/ROS/rules/__init__.py +56 -0
  241. arelle/plugin/validate/ROS/rules/ros.py +393 -0
  242. arelle/plugin/validate/UK/ValidateUK.py +1372 -0
  243. arelle/plugin/validate/{HMRC → UK}/__init__.py +195 -189
  244. arelle/plugin/validate/{HMRC → UK}/config.xml +1 -1
  245. arelle/plugin/xbrlDB/SqlDb.py +1 -1
  246. arelle/plugin/xbrlDB/XbrlOpenSqlDB.py +5 -5
  247. arelle/plugin/xbrlDB/XbrlPublicPostgresDB.py +1 -1
  248. arelle/plugin/xbrlDB/XbrlSemanticJsonDB.py +1 -1
  249. arelle/plugin/xbrlDB/XbrlSemanticRdfDB.py +1 -1
  250. arelle/plugin/xbrlDB/__init__.py +4 -1
  251. arelle/{RenderingEvaluator.py → rendering/RenderingEvaluator.py} +120 -99
  252. arelle/rendering/RenderingLayout.py +476 -0
  253. arelle/rendering/RenderingResolution.py +814 -0
  254. arelle/resources/cache/http/www.eurofiling.info/eu/fr/xbrl/ext/filing-indicators.xsd +20 -0
  255. arelle/resources/cache/http/www.w3.org/2001/03/xml.xsd +117 -0
  256. arelle/resources/cache/http/www.w3.org/2001/XMLSchema.xsd +2534 -0
  257. arelle/resources/cache/http/www.w3.org/2001/xml.xsd +287 -0
  258. arelle/resources/cache/http/www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd +779 -0
  259. arelle/resources/cache/http/www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd +486 -0
  260. arelle/resources/cache/http/www.xbrl.org/2003/xl-2003-12-31.xsd +251 -0
  261. arelle/resources/cache/http/www.xbrl.org/2003/xlink-2003-12-31.xsd +121 -0
  262. arelle/resources/cache/http/www.xbrl.org/2004/ref-2004-08-10.xsd +129 -0
  263. arelle/resources/cache/http/www.xbrl.org/2005/xbrldt-2005.xsd +53 -0
  264. arelle/resources/cache/http/www.xbrl.org/2006/ref-2006-02-27.xsd +120 -0
  265. arelle/resources/cache/http/www.xbrl.org/2006/xbrldi-2006.xsd +41 -0
  266. arelle/resources/cache/http/www.xbrl.org/2008/boolean-filter.xsd +51 -0
  267. arelle/resources/cache/http/www.xbrl.org/2008/concept-filter.xsd +127 -0
  268. arelle/resources/cache/http/www.xbrl.org/2008/conformance.xsd +116 -0
  269. arelle/resources/cache/http/www.xbrl.org/2008/conformanceFunction.xsd +51 -0
  270. arelle/resources/cache/http/www.xbrl.org/2008/consistency-assertion.xsd +66 -0
  271. arelle/resources/cache/http/www.xbrl.org/2008/dimension-filter.xsd +86 -0
  272. arelle/resources/cache/http/www.xbrl.org/2008/entity-filter.xsd +92 -0
  273. arelle/resources/cache/http/www.xbrl.org/2008/existence-assertion.xsd +44 -0
  274. arelle/resources/cache/http/www.xbrl.org/2008/formula.xsd +261 -0
  275. arelle/resources/cache/http/www.xbrl.org/2008/function.xsd +90 -0
  276. arelle/resources/cache/http/www.xbrl.org/2008/general-filter.xsd +38 -0
  277. arelle/resources/cache/http/www.xbrl.org/2008/generic-label.xsd +80 -0
  278. arelle/resources/cache/http/www.xbrl.org/2008/generic-link.xsd +81 -0
  279. arelle/resources/cache/http/www.xbrl.org/2008/generic-reference.xsd +63 -0
  280. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
  281. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
  282. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xl-2003-12-31.xsd +248 -0
  283. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xbrl/xlink-2003-12-31.xsd +117 -0
  284. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xframes-1.xsd +166 -0
  285. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-applet-1.xsd +66 -0
  286. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-attribs-1.xsd +72 -0
  287. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-base-1.xsd +36 -0
  288. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-form-1.xsd +195 -0
  289. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic-table-1.xsd +169 -0
  290. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-model-1.xsd +376 -0
  291. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
  292. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10-modules-1.xsd +259 -0
  293. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-basic10.xsd +98 -0
  294. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-bdo-1.xsd +78 -0
  295. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkphras-1.xsd +161 -0
  296. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkpres-1.xsd +37 -0
  297. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-blkstruct-1.xsd +49 -0
  298. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-charent-1.xsd +38 -0
  299. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-copyright-1.xsd +29 -0
  300. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-csismap-1.xsd +96 -0
  301. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-datatypes-1.xsd +128 -0
  302. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-edit-1.xsd +39 -0
  303. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-events-1.xsd +130 -0
  304. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-form-1.xsd +326 -0
  305. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-frames-1.xsd +113 -0
  306. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-framework-1.xsd +66 -0
  307. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-hypertext-1.xsd +47 -0
  308. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-iframe-1.xsd +68 -0
  309. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-image-1.xsd +45 -0
  310. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlphras-1.xsd +163 -0
  311. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlpres-1.xsd +39 -0
  312. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstruct-1.xsd +50 -0
  313. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-inlstyle-1.xsd +27 -0
  314. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-legacy-1.xsd +97 -0
  315. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-link-1.xsd +45 -0
  316. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-list-1.xsd +99 -0
  317. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-meta-1.xsd +42 -0
  318. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-misc-1.xsd +441 -0
  319. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-nameident-1.xsd +63 -0
  320. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-notations-1.xsd +69 -0
  321. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-object-1.xsd +76 -0
  322. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-param-1.xsd +51 -0
  323. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-pres-1.xsd +51 -0
  324. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-1.xsd +171 -0
  325. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ruby-basic-1.xsd +89 -0
  326. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-script-1.xsd +70 -0
  327. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-ssismap-1.xsd +43 -0
  328. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-struct-1.xsd +112 -0
  329. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-style-1.xsd +52 -0
  330. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-table-1.xsd +272 -0
  331. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-target-1.xsd +53 -0
  332. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml-text-1.xsd +67 -0
  333. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-model-1.xsd +677 -0
  334. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-module-redefines-1.xsd +335 -0
  335. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11-modules-1.xsd +528 -0
  336. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml11.xsd +104 -0
  337. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xhtml2.xsd +21 -0
  338. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-1.xsd +73 -0
  339. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-2.xsd +74 -0
  340. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-1.xsd +73 -0
  341. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-attribs-2.xsd +75 -0
  342. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-1.xsd +34 -0
  343. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-events-copyright-2.xsd +34 -0
  344. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml/xml-handlers-2.xsd +98 -0
  345. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-definitions.xsd +225 -0
  346. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-model.xsd +681 -0
  347. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0-modules.xsd +535 -0
  348. arelle/resources/cache/http/www.xbrl.org/2008/inlinexbrl/xhtml-inlinexbrl-1_0.xsd +40 -0
  349. arelle/resources/cache/http/www.xbrl.org/2008/match-filter.xsd +94 -0
  350. arelle/resources/cache/http/www.xbrl.org/2008/period-filter.xsd +86 -0
  351. arelle/resources/cache/http/www.xbrl.org/2008/registry.xsd +145 -0
  352. arelle/resources/cache/http/www.xbrl.org/2008/relative-filter.xsd +38 -0
  353. arelle/resources/cache/http/www.xbrl.org/2008/segment-scenario-filter.xsd +41 -0
  354. arelle/resources/cache/http/www.xbrl.org/2008/tuple-filter.xsd +83 -0
  355. arelle/resources/cache/http/www.xbrl.org/2008/unit-filter.xsd +58 -0
  356. arelle/resources/cache/http/www.xbrl.org/2008/validation.xsd +78 -0
  357. arelle/resources/cache/http/www.xbrl.org/2008/value-assertion.xsd +43 -0
  358. arelle/resources/cache/http/www.xbrl.org/2008/value-filter.xsd +43 -0
  359. arelle/resources/cache/http/www.xbrl.org/2008/variable.xsd +240 -0
  360. arelle/resources/cache/http/www.xbrl.org/2010/aspect-cover-filter.xsd +67 -0
  361. arelle/resources/cache/http/www.xbrl.org/2010/concept-relation-filter.xsd +108 -0
  362. arelle/resources/cache/http/www.xbrl.org/2010/custom-function-implementation.xsd +71 -0
  363. arelle/resources/cache/http/www.xbrl.org/2010/generic-message.xsd +68 -0
  364. arelle/resources/cache/http/www.xbrl.org/2010/validation-message.xsd +50 -0
  365. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-instance-2003-12-31-ixmod.xsd +788 -0
  366. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xbrl-linkbase-2003-12-31-ixmod.xsd +488 -0
  367. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xl-2003-12-31.xsd +248 -0
  368. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xbrl/xlink-2003-12-31.xsd +117 -0
  369. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xframes-1.xsd +166 -0
  370. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-applet-1.xsd +66 -0
  371. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-attribs-1.xsd +72 -0
  372. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-base-1.xsd +36 -0
  373. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-form-1.xsd +195 -0
  374. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic-table-1.xsd +169 -0
  375. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-model-1.xsd +376 -0
  376. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-module-redefines-1.xsd +61 -0
  377. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10-modules-1.xsd +259 -0
  378. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-basic10.xsd +98 -0
  379. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-bdo-1.xsd +78 -0
  380. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkphras-1.xsd +161 -0
  381. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkpres-1.xsd +37 -0
  382. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-blkstruct-1.xsd +49 -0
  383. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-charent-1.xsd +38 -0
  384. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-copyright-1.xsd +29 -0
  385. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-csismap-1.xsd +96 -0
  386. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-datatypes-1.xsd +128 -0
  387. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-edit-1.xsd +39 -0
  388. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-events-1.xsd +130 -0
  389. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-form-1.xsd +326 -0
  390. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-frames-1.xsd +113 -0
  391. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-framework-1.xsd +66 -0
  392. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-hypertext-1.xsd +47 -0
  393. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-iframe-1.xsd +68 -0
  394. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-image-1.xsd +45 -0
  395. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlphras-1.xsd +163 -0
  396. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlpres-1.xsd +39 -0
  397. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstruct-1.xsd +50 -0
  398. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-inlstyle-1.xsd +27 -0
  399. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-legacy-1.xsd +97 -0
  400. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-link-1.xsd +45 -0
  401. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-list-1.xsd +99 -0
  402. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-meta-1.xsd +42 -0
  403. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-misc-1.xsd +441 -0
  404. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-nameident-1.xsd +63 -0
  405. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-notations-1.xsd +69 -0
  406. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-object-1.xsd +76 -0
  407. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-param-1.xsd +51 -0
  408. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-pres-1.xsd +51 -0
  409. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-1.xsd +171 -0
  410. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ruby-basic-1.xsd +89 -0
  411. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-script-1.xsd +70 -0
  412. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-ssismap-1.xsd +43 -0
  413. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-struct-1.xsd +112 -0
  414. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-style-1.xsd +52 -0
  415. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-table-1.xsd +272 -0
  416. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-target-1.xsd +53 -0
  417. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml-text-1.xsd +67 -0
  418. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-model-1.xsd +677 -0
  419. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-module-redefines-1.xsd +335 -0
  420. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11-modules-1.xsd +528 -0
  421. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml11.xsd +104 -0
  422. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xhtml2.xsd +21 -0
  423. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-1.xsd +73 -0
  424. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-2.xsd +74 -0
  425. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-1.xsd +73 -0
  426. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-attribs-2.xsd +75 -0
  427. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-1.xsd +34 -0
  428. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-events-copyright-2.xsd +34 -0
  429. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml/xml-handlers-2.xsd +98 -0
  430. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-definitions.xsd +252 -0
  431. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-model.xsd +681 -0
  432. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1-modules.xsd +535 -0
  433. arelle/resources/cache/http/www.xbrl.org/2013/inlineXBRL/xhtml-inlinexbrl-1_1.xsd +40 -0
  434. arelle/resources/cache/http/www.xbrl.org/2013/match-filter.xsd +94 -0
  435. arelle/resources/cache/http/www.xbrl.org/2013/preferred-label.xsd +12 -0
  436. arelle/resources/cache/http/www.xbrl.org/2013/versioning-base.xsd +142 -0
  437. arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-details.xsd +143 -0
  438. arelle/resources/cache/http/www.xbrl.org/2013/versioning-concept-use.xsd +64 -0
  439. arelle/resources/cache/http/www.xbrl.org/2013/versioning-dimensions.xsd +162 -0
  440. arelle/resources/cache/http/www.xbrl.org/2014/extensible-enumerations.xsd +27 -0
  441. arelle/resources/cache/http/www.xbrl.org/2014/table.xsd +356 -0
  442. arelle/resources/cache/http/www.xbrl.org/2014/tablemodel.xsd +156 -0
  443. arelle/resources/cache/http/www.xbrl.org/2016/assertion-severity.xsd +29 -0
  444. arelle/resources/cache/http/www.xbrl.org/2016/severities.xml +21 -0
  445. arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package-catalog.xsd +38 -0
  446. arelle/resources/cache/http/www.xbrl.org/2016/taxonomy-package.xsd +154 -0
  447. arelle/resources/cache/http/www.xbrl.org/2022/assertion-severity.xsd +43 -0
  448. arelle/resources/cache/http/www.xbrl.org/2022/severities.xml +21 -0
  449. arelle/resources/cache/http/www.xbrl.org/dtr/type/nonNumeric-2009-12-16.xsd +76 -0
  450. arelle/resources/cache/http/www.xbrl.org/dtr/type/numeric-2009-12-16.xsd +78 -0
  451. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/accounting-arcrole-2023-01-04.xsd +39 -0
  452. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/deprecated-2009-12-16.xsd +29 -0
  453. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/esma-arcrole-2018-11-21.xsd +14 -0
  454. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/factExplanatory-2009-12-16.xsd +13 -0
  455. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/jpfr-arcrole-2007-11-07.xsd +27 -0
  456. arelle/resources/cache/http/www.xbrl.org/lrr/arcrole/parent-child-2013-09-19.xsd +12 -0
  457. arelle/resources/cache/http/www.xbrl.org/lrr/role/deprecated-2009-12-16.xsd +17 -0
  458. arelle/resources/cache/http/www.xbrl.org/lrr/role/jpfr-role-2007-11-07.xsd +47 -0
  459. arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2008-03-31.xsd +30 -0
  460. arelle/resources/cache/http/www.xbrl.org/lrr/role/negated-2009-12-16.xsd +33 -0
  461. arelle/resources/cache/http/www.xbrl.org/lrr/role/negative-2009-12-16.xsd +25 -0
  462. arelle/resources/cache/http/www.xbrl.org/lrr/role/net-2009-12-16.xsd +13 -0
  463. arelle/resources/cache/http/www.xbrl.org/lrr/role/positive-2009-12-16.xsd +25 -0
  464. arelle/resources/cache/http/www.xbrl.org/lrr/role/property-2022-09-28.xsd +15 -0
  465. arelle/resources/cache/http/www.xbrl.org/lrr/role/reference-2009-12-16.xsd +21 -0
  466. arelle/resources/cache/http/www.xbrl.org/lrr/role/restated-2006-02-21.xsd +19 -0
  467. arelle/resources/cache/http/www.xbrl.org/utr/2012-01-30/utr.xml +4543 -0
  468. arelle/resources/cache/http/www.xbrl.org/utr/2012-10-31/utr.xml +4510 -0
  469. arelle/resources/cache/http/www.xbrl.org/utr/2012-11-30/utr.xml +4567 -0
  470. arelle/resources/cache/http/www.xbrl.org/utr/2013-02-28/utr.xml +5180 -0
  471. arelle/resources/cache/http/www.xbrl.org/utr/2013-05-17/utr.xml +5349 -0
  472. arelle/resources/cache/http/www.xbrl.org/utr/2016-08-10/utr.xml +5363 -0
  473. arelle/resources/cache/http/www.xbrl.org/utr/2017-07-12/utr.xml +6164 -0
  474. arelle/resources/cache/http/www.xbrl.org/utr/2021-02-16/utr.xml +6370 -0
  475. arelle/resources/cache/http/www.xbrl.org/utr/2021-12-08/utr.xml +6493 -0
  476. arelle/resources/cache/http/www.xbrl.org/utr/2022-02-16/utr.xml +6551 -0
  477. arelle/resources/cache/http/www.xbrl.org/utr/2022-07-20/utr.xml +6638 -0
  478. arelle/resources/cache/http/www.xbrl.org/utr/2023-12-20/utr.xml +6680 -0
  479. arelle/resources/cache/http/www.xbrl.org/utr/2024-01-31/utr.xml +6680 -0
  480. arelle/resources/cache/http/www.xbrl.org/utr/2024-10-22/utr.xml +6693 -0
  481. arelle/resources/cache/http/www.xbrl.org/utr/utr.xml +6693 -0
  482. arelle/resources/cache/https/www.xbrl.org/2005/conformance.xsd +87 -0
  483. arelle/resources/cache/https/www.xbrl.org/2020/extensible-enumerations-2.0.xsd +51 -0
  484. arelle/resources/cache/https/www.xbrl.org/2023/calculation-1.1.xsd +27 -0
  485. arelle/resources/cache/https/www.xbrl.org/dtr/type/2020-01-21/types.xsd +812 -0
  486. arelle/resources/cache/https/www.xbrl.org/dtr/type/2022-03-31/types.xsd +847 -0
  487. arelle/resources/cache/https/www.xbrl.org/dtr/type/2024-01-31/types.xsd +897 -0
  488. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-def.xml +68 -0
  489. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators-label.xml +84 -0
  490. arelle/resources/cache/https/www.xbrl.org/taxonomy/int/filing-indicators/REC/2021-02-03/filing-indicators.xsd +67 -0
  491. arelle/resources/libs/Tktable2.11/linux-x86_64/README.txt +149 -0
  492. arelle/resources/libs/Tktable2.11/linux-x86_64/html/tkTable.html +2039 -0
  493. arelle/resources/libs/Tktable2.11/linux-x86_64/libTktable2.11.so +0 -0
  494. arelle/resources/libs/Tktable2.11/linux-x86_64/license.txt +51 -0
  495. arelle/resources/libs/Tktable2.11/linux-x86_64/pkgIndex.tcl +3 -0
  496. arelle/resources/libs/Tktable2.11/linux-x86_64/tkTable.tcl +825 -0
  497. arelle/resources/libs/Tktable2.11/linux-x86_64/tktable.py +674 -0
  498. arelle/resources/libs/Tktable2.11/macos-arm64/README.txt +149 -0
  499. arelle/resources/libs/Tktable2.11/macos-arm64/html/tkTable.html +2039 -0
  500. arelle/resources/libs/Tktable2.11/macos-arm64/libTktable2.11.dylib +0 -0
  501. arelle/resources/libs/Tktable2.11/macos-arm64/license.txt +51 -0
  502. arelle/resources/libs/Tktable2.11/macos-arm64/pkgIndex.tcl +2 -0
  503. arelle/resources/libs/Tktable2.11/macos-arm64/tkTable.tcl +825 -0
  504. arelle/resources/libs/Tktable2.11/macos-arm64/tktable.py +674 -0
  505. arelle/resources/libs/Tktable2.11/macos-x86_64/README.txt +149 -0
  506. arelle/resources/libs/Tktable2.11/macos-x86_64/html/tkTable.html +2039 -0
  507. arelle/resources/libs/Tktable2.11/macos-x86_64/libTktable2.11.dylib +0 -0
  508. arelle/resources/libs/Tktable2.11/macos-x86_64/license.txt +51 -0
  509. arelle/resources/libs/Tktable2.11/macos-x86_64/pkgIndex.tcl +2 -0
  510. arelle/resources/libs/Tktable2.11/macos-x86_64/tkTable.tcl +825 -0
  511. arelle/resources/libs/Tktable2.11/macos-x86_64/tktable.py +674 -0
  512. arelle/resources/libs/Tktable2.11/win-x86_64/Tktable.dll +0 -0
  513. arelle/resources/libs/Tktable2.11/win-x86_64/pkgIndex.tcl +2 -0
  514. arelle/resources/libs/Tktable2.11/win-x86_64/tkTable.tcl +825 -0
  515. arelle/typing.py +9 -4
  516. arelle/utils/Contexts.py +38 -0
  517. arelle/utils/EntryPointDetection.py +139 -0
  518. arelle/utils/Equivalence.py +22 -0
  519. arelle/utils/{validate/PluginValidationData.py → PluginData.py} +5 -2
  520. arelle/utils/PluginHooks.py +256 -5
  521. arelle/utils/Units.py +36 -0
  522. arelle/utils/validate/Decorator.py +5 -3
  523. arelle/utils/validate/DetectScriptsInXhtml.py +99 -0
  524. arelle/utils/validate/ESEFImage.py +283 -0
  525. arelle/utils/validate/Validation.py +9 -1
  526. arelle/utils/validate/ValidationPlugin.py +74 -11
  527. arelle/utils/validate/ValidationUtil.py +55 -0
  528. arelle/webserver/bottle.py +5 -4424
  529. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/METADATA +51 -42
  530. arelle_release-2.37.71.dist-info/RECORD +697 -0
  531. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/WHEEL +1 -1
  532. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info/licenses}/LICENSE.md +1 -4
  533. {arelle_release-2.17.1.dist-info → arelle_release-2.37.71.dist-info}/top_level.txt +0 -1
  534. arelle/DialogOpenTaxonomyPackage.py +0 -1
  535. arelle/RenderingResolver.py +0 -624
  536. arelle/examples/.pydevproject +0 -5
  537. arelle/examples/CustomLogger.py +0 -43
  538. arelle/examples/LoadEFMvalidate.py +0 -32
  539. arelle/examples/LoadSavePreLbCsv.py +0 -26
  540. arelle/examples/LoadValidate.cs +0 -31
  541. arelle/examples/LoadValidate.py +0 -36
  542. arelle/examples/LoadValidateCmdLine.java +0 -69
  543. arelle/examples/LoadValidatePostedZip.java +0 -57
  544. arelle/examples/LoadValidateWebService.java +0 -34
  545. arelle/examples/SaveTableToExelle.py +0 -140
  546. arelle/examples/TR3toTR4.py +0 -88
  547. arelle/examples/plugin/bigInstance.py +0 -394
  548. arelle/examples/plugin/cmdWebServerExtension.py +0 -42
  549. arelle/examples/plugin/crashTest.py +0 -38
  550. arelle/examples/plugin/formulaSuiteConverter.py +0 -212
  551. arelle/examples/plugin/functionsCustom.py +0 -59
  552. arelle/examples/plugin/hello_dolly.py +0 -64
  553. arelle/examples/plugin/hello_i18n.pot +0 -26
  554. arelle/examples/plugin/hello_i18n.py +0 -32
  555. arelle/examples/plugin/importTestChild1.py +0 -21
  556. arelle/examples/plugin/importTestChild2.py +0 -22
  557. arelle/examples/plugin/importTestGrandchild1.py +0 -21
  558. arelle/examples/plugin/importTestGrandchild2.py +0 -21
  559. arelle/examples/plugin/importTestImported1.py +0 -23
  560. arelle/examples/plugin/importTestImported11.py +0 -22
  561. arelle/examples/plugin/importTestParent.py +0 -48
  562. arelle/examples/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
  563. arelle/examples/plugin/packagedImportTest/__init__.py +0 -47
  564. arelle/examples/plugin/packagedImportTest/importTestChild1.py +0 -21
  565. arelle/examples/plugin/packagedImportTest/importTestChild2.py +0 -22
  566. arelle/examples/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
  567. arelle/examples/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
  568. arelle/examples/plugin/packagedImportTest/importTestImported1.py +0 -24
  569. arelle/examples/plugin/packagedImportTest/importTestImported11.py +0 -21
  570. arelle/examples/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
  571. arelle/examples/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
  572. arelle/examples/plugin/sakaCalendar.py +0 -215
  573. arelle/examples/plugin/saveInstanceInfoset.py +0 -121
  574. arelle/examples/plugin/streamingExtensions.py +0 -335
  575. arelle/examples/plugin/testcaseCalc11ValidateSetup.py +0 -32
  576. arelle/examples/plugin/testcaseIxExpectedHtmlFixup.py +0 -45
  577. arelle/examples/plugin/updateTableLB.py +0 -242
  578. arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
  579. arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
  580. arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
  581. arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
  582. arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
  583. arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -109
  584. arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -58
  585. arelle/examples/plugin/validateSchemaLxml.py +0 -156
  586. arelle/examples/plugin/validateTableInfoset.py +0 -52
  587. arelle/examples/us-gaap-dei-docType-extraction-frm.xml +0 -90
  588. arelle/examples/us-gaap-dei-ratio-cash-frm.xml +0 -150
  589. arelle/plugin/functionsXmlCreation.py +0 -106
  590. arelle/plugin/instanceInfo.py +0 -306
  591. arelle/plugin/loadFromOIM-2018.py +0 -1282
  592. arelle/plugin/objectmaker.py +0 -285
  593. arelle/plugin/sphinx/FormulaGenerator.py +0 -823
  594. arelle/plugin/sphinx/SphinxContext.py +0 -404
  595. arelle/plugin/sphinx/SphinxEvaluator.py +0 -783
  596. arelle/plugin/sphinx/SphinxMethods.py +0 -1287
  597. arelle/plugin/sphinx/SphinxParser.py +0 -1093
  598. arelle/plugin/sphinx/SphinxValidator.py +0 -163
  599. arelle/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
  600. arelle/plugin/sphinx/__init__.py +0 -285
  601. arelle/plugin/transforms/SEC/__init__.py +0 -308
  602. arelle/plugin/transforms/SEC/conf/README.md +0 -39
  603. arelle/plugin/transforms/SEC/conf/extractTestcase.sh +0 -2
  604. arelle/plugin/transforms/SEC/conf/extractTestcase.xsl +0 -109
  605. arelle/plugin/transforms/SEC/conf/runIxtSecTests.sh +0 -16
  606. arelle/plugin/transforms/SEC/conf/saxon9.jar +0 -0
  607. arelle/plugin/transforms/SEC/conf/testcase.xml +0 -7117
  608. arelle/plugin/transforms/SEC/conf/tests.xml +0 -848
  609. arelle/plugin/transforms/SEC/text2num.py +0 -110
  610. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-boolballotbox.xml +0 -66
  611. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-countrynameen.xml +0 -65
  612. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-datequarterend.xml +0 -66
  613. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durday.xml +0 -61
  614. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durhour.xml +0 -69
  615. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durmonth.xml +0 -71
  616. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durweek.xml +0 -70
  617. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-durwordsen.xml +0 -56
  618. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-duryear.xml +0 -64
  619. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-edgarprovcountryen.xml +0 -65
  620. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-entityfilercategoryen.xml +0 -63
  621. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-exchnameen.xml +0 -86
  622. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-numwordsen.xml +0 -55
  623. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-stateprovnameen.xml +0 -64
  624. arelle/plugin/transforms/SEC/transformationRegistry/registry/ixt-sec-yesnoballotbox.xml +0 -66
  625. arelle/plugin/transforms/SEC/transformationRegistry/registry/transform-registry.xml +0 -314
  626. arelle/plugin/transforms/SEC/transformationRegistry/schema/inlinexbrl-sec-transformation.xsd +0 -418
  627. arelle/plugin/validate/EFM/Consts.py +0 -362
  628. arelle/plugin/validate/EFM/DTS.py +0 -569
  629. arelle/plugin/validate/EFM/Dimensions.py +0 -264
  630. arelle/plugin/validate/EFM/Document.py +0 -206
  631. arelle/plugin/validate/EFM/Filing.py +0 -4383
  632. arelle/plugin/validate/EFM/IsolateSeparateIXDSes.py +0 -19
  633. arelle/plugin/validate/EFM/MessageNumericId.py +0 -142
  634. arelle/plugin/validate/EFM/PreCalAlignment.py +0 -324
  635. arelle/plugin/validate/EFM/Util.py +0 -688
  636. arelle/plugin/validate/EFM/__init__.py +0 -843
  637. arelle/plugin/validate/EFM/config.xml +0 -333
  638. arelle/plugin/validate/EFM/resources/README.md +0 -57
  639. arelle/plugin/validate/EFM/resources/axiswarnings.json +0 -27
  640. arelle/plugin/validate/EFM/resources/cef-deprecated-concepts.json +0 -8
  641. arelle/plugin/validate/EFM/resources/country-deprecated-concepts.json +0 -19
  642. arelle/plugin/validate/EFM/resources/currency-deprecated-concepts.json +0 -7
  643. arelle/plugin/validate/EFM/resources/dei-deprecated-concepts.json +0 -8
  644. arelle/plugin/validate/EFM/resources/dei-validations.json +0 -2884
  645. arelle/plugin/validate/EFM/resources/dqc-us-rules.json +0 -1389
  646. arelle/plugin/validate/EFM/resources/ecd-deprecated-concepts.json +0 -1
  647. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-16-4.xml +0 -115
  648. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-0-4.xml +0 -300
  649. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-1.xml +0 -304
  650. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-2.xml +0 -290
  651. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-17-3-1.xml +0 -294
  652. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.1.xml +0 -549
  653. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.2.xml +0 -506
  654. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-18.3.xml +0 -496
  655. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-1.xml +0 -662
  656. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-2.xml +0 -3761
  657. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-19-3.xml +0 -3577
  658. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-1.xml +0 -4020
  659. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-2.xml +0 -3320
  660. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-20-3.xml +0 -2998
  661. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2012.xml +0 -957
  662. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2013.xml +0 -982
  663. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2014.xml +0 -1001
  664. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2015.xml +0 -1076
  665. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-2016.xml +0 -120
  666. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-1.xml +0 -3329
  667. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-2.xml +0 -1230
  668. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-3.xml +0 -1113
  669. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-21-4.xml +0 -1321
  670. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1-preview.xml +0 -1721
  671. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-1.xml +0 -1841
  672. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2-2.xml +0 -1450
  673. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-2.xml +0 -1429
  674. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-22-4.xml +0 -1527
  675. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1-1.xml +0 -2049
  676. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-1.xml +0 -2065
  677. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-2.xml +0 -1674
  678. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-23-3.xml +0 -1715
  679. arelle/plugin/validate/EFM/resources/edgartaxonomies/edgartaxonomies-all-years.xml +0 -10671
  680. arelle/plugin/validate/EFM/resources/edgartaxonomies/erxl.xsd +0 -69
  681. arelle/plugin/validate/EFM/resources/edgartaxonomies/extendedtaxonomies-all-years.xml +0 -18
  682. arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrs-taxonomies.xml +0 -3126
  683. arelle/plugin/validate/EFM/resources/edgartaxonomies/ifrstaxonomies-all-years.xml +0 -22
  684. arelle/plugin/validate/EFM/resources/ex26-validations.json +0 -255
  685. arelle/plugin/validate/EFM/resources/exch-deprecated-concepts.json +0 -163
  686. arelle/plugin/validate/EFM/resources/ifrs-full-deprecated-concepts.json +0 -204
  687. arelle/plugin/validate/EFM/resources/invest-deprecated-concepts.json +0 -99
  688. arelle/plugin/validate/EFM/resources/ixbrl-transform-registries.json +0 -16
  689. arelle/plugin/validate/EFM/resources/naics-deprecated-concepts.json +0 -295
  690. arelle/plugin/validate/EFM/resources/oef-deprecated-concepts.json +0 -59
  691. arelle/plugin/validate/EFM/resources/other-standard-taxonomies.json +0 -12
  692. arelle/plugin/validate/EFM/resources/rr-deprecated-concepts.json +0 -14
  693. arelle/plugin/validate/EFM/resources/rxp-deprecated-concepts.json +0 -1
  694. arelle/plugin/validate/EFM/resources/shr-deprecated-concepts.json +0 -1
  695. arelle/plugin/validate/EFM/resources/sic-deprecated-concepts.json +0 -1
  696. arelle/plugin/validate/EFM/resources/signwarnings.json +0 -112
  697. arelle/plugin/validate/EFM/resources/srt-deprecated-concepts.json +0 -1
  698. arelle/plugin/validate/EFM/resources/stpr-deprecated-concepts.json +0 -1
  699. arelle/plugin/validate/EFM/resources/taxonomy-compatibility.json +0 -79
  700. arelle/plugin/validate/EFM/resources/us-gaap-deprecated-concepts.json +0 -2886
  701. arelle/plugin/validate/EFM/resources/us-gaap-rels-2020.json +0 -29068
  702. arelle/plugin/validate/EFM/resources/us-gaap-rels-2021.json +0 -29598
  703. arelle/plugin/validate/EFM/resources/us-gaap-rels-2022.json +0 -29141
  704. arelle/plugin/validate/EFM/resources/us-gaap-rels-2023.json +0 -29400
  705. arelle/plugin/validate/EFM/resources/vip-deprecated-concepts.json +0 -1
  706. arelle/plugin/validate/EFM/tools/CheckTxmyRefs.py +0 -180
  707. arelle/plugin/validate/EFM-htm/Const.py +0 -205
  708. arelle/plugin/validate/EFM-htm/__init__.py +0 -217
  709. arelle/plugin/validate/EFM-htm/config.xml +0 -17
  710. arelle/plugin/validate/EFM-htm/resources/efm-htm.dtd +0 -664
  711. arelle/plugin/validate/ESEF/ESEF_Current/Image.py +0 -199
  712. arelle/plugin/validate/ESEF_2022/__init__.py +0 -47
  713. arelle/plugin/validate/GFM/__init__.py +0 -59
  714. arelle/plugin/validate/GFM/config.xml +0 -82
  715. arelle/plugin/validate/SBRnl/CustomLoader.py +0 -19
  716. arelle/plugin/validate/SBRnl/DTS.py +0 -305
  717. arelle/plugin/validate/SBRnl/Dimensions.py +0 -357
  718. arelle/plugin/validate/SBRnl/Document.py +0 -799
  719. arelle/plugin/validate/SBRnl/Filing.py +0 -467
  720. arelle/plugin/validate/SBRnl/__init__.py +0 -75
  721. arelle/plugin/validate/SBRnl/config.xml +0 -26
  722. arelle/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
  723. arelle/plugin/validate/USBestPractices.py +0 -570
  724. arelle/plugin/validate/USCorpAction.py +0 -557
  725. arelle/plugin/validate/USSecTagging.py +0 -337
  726. arelle/plugin/validate/XDC/__init__.py +0 -77
  727. arelle/plugin/validate/XDC/config.xml +0 -20
  728. arelle/plugin/validate/XFsyntax/__init__.py +0 -64
  729. arelle/plugin/validate/XFsyntax/xf.py +0 -2227
  730. arelle/plugin/validate/__init__.py +0 -20
  731. arelle/plugin/validate/calc2.py +0 -536
  732. arelle/plugin/validateSBRnl.py +0 -530
  733. arelle/scripts-macOS/startWebServer.command +0 -3
  734. arelle/scripts-unix/startWebServer.sh +0 -1
  735. arelle/scripts-windows/startWebServer.bat +0 -5
  736. arelle_release-2.17.1.dist-info/RECORD +0 -676
  737. tests/__init__.py +0 -0
  738. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/ArelleGUITest.csproj +0 -30
  739. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Tests.cs +0 -381
  740. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Usings.cs +0 -1
  741. tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest.sln +0 -31
  742. tests/integration_tests/ui_tests/resources/workiva.zip +0 -0
  743. tests/integration_tests/validation/README.md +0 -50
  744. tests/integration_tests/validation/conformance_suite_config.py +0 -59
  745. tests/integration_tests/validation/conformance_suite_configs.py +0 -63
  746. tests/integration_tests/validation/conformance_suite_configurations/efm_current.py +0 -261
  747. tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2021.py +0 -85
  748. tests/integration_tests/validation/conformance_suite_configurations/esef_ixbrl_2022.py +0 -90
  749. tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2021.py +0 -15
  750. tests/integration_tests/validation/conformance_suite_configurations/esef_xhtml_2022.py +0 -15
  751. tests/integration_tests/validation/conformance_suite_configurations/nl_nt16.py +0 -13
  752. tests/integration_tests/validation/conformance_suite_configurations/nl_nt17.py +0 -13
  753. tests/integration_tests/validation/conformance_suite_configurations/nl_nt18.py +0 -13
  754. tests/integration_tests/validation/conformance_suite_configurations/xbrl_2_1.py +0 -34
  755. tests/integration_tests/validation/conformance_suite_configurations/xbrl_calculations_1_1.py +0 -40
  756. tests/integration_tests/validation/conformance_suite_configurations/xbrl_dimensions_1_0.py +0 -28
  757. tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_1_0.py +0 -10
  758. tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_2_0.py +0 -10
  759. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0.py +0 -9
  760. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_assertion_severity_2_0.py +0 -9
  761. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_function_registry.py +0 -14
  762. tests/integration_tests/validation/conformance_suite_configurations/xbrl_ixbrl_1_1.py +0 -22
  763. tests/integration_tests/validation/conformance_suite_configurations/xbrl_link_role_registry_1_0.py +0 -11
  764. tests/integration_tests/validation/conformance_suite_configurations/xbrl_oim_1_0.py +0 -19
  765. tests/integration_tests/validation/conformance_suite_configurations/xbrl_table_linkbase_1_0.py +0 -296
  766. tests/integration_tests/validation/conformance_suite_configurations/xbrl_taxonomy_packages_1_0.py +0 -13
  767. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_3.py +0 -13
  768. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_4.py +0 -13
  769. tests/integration_tests/validation/conformance_suite_configurations/xbrl_transformation_registry_5.py +0 -13
  770. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_malformed_1_0.py +0 -31
  771. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_registry_1_0.py +0 -22
  772. tests/integration_tests/validation/conformance_suite_configurations/xbrl_utr_structure_1_0.py +0 -18
  773. tests/integration_tests/validation/conftest.py +0 -24
  774. tests/integration_tests/validation/discover_tests.py +0 -22
  775. tests/integration_tests/validation/download_conformance_suites.py +0 -47
  776. tests/integration_tests/validation/run_conformance_suites.py +0 -175
  777. tests/integration_tests/validation/test_conformance_suites.py +0 -14
  778. tests/integration_tests/validation/validation_util.py +0 -271
  779. tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-invalid-period.xbrl +0 -63
  780. tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-testcase.xml +0 -22
  781. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-missing.xbrl +0 -53
  782. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-multiple.xbrl +0 -60
  783. tests/resources/conformance_suites/nl_nt16/br_kvk/3-01-testcase.xml +0 -33
  784. tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-invalid.xbrl +0 -57
  785. tests/resources/conformance_suites/nl_nt16/br_kvk/4-07-testcase.xml +0 -22
  786. tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-invalid.xbrl +0 -58
  787. tests/resources/conformance_suites/nl_nt16/br_kvk/4-10-testcase.xml +0 -22
  788. tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-invalid.xbrl +0 -63
  789. tests/resources/conformance_suites/nl_nt16/br_kvk/4-12-testcase.xml +0 -22
  790. tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-missing.xbrl +0 -61
  791. tests/resources/conformance_suites/nl_nt16/br_kvk/4-16-testcase.xml +0 -22
  792. tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-invalid-date.xbrl +0 -89
  793. tests/resources/conformance_suites/nl_nt16/br_kvk/4-20-testcase.xml +0 -22
  794. tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-invalid-file-extension.xml +0 -56
  795. tests/resources/conformance_suites/nl_nt16/fr_kvk/1-01-testcase.xml +0 -22
  796. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-invalid-lang.xbrl +0 -56
  797. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-missing-lang.xbrl +0 -55
  798. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-01-testcase.xml +0 -33
  799. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-entrypoint.xsd +0 -6
  800. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
  801. tests/resources/conformance_suites/nl_nt16/fr_kvk/2-03-testcase.xml +0 -22
  802. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
  803. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-01-testcase.xml +0 -22
  804. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
  805. tests/resources/conformance_suites/nl_nt16/fr_kvk/5-02-testcase.xml +0 -22
  806. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-file.xbrl +0 -2
  807. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-invalid-zip.zip +0 -0
  808. tests/resources/conformance_suites/nl_nt16/fr_nl/1-01-testcase.xml +0 -33
  809. tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  810. tests/resources/conformance_suites/nl_nt16/fr_nl/1-03-testcase.xml +0 -22
  811. tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  812. tests/resources/conformance_suites/nl_nt16/fr_nl/1-05-testcase.xml +0 -22
  813. tests/resources/conformance_suites/nl_nt16/fr_nl/1-06-testcase.xml +0 -22
  814. tests/resources/conformance_suites/nl_nt16/fr_nl/1-06.invalid.xbrl +0 -2
  815. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-file.xbrl +0 -8
  816. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-invalid-zip.zip +0 -0
  817. tests/resources/conformance_suites/nl_nt16/fr_nl/2-06-testcase.xml +0 -33
  818. tests/resources/conformance_suites/nl_nt16/index.xml +0 -20
  819. tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-invalid-period.xbrl +0 -63
  820. tests/resources/conformance_suites/nl_nt17/br_kvk/2-04-testcase.xml +0 -22
  821. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-missing.xbrl +0 -53
  822. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-multiple.xbrl +0 -60
  823. tests/resources/conformance_suites/nl_nt17/br_kvk/3-01-testcase.xml +0 -33
  824. tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-invalid.xbrl +0 -57
  825. tests/resources/conformance_suites/nl_nt17/br_kvk/4-07-testcase.xml +0 -22
  826. tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-invalid.xbrl +0 -58
  827. tests/resources/conformance_suites/nl_nt17/br_kvk/4-10-testcase.xml +0 -22
  828. tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-invalid.xbrl +0 -63
  829. tests/resources/conformance_suites/nl_nt17/br_kvk/4-12-testcase.xml +0 -22
  830. tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-missing.xbrl +0 -61
  831. tests/resources/conformance_suites/nl_nt17/br_kvk/4-16-testcase.xml +0 -22
  832. tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-invalid-date.xbrl +0 -89
  833. tests/resources/conformance_suites/nl_nt17/br_kvk/4-20-testcase.xml +0 -22
  834. tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-invalid-file-extension.xml +0 -56
  835. tests/resources/conformance_suites/nl_nt17/fr_kvk/1-01-testcase.xml +0 -22
  836. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-invalid-lang.xbrl +0 -56
  837. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-missing-lang.xbrl +0 -55
  838. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-01-testcase.xml +0 -33
  839. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-entrypoint.xsd +0 -6
  840. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-invalid-entrypoint.xbrl +0 -63
  841. tests/resources/conformance_suites/nl_nt17/fr_kvk/2-03-testcase.xml +0 -22
  842. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-invalid-decimals.xbrl +0 -49
  843. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-01-testcase.xml +0 -22
  844. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-invalid-decimals.xbrl +0 -49
  845. tests/resources/conformance_suites/nl_nt17/fr_kvk/5-02-testcase.xml +0 -22
  846. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-file.xbrl +0 -2
  847. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-invalid-zip.zip +0 -0
  848. tests/resources/conformance_suites/nl_nt17/fr_nl/1-01-testcase.xml +0 -33
  849. tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  850. tests/resources/conformance_suites/nl_nt17/fr_nl/1-03-testcase.xml +0 -22
  851. tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  852. tests/resources/conformance_suites/nl_nt17/fr_nl/1-05-testcases.xml +0 -22
  853. tests/resources/conformance_suites/nl_nt17/fr_nl/1-06-testcase.xml +0 -22
  854. tests/resources/conformance_suites/nl_nt17/fr_nl/1-06.invalid.xbrl +0 -2
  855. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-file.xbrl +0 -8
  856. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-invalid-zip.zip +0 -0
  857. tests/resources/conformance_suites/nl_nt17/fr_nl/2-06-testcase.xml +0 -33
  858. tests/resources/conformance_suites/nl_nt17/index.xml +0 -20
  859. tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-invalid-doctype.xbrl +0 -4
  860. tests/resources/conformance_suites/nl_nt18/fr_nl/1-03-testcase.xml +0 -22
  861. tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-invalid-encoding.xbrl +0 -0
  862. tests/resources/conformance_suites/nl_nt18/fr_nl/1-05-testcases.xml +0 -22
  863. tests/resources/conformance_suites/nl_nt18/fr_nl/1-06-testcase.xml +0 -22
  864. tests/resources/conformance_suites/nl_nt18/fr_nl/1-06.invalid.xbrl +0 -2
  865. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-file.xbrl +0 -2
  866. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-invalid-zip.zip +0 -0
  867. tests/resources/conformance_suites/nl_nt18/fr_nl/1.01-testcase.xml +0 -33
  868. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-file.xbrl +0 -8
  869. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-invalid-zip.zip +0 -0
  870. tests/resources/conformance_suites/nl_nt18/fr_nl/2-06-testcase.xml +0 -33
  871. tests/resources/conformance_suites/nl_nt18/index.xml +0 -8
  872. tests/unit_tests/arelle/conftest.py +0 -16
  873. tests/unit_tests/arelle/formula/test_fact_aspects_cache.py +0 -170
  874. tests/unit_tests/arelle/plugin/test_loadfromoim.py +0 -40
  875. tests/unit_tests/arelle/plugin/test_plugin_imports.py +0 -27
  876. tests/unit_tests/arelle/test_betafeatures.py +0 -81
  877. tests/unit_tests/arelle/test_cntlr.py +0 -28
  878. tests/unit_tests/arelle/test_import.py +0 -40
  879. tests/unit_tests/arelle/test_locale.py +0 -73
  880. tests/unit_tests/arelle/test_modelmanager.py +0 -15
  881. tests/unit_tests/arelle/test_packagemanager.py +0 -65
  882. tests/unit_tests/arelle/test_pluginmanager.py +0 -176
  883. tests/unit_tests/arelle/test_qname.py +0 -140
  884. tests/unit_tests/arelle/test_runtimeoptions.py +0 -56
  885. tests/unit_tests/arelle/test_system_info.py +0 -26
  886. tests/unit_tests/arelle/test_updater.py +0 -507
  887. tests/unit_tests/arelle/test_urlutil.py +0 -49
  888. tests/unit_tests/arelle/test_version.py +0 -46
  889. tests/unit_tests/arelle/utils/validate/test_decorator.py +0 -59
  890. /arelle/{examples/plugin/validate/XYZ → plugin/validate/EDINET}/rules/__init__.py +0 -0
  891. /arelle/plugin/validate/{HMRC → UK}/consistencyChecksByName.json +0 -0
  892. /arelle/plugin/validate/{HMRC → UK}/hmrc-taxonomies.xml +0 -0
  893. {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 arelle import PythonUtil # define 2.x or 3.x string types
9
- import gettext, time, datetime, os, shlex, sys, traceback, fnmatch, threading, json, logging, platform
10
- from optparse import OptionGroup, OptionParser, SUPPRESS_HELP
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 arelle import (Cntlr, FileSource, ModelDocument, RenderingEvaluator, XmlUtil, XbrlConst, Version,
13
- ViewFileDTS, ViewFileFactList, ViewFileFactTable, ViewFileConcepts,
14
- ViewFileFormulae, ViewFileRelationshipSet, ViewFileTests, ViewFileRssFeed,
15
- ViewFileRoleTypes,
16
- ModelManager)
17
- from arelle.RuntimeOptions import RuntimeOptions, RuntimeOptionsException
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 PluginManager
23
- from arelle.PluginManager import pluginClassMethods
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.UrlUtil import isHttpUrl
27
- from arelle.Version import copyrightLabel
60
+ from arelle.utils.EntryPointDetection import parseEntrypointFileInput
61
+ from arelle.ValidateXbrlDTS import ValidateBaseTaxonomiesMode
28
62
  from arelle.WebCache import proxyTuple
29
- from arelle.SystemInfo import getSystemInfo, getSystemWordSize, hasWebServer, isCGI, isGAE, PlatformOS
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=EdgarRenderer"])
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 = createCntlrAndPreloadPlugins(uiLang, disable_persistent_config, {}) # This Cntlr is needed for translations and to enable the web cache. The cntlr is not used outside the parse function
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) {0} ({1}bit)".format(Version.__version__, getSystemWordSize()),
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 U.K. HMRC disclosure system validation."))
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 (may be .csv or .html)"))
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 EdgarRenderer or --plugins xbrlDB). " ))
320
- parser.add_option("--packages", "--package", action="store", dest="packages",
321
- help=_("Specify taxonomy packages configuration. "
322
- "Enter 'show' to show current packages configuration. "
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 cherrypy, --webserver locahost:8080:cherrypy. "
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
- "{bottleCopyright}"
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 EdgarRenderer to require buffered logging
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',None))
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(CntlrCmdLine, self).__init__(hasGui=False, uiLang=uiLang, disable_persistent_config=disable_persistent_config)
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.keys():
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".format(options.statusPipe))
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\\{}".format(options.statusPipe),
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".format(options.statusPipe))
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".format(options.monitorParentProcess))
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".format(options.monitorParentProcess))
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 {0}={1}".format(optName, optValue), messageCode="info")
615
- self.addToLog("sys.argv {0}".format(sys.argv), messageCode="info")
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
- ":{0}".format(urlPort) if urlPort else ""), messageCode="info")
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 "CntlrCmdLine.Options" in moduleInfo["classMethods"]:
671
- addedPluginWithCntlrCmdLineOptions = True
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
- if options.webserver: # options may need reparsing dynamically
706
- _optionsParser = ParserForDynamicPlugins(options)
707
- # add plug-in options
708
- for optionsExtender in pluginClassMethods("CntlrCmdLine.Options"):
709
- optionsExtender(_optionsParser)
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
- # entrypointFile may be absent (if input is a POSTED zip or file name ending in .zip)
891
- # or may be a | separated set of file names
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 doad diff file: \n{0} \n{1}").format(
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 = self.modelManager.modelXbrl
1011
- hasFormulae = modelXbrl.hasFormulae
1012
- isAlreadyValidated = False
1013
- for pluginXbrlMethod in pluginClassMethods("ModelDocument.IsValidated"):
1014
- if pluginXbrlMethod(modelXbrl): # e.g., streaming extensions already has validated
1015
- isAlreadyValidated = True
1016
- if options.validate and not isAlreadyValidated:
1017
- startedAt = time.time()
1018
- if options.formulaAction: # don't automatically run formulas
1019
- modelXbrl.hasFormulae = False
1020
- self.modelManager.validate()
1021
- if options.formulaAction: # restore setting
1022
- modelXbrl.hasFormulae = hasFormulae
1023
- self.addToLog(format_string(self.modelManager.locale,
1024
- _("validated in %.2f secs"),
1025
- time.time() - startedAt),
1026
- messageCode="info", file=self.entrypointFile)
1027
- if (modelXbrl.modelDocument.type not in ModelDocument.Type.TESTCASETYPES and
1028
- options.formulaAction in ("validate", "run") and # do nothing here if "none"
1029
- not isAlreadyValidated): # formulas can't run if streaming has validated the instance
1030
- from arelle import ValidateXbrlDimensions
1031
- from arelle.formula import ValidateFormula
1032
- startedAt = time.time()
1033
- if not options.validate:
1034
- ValidateXbrlDimensions.loadDimensionDefaults(modelXbrl)
1035
- # setup fresh parameters from formula optoins
1036
- modelXbrl.parameters = fo.typedParameters(modelXbrl.prefixedNamespaces)
1037
- ValidateFormula.validate(modelXbrl, compileOnly=(options.formulaAction != "run"))
1038
- self.addToLog(format_string(self.modelManager.locale,
1039
- _("formula validation and execution in %.2f secs")
1040
- if options.formulaAction == "run"
1041
- else _("formula validation only in %.2f secs"),
1042
- time.time() - startedAt),
1043
- messageCode="info", file=self.entrypointFile)
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
- if options.testReport:
1047
- ViewFileTests.viewTests(self.modelManager.modelXbrl, options.testReport, options.testReportCols)
1048
-
1049
- if options.rssReport:
1050
- ViewFileRssFeed.viewRssFeed(self.modelManager.modelXbrl, options.rssReport, options.rssReportCols)
1051
-
1052
- if options.DTSFile:
1053
- ViewFileDTS.viewDTS(modelXbrl, options.DTSFile)
1054
- if options.factsFile:
1055
- ViewFileFactList.viewFacts(modelXbrl, options.factsFile, labelrole=options.labelRole, lang=options.labelLang, cols=options.factListCols)
1056
- if options.factTableFile:
1057
- ViewFileFactTable.viewFacts(modelXbrl, options.factTableFile, labelrole=options.labelRole, lang=options.labelLang, cols=options.factTableCols)
1058
- if options.conceptsFile:
1059
- ViewFileConcepts.viewConcepts(modelXbrl, options.conceptsFile, labelrole=options.labelRole, lang=options.labelLang)
1060
- if options.preFile:
1061
- ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.preFile, "Presentation Linkbase", XbrlConst.parentChild, labelrole=options.labelRole, lang=options.labelLang, cols=options.relationshipCols)
1062
- if options.tableFile:
1063
- ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.tableFile, "Table Linkbase", "Table-rendering", labelrole=options.labelRole, lang=options.labelLang)
1064
- if options.calFile:
1065
- ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.calFile, "Calculation Linkbase", XbrlConst.summationItem, labelrole=options.labelRole, lang=options.labelLang, cols=options.relationshipCols)
1066
- if options.dimFile:
1067
- ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.dimFile, "Dimensions", "XBRL-dimensions", labelrole=options.labelRole, lang=options.labelLang, cols=options.relationshipCols)
1068
- if options.anchFile:
1069
- ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.anchFile, "Anchoring", XbrlConst.widerNarrower, labelrole=options.labelRole, lang=options.labelLang, cols=options.relationshipCols)
1070
- if options.formulaeFile:
1071
- ViewFileFormulae.viewFormulae(modelXbrl, options.formulaeFile, "Formulae", lang=options.labelLang)
1072
- if options.viewArcrole and options.viewFile:
1073
- ViewFileRelationshipSet.viewRelationshipSet(modelXbrl, options.viewFile, os.path.basename(options.viewArcrole), options.viewArcrole, labelrole=options.labelRole, lang=options.labelLang, cols=options.relationshipCols)
1074
- if options.roleTypesFile:
1075
- ViewFileRoleTypes.viewRoleTypes(modelXbrl, options.roleTypesFile, "Role Types", isArcrole=False, lang=options.labelLang)
1076
- if options.arcroleTypesFile:
1077
- ViewFileRoleTypes.viewRoleTypes(modelXbrl, options.arcroleTypesFile, "Arcrole Types", isArcrole=True, lang=options.labelLang)
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 (IOError, EnvironmentError) as err:
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 loadPackages(self, packages: str, packageManifestName: str):
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
- for packageCmd in packages.split('|'):
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
- else: # assume it is a module or package
1320
+ elif os.path.isdir(cmd): # load all package files in a directory
1176
1321
  savePackagesChanges = False
1177
- packageInfo = PackageManager.addPackage(self, cmd, packageManifestName)
1178
- if packageInfo:
1179
- self.addToLog(_("Activation of package {0} successful.").format(packageInfo.get("name")),
1180
- messageCode="info", file=packageInfo.get("URL"))
1181
- else:
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
- if '--COMserver' in sys.argv:
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()