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