floodmodeller-api 0.5.0.post1__tar.gz → 0.5.2__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 (271) hide show
  1. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/LICENSE.txt +1 -1
  2. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/MANIFEST.in +1 -1
  3. {floodmodeller_api-0.5.0.post1/floodmodeller_api.egg-info → floodmodeller_api-0.5.2}/PKG-INFO +20 -6
  4. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/README.md +9 -3
  5. floodmodeller_api-0.5.2/floodmodeller_api/__init__.py +19 -0
  6. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/_base.py +55 -36
  7. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/backup.py +15 -12
  8. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/dat.py +191 -121
  9. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/diff.py +4 -4
  10. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/hydrology_plus/hydrology_plus_export.py +15 -14
  11. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/ied.py +8 -10
  12. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/ief.py +56 -42
  13. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/ief_flags.py +1 -1
  14. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/inp.py +7 -10
  15. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/logs/lf.py +25 -26
  16. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/logs/lf_helpers.py +20 -20
  17. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/logs/lf_params.py +1 -5
  18. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/mapping.py +11 -2
  19. floodmodeller_api-0.5.2/floodmodeller_api/test/__init__.py +4 -0
  20. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/conftest.py +2 -3
  21. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_backup.py +2 -2
  22. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_conveyance.py +13 -7
  23. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_dat.py +168 -20
  24. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX18_DAT_expected.json +164 -144
  25. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX3_DAT_expected.json +6 -2
  26. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX6_DAT_expected.json +12 -46
  27. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/encoding_test_cp1252.dat +1081 -0
  28. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/encoding_test_utf8.dat +1081 -0
  29. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/integrated_bridge/AR_NoSP_NoBl_2O_NO_OneFRC.ied +33 -0
  30. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/integrated_bridge/AR_vSP_25pc_1O.ied +32 -0
  31. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/integrated_bridge/PL_vSP_25pc_1O.ied +34 -0
  32. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/integrated_bridge/SBTwoFRCsStaggered.IED +32 -0
  33. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/integrated_bridge/US_NoSP_NoBl_OR_RN.ied +28 -0
  34. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/integrated_bridge/US_SP_NoBl_OR_frc_PT2-5_RN.ied +34 -0
  35. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/integrated_bridge/US_fSP_NoBl_1O.ied +30 -0
  36. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/integrated_bridge/US_nSP_NoBl_1O.ied +49 -0
  37. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/integrated_bridge/US_vSP_NoBl_2O_Para.ied +35 -0
  38. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/integrated_bridge.dat +40 -0
  39. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.ied +2 -2
  40. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network_dat_expected.json +141 -243
  41. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network_ied_expected.json +2 -2
  42. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network_with_comments.ied +2 -2
  43. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/structure_logs/EX17_expected.csv +4 -0
  44. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/structure_logs/EX17_expected.json +69 -0
  45. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/structure_logs/EX18_expected.csv +20 -0
  46. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/structure_logs/EX18_expected.json +292 -0
  47. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/structure_logs/EX6_expected.csv +4 -0
  48. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/structure_logs/EX6_expected.json +35 -0
  49. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_flow.csv +182 -0
  50. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_fr.csv +182 -0
  51. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_mode.csv +182 -0
  52. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_stage.csv +182 -0
  53. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_state.csv +182 -0
  54. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_velocity.csv +182 -0
  55. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_left_fp_h.csv +182 -0
  56. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_left_fp_mode.csv +182 -0
  57. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_link_inflow.csv +182 -0
  58. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_max.csv +87 -0
  59. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_right_fp_h.csv +182 -0
  60. floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzx_right_fp_mode.csv +182 -0
  61. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_flowtimeprofile.py +2 -2
  62. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_hydrology_plus_export.py +4 -2
  63. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_ied.py +3 -3
  64. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_ief.py +12 -4
  65. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_inp.py +2 -2
  66. floodmodeller_api-0.5.2/floodmodeller_api/test/test_integrated_bridge.py +159 -0
  67. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_json.py +14 -13
  68. floodmodeller_api-0.5.2/floodmodeller_api/test/test_logs_lf.py +123 -0
  69. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_read_file.py +1 -0
  70. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_river.py +12 -12
  71. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_tool.py +8 -5
  72. floodmodeller_api-0.5.2/floodmodeller_api/test/test_toolbox_structure_log.py +224 -0
  73. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_xml2d.py +14 -16
  74. floodmodeller_api-0.5.2/floodmodeller_api/test/test_zz.py +143 -0
  75. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/to_from_json.py +9 -9
  76. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/tool.py +15 -11
  77. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/example_tool.py +5 -1
  78. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/model_build/add_siltation_definition.py +13 -9
  79. floodmodeller_api-0.5.2/floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +593 -0
  80. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/model_build/structure_log_definition.py +5 -1
  81. floodmodeller_api-0.5.2/floodmodeller_api/units/__init__.py +35 -0
  82. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/_base.py +87 -20
  83. floodmodeller_api-0.5.2/floodmodeller_api/units/_helpers.py +343 -0
  84. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/boundaries.py +59 -71
  85. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/comment.py +1 -1
  86. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/conduits.py +57 -54
  87. floodmodeller_api-0.5.2/floodmodeller_api/units/connectors.py +112 -0
  88. floodmodeller_api-0.5.2/floodmodeller_api/units/controls.py +107 -0
  89. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/conveyance.py +1 -1
  90. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/iic.py +2 -9
  91. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/losses.py +44 -45
  92. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/sections.py +52 -51
  93. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/structures.py +361 -531
  94. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/units.py +27 -26
  95. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/unsupported.py +5 -7
  96. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/units/variables.py +2 -2
  97. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/urban1d/_base.py +13 -17
  98. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/urban1d/conduits.py +11 -21
  99. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/urban1d/general_parameters.py +1 -1
  100. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/urban1d/junctions.py +7 -11
  101. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/urban1d/losses.py +13 -17
  102. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/urban1d/outfalls.py +18 -22
  103. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/urban1d/raingauges.py +5 -10
  104. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/urban1d/subsections.py +5 -4
  105. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/urban1d/xsections.py +14 -17
  106. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/util.py +23 -6
  107. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/validation/parameters.py +7 -3
  108. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/validation/urban_parameters.py +1 -4
  109. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/validation/validation.py +11 -5
  110. floodmodeller_api-0.5.2/floodmodeller_api/version.py +1 -0
  111. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/xml2d.py +27 -31
  112. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/xml2d_template.py +1 -1
  113. floodmodeller_api-0.5.2/floodmodeller_api/zz.py +539 -0
  114. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2/floodmodeller_api.egg-info}/PKG-INFO +20 -6
  115. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api.egg-info/SOURCES.txt +37 -4
  116. floodmodeller_api-0.5.2/pyproject.toml +52 -0
  117. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/requirements.txt +2 -3
  118. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/setup.py +1 -1
  119. floodmodeller_api-0.5.0.post1/floodmodeller_api/__init__.py +0 -9
  120. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/__init__.py +0 -4
  121. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_logs_lf.py +0 -102
  122. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_toolbox_structure_log.py +0 -234
  123. floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_zzn.py +0 -36
  124. floodmodeller_api-0.5.0.post1/floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +0 -287
  125. floodmodeller_api-0.5.0.post1/floodmodeller_api/units/__init__.py +0 -20
  126. floodmodeller_api-0.5.0.post1/floodmodeller_api/units/helpers.py +0 -123
  127. floodmodeller_api-0.5.0.post1/floodmodeller_api/version.py +0 -1
  128. floodmodeller_api-0.5.0.post1/floodmodeller_api/zzn.py +0 -414
  129. floodmodeller_api-0.5.0.post1/pyproject.toml +0 -46
  130. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/hydrology_plus/__init__.py +0 -0
  131. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/hydrology_plus/helper.py +0 -0
  132. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/libs/libifcoremd.dll +0 -0
  133. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/libs/libifcoremt.so.5 +0 -0
  134. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/libs/libifport.so.5 +0 -0
  135. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/libs/libimf.so +0 -0
  136. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/libs/libintlc.so.5 +0 -0
  137. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/libs/libmmd.dll +0 -0
  138. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/libs/libsvml.so +0 -0
  139. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/libs/libzzn_read.so +0 -0
  140. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/libs/zzn_read.dll +0 -0
  141. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/logs/__init__.py +0 -0
  142. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/7082.ief +0 -0
  143. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/All Units 4_6.DAT +0 -0
  144. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/All Units 4_6.feb +0 -0
  145. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/BRIDGE.DAT +0 -0
  146. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/BaseModel_2D_Q100.ief +0 -0
  147. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Baseline_unchecked.csv +0 -0
  148. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Constant QT.ief +0 -0
  149. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.dat +0 -0
  150. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.feb +0 -0
  151. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/DamBreakADI.xml +0 -0
  152. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/DamBreakFAST.xml +0 -0
  153. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/DamBreakFAST_dy.xml +0 -0
  154. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/DamBreakTVD.xml +0 -0
  155. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/DefenceBreach.xml +0 -0
  156. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/DefenceBreachFAST.xml +0 -0
  157. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/DefenceBreachFAST_dy.xml +0 -0
  158. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Domain1+2_QH.xml +0 -0
  159. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Domain1_H.xml +0 -0
  160. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Domain1_Q.xml +0 -0
  161. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Domain1_Q_FAST.xml +0 -0
  162. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Domain1_Q_FAST_dy.xml +0 -0
  163. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Domain1_Q_xml_expected.json +0 -0
  164. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Domain1_W.xml +0 -0
  165. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX1.DAT +0 -0
  166. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX1.ext +0 -0
  167. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX1.feb +0 -0
  168. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX1.gxy +0 -0
  169. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX17.DAT +0 -0
  170. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX17.ext +0 -0
  171. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX17.feb +0 -0
  172. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX18.DAT +0 -0
  173. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX2.DAT +0 -0
  174. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX3.DAT +0 -0
  175. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX3_IEF_expected.json +0 -0
  176. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX6.DAT +0 -0
  177. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX6.ext +0 -0
  178. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/EX6.feb +0 -0
  179. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Event Data Example.DAT +0 -0
  180. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Event Data Example.ext +0 -0
  181. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Event Data Example.feb +0 -0
  182. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/FEH boundary.ief +0 -0
  183. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Linked1D2D.xml +0 -0
  184. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Linked1D2DFAST.xml +0 -0
  185. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Linked1D2DFAST_dy.xml +0 -0
  186. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/Linked1D2D_xml_expected.json +0 -0
  187. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/P3Panels_UNsteady.ief +0 -0
  188. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/QT in dat file.ief +0 -0
  189. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/T10.ief +0 -0
  190. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/T2.ief +0 -0
  191. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/T5.ief +0 -0
  192. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/blockage.dat +0 -0
  193. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/blockage.ext +0 -0
  194. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/blockage.feb +0 -0
  195. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/blockage.gxy +0 -0
  196. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/conveyance_test.dat +0 -0
  197. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/conveyance_test.feb +0 -0
  198. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/conveyance_test.gxy +0 -0
  199. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/defaultUnits.dat +0 -0
  200. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/defaultUnits.ext +0 -0
  201. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/defaultUnits.feb +0 -0
  202. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/defaultUnits.fmpx +0 -0
  203. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/defaultUnits.gxy +0 -0
  204. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/df_flows_hplus.csv +0 -0
  205. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/event_hplus.csv +0 -0
  206. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/ex3.ief +0 -0
  207. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/ex3.lf1 +0 -0
  208. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/ex4.DAT +0 -0
  209. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/ex4.ief +0 -0
  210. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/ex4_changed.DAT +0 -0
  211. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/ex6.ief +0 -0
  212. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/example1.inp +0 -0
  213. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/example2.inp +0 -0
  214. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/example3.inp +0 -0
  215. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/example4.inp +0 -0
  216. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/example5.inp +0 -0
  217. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/example6.inp +0 -0
  218. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/example_h+_export.csv +0 -0
  219. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/expected_conveyance.csv +0 -0
  220. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/hplus_export_example_1.csv +0 -0
  221. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/hplus_export_example_10.csv +0 -0
  222. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/hplus_export_example_2.csv +0 -0
  223. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/hplus_export_example_3.csv +0 -0
  224. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/hplus_export_example_4.csv +0 -0
  225. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/hplus_export_example_5.csv +0 -0
  226. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/hplus_export_example_6.csv +0 -0
  227. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/hplus_export_example_7.csv +0 -0
  228. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/hplus_export_example_8.csv +0 -0
  229. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/hplus_export_example_9.csv +0 -0
  230. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/jump.dat +0 -0
  231. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.dat +0 -0
  232. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.ext +0 -0
  233. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.exy +0 -0
  234. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.feb +0 -0
  235. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.ief +0 -0
  236. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.inp +0 -0
  237. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.mmm +0 -0
  238. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.pxy +0 -0
  239. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.uic +0 -0
  240. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.zzd +0 -0
  241. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.zzl +0 -0
  242. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.zzn +0 -0
  243. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.zzu +0 -0
  244. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/network.zzx +0 -0
  245. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/rnweir.dat +0 -0
  246. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/rnweir.ext +0 -0
  247. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/rnweir.feb +0 -0
  248. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/rnweir.gxy +0 -0
  249. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/rnweir_default.dat +0 -0
  250. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/rnweir_default.ext +0 -0
  251. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/rnweir_default.feb +0 -0
  252. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/rnweir_default.fmpx +0 -0
  253. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/rnweir_default.gxy +0 -0
  254. /floodmodeller_api-0.5.0.post1/floodmodeller_api/test/test_data/network_from_tabularCSV.csv → /floodmodeller_api-0.5.2/floodmodeller_api/test/test_data/tabular_csv_outputs/network_zzn_max.csv +0 -0
  255. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/test/test_data/unit checks.dat +0 -0
  256. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/__init__.py +0 -0
  257. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/gui/bg.PNG +0 -0
  258. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/gui/logo.PNG +0 -0
  259. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/model_build/__init__.py +0 -0
  260. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/model_build/structure_log/__init__.py +0 -0
  261. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/model_conversion/__init__.py +0 -0
  262. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/model_review/__init__.py +0 -0
  263. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/toolbox/results_analysis/__init__.py +0 -0
  264. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/urban1d/__init__.py +0 -0
  265. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/validation/__init__.py +0 -0
  266. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api/xsd_backup.xml +0 -0
  267. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api.egg-info/dependency_links.txt +0 -0
  268. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api.egg-info/entry_points.txt +0 -0
  269. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api.egg-info/requires.txt +0 -0
  270. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/floodmodeller_api.egg-info/top_level.txt +0 -0
  271. {floodmodeller_api-0.5.0.post1 → floodmodeller_api-0.5.2}/setup.cfg +0 -0
