floodmodeller-api 0.5.3__tar.gz → 0.5.3.post2__tar.gz

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.
Files changed (270) hide show
  1. {floodmodeller_api-0.5.3/floodmodeller_api.egg-info → floodmodeller_api-0.5.3.post2}/PKG-INFO +1 -1
  2. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/dat.py +100 -52
  3. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/ied.py +1 -1
  4. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/ief.py +20 -3
  5. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_dat.py +73 -1
  6. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/All Units 4_6.DAT +0 -2
  7. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/All Units 4_6.feb +0 -2
  8. floodmodeller_api-0.5.3.post2/floodmodeller_api/test/test_data/duplicate_unit_test.dat +18 -0
  9. floodmodeller_api-0.5.3.post2/floodmodeller_api/test/test_data/duplicate_unit_test_unsupported.dat +28 -0
  10. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/encoding_test_cp1252.dat +0 -2
  11. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/encoding_test_utf8.dat +0 -2
  12. floodmodeller_api-0.5.3.post2/floodmodeller_api/test/test_data/multievent.ief +43 -0
  13. floodmodeller_api-0.5.3.post2/floodmodeller_api/test/test_data/remove_dummy_test.dat +19 -0
  14. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_ief.py +67 -0
  15. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_json.py +3 -0
  16. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_read_file.py +3 -0
  17. floodmodeller_api-0.5.3.post2/floodmodeller_api/test/test_sluice.py +31 -0
  18. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/structures.py +1 -1
  19. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/units.py +1 -0
  20. floodmodeller_api-0.5.3.post2/floodmodeller_api/version.py +1 -0
  21. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2/floodmodeller_api.egg-info}/PKG-INFO +1 -1
  22. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api.egg-info/SOURCES.txt +5 -0
  23. floodmodeller_api-0.5.3/floodmodeller_api/version.py +0 -1
  24. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/LICENSE.txt +0 -0
  25. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/MANIFEST.in +0 -0
  26. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/README.md +0 -0
  27. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/__init__.py +0 -0
  28. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/_base.py +0 -0
  29. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/backup.py +0 -0
  30. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/diff.py +0 -0
  31. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/hydrology_plus/__init__.py +0 -0
  32. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/hydrology_plus/helper.py +0 -0
  33. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/hydrology_plus/hydrology_plus_export.py +0 -0
  34. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/ief_flags.py +0 -0
  35. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/inp.py +0 -0
  36. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/libs/libifcoremd.dll +0 -0
  37. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/libs/libifcoremt.so.5 +0 -0
  38. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/libs/libifport.so.5 +0 -0
  39. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/libs/libimf.so +0 -0
  40. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/libs/libintlc.so.5 +0 -0
  41. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/libs/libmmd.dll +0 -0
  42. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/libs/libsvml.so +0 -0
  43. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/libs/libzzn_read.so +0 -0
  44. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/libs/zzn_read.dll +0 -0
  45. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/logs/__init__.py +0 -0
  46. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/logs/lf.py +0 -0
  47. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/logs/lf_helpers.py +0 -0
  48. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/logs/lf_params.py +0 -0
  49. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/mapping.py +0 -0
  50. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/__init__.py +0 -0
  51. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/conftest.py +0 -0
  52. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_backup.py +0 -0
  53. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_conveyance.py +0 -0
  54. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/7082.ief +0 -0
  55. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/BRIDGE.DAT +0 -0
  56. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/BaseModel_2D_Q100.ief +0 -0
  57. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Baseline_unchecked.csv +0 -0
  58. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Constant QT.ief +0 -0
  59. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.dat +0 -0
  60. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.feb +0 -0
  61. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/DamBreakADI.xml +0 -0
  62. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/DamBreakFAST.xml +0 -0
  63. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/DamBreakFAST_dy.xml +0 -0
  64. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/DamBreakTVD.xml +0 -0
  65. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/DefenceBreach.xml +0 -0
  66. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/DefenceBreachFAST.xml +0 -0
  67. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/DefenceBreachFAST_dy.xml +0 -0
  68. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Domain1+2_QH.xml +0 -0
  69. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Domain1_H.xml +0 -0
  70. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Domain1_Q.xml +0 -0
  71. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Domain1_Q_FAST.xml +0 -0
  72. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Domain1_Q_FAST_dy.xml +0 -0
  73. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Domain1_Q_xml_expected.json +0 -0
  74. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Domain1_W.xml +0 -0
  75. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX1.DAT +0 -0
  76. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX1.ext +0 -0
  77. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX1.feb +0 -0
  78. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX1.gxy +0 -0
  79. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX17.DAT +0 -0
  80. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX17.ext +0 -0
  81. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX17.feb +0 -0
  82. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX18.DAT +0 -0
  83. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX18_DAT_expected.json +0 -0
  84. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX2.DAT +0 -0
  85. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX3.DAT +0 -0
  86. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX3_DAT_expected.json +0 -0
  87. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX3_IEF_expected.json +0 -0
  88. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX6.DAT +0 -0
  89. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX6.ext +0 -0
  90. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX6.feb +0 -0
  91. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/EX6_DAT_expected.json +0 -0
  92. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Event Data Example.DAT +0 -0
  93. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Event Data Example.ext +0 -0
  94. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Event Data Example.feb +0 -0
  95. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/FEH boundary.ief +0 -0
  96. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Linked1D2D.xml +0 -0
  97. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Linked1D2DFAST.xml +0 -0
  98. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Linked1D2DFAST_dy.xml +0 -0
  99. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/Linked1D2D_xml_expected.json +0 -0
  100. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/P3Panels_UNsteady.ief +0 -0
  101. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/QT in dat file.ief +0 -0
  102. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/T10.ief +0 -0
  103. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/T2.ief +0 -0
  104. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/T5.ief +0 -0
  105. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/blockage.dat +0 -0
  106. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/blockage.ext +0 -0
  107. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/blockage.feb +0 -0
  108. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/blockage.gxy +0 -0
  109. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/conveyance_test.dat +0 -0
  110. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/conveyance_test.feb +0 -0
  111. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/conveyance_test.gxy +0 -0
  112. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/defaultUnits.dat +0 -0
  113. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/defaultUnits.ext +0 -0
  114. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/defaultUnits.feb +0 -0
  115. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/defaultUnits.fmpx +0 -0
  116. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/defaultUnits.gxy +0 -0
  117. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/df_flows_hplus.csv +0 -0
  118. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/event_hplus.csv +0 -0
  119. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/ex3.ief +0 -0
  120. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/ex3.lf1 +0 -0
  121. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/ex4.DAT +0 -0
  122. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/ex4.ief +0 -0
  123. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/ex4_changed.DAT +0 -0
  124. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/ex6.ief +0 -0
  125. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/example1.inp +0 -0
  126. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/example2.inp +0 -0
  127. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/example3.inp +0 -0
  128. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/example4.inp +0 -0
  129. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/example5.inp +0 -0
  130. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/example6.inp +0 -0
  131. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/example_h+_export.csv +0 -0
  132. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/expected_conveyance.csv +0 -0
  133. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/floodplain.dat +0 -0
  134. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/hplus_export_example_1.csv +0 -0
  135. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/hplus_export_example_10.csv +0 -0
  136. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/hplus_export_example_2.csv +0 -0
  137. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/hplus_export_example_3.csv +0 -0
  138. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/hplus_export_example_4.csv +0 -0
  139. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/hplus_export_example_5.csv +0 -0
  140. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/hplus_export_example_6.csv +0 -0
  141. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/hplus_export_example_7.csv +0 -0
  142. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/hplus_export_example_8.csv +0 -0
  143. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/hplus_export_example_9.csv +0 -0
  144. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/integrated_bridge/AR_NoSP_NoBl_2O_NO_OneFRC.ied +0 -0
  145. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/integrated_bridge/AR_vSP_25pc_1O.ied +0 -0
  146. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/integrated_bridge/PL_vSP_25pc_1O.ied +0 -0
  147. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/integrated_bridge/SBTwoFRCsStaggered.IED +0 -0
  148. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/integrated_bridge/US_NoSP_NoBl_OR_RN.ied +0 -0
  149. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/integrated_bridge/US_SP_NoBl_OR_frc_PT2-5_RN.ied +0 -0
  150. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/integrated_bridge/US_fSP_NoBl_1O.ied +0 -0
  151. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/integrated_bridge/US_nSP_NoBl_1O.ied +0 -0
  152. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/integrated_bridge/US_vSP_NoBl_2O_Para.ied +0 -0
  153. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/integrated_bridge.dat +0 -0
  154. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/jump.dat +0 -0
  155. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/lf_complex_ex.lf1 +0 -0
  156. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.dat +0 -0
  157. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.ext +0 -0
  158. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.exy +0 -0
  159. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.feb +0 -0
  160. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.ied +0 -0
  161. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.ief +0 -0
  162. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.inp +0 -0
  163. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.mmm +0 -0
  164. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.pxy +0 -0
  165. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.uic +0 -0
  166. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.zzd +0 -0
  167. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.zzl +0 -0
  168. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.zzn +0 -0
  169. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.zzu +0 -0
  170. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network.zzx +0 -0
  171. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network_dat_expected.json +0 -0
  172. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network_ied_expected.json +0 -0
  173. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/network_with_comments.ied +0 -0
  174. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/rnweir.dat +0 -0
  175. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/rnweir.ext +0 -0
  176. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/rnweir.feb +0 -0
  177. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/rnweir.gxy +0 -0
  178. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/rnweir_default.dat +0 -0
  179. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/rnweir_default.ext +0 -0
  180. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/rnweir_default.feb +0 -0
  181. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/rnweir_default.fmpx +0 -0
  182. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/rnweir_default.gxy +0 -0
  183. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/structure_logs/EX17_expected.csv +0 -0
  184. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/structure_logs/EX17_expected.json +0 -0
  185. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/structure_logs/EX18_expected.csv +0 -0
  186. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/structure_logs/EX18_expected.json +0 -0
  187. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/structure_logs/EX6_expected.csv +0 -0
  188. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/structure_logs/EX6_expected.json +0 -0
  189. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_flow.csv +0 -0
  190. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_fr.csv +0 -0
  191. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_max.csv +0 -0
  192. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_mode.csv +0 -0
  193. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_stage.csv +0 -0
  194. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_state.csv +0 -0
  195. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_velocity.csv +0 -0
  196. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_left_fp_h.csv +0 -0
  197. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_left_fp_mode.csv +0 -0
  198. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_link_inflow.csv +0 -0
  199. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_max.csv +0 -0
  200. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_right_fp_h.csv +0 -0
  201. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_right_fp_mode.csv +0 -0
  202. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_data/unit checks.dat +0 -0
  203. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_flowtimeprofile.py +0 -0
  204. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_fmfile.py +0 -0
  205. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_hydrology_plus_export.py +0 -0
  206. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_ied.py +0 -0
  207. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_inp.py +0 -0
  208. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_integrated_bridge.py +0 -0
  209. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_logs_lf.py +0 -0
  210. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_river.py +0 -0
  211. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_tool.py +0 -0
  212. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_toolbox_structure_log.py +0 -0
  213. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_unit.py +0 -0
  214. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_xml2d.py +0 -0
  215. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/test/test_zz.py +0 -0
  216. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/to_from_json.py +0 -0
  217. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/tool.py +0 -0
  218. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/__init__.py +0 -0
  219. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/example_tool.py +0 -0
  220. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/gui/bg.PNG +0 -0
  221. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/gui/logo.PNG +0 -0
  222. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/model_build/__init__.py +0 -0
  223. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/model_build/add_siltation_definition.py +0 -0
  224. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/model_build/structure_log/__init__.py +0 -0
  225. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +0 -0
  226. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/model_build/structure_log_definition.py +0 -0
  227. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/model_conversion/__init__.py +0 -0
  228. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/model_review/__init__.py +0 -0
  229. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/toolbox/results_analysis/__init__.py +0 -0
  230. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/__init__.py +0 -0
  231. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/_base.py +0 -0
  232. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/_helpers.py +0 -0
  233. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/boundaries.py +0 -0
  234. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/comment.py +0 -0
  235. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/conduits.py +0 -0
  236. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/connectors.py +0 -0
  237. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/controls.py +0 -0
  238. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/conveyance.py +0 -0
  239. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/iic.py +0 -0
  240. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/losses.py +0 -0
  241. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/sections.py +0 -0
  242. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/unsupported.py +0 -0
  243. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/units/variables.py +0 -0
  244. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/urban1d/__init__.py +0 -0
  245. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/urban1d/_base.py +0 -0
  246. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/urban1d/conduits.py +0 -0
  247. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/urban1d/general_parameters.py +0 -0
  248. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/urban1d/junctions.py +0 -0
  249. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/urban1d/losses.py +0 -0
  250. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/urban1d/outfalls.py +0 -0
  251. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/urban1d/raingauges.py +0 -0
  252. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/urban1d/subsections.py +0 -0
  253. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/urban1d/xsections.py +0 -0
  254. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/util.py +0 -0
  255. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/validation/__init__.py +0 -0
  256. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/validation/parameters.py +0 -0
  257. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/validation/urban_parameters.py +0 -0
  258. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/validation/validation.py +0 -0
  259. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/xml2d.py +0 -0
  260. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/xml2d_template.py +0 -0
  261. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/xsd_backup.xml +0 -0
  262. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api/zz.py +0 -0
  263. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api.egg-info/dependency_links.txt +0 -0
  264. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api.egg-info/entry_points.txt +0 -0
  265. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api.egg-info/requires.txt +0 -0
  266. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/floodmodeller_api.egg-info/top_level.txt +0 -0
  267. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/pyproject.toml +0 -0
  268. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/requirements.txt +0 -0
  269. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/setup.cfg +0 -0
  270. {floodmodeller_api-0.5.3 → floodmodeller_api-0.5.3.post2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: floodmodeller_api
3
- Version: 0.5.3
3
+ Version: 0.5.3.post2
4
4
  Summary: Extends the functionality of Flood Modeller to python users
5
5
  Author: Jacobs
6
6
  Author-email: joe.pierce@jacobs.com
@@ -453,12 +453,14 @@ class DAT(FMFile):
453
453
  "losses": [],
454
454
  "connectors": [],
455
455
  "controls": [],
456
+ "_unsupported": [],
456
457
  }
