arelle-release 2.37.17__py3-none-any.whl → 2.37.19__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 (54) hide show
  1. arelle/CntlrWinMain.py +4 -1
  2. arelle/ModelValue.py +1 -0
  3. arelle/PythonUtil.py +132 -24
  4. arelle/ViewWinTree.py +15 -9
  5. arelle/_version.py +2 -2
  6. arelle/plugin/OimTaxonomy/ModelValueMore.py +15 -0
  7. arelle/plugin/OimTaxonomy/ValidateDTS.py +484 -0
  8. arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +240 -0
  9. arelle/plugin/OimTaxonomy/XbrlAbstract.py +16 -0
  10. arelle/plugin/OimTaxonomy/XbrlConcept.py +67 -0
  11. arelle/plugin/OimTaxonomy/XbrlConst.py +261 -0
  12. arelle/plugin/OimTaxonomy/XbrlCube.py +91 -0
  13. arelle/plugin/OimTaxonomy/XbrlDimension.py +38 -0
  14. arelle/plugin/OimTaxonomy/XbrlDts.py +152 -0
  15. arelle/plugin/OimTaxonomy/XbrlEntity.py +16 -0
  16. arelle/plugin/OimTaxonomy/XbrlGroup.py +22 -0
  17. arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +22 -0
  18. arelle/plugin/OimTaxonomy/XbrlLabel.py +31 -0
  19. arelle/plugin/OimTaxonomy/XbrlNetwork.py +100 -0
  20. arelle/plugin/OimTaxonomy/XbrlProperty.py +28 -0
  21. arelle/plugin/OimTaxonomy/XbrlReference.py +33 -0
  22. arelle/plugin/OimTaxonomy/XbrlReport.py +24 -0
  23. arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +35 -0
  24. arelle/plugin/OimTaxonomy/XbrlTaxonomy.py +93 -0
  25. arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py +154 -0
  26. arelle/plugin/OimTaxonomy/XbrlTransform.py +17 -0
  27. arelle/plugin/OimTaxonomy/XbrlTypes.py +23 -0
  28. arelle/plugin/OimTaxonomy/XbrlUnit.py +17 -0
  29. arelle/plugin/OimTaxonomy/__init__.py +1038 -0
  30. arelle/plugin/OimTaxonomy/resources/iso4217.json +4479 -0
  31. arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json +935 -0
  32. arelle/plugin/OimTaxonomy/resources/ref.json +333 -0
  33. arelle/plugin/OimTaxonomy/resources/transform-types.json +2481 -0
  34. arelle/plugin/OimTaxonomy/resources/types.json +727 -0
  35. arelle/plugin/OimTaxonomy/resources/utr.json +3046 -0
  36. arelle/plugin/OimTaxonomy/resources/xbrlSpec.json +1082 -0
  37. arelle/plugin/saveOIMTaxonomy.py +311 -0
  38. arelle/plugin/validate/NL/PluginValidationDataExtension.py +36 -2
  39. arelle/plugin/validate/NL/__init__.py +3 -0
  40. arelle/plugin/validate/NL/rules/nl_kvk.py +84 -2
  41. {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/METADATA +2 -1
  42. {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/RECORD +54 -19
  43. tests/integration_tests/validation/README.md +2 -0
  44. tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py +15 -4
  45. tests/integration_tests/validation/run_conformance_suites.py +10 -1
  46. tests/integration_tests/validation/validation_util.py +10 -5
  47. tests/unit_tests/arelle/test_frozen_dict.py +176 -0
  48. tests/unit_tests/arelle/test_frozen_ordered_set.py +315 -0
  49. tests/unit_tests/arelle/test_import.py +31 -0
  50. tests/unit_tests/arelle/test_ordered_set.py +272 -0
  51. {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/WHEEL +0 -0
  52. {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/entry_points.txt +0 -0
  53. {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/licenses/LICENSE.md +0 -0
  54. {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,240 @@
1
+ '''
2
+ See COPYRIGHT.md for copyright information.
3
+ '''
4
+ from typing import Union
5
+ from types import UnionType
6
+ from collections import defaultdict
7
+ from decimal import Decimal
8
+ from typing import GenericAlias
9
+ from arelle import ViewWinTree, XbrlConst
10
+ from arelle.FunctionFn import false
11
+ from arelle.ModelValue import qname
12
+ from arelle.PythonUtil import OrderedSet
13
+ from .XbrlCube import XbrlCube, XbrlPeriodConstraint
14
+ from .XbrlDimension import XbrlDomain
15
+ from .XbrlGroup import XbrlGroup
16
+ from .XbrlNetwork import XbrlNetwork
17
+ from .XbrlTaxonomyObject import EMPTY_DICT, XbrlTaxonomyObject
18
+ from .XbrlConst import qnStdLabel
19
+
20
+
21
+ def viewXbrlTxmyObj(xbrlDts, objClass, tabWin, header, additionalViews=None):
22
+ xbrlDts.modelManager.showStatus(_("viewing concepts"))
23
+ view = ViewXbrlTxmyObj(xbrlDts, objClass, tabWin, header)
24
+ view.propNameTypes = []
25
+ initialParentObjProp = True
26
+ for propName, propType in getattr(objClass, "__annotations__", {}).items():
27
+ if initialParentObjProp:
28
+ initialParentProp = False
29
+ if isinstance(propType, str):
30
+ continue
31
+ elif isinstance(propType, UnionType):
32
+ if any(arg.__name__.startswith("Xbrl") for arg in propType.__args__):
33
+ continue
34
+ elif propType.__name__.startswith("Xbrl"): # skip taxonomy alias type
35
+ continue
36
+ if not isinstance(propType, GenericAlias): # set, dict, etc
37
+ view.propNameTypes.append((propName, propType))
38
+ # add label col if first col is name for Concepts pane
39
+ if view.propNameTypes and view.propNameTypes[0][0] == "name":
40
+ if objClass.__name__ in ("XbrlConcept", "XbrlFact"):
41
+ view.propNameTypes.insert(0, ("label", str))
42
+ else:
43
+ view.propNameTypes[0] = ("name", view.propNameTypes[0][1])
44
+ # check nested object types
45
+ for i in range(len(view.propNameTypes),10):
46
+ view.propNameTypes.append( (f"col{i+1}",str))
47
+ view.colNames = tuple(propName for propName, _propType in view.propNameTypes[1:])
48
+ view.treeView["columns"] = view.colNames
49
+ firstCol = True
50
+ for propName, propType in view.propNameTypes:
51
+ colName = propName
52
+ if firstCol:
53
+ firstCol = False
54
+ colName = "#0"
55
+ w = 360
56
+ elif isinstance(propType, (int,float,Decimal)):
57
+ w = 50
58
+ else:
59
+ w = 120
60
+ view.treeView.column(colName, width=w, anchor="w")
61
+ view.treeView.heading(colName, text=propName)
62
+ view.treeView["displaycolumns"] = view.colNames
63
+ if objClass.__name__ == "XbrlReference":
64
+ view.labelRole = None
65
+ else:
66
+ view.labelrole = qnStdLabel
67
+ view.view()
68
+ view.blockSelectEvent = 1
69
+ view.blockViewModelObject = 0
70
+ view.treeView.bind("<<TreeviewSelect>>", view.treeviewSelect, '+')
71
+ view.treeView.bind("<Enter>", view.treeviewEnter, '+')
72
+ view.treeView.bind("<Leave>", view.treeviewLeave, '+')
73
+
74
+ # languages menu
75
+ menu = view.contextMenu()
76
+ if objClass.__name__ != "XbrlConcept":
77
+ view.menuAddExpandCollapse() # for tree view panes but not for Concept table pane
78
+ view.menuAddClipboard()
79
+ view.menuAddLangs()
80
+
81
+ view.menuAddLabelRoles(usedLabelroles=
82
+ (("1Name",XbrlConst.conceptNameLabelRole),
83
+ ("2Standard Label", qnStdLabel)) +
84
+ tuple((f"3{t}", t) for t in sorted(xbrlDts.labelTypes) if t != qnStdLabel))
85
+ view.menuAddNameStyle()
86
+ view.menuAddViews(addClose=False, additionalViews=additionalViews, additionalViewMethod=viewXbrlTxmyObj)
87
+
88
+ class ViewXbrlTxmyObj(ViewWinTree.ViewTree):
89
+ def __init__(self, xbrlDts, objClass, tabWin, header):
90
+ super(ViewXbrlTxmyObj, self).__init__(xbrlDts, tabWin, header, True, None)
91
+ self.xbrlDts = xbrlDts
92
+ self.objClass = objClass
93
+
94
+ def view(self):
95
+ # sort by labels
96
+ self.setColumnsSortable()
97
+ self.tag_has = defaultdict(list)
98
+ lbls = defaultdict(list)
99
+ role = self.labelrole
100
+ lang = self.lang
101
+ self.clearTreeView()
102
+ self.id = 1
103
+ nodeNum = 0
104
+ excludedNamespaces = XbrlConst.ixbrlAll.union(
105
+ (XbrlConst.xbrli, XbrlConst.link, XbrlConst.xlink, XbrlConst.xl,
106
+ XbrlConst.xbrldt,
107
+ XbrlConst.xhtml))
108
+ for obj in self.xbrlDts.filterNamedObjects(self.objClass, role, lang): # this is a yield generator
109
+ propName = self.propNameTypes[0][0]
110
+ node = self.treeView.insert("", "end",
111
+ f"_{self.id}_{obj.dtsObjectIndex}",
112
+ text=str(self.xbrlDts.labelValue(obj.getProperty(propName, self.labelrole), self.labelrole, self.lang)),
113
+ tags=("odd" if nodeNum & 1 else "even",))
114
+ self.tag_has[f"_{obj.dtsObjectIndex}"].append(node)
115
+ self.id += 1
116
+ nodeNum += 1
117
+ for propName, _propType in self.propNameTypes[1:]:
118
+ self.treeView.set(node, propName, str(obj.getProperty(propName)))
119
+ if isinstance(obj, XbrlGroup):
120
+ self.viewGroupContent(node, nodeNum, obj)
121
+ elif isinstance(obj, XbrlCube):
122
+ self.viewDims(node, nodeNum, obj)
123
+ elif isinstance(obj, (XbrlNetwork, XbrlDomain)):
124
+ self.viewRoots(node, nodeNum, obj)
125
+
126
+ def viewProps(self, parentNode, nodeNum, obj):
127
+ propView = obj.propertyView
128
+ node = self.treeView.insert(parentNode, "end",
129
+ f"_{self.id}_{obj.dtsObjectIndex}",
130
+ text=propView[0][1],
131
+ tags=("odd" if nodeNum & 1 else "even",))
132
+ self.tag_has[f"_{obj.dtsObjectIndex}"].append(node)
133
+ nodeNum += 1
134
+ self.id += 1
135
+ for i, propViewEntry in enumerate(propView[1:]):
136
+ if i >= len(self.colNames):
137
+ print(f"i problem {i}")
138
+ if len(propViewEntry) < 2:
139
+ print(f"propViewEntry problem {propViewEntry} class {type(obj).__name__}")
140
+ self.treeView.set(node, self.colNames[i], propViewEntry[1])
141
+ # process nested objects
142
+ for propName, propType in getattr(type(obj), "__annotations__", EMPTY_DICT).items():
143
+ childObj = getattr(obj, propName, None)
144
+ if isinstance(getattr(propType, "__origin__", None), type(Union)): # Optional[ ] type
145
+ if isinstance(propType.__args__[0], XbrlTaxonomyObject): # e.g. dateResolution object
146
+ childObj = getattr(obj, propName, None)
147
+ if childObj is not None:
148
+ self.viewProps(node, nodeNum, childObj)
149
+ elif getattr(propType, "__origin__", None) in (set, OrderedSet) and issubclass(propType.__args__[0], XbrlTaxonomyObject):
150
+ if childObj is not None and len(childObj) > 0 and propName != "relationships":
151
+ for childObjObj in childObj:
152
+ self.viewProps(node, nodeNum, childObjObj)
153
+ return node
154
+
155
+ def viewGroupContent(self, parentNode, nodeNum, obj):
156
+ # related content for the Group object are under tagged content
157
+ for relatedObjQn in self.xbrlDts.groupContents.get(obj.name, ()):
158
+ relatedObj = self.xbrlDts.namedObjects.get(relatedObjQn)
159
+ if relatedObj is not None:
160
+ node = self.viewProps(parentNode, nodeNum, relatedObj)
161
+ nodeNum += 1
162
+ if isinstance(relatedObj, XbrlCube):
163
+ self.viewDims(node, nodeNum, relatedObj)
164
+ elif isinstance(relatedObj, (XbrlNetwork, XbrlDomain)):
165
+ self.viewRoots(node, nodeNum, relatedObj)
166
+
167
+ def viewDims(self, parentNode, nodeNum, obj):
168
+ for cubeDim in obj.cubeDimensions:
169
+ node = self.viewProps(parentNode, nodeNum, cubeDim)
170
+ nodeNum += 1
171
+ domName = getattr(cubeDim, "domainName", None)
172
+ if domName:
173
+ domObj = self.xbrlDts.namedObjects.get(domName)
174
+ if domObj is not None:
175
+ domNode = self.viewProps(node, nodeNum, domObj)
176
+ nodeNum += 1
177
+ self.viewRoots(domNode, nodeNum, domObj)
178
+
179
+ def viewRoots(self, parentNode, nodeNum, obj):
180
+ for qn in obj.relationshipRoots:
181
+ rootObj = self.xbrlDts.namedObjects.get(qn)
182
+ if rootObj is not None:
183
+ node = self.treeView.insert(parentNode, "end",
184
+ f"_{self.id}_{rootObj.dtsObjectIndex}",
185
+ text=str(rootObj.getProperty("label", self.labelrole, self.lang, "")),
186
+ tags=("odd" if nodeNum & 1 else "even",))
187
+ self.id += 1
188
+ nodeNum += 1
189
+ for relObj in obj.relationshipsFrom.get(qn, ()):
190
+ self.viewRelationships(node, nodeNum, obj, relObj, set())
191
+
192
+ def viewRelationships(self, parentNode, nodeNum, obj, relObj, visited):
193
+ target = relObj.target
194
+ qnObj = self.xbrlDts.namedObjects.get(target)
195
+ if qnObj is not None:
196
+ loop = target in visited
197
+ txt = self.xbrlDts.labelValue(relObj.target, self.labelrole, self.lang)
198
+ if loop:
199
+ txt = "(loop) " + txt
200
+ node = self.treeView.insert(parentNode, "end",
201
+ f"_{self.id}_{qnObj.dtsObjectIndex}",
202
+ text=txt,
203
+ tags=("odd" if nodeNum & 1 else "even",))
204
+ self.id += 1
205
+ nodeNum += 1
206
+ if not loop:
207
+ visited.add(target)
208
+ for relTgtObj in obj.relationshipsFrom.get(relObj.target, ()):
209
+ self.viewRelationships(node, nodeNum, obj, relTgtObj, visited)
210
+ visited.remove(target)
211
+
212
+ def treeviewEnter(self, *args):
213
+ self.blockSelectEvent = 0
214
+
215
+ def treeviewLeave(self, *args):
216
+ self.blockSelectEvent = 1
217
+
218
+ def treeviewSelect(self, event):
219
+ if self.blockSelectEvent == 0 and self.blockViewModelObject == 0:
220
+ self.blockViewModelObject += 1
221
+ #self.modelXbrl.viewModelObject(self.nodeToObjectId[self.treeView.selection()[0]])
222
+ selection = self.treeView.selection()
223
+ if selection is not None and len(selection)>0:
224
+ self.xbrlDts.viewTaxonomyObject(selection[0])
225
+ self.blockViewModelObject -= 1
226
+
227
+ def viewModelObject(self, txmyObj):
228
+ if self.blockViewModelObject == 0:
229
+ self.blockViewModelObject += 1
230
+ try:
231
+ items = self.tag_has.get(f"_{txmyObj.dtsObjectIndex}")
232
+ if items:
233
+ for item in items:
234
+ if self.treeView.exists(item):
235
+ self.treeView.see(item)
236
+ self.treeView.selection_set(item)
237
+ break
238
+ except (AttributeError, KeyError, ValueError):
239
+ self.treeView.selection_set(())
240
+ self.blockViewModelObject -= 1
@@ -0,0 +1,16 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+
5
+ from typing import TYPE_CHECKING, Set
6
+
7
+ from arelle.ModelValue import QName
8
+ from arelle.PythonUtil import OrderedSet
9
+ from .XbrlProperty import XbrlProperty
10
+ from .XbrlTypes import XbrlTaxonomyType, QNameKeyType
11
+ from .XbrlTaxonomyObject import XbrlReferencableTaxonomyObject
12
+
13
+ class XbrlAbstract(XbrlReferencableTaxonomyObject):
14
+ taxonomy: XbrlTaxonomyType
15
+ name: QNameKeyType # (required) The name is a QName that uniquely identifies the abstract object.
16
+ properties: OrderedSet[XbrlProperty] # (optional) ordered set of property objects used to specify additional properties associated with the concept using the property object. Only immutable properties as defined in the propertyType object can be added to a concept.
@@ -0,0 +1,67 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+
5
+ from typing import TYPE_CHECKING, TypeAlias, Optional, Any
6
+ from decimal import Decimal
7
+
8
+ from arelle.ModelValue import QName
9
+ from arelle.PythonUtil import OrderedSet
10
+ from arelle.XbrlConst import xsd
11
+ from .XbrlProperty import XbrlProperty
12
+ from .XbrlTypes import XbrlTaxonomyType, QNameKeyType
13
+ from .XbrlTaxonomyObject import XbrlTaxonomyObject, XbrlReferencableTaxonomyObject
14
+
15
+ XbrlUnitTypeType: TypeAlias = "XbrlUnitType"
16
+
17
+ class XbrlConcept(XbrlReferencableTaxonomyObject):
18
+ taxonomy: XbrlTaxonomyType
19
+ name: QNameKeyType # (required) The name is a QName that uniquely identifies the concept object.
20
+ dataType: QName # (required) Indicates the dataType of the concept. These are provided as a QName based on the datatypes specified in the XBRL 2.1 specification and any custom datatype defined in the taxonomy.
21
+ periodType: str # (required) Indicates the period type of the concept. The property values can be either instant or duration. If the concept can be an atemporal value it must be defined as a duration. (i.e. the value does not change with the passage of time)
22
+ enumerationDomain: Optional[QName] # (optional) Used to specify enumerated domain members that are associated with a domain defined in the taxonomy.
23
+ nillable: Optional[bool] # (optional) Used to specify if the concept can have a nill value. The default value is true.
24
+ properties: OrderedSet[XbrlProperty] # (optional) ordered set of property objects used to specify additional properties associated with the concept using the property object. Only immutable properties as defined in the propertyType object can be added to a concept.
25
+
26
+ class XbrlDataType(XbrlReferencableTaxonomyObject):
27
+ taxonomy: XbrlTaxonomyType
28
+ name: QNameKeyType # (required) The name is a QName that uniquely identifies the datatype object.
29
+ baseType: QName # (required) The base type is a QName that uniquely identifies the base datatype the datatype is based on.
30
+ enumeration: OrderedSet[Any] # (optional) Defines an ordered set of enumerated values of the datatype if applicable
31
+ minInclusive: Optional[Decimal] # (optional) Defines a decimal value to indicate a min inclusive cardinal value for a type. Only applies to types based on float, double and decimal.
32
+ maxInclusive: Optional[Decimal] # (optional) Defines a decimal value to indicate a max inclusive cardinal value for a type. Only applies to types based on float, double and decimal.
33
+ minExclusive: Optional[Decimal] # (optional) Defines a decimal value to indicate a min exclusive cardinal value for a type. Only applies to types based on float, double and decimal.
34
+ maxExclusive: Optional[Decimal] # (optional) Defines a decimal value to indicate a max exclusive cardinal value for a type. Only applies to types based on float, double and decimal.
35
+ totalDigits: Optional[int] # (optional) Defines an int value to indicate total digits of a value. Only applies to types based on float, double and decimal.
36
+ fractionDigits: Optional[int] # (optional) Defines an int of digits to the right of the decimal place. Only applies to types based on float, double and decimal.
37
+ length: Optional[int] # (optional) Defines an int value used to define the length of a string value.
38
+ minLength: Optional[int] # (optional) Defines an int used to define minimum length of a string value.
39
+ maxLength: Optional[int] # (optional) Defines an int used to define maximum length of a string value.
40
+ whiteSpace: Optional[str] # (optional) Defines a string one of preserve, replace or collapse.
41
+ patterns: set[str] # (optional) Defines a string as a single regex expressions. At least one of the regex patterns must match. (Uses XML regex)
42
+ unitTypes: OrderedSet[XbrlUnitTypeType] # unitType comprising a dataType expressed as a value of the datatype. For example xbrli:flow has unit datatypes of xbrli:volume and xbrli:time
43
+
44
+ def xsBaseType(self, dts, visitedTypes=None): # find base types thru dataType hierarchy
45
+ if not visitedTypes: visitedTypes = set() # might be a loop
46
+ if self.baseType.namespaceURI == xsd:
47
+ return self.baseType.localName
48
+ elif self not in visitedTypes:
49
+ visitedTypes.add(self)
50
+ baseTypeObj = dts.namedObjects.get(self.baseType)
51
+ if isinstance(baseTypeObj, XbrlDataType):
52
+ return baseTypeObj.xsBaseType(dts, visitedTypes)
53
+ visitedTypes.remove(self)
54
+ return None
55
+
56
+ def xsFacets(self):
57
+ facets = {}
58
+ for facet in ("enumeration", "minInclusive", "maxInclusive", "minExclusive", "maxExclusive", "totalDigits", "fractionDigits", "length", "minLength", "maxLength", "whiteSpace", "patterns"):
59
+ value = getattr(self, facet, None)
60
+ if value is not None and not(isinstance(value, (set,list,OrderedSet)) and not value):
61
+ facets[facet] = value
62
+ return facets
63
+
64
+ class XbrlUnitType(XbrlTaxonomyObject):
65
+ dataTypeNumerator: Optional[XbrlDataType] # (optional) Defines the numerator datatype of of the datatype
66
+ dataTypeDenominator: Optional[XbrlDataType] # (optional) Defines the denominator datatype used by a unit used to define a value of the datatype
67
+ dataTypeMutiplier: Optional[XbrlDataType] # (optional) Defines a mutiplier datatype used by a unit used to define a value of the datatype
@@ -0,0 +1,261 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ import regex as re
5
+ from arelle.ModelValue import qname
6
+ from arelle.XbrlConst import xsd
7
+
8
+ # MERGE TO arelle.XbrlConst when promoting plugin to infrastructure
9
+
10
+ oimTaxonomyDocTypePattern = re.compile(r"\s*\{.*\"documentType\"\s*:\s*\"https://xbrl.org/[0-9]{4}/taxonomy\"", flags=re.DOTALL)
11
+ oimTaxonomyDocTypes = (
12
+ "https://xbrl.org/2025/taxonomy",
13
+ )
14
+
15
+ xbrl = "https://xbrl.org/2025"
16
+
17
+ qnStdLabel = qname(xbrl, "xbrli:label")
18
+ qnXsDate = qname(xsd, "xs:date")
19
+ qnXsDateTime = qname(xsd, "xs:dateTime")
20
+ qnXsDuration = qname(xsd, "xs:duration")
21
+ qnXsQName = qname(xsd, "xs:QName")
22
+
23
+ qnXbrlLabelObj = qname(xbrl, "xbrl:labelObject")
24
+
25
+ objectsWithProperties = {
26
+ qname(xbrl, "xbrl:taxonomyObject"),
27
+ qname(xbrl, "xbrl:conceptObject"),
28
+ qname(xbrl, "xbrl:abstractObject"),
29
+ qname(xbrl, "xbrl:cubeObject"),
30
+ qname(xbrl, "xbrl:dimensionObject"),
31
+ qname(xbrl, "xbrl:domainObject"),
32
+ qname(xbrl, "xbrl:entityObject"),
33
+ qname(xbrl, "xbrl:groupObject"),
34
+ qname(xbrl, "xbrl:networkObject"),
35
+ qnXbrlLabelObj,
36
+ qname(xbrl, "xbrl:memberObject"),
37
+ qname(xbrl, "xbrl:referenceObject"),
38
+ qname(xbrl, "xbrl:relationshipObject"),
39
+ }
40
+
41
+ xbrlTaxonomyObjects = {
42
+ "documentInfo": {
43
+ "documentType": oimTaxonomyDocTypes[0],
44
+ "namespaces": {
45
+ "xbrl": xbrl,
46
+ "xbrli": "https://xbrl.org/2025/instance",
47
+ "xs": xsd
48
+ }
49
+ },
50
+ "taxonomy": {
51
+ "name": "xbrl:BuiltInCoreObjectsTaxonomy",
52
+ "frameworkName": "types",
53
+ "version": "2025",
54
+ "resolved": False,
55
+ "dataTypes": [
56
+ {
57
+ "name": "xs:string",
58
+ "baseType": "xs:string"
59
+ },
60
+ {
61
+ "name": "xs:boolean",
62
+ "baseType": "xs:boolean"
63
+ },
64
+ {
65
+ "name": "xs:decimal",
66
+ "baseType": "xs:decimal"
67
+ },
68
+ {
69
+ "name": "xs:float",
70
+ "baseType": "xs:float"
71
+ },
72
+ {
73
+ "name": "xs:double",
74
+ "baseType": "xs:double"
75
+ },
76
+ {
77
+ "name": "xs:duration",
78
+ "baseType": "xs:duration"
79
+ },
80
+ {
81
+ "name": "xs:dateTime",
82
+ "baseType": "xs:dateTime"
83
+ },
84
+ {
85
+ "name": "xs:time",
86
+ "baseType": "xs:time"
87
+ },
88
+ {
89
+ "name": "xs:date",
90
+ "baseType": "xs:date"
91
+ },
92
+ {
93
+ "name": "xs:gYearMonth",
94
+ "baseType": "xs:gYearMonth"
95
+ },
96
+ {
97
+ "name": "xs:gYear",
98
+ "baseType": "xs:gYear"
99
+ },
100
+ {
101
+ "name": "xs:gMonthDay",
102
+ "baseType": "xs:gMonthDay"
103
+ },
104
+ {
105
+ "name": "xs:gDay",
106
+ "baseType": "xs:gDay"
107
+ },
108
+ {
109
+ "name": "xs:gMonth",
110
+ "baseType": "xs:gMonth"
111
+ },
112
+ {
113
+ "name": "xs:hexBinary",
114
+ "baseType": "xs:hexBinary"
115
+ },
116
+ {
117
+ "name": "xs:base64Binary",
118
+ "baseType": "xs:base64Binary"
119
+ },
120
+ {
121
+ "name": "xs:anyURI",
122
+ "baseType": "xs:anyURI"
123
+ },
124
+ {
125
+ "name": "xs:QName",
126
+ "baseType": "xs:QName"
127
+ },
128
+ {
129
+ "name": "xs:NOTATION",
130
+ "baseType": "xs:NOTATION"
131
+ },
132
+ {
133
+ "name": "xs:normalizedString",
134
+ "baseType": "xs:string"
135
+ },
136
+ {
137
+ "name": "xs:token",
138
+ "baseType": "xs:normalizedString"
139
+ },
140
+ {
141
+ "name": "xs:language",
142
+ "baseType": "xs:token"
143
+ },
144
+ {
145
+ "name": "xs:NMTOKEN",
146
+ "baseType": "xs:token"
147
+ },
148
+ {
149
+ "name": "xs:NMTOKENS",
150
+ "baseType": "xs:NMTOKEN"
151
+ },
152
+ {
153
+ "name": "xs:Name",
154
+ "baseType": "xs:token"
155
+ },
156
+ {
157
+ "name": "xs:NCName",
158
+ "baseType": "xs:Name"
159
+ },
160
+ {
161
+ "name": "xs:ID",
162
+ "baseType": "xs:NCName"
163
+ },
164
+ {
165
+ "name": "xs:IDREF",
166
+ "baseType": "xs:NCName"
167
+ },
168
+ {
169
+ "name": "xs:IDREFS",
170
+ "baseType": "xs:IDREF"
171
+ },
172
+ {
173
+ "name": "xs:ENTITY",
174
+ "baseType": "xs:IDREF"
175
+ },
176
+ {
177
+ "name": "xs:ENTITIES",
178
+ "baseType": "xs:ENTITY"
179
+ },
180
+ {
181
+ "name": "xs:integer",
182
+ "baseType": "xs:decimal"
183
+ },
184
+ {
185
+ "name": "xs:nonPositiveInteger",
186
+ "baseType": "xs:integer",
187
+ "maxInclusive": 0
188
+
189
+ },
190
+ {
191
+ "name": "xs:negativeInteger",
192
+ "baseType": "xs:nonPositiveInteger",
193
+ "maxInclusive": -1
194
+ },
195
+ {
196
+ "name": "xs:long",
197
+ "baseType": "xs:integer"
198
+ },
199
+ {
200
+ "name": "xs:int",
201
+ "baseType": "xs:long",
202
+ "maxInclusive": 2147483647,
203
+ "minInclusive": -2147483648
204
+ },
205
+ {
206
+ "name": "xs:short",
207
+ "baseType": "xs:int",
208
+ "maxInclusive": 32767,
209
+ "minInclusive": -32768
210
+ },
211
+ {
212
+ "name": "xs:byte",
213
+ "baseType": "xs:short",
214
+ "maxInclusive": 127,
215
+ "minInclusive": -128
216
+ },
217
+ {
218
+ "name": "xs:nonNegativeInteger",
219
+ "baseType": "xs:integer",
220
+ "minInclusive": 0
221
+ },
222
+ {
223
+ "name": "xs:unsignedLong",
224
+ "baseType": "xs:nonNegativeInteger",
225
+ "maxInclusive": 18446744073709551615
226
+ },
227
+ {
228
+ "name": "xs:unsignedInt",
229
+ "baseType": "xs:unsignedInt",
230
+ "maxInclusive": 4294967295
231
+ },
232
+ {
233
+ "name": "xs:unsignedShort",
234
+ "baseType": "xs:unsignedInt",
235
+ "maxInclusive": 65535
236
+ },
237
+ {
238
+ "name": "xs:unsignedByte",
239
+ "baseType": "xs:unsignedShort",
240
+ "maxInclusive": 255
241
+ },
242
+ {
243
+ "name": "xs:positiveInteger",
244
+ "baseType": "xs:nonNegativeInteger",
245
+ "minInclusive": 1
246
+ },
247
+ {
248
+ "name": "xs:yearMonthDuration",
249
+ "baseType": "xs:duration"
250
+ },
251
+ {
252
+ "name": "xs:dayTimeDuration",
253
+ "baseType": "xs:duration"
254
+ },
255
+ {
256
+ "name": "xs:dateTimeStamp",
257
+ "baseType": "xs:dateTime"
258
+ }
259
+ ]
260
+ }
261
+ }