arelle-release 2.37.19__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 (28) hide show
  1. arelle/FileSource.py +2 -2
  2. arelle/ModelInstanceObject.py +1 -1
  3. arelle/ModelXbrl.py +1 -1
  4. arelle/_version.py +2 -2
  5. arelle/formula/XPathContext.py +22 -22
  6. arelle/formula/XPathParser.py +2 -2
  7. arelle/plugin/OimTaxonomy/ModelValueMore.py +2 -2
  8. arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +2 -3
  9. arelle/plugin/OimTaxonomy/XbrlConcept.py +2 -1
  10. arelle/plugin/OimTaxonomy/XbrlCube.py +8 -8
  11. arelle/plugin/OimTaxonomy/XbrlDts.py +5 -5
  12. arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +3 -3
  13. arelle/plugin/OimTaxonomy/XbrlNetwork.py +3 -3
  14. arelle/plugin/OimTaxonomy/XbrlProperty.py +3 -3
  15. arelle/plugin/OimTaxonomy/XbrlReport.py +3 -3
  16. arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +3 -3
  17. arelle/plugin/OimTaxonomy/XbrlTypes.py +1 -1
  18. arelle/plugin/OimTaxonomy/__init__.py +4 -5
  19. arelle/plugin/validate/NL/__init__.py +4 -0
  20. arelle/plugin/validate/NL/rules/nl_kvk.py +60 -0
  21. {arelle_release-2.37.19.dist-info → arelle_release-2.37.20.dist-info}/METADATA +2 -1
  22. {arelle_release-2.37.19.dist-info → arelle_release-2.37.20.dist-info}/RECORD +28 -28
  23. tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py +4 -1
  24. tests/unit_tests/arelle/test_import.py +0 -30
  25. {arelle_release-2.37.19.dist-info → arelle_release-2.37.20.dist-info}/WHEEL +0 -0
  26. {arelle_release-2.37.19.dist-info → arelle_release-2.37.20.dist-info}/entry_points.txt +0 -0
  27. {arelle_release-2.37.19.dist-info → arelle_release-2.37.20.dist-info}/licenses/LICENSE.md +0 -0
  28. {arelle_release-2.37.19.dist-info → arelle_release-2.37.20.dist-info}/top_level.txt +0 -0
arelle/FileSource.py CHANGED
@@ -13,7 +13,7 @@ import struct
13
13
  import tarfile
14
14
  import zipfile
15
15
  import zlib
16
- from typing import IO, TYPE_CHECKING, Any, TextIO, cast
16
+ from typing import IO, TYPE_CHECKING, Any, Optional, TextIO, cast
17
17
 
18
18
  import regex as re
19
19
  from lxml import etree
@@ -452,7 +452,7 @@ class FileSource:
452
452
  def reportPackage(self) -> ReportPackage | None:
453
453
  try:
454
454
  self._reportPackage: ReportPackage | None
455
- return self._reportPackage
455
+ return cast(Optional[ReportPackage], self._reportPackage)
456
456
  except AttributeError:
457
457
  self._reportPackage = ReportPackage.fromFileSource(self)
458
458
  return self._reportPackage
@@ -1133,7 +1133,7 @@ class ModelContext(ModelObject):
1133
1133
  dimValue = self.modelXbrl.qnameDimensionDefaults.get(dimQname)
1134
1134
  return dimValue
1135
1135
 
1136
- def dimMemberQname(self, dimQname, includeDefaults=False):
1136
+ def dimMemberQname(self, dimQname: ModelValue.QName, includeDefaults: bool = False) -> ModelValue.QName | None:
1137
1137
  """(QName) -- QName of explicit dimension if reported (or defaulted if includeDefaults is True), else None"""
1138
1138
  dimValue = self.dimValue(dimQname)
1139
1139
  if isinstance(dimValue, (ModelDimensionValue,DimValuePrototype)) and dimValue.isExplicit:
arelle/ModelXbrl.py CHANGED
@@ -878,7 +878,7 @@ class ModelXbrl:
878
878
  def dimensionsInUse(self) -> set[Any]:
879
879
  self._dimensionsInUse: set[Any]
880
880
  try:
881
- return self._dimensionsInUse
881
+ return cast(set[Any], self._dimensionsInUse)
882
882
  except AttributeError:
883
883
  self._dimensionsInUse = set(dim.dimension
884
884
  for cntx in self.contexts.values() # use contextsInUse? slower?
arelle/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '2.37.19'
21
- __version_tuple__ = version_tuple = (2, 37, 19)
20
+ __version__ = version = '2.37.20'
21
+ __version_tuple__ = version_tuple = (2, 37, 20)
@@ -351,8 +351,8 @@ class XPathContext:
351
351
  raise XPathException(p, 'err:XPST0017', _('Function named {0} does not have a custom or built-in implementation.').format(op))
352
352
  elif op in VALUE_OPS:
353
353
  # binary arithmetic operations and value comparisons
354
- s1 = self.atomize(p, resultStack.pop()) if len(resultStack) > 0 else []
355
- s2 = self.atomize(p, self.evaluate(p.args, contextItem=contextItem))
354
+ s1: Sequence[ContextItem] = self.atomize(p, resultStack.pop()) if len(resultStack) > 0 else []
355
+ s2: Sequence[ContextItem] = self.atomize(p, self.evaluate(p.args, contextItem=contextItem))
356
356
  # value comparisons
357
357
  if len(s1) > 1 or len(s2) > 1:
358
358
  raise XPathException(p, 'err:XPTY0004', _("Value operation '{0}' sequence length error").format(op))
@@ -383,35 +383,35 @@ class XPathContext:
383
383
  elif isinstance(op2, Decimal) and isinstance(op1, float):
384
384
  op2 = float(op2)
385
385
  if op == '+':
386
- result = op1 + op2
386
+ result = op1 + op2 # type: ignore[assignment,operator]
387
387
  elif op == '-':
388
- result = op1 - op2
388
+ result = op1 - op2 # type: ignore[assignment,operator]
389
389
  elif op == '*':
390
- result = op1 * op2
390
+ result = op1 * op2 # type: ignore[assignment,operator]
391
391
  elif op in ('div', 'idiv', "mod"):
392
392
  try:
393
393
  if op == 'div':
394
- result = op1 / op2
394
+ result = op1 / op2 # type: ignore[assignment,operator]
395
395
  elif op == 'idiv':
396
- result = op1 // op2
396
+ result = op1 // op2 # type: ignore[assignment,operator]
397
397
  elif op == 'mod':
398
- result = op1 % op2
398
+ result = op1 % op2 # type: ignore[assignment,operator]
399
399
  except ZeroDivisionError:
400
400
  raise XPathException(p, 'err:FOAR0001', _('Attempt to divide by zero: {0} {1} {2}.').format(op1, op, op2))
401
401
  elif op == 'ge':
402
- result = op1 >= op2
402
+ result = op1 >= op2 # type: ignore[operator]
403
403
  elif op == 'gt':
404
- result = op1 > op2
404
+ result = op1 > op2 # type: ignore[operator]
405
405
  elif op == 'le':
406
- result = op1 <= op2
406
+ result = op1 <= op2 # type: ignore[operator]
407
407
  elif op == 'lt':
408
- result = op1 < op2
408
+ result = op1 < op2 # type: ignore[operator]
409
409
  elif op == 'eq':
410
410
  result = op1 == op2
411
411
  elif op == 'ne':
412
412
  result = op1 != op2
413
413
  elif op == 'to':
414
- result = range(int(op1), int(op2) + 1)
414
+ result = range(int(op1), int(op2) + 1) # type: ignore[arg-type]
415
415
  elif op in GENERALCOMPARISON_OPS:
416
416
  # general comparisons
417
417
  s1 = self.atomize(p, resultStack.pop()) if len(resultStack) > 0 else []
@@ -440,23 +440,23 @@ class XPathContext:
440
440
  elif op in NODECOMPARISON_OPS:
441
441
  # node comparisons
442
442
  s1 = resultStack.pop() if len(resultStack) > 0 else []
443
- s2 = self.evaluate(p.args, contextItem=contextItem)
444
- if len(s1) > 1 or len(s2) > 1 or not self.isNodeSequence(s1) or not self.isNodeSequence(s2[0]):
443
+ _s2 = self.evaluate(p.args, contextItem=contextItem)
444
+ if len(s1) > 1 or len(_s2) > 1 or not self.isNodeSequence(s1) or not self.isNodeSequence(_s2[0]):
445
445
  raise XPathException(p, 'err:XPTY0004', _('Node comparison sequence error'))
446
- if len(s1) == 0 or len(s2[0]) == 0:
446
+ if len(s1) == 0 or len(_s2[0]) == 0:
447
447
  result = []
448
448
  else:
449
449
  n1 = s1[0]
450
- n2 = s2[0][0]
450
+ n2 = _s2[0][0]
451
451
  result = False
452
452
  for op1 in s1:
453
- for op2 in s2:
453
+ for _op2 in _s2:
454
454
  if op == 'is':
455
455
  result = n1 == n2
456
456
  elif op == '>>':
457
- result = op1 > op2
457
+ result = op1 > _op2 # type: ignore[operator]
458
458
  elif op == '<<':
459
- result = op1 <= op2
459
+ result = op1 <= _op2 # type: ignore[operator]
460
460
  if result:
461
461
  break
462
462
  elif op in COMBINING_OPS:
@@ -503,7 +503,7 @@ class XPathContext:
503
503
  if op == 'u+':
504
504
  result = op1
505
505
  elif op == 'u-':
506
- result = -op1
506
+ result = -op1 # type: ignore[assignment,operator]
507
507
  elif op == 'instance':
508
508
  result = False
509
509
  s1 = self.flattenSequence(resultStack.pop()) if len(resultStack) > 0 else []
@@ -671,7 +671,7 @@ class XPathContext:
671
671
  if hasPrevValue:
672
672
  prevValue = self.inScopeVars[rvQname]
673
673
  for rv in r:
674
- self.inScopeVars[rvQname] = rv # type: ignore[assignment]
674
+ self.inScopeVars[rvQname] = rv
675
675
  self.evaluateRangeVars(op, args[0], args[1:], contextItem, result)
676
676
  if op != 'for' and len(result) > 0:
677
677
  break # short circuit evaluation
@@ -9,7 +9,7 @@ import time
9
9
  import traceback
10
10
  from collections.abc import Iterable, Sequence
11
11
  from decimal import Decimal
12
- from typing import Any, TYPE_CHECKING, Union
12
+ from typing import Any, TYPE_CHECKING, Union, cast
13
13
  from xml.dom import minidom
14
14
 
15
15
  from pyparsing import (
@@ -954,7 +954,7 @@ def staticExpressionFunctionContext() -> minidom.Element:
954
954
  ' xmlns:fn="http://www.w3.org/2005/xpath-functions"'
955
955
  '/>'
956
956
  ).documentElement
957
- return _staticExpressionFunctionContext
957
+ return cast(minidom.Element, _staticExpressionFunctionContext)
958
958
 
959
959
 
960
960
  def parse(
@@ -2,12 +2,12 @@
2
2
  See COPYRIGHT.md for copyright information.
3
3
  """
4
4
 
5
- from typing import TYPE_CHECKING, Set, Any
5
+ from typing import TYPE_CHECKING, Optional, Set, Any
6
6
 
7
7
  from arelle.ModelValue import QName
8
8
 
9
9
  class QNameAt(QName):
10
- def __init__(self, prefix: str | None, namespaceURI: str | None, localName: str, atSuffix:str = "end") -> None:
10
+ def __init__(self, prefix: Optional[str], namespaceURI: Optional[str], localName: str, atSuffix:str = "end") -> None:
11
11
  super(QNameAt, self).__init__(prefix, namespaceURI, localName)
12
12
  self.atSuffix: str = atSuffix # The context suffix must be either @end or @start. If an @ value is not provided then the suffix defaults to @end.
13
13
 
@@ -1,8 +1,7 @@
1
1
  '''
2
2
  See COPYRIGHT.md for copyright information.
3
3
  '''
4
- from typing import Union
5
- from types import UnionType
4
+ from typing import Union, get_origin
6
5
  from collections import defaultdict
7
6
  from decimal import Decimal
8
7
  from typing import GenericAlias
@@ -28,7 +27,7 @@ def viewXbrlTxmyObj(xbrlDts, objClass, tabWin, header, additionalViews=None):
28
27
  initialParentProp = False
29
28
  if isinstance(propType, str):
30
29
  continue
31
- elif isinstance(propType, UnionType):
30
+ elif get_origin(propType) is Union:
32
31
  if any(arg.__name__.startswith("Xbrl") for arg in propType.__args__):
33
32
  continue
34
33
  elif propType.__name__.startswith("Xbrl"): # skip taxonomy alias type
@@ -2,7 +2,8 @@
2
2
  See COPYRIGHT.md for copyright information.
3
3
  """
4
4
 
5
- from typing import TYPE_CHECKING, TypeAlias, Optional, Any
5
+ from typing import TYPE_CHECKING, Optional, Any
6
+ from typing_extensions import TypeAlias
6
7
  from decimal import Decimal
7
8
 
8
9
  from arelle.ModelValue import QName
@@ -2,7 +2,7 @@
2
2
  See COPYRIGHT.md for copyright information.
3
3
  """
4
4
 
5
- from typing import TYPE_CHECKING, Optional
5
+ from typing import TYPE_CHECKING, Optional, Union
6
6
 
7
7
  from arelle.ModelValue import qname, QName, DateTime, YearMonthDayTimeDuration
8
8
  from arelle.PythonUtil import OrderedSet
@@ -32,7 +32,7 @@ class XbrlCubeDimension(XbrlTaxonomyObject):
32
32
  dimensionName: QName # (required) The QName of the dimension object that is used to identify the dimension. For the core dimensions of concept, period, entity and unit, the core dimension QNames of xbrl:concept, xbrl:period, xbrl:entity, xbrl:unit and xbrl:language are used. The dimension object indicates if the dimension is typed or explicit.
33
33
  domainName: Optional[QName] # (required if explicit dimension) The QName of the domain object that is used to identify the domain associated with the dimension. Only one domain can be associated with a dimension. The domain name cannot be provided for a typed dimension or the period core dimension.
34
34
  domainSort: Optional[str] # (optional if typed dimension) A string value that indicates the sort order of the typed dimension. The values can be either asc or desc. The values are case insensitive. This indicates if the cube is viewed the order of the values shown on the typed dimension. This cannot be used on an explicit dimension.
35
- allowDomainFacts: bool | DefaultFalse # (optional ) A boolean value that indicates if facts not identified with the dimension are included in the cube. For typed and explicit dimensions the value defaults to false. A value of true for a typed or explicit dimension will include facts that don't use the dimension in the cube. For the period core dimension, forever facts or facts with no period dimension are included when this value is set to true. For units, this is a unit with no units such as a string or date. For the entity core dimension, it is fact values with no entity. This property cannot be used on the concept core dimension.
35
+ allowDomainFacts: Union[bool, DefaultFalse] # (optional ) A boolean value that indicates if facts not identified with the dimension are included in the cube. For typed and explicit dimensions the value defaults to false. A value of true for a typed or explicit dimension will include facts that don't use the dimension in the cube. For the period core dimension, forever facts or facts with no period dimension are included when this value is set to true. For units, this is a unit with no units such as a string or date. For the entity core dimension, it is fact values with no entity. This property cannot be used on the concept core dimension.
36
36
  periodConstraints: set[XbrlPeriodConstraint] # (optional only for period core dimension) Defines an ordered set of periodConstraint objects to restrict fact values in a cube to fact values with a specified period.
37
37
 
38
38
  class XbrlCube(XbrlReferencableTaxonomyObject):
@@ -49,7 +49,7 @@ class XbrlAllowedCubeDimension(XbrlTaxonomyObject):
49
49
  dimensionName: Optional[QName] # (optional) The dimension QName that identifies the taxonomy defined dimension.
50
50
  dimensionType: Optional[str] # (optional) The dimension QName that identifies the taxonomy defined dimension.
51
51
  dimensionDataType: Optional[QName] # (optional) The dimension QName that identifies the taxonomy defined dimension.
52
- required: bool | DefaultFalse # (optional) The dimension QName that identifies the taxonomy defined dimension.
52
+ required: Union[bool, DefaultFalse] # (optional) The dimension QName that identifies the taxonomy defined dimension.
53
53
 
54
54
  class XbrlRequiredCubeRelationship(XbrlTaxonomyObject):
55
55
  relationshipTypeName: QName # (required) The relationship type QName of a relationship. This requires that at lease one of these relationship types exist on the cube.
@@ -59,11 +59,11 @@ class XbrlRequiredCubeRelationship(XbrlTaxonomyObject):
59
59
  class XbrlCubeType(XbrlReferencableTaxonomyObject):
60
60
  taxonomy: XbrlTaxonomyType
61
61
  name: QNameKeyType # (required) The name is a QName that uniquely identifies the cube type object.
62
- baseCubeType: bool | DefaultTrue # (optional) Base cube type that the cube object is based on. Uses the QName of a cubeType object. The property only allows restriction rather than expansion of the baseCubeTape.
63
- periodDimension: bool | DefaultTrue # (optional) boolean to indicate if the period core dimension is included in the cube. Defaults to true.
64
- entityDimension: bool | DefaultTrue # (optional) boolean to indicate if the entity core dimension is included in the cube. Defaults to true.
65
- unitDimension: bool | DefaultTrue # (optional) boolean to indicate if the unit core dimension is included in the cube. Defaults to true.
66
- taxonomyDefinedDimension: bool | DefaultTrue # (optional) boolean to indicate if taxonomy defined dimensions are included in the cube. Defaults to true.
62
+ baseCubeType: Union[bool, DefaultTrue] # (optional) Base cube type that the cube object is based on. Uses the QName of a cubeType object. The property only allows restriction rather than expansion of the baseCubeTape.
63
+ periodDimension: Union[bool, DefaultTrue] # (optional) boolean to indicate if the period core dimension is included in the cube. Defaults to true.
64
+ entityDimension: Union[bool, DefaultTrue] # (optional) boolean to indicate if the entity core dimension is included in the cube. Defaults to true.
65
+ unitDimension: Union[bool, DefaultTrue] # (optional) boolean to indicate if the unit core dimension is included in the cube. Defaults to true.
66
+ taxonomyDefinedDimension: Union[bool, DefaultTrue] # (optional) boolean to indicate if taxonomy defined dimensions are included in the cube. Defaults to true.
67
67
  allowedCubeDimensions: OrderedSet[XbrlAllowedCubeDimension] # (optional) An ordered set of allowedCubeDimension objects that are permitted to be used on the cube. If the property is not defined then any dimensions can be associated with the cube.
68
68
  requiredCubeRelationships: OrderedSet[XbrlRequiredCubeRelationship] # (optional) An ordered set of requiredCubeRelationship objects that at a minimum must be associated with the cube.
69
69
 
@@ -2,7 +2,7 @@
2
2
  See COPYRIGHT.md for copyright information.
3
3
  """
4
4
 
5
- from typing import TYPE_CHECKING, cast, Any, ClassVar
5
+ from typing import TYPE_CHECKING, Optional, Union, cast, Any, ClassVar
6
6
  from collections import OrderedDict, defaultdict # OrderedDict is not same as dict, has additional key order features
7
7
  import sys, traceback
8
8
  from arelle.ModelValue import QName, AnyURI
@@ -58,7 +58,7 @@ class XbrlDts(ModelXbrl): # complete wrapper for ModelXbrl
58
58
  def referenceTypes(self):
59
59
  return set(obj.referenceType for l in self.tagObjects.values() for obj in l if hasattr(obj, "referenceType"))
60
60
 
61
- def labelValue(self, name: QName, labelType: QName, lang: str | None = None, fallbackToName: bool = True) -> str | None:
61
+ def labelValue(self, name: QName, labelType: QName, lang: Optional[str] = None, fallbackToName: bool = True) -> Optional[str]:
62
62
  if labelType == XbrlConst.conceptNameLabelRole:
63
63
  return str(name)
64
64
  if lang is None:
@@ -76,7 +76,7 @@ class XbrlDts(ModelXbrl): # complete wrapper for ModelXbrl
76
76
  return str(name)
77
77
  return None
78
78
 
79
- def referenceProperties(self, name: QName, referenceType: QName | None, lang: str | None = None) -> list[XbrlPropertyType]:
79
+ def referenceProperties(self, name: QName, referenceType: Optional[QName], lang: Optional[str] = None) -> list[XbrlPropertyType]:
80
80
  refProperties = defaultdict(list)
81
81
  if lang is None:
82
82
  lang = self.modelXbrl.modelManager.defaultLang
@@ -90,11 +90,11 @@ class XbrlDts(ModelXbrl): # complete wrapper for ModelXbrl
90
90
 
91
91
 
92
92
  # UI thread viewTaxonomyObject
93
- def viewTaxonomyObject(self, objectId: str | int) -> None:
93
+ def viewTaxonomyObject(self, objectId: Union[str, int]) -> None:
94
94
  """Finds taxonomy object, if any, and synchronizes any views displaying it to bring the model object into scrollable view region and highlight it
95
95
  :param objectId: string which includes _ordinalNumber, produced by ModelObject.objectId(), or integer object index
96
96
  """
97
- xbrlObj: XbrlObject | str | int = ""
97
+ xbrlObj: Union[XbrlObject, str, int] = ""
98
98
  try:
99
99
  if isinstance(objectId, XbrlObject):
100
100
  xbrlObj = objectId
@@ -2,7 +2,7 @@
2
2
  See COPYRIGHT.md for copyright information.
3
3
  """
4
4
 
5
- from typing import TYPE_CHECKING
5
+ from typing import TYPE_CHECKING, Union
6
6
 
7
7
  from arelle.ModelValue import QName, AnyURI
8
8
  from arelle.PythonUtil import OrderedSet
@@ -18,5 +18,5 @@ class XbrlImportedTaxonomy(XbrlTaxonomyObject):
18
18
  taxonomyName: QNameKeyType # (required) The QName of the taxonomy to import. The location of the taxonomy QName is resolved by referencing the namespace map which includes the url of the namespace. When importing XBRL 2.1 taxonomies a QName comprising the namespace of the taxonomy to import and a local name of taxonomy is defined. i.e. ifrs:Taxonomy.
19
19
  includeObjects: set[QName] # (optional) A set of object QNames that should be imported from the taxonomyName location property. Only the objects defined in the include and any dependent objects are added to the dts. This property can only be used for taxonomy files using the OIM specification. The dependents of each object are defined in this specification.
20
20
  includeObjectTypes: set[QName] # (optional) A set of object type QNames that should be imported from the taxonomyName location property. Examples include xbrl:conceptObject and xbrl:memberObject. All objects of the specified object types from the taxonomyName and any dependent objects will be imported. This property can only be used for taxonomy files using the OIM specification. The includeObjectTypes cannot include the label object.
21
- excludeLabels: bool | DefaultTrue # (optional) If set to true any labels attached to the objects comprising the dts deriving from the taxonomyName property will be excluded from the dts. The default value is false.
22
- followImport: bool | DefaultFalse # (optional) If set to false the dts resolution will not import taxonomies defined in descendant ImportedTaxonomyObjects. These imports will be excluded from the dts. The default value is true. This means if a taxonomy QName is provided all imprtedTaxonomy objects will be brought into the dts.
21
+ excludeLabels: Union[bool, DefaultTrue] # (optional) If set to true any labels attached to the objects comprising the dts deriving from the taxonomyName property will be excluded from the dts. The default value is false.
22
+ followImport: Union[bool, DefaultFalse] # (optional) If set to false the dts resolution will not import taxonomies defined in descendant ImportedTaxonomyObjects. These imports will be excluded from the dts. The default value is true. This means if a taxonomy QName is provided all imprtedTaxonomy objects will be brought into the dts.
@@ -37,9 +37,9 @@ class XbrlRelationship(XbrlTaxonomyObject):
37
37
  return ("relationship", f"{str(self.source)}\u2192{self.target}", tuple(nestedProperties))
38
38
 
39
39
  class XbrlRelationshipSet:
40
- _relationshipsFrom: dict[QName, list[XbrlRelationship]] | None
41
- _relationshipsTo: dict[QName, list[XbrlRelationship]] | None
42
- _roots: OrderedSet[QName] | None
40
+ _relationshipsFrom: Optional[dict[QName, list[XbrlRelationship]]]
41
+ _relationshipsTo: Optional[dict[QName, list[XbrlRelationship]]]
42
+ _roots: Optional[OrderedSet[QName]]
43
43
 
44
44
  def __init__(self):
45
45
  self._relationshipsFrom = self._relationshipsTo = self._roots = None
@@ -2,7 +2,7 @@
2
2
  See COPYRIGHT.md for copyright information.
3
3
  """
4
4
 
5
- from typing import TYPE_CHECKING, Any, Optional
5
+ from typing import TYPE_CHECKING, Any, Optional, Union
6
6
 
7
7
  from arelle.ModelValue import QName
8
8
  from arelle.PythonUtil import OrderedSet
@@ -23,6 +23,6 @@ class XbrlPropertyType(XbrlReferencableTaxonomyObject):
23
23
  name: QNameKeyType # (required) The name is a QName that uniquely identifies the property type object.
24
24
  dataType: QName # (required) Indicates the dataType of the property value. 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.
25
25
  enumerationDomain: Optional[QName] # (optional) Used to specify the QName of a domain object that is used to derive enumerated domain members QNames that can be used for the property.
26
- definitional: bool | DefaultFalse # (optional) Indicates if the property is definitional. If changes to the property change the meaning of the object it is definitional, if the property provides extra information about the object it is not definitional. If no value is provided the attribute defaults to false.
26
+ definitional: Union[bool, DefaultFalse] # (optional) Indicates if the property is definitional. If changes to the property change the meaning of the object it is definitional, if the property provides extra information about the object it is not definitional. If no value is provided the attribute defaults to false.
27
27
  allowedObjects: set[QName] # (optional) List of allowable objects that the property can be used with. For example the balance property can only be used with concept objects.
28
- allowedAsLinkProperty: bool | DefaultFalse # (optional) Indicates if the property can be used a a properton the link between two objects in a relationship. If no value is provided the attribute defaults to false.
28
+ allowedAsLinkProperty: Union[bool, DefaultFalse] # (optional) Indicates if the property can be used a a properton the link between two objects in a relationship. If no value is provided the attribute defaults to false.
@@ -2,7 +2,7 @@
2
2
  See COPYRIGHT.md for copyright information.
3
3
  """
4
4
 
5
- from typing import TYPE_CHECKING, Optional, Any
5
+ from typing import TYPE_CHECKING, Optional, Any, Union
6
6
  from collections import OrderedDict
7
7
  from arelle.ModelValue import QName, AnyURI
8
8
  from arelle.PythonUtil import OrderedSet
@@ -12,9 +12,9 @@ from .XbrlTaxonomyObject import XbrlReportObject
12
12
  class XbrlFact(XbrlReportObject):
13
13
  report: XbrlDtsType
14
14
  id: Optional[str] # synthesized id (from fact key in JSON), marked Optional because it's a key, not value, in json source.
15
- value: str | None # (required) The value of the {value} property of the fact. The value MUST be represented as (xbrlje:invalidFactValue):
15
+ value: Optional[str] # (required) The value of the {value} property of the fact. The value MUST be represented as (xbrlje:invalidFactValue):
16
16
  decimals: Optional[int] # An integer providing the value of the {decimals} property, or absent if the value is infinitely precise or not applicable (for nil or non-numeric facts).
17
- dimensions: dict[QName | str, str] # (required) A dimensions object with properties corresponding to the members of the {dimensions} property.
17
+ dimensions: dict[Union[QName, str], str] # (required) A dimensions object with properties corresponding to the members of the {dimensions} property.
18
18
  links: dict[str, dict[str, list[str]]] # A links object, cormesponding to the link groups associated with the fact. This member MAY be absent if there are no link groups associated with the fact.
19
19
 
20
20
 
@@ -2,7 +2,7 @@
2
2
  See COPYRIGHT.md for copyright information.
3
3
  """
4
4
 
5
- from typing import TYPE_CHECKING, Optional
5
+ from typing import TYPE_CHECKING, Optional, Union
6
6
  from decimal import Decimal
7
7
 
8
8
  from arelle.ModelValue import QName
@@ -20,8 +20,8 @@ class XbrlTableTemplate(XbrlReferencableTaxonomyObject):
20
20
 
21
21
  class XbrlAxisDimensions(XbrlTaxonomyObject):
22
22
  dimensionName: QName # (required) The QName of a dimension defined by the cubeName property.
23
- showTotal: bool | DefaultFalse # (optional) Indicates if the total of the dimension is shown in the axis. This is the value associated with the dimension absent. If no value is provided the default is false. The concept dimension defaults to false and cannot be set to true.
24
- showAncestorColumns: bool | DefaultFalse # (optional) Define members on an explicit dimension that are not leaf values that are included on the axis. If not provided only leaf members on the axis will show.
23
+ showTotal: Union[bool, DefaultFalse] # (optional) Indicates if the total of the dimension is shown in the axis. This is the value associated with the dimension absent. If no value is provided the default is false. The concept dimension defaults to false and cannot be set to true.
24
+ showAncestorColumns: Union[bool, DefaultFalse] # (optional) Define members on an explicit dimension that are not leaf values that are included on the axis. If not provided only leaf members on the axis will show.
25
25
  totalLocation: Optional[str] # (optional) Indicates if the total is at the start or at the end when shown on the axis. The default value is end. The totalLocation attribute can only have a value of start or end.
26
26
  periodAlign: OrderedSet[str] # (optional) the period align attribute can only be used with the period dimension. This attribute is used to align time values of facts in a dimension rather than being created as seperate columns or rows. The values @start and @end are used to indicate if instant values are aligned with duration values. These values are used to support roll-forwards in a datatgrid and will align duration values and instant values with the same start and end dates.
27
27
 
@@ -2,7 +2,7 @@
2
2
  See COPYRIGHT.md for copyright information.
3
3
  """
4
4
 
5
- from typing import TypeAlias
5
+ from typing_extensions import TypeAlias
6
6
  from arelle.ModelValue import QName
7
7
 
8
8
  XbrlDtsType: TypeAlias = "XbrlDts"
@@ -16,8 +16,7 @@ For debugging, saves the xsd objects loaded from the OIM taxonomy if
16
16
 
17
17
  """
18
18
 
19
- from typing import TYPE_CHECKING, cast, GenericAlias, Union, _UnionGenericAlias
20
- from types import UnionType
19
+ from typing import TYPE_CHECKING, cast, GenericAlias, Union, _UnionGenericAlias, get_origin
21
20
 
22
21
  import os, io, json, sys, time, traceback
23
22
  import jsonschema
@@ -377,7 +376,7 @@ def loadOIMTaxonomy(cntlr, error, warning, modelXbrl, oimFile, mappedUri, **kwar
377
376
  eltClass = propType.__args__[0]
378
377
  if isinstance(jsonValue, list):
379
378
  for iObj, listObj in enumerate(jsonValue):
380
- if isinstance(eltClass, str) or eltClass.__name__.startswith("Xbrl"): # nested Xbrl objects
379
+ if isinstance(eltClass, str) or getattr(eltClass, "__name__", "").startswith("Xbrl"): # nested Xbrl objects
381
380
  if isinstance(listObj, dict):
382
381
  # this handles lists of dict objects. For dicts of key-value dict objects see above.
383
382
  createTaxonomyObjects(propName, listObj, newObj, pathParts + [f'{propName}[{iObj}]'])
@@ -401,7 +400,7 @@ def loadOIMTaxonomy(cntlr, error, warning, modelXbrl, oimFile, mappedUri, **kwar
401
400
  collectionProp.append(listObj)
402
401
  elif isinstance(jsonValue, dict) and keyClass:
403
402
  for iObj, (valKey, valVal) in enumerate(jsonValue.items()):
404
- if isinstance(_keyClass, UnionType):
403
+ if get_origin(_keyClass) is Union:
405
404
  if QName in _keyClass.__args__ and ":" in valKey:
406
405
  _valKey = qname(listObj, prefixNamespaces)
407
406
  if _valKey is None:
@@ -447,7 +446,7 @@ def loadOIMTaxonomy(cntlr, error, warning, modelXbrl, oimFile, mappedUri, **kwar
447
446
  keyValue = jsonValue # e.g. the QNAme of the new object for parent object collection
448
447
  elif propType in (type(oimParentObj), type(oimParentObj).__name__): # propType may be a TypeAlias which is a string name of class
449
448
  setattr(newObj, propName, oimParentObj)
450
- elif ((isinstance(propType, (UnionType,_UnionGenericAlias)) or isinstance(getattr(propType, "__origin__", None), type(Union))) and # Optional[ ] type
449
+ elif (((get_origin(propType) is Union) or isinstance(get_origin(propType), type(Union))) and # Optional[ ] type
451
450
  propType.__args__[-1] in (type(None), DefaultTrue, DefaultFalse, DefaultZero)):
452
451
  setattr(newObj, propName, {type(None): None, DefaultTrue: True, DefaultFalse: False, DefaultZero:0}[propType.__args__[-1]]) # use first of union for prop value creation
453
452
  else: # absent json element
@@ -43,6 +43,9 @@ def disclosureSystemConfigURL(*args: Any, **kwargs: Any) -> str:
43
43
  def modelXbrlLoadComplete(*args: Any, **kwargs: Any) -> ModelDocument | LoadingException | None:
44
44
  return validationPlugin.modelXbrlLoadComplete(*args, **kwargs)
45
45
 
46
+ def validateFinally(*args: Any, **kwargs: Any) -> None:
47
+ return validationPlugin.validateFinally(*args, **kwargs)
48
+
46
49
  def validateXbrlStart(val: ValidateXbrl, parameters: dict[Any, Any], *args: Any, **kwargs: Any) -> None:
47
50
  val.extensionImportedUrls = set()
48
51
 
@@ -63,4 +66,5 @@ __pluginInfo__ = {
63
66
  "ModelXbrl.LoadComplete": modelXbrlLoadComplete,
64
67
  "Validate.XBRL.Start": validateXbrlStart,
65
68
  "Validate.XBRL.Finally": validateXbrlFinally,
69
+ "ValidateFormula.Finished": validateFinally,
66
70
  }
@@ -847,6 +847,66 @@ def rule_nl_kvk_3_6_3_3(
847
847
  'Invalid filenames: %(invalidBasenames)s'))
848
848
 
849
849
 
850
+ @validation(
851
+ hook=ValidationHook.FINALLY,
852
+ disclosureSystems=[
853
+ DISCLOSURE_SYSTEM_NL_INLINE_2024
854
+ ],
855
+ )
856
+ def rule_nl_kvk_3_7_1_1(
857
+ pluginData: PluginValidationDataExtension,
858
+ val: ValidateXbrl,
859
+ *args: Any,
860
+ **kwargs: Any,
861
+ ) -> Iterable[Validation]:
862
+ """
863
+ NL-KVK.3.7.1.1: The filing MUST be valid against the formula linkbase assertions with error severity.
864
+ """
865
+ modelXbrl = val.modelXbrl
866
+ sumErrMsgs = 0
867
+ for e in modelXbrl.errors:
868
+ if isinstance(e,dict):
869
+ for id, (numSat, numUnsat, numOkMsgs, numWrnMsgs, numErrMsgs) in e.items():
870
+ sumErrMsgs += numErrMsgs
871
+ if sumErrMsgs > 0:
872
+ yield Validation.error(
873
+ codes='NL.NL-KVK.3.7.1.1.targetXBRLDocumentWithFormulaErrors',
874
+ msg=_("The filing is not valid against the formula linkbase assertions with error severity. Address the %(numUnsatisfied)s unresolved formula linkbase validation errors."),
875
+ modelObject=modelXbrl,
876
+ numUnsatisfied=sumErrMsgs
877
+ )
878
+
879
+
880
+ @validation(
881
+ hook=ValidationHook.FINALLY,
882
+ disclosureSystems=[
883
+ DISCLOSURE_SYSTEM_NL_INLINE_2024
884
+ ],
885
+ )
886
+ def rule_nl_kvk_3_7_1_2(
887
+ pluginData: PluginValidationDataExtension,
888
+ val: ValidateXbrl,
889
+ *args: Any,
890
+ **kwargs: Any,
891
+ ) -> Iterable[Validation]:
892
+ """
893
+ NL-KVK.3.7.1.2: The filing MUST be valid against the formula linkbase assertions with error warning.
894
+ """
895
+ modelXbrl = val.modelXbrl
896
+ sumWrnMsgs = 0
897
+ for e in modelXbrl.errors:
898
+ if isinstance(e,dict):
899
+ for id, (numSat, numUnsat, numOkMsgs, numWrnMsgs, numErrMsgs) in e.items():
900
+ sumWrnMsgs += numWrnMsgs
901
+ if sumWrnMsgs > 0:
902
+ yield Validation.warning(
903
+ codes='NL.NL-KVK.3.7.1.2.targetXBRLDocumentWithFormulaWarnings',
904
+ msg=_("The filing is not valid against the formula linkbase assertions with warning severity. Address the %(numUnsatisfied)s unresolved formula linkbase validation warnings."),
905
+ modelObject=modelXbrl,
906
+ numUnsatisfied=sumWrnMsgs
907
+ )
908
+
909
+
850
910
  @validation(
851
911
  hook=ValidationHook.XBRL_FINALLY,
852
912
  disclosureSystems=[
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.19
3
+ Version: 2.37.20
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License: Apache-2.0
@@ -41,6 +41,7 @@ Requires-Dist: pillow<12,>=10
41
41
  Requires-Dist: pyparsing==3.*
42
42
  Requires-Dist: python-dateutil==2.*
43
43
  Requires-Dist: regex
44
+ Requires-Dist: typing-extensions==4.*
44
45
  Provides-Extra: crypto
45
46
  Requires-Dist: pycryptodome==3.*; extra == "crypto"
46
47
  Provides-Extra: db
@@ -21,7 +21,7 @@ arelle/DialogRssWatch.py,sha256=mjc4pqyFDISY4tQtME0uSRQ3NlcWnNsOsMu9Zj8tTd0,1378
21
21
  arelle/DialogURL.py,sha256=JH88OPFf588E8RW90uMaieok7A_4kOAURQ8kHWVhnao,4354
22
22
  arelle/DialogUserPassword.py,sha256=kWPlCCihhwvsykDjanME9qBDtv6cxZlsrJyoMqiRep4,13769
23
23
  arelle/DisclosureSystem.py,sha256=g3XXMjuyKJk2eoqvHGqoyIs2bMfcODwOeISDRCcY9gc,24749
24
- arelle/FileSource.py,sha256=prfbAyYlrVGaYp8VagT4E6rz-sE1kLvL3FnzjHUN0c0,46611
24
+ arelle/FileSource.py,sha256=OHWArRo30BfqC4vmNsSsUVOjRXvhDGlW4EVmE5uG9ZM,46652
25
25
  arelle/FunctionCustom.py,sha256=d1FsBG14eykvpLpgaXpN8IdxnlG54dfGcsXPYfdpA9Q,5880
26
26
  arelle/FunctionFn.py,sha256=BcZKah1rpfquSVPwjvknM1pgFXOnK4Hr1e_ArG_mcJY,38058
27
27
  arelle/FunctionIxt.py,sha256=8JELGh1l4o8Ul4_G7JgwX8Ebch9it2DblI6OkfL33Cw,80082
@@ -37,7 +37,7 @@ arelle/Locale.py,sha256=aKC1Uaen_dbPGb92kZa_yUoo7On_QtWlvr5H_F9BNXg,33008
37
37
  arelle/ModelDocument.py,sha256=Sq6umEdn-aNHjxIpEsXTT7A4V25nGY0JiylSnhr9zSI,130749
38
38
  arelle/ModelDtsObject.py,sha256=nvHQs4BDmPxY6mqLiBuqIGRJXyA1EqOEGB2f3S6A6w4,88656
39
39
  arelle/ModelFormulaObject.py,sha256=-eb0lBYciEeAvvGduIs3AHGNGrxge9_0g1cVT6UUgvc,122560
40
- arelle/ModelInstanceObject.py,sha256=JqULoUliBscwWJa7NskIhNVxBqax2ImOSIh0tH6_7q0,74201
40
+ arelle/ModelInstanceObject.py,sha256=gRRPEZR-x6IL-0z0-asKd2nbgReZFKHKmk7QTxKXI64,74254
41
41
  arelle/ModelManager.py,sha256=QUNcD2LC_YyyGFU8bFTSuzIGI1qpOK55KBlQ697Ep1I,11075
42
42
  arelle/ModelObject.py,sha256=Rttkhv-PtfneZyDYsG5FDh98BzT97ameTmwNdqFaOv0,18657
43
43
  arelle/ModelObjectFactory.py,sha256=XuNF4Re3p00tODCdyspfar_DNCXfARqCaLEkntgAZ0g,8750
@@ -49,7 +49,7 @@ arelle/ModelTestcaseObject.py,sha256=sOyIktwv23BWOGyokzcwlJALp7UENsMAKKJmVfAZh6c
49
49
  arelle/ModelValue.py,sha256=t0mVl3-EcE4MaXdRL9F94XaBwBfu1xG2DmFuHOczrEk,39447
50
50
  arelle/ModelVersObject.py,sha256=cPD1IzhkCfuV1eMgVFWes88DH_6WkUj5kj7sgGF2M0I,26062
51
51
  arelle/ModelVersReport.py,sha256=bXEA9K3qkH57aABn5l-m3CTY0FAcF1yX6O4fo-URjl8,73326
52
- arelle/ModelXbrl.py,sha256=7rz4rxIGopwRDQTD12P0sdqzvPPoMhGgkg5qkMD6TDQ,72109
52
+ arelle/ModelXbrl.py,sha256=bj-_enkb2AV2KVCRrRf2YPGxOoO9cdqKnVqfy3bGFZk,72125
53
53
  arelle/PackageManager.py,sha256=BvPExMcxh8rHMxogOag-PGbX6vXdhCiXAHcDLA6Ypsc,32592
54
54
  arelle/PluginManager.py,sha256=foSgWvRI1Ret-6KVRQMFSv4RtpEf_0UB7468N_NjPGU,42116
55
55
  arelle/PluginUtils.py,sha256=0vFQ29wVVpU0cTY3YOBL6FhNQhhCTwShBH4qTJGLnvc,2426
@@ -123,7 +123,7 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
123
123
  arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
124
124
  arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
125
125
  arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
- arelle/_version.py,sha256=exjqYyIx4Pnixev_8JwGiKhIVgsCkWHDH-obnUR5gnI,515
126
+ arelle/_version.py,sha256=6XCSb3wXvbuwzUZ4u7I9uuIYrvk_rC4_utLxrLm9hX8,515
127
127
  arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
128
128
  arelle/api/Session.py,sha256=O8zpg7MJys9uxwwHf8OsSlZxpPdq7A3ONyY39Q4A3Kc,6218
129
129
  arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
@@ -230,8 +230,8 @@ arelle/formula/FactAspectsCache.py,sha256=YKEVZSIfP0NRB7Vxweg3ylyxKIDSZMdaTrASjg
230
230
  arelle/formula/FormulaConsisAsser.py,sha256=hO4GZwozM5cGl1xTU6OwoF3LlaMxAEB5Oy0rJh7uyG0,7567
231
231
  arelle/formula/FormulaEvaluator.py,sha256=WKNyJz1Os9gsKedJXLNC9y9u11Ea4_JQ-RAI7gSFmPU,82600
232
232
  arelle/formula/ValidateFormula.py,sha256=b_stG7h8RhaSsPt07_x-GRBHOl2uy-JNSMd6v-jkg_w,95942
233
- arelle/formula/XPathContext.py,sha256=JerF1suUL9RcKRFeF6kXZXGkuw6yaMb6gijNacrqugU,49386
234
- arelle/formula/XPathParser.py,sha256=GWQuxrMzMl5uNMSZEnNHPFaynZljxkpYsJdRZiz2jB0,50381
233
+ arelle/formula/XPathContext.py,sha256=7UsUZqHYaz60SgSoEIQxIyK2wbwRMj3iFFqGbpye-ao,49849
234
+ arelle/formula/XPathParser.py,sha256=__I7KwHjCk7MdvrJFHkHW0eLKgw_sQ5S7B1bt17_YqQ,50410
235
235
  arelle/formula/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
236
236
  arelle/images/arelle-full-word.ico,sha256=jsAzyAJZTtVPafxhgFQtdWJj7r_r0YhX_iWvWnZ4QKg,2430
237
237
  arelle/images/arelle-mac-icon-4.gif,sha256=jTXc1dBEgZuXuZVd1XOuLuXfpjNW_pusn0mPhHhkOtk,2619
@@ -331,30 +331,30 @@ arelle/plugin/streamingExtensions.py,sha256=9W4iQ1u8LFn7-ZEfbqBtuwKiZj-aq8FUXNmj
331
331
  arelle/plugin/systemInfo.py,sha256=Rv_9HmDwkswwBmhxrkz8uAL65J332r-QItTYMSz2Zbc,1641
332
332
  arelle/plugin/unpackSecEisFile.py,sha256=TVdYUKhgAZ0145anRi6kBesOxPJEvC5YROO1j-hcuwU,2631
333
333
  arelle/plugin/xuleSaver.py,sha256=3eNZAxziFos0YrC5NWezFPsIxN7Ex8jb-CaOVTd8Gw4,30073
334
- arelle/plugin/OimTaxonomy/ModelValueMore.py,sha256=XwmEwcnmlOfCuK6-or09p93gP68doT1MyxBdoRzr-kQ,621
334
+ arelle/plugin/OimTaxonomy/ModelValueMore.py,sha256=tjISOQby294o_N-PMv-GcuKSo-lc2o-hWuRZW6tDegU,637
335
335
  arelle/plugin/OimTaxonomy/ValidateDTS.py,sha256=LTI_pTeyK7FLNi560vmZPkPGT8HmGhcalnKiO5T8ccI,32081
336
- arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py,sha256=7jmp35bu9qILlJxTF9V5BUlHYoJxEE-FTEkvGDvQ7wQ,11165
336
+ arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py,sha256=zIe7dXf5bkY_wdzkS_lWrx31cDjklNiQBBQ44T8_SQo,11147
337
337
  arelle/plugin/OimTaxonomy/XbrlAbstract.py,sha256=KCh7IpmjDRA9Qx-XA7DEfL2f-GYLSAzjxpCCZ7YuqwM,781
338
- arelle/plugin/OimTaxonomy/XbrlConcept.py,sha256=Xr9z0I0V55sTOpHg30erSbMlPOSZEs8vH85bu03hhUE,5383
338
+ arelle/plugin/OimTaxonomy/XbrlConcept.py,sha256=2hPAueqEKUxk9gWY-b2iVjGDg_PEpgk50qGEjLsLIyo,5412
339
339
  arelle/plugin/OimTaxonomy/XbrlConst.py,sha256=3w4UHM0IPYBO9xsaO_ULnVUYxqyaGUqzlhkVO6GVlEA,7376
340
- arelle/plugin/OimTaxonomy/XbrlCube.py,sha256=GDPxU3G2eLxkF9DMym0LtMvwF6QrWY-mOaQFJrOX38k,10385
340
+ arelle/plugin/OimTaxonomy/XbrlCube.py,sha256=ddvSiv-zbDOjUIdYrh1xLwDJzq9UJNmAgIN8jVDFklA,10434
341
341
  arelle/plugin/OimTaxonomy/XbrlDimension.py,sha256=lUMY7x3ERACmgekwW5grHYMyIE7s0XzBhgfbSJFsPeM,4804
342
- arelle/plugin/OimTaxonomy/XbrlDts.py,sha256=6_46PWDnurhSIKWsHZNDsMGf0QFjN1lZ498INjhNDUc,7541
342
+ arelle/plugin/OimTaxonomy/XbrlDts.py,sha256=lz8buLWemPW6jz5m_B-cKh2XvmNoPQRsHBw6qxRjYYg,7581
343
343
  arelle/plugin/OimTaxonomy/XbrlEntity.py,sha256=UZRWqIvj1JkixbwN_H5W1cy02r6st-s6y_X2MENl2pg,796
344
344
  arelle/plugin/OimTaxonomy/XbrlGroup.py,sha256=hxPUXNN5kY-O3siVInfIp1KPT1v5oRiERi4vOT_tfs0,1420
345
- arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py,sha256=JKSC4T-IubyI9h7y9ha0LDDmrk_QhEJKGB6XT7bX1pg,2437
345
+ arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py,sha256=CO3nN3W3NC_0mAgq-wsoZCagz-sfbdM--YIRe_w-bvY,2456
346
346
  arelle/plugin/OimTaxonomy/XbrlLabel.py,sha256=5hqxnXf1d12HrPwQ2ppDJzRIJYq6WOtT7Upe4N6ihNo,1876
347
- arelle/plugin/OimTaxonomy/XbrlNetwork.py,sha256=zmNPeI_5jnTKV_46BhJ-tqEePLqifQ4mzzDJz3m1FSk,7500
348
- arelle/plugin/OimTaxonomy/XbrlProperty.py,sha256=OZzijsc7YsWetMmOtfyYlzdD3zHCsg3962RpJjTLN8M,1994
347
+ arelle/plugin/OimTaxonomy/XbrlNetwork.py,sha256=vDuRaDJc0fJaiolDY4NjcmxeUBdDbVaO3V_tr2QKqsw,7509
348
+ arelle/plugin/OimTaxonomy/XbrlProperty.py,sha256=MBAIg0gIwGSGXQr980mX7_yDYrv0RdaWjvDqD1w-HXY,2013
349
349
  arelle/plugin/OimTaxonomy/XbrlReference.py,sha256=X6MduupPkeIXyge_boUs2o9dMQ3NT7cj0VCfAS5z7s4,2395
350
- arelle/plugin/OimTaxonomy/XbrlReport.py,sha256=wJqOKkD4AXTyRyhK8Fr1hfC-MdQhz0NQBpV9iEnOZRE,1382
351
- arelle/plugin/OimTaxonomy/XbrlTableTemplate.py,sha256=vhvx8WoAloBkb-IMKigOLwC_voffiUjbgPevwnoJOvw,3066
350
+ arelle/plugin/OimTaxonomy/XbrlReport.py,sha256=QAJlHShRTCfGcc0chgbEFCQfIwfok2xKRK2WixtKUMY,1398
351
+ arelle/plugin/OimTaxonomy/XbrlTableTemplate.py,sha256=cCIMStv-F6pkliBIBaKFfUsQMdW4B-CEphMVRK68Flk,3085
352
352
  arelle/plugin/OimTaxonomy/XbrlTaxonomy.py,sha256=JxucxkZbl7VKhWXvQV7B9mkbXbc-GSvZs_qBnK_xt9M,6846
353
353
  arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py,sha256=UojOSnsIL3XUVEcngm-dvzYl6uXPLXUoJwgXY_HjRzo,7267
354
354
  arelle/plugin/OimTaxonomy/XbrlTransform.py,sha256=MrLWk77u3Gn1GUkwj3i3S3exTFWE0Ls3z0tfCM6sTIA,726
355
- arelle/plugin/OimTaxonomy/XbrlTypes.py,sha256=j-t1-4qLbbDKUNf46VpcPivzsHz82kbllHC3rv2guAg,809
355
+ arelle/plugin/OimTaxonomy/XbrlTypes.py,sha256=RIY0Ox2E2Md8RxNizdVwQl5f27iTWSh7m_ExUTdoRA4,820
356
356
  arelle/plugin/OimTaxonomy/XbrlUnit.py,sha256=z9HvsdKohrBOacHdNscVWqHRuB67qG722wsIYa7TKTk,1157
357
- arelle/plugin/OimTaxonomy/__init__.py,sha256=8bbZG9owSj30MneTRc2N2wlChE6cMruQ76LdY105wWo,62196
357
+ arelle/plugin/OimTaxonomy/__init__.py,sha256=8R3Civ-_vJYSMU9rep8LtIvuJvSANsbiMTNyYIYjJH0,62156
358
358
  arelle/plugin/OimTaxonomy/resources/iso4217.json,sha256=3a0VvUqH8EtsLImxIzZU6Ta-VXbXyuhCp1Hdpja6UD4,149911
359
359
  arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json,sha256=8-OIssr1XEEecJAnDLvtFQy8dcCAHfyuJ_8eBktwBDQ,42637
360
360
  arelle/plugin/OimTaxonomy/resources/ref.json,sha256=uSqnsW-YZTJSejg9XGxwoU1Wwt5UMljVDUi7hCDO_mw,11791
@@ -412,14 +412,14 @@ arelle/plugin/validate/FERC/resources/ferc-utr.xml,sha256=OCRj9IUpdXATCBXKbB71ap
412
412
  arelle/plugin/validate/NL/DisclosureSystems.py,sha256=kTjpxkgwn58wHCbaLRBInirOy-2cpK9MLWEFJ_193y4,180
413
413
  arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=3fAYo-rilJHN8I0XVdM3AxGIMF0j8StZ52DNCK_fQdk,17620
414
414
  arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=2qvvOqBkgk2LwERTHDuxtrRupYz3yRyhH71XQLbl9F4,15507
415
- arelle/plugin/validate/NL/__init__.py,sha256=L82brQTV6RjIkmMElxdqxOTP29v5u2Ur09qhHNw-46Y,2897
415
+ arelle/plugin/validate/NL/__init__.py,sha256=KPqcRHHYjaTQOLzN7vh3GtUhsVAB-aQGtrp_TUsV9LE,3064
416
416
  arelle/plugin/validate/NL/resources/config.xml,sha256=i_ns2wHmQYjhkRItevRR8tzfkl31ASfbWlc5t6pDB-w,1117
417
417
  arelle/plugin/validate/NL/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
418
418
  arelle/plugin/validate/NL/rules/br_kvk.py,sha256=0SwKieWzTDm3YMsXPS6zTdgbk7_Z9CzqRkRmCRz1OiQ,15789
419
419
  arelle/plugin/validate/NL/rules/fg_nl.py,sha256=4Puq5wAjtK_iNd4wisH_R0Z_EKJ7MT2OCai5g4t1MPE,10714
420
420
  arelle/plugin/validate/NL/rules/fr_kvk.py,sha256=-_BLeWGoZ_f56p5VO4X40S45Ny3Ej-WK6Srei1KVSxU,8170
421
421
  arelle/plugin/validate/NL/rules/fr_nl.py,sha256=-M1WtXp06khhtkfOVPCa-b8UbC281gk4YfDhvtAVlnI,31424
422
- arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=hPvh6FTXPoY_Dtzq0NCQxlySqnWKHLzCgrSAa1hpVBo,32571
422
+ arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=PZoVkuf0aCHtCL30Ye4pavgyyX2GF3ZRpkaezcHwBfw,34690
423
423
  arelle/plugin/validate/ROS/DisclosureSystems.py,sha256=rJ81mwQDYTi6JecFZ_zhqjjz3VNQRgjHNSh0wcQWAQE,18
424
424
  arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=IV7ILhNvgKwQXqbpSA6HRNt9kEnejCyMADI3wyyIgk0,4036
425
425
  arelle/plugin/validate/ROS/ValidationPluginExtension.py,sha256=FBhEp8t396vGdvCbMEimfcxmGiGnhXMen-yVLWnkFaI,758
@@ -741,7 +741,7 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
741
741
  arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
742
742
  arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
743
743
  arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
744
- arelle_release-2.37.19.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
744
+ arelle_release-2.37.20.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
745
745
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
746
746
  tests/integration_tests/download_cache.py,sha256=jVMIVICsZjcVc9DCPPu3fCjF9_cWSS3tqSynhFs3oAM,4097
747
747
  tests/integration_tests/integration_test_util.py,sha256=H7mncbv0T9ZeVyrtk9Hohe3k6jgcYykHkt-LGE-Q9aQ,10270
@@ -796,7 +796,7 @@ tests/integration_tests/validation/conformance_suite_configurations/kvk_nt16.py,
796
796
  tests/integration_tests/validation/conformance_suite_configurations/kvk_nt17.py,sha256=lmEZonthFm0YKFmp1dwXtdJ2T7txUeSpL4mbAo8fl4Y,1292
797
797
  tests/integration_tests/validation/conformance_suite_configurations/kvk_nt18.py,sha256=EG2RQVkvFENhzUF3fl3QvDnH7ZPYS1n1Fo8bhfmSczM,1205
798
798
  tests/integration_tests/validation/conformance_suite_configurations/kvk_nt19.py,sha256=FAzf9RhRmn_8yowpplJho2zEspX9FxJiVq8SjZT3Dsc,1199
799
- tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py,sha256=q68a58iJKOGIIVCCjGKfiK70piUZ1GPv4H677jCUGyg,10874
799
+ tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py,sha256=9cUaoPCo68OshIH8lK4TPdR9dg4Gl0swTHhAkML_Bks,10918
800
800
  tests/integration_tests/validation/conformance_suite_configurations/nl_nt16.py,sha256=O_LFVBZPkjxmbrU7_C7VTLtrdoCUx2bYXOXw6_MlRtQ,846
801
801
  tests/integration_tests/validation/conformance_suite_configurations/nl_nt17.py,sha256=aTN3Ez6lPsZsuypHZP84DneOtYxUZSjUiGypHy6ofHQ,846
802
802
  tests/integration_tests/validation/conformance_suite_configurations/nl_nt18.py,sha256=sqHLjrHc95dTu0guTgKkphaKM1zNfKGnN4GKkZDLzeU,845
@@ -1572,7 +1572,7 @@ tests/unit_tests/arelle/test_cntlr.py,sha256=zungezzESXZWNnOfUsoO_qqEqTxLgch7htv
1572
1572
  tests/unit_tests/arelle/test_frozen_dict.py,sha256=MzboGMIJsqkpPPazaPbCbXFzJAGFIDQQdBjET8mEabI,5450
1573
1573
  tests/unit_tests/arelle/test_frozen_ordered_set.py,sha256=5o7F_qrknwZUExVJObcA27wUPnbSrFeNyCKG2wacrFI,8746
1574
1574
  tests/unit_tests/arelle/test_functionfn.py,sha256=4pD4-lxI2r0VcriyYyF36MkAz2qVCSgvoLx7r_Q0Kj8,3098
1575
- tests/unit_tests/arelle/test_import.py,sha256=iW_Vyheo_EWNu3GhMmqVxHgH-33_wPZx1iJsd2gDBj0,3068
1575
+ tests/unit_tests/arelle/test_import.py,sha256=yZthWo7YmiK-itFBESPTvHbiXVhkT7-3C-RF9mKhYi8,1651
1576
1576
  tests/unit_tests/arelle/test_locale.py,sha256=u6NrZ6d26E3exHZqVzeDN8pOwoJi2Ryp_4sWkcnK5QY,1825
1577
1577
  tests/unit_tests/arelle/test_modelmanager.py,sha256=U-SYe9dOyURAVP2a778VfMUiJ-2SSnHxu1vZkD5_SKM,496
1578
1578
  tests/unit_tests/arelle/test_ordered_set.py,sha256=GkJgvdWIME5g5f3MD0tWJmAI6-aej3LOW4Xo61pUews,6527
@@ -1594,8 +1594,8 @@ tests/unit_tests/arelle/oim/test_load.py,sha256=NxiUauQwJVfWAHbbpsMHGSU2d3Br8Pki
1594
1594
  tests/unit_tests/arelle/plugin/test_plugin_imports.py,sha256=bdhIs9frAnFsdGU113yBk09_jis-z43dwUItMFYuSYM,1064
1595
1595
  tests/unit_tests/arelle/plugin/validate/ESEF/ESEF_Current/test_validate_css_url.py,sha256=XHABmejQt7RlZ0udh7v42f2Xb2STGk_fSaIaJ9i2xo0,878
1596
1596
  tests/unit_tests/arelle/utils/validate/test_decorator.py,sha256=ZS8FqIY1g-2FCbjF4UYm609dwViax6qBMRJSi0vfuhY,2482
1597
- arelle_release-2.37.19.dist-info/METADATA,sha256=3qS1MQJRhZ9A8oLfA9v6MPSrXTVmNYwZ-exNhNCHiEs,9096
1598
- arelle_release-2.37.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1599
- arelle_release-2.37.19.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1600
- arelle_release-2.37.19.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1601
- arelle_release-2.37.19.dist-info/RECORD,,
1597
+ arelle_release-2.37.20.dist-info/METADATA,sha256=K7acQC5mcoN1XxT008aOzdJB1bDThOfqEnCVSQ4fAx0,9134
1598
+ arelle_release-2.37.20.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1599
+ arelle_release-2.37.20.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1600
+ arelle_release-2.37.20.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1601
+ arelle_release-2.37.20.dist-info/RECORD,,
@@ -29,6 +29,10 @@ config = ConformanceSuiteConfig(
29
29
  # AND {base} with > 20 characters (3.6.3.1)
30
30
  'baseComponentInDocumentNameExceedsTwentyCharacters': 1,
31
31
  },
32
+ 'G3-7-1_1/index.xml:TC2_invalid': {
33
+ 'message:valueKvKIdentifier': 13,
34
+ 'nonIdenticalIdentifier': 1,
35
+ },
32
36
  'G4-1-2_1/index.xml:TC2_valid': {
33
37
  'undefinedLanguageForTextFact': 1,
34
38
  'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 5,
@@ -81,7 +85,6 @@ config = ConformanceSuiteConfig(
81
85
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_5/index.xml:TC2_invalid',
82
86
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_5/index.xml:TC3_invalid',
83
87
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-6-2_1/index.xml:TC2_invalid',
84
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-7-1_1/index.xml:TC2_invalid',
85
88
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-1-1_1/index.xml:TC3_invalid',
86
89
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-1-1_1/index.xml:TC4_invalid',
87
90
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-1-1_1/index.xml:TC5_invalid',
@@ -18,36 +18,6 @@ KNOWN_FAILURES = frozenset([
18
18
  'arelle.formula.FormulaEvaluator',
19
19
  ])
20
20
 
21
- # OIM Taxonomy uses typing features not available in Python 3.9 and earlier.
22
- # Python 3.9 support will be dropped before this plugin is fully supported.
23
- if sys.version_info < (3, 10):
24
- KNOWN_FAILURES |= frozenset([
25
- 'arelle.plugin.OimTaxonomy.__init__',
26
- 'arelle.plugin.OimTaxonomy.ModelValueMore',
27
- 'arelle.plugin.OimTaxonomy.ValidateDTS',
28
- 'arelle.plugin.OimTaxonomy.ViewXbrlTxmyObj',
29
- 'arelle.plugin.OimTaxonomy.XbrlAbstract',
30
- 'arelle.plugin.OimTaxonomy.XbrlConcept',
31
- 'arelle.plugin.OimTaxonomy.XbrlConst',
32
- 'arelle.plugin.OimTaxonomy.XbrlCube',
33
- 'arelle.plugin.OimTaxonomy.XbrlDimension',
34
- 'arelle.plugin.OimTaxonomy.XbrlDts',
35
- 'arelle.plugin.OimTaxonomy.XbrlEntity',
36
- 'arelle.plugin.OimTaxonomy.XbrlGroup',
37
- 'arelle.plugin.OimTaxonomy.XbrlImportedTaxonomy',
38
- 'arelle.plugin.OimTaxonomy.XbrlLabel',
39
- 'arelle.plugin.OimTaxonomy.XbrlNetwork',
40
- 'arelle.plugin.OimTaxonomy.XbrlProperty',
41
- 'arelle.plugin.OimTaxonomy.XbrlReference',
42
- 'arelle.plugin.OimTaxonomy.XbrlReport',
43
- 'arelle.plugin.OimTaxonomy.XbrlTableTemplate',
44
- 'arelle.plugin.OimTaxonomy.XbrlTaxonomy',
45
- 'arelle.plugin.OimTaxonomy.XbrlTaxonomyObject',
46
- 'arelle.plugin.OimTaxonomy.XbrlTransform',
47
- 'arelle.plugin.OimTaxonomy.XbrlTypes',
48
- 'arelle.plugin.OimTaxonomy.XbrlUnit',
49
- ])
50
-
51
21
  # Don't test common third party plugins which may be copied into a developer's workspace.
52
22
  IGNORE_MODULE_PREFIXES = (
53
23
  'arelle.plugin.EDGAR',