457
458
 
458
459
  for block in self._dat_struct:
459
460
  # Check for all supported boundary types
460
- if block["Type"] not in units.SUPPORTED_UNIT_TYPES:
461
+ if block["Type"] not in units.ALL_UNIT_TYPES:
461
462
  continue
463
+ unit_type = block["Type"]
462
464
  # clause for when unit has been inserted into the dat file
463
465
  if "new_insert" in block:
464
466
  block["start"] = prev_block_end + 1
@@ -474,24 +476,26 @@ class DAT(FMFile):
474
476
  ]
475
477
  prev_block_len = len(unit_data)
476
478
 
477
- if block["Type"] == "INITIAL CONDITIONS":
479
+ if unit_type == "INITIAL CONDITIONS":
478
480
  new_unit_data = self.initial_conditions._write()
479
- elif block["Type"] == "COMMENT":
481
+ elif unit_type == "COMMENT":
480
482
  comment = comment_units[comment_tracker]
481
483
  new_unit_data = comment._write()
482
484
  comment_tracker += 1
483
485
 
484
- elif block["Type"] == "VARIABLES":
486
+ elif unit_type == "VARIABLES":
485
487
  new_unit_data = self.variables._write()
486
488
 
487
489
  else:
488
- if units.SUPPORTED_UNIT_TYPES[block["Type"]]["has_subtype"]:
489
- unit_name = unit_data[2][: self._label_len].strip()
490
+ if unit_type in units.SUPPORTED_UNIT_TYPES:
491
+ unit_name = self._get_supported_unit_name(unit_type, unit_data)
492
+ unit_group_str = units.SUPPORTED_UNIT_TYPES[unit_type]["group"]
490
493
  else:
