arelle-release 2.37.29__py3-none-any.whl → 2.37.30__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of arelle-release might be problematic. Click here for more details.

Files changed (49) hide show
  1. arelle/Locale.py +3 -1
  2. arelle/_version.py +2 -2
  3. arelle/plugin/validate/EDINET/FormType.py +105 -0
  4. arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +44 -0
  5. arelle/plugin/validate/EDINET/rules/upload.py +187 -19
  6. {arelle_release-2.37.29.dist-info → arelle_release-2.37.30.dist-info}/METADATA +1 -1
  7. {arelle_release-2.37.29.dist-info → arelle_release-2.37.30.dist-info}/RECORD +49 -23
  8. tests/integration_tests/validation/conformance_suite_configurations/edinet.py +13 -30
  9. tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_function_registry.py +4 -0
  10. tests/integration_tests/validation/discover_tests.py +3 -3
  11. tests/integration_tests/validation/validation_util.py +9 -1
  12. tests/resources/conformance_suites/edinet/EC0121E/index.xml +2 -1
  13. tests/resources/conformance_suites/edinet/EC0121E/invalid01.zip +0 -0
  14. tests/resources/conformance_suites/edinet/EC0124E/index.xml +2 -1
  15. tests/resources/conformance_suites/edinet/EC0124E/invalid01.zip +0 -0
  16. tests/resources/conformance_suites/edinet/EC0129E/index.xml +23 -0
  17. tests/resources/conformance_suites/edinet/EC0129E/invalid01.zip +0 -0
  18. tests/resources/conformance_suites/edinet/EC0130E/index.xml +23 -0
  19. tests/resources/conformance_suites/edinet/EC0130E/invalid01.zip +0 -0
  20. tests/resources/conformance_suites/edinet/EC0132E/index.xml +2 -1
  21. tests/resources/conformance_suites/edinet/EC0132E/invalid01.zip +0 -0
  22. tests/resources/conformance_suites/edinet/EC0188E/index.xml +23 -0
  23. tests/resources/conformance_suites/edinet/EC0188E/invalid01.zip +0 -0
  24. tests/resources/conformance_suites/edinet/EC0198E/index.xml +23 -0
  25. tests/resources/conformance_suites/edinet/EC0198E/invalid01.zip +0 -0
  26. tests/resources/conformance_suites/edinet/index.xml +4 -0
  27. tests/resources/conformance_suites/edinet/valid/index.xml +180 -1
  28. tests/resources/conformance_suites/edinet/valid/valid01.zip +0 -0
  29. tests/resources/conformance_suites/edinet/valid/valid02.zip +0 -0
  30. tests/resources/conformance_suites/edinet/valid/valid03.zip +0 -0
  31. tests/resources/conformance_suites/edinet/valid/valid04.zip +0 -0
  32. tests/resources/conformance_suites/edinet/valid/valid05.zip +0 -0
  33. tests/resources/conformance_suites/edinet/valid/valid06.zip +0 -0
  34. tests/resources/conformance_suites/edinet/valid/valid07.zip +0 -0
  35. tests/resources/conformance_suites/edinet/valid/valid08.zip +0 -0
  36. tests/resources/conformance_suites/edinet/valid/valid09.zip +0 -0
  37. tests/resources/conformance_suites/edinet/valid/valid10.zip +0 -0
  38. tests/resources/conformance_suites/edinet/valid/valid11.zip +0 -0
  39. tests/resources/conformance_suites/edinet/valid/valid12.zip +0 -0
  40. tests/resources/conformance_suites/edinet/valid/valid13.zip +0 -0
  41. tests/resources/conformance_suites/edinet/valid/valid14.zip +0 -0
  42. tests/resources/conformance_suites/edinet/valid/valid20.zip +0 -0
  43. tests/resources/conformance_suites/edinet/valid/valid21.zip +0 -0
  44. tests/resources/conformance_suites/edinet/valid/valid22.zip +0 -0
  45. tests/resources/conformance_suites_timing/edinet.json +27 -0
  46. {arelle_release-2.37.29.dist-info → arelle_release-2.37.30.dist-info}/WHEEL +0 -0
  47. {arelle_release-2.37.29.dist-info → arelle_release-2.37.30.dist-info}/entry_points.txt +0 -0
  48. {arelle_release-2.37.29.dist-info → arelle_release-2.37.30.dist-info}/licenses/LICENSE.md +0 -0
  49. {arelle_release-2.37.29.dist-info → arelle_release-2.37.30.dist-info}/top_level.txt +0 -0
arelle/Locale.py CHANGED
@@ -238,9 +238,11 @@ def getLocale() -> str | None:
238
238
  systemLocale = tryRunCommand("pwsh", "-Command", "Get-Culture | Select -ExpandProperty IetfLanguageTag")
239
239
  if pythonCompatibleLocale := findCompatibleLocale(systemLocale):
240
240
  _locale = pythonCompatibleLocale
241
- elif sys.version_info < (3, 12):
241
+ elif sys.version_info < (3, 12) or (3, 13, 3) <= sys.version_info[:3] <= (3, 13, 4):
242
242
  # Using locale.setlocale(...) because getlocale() in Python versions prior to 3.12 incorrectly aliased C.UTF-8 to en_US.UTF-8.
243
243
  # https://github.com/python/cpython/issues/74940
244
+ # Similar bug was reintroduced in Python 3.13.3 and fixed in 3.13.5.
245
+ # https://github.com/python/cpython/pull/135347
244
246
  _locale = locale.setlocale(locale.LC_CTYPE).partition(POSIX_LOCALE_ENCODING_SEPARATOR)[0]
245
247
  else:
246
248
  _locale = locale.getlocale()[0]
arelle/_version.py CHANGED
@@ -17,5 +17,5 @@ __version__: str
17
17
  __version_tuple__: VERSION_TUPLE
18
18
  version_tuple: VERSION_TUPLE
19
19
 
