arelle-release 2.37.18__py3-none-any.whl → 2.37.20__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 (59) hide show
  1. arelle/CntlrWinMain.py +4 -1
  2. arelle/FileSource.py +2 -2
  3. arelle/ModelInstanceObject.py +1 -1
  4. arelle/ModelValue.py +1 -0
  5. arelle/ModelXbrl.py +1 -1
  6. arelle/PythonUtil.py +132 -24
  7. arelle/ViewWinTree.py +15 -9
  8. arelle/_version.py +2 -2
  9. arelle/formula/XPathContext.py +22 -22
  10. arelle/formula/XPathParser.py +2 -2
  11. arelle/plugin/OimTaxonomy/ModelValueMore.py +15 -0
  12. arelle/plugin/OimTaxonomy/ValidateDTS.py +484 -0
  13. arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +239 -0
  14. arelle/plugin/OimTaxonomy/XbrlAbstract.py +16 -0
  15. arelle/plugin/OimTaxonomy/XbrlConcept.py +68 -0
  16. arelle/plugin/OimTaxonomy/XbrlConst.py +261 -0
  17. arelle/plugin/OimTaxonomy/XbrlCube.py +91 -0
  18. arelle/plugin/OimTaxonomy/XbrlDimension.py +38 -0
  19. arelle/plugin/OimTaxonomy/XbrlDts.py +152 -0
  20. arelle/plugin/OimTaxonomy/XbrlEntity.py +16 -0
  21. arelle/plugin/OimTaxonomy/XbrlGroup.py +22 -0
  22. arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +22 -0
  23. arelle/plugin/OimTaxonomy/XbrlLabel.py +31 -0
  24. arelle/plugin/OimTaxonomy/XbrlNetwork.py +100 -0
  25. arelle/plugin/OimTaxonomy/XbrlProperty.py +28 -0
  26. arelle/plugin/OimTaxonomy/XbrlReference.py +33 -0
  27. arelle/plugin/OimTaxonomy/XbrlReport.py +24 -0
  28. arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +35 -0
  29. arelle/plugin/OimTaxonomy/XbrlTaxonomy.py +93 -0
  30. arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py +154 -0
  31. arelle/plugin/OimTaxonomy/XbrlTransform.py +17 -0
  32. arelle/plugin/OimTaxonomy/XbrlTypes.py +23 -0
  33. arelle/plugin/OimTaxonomy/XbrlUnit.py +17 -0
  34. arelle/plugin/OimTaxonomy/__init__.py +1037 -0
  35. arelle/plugin/OimTaxonomy/resources/iso4217.json +4479 -0
  36. arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json +935 -0
  37. arelle/plugin/OimTaxonomy/resources/ref.json +333 -0
  38. arelle/plugin/OimTaxonomy/resources/transform-types.json +2481 -0
  39. arelle/plugin/OimTaxonomy/resources/types.json +727 -0
  40. arelle/plugin/OimTaxonomy/resources/utr.json +3046 -0
  41. arelle/plugin/OimTaxonomy/resources/xbrlSpec.json +1082 -0
  42. arelle/plugin/saveOIMTaxonomy.py +311 -0
  43. arelle/plugin/validate/NL/PluginValidationDataExtension.py +35 -1
  44. arelle/plugin/validate/NL/__init__.py +7 -0
  45. arelle/plugin/validate/NL/rules/nl_kvk.py +144 -2
  46. {arelle_release-2.37.18.dist-info → arelle_release-2.37.20.dist-info}/METADATA +3 -1
  47. {arelle_release-2.37.18.dist-info → arelle_release-2.37.20.dist-info}/RECORD +59 -24
  48. tests/integration_tests/validation/README.md +2 -0
  49. tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py +19 -5
  50. tests/integration_tests/validation/run_conformance_suites.py +10 -1
  51. tests/integration_tests/validation/validation_util.py +10 -5
  52. tests/unit_tests/arelle/test_frozen_dict.py +176 -0
  53. tests/unit_tests/arelle/test_frozen_ordered_set.py +315 -0
  54. tests/unit_tests/arelle/test_import.py +1 -0
  55. tests/unit_tests/arelle/test_ordered_set.py +272 -0
  56. {arelle_release-2.37.18.dist-info → arelle_release-2.37.20.dist-info}/WHEEL +0 -0
  57. {arelle_release-2.37.18.dist-info → arelle_release-2.37.20.dist-info}/entry_points.txt +0 -0
  58. {arelle_release-2.37.18.dist-info → arelle_release-2.37.20.dist-info}/licenses/LICENSE.md +0 -0
  59. {arelle_release-2.37.18.dist-info → arelle_release-2.37.20.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,93 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+
5
+ from typing import TYPE_CHECKING, Optional, Union
6
+ from collections import OrderedDict
7
+
8
+ from arelle.ModelValue import qname, QName, AnyURI
9
+ from arelle.PythonUtil import OrderedSet
10
+ from .ModelValueMore import SQName
11
+ from .XbrlDts import XbrlDts
12
+ from .XbrlImportedTaxonomy import XbrlImportedTaxonomy
13
+ from .XbrlProperty import XbrlProperty
14
+ from .XbrlAbstract import XbrlAbstract
15
+ from .XbrlConcept import XbrlConcept, XbrlDataType, XbrlUnitType
16
+ from .XbrlCube import XbrlCube, XbrlCubeType, XbrlCubeDimension, XbrlPeriodConstraint, XbrlDateResolution
17
+ from .XbrlDimension import XbrlDimension, XbrlDomain, XbrlDomainRoot, XbrlMember
18
+ from .XbrlEntity import XbrlEntity
19
+ from .XbrlGroup import XbrlGroup, XbrlGroupContent
20
+ from .XbrlLabel import XbrlLabel, XbrlLabelType
21
+ from .XbrlNetwork import XbrlNetwork, XbrlRelationship, XbrlRelationshipType
22
+ from .XbrlProperty import XbrlProperty, XbrlPropertyType
23
+ from .XbrlReference import XbrlReference, XbrlReferenceType
24
+ from .XbrlTransform import XbrlTransform
25
+ from .XbrlUnit import XbrlUnit
26
+ from .XbrlTypes import QNameKeyType, XbrlTaxonomyType
27
+ from .XbrlTaxonomyObject import XbrlTaxonomyObject
28
+ from .XbrlTableTemplate import XbrlTableTemplate, XbrlDataTable
29
+
30
+ class XbrlTaxonomy(XbrlTaxonomyObject):
31
+ dts: XbrlDts
32
+ name: QNameKeyType # (required) The name is a QName that uniquely identifies the taxonomy object.
33
+ frameworkName: Optional[str] # (optional) The framework name of the taxonomy such as "US-GAAP" that indicates the taxonomy broad taxonomy family. The framework name stays consistent between regular taxonomy releases of the same taxonomy domain.
34
+ version: Optional[str] # (optional) Used to identify the version of the taxonomy such as the year of release.
35
+ resolved: bool # (required) Used to indicate if the taxonomy is in a resolved form. Allowable values are true or false. True indicates that the taxonomy is a complete model including all objects post dts processing that has resolved all importedTaxonomy objects, extendTargetName attributes and domain filters. False indicates that the taxonomy is pre dts processing and is not in resolved form.
36
+ importedTaxonomies: OrderedSet[XbrlImportedTaxonomy] # ordered set of importedTaxonomy objects that can comprise QName of the taxonomy to be imported, an object type or a taxonomy object referenced by its QName.
37
+ abstracts: OrderedSet[XbrlAbstract] # ordered set of abstract objects.
38
+ concepts: OrderedSet[XbrlConcept] # ordered set of concept objects.
39
+ cubes: OrderedSet[XbrlCube] # ordered set of cube objects.
40
+ cubeTypes: OrderedSet[XbrlCubeType] # ordered set of cubeType objects.
41
+ dataTypes: OrderedSet[XbrlDataType] # ordered set of dataType objects.
42
+ dimensions: OrderedSet[XbrlDimension] # ordered set of dimension objects.
43
+ domains: OrderedSet[XbrlDomain] # (optional) ordered set of domain objects.
44
+ domainRoots: OrderedSet[XbrlDomainRoot] # (optional) ordered set of domain root objects.
45
+ entities: OrderedSet[XbrlEntity] # (optional) ordered set of entity objects.
46
+ groups: OrderedSet[XbrlGroup] # ordered set of group objects.
47
+ groupContents: OrderedSet[XbrlGroupContent] # ordered set of groupContent objects that link a group QName to a list of network or cube objects.
48
+ labels: OrderedSet[XbrlLabel] # ordered set of label objects.
49
+ members: OrderedSet[XbrlMember] # ordered set of member objects.
50
+ networks: OrderedSet[XbrlNetwork] # ordered set of network objects.
51
+ propertyTypes: OrderedSet[XbrlPropertyType] # ordered set of propertyType objects.
52
+ references: OrderedSet[XbrlReference] # ordered set of reference objects.
53
+ labelTypes: OrderedSet[XbrlLabelType] # rdered set of labelType objects.
54
+ referenceTypes: OrderedSet[XbrlReferenceType] # ordered set of referenceType objects.
55
+ relationshipTypes: OrderedSet[XbrlRelationshipType] # ordered set of relationshipType objects.
56
+ tableTemplates: OrderedSet[XbrlTableTemplate] # ordered set of tableTemplate objects.
57
+ dataTables: OrderedSet[XbrlDataTable] # (optional) ordered set of dataTable objects.
58
+ transforms: OrderedSet[XbrlTransform] # (optional) an ordered set of transform objects.
59
+ units: OrderedSet[XbrlUnit] # ordered set of unit objects.
60
+ properties: OrderedSet[XbrlProperty] # ordered set of property objects used to specify additional properties associated with the taxonomy. Only immutable properties as defined in the propertyType object can be added to a taxonom
61
+
62
+ xbrlObjectTypes = {
63
+ qname("{https://xbrl.org/2025}xbrl:taxonomyObject"): XbrlTaxonomy,
64
+ qname("{https://xbrl.org/2025}xbrl:importTaxonomyObject"): XbrlImportedTaxonomy,
65
+ qname("{https://xbrl.org/2025}xbrl:conceptObject"): XbrlConcept,
66
+ qname("{https://xbrl.org/2025}xbrl:abstractObject"): XbrlAbstract,
67
+ qname("{https://xbrl.org/2025}xbrl:cubeObject"): XbrlCube,
68
+ qname("{https://xbrl.org/2025}xbrl:cubeDimensionObject"): XbrlCubeDimension,
69
+ qname("{https://xbrl.org/2025}xbrl:periodConstraintObject"): XbrlPeriodConstraint,
70
+ qname("{https://xbrl.org/2025}xbrl:dateResolutionObject"): XbrlDateResolution,
71
+ qname("{https://xbrl.org/2025}xbrl:dimensionObject"): XbrlDimension,
72
+ qname("{https://xbrl.org/2025}xbrl:domainObject"): XbrlDomain,
73
+ qname("{https://xbrl.org/2025}xbrl:entityObject"): XbrlEntity,
74
+ qname("{https://xbrl.org/2025}xbrl:groupObject"): XbrlGroup,
75
+ qname("{https://xbrl.org/2025}xbrl:groupContentObject"): XbrlGroupContent,
76
+ qname("{https://xbrl.org/2025}xbrl:networkObject"): XbrlNetwork,
77
+ qname("{https://xbrl.org/2025}xbrl:relationshipObject"): XbrlRelationship,
78
+ qname("{https://xbrl.org/2025}xbrl:relationshipTypeObject"): XbrlRelationshipType,
79
+ qname("{https://xbrl.org/2025}xbrl:labelObject"): XbrlLabel,
80
+ qname("{https://xbrl.org/2025}xbrl:memberObject"): XbrlMember,
81
+ qname("{https://xbrl.org/2025}xbrl:propertyObject"): XbrlProperty,
82
+ qname("{https://xbrl.org/2025}xbrl:referenceObject"): XbrlReference,
83
+ qname("{https://xbrl.org/2025}xbrl:dataTypeObject"): XbrlDataType,
84
+ qname("{https://xbrl.org/2025}xbrl:propertyTypeObject"): XbrlPropertyType,
85
+ qname("{https://xbrl.org/2025}xbrl:labelTypeObject"): XbrlLabelType,
86
+ qname("{https://xbrl.org/2025}xbrl:referenceTypeObject"): XbrlReferenceType,
87
+ qname("{https://xbrl.org/2025}xbrl:cubeTypeObject"): XbrlCubeType,
88
+ qname("{https://xbrl.org/2025}xbrl:tableTemplateObject"): XbrlTableTemplate,
89
+ qname("{https://xbrl.org/2025}xbrl:transformObject"): XbrlTransform,
90
+ qname("{https://xbrl.org/2025}xbrl:unitObject"): XbrlUnit,
91
+ qname("{https://xbrl.org/2025}xbrl:unitTypeObject"): XbrlUnitType,
92
+ }
93
+ xbrlObjectQNames = dict((v,k) for k,v in xbrlObjectTypes.items())
@@ -0,0 +1,154 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from typing import GenericAlias, _UnionGenericAlias, Any
5
+ import os
6
+ from .XbrlConst import qnStdLabel
7
+ XbrlTaxonomyObject = None # class forward reference
8
+
9
+ EMPTY_DICT = {}
10
+
11
+ class XbrlObject:
12
+
13
+ def __init__(self, dtsObjectIndex=0, **kwargs):
14
+ self.dtsObjectIndex = dtsObjectIndex
15
+
16
+ @property
17
+ def xbrlDts(self):
18
+ return None
19
+
20
+ @property
21
+ def entryLoadingUrl(self):
22
+ href = str(getattr(getattr(self, 'taxonomy', None), 'name', '(none)'))
23
+ className = type(self).__name__
24
+ if className.startswith("Xbrl"):
25
+ classIndex = getattr(self, "_classIndex", None)
26
+ if classIndex is not None:
27
+ href = f"{href}/{className[4].lower()}{className[5:]}[{classIndex}]"
28
+ return href
29
+
30
+ def getProperty(self, propertyName, propertyClass=None, propertyType=None, language=None, defaultValue=None):
31
+ return getattr(self, propertyName, defaultValue)
32
+
33
+ @property
34
+ def propertyView(self):
35
+ objClass = type(self)
36
+ isTaxonomyObject = isinstance(self, XbrlTaxonomyObject)
37
+ objName = objClass.__name__[0].lower() + objClass.__name__[1:]
38
+ propVals = []
39
+ initialParentObjProp = True
40
+ referenceProperties = None
41
+ for propName, propType in getattr(objClass, "__annotations__", EMPTY_DICT).items():
42
+ if initialParentObjProp:
43
+ initialParentObjProp = False
44
+ if isinstance(propType, str) or propType.__name__.startswith("Xbrl"): # skip taxonomy alias type
45
+ continue
46
+ if hasattr(self, propName):
47
+ val = getattr(self, propName)
48
+ if isTaxonomyObject: # for Taxonomy objects, not used by OIM Instance objects
49
+ if propName == "properties":
50
+ for propObj in val:
51
+ propVals.append( (str(getattr(propObj, "property", "")), str(getattr(propObj, "value", ""))) )
52
+ continue
53
+ if propName in ("name", "groupName") and val and issubclass(objClass, XbrlReferencableTaxonomyObject):
54
+ # insert label first if any
55
+ label = self.xbrlDts.labelValue(val, qnStdLabel, fallbackToName=False)
56
+ if label:
57
+ propVals.append( ("label", label) )
58
+ referenceProperties = self.xbrlDts.referenceProperties(val, None)
59
+ elif propName == "dimensions" and isinstance(val, dict):
60
+ for propKey, propVal in val.items():
61
+ propVals.append( (str(propKey), str(propVal) ) )
62
+ continue
63
+ if isinstance(propType, GenericAlias): # set, dict, etc
64
+ propValueClass = propType.__args__[-1]
65
+ if hasattr(propValueClass, "propertyView"):
66
+ # skip empty sets of XBRL objects
67
+ if isinstance(val, (set,list)) and propValueClass.__name__.startswith("Xbrl"):
68
+ continue
69
+ propVal = [propName, f"({len(val)})"]
70
+ nestedPropvals = [o.propertyView for o in val]
71
+ if isinstance(nestedPropvals, (list, tuple)):
72
+ l = len(nestedPropvals)
73
+ if l == 1:
74
+ if isinstance(nestedPropvals[0], (list, tuple)):
75
+ nestedPropvals = nestedPropvals[0]
76
+ elif l > 1:
77
+ if isinstance(nestedPropvals[0], (list, tuple)) and isinstance(nestedPropvals[0][0], (list, tuple)) and len(nestedPropvals[0][0]) == 2:
78
+ # flatten properties
79
+ flatPropvals = []
80
+ for i,subPropval in enumerate(nestedPropvals):
81
+ for subPropEnt in subPropval:
82
+ flatPropvals.append([f"[{i}] {subPropEnt[0]}"]+[s for s in subPropEnt[1:]])
83
+ nestedPropvals = flatPropvals
84
+ if nestedPropvals:
85
+ propVal.extend([nestedPropvals])
86
+ elif len(val) > 0:
87
+ propVal = ", ".join(str(v) for v in val)
88
+ else:
89
+ continue # omit this property
90
+ elif val is None and isinstance(propType, _UnionGenericAlias) and propType.__args__[-1] == type(None):
91
+ continue # skip showing absent Optional[...] properties
92
+ else:
93
+ propVal = (propName, f"{val}")
94
+ propVals.append(propVal)
95
+ if referenceProperties:
96
+ for refType, refObjs in sorted(referenceProperties.items(), key=lambda a: str(a[0])):
97
+ propVals.append(
98
+ ("references", str(refType), tuple(
99
+ (getattr(rp, "propertyTypeName", ""), getattr(rp, "value", "")) for rp in refObjs)))
100
+ return tuple(propVals)
101
+
102
+ def __repr__(self):
103
+ # print object generic string based on class declaration
104
+ objClass = type(self)
105
+ objName = objClass.__name__[0].lower() + objClass.__name__[1:]
106
+ propVals = [f"{self.dtsObjectIndex}"]
107
+ initialParentObjProp = True
108
+ for propName, propType in getattr(objClass, "__annotations__", EMPTY_DICT).items():
109
+ if initialParentObjProp:
110
+ initialParentProp = False
111
+ if isinstance(propType, str) or getattr(propType, "__name__", "").startswith("Xbrl"): # skip taxonomy alias type
112
+ continue
113
+ if hasattr(self, propName):
114
+ val = getattr(self, propName)
115
+ if isinstance(propType, GenericAlias): # set, dict, etc
116
+ val = f"({len(val)})"
117
+ propVals.append(f"{propName}: {val}")
118
+ return f"{objName}[{', '.join(propVals)}]"
119
+
120
+ class XbrlTaxonomyObject(XbrlObject):
121
+ pass
122
+
123
+ class XbrlReportObject(XbrlObject):
124
+ pass
125
+
126
+ class XbrlReferencableTaxonomyObject(XbrlTaxonomyObject):
127
+
128
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
129
+ super(XbrlReferencableTaxonomyObject, self).__init__(*args, **kwargs)
130
+
131
+ @property
132
+ def xbrlDts(self):
133
+ if hasattr(self, "taxonomy"):
134
+ return self.taxonomy.dts
135
+ return None
136
+
137
+ def getProperty(self, propertyName, propertyType=None, language=None, defaultValue=None):
138
+ if propertyName == "label" and hasattr(self, "name"):
139
+ return self.xbrlDts.labelValue(self.name, propertyType or qnStdLabel, language)
140
+ return getattr(self, propertyName, defaultValue)
141
+
142
+ class XbrlTaxonomyTagObject(XbrlTaxonomyObject):
143
+
144
+ def __init__(self, *args: Any, **kwargs: Any) -> None:
145
+ super(XbrlTaxonomyTagObject, self).__init__(*args, **kwargs)
146
+
147
+ @property
148
+ def xbrlDts(self):
149
+ if hasattr(self, "taxonomy"):
150
+ return self.taxonomy.dts
151
+ return None
152
+
153
+ def getProperty(self, propertyName, propertyType=None, language=None, defaultValue=None):
154
+ return getattr(self, propertyName, defaultValue)
@@ -0,0 +1,17 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from arelle.ModelValue import QName, YearMonthDayTimeDuration
8
+ from arelle.PythonUtil import OrderedSet
9
+ from .XbrlTypes import XbrlTaxonomyType, QNameKeyType
10
+ from .ModelValueMore import QNameAt, SQName
11
+ from .XbrlTaxonomyObject import XbrlReferencableTaxonomyObject
12
+
13
+ class XbrlTransform(XbrlReferencableTaxonomyObject):
14
+ taxonomy: XbrlTaxonomyType
15
+ name: QNameKeyType # (required) The name is a QName that uniquely identifies the transform object.
16
+ inputDataType: QName # (required) Indicates the datatype of the input to be transformed.
17
+ outputDataType: QName # (required) Indicates the datatype of the input to be transformed.
@@ -0,0 +1,23 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+
5
+ from typing_extensions import TypeAlias
6
+ from arelle.ModelValue import QName
7
+
8
+ XbrlDtsType: TypeAlias = "XbrlDts"
9
+ XbrlLabelType: TypeAlias = "XbrlLabel"
10
+ XbrlPropertyType: TypeAlias = "XbrlProperty"
11
+ XbrlTaxonomyType: TypeAlias = "XbrlTaxonomy"
12
+ class QNameKeyType(QName): # a QName which is also the primary key for parent collection object
13
+ pass
14
+ class SQNameKeyType(QName): # an SQName which is also the primary key for parent collection object
15
+ pass
16
+ class strKeyType(str): # a str which is also the primary key for parent collection object
17
+ pass
18
+ class DefaultTrue: # a bool which if absent defaults to true
19
+ pass
20
+ class DefaultFalse: # a bool which if absent defaults to false
21
+ pass
22
+ class DefaultZero: # a number which if absent defaults to zero
23
+ pass
@@ -0,0 +1,17 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+
5
+ from typing import TYPE_CHECKING, Optional
6
+
7
+ from arelle.ModelValue import QName
8
+ from arelle.PythonUtil import OrderedSet
9
+ from .XbrlTypes import XbrlTaxonomyType, SQNameKeyType
10
+ from .XbrlTaxonomyObject import XbrlReferencableTaxonomyObject
11
+
12
+ class XbrlUnit(XbrlReferencableTaxonomyObject):
13
+ taxonomy: XbrlTaxonomyType
14
+ name: SQNameKeyType # (required) The unitQName that identifies the unit so it can be referenced by other objects.
15
+ dataType: QName # (required) Indicates the dataType of the unit. 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.
16
+ dataTypeNumerator: Optional[QName] # (optional) Indicates the dataType of the unit numerator when the unit is comprised of a division of two datatypes. This is an optional property and must be used with dataTypeDenominator
17
+ dataTypeDenominator: Optional[QName] # (optional) Indicates the dataType of the unit denominator when the unit is comprised of a division of two datatypes. This is an optional property and must be used with dataTypeNumerator