arelle-release 2.37.22__py3-none-any.whl → 2.37.23__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.

@@ -0,0 +1,274 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ import binascii
7
+ import os
8
+
9
+ from dataclasses import dataclass
10
+ from typing import cast, Iterable
11
+ from urllib.parse import unquote
12
+
13
+ from lxml.etree import XML, XMLSyntaxError
14
+ from lxml.etree import _Element
15
+
16
+ from arelle import ModelDocument
17
+ from arelle.ModelObjectFactory import parser
18
+ from arelle.ModelXbrl import ModelXbrl
19
+ from arelle.UrlUtil import decodeBase64DataImage, scheme
20
+ from arelle.ValidateFilingText import parseImageDataURL, validateGraphicHeaderType
21
+ from arelle.ValidateXbrl import ValidateXbrl
22
+ from arelle.typing import TypeGetText
23
+ from arelle.utils.validate.Validation import Validation
24
+
25
+ _: TypeGetText # Handle gettext
26
+
27
+
28
+ @dataclass(frozen=True)
29
+ class ImageValidationParameters:
30
+ checkMinExternalResourceSize: bool
31
+ consolidated: bool
32
+ contentOtherThanXHTMLGuidance: str
33
+ missingMimeTypeIsIncorrect: bool
34
+ recommendBase64EncodingEmbeddedImages: bool
35
+ supportedImgTypes: dict[bool, tuple[str, ...]]
36
+
37
+ @classmethod
38
+ def from_non_esef(
39
+ cls,
40
+ checkMinExternalResourceSize: bool,
41
+ missingMimeTypeIsIncorrect: bool,
42
+ recommendBase64EncodingEmbeddedImages: bool,
43
+ supportedImgTypes: dict[bool, tuple[str, ...]],
44
+ ) -> ImageValidationParameters:
45
+ return cls(
46
+ checkMinExternalResourceSize=checkMinExternalResourceSize,
47
+ consolidated=True,
48
+ # This must be an ESEF code, even if it's later discarded.
49
+ contentOtherThanXHTMLGuidance="ESEF.2.5.1",
50
+ missingMimeTypeIsIncorrect=missingMimeTypeIsIncorrect,
51
+ recommendBase64EncodingEmbeddedImages=recommendBase64EncodingEmbeddedImages,
52
+ supportedImgTypes=supportedImgTypes,
53
+ )
54
+
55
+
56
+ def validateImageAndLog(
57
+ baseUrl: str | None,
58
+ image: str,
59
+ modelXbrl: ModelXbrl,
60
+ val: ValidateXbrl,
61
+ elts: _Element | list[_Element],
62
+ evaluatedMsg: str,
63
+ params: ImageValidationParameters,
64
+ ) -> None:
65
+ for validation in validateImage(
66
+ baseUrl=baseUrl,
67
+ image=image,
68
+ modelXbrl=modelXbrl,
69
+ val=val,
70
+ elts=elts,
71
+ evaluatedMsg=evaluatedMsg,
72
+ params=params,
73
+ ):
74
+ modelXbrl.log(level=validation.level.name, codes=validation.codes, msg=validation.msg, **validation.args)
75
+
76
+ # check image contents against mime/file ext and for Steganography
77
+ def validateImage(
78
+ baseUrl: str | None,
79
+ image: str,
80
+ modelXbrl: ModelXbrl,
81
+ val: ValidateXbrl,
82
+ elts: _Element | list[_Element],
83
+ evaluatedMsg: str,
84
+ params: ImageValidationParameters,
85
+ ) -> Iterable[Validation]:
86
+ """
87
+ image: either an url or base64 in data:image style
88
+ """
89
+ contentOtherThanXHTMLGuidance = params.contentOtherThanXHTMLGuidance
90
+ # a list of img elements are maintained because an SVG can reference another SVG
91
+ # or other type of image and we need to log the entire reference chain.
92
+ if not isinstance(elts, list):
93
+ elts = [elts]
94
+ if params.checkMinExternalResourceSize:
95
+ minExternalRessourceSize = val.authParam["minExternalResourceSizekB"]
96
+ if minExternalRessourceSize != -1:
97
+ # transform kb to b
98
+ minExternalRessourceSize = minExternalRessourceSize * 1024
99
+ if scheme(image) in ("http", "https", "ftp"):
100
+ yield Validation.error(("ESEF.4.1.6.xHTMLDocumentContainsExternalReferences" if not params.consolidated
101
+ else "ESEF.3.5.1.inlineXbrlDocumentContainsExternalReferences",
102
+ "NL.NL-KVK.3.6.2.1.inlineXbrlDocumentContainsExternalReferences"),
103
+ _("Inline XBRL instance documents MUST NOT contain any reference pointing to resources outside the reporting package: %(element)s"),
104
+ modelObject=elts, element=elts[0].tag, evaluatedMsg=evaluatedMsg,
105
+ messageCodes=("ESEF.3.5.1.inlineXbrlDocumentContainsExternalReferences",
106
+ "ESEF.4.1.6.xHTMLDocumentContainsExternalReferences",
107
+ "NL.NL-KVK.3.6.2.1.inlineXbrlDocumentContainsExternalReferences"))
108
+ elif image.startswith("data:image"):
109
+ dataURLParts = parseImageDataURL(image)
110
+ if not dataURLParts or not dataURLParts.isBase64:
111
+ if params.recommendBase64EncodingEmbeddedImages:
112
+ yield Validation.warning(f"{contentOtherThanXHTMLGuidance}.embeddedImageNotUsingBase64Encoding",
113
+ _("Images included in the XHTML document SHOULD be base64 encoded: %(src)s."),
114
+ modelObject=elts, src=image[:128], evaluatedMsg=evaluatedMsg)
115
+ if dataURLParts and dataURLParts.mimeSubtype and dataURLParts.data:
116
+ yield from checkImageContents(None, modelXbrl, elts, dataURLParts.mimeSubtype, False, unquote(dataURLParts.data), params, True, val)
117
+ else:
118
+ hasMimeType = bool(dataURLParts.mimeSubtype)
119
+ if not hasMimeType:
120
+ yield Validation.error((f"{contentOtherThanXHTMLGuidance}.MIMETypeNotSpecified", "NL.NL-KVK.3.5.1.2.MIMETypeNotSpecified"),
121
+ _("Images included in the XHTML document MUST be saved with MIME type specifying PNG, GIF, SVG or JPG/JPEG formats: %(src)s."),
122
+ modelObject=elts, src=image[:128], evaluatedMsg=evaluatedMsg)
123
+ elif dataURLParts.mimeSubtype not in ("gif", "jpeg", "png", "svg+xml"):
124
+ yield Validation.error((f"{contentOtherThanXHTMLGuidance}.imageFormatNotSupported", "NL.NL-KVK.3.5.1.5.imageFormatNotSupported"),
125
+ _("Images included in the XHTML document MUST be saved in PNG, GIF, SVG or JPG/JPEG formats: %(src)s."),
126
+ modelObject=elts, src=image[:128], evaluatedMsg=evaluatedMsg)
127
+ # check for malicious image contents
128
+ try: # allow embedded newlines
129
+ imgContents = decodeBase64DataImage(dataURLParts.data)
130
+ yield from checkImageContents(None, modelXbrl, elts, str(dataURLParts.mimeSubtype), False, imgContents, params, hasMimeType, val)
131
+ imgContents = b"" # deref, may be very large
132
+
133
+ except binascii.Error as err:
134
+ if params.recommendBase64EncodingEmbeddedImages:
135
+ yield Validation.error(f"{contentOtherThanXHTMLGuidance}.embeddedImageNotUsingBase64Encoding",
136
+ _("Base64 encoding error %(err)s in image source: %(src)s."),
137
+ modelObject=elts, err=str(err), src=image[:128], evaluatedMsg=evaluatedMsg)
138
+ else:
139
+ # presume it to be an image file, check image contents
140
+ try:
141
+ base = baseUrl
142
+ normalizedUri = modelXbrl.modelManager.cntlr.webCache.normalizeUrl(image, base)
143
+ if not modelXbrl.fileSource.isInArchive(normalizedUri):
144
+ normalizedUri = modelXbrl.modelManager.cntlr.webCache.getfilename(normalizedUri)
145
+ imglen = 0
146
+ with modelXbrl.fileSource.file(normalizedUri, binary=True)[0] as fh:
147
+ imgContents = cast(bytes, fh.read())
148
+ imglen += len(imgContents or '')
149
+ yield from checkImageContents(normalizedUri, modelXbrl, elts, os.path.splitext(image)[1], True, imgContents, params, False, val)
150
+ imgContents = b"" # deref, may be very large
151
+ if params.checkMinExternalResourceSize and imglen < minExternalRessourceSize:
152
+ yield Validation.warning(
153
+ ("%s.imageIncludedAndNotEmbeddedAsBase64EncodedString" % contentOtherThanXHTMLGuidance, "NL.NL-KVK.3.5.1.imageIncludedAndNotEmbeddedAsBase64EncodedString"),
154
+ _("Images SHOULD be included in the XHTML document as a base64 encoded string unless their size exceeds the minimum size for the authority (%(maxImageSize)s): %(file)s."),
155
+ modelObject=elts, maxImageSize=minExternalRessourceSize, file=os.path.basename(normalizedUri), evaluatedMsg=evaluatedMsg)
156
+ except IOError as err:
157
+ fileReferencingImage = os.path.basename(baseUrl) if baseUrl else ''
158
+ yield Validation.error((f"{contentOtherThanXHTMLGuidance}.imageFileCannotBeLoaded", "NL.NL-KVK.3.5.1.imageFileCannotBeLoaded"),
159
+ _("Error opening the file '%(src)s' referenced by '%(fileReferencingImage)s': %(error)s"),
160
+ modelObject=elts, src=image, fileReferencingImage=fileReferencingImage, error=err, evaluatedMsg=evaluatedMsg)
161
+
162
+
163
+ def checkImageContents(
164
+ baseURI: str | None,
165
+ modelXbrl: ModelXbrl,
166
+ imgElts: list[_Element],
167
+ imgType: str,
168
+ isFile: bool,
169
+ data: bytes | str,
170
+ params: ImageValidationParameters,
171
+ hasMimeType: bool,
172
+ val: ValidateXbrl,
173
+ ) -> Iterable[Validation]:
174
+ guidance = params.contentOtherThanXHTMLGuidance
175
+ if "svg" in imgType:
176
+ try:
177
+ yield from checkSVGContent(baseURI, modelXbrl, imgElts, data, params, val)
178
+ except XMLSyntaxError as err:
179
+ try:
180
+ yield from checkSVGContent(baseURI, modelXbrl, imgElts, unquote(data), params, val) # Try with utf-8 decoded data as in conformance suite G4-1-3_2/TC2
181
+ except XMLSyntaxError:
182
+ yield Validation.error((f"{guidance}.imageFileCannotBeLoaded", "NL.NL-KVK.3.5.1.imageFileCannotBeLoaded"),
183
+ _("Image SVG has XML error %(error)s"),
184
+ modelObject=imgElts, error=err)
185
+ except UnicodeDecodeError as err:
186
+ yield Validation.error((f"{guidance}.imageFileCannotBeLoaded", "NL.NL-KVK.3.5.1.imageFileCannotBeLoaded"),
187
+ _("Image SVG has XML error %(error)s"),
188
+ modelObject=imgElts, error=err)
189
+ else:
190
+ headerType = validateGraphicHeaderType(data) # type: ignore[arg-type]
191
+ if (("gif" not in imgType and headerType == "gif") or
192
+ ("jpeg" not in imgType and "jpg" not in imgType and headerType == "jpg") or
193
+ ("png" not in imgType and headerType == "png")):
194
+ imageDoesNotMatchItsFileExtension = (f"{guidance}.imageDoesNotMatchItsFileExtension", "NL.NL-KVK.3.5.1.4.imageDoesNotMatchItsFileExtension")
195
+ incorrectMIMETypeSpecified = (f"{guidance}.incorrectMIMETypeSpecified", "NL.NL-KVK.3.5.1.3.incorrectMIMETypeSpecified")
196
+ if isFile:
197
+ codes = imageDoesNotMatchItsFileExtension
198
+ message = _("File type %(headerType)s inferred from file signature does not match the file extension %(imgType)s")
199
+ else:
200
+ codes = incorrectMIMETypeSpecified
201
+ message = _("File type %(headerType)s inferred from file signature does not match the data URL media subtype (MIME subtype) %(imgType)s")
202
+ if isFile or params.missingMimeTypeIsIncorrect or hasMimeType:
203
+ yield Validation.error(codes, message,
204
+ modelObject=imgElts, imgType=imgType, headerType=headerType,
205
+ messageCodes=(
206
+ imageDoesNotMatchItsFileExtension, incorrectMIMETypeSpecified,
207
+ "NL.NL-KVK.3.5.1.3.incorrectMIMETypeSpecified", "NL.NL-KVK.3.5.1.4.imageDoesNotMatchItsFileExtension",
208
+ ))
209
+ elif not any(it in imgType for it in params.supportedImgTypes[isFile]):
210
+ yield Validation.error((f"{guidance}.imageFormatNotSupported", "NL.NL-KVK.3.5.1.5.imageFormatNotSupported"),
211
+ _("Images included in the XHTML document MUST be saved in PNG, GIF, SVG or JPEG formats: %(imgType)s is not supported"),
212
+ modelObject=imgElts, imgType=imgType)
213
+
214
+
215
+ def checkSVGContent(
216
+ baseURI: str | None,
217
+ modelXbrl: ModelXbrl,
218
+ imgElts: list[_Element],
219
+ data: bytes | str,
220
+ params: ImageValidationParameters,
221
+ val: ValidateXbrl,
222
+ ) -> Iterable[Validation]:
223
+ if baseURI:
224
+ svgDoc = cast(ModelDocument.ModelDocument, ModelDocument.load(modelXbrl, baseURI, referringElement=imgElts[0]))
225
+ elt = svgDoc.xmlRootElement
226
+ else:
227
+ _parser, _, _ = parser(modelXbrl, baseURI)
228
+ elt = XML(data, parser=_parser)
229
+ yield from checkSVGContentElt(elt, baseURI, modelXbrl, imgElts, params, val)
230
+
231
+
232
+ def getHref(elt:_Element) -> str:
233
+ simple_href = elt.get("href", "").strip()
234
+ if len(simple_href) > 0:
235
+ return simple_href
236
+ else:
237
+ # 'xlink:href' is deprecated but still used by some SVG generators
238
+ return elt.get("{http://www.w3.org/1999/xlink}href", "").strip()
239
+
240
+
241
+ def checkSVGContentElt(
242
+ elt: _Element,
243
+ baseUrl: str | None,
244
+ modelXbrl: ModelXbrl,
245
+ imgElts: list[_Element],
246
+ params: ImageValidationParameters,
247
+ val: ValidateXbrl,
248
+ ) -> Iterable[Validation]:
249
+ guidance = params.contentOtherThanXHTMLGuidance
250
+ rootElement = True
251
+ for elt in elt.iter():
252
+ if rootElement:
253
+ if elt.tag != "{http://www.w3.org/2000/svg}svg":
254
+ yield Validation.error((f"{guidance}.imageFileCannotBeLoaded", "NL.NL-KVK.3.5.1.imageFileCannotBeLoaded"),
255
+ _("Image SVG has root element which is not svg"),
256
+ modelObject=imgElts)
257
+ rootElement = False
258
+ # Comments, processing instructions, and maybe other special constructs don't have string tags.
259
+ if not isinstance(elt.tag, str):
260
+ continue
261
+ eltTag = elt.tag.rpartition("}")[2] # strip namespace
262
+ if eltTag == "image":
263
+ imgElts = [*imgElts, elt]
264
+ yield from validateImage(baseUrl, getHref(elt), modelXbrl, val, imgElts, "", params)
265
+ if eltTag in ("object", "script", "audio", "foreignObject", "iframe", "image", "use", "video"):
266
+ href = elt.get("href","")
267
+ if eltTag in ("object", "script") or "javascript:" in href:
268
+ yield Validation.error((f"{guidance}.executableCodePresent", "NL.NL-KVK.3.5.1.1.executableCodePresent"),
269
+ _("Inline XBRL images MUST NOT contain executable code: %(element)s"),
270
+ modelObject=imgElts, element=eltTag)
271
+ elif scheme(href) in ("http", "https", "ftp"):
272
+ yield Validation.error((f"{guidance}.referencesPointingOutsideOfTheReportingPackagePresent", "NL.NL-KVK.3.6.2.1.inlineXbrlDocumentContainsExternalReferences"),
273
+ _("Inline XBRL instance document [image] MUST NOT contain any reference pointing to resources outside the reporting package: %(element)s"),
274
+ modelObject=imgElts, element=eltTag)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.22
3
+ Version: 2.37.23
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License: Apache-2.0
@@ -41,7 +41,7 @@ arelle/ModelInstanceObject.py,sha256=gRRPEZR-x6IL-0z0-asKd2nbgReZFKHKmk7QTxKXI64
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
44
- arelle/ModelRelationshipSet.py,sha256=_1T3NAS0IRgK8IWFe7nh-qxXZ7htA80i_dueyU8JYaU,24654
44
+ arelle/ModelRelationshipSet.py,sha256=jlLqEnd0KrLjpRUhDzFLgMPsRmyOwfgl1w13yW3flLo,24803
45
45
  arelle/ModelRenderingObject.py,sha256=iPhSUlSBG-FLzAfIdUW06UZDgTCaZJ4K2mxvAtSe2BU,76021