@@ -1,5 +1,5 @@
1
1
  Flood Modeller Python API
2
- Copyright (C) 2024 Jacobs U.K. Limited
2
+ Copyright (C) 2025 Jacobs U.K. Limited
3
3
 
4
4
  This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
5
5
  as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
@@ -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,10 +1,10 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: floodmodeller_api
3
- Version: 0.5.0.post1
3
+ Version: 0.5.2
4
4
  Summary: Extends the functionality of Flood Modeller to python users
5
5
  Author: Jacobs
6
6
  Author-email: joe.pierce@jacobs.com
7
- License: GNU General Public License V3. Copyright (C) 2024 Jacobs U.K. Limited.
7
+ License: GNU General Public License V3. Copyright (C) 2025 Jacobs U.K. Limited.
8
8
  Project-URL: API Documentation, https://api.floodmodeller.com/api/
9
9
  Project-URL: Flood Modeller Homepage, https://www.floodmodeller.com/
10
10
  Project-URL: Contact & Support, https://www.floodmodeller.com/contact
@@ -19,8 +19,19 @@ Requires-Dist: shapely==2.*
19
19
  Requires-Dist: scipy==1.*
20
20
  Requires-Dist: freezegun==1.*
21
21
  Requires-Dist: requests>2.23
22
+ Dynamic: author
23
+ Dynamic: author-email
24
+ Dynamic: description
25
+ Dynamic: description-content-type
26
+ Dynamic: license
27
+ Dynamic: project-url
28
+ Dynamic: requires-dist
29
+ Dynamic: summary
22
30
 
