arelle-release 2.37.46__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.

Files changed (107) hide show
  1. arelle/CntlrCmdLine.py +10 -1
  2. arelle/ErrorManager.py +14 -5
  3. arelle/ModelObjectFactory.py +18 -2
  4. arelle/Validate.py +4 -0
  5. arelle/_version.py +2 -2
  6. arelle/plugin/validate/DBA/ValidationPluginExtension.py +2 -1
  7. arelle/plugin/validate/EDINET/ControllerPluginData.py +84 -0
  8. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +0 -114
  9. arelle/plugin/validate/EDINET/UploadContents.py +17 -0
  10. arelle/plugin/validate/EDINET/ValidationPluginExtension.py +8 -2
  11. arelle/plugin/validate/EDINET/__init__.py +5 -0
  12. arelle/plugin/validate/EDINET/rules/upload.py +66 -75
  13. arelle/plugin/validate/NL/ValidationPluginExtension.py +3 -1
  14. arelle/plugin/validate/ROS/ValidationPluginExtension.py +3 -1
  15. arelle/utils/PluginHooks.py +32 -0
  16. arelle/utils/validate/ValidationPlugin.py +54 -8
  17. {arelle_release-2.37.46.dist-info → arelle_release-2.37.48.dist-info}/METADATA +1 -1
  18. {arelle_release-2.37.46.dist-info → arelle_release-2.37.48.dist-info}/RECORD +22 -106
  19. arelle/archive/CustomLogger.py +0 -43
  20. arelle/archive/LoadEFMvalidate.py +0 -32
  21. arelle/archive/LoadSavePreLbCsv.py +0 -26
  22. arelle/archive/LoadValidate.cs +0 -31
  23. arelle/archive/LoadValidate.py +0 -36
  24. arelle/archive/LoadValidateCmdLine.java +0 -69
  25. arelle/archive/LoadValidatePostedZip.java +0 -57
  26. arelle/archive/LoadValidateWebService.java +0 -34
  27. arelle/archive/SaveTableToExelle.py +0 -140
  28. arelle/archive/TR3toTR4.py +0 -88
  29. arelle/archive/plugin/ESEF_2022/__init__.py +0 -47
  30. arelle/archive/plugin/bigInstance.py +0 -394
  31. arelle/archive/plugin/cmdWebServerExtension.py +0 -43
  32. arelle/archive/plugin/crashTest.py +0 -38
  33. arelle/archive/plugin/functionsXmlCreation.py +0 -106
  34. arelle/archive/plugin/hello_i18n.pot +0 -26
  35. arelle/archive/plugin/hello_i18n.py +0 -32
  36. arelle/archive/plugin/importTestChild1.py +0 -21
  37. arelle/archive/plugin/importTestChild2.py +0 -22
  38. arelle/archive/plugin/importTestGrandchild1.py +0 -21
  39. arelle/archive/plugin/importTestGrandchild2.py +0 -21
  40. arelle/archive/plugin/importTestImported1.py +0 -23
  41. arelle/archive/plugin/importTestImported11.py +0 -22
  42. arelle/archive/plugin/importTestParent.py +0 -48
  43. arelle/archive/plugin/instanceInfo.py +0 -306
  44. arelle/archive/plugin/loadFromOIM-2018.py +0 -1282
  45. arelle/archive/plugin/locale/fr/LC_MESSAGES/hello_i18n.po +0 -25
  46. arelle/archive/plugin/objectmaker.py +0 -285
  47. arelle/archive/plugin/packagedImportTest/__init__.py +0 -47
  48. arelle/archive/plugin/packagedImportTest/importTestChild1.py +0 -21
  49. arelle/archive/plugin/packagedImportTest/importTestChild2.py +0 -22
  50. arelle/archive/plugin/packagedImportTest/importTestGrandchild1.py +0 -21
  51. arelle/archive/plugin/packagedImportTest/importTestGrandchild2.py +0 -21
  52. arelle/archive/plugin/packagedImportTest/importTestImported1.py +0 -24
  53. arelle/archive/plugin/packagedImportTest/importTestImported11.py +0 -21
  54. arelle/archive/plugin/packagedImportTest/subdir/importTestImported111.py +0 -21
  55. arelle/archive/plugin/packagedImportTest/subdir/subsubdir/importTestImported1111.py +0 -21
  56. arelle/archive/plugin/sakaCalendar.py +0 -215
  57. arelle/archive/plugin/saveInstanceInfoset.py +0 -121
  58. arelle/archive/plugin/sphinx/FormulaGenerator.py +0 -823
  59. arelle/archive/plugin/sphinx/SphinxContext.py +0 -404
  60. arelle/archive/plugin/sphinx/SphinxEvaluator.py +0 -783
  61. arelle/archive/plugin/sphinx/SphinxMethods.py +0 -1287
  62. arelle/archive/plugin/sphinx/SphinxParser.py +0 -1093
  63. arelle/archive/plugin/sphinx/SphinxValidator.py +0 -163
  64. arelle/archive/plugin/sphinx/US-GAAP Ratios Example.xsr +0 -52
  65. arelle/archive/plugin/sphinx/__init__.py +0 -285
  66. arelle/archive/plugin/streamingExtensions.py +0 -335
  67. arelle/archive/plugin/updateTableLB.py +0 -242
  68. arelle/archive/plugin/validate/SBRnl/CustomLoader.py +0 -19
  69. arelle/archive/plugin/validate/SBRnl/DTS.py +0 -305
  70. arelle/archive/plugin/validate/SBRnl/Dimensions.py +0 -357
  71. arelle/archive/plugin/validate/SBRnl/Document.py +0 -799
  72. arelle/archive/plugin/validate/SBRnl/Filing.py +0 -467
  73. arelle/archive/plugin/validate/SBRnl/__init__.py +0 -75
  74. arelle/archive/plugin/validate/SBRnl/config.xml +0 -26
  75. arelle/archive/plugin/validate/SBRnl/sbr-nl-taxonomies.xml +0 -754
  76. arelle/archive/plugin/validate/USBestPractices.py +0 -570
  77. arelle/archive/plugin/validate/USCorpAction.py +0 -557
  78. arelle/archive/plugin/validate/USSecTagging.py +0 -337
  79. arelle/archive/plugin/validate/XDC/__init__.py +0 -77
  80. arelle/archive/plugin/validate/XDC/config.xml +0 -20
  81. arelle/archive/plugin/validate/XFsyntax/__init__.py +0 -64
  82. arelle/archive/plugin/validate/XFsyntax/xf.py +0 -2227
  83. arelle/archive/plugin/validate/calc2.py +0 -536
  84. arelle/archive/plugin/validateSchemaLxml.py +0 -156
  85. arelle/archive/plugin/validateTableInfoset.py +0 -52
  86. arelle/archive/us-gaap-dei-docType-extraction-frm.xml +0 -90
  87. arelle/archive/us-gaap-dei-ratio-cash-frm.xml +0 -150
  88. arelle/examples/plugin/formulaSuiteConverter.py +0 -212
  89. arelle/examples/plugin/functionsCustom.py +0 -59
  90. arelle/examples/plugin/hello_dolly.py +0 -64
  91. arelle/examples/plugin/multi.py +0 -58
  92. arelle/examples/plugin/rssSaveOim.py +0 -96
  93. arelle/examples/plugin/validate/XYZ/DisclosureSystems.py +0 -2
  94. arelle/examples/plugin/validate/XYZ/PluginValidationDataExtension.py +0 -10
  95. arelle/examples/plugin/validate/XYZ/ValidationPluginExtension.py +0 -49
  96. arelle/examples/plugin/validate/XYZ/__init__.py +0 -75
  97. arelle/examples/plugin/validate/XYZ/resources/config.xml +0 -16
  98. arelle/examples/plugin/validate/XYZ/rules/__init__.py +0 -0
  99. arelle/examples/plugin/validate/XYZ/rules/rules01.py +0 -110
  100. arelle/examples/plugin/validate/XYZ/rules/rules02.py +0 -59
  101. arelle/scripts-macOS/startWebServer.command +0 -3
  102. arelle/scripts-unix/startWebServer.sh +0 -1
  103. arelle/scripts-windows/startWebServer.bat +0 -5
  104. {arelle_release-2.37.46.dist-info → arelle_release-2.37.48.dist-info}/WHEEL +0 -0
  105. {arelle_release-2.37.46.dist-info → arelle_release-2.37.48.dist-info}/entry_points.txt +0 -0
  106. {arelle_release-2.37.46.dist-info → arelle_release-2.37.48.dist-info}/licenses/LICENSE.md +0 -0
  107. {arelle_release-2.37.46.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
- }