46
46
  arelle/ModelRssItem.py,sha256=GzFkmluOlFsVcrxn9HAyOAcuE7rcHUOGkp4Q6F2IlT8,7713
47
47
  arelle/ModelRssObject.py,sha256=xjuwyJ8pU5sQmNPJFQakDEEnujZg2bMCTaj3zVezHL8,992
@@ -66,7 +66,7 @@ arelle/UiUtil.py,sha256=3G0xPclZI8xW_XQDbiFrmylB7Nd5muqi5n2x2oMkMZU,34218
66
66
  arelle/Updater.py,sha256=ho8Z_9GOL39H1jHL3Gaw5uc6av7J8ZBB6dR_X-nF_e0,7124
67
67
  arelle/UrlUtil.py,sha256=HrxZSG59EUMGMMGmWPuZkPi5-0BGqY3jAMkp7V4IdZo,32400
68
68
  arelle/Validate.py,sha256=XBrKQHsSC7Qz5Fp-M3gODfxwW8a-PWyBzZkCekYrMZM,56920
69
- arelle/ValidateDuplicateFacts.py,sha256=iF8BpBRBqPxlnXUa11cQJ3LEAstysl3r_J4280OQGJo,21705
69
+ arelle/ValidateDuplicateFacts.py,sha256=L556J1Dhz4ZmsMlRNoDCMpFgDQYiryd9vuBYDvE0Aq8,21769
70
70
  arelle/ValidateFilingText.py,sha256=xnXc0xgdNiHQk0eyP7VSSpvw7qr-pRFRwqqoUb569is,54051
