ixbrl-viewer 1.4.21__py3-none-any.whl → 1.4.50__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 ixbrl-viewer might be problematic. Click here for more details.
- iXBRLViewerPlugin/__init__.py +77 -49
- iXBRLViewerPlugin/_version.py +2 -2
- iXBRLViewerPlugin/constants.py +86 -1
- iXBRLViewerPlugin/featureConfig.py +4 -1
- iXBRLViewerPlugin/iXBRLViewer.py +210 -137
- iXBRLViewerPlugin/plugin.py +7 -0
- iXBRLViewerPlugin/viewer/dist/ixbrlviewer.js +1 -1
- iXBRLViewerPlugin/viewer/dist/ixbrlviewer.js.LICENSE.txt +9 -2
- iXBRLViewerPlugin/viewer/i18next-parser.config.js +1 -1
- iXBRLViewerPlugin/viewer/src/data/utr.json +1 -0
- iXBRLViewerPlugin/viewer/src/html/fact-details.html +69 -38
- iXBRLViewerPlugin/viewer/src/html/footer-logo.html +4 -0
- iXBRLViewerPlugin/viewer/src/html/footnote-details.html +1 -1
- iXBRLViewerPlugin/viewer/src/html/inspector.html +324 -211
- iXBRLViewerPlugin/viewer/src/i18n/cy/balancetypes.json +1 -0
- iXBRLViewerPlugin/viewer/src/i18n/cy/currencies.json +13 -0
- iXBRLViewerPlugin/viewer/src/i18n/cy/datatypes.json +9 -0
- iXBRLViewerPlugin/viewer/src/i18n/cy/labelroles.json +24 -0
- iXBRLViewerPlugin/viewer/src/i18n/cy/referenceparts.json +10 -0
- iXBRLViewerPlugin/viewer/src/i18n/cy/scale.json +16 -0
- iXBRLViewerPlugin/viewer/src/i18n/cy/tooltips.json +17 -0
- iXBRLViewerPlugin/viewer/src/i18n/cy/translation.json +179 -0
- iXBRLViewerPlugin/viewer/src/i18n/en/balancetypes.json +4 -0
- iXBRLViewerPlugin/viewer/src/i18n/en/datatypes.json +10 -0
- iXBRLViewerPlugin/viewer/src/i18n/en/labelroles.json +4 -0
- iXBRLViewerPlugin/viewer/src/i18n/en/scale.json +16 -0
- iXBRLViewerPlugin/viewer/src/i18n/en/tooltips.json +17 -0
- iXBRLViewerPlugin/viewer/src/i18n/en/translation.json +56 -24
- iXBRLViewerPlugin/viewer/src/i18n/es/balancetypes.json +4 -0
- iXBRLViewerPlugin/viewer/src/i18n/es/datatypes.json +10 -0
- iXBRLViewerPlugin/viewer/src/i18n/es/labelroles.json +24 -0
- iXBRLViewerPlugin/viewer/src/i18n/es/scale.json +16 -0
- iXBRLViewerPlugin/viewer/src/i18n/es/tooltips.json +17 -0
- iXBRLViewerPlugin/viewer/src/i18n/es/translation.json +70 -37
- iXBRLViewerPlugin/viewer/src/icons/dark-mode.svg +4 -0
- iXBRLViewerPlugin/viewer/src/img/arelle-dark.svg +179 -0
- iXBRLViewerPlugin/viewer/src/img/inline-viewer-dark.svg +59 -0
- iXBRLViewerPlugin/viewer/src/js/accordian.js +3 -2
- iXBRLViewerPlugin/viewer/src/js/aspect.js +18 -10
- iXBRLViewerPlugin/viewer/src/js/aspect.test.js +2 -2
- iXBRLViewerPlugin/viewer/src/js/balance.js +14 -0
- iXBRLViewerPlugin/viewer/src/js/calculation.js +45 -34
- iXBRLViewerPlugin/viewer/src/js/calculationInspector.js +4 -7
- iXBRLViewerPlugin/viewer/src/js/chart.js +23 -21
- iXBRLViewerPlugin/viewer/src/js/concept.js +30 -3
- iXBRLViewerPlugin/viewer/src/js/concept.test.js +23 -2
- iXBRLViewerPlugin/viewer/src/js/datatype.js +20 -0
- iXBRLViewerPlugin/viewer/src/js/datatype.test.js +62 -0
- iXBRLViewerPlugin/viewer/src/js/dialog.js +6 -4
- iXBRLViewerPlugin/viewer/src/js/fact.js +40 -7
- iXBRLViewerPlugin/viewer/src/js/fact.test.js +3 -0
- iXBRLViewerPlugin/viewer/src/js/index.js +11 -3
- iXBRLViewerPlugin/viewer/src/js/inspector.js +560 -160
- iXBRLViewerPlugin/viewer/src/js/inspector.test.js +1 -2
- iXBRLViewerPlugin/viewer/src/js/ixbrlviewer.js +129 -31
- iXBRLViewerPlugin/viewer/src/js/ixbrlviewer.test.js +133 -20
- iXBRLViewerPlugin/viewer/src/js/ixnode.js +1 -1
- iXBRLViewerPlugin/viewer/src/js/menu.js +25 -7
- iXBRLViewerPlugin/viewer/src/js/number-matcher.js +2 -2
- iXBRLViewerPlugin/viewer/src/js/outline.js +2 -4
- iXBRLViewerPlugin/viewer/src/js/period.js +0 -1
- iXBRLViewerPlugin/viewer/src/js/report.js +68 -13
- iXBRLViewerPlugin/viewer/src/js/report.test.js +77 -6
- iXBRLViewerPlugin/viewer/src/js/reportset.js +33 -3
- iXBRLViewerPlugin/viewer/src/js/reportset.test.js +32 -6
- iXBRLViewerPlugin/viewer/src/js/search.js +61 -35
- iXBRLViewerPlugin/viewer/src/js/search.test.js +8 -5
- iXBRLViewerPlugin/viewer/src/js/summary.js +28 -2
- iXBRLViewerPlugin/viewer/src/js/summary.test.js +52 -14
- iXBRLViewerPlugin/viewer/src/js/tableExport.js +3 -3
- iXBRLViewerPlugin/viewer/src/js/taxonomynamer.js +34 -0
- iXBRLViewerPlugin/viewer/src/js/taxonomynamer.test.js +32 -0
- iXBRLViewerPlugin/viewer/src/js/theme.js +49 -0
- iXBRLViewerPlugin/viewer/src/js/unit.js +73 -2
- iXBRLViewerPlugin/viewer/src/js/unit.test.js +14 -3
- iXBRLViewerPlugin/viewer/src/js/util.js +21 -18
- iXBRLViewerPlugin/viewer/src/js/util.test.js +1 -0
- iXBRLViewerPlugin/viewer/src/js/utr.js +27 -0
- iXBRLViewerPlugin/viewer/src/js/viewer.js +40 -29
- iXBRLViewerPlugin/viewer/src/js/viewerOptions.js +0 -2
- iXBRLViewerPlugin/viewer/src/less/accordian.less +8 -4
- iXBRLViewerPlugin/viewer/src/less/block-list.less +12 -6
- iXBRLViewerPlugin/viewer/src/less/calculation-inspector.less +2 -2
- iXBRLViewerPlugin/viewer/src/less/chart.less +8 -5
- iXBRLViewerPlugin/viewer/src/less/colours-dark-mode.less +40 -0
- iXBRLViewerPlugin/viewer/src/less/colours.less +28 -21
- iXBRLViewerPlugin/viewer/src/less/common.less +1 -1
- iXBRLViewerPlugin/viewer/src/less/components.less +3 -3
- iXBRLViewerPlugin/viewer/src/less/core.less +2 -0
- iXBRLViewerPlugin/viewer/src/less/dialog.less +13 -10
- iXBRLViewerPlugin/viewer/src/less/form-controls.less +33 -11
- iXBRLViewerPlugin/viewer/src/less/inspector.less +556 -300
- iXBRLViewerPlugin/viewer/src/less/loader.less +2 -2
- iXBRLViewerPlugin/viewer/src/less/menu.less +33 -15
- iXBRLViewerPlugin/viewer/src/less/summary.less +16 -6
- iXBRLViewerPlugin/viewer/src/less/tabs.less +5 -5
- iXBRLViewerPlugin/viewer/src/less/text-mixins.less +2 -1
- iXBRLViewerPlugin/viewer/src/less/validation-report.less +1 -1
- iXBRLViewerPlugin/viewer/src/less/viewer.less +30 -18
- iXBRLViewerPlugin/viewer/webpack.common.js +19 -9
- {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.50.dist-info}/METADATA +41 -14
- ixbrl_viewer-1.4.50.dist-info/RECORD +197 -0
- {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.50.dist-info}/WHEEL +1 -1
- tests/puppeteer/framework/page_objects/doc_frame.js +3 -3
- tests/puppeteer/framework/page_objects/fact_details_panel.js +29 -1
- tests/puppeteer/puppeteer_test_run_via_intellij.jpg +0 -0
- tests/puppeteer/tests/fact_properties.test.js +10 -4
- tests/unit_tests/iXBRLViewerPlugin/test_iXBRLViewer.py +117 -51
- iXBRLViewerPlugin/viewer/src/js/interact.min.js +0 -6
- ixbrl_viewer-1.4.21.dist-info/RECORD +0 -166
- {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.50.dist-info}/LICENSE +0 -0
- {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.50.dist-info}/NOTICE +0 -0
- {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.50.dist-info}/entry_points.txt +0 -0
- {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.50.dist-info}/top_level.txt +0 -0
|
@@ -105,6 +105,30 @@ class TestIXBRLViewer:
|
|
|
105
105
|
namespaceURI='http://www.xbrl.org/2003/iso4217'
|
|
106
106
|
)
|
|
107
107
|
|
|
108
|
+
self.monetary_type = Mock(
|
|
109
|
+
qname = Mock(
|
|
110
|
+
localName="monetaryItemType",
|
|
111
|
+
prefix="xbrli",
|
|
112
|
+
namespaceURI="http://www.xbrl.org/2003/instance"
|
|
113
|
+
)
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
self.string_type = Mock(
|
|
117
|
+
qname = Mock(
|
|
118
|
+
localName="stringItemType",
|
|
119
|
+
prefix="xbrli",
|
|
120
|
+
namespaceURI="http://www.xbrl.org/2003/instance"
|
|
121
|
+
)
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
self.integer_simple_type = Mock(
|
|
125
|
+
qname = Mock(
|
|
126
|
+
localName="integer",
|
|
127
|
+
prefix="xs",
|
|
128
|
+
namespaceURI="http://www.w3.org/2001/XMLSchema"
|
|
129
|
+
)
|
|
130
|
+
)
|
|
131
|
+
|
|
108
132
|
self.usd_unit = Mock(
|
|
109
133
|
measures = ([self.usd_qname],[])
|
|
110
134
|
)
|
|
@@ -119,7 +143,9 @@ class TestIXBRLViewer:
|
|
|
119
143
|
prefix='us-gaap',
|
|
120
144
|
namespaceURI='http://viewer.com'
|
|
121
145
|
),
|
|
146
|
+
balance="debit",
|
|
122
147
|
isTypedDimension=False,
|
|
148
|
+
type=self.monetary_type,
|
|
123
149
|
)
|
|
124
150
|
|
|
125
151
|
to_concept = Mock(
|
|
@@ -128,7 +154,9 @@ class TestIXBRLViewer:
|
|
|
128
154
|
prefix='us-gaap',
|
|
129
155
|
namespaceURI='http://viewer.com'
|
|
130
156
|
),
|
|
157
|
+
balance="credit",
|
|
131
158
|
isTypedDimension=False,
|
|
159
|
+
type=self.monetary_type,
|
|
132
160
|
)
|
|
133
161
|
from_concept = Mock(
|
|
134
162
|
qname=Mock(
|
|
@@ -136,7 +164,9 @@ class TestIXBRLViewer:
|
|
|
136
164
|
prefix='us-gaap',
|
|
137
165
|
namespaceURI='http://viewer.com'
|
|
138
166
|
),
|
|
167
|
+
balance=None,
|
|
139
168
|
isTypedDimension=False,
|
|
169
|
+
type=self.monetary_type,
|
|
140
170
|
)
|
|
141
171
|
|
|
142
172
|
dimension_concept = Mock(
|
|
@@ -145,7 +175,9 @@ class TestIXBRLViewer:
|
|
|
145
175
|
prefix='us-gaap',
|
|
146
176
|
namespaceURI='http://viewer.com'
|
|
147
177
|
),
|
|
178
|
+
balance=None,
|
|
148
179
|
isTypedDimension=False,
|
|
180
|
+
type=self.string_type,
|
|
149
181
|
)
|
|
150
182
|
|
|
151
183
|
typed_dimension_domain_concept = Mock(
|
|
@@ -154,7 +186,9 @@ class TestIXBRLViewer:
|
|
|
154
186
|
prefix='us-gaap',
|
|
155
187
|
namespaceURI='http://viewer.com'
|
|
156
188
|
),
|
|
189
|
+
balance=None,
|
|
157
190
|
isTypedDimension=False,
|
|
191
|
+
type=self.string_type,
|
|
158
192
|
)
|
|
159
193
|
|
|
160
194
|
typed_dimension_concept = Mock(
|
|
@@ -163,8 +197,10 @@ class TestIXBRLViewer:
|
|
|
163
197
|
prefix='us-gaap',
|
|
164
198
|
namespaceURI='http://viewer.com'
|
|
165
199
|
),
|
|
200
|
+
balance=None,
|
|
166
201
|
isTypedDimension=True,
|
|
167
202
|
typedDomainElement=typed_dimension_domain_concept,
|
|
203
|
+
type=self.integer_simple_type,
|
|
168
204
|
)
|
|
169
205
|
|
|
170
206
|
member_concept = Mock(
|
|
@@ -173,7 +209,9 @@ class TestIXBRLViewer:
|
|
|
173
209
|
prefix='us-gaap',
|
|
174
210
|
namespaceURI='http://viewer.com'
|
|
175
211
|
),
|
|
212
|
+
balance=None,
|
|
176
213
|
isTypedDimension=False,
|
|
214
|
+
type=self.string_type,
|
|
177
215
|
)
|
|
178
216
|
|
|
179
217
|
rel = Mock(
|
|
@@ -245,6 +283,7 @@ class TestIXBRLViewer:
|
|
|
245
283
|
qname=self.cash_concept.qname,
|
|
246
284
|
value=100,
|
|
247
285
|
isNumeric=False,
|
|
286
|
+
isTuple=False,
|
|
248
287
|
context=context_1,
|
|
249
288
|
concept=self.cash_concept,
|
|
250
289
|
format='format'
|
|
@@ -256,6 +295,7 @@ class TestIXBRLViewer:
|
|
|
256
295
|
concept=self.cash_concept,
|
|
257
296
|
context=context_2,
|
|
258
297
|
isNumeric=True,
|
|
298
|
+
isTuple=False,
|
|
259
299
|
unit=self.usd_unit,
|
|
260
300
|
value=None,
|
|
261
301
|
decimals=None,
|
|
@@ -269,6 +309,7 @@ class TestIXBRLViewer:
|
|
|
269
309
|
concept=self.cash_concept,
|
|
270
310
|
context=context_2,
|
|
271
311
|
isNumeric=True,
|
|
312
|
+
isTuple=False,
|
|
272
313
|
unit=self.null_units,
|
|
273
314
|
value=None,
|
|
274
315
|
decimals=None,
|
|
@@ -281,6 +322,7 @@ class TestIXBRLViewer:
|
|
|
281
322
|
qname=self.cash_concept.qname,
|
|
282
323
|
value=10,
|
|
283
324
|
isNumeric=False,
|
|
325
|
+
isTuple=False,
|
|
284
326
|
context=context_with_typed_dimension,
|
|
285
327
|
concept=self.cash_concept,
|
|
286
328
|
format='format'
|
|
@@ -291,11 +333,31 @@ class TestIXBRLViewer:
|
|
|
291
333
|
qname=self.cash_concept.qname,
|
|
292
334
|
value=1000,
|
|
293
335
|
isNumeric=False,
|
|
336
|
+
isTuple=False,
|
|
294
337
|
context=context_with_missing_member_on_dimension,
|
|
295
338
|
concept=self.cash_concept,
|
|
296
339
|
format='format'
|
|
297
340
|
)
|
|
298
341
|
|
|
342
|
+
file_1 = Mock(
|
|
343
|
+
filename='something/reports/001.jpg'
|
|
344
|
+
)
|
|
345
|
+
|
|
346
|
+
file_2 = Mock(
|
|
347
|
+
filename='something/reports/002.jpg'
|
|
348
|
+
)
|
|
349
|
+
|
|
350
|
+
fs = Mock(
|
|
351
|
+
filelist = [file_1, file_2]
|
|
352
|
+
)
|
|
353
|
+
|
|
354
|
+
file_source = Mock(
|
|
355
|
+
fs = fs
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
def creationSoftwareMatches_effect(text):
|
|
359
|
+
return ["Example Software Name"]
|
|
360
|
+
|
|
299
361
|
def fromModelObjects_effect(concept):
|
|
300
362
|
return []
|
|
301
363
|
|
|
@@ -358,20 +420,10 @@ class TestIXBRLViewer:
|
|
|
358
420
|
ixdsTarget=None,
|
|
359
421
|
)
|
|
360
422
|
|
|
361
|
-
error1 = logging.LogRecord("arelle", logging.ERROR, "", 0, "Error message", {}, None)
|
|
362
|
-
error1.messageCode = "code1"
|
|
363
|
-
self.modelManager = Mock(
|
|
364
|
-
cntlr = Mock(
|
|
365
|
-
logHandler = Mock (
|
|
366
|
-
logRecordBuffer = [
|
|
367
|
-
error1
|
|
368
|
-
]
|
|
369
|
-
)
|
|
370
|
-
)
|
|
371
|
-
)
|
|
372
423
|
|
|
373
424
|
def urlDocEntry(path, docType, linkQName=None):
|
|
374
425
|
return path, Mock(
|
|
426
|
+
creationSoftwareMatches=creationSoftwareMatches_effect,
|
|
375
427
|
type=docType,
|
|
376
428
|
basename=os.path.basename(path),
|
|
377
429
|
xmlRootElement=Mock(
|
|
@@ -388,9 +440,9 @@ class TestIXBRLViewer:
|
|
|
388
440
|
baseSets=baseSets,
|
|
389
441
|
roleTypes=roleTypes,
|
|
390
442
|
facts=[fact_1, fact_with_typed_dimension, fact_with_missing_member_on_dimension],
|
|
443
|
+
fileSource=file_source,
|
|
391
444
|
info=info_effect,
|
|
392
445
|
modelDocument=self.modelDocument,
|
|
393
|
-
modelManager=self.modelManager,
|
|
394
446
|
ixdsTarget=None,
|
|
395
447
|
urlDocs=dict((
|
|
396
448
|
urlDocEntry('/filesystem/local-inline.htm', Type.INLINEXBRL),
|
|
@@ -419,9 +471,9 @@ class TestIXBRLViewer:
|
|
|
419
471
|
baseSets=baseSets,
|
|
420
472
|
roleTypes=roleTypes,
|
|
421
473
|
facts=[fact_2, fact_3],
|
|
474
|
+
fileSource=file_source,
|
|
422
475
|
info=info_effect,
|
|
423
476
|
modelDocument=self.modelDocument,
|
|
424
|
-
modelManager=self.modelManager,
|
|
425
477
|
ixdsTarget=None,
|
|
426
478
|
urlDocs={}
|
|
427
479
|
)
|
|
@@ -431,9 +483,9 @@ class TestIXBRLViewer:
|
|
|
431
483
|
baseSets=baseSets,
|
|
432
484
|
roleTypes=roleTypes,
|
|
433
485
|
facts=[fact_1, fact_with_typed_dimension, fact_with_missing_member_on_dimension],
|
|
486
|
+
fileSource=file_source,
|
|
434
487
|
info=info_effect,
|
|
435
488
|
modelDocument=self.modelDocumentInlineSet,
|
|
436
|
-
modelManager=self.modelManager,
|
|
437
489
|
ixdsTarget=None,
|
|
438
490
|
urlDocs={}
|
|
439
491
|
)
|
|
@@ -446,15 +498,20 @@ class TestIXBRLViewer:
|
|
|
446
498
|
typed_dimension_domain_concept.modelXbrl = self.modelXbrl_1
|
|
447
499
|
member_concept.modelXbrl = self.modelXbrl_1
|
|
448
500
|
|
|
449
|
-
self.
|
|
450
|
-
self.
|
|
451
|
-
|
|
452
|
-
|
|
501
|
+
self.logRecordBuffer = []
|
|
502
|
+
self.cntlr_mock = Mock(
|
|
503
|
+
logHandler = Mock(
|
|
504
|
+
logRecordBuffer = self.logRecordBuffer
|
|
505
|
+
)
|
|
506
|
+
)
|
|
507
|
+
self.builder_1 = IXBRLViewerBuilder(self.cntlr_mock)
|
|
508
|
+
self.builder_doc_set = IXBRLViewerBuilder(self.cntlr_mock)
|
|
509
|
+
|
|
453
510
|
|
|
454
511
|
@patch('arelle.XbrlConst.conceptLabel', 'http://www.xbrl.org/2003/arcrole/concept-label')
|
|
455
512
|
@patch('arelle.XbrlConst.conceptReference', 'http://www.xbrl.org/2003/arcrole/concept-reference')
|
|
456
513
|
def test_addConcept_simple_case(self):
|
|
457
|
-
builder = IXBRLViewerBuilder(
|
|
514
|
+
builder = IXBRLViewerBuilder(Mock())
|
|
458
515
|
builder.currentTargetReport = builder.newTargetReport(None)
|
|
459
516
|
builder.addSourceReport()["targetReports"].append(builder.currentTargetReport)
|
|
460
517
|
builder.addConcept(self.modelXbrl_1, self.cash_concept)
|
|
@@ -464,39 +521,39 @@ class TestIXBRLViewer:
|
|
|
464
521
|
@patch('arelle.XbrlConst.summationItem', 'http://www.xbrl.org/2003/arcrole/summation-item')
|
|
465
522
|
def test_getRelationships_simple_case(self):
|
|
466
523
|
modelXbrl = Mock(baseSets=defaultdict(list), relationshipSets={})
|
|
467
|
-
builder = IXBRLViewerBuilder(
|
|
524
|
+
builder = IXBRLViewerBuilder(Mock())
|
|
468
525
|
result = builder.getRelationships(modelXbrl)
|
|
469
526
|
assert result == {}
|
|
470
527
|
|
|
471
528
|
@patch('arelle.XbrlConst.parentChild', 'http://www.xbrl.org/2003/arcrole/parent-child')
|
|
472
529
|
@patch('arelle.XbrlConst.summationItem', 'http://www.xbrl.org/2003/arcrole/summation-item')
|
|
473
530
|
def test_getRelationships_returns_a_rel(self):
|
|
474
|
-
builder = IXBRLViewerBuilder(
|
|
531
|
+
builder = IXBRLViewerBuilder(Mock())
|
|
475
532
|
builder.currentTargetReport = builder.newTargetReport(None)
|
|
476
533
|
result = builder.getRelationships(self.modelXbrl_1)
|
|
477
534
|
roleMap = builder.roleMap
|
|
478
535
|
siPrefix = roleMap.getPrefix('http://www.xbrl.org/2003/arcrole/summation-item')
|
|
479
536
|
assert result.get(siPrefix).get(roleMap.getPrefix('ELR')).get('us-gaap:from_concept')
|
|
480
537
|
|
|
481
|
-
def
|
|
538
|
+
def test_addRoleDefinition_no_definition(self):
|
|
482
539
|
"""
|
|
483
540
|
Adding an ELR with no definition should result in no entry in the roleDefs map
|
|
484
541
|
"""
|
|
485
542
|
elr = "http://example.com/unknownELR"
|
|
486
|
-
builder = IXBRLViewerBuilder(
|
|
543
|
+
builder = IXBRLViewerBuilder(Mock())
|
|
487
544
|
builder.currentTargetReport = builder.newTargetReport(None)
|
|
488
|
-
builder.
|
|
545
|
+
builder.addRoleDefinition(self.modelXbrl_1, elr)
|
|
489
546
|
elrPrefix = builder.roleMap.getPrefix(elr)
|
|
490
547
|
assert builder.currentTargetReport.get('roleDefs').get(elrPrefix) is None
|
|
491
548
|
|
|
492
|
-
def
|
|
549
|
+
def test_addRoleDefinition_with_definition(self):
|
|
493
550
|
"""
|
|
494
551
|
Adding an ELR with a definition should result in an "en" label with the definition as its value.
|
|
495
552
|
"""
|
|
496
553
|
elr = "ELR"
|
|
497
|
-
builder = IXBRLViewerBuilder(
|
|
554
|
+
builder = IXBRLViewerBuilder(Mock())
|
|
498
555
|
builder.currentTargetReport = builder.newTargetReport(None)
|
|
499
|
-
builder.
|
|
556
|
+
builder.addRoleDefinition(self.modelXbrl_1, elr)
|
|
500
557
|
elrPrefix = builder.roleMap.getPrefix(elr)
|
|
501
558
|
assert builder.currentTargetReport.get('roleDefs').get(elrPrefix).get("en") == "ELR Label"
|
|
502
559
|
|
|
@@ -509,7 +566,13 @@ class TestIXBRLViewer:
|
|
|
509
566
|
@patch('arelle.XbrlConst.documentationLabel', 'http://www.xbrl.org/2003/role/documentation')
|
|
510
567
|
def test_createViewerWithValidation(self):
|
|
511
568
|
js_uri = 'ixbrlviewer.js'
|
|
512
|
-
|
|
569
|
+
|
|
570
|
+
error1 = logging.LogRecord("arelle", logging.ERROR, "", 0, "Error message", {}, None)
|
|
571
|
+
error1.messageCode = "code1"
|
|
572
|
+
self.logRecordBuffer.append(error1)
|
|
573
|
+
|
|
574
|
+
builder = IXBRLViewerBuilder(self.cntlr_mock)
|
|
575
|
+
builder.processModel(self.modelXbrl_1)
|
|
513
576
|
result = builder.createViewer(js_uri)
|
|
514
577
|
assert len(result.files) == 1
|
|
515
578
|
body = result.files[0].xmlDocument.getroot()[0]
|
|
@@ -523,6 +586,7 @@ class TestIXBRLViewer:
|
|
|
523
586
|
errors = jsdata["validation"]
|
|
524
587
|
assert errors == [{"sev": "ERROR", "msg": "Error message", "code": "code1" }]
|
|
525
588
|
assert set(jsdata["sourceReports"][0]["targetReports"][0]["facts"]) == {"fact_id1", "fact_typed_dimension", "fact_dimension_missing_member"}
|
|
589
|
+
assert jsdata["sourceReports"][0]["targetReports"][0]["softwareCredits"] == ["Example Software Name"]
|
|
526
590
|
|
|
527
591
|
@patch('arelle.XbrlConst.conceptLabel', 'http://www.xbrl.org/2003/arcrole/concept-label')
|
|
528
592
|
@patch('arelle.XbrlConst.conceptReference', 'http://www.xbrl.org/2003/arcrole/concept-reference')
|
|
@@ -533,7 +597,8 @@ class TestIXBRLViewer:
|
|
|
533
597
|
@patch('arelle.XbrlConst.dimensionDefault', 'http://xbrl.org/int/dim/arcrole/dimension-default')
|
|
534
598
|
def test_createViewer(self):
|
|
535
599
|
js_uri = 'ixbrlviewer.js'
|
|
536
|
-
builder = IXBRLViewerBuilder(
|
|
600
|
+
builder = IXBRLViewerBuilder(self.cntlr_mock)
|
|
601
|
+
builder.processModel(self.modelXbrl_1)
|
|
537
602
|
result = builder.createViewer(js_uri, showValidations = False)
|
|
538
603
|
assert len(result.files) == 1
|
|
539
604
|
body = result.files[0].xmlDocument.getroot()[0]
|
|
@@ -548,13 +613,13 @@ class TestIXBRLViewer:
|
|
|
548
613
|
reportData = jsdata["sourceReports"][0]["targetReports"][0]
|
|
549
614
|
assert set(reportData["facts"]) == {"fact_id1", "fact_typed_dimension", "fact_dimension_missing_member"}
|
|
550
615
|
assert reportData["concepts"] == {
|
|
551
|
-
'us-gaap:Cash': {'e': True, 't': True, 'labels': {}},
|
|
552
|
-
'us-gaap:from_concept': {'e': True, 't': True, 'labels': {}},
|
|
553
|
-
'us-gaap:to_concept': {'e': True, 't': True, 'labels': {}},
|
|
554
|
-
'us-gaap:dimension': {'d': 'e', 'e': True, 't': True, 'labels': {}},
|
|
555
|
-
'us-gaap:member': {'e': True, 't': True, 'labels': {}},
|
|
556
|
-
'us-gaap:typed_dimension_domain': {'e': True, 't': True, 'labels': {}},
|
|
557
|
-
'us-gaap:typed_dimension': {'d': 't', 'e': True, 't': True, 'labels': {}, 'td': 'us-gaap:typed_dimension_domain'},
|
|
616
|
+
'us-gaap:Cash': {'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:monetaryItemType', 'b': 'debit'},
|
|
617
|
+
'us-gaap:from_concept': {'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:monetaryItemType'},
|
|
618
|
+
'us-gaap:to_concept': {'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:monetaryItemType', 'b': 'credit'},
|
|
619
|
+
'us-gaap:dimension': {'d': 'e', 'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:stringItemType'},
|
|
620
|
+
'us-gaap:member': {'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:stringItemType'},
|
|
621
|
+
'us-gaap:typed_dimension_domain': {'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:stringItemType'},
|
|
622
|
+
'us-gaap:typed_dimension': {'d': 't', 'e': True, 't': True, 'labels': {}, 'td': 'us-gaap:typed_dimension_domain', 'dt': 'xs:integer'},
|
|
558
623
|
}
|
|
559
624
|
assert reportData["localDocs"] == {
|
|
560
625
|
'local-inline.htm': ['inline'],
|
|
@@ -578,8 +643,9 @@ class TestIXBRLViewer:
|
|
|
578
643
|
@patch('arelle.XbrlConst.dimensionDefault', 'http://xbrl.org/int/dim/arcrole/dimension-default')
|
|
579
644
|
def test_createStubViewer(self):
|
|
580
645
|
js_uri = 'ixbrlviewer.js'
|
|
581
|
-
builder = IXBRLViewerBuilder(
|
|
582
|
-
|
|
646
|
+
builder = IXBRLViewerBuilder(self.cntlr_mock, useStubViewer = True)
|
|
647
|
+
builder.processModel(self.modelXbrl_1)
|
|
648
|
+
result = builder.createViewer(js_uri, showValidations = False)
|
|
583
649
|
assert len(result.files) == 2
|
|
584
650
|
body = result.files[0].xmlDocument.getroot().find('{http://www.w3.org/1999/xhtml}body')
|
|
585
651
|
assert body[0].text == 'BEGIN IXBRL VIEWER EXTENSIONS'
|
|
@@ -593,13 +659,13 @@ class TestIXBRLViewer:
|
|
|
593
659
|
reportData = jsdata["sourceReports"][0]["targetReports"][0]
|
|
594
660
|
assert set(reportData["facts"]) == {"fact_id1", "fact_typed_dimension", "fact_dimension_missing_member"}
|
|
595
661
|
assert reportData["concepts"] == {
|
|
596
|
-
'us-gaap:Cash': {'e': True, 't': True, 'labels': {}},
|
|
597
|
-
'us-gaap:from_concept': {'e': True, 't': True, 'labels': {}},
|
|
598
|
-
'us-gaap:to_concept': {'e': True, 't': True, 'labels': {}},
|
|
599
|
-
'us-gaap:dimension': {'d': 'e', 'e': True, 't': True, 'labels': {}},
|
|
600
|
-
'us-gaap:member': {'e': True, 't': True, 'labels': {}},
|
|
601
|
-
'us-gaap:typed_dimension_domain': {'e': True, 't': True, 'labels': {}},
|
|
602
|
-
'us-gaap:typed_dimension': {'d': 't', 'e': True, 't': True, 'labels': {}, 'td': 'us-gaap:typed_dimension_domain'},
|
|
662
|
+
'us-gaap:Cash': {'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:monetaryItemType', 'b': 'debit'},
|
|
663
|
+
'us-gaap:from_concept': {'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:monetaryItemType'},
|
|
664
|
+
'us-gaap:to_concept': {'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:monetaryItemType', 'b': 'credit'},
|
|
665
|
+
'us-gaap:dimension': {'d': 'e', 'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:stringItemType'},
|
|
666
|
+
'us-gaap:member': {'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:stringItemType'},
|
|
667
|
+
'us-gaap:typed_dimension_domain': {'e': True, 't': True, 'labels': {}, 'dt': 'xbrli:stringItemType'},
|
|
668
|
+
'us-gaap:typed_dimension': {'d': 't', 'e': True, 't': True, 'labels': {}, 'td': 'us-gaap:typed_dimension_domain', 'dt': 'xs:integer'},
|
|
603
669
|
}
|
|
604
670
|
assert reportData["localDocs"] == {
|
|
605
671
|
'local-inline.htm': ['inline'],
|
|
@@ -623,6 +689,7 @@ class TestIXBRLViewer:
|
|
|
623
689
|
@patch('arelle.XbrlConst.dimensionDefault', 'http://xbrl.org/int/dim/arcrole/dimension-default')
|
|
624
690
|
def test_createViewer_docset(self):
|
|
625
691
|
js_uri = 'ixbrlviewer.js'
|
|
692
|
+
self.builder_doc_set.processModel(self.modelXbrlDocSet)
|
|
626
693
|
result = self.builder_doc_set.createViewer(js_uri, showValidations=False)
|
|
627
694
|
assert len(result.files) == 2
|
|
628
695
|
body = result.files[0].xmlDocument.getroot()[0]
|
|
@@ -651,7 +718,8 @@ class TestIXBRLViewer:
|
|
|
651
718
|
@patch('arelle.XbrlConst.documentationLabel', 'http://www.xbrl.org/2003/role/documentation')
|
|
652
719
|
def test_createViewer_bad_path(self):
|
|
653
720
|
js_uri = 'ixbrlviewer.js'
|
|
654
|
-
builder = IXBRLViewerBuilder(
|
|
721
|
+
builder = IXBRLViewerBuilder(self.cntlr_mock)
|
|
722
|
+
builder.processModel(self.modelXbrl_2)
|
|
655
723
|
result = builder.createViewer(js_uri)
|
|
656
724
|
assert len(result.files) == 1
|
|
657
725
|
body = result.files[0].xmlDocument.getroot()[0]
|
|
@@ -675,17 +743,15 @@ class TestIXBRLViewer:
|
|
|
675
743
|
"""
|
|
676
744
|
Enable a defined feature
|
|
677
745
|
"""
|
|
678
|
-
builder = IXBRLViewerBuilder(
|
|
679
|
-
builder.
|
|
680
|
-
assert builder.taxonomyData["features"] == ['review']
|
|
746
|
+
builder = IXBRLViewerBuilder(Mock(), features={'review': True})
|
|
747
|
+
assert builder.taxonomyData["features"] == {'review': True}
|
|
681
748
|
|
|
682
749
|
def test_enableFeature_invalid(self):
|
|
683
750
|
"""
|
|
684
751
|
Attempt to enable an undefined feature
|
|
685
752
|
"""
|
|
686
|
-
builder = IXBRLViewerBuilder([self.modelXbrl_1])
|
|
687
753
|
with pytest.raises(AssertionError, match=rf'^Given feature name `unknown` does not match any defined features'):
|
|
688
|
-
|
|
754
|
+
IXBRLViewerBuilder(Mock(), features={'unknown': True})
|
|
689
755
|
|
|
690
756
|
def test_xhtmlNamespaceHandling(self):
|
|
691
757
|
# Check the prefix used for our inserted script tags
|