arelle-release 2.37.47__py3-none-any.whl → 2.37.48__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.
Potentially problematic release.
This version of arelle-release might be problematic. Click here for more details.
- arelle/CntlrCmdLine.py +5 -1
- arelle/ModelObjectFactory.py +18 -2
- arelle/_version.py +2 -2
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.48.dist-info}/METADATA +1 -1
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.48.dist-info}/RECORD +9 -94
- arelle/archive/CustomLogger.py +0 -43
- arelle/archive/LoadEFMvalidate.py +0 -32
- arelle/archive/LoadSavePreLbCsv.py +0 -26
- arelle/archive/LoadValidate.cs +0 -31
- arelle/archive/LoadValidate.py +0 -36
- arelle/archive/LoadValidateCmdLine.java +0 -69
- arelle/archive/LoadValidatePostedZip.java +0 -57
- arelle/archive/LoadValidateWebService.java +0 -34
- arelle/archive/SaveTableToExelle.py +0 -140
- arelle/archive/TR3toTR4.py +0 -88
- arelle/archive/plugin/ESEF_2022/__init__.py +0 -47
- arelle/archive/plugin/bigInstance.py +0 -394
- arelle/archive/plugin/cmdWebServerExtension.py +0 -43
- arelle/archive/plugin/crashTest.py +0 -38
- arelle/archive/plugin/functionsXmlCreation.py +0 -106
- arelle/archive/plugin/hello_i18n.pot +0 -26
- arelle/archive/plugin/hello_i18n.py +0 -32
- arelle/archive/plugin/importTestChild1.py +0 -21
- arelle/archive/plugin/importTestChild2.py +0 -22
- arelle/archive/plugin/importTestGrandchild1.py +0 -21
- arelle/archive/plugin/importTestGrandchild2.py +0 -21
- arelle/archive/plugin/importTestImported1.py +0 -23
- arelle/archive/plugin/importTestImported11.py +0 -22
- arelle/archive/plugin/importTestParent.py +0 -48
- arelle/archive/plugin/instanceInfo.py +0 -306
- arelle/archive/plugin/loadFromOIM-2018.py +0 -1282
- arelle/archive/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
- arelle/archive/plugin/objectmaker.py +0 -285
- arelle/archive/plugin/packagedImportTest/__init__.py +0 -47
- arelle/archive/plugin/packagedImportTest/importTestChild1.py +0 -21
- arelle/archive/plugin/packagedImportTest/importTestChild2.py +0 -22
- arelle/archive/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
- arelle/archive/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
- arelle/archive/plugin/packagedImportTest/importTestImported1.py +0 -24
- arelle/archive/plugin/packagedImportTest/importTestImported11.py +0 -21
- arelle/archive/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
- arelle/archive/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
- arelle/archive/plugin/sakaCalendar.py +0 -215
- arelle/archive/plugin/saveInstanceInfoset.py +0 -121
- arelle/archive/plugin/sphinx/FormulaGenerator.py +0 -823
- arelle/archive/plugin/sphinx/SphinxContext.py +0 -404
- arelle/archive/plugin/sphinx/SphinxEvaluator.py +0 -783
- arelle/archive/plugin/sphinx/SphinxMethods.py +0 -1287
- arelle/archive/plugin/sphinx/SphinxParser.py +0 -1093
- arelle/archive/plugin/sphinx/SphinxValidator.py +0 -163
- arelle/archive/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
- arelle/archive/plugin/sphinx/__init__.py +0 -285
- arelle/archive/plugin/streamingExtensions.py +0 -335
- arelle/archive/plugin/updateTableLB.py +0 -242
- arelle/archive/plugin/validate/SBRnl/CustomLoader.py +0 -19
- arelle/archive/plugin/validate/SBRnl/DTS.py +0 -305
- arelle/archive/plugin/validate/SBRnl/Dimensions.py +0 -357
- arelle/archive/plugin/validate/SBRnl/Document.py +0 -799
- arelle/archive/plugin/validate/SBRnl/Filing.py +0 -467
- arelle/archive/plugin/validate/SBRnl/__init__.py +0 -75
- arelle/archive/plugin/validate/SBRnl/config.xml +0 -26
- arelle/archive/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
- arelle/archive/plugin/validate/USBestPractices.py +0 -570
- arelle/archive/plugin/validate/USCorpAction.py +0 -557
- arelle/archive/plugin/validate/USSecTagging.py +0 -337
- arelle/archive/plugin/validate/XDC/__init__.py +0 -77
- arelle/archive/plugin/validate/XDC/config.xml +0 -20
- arelle/archive/plugin/validate/XFsyntax/__init__.py +0 -64
- arelle/archive/plugin/validate/XFsyntax/xf.py +0 -2227
- arelle/archive/plugin/validate/calc2.py +0 -536
- arelle/archive/plugin/validateSchemaLxml.py +0 -156
- arelle/archive/plugin/validateTableInfoset.py +0 -52
- arelle/archive/us-gaap-dei-docType-extraction-frm.xml +0 -90
- arelle/archive/us-gaap-dei-ratio-cash-frm.xml +0 -150
- arelle/examples/plugin/formulaSuiteConverter.py +0 -212
- arelle/examples/plugin/functionsCustom.py +0 -59
- arelle/examples/plugin/hello_dolly.py +0 -64
- arelle/examples/plugin/multi.py +0 -58
- arelle/examples/plugin/rssSaveOim.py +0 -96
- arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
- arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
- arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -50
- arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
- arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
- arelle/examples/plugin/validate/XYZ/rules/__init__.py +0 -0
- arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -110
- arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -59
- arelle/scripts-macOS/startWebServer.command +0 -3
- arelle/scripts-unix/startWebServer.sh +0 -1
- arelle/scripts-windows/startWebServer.bat +0 -5
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.48.dist-info}/WHEEL +0 -0
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.48.dist-info}/entry_points.txt +0 -0
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.48.dist-info}/licenses/LICENSE.md +0 -0
- {arelle_release-2.37.47.dist-info → arelle_release-2.37.48.dist-info}/top_level.txt +0 -0
|
@@ -1,1287 +0,0 @@
|
|
|
1
|
-
'''
|
|
2
|
-
sphinxMethods processes the Sphinx language in the context of an XBRL DTS and instance.
|
|
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
|
-
from math import exp, fabs, isinf, isnan, log, log10, pow, sqrt
|
|
13
|
-
import datetime
|
|
14
|
-
from arelle.ModelDtsObject import ModelConcept, ModelRelationship
|
|
15
|
-
from arelle.ModelDocument import Type
|
|
16
|
-
from arelle.ModelInstanceObject import ModelFact
|
|
17
|
-
from arelle.ModelRelationshipSet import ModelRelationshipSet
|
|
18
|
-
from arelle.ModelValue import QName, dayTimeDuration, DayTimeDuration
|
|
19
|
-
from arelle.ModelXbrl import ModelXbrl
|
|
20
|
-
from arelle.ValidateXbrlCalcs import inferredDecimals, inferredPrecision, roundValue
|
|
21
|
-
from arelle import XbrlConst, XmlUtil
|
|
22
|
-
from numbers import Number
|
|
23
|
-
evaluate = None # initialized at end
|
|
24
|
-
SphinxException = None
|
|
25
|
-
UNBOUND = None
|
|
26
|
-
NONE = None
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
def moduleInit():
|
|
30
|
-
global evaluate, SphinxException, UNBOUND, NONE
|
|
31
|
-
from .SphinxEvaluator import evaluate, SphinxException, UNBOUND, NONE
|
|
32
|
-
|
|
33
|
-
class Balance(): # fake class for balance type
|
|
34
|
-
pass
|
|
35
|
-
|
|
36
|
-
class PeriodType(): # fake class for period type
|
|
37
|
-
pass
|
|
38
|
-
|
|
39
|
-
class Period():
|
|
40
|
-
def __init__(self, start=None, end=None):
|
|
41
|
-
self.start = start
|
|
42
|
-
self.end = end
|
|
43
|
-
@property
|
|
44
|
-
def isForever(self):
|
|
45
|
-
return self.start is None and self.end is None
|
|
46
|
-
@property
|
|
47
|
-
def isInstant(self):
|
|
48
|
-
return self.start is None and self.end is not None
|
|
49
|
-
@property
|
|
50
|
-
def isStartEnd(self):
|
|
51
|
-
return self.start is not None and self.end is not None
|
|
52
|
-
def __repr__(self):
|
|
53
|
-
return "({0},{1})".format(self.start, self.end)
|
|
54
|
-
def __eq__(self, other):
|
|
55
|
-
if isinstance(other, Period):
|
|
56
|
-
return self.start == other.start and self.end == other.end
|
|
57
|
-
return False
|
|
58
|
-
def __ne__(self, other):
|
|
59
|
-
if isinstance(other, Period):
|
|
60
|
-
return self.start != other.start or self.end != other.end
|
|
61
|
-
return False
|
|
62
|
-
def __lt__(self, other):
|
|
63
|
-
if not isinstance(other, Period):
|
|
64
|
-
return False
|
|
65
|
-
if self.isInstant:
|
|
66
|
-
if other.isInstant:
|
|
67
|
-
return self.end < other.end
|
|
68
|
-
elif other.isStartEnd:
|
|
69
|
-
return self.end <= other.start
|
|
70
|
-
elif self.isStartEnd:
|
|
71
|
-
if other.isInstant:
|
|
72
|
-
return self.end < other.end
|
|
73
|
-
elif other.isStartEnd:
|
|
74
|
-
return self.end <= other.start
|
|
75
|
-
return False
|
|
76
|
-
def __le__(self, other):
|
|
77
|
-
if not isinstance(other, Period):
|
|
78
|
-
return False
|
|
79
|
-
if self.isInstant:
|
|
80
|
-
if other.isInstant:
|
|
81
|
-
return self.end <= other.end
|
|
82
|
-
elif other.isStartEnd:
|
|
83
|
-
return self.end <= other.start or self == other
|
|
84
|
-
elif self.isStartEnd:
|
|
85
|
-
if other.isInstant:
|
|
86
|
-
return self.end <= other.end
|
|
87
|
-
elif other.isStartEnd:
|
|
88
|
-
return self.end <= other.start or self == other
|
|
89
|
-
return False
|
|
90
|
-
def __gt__(self, other):
|
|
91
|
-
if not isinstance(other, Period):
|
|
92
|
-
return False
|
|
93
|
-
if self.isInstant:
|
|
94
|
-
if other.isInstant:
|
|
95
|
-
return self.end > other.end
|
|
96
|
-
elif other.isStartEnd:
|
|
97
|
-
return self.start > other.end
|
|
98
|
-
elif self.isStartEnd:
|
|
99
|
-
if other.isInstant:
|
|
100
|
-
return self.end > other.end
|
|
101
|
-
elif other.isStartEnd:
|
|
102
|
-
return self.start > other.end
|
|
103
|
-
return False
|
|
104
|
-
def __ge__(self, other):
|
|
105
|
-
if not isinstance(other, Period):
|
|
106
|
-
return False
|
|
107
|
-
if self.isInstant:
|
|
108
|
-
if other.isInstant:
|
|
109
|
-
return self.end >= other.end
|
|
110
|
-
elif other.isStartEnd:
|
|
111
|
-
return self.start >= other.start or self == other
|
|
112
|
-
elif self.isStartEnd:
|
|
113
|
-
if other.isInstant:
|
|
114
|
-
return self.end >= other.end
|
|
115
|
-
elif other.isStartEnd:
|
|
116
|
-
return self.start >= other.start or self == other
|
|
117
|
-
return False
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
def hasArg(node, sphinxContext, args, i):
|
|
121
|
-
if i >= len(args):
|
|
122
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
123
|
-
_("Function %(name)s requires %(required)s parameters but %(provided)s are provided"),
|
|
124
|
-
name=node.name, required=i, provided=len(node.args))
|
|
125
|
-
|
|
126
|
-
def numericArg(node, sphinxContext, args, i):
|
|
127
|
-
hasArg(node, sphinxContext, args, i)
|
|
128
|
-
arg = args[i]
|
|
129
|
-
if isinstance(arg, Number):
|
|
130
|
-
return arg
|
|
131
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
132
|
-
_("Function %(name)s numeric parameter %(num)s is not a number: %(value)s"),
|
|
133
|
-
name=node.name, num=i, value=arg)
|
|
134
|
-
|
|
135
|
-
def numericArgs(node, sphinxContext, args, expectedArgsLen):
|
|
136
|
-
if expectedArgsLen != len(args):
|
|
137
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
138
|
-
_("Function %(name)s requires %(required)s parameters but %(provided)s are provided"),
|
|
139
|
-
name=node.name, required=expectedArgsLen, provided=len(args))
|
|
140
|
-
numArgs = []
|
|
141
|
-
for i, arg in enumerate(args):
|
|
142
|
-
if i >= expectedArgsLen:
|
|
143
|
-
break
|
|
144
|
-
value = evaluate(arg, sphinxContext, args, value=True)
|
|
145
|
-
if not isinstance(value, Number):
|
|
146
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
147
|
-
_("Function %(name)s numeric parameters but %(num)s is not numeric: %(value)s"),
|
|
148
|
-
num=i, value=value)
|
|
149
|
-
value = 0
|
|
150
|
-
numArgs.append(value)
|
|
151
|
-
for i in range(i, expectedArgsLen):
|
|
152
|
-
numArgs.append(0)
|
|
153
|
-
return numArgs
|
|
154
|
-
|
|
155
|
-
def strArg(node, sphinxContext, args, i):
|
|
156
|
-
hasArg(node, sphinxContext, args, i)
|
|
157
|
-
arg = args[i]
|
|
158
|
-
if isinstance(arg, str):
|
|
159
|
-
return arg
|
|
160
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
161
|
-
_("Function %(name)s string parameter %(num)s is not a string: %(value)s"),
|
|
162
|
-
name=node.name, num=i, value=arg)
|
|
163
|
-
|
|
164
|
-
def strArgs(node, sphinxContext, args, expectedArgsLen):
|
|
165
|
-
if expectedArgsLen != len(args):
|
|
166
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
167
|
-
_("Function %(name)s requires %(required)s parameters but %(provided)s are provided"),
|
|
168
|
-
name=node.name, required=expectedArgsLen, provided=len(args))
|
|
169
|
-
strArgs = []
|
|
170
|
-
for i, arg in enumerate(args):
|
|
171
|
-
if i >= expectedArgsLen:
|
|
172
|
-
break
|
|
173
|
-
value = evaluate(arg, sphinxContext, value=True)
|
|
174
|
-
if not isinstance(value, str):
|
|
175
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
176
|
-
_("Function %(name)s string parameters but %(num)s is not numeric: %(value)s"),
|
|
177
|
-
name=node.name, num=i, value=value)
|
|
178
|
-
value = 0
|
|
179
|
-
strArgs.append(value)
|
|
180
|
-
for i in range(i, expectedArgsLen):
|
|
181
|
-
strArgs.append(0)
|
|
182
|
-
return strArgs
|
|
183
|
-
|
|
184
|
-
def factArg(node, sphinxContext, args, i):
|
|
185
|
-
hasArg(node, sphinxContext, args, i)
|
|
186
|
-
fact = evaluate(args[i], sphinxContext, value=False, hsBoundFact=True)
|
|
187
|
-
if isinstance(fact, ModelFact):
|
|
188
|
-
return fact
|
|
189
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
190
|
-
_("Function %(name)s fact parameter %(num)s is not a fact: %(value)s"),
|
|
191
|
-
name=node.name,
|
|
192
|
-
num=i, value=fact)
|
|
193
|
-
|
|
194
|
-
def conceptOrFactArg(node, sphinxContext, args, i):
|
|
195
|
-
hasArg(node, sphinxContext, args, i)
|
|
196
|
-
conceptOrFact = evaluate(args[i], sphinxContext, value=False)
|
|
197
|
-
if isinstance(conceptOrFact, (ModelConcept,ModelFact)):
|
|
198
|
-
return conceptOrFact
|
|
199
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
200
|
-
_("Function %(name)s parameter %(num)s is not a concept or fact: %(value)s"),
|
|
201
|
-
name=node.name,
|
|
202
|
-
num=i, value=conceptOrFact)
|
|
203
|
-
|
|
204
|
-
def conceptArg(node, sphinxContext, args, i):
|
|
205
|
-
hasArg(node, sphinxContext, args, i)
|
|
206
|
-
concept = evaluate(args[i], sphinxContext, value=False)
|
|
207
|
-
if isinstance(concept, ModelConcept):
|
|
208
|
-
return concept
|
|
209
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
210
|
-
_("Function %(name)s fact parameter %(num)s is not a concept: %(value)s"),
|
|
211
|
-
name=node.name,
|
|
212
|
-
num=i, value=concept)
|
|
213
|
-
|
|
214
|
-
def dtsArg(node, sphinxContext, args):
|
|
215
|
-
hasArg(node, sphinxContext, args, 0)
|
|
216
|
-
dts = evaluate(args[0], sphinxContext, value=False)
|
|
217
|
-
if isinstance(dts, ModelXbrl):
|
|
218
|
-
return dts
|
|
219
|
-
raise SphinxException(node, "sphinx.methodArgumentsMismatch",
|
|
220
|
-
_("Method %(name)s taxonomy parameter is not a DTS: %(value)s"),
|
|
221
|
-
name=node.name, value=dts)
|
|
222
|
-
|
|
223
|
-
def networkArg(node, sphinxContext, args):
|
|
224
|
-
hasArg(node, sphinxContext, args, 0)
|
|
225
|
-
network = evaluate(args[0], sphinxContext, value=False)
|
|
226
|
-
if isinstance(network, ModelRelationshipSet):
|
|
227
|
-
return network
|
|
228
|
-
raise SphinxException(node, "sphinx.methodArgumentsMismatch",
|
|
229
|
-
_("Method %(name)s taxonomy parameter is not a network: %(value)s"),
|
|
230
|
-
name=node.name, value=network)
|
|
231
|
-
|
|
232
|
-
def networkConceptArg(node, sphinxContext, args):
|
|
233
|
-
hasArg(node, sphinxContext, args, 1)
|
|
234
|
-
arg = args[1]
|
|
235
|
-
if isinstance(arg, QName):
|
|
236
|
-
arg = network.modelXbrl.qnameConcepts.get(arg, NONE)
|
|
237
|
-
if isinstance(arg, ModelConcept):
|
|
238
|
-
return arg
|
|
239
|
-
raise SphinxException(node, "sphinx.methodArgumentsMismatch",
|
|
240
|
-
_("Method %(name)s network concept parameter is not a concept: %(value)s"),
|
|
241
|
-
name=node.name, value=arg)
|
|
242
|
-
|
|
243
|
-
def relationshipArg(node, sphinxContext, args):
|
|
244
|
-
hasArg(node, sphinxContext, args, 0)
|
|
245
|
-
rel = evaluate(args[0], sphinxContext, value=False)
|
|
246
|
-
if isinstance(rel, ModelRelationship):
|
|
247
|
-
return rel
|
|
248
|
-
raise SphinxException(node, "sphinx.methodArgumentsMismatch",
|
|
249
|
-
_("Method %(name)s taxonomy parameter is not a relationship: %(value)s"),
|
|
250
|
-
name=node.name, value=rel)
|
|
251
|
-
|
|
252
|
-
# numeric functions
|
|
253
|
-
NaN = float("NaN")
|
|
254
|
-
POSINF = float("INF")
|
|
255
|
-
NEGINF = float("-INF")
|
|
256
|
-
|
|
257
|
-
def _addTimePeriod(node, sphinxContext, args, subtract=False):
|
|
258
|
-
hasArg(node, sphinxContext, args, 0)
|
|
259
|
-
arg = args[0]
|
|
260
|
-
hasArg(node, sphinxContext, args, 1)
|
|
261
|
-
duration = args[1]
|
|
262
|
-
if isinstance(arg, Period) and arg.isInstant and isinstance(duration, DayTimeDuration):
|
|
263
|
-
try:
|
|
264
|
-
return Period(None, (arg.end - duration) if subtract else (arg.end + duration))
|
|
265
|
-
except ValueError:
|
|
266
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
267
|
-
_("Function %(name)s argument is not an day time duration %(value)s"),
|
|
268
|
-
name=node.name, value=duration)
|
|
269
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
270
|
-
_("Function %(name)s argument is not an instant period %(value)s"),
|
|
271
|
-
name=node.name, value=arg)
|
|
272
|
-
|
|
273
|
-
def _abs(node, sphinxContext, args):
|
|
274
|
-
args = numericArgs(node, sphinxContext, args, 1)
|
|
275
|
-
return fabs(args[0])
|
|
276
|
-
|
|
277
|
-
def _balance(node, sphinxContext, args):
|
|
278
|
-
if len(node.args) == 1 and node.args[0] is None:
|
|
279
|
-
return Balance()
|
|
280
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
281
|
-
return fact.balance
|
|
282
|
-
|
|
283
|
-
def _booleanFunction(node, sphinxContext, args):
|
|
284
|
-
hasArg(node, sphinxContext, args, 0)
|
|
285
|
-
arg = args[0]
|
|
286
|
-
# >>>> arg can be XML, what does this mean???
|
|
287
|
-
if arg == "true":
|
|
288
|
-
return True
|
|
289
|
-
if args[0] == "false":
|
|
290
|
-
return False
|
|
291
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
292
|
-
_("Function %(name)s fact parameter %(num)s is not \"true\" or \"false\": %(value)s"),
|
|
293
|
-
name=node.name,
|
|
294
|
-
num=0, value=arg)
|
|
295
|
-
|
|
296
|
-
def _concept(node, sphinxContext, args):
|
|
297
|
-
hasArg(node, sphinxContext, args, 0)
|
|
298
|
-
if isinstance(args[0], ModelXbrl):
|
|
299
|
-
dts = dtsArg(node, sphinxContext, args)
|
|
300
|
-
hasArg(node, sphinxContext, args, 1)
|
|
301
|
-
return dts.qnameConcepts.get(args[1], UNBOUND)
|
|
302
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
303
|
-
return fact.concept
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
def _concepts(node, sphinxContext, args):
|
|
307
|
-
hasArg(node, sphinxContext, args, 0)
|
|
308
|
-
if isinstance(args[0], ModelXbrl): # taxonomy concepts
|
|
309
|
-
dts = dtsArg(node, sphinxContext, args)
|
|
310
|
-
return set(concept
|
|
311
|
-
for concept in dts.qnameConcepts.values()
|
|
312
|
-
if concept.isItem or concept.isTuple)
|
|
313
|
-
# otherwise must be network concepts
|
|
314
|
-
network = networkArg(node, sphinxContext, args)
|
|
315
|
-
return network.toModelObjects.keys() | network.fromModelObjects.keys()
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
def _contains(node, sphinxContext, args):
|
|
319
|
-
hasArg(node, sphinxContext, args, 1)
|
|
320
|
-
collection = args[0]
|
|
321
|
-
arg = args[1]
|
|
322
|
-
# period contains
|
|
323
|
-
if isinstance(arg, (Period, datetime.datetime)) and isinstance(collection, Period):
|
|
324
|
-
if collection.isForever:
|
|
325
|
-
return True
|
|
326
|
-
if collection.isDuration:
|
|
327
|
-
if isinstance(arg, datetime):
|
|
328
|
-
return collection.start <= arg <= collection.end
|
|
329
|
-
elif arg.isInstant:
|
|
330
|
-
return collection.start <= arg.end <= collection.end
|
|
331
|
-
elif arg.isDuration:
|
|
332
|
-
return collection.start <= arg.start <= collection.end and collection.start <= arg.end <= collection.end
|
|
333
|
-
if collection.isInstant:
|
|
334
|
-
if isinstance(arg, datetime):
|
|
335
|
-
return collection.end == arg
|
|
336
|
-
if arg.isInstant:
|
|
337
|
-
return collection.end == arg.end
|
|
338
|
-
return False
|
|
339
|
-
# non-period contains
|
|
340
|
-
if isinstance(collection, (tuple, list, set, str)):
|
|
341
|
-
return arg in collection
|
|
342
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
343
|
-
_("Function %(name)s argument is not a collection %(value)s"),
|
|
344
|
-
name=node.name, value=collection)
|
|
345
|
-
|
|
346
|
-
def _credit(node, sphinxContext, args):
|
|
347
|
-
hasArg(node, sphinxContext, args, 0)
|
|
348
|
-
if isinstance(args[0], Balance):
|
|
349
|
-
return "credit"
|
|
350
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
351
|
-
_("Function %(name)s argument is not a ::balance %(value)s"),
|
|
352
|
-
name=node.name, value=args[0])
|
|
353
|
-
|
|
354
|
-
def _days(node, sphinxContext, args):
|
|
355
|
-
hasArg(node, sphinxContext, args, 0)
|
|
356
|
-
arg = args[0]
|
|
357
|
-
if isinstance(arg, Period):
|
|
358
|
-
if arg.isInstant:
|
|
359
|
-
return 0
|
|
360
|
-
elif arg.isForever:
|
|
361
|
-
return float("inf")
|
|
362
|
-
return (arg.end - arg.start).days
|
|
363
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
364
|
-
_("Function %(name)s argument is not a period %(value)s"),
|
|
365
|
-
name=node.name, value=arg)
|
|
366
|
-
|
|
367
|
-
def _debit(node, sphinxContext, args):
|
|
368
|
-
hasArg(node, sphinxContext, args, 0)
|
|
369
|
-
if isinstance(args[0], Balance):
|
|
370
|
-
return "debit"
|
|
371
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
372
|
-
_("Function %(name)s argument is not a ::balance %(value)s"),
|
|
373
|
-
name=node.name, value=args[0])
|
|
374
|
-
|
|
375
|
-
def _decimals(node, sphinxContext, args):
|
|
376
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
377
|
-
return inferredDecimals(fact)
|
|
378
|
-
|
|
379
|
-
def _dimension(node, sphinxContext, args):
|
|
380
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
381
|
-
hasArg(node, sphinxContext, args, 1)
|
|
382
|
-
dimQName = args[1]
|
|
383
|
-
context = fact.context
|
|
384
|
-
if context is not None and dimQName in context.qnameDims:
|
|
385
|
-
modelDimension = context.qnameDims[dimQName]
|
|
386
|
-
if modelDimension.isExplicit:
|
|
387
|
-
return modelDimension.memberQname
|
|
388
|
-
else:
|
|
389
|
-
return modelDimension.typedMember
|
|
390
|
-
return NONE
|
|
391
|
-
|
|
392
|
-
def _dtsDocumentLocations(node, sphinxContext, args):
|
|
393
|
-
dts = dtsArg(node, sphinxContext, args)
|
|
394
|
-
return set(modelDocument.uri
|
|
395
|
-
for modelDocument in dts.urlDocs.values()
|
|
396
|
-
if modelDocument.type in (Type.SCHEMA, Type.LINKBASE))
|
|
397
|
-
|
|
398
|
-
def _duration(node, sphinxContext, args):
|
|
399
|
-
hasArg(node, sphinxContext, args, 0)
|
|
400
|
-
if isinstance(args[0], PeriodType):
|
|
401
|
-
return "duration"
|
|
402
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
403
|
-
_("Function %(name)s argument is not a ::period-type %(value)s"),
|
|
404
|
-
name=node.name, value=args[0])
|
|
405
|
-
|
|
406
|
-
def _durationFunction(node, sphinxContext, args):
|
|
407
|
-
hasArg(node, sphinxContext, args, 1)
|
|
408
|
-
startArg = args[0]
|
|
409
|
-
if isinstance(startArg, str):
|
|
410
|
-
startDateTime = Period(None, XmlUtil.datetimeValue(startArg, none=NONE))
|
|
411
|
-
elif isinstance(startArg, datetime.datetime):
|
|
412
|
-
startDateTime = startArg
|
|
413
|
-
elif isinstance(arg, datetime.date):
|
|
414
|
-
startDateTime = datetime.date(startArg.year, startArg.month, startArg.day)
|
|
415
|
-
endArg = args[1]
|
|
416
|
-
if isinstance(endArg, str):
|
|
417
|
-
endDateTime = Period(None, XmlUtil.datetimeValue(startArg, addOneDay=True, none=NONE))
|
|
418
|
-
elif isinstance(endArg, datetime.datetime):
|
|
419
|
-
endDateTime = endArg
|
|
420
|
-
elif isinstance(endArg, datetime.date):
|
|
421
|
-
endDateTime = datetime.date(endArg.year, endArg.month, endArg.day) + datetime.timedelta(1)
|
|
422
|
-
if (startDateTime and endDateTime):
|
|
423
|
-
return Period(startDateTime, endDateTime)
|
|
424
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
425
|
-
_("Function %(name)s requires two argument that are a date or datetime string or value: %(start)s and %(end)s", ),
|
|
426
|
-
name=node.name, start=startArg, end=endArg)
|
|
427
|
-
|
|
428
|
-
def _endDate(node, sphinxContext, args):
|
|
429
|
-
hasArg(node, sphinxContext, args, 0)
|
|
430
|
-
arg = args[0]
|
|
431
|
-
if isinstance(arg, Period):
|
|
432
|
-
if arg.isForever:
|
|
433
|
-
return UNBOUND
|
|
434
|
-
return arg.end
|
|
435
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
436
|
-
_("Function %(name)s argument is not a period %(value)s"),
|
|
437
|
-
name=node.name, value=arg)
|
|
438
|
-
|
|
439
|
-
def _endsWith(node, sphinxContext, args):
|
|
440
|
-
value = strArgs(node, sphinxContext, args, 0)
|
|
441
|
-
suffix = strArgs(node, sphinxContext, args, 1)
|
|
442
|
-
return value.endswith(suffix)
|
|
443
|
-
|
|
444
|
-
def _entityMethod(node, sphinxContext, args):
|
|
445
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
446
|
-
if fact.context is not None:
|
|
447
|
-
return fact.context.entityIdentifier
|
|
448
|
-
else:
|
|
449
|
-
return UNBOUND
|
|
450
|
-
|
|
451
|
-
def _entityFunction(node, sphinxContext, args):
|
|
452
|
-
args = strArgs(node, sphinxContext, args, 2)
|
|
453
|
-
return (args[0], args[1])
|
|
454
|
-
|
|
455
|
-
def _exp(node, sphinxContext, args):
|
|
456
|
-
args = numericArgs(node, sphinxContext, args, 1)
|
|
457
|
-
x = args[0]
|
|
458
|
-
if isnan(x): return NaN
|
|
459
|
-
if x == POSINF: return POSINF
|
|
460
|
-
if x == NEGINF: return 0
|
|
461
|
-
return exp(x)
|
|
462
|
-
|
|
463
|
-
def _foreverFunction(node, sphinxContext, args):
|
|
464
|
-
return Period(None, None)
|
|
465
|
-
|
|
466
|
-
def _identifier(node, sphinxContext, args):
|
|
467
|
-
hasArg(node, sphinxContext, args, 0)
|
|
468
|
-
arg = args[0]
|
|
469
|
-
if isinstance(arg, tuple) and len(arg) == 2:
|
|
470
|
-
return arg[1]
|
|
471
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
472
|
-
_("Function %(name)s argument is not an entity identifier %(value)s"),
|
|
473
|
-
name=node.name, value=arg)
|
|
474
|
-
|
|
475
|
-
def _hasDecimals(node, sphinxContext, args):
|
|
476
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
477
|
-
return fact.decimals is not None
|
|
478
|
-
|
|
479
|
-
def _indexOf(node, sphinxContext, args):
|
|
480
|
-
value = strArgs(node, sphinxContext, args, 0)
|
|
481
|
-
arg = strArgs(node, sphinxContext, args, 1)
|
|
482
|
-
return value.find(arg)
|
|
483
|
-
|
|
484
|
-
def _hasPrecision(node, sphinxContext, args):
|
|
485
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
486
|
-
return fact.precision is not None
|
|
487
|
-
|
|
488
|
-
def _instant(node, sphinxContext, args):
|
|
489
|
-
hasArg(node, sphinxContext, args, 0)
|
|
490
|
-
if isinstance(args[0], PeriodType):
|
|
491
|
-
return "instant"
|
|
492
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
493
|
-
_("Function %(name)s argument is not a ::period-type %(value)s"),
|
|
494
|
-
name=node.name, value=args[0])
|
|
495
|
-
|
|
496
|
-
def _instantFunction(node, sphinxContext, args):
|
|
497
|
-
hasArg(node, sphinxContext, args, 0)
|
|
498
|
-
arg = args[0]
|
|
499
|
-
if isinstance(arg, str):
|
|
500
|
-
instDateTime = Period(None, XmlUtil.datetimeValue(arg, addOneDay=True, none=NONE))
|
|
501
|
-
if instDateTime: # none if date is not valid
|
|
502
|
-
return instDateTime
|
|
503
|
-
elif isinstance(arg, datetime.datetime):
|
|
504
|
-
return Period(None, arg)
|
|
505
|
-
elif isinstance(arg, datetime.date): # must be turned into midnight of the day reported
|
|
506
|
-
return Period(None, datetime.date(arg.year, arg.month, arg.day) + datetime.timedelta(1))
|
|
507
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
508
|
-
_("Function %(name)s argument is not a date or datetime string or value %(value)s"),
|
|
509
|
-
name=node.name, value=arg)
|
|
510
|
-
|
|
511
|
-
def _isForever(node, sphinxContext, args):
|
|
512
|
-
hasArg(node, sphinxContext, args, 0)
|
|
513
|
-
arg = args[0]
|
|
514
|
-
if isinstance(arg, Period):
|
|
515
|
-
return arg.isForever
|
|
516
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
517
|
-
_("Function %(name)s argument is not a period %(value)s"),
|
|
518
|
-
name=node.name, value=arg)
|
|
519
|
-
|
|
520
|
-
def _isMonetary(node, sphinxContext, args):
|
|
521
|
-
conceptOrFact = conceptOrFactArg(node, sphinxContext, args, 0)
|
|
522
|
-
if isinstance(conceptOrFact, ModelFact):
|
|
523
|
-
return conceptOrFact.concept.isMonetary
|
|
524
|
-
else:
|
|
525
|
-
return conceptOrFact.isMonetary
|
|
526
|
-
|
|
527
|
-
def _isNumeric(node, sphinxContext, args):
|
|
528
|
-
conceptOrFact = conceptOrFactArg(node, sphinxContext, args, 0)
|
|
529
|
-
return conceptOrFact.isNumeric
|
|
530
|
-
|
|
531
|
-
def _lastIndexOf(node, sphinxContext, args):
|
|
532
|
-
value = strArgs(node, sphinxContext, args, 0)
|
|
533
|
-
arg = strArgs(node, sphinxContext, args, 1)
|
|
534
|
-
return value.rfind(arg)
|
|
535
|
-
|
|
536
|
-
def _length(node, sphinxContext, args):
|
|
537
|
-
value = strArgs(node, sphinxContext, args, 0)
|
|
538
|
-
return len(value)
|
|
539
|
-
|
|
540
|
-
def _lowerCase(node, sphinxContext, args):
|
|
541
|
-
value = strArgs(node, sphinxContext, args, 0)
|
|
542
|
-
return value.lower()
|
|
543
|
-
|
|
544
|
-
def _ln(node, sphinxContext, args):
|
|
545
|
-
args = numericArgs(node, sphinxContext, args, 1)
|
|
546
|
-
x = args[0]
|
|
547
|
-
if x < 0 or isnan(x): return NaN
|
|
548
|
-
if x == POSINF: return POSINF
|
|
549
|
-
if x == 0: return NEGINF
|
|
550
|
-
return log(x)
|
|
551
|
-
|
|
552
|
-
def _localPart(node, sphinxContext, args):
|
|
553
|
-
hasArg(node, sphinxContext, args, 0)
|
|
554
|
-
qn = args[0]
|
|
555
|
-
if isinstance(qn, QName):
|
|
556
|
-
return qn.localName
|
|
557
|
-
elif isinstance(qn, str):
|
|
558
|
-
return qn
|
|
559
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
560
|
-
_("Function %(name)s argument is not a QName %(value)s"),
|
|
561
|
-
name=node.name, value=args[0])
|
|
562
|
-
|
|
563
|
-
def _log(node, sphinxContext, args):
|
|
564
|
-
args = numericArgs(node, sphinxContext, args, 2)
|
|
565
|
-
x = args[0]
|
|
566
|
-
base = args[1]
|
|
567
|
-
if x < 0 or isnan(x): return NaN
|
|
568
|
-
if x == POSINF: return POSINF
|
|
569
|
-
if x == 0: return POSINF
|
|
570
|
-
if base == 0 or base == POSINF: return 0
|
|
571
|
-
if base == 10: return log10(x)
|
|
572
|
-
return log(x, base)
|
|
573
|
-
|
|
574
|
-
def _log10(node, sphinxContext, args):
|
|
575
|
-
args = numericArgs(node, sphinxContext, args, 1)
|
|
576
|
-
x = args[0]
|
|
577
|
-
base = args[1]
|
|
578
|
-
if x < 0 or isnan(x): return NaN
|
|
579
|
-
if x == POSINF: return POSINF
|
|
580
|
-
if x == 0: return POSINF
|
|
581
|
-
return log10(x)
|
|
582
|
-
|
|
583
|
-
def _name(node, sphinxContext, args):
|
|
584
|
-
concept = conceptArg(node, sphinxContext, args, 0)
|
|
585
|
-
return concept.qname
|
|
586
|
-
|
|
587
|
-
def _numberFunction(node, sphinxContext, args):
|
|
588
|
-
hasArg(node, sphinxContext, args, 0)
|
|
589
|
-
arg = args[0]
|
|
590
|
-
try:
|
|
591
|
-
return float(arg)
|
|
592
|
-
except Exception as ex:
|
|
593
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
594
|
-
_("Function %(name)s argument: %(value)s, error converting to number: %(error)s"),
|
|
595
|
-
name=node.name, value=arg, error=str(ex))
|
|
596
|
-
def _period(node, sphinxContext, args):
|
|
597
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
598
|
-
context = fact.context
|
|
599
|
-
if context is not None:
|
|
600
|
-
if context.isForeverPeriod:
|
|
601
|
-
return Period()
|
|
602
|
-
if context.isStartEndPeriod:
|
|
603
|
-
return Period(context.startDatetime, context.endDatetime)
|
|
604
|
-
return Period(None, context.instantDatetime)
|
|
605
|
-
return NONE
|
|
606
|
-
|
|
607
|
-
def _periodType(node, sphinxContext, args):
|
|
608
|
-
if len(node.args) == 1 and node.args[0] is None:
|
|
609
|
-
return PeriodType()
|
|
610
|
-
hasArg(node, sphinxContext, args, 0)
|
|
611
|
-
if isinstance(args[0], Period):
|
|
612
|
-
arg = args[0]
|
|
613
|
-
if arg.isForever:
|
|
614
|
-
return "forever"
|
|
615
|
-
elif arg.isStartEnd:
|
|
616
|
-
return "duration"
|
|
617
|
-
return "instant"
|
|
618
|
-
elif args[0] is NONE: # special case, such as for tuples
|
|
619
|
-
return "none"
|
|
620
|
-
concept = conceptArg(node, sphinxContext, args, 0)
|
|
621
|
-
return concept.periodType
|
|
622
|
-
|
|
623
|
-
def _power(node, sphinxContext, args):
|
|
624
|
-
args = numericArgs(node, sphinxContext, args, 2)
|
|
625
|
-
x = args[0]
|
|
626
|
-
exp = args[1]
|
|
627
|
-
if isnan(exp) or (isnan(x) and exp != 0) or (isinf(exp) and x in (1, -1)):
|
|
628
|
-
return NaN
|
|
629
|
-
if ((x == POSINF and exp > 0) or
|
|
630
|
-
(x == NEGINF and x > 0 and not x & 1) or
|
|
631
|
-
(exp == POSINF and not -1 <= x <= 1) or
|
|
632
|
-
(x == 0 and exp < 0)):
|
|
633
|
-
return POSINF
|
|
634
|
-
if x == NEGINF and x > 0 and x & 1:
|
|
635
|
-
return NEGINF
|
|
636
|
-
return pow(x, exp)
|
|
637
|
-
|
|
638
|
-
def _precision(node, sphinxContext, args):
|
|
639
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
640
|
-
return inferredPrecision(fact)
|
|
641
|
-
|
|
642
|
-
def _primary(node, sphinxContext, args):
|
|
643
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
644
|
-
return fact.qname
|
|
645
|
-
|
|
646
|
-
def _replace(node, sphinxContext, args):
|
|
647
|
-
value = strArgs(node, sphinxContext, args, 0)
|
|
648
|
-
old = strArgs(node, sphinxContext, args, 1)
|
|
649
|
-
new = strArgs(node, sphinxContext, args, 2)
|
|
650
|
-
return value.replace(old, new)
|
|
651
|
-
|
|
652
|
-
def _roundItem(node, sphinxContext, args):
|
|
653
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
654
|
-
return roundValue(fact.xValue, decimals=fact.decimals, precision=fact.precision)
|
|
655
|
-
|
|
656
|
-
def _roundDecimals(node, sphinxContext, args):
|
|
657
|
-
args = numericArgs(node, sphinxContext, args, 2)
|
|
658
|
-
return roundValue(args[0], decmials=args[1])
|
|
659
|
-
|
|
660
|
-
def _roundPrecision(node, sphinxContext, args):
|
|
661
|
-
args = numericArgs(node, sphinxContext, args, 2)
|
|
662
|
-
return roundValue(args[0], precision=args[1])
|
|
663
|
-
|
|
664
|
-
def _schemaTypeFunction(node, sphinxContext, args):
|
|
665
|
-
hasArg(node, sphinxContext, args, 0)
|
|
666
|
-
schemaTypeQn = args[0]
|
|
667
|
-
return schemaTypeQn
|
|
668
|
-
|
|
669
|
-
def _schemaTypeMethod(node, sphinxContext, args):
|
|
670
|
-
concept = conceptArg(node, sphinxContext, args, 0)
|
|
671
|
-
return concept.typeQname
|
|
672
|
-
|
|
673
|
-
def _signum(node, sphinxContext, args):
|
|
674
|
-
args = numericArgs(node, sphinxContext, args, 1)
|
|
675
|
-
x = args[0]
|
|
676
|
-
if x == 0 or isnan(x): return 0
|
|
677
|
-
if x > 0: return 1
|
|
678
|
-
return -1
|
|
679
|
-
|
|
680
|
-
def _scenario(node, sphinxContext, args):
|
|
681
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
682
|
-
return fact.context.segment.nonDimValues("scenario")
|
|
683
|
-
|
|
684
|
-
def _scheme(node, sphinxContext, args):
|
|
685
|
-
hasArg(node, sphinxContext, args, 0)
|
|
686
|
-
arg = args[0]
|
|
687
|
-
if isinstance(arg, tuple) and len(arg) == 2:
|
|
688
|
-
return arg[0]
|
|
689
|
-
raise SphinxException(node, "sphinx.methodArgumentsMismatch",
|
|
690
|
-
_("Method %(name)s argument is not an entity identifier %(value)s"),
|
|
691
|
-
name=node.name, value=arg)
|
|
692
|
-
|
|
693
|
-
def _segment(node, sphinxContext, args):
|
|
694
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
695
|
-
return fact.context.segment.nonDimValues("segment")
|
|
696
|
-
|
|
697
|
-
def _size(node, sphinxContext, args):
|
|
698
|
-
hasArg(node, sphinxContext, args, 0)
|
|
699
|
-
collection = args[0]
|
|
700
|
-
if isinstance(collection, (tuple, list, set)):
|
|
701
|
-
return len(collection)
|
|
702
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
703
|
-
_("Function %(name)s argument is not a collection %(value)s"),
|
|
704
|
-
name=node.name, value=collection)
|
|
705
|
-
|
|
706
|
-
def _sqrt(node, sphinxContext, args):
|
|
707
|
-
args = numericArgs(node, sphinxContext, args, 1)
|
|
708
|
-
x = args[0]
|
|
709
|
-
if x < 0 or isnan(x): return NaN
|
|
710
|
-
if x == POSINF: return POSINF
|
|
711
|
-
return sqrt(x)
|
|
712
|
-
|
|
713
|
-
def _startDate(node, sphinxContext, args):
|
|
714
|
-
hasArg(node, sphinxContext, args, 0)
|
|
715
|
-
arg = args[0]
|
|
716
|
-
if isinstance(arg, Period):
|
|
717
|
-
if arg.isForever:
|
|
718
|
-
return UNBOUND
|
|
719
|
-
if arg.isDuration:
|
|
720
|
-
return arg.start
|
|
721
|
-
return arg.end
|
|
722
|
-
raise SphinxException(node, "sphinx.functionArgumentsMismatch",
|
|
723
|
-
_("Function %(name)s argument is not a period %(value)s"),
|
|
724
|
-
name=node.name, value=arg)
|
|
725
|
-
|
|
726
|
-
def _startsWith(node, sphinxContext, args):
|
|
727
|
-
value = strArgs(node, sphinxContext, args, 0)
|
|
728
|
-
suffix = strArgs(node, sphinxContext, args, 1)
|
|
729
|
-
return value.startswith(suffix)
|
|
730
|
-
|
|
731
|
-
def _substring(node, sphinxContext, args):
|
|
732
|
-
value = strArgs(node, sphinxContext, args, 0)
|
|
733
|
-
start = strArgs(node, sphinxContext, args, 1)
|
|
734
|
-
end = strArgs(node, sphinxContext, args, 2)
|
|
735
|
-
if isinf(start): start = len(value)
|
|
736
|
-
if isinf(end): end = len(value)
|
|
737
|
-
return value[start:end]
|
|
738
|
-
|
|
739
|
-
def _subtractTimePeriod(node, sphinxContext, args):
|
|
740
|
-
return _addTimePeriod(node, sphinxContext, args, subtract=True)
|
|
741
|
-
|
|
742
|
-
def _taxonomy(node, sphinxContext, args):
|
|
743
|
-
return sphinxContext.modelXbrl
|
|
744
|
-
|
|
745
|
-
def _timePeriodFunction(node, sphinxContext, args):
|
|
746
|
-
duration = strArgs(node, sphinxContext, args, 0)
|
|
747
|
-
return dayTimeDuration(duration)
|
|
748
|
-
|
|
749
|
-
nowUTC = datetime.datetime.utcnow()
|
|
750
|
-
todayUTC = datetime.date(nowUTC.year, nowUTC.month, nowUTC.day)
|
|
751
|
-
|
|
752
|
-
def _todayUTC(node, sphinxContext, args):
|
|
753
|
-
return todayUTC
|
|
754
|
-
|
|
755
|
-
def _timeDuration(node, sphinxContext, args):
|
|
756
|
-
duration = strArgs(node, sphinxContext, args, 0)
|
|
757
|
-
return dayTimeDuration(duration)
|
|
758
|
-
|
|
759
|
-
def toCollection(node, sphinxContext, args, collectionCreator):
|
|
760
|
-
hasArg(node, sphinxContext, args, 0)
|
|
761
|
-
collection = args[0]
|
|
762
|
-
if isinstance(collection, (tuple, list, set)):
|
|
763
|
-
return collectionCreator(collection)
|
|
764
|
-
raise SphinxException(node, "sphinx.methodArgumentsMismatch",
|
|
765
|
-
_("Method %(name)s argument is not a collection %(value)s"),
|
|
766
|
-
name=node.name, value=collection)
|
|
767
|
-
|
|
768
|
-
def _toList(node, sphinxContext, args):
|
|
769
|
-
return toCollection(node, sphinxContext, args, list)
|
|
770
|
-
|
|
771
|
-
def _toSet(node, sphinxContext, args):
|
|
772
|
-
return toCollection(node, sphinxContext, args, set)
|
|
773
|
-
|
|
774
|
-
def _trim(node, sphinxContext, args):
|
|
775
|
-
value = strArgs(node, sphinxContext, args, 0)
|
|
776
|
-
return value.strip()
|
|
777
|
-
|
|
778
|
-
def _tuple(node, sphinxContext, args):
|
|
779
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
780
|
-
parentModelObject = fact.getparent()
|
|
781
|
-
parentQn = parentModelObject.qname
|
|
782
|
-
if parentQn == XbrlConst.qnXbrliXbrl:
|
|
783
|
-
return NONE
|
|
784
|
-
return parentQn
|
|
785
|
-
|
|
786
|
-
def _unitMethod(node, sphinxContext, args):
|
|
787
|
-
fact = factArg(node, sphinxContext, args, 0)
|
|
788
|
-
return fact.unit.measures
|
|
789
|
-
|
|
790
|
-
def _unitFunction(node, sphinxContext, args):
|
|
791
|
-
hasArg(node, sphinxContext, args, 0)
|
|
792
|
-
unitQn = args[0]
|
|
793
|
-
return ([unitQn],[])
|
|
794
|
-
|
|
795
|
-
def _upperCase(node, sphinxContext, args):
|
|
796
|
-
value = strArgs(node, sphinxContext, args, 0)
|
|
797
|
-
return value.upper()
|
|
798
|
-
|
|
799
|
-
def _xbrlTypeMethod(node, sphinxContext, args):
|
|
800
|
-
concept = conceptArg(node, sphinxContext, args, 0)
|
|
801
|
-
baseTypeLocalName = concept.baseXbrliType
|
|
802
|
-
if not baseTypeLocalName:
|
|
803
|
-
return NONE
|
|
804
|
-
return QName("{http://www.xbrl.org/2003/instance}xbrli:" + baseTypeLocalName)
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
# netework functions
|
|
808
|
-
|
|
809
|
-
def network(node, sphinxContext, args, linkqname=None, linkrole=None, arcqname=None, arcrole=None):
|
|
810
|
-
dts = dtsArg(node, sphinxContext, args)
|
|
811
|
-
return ModelRelationshipSet(dts, arcrole, linkrole=linkrole, linkqname=linkqname, arcqname=arcqname)
|
|
812
|
-
|
|
813
|
-
def networks(node, sphinxContext, args, linkqname=None, linkrole=None, arcqname=None, arcrole=None):
|
|
814
|
-
networkAllLinkroles = network(node, sphinxContext, args, linkqname, None, arcqname, arcrole)
|
|
815
|
-
linkroles = networkAllLinkroles.linkRoleUris
|
|
816
|
-
return set(network(node, sphinxContext, args, linkqname, linkrole, arcqname, arcrole)
|
|
817
|
-
for linkrole in linkroles)
|
|
818
|
-
|
|
819
|
-
def _conceptHypercubeAll(node, sphinxContext, args):
|
|
820
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
821
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.all)
|
|
822
|
-
|
|
823
|
-
def _conceptHypercubeAllNetworks(node, sphinxContext, args):
|
|
824
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.all)
|
|
825
|
-
|
|
826
|
-
def _conceptHypercubeNotAll(node, sphinxContext, args):
|
|
827
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
828
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.notAll)
|
|
829
|
-
|
|
830
|
-
def _conceptHypercubeNotAllNetworks(node, sphinxContext, args):
|
|
831
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.notAll)
|
|
832
|
-
|
|
833
|
-
def _dimensionDefault(node, sphinxContext, args):
|
|
834
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
835
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.dimensionDefault)
|
|
836
|
-
|
|
837
|
-
def _dimensionDefaultNetworks(node, sphinxContext, args):
|
|
838
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.dimensionDefault)
|
|
839
|
-
|
|
840
|
-
def _dimensionDomain(node, sphinxContext, args):
|
|
841
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
842
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.dimensionDomain)
|
|
843
|
-
|
|
844
|
-
def _dimensionDomainNetworks(node, sphinxContext, args):
|
|
845
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.dimensionDomain)
|
|
846
|
-
|
|
847
|
-
def _domainMember(node, sphinxContext, args):
|
|
848
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
849
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.domainMember)
|
|
850
|
-
|
|
851
|
-
def _domainMemberNetworks(node, sphinxContext, args):
|
|
852
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.domainMember)
|
|
853
|
-
|
|
854
|
-
def _essenceAlias(node, sphinxContext, args):
|
|
855
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
856
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.essenceAlias)
|
|
857
|
-
|
|
858
|
-
def _essenceAliasNetworks(node, sphinxContext, args):
|
|
859
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.essenceAlias)
|
|
860
|
-
|
|
861
|
-
def _generalSpecial(node, sphinxContext, args):
|
|
862
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
863
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.generalSpecial)
|
|
864
|
-
|
|
865
|
-
def _generalSpecialNetworks(node, sphinxContext, args):
|
|
866
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.generalSpecial)
|
|
867
|
-
|
|
868
|
-
def _genericLink(node, sphinxContext, args):
|
|
869
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
870
|
-
arcrole = strArg(node, sphinxContext, args, 2)
|
|
871
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=arcrole)
|
|
872
|
-
|
|
873
|
-
def _genericLinkNetworks(node, sphinxContext, args):
|
|
874
|
-
arcrole = strArg(node, sphinxContext, args, 1)
|
|
875
|
-
return networks(node, sphinxContext, args, arcrole=arcrole)
|
|
876
|
-
|
|
877
|
-
def _hypercubeDimension(node, sphinxContext, args):
|
|
878
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
879
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.hypercubeDimension)
|
|
880
|
-
|
|
881
|
-
def _hypercubeDimensionNetworks(node, sphinxContext, args):
|
|
882
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.hypercubeDimension)
|
|
883
|
-
|
|
884
|
-
def _network(node, sphinxContext, args, linkqname, linkrole, arcqname, arcrole):
|
|
885
|
-
return network(node, sphinxContext, args, linkqname, linkrole, arcqname, arcrole)
|
|
886
|
-
|
|
887
|
-
def _networks(node, sphinxContext, args, linkqname, linkrole, arcqname, arcrole):
|
|
888
|
-
return networks(node, sphinxContext, args, linkqname, linkrole, arcqname, arcrole)
|
|
889
|
-
|
|
890
|
-
def _parentChild(node, sphinxContext, args):
|
|
891
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
892
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.parentChild)
|
|
893
|
-
|
|
894
|
-
def _parentChildNetworks(node, sphinxContext, args):
|
|
895
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.parentChild)
|
|
896
|
-
|
|
897
|
-
def _requiresElement(node, sphinxContext, args):
|
|
898
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
899
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.requiresElement)
|
|
900
|
-
|
|
901
|
-
def _requiresElementNetworks(node, sphinxContext, args):
|
|
902
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.requiresElement)
|
|
903
|
-
|
|
904
|
-
def _similarTuples(node, sphinxContext, args):
|
|
905
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
906
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.similarTuples)
|
|
907
|
-
|
|
908
|
-
def _similarTuplesNetworks(node, sphinxContext, args):
|
|
909
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.similarTuples)
|
|
910
|
-
|
|
911
|
-
def _summationItem(node, sphinxContext, args):
|
|
912
|
-
linkrole = strArg(node, sphinxContext, args, 1)
|
|
913
|
-
return network(node, sphinxContext, args, linkrole=linkrole, arcrole=XbrlConst.summationItem)
|
|
914
|
-
|
|
915
|
-
def _summationItemNetworks(node, sphinxContext, args):
|
|
916
|
-
return networks(node, sphinxContext, args, arcrole=XbrlConst.summationItem)
|
|
917
|
-
|
|
918
|
-
# network methods
|
|
919
|
-
|
|
920
|
-
def _ancestors(node, sphinxContext, args):
|
|
921
|
-
return set(rel.toModelObject
|
|
922
|
-
for rel in _ancestorRelationships(node, sphinxContext, args))
|
|
923
|
-
|
|
924
|
-
def _ancestorRelationships(node, sphinxContext, args):
|
|
925
|
-
network = networkArg(node, sphinxContext, args)
|
|
926
|
-
concept = networkConceptArg(node, sphinxContext, args)
|
|
927
|
-
def descRels(fromConcept, depth, visited, rels):
|
|
928
|
-
if depth > 0 and concept not in visited:
|
|
929
|
-
visited.add(concept)
|
|
930
|
-
for rel in network.toModelObject(fromConcept):
|
|
931
|
-
rels.add(rel)
|
|
932
|
-
descRels(rel.fromModelObject, depth - 1, visited, rels)
|
|
933
|
-
visited.discard(concept)
|
|
934
|
-
rels = set()
|
|
935
|
-
descRels(concept, numericArg(node, sphinxContext, args, 2), set(), rels)
|
|
936
|
-
return rels
|
|
937
|
-
|
|
938
|
-
def _arcName(node, sphinxContext, args):
|
|
939
|
-
network = networkArg(node, sphinxContext, args)
|
|
940
|
-
return network.arcqname
|
|
941
|
-
|
|
942
|
-
def _arcrole(node, sphinxContext, args):
|
|
943
|
-
network = networkArg(node, sphinxContext, args)
|
|
944
|
-
return network.arcrole
|
|
945
|
-
|
|
946
|
-
def _children(node, sphinxContext, args):
|
|
947
|
-
network = networkArg(node, sphinxContext, args)
|
|
948
|
-
concept = networkConceptArg(node, sphinxContext, args)
|
|
949
|
-
return set(rel.fromModelObject for rel in network.fromModelObject(concept))
|
|
950
|
-
|
|
951
|
-
def _descendantRelationships(node, sphinxContext, args):
|
|
952
|
-
network = networkArg(node, sphinxContext, args)
|
|
953
|
-
concept = networkConceptArg(node, sphinxContext, args)
|
|
954
|
-
def descRels(fromConcept, depth, visited, rels):
|
|
955
|
-
if depth > 0 and concept not in visited:
|
|
956
|
-
visited.add(concept)
|
|
957
|
-
for rel in network.fromModelObject(fromConcept):
|
|
958
|
-
rels.add(rel)
|
|
959
|
-
descRels(rel.toModelObject, depth - 1, visited, rels)
|
|
960
|
-
visited.discard(concept)
|
|
961
|
-
rels = set()
|
|
962
|
-
descRels(concept, numericArg(node, sphinxContext, args, 2), set(), rels)
|
|
963
|
-
return rels
|
|
964
|
-
|
|
965
|
-
def _descendants(node, sphinxContext, args):
|
|
966
|
-
return set(rel.toModelObject
|
|
967
|
-
for rel in _descendantRelationships(node, sphinxContext, args))
|
|
968
|
-
|
|
969
|
-
def _extendedLinkName(node, sphinxContext, args):
|
|
970
|
-
network = networkArg(node, sphinxContext, args)
|
|
971
|
-
return network.linkrole
|
|
972
|
-
|
|
973
|
-
def _incomingRelationships(node, sphinxContext, args):
|
|
974
|
-
network = networkArg(node, sphinxContext, args)
|
|
975
|
-
concept = networkConceptArg(node, sphinxContext, args)
|
|
976
|
-
return set(network.toModelObject(concept))
|
|
977
|
-
|
|
978
|
-
def _outgoingRelationships(node, sphinxContext, args):
|
|
979
|
-
network = networkArg(node, sphinxContext, args)
|
|
980
|
-
concept = networkConceptArg(node, sphinxContext, args)
|
|
981
|
-
return set(network.fromModelObject(concept))
|
|
982
|
-
|
|
983
|
-
def _parents(node, sphinxContext, args):
|
|
984
|
-
network = networkArg(node, sphinxContext, args)
|
|
985
|
-
concept = networkConceptArg(node, sphinxContext, args)
|
|
986
|
-
return set(rel.fromModelObject for rel in network.toModelObject(concept))
|
|
987
|
-
|
|
988
|
-
def _relationships(node, sphinxContext, args):
|
|
989
|
-
network = networkArg(node, sphinxContext, args)
|
|
990
|
-
return set(network.modelRelationships)
|
|
991
|
-
|
|
992
|
-
def _linkRole(node, sphinxContext, args):
|
|
993
|
-
network = networkArg(node, sphinxContext, args)
|
|
994
|
-
return network.linkrole
|
|
995
|
-
|
|
996
|
-
def _sourceConcepts(node, sphinxContext, args):
|
|
997
|
-
network = networkArg(node, sphinxContext, args)
|
|
998
|
-
return network.fromModelObjects().keys()
|
|
999
|
-
|
|
1000
|
-
def _targetConcepts(node, sphinxContext, args):
|
|
1001
|
-
network = networkArg(node, sphinxContext, args)
|
|
1002
|
-
return network.toModelObjects().keys()
|
|
1003
|
-
|
|
1004
|
-
# relationship methods
|
|
1005
|
-
|
|
1006
|
-
def _order(node, sphinxContext, args):
|
|
1007
|
-
relationship = relationshipArg(node, sphinxContext, args)
|
|
1008
|
-
return relationship.order
|
|
1009
|
-
|
|
1010
|
-
def _preferredLabel(node, sphinxContext, args):
|
|
1011
|
-
relationship = relationshipArg(node, sphinxContext, args)
|
|
1012
|
-
return relationship.preferredLabel
|
|
1013
|
-
|
|
1014
|
-
def _source(node, sphinxContext, args):
|
|
1015
|
-
relationship = relationshipArg(node, sphinxContext, args)
|
|
1016
|
-
return relationship.fromModelObject
|
|
1017
|
-
|
|
1018
|
-
def _target(node, sphinxContext, args):
|
|
1019
|
-
relationship = relationshipArg(node, sphinxContext, args)
|
|
1020
|
-
return relationship.toModelObject
|
|
1021
|
-
|
|
1022
|
-
def _weight(node, sphinxContext, args):
|
|
1023
|
-
relationship = relationshipArg(node, sphinxContext, args)
|
|
1024
|
-
return relationship.weight
|
|
1025
|
-
|
|
1026
|
-
# aggregative functions
|
|
1027
|
-
|
|
1028
|
-
def _all(node, sphinxContext, args):
|
|
1029
|
-
return all(args)
|
|
1030
|
-
|
|
1031
|
-
def _any(node, sphinxContext, args):
|
|
1032
|
-
return any(args)
|
|
1033
|
-
|
|
1034
|
-
def _avg(node, sphinxContext, args):
|
|
1035
|
-
return sum(args) / len(args)
|
|
1036
|
-
|
|
1037
|
-
def _count(node, sphinxContext, args):
|
|
1038
|
-
return len(args)
|
|
1039
|
-
|
|
1040
|
-
def _exists(node, sphinxContext, args):
|
|
1041
|
-
return len(args) > 0
|
|
1042
|
-
|
|
1043
|
-
def _first(node, sphinxContext, args):
|
|
1044
|
-
if len(args):
|
|
1045
|
-
return args[0]
|
|
1046
|
-
return UNBOUND
|
|
1047
|
-
|
|
1048
|
-
def _list(node, sphinxContext, args):
|
|
1049
|
-
return [args]
|
|
1050
|
-
|
|
1051
|
-
def _max(node, sphinxContext, args):
|
|
1052
|
-
return max(args)
|
|
1053
|
-
|
|
1054
|
-
def _median(node, sphinxContext, args):
|
|
1055
|
-
if not args: # empty list
|
|
1056
|
-
return 0
|
|
1057
|
-
args = sorted(args) # don't sort in place, args may be reused by caller
|
|
1058
|
-
middle = int(len(list) / 2)
|
|
1059
|
-
if len(list) % 2 == 0:
|
|
1060
|
-
return (args[middle - 1] + args[middle]) / 2 # average middle args
|
|
1061
|
-
else:
|
|
1062
|
-
return args[middle] # middle item
|
|
1063
|
-
|
|
1064
|
-
def _min(node, sphinxContext, args):
|
|
1065
|
-
return min(args)
|
|
1066
|
-
|
|
1067
|
-
def _missing(node, sphinxContext, args):
|
|
1068
|
-
return len(args) == 0
|
|
1069
|
-
|
|
1070
|
-
def modes(args):
|
|
1071
|
-
counts = {}
|
|
1072
|
-
firstAt = {}
|
|
1073
|
-
maxcount = 0
|
|
1074
|
-
for i, arg in enumerate(args):
|
|
1075
|
-
newcount = counts.get(arg, 0) + 1
|
|
1076
|
-
counts[arg] = newcount
|
|
1077
|
-
if newcount > maxcount:
|
|
1078
|
-
maxcount = newcount
|
|
1079
|
-
if arg not in firstAt:
|
|
1080
|
-
firstAt[arg] = i
|
|
1081
|
-
return [(maxcount - count, firstAt[value], value)
|
|
1082
|
-
for value, count in counts.items()
|
|
1083
|
-
if count == maxcount].sort()
|
|
1084
|
-
|
|
1085
|
-
def _mode(node, sphinxContext, args):
|
|
1086
|
-
return modes(args)[0][2]
|
|
1087
|
-
|
|
1088
|
-
def _modes(node, sphinxContext, args):
|
|
1089
|
-
return set(mode[2] for mode in modes(args))
|
|
1090
|
-
|
|
1091
|
-
def _stdevp(node, sphinxContext, args):
|
|
1092
|
-
return _notImplemented(node, sphinxContext)
|
|
1093
|
-
|
|
1094
|
-
def _set(node, sphinxContext, args):
|
|
1095
|
-
return set(args)
|
|
1096
|
-
|
|
1097
|
-
def _sum(node, sphinxContext, args):
|
|
1098
|
-
return sum(args)
|
|
1099
|
-
|
|
1100
|
-
def _var(node, sphinxContext, args):
|
|
1101
|
-
return _notImplemented(node, sphinxContext)
|
|
1102
|
-
|
|
1103
|
-
def _varp(node, sphinxContext, args):
|
|
1104
|
-
return _notImplemented(node, sphinxContext)
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
# miscellaneous methods
|
|
1108
|
-
|
|
1109
|
-
def _notImplemented(node, sphinxContext, args):
|
|
1110
|
-
sphinxContext.modelXbrl.log("ERROR", "sphinx.functionNotImplemented",
|
|
1111
|
-
_("Function %(name)s is not currently implemented"),
|
|
1112
|
-
sourceFileLine=node.sourceFileLine,
|
|
1113
|
-
name=node.name)
|
|
1114
|
-
return NaN
|
|
1115
|
-
|
|
1116
|
-
methodImplementation = {
|
|
1117
|
-
"abs": _abs,
|
|
1118
|
-
"add-time-period": _addTimePeriod,
|
|
1119
|
-
"balance": _balance,
|
|
1120
|
-
"concept": _concept,
|
|
1121
|
-
"concepts": _concepts,
|
|
1122
|
-
"contains": _contains,
|
|
1123
|
-
"credit": _credit,
|
|
1124
|
-
"days": _days,
|
|
1125
|
-
"debit": _debit,
|
|
1126
|
-
"decimals": _decimals,
|
|
1127
|
-
"dimension": _dimension,
|
|
1128
|
-
"dts-document-locations": _dtsDocumentLocations,
|
|
1129
|
-
"duration": _duration,
|
|
1130
|
-
"end-date": _endDate,
|
|
1131
|
-
"ends-with": _endsWith,
|
|
1132
|
-
"entity": _entityMethod,
|
|
1133
|
-
"exp": _exp,
|
|
1134
|
-
"has-decimals": _hasDecimals,
|
|
1135
|
-
"has-precision":_hasPrecision,
|
|
1136
|
-
"identifier": _identifier,
|
|
1137
|
-
"index-of": _indexOf,
|
|
1138
|
-
"instant": _instant,
|
|
1139
|
-
"is-forever": _isForever,
|
|
1140
|
-
"is-monetary": _isMonetary,
|
|
1141
|
-
"is-numeric": _isNumeric,
|
|
1142
|
-
"last-index-of":_lastIndexOf,
|
|
1143
|
-
"ln": _ln,
|
|
1144
|
-
"length": _length,
|
|
1145
|
-
"local-part": _localPart,
|
|
1146
|
-
"log": _log,
|
|
1147
|
-
"log10": _log10,
|
|
1148
|
-
"lower-case": _lowerCase,
|
|
1149
|
-
"name": _name,
|
|
1150
|
-
"period": _period,
|
|
1151
|
-
"period-type": _periodType,
|
|
1152
|
-
"power": _power,
|
|
1153
|
-
"precision": _precision,
|
|
1154
|
-
"primary": _primary,
|
|
1155
|
-
"replace": _replace,
|
|
1156
|
-
"round": _roundItem,
|
|
1157
|
-
"round-by-decimals": _roundDecimals,
|
|
1158
|
-
"round-by-precision": _roundPrecision,
|
|
1159
|
-
"scenario": _scenario,
|
|
1160
|
-
"schema-type": _schemaTypeMethod,
|
|
1161
|
-
"scheme": _scheme,
|
|
1162
|
-
"segment": _segment,
|
|
1163
|
-
"signum": _signum,
|
|
1164
|
-
"size": _size,
|
|
1165
|
-
"sqrt": _sqrt,
|
|
1166
|
-
"start-date": _startDate,
|
|
1167
|
-
"starts-with": _startsWith,
|
|
1168
|
-
"subtract-time-period": _subtractTimePeriod,
|
|
1169
|
-
"taxonomy": _taxonomy,
|
|
1170
|
-
"to-list": _toList,
|
|
1171
|
-
"to-set": _toSet,
|
|
1172
|
-
"tuple": _tuple,
|
|
1173
|
-
"unit": _unitMethod,
|
|
1174
|
-
"unknown": _notImplemented,
|
|
1175
|
-
"upper-case": _upperCase,
|
|
1176
|
-
"xbrl-type": _xbrlTypeMethod,
|
|
1177
|
-
|
|
1178
|
-
#networks
|
|
1179
|
-
"concept-hypercube-all": _conceptHypercubeAll,
|
|
1180
|
-
"concept-hypercube-all-networks": _conceptHypercubeAllNetworks,
|
|
1181
|
-
"concept-hypercube-not-all": _conceptHypercubeNotAll,
|
|
1182
|
-
"concept-hypercube-not-all-networks": _conceptHypercubeNotAllNetworks,
|
|
1183
|
-
"dimension-default": _dimensionDefault,
|
|
1184
|
-
"dimension-default-networks": _dimensionDefaultNetworks,
|
|
1185
|
-
"dimension-domain": _dimensionDomain,
|
|
1186
|
-
"dimension-domain-networks": _dimensionDomainNetworks,
|
|
1187
|
-
"domain-member": _domainMember,
|
|
1188
|
-
"domain-member-networks": _domainMemberNetworks,
|
|
1189
|
-
"essence-alias": _essenceAlias,
|
|
1190
|
-
"essence-alias-networks": _essenceAliasNetworks,
|
|
1191
|
-
"general-special": _generalSpecial,
|
|
1192
|
-
"general-special-networks": _generalSpecialNetworks,
|
|
1193
|
-
"generic-link": _genericLink,
|
|
1194
|
-
"generic-link-networks": _genericLinkNetworks,
|
|
1195
|
-
"hypercube-dimension": _hypercubeDimension,
|
|
1196
|
-
"hypercube-dimension-networks": _hypercubeDimensionNetworks,
|
|
1197
|
-
"network": _network,
|
|
1198
|
-
"networks": _networks,
|
|
1199
|
-
"parent-child": _parentChild,
|
|
1200
|
-
"parent-child-networks": _parentChildNetworks,
|
|
1201
|
-
"requires-element": _requiresElement,
|
|
1202
|
-
"requires-element-networks": _requiresElementNetworks,
|
|
1203
|
-
"similar-tuples": _similarTuples,
|
|
1204
|
-
"similar-tuples-networks": _similarTuplesNetworks,
|
|
1205
|
-
"summation-item": _summationItem,
|
|
1206
|
-
"summation-item-networks": _summationItemNetworks,
|
|
1207
|
-
|
|
1208
|
-
#network methods
|
|
1209
|
-
"ancestors": _ancestors,
|
|
1210
|
-
"ancestor-relationships": _ancestorRelationships,
|
|
1211
|
-
"arc-name": _arcName,
|
|
1212
|
-
"arcrole": _arcrole,
|
|
1213
|
-
"children": _children,
|
|
1214
|
-
"concepts": _concepts,
|
|
1215
|
-
"descendant-relationships": _descendantRelationships,
|
|
1216
|
-
"descendants": _descendants,
|
|
1217
|
-
"extended-link-name": _extendedLinkName,
|
|
1218
|
-
"incoming-relationships": _incomingRelationships,
|
|
1219
|
-
"outgoing-relationships": _outgoingRelationships,
|
|
1220
|
-
"parents": _parents,
|
|
1221
|
-
"relationships": _relationships,
|
|
1222
|
-
"role": _linkRole,
|
|
1223
|
-
"source-concepts": _sourceConcepts,
|
|
1224
|
-
"target-concepts": _targetConcepts,
|
|
1225
|
-
|
|
1226
|
-
#relationship methods
|
|
1227
|
-
"order": _order,
|
|
1228
|
-
"preferred-label": _preferredLabel,
|
|
1229
|
-
"source": _source,
|
|
1230
|
-
"target": _target,
|
|
1231
|
-
"weight": _weight,
|
|
1232
|
-
}
|
|
1233
|
-
|
|
1234
|
-
functionImplementation = {
|
|
1235
|
-
"boolean": _booleanFunction,
|
|
1236
|
-
"current-date-as-utc": _todayUTC,
|
|
1237
|
-
"duration": _durationFunction,
|
|
1238
|
-
"entity": _entityFunction,
|
|
1239
|
-
"forever": _foreverFunction,
|
|
1240
|
-
"instant": _instantFunction,
|
|
1241
|
-
"number": _numberFunction,
|
|
1242
|
-
"schema-type": _schemaTypeFunction,
|
|
1243
|
-
"time-period": _timePeriodFunction,
|
|
1244
|
-
"unit": _unitFunction,
|
|
1245
|
-
}
|
|
1246
|
-
|
|
1247
|
-
aggreateFunctionImplementation = {
|
|
1248
|
-
"all": _all,
|
|
1249
|
-
"any": _any,
|
|
1250
|
-
"avg": _avg,
|
|
1251
|
-
"count": _count,
|
|
1252
|
-
"exists": _exists,
|
|
1253
|
-
"first": _first,
|
|
1254
|
-
"list": _list,
|
|
1255
|
-
"max": _max,
|
|
1256
|
-
"median": _median,
|
|
1257
|
-
"min": _min,
|
|
1258
|
-
"missing": _missing,
|
|
1259
|
-
"mode": _mode,
|
|
1260
|
-
"modes": _modes,
|
|
1261
|
-
"set": _set,
|
|
1262
|
-
"stdevp": _stdevp,
|
|
1263
|
-
"sum": _sum,
|
|
1264
|
-
"var": _var,
|
|
1265
|
-
"varp": _varp,
|
|
1266
|
-
}
|
|
1267
|
-
|
|
1268
|
-
aggreateFunctionAcceptsFactArgs = {
|
|
1269
|
-
"all": False,
|
|
1270
|
-
"any": False,
|
|
1271
|
-
"avg": False,
|
|
1272
|
-
"count": True,
|
|
1273
|
-
"exists": True,
|
|
1274
|
-
"first": True,
|
|
1275
|
-
"list": True,
|
|
1276
|
-
"max": True,
|
|
1277
|
-
"median": False,
|
|
1278
|
-
"min": False,
|
|
1279
|
-
"missing": True,
|
|
1280
|
-
"mode": False,
|
|
1281
|
-
"modes": False,
|
|
1282
|
-
"set": True,
|
|
1283
|
-
"stdevp": False,
|
|
1284
|
-
"sum": False,
|
|
1285
|
-
"var": False,
|
|
1286
|
-
"varp": False,
|
|
1287
|
-
}
|