71
71
  arelle/ValidateInfoset.py,sha256=Rz_XBi5Ha43KpxXYhjLolURcWVx5qmqyjLxw48Yt9Dg,20396
72
72
  arelle/ValidateUtr.py,sha256=oxOPrOa1XEzBay4miXvx6eRLTnVFYUIJC9ueWUk4EkI,13633
@@ -114,7 +114,7 @@ arelle/ViewWinVersReport.py,sha256=aYfsOgynVZpMzl6f2EzQCBLzdihYGycwb5SiTghkgMQ,9
114
114
  arelle/ViewWinXml.py,sha256=4ZGKtjaoCwU9etKYm9ZAS7jSmUxba1rqNEdv0OIyjTY,1250
115
115
  arelle/WatchRss.py,sha256=5Ih4igH2MM4hpOuAXy9eO0QAyZ7jZR3S5bPzo2sdFpw,14097
116
116
  arelle/WebCache.py,sha256=B62IxIHLX4hcDr_0MJGfmzUXau2ONqiMk6vLVLxAIhA,45057
117
- arelle/XbrlConst.py,sha256=OLJX1pc6ubTmNtKp9dW5fReetnka6X6JygWDN5HATPo,57086
117
+ arelle/XbrlConst.py,sha256=qkujDn50-bDz_z6Uj-z53pFMQimdsiBCMARyY2NiB44,57164
118
118
  arelle/XbrlUtil.py,sha256=s2Vmrh-sZI5TeuqsziKignOc3ao-uUgnCNoelP4dDj0,9212
