floodmodeller-api 0.4.2.post1__py3-none-any.whl → 0.4.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- floodmodeller_api/__init__.py +8 -9
- floodmodeller_api/_base.py +184 -176
- floodmodeller_api/backup.py +273 -273
- floodmodeller_api/dat.py +909 -831
- floodmodeller_api/diff.py +136 -119
- floodmodeller_api/ied.py +307 -306
- floodmodeller_api/ief.py +647 -637
- floodmodeller_api/ief_flags.py +253 -253
- floodmodeller_api/inp.py +266 -266
- floodmodeller_api/libs/libifcoremd.dll +0 -0
- floodmodeller_api/libs/libifcoremt.so.5 +0 -0
- floodmodeller_api/libs/libifport.so.5 +0 -0
- floodmodeller_api/{libmmd.dll → libs/libimf.so} +0 -0
- floodmodeller_api/libs/libintlc.so.5 +0 -0
- floodmodeller_api/libs/libmmd.dll +0 -0
- floodmodeller_api/libs/libsvml.so +0 -0
- floodmodeller_api/libs/libzzn_read.so +0 -0
- floodmodeller_api/libs/zzn_read.dll +0 -0
- floodmodeller_api/logs/__init__.py +2 -2
- floodmodeller_api/logs/lf.py +320 -312
- floodmodeller_api/logs/lf_helpers.py +354 -352
- floodmodeller_api/logs/lf_params.py +643 -529
- floodmodeller_api/mapping.py +84 -0
- floodmodeller_api/test/__init__.py +4 -4
- floodmodeller_api/test/conftest.py +9 -8
- floodmodeller_api/test/test_backup.py +117 -117
- floodmodeller_api/test/test_dat.py +221 -92
- floodmodeller_api/test/test_data/All Units 4_6.DAT +1081 -1081
- floodmodeller_api/test/test_data/All Units 4_6.feb +1081 -1081
- floodmodeller_api/test/test_data/BRIDGE.DAT +926 -926
- floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.dat +36 -36
- floodmodeller_api/test/test_data/Culvert_Inlet_Outlet.feb +36 -36
- floodmodeller_api/test/test_data/DamBreakADI.xml +52 -52
- floodmodeller_api/test/test_data/DamBreakFAST.xml +58 -58
- floodmodeller_api/test/test_data/DamBreakFAST_dy.xml +53 -53
- floodmodeller_api/test/test_data/DamBreakTVD.xml +55 -55
- floodmodeller_api/test/test_data/DefenceBreach.xml +53 -53
- floodmodeller_api/test/test_data/DefenceBreachFAST.xml +60 -60
- floodmodeller_api/test/test_data/DefenceBreachFAST_dy.xml +55 -55
- floodmodeller_api/test/test_data/Domain1+2_QH.xml +76 -76
- floodmodeller_api/test/test_data/Domain1_H.xml +41 -41
- floodmodeller_api/test/test_data/Domain1_Q.xml +41 -41
- floodmodeller_api/test/test_data/Domain1_Q_FAST.xml +48 -48
- floodmodeller_api/test/test_data/Domain1_Q_FAST_dy.xml +48 -48
- floodmodeller_api/test/test_data/Domain1_Q_xml_expected.json +263 -0
- floodmodeller_api/test/test_data/Domain1_W.xml +41 -41
- floodmodeller_api/test/test_data/EX1.DAT +321 -321
- floodmodeller_api/test/test_data/EX1.ext +107 -107
- floodmodeller_api/test/test_data/EX1.feb +320 -320
- floodmodeller_api/test/test_data/EX1.gxy +107 -107
- floodmodeller_api/test/test_data/EX17.DAT +421 -422
- floodmodeller_api/test/test_data/EX17.ext +213 -213
- floodmodeller_api/test/test_data/EX17.feb +422 -422
- floodmodeller_api/test/test_data/EX18.DAT +375 -375
- floodmodeller_api/test/test_data/EX18_DAT_expected.json +3876 -0
- floodmodeller_api/test/test_data/EX2.DAT +302 -302
- floodmodeller_api/test/test_data/EX3.DAT +926 -926
- floodmodeller_api/test/test_data/EX3_DAT_expected.json +16235 -0
- floodmodeller_api/test/test_data/EX3_IEF_expected.json +61 -0
- floodmodeller_api/test/test_data/EX6.DAT +2084 -2084
- floodmodeller_api/test/test_data/EX6.ext +532 -532
- floodmodeller_api/test/test_data/EX6.feb +2084 -2084
- floodmodeller_api/test/test_data/EX6_DAT_expected.json +31647 -0
- floodmodeller_api/test/test_data/Event Data Example.DAT +336 -336
- floodmodeller_api/test/test_data/Event Data Example.ext +107 -107
- floodmodeller_api/test/test_data/Event Data Example.feb +336 -336
- floodmodeller_api/test/test_data/Linked1D2D.xml +52 -52
- floodmodeller_api/test/test_data/Linked1D2DFAST.xml +53 -53
- floodmodeller_api/test/test_data/Linked1D2DFAST_dy.xml +48 -48
- floodmodeller_api/test/test_data/Linked1D2D_xml_expected.json +313 -0
- floodmodeller_api/test/test_data/blockage.dat +50 -50
- floodmodeller_api/test/test_data/blockage.ext +45 -45
- floodmodeller_api/test/test_data/blockage.feb +9 -9
- floodmodeller_api/test/test_data/blockage.gxy +71 -71
- floodmodeller_api/test/test_data/defaultUnits.dat +127 -127
- floodmodeller_api/test/test_data/defaultUnits.ext +45 -45
- floodmodeller_api/test/test_data/defaultUnits.feb +9 -9
- floodmodeller_api/test/test_data/defaultUnits.fmpx +58 -58
- floodmodeller_api/test/test_data/defaultUnits.gxy +85 -85
- floodmodeller_api/test/test_data/ex3.ief +20 -20
- floodmodeller_api/test/test_data/ex3.lf1 +2800 -2800
- floodmodeller_api/test/test_data/ex4.DAT +1374 -1374
- floodmodeller_api/test/test_data/ex4_changed.DAT +1374 -1374
- floodmodeller_api/test/test_data/example1.inp +329 -329
- floodmodeller_api/test/test_data/example2.inp +158 -158
- floodmodeller_api/test/test_data/example3.inp +297 -297
- floodmodeller_api/test/test_data/example4.inp +388 -388
- floodmodeller_api/test/test_data/example5.inp +147 -147
- floodmodeller_api/test/test_data/example6.inp +154 -154
- floodmodeller_api/test/test_data/jump.dat +176 -176
- floodmodeller_api/test/test_data/network.dat +1374 -1374
- floodmodeller_api/test/test_data/network.ext +45 -45
- floodmodeller_api/test/test_data/network.exy +1 -1
- floodmodeller_api/test/test_data/network.feb +45 -45
- floodmodeller_api/test/test_data/network.ied +45 -45
- floodmodeller_api/test/test_data/network.ief +20 -20
- floodmodeller_api/test/test_data/network.inp +147 -147
- floodmodeller_api/test/test_data/network.pxy +57 -57
- floodmodeller_api/test/test_data/network.zzd +122 -122
- floodmodeller_api/test/test_data/network_dat_expected.json +21837 -0
- floodmodeller_api/test/test_data/network_from_tabularCSV.csv +87 -87
- floodmodeller_api/test/test_data/network_ied_expected.json +287 -0
- floodmodeller_api/test/test_data/rnweir.dat +9 -9
- floodmodeller_api/test/test_data/rnweir.ext +45 -45
- floodmodeller_api/test/test_data/rnweir.feb +9 -9
- floodmodeller_api/test/test_data/rnweir.gxy +45 -45
- floodmodeller_api/test/test_data/rnweir_default.dat +74 -74
- floodmodeller_api/test/test_data/rnweir_default.ext +45 -45
- floodmodeller_api/test/test_data/rnweir_default.feb +9 -9
- floodmodeller_api/test/test_data/rnweir_default.fmpx +58 -58
- floodmodeller_api/test/test_data/rnweir_default.gxy +53 -53
- floodmodeller_api/test/test_data/unit checks.dat +16 -16
- floodmodeller_api/test/test_ied.py +29 -29
- floodmodeller_api/test/test_ief.py +125 -24
- floodmodeller_api/test/test_inp.py +47 -48
- floodmodeller_api/test/test_json.py +114 -0
- floodmodeller_api/test/test_logs_lf.py +48 -51
- floodmodeller_api/test/test_tool.py +165 -152
- floodmodeller_api/test/test_toolbox_structure_log.py +234 -239
- floodmodeller_api/test/test_xml2d.py +151 -156
- floodmodeller_api/test/test_zzn.py +36 -34
- floodmodeller_api/to_from_json.py +218 -0
- floodmodeller_api/tool.py +332 -329
- floodmodeller_api/toolbox/__init__.py +5 -5
- floodmodeller_api/toolbox/example_tool.py +45 -45
- floodmodeller_api/toolbox/model_build/__init__.py +2 -2
- floodmodeller_api/toolbox/model_build/add_siltation_definition.py +100 -98
- floodmodeller_api/toolbox/model_build/structure_log/__init__.py +1 -1
- floodmodeller_api/toolbox/model_build/structure_log/structure_log.py +287 -289
- floodmodeller_api/toolbox/model_build/structure_log_definition.py +76 -76
- floodmodeller_api/units/__init__.py +10 -10
- floodmodeller_api/units/_base.py +214 -212
- floodmodeller_api/units/boundaries.py +467 -467
- floodmodeller_api/units/comment.py +52 -55
- floodmodeller_api/units/conduits.py +382 -402
- floodmodeller_api/units/helpers.py +123 -131
- floodmodeller_api/units/iic.py +107 -101
- floodmodeller_api/units/losses.py +305 -306
- floodmodeller_api/units/sections.py +444 -446
- floodmodeller_api/units/structures.py +1690 -1683
- floodmodeller_api/units/units.py +93 -104
- floodmodeller_api/units/unsupported.py +44 -44
- floodmodeller_api/units/variables.py +87 -89
- floodmodeller_api/urban1d/__init__.py +11 -11
- floodmodeller_api/urban1d/_base.py +188 -179
- floodmodeller_api/urban1d/conduits.py +93 -85
- floodmodeller_api/urban1d/general_parameters.py +58 -58
- floodmodeller_api/urban1d/junctions.py +81 -79
- floodmodeller_api/urban1d/losses.py +81 -74
- floodmodeller_api/urban1d/outfalls.py +114 -110
- floodmodeller_api/urban1d/raingauges.py +111 -111
- floodmodeller_api/urban1d/subsections.py +92 -98
- floodmodeller_api/urban1d/xsections.py +147 -144
- floodmodeller_api/util.py +77 -21
- floodmodeller_api/validation/parameters.py +660 -660
- floodmodeller_api/validation/urban_parameters.py +388 -404
- floodmodeller_api/validation/validation.py +110 -108
- floodmodeller_api/version.py +1 -1
- floodmodeller_api/xml2d.py +688 -673
- floodmodeller_api/xml2d_template.py +37 -37
- floodmodeller_api/zzn.py +387 -363
- {floodmodeller_api-0.4.2.post1.dist-info → floodmodeller_api-0.4.3.dist-info}/LICENSE.txt +13 -13
- {floodmodeller_api-0.4.2.post1.dist-info → floodmodeller_api-0.4.3.dist-info}/METADATA +82 -82
- floodmodeller_api-0.4.3.dist-info/RECORD +179 -0
- {floodmodeller_api-0.4.2.post1.dist-info → floodmodeller_api-0.4.3.dist-info}/WHEEL +1 -1
- floodmodeller_api/libifcoremd.dll +0 -0
- floodmodeller_api/test/test_data/EX3.bmp +0 -0
- floodmodeller_api/test/test_data/test_output.csv +0 -87
- floodmodeller_api/zzn_read.dll +0 -0
- floodmodeller_api-0.4.2.post1.dist-info/RECORD +0 -164
- {floodmodeller_api-0.4.2.post1.dist-info → floodmodeller_api-0.4.3.dist-info}/entry_points.txt +0 -0
- {floodmodeller_api-0.4.2.post1.dist-info → floodmodeller_api-0.4.3.dist-info}/top_level.txt +0 -0
floodmodeller_api/__init__.py
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
from .dat import DAT
|
|
2
|
-
from .ied import IED
|
|
3
|
-
from .ief import IEF
|
|
4
|
-
from .inp import INP
|
|
5
|
-
from .logs import LF1, LF2
|
|
6
|
-
from .
|
|
7
|
-
from .
|
|
8
|
-
from .
|
|
9
|
-
from .zzn import ZZN
|
|
1
|
+
from .dat import DAT
|
|
2
|
+
from .ied import IED
|
|
3
|
+
from .ief import IEF
|
|
4
|
+
from .inp import INP
|
|
5
|
+
from .logs import LF1, LF2
|
|
6
|
+
from .version import __version__
|
|
7
|
+
from .xml2d import XML2D
|
|
8
|
+
from .zzn import ZZN
|
floodmodeller_api/_base.py
CHANGED
|
@@ -1,176 +1,184 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Flood Modeller Python API
|
|
3
|
-
Copyright (C)
|
|
4
|
-
|
|
5
|
-
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
|
|
6
|
-
as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
7
|
-
|
|
8
|
-
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
9
|
-
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
10
|
-
|
|
11
|
-
You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.
|
|
12
|
-
|
|
13
|
-
If you have any query about this program or this License, please contact us at support@floodmodeller.com or write to the following
|
|
14
|
-
address: Jacobs UK Limited, Flood Modeller, Cottons Centre, Cottons Lane, London, SE1 2QG, United Kingdom.
|
|
15
|
-
"""
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
from
|
|
23
|
-
|
|
24
|
-
from .
|
|
25
|
-
from .
|
|
26
|
-
from .
|
|
27
|
-
from .
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if not self._filepath.
|
|
47
|
-
raise
|
|
48
|
-
f"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
print("
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
)
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
"
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
)
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
1
|
+
"""
|
|
2
|
+
Flood Modeller Python API
|
|
3
|
+
Copyright (C) 2024 Jacobs U.K. Limited
|
|
4
|
+
|
|
5
|
+
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License
|
|
6
|
+
as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
|
|
7
|
+
|
|
8
|
+
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty
|
|
9
|
+
of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
|
10
|
+
|
|
11
|
+
You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.
|
|
12
|
+
|
|
13
|
+
If you have any query about this program or this License, please contact us at support@floodmodeller.com or write to the following
|
|
14
|
+
address: Jacobs UK Limited, Flood Modeller, Cottons Centre, Cottons Lane, London, SE1 2QG, United Kingdom.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
""" Holds the base file class for API file classes """
|
|
20
|
+
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from typing import NoReturn
|
|
23
|
+
|
|
24
|
+
from .backup import File
|
|
25
|
+
from .diff import check_item_with_dataframe_equal
|
|
26
|
+
from .to_from_json import Jsonable
|
|
27
|
+
from .units._base import Unit
|
|
28
|
+
from .units.iic import IIC
|
|
29
|
+
from .urban1d._base import UrbanSubsection, UrbanUnit
|
|
30
|
+
from .version import __version__
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class FMFile(Jsonable):
|
|
34
|
+
"""Base class for all Flood Modeller File types"""
|
|
35
|
+
|
|
36
|
+
_filetype: str | None = None
|
|
37
|
+
_suffix: str | None = None
|
|
38
|
+
MAX_DIFF = 25
|
|
39
|
+
|
|
40
|
+
def __init__(self, filepath: str | Path | None = None, **kwargs):
|
|
41
|
+
if filepath is not None:
|
|
42
|
+
self._filepath = Path(filepath).resolve() # save filepath to class
|
|
43
|
+
# Check if filepath valid
|
|
44
|
+
# * Add check or fix for path lengths greater than DOS standard length of 260 characters
|
|
45
|
+
|
|
46
|
+
if not self._filepath.suffix.lower() == self._suffix:
|
|
47
|
+
raise TypeError(
|
|
48
|
+
f"Given filepath does not point to a {self._filetype} file. Please point to the full path for a {self._filetype} file",
|
|
49
|
+
)
|
|
50
|
+
if not self._filepath.exists():
|
|
51
|
+
raise FileNotFoundError(
|
|
52
|
+
f"{self._filetype} file does not exist! If you are wanting to create a new {self._filetype}, initiate the class without a given "
|
|
53
|
+
f"filepath to create a new blank {self._filetype} or point the filepath of an existing {self._filetype} to use as a template, "
|
|
54
|
+
f"then use the .save() method to save to a new filepath",
|
|
55
|
+
)
|
|
56
|
+
# If the file is not a ZZN file, then perform a backup
|
|
57
|
+
# This performs a conditional back up, only copying the file if an equivalent copy doesn't already exist
|
|
58
|
+
if self._filetype != "ZZN":
|
|
59
|
+
file = File(path=self._filepath)
|
|
60
|
+
file.backup()
|
|
61
|
+
# Add the file object as a property to expose the restore method
|
|
62
|
+
self.file = file
|
|
63
|
+
|
|
64
|
+
def __repr__(self):
|
|
65
|
+
return f"<floodmodeller_api Class: {self._filetype}(filepath={self._filepath})>"
|
|
66
|
+
|
|
67
|
+
def _write(self):
|
|
68
|
+
raise NotImplementedError
|
|
69
|
+
|
|
70
|
+
def _read(self):
|
|
71
|
+
raise NotImplementedError
|
|
72
|
+
|
|
73
|
+
def _update(self):
|
|
74
|
+
"""Updates the existing self._filetype based on any altered attributes"""
|
|
75
|
+
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
|
+
)
|
|
79
|
+
|
|
80
|
+
string = self._write()
|
|
81
|
+
with open(self._filepath, "w") as _file:
|
|
82
|
+
_file.write(string)
|
|
83
|
+
print(f"{self._filetype} File Updated!")
|
|
84
|
+
|
|
85
|
+
def _save(self, filepath):
|
|
86
|
+
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
|
+
)
|
|
91
|
+
|
|
92
|
+
if not filepath.parent.exists():
|
|
93
|
+
Path.mkdir(filepath.parent)
|
|
94
|
+
|
|
95
|
+
string = self._write()
|
|
96
|
+
with open(filepath, "w") as _file:
|
|
97
|
+
_file.write(string)
|
|
98
|
+
self._filepath = filepath # Updates the filepath attribute to the given path
|
|
99
|
+
|
|
100
|
+
print(f"{self._filetype} File Saved to: {filepath}")
|
|
101
|
+
|
|
102
|
+
def _diff(self, other, force_print=False):
|
|
103
|
+
try:
|
|
104
|
+
if self._filetype != other._filetype:
|
|
105
|
+
raise TypeError("Cannot compare objects of different filetypes")
|
|
106
|
+
diff = self._get_diff(other)
|
|
107
|
+
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]]))
|
|
121
|
+
except Exception as e:
|
|
122
|
+
self._handle_exception(e, when="compare")
|
|
123
|
+
|
|
124
|
+
def _get_diff(self, other):
|
|
125
|
+
return self.__eq__(other, return_diff=True) # pylint: disable=unnecessary-dunder-call
|
|
126
|
+
|
|
127
|
+
def _handle_exception(self, err, when) -> NoReturn:
|
|
128
|
+
tb = err.__traceback__
|
|
129
|
+
while tb.tb_next is not None:
|
|
130
|
+
tb = tb.tb_next
|
|
131
|
+
line_no = tb.tb_lineno
|
|
132
|
+
tb_path = Path(tb.tb_frame.f_code.co_filename)
|
|
133
|
+
fname = "/".join(tb_path.parts[-2:])
|
|
134
|
+
|
|
135
|
+
raise Exception(
|
|
136
|
+
"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
|
|
137
|
+
f"\nAPI Error: Problem encountered when trying to {when} {self._filetype} file {self._filepath}."
|
|
138
|
+
f"\n\nDetails: {__version__}-{fname}-{line_no}"
|
|
139
|
+
f"\nMsg: {err}"
|
|
140
|
+
"\n\nFor additional support, go to: https://github.com/People-Places-Solutions/floodmodeller-api",
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
def __eq__(self, other, return_diff=False):
|
|
144
|
+
result = True
|
|
145
|
+
diff = []
|
|
146
|
+
try:
|
|
147
|
+
for key, item in self.__dict__.items():
|
|
148
|
+
try:
|
|
149
|
+
if key in (
|
|
150
|
+
"_filepath",
|
|
151
|
+
"_raw_data",
|
|
152
|
+
"_gxy_filepath",
|
|
153
|
+
"_gxy_data",
|
|
154
|
+
"_xmltree",
|
|
155
|
+
"_xsd",
|
|
156
|
+
"_xsdschema",
|
|
157
|
+
"file",
|
|
158
|
+
"_log_path",
|
|
159
|
+
):
|
|
160
|
+
continue
|
|
161
|
+
_result, diff = check_item_with_dataframe_equal(
|
|
162
|
+
item,
|
|
163
|
+
other.__dict__[key],
|
|
164
|
+
name=f"{self._filetype}->{key}",
|
|
165
|
+
diff=diff,
|
|
166
|
+
special_types=(Unit, IIC, UrbanUnit, UrbanSubsection),
|
|
167
|
+
)
|
|
168
|
+
if not _result:
|
|
169
|
+
result = False
|
|
170
|
+
except KeyError as ke:
|
|
171
|
+
result = False
|
|
172
|
+
diff.append(
|
|
173
|
+
(
|
|
174
|
+
f"{self._filetype}->{key}",
|
|
175
|
+
f"Key: '{ke.args[0]}' missing in other",
|
|
176
|
+
),
|
|
177
|
+
)
|
|
178
|
+
continue
|
|
179
|
+
|
|
180
|
+
except Exception as e:
|
|
181
|
+
result = False
|
|
182
|
+
diff.append((f"{self._filetype}->{key}", f"Error encountered: {e.args[0]}"))
|
|
183
|
+
|
|
184
|
+
return (result, diff) if return_diff else result
|