arelle-release 2.37.71__py3-none-any.whl → 2.38.0__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.
Files changed (71) hide show
  1. arelle/BetaFeatures.py +0 -21
  2. arelle/Cntlr.py +7 -1
  3. arelle/CntlrCmdLine.py +95 -19
  4. arelle/CntlrWinMain.py +4 -1
  5. arelle/DialogFind.py +1 -1
  6. arelle/ModelDtsObject.py +2 -0
  7. arelle/ModelObject.py +16 -18
  8. arelle/ModelObjectFactory.py +17 -15
  9. arelle/ModelXbrl.py +7 -1
  10. arelle/PluginManager.py +1 -5
  11. arelle/RuntimeOptions.py +1 -0
  12. arelle/UrlUtil.py +11 -0
  13. arelle/Validate.py +3 -3
  14. arelle/ValidateXbrl.py +2 -1
  15. arelle/ValidateXbrlCalcs.py +210 -186
  16. arelle/WebCache.py +2 -8
  17. arelle/XbrlConst.py +2 -0
  18. arelle/XmlUtil.py +16 -21
  19. arelle/XmlValidate.py +4 -6
  20. arelle/_version.py +2 -2
  21. arelle/config/rosettaEntitlements.plist +8 -0
  22. arelle/conformance/CSVTestcaseLoader.py +1 -1
  23. arelle/formula/XPathContext.py +3 -3
  24. arelle/logging/formatters/LogFormatter.py +3 -1
  25. arelle/packages/report/ReportPackage.py +9 -1
  26. arelle/plugin/inlineXbrlDocumentSet.py +1 -3
  27. arelle/plugin/validate/DBA/DisclosureSystems.py +19 -1
  28. arelle/plugin/validate/DBA/resources/config.xml +5 -0
  29. arelle/plugin/validate/DBA/rules/fr.py +19 -2
  30. arelle/plugin/validate/DBA/rules/tc.py +2 -0
  31. arelle/plugin/validate/DBA/rules/th.py +6 -0
  32. arelle/plugin/validate/DBA/rules/tm.py +18 -5
  33. arelle/plugin/validate/DBA/rules/tr.py +11 -5
  34. arelle/plugin/validate/EDINET/ControllerPluginData.py +2 -1
  35. arelle/plugin/validate/EDINET/NamespaceConfig.py +50 -0
  36. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +33 -78
  37. arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +153 -51
  38. arelle/plugin/validate/EDINET/rules/contexts.py +1 -1
  39. arelle/plugin/validate/EDINET/rules/edinet.py +163 -20
  40. arelle/plugin/validate/EDINET/rules/gfm.py +88 -1
  41. arelle/plugin/validate/EDINET/rules/upload.py +1 -1
  42. arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +3 -3
  43. arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +42 -14
  44. arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +14 -3
  45. arelle/plugin/validate/ESEF/__init__.py +10 -5
  46. arelle/plugin/validate/ESEF/resources/authority-validations.json +10 -5
  47. arelle/plugin/validate/NL/DisclosureSystems.py +22 -0
  48. arelle/plugin/validate/NL/PluginValidationDataExtension.py +20 -0
  49. arelle/plugin/validate/NL/ValidationPluginExtension.py +48 -3
  50. arelle/plugin/validate/NL/resources/config.xml +18 -0
  51. arelle/plugin/validate/NL/rules/br_kvk.py +9 -54
  52. arelle/plugin/validate/NL/rules/fg_nl.py +7 -38
  53. arelle/plugin/validate/NL/rules/fr_kvk.py +7 -42
  54. arelle/plugin/validate/NL/rules/fr_nl.py +25 -140
  55. arelle/plugin/validate/NL/rules/nl_kvk.py +125 -12
  56. arelle/plugin/validate/ROS/rules/ros.py +3 -1
  57. arelle/plugin/validate/UK/__init__.py +70 -14
  58. arelle/utils/EntryPointDetection.py +17 -11
  59. arelle/utils/validate/ESEFImage.py +3 -3
  60. arelle/utils/validate/Validation.py +9 -0
  61. arelle/utils/validate/ValidationPlugin.py +14 -12
  62. {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/METADATA +10 -5
  63. {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/RECORD +67 -69
  64. {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/licenses/LICENSE.md +0 -3
  65. arelle/model/CommentBase.py +0 -9
  66. arelle/model/ElementBase.py +0 -11
  67. arelle/model/PIBase.py +0 -10
  68. arelle/model/__init__.py +0 -15
  69. {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/WHEEL +0 -0
  70. {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/entry_points.txt +0 -0
  71. {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/top_level.txt +0 -0
arelle/XmlUtil.py CHANGED
@@ -285,9 +285,8 @@ def escapedNode(
285
285
  for n,v in sorted(elt.items(), key=lambda item: item[0]):
286
286
  if n in uriAttrs:
287
287
  v = resolveHtmlUri(elt, n, v).replace(" ", "%20") # %20 replacement needed for conformance test passing
288
- # 2022-09-15: assuming n, v are always strings
289
- s.append(' {0}="{1}"'.format(qname(elt, cast(str, n)),
290
- cast(str, v).replace("&","&").replace('"', '"')))
288
+ s.append(' {0}="{1}"'.format(qname(elt, n),
289
+ v.replace("&","&").replace('"', '"')))
291
290
  if not start and empty:
292
291
  if selfClosable(elt):
293
292
  s.append('/')
@@ -401,9 +400,7 @@ def ancestors(
401
400
  ancestorLocalNames: str | tuple[str, ...] | None = None
402
401
  ) -> list[ModelObject]:
403
402
  if ancestorNamespaceURI is None and ancestorLocalNames is None:
404
- return [
405
- cast(ModelObject, ancestor) for ancestor in element.iterancestors()
406
- ]
403
+ return list(element.iterancestors())
407
404
  ancestors = []
408
405
  wildNamespaceURI = not ancestorNamespaceURI or ancestorNamespaceURI == '*'
409
406
  treeElt = element.getparent()
@@ -635,13 +632,13 @@ def schemaBaseTypeDerivedFrom(
635
632
  return child.get("base") # str | None
636
633
  elif child.tag == "{http://www.w3.org/2001/XMLSchema}union":
637
634
  return (child.get("memberTypes") or "").split() + [
638
- schemaBaseTypeDerivedFrom(cast(ModelObject, _child))
635
+ schemaBaseTypeDerivedFrom(_child)
639
636
  for _child in child.iterchildren(tag="{http://www.w3.org/2001/XMLSchema}simpleType")] # list[str | QName | list[This func return] | None]
640
637
  elif child.tag in ("{http://www.w3.org/2001/XMLSchema}complexType",
641
638
  "{http://www.w3.org/2001/XMLSchema}simpleType",
642
639
  "{http://www.w3.org/2001/XMLSchema}complexContent",
643
640
  "{http://www.w3.org/2001/XMLSchema}simpleContent"):
644
- return schemaBaseTypeDerivedFrom(cast(ModelObject, child))
641
+ return schemaBaseTypeDerivedFrom(child)
645
642
  return None
646
643
 
647
644
  def schemaFacets(
@@ -846,7 +843,7 @@ def copyIxFootnoteHtml(
846
843
  if contAt is not None:
847
844
  copyIxFootnoteHtml(contAt, tgtHtml, targetModelDocument, withText=withText, isContinChainElt=True, tgtStack=tgtStack, srcLevel=0)
848
845
 
849
- def addComment(parent: ModelObject, commentText: str) -> None:
846
+ def addComment(parent: etree._Element, commentText: str) -> None:
850
847
  comment = str(commentText)
851
848
  if '--' in comment: # replace -- with - - (twice, in case more than 3 '-' together)
852
849
  comment = comment.replace('--', '- -').replace('--', '- -')
@@ -854,7 +851,7 @@ def addComment(parent: ModelObject, commentText: str) -> None:
854
851
  parent.append(child)
855
852
 
856
853
  def addProcessingInstruction(
857
- parent: ModelObject,
854
+ parent: etree._Element,
858
855
  piTarget: str | bytes,
859
856
  piText: str,
860
857
  insertBeforeChildElements: bool = True,
@@ -909,13 +906,10 @@ def setXmlns(modelDocument: etree._ElementTree | ModelDocument, prefix: str | No
909
906
  if root.tag == 'nsmap': # already have an xmlns-extension root element
910
907
  newmap = root.nsmap
911
908
  newmap[prefix] = namespaceURI
912
- # 2022-09-16: for some reason prefix is encouraged to always be a str in lxml-stubs,
913
- # but '' for default ns is not accepted by lxml nsmap arg and lxml produces and error
914
- # see https://github.com/lxml/lxml-stubs/blob/0a9b6099dd39b298fd0ff897dbcd4fed632d8776/lxml-stubs/etree.pyi#L69
915
- newroot = etree.Element('nsmap', nsmap=newmap) # type: ignore[arg-type] # above note
909
+ newroot = etree.Element('nsmap', nsmap=newmap)
916
910
  newroot.extend(root)
917
911
  else: # new xmlns-extension root
918
- newroot = etree.Element('nsmap', nsmap={prefix: namespaceURI}) # type: ignore[dict-item] # above note
912
+ newroot = etree.Element('nsmap', nsmap={prefix: namespaceURI})
919
913
  comments = []
920
914
  comment = root.getprevious()
921
915
  while isinstance(comment, etree._Comment):
@@ -939,9 +933,9 @@ def sortKey(
939
933
  if parentElement is not None:
940
934
  for childLocalName in childLocalNames if isinstance(childLocalNames,tuple) else (childLocalNames,):
941
935
  for child in parentElement.iterdescendants(tag="{{{0}}}{1}".format(childNamespaceUri,childLocalName)):
942
- value = text(cast(ModelObject, child))
936
+ value = text(child)
943
937
  if qnames:
944
- _value = prefixedNameToClarkNotation(cast(ModelObject, child), value)
938
+ _value = prefixedNameToClarkNotation(child, value)
945
939
  assert isinstance(_value, str)
946
940
  value = _value
947
941
  if childAttributeName is not None:
@@ -1156,7 +1150,7 @@ def elementTagnamesPath(element: etree._Element | ModelObject | None) -> str:
1156
1150
  # returns clark notation absolute path without element sequences
1157
1151
  tagnamesPath: list[str] = []
1158
1152
  while (element is not None):
1159
- tagnamesPath.insert(0, element.tag)
1153
+ tagnamesPath.insert(0, cast(str, element.tag))
1160
1154
  element = element.getparent()
1161
1155
  return "/".join(tagnamesPath)
1162
1156
 
@@ -1235,7 +1229,8 @@ def writexml(
1235
1229
  if skipInvalid and getattr(node, "xValid", VALID) == INVALID:
1236
1230
  return
1237
1231
  else:
1238
- ns, sep, localName = node.tag.partition('}')
1232
+ nodeTag = cast(str, node.tag)
1233
+ ns, sep, localName = nodeTag.partition('}')
1239
1234
  if sep:
1240
1235
  ns = ns[1:]
1241
1236
  prefix = xmlnsprefix(node,ns)
@@ -1258,7 +1253,7 @@ def writexml(
1258
1253
  else:
1259
1254
  attrs["xmlns"] = ns
1260
1255
  for aTag,aValue in node.items():
1261
- ns, sep, localName = cast(str, aTag).partition('}')
1256
+ ns, sep, localName = aTag.partition('}')
1262
1257
  if sep:
1263
1258
  prefix = xmlnsprefix(node,ns[1:])
1264
1259
  if prefix:
@@ -1267,7 +1262,7 @@ def writexml(
1267
1262
  prefixedName = localName
1268
1263
  else:
1269
1264
  prefixedName = ns
1270
- attrs[prefixedName] = cast(str, aValue)
1265
+ attrs[prefixedName] = aValue
1271
1266
  aSortedNames = sorted(attrs.keys())
1272
1267
 
1273
1268
  # should attribute names be indented on separate lines?
arelle/XmlValidate.py CHANGED
@@ -268,9 +268,7 @@ def validate(
268
268
  presentAttributes = set()
269
269
  # validate attributes
270
270
  # find missing attributes for default values
271
- for attrTag_, attrValue_ in elt.items():
272
- attrTag: str = cast(str, attrTag_)
273
- attrValue: str = cast(str, attrValue_)
271
+ for attrTag, attrValue in elt.items():
274
272
  qn = qnameClarkName(attrTag)
275
273
  #qn = qname(attrTag, noPrefixIsNoNamespace=True)
276
274
  baseXsdAttrType = None
@@ -702,8 +700,8 @@ class lxmlSchemaResolver(etree.Resolver):
702
700
  if xml:
703
701
  return self.resolve_string(xml, context, base_url=_url)
704
702
  else: # probably no active modelXbrl yet, such as when loading packages, use url
705
- return self.resolve_filename(url, context) # type: ignore[attr-defined]
706
- return self.resolve_empty(context) # type: ignore[attr-defined]
703
+ return self.resolve_filename(url, context)
704
+ return self.resolve_empty(context)
707
705
 
708
706
  def lxmlResolvingParser(cntlr: Cntlr, modelXbrl: ModelXbrl | None = None) -> etree.XMLParser:
709
707
  parser = etree.XMLParser(resolve_entities=False)
@@ -756,7 +754,7 @@ def lxmlSchemaValidate(modelDocument: ModelDocument, extraSchema : str | None =
756
754
  for key, val in docTree.getroot().nsmap.items()
757
755
  if key
758
756
  }
759
- for e in err.error_log: # type: ignore[attr-defined]
757
+ for e in err.error_log:
760
758
  if not any(s in e.message for s in (": The QName value", "is not a valid value of the atomic type 'xs:QName'")):
761
759
  # do newer lxml validations have QName whitespace collapsing issue?
762
760
  userFriendlyElementPath = ''
arelle/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '2.37.71'
32
- __version_tuple__ = version_tuple = (2, 37, 71)
31
+ __version__ = version = '2.38.0'
32
+ __version_tuple__ = version_tuple = (2, 38, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>com.apple.security.cs.allow-unsigned-executable-memory</key>
6
+ <true/>
7
+ </dict>
8
+ </plist>
@@ -54,7 +54,7 @@ def loadCsvTestcase(
54
54
  if tuple(header) != CSV_TESTCASE_HEADER:
55
55
  # CSV doesn't have a recognized testcase header.
56
56
  raise CSVTestcaseException(f"CSV file {filepath} doesn't have test case header: {CSV_TESTCASE_HEADER}, first row {header}")
57
- testcaseElement = etree.Element("testcase", nsmap=TESTCASE_NAMESPACES_BY_PREFIX) # type: ignore[arg-type]
57
+ testcaseElement = etree.Element("testcase", nsmap=TESTCASE_NAMESPACES_BY_PREFIX)
58
58
  document = ModelDocument.create(
59
59
  modelXbrl,
60
60
  ModelDocument.Type.TESTCASE,
@@ -781,11 +781,11 @@ class XPathContext:
781
781
  elif axis.endswith("-sibling"):
782
782
  if isinstance(node, ModelObject):
783
783
  targetNodes = [
784
- sibling # type: ignore[misc]
784
+ sibling
785
785
  for sibling in node.itersiblings(preceding=axis.startswith("preceding"))
786
786
  if (
787
- (not ns or ns == sibling.namespaceURI or ns == "*") # type: ignore[attr-defined]
788
- and (localname == sibling.localName or localname == "*") # type: ignore[attr-defined]
787
+ (not ns or ns == sibling.namespaceURI or ns == "*")
788
+ and (localname == sibling.localName or localname == "*")
789
789
  )
790
790
  ]
791
791
  elif axis == "preceding":
@@ -7,6 +7,8 @@ import logging
7
7
  from collections import defaultdict
8
8
  from typing import Any
9
9
 
10
+ from arelle import UrlUtil
11
+
10
12
 
11
13
  class LogFormatter(logging.Formatter):
12
14
  def __init__(self, fmt: str | None = None, datefmt: str | None = None) -> None:
@@ -39,7 +41,7 @@ def logRefsFileLines(refs: list[dict[str, Any]]) -> str:
39
41
  for ref in refs:
40
42
  href = ref.get("href")
41
43
  if href:
42
- hrefWithoutFakeIxdsPrefix = href.rpartition("_IXDS#?#")[2]
44
+ hrefWithoutFakeIxdsPrefix = UrlUtil.stripIxdsSurrogatePrefix(href)
43
45
  fileLines[hrefWithoutFakeIxdsPrefix.partition("#")[0]].add(ref.get("sourceLine") or 0)
44
46
  return ", ".join(file + " " + ', '.join(str(line)
45
47
  for line in sorted(lines, key=lambda l: l)
@@ -215,9 +215,17 @@ class ReportPackage:
215
215
  if reportPackageJsonFile:
216
216
  reportPackageJson = getPackageJson(filesource, reportPackageJsonFile)
217
217
  reports = getAllReportEntries(filesource, stld)
218
- if reportType == Const.ReportType.UNCONSTRAINED_REPORT_PACKAGE and reportPackageJsonFile is None and reports is None:
218
+ identifedByInspection = reportPackageJsonFile is not None or reports is not None
219
+ if reportType == Const.ReportType.UNCONSTRAINED_REPORT_PACKAGE and not identifedByInspection:
219
220
  # A zip file, but not a report package.
220
221
  return None
222
+ if reportType is None:
223
+ # Archive with unrecognized file extension.
224
+ if not identifedByInspection:
225
+ # Not a report package
226
+ return None
227
+ # Invalid file extension. Validate as report package and block loading reports.
228
+ reports = None
221
229
  if reports is not None and any(report.isTopLevel for report in reports):
222
230
  reports = [report for report in reports if report.isTopLevel]
223
231
  return ReportPackage(
@@ -140,7 +140,7 @@ from arelle.PluginManager import pluginClassMethods
140
140
  from arelle.PrototypeDtsObject import ArcPrototype, LocPrototype
141
141
  from arelle.PythonUtil import attrdict, isLegacyAbs
142
142
  from arelle.RuntimeOptions import RuntimeOptions
143
- from arelle.UrlUtil import isHttpUrl
143
+ from arelle.UrlUtil import IXDS_DOC_SEPARATOR, IXDS_SURROGATE, isHttpUrl
144
144
  from arelle.utils.EntryPointDetection import filesourceEntrypointFiles
145
145
  from arelle.ValidateDuplicateFacts import DeduplicationType
146
146
  from arelle.ValidateFilingText import CDATApattern
@@ -156,8 +156,6 @@ from arelle.XmlValidate import NONE, VALID
156
156
  from arelle.XmlValidate import validate as xmlValidate
157
157
 
158
158
  DEFAULT_TARGET = "(default)"
159
- IXDS_SURROGATE = "_IXDS#?#" # surrogate (fake) file name for inline XBRL doc set (IXDS)
160
- IXDS_DOC_SEPARATOR = "#?#" # the files of the document set follow the above "surrogate" with these separators
161
159
 
162
160
  MINIMUM_IXDS_DOC_COUNT = 2 # make this 2 to cause single-documents to be processed without a document set object
163
161
 
@@ -1,12 +1,30 @@
1
1
  ARL_2022_PREVIEW = "arl-2022-preview"
2
2
  ARL_2024_PREVIEW = "arl-2024-preview"
3
3
  ARL_2024_MULTI_TARGET_PREVIEW = "arl-2024-multi-target-preview"
4
+ DKFIN_2024_MULTI_TARGET_PREVIEW = "dkfin-2024-multi-target-preview"
5
+
6
+ ALL_DISCLOSURE_SYSTEMS = [
7
+ ARL_2022_PREVIEW,
8
+ ARL_2024_PREVIEW,
9
+ ARL_2024_MULTI_TARGET_PREVIEW,
10
+ DKFIN_2024_MULTI_TARGET_PREVIEW
11
+ ]
12
+
13
+ ARL_DISCLOSURE_SYSTEMS = [
14
+ ARL_2022_PREVIEW,
15
+ ARL_2024_PREVIEW,
16
+ ARL_2024_MULTI_TARGET_PREVIEW
17
+ ]
4
18
 
5
19
  STAND_ALONE_DISCLOSURE_SYSTEMS = [
6
20
  ARL_2022_PREVIEW,
7
21
  ARL_2024_PREVIEW
8
22
  ]
9
23
 
10
- MULTI_TARGET_DISCLOSURE_SYSTEMS = [
24
+ ARL_MULTI_TARGET_DISCLOSURE_SYSTEMS = [
11
25
  ARL_2024_MULTI_TARGET_PREVIEW
12
26
  ]
27
+
28
+ DKFIN_MULTI_TARGET_DISCLOSURE_SYSTEMS = [
29
+ DKFIN_2024_MULTI_TARGET_PREVIEW
30
+ ]
@@ -18,4 +18,9 @@
18
18
  description="Checks for 2024 multi-target rules"
19
19
  validationType="DBA"
20
20
  />
21
+ <DisclosureSystem
22
+ names="dkfin-2024-multi-target-preview"
23
+ description="Checks for dkfin 2024 multi-target rules"
24
+ validationType="DBA"
25
+ />
21
26
  </DisclosureSystems>
@@ -20,12 +20,13 @@ from . import errorOnDateFactComparison, getFactsWithDimension, getFactsGroupedB
20
20
  minimumRequiredFactsFound, consolidatedDimensionExists
21
21
  from ..PluginValidationDataExtension import PluginValidationDataExtension
22
22
  from ..ValidationPluginExtension import DANISH_CURRENCY_ID, ROUNDING_MARGIN, PERSONNEL_EXPENSE_THRESHOLD, REQUIRED_DISCLOSURE_OF_EQUITY_FACTS, REQUIRED_STATEMENT_OF_CHANGES_IN_EQUITY_FACTS
23
- from ..DisclosureSystems import MULTI_TARGET_DISCLOSURE_SYSTEMS, STAND_ALONE_DISCLOSURE_SYSTEMS
23
+ from ..DisclosureSystems import ARL_MULTI_TARGET_DISCLOSURE_SYSTEMS, STAND_ALONE_DISCLOSURE_SYSTEMS, ARL_DISCLOSURE_SYSTEMS
24
24
 
25
25
  _: TypeGetText
26
26
 
27
27
  @validation(
28
28
  hook=ValidationHook.XBRL_FINALLY,
29
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
29
30
  )
30
31
  def rule_fr1(
31
32
  pluginData: PluginValidationDataExtension,
@@ -52,6 +53,7 @@ def rule_fr1(
52
53
 
53
54
  @validation(
54
55
  hook=ValidationHook.XBRL_FINALLY,
56
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
55
57
  )
56
58
  def rule_fr7(
57
59
  pluginData: PluginValidationDataExtension,
@@ -108,6 +110,7 @@ def rule_fr20(
108
110
 
109
111
  @validation(
110
112
  hook=ValidationHook.XBRL_FINALLY,
113
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
111
114
  )
112
115
  def rule_fr24(
113
116
  pluginData: PluginValidationDataExtension,
@@ -143,6 +146,7 @@ def rule_fr24(
143
146
 
144
147
  @validation(
145
148
  hook=ValidationHook.XBRL_FINALLY,
149
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
146
150
  )
147
151
  def rule_fr25(
148
152
  pluginData: PluginValidationDataExtension,
@@ -302,6 +306,7 @@ def rule_fr35(
302
306
 
303
307
  @validation(
304
308
  hook=ValidationHook.XBRL_FINALLY,
309
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
305
310
  )
306
311
  def rule_fr36(
307
312
  pluginData: PluginValidationDataExtension,
@@ -329,6 +334,7 @@ def rule_fr36(
329
334
 
330
335
  @validation(
331
336
  hook=ValidationHook.XBRL_FINALLY,
337
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
332
338
  )
333
339
  def rule_fr37(
334
340
  pluginData: PluginValidationDataExtension,
@@ -468,6 +474,7 @@ def rule_fr52(
468
474
 
469
475
  @validation(
470
476
  hook=ValidationHook.XBRL_FINALLY,
477
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
471
478
  )
472
479
  def rule_fr53(
473
480
  pluginData: PluginValidationDataExtension,
@@ -770,6 +777,7 @@ def rule_fr57(
770
777
 
771
778
  @validation(
772
779
  hook=ValidationHook.XBRL_FINALLY,
780
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
773
781
  )
774
782
  def rule_fr58(
775
783
  pluginData: PluginValidationDataExtension,
@@ -805,6 +813,7 @@ def rule_fr58(
805
813
 
806
814
  @validation(
807
815
  hook=ValidationHook.XBRL_FINALLY,
816
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
808
817
  )
809
818
  def rule_fr59(
810
819
  pluginData: PluginValidationDataExtension,
@@ -934,6 +943,7 @@ def rule_fr71(
934
943
 
935
944
  @validation(
936
945
  hook=ValidationHook.XBRL_FINALLY,
946
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
937
947
  )
938
948
  def rule_fr72(
939
949
  pluginData: PluginValidationDataExtension,
@@ -973,6 +983,7 @@ def rule_fr72(
973
983
 
974
984
  @validation(
975
985
  hook=ValidationHook.XBRL_FINALLY,
986
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
976
987
  )
977
988
  def rule_fr73(
978
989
  pluginData: PluginValidationDataExtension,
@@ -1006,6 +1017,7 @@ def rule_fr73(
1006
1017
 
1007
1018
  @validation(
1008
1019
  hook=ValidationHook.XBRL_FINALLY,
1020
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1009
1021
  )
1010
1022
  def rule_fr74(
1011
1023
  pluginData: PluginValidationDataExtension,
@@ -1146,6 +1158,7 @@ def rule_fr77(
1146
1158
 
1147
1159
  @validation(
1148
1160
  hook=ValidationHook.XBRL_FINALLY,
1161
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1149
1162
  )
1150
1163
  def rule_fr81(
1151
1164
  pluginData: PluginValidationDataExtension,
@@ -1171,7 +1184,7 @@ def rule_fr81(
1171
1184
 
1172
1185
  @validation(
1173
1186
  hook=ValidationHook.XBRL_FINALLY,
1174
- disclosureSystems=MULTI_TARGET_DISCLOSURE_SYSTEMS,
1187
+ disclosureSystems=ARL_MULTI_TARGET_DISCLOSURE_SYSTEMS,
1175
1188
  )
1176
1189
  def rule_fr82(
1177
1190
  pluginData: PluginValidationDataExtension,
@@ -1215,6 +1228,7 @@ def rule_fr83(
1215
1228
 
1216
1229
  @validation(
1217
1230
  hook=ValidationHook.XBRL_FINALLY,
1231
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1218
1232
  )
1219
1233
  def rule_fr87(
1220
1234
  pluginData: PluginValidationDataExtension,
@@ -1251,6 +1265,7 @@ def rule_fr87(
1251
1265
 
1252
1266
  @validation(
1253
1267
  hook=ValidationHook.XBRL_FINALLY,
1268
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1254
1269
  )
1255
1270
  def rule_fr89(
1256
1271
  pluginData: PluginValidationDataExtension,
@@ -1301,6 +1316,7 @@ def rule_fr89(
1301
1316
 
1302
1317
  @validation(
1303
1318
  hook=ValidationHook.XBRL_FINALLY,
1319
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1304
1320
  )
1305
1321
  def rule_fr91(
1306
1322
  pluginData: PluginValidationDataExtension,
@@ -1331,6 +1347,7 @@ def rule_fr91(
1331
1347
 
1332
1348
  @validation(
1333
1349
  hook=ValidationHook.XBRL_FINALLY,
1350
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
1334
1351
  )
1335
1352
  def rule_fr92(
1336
1353
  pluginData: PluginValidationDataExtension,
@@ -13,11 +13,13 @@ from arelle.utils.validate.Decorator import validation
13
13
  from arelle.utils.validate.Validation import Validation
14
14
  from arelle.XmlValidateConst import VALID
15
15
  from ..PluginValidationDataExtension import PluginValidationDataExtension
16
+ from ..DisclosureSystems import ARL_DISCLOSURE_SYSTEMS
16
17
 
17
18
  _: TypeGetText
18
19
 
19
20
  @validation(
20
21
  hook=ValidationHook.XBRL_FINALLY,
22
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS,
21
23
  )
22
24
  def rule_tc02(
23
25
  pluginData: PluginValidationDataExtension,
@@ -14,12 +14,14 @@ from arelle.utils.validate.Decorator import validation
14
14
  from arelle.utils.validate.Validation import Validation
15
15
  from arelle.XmlValidateConst import VALID
16
16
  from ..PluginValidationDataExtension import PluginValidationDataExtension
17
+ from ..DisclosureSystems import ALL_DISCLOSURE_SYSTEMS
17
18
 
18
19
  _: TypeGetText
19
20
 
20
21
 
21
22
  @validation(
22
23
  hook=ValidationHook.XBRL_FINALLY,
24
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
23
25
  )
24
26
  def rule_th01(
25
27
  pluginData: PluginValidationDataExtension,
@@ -49,6 +51,7 @@ def rule_th01(
49
51
 
50
52
  @validation(
51
53
  hook=ValidationHook.XBRL_FINALLY,
54
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
52
55
  )
53
56
  def rule_th05 (
54
57
  pluginData: PluginValidationDataExtension,
@@ -71,6 +74,7 @@ def rule_th05 (
71
74
 
72
75
  @validation(
73
76
  hook=ValidationHook.XBRL_FINALLY,
77
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
74
78
  )
75
79
  def rule_th06 (
76
80
  pluginData: PluginValidationDataExtension,
@@ -95,6 +99,7 @@ def rule_th06 (
95
99
 
96
100
  @validation(
97
101
  hook=ValidationHook.XBRL_FINALLY,
102
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
98
103
  )
99
104
  def rule_th10 (
100
105
  pluginData: PluginValidationDataExtension,
@@ -143,6 +148,7 @@ def rule_th10 (
143
148
 
144
149
  @validation(
145
150
  hook=ValidationHook.XBRL_FINALLY,
151
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
146
152
  )
147
153
  def rule_th14 (
148
154
  pluginData: PluginValidationDataExtension,
@@ -3,26 +3,24 @@ See COPYRIGHT.md for copyright information.
3
3
  """
4
4
  from __future__ import annotations
5
5
 
6
- import datetime
7
- import decimal
8
- import itertools
9
6
  from collections.abc import Iterable
10
- from typing import Any, cast
7
+ from typing import Any
11
8
 
12
9
  from arelle.typing import TypeGetText
13
10
  from arelle.ValidateXbrl import ValidateXbrl
14
11
  from arelle.utils.PluginHooks import ValidationHook
15
12
  from arelle.utils.validate.Decorator import validation
16
13
  from arelle.utils.validate.Validation import Validation
17
- from arelle.XmlValidateConst import VALID
18
14
  from . import errorOnRequiredFact, errorOnMultipleFacts
19
15
  from ..PluginValidationDataExtension import PluginValidationDataExtension
16
+ from ..DisclosureSystems import ALL_DISCLOSURE_SYSTEMS, ARL_DISCLOSURE_SYSTEMS
20
17
 
21
18
  _: TypeGetText
22
19
 
23
20
 
24
21
  @validation(
25
22
  hook=ValidationHook.XBRL_FINALLY,
23
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
26
24
  )
27
25
  def rule_tm12(
28
26
  pluginData: PluginValidationDataExtension,
@@ -43,6 +41,7 @@ def rule_tm12(
43
41
 
44
42
  @validation(
45
43
  hook=ValidationHook.XBRL_FINALLY,
44
+ disclosureSystems=ALL_DISCLOSURE_SYSTEMS
46
45
  )
47
46
  def rule_tm13(
48
47
  pluginData: PluginValidationDataExtension,
@@ -58,6 +57,7 @@ def rule_tm13(
58
57
 
59
58
  @validation(
60
59
  hook=ValidationHook.XBRL_FINALLY,
60
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
61
61
  )
62
62
  def rule_tm16(
63
63
  pluginData: PluginValidationDataExtension,
@@ -73,6 +73,7 @@ def rule_tm16(
73
73
 
74
74
  @validation(
75
75
  hook=ValidationHook.XBRL_FINALLY,
76
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
76
77
  )
77
78
  def rule_tm18(
78
79
  pluginData: PluginValidationDataExtension,
@@ -102,6 +103,7 @@ def rule_tm18(
102
103
 
103
104
  @validation(
104
105
  hook=ValidationHook.XBRL_FINALLY,
106
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
105
107
  )
106
108
  def rule_tm20(
107
109
  pluginData: PluginValidationDataExtension,
@@ -131,6 +133,7 @@ def rule_tm20(
131
133
 
132
134
  @validation(
133
135
  hook=ValidationHook.XBRL_FINALLY,
136
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
134
137
  )
135
138
  def rule_tm22(
136
139
  pluginData: PluginValidationDataExtension,
@@ -146,6 +149,7 @@ def rule_tm22(
146
149
 
147
150
  @validation(
148
151
  hook=ValidationHook.XBRL_FINALLY,
152
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
149
153
  )
150
154
  def rule_tm24(
151
155
  pluginData: PluginValidationDataExtension,
@@ -161,6 +165,7 @@ def rule_tm24(
161
165
 
162
166
  @validation(
163
167
  hook=ValidationHook.XBRL_FINALLY,
168
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
164
169
  )
165
170
  def rule_tm25(
166
171
  pluginData: PluginValidationDataExtension,
@@ -181,6 +186,7 @@ def rule_tm25(
181
186
 
182
187
  @validation(
183
188
  hook=ValidationHook.XBRL_FINALLY,
189
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
184
190
  )
185
191
  def rule_tm26(
186
192
  pluginData: PluginValidationDataExtension,
@@ -196,6 +202,7 @@ def rule_tm26(
196
202
 
197
203
  @validation(
198
204
  hook=ValidationHook.XBRL_FINALLY,
205
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
199
206
  )
200
207
  def rule_tm27(
201
208
  pluginData: PluginValidationDataExtension,
@@ -216,6 +223,7 @@ def rule_tm27(
216
223
 
217
224
  @validation(
218
225
  hook=ValidationHook.XBRL_FINALLY,
226
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
219
227
  )
220
228
  def rule_tm28(
221
229
  pluginData: PluginValidationDataExtension,
@@ -231,6 +239,7 @@ def rule_tm28(
231
239
 
232
240
  @validation(
233
241
  hook=ValidationHook.XBRL_FINALLY,
242
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
234
243
  )
235
244
  def rule_tm29(
236
245
  pluginData: PluginValidationDataExtension,
@@ -253,6 +262,7 @@ def rule_tm29(
253
262
 
254
263
  @validation(
255
264
  hook=ValidationHook.XBRL_FINALLY,
265
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
256
266
  )
257
267
  def rule_tm30(
258
268
  pluginData: PluginValidationDataExtension,
@@ -268,6 +278,7 @@ def rule_tm30(
268
278
 
269
279
  @validation(
270
280
  hook=ValidationHook.XBRL_FINALLY,
281
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
271
282
  )
272
283
  def rule_tm31(
273
284
  pluginData: PluginValidationDataExtension,
@@ -293,6 +304,7 @@ def rule_tm31(
293
304
 
294
305
  @validation(
295
306
  hook=ValidationHook.XBRL_FINALLY,
307
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
296
308
  )
297
309
  def rule_tm32(
298
310
  pluginData: PluginValidationDataExtension,
@@ -323,6 +335,7 @@ def rule_tm32(
323
335
 
324
336
  @validation(
325
337
  hook=ValidationHook.XBRL_FINALLY,
338
+ disclosureSystems=ARL_DISCLOSURE_SYSTEMS
326
339
  )
327
340
  def rule_tm33(
328
341
  pluginData: PluginValidationDataExtension,