arelle-release 2.37.59__py3-none-any.whl → 2.37.60__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/Constants.py +2 -0
- arelle/plugin/validate/EDINET/PluginValidationDataExtension.py +19 -16
- arelle/plugin/validate/EDINET/Statement.py +2 -2
- arelle/plugin/validate/EDINET/rules/edinet.py +20 -7
- arelle/plugin/validate/EDINET/rules/gfm.py +132 -6
- arelle/plugin/validate/EDINET/rules/upload.py +21 -3
- {arelle_release-2.37.59.dist-info → arelle_release-2.37.60.dist-info}/METADATA +2 -2
- {arelle_release-2.37.59.dist-info → arelle_release-2.37.60.dist-info}/RECORD +13 -13
- {arelle_release-2.37.59.dist-info → arelle_release-2.37.60.dist-info}/WHEEL +0 -0
- {arelle_release-2.37.59.dist-info → arelle_release-2.37.60.dist-info}/entry_points.txt +0 -0
- {arelle_release-2.37.59.dist-info → arelle_release-2.37.60.dist-info}/licenses/LICENSE.md +0 -0
- {arelle_release-2.37.59.dist-info → arelle_release-2.37.60.dist-info}/top_level.txt +0 -0
arelle/_version.py
CHANGED
|
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
|
|
|
28
28
|
commit_id: COMMIT_ID
|
|
29
29
|
__commit_id__: COMMIT_ID
|
|
30
30
|
|
|
31
|
-
__version__ = version = '2.37.
|
|
32
|
-
__version_tuple__ = version_tuple = (2, 37,
|
|
31
|
+
__version__ = version = '2.37.60'
|
|
32
|
+
__version_tuple__ = version_tuple = (2, 37, 60)
|
|
33
33
|
|
|
34
34
|
__commit_id__ = commit_id = None
|
|
@@ -11,6 +11,8 @@ class AccountingStandard(Enum):
|
|
|
11
11
|
US_GAAP = 'US GAAP'
|
|
12
12
|
|
|
13
13
|
|
|
14
|
+
domainItemTypeQname = qname("{http://www.xbrl.org/dtr/type/non-numeric}nonnum:domainItemType")
|
|
15
|
+
|
|
14
16
|
qnEdinetManifestInsert = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}insert")
|
|
15
17
|
qnEdinetManifestInstance = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}instance")
|
|
16
18
|
qnEdinetManifestItem = qname("{http://disclosure.edinet-fsa.go.jp/2013/manifest}item")
|
|
@@ -42,8 +42,6 @@ from .UploadContents import UploadContents
|
|
|
42
42
|
_: TypeGetText
|
|
43
43
|
|
|
44
44
|
|
|
45
|
-
_DEBIT_QNAME_PATTERN = regex.compile('.*(Liability|Liabilities|Equity)')
|
|
46
|
-
|
|
47
45
|
STANDARD_TAXONOMY_URL_PREFIXES = frozenset((
|
|
48
46
|
'http://disclosure.edinet-fsa.go.jp/taxonomy/',
|
|
49
47
|
'https://disclosure.edinet-fsa.go.jp/taxonomy/',
|
|
@@ -172,12 +170,6 @@ class PluginValidationDataExtension(PluginData):
|
|
|
172
170
|
fileSourcePath = fullPath.relative_to(basePath)
|
|
173
171
|
controllerPluginData.addUsedFilepath(fileSourcePath)
|
|
174
172
|
|
|
175
|
-
def _isDebitConcept(self, concept: ModelConcept) -> bool:
|
|
176
|
-
"""
|
|
177
|
-
:return: Whether the given concept is a debit concept.
|
|
178
|
-
"""
|
|
179
|
-
return bool(_DEBIT_QNAME_PATTERN.match(concept.qname.localName))
|
|
180
|
-
|
|
181
173
|
@lru_cache(1)
|
|
182
174
|
def isCorporateForm(self, modelXbrl: ModelXbrl) -> bool:
|
|
183
175
|
formTypes = self.getFormTypes(modelXbrl)
|
|
@@ -247,23 +239,23 @@ class PluginValidationDataExtension(PluginData):
|
|
|
247
239
|
for (contextId, unitId), facts in factsByContextIdAndUnitId.items():
|
|
248
240
|
if not self._contextMatchesStatement(modelXbrl, contextId, statement):
|
|
249
241
|
continue
|
|
250
|
-
|
|
251
|
-
|
|
242
|
+
creditSum = Decimal(0)
|
|
243
|
+
debitSum = Decimal(0)
|
|
252
244
|
for fact in facts:
|
|
253
245
|
if isinstance(fact.xValue, float):
|
|
254
246
|
value = Decimal(fact.xValue)
|
|
255
247
|
else:
|
|
256
248
|
value = cast(Decimal, fact.xValue)
|
|
257
|
-
if
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
249
|
+
if fact.concept.balance == "debit":
|
|
250
|
+
debitSum += value
|
|
251
|
+
elif fact.concept.balance == "credit":
|
|
252
|
+
creditSum += value
|
|
261
253
|
balanceSheets.append(
|
|
262
254
|
BalanceSheet(
|
|
263
|
-
|
|
255
|
+
creditSum=creditSum,
|
|
264
256
|
contextId=str(contextId),
|
|
265
257
|
facts=facts,
|
|
266
|
-
|
|
258
|
+
debitSum=debitSum,
|
|
267
259
|
unitId=str(unitId),
|
|
268
260
|
)
|
|
269
261
|
)
|
|
@@ -481,6 +473,17 @@ class PluginValidationDataExtension(PluginData):
|
|
|
481
473
|
def isStandardTaxonomyUrl(self, uri: str, modelXbrl: ModelXbrl) -> bool:
|
|
482
474
|
return modelXbrl.modelManager.disclosureSystem.hrefValidForDisclosureSystem(uri)
|
|
483
475
|
|
|
476
|
+
def iterCoverPages(self, modelXbrl: ModelXbrl) -> Iterable[ModelDocument]:
|
|
477
|
+
uploadContents = self.getUploadContents(modelXbrl)
|
|
478
|
+
if uploadContents is None:
|
|
479
|
+
return
|
|
480
|
+
for url, doc in modelXbrl.urlDocs.items():
|
|
481
|
+
path = Path(url)
|
|
482
|
+
pathInfo = uploadContents.uploadPathsByFullPath.get(path)
|
|
483
|
+
if pathInfo is None or not pathInfo.isCoverPage:
|
|
484
|
+
continue
|
|
485
|
+
yield doc
|
|
486
|
+
|
|
484
487
|
def iterFacts(self, modelXbrl: ModelXbrl, qname: QName) -> Iterable[ModelFact]:
|
|
485
488
|
yield from modelXbrl.factsByQname.get(qname, set())
|
|
486
489
|
|
|
@@ -101,10 +101,10 @@ class Statement:
|
|
|
101
101
|
|
|
102
102
|
@dataclass(frozen=True)
|
|
103
103
|
class BalanceSheet:
|
|
104
|
-
|
|
104
|
+
creditSum: Decimal
|
|
105
105
|
contextId: str
|
|
106
106
|
facts: list[ModelFact]
|
|
107
|
-
|
|
107
|
+
debitSum: Decimal
|
|
108
108
|
unitId: str
|
|
109
109
|
|
|
110
110
|
|
|
@@ -44,7 +44,7 @@ def rule_balances(
|
|
|
44
44
|
for statementInstance in pluginData.getStatementInstances(val.modelXbrl):
|
|
45
45
|
statement = statementInstance.statement
|
|
46
46
|
for balanceSheet in statementInstance.balanceSheets:
|
|
47
|
-
if balanceSheet.
|
|
47
|
+
if balanceSheet.creditSum == balanceSheet.debitSum:
|
|
48
48
|
continue
|
|
49
49
|
code = None
|
|
50
50
|
if statement.statementType == StatementType.BALANCE_SHEET:
|
|
@@ -62,15 +62,15 @@ def rule_balances(
|
|
|
62
62
|
codes=code,
|
|
63
63
|
msg=_("The %(consolidated)s %(balanceSheet)s is not balanced. "
|
|
64
64
|
"The sum of all liabilities and equity must equal the sum of all assets. "
|
|
65
|
-
"Please correct the debit (%(
|
|
65
|
+
"Please correct the debit (%(debitSum)s) and credit (%(creditSum)s) "
|
|
66
66
|
"values so that they match "
|
|
67
67
|
"<roleUri=%(roleUri)s> <contextID=%(contextId)s> <unitID=%(unitId)s>."),
|
|
68
68
|
consolidated=_("consolidated") if statement.isConsolidated
|
|
69
69
|
else _("nonconsolidated"),
|
|
70
70
|
balanceSheet=_("balance sheet") if statement.statementType == StatementType.BALANCE_SHEET
|
|
71
71
|
else _("statement of financial position"),
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
debitSum=f"{balanceSheet.debitSum:,}",
|
|
73
|
+
creditSum=f"{balanceSheet.creditSum:,}",
|
|
74
74
|
roleUri=statement.roleUri,
|
|
75
75
|
contextId=balanceSheet.contextId,
|
|
76
76
|
unitId=balanceSheet.unitId,
|
|
@@ -93,14 +93,27 @@ def rule_EC1057E(
|
|
|
93
93
|
Ensure that there is a nonnil value disclosed for FilingDateCoverPage
|
|
94
94
|
Note: This rule is only applicable to the public documents.
|
|
95
95
|
"""
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
facts = [
|
|
97
|
+
fact
|
|
98
|
+
for qname in (
|
|
99
|
+
pluginData.jpcrpEsrFilingDateCoverPageQn,
|
|
100
|
+
pluginData.jpcrpFilingDateCoverPageQn,
|
|
101
|
+
pluginData.jpspsFilingDateCoverPageQn
|
|
102
|
+
)
|
|
103
|
+
for fact in pluginData.iterValidNonNilFacts(val.modelXbrl, qname)
|
|
104
|
+
]
|
|
105
|
+
for modelDocument in pluginData.iterCoverPages(val.modelXbrl):
|
|
106
|
+
if any(fact.modelDocument == modelDocument for fact in facts):
|
|
107
|
+
continue
|
|
98
108
|
if not (pluginData.hasValidNonNilFact(val.modelXbrl, pluginData.jpcrpEsrFilingDateCoverPageQn)
|
|
99
109
|
or pluginData.hasValidNonNilFact(val.modelXbrl, pluginData.jpcrpFilingDateCoverPageQn)
|
|
100
110
|
or pluginData.hasValidNonNilFact(val.modelXbrl, pluginData.jpspsFilingDateCoverPageQn)):
|
|
101
111
|
yield Validation.error(
|
|
102
112
|
codes='EDINET.EC1057E',
|
|
103
|
-
msg=_("
|
|
113
|
+
msg=_("There is no submission date ('【提出日】') on the cover page. "
|
|
114
|
+
"File name: '%(file)s'. "
|
|
115
|
+
"Please add '【提出日】' to the relevant file."),
|
|
116
|
+
file=modelDocument.basename,
|
|
104
117
|
)
|
|
105
118
|
|
|
106
119
|
|
|
@@ -28,7 +28,7 @@ from arelle.utils.Units import getDuplicateUnitGroups
|
|
|
28
28
|
from arelle.utils.validate.Decorator import validation
|
|
29
29
|
from arelle.utils.validate.Validation import Validation
|
|
30
30
|
from arelle.utils.validate.ValidationUtil import etreeIterWithDepth
|
|
31
|
-
from ..Constants import NUMERIC_LABEL_ROLES
|
|
31
|
+
from ..Constants import NUMERIC_LABEL_ROLES, domainItemTypeQname
|
|
32
32
|
from ..DisclosureSystems import (DISCLOSURE_SYSTEM_EDINET)
|
|
33
33
|
from ..PluginValidationDataExtension import PluginValidationDataExtension
|
|
34
34
|
|
|
@@ -676,6 +676,35 @@ def rule_gfm_1_3_8(
|
|
|
676
676
|
)
|
|
677
677
|
|
|
678
678
|
|
|
679
|
+
@validation(
|
|
680
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
681
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
682
|
+
)
|
|
683
|
+
def rule_gfm_1_3_19(
|
|
684
|
+
pluginData: PluginValidationDataExtension,
|
|
685
|
+
val: ValidateXbrl,
|
|
686
|
+
*args: Any,
|
|
687
|
+
**kwargs: Any,
|
|
688
|
+
) -> Iterable[Validation]:
|
|
689
|
+
"""
|
|
690
|
+
EDINET.EC5700W: [GFM 1.3.19] The id attribute of the element defined in the submitter-specific taxonomy
|
|
691
|
+
should be set in the following format:{namespace prefix}_{element name}.
|
|
692
|
+
"""
|
|
693
|
+
improperlyFormattedIds = set()
|
|
694
|
+
for concept in pluginData.getExtensionConcepts(val.modelXbrl):
|
|
695
|
+
prefix = concept.qname.prefix or ""
|
|
696
|
+
name = concept.qname.localName
|
|
697
|
+
requiredId = f"{prefix}_{name}"
|
|
698
|
+
if concept.id != requiredId or not prefix:
|
|
699
|
+
improperlyFormattedIds.add(concept)
|
|
700
|
+
if len(improperlyFormattedIds) > 0:
|
|
701
|
+
yield Validation.warning(
|
|
702
|
+
codes='EDINET.EC5700W.GFM.1.3.19',
|
|
703
|
+
msg=_("The id attribute of the element defined in the submitter-specific taxonomy should be set in the following format: {namespace prefix}_{element name}"),
|
|
704
|
+
modelObject=improperlyFormattedIds
|
|
705
|
+
)
|
|
706
|
+
|
|
707
|
+
|
|
679
708
|
@validation(
|
|
680
709
|
hook=ValidationHook.XBRL_FINALLY,
|
|
681
710
|
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
@@ -858,10 +887,13 @@ def rule_gfm_1_5_6(
|
|
|
858
887
|
labelRels = labelRelationshipSet.fromModelObject(concept)
|
|
859
888
|
for rel in labelRels:
|
|
860
889
|
label = rel.toModelObject
|
|
861
|
-
if label
|
|
890
|
+
if (label is not None and
|
|
891
|
+
label.role != XbrlConst.documentationLabel and
|
|
892
|
+
label.viewText() is not None and
|
|
893
|
+
len(label.viewText()) >= 511):
|
|
862
894
|
yield Validation.warning(
|
|
863
895
|
codes='EDINET.EC5700W.GFM.1.5.6',
|
|
864
|
-
msg=_("The concept of '%(concept)s' has a label classified as '%(role)s' that is
|
|
896
|
+
msg=_("The concept of '%(concept)s' has a label classified as '%(role)s' that is greater than or equal to 511 characters: %(label)s"),
|
|
865
897
|
concept=concept.qname,
|
|
866
898
|
role=label.role,
|
|
867
899
|
label=label.viewText(),
|
|
@@ -890,7 +922,7 @@ def rule_gfm_1_5_7(
|
|
|
890
922
|
labelRels = labelRelationshipSet.fromModelObject(concept)
|
|
891
923
|
for rel in labelRels:
|
|
892
924
|
label = rel.toModelObject
|
|
893
|
-
if label.role != XbrlConst.documentationLabel and label.textValue is not None:
|
|
925
|
+
if label is not None and label.role != XbrlConst.documentationLabel and label.textValue is not None:
|
|
894
926
|
if '<' in label.textValue:
|
|
895
927
|
yield Validation.warning(
|
|
896
928
|
codes='EDINET.EC5700W.GFM.1.5.7',
|
|
@@ -931,7 +963,7 @@ def rule_gfm_1_5_8(
|
|
|
931
963
|
labelRels = labelRelationshipSet.fromModelObject(concept)
|
|
932
964
|
for rel in labelRels:
|
|
933
965
|
label = rel.toModelObject
|
|
934
|
-
if label.textValue is not None and label.textValue != label.textValue.strip():
|
|
966
|
+
if label is not None and label.textValue is not None and label.textValue != label.textValue.strip():
|
|
935
967
|
yield Validation.warning(
|
|
936
968
|
codes='EDINET.EC5700W.GFM.1.5.8',
|
|
937
969
|
msg=_("The concept of '%(concept)s' has a label that contains disallowed white space either at the begining or the end: '%(label)s'"),
|
|
@@ -963,7 +995,9 @@ def rule_gfm_1_5_10(
|
|
|
963
995
|
labelRels = labelRelationshipSet.fromModelObject(concept)
|
|
964
996
|
for rel in labelRels:
|
|
965
997
|
label = rel.toModelObject
|
|
966
|
-
if
|
|
998
|
+
if (label is not None and
|
|
999
|
+
not pluginData.isStandardTaxonomyUrl(label.modelDocument.uri, val.modelXbrl) and
|
|
1000
|
+
label.role in NUMERIC_LABEL_ROLES):
|
|
967
1001
|
yield Validation.warning(
|
|
968
1002
|
codes='EDINET.EC5700W.GFM.1.5.10',
|
|
969
1003
|
msg=_("The non-numeric concept of '%(concept)s' has a label with a numeric role of '%(labelrole)s'"),
|
|
@@ -1207,3 +1241,95 @@ def rule_gfm_1_8_1(
|
|
|
1207
1241
|
msg=_("The definition relationship is missing the order attribute"),
|
|
1208
1242
|
modelObject=rel
|
|
1209
1243
|
)
|
|
1244
|
+
|
|
1245
|
+
|
|
1246
|
+
@validation(
|
|
1247
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
1248
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
1249
|
+
)
|
|
1250
|
+
def rule_gfm_1_8_3(
|
|
1251
|
+
pluginData: PluginValidationDataExtension,
|
|
1252
|
+
val: ValidateXbrl,
|
|
1253
|
+
*args: Any,
|
|
1254
|
+
**kwargs: Any,
|
|
1255
|
+
) -> Iterable[Validation]:
|
|
1256
|
+
"""
|
|
1257
|
+
EDINET.EC5700W: [GFM 1.8.3] The target of an effective arc with an xlink:arcrole attribute equal to
|
|
1258
|
+
"http://xbrl.org/int/dim/arcrole/dimension-domain" or
|
|
1259
|
+
"http://xbrl.org/int/arcrole/dimension-default" must be of type
|
|
1260
|
+
nonnum:domainItemType.
|
|
1261
|
+
"""
|
|
1262
|
+
dimensionRelationshipSet = val.modelXbrl.relationshipSet((XbrlConst.dimensionDomain, XbrlConst.dimensionDefault))
|
|
1263
|
+
if dimensionRelationshipSet is None:
|
|
1264
|
+
return
|
|
1265
|
+
for rel in dimensionRelationshipSet.modelRelationships:
|
|
1266
|
+
toConcept = rel.toModelObject
|
|
1267
|
+
if toConcept is not None and toConcept.typeQname != domainItemTypeQname:
|
|
1268
|
+
yield Validation.warning(
|
|
1269
|
+
codes='EDINET.EC5700W.GFM.1.8.3',
|
|
1270
|
+
msg=_("The definition relationship target concept of '%(concept)s' has a type of '%(type)s' instead of 'nonnum:domainItemType'."),
|
|
1271
|
+
concept=toConcept.qname,
|
|
1272
|
+
type=toConcept.typeQname,
|
|
1273
|
+
modelObject=rel
|
|
1274
|
+
)
|
|
1275
|
+
|
|
1276
|
+
|
|
1277
|
+
@validation(
|
|
1278
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
1279
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
1280
|
+
)
|
|
1281
|
+
def rule_gfm_1_8_10(
|
|
1282
|
+
pluginData: PluginValidationDataExtension,
|
|
1283
|
+
val: ValidateXbrl,
|
|
1284
|
+
*args: Any,
|
|
1285
|
+
**kwargs: Any,
|
|
1286
|
+
) -> Iterable[Validation]:
|
|
1287
|
+
"""
|
|
1288
|
+
EDINET.EC5700W: [GFM 1.8.10] Definition relationships must have unique order attributes
|
|
1289
|
+
"""
|
|
1290
|
+
definitionRelationshipSet = val.modelXbrl.relationshipSet(tuple(LinkbaseType.DEFINITION.getArcroles()))
|
|
1291
|
+
if definitionRelationshipSet is None:
|
|
1292
|
+
return
|
|
1293
|
+
for modelObject, rels in definitionRelationshipSet.loadModelRelationshipsFrom().items():
|
|
1294
|
+
if len(rels) <= 1:
|
|
1295
|
+
continue
|
|
1296
|
+
relsByOrder = defaultdict(list)
|
|
1297
|
+
for rel in rels:
|
|
1298
|
+
order = rel.arcElement.get("order")
|
|
1299
|
+
if order is not None:
|
|
1300
|
+
relsByOrder[(order, rel.linkrole, rel.arcrole)].append(rel)
|
|
1301
|
+
for key, orderRels in relsByOrder.items():
|
|
1302
|
+
if len(orderRels) > 1:
|
|
1303
|
+
yield Validation.warning(
|
|
1304
|
+
codes='EDINET.EC5700W.GFM.1.8.10',
|
|
1305
|
+
msg=_("The definition relationships have the same order attribute: '%(order)s'"),
|
|
1306
|
+
order=key[0],
|
|
1307
|
+
modelObject=orderRels
|
|
1308
|
+
)
|
|
1309
|
+
|
|
1310
|
+
|
|
1311
|
+
@validation(
|
|
1312
|
+
hook=ValidationHook.XBRL_FINALLY,
|
|
1313
|
+
disclosureSystems=[DISCLOSURE_SYSTEM_EDINET],
|
|
1314
|
+
)
|
|
1315
|
+
def rule_gfm_1_8_11(
|
|
1316
|
+
pluginData: PluginValidationDataExtension,
|
|
1317
|
+
val: ValidateXbrl,
|
|
1318
|
+
*args: Any,
|
|
1319
|
+
**kwargs: Any,
|
|
1320
|
+
) -> Iterable[Validation]:
|
|
1321
|
+
"""
|
|
1322
|
+
EDINET.EC5700W: [GFM 1.8.11] Definition relationships can not have the xbrldt:usable attribute set to False
|
|
1323
|
+
"""
|
|
1324
|
+
definitionRelationshipSet = val.modelXbrl.relationshipSet(tuple(LinkbaseType.DEFINITION.getArcroles()))
|
|
1325
|
+
if definitionRelationshipSet is None:
|
|
1326
|
+
return
|
|
1327
|
+
for rel in definitionRelationshipSet.modelRelationships:
|
|
1328
|
+
if rel.arcrole in [XbrlConst.dimensionDomain, XbrlConst.domainMember]:
|
|
1329
|
+
continue
|
|
1330
|
+
if not rel.isUsable:
|
|
1331
|
+
yield Validation.warning(
|
|
1332
|
+
codes='EDINET.EC5700W.GFM.1.8.11',
|
|
1333
|
+
msg=_("The definition relationship can not have the xbrldt:usable attribute set to False"),
|
|
1334
|
+
modelObject=rel
|
|
1335
|
+
)
|
|
@@ -271,19 +271,37 @@ def rule_EC0132E(
|
|
|
271
271
|
**kwargs: Any,
|
|
272
272
|
) -> Iterable[Validation]:
|
|
273
273
|
"""
|
|
274
|
-
EDINET.EC0132E:
|
|
274
|
+
EDINET.EC0132E: Cover page or manifest file is missing.
|
|
275
|
+
|
|
276
|
+
Note: Cover page is not required in AuditDoc.
|
|
275
277
|
"""
|
|
276
278
|
uploadContents = pluginData.getUploadContents()
|
|
277
279
|
if uploadContents is None:
|
|
278
280
|
return
|
|
279
281
|
for reportFolderType, paths in uploadContents.reports.items():
|
|
280
282
|
if reportFolderType.isAttachment:
|
|
283
|
+
# These rules don't apply to "Attach" directories
|
|
281
284
|
continue
|
|
282
|
-
|
|
285
|
+
coverPageFound = False
|
|
286
|
+
manifestFound = False
|
|
287
|
+
for path in paths:
|
|
288
|
+
pathInfo = uploadContents.uploadPathsByPath[path]
|
|
289
|
+
if pathInfo.isCoverPage:
|
|
290
|
+
coverPageFound = True
|
|
291
|
+
if path == reportFolderType.manifestPath:
|
|
292
|
+
manifestFound = True
|
|
293
|
+
if not coverPageFound and reportFolderType != ReportFolderType.AUDIT_DOC:
|
|
294
|
+
yield Validation.error(
|
|
295
|
+
codes='EDINET.EC0132E',
|
|
296
|
+
msg=_("Cover page does not exist in '%(expectedManifestDirectory)s'. "
|
|
297
|
+
"Please store the cover file directly under the relevant folder and upload it again. "),
|
|
298
|
+
expectedManifestDirectory=str(reportFolderType.manifestPath.parent),
|
|
299
|
+
)
|
|
300
|
+
if not manifestFound:
|
|
283
301
|
yield Validation.error(
|
|
284
302
|
codes='EDINET.EC0132E',
|
|
285
303
|
msg=_("'%(expectedManifestName)s' does not exist in '%(expectedManifestDirectory)s'. "
|
|
286
|
-
"Please store the manifest file
|
|
304
|
+
"Please store the manifest file directly under the relevant folder and upload it again. "),
|
|
287
305
|
expectedManifestName=reportFolderType.manifestPath.name,
|
|
288
306
|
expectedManifestDirectory=str(reportFolderType.manifestPath.parent),
|
|
289
307
|
)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: arelle-release
|
|
3
|
-
Version: 2.37.
|
|
3
|
+
Version: 2.37.60
|
|
4
4
|
Summary: An open source XBRL platform.
|
|
5
5
|
Author-email: "arelle.org" <support@arelle.org>
|
|
6
6
|
License-Expression: Apache-2.0
|
|
@@ -59,7 +59,7 @@ Requires-Dist: tinycss2<2,>=1; extra == "esef"
|
|
|
59
59
|
Provides-Extra: objectmaker
|
|
60
60
|
Requires-Dist: graphviz<1,>=0; extra == "objectmaker"
|
|
61
61
|
Provides-Extra: webserver
|
|
62
|
-
Requires-Dist: cheroot<
|
|
62
|
+
Requires-Dist: cheroot<12,>=8; extra == "webserver"
|
|
63
63
|
Requires-Dist: tornado<7,>=6; extra == "webserver"
|
|
64
64
|
Provides-Extra: xule
|
|
65
65
|
Requires-Dist: aniso8601<11,>=10; extra == "xule"
|
|
@@ -125,7 +125,7 @@ arelle/XmlValidateConst.py,sha256=U_wN0Q-nWKwf6dKJtcu_83FXPn9c6P8JjzGA5b0w7P0,33
|
|
|
125
125
|
arelle/XmlValidateParticles.py,sha256=Mn6vhFl0ZKC_vag1mBwn1rH_x2jmlusJYqOOuxFPO2k,9231
|
|
126
126
|
arelle/XmlValidateSchema.py,sha256=6frtZOc1Yrx_5yYF6V6oHbScnglWrVbWr6xW4EHtLQI,7428
|
|
127
127
|
arelle/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
128
|
-
arelle/_version.py,sha256=
|
|
128
|
+
arelle/_version.py,sha256=koFp4Z0c56Yr9CtycRp6LnXPGQS-w-XkLeKmAMM0VDM,708
|
|
129
129
|
arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
|
|
130
130
|
arelle/api/Session.py,sha256=kgSxS7VckA1sQ7xp0pJiK7IK-vRxAdAZKUo8gEx27s8,7549
|
|
131
131
|
arelle/config/creationSoftwareNames.json,sha256=5MK7XUjfDJ9OpRCCHXeOErJ1SlTBZji4WEcEOdOacx0,3128
|
|
@@ -312,16 +312,16 @@ arelle/plugin/validate/DBA/rules/tm.py,sha256=ui9oKBqlAForwkQ9kk9KBiUogTJE5pv1Rb
|
|
|
312
312
|
arelle/plugin/validate/DBA/rules/tr.py,sha256=4TootFjl0HXsKZk1XNBCyj-vnjRs4lg35hfiz_b_4wU,14684
|
|
313
313
|
arelle/plugin/validate/EBA/__init__.py,sha256=x3zXNcdSDJ3kHfL7kMs0Ve0Vs9oWbzNFVf1TK4Avmy8,45924
|
|
314
314
|
arelle/plugin/validate/EBA/config.xml,sha256=37wMVUAObK-XEqakqD8zPNog20emYt4a_yfL1AKubF8,2022
|
|
315
|
-
arelle/plugin/validate/EDINET/Constants.py,sha256=
|
|
315
|
+
arelle/plugin/validate/EDINET/Constants.py,sha256=I8d-oc9wG-mImV-3Cv3tInP3QjfWO7DeltbuOepyF58,2514
|
|
316
316
|
arelle/plugin/validate/EDINET/ControllerPluginData.py,sha256=1WhiS0RdrxeXz4pGDzWATEPqCopOh2spr8Z6Qra_Psk,8420
|
|
317
317
|
arelle/plugin/validate/EDINET/CoverPageRequirements.py,sha256=ZR8pk1CQfUIi15as1zVF27W0kRlUF1M_Ygw7appDUno,4488
|
|
318
318
|
arelle/plugin/validate/EDINET/DisclosureSystems.py,sha256=3rKG42Eg-17Xx_KXU_V5yHW6I3LTwQunvf4a44C9k_4,36
|
|
319
319
|
arelle/plugin/validate/EDINET/FilingFormat.py,sha256=SFZ22zFk6RVIA9dpx3iVLlf2heKfZZqt2ZUXUje4BII,18789
|
|
320
320
|
arelle/plugin/validate/EDINET/FormType.py,sha256=jFqjJACJJ4HhkY1t6Fqei0z6rgvH3Mp-dP04KwQVv3Q,2517
|
|
321
321
|
arelle/plugin/validate/EDINET/ManifestInstance.py,sha256=o6BGlaQHSsn6D0VKH4zn59UscKnjTKlo99kSGfGdYlU,6910
|
|
322
|
-
arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=
|
|
322
|
+
arelle/plugin/validate/EDINET/PluginValidationDataExtension.py,sha256=iA72MJv4r5hhLY5w9YBqQ279RI6ndivXGW-PqqK5rJM,22663
|
|
323
323
|
arelle/plugin/validate/EDINET/ReportFolderType.py,sha256=Q-9a-5tJfhK-cjY8WUB2AT1NI-Nn9cFtARVOIJoLRGU,2979
|
|
324
|
-
arelle/plugin/validate/EDINET/Statement.py,sha256=
|
|
324
|
+
arelle/plugin/validate/EDINET/Statement.py,sha256=CGq8c647pIEBQtOv8AL0U4knT8HofOdK8IaUjHrcOYU,9331
|
|
325
325
|
arelle/plugin/validate/EDINET/UploadContents.py,sha256=o29mDoX48M3S2jQqrJO4ZaulltAPt4vD-qdsWTMCUPc,1196
|
|
326
326
|
arelle/plugin/validate/EDINET/ValidationPluginExtension.py,sha256=8LNqvXzNaWP54dShEjet5ely4BnM8ByCSyimKpUx3_s,2577
|
|
327
327
|
arelle/plugin/validate/EDINET/__init__.py,sha256=T_p2phcMw1lR4J1X4gvqJPEcZNJdJXtaPpc159A-3_8,3298
|
|
@@ -330,11 +330,11 @@ arelle/plugin/validate/EDINET/resources/cover-page-requirements.csv,sha256=8ILKN
|
|
|
330
330
|
arelle/plugin/validate/EDINET/resources/edinet-taxonomies.xml,sha256=997I3RGTLg5OY3vn5hQxVFAAxOmDSOYpuyQe6VnWSY0,16285
|
|
331
331
|
arelle/plugin/validate/EDINET/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
332
332
|
arelle/plugin/validate/EDINET/rules/contexts.py,sha256=KPoyWfRaURvxoGVcWP64mTMTAKPMSmQSX06RClCLddw,7590
|
|
333
|
-
arelle/plugin/validate/EDINET/rules/edinet.py,sha256=
|
|
333
|
+
arelle/plugin/validate/EDINET/rules/edinet.py,sha256=1dHYl0nqZ5ql0SaE9Jj95fGegOMlssQNayeebV0iCJQ,13118
|
|
334
334
|
arelle/plugin/validate/EDINET/rules/frta.py,sha256=N0YglHYZuLD2IuwE26viR2ViwUYjneBuMFU9vlrS0aQ,7616
|
|
335
|
-
arelle/plugin/validate/EDINET/rules/gfm.py,sha256=
|
|
335
|
+
arelle/plugin/validate/EDINET/rules/gfm.py,sha256=Khiipm6s98RxScd_caU_xpbzFDAnfNy925iDxtCV5zs,50915
|
|
336
336
|
arelle/plugin/validate/EDINET/rules/manifests.py,sha256=MoT9R_a4BzuYdQVbF7RC5wz134Ve68svSdJ3NlpO_AU,4026
|
|
337
|
-
arelle/plugin/validate/EDINET/rules/upload.py,sha256=
|
|
337
|
+
arelle/plugin/validate/EDINET/rules/upload.py,sha256=YdjVIRTO9Zrmdprx-y0uo6MzHP7YLYYItwbR8AjP_fE,48731
|
|
338
338
|
arelle/plugin/validate/ESEF/Const.py,sha256=JujF_XV-_TNsxjGbF-8SQS4OOZIcJ8zhCMnr-C1O5Ho,22660
|
|
339
339
|
arelle/plugin/validate/ESEF/Dimensions.py,sha256=MOJM7vwNPEmV5cu-ZzPrhx3347ZvxgD6643OB2HRnIk,10597
|
|
340
340
|
arelle/plugin/validate/ESEF/Util.py,sha256=QH3btcGqBpr42M7WSKZLSdNXygZaZLfEiEjlxoG21jE,7950
|
|
@@ -684,9 +684,9 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
|
|
|
684
684
|
arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
685
685
|
arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
686
686
|
arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
|
|
687
|
-
arelle_release-2.37.
|
|
688
|
-
arelle_release-2.37.
|
|
689
|
-
arelle_release-2.37.
|
|
690
|
-
arelle_release-2.37.
|
|
691
|
-
arelle_release-2.37.
|
|
692
|
-
arelle_release-2.37.
|
|
687
|
+
arelle_release-2.37.60.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
|
|
688
|
+
arelle_release-2.37.60.dist-info/METADATA,sha256=raUd5lPyMS3Tio2TTVEQ5W-W4Ha-IBqpWvJN3o2jOCc,9327
|
|
689
|
+
arelle_release-2.37.60.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
690
|
+
arelle_release-2.37.60.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
|
|
691
|
+
arelle_release-2.37.60.dist-info/top_level.txt,sha256=fwU7SYawL4_r-sUMRg7r1nYVGjFMSDvRWx8VGAXEw7w,7
|
|
692
|
+
arelle_release-2.37.60.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|