arelle-release 2.37.41__py3-none-any.whl → 2.37.43__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.
- arelle/_version.py +2 -2
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +31 -0
- arelle/plugin/validate/EDINET/__init__.py +2 -1
- arelle/plugin/validate/EDINET/rules/contexts.py +186 -0
- arelle/plugin/validate/EDINET/rules/edinet.py +105 -50
- arelle/plugin/validate/ESEF/resources/authority-validations.json +2 -2
- arelle/plugin/validate/NL/PluginValidationDataExtension.py +1 -1
- arelle/plugin/validate/NL/rules/nl_kvk.py +1 -1
- arelle/plugin/validate/ROS/rules/ros.py +1 -1
- {arelle_release-2.37.41.dist-info → arelle_release-2.37.43.dist-info}/METADATA +1 -1
- {arelle_release-2.37.41.dist-info → arelle_release-2.37.43.dist-info}/RECORD +16 -15
- /arelle/{plugin/validate/NL/LinkbaseType.py → LinkbaseType.py} +0 -0
- {arelle_release-2.37.41.dist-info → arelle_release-2.37.43.dist-info}/WHEEL +0 -0
- {arelle_release-2.37.41.dist-info → arelle_release-2.37.43.dist-info}/entry_points.txt +0 -0
- {arelle_release-2.37.41.dist-info → arelle_release-2.37.43.dist-info}/licenses/LICENSE.md +0 -0
- {arelle_release-2.37.41.dist-info → arelle_release-2.37.43.dist-info}/top_level.txt +0 -0
arelle/_version.py
CHANGED
|
@@ -9,6 +9,8 @@ from dataclasses import dataclass
|
|
|
9
9
|
from functools import lru_cache
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
+
import regex
|
|
13
|
+
|
|
12
14
|
from arelle.ModelDocument import Type as ModelDocumentType
|
|
13
15
|
from arelle.ModelInstanceObject import ModelFact
|
|
14
16
|
from arelle.ModelObject import ModelObject
|
|
@@ -17,6 +19,7 @@ from arelle.ModelXbrl import ModelXbrl
|
|
|
17
19
|
from arelle.PrototypeDtsObject import LinkPrototype
|
|
18
20
|
from arelle.ValidateDuplicateFacts import getDeduplicatedFacts, DeduplicationType
|
|
19
21
|
from arelle.ValidateXbrl import ValidateXbrl
|
|
22
|
+
from arelle.XmlValidate import VALID
|
|
20
23
|
from arelle.typing import TypeGetText
|
|
21
24
|
from arelle.utils.PluginData import PluginData
|
|
22
25
|
from .FormType import FormType
|
|
@@ -35,15 +38,34 @@ class UploadContents:
|
|
|
35
38
|
@dataclass
|
|
36
39
|
class PluginValidationDataExtension(PluginData):
|
|
37
40
|
assetsIfrsQn: QName
|
|
41
|
+
documentTypeDeiQn: QName
|
|
42
|
+
jpcrpEsrFilingDateCoverPageQn: QName
|
|
43
|
+
jpcrpFilingDateCoverPageQn: QName
|
|
44
|
+
jpspsFilingDateCoverPageQn: QName
|
|
38
45
|
liabilitiesAndEquityIfrsQn: QName
|
|
46
|
+
nonConsolidatedMemberQn: QName
|
|
47
|
+
|
|
48
|
+
contextIdPattern: regex.Pattern[str]
|
|
39
49
|
|
|
40
50
|
_primaryModelXbrl: ModelXbrl | None = None
|
|
41
51
|
|
|
42
52
|
def __init__(self, name: str):
|
|
43
53
|
super().__init__(name)
|
|
54
|
+
jpcrpEsrNamespace = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp-esr/2024-11-01/jpcrp-esr_cor"
|
|
55
|
+
jpcrpNamespace = 'http://disclosure.edinet-fsa.go.jp/taxonomy/jpcrp/2024-11-01/jpcrp_cor'
|
|
56
|
+
jpdeiNamespace = 'http://disclosure.edinet-fsa.go.jp/taxonomy/jpdei/2013-08-31/jpdei_cor'
|
|
44
57
|
jpigpNamespace = "http://disclosure.edinet-fsa.go.jp/taxonomy/jpigp/2024-11-01/jpigp_cor"
|
|
58
|
+
jppfsNamespace = "http://disclosure.edinet-fsa.go.jp/taxonomy/jppfs/2024-11-01/jppfs_cor"
|
|
59
|
+
jpspsNamespace = 'http://disclosure.edinet-fsa.go.jp/taxonomy/jpsps/2024-11-01/jpsps_cor'
|
|
45
60
|
self.assetsIfrsQn = qname(jpigpNamespace, 'AssetsIFRS')
|
|
61
|
+
self.documentTypeDeiQn = qname(jpdeiNamespace, 'DocumentTypeDEI')
|
|
62
|
+
self.jpcrpEsrFilingDateCoverPageQn = qname(jpcrpEsrNamespace, 'FilingDateCoverPage')
|
|
63
|
+
self.jpcrpFilingDateCoverPageQn = qname(jpcrpNamespace, 'FilingDateCoverPage')
|
|
64
|
+
self.jpspsFilingDateCoverPageQn = qname(jpspsNamespace, 'FilingDateCoverPage')
|
|
46
65
|
self.liabilitiesAndEquityIfrsQn = qname(jpigpNamespace, "LiabilitiesAndEquityIFRS")
|
|
66
|
+
self.nonConsolidatedMemberQn = qname(jppfsNamespace, "NonConsolidatedMember")
|
|
67
|
+
|
|
68
|
+
self.contextIdPattern = regex.compile(r'(Prior[1-9]Year|CurrentYear|Prior[1-9]Interim|Interim)(Duration|Instant)')
|
|
47
69
|
|
|
48
70
|
# Identity hash for caching.
|
|
49
71
|
def __hash__(self) -> int:
|
|
@@ -79,6 +101,15 @@ class PluginValidationDataExtension(PluginData):
|
|
|
79
101
|
def getDeduplicatedFacts(self, modelXbrl: ModelXbrl) -> list[ModelFact]:
|
|
80
102
|
return getDeduplicatedFacts(modelXbrl, DeduplicationType.CONSISTENT_PAIRS)
|
|
81
103
|
|
|
104
|
+
@lru_cache(1)
|
|
105
|
+
def getDocumentTypes(self, modelXbrl: ModelXbrl) -> set[str]:
|
|
106
|
+
documentFacts = modelXbrl.factsByQname.get(self.documentTypeDeiQn, set())
|
|
107
|
+
documentTypes = set()
|
|
108
|
+
for fact in documentFacts:
|
|
109
|
+
if fact.xValid >= VALID:
|
|
110
|
+
documentTypes.add(fact.textValue)
|
|
111
|
+
return documentTypes
|
|
112
|
+
|
|
82
113
|
@lru_cache(1)
|
|
83
114
|
def getFootnoteLinkElements(self, modelXbrl: ModelXbrl) -> list[ModelObject | LinkPrototype]:
|
|
84
115
|
# TODO: Consolidate with similar implementations in EDGAR and FERC
|
|
@@ -15,7 +15,7 @@ from arelle.Version import authorLabel, copyrightLabel
|
|
|
15
15
|
from . import Constants
|
|
16
16
|
from .Manifest import Manifest, ManifestInstance, parseManifests
|
|
17
17
|
from .ValidationPluginExtension import ValidationPluginExtension
|
|
18
|
-
from .rules import edinet, frta, gfm, upload
|
|
18
|
+
from .rules import contexts, edinet, frta, gfm, upload
|
|
19
19
|
|
|
20
20
|
PLUGIN_NAME = "Validate EDINET"
|
|
21
21
|
DISCLOSURE_SYSTEM_VALIDATION_TYPE = "EDINET"
|
|
@@ -34,6 +34,7 @@ validationPlugin = ValidationPluginExtension(
|
|
|
34
34
|
disclosureSystemConfigUrl=Path(__file__).parent / "resources" / "config.xml",
|
|
35
35
|
validationTypes=[DISCLOSURE_SYSTEM_VALIDATION_TYPE],
|
|
36
36
|
validationRuleModules=[
|
|
37
|
+
contexts,
|
|
37
38
|
edinet,
|
|
38
39
|
frta,
|
|
39
40
|
gfm,
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"""
|
|
2
|
+
See COPYRIGHT.md for copyright information.
|
|
3
|
+
"""
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from collections import defaultdict
|
|
7
|
+
from typing import Any, Iterable
|
|
8
|
+
|
|
9
|
+
import regex
|
|
10
|
+
|
|
11
|
+
from arelle import XbrlConst
|
|
12
|
+
from arelle.ModelDtsObject import ModelConcept
|
|
13
|
+
from arelle.ValidateXbrl import ValidateXbrl
|
|
14
|
+
from arelle.typing import TypeGetText
|
|
15
|
+
from arelle.utils.PluginHooks import ValidationHook
|
|
16
|
+
from arelle.utils.validate.Decorator import validation
|
|
17
|
+
from arelle.utils.validate.Validation import Validation
|
|
18
|
+
from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
|
|
19
|
+
from ..PluginValidationDataExtension import PluginValidationDataExtension
|
|
20
|
+
|
|
21
|
+
_: TypeGetText
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
# Per "Framework Design of EDINET Taxonomy", ELR definitions contain a 6-digit
|
|
25
|
+
# can be used to categorize the ELR.
|
|
26
|
+
FINANCIAL_STATEMENT_ELR_PREFIXES = (
|
|
27
|
+
'3', # Codes starting with 3 indicate "Japanese GAAP Financial Statement"
|
|
28
|
+
'5', # Codes starting with 5 indicate "IFRS Financial Statement"
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@validation(
|
|
33
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
34
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
35
|
+
)
|
|
36
|
+
def rule_EC8013W(
|
|
37
|
+
pluginData: PluginValidationDataExtension,
|
|
38
|
+
val: ValidateXbrl,
|
|
39
|
+
*args: Any,
|
|
40
|
+
**kwargs: Any,
|
|
41
|
+
) -> Iterable[Validation]:
|
|
42
|
+
"""
|
|
43
|
+
EDINET.EC8013W: The context ID of the element associated with the financial statement
|
|
44
|
+
extended link role begins with one of the following strings:
|
|
45
|
+
Prior?YearDuration
|
|
46
|
+
CurrentYearDuration
|
|
47
|
+
Prior?YearInstant
|
|
48
|
+
CurrentYearInstant
|
|
49
|
+
InterimDuration
|
|
50
|
+
InterimInstant
|
|
51
|
+
Prior?InterimDuration
|
|
52
|
+
Prior?InterimInstant
|
|
53
|
+
Where ? is a digit from 1 to 9.
|
|
54
|
+
"""
|
|
55
|
+
financialStatementRoleTypes = set()
|
|
56
|
+
for roleUri, roleTypes in val.modelXbrl.roleTypes.items():
|
|
57
|
+
for roleType in roleTypes:
|
|
58
|
+
definition = roleType.definition
|
|
59
|
+
roleTypeCode = roleType.definition.split(' ')[0] if definition else None
|
|
60
|
+
if roleTypeCode is None:
|
|
61
|
+
continue
|
|
62
|
+
if any(roleTypeCode.startswith(prefix) for prefix in FINANCIAL_STATEMENT_ELR_PREFIXES):
|
|
63
|
+
financialStatementRoleTypes.add(roleType)
|
|
64
|
+
|
|
65
|
+
financialStatementConcepts: set[ModelConcept] = set()
|
|
66
|
+
labelsRelationshipSet = val.modelXbrl.relationshipSet(
|
|
67
|
+
XbrlConst.parentChild,
|
|
68
|
+
tuple(roleType.roleURI for roleType in financialStatementRoleTypes)
|
|
69
|
+
)
|
|
70
|
+
financialStatementConcepts.update(labelsRelationshipSet.fromModelObjects().keys())
|
|
71
|
+
financialStatementConcepts.update(labelsRelationshipSet.toModelObjects().keys())
|
|
72
|
+
|
|
73
|
+
invalidContextIdMap = defaultdict(list)
|
|
74
|
+
for fact in val.modelXbrl.facts:
|
|
75
|
+
if fact.concept not in financialStatementConcepts:
|
|
76
|
+
continue
|
|
77
|
+
if fact.contextID is None:
|
|
78
|
+
continue
|
|
79
|
+
if not pluginData.contextIdPattern.match(fact.contextID):
|
|
80
|
+
invalidContextIdMap[fact.contextID].append(fact)
|
|
81
|
+
for contextId, facts in invalidContextIdMap.items():
|
|
82
|
+
yield Validation.warning(
|
|
83
|
+
codes='EDINET.EC8013W',
|
|
84
|
+
msg=_("The context ID (id=%(contextId)s) for the element related to the extended link role "
|
|
85
|
+
"in Financial Statement is not per convention. Please set the context ID of the element "
|
|
86
|
+
"related to the extended link role of financial statements according to the rules. For "
|
|
87
|
+
"the financial statements, please refer to \"3-4-2 Setting the Context\" in the "
|
|
88
|
+
"\"Validation Guidelines\"."),
|
|
89
|
+
contextId=contextId,
|
|
90
|
+
modelObject=facts,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@validation(
|
|
95
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
96
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
97
|
+
)
|
|
98
|
+
def rule_EC8033W(
|
|
99
|
+
pluginData: PluginValidationDataExtension,
|
|
100
|
+
val: ValidateXbrl,
|
|
101
|
+
*args: Any,
|
|
102
|
+
**kwargs: Any,
|
|
103
|
+
) -> Iterable[Validation]:
|
|
104
|
+
"""
|
|
105
|
+
EDINET.EC8033W: The startDate of a context whose context ID starts with
|
|
106
|
+
"CurrentYear" is not set to a date earlier than the endDate of a context
|
|
107
|
+
whose context ID starts with "Prior1Year".
|
|
108
|
+
"""
|
|
109
|
+
priorYearContexts = [
|
|
110
|
+
context
|
|
111
|
+
for contextId, context in val.modelXbrl.contexts.items()
|
|
112
|
+
if contextId.startswith('Prior1Year')
|
|
113
|
+
and context.endDatetime is not None
|
|
114
|
+
and context.isStartEndPeriod
|
|
115
|
+
]
|
|
116
|
+
latestPriorYearContext = None
|
|
117
|
+
for priorYearContext in priorYearContexts:
|
|
118
|
+
if latestPriorYearContext is None or \
|
|
119
|
+
priorYearContext.endDatetime > latestPriorYearContext.endDatetime:
|
|
120
|
+
latestPriorYearContext = priorYearContext
|
|
121
|
+
if latestPriorYearContext is None:
|
|
122
|
+
return
|
|
123
|
+
currentYearContexts = [
|
|
124
|
+
context
|
|
125
|
+
for contextId, context in val.modelXbrl.contexts.items()
|
|
126
|
+
if contextId.startswith('CurrentYear')
|
|
127
|
+
and context.startDatetime is not None
|
|
128
|
+
and context.isStartEndPeriod
|
|
129
|
+
]
|
|
130
|
+
earliestCurrentYearContext = None
|
|
131
|
+
for currentYearContext in currentYearContexts:
|
|
132
|
+
if earliestCurrentYearContext is None or \
|
|
133
|
+
currentYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
|
|
134
|
+
earliestCurrentYearContext = currentYearContext
|
|
135
|
+
if earliestCurrentYearContext is None:
|
|
136
|
+
return
|
|
137
|
+
if latestPriorYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
|
|
138
|
+
yield Validation.warning(
|
|
139
|
+
codes='EDINET.EC8033W',
|
|
140
|
+
msg=_("The startDate element of the current year context (id=%(currentYearContextId)s) is "
|
|
141
|
+
"set to a date that is earlier than the endDate element of the prior year context "
|
|
142
|
+
"(id=%(priorYearContextId)s). Please check the corresponding context ID "
|
|
143
|
+
"%(currentYearContextId)s and %(priorYearContextId)s. Set the startDate element of "
|
|
144
|
+
"context ID %(currentYearContextId)s to a date that is later than or equal to the "
|
|
145
|
+
"endDate element of context ID %(priorYearContextId)s."),
|
|
146
|
+
currentYearContextId=earliestCurrentYearContext.id,
|
|
147
|
+
priorYearContextId=latestPriorYearContext.id,
|
|
148
|
+
modelObject=priorYearContexts + currentYearContexts,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@validation(
|
|
153
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
154
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
155
|
+
)
|
|
156
|
+
def rule_EC8054W(
|
|
157
|
+
pluginData: PluginValidationDataExtension,
|
|
158
|
+
val: ValidateXbrl,
|
|
159
|
+
*args: Any,
|
|
160
|
+
**kwargs: Any,
|
|
161
|
+
) -> Iterable[Validation]:
|
|
162
|
+
"""
|
|
163
|
+
EDINET.EC8054W: For any context with ID containing "NonConsolidatedMember",
|
|
164
|
+
the scenario element within must be set to "NonConsolidatedMember".
|
|
165
|
+
"""
|
|
166
|
+
for context in val.modelXbrl.contexts.values():
|
|
167
|
+
if pluginData.nonConsolidatedMemberQn.localName not in context.id:
|
|
168
|
+
continue
|
|
169
|
+
memberQnames = set()
|
|
170
|
+
for scenarioElt in context.iterdescendants(XbrlConst.qnXbrlScenario.clarkNotation):
|
|
171
|
+
for memberElt in scenarioElt.iterdescendants(
|
|
172
|
+
XbrlConst.qnXbrldiExplicitMember.clarkNotation,
|
|
173
|
+
XbrlConst.qnXbrldiTypedMember.clarkNotation
|
|
174
|
+
):
|
|
175
|
+
memberQnames.add(memberElt.xValue)
|
|
176
|
+
if pluginData.nonConsolidatedMemberQn not in memberQnames:
|
|
177
|
+
yield Validation.warning(
|
|
178
|
+
codes='EDINET.EC8054W',
|
|
179
|
+
msg=_("For the context ID (%(contextId)s), \"NonConsolidatedMember\" "
|
|
180
|
+
"is not set in the scenario element. Please correct the relevant "
|
|
181
|
+
"context ID and scenario element. For naming rules for context IDs, "
|
|
182
|
+
"refer to \"5-4-1 Naming Rules for Context IDs\" in the \"Guidelines "
|
|
183
|
+
"for Creating Report Instances.\""),
|
|
184
|
+
contextId=context.id,
|
|
185
|
+
modelObject=context,
|
|
186
|
+
)
|
|
@@ -7,10 +7,11 @@ from collections import defaultdict
|
|
|
7
7
|
from decimal import Decimal
|
|
8
8
|
from typing import Any, Iterable, cast
|
|
9
9
|
|
|
10
|
-
import
|
|
11
|
-
|
|
12
|
-
from arelle import
|
|
10
|
+
from arelle import XbrlConst, ValidateDuplicateFacts
|
|
11
|
+
from arelle.LinkbaseType import LinkbaseType
|
|
12
|
+
from arelle.ValidateDuplicateFacts import DuplicateType
|
|
13
13
|
from arelle.ValidateXbrl import ValidateXbrl
|
|
14
|
+
from arelle.XmlValidateConst import VALID
|
|
14
15
|
from arelle.typing import TypeGetText
|
|
15
16
|
from arelle.utils.PluginHooks import ValidationHook
|
|
16
17
|
from arelle.utils.validate.Decorator import validation
|
|
@@ -21,6 +22,34 @@ from ..PluginValidationDataExtension import PluginValidationDataExtension
|
|
|
21
22
|
_: TypeGetText
|
|
22
23
|
|
|
23
24
|
|
|
25
|
+
@validation(
|
|
26
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
27
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
28
|
+
)
|
|
29
|
+
def rule_EC1057E(
|
|
30
|
+
pluginData: PluginValidationDataExtension,
|
|
31
|
+
val: ValidateXbrl,
|
|
32
|
+
*args: Any,
|
|
33
|
+
**kwargs: Any,
|
|
34
|
+
) -> Iterable[Validation]:
|
|
35
|
+
"""
|
|
36
|
+
EDINET.EC1057E: The submission date on the cover page has not been filled in.
|
|
37
|
+
Ensure that there is a nonnil value disclosed for FilingDateCoverPage
|
|
38
|
+
Note: This rule is only applicable to the public documents.
|
|
39
|
+
"""
|
|
40
|
+
dei = pluginData.getDocumentTypes(val.modelXbrl)
|
|
41
|
+
if len(dei) > 0:
|
|
42
|
+
jpcrpEsrFacts = val.modelXbrl.factsByQname.get(pluginData.jpcrpEsrFilingDateCoverPageQn, set())
|
|
43
|
+
jpcrpFacts = val.modelXbrl.factsByQname.get(pluginData.jpcrpFilingDateCoverPageQn, set())
|
|
44
|
+
jpspsFacts = val.modelXbrl.factsByQname.get(pluginData.jpspsFilingDateCoverPageQn, set())
|
|
45
|
+
requiredFacts = jpcrpFacts.union(jpspsFacts, jpcrpEsrFacts)
|
|
46
|
+
if not any(fact.xValid >= VALID and not fact.isNil for fact in requiredFacts):
|
|
47
|
+
yield Validation.error(
|
|
48
|
+
codes='EDINET.EC1057E',
|
|
49
|
+
msg=_("The [Submission Date] on the cover page has not been filled in."),
|
|
50
|
+
)
|
|
51
|
+
|
|
52
|
+
|
|
24
53
|
@validation(
|
|
25
54
|
hook=ValidationHook.XBRL_FINALLY,
|
|
26
55
|
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
@@ -42,7 +71,7 @@ def rule_EC5002E(
|
|
|
42
71
|
errorFacts = []
|
|
43
72
|
for fact in val.modelXbrl.facts:
|
|
44
73
|
concept = fact.concept
|
|
45
|
-
if not concept.isShares:
|
|
74
|
+
if concept is None or not concept.isShares:
|
|
46
75
|
continue
|
|
47
76
|
unit = fact.unit
|
|
48
77
|
measures = unit.measures
|
|
@@ -68,60 +97,87 @@ def rule_EC5002E(
|
|
|
68
97
|
hook=ValidationHook.XBRL_FINALLY,
|
|
69
98
|
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
70
99
|
)
|
|
71
|
-
def
|
|
100
|
+
def rule_EC8024E(
|
|
72
101
|
pluginData: PluginValidationDataExtension,
|
|
73
102
|
val: ValidateXbrl,
|
|
74
103
|
*args: Any,
|
|
75
104
|
**kwargs: Any,
|
|
76
105
|
) -> Iterable[Validation]:
|
|
77
106
|
"""
|
|
78
|
-
EDINET.
|
|
79
|
-
|
|
80
|
-
|
|
107
|
+
EDINET.EC8024E: Instance values of the same element, context, and unit may not
|
|
108
|
+
have different values or different decimals attributes.
|
|
109
|
+
Correct the element with the relevant context ID. For elements in an inline XBRL file that have
|
|
110
|
+
duplicate elements, context IDs, and unit IDs, set the same values for the value and
|
|
111
|
+
decimals attribute.
|
|
81
112
|
"""
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
context
|
|
98
|
-
for contextId, context in val.modelXbrl.contexts.items()
|
|
99
|
-
if contextId.startswith('CurrentYear')
|
|
100
|
-
and context.startDatetime is not None
|
|
101
|
-
and context.isStartEndPeriod
|
|
102
|
-
]
|
|
103
|
-
earliestCurrentYearContext = None
|
|
104
|
-
for currentYearContext in currentYearContexts:
|
|
105
|
-
if earliestCurrentYearContext is None or \
|
|
106
|
-
currentYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
|
|
107
|
-
earliestCurrentYearContext = currentYearContext
|
|
108
|
-
if earliestCurrentYearContext is None:
|
|
109
|
-
return
|
|
110
|
-
if latestPriorYearContext.endDatetime > earliestCurrentYearContext.startDatetime:
|
|
111
|
-
yield Validation.warning(
|
|
112
|
-
codes='EDINET.EC8033W',
|
|
113
|
-
msg=_("The startDate element of the current year context (id=%(currentYearContextId)s) is "
|
|
114
|
-
"set to a date that is earlier than the endDate element of the prior year context "
|
|
115
|
-
"(id=%(priorYearContextId)s). Please check the corresponding context ID "
|
|
116
|
-
"%(currentYearContextId)s and %(priorYearContextId)s. Set the startDate element of "
|
|
117
|
-
"context ID %(currentYearContextId)s to a date that is later than or equal to the "
|
|
118
|
-
"endDate element of context ID %(priorYearContextId)s."),
|
|
119
|
-
currentYearContextId=earliestCurrentYearContext.id,
|
|
120
|
-
priorYearContextId=latestPriorYearContext.id,
|
|
121
|
-
modelObject=priorYearContexts + currentYearContexts,
|
|
113
|
+
duplicateFactSets = ValidateDuplicateFacts.getDuplicateFactSetsWithType(val.modelXbrl.facts, DuplicateType.INCOMPLETE)
|
|
114
|
+
for duplicateFactSet in duplicateFactSets:
|
|
115
|
+
fact = duplicateFactSet.facts[0]
|
|
116
|
+
yield Validation.error(
|
|
117
|
+
codes='EDINET.EC8024E',
|
|
118
|
+
msg=_("Instance values of the same element, context, and unit may not "
|
|
119
|
+
"have different values or different decimals attributes. <element=%(concept)s> "
|
|
120
|
+
"<contextID=%(context)s> <unit=%(unit)s>. Correct the element with the relevant "
|
|
121
|
+
"context ID. For elements in an inline XBRL file that have duplicate "
|
|
122
|
+
"elements, context IDs, and unit IDs, set the same values for the value and "
|
|
123
|
+
"decimals attribute."),
|
|
124
|
+
concept=fact.qname,
|
|
125
|
+
context=fact.contextID,
|
|
126
|
+
unit=fact.unitID,
|
|
127
|
+
modelObject=duplicateFactSet.facts,
|
|
122
128
|
)
|
|
123
129
|
|
|
124
130
|
|
|
131
|
+
@validation(
|
|
132
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
133
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
134
|
+
)
|
|
135
|
+
def rule_EC8027W(
|
|
136
|
+
pluginData: PluginValidationDataExtension,
|
|
137
|
+
val: ValidateXbrl,
|
|
138
|
+
*args: Any,
|
|
139
|
+
**kwargs: Any,
|
|
140
|
+
) -> Iterable[Validation]:
|
|
141
|
+
"""
|
|
142
|
+
EDINET.EC8027W: For presentation links and definition links, there must be
|
|
143
|
+
only one root element.
|
|
144
|
+
File name: xxx <Extended link role = yyy>
|
|
145
|
+
Please correct the extended link role of the relevant file. Please set only one
|
|
146
|
+
root element of the extended link role in the presentation link and definition link.
|
|
147
|
+
"""
|
|
148
|
+
linkbaseTypes = (LinkbaseType.PRESENTATION, LinkbaseType.DEFINITION)
|
|
149
|
+
roleTypes = [
|
|
150
|
+
roleType
|
|
151
|
+
for roleTypes in val.modelXbrl.roleTypes.values()
|
|
152
|
+
for roleType in roleTypes
|
|
153
|
+
]
|
|
154
|
+
for roleType in roleTypes:
|
|
155
|
+
for linkbaseType in linkbaseTypes:
|
|
156
|
+
if linkbaseType.getLinkQn() not in roleType.usedOns:
|
|
157
|
+
continue
|
|
158
|
+
arcroles = linkbaseType.getArcroles()
|
|
159
|
+
relSet = val.modelXbrl.relationshipSet(tuple(arcroles), roleType.roleURI)
|
|
160
|
+
relSetFrom = relSet.loadModelRelationshipsFrom()
|
|
161
|
+
rootConcepts = relSet.rootConcepts
|
|
162
|
+
if len(rootConcepts) < 2:
|
|
163
|
+
continue
|
|
164
|
+
rels = [
|
|
165
|
+
rel
|
|
166
|
+
for rootConcept in rootConcepts
|
|
167
|
+
for rel in relSetFrom[rootConcept]
|
|
168
|
+
]
|
|
169
|
+
yield Validation.warning(
|
|
170
|
+
codes='EDINET.EC8027W',
|
|
171
|
+
msg=_("For presentation links and definition links, there must be only one root element. "
|
|
172
|
+
"File name: %(filename)s <Extended link role = %(roleUri)s> "
|
|
173
|
+
"Please correct the extended link role of the relevant file. Please set only one "
|
|
174
|
+
"root element of the extended link role in the presentation link and definition link."),
|
|
175
|
+
filename=rels[0].modelDocument.basename,
|
|
176
|
+
roleUri=roleType.roleURI,
|
|
177
|
+
modelObject=rels,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
|
|
125
181
|
@validation(
|
|
126
182
|
hook=ValidationHook.XBRL_FINALLY,
|
|
127
183
|
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
@@ -136,13 +192,12 @@ def rule_EC8062W(
|
|
|
136
192
|
EDINET.EC8062W: The sum of all liabilities and equity must equal the sum of all assets.
|
|
137
193
|
"""
|
|
138
194
|
deduplicatedFacts = pluginData.getDeduplicatedFacts(val.modelXbrl)
|
|
139
|
-
contextIdPattern = regex.compile(r'^(Prior[1-9]Year|CurrentYear|Prior[1-9]Interim|Interim)(Duration|Instant)$')
|
|
140
195
|
|
|
141
196
|
factsByContextId = defaultdict(list)
|
|
142
197
|
for fact in deduplicatedFacts:
|
|
143
198
|
if fact.qname not in (pluginData.assetsIfrsQn, pluginData.liabilitiesAndEquityIfrsQn):
|
|
144
199
|
continue
|
|
145
|
-
if fact.contextID is None or not contextIdPattern.
|
|
200
|
+
if fact.contextID is None or not pluginData.contextIdPattern.fullmatch(fact.contextID):
|
|
146
201
|
continue
|
|
147
202
|
factsByContextId[fact.contextID].append(fact)
|
|
148
203
|
|
|
@@ -347,7 +347,7 @@
|
|
|
347
347
|
"name": "United Kingdom Multiple Targets",
|
|
348
348
|
"authorityName": "FRC",
|
|
349
349
|
"comment": "This is a deprecated authority that will be removed. Use UKFRC instead.",
|
|
350
|
-
"reference": "https://media.frc.org.uk/documents/XBRL_Tagging_Guide_-
|
|
350
|
+
"reference": "https://media.frc.org.uk/documents/XBRL_Tagging_Guide_-_FRC_Taxonomies_2025.pdf",
|
|
351
351
|
"reportPackageMaxMB": "150",
|
|
352
352
|
"reportPackageMeasurement": "zipped",
|
|
353
353
|
"ixTargetUsage": "allowed"
|
|
@@ -357,7 +357,7 @@
|
|
|
357
357
|
"authorityName": "FRC",
|
|
358
358
|
"comment": "Pertains to multi target UKSEF Guidance",
|
|
359
359
|
"comment2": "See UKFRC-2022 for reports prior to 2023 which did not use separate targets for FRC and ESEF",
|
|
360
|
-
"reference": "https://media.frc.org.uk/documents/XBRL_Tagging_Guide_-
|
|
360
|
+
"reference": "https://media.frc.org.uk/documents/XBRL_Tagging_Guide_-_FRC_Taxonomies_2025.pdf",
|
|
361
361
|
"reportPackageMaxMB": "150",
|
|
362
362
|
"reportPackageMeasurement": "zipped",
|
|
363
363
|
"ixTargetUsage": "allowed"
|
|
@@ -14,6 +14,7 @@ from lxml.etree import _Comment, _ElementTree, _Entity, _ProcessingInstruction,
|
|
|
14
14
|
|
|
15
15
|
from arelle import XbrlConst
|
|
16
16
|
from arelle.FunctionIxt import ixtNamespaces
|
|
17
|
+
from arelle.LinkbaseType import LinkbaseType
|
|
17
18
|
from arelle.ModelDocument import ModelDocument, Type as ModelDocumentType
|
|
18
19
|
from arelle.ModelDtsObject import ModelConcept, ModelRelationship
|
|
19
20
|
from arelle.ModelInstanceObject import ModelContext, ModelFact, ModelInlineFootnote, ModelUnit, ModelInlineFact
|
|
@@ -27,7 +28,6 @@ from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
|
|
|
27
28
|
from arelle.XbrlConst import ixbrl11, xhtmlBaseIdentifier, xmlBaseIdentifier
|
|
28
29
|
from arelle.XmlValidate import lexicalPatterns
|
|
29
30
|
from arelle.XmlValidateConst import VALID
|
|
30
|
-
from .LinkbaseType import LinkbaseType
|
|
31
31
|
|
|
32
32
|
DEFAULT_MEMBER_ROLE_URI = 'https://www.nltaxonomie.nl/kvk/role/axis-defaults'
|
|
33
33
|
XBRLI_IDENTIFIER_PATTERN = re.compile(r"^(?!00)\d{8}$")
|
|
@@ -11,6 +11,7 @@ from typing import Any, cast, TYPE_CHECKING
|
|
|
11
11
|
|
|
12
12
|
from lxml.etree import Element
|
|
13
13
|
|
|
14
|
+
from arelle.LinkbaseType import LinkbaseType
|
|
14
15
|
from arelle.ModelDtsObject import ModelConcept, ModelLink, ModelResource, ModelType
|
|
15
16
|
from arelle.ModelInstanceObject import ModelInlineFact
|
|
16
17
|
from arelle.ModelObject import ModelObject
|
|
@@ -31,7 +32,6 @@ from arelle.ValidateDuplicateFacts import getHashEquivalentFactGroups, getAspect
|
|
|
31
32
|
from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
|
|
32
33
|
from ..DisclosureSystems import (ALL_NL_INLINE_DISCLOSURE_SYSTEMS, NL_INLINE_GAAP_IFRS_DISCLOSURE_SYSTEMS,
|
|
33
34
|
NL_INLINE_GAAP_OTHER_DISCLOSURE_SYSTEMS)
|
|
34
|
-
from ..LinkbaseType import LinkbaseType
|
|
35
35
|
from ..PluginValidationDataExtension import (
|
|
36
36
|
PluginValidationDataExtension,
|
|
37
37
|
ALLOWABLE_LANGUAGES,
|
|
@@ -315,7 +315,7 @@ def rule_ros19(
|
|
|
315
315
|
|
|
316
316
|
if (largest_equity_fact is not None and
|
|
317
317
|
largest_turnover_fact is not None and
|
|
318
|
-
convertToDecimal(largest_turnover_fact.xValue)
|
|
318
|
+
convertToDecimal(largest_turnover_fact.xValue) > (10 * abs(convertToDecimal(largest_equity_fact.xValue)))):
|
|
319
319
|
yield Validation.error(
|
|
320
320
|
"ROS.19",
|
|
321
321
|
_("Turnover / Revenue (DPLTurnoverRevenue) may exceed the maximum expected value. Please review the submission and, if correct, test your submission with Revenue Online's iXBRL test facility."),
|
|
@@ -32,6 +32,7 @@ arelle/HashUtil.py,sha256=dS11q9UUUFzP7MgiuNdxFfvF3IpeyZUiOFxVFArEEWE,2963
|
|
|
32
32
|
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
|
+
arelle/LinkbaseType.py,sha256=BwRQl4XZFFCopufC2FEMLhYENNTk2JUWVQvnIUsaqtI,3108
|
|
35
36
|
arelle/LocalViewer.py,sha256=WVrfek_bLeFFxgWITi1EQb6xCQN8O9Ks-ZL16vRncSk,3080
|
|
36
37
|
arelle/Locale.py,sha256=07IDxv8nIfvhyRRllFdEAKRI3yo1D2v781cTrjb_RoQ,33193
|
|
37
38
|
arelle/ModelDocument.py,sha256=Sq6umEdn-aNHjxIpEsXTT7A4V25nGY0JiylSnhr9zSI,130749
|
|
@@ -123,7 +124,7 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
|
|
|
123
124
|
arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
|
|
124
125
|
arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
|
|
125
126
|
arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
126
|
-
arelle/_version.py,sha256=
|
|
127
|
+
arelle/_version.py,sha256=_yeUbYff5hFRJ7TaTKvPkSogzmTAov8fO5hCxibhlH4,515
|
|
127
128
|
arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
|
|
128
129
|
arelle/api/Session.py,sha256=27HVuK3Bz1_21l4_RLn1IQg6v0MNsUEYrHajymyWwxI,7429
|
|
129
130
|
arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
|
|
@@ -396,13 +397,14 @@ arelle/plugin/validate/EDINET/Constants.py,sha256=QG69rWdpIrpQzZQkRcDWk2i3rlBVoh
|
|
|
396
397
|
arelle/plugin/validate/EDINET/DisclosureSystems.py,sha256=3rKG42Eg-17Xx_KXU_V5yHW6I3LTwQunvf4a44C9k_4,36
|
|
397
398
|
arelle/plugin/validate/EDINET/FormType.py,sha256=pJfKjdjqFcRLFgH6xbEixvpwatZBBHI8uI3xjjhaPI0,3175
|
|
398
399
|
arelle/plugin/validate/EDINET/Manifest.py,sha256=VWenzA1ndOp802zpTELSLREbCrzrA-nM1UCRpRf1Q3M,4849
|
|
399
|
-
arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=
|
|
400
|
+
arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=3bGTdUI0bddAAQq4Du1sKyQobJlfCc3ZVCRSA2lfAsk,8758
|
|
400
401
|
arelle/plugin/validate/EDINET/ValidationPluginExtension.py,sha256=HIGOpBOyuVs5SEh573M3IzdouRdEuNIBkdumieZi8r0,959
|
|
401
|
-
arelle/plugin/validate/EDINET/__init__.py,sha256=
|
|
402
|
+
arelle/plugin/validate/EDINET/__init__.py,sha256=K3vsgWeLw8BBj5MJ_CUzHgSZQ6jg26VzL2Adr-mTkhc,3583
|
|
402
403
|
arelle/plugin/validate/EDINET/resources/config.xml,sha256=7uT4GcRgk5veMLpFhPPQJxbGKiQvM52P8EMrjn0qd0g,646
|
|
403
404
|
arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml,sha256=997I3RGTLg5OY3vn5hQxVFAAxOmDSOYpuyQe6VnWSY0,16285
|
|
404
405
|
arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
405
|
-
arelle/plugin/validate/EDINET/rules/
|
|
406
|
+
arelle/plugin/validate/EDINET/rules/contexts.py,sha256=feNqSFhfOxPeV0jpSdmwULtY-__eimHtclVKtCyrLZg,7715
|
|
407
|
+
arelle/plugin/validate/EDINET/rules/edinet.py,sha256=yl5kRFAsc9BKYw5TW05ghDOl2ubJROUnTIKfEQ-o1W0,9192
|
|
406
408
|
arelle/plugin/validate/EDINET/rules/frta.py,sha256=N0YglHYZuLD2IuwE26viR2ViwUYjneBuMFU9vlrS0aQ,7616
|
|
407
409
|
arelle/plugin/validate/EDINET/rules/gfm.py,sha256=4EKMho6eX-Ygl8yMBVabHQpbC-wxMvi067ubN9mp27U,21982
|
|
408
410
|
arelle/plugin/validate/EDINET/rules/upload.py,sha256=HZ-9Gk6WtIichTGcSsSGIrMXNgsgJYQYwfUKeLs1XWU,20369
|
|
@@ -417,14 +419,13 @@ arelle/plugin/validate/ESEF/ESEF_2021/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCe
|
|
|
417
419
|
arelle/plugin/validate/ESEF/ESEF_Current/DTS.py,sha256=epp-PBh1NJzQqgxUE6C468HmoDc2w3j54rMwfiOAry4,29334
|
|
418
420
|
arelle/plugin/validate/ESEF/ESEF_Current/ValidateXbrlFinally.py,sha256=J9hJcLlE6FA84Ppgthiu4ju0KHJ-JdmVub2qKAKm3as,74985
|
|
419
421
|
arelle/plugin/validate/ESEF/ESEF_Current/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
420
|
-
arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=
|
|
422
|
+
arelle/plugin/validate/ESEF/resources/authority-validations.json,sha256=_Xnqaj0pdw2QM3LhOguBHnEqbo1eutm643_SO18UJls,15487
|
|
421
423
|
arelle/plugin/validate/ESEF/resources/config.xml,sha256=t3STU_-QYM7Ay8YwZRPapnohiWVWhjfr4L2Rjx9xN9U,3902
|
|
422
424
|
arelle/plugin/validate/FERC/__init__.py,sha256=rC1OYNBWnoXowEohiR9yagHtAi_NPAlmaahRSQhSdS4,11325
|
|
423
425
|
arelle/plugin/validate/FERC/config.xml,sha256=bn9b8eCqJA1J62rYq1Nz85wJrMGAahVmmnIUQZyerjo,1919
|
|
424
426
|
arelle/plugin/validate/FERC/resources/ferc-utr.xml,sha256=OCRj9IUpdXATCBXKbB71apYx9kxcNtZW-Hq4s-avsRY,2663
|
|
425
427
|
arelle/plugin/validate/NL/DisclosureSystems.py,sha256=urRmYJ8RnGPlTgSVKW7zGN4_4CtL3OVKlcI3LwTpBz4,561
|
|
426
|
-
arelle/plugin/validate/NL/
|
|
427
|
-
arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=4yO0UlShSFk_iWxLbCZ9SHB1wuJQMcKcDGmVkHcltIY,33672
|
|
428
|
+
arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=OswvJzy5AdvIDw1N_IeWDehKbUHdOFnipy0qhjAaImw,33678
|
|
428
429
|
arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=h6CjGJJkE8YqrzPiA8uNaCzn_P6HspH-6ja89tLCXxY,17978
|
|
429
430
|
arelle/plugin/validate/NL/__init__.py,sha256=W-SHohiAWM7Yi77gAbt-D3vvZNAB5s1j16mHCTFta6w,3158
|
|
430
431
|
arelle/plugin/validate/NL/resources/config.xml,sha256=qBE6zywFSmemBSWonuTII5iuOCUlNb1nvkpMbsZb5PM,1853
|
|
@@ -433,7 +434,7 @@ arelle/plugin/validate/NL/rules/br_kvk.py,sha256=0SwKieWzTDm3YMsXPS6zTdgbk7_Z9Cz
|
|
|
433
434
|
arelle/plugin/validate/NL/rules/fg_nl.py,sha256=OJF2EYx4KDTdNggHiw5Trq5S5g7WGpbb7YvO6_IrrGU,10704
|
|
434
435
|
arelle/plugin/validate/NL/rules/fr_kvk.py,sha256=kYqXt45S6eM32Yg9ii7pUhOMfJaHurgYqQ73FyQALs8,8171
|
|
435
436
|
arelle/plugin/validate/NL/rules/fr_nl.py,sha256=vwzk6_P6jhszpeboTM09uOHtm-Lijzz7Iqu7NsYKyaE,31444
|
|
436
|
-
arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=
|
|
437
|
+
arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=bPD5lfr6dxdVGPZ2D_bEZtbz02tzsX_BZ5kC-CZJNwc,90170
|
|
437
438
|
arelle/plugin/validate/ROS/DisclosureSystems.py,sha256=rJ81mwQDYTi6JecFZ_zhqjjz3VNQRgjHNSh0wcQWAQE,18
|
|
438
439
|
arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=IV7ILhNvgKwQXqbpSA6HRNt9kEnejCyMADI3wyyIgk0,4036
|
|
439
440
|
arelle/plugin/validate/ROS/ValidationPluginExtension.py,sha256=HrLoJWHMFjou3j7ro6Ajrcab1JOgi505ZFPEM5a3QOY,776
|
|
@@ -441,7 +442,7 @@ arelle/plugin/validate/ROS/__init__.py,sha256=KuWg1MHVzA2S6eaHFptvP3Vu_5gQWf3OUY
|
|
|
441
442
|
arelle/plugin/validate/ROS/config.xml,sha256=ZCpCFgr1ZAjoUuhb1eRpDnmKrae-sXA9yl6SOWnrfm8,654
|
|
442
443
|
arelle/plugin/validate/ROS/resources/config.xml,sha256=HXWume5HlrAqOx5AtiWWqgADbRatA8YSfm_JvZGwdgQ,657
|
|
443
444
|
arelle/plugin/validate/ROS/rules/__init__.py,sha256=wW7BUAIb7sRkOxC1Amc_ZKrz03FM-Qh1TyZe6wxYaAU,1567
|
|
444
|
-
arelle/plugin/validate/ROS/rules/ros.py,sha256=
|
|
445
|
+
arelle/plugin/validate/ROS/rules/ros.py,sha256=Dk5BkfKQYItImdx5FcFvkMWT5BlJ1r_L7Vn-EsCG85A,19870
|
|
445
446
|
arelle/plugin/validate/UK/ValidateUK.py,sha256=0UhSwsY1lrY-EAEBJJR9QY38YXGBZ6PEgmuC5gQfBlI,57813
|
|
446
447
|
arelle/plugin/validate/UK/__init__.py,sha256=KE6s_B-EvrHDCtWQz2N_wQwyx_ZbWhYNV2GfQnluxMw,30655
|
|
447
448
|
arelle/plugin/validate/UK/config.xml,sha256=mUFhWDfBzGTn7v0ZSmf4HaweQTMJh_4ZcJmD9mzCHrA,1547
|
|
@@ -759,9 +760,9 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
|
|
|
759
760
|
arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
760
761
|
arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
761
762
|
arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
|
|
762
|
-
arelle_release-2.37.
|
|
763
|
-
arelle_release-2.37.
|
|
764
|
-
arelle_release-2.37.
|
|
765
|
-
arelle_release-2.37.
|
|
766
|
-
arelle_release-2.37.
|
|
767
|
-
arelle_release-2.37.
|
|
763
|
+
arelle_release-2.37.43.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
|
|
764
|
+
arelle_release-2.37.43.dist-info/METADATA,sha256=j1T8fS8zCMEJTSh6kRSHFfV5XRPqmNEPKsbOGVj6qoY,9137
|
|
765
|
+
arelle_release-2.37.43.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
766
|
+
arelle_release-2.37.43.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
|
|
767
|
+
arelle_release-2.37.43.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
|
|
768
|
+
arelle_release-2.37.43.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|