119
119
  arelle/XhtmlValidate.py,sha256=0gtm7N-kXK0RB5o3c1AQXjfFuRp1w2fKZZAeyruNANw,5727
120
120
  arelle/XmlUtil.py,sha256=1VToOOylF8kbEorEdZLThmq35j9bmuF_DS2q9NthnHU,58774
@@ -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=EGVrj3aztU3PoL69Sq00GKr0PL8mTt6rFnPMOOY4jkA,515
126
+ arelle/_version.py,sha256=m8X4i_J2wh9B847cmv_5hSkps2GlxoxEqwoZitrqqxk,515
127
127
  arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
128
128
  arelle/api/Session.py,sha256=5KPjCIPiNuanKrz1MdFdKIx8Bg40Pk9sf2cL9OU4x-E,7770
129
129
  arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
@@ -385,9 +385,9 @@ arelle/plugin/validate/DBA/ValidationPluginExtension.py,sha256=JozGD4LqGn8zbc_-B
385
385
  arelle/plugin/validate/DBA/__init__.py,sha256=KhmlUkqgsRtEXpu5DZBXFzv43nUTvi-0sdDNRfw5Up4,1564
386
386
  arelle/plugin/validate/DBA/resources/config.xml,sha256=KHfo7SrjzmjHbfwIJBmESvOOjdIv4Av26BCcZxfn3Pg,875