23
- ![FM Logo](https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/_static/flood-modeller-logo-hero-image.png)
31
+ <picture>
32
+ <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">
33
+ <img alt="FM Logo" src="https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/_static/flood-modeller-logo-hero-image.png">
34
+ </picture>
24
35
 
25
36
 
26
37
  [![PyPI Latest Release](https://img.shields.io/pypi/v/floodmodeller-api.svg)](https://pypi.org/project/floodmodeller-api/)
@@ -37,7 +48,10 @@ Requires-Dist: requests>2.23
37
48
 
38
49
  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
50
 
40
- ![API Overview](https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/getting_started/api_overview_small.png)
51
+ <picture>
52
+ <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">
53
+ <img alt="API Overview" src="https://raw.githubusercontent.com/People-Places-Solutions/floodmodeller-api/main/docs/source/getting_started/api_overview.png">
54
+ </picture>
41
55
 
42
56
  ## Installation
43
57
  You can install the floodmodeller_api package from PyPI with the following command:
@@ -46,7 +60,7 @@ You can install the floodmodeller_api package from PyPI with the following comma
46
60
  pip install floodmodeller-api
47
61
  ```
48
62
 
49
- Python 3.9 or greater is required.
63
+ Python 3.10 or greater is required.
50
64
 
51
65
  Once you have installed floodmodeller_api to your python environment, you can import the package with:
52
66
 
@@ -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
 
@@ -0,0 +1,19 @@
1
+ import logging
2
+ import sys
3
+
4
+ from .dat import DAT
5
+ from .ied import IED
6
+ from .ief import IEF
7
+ from .inp import INP
8
+ from .logs import LF1, LF2
9
+ from .util import read_file
10
+ from .version import __version__
11
+ from .xml2d import XML2D
12
+ from .zz import ZZN, ZZX
13
+
14
+ logging.basicConfig(
15
+ stream=sys.stdout,
16
+ level=logging.INFO,
17
+ format="%(asctime)s - %(levelname)s - %(message)s",
18
+ datefmt="%H:%M:%S",
19
+ )
@@ -1,6 +1,6 @@
1
1
  """
2
2
  Flood Modeller Python API
3
- Copyright (C) 2024 Jacobs U.K. Limited
3
+ Copyright (C) 2025 Jacobs U.K. Limited
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
6
6
  as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
@@ -18,6 +18,7 @@ from __future__ import annotations
18
18
 
19
19
  """ Holds the base file class for API file classes """
20
20
 
21
+ import logging
21
22
  from pathlib import Path
22
23
  from typing import NoReturn
23
24
 
@@ -33,25 +34,26 @@ from .util import FloodModellerAPIError, handle_exception
33
34
  class FMFile(Jsonable):
34
35
  """Base class for all Flood Modeller File types"""
35
36
 
36
- _filetype: str | None = None
37
- _suffix: str | None = None
37
+ _filetype: str
38
+ _suffix: str
38
39
  MAX_DIFF = 25
40
+ ENCODING = "cp1252"
39
41
 
40
42
  def __init__(self, filepath: str | Path | None = None, **kwargs):
41
43
  if filepath is not None:
42
44
  self._filepath = Path(filepath)
43
45
  # * Add check or fix for path lengths greater than DOS standard length of 260 characters
44
46
 
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
- )
47
+ if self._filepath.suffix.lower() != self._suffix:
48
+ msg = f"Given filepath does not point to a {self._filetype} file. Please point to the full path for a {self._filetype} file"
49
+ raise TypeError(msg)
49
50
  if not self._filepath.exists():
50
- raise FileNotFoundError(
51
+ msg = (
51
52
  f"{self._filetype} file does not exist! If you are wanting to create a new {self._filetype}, initiate the class without a given "
52
53
  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",
54
+ f"then use the .save() method to save to a new filepath"
54
55
  )
56
+ raise FileNotFoundError(msg)
55
57
  # If the file is not a ZZN file, then perform a backup
56
58
  # This performs a conditional back up, only copying the file if an equivalent copy doesn't already exist
57
59
  if self._filetype != "ZZN":
@@ -60,6 +62,17 @@ class FMFile(Jsonable):
60
62
  # Add the file object as a property to expose the restore method
61
63
  self.file = file
62
64
 
65
+ @property
66
+ def filepath(self) -> Path:
67
+ if not hasattr(self, "_filepath"):
68
+ msg = "Object has no filepath."
69
+ raise AttributeError(msg)
70
+ return self._filepath
71
+
72
+ @property
73
+ def filetype(self) -> str:
74
+ return self._filetype
75
+
63
76
  def __repr__(self):
64
77
  filepath = "<in_memory>" if not hasattr(self, "_filepath") else self._filepath
65
78
  return f"<floodmodeller_api Class: {self._filetype}(filepath={filepath})>"
@@ -73,59 +86,65 @@ class FMFile(Jsonable):
73
86
  def _update(self):
74
87
  """Updates the existing self._filetype based on any altered attributes"""
75
88
  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
- )
89
+ msg = f"{self._filetype} must be saved to a specific filepath before update() can be called."
90
+ raise UserWarning(msg)
79
91
 
80
92
  string = self._write()
81
- with open(self._filepath, "w") as _file:
93
+ with open(self._filepath, "w", encoding=self.ENCODING) as _file:
82
94
  _file.write(string)
83
- print(f"{self._filetype} File Updated!")
95
+ logging.info("%s File Updated!", self._filepath)
84
96
 
85
97
  def _save(self, filepath):
86
98
  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
- )
99
+ if filepath.suffix.lower() != self._suffix:
100
+ 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'
101
+ raise TypeError(msg)
91
102
 
92
103
  if not filepath.parent.exists():
93
104
  Path.mkdir(filepath.parent)
94
105
 
95
106
  string = self._write()
96
- with open(filepath, "w") as _file:
107
+ with open(filepath, "w", encoding=self.ENCODING) as _file:
97
108
  _file.write(string)
98
109
  self._filepath = filepath # Updates the filepath attribute to the given path
99
110
 
100
- print(f"{self._filetype} File Saved to: {filepath}")
111
+ logging.info("%s File Saved to: %s", self._filetype, filepath)
101
112
 
102
113
  @handle_exception(when="compare")
103
- def _diff(self, other, force_print=False):
114
+ def _diff(self, other, force_print=False) -> None:
115
+ def _format_diff(diff_list, max_items=None) -> str:
116
+ return "\n".join(
117
+ f" {name}: {reason}"
118
+ for name, reason in (diff_list[:max_items] if max_items else diff_list)
119
+ )
120
+
104
121
  if self._filetype != other._filetype:
105
- raise TypeError("Cannot compare objects of different filetypes")
122
+ msg = "Cannot compare objects of different filetypes"
123
+ raise TypeError(msg)
106
124
  diff = self._get_diff(other)
107
125
  if diff[0]:
108
- print("No difference, files are equivalent")
109
- else:
110
- print(f"Files not equivalent, {len(diff[1])} difference(s) found:")
111
- if len(diff[1]) > self.MAX_DIFF and not force_print:
112
- print(f"[Showing first {self.MAX_DIFF} differences...] ")
113
- print(
114
- "\n".join(
115
- [f" {name}: {reason}" for name, reason in diff[1][: self.MAX_DIFF]],
116
- ),
117
- )
118
- print("\n...To see full list of all differences add force_print=True")
119
- else:
120
- print("\n".join([f" {name}: {reason}" for name, reason in diff[1]]))
126
+ logging.info("No difference, files are equivalent")
127
+ return
128
+ differences = (
129
+ f"[Showing first {self.MAX_DIFF} differences...]\n"
130
+ f"{_format_diff(diff[1], self.MAX_DIFF)}\n"
131
+ "...To see full list of all differences add force_print=True"
132
+ if len(diff[1]) > self.MAX_DIFF and not force_print
133
+ else _format_diff(diff[1])
134
+ )
135
+ logging.info("Files not equivalent, %s difference(s) found:\n%s", len(diff[1]), differences)
121
136
 
122
137
  def _get_diff(self, other):
123
138
  return self.__eq__(other, return_diff=True) # pylint: disable=unnecessary-dunder-call
124
139
 
125
140
  def _handle_exception(self, err, when) -> NoReturn:
126
- raise FloodModellerAPIError(err, when, self._filetype, self._filepath) from err
141
+ filepath_or_none = self._filepath if hasattr(self, "_filepath") else None
142
+ raise FloodModellerAPIError(err, when, self._filetype, filepath_or_none) from err
127
143
 
128
144
  def __eq__(self, other, return_diff=False):
145
+ if not isinstance(other, FMFile):
146
+ return NotImplemented if not return_diff else (False, ["Type mismatch"])
147
+
129
148
  result = True
130
149
  diff = []
131
150
  try:
@@ -1,6 +1,6 @@
1
1
  """
2
2
  Flood Modeller Python API
3
- Copyright (C) 2024 Jacobs U.K. Limited
3
+ Copyright (C) 2025 Jacobs U.K. Limited
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
6
6
  as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
@@ -17,6 +17,7 @@ address: Jacobs UK Limited, Flood Modeller, Cottons Centre, Cottons Lane, London
17
17
  from __future__ import annotations
18
18
 
19
19
  import filecmp
20
+ import logging
20
21
  import re
21
22
  import tempfile
22
23
  from datetime import datetime
@@ -60,6 +61,8 @@ class BackupControl(Jsonable):
60
61
  backup.clear_backup()
61
62
  """
62
63
 
64
+ ENCODING = "cp1252"
65
+
63
66
  def __init__(self):
64
67
  """
65
68
  Initialises a new BackUp object.
@@ -80,11 +83,15 @@ class BackupControl(Jsonable):
80
83
  # Create the backup directory if it doesn't exist
81
84
  if not self.backup_dir.exists():
82
85
  self.backup_dir.mkdir()
83
- print(f"{self.__class__.__name__}: Initialised backup directory at {self.backup_dir}")
86
+ logging.info(
87
+ "%s: Initialised backup directory at %s",
88
+ self.__class__.__name__,
89
+ self.backup_dir,
90
+ )
84
91
 
85
92
  # Create the backup CSV file if it doesn't exist
86
93
  if not self.backup_csv_path.exists():
87
- with open(self.backup_csv_path, "w") as f:
94
+ with open(self.backup_csv_path, "w", encoding=self.ENCODING) as f:
88
95
  f.write("path,file_id,dttm\n")
89
96
 
90
97
  def clear_backup(self, file_id="*"):
@@ -191,11 +198,11 @@ class File(BackupControl):
191
198
  """
192
199
 
193
200
  def __init__(self, path: str | Path = "", from_json: bool = False, **args):
194
- # TODO: Make protected properties so they can't be manipulated
195
201
  self.path = Path(path)
196
- # Check if the file exists
202
+ # Check if the file exists
197
203
  if not self.path.exists():
198
- raise OSError("File not found!")
204
+ msg = "File not found!"
205
+ raise OSError(msg)
199
206
  self.ext = self.path.suffix
200
207
  self.dttm_str = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
201
208
  self._generate_file_id()
@@ -211,7 +218,6 @@ class File(BackupControl):
211
218
  Generate the file's unique identifier as using a hash of the absolute file path
212
219
  """
213
220
  # hash the absolute path becuase the same file name / directroy structure may be mirrored across projects
214
- # TODO: Use a function that produces a shorter has to make interpretation of the directory easier
215
221
  fp_bytes = str(self.path.absolute()).encode()
216
222
  self.file_id = sha1(fp_bytes).hexdigest()
217
223
 
@@ -231,9 +237,8 @@ class File(BackupControl):
231
237
  backup_filepath = Path(self.backup_dir, self.backup_filename)
232
238
  copy(self.path, backup_filepath)
233
239
  # Log an entry to the csv to make it easy to find the file
234
- # 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
- with open(self.backup_csv_path, "a") as f:
240
+ log_str = f"{self.path!s},{self.file_id},{self.dttm_str}\n"
241
+ with open(self.backup_csv_path, "a", encoding=self.ENCODING) as f:
237
242
  f.write(log_str)
238
243
 
239
244
  def list_backups(self) -> list:
@@ -258,8 +263,6 @@ class File(BackupControl):
258
263
  if len(backups) == 0 or not filecmp.cmp(self.path, backups[0].path):
259
264
  self._make_backup()
260
265
  # If the file doesn't match the last backup then do a back up
261
- # TODO: Use FloodModeller API implemented equivalence testing. This is implemented at a higher level than FMFile where this method is called.
262
- # TODO: Return the file path?
263
266
 
264
267
  def clear_backup(self):
265
268
  """