491
- unit_name = unit_data[1][: self._label_len].strip()
494
+ unit_name, _ = self._get_unsupported_unit_name(unit_type, unit_data)
495
+ unit_name = f"{unit_name} ({unit_type})"
496
+ unit_group_str = "_unsupported"
492
497
 
493
498
  # Get unit object
494
- unit_group_str = units.SUPPORTED_UNIT_TYPES[block["Type"]]["group"]
495
499
  unit_group = getattr(self, unit_group_str)
496
500
  if unit_name in unit_group:
497
501
  # block still exists
@@ -571,22 +575,31 @@ class DAT(FMFile):
571
575
  raise Exception(msg)
572
576
  # Changes done to account for unit types with spaces/dashes eg Flat-V Weir
573
577
  unit_type_safe = unit_type.replace(" ", "_").replace("-", "_")
574
- unit_group[unit_name] = eval(
575
- f"units.{unit_type_safe}({unit_data}, {self._label_len})",
576
- )
578
+ unit_group[unit_name] = getattr(units, unit_type_safe)(unit_data, self._label_len)
577
579
  self._all_units.append(unit_group[unit_name])
578
580
 
579
581
  def _process_unsupported_unit(self, unit_type, unit_data) -> None:
580
582
  # Check to see whether unit type has associated subtypes so that unit name can be correctly assigned
