arelle-release 2.37.46__py3-none-any.whl → 2.38.0__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 (204) hide show
  1. arelle/BetaFeatures.py +0 -21
  2. arelle/Cntlr.py +15 -8
  3. arelle/CntlrCmdLine.py +121 -56
  4. arelle/CntlrWinMain.py +143 -70
  5. arelle/DialogFind.py +1 -1
  6. arelle/DialogPluginManager.py +6 -4
  7. arelle/DisclosureSystem.py +7 -0
  8. arelle/ErrorManager.py +21 -6
  9. arelle/FileSource.py +11 -4
  10. arelle/FunctionIxt.py +16 -11
  11. arelle/HtmlUtil.py +5 -4
  12. arelle/LeiUtil.py +63 -43
  13. arelle/ModelDocument.py +20 -15
  14. arelle/ModelDtsObject.py +8 -0
  15. arelle/ModelInstanceObject.py +1 -1
  16. arelle/ModelObject.py +16 -18
  17. arelle/ModelObjectFactory.py +35 -17
  18. arelle/ModelXbrl.py +28 -11
  19. arelle/PluginManager.py +130 -105
  20. arelle/RuntimeOptions.py +1 -0
  21. arelle/UrlUtil.py +14 -0
  22. arelle/Validate.py +17 -12
  23. arelle/ValidateDuplicateFacts.py +3 -1
  24. arelle/ValidateFileSource.py +38 -0
  25. arelle/ValidateFilingText.py +3 -3
  26. arelle/ValidateXbrl.py +5 -2
  27. arelle/ValidateXbrlCalcs.py +210 -186
  28. arelle/ValidateXbrlDTS.py +1 -1
  29. arelle/ViewFile.py +1 -0
  30. arelle/ViewFileFactTable.py +2 -2
  31. arelle/ViewWinDTS.py +4 -1
  32. arelle/WebCache.py +28 -24
  33. arelle/XbrlConst.py +22 -0
  34. arelle/XmlUtil.py +16 -21
  35. arelle/XmlValidate.py +6 -9
  36. arelle/_version.py +16 -3
  37. arelle/api/Session.py +11 -2
  38. arelle/config/disclosuresystems.xsd +2 -0
  39. arelle/config/rosettaEntitlements.plist +8 -0
  40. arelle/conformance/CSVTestcaseLoader.py +1 -1
  41. arelle/formula/XPathContext.py +3 -3
  42. arelle/logging/formatters/LogFormatter.py +3 -1
  43. arelle/packages/report/ReportPackage.py +26 -13
  44. arelle/packages/report/ReportPackageConst.py +0 -1
  45. arelle/plugin/inlineXbrlDocumentSet.py +19 -5
  46. arelle/plugin/validate/DBA/DisclosureSystems.py +19 -1
  47. arelle/plugin/validate/DBA/PluginValidationDataExtension.py +2 -4
  48. arelle/plugin/validate/DBA/ValidationPluginExtension.py +2 -1
  49. arelle/plugin/validate/DBA/resources/config.xml +5 -0
  50. arelle/plugin/validate/DBA/rules/__init__.py +2 -2
  51. arelle/plugin/validate/DBA/rules/fr.py +19 -2
  52. arelle/plugin/validate/DBA/rules/tc.py +2 -0
  53. arelle/plugin/validate/DBA/rules/th.py +6 -0
  54. arelle/plugin/validate/DBA/rules/tm.py +18 -5
  55. arelle/plugin/validate/DBA/rules/tr.py +11 -5
  56. arelle/plugin/validate/EDINET/Constants.py +193 -9
  57. arelle/plugin/validate/EDINET/ContextRequirement.py +58 -0
  58. arelle/plugin/validate/EDINET/ControllerPluginData.py +220 -1
  59. arelle/plugin/validate/EDINET/CoverItemRequirements.py +42 -0
  60. arelle/plugin/validate/EDINET/DeiRequirements.py +118 -0
  61. arelle/plugin/validate/EDINET/FilingFormat.py +275 -0
  62. arelle/plugin/validate/EDINET/FormType.py +134 -0
  63. arelle/plugin/validate/EDINET/ManifestInstance.py +72 -5
  64. arelle/plugin/validate/EDINET/NamespaceConfig.py +50 -0
  65. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +493 -132
  66. arelle/plugin/validate/EDINET/{InstanceType.py → ReportFolderType.py} +72 -15
  67. arelle/plugin/validate/EDINET/Statement.py +139 -0
  68. arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +595 -0
  69. arelle/plugin/validate/EDINET/UploadContents.py +48 -0
  70. arelle/plugin/validate/EDINET/ValidationPluginExtension.py +20 -2
  71. arelle/plugin/validate/EDINET/__init__.py +31 -6
  72. arelle/plugin/validate/EDINET/resources/config.xml +8 -1
  73. arelle/plugin/validate/EDINET/resources/cover-item-requirements.json +793 -0
  74. arelle/plugin/validate/EDINET/resources/dei-requirements.csv +27 -0
  75. arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml +2 -0
  76. arelle/plugin/validate/EDINET/rules/contexts.py +375 -14
  77. arelle/plugin/validate/EDINET/rules/edinet.py +1934 -45
  78. arelle/plugin/validate/EDINET/rules/frta.py +122 -3
  79. arelle/plugin/validate/EDINET/rules/gfm.py +1907 -11
  80. arelle/plugin/validate/EDINET/rules/upload.py +989 -141
  81. arelle/plugin/validate/ESEF/Const.py +3 -1
  82. arelle/plugin/validate/ESEF/ESEF_2021/DTS.py +5 -0
  83. arelle/plugin/validate/ESEF/ESEF_2021/Image.py +2 -2
  84. arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +23 -20
  85. arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +47 -14
  86. arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +100 -25
  87. arelle/plugin/validate/ESEF/__init__.py +20 -6
  88. arelle/plugin/validate/ESEF/resources/authority-validations.json +76 -9
  89. arelle/plugin/validate/ESEF/resources/config.xml +20 -0
  90. arelle/plugin/validate/NL/DisclosureSystems.py +22 -0
  91. arelle/plugin/validate/NL/PluginValidationDataExtension.py +27 -9
  92. arelle/plugin/validate/NL/ValidationPluginExtension.py +51 -7
  93. arelle/plugin/validate/NL/resources/config.xml +18 -0
  94. arelle/plugin/validate/NL/rules/br_kvk.py +17 -61
  95. arelle/plugin/validate/NL/rules/fg_nl.py +7 -38
  96. arelle/plugin/validate/NL/rules/fr_kvk.py +7 -42
  97. arelle/plugin/validate/NL/rules/fr_nl.py +31 -147
  98. arelle/plugin/validate/NL/rules/nl_kvk.py +142 -28
  99. arelle/plugin/validate/ROS/PluginValidationDataExtension.py +2 -0
  100. arelle/plugin/validate/ROS/ValidationPluginExtension.py +4 -1
  101. arelle/plugin/validate/ROS/rules/ros.py +41 -9
  102. arelle/plugin/validate/UK/ValidateUK.py +130 -66
  103. arelle/plugin/validate/UK/__init__.py +89 -103
  104. arelle/utils/EntryPointDetection.py +79 -13
  105. arelle/utils/PluginHooks.py +125 -0
  106. arelle/utils/validate/ESEFImage.py +6 -6
  107. arelle/utils/validate/Validation.py +18 -0
  108. arelle/utils/validate/ValidationPlugin.py +76 -11
  109. arelle/utils/validate/ValidationUtil.py +35 -3
  110. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/METADATA +30 -20
  111. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/RECORD +115 -191
  112. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/licenses/LICENSE.md +0 -3
  113. arelle/archive/CustomLogger.py +0 -43
  114. arelle/archive/LoadEFMvalidate.py +0 -32
  115. arelle/archive/LoadSavePreLbCsv.py +0 -26
  116. arelle/archive/LoadValidate.cs +0 -31
  117. arelle/archive/LoadValidate.py +0 -36
  118. arelle/archive/LoadValidateCmdLine.java +0 -69
  119. arelle/archive/LoadValidatePostedZip.java +0 -57
  120. arelle/archive/LoadValidateWebService.java +0 -34
  121. arelle/archive/SaveTableToExelle.py +0 -140
  122. arelle/archive/TR3toTR4.py +0 -88
  123. arelle/archive/plugin/ESEF_2022/__init__.py +0 -47
  124. arelle/archive/plugin/bigInstance.py +0 -394
  125. arelle/archive/plugin/cmdWebServerExtension.py +0 -43
  126. arelle/archive/plugin/crashTest.py +0 -38
  127. arelle/archive/plugin/functionsXmlCreation.py +0 -106
  128. arelle/archive/plugin/hello_i18n.pot +0 -26
  129. arelle/archive/plugin/hello_i18n.py +0 -32
  130. arelle/archive/plugin/importTestChild1.py +0 -21
  131. arelle/archive/plugin/importTestChild2.py +0 -22
  132. arelle/archive/plugin/importTestGrandchild1.py +0 -21
  133. arelle/archive/plugin/importTestGrandchild2.py +0 -21
  134. arelle/archive/plugin/importTestImported1.py +0 -23
  135. arelle/archive/plugin/importTestImported11.py +0 -22
  136. arelle/archive/plugin/importTestParent.py +0 -48
  137. arelle/archive/plugin/instanceInfo.py +0 -306
  138. arelle/archive/plugin/loadFromOIM-2018.py +0 -1282
  139. arelle/archive/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
  140. arelle/archive/plugin/objectmaker.py +0 -285
  141. arelle/archive/plugin/packagedImportTest/__init__.py +0 -47
  142. arelle/archive/plugin/packagedImportTest/importTestChild1.py +0 -21
  143. arelle/archive/plugin/packagedImportTest/importTestChild2.py +0 -22
  144. arelle/archive/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
  145. arelle/archive/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
  146. arelle/archive/plugin/packagedImportTest/importTestImported1.py +0 -24
  147. arelle/archive/plugin/packagedImportTest/importTestImported11.py +0 -21
  148. arelle/archive/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
  149. arelle/archive/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
  150. arelle/archive/plugin/sakaCalendar.py +0 -215
  151. arelle/archive/plugin/saveInstanceInfoset.py +0 -121
  152. arelle/archive/plugin/sphinx/FormulaGenerator.py +0 -823
  153. arelle/archive/plugin/sphinx/SphinxContext.py +0 -404
  154. arelle/archive/plugin/sphinx/SphinxEvaluator.py +0 -783
  155. arelle/archive/plugin/sphinx/SphinxMethods.py +0 -1287
  156. arelle/archive/plugin/sphinx/SphinxParser.py +0 -1093
  157. arelle/archive/plugin/sphinx/SphinxValidator.py +0 -163
  158. arelle/archive/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
  159. arelle/archive/plugin/sphinx/__init__.py +0 -285
  160. arelle/archive/plugin/streamingExtensions.py +0 -335
  161. arelle/archive/plugin/updateTableLB.py +0 -242
  162. arelle/archive/plugin/validate/SBRnl/CustomLoader.py +0 -19
  163. arelle/archive/plugin/validate/SBRnl/DTS.py +0 -305
  164. arelle/archive/plugin/validate/SBRnl/Dimensions.py +0 -357
  165. arelle/archive/plugin/validate/SBRnl/Document.py +0 -799
  166. arelle/archive/plugin/validate/SBRnl/Filing.py +0 -467
  167. arelle/archive/plugin/validate/SBRnl/__init__.py +0 -75
  168. arelle/archive/plugin/validate/SBRnl/config.xml +0 -26
  169. arelle/archive/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
  170. arelle/archive/plugin/validate/USBestPractices.py +0 -570
  171. arelle/archive/plugin/validate/USCorpAction.py +0 -557
  172. arelle/archive/plugin/validate/USSecTagging.py +0 -337
  173. arelle/archive/plugin/validate/XDC/__init__.py +0 -77
  174. arelle/archive/plugin/validate/XDC/config.xml +0 -20
  175. arelle/archive/plugin/validate/XFsyntax/__init__.py +0 -64
  176. arelle/archive/plugin/validate/XFsyntax/xf.py +0 -2227
  177. arelle/archive/plugin/validate/calc2.py +0 -536
  178. arelle/archive/plugin/validateSchemaLxml.py +0 -156
  179. arelle/archive/plugin/validateTableInfoset.py +0 -52
  180. arelle/archive/us-gaap-dei-docType-extraction-frm.xml +0 -90
  181. arelle/archive/us-gaap-dei-ratio-cash-frm.xml +0 -150
  182. arelle/examples/plugin/formulaSuiteConverter.py +0 -212
  183. arelle/examples/plugin/functionsCustom.py +0 -59
  184. arelle/examples/plugin/hello_dolly.py +0 -64
  185. arelle/examples/plugin/multi.py +0 -58
  186. arelle/examples/plugin/rssSaveOim.py +0 -96
  187. arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
  188. arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
  189. arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
  190. arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
  191. arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
  192. arelle/examples/plugin/validate/XYZ/rules/__init__.py +0 -0
  193. arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -110
  194. arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -59
  195. arelle/model/CommentBase.py +0 -9
  196. arelle/model/ElementBase.py +0 -11
  197. arelle/model/PIBase.py +0 -10
  198. arelle/model/__init__.py +0 -15
  199. arelle/scripts-macOS/startWebServer.command +0 -3
  200. arelle/scripts-unix/startWebServer.sh +0 -1
  201. arelle/scripts-windows/startWebServer.bat +0 -5
  202. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/WHEEL +0 -0
  203. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/entry_points.txt +0 -0
  204. {arelle_release-2.37.46.dist-info → arelle_release-2.38.0.dist-info}/top_level.txt +0 -0
