floodmodeller-api 0.4.4.post1__tar.gz → 0.5.0.post1__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 (229) hide show
  1. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/MANIFEST.in +1 -0
  2. {floodmodeller_api-0.4.4.post1/floodmodeller_api.egg-info → floodmodeller_api-0.5.0.post1}/PKG-INFO +2 -1
  3. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/__init__.py +1 -0
  4. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/dat.py +117 -96
  5. floodmodeller_api-0.5.0.post1/floodmodeller_api/hydrology_plus/__init__.py +2 -0
  6. floodmodeller_api-0.5.0.post1/floodmodeller_api/hydrology_plus/helper.py +23 -0
  7. floodmodeller_api-0.5.0.post1/floodmodeller_api/hydrology_plus/hydrology_plus_export.py +333 -0
  8. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/ied.py +93 -90
  9. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/ief.py +233 -50
  10. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/ief_flags.py +1 -0
  11. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/logs/lf.py +5 -1
  12. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/mapping.py +2 -0
  13. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_conveyance.py +23 -32
  14. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/7082.ief +28 -0
  15. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/BaseModel_2D_Q100.ief +28 -0
  16. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/Baseline_unchecked.csv +77 -0
  17. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/Constant QT.ief +19 -0
  18. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Domain1_Q_xml_expected.json +7 -7
  19. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX18_DAT_expected.json +54 -38
  20. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX3_DAT_expected.json +246 -166
  21. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX3_IEF_expected.json +25 -20
  22. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX6_DAT_expected.json +522 -350
  23. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/FEH boundary.ief +23 -0
  24. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Linked1D2D_xml_expected.json +7 -7
  25. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/P3Panels_UNsteady.ief +25 -0
  26. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/QT in dat file.ief +20 -0
  27. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/T10.ief +25 -0
  28. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/T2.ief +25 -0
  29. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/T5.ief +25 -0
  30. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/df_flows_hplus.csv +56 -0
  31. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/event_hplus.csv +56 -0
  32. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/ex4.ief +20 -0
  33. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/ex6.ief +21 -0
  34. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/example_h+_export.csv +77 -0
  35. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/hplus_export_example_1.csv +72 -0
  36. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/hplus_export_example_10.csv +77 -0
  37. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/hplus_export_example_2.csv +79 -0
  38. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/hplus_export_example_3.csv +77 -0
  39. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/hplus_export_example_4.csv +131 -0
  40. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/hplus_export_example_5.csv +77 -0
  41. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/hplus_export_example_6.csv +131 -0
  42. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/hplus_export_example_7.csv +131 -0
  43. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/hplus_export_example_8.csv +131 -0
  44. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/hplus_export_example_9.csv +131 -0
  45. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network_dat_expected.json +312 -210
  46. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network_ied_expected.json +6 -6
  47. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/network_with_comments.ied +55 -0
  48. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_flowtimeprofile.py +133 -0
  49. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_hydrology_plus_export.py +210 -0
  50. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_ied.py +12 -0
  51. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_ief.py +49 -9
  52. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_json.py +6 -1
  53. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_read_file.py +27 -0
  54. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_river.py +246 -0
  55. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/to_from_json.py +7 -1
  56. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/tool.py +6 -10
  57. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/__init__.py +11 -1
  58. floodmodeller_api-0.5.0.post1/floodmodeller_api/units/conveyance.py +192 -0
  59. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/sections.py +120 -39
  60. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/util.py +2 -0
  61. floodmodeller_api-0.5.0.post1/floodmodeller_api/version.py +1 -0
  62. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/xml2d.py +20 -13
  63. floodmodeller_api-0.5.0.post1/floodmodeller_api/xsd_backup.xml +738 -0
  64. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1/floodmodeller_api.egg-info}/PKG-INFO +2 -1
  65. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api.egg-info/SOURCES.txt +34 -0
  66. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api.egg-info/requires.txt +1 -0
  67. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/pyproject.toml +3 -0
  68. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/requirements.txt +8 -5
  69. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/setup.py +4 -1
  70. floodmodeller_api-0.4.4.post1/floodmodeller_api/units/conveyance.py +0 -301
  71. floodmodeller_api-0.4.4.post1/floodmodeller_api/version.py +0 -1
  72. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/LICENSE.txt +0 -0
  73. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/README.md +0 -0
  74. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/_base.py +0 -0
  75. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/backup.py +0 -0
  76. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/diff.py +0 -0
  77. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/inp.py +0 -0
  78. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/libs/libifcoremd.dll +0 -0
  79. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/libs/libifcoremt.so.5 +0 -0
  80. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/libs/libifport.so.5 +0 -0
  81. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/libs/libimf.so +0 -0
  82. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/libs/libintlc.so.5 +0 -0
  83. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/libs/libmmd.dll +0 -0
  84. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/libs/libsvml.so +0 -0
  85. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/libs/libzzn_read.so +0 -0
  86. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/libs/zzn_read.dll +0 -0
  87. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/logs/__init__.py +0 -0
  88. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/logs/lf_helpers.py +0 -0
  89. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/logs/lf_params.py +0 -0
  90. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/__init__.py +0 -0
  91. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/conftest.py +0 -0
  92. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_backup.py +0 -0
  93. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_dat.py +0 -0
  94. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/All Units 4_6.DAT +0 -0
  95. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/All Units 4_6.feb +0 -0
  96. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/BRIDGE.DAT +0 -0
  97. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.dat +0 -0
  98. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.feb +0 -0
  99. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/DamBreakADI.xml +0 -0
  100. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/DamBreakFAST.xml +0 -0
  101. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/DamBreakFAST_dy.xml +0 -0
  102. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/DamBreakTVD.xml +0 -0
  103. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/DefenceBreach.xml +0 -0
  104. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/DefenceBreachFAST.xml +0 -0
  105. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/DefenceBreachFAST_dy.xml +0 -0
  106. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Domain1+2_QH.xml +0 -0
  107. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Domain1_H.xml +0 -0
  108. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Domain1_Q.xml +0 -0
  109. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Domain1_Q_FAST.xml +0 -0
  110. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Domain1_Q_FAST_dy.xml +0 -0
  111. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Domain1_W.xml +0 -0
  112. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX1.DAT +0 -0
  113. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX1.ext +0 -0
  114. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX1.feb +0 -0
  115. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX1.gxy +0 -0
  116. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX17.DAT +0 -0
  117. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX17.ext +0 -0
  118. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX17.feb +0 -0
  119. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX18.DAT +0 -0
  120. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX2.DAT +0 -0
  121. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX3.DAT +0 -0
  122. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX6.DAT +0 -0
  123. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX6.ext +0 -0
  124. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/EX6.feb +0 -0
  125. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Event Data Example.DAT +0 -0
  126. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Event Data Example.ext +0 -0
  127. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Event Data Example.feb +0 -0
  128. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Linked1D2D.xml +0 -0
  129. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Linked1D2DFAST.xml +0 -0
  130. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/Linked1D2DFAST_dy.xml +0 -0
  131. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/blockage.dat +0 -0
  132. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/blockage.ext +0 -0
  133. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/blockage.feb +0 -0
  134. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/blockage.gxy +0 -0
  135. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/conveyance_test.dat +0 -0
  136. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/conveyance_test.feb +0 -0
  137. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/conveyance_test.gxy +0 -0
  138. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/defaultUnits.dat +0 -0
  139. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/defaultUnits.ext +0 -0
  140. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/defaultUnits.feb +0 -0
  141. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/defaultUnits.fmpx +0 -0
  142. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/defaultUnits.gxy +0 -0
  143. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/ex3.ief +0 -0
  144. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/ex3.lf1 +0 -0
  145. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/ex4.DAT +0 -0
  146. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/ex4_changed.DAT +0 -0
  147. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/example1.inp +0 -0
  148. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/example2.inp +0 -0
  149. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/example3.inp +0 -0
  150. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/example4.inp +0 -0
  151. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/example5.inp +0 -0
  152. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/example6.inp +0 -0
  153. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/expected_conveyance.csv +0 -0
  154. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/jump.dat +0 -0
  155. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.dat +0 -0
  156. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.ext +0 -0
  157. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.exy +0 -0
  158. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.feb +0 -0
  159. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.ied +0 -0
  160. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.ief +0 -0
  161. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.inp +0 -0
  162. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.mmm +0 -0
  163. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.pxy +0 -0
  164. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.uic +0 -0
  165. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.zzd +0 -0
  166. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.zzl +0 -0
  167. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.zzn +0 -0
  168. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.zzu +0 -0
  169. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network.zzx +0 -0
  170. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/network_from_tabularCSV.csv +0 -0
  171. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/rnweir.dat +0 -0
  172. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/rnweir.ext +0 -0
  173. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/rnweir.feb +0 -0
  174. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/rnweir.gxy +0 -0
  175. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/rnweir_default.dat +0 -0
  176. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/rnweir_default.ext +0 -0
  177. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/rnweir_default.feb +0 -0
  178. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/rnweir_default.fmpx +0 -0
  179. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/rnweir_default.gxy +0 -0
  180. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_data/unit checks.dat +0 -0
  181. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_inp.py +0 -0
  182. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_logs_lf.py +0 -0
  183. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_tool.py +0 -0
  184. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_toolbox_structure_log.py +0 -0
  185. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_xml2d.py +0 -0
  186. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/test/test_zzn.py +0 -0
  187. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/__init__.py +0 -0
  188. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/example_tool.py +0 -0
  189. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/gui/bg.PNG +0 -0
  190. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/gui/logo.PNG +0 -0
  191. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/model_build/__init__.py +0 -0
  192. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/model_build/add_siltation_definition.py +0 -0
  193. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/model_build/structure_log/__init__.py +0 -0
  194. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +0 -0
  195. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/model_build/structure_log_definition.py +0 -0
  196. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/model_conversion/__init__.py +0 -0
  197. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/model_review/__init__.py +0 -0
  198. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/toolbox/results_analysis/__init__.py +0 -0
  199. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/_base.py +0 -0
  200. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/boundaries.py +0 -0
  201. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/comment.py +0 -0
  202. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/conduits.py +0 -0
  203. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/helpers.py +0 -0
  204. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/iic.py +0 -0
  205. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/losses.py +0 -0
  206. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/structures.py +0 -0
  207. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/units.py +0 -0
  208. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/unsupported.py +0 -0
  209. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/units/variables.py +0 -0
  210. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/urban1d/__init__.py +0 -0
  211. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/urban1d/_base.py +0 -0
  212. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/urban1d/conduits.py +0 -0
  213. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/urban1d/general_parameters.py +0 -0
  214. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/urban1d/junctions.py +0 -0
  215. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/urban1d/losses.py +0 -0
  216. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/urban1d/outfalls.py +0 -0
  217. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/urban1d/raingauges.py +0 -0
  218. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/urban1d/subsections.py +0 -0
  219. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/urban1d/xsections.py +0 -0
  220. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/validation/__init__.py +0 -0
  221. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/validation/parameters.py +0 -0
  222. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/validation/urban_parameters.py +0 -0
  223. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/validation/validation.py +0 -0
  224. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/xml2d_template.py +0 -0
  225. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api/zzn.py +0 -0
  226. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api.egg-info/dependency_links.txt +0 -0
  227. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api.egg-info/entry_points.txt +0 -0
  228. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/floodmodeller_api.egg-info/top_level.txt +0 -0
  229. {floodmodeller_api-0.4.4.post1 → floodmodeller_api-0.5.0.post1}/setup.cfg +0 -0
