floodmodeller-api 0.5.0.post1__tar.gz → 0.5.1__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 (252) hide show
  1. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/MANIFEST.in +1 -1
  2. {floodmodeller_api-0.5.0.post1/floodmodeller_api.egg-info → floodmodeller_api-0.5.1}/PKG-INFO +10 -4
  3. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/README.md +9 -3
  4. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/__init__.py +1 -1
  5. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/_base.py +26 -16
  6. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/backup.py +3 -2
  7. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/dat.py +29 -30
  8. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/diff.py +3 -3
  9. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/hydrology_plus/hydrology_plus_export.py +14 -13
  10. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/ied.py +6 -6
  11. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/ief.py +27 -25
  12. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/inp.py +3 -4
  13. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/logs/lf.py +9 -16
  14. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/logs/lf_helpers.py +18 -18
  15. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/mapping.py +2 -0
  16. floodmodeller_api-0.5.1/floodmodeller_api/test/__init__.py +4 -0
  17. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/conftest.py +2 -3
  18. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_backup.py +2 -2
  19. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_conveyance.py +4 -3
  20. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_dat.py +2 -2
  21. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/structure_logs/EX17_expected.csv +4 -0
  22. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/structure_logs/EX17_expected.json +69 -0
  23. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/structure_logs/EX18_expected.csv +20 -0
  24. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/structure_logs/EX18_expected.json +292 -0
  25. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/structure_logs/EX6_expected.csv +4 -0
  26. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/structure_logs/EX6_expected.json +35 -0
  27. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_flow.csv +182 -0
  28. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_fr.csv +182 -0
  29. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_mode.csv +182 -0
  30. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_stage.csv +182 -0
  31. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_state.csv +182 -0
  32. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_velocity.csv +182 -0
  33. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_left_fp_h.csv +182 -0
  34. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_left_fp_mode.csv +182 -0
  35. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_link_inflow.csv +182 -0
  36. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_max.csv +87 -0
  37. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_right_fp_h.csv +182 -0
  38. floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_right_fp_mode.csv +182 -0
  39. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_flowtimeprofile.py +2 -2
  40. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_hydrology_plus_export.py +4 -2
  41. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_ied.py +2 -2
  42. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_ief.py +2 -2
  43. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_inp.py +2 -2
  44. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_json.py +5 -10
  45. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_logs_lf.py +6 -6
  46. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_read_file.py +1 -0
  47. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_river.py +11 -11
  48. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_tool.py +8 -5
  49. floodmodeller_api-0.5.1/floodmodeller_api/test/test_toolbox_structure_log.py +225 -0
  50. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_xml2d.py +9 -11
  51. floodmodeller_api-0.5.1/floodmodeller_api/test/test_zz.py +143 -0
  52. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/to_from_json.py +8 -8
  53. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/tool.py +12 -6
  54. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/example_tool.py +5 -1
  55. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/model_build/add_siltation_definition.py +12 -8
  56. floodmodeller_api-0.5.1/floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +589 -0
  57. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/model_build/structure_log_definition.py +5 -1
  58. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/_base.py +14 -10
  59. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/conveyance.py +1 -1
  60. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/helpers.py +1 -3
  61. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/losses.py +2 -3
  62. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/sections.py +14 -10
  63. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/structures.py +9 -9
  64. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/units.py +2 -0
  65. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/urban1d/_base.py +6 -9
  66. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/urban1d/outfalls.py +2 -1
  67. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/urban1d/raingauges.py +2 -1
  68. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/urban1d/subsections.py +2 -0
  69. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/urban1d/xsections.py +3 -2
  70. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/util.py +16 -2
  71. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/validation/validation.py +2 -1
  72. floodmodeller_api-0.5.1/floodmodeller_api/version.py +1 -0
  73. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/xml2d.py +18 -20
  74. floodmodeller_api-0.5.1/floodmodeller_api/zz.py +538 -0
  75. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1/floodmodeller_api.egg-info}/PKG-INFO +10 -4
  76. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api.egg-info/SOURCES.txt +21 -3
  77. floodmodeller_api-0.5.1/pyproject.toml +50 -0
  78. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/requirements.txt +1 -1
  79. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/__init__.py +0 -4
  80. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_toolbox_structure_log.py +0 -234
  81. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_zzn.py +0 -36
  82. floodmodeller_api-0.5.0.post1/floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +0 -287
  83. floodmodeller_api-0.5.0.post1/floodmodeller_api/version.py +0 -1
  84. floodmodeller_api-0.5.0.post1/floodmodeller_api/zzn.py +0 -414
  85. floodmodeller_api-0.5.0.post1/pyproject.toml +0 -46
  86. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/LICENSE.txt +0 -0
  87. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/hydrology_plus/__init__.py +0 -0
  88. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/hydrology_plus/helper.py +0 -0
  89. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/ief_flags.py +0 -0
  90. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/libs/libifcoremd.dll +0 -0
  91. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/libs/libifcoremt.so.5 +0 -0
  92. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/libs/libifport.so.5 +0 -0
  93. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/libs/libimf.so +0 -0
  94. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/libs/libintlc.so.5 +0 -0
  95. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/libs/libmmd.dll +0 -0
  96. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/libs/libsvml.so +0 -0
  97. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/libs/libzzn_read.so +0 -0
  98. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/libs/zzn_read.dll +0 -0
  99. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/logs/__init__.py +0 -0
  100. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/logs/lf_params.py +0 -0
  101. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/7082.ief +0 -0
  102. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/All Units 4_6.DAT +0 -0
  103. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/All Units 4_6.feb +0 -0
  104. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/BRIDGE.DAT +0 -0
  105. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/BaseModel_2D_Q100.ief +0 -0
  106. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Baseline_unchecked.csv +0 -0
  107. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Constant QT.ief +0 -0
  108. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.dat +0 -0
  109. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.feb +0 -0
  110. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/DamBreakADI.xml +0 -0
  111. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/DamBreakFAST.xml +0 -0
  112. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/DamBreakFAST_dy.xml +0 -0
  113. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/DamBreakTVD.xml +0 -0
  114. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/DefenceBreach.xml +0 -0
  115. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/DefenceBreachFAST.xml +0 -0
  116. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/DefenceBreachFAST_dy.xml +0 -0
  117. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Domain1+2_QH.xml +0 -0
  118. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Domain1_H.xml +0 -0
  119. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Domain1_Q.xml +0 -0
  120. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Domain1_Q_FAST.xml +0 -0
  121. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Domain1_Q_FAST_dy.xml +0 -0
  122. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Domain1_Q_xml_expected.json +0 -0
  123. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Domain1_W.xml +0 -0
  124. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX1.DAT +0 -0
  125. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX1.ext +0 -0
  126. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX1.feb +0 -0
  127. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX1.gxy +0 -0
  128. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX17.DAT +0 -0
  129. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX17.ext +0 -0
  130. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX17.feb +0 -0
  131. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX18.DAT +0 -0
  132. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX18_DAT_expected.json +0 -0
  133. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX2.DAT +0 -0
  134. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX3.DAT +0 -0
  135. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX3_DAT_expected.json +0 -0
  136. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX3_IEF_expected.json +0 -0
  137. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX6.DAT +0 -0
  138. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX6.ext +0 -0
  139. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX6.feb +0 -0
  140. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/EX6_DAT_expected.json +0 -0
  141. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Event Data Example.DAT +0 -0
  142. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Event Data Example.ext +0 -0
  143. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Event Data Example.feb +0 -0
  144. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/FEH boundary.ief +0 -0
  145. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Linked1D2D.xml +0 -0
  146. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Linked1D2DFAST.xml +0 -0
  147. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Linked1D2DFAST_dy.xml +0 -0
  148. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/Linked1D2D_xml_expected.json +0 -0
  149. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/P3Panels_UNsteady.ief +0 -0
  150. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/QT in dat file.ief +0 -0
  151. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/T10.ief +0 -0
  152. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/T2.ief +0 -0
  153. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/T5.ief +0 -0
  154. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/blockage.dat +0 -0
  155. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/blockage.ext +0 -0
  156. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/blockage.feb +0 -0
  157. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/blockage.gxy +0 -0
  158. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/conveyance_test.dat +0 -0
  159. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/conveyance_test.feb +0 -0
  160. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/conveyance_test.gxy +0 -0
  161. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/defaultUnits.dat +0 -0
  162. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/defaultUnits.ext +0 -0
  163. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/defaultUnits.feb +0 -0
  164. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/defaultUnits.fmpx +0 -0
  165. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/defaultUnits.gxy +0 -0
  166. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/df_flows_hplus.csv +0 -0
  167. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/event_hplus.csv +0 -0
  168. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/ex3.ief +0 -0
  169. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/ex3.lf1 +0 -0
  170. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/ex4.DAT +0 -0
  171. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/ex4.ief +0 -0
  172. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/ex4_changed.DAT +0 -0
  173. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/ex6.ief +0 -0
  174. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/example1.inp +0 -0
  175. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/example2.inp +0 -0
  176. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/example3.inp +0 -0
  177. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/example4.inp +0 -0
  178. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/example5.inp +0 -0
  179. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/example6.inp +0 -0
  180. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/example_h+_export.csv +0 -0
  181. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/expected_conveyance.csv +0 -0
  182. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/hplus_export_example_1.csv +0 -0
  183. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/hplus_export_example_10.csv +0 -0
  184. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/hplus_export_example_2.csv +0 -0
  185. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/hplus_export_example_3.csv +0 -0
  186. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/hplus_export_example_4.csv +0 -0
  187. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/hplus_export_example_5.csv +0 -0
  188. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/hplus_export_example_6.csv +0 -0
  189. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/hplus_export_example_7.csv +0 -0
  190. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/hplus_export_example_8.csv +0 -0
  191. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/hplus_export_example_9.csv +0 -0
  192. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/jump.dat +0 -0
  193. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.dat +0 -0
  194. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.ext +0 -0
  195. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.exy +0 -0
  196. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.feb +0 -0
  197. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.ied +0 -0
  198. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.ief +0 -0
  199. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.inp +0 -0
  200. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.mmm +0 -0
  201. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.pxy +0 -0
  202. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.uic +0 -0
  203. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.zzd +0 -0
  204. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.zzl +0 -0
  205. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.zzn +0 -0
  206. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.zzu +0 -0
  207. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network.zzx +0 -0
  208. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network_dat_expected.json +0 -0
  209. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network_ied_expected.json +0 -0
  210. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/network_with_comments.ied +0 -0
  211. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/rnweir.dat +0 -0
  212. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/rnweir.ext +0 -0
  213. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/rnweir.feb +0 -0
  214. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/rnweir.gxy +0 -0
  215. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/rnweir_default.dat +0 -0
  216. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/rnweir_default.ext +0 -0
  217. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/rnweir_default.feb +0 -0
  218. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/rnweir_default.fmpx +0 -0
  219. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/rnweir_default.gxy +0 -0
  220. /floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/network_from_tabularCSV.csv → /floodmodeller_api-0.5.1/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_max.csv +0 -0
  221. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/test/test_data/unit checks.dat +0 -0
  222. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/__init__.py +0 -0
  223. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/gui/bg.PNG +0 -0
  224. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/gui/logo.PNG +0 -0
  225. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/model_build/__init__.py +0 -0
  226. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/model_build/structure_log/__init__.py +0 -0
  227. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/model_conversion/__init__.py +0 -0
  228. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/model_review/__init__.py +0 -0
  229. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/toolbox/results_analysis/__init__.py +0 -0
  230. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/__init__.py +0 -0
  231. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/boundaries.py +0 -0
  232. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/comment.py +0 -0
  233. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/conduits.py +0 -0
  234. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/iic.py +0 -0
  235. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/unsupported.py +0 -0
  236. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/units/variables.py +0 -0
  237. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/urban1d/__init__.py +0 -0
  238. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/urban1d/conduits.py +0 -0
  239. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/urban1d/general_parameters.py +0 -0
  240. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/urban1d/junctions.py +0 -0
  241. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/urban1d/losses.py +0 -0
  242. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/validation/__init__.py +0 -0
  243. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/validation/parameters.py +0 -0
  244. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/validation/urban_parameters.py +0 -0
  245. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/xml2d_template.py +0 -0
  246. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api/xsd_backup.xml +0 -0
  247. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api.egg-info/dependency_links.txt +0 -0
  248. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api.egg-info/entry_points.txt +0 -0
  249. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api.egg-info/requires.txt +0 -0
  250. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/floodmodeller_api.egg-info/top_level.txt +0 -0
  251. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/setup.cfg +0 -0
  252. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.1}/setup.py +0 -0