@@ -1,823 +0,0 @@
1
- '''
2
- formulaGenerator generates XBRL formula linkbases for a subset of the Sphinx language.
3
-
4
- See COPYRIGHT.md for copyright information.
5
-
6
- Sphinx is a Rules Language for XBRL described by a Sphinx 2 Primer
7
- (c) Copyright 2012 CoreFiling, Oxford UK.
8
- Sphinx copyright applies to the Sphinx language, not to this software.
9
- Workiva, Inc. conveys neither rights nor license for the Sphinx language.
10
- '''
11
-
12
- import time, sys, io, os.path
13
- import regex as re
14
- from lxml import etree
15
- from arelle.ModelValue import QName
16
- from .SphinxParser import (parse, astNode, astNamespaceDeclaration,
17
- astFormulaRule, astReportRule, astValidationRule,
18
- astQnameLiteral)
19
- from .SphinxMethods import aggreateFunctionImplementation
20
-
21
-
22
- def generateFormulaLB(cntlr, sphinxFiles, generatedSphinxFormulasDirectory):
23
- from .SphinxContext import SphinxContext
24
- from .SphinxValidator import validate
25
-
26
- msgFile = None
27
- sourceString = None
28
-
29
- # logMessage operates without an instance document or ModelXbrl, so it simulates log function
30
-
31
- def logMessage(severity, code, text, **kwargs):
32
- if "sourceFileLines" in kwargs: # use pairs of file and line number
33
- fileLines = ", ".join((file + (" " + str(line)) if line else "")
34
- for file, line in kwargs["sourceFileLines"])
35
- elif "sourceFileLine" in kwargs:
36
- file, line in kwargs["sourceFileLine"]
37
- fileLines = file + (" " + str(line)) if line else ""
38
- else:
39
- fileLines = ""
40
- if not fileLines:
41
- fileLines = ", " + fileLines
42
- try:
43
- cntlr.addToLog("[{0}] {1}{2}".format(
44
- code,
45
- text % kwargs,
46
- fileLines))
47
- except KeyError as err:
48
- cntlr.addToLog("[{0}] {1}: Missing message parameter: {2}; {3}".format(
49
- code,
50
- text,
51
- err,
52
- fileLines))
53
-
54
- from arelle import XmlUtil
55
-
56
- sc = SphinxContext( parse(cntlr, logMessage, sphinxFiles) )
57
- sc.logMessage = logMessage
58
- validate(logMessage, sc)
59
- assertionIDs = set()
60
-
61
- for prog in sc.sphinxProgs:
62
- sphinxFile = prog[0].fileName
63
- sphinxXmlns = { "xlink": 'http://www.w3.org/1999/xlink',
64
- "link": 'http://www.xbrl.org/2003/linkbase',
65
- "xbrli": 'http://www.xbrl.org/2003/instance',
66
- "generic": 'http://xbrl.org/2008/generic',
67
- "formula": 'http://xbrl.org/2008/formula',
68
- "validation": 'http://xbrl.org/2008/validation',
69
- "variable": 'http://xbrl.org/2008/variable',
70
- "label": 'http://xbrl.org/2008/label',
71
- "ca": 'http://xbrl.org/2008/assertion/consistency',
72
- "ea": 'http://xbrl.org/2008/assertion/existence',
73
- "va": 'http://xbrl.org/2008/assertion/value',
74
- "msg": 'http://xbrl.org/2010/message',
75
- "bf": 'http://xbrl.org/2008/filter/boolean',
76
- "cf": 'http://xbrl.org/2008/filter/concept',
77
- "df": 'http://xbrl.org/2008/filter/dimension',
78
- "gf": 'http://xbrl.org/2008/filter/general',
79
- "pf": 'http://xbrl.org/2008/filter/period',
80
- "uf": 'http://xbrl.org/2008/filter/unit',
81
- "xfi": 'http://www.xbrl.org/2008/function/instance',
82
- "xsi": 'http://www.w3.org/2001/XMLSchema-instance',
83
- "xs": 'http://www.w3.org/2001/XMLSchema',
84
- }
85
- for node in prog:
86
- if isinstance(node, astNamespaceDeclaration):
87
- sphinxXmlns[node.prefix] = node.namespace
88
-
89
- formulaFile = sphinxFile.rpartition(".")[0] + "-formula.xml"
90
-
91
- # save in generatedSphinxFormulasDirectory if specified and valid (exists)
92
- if generatedSphinxFormulasDirectory and os.path.isdir(generatedSphinxFormulasDirectory):
93
- formulaFile = os.path.join(generatedSphinxFormulasDirectory,
94
- os.path.basename(formulaFile))
95
-
96
- xbrlLBfile = io.StringIO('''
97
- <nsmap>
98
- <link:linkbase
99
-
100
- {0}
101
- xsi:schemaLocation="http://www.xbrl.org/2003/linkbase http://www.xbrl.org/2003/xbrl-linkbase-2003-12-31.xsd"
102
- >
103
- <link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/element-label'
104
- xlink:href='http://www.xbrl.org/2008/generic-label.xsd#element-label'
105
- xlink:type='simple'/>
106
- <link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/variable-set'
107
- xlink:href='http://www.xbrl.org/2008/variable.xsd#variable-set'
108
- xlink:type='simple'/>
109
- <link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/variable-filter'
110
- xlink:href='http://www.xbrl.org/2008/variable.xsd#variable-filter'
111
- xlink:type='simple'/>
112
- <link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/variable-set-precondition'
113
- xlink:href='http://www.xbrl.org/2008/variable.xsd#variable-set-precondition'
114
- xlink:type='simple'/>
115
- <link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/consistency-assertion-formula'
116
- xlink:href='http://www.xbrl.org/2008/consistency-assertion.xsd#consistency-assertion-formula'
117
- xlink:type='simple'/>
118
- <link:roleRef roleURI='http://www.xbrl.org/2008/role/link'
119
- xlink:href='http://www.xbrl.org/2008/generic-link.xsd#standard-link-role'
120
- xlink:type='simple'/>
121
- <link:roleRef roleURI='http://www.xbrl.org/2008/role/label'
122
- xlink:href='http://www.xbrl.org/2008/generic-label.xsd#standard-label'
123
- xlink:type='simple'/>
124
- <link:roleRef roleURI="http://www.xbrl.org/2010/role/message"
125
- xlink:type="simple"
126
- xlink:href="http://www.xbrl.org/2010/generic-message.xsd#standard-message"/>
127
- <link:arcroleRef arcroleURI="http://xbrl.org/arcrole/2010/assertion-unsatisfied-message"
128
- xlink:type="simple"
129
- xlink:href="http://www.xbrl.org/2010/validation-message.xsd#assertion-unsatisfied-message"/>
130
- <link:arcroleRef arcroleURI="http://xbrl.org/arcrole/2010/assertion-satisfied-message"
131
- xlink:type="simple"
132
- xlink:href="http://www.xbrl.org/2010/validation-message.xsd#assertion-satisfied-message"/>
133
- <link:arcroleRef arcroleURI='http://xbrl.org/arcrole/2008/boolean-filter'
134
- xlink:href='http://www.xbrl.org/2008/boolean-filter.xsd#boolean-filter'
135
- xlink:type='simple'/>
136
-
137
- <generic:link xlink:type="extended" xlink:role="http://www.xbrl.org/2003/role/link"/>
138
- </link:linkbase>
139
- </nsmap>
140
- <!-- Generated by Arelle(r) http://arelle.org -->
141
- '''.format('\n'.join("xmlns{0}='{1}'".format((":" + prefix) if prefix else "",
142
- namespace)
143
- for prefix, namespace in sphinxXmlns.items())
144
- )
145
- )
146
- msgFile = os.path.basename(formulaFile)
147
- xmlDocument = etree.parse(xbrlLBfile,base_url=formulaFile)
148
- xbrlLBfile.close()
149
- nsmapElt = xmlDocument.getroot()
150
- #xmlDocument.getroot().init(self) ## is this needed ??
151
- for lbElement in xmlDocument.iter(tag="{http://www.xbrl.org/2003/linkbase}linkbase"):
152
- break
153
- for e in xmlDocument.iter(tag="{http://xbrl.org/2008/generic}link"):
154
- sc.genLinkElement = e
155
- break
156
-
157
- class DocObj: # fake ModelDocument for namespaces
158
- def __init__(self):
159
- self.xmlRootElement = lbElement
160
- self.xmlDocument = xmlDocument
161
- docObj = DocObj()
162
-
163
- numRules = 0
164
- sc.generatedVarNbr = 1
165
- sc.xpathCode = None
166
- sc.bindAsSequence = False
167
- sc.nodeXpathVarBindings = {}
168
-
169
- for node in prog:
170
- if isinstance(node, (astFormulaRule, astReportRule, astValidationRule)):
171
- # form unique ID
172
- sc.assertionID = node.name
173
- if sc.assertionID in assertionIDs:
174
- for suffixNumber in range(1,10000):
175
- if sc.assertionID + str(suffixNumber) not in assertionIDs:
176
- sc.assertionID += str(suffixNumber)
177
- break
178
- assertionIDs.add(sc.assertionID)
179
- sc.assertionElt = etree.SubElement(sc.genLinkElement,
180
- "{http://xbrl.org/2008/assertion/value}valueAssertion",
181
- attrib={"{http://www.w3.org/1999/xlink}type": "resource",
182
- "{http://www.w3.org/1999/xlink}label": sc.assertionID,
183
- "id": sc.assertionID,
184
- "aspectModel": "dimensional",
185
- "implicitFiltering": "true"})
186
- sc.assertionVarNames = {"factVar_"}
187
- sc.generalVarNames = {}
188
- if isinstance(node, astFormulaRule):
189
- sc.assertionElt.set("test", xpathCode(node.expr, sc))
190
- msgType = "assertion-unsatisfied-message"
191
- elif isinstance(node, astReportRule):
192
- sc.tags["value"] = node.expr # no test expression needed
193
- msgType = "assertion-unsatisfied-message"
194
- elif isinstance(node, astValidationRule):
195
- sc.assertionElt.set("test", "not( " + xpathCode(node.expr, sc) + " )")
196
- msgType = "assertion-satisfied-message"
197
- genMessage(node.message, sc, msgType)
198
-
199
- sc.nodeXpathVarBindings.clear()
200
-
201
- with open(formulaFile, "w", encoding="utf-8") as fh:
202
- XmlUtil.writexml(fh, xmlDocument, encoding="utf-8")
203
-
204
- logMessage("INFO", "info:compileSphinx",
205
- _("Compiled Sphinx of %(sphinxFile)s has %(numberRules)s tables in file %(formulaFile)s."),
206
- sphinxFile=sphinxFiles,
207
- numberRules=numRules,
208
- formulaFile=formulaFile)
209
-
210
- logMessage = None
211
- sc.close()
212
-
213
- cntlr.showStatus("Finshed sphinx files {0}".format(", ".join(os.path.basename(f)
214
- for f in sphinxFiles)),
215
- 5000)
216
-
217
- def evaluate(node, sc):
218
- if isinstance(node, astNode):
219
- className = node.__class__.__name__
220
- if className in evaluationHandler:
221
- return evaluationHandler[className](node, sc)
222
- else: # don't evaluate node
223
- return node
224
- elif isinstance(node, (tuple,list)):
225
- return [evaluate(item, sc) for item in node]
226
- elif isinstance(node, set):
227
- return set(evaluate(item, sc) for item in node)
228
- elif callable(node):
229
- return node()
230
- else:
231
- return node
232
-
233
- def evaluateFunctionReference(node, sc):
234
- name = node.name
235
- if name in {"list", "set"}:
236
- # evaluate args
237
- args = [evaluate(arg, sc) for arg in node.args]
238
- # process args
239
- if name == "list":
240
- return list(args)
241
- elif name == "set":
242
- return set(args)
243
- return node
244
-
245
- def evaluateQnameLiteral(node, sc):
246
- return node.value
247
-
248
- def evaluateStringLiteral(node, sc):
249
- return node.text
250
-
251
- def evaluateVariableAssignment(node, sc):
252
- result = evaluate(node.expr, sc)
253
- sc.localVariables[node.variableName] = result
254
- if node.tagName:
255
- sc.tags[node.tagName] = node.expr
256
- return result
257
-
258
- def evaluateVariableReference(node, sc):
259
- # expand macro variables
260
- if node.variableName in sc.localVariables:
261
- return evaluate(sc.localVariables[node.variableName], sc)
262
- return '$' + node.variableName
263
-
264
- def xpathCode(node, sc):
265
- parentXpathCode = sc.xpathCode
266
- sc.xpathCode = []
267
- genNode(node, sc)
268
- xpathCodeStr = " ".join(sc.xpathCode)
269
- sc.xpathCode = parentXpathCode
270
- return xpathCodeStr
271
-
272
- def genNode(node, sc):
273
- if isinstance(node, astNode):
274
- genNodeHandler[node.__class__.__name__](node, sc)
275
- elif isinstance(node, (tuple,list)):
276
- sc.xpathCode.append('[')
277
- for item in node:
278
- genNode(item, sc)
279
- sc.xpathCode.append(']')
280
- elif isinstance(node, set):
281
- sc.xpathCode.append("set(")
282
- for item in node:
283
- genNode(item, sc)
284
- sc.xpathCode.append(")")
285
- elif callable(node):
286
- node()
287
- else:
288
- sc.xpathCode.append(str(node))
289
-
290
- def genBinaryOperation(node, sc):
291
- # for now formula := generates a "eq" operation so it fails when conditoin is not met
292
- sc.xpathCode.append("(")
293
- genNode(node.leftExpr, sc)
294
- sc.xpathCode.append({"+": "+", "-": "-", "*": "", "/": "div",
295
- "<": "lt", "<=": "le", ">": "gt", ">=": "ge",
296
- "==": "eq", "!=": "ne",
297
- ":=": "eq",
298
- }.get(node.op,"$$$opNotImplemented$$$"))
299
- genNode(node.rightExpr, sc)
300
- sc.xpathCode.append(")")
301
-
302
- def genFor(node, sc):
303
- # add a general variable for this node's expression, substitute gen var expression
304
- generalVarLabel = "generalVariable_" + node.name
305
- sc.xpathCode.append("$" + node.name)
306
-
307
- def genForSelectCode():
308
- sc.xpathCode.append("for $_{0} in {1} return ( {2} )".format(
309
- node.name,
310
- genNode(node.collectionExpr, sc),
311
- genNode(node.expr, sc)
312
- ))
313
-
314
- etree.SubElement(sc.genLinkElement,
315
- "{http://xbrl.org/2008/variable}generalVariable",
316
- attrib={"{http://www.w3.org/1999/xlink}type": "resource",
317
- "{http://www.w3.org/1999/xlink}label": generalVarLabel,
318
- "select": xpathCode(genForSelectCode, sc)})
319
- etree.SubElement(sc.genLinkElement,
320
- "{http://xbrl.org/2008/variable}variableArc",
321
- attrib={"{http://www.w3.org/1999/xlink}type": "arc",
322
- "{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-set",
323
- "{http://www.w3.org/1999/xlink}from": sc.assertionID,
324
- "{http://www.w3.org/1999/xlink}to": generalVarLabel,
325
- "name": node.name})
326
-
327
- def genFunctionDeclaration(node, sc, args):
328
- # attempt to expand macros
329
- if node.functionType == "macro":
330
- # expand locally
331
- overriddenVariables = {}
332
-
333
- if isinstance(args, dict):
334
- # args may not all be used in the function declaration, just want used ones
335
- argDict = dict((name, value)
336
- for name, value in args.items()
337
- if name in node.params)
338
- else: # purely positional args
339
- # positional parameters named according to function prototype
340
- if len(args) != len(node.params):
341
- sc.modelXbrl.log("ERROR", "sphinx.functionArgumentsMismatch",
342
- _("Function %(name)s requires %(required)s parameters but %(provided)s are provided"),
343
- sourceFileLine=node.sourceFileLine,
344
- name=node.name, required=len(node.params), provided=len(args))
345
- return None
346
- argDict = dict((paramName, args[i])
347
- for i, paramName in enumerate(node.params))
348
- for name, value in argDict.items():
349
- value = evaluate(value, sc) # resolves variable refs to same variable ref
350
- if name in sc.localVariables:
351
- overriddenVariables[name] = sc.localVariables[name]
352
- sc.localVariables[name] = value
353
- result = genNode(node.expr, sc)
354
- for name in argDict.keys():
355
- del sc.localVariables[name]
356
- sc.localVariables.update(overriddenVariables)
357
- overriddenVariables.clear()
358
- elif node.functionType == "function":
359
- # generate custom function implementation
360
- pass
361
-
362
- def genFunctionReference(node, sc):
363
- name = node.name
364
- if name in sc.functions: # user defined function
365
- result = genFunctionDeclaration(sc.functions[name], sc, node.args)
366
-
367
- isAggregateFunction = name in aggreateFunctionImplementation
368
- if isAggregateFunction:
369
- priorBindAsSequence = sc.bindAsSequence
370
- sc.bindAsSequence = True
371
- formulaFunctionSyntax = formulaFunctionSyntaxPatterns.get(name,
372
- ("$notImplemented_{0}(".format(name),")"))
373
- if isinstance(formulaFunctionSyntax, tuple) and len(formulaFunctionSyntax) == 2:
374
- sc.xpathCode.append(formulaFunctionSyntax[0]) # before arguments
375
- for i, arg in enumerate(node.args):
376
- if i:
377
- sc.xpathCode.append(",")
378
- genNode(arg, sc)
379
- sc.xpathCode.append(formulaFunctionSyntax[1]) # after arguments
380
- else:
381
- sc.logMessage("ERROR", "sphinxFormulaGenerator:functionSyntaxPatternError",
382
- _("Syntax generator error for function %(name)s."),
383
- sourceFileLine=node.sourceFileLine, name=name)
384
- if isAggregateFunction:
385
- sc.bindAsSequence = priorBindAsSequence
386
-
387
- def genHyperspaceExpression(node, sc):
388
- # generate fact variable and substitute it's reference in text code
389
- # find pri item for fact var name
390
- priItemName = "factVar_"
391
- for axis in node.axes:
392
- if axis.name == "primary":
393
- restriction = evaluate(axis.restriction, sc)
394
- if len(restriction) == 1:
395
- priItemName += cleanedName(str(restriction[0]))
396
- break
397
-
398
- if priItemName in sc.assertionVarNames:
399
- for suffixNumber in range(1,10000):
400
- if priItemName + str(suffixNumber) not in sc.assertionVarNames:
401
- priItemName += str(suffixNumber)
402
- break
403
- sc.assertionVarNames.add(priItemName)
404
- factVarLabel = sc.assertionID + "_" + priItemName
405
- xpathVar = "$" + factVarLabel
406
- sc.xpathCode.append(xpathVar)
407
- sc.nodeXpathVarBindings[node] = xpathVar
408
- etree.SubElement(sc.genLinkElement,
409
- "{http://xbrl.org/2008/variable}factVariable",
410
- attrib={"{http://www.w3.org/1999/xlink}type": "resource",
411
- "{http://www.w3.org/1999/xlink}label": factVarLabel,
412
- "bindAsSequence": ("false","true")[sc.bindAsSequence]})
413
- etree.SubElement(sc.genLinkElement,
414
- "{http://xbrl.org/2008/variable}variableArc",
415
- attrib={"{http://www.w3.org/1999/xlink}type": "arc",
416
- "{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-set",
417
- "{http://www.w3.org/1999/xlink}from": sc.assertionID,
418
- "{http://www.w3.org/1999/xlink}to": factVarLabel,
419
- "name": factVarLabel})
420
- # generate filters
421
- filterNames = {"filter_"}
422
- for axis in node.axes:
423
- filterName = "filter_"
424
- axisName = evaluate(axis.name, sc)
425
- if axisName == "primary":
426
- axisRestriction = evaluate(axis.restriction, sc)[0]
427
- filterName = "concept"
428
- elif isinstance(axisName, QName):
429
- axisRestriction = evaluate(axis.restriction, sc)[0]
430
- filterName = "dim_" + axisRestriction.localName
431
- if filterName in filterNames:
432
- for suffixNumber in range(1,10000):
433
- if filterName + str(suffixNumber) not in filterNames:
434
- filterName += str(suffixNumber)
435
- break
436
- filterNames.add(filterName)
437
- filterLabel = factVarLabel + "_" + filterName
438
- if axis.name == "primary":
439
- elt = etree.SubElement(sc.genLinkElement, "{http://xbrl.org/2008/filter/concept}conceptName",
440
- attrib={"{http://www.w3.org/1999/xlink}type": "resource",
441
- "{http://www.w3.org/1999/xlink}label": filterLabel})
442
- etree.SubElement(sc.genLinkElement, "{http://xbrl.org/2008/variable}variableFilterArc",
443
- attrib={"{http://www.w3.org/1999/xlink}type": "arc",
444
- "{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-filter",
445
- "{http://www.w3.org/1999/xlink}from": factVarLabel,
446
- "{http://www.w3.org/1999/xlink}to": filterLabel,
447
- "complement": "false",
448
- "cover": "true"})
449
- elt = etree.SubElement(elt, "{http://xbrl.org/2008/filter/concept}concept")
450
- etree.SubElement(elt, "{http://xbrl.org/2008/filter/concept}qname").text = str(axisRestriction)
451
- elif isinstance(axis.name, QName): # dimension
452
- elt = etree.SubElement(sc.genLinkElement, "{http://xbrl.org/2008/filter/dimension}explicitDimension",
453
- attrib={"{http://www.w3.org/1999/xlink}type": "resource",
454
- "{http://www.w3.org/1999/xlink}label": filterLabel})
455
- etree.SubElement(sc.genLinkElement, "{http://xbrl.org/2008/variable}variableFilterArc",
456
- attrib={"{http://www.w3.org/1999/xlink}type": "arc",
457
- "{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-filter",
458
- "{http://www.w3.org/1999/xlink}from": factVarLabel,
459
- "{http://www.w3.org/1999/xlink}to": filterLabel,
460
- "complement": "false",
461
- "cover": "true"})
462
- elt = etree.SubElement(elt, "{http://xbrl.org/2008/filter/dimension}dimension")
463
- etree.SubElement(elt, "{http://xbrl.org/2008/variable}dimension}qname").text = str(axisName)
464
- elt = etree.SubElement(elt, "{http://xbrl.org/2008/filter/dimension}member")
465
- etree.SubElement(elt, "{http://xbrl.org/2008/variable}dimension}qname").text = str(axisRestriction)
466
-
467
- def genIf(node, sc):
468
- sc.xpathCode.append("if (")
469
- genNode(node.condition, sc)
470
- sc.xpathCode.append(") then (")
471
- genNode(node.thenExpr, sc)
472
- sc.xpathCode.append(") else (")
473
- genNode(node.elseExpr, sc)
474
- sc.xpathCode.append(")")
475
-
476
- def genMessage(node, sc, msgType):
477
- def taggedVarGenVar(node):
478
- tagGenVarLabel = "tagGeneralVariable_" + str(sc.generatedVarNbr)
479
- sc.generatedVarNbr += 1
480
- tagGenVarName = "$" + tagGenVarLabel
481
- sc.nodeXpathVarBindings[node] = tagGenVarName
482
- etree.SubElement(sc.genLinkElement,
483
- "{http://xbrl.org/2008/variable}generalVariable",
484
- attrib={"{http://www.w3.org/1999/xlink}type": "resource",
485
- "{http://www.w3.org/1999/xlink}label": tagGenVarLabel,
486
- "select": xpathCode(node, sc)})
487
- etree.SubElement(sc.genLinkElement,
488
- "{http://xbrl.org/2008/variable}variableArc",
489
- attrib={"{http://www.w3.org/1999/xlink}type": "arc",
490
- "{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-set",
491
- "{http://www.w3.org/1999/xlink}from": sc.assertionID,
492
- "{http://www.w3.org/1999/xlink}to": tagGenVarLabel,
493
- "name": tagGenVarName})
494
-
495
- msgLabel = sc.assertionID + "_" + msgType
496
- # generate mesage text
497
- if node and node.message:
498
- msgstr = evaluate(node.message, sc)
499
- else:
500
- msgstr = "Result ${value}"
501
- text = []
502
- i = 0
503
- while True:
504
- j = msgstr.find("${", i)
505
- if j >= 0:
506
- text.append(msgstr[i:j]) # previous part of string
507
- k = msgstr.find("}", j+2)
508
- if k > j:
509
- tagstr = msgstr[j+2:k].strip()
510
- tag, sep, modifier = tagstr.partition(".")
511
- if tag == "context":
512
- text.append("{{${0}@contextRef}}".format(tag))
513
- elif tag in sc.tags:
514
- taggedNode = sc.tags[tag]
515
- if taggedNode not in sc.nodeXpathVarBindings:
516
- taggedVarGenVar(taggedNode) # add a gen var for this tagged expression
517
- text.append("{{{0}}}".format(sc.nodeXpathVarBindings[taggedNode]))
518
- else:
519
- text.append('"{0}" is not supported for formula message generation'.format(tagstr))
520
- i = k + 1
521
- else:
522
- text.append(msgstr[i:])
523
- break
524
- messageStr = ''.join(text)
525
- etree.SubElement(sc.genLinkElement,
526
- "{http://xbrl.org/2010/message}message",
527
- attrib={"{http://www.w3.org/1999/xlink}type": "resource",
528
- "{http://www.w3.org/1999/xlink}label": msgLabel,
529
- "{http://www.w3.org/1999/xlink}role": "http://www.xbrl.org/2010/role/message",
530
- "{http://www.w3.org/XML/1998/namespace}lang": "en"
531
- }).text = messageStr
532
- etree.SubElement(sc.genLinkElement,
533
- "{http://xbrl.org/2008/generic}arc",
534
- attrib={"{http://www.w3.org/1999/xlink}type": "arc",
535
- "{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2010/" + msgType,
536
- "{http://www.w3.org/1999/xlink}from": sc.assertionID,
537
- "{http://www.w3.org/1999/xlink}to": msgLabel})
538
-
539
- def genMethodReference(node, sc):
540
- formulaMethodSyntax = formulaMethodSyntaxPatterns.get(node.name,
541
- ("$notImplemented_{0}(".format(node.name),")"))
542
- if isinstance(formulaMethodSyntax, tuple) and len(formulaMethodSyntax) == 2:
543
- sc.xpathCode.append(formulaMethodSyntax[0]) # before arguments
544
- for i, arg in enumerate(node.args):
545
- if i:
546
- sc.xpathCode.append(",")
547
- genNode(arg, sc)
548
- sc.xpathCode.append(formulaMethodSyntax[1]) # after arguments
549
- else:
550
- sc.logMessage("ERROR", "sphinxFormulaGenerator:methodSyntaxPatternError",
551
- _("Syntax generator error for method %(name)s."),
552
- sourceFileLine=node.sourceFileLine, name=node.name)
553
-
554
- def genNoOp(node, sc):
555
- pass
556
-
557
- def genNumericLiteral(node, sc):
558
- sc.xpathCode.append(str(node.value))
559
-
560
- def genQnameLiteral(node, sc):
561
- sc.xpathCode.append(str(node.value))
562
-
563
- def genStringLiteral(node, sc):
564
- sc.xpathCode.append('"' + node.text.replace('"', '""') + '"')
565
-
566
- def genTagAssignment(node, sc):
567
- genNode(node.expr, sc) # expand syntax in place
568
- sc.tags[node.tagName] = node.expr
569
-
570
- def genUnaryOperation(node, sc):
571
- sc.xpathCode.append("(")
572
- sc.xpathCode.append({"+": "+",
573
- "-": "-",
574
- "brackets": "",
575
- }.get(node.op,"$$$opNotImplemented$$$"))
576
- genNode(node.expr, sc)
577
- sc.xpathCode.append(")")
578
-
579
- def genValuesIteration(node, sc):
580
- pass
581
-
582
- def genVariableAssignment(node, sc):
583
- # add a general variable for this node's expression, substitute gen var expression
584
- generalVarLabel = "generalVariable_" + node.variableName
585
- sc.xpathCode.append("$" + node.variableName)
586
- if node.tagName:
587
- sc.tags[node.tagName] = node.expr
588
-
589
- etree.SubElement(sc.genLinkElement,
590
- "{http://xbrl.org/2008/variable}generalVariable",
591
- attrib={"{http://www.w3.org/1999/xlink}type": "resource",
592
- "{http://www.w3.org/1999/xlink}label": generalVarLabel,
593
- "select": xpathCode(node.expr, sc)})
594
- etree.SubElement(sc.genLinkElement,
595
- "{http://xbrl.org/2008/variable}variableArc",
596
- attrib={"{http://www.w3.org/1999/xlink}type": "arc",
597
- "{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-set",
598
- "{http://www.w3.org/1999/xlink}from": sc.assertionID,
599
- "{http://www.w3.org/1999/xlink}to": generalVarLabel,
600
- "name": node.variableName})
601
-
602
- def genVariableReference(node, sc):
603
- # if a macro reference, substitute the actual node
604
- if node.variableName in sc.localVariables:
605
- genNode(sc.localVariables[node.variableName], sc)
606
- else:
607
- sc.xpathCode.append("$" + node.variableName)
608
-
609
- def genWith(node, sc):
610
- # with-dependent code goes into a fake general variable
611
- withExprGeneralVarLabel = "withExpressionGeneralVariable_" + str(sc.generatedVarNbr)
612
- sc.generatedVarNbr += 1
613
- sc.xpathCode.append("$" + withExprGeneralVarLabel)
614
-
615
- def genWithGenVarCode():
616
- # partition facts according to restriction
617
- sc.xpathCode.append(" if (false()) then (")
618
- # forces dependency by fake hyperspace fact variable reference
619
- genNode(node.restrictionExpr)
620
- sc.xpathCode.append(") else (")
621
- for varAssignNode in node.variableAssignments:
622
- genNode(node.varAssignNode, sc)
623
- genNode(node.bodyExpr)
624
- sc.xpathCode.append(")")
625
-
626
- etree.SubElement(sc.genLinkElement,
627
- "{http://xbrl.org/2008/variable}generalVariable",
628
- attrib={"{http://www.w3.org/1999/xlink}type": "resource",
629
- "{http://www.w3.org/1999/xlink}label": withExprGeneralVarLabel,
630
- "select": xpathCode(genWithGenVarCode, sc)})
631
- etree.SubElement(sc.genLinkElement,
632
- "{http://xbrl.org/2008/variable}variableArc",
633
- attrib={"{http://www.w3.org/1999/xlink}type": "arc",
634
- "{http://www.w3.org/1999/xlink}arcrole": "http://xbrl.org/arcrole/2008/variable-set",
635
- "{http://www.w3.org/1999/xlink}from": sc.assertionID,
636
- "{http://www.w3.org/1999/xlink}to": withExprGeneralVarLabel,
637
- "name": node.variableName})
638
-
639
- def cleanedName(name):
640
- return re.sub(r"\W", "_", name)
641
-
642
- genNodeHandler = {
643
- "astAnnotationDeclaration": genNoOp,
644
- "astBinaryOperation": genBinaryOperation,
645
- "astComment": genNoOp,
646
- "astFor": genFor,
647
- "astFunctionReference": genFunctionReference,
648
- "astHyperspaceExpression": genHyperspaceExpression,
649
- "astIf": genIf,
650
- "astMethodReference": genMethodReference,
651
- "astNamespaceDeclaration": genNoOp,
652
- "astNode": genNoOp,
653
- "astNoOp": genNoOp,
654
- "astNumericLiteral": genNumericLiteral,
655
- "astQnameLiteral": genQnameLiteral,
656
- "astSourceFile": genNoOp,
657
- "astStringLiteral": genStringLiteral,
658
- "astTagAssignment": genTagAssignment,
659
- "astValuesIteration": genValuesIteration,
660
- "astVariableAssignment": genVariableAssignment,
661
- "astVariableReference": genVariableReference,
662
- "astUnaryOperation": genUnaryOperation,
663
- "astWith": genWith,
664
- }
665
-
666
- evaluationHandler = {
667
- "astFunctionReference": evaluateFunctionReference,
668
- "astQnameLiteral": evaluateQnameLiteral,
669
- "astStringLiteral": evaluateStringLiteral,
670
- "astVariableAssignment": evaluateVariableAssignment,
671
- "astVariableReference": evaluateVariableReference,
672
- }
673
- formulaMethodSyntaxPatterns = {
674
- #"abs": _abs,
675
- #"add-time-period": _addTimePeriod,
676
- #"balance": _balance,
677
- #"concept": _concept,
678
- #"concepts": _concepts,
679
- #"contains": _contains,
680
- #"credit": _credit,
681
- #"days": _days,
682
- #"debit": _debit,
683
- #"decimals": _decimals,
684
- #"dimension": _dimension,
685
- #"dts-document-locations": _dtsDocumentLocations,
686
- #"duration": _duration,
687
- #"end-date": _endDate,
688
- #"ends-with": _endsWith,
689
- #"entity": _entityMethod,
690
- #"exp": _exp,
691
- #"has-decimals": _hasDecimals,
692
- #"has-precision":_hasPrecision,
693
- #"identifier": _identifier,
694
- #"index-of": _indexOf,
695
- #"instant": _instant,
696
- #"is-forever": _isForever,
697
- #"is-monetary": _isMonetary,
698
- #"is-numeric": _isNumeric,
699
- #"last-index-of":_lastIndexOf,
700
- #"ln": _ln,
701
- #"length": _length,
702
- #"local-part": _localPart,
703
- #"log": _log,
704
- #"log10": _log10,
705
- #"lower-case": _lowerCase,
706
- #"name": _name,
707
- #"period": _period,
708
- #"period-type": _periodType,
709
- #"power": _power,
710
- #"precision": _precision,
711
- #"primary": _primary,
712
- #"replace": _replace,
713
- #"round": _roundItem,
714
- #"round-by-decimals": _roundDecimals,
715
- #"round-by-precision": _roundPrecision,
716
- #"scenario": _scenario,
717
- #"schema-type": _schemaTypeMethod,
718
- #"scheme": _scheme,
719
- #"segment": _segment,
720
- #"signum": _signum,
721
- #"size": _size,
722
- #"sqrt": _sqrt,
723
- #"start-date": _startDate,
724
- #"starts-with": _startsWith,
725
- #"subtract-time-period": _subtractTimePeriod,
726
- #"taxonomy": _taxonomy,
727
- #"to-list": _toList,
728
- #"to-set": _toSet,
729
- #"tuple": _tuple,
730
- #"unit": _unitMethod,
731
- #"unknown": _notImplemented,
732
- #"upper-case": _upperCase,
733
- #"xbrl-type": _xbrlTypeMethod,
734
-
735
- #networks
736
- #"concept-hypercube-all": _conceptHypercubeAll,
737
- #"concept-hypercube-all-networks": _conceptHypercubeAllNetworks,
738
- #"concept-hypercube-not-all": _conceptHypercubeNotAll,
739
- #"concept-hypercube-not-all-networks": _conceptHypercubeNotAllNetworks,
740
- #"dimension-default": _dimensionDefault,
741
- #"dimension-default-networks": _dimensionDefaultNetworks,
742
- #"dimension-domain": _dimensionDomain,
743
- #"dimension-domain-networks": _dimensionDomainNetworks,
744
- #"domain-member": _domainMember,
745
- #"domain-member-networks": _domainMemberNetworks,
746
- #"essence-alias": _essenceAlias,
747
- #"essence-alias-networks": _essenceAliasNetworks,
748
- #"general-special": _generalSpecial,
749
- #"general-special-networks": _generalSpecialNetworks,
750
- #"generic-link": _genericLink,
751
- #"generic-link-networks": _genericLinkNetworks,
752
- #"hypercube-dimension": _hypercubeDimension,
753
- #"hypercube-dimension-networks": _hypercubeDimensionNetworks,
754
- #"network": _network,
755
- #"networks": _networks,
756
- #"parent-child": _parentChild,
757
- #"parent-child-networks": _parentChildNetworks,
758
- #"requires-element": _requiresElement,
759
- #"requires-element-networks": _requiresElementNetworks,
760
- #"similar-tuples": _similarTuples,
761
- #"similar-tuples-networks": _similarTuplesNetworks,
762
- #"summation-item": _summationItem,
763
- #"summation-item-networks": _summationItemNetworks,
764
-
765
- #network methods
766
- #"ancestors": _ancestors,
767
- #"ancestor-relationships": _ancestorRelationships,
768
- #"arc-name": _arcName,
769
- #"arcrole": _arcrole,
770
- #"children": _children,
771
- #"concepts": _concepts,
772
- #"descendant-relationships": _descendantRelationships,
773
- #"descendants": _descendants,
774
- #"extended-link-name": _extendedLinkName,
775
- #"incoming-relationships": _incomingRelationships,
776
- #"outgoing-relationships": _outgoingRelationships,
777
- #"parents": _parents,
778
- #"relationships": _relationships,
779
- #"role": _linkRole,
780
- #"source-concepts": _sourceConcepts,
781
- #"target-concepts": _targetConcepts,
782
-
783
- #relationship methods
784
- #"order": _order,
785
- #"preferred-label": _preferredLabel,
786
- #"source": _source,
787
- #"target": _target,
788
- #"weight": _weight,
789
- }
790
-
791
- formulaFunctionSyntaxPatterns = {
792
- "boolean": ("xs:boolean(", ")"),
793
- #"current-date-as-utc": _todayUTC,
794
- # "duration": _durationFunction,
795
- "entity": ("(", ")"),
796
- #"forever": _foreverFunction,
797
- "instant": ("xs:date(", ")"),
798
- "number": ("number(", ")"),
799
- #"schema-type": _schemaTypeFunction,
800
- #"time-period": _timePeriodFunction,
801
- #"unit": _unitFunction,
802
- }
803
-
804
- aggreativeFunctions = {
805
- "all": ("every $test in (", ") satisfies $test)"),
806
- "any": ("some $test in (", ") satisfies $test)"),
807
- "avg": ("avg(", ")"),
808
- "count": ("count(", ")"),
809
- "exists": ("exists(", ")"),
810
- "first": ("(", ")[1]"),
811
- "list": ("(", ")"),
812
- "max": ("max(", ")"),
813
- #"median": _median,
814
- "min": ("min(", ")"),
815
- "missing": ("empty(", ")"),
816
- #"mode": _mode,
817
- #"modes": _modes,
818
- #"set": _set,
819
- #"stdevp": _stdevp,
820
- "sum": ("sum(", ")"),
821
- #"var": _var,
822
- #"varp": _varp,
823
- }