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.
- arelle/BetaFeatures.py +0 -21
- arelle/Cntlr.py +7 -1
- arelle/CntlrCmdLine.py +95 -19
- arelle/CntlrWinMain.py +4 -1
- arelle/DialogFind.py +1 -1
- arelle/ModelDtsObject.py +2 -0
- arelle/ModelObject.py +16 -18
- arelle/ModelObjectFactory.py +17 -15
- arelle/ModelXbrl.py +7 -1
- arelle/PluginManager.py +1 -5
- arelle/RuntimeOptions.py +1 -0
- arelle/UrlUtil.py +11 -0
- arelle/Validate.py +3 -3
- arelle/ValidateXbrl.py +2 -1
- arelle/ValidateXbrlCalcs.py +210 -186
- arelle/WebCache.py +2 -8
- arelle/XbrlConst.py +2 -0
- arelle/XmlUtil.py +16 -21
- arelle/XmlValidate.py +4 -6
- arelle/_version.py +2 -2
- arelle/config/rosettaEntitlements.plist +8 -0
- arelle/conformance/CSVTestcaseLoader.py +1 -1
- arelle/formula/XPathContext.py +3 -3
- arelle/logging/formatters/LogFormatter.py +3 -1
- arelle/packages/report/ReportPackage.py +9 -1
- arelle/plugin/inlineXbrlDocumentSet.py +1 -3
- arelle/plugin/validate/DBA/DisclosureSystems.py +19 -1
- arelle/plugin/validate/DBA/resources/config.xml +5 -0
- arelle/plugin/validate/DBA/rules/fr.py +19 -2
- arelle/plugin/validate/DBA/rules/tc.py +2 -0
- arelle/plugin/validate/DBA/rules/th.py +6 -0
- arelle/plugin/validate/DBA/rules/tm.py +18 -5
- arelle/plugin/validate/DBA/rules/tr.py +11 -5
- arelle/plugin/validate/EDINET/ControllerPluginData.py +2 -1
- arelle/plugin/validate/EDINET/NamespaceConfig.py +50 -0
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +33 -78
- arelle/plugin/validate/EDINET/TableOfContentsBuilder.py +153 -51
- arelle/plugin/validate/EDINET/rules/contexts.py +1 -1
- arelle/plugin/validate/EDINET/rules/edinet.py +163 -20
- arelle/plugin/validate/EDINET/rules/gfm.py +88 -1
- arelle/plugin/validate/EDINET/rules/upload.py +1 -1
- arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py +3 -3
- arelle/plugin/validate/ESEF/ESEF_Current/DTS.py +42 -14
- arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py +14 -3
- arelle/plugin/validate/ESEF/__init__.py +10 -5
- arelle/plugin/validate/ESEF/resources/authority-validations.json +10 -5
- arelle/plugin/validate/NL/DisclosureSystems.py +22 -0
- arelle/plugin/validate/NL/PluginValidationDataExtension.py +20 -0
- arelle/plugin/validate/NL/ValidationPluginExtension.py +48 -3
- arelle/plugin/validate/NL/resources/config.xml +18 -0
- arelle/plugin/validate/NL/rules/br_kvk.py +9 -54
- arelle/plugin/validate/NL/rules/fg_nl.py +7 -38
- arelle/plugin/validate/NL/rules/fr_kvk.py +7 -42
- arelle/plugin/validate/NL/rules/fr_nl.py +25 -140
- arelle/plugin/validate/NL/rules/nl_kvk.py +125 -12
- arelle/plugin/validate/ROS/rules/ros.py +3 -1
- arelle/plugin/validate/UK/__init__.py +70 -14
- arelle/utils/EntryPointDetection.py +17 -11
- arelle/utils/validate/ESEFImage.py +3 -3
- arelle/utils/validate/Validation.py +9 -0
- arelle/utils/validate/ValidationPlugin.py +14 -12
- {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/METADATA +10 -5
- {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/RECORD +67 -69
- {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/licenses/LICENSE.md +0 -3
- arelle/model/CommentBase.py +0 -9
- arelle/model/ElementBase.py +0 -11
- arelle/model/PIBase.py +0 -10
- arelle/model/__init__.py +0 -15
- {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/WHEEL +0 -0
- {arelle_release-2.37.71.dist-info → arelle_release-2.38.0.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
|
289
|
-
|
|
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(
|
|
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(
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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})
|
|
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(
|
|
936
|
+
value = text(child)
|
|
943
937
|
if qnames:
|
|
944
|
-
_value = prefixedNameToClarkNotation(
|
|
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
|
-
|
|
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 =
|
|
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] =
|
|
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
|
|
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)
|
|
706
|
-
return self.resolve_empty(context)
|
|
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:
|
|
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.
|
|
32
|
-
__version_tuple__ = version_tuple = (2,
|
|
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)
|
|
57
|
+
testcaseElement = etree.Element("testcase", nsmap=TESTCASE_NAMESPACES_BY_PREFIX)
|
|
58
58
|
document = ModelDocument.create(
|
|
59
59
|
modelXbrl,
|
|
60
60
|
ModelDocument.Type.TESTCASE,
|
arelle/formula/XPathContext.py
CHANGED
|
@@ -781,11 +781,11 @@ class XPathContext:
|
|
|
781
781
|
elif axis.endswith("-sibling"):
|
|
782
782
|
if isinstance(node, ModelObject):
|
|
783
783
|
targetNodes = [
|
|
784
|
-
sibling
|
|
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 == "*")
|
|
788
|
-
and (localname == sibling.localName or localname == "*")
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
]
|
|
@@ -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
|
|
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=
|
|
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
|
|
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,
|