387
387
  arelle/plugin/validate/DBA/rules/__init__.py,sha256=t6xULMkNT7naI-sKmiD3ohX2Q41TTKqFPtKI01BKiyA,10349
388
- arelle/plugin/validate/DBA/rules/fr.py,sha256=ITYpWGiIJ9q0vIagoFfOa30vKDlcEbFUx-pVO2_Kkbw,71314
388
+ arelle/plugin/validate/DBA/rules/fr.py,sha256=lWsJ3J68ecrzwaE5uh_9ymFispXiuK_GmGZbFoODLgo,71324
389
389
  arelle/plugin/validate/DBA/rules/tc.py,sha256=CXPOGHpab9Y-iV84wDXrsE-rPe_d6Uhw4HjEyTBEzq4,1572
390
- arelle/plugin/validate/DBA/rules/th.py,sha256=Azrlq572exd0WmX0XLOkr29mn9BsDtQDx0kkrFGt-2o,6226
390
+ arelle/plugin/validate/DBA/rules/th.py,sha256=mDrjescz6106jBGjdH6bipqx48BnxcjHSkNL1qQf0QE,6227
391
391
  arelle/plugin/validate/DBA/rules/tm.py,sha256=ui9oKBqlAForwkQ9kk9KBiUogTJE5pv1RbIejKASprY,11797
392
392
  arelle/plugin/validate/DBA/rules/tr.py,sha256=zdi3kQ82whmweVWRLbMvcNpM8sqtUliPsGfd81rgZws,14671
393
393
  arelle/plugin/validate/EBA/__init__.py,sha256=1kW-04W32sStSAL8wvW1ZpXnjlFv6KLbfE4aifYUB2A,46000
@@ -401,8 +401,7 @@ arelle/plugin/validate/ESEF/ESEF_2021/Image.py,sha256=4bnhuy5viBU0viPjb4FhcRRjVV
401
401
  arelle/plugin/validate/ESEF/ESEF_2021/ValidateXbrlFinally.py,sha256=l4Nl-QuYJlM4WDpg87YjTwMUh05VP7tNq86gLFhWHyE,63380
402
402
  arelle/plugin/validate/ESEF/ESEF_2021/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
403
403
  arelle/plugin/validate/ESEF/ESEF_Current/DTS.py,sha256=epp-PBh1NJzQqgxUE6C468HmoDc2w3j54rMwfiOAry4,29334
404
- arelle/plugin/validate/ESEF/ESEF_Current/Image.py,sha256=w36sCTy8QbsuKABjkK6PTWce2A4zFN_rMnEM2wi5WEc,11364
405
- arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=RDWfo8a36v2Hw6bYij1ZIh0HXuw_rNKa6WwDnkLDPZ8,73642
404
+ arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=tWgBYHtnEosZTOBN3p-DguhYwCCNhf8xvk5K5qcZK_I,73637
406
405
  arelle/plugin/validate/ESEF/ESEF_Current/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
407
406
  arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=JriLZ45KmUYlQiPbXJCAahobqdrst64Ay77bofZhB5Q,14940
408
407
  arelle/plugin/validate/ESEF/resources/config.xml,sha256=t3STU_-QYM7Ay8YwZRPapnohiWVWhjfr4L2Rjx9xN9U,3902
@@ -411,16 +410,16 @@ arelle/plugin/validate/FERC/config.xml,sha256=bn9b8eCqJA1J62rYq1Nz85wJrMGAahVmmn
411
410
  arelle/plugin/validate/FERC/resources/ferc-utr.xml,sha256=OCRj9IUpdXATCBXKbB71apYx9kxcNtZW-Hq4s-avsRY,2663
412
411
  arelle/plugin/validate/NL/DisclosureSystems.py,sha256=urRmYJ8RnGPlTgSVKW7zGN4_4CtL3OVKlcI3LwTpBz4,561
413
412
  arelle/plugin/validate/NL/LinkbaseType.py,sha256=csXEqLaU43tN58RUG3oeD3nUYcdHl1OWSKaxpOhbTXk,2515
414
- arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=gGA2r9WdImWNwMZNKO8dvGSF3NtYLOhvNuyhzR3g9jY,26737
413
+ arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=trpeAekXGWourOMI-tFfzQIFJjTRrdIjNGKpxRKWCjs,32840
415
414
  arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=suCNqrtC_IMndyS_mXaeujDvjgSduTQ9KPNRc9B0F6I,16098
416
415
  arelle/plugin/validate/NL/__init__.py,sha256=23cF5ih2wu0RO_S0B52nVB7LrdlmnYcctOUezF0kKQ8,2874
417
- arelle/plugin/validate/NL/resources/config.xml,sha256=kKHZQxjl2MxKce93DXkHgd3uQhO6jHbVpUR-Jp_fXms,1397
416
+ arelle/plugin/validate/NL/resources/config.xml,sha256=qBE6zywFSmemBSWonuTII5iuOCUlNb1nvkpMbsZb5PM,1853
418
417
  arelle/plugin/validate/NL/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
419
418
  arelle/plugin/validate/NL/rules/br_kvk.py,sha256=0SwKieWzTDm3YMsXPS6zTdgbk7_Z9CzqRkRmCRz1OiQ,15789
420
419
  arelle/plugin/validate/NL/rules/fg_nl.py,sha256=4Puq5wAjtK_iNd4wisH_R0Z_EKJ7MT2OCai5g4t1MPE,10714