581
583
  unit_name, subtype = self._get_unsupported_unit_name(unit_type, unit_data)
582
- self._unsupported[f"{unit_name} ({unit_type})"] = units.UNSUPPORTED(
584
+ unit_name_and_type = f"{unit_name} ({unit_type})"
585
+ if unit_name_and_type in self._unsupported:
586
+ msg = (
587
+ f"Duplicate label ({unit_name_and_type}) encountered within category: _unsupported"
588
+ )
589
+ raise Exception(msg)
590
+ self._unsupported[unit_name_and_type] = units.UNSUPPORTED(
583
591
  unit_data,
584
592
  self._label_len,
585
593
  unit_name=unit_name,
586
594
  unit_type=unit_type,
587
595
  subtype=subtype,
588
596
  )
589
- self._all_units.append(self._unsupported[f"{unit_name} ({unit_type})"])
597
+ self._all_units.append(self._unsupported[unit_name_and_type])
598
+
599
+ def _get_supported_unit_name(self, unit_type: str, unit_data: list[str]) -> str:
600
+ if units.SUPPORTED_UNIT_TYPES[unit_type]["has_subtype"]:
601
+ return unit_data[2][: self._label_len].strip()
602
+ return unit_data[1][: self._label_len].strip()
590
603
 
591
604
  def _get_unsupported_unit_name(self, unit_type: str, unit_data: list[str]) -> tuple[str, bool]:
592
605
  # Check if the unit type has associated subtypes
@@ -710,6 +723,19 @@ class DAT(FMFile):
710
723
 
711
724
  return unit_block, in_block
712
725
 
726
+ @property
727
+ def node_labels(self):
728
+ all_labels = set()
729
+ for unit in self._all_units:
730
+ all_labels.update(unit.all_labels)
731
+ return all_labels
732
+
733
+ def _get_unit_group_name(self, unit: Unit) -> str:
734
+ unit_type = unit.unit
735
+ if unit_type in units.SUPPORTED_UNIT_TYPES:
736
+ return units.SUPPORTED_UNIT_TYPES[unit_type]["group"]
737
+ return "_unsupported"
738
+
713
739
  @handle_exception(when="remove unit from")
714
740
  def remove_unit(self, unit: Unit) -> None:
715
741
  """Remove a unit from the dat file.
@@ -734,19 +760,23 @@ class DAT(FMFile):
734
760
  # remove from raw data
735
761
  del self._raw_data[dat_struct_unit["start"] : dat_struct_unit["end"] + 1]
736
762
  # remove from unit group
737
- unit_group_name = units.SUPPORTED_UNIT_TYPES[unit._unit]["group"]
763
+ unit_group_name = self._get_unit_group_name(unit)
738
764
  unit_group = getattr(self, unit_group_name)
739
- del unit_group[unit.name]
740
- # remove from ICs
741
- self.initial_conditions.data = self.initial_conditions.data.loc[
742
- self.initial_conditions.data["label"] != unit.name
743
- ]
765
+ if unit_group_name == "_unsupported":
766
+ del unit_group[f"{unit.name} ({unit.unit})"]
767
+ else:
768
+ del unit_group[unit.name]
769
+ # remove from ICs if no more labels
770
+ if unit.name not in self.node_labels:
771
+ self.initial_conditions.data = self.initial_conditions.data.loc[
772
+ self.initial_conditions.data["label"] != unit.name
773
+ ]
774
+ self.general_parameters["Node Count"] -= 1
744
775
 
745
776
  self._update_dat_struct()
746
- self.general_parameters["Node Count"] -= 1
747
777
 
748
778
  @handle_exception(when="insert unit into")
749
- def insert_unit( # noqa: C901, PLR0912
779
+ def insert_unit(
750
780
  self,
751
781
  unit: Unit,
752
782
  add_before: Unit | None = None,
@@ -769,6 +799,48 @@ class DAT(FMFile):
769
799
  NameError: Raised if unit name already appears in unit group.
770
800
  """
771
801
  # catch errors
802
+ self._validate_insert_unit_params(unit, add_before, add_after, add_at)
803
+
804
+ unit_class = unit._unit
805
+ if unit_class != "COMMENT":
806
+ _validate_unit(unit)
807
+ unit_group_name = self._get_unit_group_name(unit)
808
+ unit_group = getattr(self, unit_group_name)
809
+ if unit.name in unit_group:
810
+ msg = "Name already appears in unit group. Cannot have two units with same name in same group"
811
+ raise NameError(msg)
812
+
813
+ insert_index = self._get_insert_index(add_before, add_after, add_at)
814
+
815
+ unit_data = unit._write()
816
+ if unit._unit != "COMMENT":
817
+ if unit_group_name == "_unsupported":
818
+ unit_group[f"{unit.name} ({unit.unit})"] = unit
819
+ else:
820
+ unit_group[unit.name] = unit
821
+ self._dat_struct.insert(
822
+ insert_index + 1,
823
+ {"Type": unit_class, "new_insert": unit_data},
824
+ ) # add to dat struct without unit.name
825
+
826
+ if unit._unit != "COMMENT" and unit.name not in self.node_labels:
827
+ # update the iic's tables
828
+ iic_data = [unit.name, "y", 00.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
829
+ self.initial_conditions.data.loc[len(self.initial_conditions.data)] = iic_data # flaged
830
+ self.general_parameters["Node Count"] += 1 # flag no update for comments
831
+
832
+ self._all_units.insert(insert_index, unit)
833
+ if not defer_update:
834
+ self._update_raw_data()
835
+ self._update_dat_struct()
836
+
837
+ def _validate_insert_unit_params(
838
+ self,
839
+ unit: Unit,
840
+ add_before: Unit | None,
841
+ add_after: Unit | None,
842
+ add_at: int | None,
843
+ ):
772
844
  provided_params = sum(arg is not None for arg in (add_before, add_after, add_at))
773
845
  if provided_params == 0:
774
846
  msg = "No positional argument given. Please provide either add_before, add_at or add_after"
@@ -783,15 +855,12 @@ class DAT(FMFile):
783
855
  msg = "add_before or add_after argument must be a Flood Modeller Unit type"
784
856
  raise TypeError(msg)
785
857
 
786
- unit_class = unit._unit
787
- if unit_class != "COMMENT":
788
- _validate_unit(unit)
789
- unit_group_name = units.SUPPORTED_UNIT_TYPES[unit._unit]["group"]
790
- unit_group = getattr(self, unit_group_name)
791
- if unit.name in unit_group:
792
- msg = "Name already appears in unit group. Cannot have two units with same name in same group"
793
- raise NameError(msg)
794
-
858
+ def _get_insert_index(
859
+ self,
860
+ add_before: Unit | None,
861
+ add_after: Unit | None,
862
+ add_at: int | None,
863
+ ) -> int:
795
864
  # positional argument
796
865
  if add_at is not None:
797
866
  insert_index = add_at
@@ -812,28 +881,7 @@ class DAT(FMFile):
812
881
  f"{check_unit} not found in dat network, so cannot be used to add before/after"
813
882
  )
814
883
  raise Exception(msg)
815
-
816
- unit_data = unit._write()
817
- self._all_units.insert(insert_index, unit)
818
- if unit._unit != "COMMENT":
819
- unit_group[unit.name] = unit
820
- self._dat_struct.insert(
821
- insert_index + 1,
822
- {"Type": unit_class, "new_insert": unit_data},
823
- ) # add to dat struct without unit.name
824
-
825
- if unit._unit != "COMMENT":
826
- # update the iic's tables
827
- iic_data = [unit.name, "y", 00.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
828
- self.initial_conditions.data.loc[len(self.initial_conditions.data)] = iic_data # flaged
829
-
830
- # update all
831
- if unit._unit != "COMMENT":
832
- self.general_parameters["Node Count"] += 1 # flag no update for comments
833
-
834
- if not defer_update:
835
- self._update_raw_data()
836
- self._update_dat_struct()
884
+ return insert_index
837
885
 
838
886
  def insert_units(
839
887
  self,
@@ -183,7 +183,7 @@ class IED(FMFile):
183
183
  if unit_name in unit_group:
184
184
  msg = f'Duplicate label ({unit_name}) encountered within category: {units.SUPPORTED_UNIT_TYPES[block["Type"]]["group"]}'
185
185
  raise Exception(msg)
186
- unit_group[unit_name] = eval(f'units.{block["Type"]}({unit_data})')
186
+ unit_group[unit_name] = getattr(units, block["Type"])(unit_data)
187
187
 
188
188
  self._all_units.append(unit_group[unit_name])
189
189
 
@@ -18,6 +18,7 @@ from __future__ import annotations
18
18
 
19
19
  import csv
20
20
  import logging
21
+ import re
21
22
  import subprocess
22
23
  import time
23
24
  from io import StringIO
@@ -98,6 +99,8 @@ class IEF(FMFile):
98
99
  self._ief_properties: list[str] = []
99
100
  self.EventData: dict[str, str] = {}
100
101
  self.flowtimeprofiles: list[FlowTimeProfile] = []
102
+
103
+ raw_eventdata: list[tuple[str, str]] = []
101
104
  for line in raw_data:
102
105
  # Handle any comments here (prefixed with ;)
103
106
  if line.lstrip().startswith(";"):
@@ -116,7 +119,7 @@ class IEF(FMFile):
116
119
  event_data_title = value
117
120
  else:
118
121
  event_data_title = prev_comment
119
- self.eventdata[event_data_title] = value
122
+ raw_eventdata.append((event_data_title, value))
120
123
  self._ief_properties.append("EventData")
121
124
 
122
125
  elif prop.upper().startswith("FLOWTIMEPROFILE"):
@@ -134,6 +137,7 @@ class IEF(FMFile):
134
137
  self._ief_properties.append(line)
135
138
  prev_comment = None
136
139
 
140
+ self._eventdata_read_helper(raw_eventdata)
137
141
  self._check_formatting(raw_data)
138
142
  self._update_ief_properties() # call this here to ensure ief properties is correct
139
143
 
@@ -179,7 +183,10 @@ class IEF(FMFile):
179
183
  # Add multiple EventData if present
180
184
  for idx, key in enumerate(event_data):
181
185
  if idx == event_index:
182
- ief_string += f";{key}\nEventData{eq}{event_data[key]!s}\n"
186
+ # we enter this block if we're ready to write the event data
187
+ # scrub off any extra bits we've added as part of the make-unique bit of reading.
188
+ title = re.sub(r"<\d>$", "", key)
189
+ ief_string += f";{title}\nEventData{eq}{event_data[key]!s}\n"
183
190
  break
184
191
  event_index += 1
185
192
 
@@ -328,6 +335,16 @@ class IEF(FMFile):
328
335
  if removed == to_remove:
329
336
  break
330
337
 
338
+ def _eventdata_read_helper(self, raw_eventdata: list[tuple[str, str]]) -> None:
339
+ # now we deal with the event data, and convert it into the dict-based .eventdata
340
+ for title, ied_path in raw_eventdata:
341
+ n = 0
342
+ new_title = title or "<0>" # set empty string to placeholder
343
+ while new_title in self.eventdata:
344
+ new_title = f"{title}<{n}>"
345
+ n += 1
346
+ self.eventdata[new_title] = ied_path
347
+
331
348
  def _update_flowtimeprofile_info(self) -> None:
332
349
  """Update the flowtimeprofile data stored in ief properties"""
333
350
  if not hasattr(self, "flowtimeprofiles") or len(self.flowtimeprofiles) == 0:
@@ -570,7 +587,7 @@ class IEF(FMFile):
570
587
 
571
588
  return ZZN(result_path)
572
589
 
573
- def get_log(self):
590
+ def get_log(self) -> LF1:
574
591
  """If log files for the simulation exist, this function returns them as a LF1 class object
575
592
 
576
593
  Returns:
@@ -5,7 +5,7 @@ from unittest.mock import patch
5
5
  import pytest
6
6
 
7
7
  from floodmodeller_api import DAT
8
- from floodmodeller_api.units import JUNCTION, LATERAL, QTBDY, RESERVOIR
8
+ from floodmodeller_api.units import JUNCTION, LATERAL, QTBDY, RESERVOIR, UNSUPPORTED
9
9
  from floodmodeller_api.util import FloodModellerAPIError
10
10
 
11
11
 
@@ -42,6 +42,28 @@ def dat_ex6(test_workspace):
42
42
  yield dat
43
43
 
44
44
 
45
+ @pytest.fixture()
46
+ def unsupported_dummy_unit():
47
+ data = [
48
+ "APITESTDUMMY Dummy unnsupported unit for testing purposes",
49
+ "LBL001 LBL002",
50
+ "arbitrary data",
51
+ " table01234",
52
+ " -0.500 0.000 0.000 0.000091000000.0",
53
+ " 0.000 1.000 1.000 0.0000 910000000",
54
+ " 1.000 2.000 2.000 0.000091000000.0",
55
+ " 2.000 3.000 3.000 0.000091000000.0",
56
+ " 5.000 3.000 3.000 0.000091000000.0",
57
+ ]
58
+ return UNSUPPORTED(
59
+ data,
60
+ 12,
61
+ unit_name="LBL001",
62
+ unit_type="APITESTDUMMY",
63
+ subtype=False,
64
+ )
65
+
66
+
45
67
  def test_changing_section_and_dist_works(dat_fp, data_before):
46
68
  """DAT: Test changing and reverting section name and dist to next makes no changes"""
47
69
  dat = DAT(dat_fp)
@@ -74,6 +96,9 @@ def test_changing_and_reverting_qtbdy_hydrograph_works(dat_fp, data_before):
74
96
  def test_dat_read_doesnt_change_data(test_workspace, tmp_path):
75
97
  """DAT: Check all '.dat' files in folder by reading the _write() output into a new DAT instance and checking it stays the same."""
76
98
  for datfile in Path(test_workspace).glob("*.dat"):
99
+ if datfile.name.startswith("duplicate_unit_test"):
100
+ # Skipping as invalid DAT (duplicate units)
101
+ continue
77
102
  dat = DAT(datfile)
78
103
  first_output = dat._write()
79
104
  new_path = tmp_path / "tmp.dat"
@@ -380,3 +405,50 @@ def test_encoding(test_workspace: Path, dat_str: str, label: str, tmp_path: Path
380
405
 
381
406
  assert label in dat_read.sections
382
407
  assert label in dat_write.sections # remains as \xc3\xa5 even for utf8
408
+
409
+
410
+ def test_insert_unsupported_unit(tmp_path: Path, unsupported_dummy_unit):
411
+ new_dat = DAT()
412
+ new_dat.insert_unit(unsupported_dummy_unit, add_at=-1)
413
+ assert unsupported_dummy_unit in new_dat._unsupported.values()
414
+ assert len(new_dat._all_units) == 1
415
+ filepath = tmp_path / "insert_dummy_test.dat"
416
+ new_dat.save(filepath)
417
+
418
+ dat = DAT(filepath)
419
+ assert unsupported_dummy_unit in dat._unsupported.values()
420
+ assert len(dat._all_units) == 1
421
+
422
+
423
+ def test_remove_unsupported_unit(test_workspace, unsupported_dummy_unit):
424
+ dat = DAT(test_workspace / "remove_dummy_test.dat")
425
+ assert len(dat._all_units) == 1
426
+ assert len(dat._dat_struct) == 3
427
+ assert len(dat.initial_conditions.data) == 1
428
+ assert "LBL001 (APITESTDUMMY)" in dat._unsupported
429
+ dat.remove_unit(unsupported_dummy_unit)
430
+ assert len(dat._all_units) == 0
431
+ assert len(dat._dat_struct) == 2
432
+ assert len(dat.initial_conditions.data) == 0
433
+ assert "LBL001 (APITESTDUMMY)" not in dat._unsupported
434
+ dat._write()
435
+ assert len(dat._all_units) == 0
436
+ assert len(dat._dat_struct) == 2
437
+ assert len(dat.initial_conditions.data) == 0
438
+ assert "LBL001 (APITESTDUMMY)" not in dat._unsupported
439
+
440
+
441
+ def test_duplicate_unit_raises_error(test_workspace):
442
+ msg = (
443
+ r"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
444
+ r"\nAPI Error: Problem encountered when trying to read DAT file .*\."
445
+ r"\n"
446
+ r"\nDetails: .*-floodmodeller_api/dat\.py-\d+"
447
+ r"\nMsg: Duplicate label (.*) encountered within category: .*"
448
+ r"\n"
449
+ r"\nFor additional support, go to: https://github\.com/People-Places-Solutions/floodmodeller-api"
450
+ )
451
+ with pytest.raises(FloodModellerAPIError, match=msg):
452
+ DAT(test_workspace / "duplicate_unit_test.dat")
453
+ with pytest.raises(FloodModellerAPIError, match=msg):
454
+ DAT(test_workspace / "duplicate_unit_test_unsupported.dat")
@@ -715,8 +715,6 @@ YARNELL
715
715
  4.000 5.000 6.000 5.000
716
716
  GERRBDY
717
717
  Gerry46
718
- GERRBDY
719
- Gerry46
720
718
  #COMMENT
721
719
 
722
720
  ##CATCHMENT DETAILS
@@ -715,8 +715,6 @@ YARNELL
715
715
  4.000 5.000 6.000 5.000
716
716
  GERRBDY
717
717
  Gerry46
718
- GERRBDY
719
- Gerry46
720
718
  #COMMENT
721
719
 
722
720
  ##CATCHMENT DETAILS
@@ -0,0 +1,18 @@
1
+ duplicate units for test
2
+ #REVISION#1
3
+ 1 0.750 0.900 0.100 0.001 12
4
+ 10.000 0.010 0.010 0.700 0.100 0.700 0.000
5
+ RAD FILE
6
+
7
+ END GENERAL
8
+ QTBDY
9
+ qtboundary
10
+ 1 0.000 0.000 seconds EXTEND LINEAR 1.000
11
+ 20.000 0.000
12
+ QTBDY
13
+ qtboundary
14
+ 1 0.000 0.000 seconds EXTEND LINEAR 1.000
15
+ 20.000 0.000
16
+ GISINFO
17
+ QTBDY 0 478 986 0 0 1
18
+ 0 0 0 0 0 0
@@ -0,0 +1,28 @@
1
+ duplicate units for test
2
+ #REVISION#1
3
+ 2 0.750 0.900 0.100 0.001 12
4
+ 10.000 0.010 0.010 0.700 0.100 0.700 0.000
5
+ RAD FILE
6
+
7
+ END GENERAL
8
+ APITESTDUMMY Dummy unnsupported unit for testing purposes
9
+ LBL001 LBL002
10
+ arbitrary data
11
+ table01234
12
+ -0.500 0.000 0.000 0.000091000000.0
13
+ 0.000 1.000 1.000 0.0000 910000000
14
+ 1.000 2.000 2.000 0.000091000000.0
15
+ 2.000 3.000 3.000 0.000091000000.0
16
+ 5.000 3.000 3.000 0.000091000000.0
17
+ APITESTDUMMY Dummy unnsupported unit for testing purposes
18
+ LBL001 LBL002
19
+ arbitrary data
20
+ table01234
21
+ -0.500 0.000 0.000 0.000091000000.0
22
+ 0.000 1.000 1.000 0.0000 910000000
23
+ 1.000 2.000 2.000 0.000091000000.0
24
+ 2.000 3.000 3.000 0.000091000000.0
25
+ 5.000 3.000 3.000 0.000091000000.0
26
+ GISINFO
27
+ APITESTDUMMY 0 478 986 0 0 1
28
+ 0 0 0 0 0 0
@@ -715,8 +715,6 @@ YARNELL
715
715
  4.000 5.000 6.000 5.000
716
716
  GERRBDY
717
717
  Gerry46
718
- GERRBDY
719
- Gerry46
720
718
  #COMMENT
721
719
 
722
720
  ##CATCHMENT DETAILS
@@ -715,8 +715,6 @@ YARNELL
715
715
  4.000 5.000 6.000 5.000
716
716
  GERRBDY
717
717
  Gerry46
718
- GERRBDY
719
- Gerry46
720
718
  #COMMENT
721
719
 
722
720
  ##CATCHMENT DETAILS
@@ -0,0 +1,43 @@
1
+ [ISIS Event Header]
2
+ Title=Multievent Test IEF
3
+ Datafile=network.dat
4
+ Results=..\Somewhere
5
+ [ISIS Event Details]
6
+ RunType=Unsteady
7
+ InitialConditions=..\initial_conditions.iic
8
+ Start=0
9
+ Finish=360
10
+ InitialTimestep=10
11
+ MinimumTimestep=10
12
+ MaximumTimestep=10
13
+ SaveInterval=900
14
+ ;Fluvial Inflow
15
+ EventData=..\network.ied
16
+ ;Event Override
17
+ EventData=..\event_override.ied
18
+ ;Spill Data
19
+ EventData=..\spill1.ied
20
+ ;Spill Data
21
+ EventData=..\spill2.ied
22
+ ;
23
+ EventData=..\ied_01.IED
24
+ ;
25
+ EventData=..\ied_02.IED
26
+ ;
27
+ EventData=..\ied_03.IED
28
+ Dflood=5
29
+ Qtol=0.1
30
+ Minitr=5
31
+ Maxitr=19
32
+ Theta=0.55
33
+ Weight=0.1
34
+ AdaptiveTimestep=1
35
+ RefineBridgeSecProps=0
36
+ SolveDHEqualsZeroAtStart=1
37
+ RulesAtTimeZero=1
38
+ RulesOnFirstIteration=0
39
+ ResetTimesAfterPos=1
40
+ UseFPSModularLimit=1
41
+ LaunchDoublePrecisionVersion=1
42
+ UseRemoteQ=1
43
+ 2DFLOW=1
@@ -0,0 +1,19 @@
1
+
2
+ #REVISION#1
3
+ 1 0.750 0.900 0.100 0.001 12SI
4
+ 10.000 0.010 0.010 0.700 0.100 0.700 0.000
5
+ RAD FILE
6
+
7
+ END GENERAL
8
+ APITESTDUMMY Dummy unnsupported unit for testing purposes
9
+ LBL001 LBL002
10
+ arbitrary data
11
+ table01234
12
+ -0.500 0.000 0.000 0.000091000000.0
13
+ 0.000 1.000 1.000 0.0000 910000000
14
+ 1.000 2.000 2.000 0.000091000000.0
15
+ 2.000 3.000 3.000 0.000091000000.0
16
+ 5.000 3.000 3.000 0.000091000000.0
17
+ INITIAL CONDITIONS
18
+ label ? flow stage froude no velocity umode ustate z
19
+ LBL001 y 0.000 0.000 0.000 0.000 0.000 0.000 0.000
@@ -18,6 +18,11 @@ def ief(ief_fp: Path) -> IEF:
18
18
  return IEF(ief_fp)
19
19
 
20
20
 
21
+ @pytest.fixture()
22
+ def multievent_ief(test_workspace: Path) -> IEF:
23
+ return IEF(test_workspace / "multievent.ief")
24
+
25
+
21
26
  @pytest.fixture()
22
27
  def exe_bin(tmpdir) -> Path:
23
28
  for exe in ["ISISf32.exe", "ISISf32_DoubleP.exe"]:
@@ -40,6 +45,7 @@ def sleep():
40
45
 
41
46
  def test_ief_read_doesnt_change_data(test_workspace, tmpdir):
42
47
  """IEF: Check all '.ief' files in folder by reading the _write() output into a new IEF instance and checking it stays the same."""
48
+ # we use this instead of parameterise so it will just automatically test any ief in the test data.
43
49
  for ief_file in Path(test_workspace).glob("*.ief"):
44
50
  ief = IEF(ief_file)
45
51
  first_output = ief._write()
@@ -182,3 +188,64 @@ def test_datafile_path(test_workspace: Path):
182
188
  path = Path(ief.Datafile)
183
189
  assert path.stem == "UptonP8_Panels"
184
190
  assert path.parent == Path("../../networks")
191
+
192
+
193
+ def test_unique_events_retained(multievent_ief: IEF):
194
+ """Tests that the .eventdata attribute retains the same number of items as the original ief"""
195
+ event_dict = multievent_ief.eventdata
196
+ assert len(event_dict) == 7
197
+
198
+
199
+ @pytest.mark.parametrize(
200
+ ("sample_eventdata"),
201
+ [
202
+ ({}),
203
+ ({"Fluvial Inflow": "..\\network.ied", "Event Override": "..\\event_override.ied"}),
204
+ (
205
+ {
206
+ "Fluvial Inflow": "..\\network.ied",
207
+ "Event Override": "..\\event_override.ied",
208
+ "Spill Data": "..\\spill1.ied",
209
+ "Spill Data<0>": "..\\spill2.ied",
210
+ "<0>": "..\\ied_01.IED",
211
+ "<1>": "..\\ied_02.IED",
212
+ "<2>": "..\\ied_03.IED",
213
+ "Added Event": "../added.ied",
214
+ }
215
+ ),
216
+ ],
217
+ )
218
+ def test_adding_eventdata(multievent_ief, sample_eventdata, tmpdir):
219
+ """Tests modifying, saving and reading eventdata dictionary.
220
+
221
+ Compares that the input is equal to the output."""
222
+ multievent_ief.eventdata = sample_eventdata
223
+ new_path = Path(tmpdir) / "tmp.ief"
224
+ multievent_ief.save(new_path)
225
+
226
+ new_ief = IEF(new_path)
227
+ assert new_ief.eventdata == sample_eventdata
228
+
229
+
230
+ def test_renaming_eventdata(multievent_ief, tmpdir):
231
+ """Tests renaming an event, after it has been substituted for a temporary one."""
232
+
233
+ mapping = {"<1>": "New Title"}
234
+
235
+ multievent_ief.eventdata = {
236
+ mapping.get(key, key): value for key, value in multievent_ief.eventdata.items()
237
+ }
238
+ new_path = Path(tmpdir) / "tmp.ief"
239
+ multievent_ief.save(new_path)
240
+
241
+ new_ief = IEF(new_path)
242
+
243
+ assert new_ief.eventdata == {
244
+ "Fluvial Inflow": "..\\network.ied",
245
+ "Event Override": "..\\event_override.ied",
246
+ "Spill Data": "..\\spill1.ied",
247
+ "Spill Data<0>": "..\\spill2.ied",
248
+ "<0>": "..\\ied_01.IED",
249
+ "New Title": "..\\ied_02.IED",
250
+ "<1>": "..\\ied_03.IED",
251
+ }
@@ -105,6 +105,9 @@ def test_obj_reproduces_from_json_for_all_test_api_files(
105
105
  ):
106
106
  """JSON: To test the from_json function, It should produce the same dat file from a json file"""
107
107
  for file in Path(test_workspace).glob(file_extension_glob):
108
+ if file.name.startswith("duplicate_unit_test"):
109
+ # Skipping as invalid DAT (duplicate units)
110
+ continue
108
111
  assert api_class(file) == api_class.from_json(api_class(file).to_json())
109
112
 
110
113