ixbrl-viewer 1.4.21__py3-none-any.whl → 1.4.49__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.

Files changed (114) hide show
  1. iXBRLViewerPlugin/__init__.py +77 -49
  2. iXBRLViewerPlugin/_version.py +2 -2
  3. iXBRLViewerPlugin/constants.py +86 -1
  4. iXBRLViewerPlugin/featureConfig.py +4 -1
  5. iXBRLViewerPlugin/iXBRLViewer.py +202 -131
  6. iXBRLViewerPlugin/plugin.py +7 -0
  7. iXBRLViewerPlugin/viewer/dist/ixbrlviewer.js +1 -1
  8. iXBRLViewerPlugin/viewer/dist/ixbrlviewer.js.LICENSE.txt +9 -2
  9. iXBRLViewerPlugin/viewer/i18next-parser.config.js +1 -1
  10. iXBRLViewerPlugin/viewer/src/data/utr.json +1 -0
  11. iXBRLViewerPlugin/viewer/src/html/fact-details.html +69 -38
  12. iXBRLViewerPlugin/viewer/src/html/footer-logo.html +4 -0
  13. iXBRLViewerPlugin/viewer/src/html/footnote-details.html +1 -1
  14. iXBRLViewerPlugin/viewer/src/html/inspector.html +324 -211
  15. iXBRLViewerPlugin/viewer/src/i18n/cy/balancetypes.json +1 -0
  16. iXBRLViewerPlugin/viewer/src/i18n/cy/currencies.json +13 -0
  17. iXBRLViewerPlugin/viewer/src/i18n/cy/datatypes.json +9 -0
  18. iXBRLViewerPlugin/viewer/src/i18n/cy/labelroles.json +24 -0
  19. iXBRLViewerPlugin/viewer/src/i18n/cy/referenceparts.json +10 -0
  20. iXBRLViewerPlugin/viewer/src/i18n/cy/scale.json +16 -0
  21. iXBRLViewerPlugin/viewer/src/i18n/cy/tooltips.json +17 -0
  22. iXBRLViewerPlugin/viewer/src/i18n/cy/translation.json +179 -0
  23. iXBRLViewerPlugin/viewer/src/i18n/en/balancetypes.json +4 -0
  24. iXBRLViewerPlugin/viewer/src/i18n/en/datatypes.json +10 -0
  25. iXBRLViewerPlugin/viewer/src/i18n/en/labelroles.json +4 -0
  26. iXBRLViewerPlugin/viewer/src/i18n/en/scale.json +16 -0
  27. iXBRLViewerPlugin/viewer/src/i18n/en/tooltips.json +17 -0
  28. iXBRLViewerPlugin/viewer/src/i18n/en/translation.json +56 -24
  29. iXBRLViewerPlugin/viewer/src/i18n/es/balancetypes.json +4 -0
  30. iXBRLViewerPlugin/viewer/src/i18n/es/datatypes.json +10 -0
  31. iXBRLViewerPlugin/viewer/src/i18n/es/labelroles.json +24 -0
  32. iXBRLViewerPlugin/viewer/src/i18n/es/scale.json +16 -0
  33. iXBRLViewerPlugin/viewer/src/i18n/es/tooltips.json +17 -0
  34. iXBRLViewerPlugin/viewer/src/i18n/es/translation.json +70 -37
  35. iXBRLViewerPlugin/viewer/src/icons/dark-mode.svg +4 -0
  36. iXBRLViewerPlugin/viewer/src/img/arelle-dark.svg +179 -0
  37. iXBRLViewerPlugin/viewer/src/img/inline-viewer-dark.svg +59 -0
  38. iXBRLViewerPlugin/viewer/src/js/accordian.js +3 -2
  39. iXBRLViewerPlugin/viewer/src/js/aspect.js +18 -10
  40. iXBRLViewerPlugin/viewer/src/js/aspect.test.js +2 -2
  41. iXBRLViewerPlugin/viewer/src/js/balance.js +14 -0
  42. iXBRLViewerPlugin/viewer/src/js/calculation.js +45 -34
  43. iXBRLViewerPlugin/viewer/src/js/calculationInspector.js +4 -7
  44. iXBRLViewerPlugin/viewer/src/js/chart.js +23 -21
  45. iXBRLViewerPlugin/viewer/src/js/concept.js +27 -2
  46. iXBRLViewerPlugin/viewer/src/js/concept.test.js +23 -2
  47. iXBRLViewerPlugin/viewer/src/js/datatype.js +20 -0
  48. iXBRLViewerPlugin/viewer/src/js/datatype.test.js +62 -0
  49. iXBRLViewerPlugin/viewer/src/js/dialog.js +6 -4
  50. iXBRLViewerPlugin/viewer/src/js/fact.js +40 -7
  51. iXBRLViewerPlugin/viewer/src/js/fact.test.js +3 -0
  52. iXBRLViewerPlugin/viewer/src/js/index.js +11 -3
  53. iXBRLViewerPlugin/viewer/src/js/inspector.js +560 -160
  54. iXBRLViewerPlugin/viewer/src/js/inspector.test.js +1 -2
  55. iXBRLViewerPlugin/viewer/src/js/ixbrlviewer.js +129 -31
  56. iXBRLViewerPlugin/viewer/src/js/ixbrlviewer.test.js +133 -20
  57. iXBRLViewerPlugin/viewer/src/js/ixnode.js +1 -1
  58. iXBRLViewerPlugin/viewer/src/js/menu.js +25 -7
  59. iXBRLViewerPlugin/viewer/src/js/number-matcher.js +2 -2
  60. iXBRLViewerPlugin/viewer/src/js/outline.js +2 -4
  61. iXBRLViewerPlugin/viewer/src/js/period.js +0 -1
  62. iXBRLViewerPlugin/viewer/src/js/report.js +68 -13
  63. iXBRLViewerPlugin/viewer/src/js/report.test.js +77 -6
  64. iXBRLViewerPlugin/viewer/src/js/reportset.js +33 -3
  65. iXBRLViewerPlugin/viewer/src/js/reportset.test.js +32 -6
  66. iXBRLViewerPlugin/viewer/src/js/search.js +61 -35
  67. iXBRLViewerPlugin/viewer/src/js/search.test.js +8 -5
  68. iXBRLViewerPlugin/viewer/src/js/summary.js +22 -0
  69. iXBRLViewerPlugin/viewer/src/js/summary.test.js +50 -13
  70. iXBRLViewerPlugin/viewer/src/js/tableExport.js +3 -3
  71. iXBRLViewerPlugin/viewer/src/js/taxonomynamer.js +34 -0
  72. iXBRLViewerPlugin/viewer/src/js/taxonomynamer.test.js +32 -0
  73. iXBRLViewerPlugin/viewer/src/js/theme.js +49 -0
  74. iXBRLViewerPlugin/viewer/src/js/unit.js +73 -2
  75. iXBRLViewerPlugin/viewer/src/js/unit.test.js +14 -3
  76. iXBRLViewerPlugin/viewer/src/js/util.js +21 -18
  77. iXBRLViewerPlugin/viewer/src/js/util.test.js +1 -0
  78. iXBRLViewerPlugin/viewer/src/js/utr.js +27 -0
  79. iXBRLViewerPlugin/viewer/src/js/viewer.js +40 -29
  80. iXBRLViewerPlugin/viewer/src/js/viewerOptions.js +0 -2
  81. iXBRLViewerPlugin/viewer/src/less/accordian.less +8 -4
  82. iXBRLViewerPlugin/viewer/src/less/block-list.less +12 -6
  83. iXBRLViewerPlugin/viewer/src/less/calculation-inspector.less +2 -2
  84. iXBRLViewerPlugin/viewer/src/less/chart.less +8 -5
  85. iXBRLViewerPlugin/viewer/src/less/colours-dark-mode.less +40 -0
  86. iXBRLViewerPlugin/viewer/src/less/colours.less +28 -21
  87. iXBRLViewerPlugin/viewer/src/less/common.less +1 -1
  88. iXBRLViewerPlugin/viewer/src/less/components.less +3 -3
  89. iXBRLViewerPlugin/viewer/src/less/core.less +2 -0
  90. iXBRLViewerPlugin/viewer/src/less/dialog.less +13 -10
  91. iXBRLViewerPlugin/viewer/src/less/form-controls.less +33 -11
  92. iXBRLViewerPlugin/viewer/src/less/inspector.less +556 -300
  93. iXBRLViewerPlugin/viewer/src/less/loader.less +2 -2
  94. iXBRLViewerPlugin/viewer/src/less/menu.less +33 -15
  95. iXBRLViewerPlugin/viewer/src/less/summary.less +16 -6
  96. iXBRLViewerPlugin/viewer/src/less/tabs.less +5 -5
  97. iXBRLViewerPlugin/viewer/src/less/text-mixins.less +2 -1
  98. iXBRLViewerPlugin/viewer/src/less/validation-report.less +1 -1
  99. iXBRLViewerPlugin/viewer/src/less/viewer.less +30 -18
  100. iXBRLViewerPlugin/viewer/webpack.common.js +19 -9
  101. {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.49.dist-info}/METADATA +41 -14
  102. ixbrl_viewer-1.4.49.dist-info/RECORD +197 -0
  103. {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.49.dist-info}/WHEEL +1 -1
  104. tests/puppeteer/framework/page_objects/doc_frame.js +3 -3
  105. tests/puppeteer/framework/page_objects/fact_details_panel.js +28 -0
  106. tests/puppeteer/puppeteer_test_run_via_intellij.jpg +0 -0
  107. tests/puppeteer/tests/fact_properties.test.js +10 -4
  108. tests/unit_tests/iXBRLViewerPlugin/test_iXBRLViewer.py +117 -51
  109. iXBRLViewerPlugin/viewer/src/js/interact.min.js +0 -6
  110. ixbrl_viewer-1.4.21.dist-info/RECORD +0 -166
  111. {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.49.dist-info}/LICENSE +0 -0
  112. {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.49.dist-info}/NOTICE +0 -0
  113. {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.49.dist-info}/entry_points.txt +0 -0
  114. {ixbrl_viewer-1.4.21.dist-info → ixbrl_viewer-1.4.49.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.builder_1 = IXBRLViewerBuilder([self.modelXbrl_1])
450
- self.builder_2 = IXBRLViewerBuilder([self.modelXbrl_1])
451
- self.builder_3 = IXBRLViewerBuilder([self.modelXbrl_2])
452
- self.builder_doc_set = IXBRLViewerBuilder([self.modelXbrlDocSet])
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([self.modelXbrl_1])
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([modelXbrl])
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([self.modelXbrl_1])
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 test_addELR_no_definition(self):
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([self.modelXbrl_1])
543
+ builder = IXBRLViewerBuilder(Mock())
487
544
  builder.currentTargetReport = builder.newTargetReport(None)
488
- builder.addELR(self.modelXbrl_1, elr)
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 test_addELR_with_definition(self):
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([self.modelXbrl_1])
554
+ builder = IXBRLViewerBuilder(Mock())
498
555
  builder.currentTargetReport = builder.newTargetReport(None)
499
- builder.addELR(self.modelXbrl_1, elr)
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
- builder = IXBRLViewerBuilder([self.modelXbrl_1])
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([self.modelXbrl_1])
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([self.modelXbrl_1])
582
- result = builder.createViewer(js_uri, showValidations = False, useStubViewer = True)
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([self.modelXbrl_2])
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([self.modelXbrl_1])
679
- builder.enableFeature('review')
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
- builder.enableFeature('unknown')
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