arelle-release 2.37.35__py3-none-any.whl → 2.37.36__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/FileSource.py +4 -2
- arelle/Validate.py +1 -1
- arelle/XbrlConst.py +3 -0
- arelle/_version.py +2 -2
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +26 -0
- arelle/plugin/validate/EDINET/rules/gfm.py +197 -3
- arelle/plugin/validate/ROS/rules/ros.py +4 -50
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.36.dist-info}/METADATA +1 -1
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.36.dist-info}/RECORD +13 -13
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.36.dist-info}/WHEEL +0 -0
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.36.dist-info}/entry_points.txt +0 -0
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.36.dist-info}/licenses/LICENSE.md +0 -0
- {arelle_release-2.37.35.dist-info → arelle_release-2.37.36.dist-info}/top_level.txt +0 -0
arelle/FileSource.py
CHANGED
|
@@ -119,7 +119,8 @@ class FileNamedStringIO(io.StringIO): # provide string IO in memory but behave
|
|
|
119
119
|
self.fileName = fileName
|
|
120
120
|
|
|
121
121
|
def close(self) -> None:
|
|
122
|
-
|
|
122
|
+
if hasattr(self, 'fileName'):
|
|
123
|
+
del self.fileName
|
|
123
124
|
super().close()
|
|
124
125
|
|
|
125
126
|
def __str__(self) -> str:
|
|
@@ -139,7 +140,8 @@ class FileNamedBytesIO(io.BytesIO): # provide Bytes IO in memory but behave as
|
|
|
139
140
|
self.fileName = fileName
|
|
140
141
|
|
|
141
142
|
def close(self) -> None:
|
|
142
|
-
|
|
143
|
+
if hasattr(self, 'fileName'):
|
|
144
|
+
del self.fileName
|
|
143
145
|
super().close()
|
|
144
146
|
|
|
145
147
|
def __str__(self) -> str:
|
arelle/Validate.py
CHANGED
|
@@ -764,7 +764,7 @@ class Validate:
|
|
|
764
764
|
status = "pass" if numErrors == 0 else "fail"
|
|
765
765
|
elif expected == "invalid":
|
|
766
766
|
status = "fail" if numErrors == 0 else "pass"
|
|
767
|
-
elif expected in (None, []) and numErrors == 0:
|
|
767
|
+
elif expected in (None, []) and numErrors == 0 and not expectedWarnings:
|
|
768
768
|
status = "pass"
|
|
769
769
|
elif isinstance(expected, (QName, str, dict, list)) or expectedWarnings:
|
|
770
770
|
status = "fail"
|
arelle/XbrlConst.py
CHANGED
|
@@ -55,6 +55,9 @@ qnXbrliDenominator = qname("{http://www.xbrl.org/2003/instance}xbrli:denominator
|
|
|
55
55
|
qnXbrliTuple = qname("{http://www.xbrl.org/2003/instance}xbrli:tuple")
|
|
56
56
|
qnXbrliContext = qname("{http://www.xbrl.org/2003/instance}xbrli:context")
|
|
57
57
|
qnXbrliPeriod = qname("{http://www.xbrl.org/2003/instance}xbrli:period")
|
|
58
|
+
qnXbrliStartDate = qname("{http://www.xbrl.org/2003/instance}xbrli:startDate")
|
|
59
|
+
qnXbrliEndDate = qname("{http://www.xbrl.org/2003/instance}xbrli:endDate")
|
|
60
|
+
qnXbrliInstant = qname("{http://www.xbrl.org/2003/instance}xbrli:instant")
|
|
58
61
|
qnXbrliIdentifier = qname("{http://www.xbrl.org/2003/instance}xbrli:identifier")
|
|
59
62
|
qnXbrliUnit = qname("{http://www.xbrl.org/2003/instance}xbrli:unit")
|
|
60
63
|
qnXbrliStringItemType = qname("{http://www.xbrl.org/2003/instance}xbrli:stringItemType")
|
arelle/_version.py
CHANGED
|
@@ -9,7 +9,10 @@ from dataclasses import dataclass
|
|
|
9
9
|
from functools import lru_cache
|
|
10
10
|
from pathlib import Path
|
|
11
11
|
|
|
12
|
+
from arelle.ModelDocument import Type as ModelDocumentType
|
|
13
|
+
from arelle.ModelObject import ModelObject
|
|
12
14
|
from arelle.ModelXbrl import ModelXbrl
|
|
15
|
+
from arelle.PrototypeDtsObject import LinkPrototype
|
|
13
16
|
from arelle.ValidateXbrl import ValidateXbrl
|
|
14
17
|
from arelle.typing import TypeGetText
|
|
15
18
|
from arelle.utils.PluginData import PluginData
|
|
@@ -60,6 +63,29 @@ class PluginValidationDataExtension(PluginData):
|
|
|
60
63
|
return False # Not a zipfile
|
|
61
64
|
return True
|
|
62
65
|
|
|
66
|
+
@lru_cache(1)
|
|
67
|
+
def getFootnoteLinkElements(self, modelXbrl: ModelXbrl) -> list[ModelObject | LinkPrototype]:
|
|
68
|
+
# TODO: Consolidate with similar implementations in EDGAR and FERC
|
|
69
|
+
doc = modelXbrl.modelDocument
|
|
70
|
+
if doc is None:
|
|
71
|
+
return []
|
|
72
|
+
if doc.type in (ModelDocumentType.INLINEXBRL, ModelDocumentType.INLINEXBRLDOCUMENTSET):
|
|
73
|
+
elts = (linkPrototype
|
|
74
|
+
for linkKey, links in modelXbrl.baseSets.items()
|
|
75
|
+
for linkPrototype in links
|
|
76
|
+
if linkPrototype.modelDocument.type in (ModelDocumentType.INLINEXBRL, ModelDocumentType.INLINEXBRLDOCUMENTSET)
|
|
77
|
+
and linkKey[1] and linkKey[2] and linkKey[3] # fully specified roles
|
|
78
|
+
and linkKey[0] != "XBRL-footnotes")
|
|
79
|
+
else:
|
|
80
|
+
rootElt = doc.xmlDocument.getroot()
|
|
81
|
+
elts = rootElt.iterdescendants(tag="{http://www.xbrl.org/2003/linkbase}footnoteLink")
|
|
82
|
+
return [
|
|
83
|
+
elt
|
|
84
|
+
for elt in elts
|
|
85
|
+
if isinstance(elt, (ModelObject, LinkPrototype))
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
|
|
63
89
|
def getUploadFileSizes(self, modelXbrl: ModelXbrl) -> dict[Path, int]:
|
|
64
90
|
"""
|
|
65
91
|
Get the sizes of files in the upload directory.
|
|
@@ -3,21 +3,30 @@ See COPYRIGHT.md for copyright information.
|
|
|
3
3
|
"""
|
|
4
4
|
from __future__ import annotations
|
|
5
5
|
|
|
6
|
-
from
|
|
7
|
-
|
|
6
|
+
from typing import Any, cast, Iterable
|
|
7
|
+
|
|
8
|
+
import regex
|
|
8
9
|
|
|
9
10
|
from arelle import XbrlConst, XmlUtil
|
|
11
|
+
from arelle.ModelObject import ModelObject
|
|
12
|
+
from arelle.PrototypeDtsObject import LocPrototype, ArcPrototype
|
|
10
13
|
from arelle.UrlUtil import isHttpUrl, splitDecodeFragment
|
|
11
14
|
from arelle.ValidateXbrl import ValidateXbrl
|
|
15
|
+
from arelle.ValidateXbrlCalcs import insignificantDigits
|
|
16
|
+
from arelle.XbrlConst import xhtmlBaseIdentifier, xmlBaseIdentifier
|
|
17
|
+
from arelle.XmlValidate import VALID
|
|
12
18
|
from arelle.typing import TypeGetText
|
|
13
19
|
from arelle.utils.PluginHooks import ValidationHook
|
|
14
20
|
from arelle.utils.validate.Decorator import validation
|
|
15
21
|
from arelle.utils.validate.Validation import Validation
|
|
22
|
+
from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
|
|
16
23
|
from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
|
|
17
24
|
from ..PluginValidationDataExtension import PluginValidationDataExtension
|
|
18
25
|
|
|
19
26
|
_: TypeGetText
|
|
20
27
|
|
|
28
|
+
GFM_CONTEXT_DATE_PATTERN = regex.compile(r"^[12][0-9]{3}-[01][0-9]-[0-3][0-9]$")
|
|
29
|
+
|
|
21
30
|
|
|
22
31
|
@validation(
|
|
23
32
|
hook=ValidationHook.XBRL_FINALLY,
|
|
@@ -64,7 +73,7 @@ def rule_gfm_1_1_3(
|
|
|
64
73
|
continue # Valid external URL
|
|
65
74
|
if not any(scheme == "element" for scheme, __ in XmlUtil.xpointerSchemes(hrefId)):
|
|
66
75
|
continue # Valid shorthand xpointer
|
|
67
|
-
yield Validation.
|
|
76
|
+
yield Validation.warning(
|
|
68
77
|
codes='EDINET.EC5700W.GFM.1.1.3',
|
|
69
78
|
msg=_("The URI content of the xlink:href attribute, the xsi:schemaLocation "
|
|
70
79
|
"attribute and the schemaLocation attribute must be relative and "
|
|
@@ -74,3 +83,188 @@ def rule_gfm_1_1_3(
|
|
|
74
83
|
uri=uri,
|
|
75
84
|
modelObject=elt,
|
|
76
85
|
)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
@validation(
|
|
89
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
90
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
91
|
+
)
|
|
92
|
+
def rule_gfm_1_1_7(
|
|
93
|
+
pluginData: PluginValidationDataExtension,
|
|
94
|
+
val: ValidateXbrl,
|
|
95
|
+
*args: Any,
|
|
96
|
+
**kwargs: Any,
|
|
97
|
+
) -> Iterable[Validation]:
|
|
98
|
+
"""
|
|
99
|
+
EDINET.EC5700W: [GFM 1.1.7] Attribute xml:base must not appear in any filing document.
|
|
100
|
+
This check has been updated to check for the xhtml:base attribute in order to account for iXBRL filings.
|
|
101
|
+
|
|
102
|
+
Original GFM text: Attribute xml:base must not appear in any filing document.
|
|
103
|
+
"""
|
|
104
|
+
baseElements = []
|
|
105
|
+
for rootElt in val.modelXbrl.ixdsHtmlElements:
|
|
106
|
+
for uncast_elt, depth in etreeIterWithDepth(rootElt):
|
|
107
|
+
elt = cast(Any, uncast_elt)
|
|
108
|
+
if elt.get(xmlBaseIdentifier) is not None:
|
|
109
|
+
baseElements.append(elt)
|
|
110
|
+
if elt.tag == xhtmlBaseIdentifier:
|
|
111
|
+
baseElements.append(elt)
|
|
112
|
+
if len(baseElements) > 0:
|
|
113
|
+
yield Validation.warning(
|
|
114
|
+
codes='EDINET.EC5700W.GFM.1.1.7',
|
|
115
|
+
msg=_("Attribute xml:base must not appear in any filing document."),
|
|
116
|
+
modelObject=baseElements,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
@validation(
|
|
121
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
122
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
123
|
+
)
|
|
124
|
+
def rule_gfm_1_2_16(
|
|
125
|
+
pluginData: PluginValidationDataExtension,
|
|
126
|
+
val: ValidateXbrl,
|
|
127
|
+
*args: Any,
|
|
128
|
+
**kwargs: Any,
|
|
129
|
+
) -> Iterable[Validation]:
|
|
130
|
+
"""
|
|
131
|
+
EDINET.EC5700W: [GFM 1.2.16] Use the decimals attribute instead of the precision attribute.
|
|
132
|
+
|
|
133
|
+
Original GFM text: The xbrli:xbrl element must not have any facts with the precision attribute.
|
|
134
|
+
"""
|
|
135
|
+
errors = []
|
|
136
|
+
for fact in val.modelXbrl.facts:
|
|
137
|
+
concept = fact.concept
|
|
138
|
+
if concept is None:
|
|
139
|
+
continue
|
|
140
|
+
if not concept.isNumeric:
|
|
141
|
+
continue
|
|
142
|
+
if fact.precision is not None:
|
|
143
|
+
errors.append(fact)
|
|
144
|
+
if len(errors) > 0:
|
|
145
|
+
yield Validation.warning(
|
|
146
|
+
codes='EDINET.EC5700W.GFM.1.2.16',
|
|
147
|
+
msg=_("Use the decimals attribute instead of the precision attribute."),
|
|
148
|
+
modelObject=errors,
|
|
149
|
+
)
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
@validation(
|
|
153
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
154
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
155
|
+
)
|
|
156
|
+
def rule_gfm_1_2_22(
|
|
157
|
+
pluginData: PluginValidationDataExtension,
|
|
158
|
+
val: ValidateXbrl,
|
|
159
|
+
*args: Any,
|
|
160
|
+
**kwargs: Any,
|
|
161
|
+
) -> Iterable[Validation]:
|
|
162
|
+
"""
|
|
163
|
+
EDINET.EC5700W: [GFM 1.2.22] In your taxonomy, do not expand the
|
|
164
|
+
xlink:arcrole attribute of the link:footnoteArc element. Modify the value
|
|
165
|
+
of the xlink:arcrole attribute to "http://www.xbrl.org/2003/arcrole/fact-footnote".
|
|
166
|
+
|
|
167
|
+
Original GFM text: The xlink:arcrole attribute of a link:footnoteArc element must
|
|
168
|
+
be defined in the XBRL Specification 2.1 or declared in a standard taxonomy schema.
|
|
169
|
+
"""
|
|
170
|
+
errors = []
|
|
171
|
+
for elt in pluginData.getFootnoteLinkElements(val.modelXbrl):
|
|
172
|
+
for child in elt:
|
|
173
|
+
if not isinstance(child, (ModelObject, LocPrototype, ArcPrototype)):
|
|
174
|
+
continue
|
|
175
|
+
xlinkType = child.get(XbrlConst.qnXlinkType.clarkNotation)
|
|
176
|
+
if xlinkType == "arc":
|
|
177
|
+
arcrole = child.get(XbrlConst.qnXlinkArcRole.clarkNotation)
|
|
178
|
+
if arcrole != XbrlConst.factFootnote:
|
|
179
|
+
errors.append(child)
|
|
180
|
+
if len(errors) > 0:
|
|
181
|
+
yield Validation.warning(
|
|
182
|
+
codes='EDINET.EC5700W.GFM.1.2.22',
|
|
183
|
+
msg=_("Do not use extension arcroles for the link:footnoteArc element. "
|
|
184
|
+
"Use the standard 'http://www.xbrl.org/2003/arcrole/fact-footnote' arcrole instead."),
|
|
185
|
+
modelObject=errors,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
@validation(
|
|
190
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
191
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
192
|
+
)
|
|
193
|
+
def rule_gfm_1_2_25(
|
|
194
|
+
pluginData: PluginValidationDataExtension,
|
|
195
|
+
val: ValidateXbrl,
|
|
196
|
+
*args: Any,
|
|
197
|
+
**kwargs: Any,
|
|
198
|
+
) -> Iterable[Validation]:
|
|
199
|
+
"""
|
|
200
|
+
EDINET.EC5700W: [GFM 1.2.25] Set the date in the period element in the
|
|
201
|
+
following format: YYYY-MM-DD.
|
|
202
|
+
|
|
203
|
+
Original GFM text: Dates in period element of the context must comply with
|
|
204
|
+
yyyy-mm-dd format. No time is allowed in the value for dates.
|
|
205
|
+
"""
|
|
206
|
+
errors = []
|
|
207
|
+
for context in val.modelXbrl.contexts.values():
|
|
208
|
+
for elt in context.iterdescendants(
|
|
209
|
+
XbrlConst.qnXbrliStartDate.clarkNotation,
|
|
210
|
+
XbrlConst.qnXbrliEndDate.clarkNotation,
|
|
211
|
+
XbrlConst.qnXbrliInstant.clarkNotation
|
|
212
|
+
):
|
|
213
|
+
dateText = XmlUtil.text(elt)
|
|
214
|
+
if not GFM_CONTEXT_DATE_PATTERN.match(dateText):
|
|
215
|
+
errors.append(elt)
|
|
216
|
+
if len(errors) > 0:
|
|
217
|
+
yield Validation.warning(
|
|
218
|
+
codes='EDINET.EC5700W.GFM.1.2.25',
|
|
219
|
+
msg=_("Set the date in the period element in the following "
|
|
220
|
+
"format: YYYY-MM-DD."),
|
|
221
|
+
modelObject=errors,
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
|
|
225
|
+
@validation(
|
|
226
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
227
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
228
|
+
)
|
|
229
|
+
def rule_gfm_1_2_26(
|
|
230
|
+
pluginData: PluginValidationDataExtension,
|
|
231
|
+
val: ValidateXbrl,
|
|
232
|
+
*args: Any,
|
|
233
|
+
**kwargs: Any,
|
|
234
|
+
) -> Iterable[Validation]:
|
|
235
|
+
"""
|
|
236
|
+
EDINET.EC5700W: [GFM 1.2.26] The decimals attribute value must not cause truncation of
|
|
237
|
+
non-zero digits in the fact value. Update the fact value to match the precision of
|
|
238
|
+
the decimals attribute, or update the decimals attribute.
|
|
239
|
+
|
|
240
|
+
Original GFM text: The decimals attribute value must not cause non-zero digits in
|
|
241
|
+
the fact value to be changed to zero.
|
|
242
|
+
"""
|
|
243
|
+
errors = []
|
|
244
|
+
for fact in val.modelXbrl.facts:
|
|
245
|
+
if (
|
|
246
|
+
fact.context is None or
|
|
247
|
+
fact.concept is None or
|
|
248
|
+
fact.concept.type is None or
|
|
249
|
+
getattr(fact,"xValid", 0) < VALID or
|
|
250
|
+
fact.isNil or
|
|
251
|
+
not fact.isNumeric or
|
|
252
|
+
not fact.decimals or
|
|
253
|
+
fact.decimals == "INF"
|
|
254
|
+
):
|
|
255
|
+
continue
|
|
256
|
+
try:
|
|
257
|
+
insignificance = insignificantDigits(fact.xValue, decimals=fact.decimals)
|
|
258
|
+
if insignificance is not None:
|
|
259
|
+
errors.append(fact)
|
|
260
|
+
except (ValueError,TypeError):
|
|
261
|
+
errors.append(fact)
|
|
262
|
+
if len(errors) > 0:
|
|
263
|
+
yield Validation.warning(
|
|
264
|
+
codes='EDINET.EC5700W.GFM.1.2.26',
|
|
265
|
+
msg=_("The decimals attribute value must not cause truncation of "
|
|
266
|
+
"non-zero digits in the fact value. Update the fact value to "
|
|
267
|
+
"match the precision of the decimals attribute, or update the"
|
|
268
|
+
"decimals attribute."),
|
|
269
|
+
modelObject=errors,
|
|
270
|
+
)
|
|
@@ -296,67 +296,21 @@ def rule_main(
|
|
|
296
296
|
@validation(
|
|
297
297
|
hook=ValidationHook.XBRL_FINALLY,
|
|
298
298
|
)
|
|
299
|
-
def
|
|
299
|
+
def rule_ros20(
|
|
300
300
|
pluginData: PluginValidationDataExtension,
|
|
301
301
|
val: ValidateXbrl,
|
|
302
302
|
*args: Any,
|
|
303
303
|
**kwargs: Any,
|
|
304
304
|
) -> Iterable[Validation]:
|
|
305
305
|
"""
|
|
306
|
-
ROS: Rule
|
|
307
|
-
"""
|
|
308
|
-
non_nil_profit_loss_fact_exists = any(
|
|
309
|
-
not fact.isNil for fact in val.modelXbrl.factsByLocalName.get(IE_PROFIT_LOSS, set())
|
|
310
|
-
)
|
|
311
|
-
non_nil_profit_loss_ordinary_fact_exists = any(
|
|
312
|
-
not fact.isNil for fact in val.modelXbrl.factsByLocalName.get(IE_PROFIT_LOSS_ORDINARY, set())
|
|
313
|
-
)
|
|
314
|
-
if not non_nil_profit_loss_fact_exists and not non_nil_profit_loss_ordinary_fact_exists:
|
|
315
|
-
yield Validation.error(
|
|
316
|
-
codes='ROS.6',
|
|
317
|
-
msg=_("Profit or Loss Before Tax (uk gaap:ProfitLossOnOrdinaryActivitiesBeforeTax) is missing."),
|
|
318
|
-
modelObject=val.modelXbrl
|
|
319
|
-
)
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
@validation(
|
|
323
|
-
hook=ValidationHook.XBRL_FINALLY,
|
|
324
|
-
)
|
|
325
|
-
def rule_ros18(
|
|
326
|
-
pluginData: PluginValidationDataExtension,
|
|
327
|
-
val: ValidateXbrl,
|
|
328
|
-
*args: Any,
|
|
329
|
-
**kwargs: Any,
|
|
330
|
-
) -> Iterable[Validation]:
|
|
331
|
-
"""
|
|
332
|
-
ROS: Rule 18: DPLTurnoverRevenue cannot be a negative value.
|
|
333
|
-
"""
|
|
334
|
-
return errorOnNegativeFact(
|
|
335
|
-
val.modelXbrl,
|
|
336
|
-
conceptLn=TURNOVER_REVENUE,
|
|
337
|
-
code='ROS.18',
|
|
338
|
-
message=_("Turnover / Revenue cannot be a negative value.")
|
|
339
|
-
)
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
@validation(
|
|
343
|
-
hook=ValidationHook.XBRL_FINALLY,
|
|
344
|
-
)
|
|
345
|
-
def rule_ros19(
|
|
346
|
-
pluginData: PluginValidationDataExtension,
|
|
347
|
-
val: ValidateXbrl,
|
|
348
|
-
*args: Any,
|
|
349
|
-
**kwargs: Any,
|
|
350
|
-
) -> Iterable[Validation]:
|
|
351
|
-
"""
|
|
352
|
-
ROS: Rule 19:PrincipalCurrencyUsedInBusinessReport must exist and its value must match the unit
|
|
306
|
+
ROS: Rule 20:PrincipalCurrencyUsedInBusinessReport must exist and its value must match the unit
|
|
353
307
|
used for the majority of monetary facts.
|
|
354
308
|
"""
|
|
355
309
|
principal_currency_facts = val.modelXbrl.factsByLocalName.get(PRINCIPAL_CURRENCY, set())
|
|
356
310
|
principal_currency_values = set(fact.text for fact in principal_currency_facts)
|
|
357
311
|
if len(principal_currency_values) != 1:
|
|
358
312
|
yield Validation.error(
|
|
359
|
-
"ROS.
|
|
313
|
+
"ROS.20",
|
|
360
314
|
_("'PrincipalCurrencyUsedInBusinessReport' must exist and have a single value. Values found: %(principal_currency_values)s."),
|
|
361
315
|
modelObject=principal_currency_facts,
|
|
362
316
|
principal_currency_values=principal_currency_values,
|
|
@@ -370,7 +324,7 @@ def rule_ros19(
|
|
|
370
324
|
for unit, count in unit_counts.items():
|
|
371
325
|
if count > principal_currency_value_count:
|
|
372
326
|
yield Validation.warning(
|
|
373
|
-
"ROS.
|
|
327
|
+
"ROS.20",
|
|
374
328
|
_("'PrincipalCurrencyUsedInBusinessReport' has a value of %(principal_currency_value)s, "
|
|
375
329
|
"which must match the functional(majority) unit of the financial statement."),
|
|
376
330
|
modelObject=principal_currency_facts,
|
|
@@ -21,7 +21,7 @@ arelle/DialogRssWatch.py,sha256=mjc4pqyFDISY4tQtME0uSRQ3NlcWnNsOsMu9Zj8tTd0,1378
|
|
|
21
21
|
arelle/DialogURL.py,sha256=JH88OPFf588E8RW90uMaieok7A_4kOAURQ8kHWVhnao,4354
|
|
22
22
|
arelle/DialogUserPassword.py,sha256=kWPlCCihhwvsykDjanME9qBDtv6cxZlsrJyoMqiRep4,13769
|
|
23
23
|
arelle/DisclosureSystem.py,sha256=mQlz8eezPpJuG6gHBV-x4-5Hne3LVh8TQf-Qm9jiFxI,24757
|
|
24
|
-
arelle/FileSource.py,sha256=
|
|
24
|
+
arelle/FileSource.py,sha256=asaX2wM47T7S6kELwmXm-YjGIoV6poWz_YdYThY0lpk,47983
|
|
25
25
|
arelle/FunctionCustom.py,sha256=d1FsBG14eykvpLpgaXpN8IdxnlG54dfGcsXPYfdpA9Q,5880
|
|
26
26
|
arelle/FunctionFn.py,sha256=BcZKah1rpfquSVPwjvknM1pgFXOnK4Hr1e_ArG_mcJY,38058
|
|
27
27
|
arelle/FunctionIxt.py,sha256=8JELGh1l4o8Ul4_G7JgwX8Ebch9it2DblI6OkfL33Cw,80082
|
|
@@ -65,7 +65,7 @@ arelle/UITkTable.py,sha256=N83cXi5c0lLZLsDbwSKcPrlYoUoGsNavGN5YRx6d9XY,39810
|
|
|
65
65
|
arelle/UiUtil.py,sha256=3G0xPclZI8xW_XQDbiFrmylB7Nd5muqi5n2x2oMkMZU,34218
|
|
66
66
|
arelle/Updater.py,sha256=IZ8cq44Rq88WbQcB1VOpMA6bxdfZxfYQ8rgu9Ehpbes,7448
|
|
67
67
|
arelle/UrlUtil.py,sha256=HrxZSG59EUMGMMGmWPuZkPi5-0BGqY3jAMkp7V4IdZo,32400
|
|
68
|
-
arelle/Validate.py,sha256=
|
|
68
|
+
arelle/Validate.py,sha256=YQUr2t2lyuQJD4ygfKgbj7grON-Od5pYfkjFVS5XuDM,58049
|
|
69
69
|
arelle/ValidateDuplicateFacts.py,sha256=L556J1Dhz4ZmsMlRNoDCMpFgDQYiryd9vuBYDvE0Aq8,21769
|
|
70
70
|
arelle/ValidateFilingText.py,sha256=xnXc0xgdNiHQk0eyP7VSSpvw7qr-pRFRwqqoUb569is,54051
|
|
71
71
|
arelle/ValidateInfoset.py,sha256=Rz_XBi5Ha43KpxXYhjLolURcWVx5qmqyjLxw48Yt9Dg,20396
|
|
@@ -114,7 +114,7 @@ arelle/ViewWinVersReport.py,sha256=aYfsOgynVZpMzl6f2EzQCBLzdihYGycwb5SiTghkgMQ,9
|
|
|
114
114
|
arelle/ViewWinXml.py,sha256=4ZGKtjaoCwU9etKYm9ZAS7jSmUxba1rqNEdv0OIyjTY,1250
|
|
115
115
|
arelle/WatchRss.py,sha256=5Ih4igH2MM4hpOuAXy9eO0QAyZ7jZR3S5bPzo2sdFpw,14097
|
|
116
116
|
arelle/WebCache.py,sha256=HlF4vfjxO0bSFHqMPfjnmkrzc7RK9XT714a7g3XFTDY,45192
|
|
117
|
-
arelle/XbrlConst.py,sha256=
|
|
117
|
+
arelle/XbrlConst.py,sha256=T8Cvogf1j2I5aws7ZDwLmCj6zcYwxUZIk9ZXDYwHfxU,58164
|
|
118
118
|
arelle/XbrlUtil.py,sha256=s2Vmrh-sZI5TeuqsziKignOc3ao-uUgnCNoelP4dDj0,9212
|
|
119
119
|
arelle/XhtmlValidate.py,sha256=0gtm7N-kXK0RB5o3c1AQXjfFuRp1w2fKZZAeyruNANw,5727
|
|
120
120
|
arelle/XmlUtil.py,sha256=1VToOOylF8kbEorEdZLThmq35j9bmuF_DS2q9NthnHU,58774
|
|
@@ -123,7 +123,7 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
|
|
|
123
123
|
arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
|
|
124
124
|
arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
|
|
125
125
|
arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
126
|
-
arelle/_version.py,sha256=
|
|
126
|
+
arelle/_version.py,sha256=qE1JoU23iZVZMuNLXnlDRaP4Udr6pvevq0c9sMilUZ4,515
|
|
127
127
|
arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
|
|
128
128
|
arelle/api/Session.py,sha256=27HVuK3Bz1_21l4_RLn1IQg6v0MNsUEYrHajymyWwxI,7429
|
|
129
129
|
arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
|
|
@@ -396,7 +396,7 @@ arelle/plugin/validate/EDINET/Constants.py,sha256=QG69rWdpIrpQzZQkRcDWk2i3rlBVoh
|
|
|
396
396
|
arelle/plugin/validate/EDINET/DisclosureSystems.py,sha256=3rKG42Eg-17Xx_KXU_V5yHW6I3LTwQunvf4a44C9k_4,36
|
|
397
397
|
arelle/plugin/validate/EDINET/FormType.py,sha256=pJfKjdjqFcRLFgH6xbEixvpwatZBBHI8uI3xjjhaPI0,3175
|
|
398
398
|
arelle/plugin/validate/EDINET/Manifest.py,sha256=VWenzA1ndOp802zpTELSLREbCrzrA-nM1UCRpRf1Q3M,4849
|
|
399
|
-
arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=
|
|
399
|
+
arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=vJPs5GgNJbRUBTKP0ULMb4UqvDoGATPC9dTFsKG4HyI,6347
|
|
400
400
|
arelle/plugin/validate/EDINET/ValidationPluginExtension.py,sha256=HIGOpBOyuVs5SEh573M3IzdouRdEuNIBkdumieZi8r0,959
|
|
401
401
|
arelle/plugin/validate/EDINET/__init__.py,sha256=ew9Rc2qJe5d3XvOOFzhX6MfzxNUtxIYfxRGX-wkfR1c,3555
|
|
402
402
|
arelle/plugin/validate/EDINET/resources/config.xml,sha256=GmLcW7UIj5koXJkN19P6Nq5EZJcs6gKQLQ5f2V6u78w,614
|
|
@@ -404,7 +404,7 @@ arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml,sha256=997I3RGTLg5
|
|
|
404
404
|
arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
405
405
|
arelle/plugin/validate/EDINET/rules/edinet.py,sha256=hm5T8PiQbOKP58BiSV9UFvKQX10uNBpxUZ06ORSU1cE,2117
|
|
406
406
|
arelle/plugin/validate/EDINET/rules/frta.py,sha256=l7BQHOenDjYrpCX6bsXyUHgyvkjbfvJWfbpBthCHmBI,1713
|
|
407
|
-
arelle/plugin/validate/EDINET/rules/gfm.py,sha256=
|
|
407
|
+
arelle/plugin/validate/EDINET/rules/gfm.py,sha256=EYOPRzJrjp9taPFm53vn7e4CEq0rgIps4_bEslSZJWo,10392
|
|
408
408
|
arelle/plugin/validate/EDINET/rules/upload.py,sha256=HZ-9Gk6WtIichTGcSsSGIrMXNgsgJYQYwfUKeLs1XWU,20369
|
|
409
409
|
arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
|
|
410
410
|
arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
|
|
@@ -441,7 +441,7 @@ arelle/plugin/validate/ROS/__init__.py,sha256=KuWg1MHVzA2S6eaHFptvP3Vu_5gQWf3OUY
|
|
|
441
441
|
arelle/plugin/validate/ROS/config.xml,sha256=ZCpCFgr1ZAjoUuhb1eRpDnmKrae-sXA9yl6SOWnrfm8,654
|
|
442
442
|
arelle/plugin/validate/ROS/resources/config.xml,sha256=HXWume5HlrAqOx5AtiWWqgADbRatA8YSfm_JvZGwdgQ,657
|
|
443
443
|
arelle/plugin/validate/ROS/rules/__init__.py,sha256=wW7BUAIb7sRkOxC1Amc_ZKrz03FM-Qh1TyZe6wxYaAU,1567
|
|
444
|
-
arelle/plugin/validate/ROS/rules/ros.py,sha256=
|
|
444
|
+
arelle/plugin/validate/ROS/rules/ros.py,sha256=Vv7qKMmhBEuPu7y_g0sjiDLnm5VXXz6EVdzonJbCUtg,18436
|
|
445
445
|
arelle/plugin/validate/UK/ValidateUK.py,sha256=0UhSwsY1lrY-EAEBJJR9QY38YXGBZ6PEgmuC5gQfBlI,57813
|
|
446
446
|
arelle/plugin/validate/UK/__init__.py,sha256=KE6s_B-EvrHDCtWQz2N_wQwyx_ZbWhYNV2GfQnluxMw,30655
|
|
447
447
|
arelle/plugin/validate/UK/config.xml,sha256=mUFhWDfBzGTn7v0ZSmf4HaweQTMJh_4ZcJmD9mzCHrA,1547
|
|
@@ -756,9 +756,9 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
|
|
|
756
756
|
arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
757
757
|
arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
758
758
|
arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
|
|
759
|
-
arelle_release-2.37.
|
|
760
|
-
arelle_release-2.37.
|
|
761
|
-
arelle_release-2.37.
|
|
762
|
-
arelle_release-2.37.
|
|
763
|
-
arelle_release-2.37.
|
|
764
|
-
arelle_release-2.37.
|
|
759
|
+
arelle_release-2.37.36.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
|
|
760
|
+
arelle_release-2.37.36.dist-info/METADATA,sha256=O21K0JV03vScH1fAs0RomXYXTEyz-r135EHcUNJbaI8,9137
|
|
761
|
+
arelle_release-2.37.36.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
762
|
+
arelle_release-2.37.36.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
|
|
763
|
+
arelle_release-2.37.36.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
|
|
764
|
+
arelle_release-2.37.36.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|