arelle-release 2.37.17__py3-none-any.whl → 2.37.19__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/CntlrWinMain.py +4 -1
- arelle/ModelValue.py +1 -0
- arelle/PythonUtil.py +132 -24
- arelle/ViewWinTree.py +15 -9
- arelle/_version.py +2 -2
- arelle/plugin/OimTaxonomy/ModelValueMore.py +15 -0
- arelle/plugin/OimTaxonomy/ValidateDTS.py +484 -0
- arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +240 -0
- arelle/plugin/OimTaxonomy/XbrlAbstract.py +16 -0
- arelle/plugin/OimTaxonomy/XbrlConcept.py +67 -0
- arelle/plugin/OimTaxonomy/XbrlConst.py +261 -0
- arelle/plugin/OimTaxonomy/XbrlCube.py +91 -0
- arelle/plugin/OimTaxonomy/XbrlDimension.py +38 -0
- arelle/plugin/OimTaxonomy/XbrlDts.py +152 -0
- arelle/plugin/OimTaxonomy/XbrlEntity.py +16 -0
- arelle/plugin/OimTaxonomy/XbrlGroup.py +22 -0
- arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +22 -0
- arelle/plugin/OimTaxonomy/XbrlLabel.py +31 -0
- arelle/plugin/OimTaxonomy/XbrlNetwork.py +100 -0
- arelle/plugin/OimTaxonomy/XbrlProperty.py +28 -0
- arelle/plugin/OimTaxonomy/XbrlReference.py +33 -0
- arelle/plugin/OimTaxonomy/XbrlReport.py +24 -0
- arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +35 -0
- arelle/plugin/OimTaxonomy/XbrlTaxonomy.py +93 -0
- arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py +154 -0
- arelle/plugin/OimTaxonomy/XbrlTransform.py +17 -0
- arelle/plugin/OimTaxonomy/XbrlTypes.py +23 -0
- arelle/plugin/OimTaxonomy/XbrlUnit.py +17 -0
- arelle/plugin/OimTaxonomy/__init__.py +1038 -0
- arelle/plugin/OimTaxonomy/resources/iso4217.json +4479 -0
- arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json +935 -0
- arelle/plugin/OimTaxonomy/resources/ref.json +333 -0
- arelle/plugin/OimTaxonomy/resources/transform-types.json +2481 -0
- arelle/plugin/OimTaxonomy/resources/types.json +727 -0
- arelle/plugin/OimTaxonomy/resources/utr.json +3046 -0
- arelle/plugin/OimTaxonomy/resources/xbrlSpec.json +1082 -0
- arelle/plugin/saveOIMTaxonomy.py +311 -0
- arelle/plugin/validate/NL/PluginValidationDataExtension.py +36 -2
- arelle/plugin/validate/NL/__init__.py +3 -0
- arelle/plugin/validate/NL/rules/nl_kvk.py +84 -2
- {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/METADATA +2 -1
- {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/RECORD +54 -19
- tests/integration_tests/validation/README.md +2 -0
- tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py +15 -4
- tests/integration_tests/validation/run_conformance_suites.py +10 -1
- tests/integration_tests/validation/validation_util.py +10 -5
- tests/unit_tests/arelle/test_frozen_dict.py +176 -0
- tests/unit_tests/arelle/test_frozen_ordered_set.py +315 -0
- tests/unit_tests/arelle/test_import.py +31 -0
- tests/unit_tests/arelle/test_ordered_set.py +272 -0
- {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/WHEEL +0 -0
- {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/entry_points.txt +0 -0
- {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/licenses/LICENSE.md +0 -0
- {arelle_release-2.37.17.dist-info → arelle_release-2.37.19.dist-info}/top_level.txt +0 -0
|
@@ -6,7 +6,7 @@ arelle/CntlrComServer.py,sha256=h1KPf31uMbErpxTZn_iklDqUMGFgQnjZkFkFjd8gtLQ,1888
|
|
|
6
6
|
arelle/CntlrProfiler.py,sha256=2VQJudiUhxryVypxjODx2ccP1-n60icTiWs5lSEokhQ,972
|
|
7
7
|
arelle/CntlrQuickBooks.py,sha256=BMqd5nkNQOZyNFPefkTeWUUDCYNS6BQavaG8k1Lepu4,31543
|
|
8
8
|
arelle/CntlrWebMain.py,sha256=x5vtiopqGdp6L5s7PrUTEABXCGqtb5oy7yqWIVePtgE,50860
|
|
9
|
-
arelle/CntlrWinMain.py,sha256=
|
|
9
|
+
arelle/CntlrWinMain.py,sha256=53lRaGTh8-4vG-hpuNVkxUhFa60u0jIHM9WvFdwdv-o,97273
|
|
10
10
|
arelle/CntlrWinTooltip.py,sha256=6MzoAIfkYnNu_bl_je8n0adhwmKxAIcymkg9Tij9Z4M,7951
|
|
11
11
|
arelle/DialogAbout.py,sha256=XXzMV0fO4BQ3-l1Puirzmn7EZEdmgJg7JNYdJm1FueM,1987
|
|
12
12
|
arelle/DialogArcroleGroup.py,sha256=r81OT3LFmMkoROpFenk97oVEyQhibKZ1QgDHvMsyCl0,7547
|
|
@@ -46,7 +46,7 @@ arelle/ModelRenderingObject.py,sha256=iPhSUlSBG-FLzAfIdUW06UZDgTCaZJ4K2mxvAtSe2B
|
|
|
46
46
|
arelle/ModelRssItem.py,sha256=GzFkmluOlFsVcrxn9HAyOAcuE7rcHUOGkp4Q6F2IlT8,7713
|
|
47
47
|
arelle/ModelRssObject.py,sha256=xjuwyJ8pU5sQmNPJFQakDEEnujZg2bMCTaj3zVezHL8,992
|
|
48
48
|
arelle/ModelTestcaseObject.py,sha256=sOyIktwv23BWOGyokzcwlJALp7UENsMAKKJmVfAZh6c,22163
|
|
49
|
-
arelle/ModelValue.py,sha256=
|
|
49
|
+
arelle/ModelValue.py,sha256=t0mVl3-EcE4MaXdRL9F94XaBwBfu1xG2DmFuHOczrEk,39447
|
|
50
50
|
arelle/ModelVersObject.py,sha256=cPD1IzhkCfuV1eMgVFWes88DH_6WkUj5kj7sgGF2M0I,26062
|
|
51
51
|
arelle/ModelVersReport.py,sha256=bXEA9K3qkH57aABn5l-m3CTY0FAcF1yX6O4fo-URjl8,73326
|
|
52
52
|
arelle/ModelXbrl.py,sha256=7rz4rxIGopwRDQTD12P0sdqzvPPoMhGgkg5qkMD6TDQ,72109
|
|
@@ -55,7 +55,7 @@ arelle/PluginManager.py,sha256=foSgWvRI1Ret-6KVRQMFSv4RtpEf_0UB7468N_NjPGU,42116
|
|
|
55
55
|
arelle/PluginUtils.py,sha256=0vFQ29wVVpU0cTY3YOBL6FhNQhhCTwShBH4qTJGLnvc,2426
|
|
56
56
|
arelle/PrototypeDtsObject.py,sha256=0lf60VcXR_isx57hBPrc7vEMkFpYkVuK4JVBSmopzkQ,7989
|
|
57
57
|
arelle/PrototypeInstanceObject.py,sha256=CXUoDllhDqpMvSQjqIYi1Ywp-J8fLhQRV9wVD2YXgVo,13204
|
|
58
|
-
arelle/PythonUtil.py,sha256=
|
|
58
|
+
arelle/PythonUtil.py,sha256=pkh3-XixCOiVHhGlrt8l0va-iWCtkyO5ZMjEvNAadRA,12524
|
|
59
59
|
arelle/RuntimeOptions.py,sha256=89pSw3zFhjHzn75RaHAl4-iPXL8awTZny-frozn9EHQ,8718
|
|
60
60
|
arelle/SocketUtils.py,sha256=1wa2sA_QhM8F1klHFq90V1AgO1-hY9pJm0554FiF7Lc,677
|
|
61
61
|
arelle/SystemInfo.py,sha256=6330pNedRkAPlEKl-ZdaZHiGuucEGZMI-Jrdy7B1rrU,2454
|
|
@@ -108,7 +108,7 @@ arelle/ViewWinRoleTypes.py,sha256=hc1pM5Q_LYOxDxMJTvG1O4_pQ0Uni9kpZ6hPuxKNs9w,47
|
|
|
108
108
|
arelle/ViewWinRssFeed.py,sha256=htgZKAxA3ivuE6p-jvtU2HIx78LAtfAkO2Q-KtGYHIk,6057
|
|
109
109
|
arelle/ViewWinTests.py,sha256=1RNerlovLzyvemNPFjraEVmpVWcWiw_DQ5LxVZm0R4M,9414
|
|
110
110
|
arelle/ViewWinTkTable.py,sha256=wtqy-ismBlGlcdfq9RoGbqU9dbwWgdTlO0tKYZRF0sw,1149
|
|
111
|
-
arelle/ViewWinTree.py,sha256=
|
|
111
|
+
arelle/ViewWinTree.py,sha256=mfOH7SnxUmADPw9cjB354IiFzZdDrztdOnQIfSoVp00,20005
|
|
112
112
|
arelle/ViewWinTupleGrid.py,sha256=Li21jmMSZP3xIkpg8eY8Sq7KTIuAgM57wHu7i7Nu3P0,8921
|
|
113
113
|
arelle/ViewWinVersReport.py,sha256=aYfsOgynVZpMzl6f2EzQCBLzdihYGycwb5SiTghkgMQ,9344
|
|
114
114
|
arelle/ViewWinXml.py,sha256=4ZGKtjaoCwU9etKYm9ZAS7jSmUxba1rqNEdv0OIyjTY,1250
|
|
@@ -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=exjqYyIx4Pnixev_8JwGiKhIVgsCkWHDH-obnUR5gnI,515
|
|
127
127
|
arelle/typing.py,sha256=PRe-Fxwr2SBqYYUVPCJ3E7ddDX0_oOISNdT5Q97EbRM,1246
|
|
128
128
|
arelle/api/Session.py,sha256=O8zpg7MJys9uxwwHf8OsSlZxpPdq7A3ONyY39Q4A3Kc,6218
|
|
129
129
|
arelle/archive/CustomLogger.py,sha256=v_JXOCQLDZcfaFWzxC9FRcEf9tQi4rCI4Sx7jCuAVQI,1231
|
|
@@ -324,12 +324,44 @@ arelle/plugin/saveDTS.py,sha256=D8hfFiM9Gc9LE7ZV0-pDvOHeU7Y5ebOzZx_nXzoZrl8,3216
|
|
|
324
324
|
arelle/plugin/saveHtmlEBAtables.py,sha256=OITN4ftI_atUO5NvrDJDKUc0CAk67GY68Jl16xDBXiI,10961
|
|
325
325
|
arelle/plugin/saveLoadableExcel.py,sha256=ZPYB6injFabav0dRzgS7adCFzfHkwtftjl3PfBjijuU,20539
|
|
326
326
|
arelle/plugin/saveLoadableOIM.py,sha256=lJ2qZ6ZMxCCAkz9wY0cucOhk8wTZulNlSlXH3qCKy2Q,40633
|
|
327
|
+
arelle/plugin/saveOIMTaxonomy.py,sha256=QatA_UTM6U3e72EGi8fETFIbhwfScS2WDzEeHHsas_4,15073
|
|
327
328
|
arelle/plugin/saveSKOS.py,sha256=7Z1Qedf83zMo9EbigKkxNpiMjzkTYQvLEnwWMObLc1Y,12465
|
|
328
329
|
arelle/plugin/saveSampleInstance.py,sha256=w66Nd4He8yIK4Il_M9qnelpeUJ_6cBBe5q01DanOxEA,23823
|
|
329
330
|
arelle/plugin/streamingExtensions.py,sha256=9W4iQ1u8LFn7-ZEfbqBtuwKiZj-aq8FUXNmj5VawRXQ,47619
|
|
330
331
|
arelle/plugin/systemInfo.py,sha256=Rv_9HmDwkswwBmhxrkz8uAL65J332r-QItTYMSz2Zbc,1641
|
|
331
332
|
arelle/plugin/unpackSecEisFile.py,sha256=TVdYUKhgAZ0145anRi6kBesOxPJEvC5YROO1j-hcuwU,2631
|
|
332
333
|
arelle/plugin/xuleSaver.py,sha256=3eNZAxziFos0YrC5NWezFPsIxN7Ex8jb-CaOVTd8Gw4,30073
|
|
334
|
+
arelle/plugin/OimTaxonomy/ModelValueMore.py,sha256=XwmEwcnmlOfCuK6-or09p93gP68doT1MyxBdoRzr-kQ,621
|
|
335
|
+
arelle/plugin/OimTaxonomy/ValidateDTS.py,sha256=LTI_pTeyK7FLNi560vmZPkPGT8HmGhcalnKiO5T8ccI,32081
|
|
336
|
+
arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py,sha256=7jmp35bu9qILlJxTF9V5BUlHYoJxEE-FTEkvGDvQ7wQ,11165
|
|
337
|
+
arelle/plugin/OimTaxonomy/XbrlAbstract.py,sha256=KCh7IpmjDRA9Qx-XA7DEfL2f-GYLSAzjxpCCZ7YuqwM,781
|
|
338
|
+
arelle/plugin/OimTaxonomy/XbrlConcept.py,sha256=Xr9z0I0V55sTOpHg30erSbMlPOSZEs8vH85bu03hhUE,5383
|
|
339
|
+
arelle/plugin/OimTaxonomy/XbrlConst.py,sha256=3w4UHM0IPYBO9xsaO_ULnVUYxqyaGUqzlhkVO6GVlEA,7376
|
|
340
|
+
arelle/plugin/OimTaxonomy/XbrlCube.py,sha256=GDPxU3G2eLxkF9DMym0LtMvwF6QrWY-mOaQFJrOX38k,10385
|
|
341
|
+
arelle/plugin/OimTaxonomy/XbrlDimension.py,sha256=lUMY7x3ERACmgekwW5grHYMyIE7s0XzBhgfbSJFsPeM,4804
|
|
342
|
+
arelle/plugin/OimTaxonomy/XbrlDts.py,sha256=6_46PWDnurhSIKWsHZNDsMGf0QFjN1lZ498INjhNDUc,7541
|
|
343
|
+
arelle/plugin/OimTaxonomy/XbrlEntity.py,sha256=UZRWqIvj1JkixbwN_H5W1cy02r6st-s6y_X2MENl2pg,796
|
|
344
|
+
arelle/plugin/OimTaxonomy/XbrlGroup.py,sha256=hxPUXNN5kY-O3siVInfIp1KPT1v5oRiERi4vOT_tfs0,1420
|
|
345
|
+
arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py,sha256=JKSC4T-IubyI9h7y9ha0LDDmrk_QhEJKGB6XT7bX1pg,2437
|
|
346
|
+
arelle/plugin/OimTaxonomy/XbrlLabel.py,sha256=5hqxnXf1d12HrPwQ2ppDJzRIJYq6WOtT7Upe4N6ihNo,1876
|
|
347
|
+
arelle/plugin/OimTaxonomy/XbrlNetwork.py,sha256=zmNPeI_5jnTKV_46BhJ-tqEePLqifQ4mzzDJz3m1FSk,7500
|
|
348
|
+
arelle/plugin/OimTaxonomy/XbrlProperty.py,sha256=OZzijsc7YsWetMmOtfyYlzdD3zHCsg3962RpJjTLN8M,1994
|
|
349
|
+
arelle/plugin/OimTaxonomy/XbrlReference.py,sha256=X6MduupPkeIXyge_boUs2o9dMQ3NT7cj0VCfAS5z7s4,2395
|
|
350
|
+
arelle/plugin/OimTaxonomy/XbrlReport.py,sha256=wJqOKkD4AXTyRyhK8Fr1hfC-MdQhz0NQBpV9iEnOZRE,1382
|
|
351
|
+
arelle/plugin/OimTaxonomy/XbrlTableTemplate.py,sha256=vhvx8WoAloBkb-IMKigOLwC_voffiUjbgPevwnoJOvw,3066
|
|
352
|
+
arelle/plugin/OimTaxonomy/XbrlTaxonomy.py,sha256=JxucxkZbl7VKhWXvQV7B9mkbXbc-GSvZs_qBnK_xt9M,6846
|
|
353
|
+
arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py,sha256=UojOSnsIL3XUVEcngm-dvzYl6uXPLXUoJwgXY_HjRzo,7267
|
|
354
|
+
arelle/plugin/OimTaxonomy/XbrlTransform.py,sha256=MrLWk77u3Gn1GUkwj3i3S3exTFWE0Ls3z0tfCM6sTIA,726
|
|
355
|
+
arelle/plugin/OimTaxonomy/XbrlTypes.py,sha256=j-t1-4qLbbDKUNf46VpcPivzsHz82kbllHC3rv2guAg,809
|
|
356
|
+
arelle/plugin/OimTaxonomy/XbrlUnit.py,sha256=z9HvsdKohrBOacHdNscVWqHRuB67qG722wsIYa7TKTk,1157
|
|
357
|
+
arelle/plugin/OimTaxonomy/__init__.py,sha256=8bbZG9owSj30MneTRc2N2wlChE6cMruQ76LdY105wWo,62196
|
|
358
|
+
arelle/plugin/OimTaxonomy/resources/iso4217.json,sha256=3a0VvUqH8EtsLImxIzZU6Ta-VXbXyuhCp1Hdpja6UD4,149911
|
|
359
|
+
arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json,sha256=8-OIssr1XEEecJAnDLvtFQy8dcCAHfyuJ_8eBktwBDQ,42637
|
|
360
|
+
arelle/plugin/OimTaxonomy/resources/ref.json,sha256=uSqnsW-YZTJSejg9XGxwoU1Wwt5UMljVDUi7hCDO_mw,11791
|
|
361
|
+
arelle/plugin/OimTaxonomy/resources/transform-types.json,sha256=3Ox03W2GbFviV74Q0xZLpYlWh5qsnBiHZAOZDjzzBA4,122515
|
|
362
|
+
arelle/plugin/OimTaxonomy/resources/types.json,sha256=mb1ufG9iWGnp3vA3Z-s_7M6GzfhiD7rwWnm6OnIsAx0,33269
|
|
363
|
+
arelle/plugin/OimTaxonomy/resources/utr.json,sha256=Q02MTZQcA3C4F_iNPVPY2XrwcCKUk4d9301KPTJINqs,104411
|
|
364
|
+
arelle/plugin/OimTaxonomy/resources/xbrlSpec.json,sha256=MaCnpjXtz3zhWE7SoHo-3NHDL1xnHLqO5dA_Jn8Nzow,48207
|
|
333
365
|
arelle/plugin/internet/proxyNTLM/HTTPNtlmAuthHandler.py,sha256=0CaCyvsLvCn21asDzq86XvLcr-nIMDQGRJtSuDzClVg,6684
|
|
334
366
|
arelle/plugin/internet/proxyNTLM/U32.py,sha256=ZxylUZkjUsY9JYD3cRoxOQE272lHd5AnIxQ5OOjSjdo,2920
|
|
335
367
|
arelle/plugin/internet/proxyNTLM/__init__.py,sha256=qaSHM1-RiitF-wbzbcFC83oWRhWt8b4KT9JmVZzTVts,1404
|
|
@@ -378,16 +410,16 @@ arelle/plugin/validate/FERC/__init__.py,sha256=V4fXcFKBsjFFPs9_1NhvDjWpEQCoQM0tR
|
|
|
378
410
|
arelle/plugin/validate/FERC/config.xml,sha256=bn9b8eCqJA1J62rYq1Nz85wJrMGAahVmmnIUQZyerjo,1919
|
|
379
411
|
arelle/plugin/validate/FERC/resources/ferc-utr.xml,sha256=OCRj9IUpdXATCBXKbB71apYx9kxcNtZW-Hq4s-avsRY,2663
|
|
380
412
|
arelle/plugin/validate/NL/DisclosureSystems.py,sha256=kTjpxkgwn58wHCbaLRBInirOy-2cpK9MLWEFJ_193y4,180
|
|
381
|
-
arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=
|
|
413
|
+
arelle/plugin/validate/NL/PluginValidationDataExtension.py,sha256=3fAYo-rilJHN8I0XVdM3AxGIMF0j8StZ52DNCK_fQdk,17620
|
|
382
414
|
arelle/plugin/validate/NL/ValidationPluginExtension.py,sha256=2qvvOqBkgk2LwERTHDuxtrRupYz3yRyhH71XQLbl9F4,15507
|
|
383
|
-
arelle/plugin/validate/NL/__init__.py,sha256=
|
|
415
|
+
arelle/plugin/validate/NL/__init__.py,sha256=L82brQTV6RjIkmMElxdqxOTP29v5u2Ur09qhHNw-46Y,2897
|
|
384
416
|
arelle/plugin/validate/NL/resources/config.xml,sha256=i_ns2wHmQYjhkRItevRR8tzfkl31ASfbWlc5t6pDB-w,1117
|
|
385
417
|
arelle/plugin/validate/NL/rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
386
418
|
arelle/plugin/validate/NL/rules/br_kvk.py,sha256=0SwKieWzTDm3YMsXPS6zTdgbk7_Z9CzqRkRmCRz1OiQ,15789
|
|
387
419
|
arelle/plugin/validate/NL/rules/fg_nl.py,sha256=4Puq5wAjtK_iNd4wisH_R0Z_EKJ7MT2OCai5g4t1MPE,10714
|
|
388
420
|
arelle/plugin/validate/NL/rules/fr_kvk.py,sha256=-_BLeWGoZ_f56p5VO4X40S45Ny3Ej-WK6Srei1KVSxU,8170
|
|
389
421
|
arelle/plugin/validate/NL/rules/fr_nl.py,sha256=-M1WtXp06khhtkfOVPCa-b8UbC281gk4YfDhvtAVlnI,31424
|
|
390
|
-
arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=
|
|
422
|
+
arelle/plugin/validate/NL/rules/nl_kvk.py,sha256=hPvh6FTXPoY_Dtzq0NCQxlySqnWKHLzCgrSAa1hpVBo,32571
|
|
391
423
|
arelle/plugin/validate/ROS/DisclosureSystems.py,sha256=rJ81mwQDYTi6JecFZ_zhqjjz3VNQRgjHNSh0wcQWAQE,18
|
|
392
424
|
arelle/plugin/validate/ROS/PluginValidationDataExtension.py,sha256=IV7ILhNvgKwQXqbpSA6HRNt9kEnejCyMADI3wyyIgk0,4036
|
|
393
425
|
arelle/plugin/validate/ROS/ValidationPluginExtension.py,sha256=FBhEp8t396vGdvCbMEimfcxmGiGnhXMen-yVLWnkFaI,758
|
|
@@ -709,7 +741,7 @@ arelle/utils/validate/ValidationUtil.py,sha256=9vmSvShn-EdQy56dfesyV8JjSRVPj7txr
|
|
|
709
741
|
arelle/utils/validate/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
710
742
|
arelle/webserver/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
711
743
|
arelle/webserver/bottle.py,sha256=P-JECd9MCTNcxCnKoDUvGcoi03ezYVOgoWgv2_uH-6M,362
|
|
712
|
-
arelle_release-2.37.
|
|
744
|
+
arelle_release-2.37.19.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
|
|
713
745
|
tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
714
746
|
tests/integration_tests/download_cache.py,sha256=jVMIVICsZjcVc9DCPPu3fCjF9_cWSS3tqSynhFs3oAM,4097
|
|
715
747
|
tests/integration_tests/integration_test_util.py,sha256=H7mncbv0T9ZeVyrtk9Hohe3k6jgcYykHkt-LGE-Q9aQ,10270
|
|
@@ -735,16 +767,16 @@ tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/ArelleGUITest.cspro
|
|
|
735
767
|
tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Tests.cs,sha256=_0TvabpERmrfaoDSazN-xQAH0qzO3cAnuFHLGLRJnGU,20334
|
|
736
768
|
tests/integration_tests/ui_tests/ArelleGUITest/ArelleGUITest/Usings.cs,sha256=0IC7tQ27uAqlt8ZGBrJPK7BPj3kjiodPcHWB3v_JT-o,29
|
|
737
769
|
tests/integration_tests/ui_tests/resources/workiva.zip,sha256=QtZzi1VcKkHhVa8J-I1wVpQFy-p6tsV95Z0HmI6XbXc,223544
|
|
738
|
-
tests/integration_tests/validation/README.md,sha256=
|
|
770
|
+
tests/integration_tests/validation/README.md,sha256=O6WYcMEk0x7ee7A9JnESHb6-UYceg_vrL4BhDIEDMI0,3008
|
|
739
771
|
tests/integration_tests/validation/assets.py,sha256=Ag9qPYrodcC-Ly6aygqapV0vG2Cbn_Tigg4v4F9xX4U,8295
|
|
740
772
|
tests/integration_tests/validation/conformance_suite_config.py,sha256=LgPO_8H_esM9kQS2o4jKd8CTNi0hiHugZ1hZn7whshI,10383
|
|
741
773
|
tests/integration_tests/validation/conformance_suite_configs.py,sha256=IbrL-45QTsUSI5Usz-STqtRZsz8pLu83KXqx4aDL-1w,7327
|
|
742
774
|
tests/integration_tests/validation/conftest.py,sha256=rVfmNX9y0JZ1VfoEepeYyIz-ZxzEZ1IJlmbcQSuxgUo,816
|
|
743
775
|
tests/integration_tests/validation/discover_tests.py,sha256=EJ0AlxWqzFBTDfncE2dv-GsBNmO8lynNOJAn0uFgXgo,4649
|
|
744
776
|
tests/integration_tests/validation/download_assets.py,sha256=muHklbrvYEbxqqAM8mU-8FpeemP0BLTWxD11xTYiCMc,7850
|
|
745
|
-
tests/integration_tests/validation/run_conformance_suites.py,sha256=
|
|
777
|
+
tests/integration_tests/validation/run_conformance_suites.py,sha256=yBnPdtIiNKibjsrJxrvVA7NyAEWcoDg-sSjp1nFGQ2g,8496
|
|
746
778
|
tests/integration_tests/validation/test_conformance_suites.py,sha256=VdwY0QtV6g00M9bv1XNs4qBTwxPxCh5-z4XoDdEhgeM,711
|
|
747
|
-
tests/integration_tests/validation/validation_util.py,sha256=
|
|
779
|
+
tests/integration_tests/validation/validation_util.py,sha256=_f0gd5BTts44Z9aEKi9kNPUC52sYCKgHoW557MsGw-k,21941
|
|
748
780
|
tests/integration_tests/validation/conformance_suite_configurations/cipc_current.py,sha256=oLXe3xIsEZLz3cv1cDdMQIuS_NgyI9Uimc9hy0NMWqg,642
|
|
749
781
|
tests/integration_tests/validation/conformance_suite_configurations/dba_current.py,sha256=j-7jCpzbGXbOzG8HGEyS0ciCYSPZzZLV44VQGhP3Hmc,875
|
|
750
782
|
tests/integration_tests/validation/conformance_suite_configurations/dba_multi_current.py,sha256=ICkP18Wu7aTDfszfYlrfVnBj9oe7ppXR-8wxQqCPqW0,837
|
|
@@ -764,7 +796,7 @@ tests/integration_tests/validation/conformance_suite_configurations/kvk_nt16.py,
|
|
|
764
796
|
tests/integration_tests/validation/conformance_suite_configurations/kvk_nt17.py,sha256=lmEZonthFm0YKFmp1dwXtdJ2T7txUeSpL4mbAo8fl4Y,1292
|
|
765
797
|
tests/integration_tests/validation/conformance_suite_configurations/kvk_nt18.py,sha256=EG2RQVkvFENhzUF3fl3QvDnH7ZPYS1n1Fo8bhfmSczM,1205
|
|
766
798
|
tests/integration_tests/validation/conformance_suite_configurations/kvk_nt19.py,sha256=FAzf9RhRmn_8yowpplJho2zEspX9FxJiVq8SjZT3Dsc,1199
|
|
767
|
-
tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py,sha256=
|
|
799
|
+
tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py,sha256=q68a58iJKOGIIVCCjGKfiK70piUZ1GPv4H677jCUGyg,10874
|
|
768
800
|
tests/integration_tests/validation/conformance_suite_configurations/nl_nt16.py,sha256=O_LFVBZPkjxmbrU7_C7VTLtrdoCUx2bYXOXw6_MlRtQ,846
|
|
769
801
|
tests/integration_tests/validation/conformance_suite_configurations/nl_nt17.py,sha256=aTN3Ez6lPsZsuypHZP84DneOtYxUZSjUiGypHy6ofHQ,846
|
|
770
802
|
tests/integration_tests/validation/conformance_suite_configurations/nl_nt18.py,sha256=sqHLjrHc95dTu0guTgKkphaKM1zNfKGnN4GKkZDLzeU,845
|
|
@@ -1537,10 +1569,13 @@ tests/resources/conformance_suites_timing/xbrl_table_linkbase_1_0.json,sha256=WE
|
|
|
1537
1569
|
tests/unit_tests/arelle/conftest.py,sha256=clfWoztB0XxQJyQzk0MWN-SP1WX72VEImuOBlyzNFYg,421
|
|
1538
1570
|
tests/unit_tests/arelle/test_betafeatures.py,sha256=8T2hMnNtOfMXm9TNWLYucwS-cJTv4m6non1_2mCajEQ,2366
|
|
1539
1571
|
tests/unit_tests/arelle/test_cntlr.py,sha256=zungezzESXZWNnOfUsoO_qqEqTxLgch7htvdAESghME,1116
|
|
1572
|
+
tests/unit_tests/arelle/test_frozen_dict.py,sha256=MzboGMIJsqkpPPazaPbCbXFzJAGFIDQQdBjET8mEabI,5450
|
|
1573
|
+
tests/unit_tests/arelle/test_frozen_ordered_set.py,sha256=5o7F_qrknwZUExVJObcA27wUPnbSrFeNyCKG2wacrFI,8746
|
|
1540
1574
|
tests/unit_tests/arelle/test_functionfn.py,sha256=4pD4-lxI2r0VcriyYyF36MkAz2qVCSgvoLx7r_Q0Kj8,3098
|
|
1541
|
-
tests/unit_tests/arelle/test_import.py,sha256=
|
|
1575
|
+
tests/unit_tests/arelle/test_import.py,sha256=iW_Vyheo_EWNu3GhMmqVxHgH-33_wPZx1iJsd2gDBj0,3068
|
|
1542
1576
|
tests/unit_tests/arelle/test_locale.py,sha256=u6NrZ6d26E3exHZqVzeDN8pOwoJi2Ryp_4sWkcnK5QY,1825
|
|
1543
1577
|
tests/unit_tests/arelle/test_modelmanager.py,sha256=U-SYe9dOyURAVP2a778VfMUiJ-2SSnHxu1vZkD5_SKM,496
|
|
1578
|
+
tests/unit_tests/arelle/test_ordered_set.py,sha256=GkJgvdWIME5g5f3MD0tWJmAI6-aej3LOW4Xo61pUews,6527
|
|
1544
1579
|
tests/unit_tests/arelle/test_packagemanager.py,sha256=Gs4J0cmB35czCIXj7xXhDlPLG9r68D5GGfZH8PKjMfw,2566
|
|
1545
1580
|
tests/unit_tests/arelle/test_pluginmanager.py,sha256=_Gi03PP-6FZ7mWqe2ysS_N_suOQamRHYhAuWolfKGug,5920
|
|
1546
1581
|
tests/unit_tests/arelle/test_qname.py,sha256=0aKh6jYWmY4Xg3wOS839Tdqa1SHwHuha6akv5T6qddY,4892
|
|
@@ -1559,8 +1594,8 @@ tests/unit_tests/arelle/oim/test_load.py,sha256=NxiUauQwJVfWAHbbpsMHGSU2d3Br8Pki
|
|
|
1559
1594
|
tests/unit_tests/arelle/plugin/test_plugin_imports.py,sha256=bdhIs9frAnFsdGU113yBk09_jis-z43dwUItMFYuSYM,1064
|
|
1560
1595
|
tests/unit_tests/arelle/plugin/validate/ESEF/ESEF_Current/test_validate_css_url.py,sha256=XHABmejQt7RlZ0udh7v42f2Xb2STGk_fSaIaJ9i2xo0,878
|
|
1561
1596
|
tests/unit_tests/arelle/utils/validate/test_decorator.py,sha256=ZS8FqIY1g-2FCbjF4UYm609dwViax6qBMRJSi0vfuhY,2482
|
|
1562
|
-
arelle_release-2.37.
|
|
1563
|
-
arelle_release-2.37.
|
|
1564
|
-
arelle_release-2.37.
|
|
1565
|
-
arelle_release-2.37.
|
|
1566
|
-
arelle_release-2.37.
|
|
1597
|
+
arelle_release-2.37.19.dist-info/METADATA,sha256=3qS1MQJRhZ9A8oLfA9v6MPSrXTVmNYwZ-exNhNCHiEs,9096
|
|
1598
|
+
arelle_release-2.37.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
1599
|
+
arelle_release-2.37.19.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
|
|
1600
|
+
arelle_release-2.37.19.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
|
|
1601
|
+
arelle_release-2.37.19.dist-info/RECORD,,
|
|
@@ -26,6 +26,8 @@ python -m tests.integration_tests.validation.run_conformance_suites --help
|
|
|
26
26
|
--series Run shards in series
|
|
27
27
|
--shard SHARD comma separated list of 0-indexed shards to run
|
|
28
28
|
--test Run selected conformance suite tests
|
|
29
|
+
--testcase-filter TESTCASE_FILTER
|
|
30
|
+
Filter test cases (see --testcaseFilter)
|
|
29
31
|
```
|
|
30
32
|
One of the following options *must* be provided to select which suites to use:
|
|
31
33
|
* `--all`: select all configured conformance suites
|
|
@@ -19,6 +19,11 @@ config = ConformanceSuiteConfig(
|
|
|
19
19
|
*NL_PACKAGES['NL-INLINE-2024'],
|
|
20
20
|
],
|
|
21
21
|
expected_additional_testcase_errors={f"conformance-suite-2024-sbr-domein-handelsregister/tests/{s}": val for s, val in {
|
|
22
|
+
'G3-5-3_1/index.xml:TC2_invalid': {
|
|
23
|
+
'arelle:ixdsTargetNotDefined': 1,
|
|
24
|
+
# This test is looking at the usage of the target attribute and does not import the correct taxonomy urls
|
|
25
|
+
'requiredEntryPointNotImported': 1,
|
|
26
|
+
},
|
|
22
27
|
'G3-6-3_3/index.xml:TC2_invalid': {
|
|
23
28
|
# Testcase expects only 3.6.3.3, but has a filename that has invalid characters (3.6.3.3)
|
|
24
29
|
# AND {base} with > 20 characters (3.6.3.1)
|
|
@@ -28,6 +33,16 @@ config = ConformanceSuiteConfig(
|
|
|
28
33
|
'undefinedLanguageForTextFact': 1,
|
|
29
34
|
'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 5,
|
|
30
35
|
},
|
|
36
|
+
'G5-1-3_1/index.xml:TC1_valid': {
|
|
37
|
+
# This test is looking at the import of the Other GAAP entry point and thus does not import
|
|
38
|
+
# the standard GAAP or IFRS
|
|
39
|
+
'requiredEntryPointNotImported': 1,
|
|
40
|
+
},
|
|
41
|
+
'G5-1-3_2/index.xml:TC1_valid': {
|
|
42
|
+
# This test is looking at the import of the Other GAAP entry point and thus does not import
|
|
43
|
+
# the standard GAAP or IFRS
|
|
44
|
+
'requiredEntryPointNotImported': 1,
|
|
45
|
+
},
|
|
31
46
|
'RTS_Annex_II_Par_1_RTS_Annex_IV_par_7/index.xml:TC2_valid': {
|
|
32
47
|
'undefinedLanguageForTextFact': 1,
|
|
33
48
|
'taggedTextFactOnlyInLanguagesOtherThanLanguageOfAReport': 5,
|
|
@@ -65,8 +80,6 @@ config = ConformanceSuiteConfig(
|
|
|
65
80
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_4/index.xml:TC2_invalid',
|
|
66
81
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_5/index.xml:TC2_invalid',
|
|
67
82
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-1_5/index.xml:TC3_invalid',
|
|
68
|
-
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-3_1/index.xml:TC2_invalid',
|
|
69
|
-
#'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-5-4_1/index.xml:TC2_invalid',
|
|
70
83
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-6-2_1/index.xml:TC2_invalid',
|
|
71
84
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G3-7-1_1/index.xml:TC2_invalid',
|
|
72
85
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-1-1_1/index.xml:TC3_invalid',
|
|
@@ -76,7 +89,6 @@ config = ConformanceSuiteConfig(
|
|
|
76
89
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-1-1_1/index.xml:TC7_invalid',
|
|
77
90
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-1-1_2/index.xml:TC2_invalid',
|
|
78
91
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-1-1_2/index.xml:TC3_invalid',
|
|
79
|
-
'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-1-2_1/index.xml:TC3_invalid',
|
|
80
92
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-1-2_2/index.xml:TC2_invalid',
|
|
81
93
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-2-0_1/index.xml:TC2_invalid',
|
|
82
94
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-2-0_2/index.xml:TC2_invalid',
|
|
@@ -100,7 +112,6 @@ config = ConformanceSuiteConfig(
|
|
|
100
112
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G4-4-5_2/index.xml:TC3_invalid',
|
|
101
113
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G5-1-3_1/index.xml:TC2_invalid',
|
|
102
114
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/G5-1-3_2/index.xml:TC2_invalid',
|
|
103
|
-
'conformance-suite-2024-sbr-domein-handelsregister/tests/G6-1-1_1/index.xml:TC2_invalid',
|
|
104
115
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_II_Par_1/index.xml:TC3_invalid',
|
|
105
116
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_II_Par_1_RTS_Annex_IV_par_7/index.xml:TC4_invalid',
|
|
106
117
|
'conformance-suite-2024-sbr-domein-handelsregister/tests/RTS_Annex_III_Par_1/index.xml:TC2_invalid',
|
|
@@ -94,6 +94,11 @@ ARGUMENTS: list[dict[str, Any]] = [
|
|
|
94
94
|
"action": "store_true",
|
|
95
95
|
"help": "Run selected conformance suite tests"
|
|
96
96
|
},
|
|
97
|
+
{
|
|
98
|
+
"name": "--testcase-filter",
|
|
99
|
+
"action": "append",
|
|
100
|
+
"help": "Filter test cases (see --testcaseFilter)",
|
|
101
|
+
}
|
|
97
102
|
]
|
|
98
103
|
DOWNLOAD_MISSING = 'missing'
|
|
99
104
|
DOWNLOAD_OVERWRITE = 'overwrite'
|
|
@@ -129,7 +134,9 @@ def run_conformance_suites(
|
|
|
129
134
|
download_private: bool = False,
|
|
130
135
|
log_to_file: bool = False,
|
|
131
136
|
offline_option: bool = False,
|
|
132
|
-
series_option: bool = False
|
|
137
|
+
series_option: bool = False,
|
|
138
|
+
testcase_filters: list[str] | None = None,
|
|
139
|
+
) -> list[ParameterSet]:
|
|
133
140
|
conformance_suite_configs = _get_conformance_suite_names(select_option)
|
|
134
141
|
unique_assets = set()
|
|
135
142
|
for config in conformance_suite_configs:
|
|
@@ -160,6 +167,7 @@ def run_conformance_suites(
|
|
|
160
167
|
log_to_file=log_to_file,
|
|
161
168
|
offline=offline_option,
|
|
162
169
|
series=series_option,
|
|
170
|
+
testcase_filters=testcase_filters,
|
|
163
171
|
)
|
|
164
172
|
if log_to_file:
|
|
165
173
|
save_timing_file(config, results)
|
|
@@ -190,6 +198,7 @@ def run_conformance_suites_options(options: Namespace) -> list[ParameterSet]:
|
|
|
190
198
|
log_to_file=options.log_to_file,
|
|
191
199
|
offline_option=options.offline,
|
|
192
200
|
series_option=options.series,
|
|
201
|
+
testcase_filters=options.testcase_filter
|
|
193
202
|
)
|
|
194
203
|
|
|
195
204
|
|
|
@@ -299,16 +299,19 @@ def get_conformance_suite_test_results(
|
|
|
299
299
|
build_cache: bool = False,
|
|
300
300
|
log_to_file: bool = False,
|
|
301
301
|
offline: bool = False,
|
|
302
|
-
series: bool = False
|
|
302
|
+
series: bool = False,
|
|
303
|
+
testcase_filters: list[str] | None = None,
|
|
304
|
+
) -> list[ParameterSet]:
|
|
303
305
|
assert len(shards) == 0 or config.shards != 1, \
|
|
304
306
|
'Conformance suite configuration must specify shards if --shard is passed'
|
|
305
307
|
if shards:
|
|
308
|
+
assert not testcase_filters, 'Testcase filters are not supported with shards.'
|
|
306
309
|
return get_conformance_suite_test_results_with_shards(
|
|
307
310
|
config=config, shards=shards, build_cache=build_cache, log_to_file=log_to_file, offline=offline, series=series
|
|
308
311
|
)
|
|
309
312
|
else:
|
|
310
313
|
return get_conformance_suite_test_results_without_shards(
|
|
311
|
-
config=config, build_cache=build_cache, log_to_file=log_to_file, offline=offline
|
|
314
|
+
config=config, build_cache=build_cache, log_to_file=log_to_file, offline=offline, testcase_filters=testcase_filters
|
|
312
315
|
)
|
|
313
316
|
|
|
314
317
|
|
|
@@ -382,7 +385,9 @@ def get_conformance_suite_test_results_without_shards(
|
|
|
382
385
|
config: ConformanceSuiteConfig,
|
|
383
386
|
build_cache: bool = False,
|
|
384
387
|
log_to_file: bool = False,
|
|
385
|
-
offline: bool = False
|
|
388
|
+
offline: bool = False,
|
|
389
|
+
testcase_filters: list[str] | None = None,
|
|
390
|
+
) -> list[ParameterSet]:
|
|
386
391
|
additional_plugins = frozenset().union(*(plugins for _, plugins in config.additional_plugins_by_prefix))
|
|
387
392
|
filename = config.entry_point_path.as_posix()
|
|
388
393
|
expected_failure_ids = config.expected_failure_ids
|
|
@@ -390,7 +395,7 @@ def get_conformance_suite_test_results_without_shards(
|
|
|
390
395
|
config=config, filename=filename, additional_plugins=additional_plugins,
|
|
391
396
|
build_cache=build_cache, offline=offline, log_to_file=log_to_file, shard=None,
|
|
392
397
|
expected_additional_testcase_errors=config.expected_additional_testcase_errors,
|
|
393
|
-
expected_failure_ids=expected_failure_ids, testcase_filters=[],
|
|
398
|
+
expected_failure_ids=expected_failure_ids, testcase_filters=testcase_filters or [],
|
|
394
399
|
)
|
|
395
400
|
url_context_manager: AbstractContextManager[Any]
|
|
396
401
|
if config.url_replace:
|
|
@@ -466,7 +471,7 @@ def save_timing_file(config: ConformanceSuiteConfig, results: list[ParameterSet]
|
|
|
466
471
|
if durations:
|
|
467
472
|
duration_values = durations.values()
|
|
468
473
|
duration_mean = statistics.mean(duration_values)
|
|
469
|
-
duration_stdev = statistics.stdev(duration_values)
|
|
474
|
+
duration_stdev = statistics.stdev(duration_values) if len(duration_values) > 1 else 0
|
|
470
475
|
durations = {
|
|
471
476
|
testcase_id: duration/duration_mean
|
|
472
477
|
for testcase_id, duration in sorted(durations.items())
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections import OrderedDict
|
|
4
|
+
from collections.abc import Mapping
|
|
5
|
+
|
|
6
|
+
import pytest
|
|
7
|
+
|
|
8
|
+
from arelle.PythonUtil import FrozenDict
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TestFrozenDict:
|
|
12
|
+
|
|
13
|
+
def test_init_empty(self) -> None:
|
|
14
|
+
fd = FrozenDict({})
|
|
15
|
+
assert len(fd) == 0
|
|
16
|
+
assert dict(fd) == {}
|
|
17
|
+
|
|
18
|
+
def test_getitem(self) -> None:
|
|
19
|
+
fd = FrozenDict({"key": "value", "num": 42, "bool": True})
|
|
20
|
+
assert fd["key"] == "value"
|
|
21
|
+
assert fd["num"] == 42
|
|
22
|
+
assert fd["bool"] is True
|
|
23
|
+
|
|
24
|
+
def test_getitem_keyerror(self) -> None:
|
|
25
|
+
fd = FrozenDict({"a": 1})
|
|
26
|
+
with pytest.raises(KeyError):
|
|
27
|
+
fd["missing"]
|
|
28
|
+
|
|
29
|
+
def test_iter(self) -> None:
|
|
30
|
+
data = {"x": 10, "y": 20, "z": 30}
|
|
31
|
+
fd = FrozenDict(data)
|
|
32
|
+
keys = list(fd)
|
|
33
|
+
assert keys == ["x", "y", "z"]
|
|
34
|
+
|
|
35
|
+
def test_len(self) -> None:
|
|
36
|
+
assert len(FrozenDict({})) == 0
|
|
37
|
+
assert len(FrozenDict({"a": 1})) == 1
|
|
38
|
+
assert len(FrozenDict({"a": 1, "b": 2, "c": 3})) == 3
|
|
39
|
+
|
|
40
|
+
def test_repr(self) -> None:
|
|
41
|
+
fd = FrozenDict({"a": 1, "b": 2})
|
|
42
|
+
repr_str = repr(fd)
|
|
43
|
+
assert repr_str == "FrozenDict({'a': 1, 'b': 2})"
|
|
44
|
+
|
|
45
|
+
def test_repr_empty(self) -> None:
|
|
46
|
+
fd = FrozenDict({})
|
|
47
|
+
assert repr(fd) == "FrozenDict()"
|
|
48
|
+
|
|
49
|
+
def test_eq_with_frozendict(self) -> None:
|
|
50
|
+
fd1 = FrozenDict({"a": 1, "b": 2})
|
|
51
|
+
fd2 = FrozenDict({"a": 1, "b": 2})
|
|
52
|
+
fd3 = FrozenDict({"a": 1, "b": 3})
|
|
53
|
+
fd4 = FrozenDict({"a": 1, "c": 2})
|
|
54
|
+
|
|
55
|
+
assert fd1 == fd2
|
|
56
|
+
assert fd1 != fd3
|
|
57
|
+
assert fd1 != fd4
|
|
58
|
+
|
|
59
|
+
def test_eq_with_regular_dict(self) -> None:
|
|
60
|
+
fd = FrozenDict({"a": 1, "b": 2})
|
|
61
|
+
regular_dict = {"a": 1, "b": 2}
|
|
62
|
+
different_dict = {"a": 1, "b": 3}
|
|
63
|
+
empty_dict = {}
|
|
64
|
+
|
|
65
|
+
assert fd == regular_dict
|
|
66
|
+
assert fd != different_dict
|
|
67
|
+
assert fd != empty_dict
|
|
68
|
+
|
|
69
|
+
def test_eq_with_ordered_dict(self) -> None:
|
|
70
|
+
fd = FrozenDict({"a": 1, "b": 2})
|
|
71
|
+
od1 = OrderedDict([("a", 1), ("b", 2)])
|
|
72
|
+
od2 = OrderedDict([("b", 2), ("a", 1)])
|
|
73
|
+
od3 = OrderedDict([("a", 1), ("b", 3)])
|
|
74
|
+
|
|
75
|
+
assert fd == od1
|
|
76
|
+
assert fd == od2
|
|
77
|
+
assert fd != od3
|
|
78
|
+
|
|
79
|
+
def test_eq_with_non_mapping(self) -> None:
|
|
80
|
+
fd = FrozenDict({"a": 1})
|
|
81
|
+
assert fd != "not a mapping"
|
|
82
|
+
assert fd != 42
|
|
83
|
+
assert fd != ["a", 1]
|
|
84
|
+
assert fd is not None
|
|
85
|
+
|
|
86
|
+
def test_hash_consistency(self) -> None:
|
|
87
|
+
fd = FrozenDict({"a": 1, "b": 2})
|
|
88
|
+
hash1 = hash(fd)
|
|
89
|
+
hash2 = hash(fd)
|
|
90
|
+
assert hash1 == hash2
|
|
91
|
+
|
|
92
|
+
def test_hash_equal_objects(self) -> None:
|
|
93
|
+
fd1 = FrozenDict({"a": 1, "b": 2})
|
|
94
|
+
fd2 = FrozenDict({"a": 1, "b": 2})
|
|
95
|
+
assert hash(fd1) == hash(fd2)
|
|
96
|
+
|
|
97
|
+
def test_hash_different_objects(self) -> None:
|
|
98
|
+
fd1 = FrozenDict({"a": 1, "b": 2})
|
|
99
|
+
fd2 = FrozenDict({"a": 1, "b": 3})
|
|
100
|
+
fd3 = FrozenDict({"a": 1, "c": 2})
|
|
101
|
+
|
|
102
|
+
assert hash(fd1) != hash(fd2)
|
|
103
|
+
assert hash(fd1) != hash(fd3)
|
|
104
|
+
|
|
105
|
+
def test_hash_order_independence(self) -> None:
|
|
106
|
+
fd1 = FrozenDict({"a": 1, "b": 2})
|
|
107
|
+
fd2 = FrozenDict({"b": 2, "a": 1})
|
|
108
|
+
assert hash(fd1) == hash(fd2)
|
|
109
|
+
|
|
110
|
+
def test_immutability(self) -> None:
|
|
111
|
+
original_data = {"a": 1, "b": 2}
|
|
112
|
+
fd = FrozenDict(original_data)
|
|
113
|
+
|
|
114
|
+
original_data["c"] = 3
|
|
115
|
+
original_data["a"] = 99
|
|
116
|
+
|
|
117
|
+
assert "c" not in fd
|
|
118
|
+
assert fd["a"] == 1
|
|
119
|
+
assert len(fd) == 2
|
|
120
|
+
|
|
121
|
+
with pytest.raises(TypeError, match="object does not support item assignment"):
|
|
122
|
+
fd["a"] = 99 # type: ignore[assignment]
|
|
123
|
+
|
|
124
|
+
def test_mapping_interface(self) -> None:
|
|
125
|
+
fd = FrozenDict({"a": 1, "b": 2})
|
|
126
|
+
assert isinstance(fd, Mapping)
|
|
127
|
+
|
|
128
|
+
assert "a" in fd
|
|
129
|
+
assert "c" not in fd
|
|
130
|
+
assert fd.get("a") == 1
|
|
131
|
+
assert fd.get("c") is None
|
|
132
|
+
assert fd.get("c", "default") == "default"
|
|
133
|
+
|
|
134
|
+
keys = list(fd.keys())
|
|
135
|
+
values = list(fd.values())
|
|
136
|
+
items = list(fd.items())
|
|
137
|
+
|
|
138
|
+
assert set(keys) == {"a", "b"}
|
|
139
|
+
assert set(values) == {1, 2}
|
|
140
|
+
assert set(items) == {("a", 1), ("b", 2)}
|
|
141
|
+
|
|
142
|
+
def test_complex_values(self) -> None:
|
|
143
|
+
complex_data = {"list": [1, 2, 3], "dict": {"nested": "value"}, "tuple": (4, 5, 6), "none": None, "bool": False}
|
|
144
|
+
fd = FrozenDict(complex_data)
|
|
145
|
+
|
|
146
|
+
assert fd["list"] == [1, 2, 3]
|
|
147
|
+
assert fd["dict"] == {"nested": "value"}
|
|
148
|
+
assert fd["tuple"] == (4, 5, 6)
|
|
149
|
+
assert fd["none"] is None
|
|
150
|
+
assert fd["bool"] is False
|
|
151
|
+
|
|
152
|
+
def test_nested_frozendict(self) -> None:
|
|
153
|
+
inner_fd = FrozenDict({"inner_key": "inner_value"})
|
|
154
|
+
outer_fd = FrozenDict({"outer_key": inner_fd})
|
|
155
|
+
|
|
156
|
+
assert outer_fd["outer_key"] == inner_fd
|
|
157
|
+
assert outer_fd["outer_key"]["inner_key"] == "inner_value"
|
|
158
|
+
|
|
159
|
+
def test_hashable_keys_only(self) -> None:
|
|
160
|
+
fd = FrozenDict({"string": 1, 42: 2, (1, 2): 3, frozenset([4, 5]): 4})
|
|
161
|
+
|
|
162
|
+
assert fd["string"] == 1
|
|
163
|
+
assert fd[42] == 2
|
|
164
|
+
assert fd[(1, 2)] == 3
|
|
165
|
+
assert fd[frozenset([4, 5])] == 4
|
|
166
|
+
|
|
167
|
+
def test_dict_methods_not_available(self) -> None:
|
|
168
|
+
fd = FrozenDict({"a": 1})
|
|
169
|
+
|
|
170
|
+
assert not hasattr(fd, "clear")
|
|
171
|
+
assert not hasattr(fd, "pop")
|
|
172
|
+
assert not hasattr(fd, "popitem")
|
|
173
|
+
assert not hasattr(fd, "setdefault")
|
|
174
|
+
assert not hasattr(fd, "update")
|
|
175
|
+
assert not hasattr(fd, "__setitem__")
|
|
176
|
+
assert not hasattr(fd, "__delitem__")
|