@@ -1,6 +1,7 @@
1
1
  include license.txt
2
2
  include code-of-conduct.md
3
3
  include requirements.txt
4
+ include floodmodeller_api/xsd_backup.xml
4
5
  include floodmodeller_api/test/test_data/*
5
6
  include floodmodeller_api/toolbox/gui/*
6
7
  recursive-include floodmodeller_api *.dll
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: floodmodeller_api
3
- Version: 0.4.4.post1
3
+ Version: 0.5.0.post1
4
4
  Summary: Extends the functionality of Flood Modeller to python users
5
5
  Author: Jacobs
6
6
  Author-email: joe.pierce@jacobs.com
@@ -18,6 +18,7 @@ Requires-Dist: pytest-mock==3.*
18
18
  Requires-Dist: shapely==2.*
19
19
  Requires-Dist: scipy==1.*
20
20
  Requires-Dist: freezegun==1.*
21
+ Requires-Dist: requests>2.23
21
22
 
22
23
  ![FM Logo](https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/_static/flood-modeller-logo-hero-image.png)
23
24
 
@@ -3,6 +3,7 @@ from .ied import IED
3
3
  from .ief import IEF
4
4
  from .inp import INP
5
5
  from .logs import LF1, LF2
6
+ from .util import read_file
6
7
  from .version import __version__
7
8
  from .xml2d import XML2D
8
9
  from .zzn import ZZN
@@ -292,10 +292,10 @@ class DAT(FMFile):
292
292
  return _name_list[0]
293
293
  return _name_list
294
294
 
295
- def _read(self):
295
+ def _read(self) -> None:
296
296
  # Read DAT data
297
297
  with open(self._filepath) as dat_file:
298
- self._raw_data = [line.rstrip("\n") for line in dat_file.readlines()]
298
+ self._raw_data: list[str] = [line.rstrip("\n") for line in dat_file.readlines()]
299
299
 
300
300
  # Generate DAT structure
301
301
  self._update_dat_struct()
@@ -305,7 +305,7 @@ class DAT(FMFile):
305
305
  if gxy_path.exists():
306
306
  self._gxy_filepath = gxy_path
307
307
  with open(self._gxy_filepath) as gxy_file:
308
- self._gxy_data = gxy_file.read()
308
+ self._gxy_data: str | None = gxy_file.read()
309
309
  else:
310
310
  self._gxy_filepath = None
311
311
  self._gxy_data = None
@@ -327,7 +327,7 @@ class DAT(FMFile):
327
327
  def _create_from_blank(self, with_gxy: bool = False) -> None:
328
328
  # No filepath specified, create new 'blank' DAT in memory
329
329
  # ** Update these to have minimal data needed (general header, empty IC header)
330
- self._dat_struct = [
330
+ self._dat_struct: list[dict[str, Any]] = [
331
331
  {"start": 0, "Type": "GENERAL", "end": 6},
332
332
  {"Type": "INITIAL CONDITIONS", "start": 7, "end": 8},
333
333
  ]
@@ -517,8 +517,21 @@ class DAT(FMFile):
517
517
  block["end"] + block_shift
518
518
  ) # add in to keep a record of the last block read in
519
519
 
520
- def _get_unit_definitions(self): # noqa: C901
521
- # Get unit definitions
520
+ def _get_unit_definitions(self):
521
+ self._initialize_collections()
522
+ for block in self._dat_struct:
523
+ unit_data = self._raw_data[block["start"] : block["end"] + 1]
524
+ unit_type = block["Type"]
525
+
526
+ if unit_type in units.SUPPORTED_UNIT_TYPES:
527
+ self._process_supported_unit(unit_type, unit_data)
528
+ elif unit_type in units.UNSUPPORTED_UNIT_TYPES:
529
+ self._process_unsupported_unit(unit_type, unit_data)
530
+ elif unit_type not in ("GENERAL", "GISINFO"):
531
+ raise Exception(f"Unexpected unit type encountered: {unit_type}")
532
+
533
+ def _initialize_collections(self):
534
+ # Initialize unit collections
522
535
  self.sections = {}
523
536
  self.boundaries = {}
524
537
  self.structures = {}
@@ -526,96 +539,90 @@ class DAT(FMFile):
526
539
  self.losses = {}
527
540
  self._unsupported = {}
528
541
  self._all_units = []
529
- for block in self._dat_struct:
530
- unit_data = self._raw_data[block["start"] : block["end"] + 1]
531
- if block["Type"] in units.SUPPORTED_UNIT_TYPES:
532
- # Deal with initial conditions block
533
- if block["Type"] == "INITIAL CONDITIONS":
534
- self.initial_conditions = units.IIC(unit_data, n=self._label_len)
535
- continue
536
-
537
- if block["Type"] == "COMMENT":
538
- self._all_units.append(units.COMMENT(unit_data, n=self._label_len))
539
- continue
540
-
541
- if block["Type"] == "VARIABLES":
542
- self.variables = units.Variables(unit_data)
543
- continue
544
-
545
- # Check to see whether unit type has associated subtypes so that unit name can be correctly assigned
546
- if units.SUPPORTED_UNIT_TYPES[block["Type"]]["has_subtype"]:
547
- unit_name = unit_data[2][: self._label_len].strip()
548
- else:
549
- unit_name = unit_data[1][: self._label_len].strip()
550
542
 
551
- # Create instance of unit and add to relevant group
552
- unit_group = getattr(self, units.SUPPORTED_UNIT_TYPES[block["Type"]]["group"])
553
- if unit_name in unit_group:
554
- raise Exception(
555
- f'Duplicate label ({unit_name}) encountered within category: {units.SUPPORTED_UNIT_TYPES[block["Type"]]["group"]}',
556
- )
557
- # Changes done to account for unit types with spaces/dashes eg Flat-V Weir
558
- unit_type = block["Type"].replace(" ", "_").replace("-", "_")
559
- unit_group[unit_name] = eval(
560
- f"units.{unit_type}({unit_data}, {self._label_len})", # append to our _all._units as well???
561
- )
562
- self._all_units.append(unit_group[unit_name])
543
+ def _process_supported_unit(self, unit_type, unit_data):
544
+ # Handle initial conditions block
545
+ if unit_type == "INITIAL CONDITIONS":
546
+ self.initial_conditions = units.IIC(unit_data, n=self._label_len)
547
+ elif unit_type == "COMMENT":
548
+ self._all_units.append(units.COMMENT(unit_data, n=self._label_len))
549
+ elif unit_type == "VARIABLES":
550
+ self.variables = units.Variables(unit_data)
551
+ else:
552
+ # Check to see whether unit type has associated subtypes so that unit name can be correctly assigned
553
+ unit_name = self._get_unit_name(unit_type, unit_data)
554
+ # Create instance of unit and add to relevant group
555
+ unit_group = getattr(self, units.SUPPORTED_UNIT_TYPES[unit_type]["group"])
556
+ self._add_unit_to_group(unit_group, unit_type, unit_name, unit_data)
557
+
558
+ def _get_unit_name(self, unit_type, unit_data):
559
+ # Check if the unit type has associated subtypes
560
+ if units.SUPPORTED_UNIT_TYPES[unit_type]["has_subtype"]:
561
+ return unit_data[2][: self._label_len].strip()
562
+ return unit_data[1][: self._label_len].strip()
563
+
564
+ def _add_unit_to_group(self, unit_group, unit_type, unit_name, unit_data):
565
+ # Raise exception if a duplicate label is encountered
566
+ if unit_name in unit_group:
567
+ raise Exception(
568
+ f'Duplicate label ({unit_name}) encountered within category: {units.SUPPORTED_UNIT_TYPES[unit_type]["group"]}',
569
+ )
570
+ # Changes done to account for unit types with spaces/dashes eg Flat-V Weir
571
+ unit_type_safe = unit_type.replace(" ", "_").replace("-", "_")
572
+ unit_group[unit_name] = eval(
573
+ f"units.{unit_type_safe}({unit_data}, {self._label_len})",
574
+ )
575
+ self._all_units.append(unit_group[unit_name])
563
576
 
564
- elif block["Type"] in units.UNSUPPORTED_UNIT_TYPES:
565
- # Check to see whether unit type has associated subtypes so that unit name can be correctly assigned
566
- if units.UNSUPPORTED_UNIT_TYPES[block["Type"]]["has_subtype"]:
567
- unit_name = unit_data[2][: self._label_len].strip()
568
- subtype = True
569
- else:
570
- unit_name = unit_data[1][: self._label_len].strip()
571
- subtype = False
572
-
573
- self._unsupported[f"{unit_name} ({block['Type']})"] = units.UNSUPPORTED(
574
- unit_data,
575
- self._label_len,
576
- unit_name=unit_name,
577
- unit_type=block["Type"],
578
- subtype=subtype,
579
- )
580
- self._all_units.append(self._unsupported[f"{unit_name} ({block['Type']})"])
577
+ def _process_unsupported_unit(self, unit_type, unit_data):
578
+ # Check to see whether unit type has associated subtypes so that unit name can be correctly assigned
579
+ unit_name, subtype = self._get_unsupported_unit_name(unit_type, unit_data)
580
+ self._unsupported[f"{unit_name} ({unit_type})"] = units.UNSUPPORTED(
581
+ unit_data,
582
+ self._label_len,
583
+ unit_name=unit_name,
584
+ unit_type=unit_type,
585
+ subtype=subtype,
586
+ )
587
+ self._all_units.append(self._unsupported[f"{unit_name} ({unit_type})"])
581
588
 
582
- elif block["Type"] not in ("GENERAL", "GISINFO"):
583
- raise Exception(f"Unexpected unit type encountered: {block['Type']}")
589
+ def _get_unsupported_unit_name(self, unit_type, unit_data):
590
+ # Check if the unit type has associated subtypes
591
+ if units.UNSUPPORTED_UNIT_TYPES[unit_type]["has_subtype"]:
592
+ return unit_data[2][: self._label_len].strip(), True
593
+ return unit_data[1][: self._label_len].strip(), False
584
594
 
585
- def _update_dat_struct(self) -> None: # noqa: C901, PLR0912
595
+ def _update_dat_struct(self) -> None:
586
596
  """Internal method used to update self._dat_struct which details the overall structure of the dat file as a list of blocks, each of which
587
597
  are a dictionary containing the 'start', 'end' and 'type' of the block.
588
-
589
598
  """
590
- # Generate DAT structure
591
- dat_struct = []
599
+ self._dat_struct = []
592
600
  in_block = False
593
601
  in_general = True
594
602
  in_comment = False
595
- comment_n = None # Used as counter for number of lines in a comment block
603
+ comment_n: int | None = None # Used as counter for number of lines in a comment block
596
604
  gisinfo_block = False
597
605
  general_block = {"start": 0, "Type": "GENERAL"}
598
606
  unit_block: dict[str, Any] = {}
607
+
599
608
  for idx, line in enumerate(self._raw_data):
600
609
  # Deal with 'general' header
601
- if in_general is True:
602
- if line == "END GENERAL":
603
- general_block["end"] = idx
604
- dat_struct.append(general_block)
605
- in_general = False
610
+ if in_general:
611
+ self._process_general_block(line, idx, general_block)
612
+ in_general = False if line == "END GENERAL" else in_general
606
613
  continue
607
614
 
608
615
  # Deal with comment blocks explicitly as they could contain unit keywords
609
616
  if in_comment and comment_n is None:
610
617
  comment_n = int(line.strip())
611
618
  continue
612
- if in_comment:
619
+ if in_comment and comment_n is not None:
613
620
  comment_n -= 1
614
621
  if comment_n <= 0:
615
622
  unit_block["end"] = idx + comment_n # add ending index
616
- # append existing bdy block to the dat_struct
617
- dat_struct.append(unit_block)
618
- unit_block = {} # reset bdy block
623
+ # append existing block to the dat_struct
624
+ self._dat_struct.append(unit_block)
625
+ unit_block = {} # reset block
619
626
  in_comment = False
620
627
  in_block = False
621
628
  comment_n = None
@@ -624,7 +631,6 @@ class DAT(FMFile):
624
631
  if line == "COMMENT":
625
632
  in_comment = True
626
633
  unit_block, in_block = self._close_struct_block(
627
- dat_struct,
628
634
  "COMMENT",
629
635
  unit_block,
630
636
  in_block,
@@ -635,7 +641,6 @@ class DAT(FMFile):
635
641
  if line == "GISINFO":
636
642
  gisinfo_block = True
637
643
  unit_block, in_block = self._close_struct_block(
638
- dat_struct,
639
644
  "GISINFO",
640
645
  unit_block,
641
646
  in_block,
@@ -643,33 +648,49 @@ class DAT(FMFile):
643
648
  )
644
649
 
645
650
  if not gisinfo_block:
646
- if line.split(" ")[0] in units.ALL_UNIT_TYPES:
647
- # The " " is needed here in case of empty string
648
- unit_type = line.split()[0]
649
- elif " ".join(line.split()[:2]) in units.ALL_UNIT_TYPES:
650
- unit_type = " ".join(line.split()[:2])
651
- else:
652
- continue
651
+ unit_type = self._identify_unit_type(line)
652
+ if unit_type:
653
+ unit_block, in_block = self._close_struct_block(
654
+ unit_type,
655
+ unit_block,
656
+ in_block,
657
+ idx,
658
+ )
653
659
 
654
- unit_block, in_block = self._close_struct_block(
655
- dat_struct,
656
- unit_type,
657
- unit_block,
658
- in_block,
659
- idx,
660
- )
660
+ self._finalize_last_block(unit_block)
661
661
 
662
+ def _process_general_block(
663
+ self,
664
+ line: str,
665
+ idx: int,
666
+ general_block: dict[str, Any],
667
+ ) -> None:
668
+ # Deal with 'general' header
669
+ if line == "END GENERAL":
670
+ general_block["end"] = idx
671
+ self._dat_struct.append(general_block)
672
+
673
+ def _identify_unit_type(self, line: str) -> str | None:
674
+ # Check to see whether unit type has associated subtypes so that unit name can be correctly assigned
675
+ if line.split(" ")[0] in units.ALL_UNIT_TYPES:
676
+ # The " " is needed here in case of empty string
677
+ return line.split()[0]
678
+ if " ".join(line.split()[:2]) in units.ALL_UNIT_TYPES:
679
+ return " ".join(line.split()[:2])
680
+ return None
681
+
682
+ def _finalize_last_block(
683
+ self,
684
+ unit_block: dict[str, Any],
685
+ ) -> None:
662
686
  if len(unit_block) != 0:
663
687
  # Only adds end block if there is a block present (i.e. an empty DAT stays empty)
664
688
  # add ending index for final block
665
689
  unit_block["end"] = len(self._raw_data) - 1
666
- dat_struct.append(unit_block) # add final block
667
-
668
- self._dat_struct = dat_struct
690
+ self._dat_struct.append(unit_block) # add final block
669
691
 
670
- def _close_struct_block( # noqa: PLR0913
692
+ def _close_struct_block(
671
693
  self,
672
- dat_struct: list[dict],
673
694
  unit_type: str,
674
695
  unit_block: dict,
675
696
  in_block: bool,
@@ -679,7 +700,7 @@ class DAT(FMFile):
679
700
  if in_block is True:
680
701
  unit_block["end"] = idx - 1 # add ending index
681
702
  # append existing bdy block to the dat_struct
682
- dat_struct.append(unit_block)
703
+ self._dat_struct.append(unit_block)
683
704
  unit_block = {} # reset bdy block
684
705
  in_block = True
685
706
  unit_block["Type"] = unit_type # start new bdy block
@@ -722,7 +743,7 @@ class DAT(FMFile):
722
743
  self.general_parameters["Node Count"] -= 1
723
744
 
724
745
  @handle_exception(when="insert unit into")
725
- def insert_unit( # noqa: C901, PLR0912, PLR0913
746
+ def insert_unit( # noqa: C901, PLR0912
726
747
  self,
727
748
  unit: Unit,
728
749
  add_before: Unit | None = None,
@@ -833,7 +854,7 @@ class DAT(FMFile):
833
854
  self._update_raw_data()
834
855
  self._update_dat_struct()
835
856
 
836
- def _update_gisinfo_label( # noqa: PLR0913
857
+ def _update_gisinfo_label(
837
858
  self,
838
859
  unit_type,
839
860
  unit_subtype,
@@ -0,0 +1,2 @@
1
+ from .helper import load_hydrology_plus_csv_export
2
+ from .hydrology_plus_export import HydrologyPlusExport
@@ -0,0 +1,23 @@
1
+ """Helps to create the class for the hydrology plus"""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import TYPE_CHECKING
6
+
7
+ from .hydrology_plus_export import HydrologyPlusExport
8
+
9
+ if TYPE_CHECKING:
10
+ from pathlib import Path
11
+
12
+
13
+ def load_hydrology_plus_csv_export(file: str | Path) -> HydrologyPlusExport:
14
+ """
15
+ Loads a CSV containing exported Hydrology+ flow data and returns a HydrologyPlusExport object.
16
+
17
+ Args:
18
+ file (str | Path): The path to the Hydrology+ export CSV file.
19
+
20
+ Returns:
21
+ HydrologyPlusExport: An object representing the data from the Hydrology+ export.
22
+ """
23
+ return HydrologyPlusExport(file)