20
- __version__ = version = '2.37.29'
21
- __version_tuple__ = version_tuple = (2, 37, 29)
20
+ __version__ = version = '2.37.30'
21
+ __version_tuple__ = version_tuple = (2, 37, 30)
@@ -0,0 +1,105 @@
1
+ """
2
+ See COPYRIGHT.md for copyright information.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from enum import Enum
7
+ from functools import cached_property, lru_cache
8
+ from pathlib import Path
9
+
10
+
11
+ class FormType(Enum):
12
+ ATTACH_DOC = "AttachDoc"
13
+ AUDIT_DOC = "AuditDoc"
14
+ ENGLISH_DOC = "EnglishDoc"
15
+ PRIVATE_ATTACH = "PrivateAttach"
16
+ PRIVATE_DOC = "PrivateDoc"
17
+ PUBLIC_DOC = "PublicDoc"
18
+
19
+ @classmethod
20
+ def parse(cls, value: str) -> FormType | None:
21
+ try:
22
+ return cls(value)
23
+ except ValueError:
24
+ return None
25
+
26
+ @cached_property
27
+ def extensionCategory(self) -> ExtensionCategory | None:
28
+ return FORM_TYPE_EXTENSION_CATEGORIES.get(self, None)
29
+
30
+ @cached_property
31
+ def manifestName(self) -> str:
32
+ return f'manifest_{self.value}.xml'
33
+
34
+ @cached_property
35
+ def manifestPath(self) -> Path:
36
+ return self.xbrlDirectory / self.manifestName
37
+
38
+ @cached_property
39
+ def xbrlDirectory(self) -> Path:
40
+ return Path('XBRL') / str(self.value)
41
+
42
+ @lru_cache(1)
43
+ def getValidExtensions(self, isAmendment: bool, isSubdirectory: bool) -> frozenset[str] | None:
44
+ if self.extensionCategory is None:
45
+ return None
46
+ return self.extensionCategory.getValidExtensions(isAmendment, isSubdirectory)
47
+
48
+
49
+ class ExtensionCategory(Enum):
50
+ ATTACH = 'ATTACH'
51
+ DOC = 'DOC'
52
+ ENGLISH_DOC = 'ENGLISH_DOC'
53
+
54
+ def getValidExtensions(self, isAmendment: bool, isSubdirectory: bool) -> frozenset[str] | None:
55
+ amendmentMap = VALID_EXTENSIONS[isAmendment]
56
+ categoryMap = amendmentMap.get(self, None)
57
+ if categoryMap is None:
58
+ return None
59
+ return categoryMap.get(isSubdirectory, None)
60
+
61
+
62
+ FORM_TYPE_EXTENSION_CATEGORIES = {
63
+ FormType.ATTACH_DOC: ExtensionCategory.ATTACH,
64
+ FormType.AUDIT_DOC: ExtensionCategory.DOC,
65
+ FormType.ENGLISH_DOC: ExtensionCategory.ENGLISH_DOC,
66
+ FormType.PRIVATE_ATTACH: ExtensionCategory.ATTACH,
67
+ FormType.PRIVATE_DOC: ExtensionCategory.DOC,
68
+ FormType.PUBLIC_DOC: ExtensionCategory.DOC,
69
+ }
70
+
71
+
72
+ HTML_EXTENSIONS = frozenset({'.htm', '.html', '.xhtml'})
73
+ IMAGE_EXTENSIONS = frozenset({'.jpeg', '.jpg', '.gif', '.png'})
74
+ ASSET_EXTENSIONS = frozenset(HTML_EXTENSIONS | IMAGE_EXTENSIONS)
75
+ XBRL_EXTENSIONS = frozenset(HTML_EXTENSIONS | {'.xml', '.xsd'})
76
+ ATTACH_EXTENSIONS = frozenset(HTML_EXTENSIONS | {'.pdf', })
77
+ ENGLISH_DOC_EXTENSIONS = frozenset(ASSET_EXTENSIONS | frozenset({'.pdf', '.xml', '.txt'}))
78
+
79
+ # Is Amendment -> Category -> Is Subdirectory
80
+ VALID_EXTENSIONS = {
81
+ False: {
82
+ ExtensionCategory.ATTACH: {
83
+ False: ATTACH_EXTENSIONS,
84
+ True: ASSET_EXTENSIONS,
85
+ },
86
+ ExtensionCategory.DOC: {
87
+ False: XBRL_EXTENSIONS,
88
+ True: ASSET_EXTENSIONS
89
+ },
90
+ },
91
+ True: {
92
+ ExtensionCategory.ATTACH: {
93
+ False: ATTACH_EXTENSIONS,
94
+ True: ASSET_EXTENSIONS,
95
+ },
96
+ ExtensionCategory.DOC: {
97
+ False: HTML_EXTENSIONS,
98
+ True: ASSET_EXTENSIONS,
99
+ },
100
+ ExtensionCategory.ENGLISH_DOC: {
101
+ False: ENGLISH_DOC_EXTENSIONS,
102
+ True: ENGLISH_DOC_EXTENSIONS,
103
+ },
104
+ },
105
+ }
@@ -4,6 +4,7 @@ See COPYRIGHT.md for copyright information.
4
4
  from __future__ import annotations
5
5
 
6
6
  import zipfile
7
+ from collections import defaultdict
7
8
  from dataclasses import dataclass
8
9
  from functools import lru_cache
9
10
  from pathlib import Path
@@ -12,10 +13,19 @@ from arelle.ModelXbrl import ModelXbrl
12
13
  from arelle.ValidateXbrl import ValidateXbrl
13
14
  from arelle.typing import TypeGetText
14
15
  from arelle.utils.PluginData import PluginData
16
+ from .FormType import FormType
15
17
 
16
18
  _: TypeGetText
17
19
 
18
20
 
21
+ @dataclass(frozen=True)
22
+ class UploadContents:
23
+ amendmentPaths: dict[FormType, frozenset[Path]]
24
+ directories: frozenset[Path]
25
+ forms: dict[FormType, frozenset[Path]]
26
+ unknownPaths: frozenset[Path]
27
+
28
+
19
29
  @dataclass
20
30
  class PluginValidationDataExtension(PluginData):
21
31
  _primaryModelXbrl: ModelXbrl | None = None
@@ -50,6 +60,40 @@ class PluginValidationDataExtension(PluginData):
50
60
  return False # Not a zipfile
51
61
  return True
52
62
 
63
+ @lru_cache(1)
64
+ def getUploadContents(self, modelXbrl: ModelXbrl) -> UploadContents:
65
+ uploadFilepaths = self.getUploadFilepaths(modelXbrl)
66
+ amendmentPaths = defaultdict(list)
67
+ unknownPaths = []
68
+ directories = []
69
+ forms = defaultdict(list)
70
+ for path in uploadFilepaths:
71
+ parents = list(reversed([p.name for p in path.parents if len(p.name) > 0]))
72
+ if len(parents) == 0:
73
+ continue
74
+ if parents[0] == 'XBRL':
75
+ if len(parents) > 1:
76
+ formName = parents[1]
77
+ formType = FormType.parse(formName)
78
+ if formType is not None:
79
+ forms[formType].append(path)
80
+ continue
81
+ formName = parents[0]
82
+ formType = FormType.parse(formName)
83
+ if formType is not None:
84
+ amendmentPaths[formType].append(path)
85
+ continue
86
+ if len(path.suffix) == 0:
87
+ directories.append(path)
88
+ continue
89
+ unknownPaths.append(path)
90
+ return UploadContents(
91
+ amendmentPaths={k: frozenset(v) for k, v in amendmentPaths.items() if len(v) > 0},
92
+ directories=frozenset(directories),
93
+ forms={k: frozenset(v) for k, v in forms.items() if len(v) > 0},
94
+ unknownPaths=frozenset(unknownPaths)
95
+ )
96
+
53
97
  @lru_cache(1)
54
98
  def getUploadFilepaths(self, modelXbrl: ModelXbrl) -> list[Path]:
55
99
  if not modelXbrl.fileSource.fs or \
@@ -5,7 +5,9 @@ from __future__ import annotations
5
5
 
6
6
  import re
7
7
  import zipfile
8
+ from collections import defaultdict
8
9
  from collections.abc import Iterable
10
+ from pathlib import Path
9
11
  from typing import Any, cast, IO
10
12
 
11
13
  from arelle.ValidateXbrl import ValidateXbrl
@@ -14,10 +16,23 @@ from arelle.utils.PluginHooks import ValidationHook
14
16
  from arelle.utils.validate.Decorator import validation
15
17
  from arelle.utils.validate.Validation import Validation
16
18
  from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
19
+ from ..FormType import FormType, HTML_EXTENSIONS
17
20
  from ..PluginValidationDataExtension import PluginValidationDataExtension
18
21
 
19
22
  _: TypeGetText
20
23
 
24
+ FILE_COUNT_LIMITS = {
25
+ Path("AttachDoc"): 990,
26
+ Path("AuditDoc"): 990,
27
+ Path("PrivateDoc"): 9_990,
28
+ Path("PublicDoc"): 9_990,
29
+ Path("XBRL") / "AttachDoc": 990,
30
+ Path("XBRL") / "AuditDoc": 990,
31
+ Path("XBRL") / "PrivateDoc": 9_990,
32
+ Path("XBRL") / "PublicDoc": 9_990,
33
+ Path("XBRL"): 99_990,
34
+ }
35
+
21
36
  FILENAME_STEM_PATTERN = re.compile(r'[a-zA-Z0-9_-]*')
22
37
 
23
38
 
@@ -35,16 +50,18 @@ def rule_EC0121E(
35
50
  EDINET.EC0121E: There is a directory or file that contains more than 31 characters
36
51
  or uses characters other than those allowed (alphanumeric characters, '-' and '_').
37
52
 
38
- Implementation note: getManifestDirectoryPaths results in this validation only
39
- considering files that are beneath the same directory as the manifest file that
40
- the given DTS originated from. This prevents duplicate errors for packages
41
- with multiple document sets, but can still cause duplicates when a single manifest
42
- file has multiple document sets, as is often the case with AuditDoc manifests.
53
+ Note: Sample instances from EDINET almost always violate this rule based on our
54
+ current interpretation. The exception being files placed outside the XBRL directory,
55
+ i.e. amendment documents. For now, we will only check amendment documents, directory
56
+ names, or other files in unexpected locations.
43
57
  """
44
58
  if not pluginData.shouldValidateUpload(val):
45
59
  return
46
- uploadFilepaths = pluginData.getUploadFilepaths(val.modelXbrl)
47
- for path in uploadFilepaths:
60
+ uploadContents = pluginData.getUploadContents(val.modelXbrl)
61
+ paths = set(uploadContents.directories | uploadContents.unknownPaths)
62
+ for amendmentPaths in uploadContents.amendmentPaths.values():
63
+ paths.update(amendmentPaths)
64
+ for path in paths:
48
65
  if len(str(path.name)) > 31 or not FILENAME_STEM_PATTERN.match(path.stem):