@@ -2,8 +2,8 @@ include license.txt
2
2
  include code-of-conduct.md
3
3
  include requirements.txt
4
4
  include floodmodeller_api/xsd_backup.xml
5
- include floodmodeller_api/test/test_data/*
6
5
  include floodmodeller_api/toolbox/gui/*
6
+ recursive-include floodmodeller_api/test/test_data *
7
7
  recursive-include floodmodeller_api *.dll
8
8
  recursive-include floodmodeller_api *.so
9
9
  recursive-include floodmodeller_api *.so.5
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: floodmodeller_api
3
- Version: 0.5.0.post1
3
+ Version: 0.5.1
4
4
  Summary: Extends the functionality of Flood Modeller to python users
5
5
  Author: Jacobs
6
6
  Author-email: joe.pierce@jacobs.com
@@ -20,7 +20,10 @@ Requires-Dist: scipy==1.*
20
20
  Requires-Dist: freezegun==1.*
21
21
  Requires-Dist: requests>2.23
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
+ <picture>
24
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/_static/flood-modeller-logo-hero-image-dark.png">
25
+ <img alt="FM Logo" src="https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/_static/flood-modeller-logo-hero-image.png">
26
+ </picture>
24
27
 
25
28
 
26
29
  [![PyPI Latest Release](https://img.shields.io/pypi/v/floodmodeller-api.svg)](https://pypi.org/project/floodmodeller-api/)
@@ -37,7 +40,10 @@ Requires-Dist: requests>2.23
37
40
 
38
41
  This python package is designed to be used in conjunction with your installation of Flood Modeller to provide users with a set of tools to extend the capabilities of Flood Modeller and build into automated workflows.
39
42
 
40
- ![API Overview](https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/getting_started/api_overview_small.png)
43
+ <picture>
44
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/getting_started/api_overview_dark.png">
45
+ <img alt="API Overview" src="https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/getting_started/api_overview.png">
46
+ </picture>
41
47
 
42
48
  ## Installation
43
49
  You can install the floodmodeller_api package from PyPI with the following command:
@@ -46,7 +52,7 @@ You can install the floodmodeller_api package from PyPI with the following comma
46
52
  pip install floodmodeller-api
47
53
  ```
48
54
 
49
- Python 3.9 or greater is required.
55
+ Python 3.10 or greater is required.
50
56
 
51
57
  Once you have installed floodmodeller_api to your python environment, you can import the package with:
52
58
 
@@ -1,4 +1,7 @@
1
- ![FM Logo](https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/_static/flood-modeller-logo-hero-image.png)
1
+ <picture>
2
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/_static/flood-modeller-logo-hero-image-dark.png">
3
+ <img alt="FM Logo" src="https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/_static/flood-modeller-logo-hero-image.png">
4
+ </picture>
2
5
 
3
6
 
4
7
  [![PyPI Latest Release](https://img.shields.io/pypi/v/floodmodeller-api.svg)](https://pypi.org/project/floodmodeller-api/)
@@ -15,7 +18,10 @@
15
18
 
16
19
  This python package is designed to be used in conjunction with your installation of Flood Modeller to provide users with a set of tools to extend the capabilities of Flood Modeller and build into automated workflows.
17
20
 
18
- ![API Overview](https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/getting_started/api_overview_small.png)
21
+ <picture>
22
+ <source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/getting_started/api_overview_dark.png">
23
+ <img alt="API Overview" src="https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/getting_started/api_overview.png">
24
+ </picture>
19
25
 
20
26
  ## Installation
21
27
  You can install the floodmodeller_api package from PyPI with the following command:
@@ -24,7 +30,7 @@ You can install the floodmodeller_api package from PyPI with the following comma
24
30
  pip install floodmodeller-api
25
31
  ```
26
32
 
27
- Python 3.9 or greater is required.
33
+ Python 3.10 or greater is required.
28
34
 
29
35
  Once you have installed floodmodeller_api to your python environment, you can import the package with:
30
36
 
@@ -6,4 +6,4 @@ from .logs import LF1, LF2
6
6
  from .util import read_file
7
7
  from .version import __version__
8
8
  from .xml2d import XML2D
9
- from .zzn import ZZN
9
+ from .zz import ZZN, ZZX
@@ -33,8 +33,8 @@ from .util import FloodModellerAPIError, handle_exception
33
33
  class FMFile(Jsonable):
34
34
  """Base class for all Flood Modeller File types"""
35
35
 
36
- _filetype: str | None = None
37
- _suffix: str | None = None
36
+ _filetype: str
37
+ _suffix: str
38
38
  MAX_DIFF = 25
39
39
 
40
40
  def __init__(self, filepath: str | Path | None = None, **kwargs):
@@ -42,16 +42,16 @@ class FMFile(Jsonable):
42
42
  self._filepath = Path(filepath)
43
43
  # * Add check or fix for path lengths greater than DOS standard length of 260 characters
44
44
 
45
- if not self._filepath.suffix.lower() == self._suffix:
46
- raise TypeError(
47
- f"Given filepath does not point to a {self._filetype} file. Please point to the full path for a {self._filetype} file",
48
- )
45
+ if self._filepath.suffix.lower() != self._suffix:
46
+ msg = f"Given filepath does not point to a {self._filetype} file. Please point to the full path for a {self._filetype} file"
47
+ raise TypeError(msg)
49
48
  if not self._filepath.exists():
50
- raise FileNotFoundError(
49
+ msg = (
51
50
  f"{self._filetype} file does not exist! If you are wanting to create a new {self._filetype}, initiate the class without a given "
52
51
  f"filepath to create a new blank {self._filetype} or point the filepath of an existing {self._filetype} to use as a template, "
53
- f"then use the .save() method to save to a new filepath",
52
+ f"then use the .save() method to save to a new filepath"
54
53
  )
54
+ raise FileNotFoundError(msg)
55
55
  # If the file is not a ZZN file, then perform a backup
56
56
  # This performs a conditional back up, only copying the file if an equivalent copy doesn't already exist
57
57
  if self._filetype != "ZZN":
@@ -60,6 +60,17 @@ class FMFile(Jsonable):
60
60
  # Add the file object as a property to expose the restore method
61
61
  self.file = file
62
62
 
63
+ @property
64
+ def filepath(self) -> Path:
65
+ if not hasattr(self, "_filepath"):
66
+ msg = "Object has no filepath."
67
+ raise AttributeError(msg)
68
+ return self._filepath
69
+
70
+ @property
71
+ def filetype(self) -> str:
72
+ return self._filetype
73
+
63
74
  def __repr__(self):
64
75
  filepath = "<in_memory>" if not hasattr(self, "_filepath") else self._filepath
65
76
  return f"<floodmodeller_api Class: {self._filetype}(filepath={filepath})>"
@@ -73,9 +84,8 @@ class FMFile(Jsonable):
73
84
  def _update(self):
74
85
  """Updates the existing self._filetype based on any altered attributes"""
75
86
  if self._filepath is None:
76
- raise UserWarning(
77
- f"{self._filetype} must be saved to a specific filepath before update() can be called.",
78
- )
87
+ msg = f"{self._filetype} must be saved to a specific filepath before update() can be called."
88
+ raise UserWarning(msg)
79
89
 
80
90
  string = self._write()
81
91
  with open(self._filepath, "w") as _file:
@@ -84,10 +94,9 @@ class FMFile(Jsonable):
84
94
 
85
95
  def _save(self, filepath):
86
96
  filepath = Path(filepath).absolute()
87
- if not filepath.suffix.lower() == self._suffix:
88
- raise TypeError(
89
- f'Given filepath does not point to a filepath suffixed "{self._suffix}". Please point to the full path to save the {self._filetype} file',
90
- )
97
+ if filepath.suffix.lower() != self._suffix:
98
+ msg = f'Given filepath does not point to a filepath suffixed "{self._suffix}". Please point to the full path to save the {self._filetype} file'
99
+ raise TypeError(msg)
91
100
 
92
101
  if not filepath.parent.exists():
93
102
  Path.mkdir(filepath.parent)
@@ -102,7 +111,8 @@ class FMFile(Jsonable):
102
111
  @handle_exception(when="compare")
103
112
  def _diff(self, other, force_print=False):
104
113
  if self._filetype != other._filetype:
105
- raise TypeError("Cannot compare objects of different filetypes")
114
+ msg = "Cannot compare objects of different filetypes"
115
+ raise TypeError(msg)
106
116
  diff = self._get_diff(other)
107
117
  if diff[0]:
108
118
  print("No difference, files are equivalent")
@@ -195,7 +195,8 @@ class File(BackupControl):
195
195
  self.path = Path(path)
196
196
  # Check if the file exists
197
197
  if not self.path.exists():
198
- raise OSError("File not found!")
198
+ msg = "File not found!"
199
+ raise OSError(msg)
199
200
  self.ext = self.path.suffix
200
201
  self.dttm_str = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
201
202
  self._generate_file_id()
@@ -232,7 +233,7 @@ class File(BackupControl):
232
233
  copy(self.path, backup_filepath)
233
234
  # Log an entry to the csv to make it easy to find the file
234
235
  # TODO: Only log file_id and poath, don't log duplicate lines. Needs to be fast so it doesn't slow FMFile down
235
- log_str = f"{str(self.path)},{self.file_id},{self.dttm_str}\n"
236
+ log_str = f"{self.path!s},{self.file_id},{self.dttm_str}\n"
236
237
  with open(self.backup_csv_path, "a") as f:
237
238
  f.write(log_str)
238
239
 
@@ -253,13 +253,11 @@ class DAT(FMFile):
253
253
  Union[Unit, list[Unit], None]: Either a singular unit or list of units with ds_label matching, if none exist returns none.
254
254
  """
255
255
 
256
- _ds_list = []
257
- for item in self._all_units:
258
- try:
259
- if item.ds_label == current_unit.name:
260
- _ds_list.append(item)
261
- except AttributeError:
262
- continue
256
+ _ds_list = [
257
+ item
258
+ for item in self._all_units
259
+ if hasattr(item, "ds_label") and item.ds_label == current_unit.name
260
+ ]
263
261
 
264
262
  if len(_ds_list) == 0:
265
263
  return None
@@ -295,7 +293,7 @@ class DAT(FMFile):
295
293
  def _read(self) -> None:
296
294
  # Read DAT data
297
295
  with open(self._filepath) as dat_file:
298
- self._raw_data: list[str] = [line.rstrip("\n") for line in dat_file.readlines()]
296
+ self._raw_data: list[str] = [line.rstrip("\n") for line in dat_file]
299
297
 
300
298
  # Generate DAT structure
301
299
  self._update_dat_struct()
@@ -414,9 +412,8 @@ class DAT(FMFile):
414
412
  if name != unit.name:
415
413
  # Check if new name already exists as a label
416
414
  if unit.name in unit_group:
417
- raise Exception(
418
- f'Error: Cannot update label "{name}" to "{unit.name}" because "{unit.name}" already exists in the Network {unit_group_name} group',
419
- )
415
+ msg = f'Error: Cannot update label "{name}" to "{unit.name}" because "{unit.name}" already exists in the Network {unit_group_name} group'
416
+ raise Exception(msg)
420
417
  unit_group[unit.name] = unit
421
418
  del unit_group[name]
422
419
  # Update label in ICs
@@ -528,7 +525,8 @@ class DAT(FMFile):
528
525
  elif unit_type in units.UNSUPPORTED_UNIT_TYPES:
529
526
  self._process_unsupported_unit(unit_type, unit_data)
530
527
  elif unit_type not in ("GENERAL", "GISINFO"):
531
- raise Exception(f"Unexpected unit type encountered: {unit_type}")
528
+ msg = f"Unexpected unit type encountered: {unit_type}"
529
+ raise Exception(msg)
532
530
 
533
531
  def _initialize_collections(self):
534
532
  # Initialize unit collections
@@ -564,9 +562,8 @@ class DAT(FMFile):
564
562
  def _add_unit_to_group(self, unit_group, unit_type, unit_name, unit_data):
565
563
  # Raise exception if a duplicate label is encountered
566
564
  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
- )
565
+ msg = f'Duplicate label ({unit_name}) encountered within category: {units.SUPPORTED_UNIT_TYPES[unit_type]["group"]}'
566
+ raise Exception(msg)
570
567
  # Changes done to account for unit types with spaces/dashes eg Flat-V Weir
571
568
  unit_type_safe = unit_type.replace(" ", "_").replace("-", "_")
572
569
  unit_group[unit_name] = eval(
@@ -720,7 +717,8 @@ class DAT(FMFile):
720
717
  """
721
718
  # catch if not valid unit
722
719
  if not isinstance(unit, Unit):
723
- raise TypeError("unit isn't a unit")
720
+ msg = "unit isn't a unit"
721
+ raise TypeError(msg)
724
722
 
725
723
  # remove from all units
726
724
  index = self._all_units.index(unit)
@@ -768,17 +766,17 @@ class DAT(FMFile):
768
766
  # catch errors
769
767
  provided_params = sum(arg is not None for arg in (add_before, add_after, add_at))
770
768
  if provided_params == 0:
771
- raise SyntaxError(
772
- "No positional argument given. Please provide either add_before, add_at or add_after",
773
- )
769
+ msg = "No positional argument given. Please provide either add_before, add_at or add_after"
770
+ raise SyntaxError(msg)
774
771
  if provided_params > 1:
775
- raise SyntaxError("Only one of add_at, add_before, or add_after required")
772
+ msg = "Only one of add_at, add_before, or add_after required"
773
+ raise SyntaxError(msg)
776
774
  if not isinstance(unit, Unit):
777
- raise TypeError("unit isn't a unit")
775
+ msg = "unit isn't a unit"
776
+ raise TypeError(msg)
778
777
  if add_at is None and not (isinstance(add_before, Unit) or isinstance(add_after, Unit)):
779
- raise TypeError(
780
- "add_before or add_after argument must be a Flood Modeller Unit type",
781
- )
778
+ msg = "add_before or add_after argument must be a Flood Modeller Unit type"
779
+ raise TypeError(msg)
782
780
 
783
781
  unit_class = unit._unit
784
782
  if unit_class != "COMMENT":
@@ -786,9 +784,8 @@ class DAT(FMFile):
786
784
  unit_group_name = units.SUPPORTED_UNIT_TYPES[unit._unit]["group"]
787
785
  unit_group = getattr(self, unit_group_name)
788
786
  if unit.name in unit_group:
789
- raise NameError(
790
- "Name already appears in unit group. Cannot have two units with same name in same group",
791
- )
787
+ msg = "Name already appears in unit group. Cannot have two units with same name in same group"
788
+ raise NameError(msg)
792
789
 
793
790
  # positional argument
794
791
  if add_at is not None:
@@ -796,7 +793,8 @@ class DAT(FMFile):
796
793
  if insert_index < 0:
797
794
  insert_index += len(self._all_units) + 1
798
795
  if insert_index < 0:
799
- raise Exception(f"invalid add_at index: {add_at}")
796
+ msg = f"invalid add_at index: {add_at}"
797
+ raise Exception(msg)
800
798
  else:
801
799
  check_unit = add_before or add_after
802
800
  for index, thing in enumerate(self._all_units):
@@ -805,9 +803,10 @@ class DAT(FMFile):
805
803
  insert_index += 1 if add_after else 0
806
804
  break
807
805
  else:
808
- raise Exception(
809
- f"{check_unit} not found in dat network, so cannot be used to add before/after",
806
+ msg = (
807
+ f"{check_unit} not found in dat network, so cannot be used to add before/after"
810
808
  )
809
+ raise Exception(msg)
811
810
 
812
811
  unit_data = unit._write()
813
812
  self._all_units.insert(insert_index, unit)
@@ -59,8 +59,8 @@ def check_item_with_dataframe_equal( # noqa: C901, PLR0912
59
59
  row_diffs = []
60
60
  for row in rows:
61
61
  for col in df_diff.columns:
62
- if True not in df_diff.loc[row, col].duplicated().values:
63
- vals = df_diff.loc[row, col].values
62
+ if True not in df_diff.loc[row, col].duplicated().to_numpy():
63
+ vals = df_diff.loc[row, col].to_numpy()
64
64
  row_diffs.append(
65
65
  f" Row: {row}, Col: '{col}' - left: {vals[0]}, right: {vals[1]}",
66
66
  )
@@ -96,7 +96,7 @@ def check_dict_with_dataframe_equal(dict_a, dict_b, name, diff, special_types):
96
96
  )
97
97
  if not _result:
98
98
  result = False
99
- except KeyError as ke:
99
+ except KeyError as ke: # noqa: PERF203
100
100
  result = False
101
101
  diff.append((name, f"Key: '{ke.args[0]}' missing in other"))
102
102
  continue
@@ -51,7 +51,8 @@ class HydrologyPlusExport(FMFile):
51
51
  with self._filepath.open("r") as file:
52
52
  header = file.readline().strip(" ,\n\r")
53
53
  if header != "Flood Modeller Hydrology+ hydrograph file":
54
- raise ValueError("Input file is not the correct format for Hydrology+ export data.")
54
+ msg = "Input file is not the correct format for Hydrology+ export data."
55
+ raise ValueError(msg)
55
56
 
56
57
  self._data_file = pd.read_csv(self._filepath)
57
58
  self._metadata = self._get_metadata()
@@ -85,20 +86,21 @@ class HydrologyPlusExport(FMFile):
85
86
  return next(col for col in self.data.columns if col.lower().startswith(event.lower()))
86
87
 
87
88
  if not (return_period and storm_duration and scenario):
88
- raise ValueError(
89
+ msg = (
89
90
  "Missing required inputs to find event, if no event string is passed then a "
90
91
  "return_period, storm_duration and scenario are needed. You provided: "
91
- f"{return_period=}, {storm_duration=}, {scenario=}",
92
+ f"{return_period=}, {storm_duration=}, {scenario=}"
92
93
  )
94
+ raise ValueError(msg)
93
95
  for column in self.data.columns:
94
96
  s, sd, rp, *_ = column.split(" - ")
95
97
  if s == scenario and float(sd) == storm_duration and float(rp) == return_period:
96
98
  return column
97
- else:
98
- raise ValueError(
99
- "No matching event was found based on "
100
- f"{return_period=}, {storm_duration=}, {scenario=}",
101
- )
99
+ msg = (
100
+ "No matching event was found based on "
101
+ f"{return_period=}, {storm_duration=}, {scenario=}"
102
+ )
103
+ raise ValueError(msg)
102
104
 
103
105
  def get_event_flow(
104
106
  self,
@@ -197,11 +199,10 @@ class HydrologyPlusExport(FMFile):
197
199
  elif isinstance(template_ief, (Path, str)):
198
200
  template_ief = IEF(template_ief)
199
201
 
200
- generated_iefs = []
201
- for column in self.data.columns:
202
- generated_iefs.append(self.generate_ief(node_label, template_ief, event=column))
203
-
204
- return generated_iefs
202
+ return [
203
+ self.generate_ief(node_label, template_ief, event=column)
204
+ for column in self.data.columns
205
+ ]
205
206
 
206
207
  def generate_ief( # noqa: PLR0913
207
208
  self,
@@ -61,7 +61,7 @@ class IED(FMFile):
61
61
  def _read(self):
62
62
  # Read IED data
63
63
  with open(self._filepath) as ied_file:
64
- self._raw_data = [line.rstrip("\n") for line in ied_file.readlines()]
64
+ self._raw_data = [line.rstrip("\n") for line in ied_file]
65
65
 
66
66
  # Generate IED structure
67
67
  self._update_ied_struct()
@@ -87,10 +87,11 @@ class IED(FMFile):
87
87
  if name != unit.name:
88
88
  # Check if new name already exists as a label
89
89
  if unit.name in unit_group:
90
- raise Exception(
90
+ msg = (
91
91
  f'Error: Cannot update label "{name}" to "{unit.name}" because '
92
- f'"{unit.name}" already exists in the Network {unit_group_name} group',
92
+ f'"{unit.name}" already exists in the Network {unit_group_name} group'
93
93
  )
94
+ raise Exception(msg)
94
95
  unit_group[unit.name] = unit
95
96
  del unit_group[name]
96
97
 
@@ -180,9 +181,8 @@ class IED(FMFile):
180
181
  # Create instance of unit and add to relevant group
181
182
  unit_group = getattr(self, units.SUPPORTED_UNIT_TYPES[block["Type"]]["group"])
182
183
  if unit_name in unit_group:
183
- raise Exception(
184
- f'Duplicate label ({unit_name}) encountered within category: {units.SUPPORTED_UNIT_TYPES[block["Type"]]["group"]}',
185
- )
184
+ msg = f'Duplicate label ({unit_name}) encountered within category: {units.SUPPORTED_UNIT_TYPES[block["Type"]]["group"]}'
185
+ raise Exception(msg)
186
186
  unit_group[unit_name] = eval(f'units.{block["Type"]}({unit_data})')
187
187
 
188
188
  self._all_units.append(unit_group[unit_name])
@@ -17,7 +17,6 @@ address: Jacobs UK Limited, Flood Modeller, Cottons Centre, Cottons Lane, London
17
17
  from __future__ import annotations
18
18
 
19
19
  import csv
20
- import os
21
20
  import subprocess
22
21
  import time
23
22
  from io import StringIO
@@ -34,7 +33,7 @@ from .ief_flags import flags
34
33
  from .logs import LF1, create_lf
35
34
  from .to_from_json import Jsonable
36
35
  from .util import handle_exception
37
- from .zzn import ZZN
36
+ from .zz import ZZN
38
37
 
39
38
 
40
39
  def try_numeric(value: str) -> str | int | float:
@@ -82,7 +81,7 @@ class IEF(FMFile):
82
81
  def _read(self):
83
82
  # Read IEF data
84
83
  with open(self._filepath) as ief_file:
85
- raw_data = [line.rstrip("\n") for line in ief_file.readlines()]
84
+ raw_data = [line.rstrip("\n") for line in ief_file]
86
85
  # Clean data and add as class properties
87
86
  # Create a list to store the properties which are to be saved in IEF, so as to ignore any temp properties.
88
87
  prev_comment = None
@@ -170,7 +169,7 @@ class IEF(FMFile):
170
169
  # Add multiple EventData if present
171
170
  for idx, key in enumerate(event_data):
172
171
  if idx == event_index:
173
- ief_string += f";{key}\nEventData{eq}{str(event_data[key])}\n"
172
+ ief_string += f";{key}\nEventData{eq}{event_data[key]!s}\n"
174
173
  break
175
174
  event_index += 1
176
175
 
@@ -181,7 +180,7 @@ class IEF(FMFile):
181
180
 
182
181
  else:
183
182
  # writes property and value to ief string
184
- ief_string += f"{prop}{eq}{str(getattr(self, prop))}\n"
183
+ ief_string += f"{prop}{eq}{getattr(self, prop)!s}\n"
185
184
 
186
185
  return ief_string
187
186
 
@@ -279,10 +278,11 @@ class IEF(FMFile):
279
278
  def _update_eventdata_info(self): # noqa: C901
280
279
  if not isinstance(self.eventdata, dict):
281
280
  # If attribute not a dict, adds the value as a single entry in list
282
- raise AttributeError(
281
+ msg = (
283
282
  "The 'EventData' attribute should be a dictionary with keys defining the event"
284
- " names and values referencing the IED files",
283
+ " names and values referencing the IED files"
285
284
  )
285
+ raise AttributeError(msg)
286
286
 
287
287
  # Number of 'EventData' flags in ief
288
288
  event_properties = self._ief_properties.count("EventData")
@@ -328,11 +328,12 @@ class IEF(FMFile):
328
328
  try:
329
329
  self.NoOfFlowTimeSeries = sum([ftp.count_series() for ftp in self.flowtimeprofiles])
330
330
  except FileNotFoundError as err:
331
- raise UserWarning(
331
+ msg = (
332
332
  "Failed to read csv referenced in flowtimeprofile, file either does not exist or is"
333
333
  "unable to be found due to relative path from IEF file. NoOfFlowTimeSeries has not"
334
- "been updated.",
335
- ) from err
334
+ "been updated."
335
+ )
336
+ raise UserWarning(msg) from err
336
337
 
337
338
  end_index = None
338
339
  start_index = (
@@ -471,9 +472,8 @@ class IEF(FMFile):
471
472
  self._range_function = range_function
472
473
  self._range_settings = range_settings if range_settings else {}
473
474
  if self._filepath is None:
474
- raise UserWarning(
475
- "IEF must be saved to a specific filepath before simulate() can be called.",
476
- )
475
+ msg = "IEF must be saved to a specific filepath before simulate() can be called."
476
+ raise UserWarning(msg)
477
477
  if precision.upper() == "DEFAULT":
478
478
  precision = "SINGLE" # Defaults to single...
479
479
  for attr in dir(self):
@@ -489,9 +489,8 @@ class IEF(FMFile):
489
489
  else:
490
490
  _enginespath = enginespath
491
491
  if not Path(_enginespath).exists():
492
- raise Exception(
493
- f"Flood Modeller non-default engine path not found! {str(_enginespath)}",
494
- )
492
+ msg = f"Flood Modeller non-default engine path not found! {_enginespath!s}"
493
+ raise Exception(msg)
495
494
 
496
495
  if precision.upper() == "SINGLE":
497
496
  isis32_fp = str(Path(_enginespath, "ISISf32.exe"))
@@ -499,14 +498,15 @@ class IEF(FMFile):
499
498
  isis32_fp = str(Path(_enginespath, "ISISf32_DoubleP.exe"))
500
499
 
501
500
  if not Path(isis32_fp).exists():
502
- raise Exception(f"Flood Modeller engine not found! Expected location: {isis32_fp}")
501
+ msg = f"Flood Modeller engine not found! Expected location: {isis32_fp}"
502
+ raise Exception(msg)
503
503
 
504
504
  run_command = f'"{isis32_fp}" -sd "{self._filepath}"'
505
505
 
506
506
  if method.upper() == "WAIT":
507
507
  print("Executing simulation...")
508
508
  # execute simulation
509
- process = Popen(run_command, cwd=os.path.dirname(self._filepath))
509
+ process = Popen(run_command, cwd=Path(self._filepath).parent)
510
510
 
511
511
  # progress bar based on log files
512
512
  steady = self.RunType == "Steady"
@@ -526,7 +526,7 @@ class IEF(FMFile):
526
526
  elif method.upper() == "RETURN_PROCESS":
527
527
  print("Executing simulation...")
528
528
  # execute simulation
529
- return Popen(run_command, cwd=os.path.dirname(self._filepath))
529
+ return Popen(run_command, cwd=Path(self._filepath).parent)
530
530
 
531
531
  return None
532
532
 
@@ -553,7 +553,8 @@ class IEF(FMFile):
553
553
  result_path = self._get_result_filepath(suffix="zzn")
554
554
 
555
555
  if not result_path.exists():
556
- raise FileNotFoundError("Simulation results file (zzn) not found")
556
+ msg = "Simulation results file (zzn) not found"
557
+ raise FileNotFoundError(msg)
557
558
 
558
559
  return ZZN(result_path)
559
560
 
@@ -565,7 +566,8 @@ class IEF(FMFile):
565
566
  """
566
567
 
567
568
  if not self._log_path.exists():
568
- raise FileNotFoundError("Log file (LF1) not found")
569
+ msg = "Log file (LF1) not found"
570
+ raise FileNotFoundError(msg)
569
571
 
570
572
  steady = self.RunType == "Steady"
571
573
  return LF1(self._log_path, steady)
@@ -616,7 +618,8 @@ class IEF(FMFile):
616
618
  exy_path = self._filepath.with_suffix(".exy")
617
619
 
618
620
  if not exy_path.exists():
619
- raise FileNotFoundError("Simulation results error log (.exy) not found")
621
+ msg = "Simulation results error log (.exy) not found"
622
+ raise FileNotFoundError(msg)
620
623
 
621
624
  exy_data = pd.read_csv(exy_path, names=["node", "timestep", "severity", "code", "summary"])
622
625
  exy_data["type"] = exy_data["code"].apply(
@@ -678,9 +681,8 @@ class FlowTimeProfile(Jsonable):
678
681
  self.profile = kwargs.get("profile", "")
679
682
  self.comment = kwargs.get("comment", "")
680
683
  else:
681
- raise ValueError(
682
- "You must provide either a single raw string argument or keyword arguments.",
683
- )
684
+ msg = "You must provide either a single raw string argument or keyword arguments."
685
+ raise ValueError(msg)
684
686
 
685
687
  base_path = Path(kwargs.get("ief_filepath", ""))
686
688
  self._csvfile = (base_path / self.csv_filepath.strip('"')).resolve()
@@ -60,7 +60,7 @@ class INP(FMFile):
60
60
  def _read(self):
61
61
  # Read INP file
62
62
  with open(self._filepath) as inp_file:
63
- self._raw_data = [line.rstrip("\n") for line in inp_file.readlines()]
63
+ self._raw_data = [line.rstrip("\n") for line in inp_file]
64
64
 
65
65
  # Generate INP file structure
66
66
  self._update_inp_struct()
@@ -129,9 +129,8 @@ class INP(FMFile):
129
129
  return "\n".join(self._raw_data) + "\n"
130
130
 
131
131
  def _create_from_blank(self):
132
- raise NotImplementedError(
133
- "Creating new 1D urban models (INP files) is not yet supported by floodmodeller_api, only existing models can be read",
134
- )
132
+ msg = "Creating new 1D urban models (INP files) is not yet supported by floodmodeller_api, only existing models can be read"
133
+ raise NotImplementedError(msg)
135
134
 
136
135
  def _get_section_definitions(self):
137
136
  """Internal method used to get section definitions for each supported unit type and general parameters."""