arelle-release 2.37.18__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.

Files changed (54) hide show
  1. arelle/CntlrWinMain.py +4 -1
  2. arelle/ModelValue.py +1 -0
  3. arelle/PythonUtil.py +132 -24
  4. arelle/ViewWinTree.py +15 -9
  5. arelle/_version.py +2 -2
  6. arelle/plugin/OimTaxonomy/ModelValueMore.py +15 -0
  7. arelle/plugin/OimTaxonomy/ValidateDTS.py +484 -0
  8. arelle/plugin/OimTaxonomy/ViewXbrlTxmyObj.py +240 -0
  9. arelle/plugin/OimTaxonomy/XbrlAbstract.py +16 -0
  10. arelle/plugin/OimTaxonomy/XbrlConcept.py +67 -0
  11. arelle/plugin/OimTaxonomy/XbrlConst.py +261 -0
  12. arelle/plugin/OimTaxonomy/XbrlCube.py +91 -0
  13. arelle/plugin/OimTaxonomy/XbrlDimension.py +38 -0
  14. arelle/plugin/OimTaxonomy/XbrlDts.py +152 -0
  15. arelle/plugin/OimTaxonomy/XbrlEntity.py +16 -0
  16. arelle/plugin/OimTaxonomy/XbrlGroup.py +22 -0
  17. arelle/plugin/OimTaxonomy/XbrlImportedTaxonomy.py +22 -0
  18. arelle/plugin/OimTaxonomy/XbrlLabel.py +31 -0
  19. arelle/plugin/OimTaxonomy/XbrlNetwork.py +100 -0
  20. arelle/plugin/OimTaxonomy/XbrlProperty.py +28 -0
  21. arelle/plugin/OimTaxonomy/XbrlReference.py +33 -0
  22. arelle/plugin/OimTaxonomy/XbrlReport.py +24 -0
  23. arelle/plugin/OimTaxonomy/XbrlTableTemplate.py +35 -0
  24. arelle/plugin/OimTaxonomy/XbrlTaxonomy.py +93 -0
  25. arelle/plugin/OimTaxonomy/XbrlTaxonomyObject.py +154 -0
  26. arelle/plugin/OimTaxonomy/XbrlTransform.py +17 -0
  27. arelle/plugin/OimTaxonomy/XbrlTypes.py +23 -0
  28. arelle/plugin/OimTaxonomy/XbrlUnit.py +17 -0
  29. arelle/plugin/OimTaxonomy/__init__.py +1038 -0
  30. arelle/plugin/OimTaxonomy/resources/iso4217.json +4479 -0
  31. arelle/plugin/OimTaxonomy/resources/oim-taxonomy-schema.json +935 -0
  32. arelle/plugin/OimTaxonomy/resources/ref.json +333 -0
  33. arelle/plugin/OimTaxonomy/resources/transform-types.json +2481 -0
  34. arelle/plugin/OimTaxonomy/resources/types.json +727 -0
  35. arelle/plugin/OimTaxonomy/resources/utr.json +3046 -0
  36. arelle/plugin/OimTaxonomy/resources/xbrlSpec.json +1082 -0
  37. arelle/plugin/saveOIMTaxonomy.py +311 -0
  38. arelle/plugin/validate/NL/PluginValidationDataExtension.py +35 -1
  39. arelle/plugin/validate/NL/__init__.py +3 -0
  40. arelle/plugin/validate/NL/rules/nl_kvk.py +84 -2
  41. {arelle_release-2.37.18.dist-info → arelle_release-2.37.19.dist-info}/METADATA +2 -1
  42. {arelle_release-2.37.18.dist-info → arelle_release-2.37.19.dist-info}/RECORD +54 -19
  43. tests/integration_tests/validation/README.md +2 -0
  44. tests/integration_tests/validation/conformance_suite_configurations/nl_inline_2024.py +15 -4
  45. tests/integration_tests/validation/run_conformance_suites.py +10 -1
  46. tests/integration_tests/validation/validation_util.py +10 -5
  47. tests/unit_tests/arelle/test_frozen_dict.py +176 -0
  48. tests/unit_tests/arelle/test_frozen_ordered_set.py +315 -0
  49. tests/unit_tests/arelle/test_import.py +31 -0
  50. tests/unit_tests/arelle/test_ordered_set.py +272 -0
  51. {arelle_release-2.37.18.dist-info → arelle_release-2.37.19.dist-info}/WHEEL +0 -0
  52. {arelle_release-2.37.18.dist-info → arelle_release-2.37.19.dist-info}/entry_points.txt +0 -0
  53. {arelle_release-2.37.18.dist-info → arelle_release-2.37.19.dist-info}/licenses/LICENSE.md +0 -0
  54. {arelle_release-2.37.18.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=cez8Hny52XrZXs2jfiJmtvgolnQzTX6F6j3vFpLuU1Y,97090
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=6Vko4aytXg2Ajv7rI6houQb-ZX39-tcjQ4N90ZxZvE8,39430
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=3KKIOr8WdyhgEmp-YsF3jhmZAZli7TN8hP_g84xHBXY,8967
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=4DxuqXqp7XvP7Qog2NhTU7OHcQMaQ-AsW-4NwyyDeeQ,19434
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=-3_r4ZUS1xK7cB9HCvvE6oT1XuNDXspJhS2A0xIRgvA,515
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=Jkrri2b_t-bHPGafvppz47eC5fRDNmhztWfKKB0pojI,15960
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=GFM77Mv7OJkLKrZUEB_LmF5x3h4U5J9NsD1lven0N9o,2708
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=XryD-e0YJJG7n-rzw3E_m43_QUEjasIebmBhWdxZ-aE,29370
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.18.dist-info/licenses/LICENSE.md,sha256=Q0tn6q0VUbr-NM8916513NCIG8MNzo24Ev-sxMUBRZc,3959
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=Fo3TpMmOlo4llngPKtdfnemS0TeI3ou-ceX8f4u1K-Y,2907
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=pDtBUEfT-pggxKEN2cg3vk0_Cko6wgV3x-6cX7y3Y3M,8206
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=zG4ZvrEGNixQ7vpeOkXMTnmYZCXmn27rpirfk2mLzCA,21658
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=9NBnt0fti8KNqgM--PXxGPC6uU5wmUN0nRTaWjkdXJI,10510
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=FMUQwBgOacXkRUn591V3cB6xNMV2cruOxzcWQOwnxrc,1650
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.18.dist-info/METADATA,sha256=VR8B9dKSD5XRj8ZAzRjozLUWFp9VwkePlxRax3CfW74,9065
1563
- arelle_release-2.37.18.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
1564
- arelle_release-2.37.18.dist-info/entry_points.txt,sha256=Uj5niwfwVsx3vaQ3fYj8hrZ1xpfCJyTUA09tYKWbzpo,111
1565
- arelle_release-2.37.18.dist-info/top_level.txt,sha256=ZYmYGmhW5Jvo3vJ4iXBZPUI29LvYhntom04w90esJvU,13
1566
- arelle_release-2.37.18.dist-info/RECORD,,
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) -> list[ParameterSet]:
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) -> list[ParameterSet]:
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) -> list[ParameterSet]:
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__")