49
66
  yield Validation.error(
50
67
  codes='EDINET.EC0121E',
@@ -71,8 +88,6 @@ def rule_EC0124E(
71
88
  ) -> Iterable[Validation]:
72
89
  """
73
90
  EDINET.EC0124E: There are no empty directories.
74
-
75
- See note on EC0121E.
76
91
  """
77
92
  if not pluginData.shouldValidateUpload(val):
78
93
  return
@@ -93,6 +108,91 @@ def rule_EC0124E(
93
108
  )
94
109
 
95
110
 
111
+ @validation(
112
+ hook=ValidationHook.XBRL_FINALLY,
113
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
114
+ )
115
+ def rule_EC0129E(
116
+ pluginData: PluginValidationDataExtension,
117
+ val: ValidateXbrl,
118
+ *args: Any,
119
+ **kwargs: Any,
120
+ ) -> Iterable[Validation]:
121
+ """
122
+ EDINET.EC0129E: Limit the number of subfolders to 3 or less from the XBRL directory.
123
+ """
124
+ startingDirectory = 'XBRL'
125
+ if not pluginData.shouldValidateUpload(val):
126
+ return
127
+ uploadFilepaths = pluginData.getUploadFilepaths(val.modelXbrl)
128
+ for path in uploadFilepaths:
129
+ parents = [parent.name for parent in path.parents]
130
+ if startingDirectory in parents:
131
+ parents = parents[:parents.index(startingDirectory)]
132
+ else:
133
+ # TODO: Do we validate amendment subfolders too? These aren't placed beneath the XBRL directory.
134
+ continue
135
+ depth = len(parents)
136
+ if depth > 3:
137
+ yield Validation.error(
138
+ codes='EDINET.EC0129E',
139
+ msg=_("The subordinate directories of %(path)s go up to the level %(depth)s (directories: %(parents)s). "
140
+ "Please limit the number of subfolders to 3 or less and upload again."),
141
+ path=str(path),
142
+ depth=depth,
143
+ parents=', '.join(f"'{parent}'" for parent in reversed(parents)),
144
+ file=str(path)
145
+ )
146
+
147
+
148
+ @validation(
149
+ hook=ValidationHook.XBRL_FINALLY,
150
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
151
+ )
152
+ def rule_EC0130E(
153
+ pluginData: PluginValidationDataExtension,
154
+ val: ValidateXbrl,
155
+ *args: Any,
156
+ **kwargs: Any,
157
+ ) -> Iterable[Validation]:
158
+ """
159
+ EDINET.EC0130E: File extensions must match the file extensions allowed in Figure 2-1-3 and Figure 2-1-5.
160
+ """
161
+ if not pluginData.shouldValidateUpload(val):
162
+ return
163
+ uploadContents = pluginData.getUploadContents(val.modelXbrl)
164
+ checks = []
165
+ for formType, amendmentPaths in uploadContents.amendmentPaths.items():
166
+ for amendmentPath in amendmentPaths:
167
+ isSubdirectory = amendmentPath.parent.name != formType.value
168
+ checks.append((amendmentPath, True, formType, isSubdirectory))
169
+ for formType, formPaths in uploadContents.forms.items():
170
+ for amendmentPath in formPaths:
171
+ isSubdirectory = amendmentPath.parent.name != formType.value
172
+ checks.append((amendmentPath, False, formType, isSubdirectory))
173
+ for path, isAmendment, formType, isSubdirectory in checks:
174
+ ext = path.suffix
175
+ if len(ext) == 0:
176
+ continue
177
+ validExtensions = formType.getValidExtensions(isAmendment, isSubdirectory)
178
+ if validExtensions is None:
179
+ continue
180
+ if ext not in validExtensions:
181
+ yield Validation.error(
182
+ codes='EDINET.EC0130E',
183
+ msg=_("The file extension '%(ext)s' is not valid at '%(path)s'. "
184
+ "Valid extensions at this location are: %(validExtensions)s. "
185
+ "Please change the file extension to a configurable extension and upload it again. "
186
+ "For information on configurable file extensions, please refer to 'Table 2-1-3 Storable File Formats (1)' "
187
+ "in the 'Document File Specifications' and 'Table 2-1-5 Storable File Formats (2)' in the "
188
+ "'Document File Specifications'."),
189
+ ext=ext,
190
+ path=str(path),
191
+ validExtensions=', '.join(f"'{e}'" for e in validExtensions),
192
+ file=str(path)
193
+ )
194
+
195
+
96
196
  @validation(
97
197
  hook=ValidationHook.XBRL_FINALLY,
98
198
  disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
@@ -108,21 +208,18 @@ def rule_EC0132E(
108
208
  """
109
209
  if not pluginData.shouldValidateUpload(val):
110
210
  return
111
- uploadFilepaths = pluginData.getUploadFilepaths(val.modelXbrl)
112
- docFolders = ("PublicDoc", "PrivateDoc", "AuditDoc")
113
- for filepath in uploadFilepaths:
114
- if filepath.name not in docFolders:
211
+ uploadContents = pluginData.getUploadContents(val.modelXbrl)
212
+ for formType in (FormType.AUDIT_DOC, FormType.PRIVATE_DOC, FormType.PUBLIC_DOC):
213
+ if formType not in uploadContents.forms:
115
214
  continue
116
- expectedManifestName = f'manifest_{filepath.name}.xml'
117
- expectedManifestPath = filepath / expectedManifestName
118
- if expectedManifestPath in uploadFilepaths:
215
+ if formType.manifestPath in uploadContents.forms.get(formType, []):
119
216
  continue
120
217
  yield Validation.error(
121
218
  codes='EDINET.EC0132E',
122
- msg=_("'%(expectedManifestName)s' does not exist in '%(expectedManifestFolder)s'. "
219
+ msg=_("'%(expectedManifestName)s' does not exist in '%(expectedManifestDirectory)s'. "
123
220
  "Please store the manifest file (or cover file) directly under the relevant folder and upload it again. "),
124
- expectedManifestName=expectedManifestName,
125
- expectedManifestFolder=str(filepath),
221
+ expectedManifestName=formType.manifestPath.name,
222
+ expectedManifestDirectory=str(formType.manifestPath.parent),
126
223
  )
127
224
 
128
225
 
@@ -151,3 +248,74 @@ def rule_EC0183E(
151
248
  msg=_("The compressed file size exceeds 55MB. "
152
249
  "Please compress the file to a size of 55MB or less and upload it again."),
153
250
  )
251
+
252
+
253
+ @validation(
254
+ hook=ValidationHook.XBRL_FINALLY,
255
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
256
+ )
257
+ def rule_EC0188E(
258
+ pluginData: PluginValidationDataExtension,
259
+ val: ValidateXbrl,
260
+ *args: Any,
261
+ **kwargs: Any,
262
+ ) -> Iterable[Validation]:
263
+ """
264
+ EDINET.EC0188E: There is an HTML file directly under PublicDoc or PrivateDoc whose first 7 characters are not numbers.
265
+ """
266
+ if not pluginData.shouldValidateUpload(val):
267
+ return
268
+ pattern = re.compile(r'^\d{7}')
269
+ uploadFilepaths = pluginData.getUploadFilepaths(val.modelXbrl)
270
+ docFolders = frozenset({"PublicDoc", "PrivateDoc"})
271
+ for path in uploadFilepaths:
272
+ if path.suffix not in HTML_EXTENSIONS:
273
+ continue
274
+ if path.parent.name not in docFolders:
275
+ continue
276
+ if pattern.match(path.name) is None:
277
+ yield Validation.error(
278
+ codes='EDINET.EC0188E',
279
+ msg=_("There is an html file directly under PublicDoc or PrivateDoc whose first 7 characters are not numbers: '%(path)s'."
280
+ "Please change the first 7 characters of the file name of the file directly under the folder to numbers "
281
+ "and upload it again."),
282
+ path=str(path),
283
+ file=str(path),
284
+ )
285
+
286
+
287
+ @validation(
288
+ hook=ValidationHook.XBRL_FINALLY,
289
+ disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
290
+ )
291
+ def rule_EC0198E(
292
+ pluginData: PluginValidationDataExtension,
293
+ val: ValidateXbrl,
294
+ *args: Any,
295
+ **kwargs: Any,
296
+ ) -> Iterable[Validation]:
297
+ """
298
+ EDINET.EC0198E: The number of files in the total submission and directories can not exceed the upper limit.
299
+ """
300
+ if not pluginData.shouldValidateUpload(val):
301
+ return
302
+ fileCounts: dict[Path, int] = defaultdict(int)
303
+ uploadFilepaths = pluginData.getUploadFilepaths(val.modelXbrl)
304
+ for path in uploadFilepaths:
305
+ if len(path.suffix) == 0:
306
+ continue
307
+ for directory in FILE_COUNT_LIMITS.keys():
308
+ if directory in path.parents:
309
+ fileCounts[directory] += 1
310
+ break
311
+ for directory, limit in FILE_COUNT_LIMITS.items():
312
+ actual = fileCounts[directory]
313
+ if actual > limit:
314
+ yield Validation.error(
315
+ codes='EDINET.EC0198E',
316
+ msg=_("The number of files in %(directory)s exceeds the upper limit (%(actual)s > %(limit)s). "
317
+ "Please reduce the number of files in the folder to below the maximum and try uploading again."),
318
+ directory=str(directory),
319
+ actual="{:,}".format(actual),
320
+ limit="{:,}".format(limit),
321
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arelle-release
3
- Version: 2.37.29
3
+ Version: 2.37.30
4
4
  Summary: An open source XBRL platform.
5
5
  Author-email: "arelle.org" <support@arelle.org>
6
6
  License: Apache-2.0
@@ -33,7 +33,7 @@ arelle/HtmlUtil.py,sha256=eXa6yF5xBCOODCuBMY7g8ePZHPOSu6X0gDsW3z9N50A,761
33
33
  arelle/InstanceAspectsEvaluator.py,sha256=TePNIs_m0vCIbN5N4PXEyJm529T2WBFi2zmv-72r3Zk,1805
34
34
  arelle/LeiUtil.py,sha256=tSPrbQrXEeH5pXgGA_6MAdgMZp20NaW5izJglIXyEQk,5095
35
35
  arelle/LocalViewer.py,sha256=WVrfek_bLeFFxgWITi1EQb6xCQN8O9Ks-ZL16vRncSk,3080
36
- arelle/Locale.py,sha256=aKC1Uaen_dbPGb92kZa_yUoo7On_QtWlvr5H_F9BNXg,33008
36
+ arelle/Locale.py,sha256=07IDxv8nIfvhyRRllFdEAKRI3yo1D2v781cTrjb_RoQ,33193
37
37
  arelle/ModelDocument.py,sha256=Sq6umEdn-aNHjxIpEsXTT7A4V25nGY0JiylSnhr9zSI,130749
38
38
  arelle/ModelDtsObject.py,sha256=nvHQs4BDmPxY6mqLiBuqIGRJXyA1EqOEGB2f3S6A6w4,88656
39
39
  arelle/ModelFormulaObject.py,sha256=-eb0lBYciEeAvvGduIs3AHGNGrxge9_0g1cVT6UUgvc,122560
@@ -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=qYQGLyu2LukjrzdlSMsUW-PBHLxq_IztqFR9C27E7NQ,515
126
+ arelle/_version.py,sha256=CnZbug4_DSgIxLaZeF6X5a9gF_h2H5q2aoDn5RQUfUA,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
@@ -393,12 +393,13 @@ arelle/plugin/validate/DBA/rules/tr.py,sha256=zdi3kQ82whmweVWRLbMvcNpM8sqtUliPsG
393
393
  arelle/plugin/validate/EBA/__init__.py,sha256=1kW-04W32sStSAL8wvW1ZpXnjlFv6KLbfE4aifYUB2A,46000
394
394
  arelle/plugin/validate/EBA/config.xml,sha256=37wMVUAObK-XEqakqD8zPNog20emYt4a_yfL1AKubF8,2022
395
395
  arelle/plugin/validate/EDINET/DisclosureSystems.py,sha256=3rKG42Eg-17Xx_KXU_V5yHW6I3LTwQunvf4a44C9k_4,36
396
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=P_cEzW23rPxivWMN2qGatMPRdw3yy3gybit2pcYmong,2393
396
+ arelle/plugin/validate/EDINET/FormType.py,sha256=pJfKjdjqFcRLFgH6xbEixvpwatZBBHI8uI3xjjhaPI0,3175
397
+ arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=8ylP-bY6Y0PJ1AxQ35CZmXYzAQDNu1K4rBSVupq-wZ8,4088
397
398
  arelle/plugin/validate/EDINET/ValidationPluginExtension.py,sha256=HIGOpBOyuVs5SEh573M3IzdouRdEuNIBkdumieZi8r0,959
398
399
  arelle/plugin/validate/EDINET/__init__.py,sha256=1kJUaV2AbNZdakKSa_v3opdyCRKO3gva62RpHVOrpIE,4398
399
400
  arelle/plugin/validate/EDINET/resources/config.xml,sha256=7uxn_HZT3USgbs2GQkew-dCUzlEgUGs62PiqEfljPgk,514
400
401
  arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
401
- arelle/plugin/validate/EDINET/rules/upload.py,sha256=KtPt2B04-9Fr8oOHneFpaLgkrntsQgVdVdWYWyL5fMI,5671
402
+ arelle/plugin/validate/EDINET/rules/upload.py,sha256=cB3EZbzcU5vK80IQUc-MNBvKcnCf8-f72C0JqLubSCE,12395
402
403
  arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
403
404
  arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
404
405
  arelle/plugin/validate/ESEF/Util.py,sha256=QH3btcGqBpr42M7WSKZLSdNXygZaZLfEiEjlxoG21jE,7950
@@ -749,7 +750,7 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
749
750
  arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
750
751
  arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
751
752
  arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
752
- arelle_release-2.37.29.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
753
+ arelle_release-2.37.30.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
753
754
  tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
754
755
  tests/integration_tests/download_cache.py,sha256=jVMIVICsZjcVc9DCPPu3fCjF9_cWSS3tqSynhFs3oAM,4097
755
756
  tests/integration_tests/integration_test_util.py,sha256=H7mncbv0T9ZeVyrtk9Hohe3k6jgcYykHkt-LGE-Q9aQ,10270
@@ -780,15 +781,15 @@ tests/integration_tests/validation/assets.py,sha256=Ag9qPYrodcC-Ly6aygqapV0vG2Cb
780
781
  tests/integration_tests/validation/conformance_suite_config.py,sha256=LgPO_8H_esM9kQS2o4jKd8CTNi0hiHugZ1hZn7whshI,10383
781
782
  tests/integration_tests/validation/conformance_suite_configs.py,sha256=jM-EqvLDLxq1xIv3UxQonXsSXbBR-AGVd0yAW_XeJUI,7616
782
783
  tests/integration_tests/validation/conftest.py,sha256=rVfmNX9y0JZ1VfoEepeYyIz-ZxzEZ1IJlmbcQSuxgUo,816
783
- tests/integration_tests/validation/discover_tests.py,sha256=dSzciVoGJNjw1NkPnAylncDy4_T-dBoZKR5YCmaZTgA,4653
784
+ tests/integration_tests/validation/discover_tests.py,sha256=qaSCsys6cC9Xu6ep9M0db3UCTR7fKCPLOv8xEvvcE3I,4653
784
785
  tests/integration_tests/validation/download_assets.py,sha256=muHklbrvYEbxqqAM8mU-8FpeemP0BLTWxD11xTYiCMc,7850
785
786
  tests/integration_tests/validation/run_conformance_suites.py,sha256=yBnPdtIiNKibjsrJxrvVA7NyAEWcoDg-sSjp1nFGQ2g,8496
786
787
  tests/integration_tests/validation/test_conformance_suites.py,sha256=VdwY0QtV6g00M9bv1XNs4qBTwxPxCh5-z4XoDdEhgeM,711
787
- tests/integration_tests/validation/validation_util.py,sha256=_f0gd5BTts44Z9aEKi9kNPUC52sYCKgHoW557MsGw-k,21941
788
+ tests/integration_tests/validation/validation_util.py,sha256=5rIVfEemipJcnDpSqf5479Fa13I3ICHvPFq1pYROWCU,22136
788
789
  tests/integration_tests/validation/conformance_suite_configurations/cipc_current.py,sha256=oLXe3xIsEZLz3cv1cDdMQIuS_NgyI9Uimc9hy0NMWqg,642
789
790
  tests/integration_tests/validation/conformance_suite_configurations/dba_current.py,sha256=j-7jCpzbGXbOzG8HGEyS0ciCYSPZzZLV44VQGhP3Hmc,875
790
791
  tests/integration_tests/validation/conformance_suite_configurations/dba_multi_current.py,sha256=ICkP18Wu7aTDfszfYlrfVnBj9oe7ppXR-8wxQqCPqW0,837
791
- tests/integration_tests/validation/conformance_suite_configurations/edinet.py,sha256=-oS74t6-MLy5KVKmKOcZTFSRzF5iCJDry2h14jhiY7k,2198
792
+ tests/integration_tests/validation/conformance_suite_configurations/edinet.py,sha256=PMyBjtE-t24EysXrWvqYqk1Mqx-LeWRdwYrEUPeRVfM,1638
792
793
  tests/integration_tests/validation/conformance_suite_configurations/efm_current.py,sha256=zbZ9c-LoZJDRp0Lobl_oH3xRw4g-2u6oQqU0-oo5NOE,1322
793
794
  tests/integration_tests/validation/conformance_suite_configurations/efm_reg_dqc.py,sha256=HiT8OcRAOVKLsl95Y91L66FeOsIMMMAQCs-DLMG-Lb0,739
794
795
  tests/integration_tests/validation/conformance_suite_configurations/efm_reg_pragmatic.py,sha256=U6dew0sIibjZe4r6na912qyIVAjxljh2HDix-8AwvhM,727
@@ -820,7 +821,7 @@ tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensi
820
821
  tests/integration_tests/validation/conformance_suite_configurations/xbrl_extensible_enumerations_2_0.py,sha256=DZTlD6A3ieT-lBUlrn78a0V5j1LvCKRm_Lm7jSvphPY,683
821
822
  tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0.py,sha256=H456ozSCnVoVHXYHd4g2169JHkI2yKhMgOOpJyanLZE,592
822
823
  tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_assertion_severity_2_0.py,sha256=W7FT2ac5u8PyRubt_bcDl37wucv0Pnu9KqQ2jxEpGFM,668
823
- tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_function_registry.py,sha256=TPQ82Ei_zJv5b3ZxxdifDRRzLMBfNqqeFcwr66-oLd8,811
824
+ tests/integration_tests/validation/conformance_suite_configurations/xbrl_formula_1_0_function_registry.py,sha256=RuqeADKn_6E1AT5vPCXxnSZoD_3diVhQrroaLVa2Op8,1024
824
825
  tests/integration_tests/validation/conformance_suite_configurations/xbrl_ixbrl_1_1.py,sha256=Upsc9Nx0eHJQlVL9p77GamTCUpIqjexnRShe9F0b9NM,1366
825
826
  tests/integration_tests/validation/conformance_suite_configurations/xbrl_link_role_registry_1_0.py,sha256=NQfri9MXCDSvNy7kahf4iXZaBUPey9-FYKlchg-Uw4I,633
826
827
  tests/integration_tests/validation/conformance_suite_configurations/xbrl_oim_1_0.py,sha256=s5tcH5fgzNwLQR1iWxCjuyij4Rxjq8XrmGDIptAbfGE,906
@@ -1151,15 +1152,39 @@ tests/resources/conformance_suites/dba_multi/tr/tr17-testcase.xml,sha256=zzu0az0
1151
1152
  tests/resources/conformance_suites/dba_multi/tr/valid-ixbrl-001.xhtml,sha256=weldGT9zOEsSYhbVmpz-MR66Bd4jMMqsKoWTM6GLXag,1652016
1152
1153
  tests/resources/conformance_suites/dba_multi/tr/valid-testcase.xml,sha256=KmH_iJFEFdCATYn9QWevbgCOTaGDR9r80NhdsYdGKsA,895
1153
1154
  tests/resources/conformance_suites/edinet/README.md,sha256=uO7RiidAUp8xEkP7obmggpxhfgdsnACoKplgYqqPON0,333
1154
- tests/resources/conformance_suites/edinet/index.xml,sha256=_BE23o3QkqQ5AtkwdKMzZS5axiTCn7dmYNQHUOZFey0,240
1155
- tests/resources/conformance_suites/edinet/EC0121E/index.xml,sha256=PYxVpU9Q_vDBCkeUkGxPfsfaMevnpVLD14iCwCLdnuk,980
1156
- tests/resources/conformance_suites/edinet/EC0121E/invalid01.zip,sha256=XvIBDtvvNWFEAdI9N7G6xeH23t4m7_lCW3ViOBFv0o4,443326
1157
- tests/resources/conformance_suites/edinet/EC0124E/index.xml,sha256=QpDcbJCZmroWiIoeyd1PpTZkIOTCJ1ryKvDbg2BDbg0,814
1158
- tests/resources/conformance_suites/edinet/EC0124E/invalid01.zip,sha256=mD2DuFFAAHfbLiS76BsR-xLJsJP5ffFmkvFoHDa-J9o,459293
1159
- tests/resources/conformance_suites/edinet/EC0132E/index.xml,sha256=Ym1yllYc0h1NzL1sy67qLYTh5E99F6kjYLBln3VcvQ8,873
1160
- tests/resources/conformance_suites/edinet/EC0132E/invalid01.zip,sha256=UgteWlkzeTZm0VnDeE8c0bH4k8qB_AIoy2-9O8fICsA,457579
1161
- tests/resources/conformance_suites/edinet/valid/index.xml,sha256=VFzHe8fWPOnZy2V85N9w_SlwBqMBQEpM68zUHdMP_k4,813
1162
- tests/resources/conformance_suites/edinet/valid/valid01.zip,sha256=XvIBDtvvNWFEAdI9N7G6xeH23t4m7_lCW3ViOBFv0o4,443326
1155
+ tests/resources/conformance_suites/edinet/index.xml,sha256=EhFVwHdigCHj3xh1xNyqD3orUqts1d-MtRI4_sJl5kQ,404
1156
+ tests/resources/conformance_suites/edinet/EC0121E/index.xml,sha256=1XFjoMoMAfNVISDy_4EvQC0qM6bZnQYMxtA8qhgdC4A,1064
1157
+ tests/resources/conformance_suites/edinet/EC0121E/invalid01.zip,sha256=sy31KH6h8C7L3wBqXsiQrT6LUyjZn20Bxsx4FxC3SBg,12734
1158
+ tests/resources/conformance_suites/edinet/EC0124E/index.xml,sha256=owK-jho_Kg4KcmO-OgJZ_HGiv_6TBwD6bHBHuir7Qa4,896
1159
+ tests/resources/conformance_suites/edinet/EC0124E/invalid01.zip,sha256=NS0wqn_z58duwqtzbwZ3wFFEpMdbnndBBqbodrF9RCQ,10480
1160
+ tests/resources/conformance_suites/edinet/EC0129E/index.xml,sha256=mvwTD8Mmvn_VIFd51dmvjtQNRNgJAUKENkD6LHzM1xE,964
1161
+ tests/resources/conformance_suites/edinet/EC0129E/invalid01.zip,sha256=2_m13sVjTCSt6_wBbCMEglJrFcZUC_fidD4n4gV05Ho,10065
1162
+ tests/resources/conformance_suites/edinet/EC0130E/index.xml,sha256=uDFH-TxfHyXC188S-4qnSd4RISHW6Xn1E6oA8Pt3mp0,1004
1163
+ tests/resources/conformance_suites/edinet/EC0130E/invalid01.zip,sha256=kJF7XARkzuB98MFO5P3NCmpW3WHr-6ZgxDPsh5UNCzU,15814
1164
+ tests/resources/conformance_suites/edinet/EC0132E/index.xml,sha256=W9j0k82U0PxltmcLtfSL5peiEEpCOmZ3RIskFS0dLNM,926
1165
+ tests/resources/conformance_suites/edinet/EC0132E/invalid01.zip,sha256=RAWTW6HHocM3o2S35JCa88S8CCWpPNXYD3IPtiPuYw8,9822
1166
+ tests/resources/conformance_suites/edinet/EC0188E/index.xml,sha256=PHnUX2Aio06MGQELWyI7lWKvVdLzkyzOhuLJ3ejlmHQ,1004
1167
+ tests/resources/conformance_suites/edinet/EC0188E/invalid01.zip,sha256=lngtZRs8AFww6JoTBKM0naVoaJJHePTcPfSxA0vSsQU,10503
1168
+ tests/resources/conformance_suites/edinet/EC0198E/index.xml,sha256=VET9GHoyRnPDPccGZtgSzHNdFNnaLUFPBn5WCqa1Hyc,977
1169
+ tests/resources/conformance_suites/edinet/EC0198E/invalid01.zip,sha256=gI7yCbJjsu2s7UOIwvuV7Q0VvyF3xsIwxg2es3TuZtE,225505
1170
+ tests/resources/conformance_suites/edinet/valid/index.xml,sha256=uXI41f0itmvtn2Ndxw_xypISB5oFt5LSJb9lptbAt98,7731
1171
+ tests/resources/conformance_suites/edinet/valid/valid01.zip,sha256=68IK_fwBiuI8QTik2mCc3pUlGCI8ZkL6EGthJz1TFPM,153228
1172
+ tests/resources/conformance_suites/edinet/valid/valid02.zip,sha256=CFyA86qW3sHCZyhjWnww9xHUa0kxmgFTHV83h8Efafs,167649
1173
+ tests/resources/conformance_suites/edinet/valid/valid03.zip,sha256=AOsXvumMft8B4P39kAt_HT0NdFu5YobbTOFIXRFPiAY,178509
1174
+ tests/resources/conformance_suites/edinet/valid/valid04.zip,sha256=JQKKungAUpVVgd1DVDhmdxGbECHzdMs_XSDDwDGbV_U,102936
1175
+ tests/resources/conformance_suites/edinet/valid/valid05.zip,sha256=y9T2ye7zX-j7MOoKDzFJMoxfqcsaU4BCVS-ncOoj8Tg,63474
1176
+ tests/resources/conformance_suites/edinet/valid/valid06.zip,sha256=hEsRLR1dHK4jPg3A1nnhOLGbQ1b_ScPhniDOgmAP7NM,102981
1177
+ tests/resources/conformance_suites/edinet/valid/valid07.zip,sha256=aK5e9k3eODwGamScHWS-fQq5e7P3s_5rMjDhH-DNY8A,12549
1178
+ tests/resources/conformance_suites/edinet/valid/valid08.zip,sha256=ey2JVhtQstRs0IDkzwwHRC8bJy3q2tFj9jWF3xYLDmQ,17199
1179
+ tests/resources/conformance_suites/edinet/valid/valid09.zip,sha256=AbqS-X0dRlJo2cJyFxY6HiNn5Xb9q2Gs6nTZH-KM2Lg,9842
1180
+ tests/resources/conformance_suites/edinet/valid/valid10.zip,sha256=MZFJqBp7HXG4nFRcHzsbjd_e-QBYpSezyw-DJDceuIM,126061
1181
+ tests/resources/conformance_suites/edinet/valid/valid11.zip,sha256=DD8l-aHG1ittL68v2DgHm4I8qAmqcPAh_A96wKScO4Q,124829
1182
+ tests/resources/conformance_suites/edinet/valid/valid12.zip,sha256=9U2vsWTLaufk1qv9wEmnKx8lP578feGYV9lwXjcuHcY,45710
1183
+ tests/resources/conformance_suites/edinet/valid/valid13.zip,sha256=Ml6fY1BlETnxaqr4YiBDJd_WGNEnn7lzmexqnlrU5o4,10886
1184
+ tests/resources/conformance_suites/edinet/valid/valid14.zip,sha256=CYnnNxyyxr05rjeGDSkXs480M-BXpQD-Y2ZGM-7He68,13386
1185
+ tests/resources/conformance_suites/edinet/valid/valid20.zip,sha256=xaKwHMCvACzgZqp88Mv-2KReHMiqUMp7twqar-sC_qQ,174640
1186
+ tests/resources/conformance_suites/edinet/valid/valid21.zip,sha256=gtQZSL1eUxqSwkgGIXqlidbElptX2pA31t5qp9JDI20,129608
1187
+ tests/resources/conformance_suites/edinet/valid/valid22.zip,sha256=MHOyA6eE6deXvW21EK_8ht4rUAEcAbv2mmsc_RvvGgg,129716
1163
1188
  tests/resources/conformance_suites/nl_nt16/index.xml,sha256=FFSSMokLcdhMroNeSSbm28pi-RKRURdVcKhqHdj44f0,2010
1164
1189
  tests/resources/conformance_suites/nl_nt16/mock-taxonomy.xsd,sha256=1uRNZClgrtNvL1Gx27MEAntSzeszICUhVXO01jqoavQ,1377
1165
1190
  tests/resources/conformance_suites/nl_nt16/br_kvk/2-04-invalid-period.xbrl,sha256=WeUb_M6vNrLG9jjbNTDv7qiPnAYyfYXlZvDbVlHh11g,4127
@@ -1569,6 +1594,7 @@ tests/resources/conformance_suites_expected/efm_current.csv,sha256=9YoKy-kYo_VAy
1569
1594
  tests/resources/conformance_suites_expected/efm_reg_dqc.csv,sha256=0CEItNnnEE_s8uGHA8CidxEVyvOiTCv5nAWpc4dCUmE,9968847
1570
1595
  tests/resources/conformance_suites_expected/efm_reg_pragmatic.csv,sha256=J_sDOjJGDjFnseMU7QIBttvvOjjnPp_WdmrCkjvCu4Y,196
1571
1596
  tests/resources/conformance_suites_timing/dba_current.json,sha256=e5jmGVDcPbaXDbHNK3RQz-_gsozU1dL_J0gcNDzHnjg,1467
1597
+ tests/resources/conformance_suites_timing/edinet.json,sha256=oBW-DfzxdzYK8gxw1hptPzKNLSLyOXcFdr-g0NR-5c8,1279
1572
1598
  tests/resources/conformance_suites_timing/efm_current.json,sha256=iqqcBoDJVs2F_xW03gCirDyaLZoS9x482KAQgMhCvvg,1096604
1573
1599
  tests/resources/conformance_suites_timing/efm_reg_dqc.json,sha256=4ry0JC8XA-8Bua2E75edknjxcL42Qj6nMZxvjCdW2uc,1708653
1574
1600
  tests/resources/conformance_suites_timing/esef_ixbrl_2021.json,sha256=3UBEba0PStPkAHgYZc6_WAH3_pBTGOpDNRQ0X1hxH74,26836
@@ -1614,8 +1640,8 @@ tests/unit_tests/arelle/oim/test_load.py,sha256=NxiUauQwJVfWAHbbpsMHGSU2d3Br8Pki
1614
1640
  tests/unit_tests/arelle/plugin/test_plugin_imports.py,sha256=bdhIs9frAnFsdGU113yBk09_jis-z43dwUItMFYuSYM,1064
1615
1641
  tests/unit_tests/arelle/plugin/validate/ESEF/ESEF_Current/test_validate_css_url.py,sha256=H0ndmQ0sFO5WVMzAxPCH1WciRhCg_HgKUtQCg0xlmtg,1238
1616
1642
  tests/unit_tests/arelle/utils/validate/test_decorator.py,sha256=ZS8FqIY1g-2FCbjF4UYm609dwViax6qBMRJSi0vfuhY,2482
1617
- arelle_release-2.37.29.dist-info/METADATA,sha256=QyeOsfUCuvJazWgFYNmOci7pK1EkNxh61foj7xkHQdY,9189
1618
- arelle_release-2.37.29.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1619
- arelle_release-2.37.29.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1620
- arelle_release-2.37.29.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1621
- arelle_release-2.37.29.dist-info/RECORD,,
1643
+ arelle_release-2.37.30.dist-info/METADATA,sha256=3yAS489MpYI3fh5jpyadZ3iRtu01h-I9exvjlpnie6U,9189
1644
+ arelle_release-2.37.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1645
+ arelle_release-2.37.30.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1646
+ arelle_release-2.37.30.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1647
+ arelle_release-2.37.30.dist-info/RECORD,,
@@ -12,41 +12,24 @@ config = ConformanceSuiteConfig(
12
12
  entry_point=Path('index.xml'),
13
13
  ),
14
14
  ],
15
- cache_version_id='MkGD3D8lKJN_y0a0fH75EeZHKAO7V.iJ',
16
- # Duplicate errors: Running EDINET validations in a testcase context
17
- # prevents us from detecting when two models are being validated
18
- # from the same variation, so `shouldValidateUpload` always returns `True`.
19
- # This leads to any rule that validates at the package level (rather than the
20
- # instance level) firing once for each instance. Normal validation runs
21
- # do not have this issue.
22
- # TODO: Prevent duplicate runs in testcase context.
23
- # EC0121E: 31-character limit is violated by every example we've seen. Likely
24
- # misunderstanding of the rule or the example filings we're working with. Expect
25
- # to be resolved at some point.
26
- expected_additional_testcase_errors={f"*/{s}": val for s, val in {
27
- 'valid/index.xml:valid01': {
28
- # See "Duplicate errors", "EC0121E" notes above.
29
- 'EDINET.EC0121E': 114,
30
- },
31
- 'EC0121E/index.xml:invalid01': {
32
- # See "Duplicate errors", "EC0121E" notes above.
33
- # 38 expected, 2 sets of duplicates
34
- 'EDINET.EC0121E': 76,
35
- },
36
- 'EC0124E/index.xml:invalid01': {
37
- # See "Duplicate errors", "EC0121E" notes above.
38
- 'EDINET.EC0121E': 114,
39
- 'EDINET.EC0124E': 2,
40
- },
41
- 'EC0132E/index.xml:invalid01': {
42
- # See "EC0121E" note above (single instance, not duplicated)
43
- 'EDINET.EC0121E': 38,
44
- },
15
+ cache_version_id='cs2wODrDheJqDIm1kEU4Qwk8jwd7DfQu',
16
+ expected_additional_testcase_errors={f"*{s}": val for s, val in {
17
+ # Duplicate errors: Running EDINET validations in a testcase context
18
+ # prevents us from detecting when two models are being validated
19
+ # from the same variation, so `shouldValidateUpload` always returns `True`.
20
+ # This leads to any rule that validates at the package level (rather than the
21
+ # instance level) firing once for each instance. Normal validation runs
22
+ # do not have this issue. We can expect this to be resolved at some point.
23
+ # Until then, if you construct a test case zip from a valid package that has multiple instances
24
+ # (e.g. PublicDoc + AuditDoc) you'll need to add expected additional testcases here
25
+ # for the duplicate errors.
26
+ # TODO: Prevent duplicate runs in testcase context.
45
27
  }.items()},
46
28
  expected_failure_ids=frozenset([]),
47
29
  info_url='https://disclosure2.edinet-fsa.go.jp/weee0020.aspx',
48
30
  name=PurePath(__file__).stem,
49
31
  network_or_cache_required=False,
50
32
  plugins=frozenset({'validate/EDINET', 'inlineXbrlDocumentSet'}),
33
+ shards=4,
51
34
  test_case_result_options='match-all',
52
35
  )
@@ -1,3 +1,4 @@
1
+ import re
1
2
  from pathlib import Path, PurePath
2
3
 
3
4
  from tests.integration_tests.validation.conformance_suite_config import (
@@ -21,5 +22,8 @@ config = ConformanceSuiteConfig(
21
22
  network_or_cache_required=False,
22
23
  plugins=frozenset({'formulaXPathChecker', 'functionsMath'}),
23
24
  strict_testcase_index=False,
25
+ required_locale_by_ids={f'formula/function-registry/{t}': p for t, p in [
26
+ ('xbrl/90701 xfi.format-number/90701 xfi.format-number testcase.xml:V-05', re.compile(r"^(en|English).*$")),
27
+ ]},
24
28
  test_case_result_options='match-any',
25
29
  )
@@ -11,16 +11,16 @@ from .conformance_suite_configurations.xbrl_2_1 import config as xbrl_2_1
11
11
 
12
12
 
13
13
  LINUX = 'ubuntu-24.04'
14
- MACOS = 'macos-14'
14
+ MACOS = 'macos-15'
15
15
  WINDOWS = 'windows-2022'
16
16
  ALL_PYTHON_VERSIONS = (
17
17
  '3.9',
18
18
  '3.10',
19
19
  '3.11',
20
20
  '3.12',
21
- '3.13.3',
21
+ '3.13.5',
22
22
  )
23
- LATEST_PYTHON_VERSION = '3.13.3'
23
+ LATEST_PYTHON_VERSION = '3.13.5'
24
24
  # number of cores on the runners
25
25
  # https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources
26
26
  OS_CORES = {
@@ -2,6 +2,7 @@ from __future__ import annotations
2
2
 
3
3
  import csv
4
4
  import difflib
5
+ import fnmatch
5
6
  import json
6
7
  import multiprocessing
7
8
  import os.path
@@ -331,7 +332,14 @@ def get_conformance_suite_test_results_with_shards(
331
332
  additional_plugins = shard.plugins
332
333
  all_test_paths = {path for test_shard in test_shards for path in test_shard.paths}
333
334
 
334
- unrecognized_additional_error_ids = {_id.rsplit(':', 1)[0] for _id in config.expected_additional_testcase_errors.keys()} - all_test_paths
335
+ unrecognized_additional_error_ids = {
336
+ pattern
337
+ for pattern in {
338
+ _id.rsplit(':', 1)[0]
339
+ for _id in config.expected_additional_testcase_errors.keys()
340
+ }
341
+ if not any(fnmatch.fnmatch(test_path, pattern) for test_path in all_test_paths)
342
+ }
335
343
  assert not unrecognized_additional_error_ids, f'Unrecognized expected additional error IDs: {unrecognized_additional_error_ids}'
336
344
  expected_additional_testcase_errors = {}
337
345
  for expected_id, errors in config.expected_additional_testcase_errors.items():
@@ -11,12 +11,13 @@
11
11
  <variation id="invalid01" name="invalid01">
12
12
  <description>
13
13
  Filenames exceed 31 characters or contain invalid characters.
14
+ <!--valid09.zip with file added to root PublicDoc with long filename.-->
14
15
  </description>
15
16
  <data>
16
17
  <instance readMeFirst="true">invalid01.zip</instance>
17
18
  </data>
18
19
  <result>
19
- <error num="38">EDINET.EC0121E</error>
20
+ <error num="1">EDINET.EC0121E</error>
20
21
  </result>
21
22
  </variation>
22
23
  </testcase>
@@ -10,7 +10,8 @@
10
10
  xsi:schemaLocation="http://xbrl.org/2005/conformance https://www.xbrl.org/2005/conformance.xsd">
11
11
  <variation id="invalid01" name="invalid01">
12
12
  <description>
13
- There are empty directories.
13
+ There is an empty directory.
14
+ <!--valid09.zip with empty 'XBRL/PublicDoc/empty' directory added.-->
14
15
  </description>
15
16
  <data>
16
17
  <instance readMeFirst="true">invalid01.zip</instance>
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <?xml-stylesheet type="text/xsl" href="../testcase.xsl"?>
3
+ <testcase
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xmlns="http://xbrl.org/2005/conformance"
6
+ name="EDINET.EC0129E"
7
+ description="EDINET.EC0129E: Limit the number of subfolders to 3 or less from the XBRL directory."
8
+ outpath=''
9
+ owner="support@arelle.org"
10
+ xsi:schemaLocation="http://xbrl.org/2005/conformance https://www.xbrl.org/2005/conformance.xsd">
11
+ <variation id="invalid01" name="invalid01">
12
+ <description>
13
+ There are is a file nested 4 directories beneath XBRL directory.
14
+ <!--valid09.zip with 'XBRL/PublicDoc/images/a/b/c.gif' added.-->
15
+ </description>
16
+ <data>
17
+ <instance readMeFirst="true">invalid01.zip</instance>
18
+ </data>
19
+ <result>
20
+ <error>EDINET.EC0129E</error>
21
+ </result>
22
+ </variation>
23
+ </testcase>
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <?xml-stylesheet type="text/xsl" href="../testcase.xsl"?>
3
+ <testcase
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xmlns="http://xbrl.org/2005/conformance"
6
+ name="EDINET.EC0130E"
7
+ description="EDINET.EC0130E: File extensions must match the file extensions allowed in Chart 2_3_1."
8
+ outpath=''
9
+ owner="support@arelle.org"
10
+ xsi:schemaLocation="http://xbrl.org/2005/conformance https://www.xbrl.org/2005/conformance.xsd">
11
+ <variation id="invalid01" name="invalid01">
12
+ <description>
13
+ There are several files with invalid extensions.
14
+ <!--valid09.zip with several valid and invalid files added among root directories and XBRL subdirectories.-->
15
+ </description>
16
+ <data>
17
+ <instance readMeFirst="true">invalid01.zip</instance>
18
+ </data>
19
+ <result>
20
+ <error num="16">EDINET.EC0130E</error>
21
+ </result>
22
+ </variation>
23
+ </testcase>
@@ -10,7 +10,8 @@
10
10
  xsi:schemaLocation="http://xbrl.org/2005/conformance https://www.xbrl.org/2005/conformance.xsd">
11
11
  <variation id="invalid01" name="invalid01">
12
12
  <description>
13
- Missing 'manifest_AuditDoc.xml' under 'AuditDoc' directory.
13
+ Manifest incorrectly named 'manifest.xml'.
14
+ <!--valid09.zip with 'manifest_PublicDoc.xml' renamed.-->
14
15
  </description>
15
16
  <data>
16
17
  <instance readMeFirst="true">invalid01.zip</instance>
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <?xml-stylesheet type="text/xsl" href="../testcase.xsl"?>
3
+ <testcase
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xmlns="http://xbrl.org/2005/conformance"
6
+ name="EDINET.EC0188E"
7
+ description="EDINET.EC0188E: There is an html file directly under PublicDoc or PrivateDoc whose first 7 characters are not numbers."
8
+ outpath=''
9
+ owner="support@arelle.org"
10
+ xsi:schemaLocation="http://xbrl.org/2005/conformance https://www.xbrl.org/2005/conformance.xsd">
11
+ <variation id="invalid01" name="invalid01">
12
+ <description>
13
+ HTML file with invalid filename exists directly beneath PublicDoc.
14
+ <!--valid09.zip with 'invalid.html' added under 'XBRL/PublicDoc'.-->
15
+ </description>
16
+ <data>
17
+ <instance readMeFirst="true">invalid01.zip</instance>
18
+ </data>
19
+ <result>
20
+ <error>EDINET.EC0188E</error>
21
+ </result>
22
+ </variation>
23
+ </testcase>
@@ -0,0 +1,23 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <?xml-stylesheet type="text/xsl" href="../testcase.xsl"?>
3
+ <testcase
4
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5
+ xmlns="http://xbrl.org/2005/conformance"
6
+ name="EDINET.EC0198E"
7
+ description="EDINET.EC0198E: The number of files in the total submission and directories can not exceed the upper limit."
8
+ outpath=''
9
+ owner="support@arelle.org"
10
+ xsi:schemaLocation="http://xbrl.org/2005/conformance https://www.xbrl.org/2005/conformance.xsd">
11
+ <variation id="invalid01" name="invalid01">
12
+ <description>
13
+ 991 files exist in `/AuditDoc`, above the limit of 990.
14
+ <!--valid09.zip with 'image0001.gif' etc. added to AuditDoc.-->
15
+ </description>
16
+ <data>
17
+ <instance readMeFirst="true">invalid01.zip</instance>
18
+ </data>
19
+ <result>
20
+ <error>EDINET.EC0198E</error>
21
+ </result>
22
+ </variation>
23
+ </testcase>
@@ -2,6 +2,10 @@
2
2
  <testcases name="EDINET">
3
3
  <testcase uri="EC0121E/index.xml" />
4
4
  <testcase uri="EC0124E/index.xml" />
5
+ <testcase uri="EC0129E/index.xml" />
6
+ <testcase uri="EC0130E/index.xml" />
5
7
  <testcase uri="EC0132E/index.xml" />
8
+ <testcase uri="EC0188E/index.xml" />
9
+ <testcase uri="EC0198E/index.xml" />
6
10
  <testcase uri="valid/index.xml" />
7
11
  </testcases>
@@ -10,11 +10,190 @@
10
10
  xsi:schemaLocation="http://xbrl.org/2005/conformance https://www.xbrl.org/2005/conformance.xsd">
11
11
  <variation id="valid01" name="valid01">
12
12
  <description>
13
- A valid filing package.
13
+ Sample filing.
14
+ 01_開示府令-有価証券届出書
15
+ 01_Disclosure Ordinance-Securities Registration Statement
14
16
  </description>
15
17
  <data>
16
18
  <instance readMeFirst="true">valid01.zip</instance>
17
19
  </data>
18
20
  <result expected="valid"/>
19
21
  </variation>
22
+ <variation id="valid02" name="valid02">
23
+ <description>
24
+ Sample filing.
25
+ 02_開示府令-有価証券報告書
26
+ 02_Disclosure Ordinance-Securities Report
27
+ </description>
28
+ <data>
29
+ <instance readMeFirst="true">valid02.zip</instance>
30
+ </data>
31
+ <result expected="valid"/>
32
+ </variation>
33
+ <variation id="valid03" name="valid03">
34
+ <description>
35
+ Sample filing.
36
+ 03_開示府令-IFRS有価証券報告書
37
+ 03_Disclosure Ordinance-IFRS Securities Report
38
+ </description>
39
+ <data>
40
+ <instance readMeFirst="true">valid03.zip</instance>
41
+ </data>
42
+ <result expected="valid"/>
43
+ </variation>
44
+ <variation id="valid04" name="valid04">
45
+ <description>
46
+ Sample filing.
47
+ 04_開示府令-半期報告書(第四号の三様式、銀行業)
48
+ 04_Disclosure Ordinance-Semi-Annual Report (Form 4-3, Banking Industry)
49
+ </description>
50
+ <data>
51
+ <instance readMeFirst="true">valid04.zip</instance>
52
+ </data>
53
+ <result expected="valid"/>
54
+ </variation>
55
+ <variation id="valid05" name="valid05">
56
+ <description>
57
+ Sample filing.
58
+ 05_開示府令-半期報告書(第四号の三様式、建設業)
59
+ 05_Disclosure Ordinance-Semi-Annual Report (Form 4-3, Construction Industry)
60
+ <!--Modified from original to replace reference to "http://www.xbrl.org/2003/xbrl-instance-2003-09-30.xsd" with "http://www.xbrl.org/2003/xbrl-instance-2003-12-31.xsd".-->
61
+ </description>
62
+ <data>
63
+ <instance readMeFirst="true">valid05.zip</instance>
64
+ </data>
65
+ <result expected="valid"/>
66
+ </variation>
67
+ <variation id="valid06" name="valid06">
68
+ <description>
69
+ Sample filing.
70
+ 06_開示府令-半期報告書(第五号様式、鉄道業)
71
+ 06_Disclosure Ordinance-Semi-Annual Report (Form 5, Railway Industry)
72
+ </description>
73
+ <data>
74
+ <instance readMeFirst="true">valid06.zip</instance>
75
+ </data>
76
+ <result expected="valid"/>
77
+ </variation>
78
+ <variation id="valid07" name="valid07">
79
+ <description>
80
+ Sample filing.
81
+ 07_開示府令-発行登録書
82
+ 07_Disclosure Ordinance-Shelf Registration Statement
83
+ </description>
84
+ <data>
85
+ <instance readMeFirst="true">valid07.zip</instance>
86
+ </data>
87
+ <result expected="valid"/>
88
+ </variation>
89
+ <variation id="valid08" name="valid08">
90
+ <description>
91
+ Sample filing.
92
+ 08_開示府令-発行登録追補書類
93
+ 08_Disclosure Ordinance-Shelf Registration Supplement
94
+ </description>
95
+ <data>
96
+ <instance readMeFirst="true">valid08.zip</instance>
97
+ </data>
98
+ <result expected="valid"/>
99
+ </variation>
100
+ <variation id="valid09" name="valid09">
101
+ <description>
102
+ Sample filing.
103
+ 09_開示府令-臨時報告書
104
+ 09_Disclosure of the Government Order-Interim Report
105
+ </description>
106
+ <data>
107
+ <instance readMeFirst="true">valid09.zip</instance>
108
+ </data>
109
+ <result expected="valid"/>
110
+ </variation>
111
+ <variation id="valid10" name="valid10">
112
+ <description>
113
+ Sample filing.
114
+ 10_特定有価証券府令-有価証券届出書
115
+ 10_Specific Securities Ordinance - Securities Registration Statement
116
+ </description>
117
+ <data>
118
+ <instance readMeFirst="true">valid10.zip</instance>
119
+ </data>
120
+ <result expected="valid"/>
121
+ </variation>
122
+ <variation id="valid11" name="valid11">
123
+ <description>
124
+ Sample filing.
125
+ 11_特定有価証券府令-有価証券報告書【みなし有価証券届出書】
126
+ 11_Specific Securities Ordinance - Securities Report [Deemed Securities Registration Statement]
127
+ </description>
128
+ <data>
129
+ <instance readMeFirst="true">valid11.zip</instance>
130
+ </data>
131
+ <result expected="valid"/>
132
+ </variation>
133
+ <variation id="valid12" name="valid12">
134
+ <description>
135
+ Sample filing.
136
+ 12_特定有価証券府令-半期報告書【みなし訂正有価証券届出書】
137
+ 12_Specific Securities Ordinance - Semiannual Report [Deemed Amended Securities Registration Statement]
138
+ </description>
139
+ <data>
140
+ <instance readMeFirst="true">valid12.zip</instance>
141
+ </data>
142
+ <result expected="valid"/>
143
+ </variation>
144
+ <variation id="valid13" name="valid13">
145
+ <description>
146
+ Sample filing.
147
+ 13_特定有価証券府令-発行登録書
148
+ 13_Specific Securities Ordinance - Shelf Registration Statement
149
+ </description>
150
+ <data>
151
+ <instance readMeFirst="true">valid13.zip</instance>
152
+ </data>
153
+ <result expected="valid"/>
154
+ </variation>
155
+ <variation id="valid14" name="valid14">
156
+ <description>
157
+ Sample filing.
158
+ 14_特定有価証券府令-発行登録追補書類
159
+ 14_Specific Securities Ordinance - Shelf Registration Supplement
160
+ </description>
161
+ <data>
162
+ <instance readMeFirst="true">valid14.zip</instance>
163
+ </data>
164
+ <result expected="valid"/>
165
+ </variation>
166
+ <variation id="valid20" name="valid20">
167
+ <description>
168
+ Sample filing.
169
+ 20_開示府令-訂正有価証券報告書
170
+ 20_Disclosure Ordinance-Amendment of Securities Reports
171
+ </description>
172
+ <data>
173
+ <instance readMeFirst="true">valid20.zip</instance>
174
+ </data>
175
+ <result expected="valid"/>
176
+ </variation>
177
+ <variation id="valid21" name="valid21">
178
+ <description>
179
+ Sample filing.
180
+ 21_特定有価証券府令-訂正有価証券届出書
181
+ 21_Specific Securities Ordinance-Amendment of Securities Registration Statement
182
+ </description>
183
+ <data>
184
+ <instance readMeFirst="true">valid21.zip</instance>
185
+ </data>
186
+ <result expected="valid"/>
187
+ </variation>
188
+ <variation id="valid22" name="valid22">
189
+ <description>
190
+ Sample filing.
191
+ 22_特定有価証券府令-訂正有価証券報告書【みなし訂正有価証券届出書】
192
+ 22_Specific Securities Ordinance-Amendment of Securities Report [Deemed Amendment of Securities Registration Statement]
193
+ </description>
194
+ <data>
195
+ <instance readMeFirst="true">valid22.zip</instance>
196
+ </data>
197
+ <result expected="valid"/>
198
+ </variation>
20
199
  </testcase>
@@ -0,0 +1,27 @@
1
+ {
2
+ "EC0121E/index.xml:invalid01": 0.021397107151465426,
3
+ "EC0124E/index.xml:invalid01": 0.025065859647180982,
4
+ "EC0129E/index.xml:invalid01": 0.025710372240162902,
5
+ "EC0130E/index.xml:invalid01": 0.024780983764080007,
6
+ "EC0132E/index.xml:invalid01": 0.02462372305348644,
7
+ "EC0188E/index.xml:invalid01": 0.024174226776656742,
8
+ "valid/index.xml:valid01": 2.218586479322035,
9
+ "valid/index.xml:valid02": 1.8975368535376134,
10
+ "valid/index.xml:valid03": 2.1517138064207777,
11
+ "valid/index.xml:valid04": 1.8392213759599199,
12
+ "valid/index.xml:valid05": 1.473965575088599,
13
+ "valid/index.xml:valid06": 1.8527121706182885,
14
+ "valid/index.xml:valid07": 0.34719477053453607,
15
+ "valid/index.xml:valid08": 0.3564396889215411,
16
+ "valid/index.xml:valid09": 0.02052188435627358,
17
+ "valid/index.xml:valid10": 1.9058721497364142,
18
+ "valid/index.xml:valid11": 1.9128932407916943,
19
+ "valid/index.xml:valid12": 1.030585801767353,
20
+ "valid/index.xml:valid13": 0.06919699768273625,
21
+ "valid/index.xml:valid14": 0.07040565868529285,
22
+ "valid/index.xml:valid20": 1.8975022356808997,
23
+ "valid/index.xml:valid21": 1.8989700484311731,
24
+ "valid/index.xml:valid22": 1.9109289898318178,
25
+ "<mean>": 10.105569713860346,
26
+ "<stdev>": 9.295345555978425
27
+ }