421
- arelle/plugin/validate/NL/rules/fr_kvk.py,sha256=-_BLeWGoZ_f56p5VO4X40S45Ny3Ej-WK6Srei1KVSxU,8170
420
+ arelle/plugin/validate/NL/rules/fr_kvk.py,sha256=kYqXt45S6eM32Yg9ii7pUhOMfJaHurgYqQ73FyQALs8,8171
422
421
  arelle/plugin/validate/NL/rules/fr_nl.py,sha256=-M1WtXp06khhtkfOVPCa-b8UbC281gk4YfDhvtAVlnI,31424
423
- arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=BRu-h8CBkc1h59uO4aMoZlOMe6jhesvnbqBk2hlCeTY,58168
422
+ arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=xT3Hc-s3089HSkZC7_VpX-eGDU4vDNgdOXUXy-WSIA8,76762
424
423
  arelle/plugin/validate/ROS/DisclosureSystems.py,sha256=rJ81mwQDYTi6JecFZ_zhqjjz3VNQRgjHNSh0wcQWAQE,18
425
424
  arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=IV7ILhNvgKwQXqbpSA6HRNt9kEnejCyMADI3wyyIgk0,4036
426
425
  arelle/plugin/validate/ROS/ValidationPluginExtension.py,sha256=FBhEp8t396vGdvCbMEimfcxmGiGnhXMen-yVLWnkFaI,758
@@ -735,14 +734,15 @@ arelle/utils/PluginData.py,sha256=GUnuZaApm1J4Xm9ZA1U2M1aask-AaNGviLtc0fgXbFg,26
735
734
  arelle/utils/PluginHooks.py,sha256=CeVxti23VjERQl4xWFucDVTW63TCG2PUdnxpjd3x_Ms,31170
736
735
  arelle/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
737
736
  arelle/utils/validate/Decorator.py,sha256=8LGmA171HZgKrALtsMKyHqMNM-XCdwJOv6KpZz4pC2c,3161
738
- arelle/utils/validate/DetectScriptsInXhtml.py,sha256=JOgsUP0_kvE6O3TuhzKxqKG1ZFP9LrUYZBgrar6JEm0,2178
737
+ arelle/utils/validate/DetectScriptsInXhtml.py,sha256=RFBh_Z24OjR69s71qQzSzbxdU-WCTWuvYlONN-BgpZ0,2098
738
+ arelle/utils/validate/ESEFImage.py,sha256=qel9_DgZGAQnCM45YQ93HLspuIK0JEUg4uotj82UarI,14907
739
739
  arelle/utils/validate/Validation.py,sha256=n6Ag7VeCj_VO5nqzw_P53hOfXXeT2APK0Enb3UQqBns,832
740
740
  arelle/utils/validate/ValidationPlugin.py,sha256=_WeRPXZUTCcSN3FLbFwiAe_2pAUTxZZk1061qMoDW8w,11527
741
741
  arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txrxRFgh8FxIs,548
742
742
  arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
743
743
  arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
744
744
  arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
745
- arelle_release-2.37.22.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
745
+ arelle_release-2.37.23.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
746
746
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
747
747
  tests/integration_tests/download_cache.py,sha256=jVMIVICsZjcVc9DCPPu3fCjF9_cWSS3tqSynhFs3oAM,4097
748
748
  tests/integration_tests/integration_test_util.py,sha256=H7mncbv0T9ZeVyrtk9Hohe3k6jgcYykHkt-LGE-Q9aQ,10270
@@ -797,7 +797,7 @@ tests/integration_tests/validation/conformance_suite_configurations/kvk_nt16.py,
797
797
  tests/integration_tests/validation/conformance_suite_configurations/kvk_nt17.py,sha256=lmEZonthFm0YKFmp1dwXtdJ2T7txUeSpL4mbAo8fl4Y,1292
798
798
  tests/integration_tests/validation/conformance_suite_configurations/kvk_nt18.py,sha256=EG2RQVkvFENhzUF3fl3QvDnH7ZPYS1n1Fo8bhfmSczM,1205
799
799
  tests/integration_tests/validation/conformance_suite_configurations/kvk_nt19.py,sha256=FAzf9RhRmn_8yowpplJho2zEspX9FxJiVq8SjZT3Dsc,1199
800
- tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py,sha256=Hqp_IntB1pz47dkcVaVjKpYtj22f3HLJSaxhyr4yLck,9626
800
+ tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py,sha256=cv_SuMgcc_bMDW5adagOKPChkhSp4x1rJWbV_CyV_pM,8884
801
801
  tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024_gaap_other.py,sha256=i-W3lMMI37i4RTQyo717khlnqL4Bc7EkDtbhCtqTu3U,31366
802
802
  tests/integration_tests/validation/conformance_suite_configurations/nl_nt16.py,sha256=O_LFVBZPkjxmbrU7_C7VTLtrdoCUx2bYXOXw6_MlRtQ,846
803
803
  tests/integration_tests/validation/conformance_suite_configurations/nl_nt17.py,sha256=aTN3Ez6lPsZsuypHZP84DneOtYxUZSjUiGypHy6ofHQ,846
@@ -1594,10 +1594,10 @@ tests/unit_tests/arelle/conformance/test_csv_testcase_loader.py,sha256=u8AvJ-wUI
1594
1594
  tests/unit_tests/arelle/formula/test_fact_aspects_cache.py,sha256=4qtYSqSHYprihquj9orxcjHHaTE2jKDPQvm4QUhtUWk,6076
