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
@@ -0,0 +1,1037 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+
4
+ ## Overview
5
+
6
+ The OIM Taxonomy plugin is designed to load taxonomy objects from JSON that adheres to the Open Information
7
+ Model (OIM) Taxonomy Specification.
8
+
9
+ ## Usage Instructions
10
+
11
+ Any import or direct opening of a JSON-specified taxonomy behaves the same as if loading from an xsd taxonomy or xml linkbases
12
+
13
+ For debugging, saves the xsd objects loaded from the OIM taxonomy if
14
+ command line: specify --saveOIMschemafile
15
+ GUIL provide a formula parameter named saveOIMschemafile (value not null or false)x
16
+
17
+ """
18
+
19
+ from typing import TYPE_CHECKING, cast, GenericAlias, Union, _UnionGenericAlias, get_origin
20
+
21
+ import os, io, json, sys, time, traceback
22
+ import jsonschema
23
+ import regex as re
24
+ from collections import OrderedDict, defaultdict
25
+ from decimal import Decimal
26
+ from arelle.ModelDocument import load, Type, create as createModelDocument
27
+ from arelle.ModelValue import qname, QName
28
+ from arelle.PythonUtil import SEQUENCE_TYPES, OrderedSet
29
+ from arelle.Version import authorLabel, copyrightLabel
30
+ from arelle.XmlUtil import setXmlns
31
+ from arelle import ModelDocument, UrlUtil, XmlValidate
32
+
33
+ # XbrlObject modules contain nested XbrlOBjects and their type objects
34
+
35
+ from .XbrlAbstract import XbrlAbstract
36
+ from .XbrlConcept import XbrlConcept, XbrlDataType, XbrlUnitType
37
+ from .XbrlCube import (XbrlCube, XbrlCubeDimension, XbrlPeriodConstraint, XbrlDateResolution,
38
+ XbrlCubeType, XbrlAllowedCubeDimension, XbrlRequiredCubeRelationship)
39
+ from .XbrlEntity import XbrlEntity
40
+ from .XbrlGroup import XbrlGroup, XbrlGroupContent
41
+ from .XbrlImportedTaxonomy import XbrlImportedTaxonomy
42
+ from .XbrlLabel import XbrlLabel, XbrlLabelType
43
+ from .XbrlNetwork import XbrlNetwork, XbrlRelationship, XbrlRelationshipType
44
+ from .XbrlProperty import XbrlProperty, XbrlPropertyType
45
+ from .XbrlReference import XbrlReference, XbrlReferenceType
46
+ from .XbrlReport import XbrlFact
47
+ from .XbrlTransform import XbrlTransform
48
+ from .XbrlUnit import XbrlUnit
49
+ from .XbrlTaxonomy import XbrlTaxonomy
50
+ from .XbrlTaxonomyObject import XbrlObject, XbrlReferencableTaxonomyObject, XbrlTaxonomyTagObject
51
+ from .XbrlDts import XbrlDts, castToDts
52
+ from .XbrlTypes import XbrlTaxonomyType, QNameKeyType, SQNameKeyType, DefaultTrue, DefaultFalse, DefaultZero
53
+ from .ValidateDTS import validateDTS
54
+ from .ModelValueMore import SQName, QNameAt
55
+ from .ViewXbrlTxmyObj import viewXbrlTxmyObj
56
+ from .XbrlConst import xbrl, oimTaxonomyDocTypePattern, oimTaxonomyDocTypes, qnXbrlLabelObj, xbrlTaxonomyObjects
57
+
58
+
59
+ from arelle.oim.Load import (DUPJSONKEY, DUPJSONVALUE, EMPTY_DICT, EMPTY_LIST, UrlInvalidPattern,
60
+ OIMException, NotOIMException)
61
+
62
+ RESOURCES_DIR = os.path.join(os.path.dirname(__file__), "resources")
63
+ OIMT_SCHEMA = os.path.join(RESOURCES_DIR, "oim-taxonomy-schema.json")
64
+
65
+ saveOIMTaxonomySchemaFiles = False
66
+ SAVE_OIM_SCHEMA_CMDLINE_PARAMETER = "--saveOIMschemafile"
67
+ SAVE_OIM_SCHEMA_FORULA_PARAMETER = qname("saveOIMschemafile", noPrefixIsNoNamespace=True)
68
+ jsonschemaValidator = None
69
+
70
+ EMPTY_SET = set()
71
+
72
+ def jsonGet(tbl, key, default=None):
73
+ if isinstance(tbl, dict):
74
+ return tbl.get(key, default)
75
+ return default
76
+
77
+ def loadOIMTaxonomy(cntlr, error, warning, modelXbrl, oimFile, mappedUri, **kwargs):
78
+ global jsonschemaValidator
79
+ from arelle import ModelDocument, ModelXbrl, XmlUtil
80
+ from arelle.ModelDocument import ModelDocumentReference
81
+ from arelle.ModelValue import qname
82
+
83
+ _return = None # modelDocument or an exception
84
+
85
+ try:
86
+ currentAction = "initializing"
87
+ startingErrorCount = len(modelXbrl.errors) if modelXbrl else 0
88
+ startedAt = time.time()
89
+ documentType = None # set by loadDict
90
+ includeObjects = kwargs.get("includeObjects")
91
+ includeObjectTypes = kwargs.get("includeObjectTypes")
92
+ excludeLabels = kwargs.get("excludeLabels", False)
93
+ followImport = kwargs.get("followImport", True)
94
+
95
+ currentAction = "loading and parsing OIM Taxonomy file"
96
+ loadDictErrors = []
97
+ def ldError(msgCode, msgText, **kwargs):
98
+ loadDictErrors.append((msgCode, msgText, kwargs))
99
+
100
+ def loadDict(keyValuePairs):
101
+ _dict = {}
102
+ _valueKeyDict = {}
103
+ for key, value in keyValuePairs:
104
+ if isinstance(value, dict):
105
+ if key == "documentInfo" and "documentType" in value:
106
+ global documentType
107
+ documentType = value["documentType"]
108
+ if key in ("namespaces", "taxonomy"):
109
+ normalizedDict = {}
110
+ normalizedValueKeyDict = {}
111
+ if DUPJSONKEY in value:
112
+ normalizedDict[DUPJSONKEY] = value[DUPJSONKEY]
113
+ if DUPJSONVALUE in value:
114
+ normalizedDict[DUPJSONVALUE] = value[DUPJSONVALUE]
115
+ for _key, _value in value.items():
116
+ # _key = _key.strip() # per !178 keys have only normalized values, don't normalize key
117
+ # _value = _value.strip()
118
+ if _key in normalizedDict: # don't put the duplicate in the dictionary but report it as error
119
+ if DUPJSONKEY not in normalizedDict:
120
+ normalizedDict[DUPJSONKEY] = []
121
+ normalizedDict[DUPJSONKEY].append((_key, _value, normalizedDict[_key]))
122
+ elif isinstance(_value, SEQUENCE_TYPES):
123
+ normalizedDict[_key] = _value
124
+ else: # do put into dictionary, only report if it's a map object
125
+ normalizedDict[_key] = _value
126
+ if key == "namespaces":
127
+ if _value in normalizedValueKeyDict:
128
+ if DUPJSONVALUE not in normalizedDict:
129
+ normalizedDict[DUPJSONVALUE] = []
130
+ normalizedDict[DUPJSONVALUE].append((_value, _key, normalizedValueKeyDict[_value]))
131
+ else:
132
+ normalizedValueKeyDict[_value] = _key
133
+ if key == "namespaces":
134
+ if not XmlValidate.NCNamePattern.match(_key):
135
+ ldError("{}:invalidJSONStructure",
136
+ _("The %(map)s alias \"%(alias)s\" must be a canonical NCName value"),
137
+ modelObject=modelXbrl, map=key, alias=_key)
138
+ if UrlInvalidPattern.match(_value):
139
+ ldError("{}:invalidJSONStructure",
140
+ _("The %(map)s alias \"%(alias)s\" URI must be a canonical URI value: \"%(URI)s\"."),
141
+ modelObject=modelXbrl, map=key, alias=_key, URI=_value)
142
+ elif not (_value and UrlUtil.isAbsolute(_value)) or UrlInvalidPattern.match(_value):
143
+ ldError("oimce:invalidURI",
144
+ _("The %(map)s \"%(alias)s\" URI is invalid: \"%(URI)s\"."),
145
+ modelObject=modelXbrl, map=key, alias=_key, URI=_value)
146
+ value.clear() # replace with normalized values
147
+ for _key, _value in normalizedDict.items():
148
+ value[_key] = _value
149
+ if DUPJSONKEY in value:
150
+ for _errKey, _errValue, _otherValue in value[DUPJSONKEY]:
151
+ if key in ("namespaces", ):
152
+ ldError("{}:invalidJSON", # {} expanded when loadDictErrors are processed
153
+ _("The %(map)s alias \"%(prefix)s\" is used on uri \"%(uri1)s\" and uri \"\"%(uri2)s."),
154
+ modelObject=modelXbrl, map=key, prefix=_errKey, uri1=_errValue, uri2=_otherValue)
155
+ else:
156
+ ldError("{}:invalidJSON", # {} expanded when loadDictErrors are processed
157
+ _("The %(obj)s key \"%(key)s\" is used on multiple objects."),
158
+ modelObject=modelXbrl, obj=key, key=_errKey)
159
+ del value[DUPJSONKEY]
160
+ if DUPJSONVALUE in value:
161
+ if key in ("namespaces", ):
162
+ for _errValue, _errKey, _otherKey in value[DUPJSONVALUE]:
163
+ ldError("oimce:multipleAliasesForURI",
164
+ _("The \"%(map)s\" value \"%(uri)s\" is used on alias \"%(alias1)s\" and alias \"%(alias2)s\"."),
165
+ modelObject=modelXbrl, map=key, uri=_errValue, alias1=_errKey, alias2=_otherKey)
166
+ del value[DUPJSONVALUE]
167
+ if key in _dict: # don't put the duplicate in the dictionary but report it as error
168
+ if DUPJSONKEY not in _dict:
169
+ _dict[DUPJSONKEY] = []
170
+ _dict[DUPJSONKEY].append((key, value, _dict[key]))
171
+ else: # do put into dictionary, only report if it's a map object
172
+ _dict[key] = value
173
+ '''
174
+ if isinstance(value, str):
175
+ if value in _valueKeyDict:
176
+ if DUPJSONVALUE not in _dict:
177
+ _dict[DUPJSONVALUE] = []
178
+ _dict[DUPJSONVALUE].append((value, key, _valueKeyDict[value]))
179
+ else:
180
+ _valueKeyDict[value] = key
181
+ '''
182
+ return _dict
183
+
184
+ errPrefix = "xbrlte"
185
+ try:
186
+ if isinstance(oimFile, dict) and oimFile.get("documentInfo",{}).get("documentType") in oimTaxonomyDocTypes:
187
+ oimObject = oimFile
188
+ href = "BakedInConstants"
189
+ txFileName = href
190
+ txBase = None
191
+ else:
192
+ _file = modelXbrl.fileSource.file(oimFile, encoding="utf-8-sig")[0]
193
+ href = os.path.basename(oimFile)
194
+ txFileName = oimFile
195
+ txBase = os.path.dirname(oimFile) # import referenced taxonomies
196
+ with _file as f:
197
+ oimObject = json.load(f, object_pairs_hook=loadDict, parse_float=Decimal)
198
+ except UnicodeDecodeError as ex:
199
+ raise OIMException("{}:invalidJSON".format(errPrefix),
200
+ _("File MUST use utf-8 encoding: %(file)s, error %(error)s"),
201
+ sourceFileLine=oimFile, error=str(ex))
202
+ except json.JSONDecodeError as ex:
203
+ raise OIMException("{}:invalidJSON".format(errPrefix),
204
+ "JSON error while %(action)s, %(file)s, error %(error)s",
205
+ file=oimFile, action=currentAction, error=ex)
206
+ # schema validation
207
+ if jsonschemaValidator is None:
208
+ with io.open(OIMT_SCHEMA, mode="rt") as fh:
209
+ jsonschemaValidator = jsonschema.Draft7Validator(json.load(fh))
210
+ try:
211
+ for err in jsonschemaValidator.iter_errors(oimObject) or ():
212
+ path = []
213
+ for p in err.absolute_path:
214
+ path.append(f"[{p}]" if isinstance(p,int) else f"/{p}")
215
+ msg = err.message
216
+ error("jsonschema:oimTaxonomyError",
217
+ _("Error: %(error)s, jsonObj: %(path)s"),
218
+ sourceFileLine=href, error=msg, path="".join(path))
219
+ except (jsonschema.exceptions.SchemaError, jsonschema.exceptions._RefResolutionError, jsonschema.exceptions.UndefinedTypeCheck) as ex:
220
+ msg = str(ex)
221
+ if "PointerToNowhere" in msg:
222
+ msg = msg[:121]
223
+ error("jsonschema:schemaError",
224
+ _("Error in json schema processing: %(error)s"),
225
+ sourceFileLine=href, error=msg)
226
+ documentInfo = jsonGet(oimObject, "documentInfo", {})
227
+ documentType = jsonGet(documentInfo, "documentType")
228
+ taxonomyObj = jsonGet(oimObject, "taxonomy", {})
229
+ isReport = "facts" in oimObject # for test purposes report facts can be in json object
230
+ if not documentType:
231
+ error("oimce:unsupportedDocumentType",
232
+ _("/documentInfo/docType is missing."),
233
+ file=oimFile)
234
+ elif documentType not in oimTaxonomyDocTypes:
235
+ error("oimce:unsupportedDocumentType",
236
+ _("Unrecognized /documentInfo/docType: %(documentType)s"),
237
+ file=oimFile, documentType=documentType)
238
+ return {}
239
+
240
+ # report loadDict errors
241
+ for msgCode, msgText, kwargs in loadDictErrors:
242
+ error(msgCode.format(errPrefix), msgText, sourceFileLine=href, **kwargs)
243
+ del loadDictErrors[:]
244
+
245
+ extensionProperties = {} # key is property QName, value is property path
246
+
247
+ currentAction = "identifying Metadata objects"
248
+
249
+ # create the taxonomy document
250
+ currentAction = "creating schema"
251
+ prevErrLen = len(modelXbrl.errors) # track any xbrl validation errors
252
+ if modelXbrl: # pull loader implementation
253
+ modelXbrl.blockDpmDBrecursion = True
254
+ schemaDoc = _return = createModelDocument(
255
+ modelXbrl,
256
+ Type.SCHEMA,
257
+ txFileName,
258
+ initialComment="loaded from OIM Taxonomy {}".format(mappedUri),
259
+ documentEncoding="utf-8",
260
+ # base=txBase or modelXbrl.entryLoadingUrl
261
+ )
262
+ schemaDoc.inDTS = True
263
+ xbrlDts = castToDts(modelXbrl, isReport)
264
+ else: # API implementation
265
+ xbrlDts = ModelDts.create(
266
+ cntlr.modelManager,
267
+ Type.SCHEMA,
268
+ initialComment="loaded from OIM Taxonomy {}".format(mappedUri),
269
+ base=txBase)
270
+ _return = xbrlDts.modelDocument
271
+ if len(modelXbrl.errors) > prevErrLen:
272
+ error("oime:invalidTaxonomy",
273
+ _("Unable to obtain a valid taxonomy from URLs provided"),
274
+ sourceFileLine=href)
275
+ # first OIM Taxonomy load Baked In objects
276
+ if not xbrlDts.namedObjects and not "loadingBakedInObjects" in kwargs:
277
+ loadOIMTaxonomy(cntlr, error, warning, modelXbrl, xbrlTaxonomyObjects, "BakedInCoreObjects", loadingBakedInObjects=True, **kwargs)
278
+ loadOIMTaxonomy(cntlr, error, warning, modelXbrl, os.path.join(RESOURCES_DIR, "xbrlSpec.json"), "BakedInXbrlSpecObjects", loadingBakedInObjects=True, **kwargs)
279
+ loadOIMTaxonomy(cntlr, error, warning, modelXbrl, os.path.join(RESOURCES_DIR, "types.json"), "BakedInXbrlSpecObjects", loadingBakedInObjects=True, **kwargs)
280
+ loadOIMTaxonomy(cntlr, error, warning, modelXbrl, os.path.join(RESOURCES_DIR, "utr.json"), "BakedInXbrlSpecObjects", loadingBakedInObjects=True, **kwargs)
281
+ loadOIMTaxonomy(cntlr, error, warning, modelXbrl, os.path.join(RESOURCES_DIR, "ref.json"), "BakedInXbrlSpecObjects", loadingBakedInObjects=True, **kwargs)
282
+ loadOIMTaxonomy(cntlr, error, warning, modelXbrl, os.path.join(RESOURCES_DIR, "iso4217.json"), "BakedInXbrlSpecObjects", loadingBakedInObjects=True, **kwargs)
283
+ namespacePrefixes = {}
284
+ prefixNamespaces = {}
285
+ namespaceUrls = {}
286
+ for prefix, ns in documentInfo.get("namespaces", EMPTY_DICT).items():
287
+ if ns and prefix:
288
+ namespacePrefixes[ns] = prefix
289
+ prefixNamespaces[prefix] = ns
290
+ setXmlns(schemaDoc, prefix, ns)
291
+ if "documentNamespace" in documentInfo:
292
+ schemaDoc.targetNamespace = prefixNamespaces.get(documentInfo["documentNamespace"])
293
+ if "urlMapping" in documentInfo:
294
+ for prefix, url in documentInfo["urlMapping"].items():
295
+ namespaceUrls[prefixNamespaces.get(prefix)] = url
296
+ taxonomyName = qname(taxonomyObj.get("name"), prefixNamespaces)
297
+ if not taxonomyName:
298
+ xbrlDts.error("oime:missingQNameProperty",
299
+ _("Taxonomy must have a name (QName) property"),
300
+ sourceFileLine=href)
301
+
302
+ # check extension properties (where metadata specifies CheckPrefix)
303
+ for extPropSQName, extPropertyPath in extensionProperties.items():
304
+ extPropPrefix = extPropSQName.partition(":")[0]
305
+ if extPropPrefix not in prefixNamespaces:
306
+ error("oimte:unboundPrefix",
307
+ _("The extension property QName prefix was not defined in namespaces: %(extensionProperty)s."),
308
+ sourceFileLine=href, extensionProperty=extPropertyPath)
309
+
310
+ for iImpTxmy, impTxmyObj in enumerate(taxonomyObj.get("importedTaxonomies", EMPTY_LIST)):
311
+ if qnXbrlLabelObj in getattr(impTxmyObj, "includeObjectTypes",()):
312
+ impTxmyObj.includeObjectTypes.delete(qnXbrlLabelObj)
313
+ xbrlDts.error("oimte:invalidObjectType",
314
+ _("/taxonomy/importedTaxonomies[%(iImpTxmy)s] must not have a label object in the includeObjectTypes property"),
315
+ sourceFileLine=href, index=iImpTxmy)
316
+ impTxmyName = qname(impTxmyObj.get("taxonomyName"), prefixNamespaces)
317
+ if impTxmyName:
318
+ ns = impTxmyName.namespaceURI
319
+ # if already imported ignore it (for now)
320
+ if ns not in xbrlDts.namespaceDocs and followImport:
321
+ url = namespaceUrls.get(ns)
322
+ if url:
323
+ load(xbrlDts, url, base=oimFile, isDiscovered=schemaDoc.inDTS, isIncluded=kwargs.get("isIncluded"), namespace=ns,
324
+ includeObjects=(qname(qn, prefixNamespaces) for qn in impTxmyObj.get("includeObjects",())) or None,
325
+ includeObjectTypes=(qname(qn, prefixNamespaces) for qn in impTxmyObj.get("includeObjectTypes",())) or None,
326
+ excludeLabels=impTxmyObj.get("excludeLabels",False),
327
+ followImport=impTxmyObj.get("followImport",True))
328
+ else:
329
+ xbrlDts.error("oime:missingQNameProperty",
330
+ _("/taxonomy/importedTaxonomies[%(iImpTxmy)s] must have a taxonomyName (QName) property"),
331
+ sourceFileLine=href, index=iImpTxmy)
332
+ def singular(name):
333
+ if name.endswith("ies"):
334
+ return name[:-3] + "y"
335
+ elif name.endswith("s"):
336
+ return name[:-1]
337
+ return name
338
+ def plural(name):
339
+ if name.endswith("y"):
340
+ return name[:-1] + "ies"
341
+ else:
342
+ return name + "s"
343
+ def addToCol(oimParentObj, objName, newObj, key):
344
+ parentCol = getattr(oimParentObj, plural(objName), None) # parent collection object
345
+ if colObj is not None:
346
+ if key:
347
+ colObj[key] = newObj
348
+ else:
349
+ colObj.add(newObj)
350
+
351
+ jsonEltsNotInObjClass = []
352
+ jsonEltsReqdButMissing = []
353
+ namedObjectDuplicates = defaultdict(OrderedSet)
354
+ def createTaxonomyObject(jsonObj, oimParentObj, keyClass, objClass, newObj, pathParts):
355
+ keyValue = None
356
+ relatedNames = [] # to tag an object with labels or references
357
+ unexpectedJsonProps = set(jsonObj.keys())
358
+ for propName, propType in getattr(objClass, "__annotations__", EMPTY_DICT).items():
359
+ if isinstance(propType, GenericAlias):
360
+ propClass = propType.__origin__ # collection type such as OrderedSet, dict
361
+ collectionProp = propClass()
362
+ setattr(newObj, propName, collectionProp) # fresh new dict or OrderedSet (even if no contents for it)
363
+ else:
364
+ propClass = propType
365
+ if propName in jsonObj:
366
+ unexpectedJsonProps.remove(propName)
367
+ if propName == "labels" and excludeLabels:
368
+ continue
369
+ jsonValue = jsonObj[propName]
370
+ if isinstance(propType, GenericAlias):
371
+ if len(propType.__args__) == 2: # dict
372
+ _keyClass = propType.__args__[0] # class of key such as QNameKey
373
+ eltClass = propType.__args__[1] # class of collection elements such as XbrlConcept
374
+ elif len(propType.__args__) == 1: # set such as OrderedSet or list
375
+ _keyClass = None
376
+ eltClass = propType.__args__[0]
377
+ if isinstance(jsonValue, list):
378
+ for iObj, listObj in enumerate(jsonValue):
379
+ if isinstance(eltClass, str) or getattr(eltClass, "__name__", "").startswith("Xbrl"): # nested Xbrl objects
380
+ if isinstance(listObj, dict):
381
+ # this handles lists of dict objects. For dicts of key-value dict objects see above.
382
+ createTaxonomyObjects(propName, listObj, newObj, pathParts + [f'{propName}[{iObj}]'])
383
+ else:
384
+ error("xbrlte:invalidObjectType",
385
+ _("Object expected but non-object found: %(listObj)s, jsonObj: %(path)s"),
386
+ sourceFileLine=href, listObj=listObj, path=f"{'/'.join(pathParts + [f'{propName}[{iObj}]'])}")
387
+ else: # collection contains ordinary values
388
+ if eltClass in (QName, QNameKeyType, SQName, SQNameKeyType):
389
+ listObj = qname(listObj, prefixNamespaces)
390
+ if listObj is None:
391
+ error("xbrlte:invalidQName",
392
+ _("QName is invalid: %(qname)s, jsonObj: %(path)s"),
393
+ sourceFileLine=href, qname=jsonObj[propName], path=f"{'/'.join(pathParts + [f'{propName}[{iObj}]'])}")
394
+ continue # skip this property
395
+ if propName == "relatedNames":
396
+ relatedNames.append(listObj)
397
+ if propClass in (set, OrderedSet):
398
+ collectionProp.add(listObj)
399
+ else:
400
+ collectionProp.append(listObj)
401
+ elif isinstance(jsonValue, dict) and keyClass:
402
+ for iObj, (valKey, valVal) in enumerate(jsonValue.items()):
403
+ if get_origin(_keyClass) is Union:
404
+ if QName in _keyClass.__args__ and ":" in valKey:
405
+ _valKey = qname(listObj, prefixNamespaces)
406
+ if _valKey is None:
407
+ error("xbrlte:invalidQName",
408
+ _("QName is invalid: %(qname)s, jsonObj: %(path)s"),
409
+ sourceFileLine=href, qname=_valKey, path=f"{'/'.join(pathParts + [f'{propName}[{iObj}]'])}")
410
+ continue # skip this property
411
+ elif str in _keyClass.__args__:
412
+ _valKey = valKey
413
+ else:
414
+ continue
415
+ elif isinstance(_keyClass, str):
416
+ _valKey = valKey
417
+ else:
418
+ continue
419
+ collectionProp[_valKey] = valVal
420
+ elif isinstance(propType, _UnionGenericAlias) and propType.__args__[-1] == type(None) and isinstance(jsonValue,dict): # optional embdded object
421
+ createTaxonomyObjects(propName, jsonValue, newObj, pathParts + [propName]) # object property
422
+ else:
423
+ optional = False
424
+ if isinstance(propType, _UnionGenericAlias) and propType.__args__[-1] == type(None):
425
+ propType = propType.__args__[0] # scalar property
426
+ optional = True
427
+ if propType == QNameAt:
428
+ jsonValue, _sep, atSuffix = jsonValue.partition("@")
429
+ if propType in (QName, QNameKeyType, SQName, SQNameKeyType, QNameAt):
430
+ jsonValue = qname(jsonValue, prefixNamespaces)
431
+ if jsonValue is None:
432
+ error("xbrlte:invalidQName",
433
+ _("QName is invalid: %(qname)s, jsonObj: %(path)s"),
434
+ sourceFileLine=href, qname=jsonObj[propName], path=f"{'/'.join(pathParts + [propName])}")
435
+ if optional:
436
+ jsonValue = None
437
+ else:
438
+ # TBD: set newObj to invalid so it isn't usable (it was already set in collection objects above when being created)
439
+ return # skip this nested object entirely
440
+ elif propType == QNameAt:
441
+ jsonValue = QNameAt(jsonValue.prefix, jsonValue.namespaceURI, jsonValue.localName, atSuffix)
442
+ if propName == "relatedName":
443
+ relatedNames.append(jsonValue)
444
+ setattr(newObj, propName, jsonValue)
445
+ if (keyClass and keyClass == propType) or (not keyClass and propType in (QNameKeyType, SQNameKeyType)):
446
+ keyValue = jsonValue # e.g. the QNAme of the new object for parent object collection
447
+ elif propType in (type(oimParentObj), type(oimParentObj).__name__): # propType may be a TypeAlias which is a string name of class
448
+ setattr(newObj, propName, oimParentObj)
449
+ elif (((get_origin(propType) is Union) or isinstance(get_origin(propType), type(Union))) and # Optional[ ] type
450
+ propType.__args__[-1] in (type(None), DefaultTrue, DefaultFalse, DefaultZero)):
451
+ setattr(newObj, propName, {type(None): None, DefaultTrue: True, DefaultFalse: False, DefaultZero:0}[propType.__args__[-1]]) # use first of union for prop value creation
452
+ else: # absent json element
453
+ if not propClass in (dict, set, OrderedSet, OrderedDict):
454
+ jsonEltsReqdButMissing.append(f"{'/'.join(pathParts + [propName])}")
455
+ setattr(newObj, propName, None) # not defaultable but set to None anyway
456
+ if unexpectedJsonProps:
457
+ for propName in unexpectedJsonProps:
458
+ jsonEltsNotInObjClass.append(f"{'/'.join(pathParts + [propName])}={jsonObj.get(propName,'(absent)')}")
459
+ if isinstance(newObj, XbrlReferencableTaxonomyObject):
460
+ if keyValue in xbrlDts.namedObjects:
461
+ namedObjectDuplicates[keyValue].add(newObj)
462
+ namedObjectDuplicates[keyValue].add(xbrlDts.namedObjects[keyValue])
463
+ else:
464
+ xbrlDts.namedObjects[keyValue] = newObj
465
+ elif isinstance(newObj, XbrlTaxonomyTagObject) and relatedNames:
466
+ for relatedQn in relatedNames:
467
+ xbrlDts.tagObjects[relatedQn].append(newObj)
468
+ return keyValue
469
+
470
+ def createTaxonomyObjects(jsonKey, jsonObj, oimParentObj, pathParts):
471
+ # find collection owner in oimParentObj
472
+ for objName in (jsonKey, plural(jsonKey)):
473
+ ownrPropType = getattr(oimParentObj, "__annotations__", EMPTY_DICT).get(objName)
474
+ if ownrPropType is not None:
475
+ break
476
+ if ownrPropType is not None:
477
+ ownrProp = getattr(oimParentObj, objName, None) # owner collection or property
478
+ if ownrPropType is not None:
479
+ if isinstance(ownrPropType, GenericAlias):
480
+ ownrPropClass = ownrPropType.__origin__ # collection type such as OrderedSet, dict
481
+ if len(ownrPropType.__args__) == 2: # dict
482
+ keyClass = ownrPropType.__args__[0] # class of key such as QNameKey
483
+ objClass = ownrPropType.__args__[1] # class of obj such as XbrlConcept
484
+ elif len(ownrPropType.__args__) == 1: # set such as OrderedSet or list
485
+ keyClass = None
486
+ objClass = ownrPropType.__args__[0]
487
+ if ownrProp is None: # the parent object's dict or OrderedSet doesn't exist yet
488
+ ownrProp = ownrPropClass()
489
+ setattr(oimParentObj, propName, ownrProp) # fresh new dict or OrderedSet
490
+ if objClass == XbrlFact and isinstance(jsonObj, dict): # this is a JSON key-value dict going into a dict, for lists of dicts see below
491
+ for id, value in jsonObj.items():
492
+ newObj = objClass(dtsObjectIndex=len(xbrlDts.xbrlObjects))
493
+ xbrlDts.xbrlObjects.append(newObj)
494
+ newObj.id = id
495
+ createTaxonomyObject(value, oimParentObj, str, objClass, newObj, pathParts + [f"[{id}]"])
496
+ ownrProp[id] = newObj
497
+ return None # facts not returnable
498
+ elif isinstance(ownrPropType, _UnionGenericAlias) and ownrPropType.__args__[-1] == type(None): # optional nested object
499
+ keyClass = None
500
+ objClass = ownrPropType.__args__[0]
501
+ else: # parent is just an object field, not a collection
502
+ objClass = ownrPropType # e.g just a Concept but no owning collection
503
+ if objClass == XbrlTaxonomyType:
504
+ objClass = XbrlTaxonomy
505
+ if issubclass(objClass, XbrlObject):
506
+ newObj = objClass(dtsObjectIndex=len(xbrlDts.xbrlObjects)) # e.g. this is the new Concept
507
+ xbrlDts.xbrlObjects.append(newObj)
508
+ classCountProp = f"_{objClass.__name__}Count"
509
+ classIndex = getattr(oimParentObj, classCountProp, 0)
510
+ setattr(newObj, "_classIndex", classIndex)
511
+ setattr(oimParentObj, classCountProp,classIndex+1)
512
+ else:
513
+ newObj = objClass() # e.g. XbrlProperty
514
+ keyValue = createTaxonomyObject(jsonObj, oimParentObj, keyClass, objClass, newObj, pathParts)
515
+ if isinstance(ownrPropType, GenericAlias):
516
+ if len(ownrPropType.__args__) == 2:
517
+ if keyValue:
518
+ ownrProp[keyValue] = newObj
519
+ elif isinstance(ownrProp, (set, OrderedSet)):
520
+ ownrProp.add(newObj)
521
+ else:
522
+ ownrProp.append(newObj)
523
+ elif isinstance(ownrPropType, _UnionGenericAlias) and ownrPropType.__args__[-1] == type(None): # optional nested object
524
+ setattr(oimParentObj, pathParts[-1], newObj)
525
+ return newObj
526
+ return None
527
+
528
+ newTxmy = createTaxonomyObjects("taxonomy", oimObject["taxonomy"], xbrlDts, ["", "taxonomy"])
529
+ if isReport:
530
+ createTaxonomyObjects("facts", oimObject["facts"], xbrlDts, ["", "facts"])
531
+
532
+ if jsonEltsNotInObjClass:
533
+ error("arelle:undeclaredOimTaxonomyJsonElements",
534
+ _("Json file has elements not declared in Arelle object classes: %(undeclaredElements)s"),
535
+ sourceFileLine=href, undeclaredElements=", ".join(jsonEltsNotInObjClass))
536
+ if jsonEltsReqdButMissing:
537
+ error("arelle:missingOimTaxonomyJsonElements",
538
+ _("Json file missing required elements: %(missingElements)s"),
539
+ sourceFileLine=href, missingElements=", ".join(jsonEltsReqdButMissing))
540
+
541
+ for qname, dupObjs in namedObjectDuplicates.items():
542
+ xbrlDts.error("oimte:duplicateObjects",
543
+ _("Multiple referenceable objects have the same name: %(qname)s"),
544
+ xbrlObject=dupObjs, qname=qname)
545
+
546
+ if newTxmy is not None:
547
+ for impTxmy in newTxmy.importedTaxonomies:
548
+ if impTxmy.taxonomyName not in xbrlDts.taxonomies:
549
+ # is it present in urlMapping?
550
+ url = namespaceUrls.get(impTxmy.taxonomyName.prefix)
551
+ if url:
552
+ loadOIMTaxonomy(cntlr, error, warning, modelXbrl, url, impTxmy.taxonomyName.localName)
553
+
554
+ xbrlDts.namespaceDocs[taxonomyName.namespaceURI].append(schemaDoc)
555
+
556
+ return schemaDoc
557
+
558
+ ####################### convert to XML Taxonomy
559
+
560
+
561
+ QN_ANNOTATION = qname("{http://www.w3.org/2001/XMLSchema}xs:annotation")
562
+ QN_APPINFO = qname("{http://www.w3.org/2001/XMLSchema}xs:appinfo")
563
+ QN_IMPORT = qname("{http://www.w3.org/2001/XMLSchema}xs:import")
564
+ QN_ELEMENT = qname("{http://www.w3.org/2001/XMLSchema}xs:element")
565
+ QN_PERIOD_TYPE = qname("{http://www.xbrl.org/2003/instance}xbrli:periodType")
566
+ QN_BALANCE = qname("{http://www.xbrl.org/2003/instance}xbrli:balance")
567
+ QN_SUBS_GROUP = qname("{http://www.w3.org/2001/XMLSchema}xs:substitutionGroup")
568
+ QN_ROLE_TYPE = qname("{http://www.xbrl.org/2003/linkbase}link:roleType")
569
+ QN_ROLE_TYPE = qname("{http://www.xbrl.org/2003/linkbase}link:roleType")
570
+ QN_DEFINITION = qname("{http://www.xbrl.org/2003/linkbase}link:definition")
571
+ QN_USED_ON = qname("{http://www.xbrl.org/2003/linkbase}link:usedOn")
572
+
573
+ # convert into XML Taxonomy
574
+ schemaElt = schemaDoc.xmlRootElement
575
+ annotationElt = addChild(schemaElt, QN_ANNOTATION)
576
+ appinfoElt = addChild(annotationElt, QN_APPINFO)
577
+
578
+ if not any(t["namespace"] == "http://www.xbrl.org/2003/instance" for t in taxonomyRefs):
579
+ taxonomyRefs.insert(0, {"namespace":"http://www.xbrl.org/2003/instance", "entryPoint":"http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd"})
580
+ if "cubes" in taxonomyObj and not any(t["namespace"] == "http://xbrl.org/2005/xbrldt" for t in taxonomyRefs):
581
+ taxonomyRefs.insert(0, {"namespace":"http://xbrl.org/2005/xbrldt", "entryPoint": "http://www.xbrl.org/2005/xbrldt-2005.xsd"})
582
+ for txmyRefObj in taxonomyRefs:
583
+ schemaDoc.addDocumentReference(
584
+ loadModelDocument(modelXbrl, txmyRefObj.get("entryPoint"), txBase, namespace=txmyRefObj.get("namespace"), isDiscovered=True),
585
+ "import")
586
+ addChild(schemaElt, QN_IMPORT, attributes={
587
+ "namespace": txmyRefObj.get("namespace"),
588
+ "schemaLocation": txmyRefObj.get("entryPoint")})
589
+
590
+ # additional namespaces needed
591
+ for prefix, ns in (("xlink", "http://www.w3.org/1999/xlink"),
592
+ ("ref", "http://www.xbrl.org/2006/ref"),
593
+ ("xbrldt", "http://xbrl.org/2005/xbrldt"),
594
+ ("xbrl", xbrl)):
595
+ if ns not in namespacePrefixes:
596
+ namespacePrefixes[ns] = prefix
597
+ prefixNamespaces[prefix] = ns
598
+ setXmlns(schemaDoc, prefix, ns)
599
+
600
+
601
+
602
+ ##### Move to end
603
+ currentAction = "identifying default dimensions"
604
+ if modelXbrl is not None:
605
+ ValidateXbrlDimensions.loadDimensionDefaults(modelXbrl) # needs dimension defaults
606
+
607
+ currentAction = "creating concepts"
608
+ conceptObjs = taxonomyObj.get("concepts", [])
609
+ conceptNum = 0 # for synthetic concept number
610
+ syntheticConceptFormat = "_f{{:0{}}}".format(int(log10(len(conceptObjs) or 1))) #want
611
+
612
+ numConceptCreationXbrlErrors = 0
613
+
614
+ for conceptI, conceptObj in enumerate(conceptObjs):
615
+ nillable = conceptObj.get("nillable", True)
616
+ periodType = conceptObj.get("periodType", True)
617
+ balance = conceptObj.get("balance", None)
618
+ abstract = conceptObj.get("abstract", None)
619
+ nillable = conceptObj.get("abstract", None)
620
+ name = qname(conceptObj.get("name", ""), prefixNamespaces)
621
+ if name:
622
+ dataType = qname(conceptObj.get("dataType", ""), prefixNamespaces)
623
+ substitutionGroup = qname(conceptObj.get("substitutionGroup", ""), prefixNamespaces)
624
+ attributes = {"id": f"{name.prefix}_{name.localName}",
625
+ "name": name.localName}
626
+ if dataType:
627
+ attributes["type"] = str(dataType)
628
+ if periodType:
629
+ attributes[QN_PERIOD_TYPE.clarkNotation] = periodType
630
+ if balance:
631
+ attributes[QN_BALANCE.clarkNotation] = balance
632
+ if abstract is not None:
633
+ attributes["abstract"] = str(abstract).lower()
634
+ if nillable is not None:
635
+ attributes["nillable"] = str(nillable).lower()
636
+ attributes["substitutionGroup"] = str(substitutionGroup)
637
+
638
+ conceptElt = addChild(schemaElt,
639
+ QN_ELEMENT,
640
+ attributes=attributes)
641
+ else:
642
+ error("oimte:invalidConceptName",
643
+ "%(path)s concept name %(name)s is not valid",
644
+ modelObject=modelXbrl, path=f"taxonomy/concept[{conceptI+1}]", name=conceptObj.get("name", ""))
645
+
646
+ # find which linkbases networkURIs are used on
647
+ usedOn = defaultdict(set)
648
+ for dimObj in taxonomyObj.get("cubes", []) + taxonomyObj.get("domains", []):
649
+ networkURI = dimObj.get("networkURI", "")
650
+ if networkURI:
651
+ usedOn[networkURI].add("link:definitionLink")
652
+ for networkObj in taxonomyObj.get("networks", []) + taxonomyObj.get("domains", []):
653
+ networkURI = networkObj.get("networkURI", "")
654
+ if networkURI:
655
+ for relObj in networkObj.get("relationships", []):
656
+ relType = relObj.get("relationshipType", "")
657
+ if relType == XbrlConst.parentChild:
658
+ usedOn[networkURI].add("link:presentationLink")
659
+ elif relType in XbrlConst.summationItems:
660
+ usedOn[networkURI].add("link:calculationLink")
661
+ elif relType in (XbrlConst.requiresElement, XbrlConst.generalSpecial):
662
+ usedOn[networkURI].add("link:definitionLink")
663
+ for networkObj in taxonomyObj.get("cubes", []):
664
+ networkURI = networkObj.get("networkURI", "")
665
+ if networkURI and networkObj.get("dimensions", []):
666
+ usedOn[networkURI].add("link:definitionLink")
667
+
668
+ # define role types
669
+ locallyDefinedRoles = OrderedDict() # URI: {name, description, usedOns}
670
+ # networkURI can appear multiple times in different places, infer a single role definition from all
671
+ for objI, networkObj in enumerate(taxonomyObj.get("networks", []) + taxonomyObj.get("domains", [])):
672
+ networkURI = networkObj.get("networkURI", "")
673
+ if networkURI in locallyDefinedRoles:
674
+ roleDef = locallyDefinedRoles[networkURI]
675
+ else:
676
+ locallyDefinedRoles[networkURI] = roleDef = {}
677
+ if "name" in networkObj:
678
+ roleDef["name"] = networkObj["name"]
679
+ if "description" in networkObj:
680
+ roleDev["description"] = networkObj["description"]
681
+ locallyDefinedRoleHrefs = {}
682
+ for objI, (networkURI, networkObj) in enumerate(locallyDefinedRoles.items()):
683
+ name = networkObj.get("name", f"_roleType_{objI+1}")
684
+ description = networkObj.get("description", "")
685
+ locallyDefinedRoleHrefs[networkURI] = f"#{name}"
686
+
687
+ roleTypeElt = addChild(appinfoElt, QN_ROLE_TYPE,
688
+ attributes={"id": name,
689
+ "roleURI": networkURI})
690
+ if description:
691
+ addChild(roleTypeElt, QN_DEFINITION, text=description)
692
+ for u in usedOn[networkURI]:
693
+ addChild(roleTypeElt, QN_USED_ON, text=u)
694
+ modelXbrl.roleTypes[networkURI].append(roleTypeElt)
695
+
696
+ # create ELRs
697
+ lbElts = []
698
+ xlinkLabelFormat = "{{}}{{:0{}}}".format(int(log10(len(taxonomyObj.get("labels", [])) or 1)))
699
+ locXlinkLabels = {}
700
+ hrefsNsWithoutPrefix = defaultdict(list)
701
+ def locXlinkLabel(elrElt, conceptRef, path):
702
+ if conceptRef not in locXlinkLabels:
703
+ qn = qname(conceptRef, prefixNamespaces)
704
+ if qn is None:
705
+ error("oimte:invalidConceptRef",
706
+ "%(path)s concept reference %(conceptRef)s is not a defined prefix or not a valid qname",
707
+ modelObject=modelXbrl, path=path, conceptRef=conceptRef)
708
+ elif qn.namespaceURI not in namespacePrefixes:
709
+ hrefsNsWithoutPrefix[qn.namespaceURI or "(none)"].append(path)
710
+ concept = modelXbrl.qnameConcepts.get(qn)
711
+ xlinkLabel = xlinkLabelFormat.format("loc", len(locXlinkLabels)+1)
712
+ locXlinkLabels[conceptRef] = xlinkLabel
713
+ if concept is not None:
714
+ addChild(elrElt, XbrlConst.qnLinkLoc,
715
+ attributes={"{http://www.w3.org/1999/xlink}label": xlinkLabel,
716
+ "{http://www.w3.org/1999/xlink}href": f"{concept.modelDocument.uri}#{concept.id}",
717
+ "{http://www.w3.org/1999/xlink}type": "locator"})
718
+ else:
719
+ error("oimte:invalidConceptQName",
720
+ "%(path)s concept reference %(conceptRef)s, qname %(qname)s, does not correspond to a defined concept",
721
+ modelObject=modelXbrl, path=path, qname=qn, conceptRef=conceptRef)
722
+ return locXlinkLabels[conceptRef]
723
+ lbElt = addChild(appinfoElt, XbrlConst.qnLinkLinkbase,
724
+ attributes={"id":"_labels_"})
725
+ lbElts.append(lbElt)
726
+ elrElt = addChild(lbElt, XbrlConst.qnLinkLabelLink,
727
+ attributes={"{http://www.w3.org/1999/xlink}role": XbrlConst.defaultLinkRole,
728
+ "{http://www.w3.org/1999/xlink}type": "extended"})
729
+ for labelI, labelObj in enumerate(taxonomyObj.get("labels", [])):
730
+ labelType = labelObj.get("labelType", "")
731
+ value = labelObj.get("value", "")
732
+ language = labelObj.get("language", "")
733
+ relatedID = labelObj.get("relatedID", [])
734
+ xlinkLbl = xlinkLabelFormat.format("label", labelI+1)
735
+ addChild(elrElt, XbrlConst.qnLinkLabel, text=value,
736
+ attributes={# "id": xlinkLbl,
737
+ "{http://www.w3.org/1999/xlink}label": xlinkLbl,
738
+ "{http://www.w3.org/1999/xlink}role": labelType,
739
+ "{http://www.w3.org/1999/xlink}lang": language,
740
+ "{http://www.w3.org/1999/xlink}type": "resource"})
741
+ for refI, ref in enumerate(relatedID):
742
+ addChild(elrElt, XbrlConst.qnLinkLabelArc,
743
+ attributes={"{http://www.w3.org/1999/xlink}from": locXlinkLabel(elrElt, ref, f"label[{labelI}]/relatedID[{refI}]"),
744
+ "{http://www.w3.org/1999/xlink}to": xlinkLbl,
745
+ "{http://www.w3.org/1999/xlink}arcrole": XbrlConst.conceptLabel,
746
+ "{http://www.w3.org/1999/xlink}type": "arc"})
747
+
748
+ def addRoleRefs(lbElt, roles, arcroles):
749
+ firstElr = lbElt[0]
750
+ for role in sorted(roles):
751
+ if role in locallyDefinedRoleHrefs:
752
+ href = locallyDefinedRoleHrefs[role]
753
+ addChild(lbElt, XbrlConst.qnLinkRoleRef,
754
+ beforeSibling=firstElr,
755
+ attributes={
756
+ "{http://www.w3.org/1999/xlink}roleURI": role,
757
+ "{http://www.w3.org/1999/xlink}type": "simple",
758
+ "{http://www.w3.org/1999/xlink}href": href})
759
+ for arcrole in sorted(arcroles):
760
+ if arcrole.startswith("http://xbrl.org/int/dim/arcrole"):
761
+ href = f"http://www.xbrl.org/2005/xbrldt-2005.xsd#{os.path.basename(arcrole)}"
762
+ addChild(lbElt, XbrlConst.qnLinkArcroleRef,
763
+ beforeSibling=firstElr,
764
+ attributes={
765
+ "{http://www.w3.org/1999/xlink}arcroleURI": arcrole,
766
+ "{http://www.w3.org/1999/xlink}type": "simple",
767
+ "{http://www.w3.org/1999/xlink}href": href})
768
+ roles.clear()
769
+ arcroles.clear()
770
+
771
+ domainIDHypercubeQNames = {}
772
+ domainIDPrimaryDimensions = {}
773
+ domainIDPeriodDimensions = {}
774
+ lbElt = addChild(appinfoElt, XbrlConst.qnLinkLinkbase)
775
+ lbElts.append(lbElt)
776
+ lbEltRoleRefs = set()
777
+ lbEltArcroleRefs = set()
778
+ for cubeI, cubeObj in enumerate(taxonomyObj.get("cubes", [])):
779
+ locXlinkLabels.clear() # separate locs per elr
780
+ networkURI = cubeObj.get("networkURI", "") # ELR
781
+ hypercubeConcept = cubeObj.get("name", "") # hypercube concept clark name
782
+ cubeType = cubeObj.get("cubeType", "")
783
+ elrElt = addChild(lbElt, XbrlConst.qnLinkDefinitionLink,
784
+ attributes={"{http://www.w3.org/1999/xlink}role": networkURI,
785
+ "{http://www.w3.org/1999/xlink}type": "extended"})
786
+ lbEltRoleRefs.add(networkURI)
787
+ for dimI, dimObj in enumerate(cubeObj.get("dimensions", [])):
788
+ dimensionType = dimObj.get("dimensionType", "")
789
+ domainID = dimObj.get("domainID", "")
790
+ dimensionType = dimObj.get("dimensionType", "")
791
+ dimensionConcept = dimObj.get("dimensionConcept", "")
792
+ if dimensionConcept == "xbrl:PrimaryDimension":
793
+ domainIDPrimaryDimensions[domainID] = hypercubeConcept
794
+ elif dimensionConcept == "xbrl:PeriodDimension":
795
+ domainIDPeriodDimensions[domainID] = hypercubeConcept
796
+ else:
797
+ domainIDHypercubeQNames[domainID] = hypercubeConcept
798
+ addChild(elrElt, XbrlConst.qnLinkDefinitionArc,
799
+ attributes={"{http://www.w3.org/1999/xlink}from": locXlinkLabel(elrElt, hypercubeConcept, f"cube[{cubeI}]/cube.name"),
800
+ "{http://www.w3.org/1999/xlink}to": locXlinkLabel(elrElt, dimensionConcept, f"cube[{cubeI}]/dimension[{dimI}]/dimensionConcept"),
801
+ "{http://www.w3.org/1999/xlink}arcrole": XbrlConst.hypercubeDimension,
802
+ "{http://www.w3.org/1999/xlink}type": "arc"})
803
+ lbEltArcroleRefs.add(XbrlConst.hypercubeDimension)
804
+
805
+ for domI, domObj in enumerate(taxonomyObj.get("domains", [])):
806
+ locXlinkLabels.clear() # separate locs per elr
807
+ networkURI = domObj.get("networkURI", "")
808
+ domainID = domObj.get("domainID", "")
809
+ domainConcept = domObj.get("domainConcept", "")
810
+ relationships = domObj.get("relationships", [])
811
+ elrElt = addChild(lbElt, XbrlConst.qnLinkDefinitionLink,
812
+ attributes={"{http://www.w3.org/1999/xlink}role": networkURI,
813
+ "{http://www.w3.org/1999/xlink}type": "extended"})
814
+ lbEltRoleRefs.add(networkURI)
815
+ if domainID not in domainIDPrimaryDimensions and domainID not in domainIDPeriodDimensions:
816
+ addChild(elrElt, XbrlConst.qnLinkDefinitionArc,
817
+ attributes={"{http://www.w3.org/1999/xlink}from": locXlinkLabel(elrElt, domainIDHypercubeQNames.get(domainID), f"domain[{domI}]/domainID"),
818
+ "{http://www.w3.org/1999/xlink}to": locXlinkLabel(elrElt, domainConcept, f"domain[{domI}]/domainConcept"),
819
+ "{http://www.w3.org/1999/xlink}arcrole": XbrlConst.dimensionDomain,
820
+ "{http://www.w3.org/1999/xlink}type": "arc"})
821
+ lbEltArcroleRefs.add(XbrlConst.dimensionDomain)
822
+ for relI, relObj in enumerate(relationships):
823
+ source = relObj.get("source", "")
824
+ target = relObj.get("target", "")
825
+ order = relObj.get("order", "1")
826
+ if domainID in domainIDPrimaryDimensions and relI == 0:
827
+ addChild(elrElt, XbrlConst.qnLinkDefinitionArc,
828
+ attributes={"{http://www.w3.org/1999/xlink}from": locXlinkLabel(elrElt, target, f"domain[{domI}]/relationship[{relI}/target"),
829
+ "{http://www.w3.org/1999/xlink}to": locXlinkLabel(elrElt, domainIDPrimaryDimensions.get(domainID), f"domain[{domI}]/domainID"),
830
+ "{http://www.w3.org/1999/xlink}arcrole": XbrlConst.all,
831
+ "{http://www.w3.org/1999/xlink}type": "arc",
832
+ # TBD - determine values dynamically from taxonomy and authority
833
+ "{http://xbrl.org/2005/xbrldt}closed": "true",
834
+ "{http://xbrl.org/2005/xbrldt}contextElement": "segment"})
835
+ lbEltArcroleRefs.add(XbrlConst.all)
836
+ else:
837
+ addChild(elrElt, XbrlConst.qnLinkDefinitionArc,
838
+ attributes={"{http://www.w3.org/1999/xlink}from": locXlinkLabel(elrElt, source, f"domain[{domI}]/relationship[{relI}/source"),
839
+ "{http://www.w3.org/1999/xlink}to": locXlinkLabel(elrElt, target, f"domain[{domI}]/relationship[{relI}/target"),
840
+ "{http://www.w3.org/1999/xlink}arcrole": XbrlConst.domainMember,
841
+ "{http://www.w3.org/1999/xlink}type": "arc",
842
+ "order": order})
843
+ lbEltArcroleRefs.add(XbrlConst.domainMember)
844
+ addRoleRefs(lbElt, lbEltRoleRefs, lbEltArcroleRefs)
845
+
846
+ lbElt = addChild(appinfoElt, XbrlConst.qnLinkLinkbase)
847
+ lbElts.append(lbElt)
848
+ for networkI, networkObj in enumerate(taxonomyObj.get("networks", [])):
849
+ locXlinkLabels.clear() # separate locs per elr
850
+ networkURI = networkObj.get("networkURI", "")
851
+ elrElt = addChild(lbElt, XbrlConst.qnLinkDefinitionLink,
852
+ attributes={"{http://www.w3.org/1999/xlink}role": networkURI,
853
+ "{http://www.w3.org/1999/xlink}type": "extended"})
854
+ lbEltRoleRefs.add(networkURI)
855
+ relationships = networkObj.get("relationships", [])
856
+ for relI, relObj in enumerate(relationships):
857
+ source = relObj.get("source", "")
858
+ target = relObj.get("target", "")
859
+ order = relObj.get("order", None)
860
+ relationshipType = relObj.get("relationshipType", "")
861
+ preferredLabel = relObj.get("preferredLabel", None)
862
+ weight = relObj.get("weight", None)
863
+ attributes = {"{http://www.w3.org/1999/xlink}from": locXlinkLabel(elrElt, source, f"network[{networkI}]/relationship[{relI}/source"),
864
+ "{http://www.w3.org/1999/xlink}to": locXlinkLabel(elrElt, target, f"network[{networkI}]/relationship[{relI}/target"),
865
+ "{http://www.w3.org/1999/xlink}arcrole": relationshipType,
866
+ "{http://www.w3.org/1999/xlink}type": "arc"}
867
+ lbEltArcroleRefs.add(relationshipType)
868
+ if weight is not None:
869
+ attributes["weight"] = weight
870
+ if preferredLabel is not None:
871
+ attributes["preferredLabel"] = preferredLabel
872
+ addChild(elrElt, XbrlConst.qnLinkDefinitionArc, attributes)
873
+ addRoleRefs(lbElt, lbEltRoleRefs, lbEltArcroleRefs)
874
+
875
+ locXlinkLabels.clear() # separate locs per elr
876
+ elrElt = addChild(lbElt, XbrlConst.qnLinkReferenceLink,
877
+ attributes={"{http://www.w3.org/1999/xlink}role": XbrlConst.defaultLinkRole,
878
+ "{http://www.w3.org/1999/xlink}type": "extended"})
879
+ for refI, refObj in enumerate(taxonomyObj.get("references", [])):
880
+ referenceType = refObj.get("referenceType", "")
881
+ relatedIDs = refObj.get("relatedID", "")
882
+ xlinkLbl = xlinkLabelFormat.format("reference", refI+1)
883
+ refElt = addChild(elrElt, XbrlConst.qnLinkReference,
884
+ attributes={"{http://www.w3.org/1999/xlink}label": xlinkLbl,
885
+ "{http://www.w3.org/1999/xlink}role": referenceType,
886
+ "{http://www.w3.org/1999/xlink}type": "resource"})
887
+ for partObj in sorted(refObj.get("parts", []), key=lambda o:refObj.get("order", 0)):
888
+ name = partObj.get("name", "")
889
+ value = partObj.get("value", "")
890
+ partI = partObj.get("order", "")
891
+ addChild(refElt, qname(name, prefixNamespaces), text=value)
892
+ for relatedID in relatedIDs:
893
+ addChild(elrElt, XbrlConst.qnLinkLabelArc,
894
+ attributes={"{http://www.w3.org/1999/xlink}from": locXlinkLabel(elrElt, relatedID, f"reference[{refI}]/relatedID"),
895
+ "{http://www.w3.org/1999/xlink}to": xlinkLbl,
896
+ "{http://www.w3.org/1999/xlink}arcrole": XbrlConst.conceptReference,
897
+ "{http://www.w3.org/1999/xlink}type": "arc"})
898
+ lbEltArcroleRefs.add(XbrlConst.conceptReference)
899
+ addRoleRefs(lbElt, lbEltRoleRefs, lbEltArcroleRefs)
900
+
901
+ # discover linkbases
902
+ for lbElt in lbElts:
903
+ schemaDoc.linkbaseDiscover(lbElt)
904
+
905
+ # errors
906
+ for hrefNs, paths in sorted(hrefsNsWithoutPrefix.items(), key=lambda i:i[0]):
907
+ error("oimte:missingConceptRefPrefx",
908
+ "Namespace has no prefix %(namespace)s in %(paths)s",
909
+ modelObject=modelXbrl, namespace=hrefNs, paths=", ".join(paths))
910
+
911
+ # save schema files if specified
912
+ if (saveOIMTaxonomySchemaFiles or
913
+ modelXbrl.modelManager.formulaOptions.typedParameters(modelXbrl.prefixedNamespaces)
914
+ .get(SAVE_OIM_SCHEMA_FORULA_PARAMETER, ("",None))[1] not in (None, "", "false")):
915
+ schemaDoc.save(schemaDoc.filepath.replace(".json", "-json.xsd"))
916
+
917
+ return schemaDoc
918
+
919
+ except NotOIMException as ex:
920
+ _return = ex # not an OIM document
921
+ except Exception as ex:
922
+ _return = ex
923
+ if isinstance(ex, OIMException):
924
+ if ex.code and ex.message:
925
+ error(ex.code, ex.message, modelObject=modelXbrl, **ex.msgArgs)
926
+ else:
927
+ error("arelleOIMloader:error",
928
+ "Error while %(action)s, error %(errorType)s %(error)s\n traceback %(traceback)s",
929
+ modelObject=modelXbrl, action=currentAction, errorType=ex.__class__.__name__, error=ex,
930
+ traceback=traceback.format_tb(sys.exc_info()[2]))
931
+
932
+ global lastFilePath, lastFilePath
933
+ lastFilePath = None
934
+ lastFilePathIsOIM = False
935
+ return _return
936
+
937
+ def oimTaxonomyValidator(val, parameters):
938
+ if not isinstance(val.modelXbrl, XbrlDts): # if no OIM Taxonomy DTS give up
939
+ return
940
+ try:
941
+ validateDTS(val.modelXbrl)
942
+ except Exception as ex:
943
+ val.modelXbrl.error("arelleOIMloader:error",
944
+ "Error while validating, error %(errorType)s %(error)s\n traceback %(traceback)s",
945
+ modelObject=val.modelXbrl, errorType=ex.__class__.__name__, error=ex,
946
+ traceback=traceback.format_tb(sys.exc_info()[2]))
947
+
948
+ lastFilePath = None
949
+ lastFilePathIsOIM = False
950
+
951
+ def isOimTaxonomyLoadable(modelXbrl, mappedUri, normalizedUri, filepath, **kwargs):
952
+ global lastFilePath, lastFilePathIsOIM
953
+ lastFilePath = None
954
+ lastFilePathIsOIM = False
955
+ _ext = os.path.splitext(filepath)[1]
956
+ if _ext == ".json":
957
+ with io.open(filepath, 'rt', encoding='utf-8') as f:
958
+ _fileStart = f.read(4096)
959
+ if _fileStart and oimTaxonomyDocTypePattern.match(_fileStart):
960
+ lastFilePathIsOIM = True
961
+ lastFilePath = filepath
962
+ return lastFilePathIsOIM
963
+
964
+ def oimTaxonomyLoader(modelXbrl, mappedUri, filepath, *args, **kwargs):
965
+ if filepath != lastFilePath or not lastFilePathIsOIM:
966
+ return None # not an OIM file
967
+
968
+ cntlr = modelXbrl.modelManager.cntlr
969
+ cntlr.showStatus(_("Loading OIM taxonomy file: {0}").format(os.path.basename(filepath)))
970
+ doc = loadOIMTaxonomy(cntlr, modelXbrl.error, modelXbrl.warning, modelXbrl, filepath, mappedUri, **kwargs)
971
+ if doc is None:
972
+ return None # not an OIM file
973
+ return doc
974
+
975
+ def optionsExtender(parser, *args, **kwargs):
976
+ parser.add_option(SAVE_OIM_SCHEMA_CMDLINE_PARAMETER,
977
+ action="store_true",
978
+ dest="saveOIMTaxonomySchemaFiles",
979
+ help=_("Save each OIM taxonomy file an xsd named -json.xsd."))
980
+ def filingStart(self, options, *args, **kwargs):
981
+ global saveOIMTaxonomySchemaFiles
982
+ if options.saveOIMTaxonomySchemaFiles:
983
+ saveOIMTaxonomySchemaFiles = True
984
+
985
+ def oimTaxonomyLoaded(cntlr, options, xbrlDts, *args, **kwargs):
986
+ # index groupContents
987
+ xbrlDts.groupContents = defaultdict(OrderedSet)
988
+ for txmy in xbrlDts.taxonomies.values():
989
+ for grpCnts in txmy.groupContents:
990
+ for relName in getattr(grpCnts, "relatedNames", ()): # if object was invalid there are no attributes, e.g. bad QNames
991
+ xbrlDts.groupContents[grpCnts.groupName].add(relName)
992
+
993
+ def oimTaxonomyViews(cntlr, xbrlDts):
994
+ oimTaxonomyLoaded(cntlr, None, xbrlDts)
995
+ if isinstance(xbrlDts, XbrlDts):
996
+ initialViews = []
997
+ if getattr(xbrlDts, "facts", ()): # has instance facts
998
+ initialViews.append( (XbrlFact, cntlr.tabWinTopRt, "Report Facts") )
999
+ initialViews.extend(((XbrlConcept, cntlr.tabWinBtm, "XBRL Concepts"),
1000
+ (XbrlGroup, cntlr.tabWinTopRt, "XBRL Groups"),
1001
+ (XbrlNetwork, cntlr.tabWinTopRt, "XBRL Networks"),
1002
+ (XbrlCube, cntlr.tabWinTopRt, "XBRL Cubes")
1003
+ ))
1004
+ initialViews = tuple(initialViews)
1005
+ additionalViews = ((XbrlAbstract, cntlr.tabWinBtm, "XBRL Abstracts"),
1006
+ (XbrlCubeType, cntlr.tabWinBtm, "XBRL Cube Types"),
1007
+ (XbrlDataType, cntlr.tabWinBtm, "XBRL Data Types"),
1008
+ (XbrlEntity, cntlr.tabWinBtm, "XBRL Entities"),
1009
+ (XbrlLabel, cntlr.tabWinBtm, "XBRL Labels"),
1010
+ (XbrlLabelType, cntlr.tabWinBtm, "XBRL Label Types"),
1011
+ (XbrlPropertyType, cntlr.tabWinBtm, "XBRL Property Types"),
1012
+ (XbrlReference, cntlr.tabWinBtm, "XBRL References"),
1013
+ (XbrlReferenceType, cntlr.tabWinBtm, "XBRL Reference Types"),
1014
+ (XbrlRelationshipType, cntlr.tabWinBtm, "XBRL Relationship Types"),
1015
+ (XbrlTransform, cntlr.tabWinBtm, "XBRL Transforms"),
1016
+ (XbrlUnit, cntlr.tabWinBtm, "XBRL Units"),)
1017
+ for view in initialViews:
1018
+ viewXbrlTxmyObj(xbrlDts, *view, additionalViews)
1019
+ return True # block ordinary taxonomy views
1020
+ return False
1021
+
1022
+ __pluginInfo__ = {
1023
+ 'name': 'OIM Taxonomy',
1024
+ 'version': '1.2',
1025
+ 'description': "This plug-in implements XBRL taxonomy objects loaded from JSON.",
1026
+ 'license': 'Apache-2',
1027
+ 'author': authorLabel,
1028
+ 'copyright': copyrightLabel,
1029
+ # classes of mount points (required)
1030
+ 'CntlrCmdLine.Options': optionsExtender,
1031
+ 'CntlrCmdLine.Filing.Start': filingStart,
1032
+ 'CntlrCmdLine.Xbrl.Loaded': oimTaxonomyLoaded,
1033
+ 'CntlrWinMain.Xbrl.Views': oimTaxonomyViews,
1034
+ 'ModelDocument.IsPullLoadable': isOimTaxonomyLoadable,
1035
+ 'ModelDocument.PullLoader': oimTaxonomyLoader,
1036
+ 'Validate.XBRL.Start': oimTaxonomyValidator
1037
+ }