1595
1595
  tests/unit_tests/arelle/oim/test_load.py,sha256=NxiUauQwJVfWAHbbpsMHGSU2d3Br8Pki47JOxKmG83M,1216
1596
1596
  tests/unit_tests/arelle/plugin/test_plugin_imports.py,sha256=bdhIs9frAnFsdGU113yBk09_jis-z43dwUItMFYuSYM,1064
1597
- tests/unit_tests/arelle/plugin/validate/ESEF/ESEF_Current/test_validate_css_url.py,sha256=XHABmejQt7RlZ0udh7v42f2Xb2STGk_fSaIaJ9i2xo0,878
1597
+ tests/unit_tests/arelle/plugin/validate/ESEF/ESEF_Current/test_validate_css_url.py,sha256=H0ndmQ0sFO5WVMzAxPCH1WciRhCg_HgKUtQCg0xlmtg,1238
1598
1598
  tests/unit_tests/arelle/utils/validate/test_decorator.py,sha256=ZS8FqIY1g-2FCbjF4UYm609dwViax6qBMRJSi0vfuhY,2482
1599
- arelle_release-2.37.22.dist-info/METADATA,sha256=RTAZoQZJzP3GXYEe6AmFVBSzpgLa833Xk8hY6qSVf2U,9134
1600
- arelle_release-2.37.22.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1601
- arelle_release-2.37.22.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1602
- arelle_release-2.37.22.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1603
- arelle_release-2.37.22.dist-info/RECORD,,
1599
+ arelle_release-2.37.23.dist-info/METADATA,sha256=xL-89sGS9HVrVvGtcDhtbYumAyJQIGQBoC7t3sNt9JI,9134
1600
+ arelle_release-2.37.23.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1601
+ arelle_release-2.37.23.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1602
+ arelle_release-2.37.23.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1603
+ arelle_release-2.37.23.dist-info/RECORD,,
@@ -22,9 +22,16 @@ config = ConformanceSuiteConfig(
22
22
  'G3-1-3_1/index.xml:TC2_invalid': {
23
23
  'scenarioNotUsedInExtensionTaxonomy': 1, # Also fails 4.2.1.1
24
24
  },
25
+ 'G3-1-3_2/index.xml:TC2_invalid': {
26
+ 'extensionTaxonomyLineItemNotLinkedToAnyHypercube': 1,
27
+ },
28
+ 'G3-5-1_5/index.xml:TC2_invalid': {
29
+ # This is the expected error, but we return two of them, slightly different.
30
+ 'imageFormatNotSupported': 1,
31
+ },
25
32
  'G3-5-3_1/index.xml:TC2_invalid': {
26
33
  'arelle:ixdsTargetNotDefined': 1,
27
- 'extensionTaxonomyWrongFilesStructure': 1,
34
+ 'extensionTaxonomyWrongFilesStructure': 2,
28
35
  # This test is looking at the usage of the target attribute and does not import the correct taxonomy urls
29
36
  'requiredEntryPointNotImported': 1,
30
37
  'incorrectKvkTaxonomyVersionUsed': 1,
@@ -38,14 +45,23 @@ config = ConformanceSuiteConfig(
38
45
  'message:valueKvKIdentifier': 13,
39
46
  'nonIdenticalIdentifier': 1,
40
47
  },
48
+ 'G4-1-1_1/index.xml:TC4_invalid': {
49
+ 'extensionTaxonomyWrongFilesStructure': 1,
50
+ },
41
51
  'G4-1-2_1/index.xml:TC2_valid': {
42
52
  'undefinedLanguageForTextFact': 1,
43
53
  'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 5,
44
54
  },
55
+ 'G4-1-2_1/index.xml:TC3_invalid': {
56
+ 'extensionTaxonomyLineItemNotLinkedToAnyHypercube': 11,
57
+ },
45
58
  'G4-1-2_2/index.xml:TC2_invalid': {
59
+ 'anchoringRelationshipsForConceptsDefinedInElrContainingDimensionalRelationships': 1, # Also fails 4.3.2.1
46
60
  'incorrectSummationItemArcroleUsed': 1, # Also fails 4.4.1.1
47
61
  # Test imports https://www.nltaxonomie.nl/kvk/2024-03-31/kvk-annual-report-nlgaap-ext.xsd which is the draft taxonomy and not the final
48
62
  'requiredEntryPointNotImported': 1,
63
+ 'UsableConceptsNotAppliedByTaggedFacts': 1, # Also fails 4.4.6.1
64
+ 'extensionTaxonomyLineItemNotLinkedToAnyHypercube': 10,
49
65
  },
50
66
  'G4-4-2_1/index.xml:TC2_invalid': {
51
67
  'closedNegativeHypercubeInDefinitionLinkbase': 1, # Also fails 4.4.2.3
@@ -69,34 +85,27 @@ config = ConformanceSuiteConfig(
69
85
  'undefinedLanguageForTextFact': 1,
70
86
  'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 5,
71
87
  },
88
+ 'RTS_Annex_IV_Par_6/index.xml:TC3_invalid': {
89
+ 'extensionTaxonomyWrongFilesStructure': 1,
90
+ },
91
+ 'RTS_Annex_IV_Par_6/index.xml:TC4_invalid': {
92
+ 'undefinedLanguageForTextFact': 1,
93
+ 'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 5,
94
+ 'extensionTaxonomyWrongFilesStructure': 1,
95
+ }
72
96
  }.items()},
73
97
  expected_failure_ids=frozenset([
74
98
  # Conformance Suite Errors
75
99
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-3-1_2/index.xml:TC3_invalid', # Expects an error code with a preceding double quote. G3-3-1_3 expects the same code without the typo.
76
100
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-4-1_1/index.xml:TC2_invalid', # Produces: [err:XPTY0004] Variable set Het entity identifier scheme dat bij dit feit hoort MOET het standaard KVK identifier scheme zijn
77
101
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-4-1_2/index.xml:TC2_invalid', # Expects fractionElementUsed”. Note the double quote at the end.
78
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-4-2_1/index.xml:TC2_invalid', # Produces 'EFM.6.03.11' and 'NL.NL-KVK.3.4.2.1.htmlOrXmlBaseUsed'
102
+ 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-6-2_1/index.xml:TC2_invalid', # Expects inlineXbrlDocumentSetContainsExternalReferences. Note incorrect "Set".
79
103
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-2-0_2/index.xml:TC2_invalid', # Expects fractionElementUsed”. Note the double quote at the end.
80
104
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-4-1_1/index.xml:TC2_invalid', # Expects IncorrectSummationItemArcroleUsed. Note the capital first character.
81
105
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_2_G3-1-1_1/index.xml:TC2_invalid', # Expects NonIdenticalIdentifier instead of nonIdenticalIdentifier (note the cap N)
82
106
 
83
107
 
84
108
  # Not Implemented
85
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_1/index.xml:TC3_invalid',
86
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_1/index.xml:TC4_invalid',
87
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_2/index.xml:TC2_invalid',
88
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_3/index.xml:TC2_invalid',
89
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_4/index.xml:TC2_invalid',
90
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_5/index.xml:TC2_invalid',
91
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_5/index.xml:TC3_invalid',
92
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-6-2_1/index.xml:TC2_invalid',
93
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-3-1_1/index.xml:TC2_invalid',
94
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-3-1_1/index.xml:TC3_invalid',
95
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-3-1_1/index.xml:TC4_invalid',
96
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-3-2_1/index.xml:TC2_invalid',
97
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-4-2_4/index.xml:TC2_invalid',
98
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-4-5_2/index.xml:TC2_invalid',
99
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-4-5_2/index.xml:TC3_invalid',
100
109
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G5-1-3_1/index.xml:TC1_valid', # Must be run with different disclosure system for GAAP Other
101
110
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G5-1-3_1/index.xml:TC2_invalid', # Must be run with different disclosure system for GAAP Other
102
111
  'conformance-suite-2024-sbr-domein-handelsregister/tests/G5-1-3_2/index.xml:TC1_valid', # Must be run with different disclosure system for GAAP Other
@@ -105,18 +114,14 @@ config = ConformanceSuiteConfig(
105
114
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_II_Par_1_RTS_Annex_IV_par_7/index.xml:TC4_invalid',
106
115
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_III_Par_1/index.xml:TC2_invalid',
107
116
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_III_Par_1/index.xml:TC3_invalid',
108
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_11_G4-2-2_1/index.xml:TC2_invalid',
109
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_11_G4-2-2_1/index.xml:TC3_invalid',
110
117
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_12_G3-2-4_1/index.xml:TC4_invalid',
111
118
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_14_G3-5-1_1/index.xml:TC2_invalid',
112
119
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_4_1/index.xml:TC2_invalid',
113
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_4_2/index.xml:TC2_invalid',
114
120
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_4_3/index.xml:TC3_invalid',
115
121
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_4_3/index.xml:TC4_invalid',
116
122
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_4_3/index.xml:TC5_invalid',
117
123
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_5/index.xml:TC2_invalid',
118
124
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_5/index.xml:TC3_invalid',
119
- 'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_6/index.xml:TC4_invalid',
120
125
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_8_G4-4-5/index.xml:TC2_invalid',
121
126
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_8_G4-4-5/index.xml:TC3_invalid',
122
127
  'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_IV_Par_9_Par_10/index.xml:TC3_invalid',
@@ -9,11 +9,19 @@ class TestValidateCssUrl(TestCase):
9
9
  validateCssUrl(
10
10
  '* { background: url("http://example.com") }',
11
11
  MagicMock(), modelXbrl, MagicMock(), MagicMock(), MagicMock())
12
- self.assertEqual(modelXbrl.error.call_args.args[0], 'ESEF.4.1.6.xHTMLDocumentContainsExternalReferences')
12
+ expected = dict(
13
+ level='ERROR',
14
+ codes=('ESEF.3.5.1.inlineXbrlDocumentContainsExternalReferences', 'NL.NL-KVK.3.6.2.1.inlineXbrlDocumentContainsExternalReferences'),
15
+ )
16
+ self.assertLessEqual(expected.items(), modelXbrl.log.call_args.kwargs.items())
13
17
 
14
18
  def test_url_token(self) -> None:
15
19
  modelXbrl = MagicMock()
16
20
  validateCssUrl(
17
21
  '* { background: url(http://example.com) }',
18
22
  MagicMock(), modelXbrl, MagicMock(), MagicMock(), MagicMock())
19
- self.assertEqual(modelXbrl.error.call_args.args[0], 'ESEF.4.1.6.xHTMLDocumentContainsExternalReferences')
23
+ expected = dict(
24
+ level='ERROR',
25
+ codes=('ESEF.3.5.1.inlineXbrlDocumentContainsExternalReferences', 'NL.NL-KVK.3.6.2.1.inlineXbrlDocumentContainsExternalReferences'),
26
+ )
27
+ self.assertLessEqual(expected.items(), modelXbrl.log.call_args.kwargs.items())