From fe7cdf9d177db8579e8dee0b510338432a99e321 Mon Sep 17 00:00:00 2001 From: Stefano Simonelli <16114781+s-simoncelli@users.noreply.github.com> Date: Tue, 16 Dec 2025 10:06:15 +0000 Subject: [PATCH 1/5] Freeze multiprocessing support --- main.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 22fa82ca..70a39da1 100644 --- a/main.py +++ b/main.py @@ -1,4 +1,10 @@ -from pywr_editor import app +import multiprocessing if __name__ == "__main__": + # fix infinite loop - https://github.com/pyinstaller/pyinstaller/wiki/Recipe-Multiprocessing # noqa:E501 + multiprocessing.freeze_support() + multiprocessing.set_start_method("spawn", force=True) + + from pywr_editor import app + app() From 78f609394b08f53fdb5d37b04066cbb33b06014c Mon Sep 17 00:00:00 2001 From: Stefano Simonelli <16114781+s-simoncelli@users.noreply.github.com> Date: Tue, 16 Dec 2025 10:06:58 +0000 Subject: [PATCH 2/5] Mark model has changed when it is initialised in ModelCOnfig class --- pywr_editor/model/model_config.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pywr_editor/model/model_config.py b/pywr_editor/model/model_config.py index fc8ea0d6..358ff9db 100644 --- a/pywr_editor/model/model_config.py +++ b/pywr_editor/model/model_config.py @@ -278,6 +278,7 @@ def check_missing_keys(self) -> None: ]: if key not in self.json: self.json[key] = {} + self.has_changed() if ( Constants.SHAPES_KEY.value @@ -286,6 +287,7 @@ def check_missing_keys(self) -> None: self.json[Constants.EDITOR_CONFIG_KEY.value][ Constants.SHAPES_KEY.value ] = [] + self.has_changed() # check that the metadata dictionary and its key/value pairs are defined default_metadata = { From e6fc12cfce807bf7b9b44ca70d77a0fe3a6af1ff Mon Sep 17 00:00:00 2001 From: Stefano Simonelli <16114781+s-simoncelli@users.noreply.github.com> Date: Tue, 16 Dec 2025 10:07:30 +0000 Subject: [PATCH 3/5] Do not copy libblosc2.dll with pyinstaller --- main.spec | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/main.spec b/main.spec index 63fcf246..4a474ecd 100644 --- a/main.spec +++ b/main.spec @@ -40,6 +40,9 @@ a = Analysis( "PySide6.QtSvg", "PySide6.QtAxContainer", "PySide6.QtSvgWidgets", + "inspector_dialog", + "matplotlib", + "numpy", ], hookspath=[], hooksconfig={}, @@ -84,6 +87,6 @@ coll = COLLECT( # PyInstaller does not want to copy the following files/folder in the data attr shutil.copytree(pywr_dist.as_posix(), f"./dist/main/{pywr_dist.name}") -shutil.copyfile( - Path(tables.__file__).parent / "libblosc2.dll", "./dist/main/tables/libblosc2.dll" -) +#shutil.copyfile( +# Path(tables.__file__).parent / "libblosc2.dll", "./dist/main/tables/libblosc2.dll" +#) From 43d4192e35c38b8b4457df04025308c2d69250cf Mon Sep 17 00:00:00 2001 From: Stefano Simonelli <16114781+s-simoncelli@users.noreply.github.com> Date: Tue, 16 Dec 2025 10:46:38 +0000 Subject: [PATCH 4/5] Fixed tests --- tests/dialogs/test_dialog_tables.py | 2 +- tests/model/test_nodes.py | 1 - tests/widgets/test_line_edit_widget.py | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/tests/dialogs/test_dialog_tables.py b/tests/dialogs/test_dialog_tables.py index 3109d8da..d23b0af7 100644 --- a/tests/dialogs/test_dialog_tables.py +++ b/tests/dialogs/test_dialog_tables.py @@ -345,7 +345,7 @@ def test_valid_table_file(self, qtbot, table_name): # 5. Save form to test filter save_button: QPushButton = selected_page.findChild(QPushButton, "save_button") # enable button (disabled due to no changes) - assert model_config.has_changes is False + assert model_config.has_changes is True assert save_button.isEnabled() is False save_button.setEnabled(True) qtbot.mouseClick(save_button, Qt.MouseButton.LeftButton) diff --git a/tests/model/test_nodes.py b/tests/model/test_nodes.py index 8458461f..fb776112 100644 --- a/tests/model/test_nodes.py +++ b/tests/model/test_nodes.py @@ -109,7 +109,6 @@ def test_delete_node(self): model.nodes.delete("Non-existing node") assert all_nodes == model.nodes.get_all() - assert model.has_changes is False def test_model_with_orphans(self): """ diff --git a/tests/widgets/test_line_edit_widget.py b/tests/widgets/test_line_edit_widget.py index 7d82bb1a..10b58ded 100644 --- a/tests/widgets/test_line_edit_widget.py +++ b/tests/widgets/test_line_edit_widget.py @@ -94,7 +94,7 @@ def model_config(self) -> ModelConfig: ( "valid_custom_parameter", "custom", - "customParameter", + "customparameter", {"type": "customParameter", "value": 2}, ParameterConfig(props={"type": "customParameter", "value": 2}), ), From d71b3da78951a2d3ccadfcbdcf8f57c92e4312d8 Mon Sep 17 00:00:00 2001 From: Stefano Simonelli <16114781+s-simoncelli@users.noreply.github.com> Date: Tue, 16 Dec 2025 13:12:54 +0000 Subject: [PATCH 5/5] Updated test JSON files to fix tests after new changes --- .vscode/settings.json | 7 +++++++ .../model_dialog_parameter_threshold_values_widget.json | 4 +++- ...l_dialog_parameters_column_widget_w_table_selector.json | 4 +++- .../model_dialog_parameters_column_widget_w_url.json | 4 +++- .../model_dialog_parameters_index_col_widget.json | 7 ++++++- ...el_dialog_parameters_index_widget_w_table_selector.json | 6 +++++- .../model_dialog_parameters_index_widget_w_url.json | 7 ++++++- .../model_dialog_parameters_table_selector_widget.json | 6 +++++- tests/json_models/model_dialog_parameters_url_widget.json | 7 ++++++- 9 files changed, 44 insertions(+), 8 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..9b388533 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "python.testing.pytestArgs": [ + "tests" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} \ No newline at end of file diff --git a/tests/json_models/model_dialog_parameter_threshold_values_widget.json b/tests/json_models/model_dialog_parameter_threshold_values_widget.json index 3b38fa98..83b164c8 100644 --- a/tests/json_models/model_dialog_parameter_threshold_values_widget.json +++ b/tests/json_models/model_dialog_parameter_threshold_values_widget.json @@ -98,10 +98,12 @@ "values": 56.7 } }, + "recorders": {}, "pywr_editor": { "schematic_size": [ 1900, 1450 - ] + ], + "shapes": [] } } \ No newline at end of file diff --git a/tests/json_models/model_dialog_parameters_column_widget_w_table_selector.json b/tests/json_models/model_dialog_parameters_column_widget_w_table_selector.json index cec9f00c..b64d8df3 100644 --- a/tests/json_models/model_dialog_parameters_column_widget_w_table_selector.json +++ b/tests/json_models/model_dialog_parameters_column_widget_w_table_selector.json @@ -158,10 +158,12 @@ "index": 10 } }, + "recorders": {}, "pywr_editor": { "schematic_size": [ 1900, 1450 - ] + ], + "shapes": [] } } \ No newline at end of file diff --git a/tests/json_models/model_dialog_parameters_column_widget_w_url.json b/tests/json_models/model_dialog_parameters_column_widget_w_url.json index 92ea0160..2ff1bd62 100644 --- a/tests/json_models/model_dialog_parameters_column_widget_w_url.json +++ b/tests/json_models/model_dialog_parameters_column_widget_w_url.json @@ -162,10 +162,12 @@ "index": 10 } }, + "recorders": {}, "pywr_editor": { "schematic_size": [ 1900, 1450 - ] + ], + "shapes": [] } } \ No newline at end of file diff --git a/tests/json_models/model_dialog_parameters_index_col_widget.json b/tests/json_models/model_dialog_parameters_index_col_widget.json index 7711f888..dc2d42e3 100644 --- a/tests/json_models/model_dialog_parameters_index_col_widget.json +++ b/tests/json_models/model_dialog_parameters_index_col_widget.json @@ -59,6 +59,9 @@ "Link" ] ], + "includes": [], + "scenarios": [], + "tables": {}, "parameters": { "param_with_index_col_str": { "type": "constant", @@ -245,10 +248,12 @@ "parse_dates": true } }, + "recorders": {}, "pywr_editor": { "schematic_size": [ 1900, 1450 - ] + ], + "shapes": [] } } \ No newline at end of file diff --git a/tests/json_models/model_dialog_parameters_index_widget_w_table_selector.json b/tests/json_models/model_dialog_parameters_index_widget_w_table_selector.json index 5e70d352..5cf9f3c2 100644 --- a/tests/json_models/model_dialog_parameters_index_widget_w_table_selector.json +++ b/tests/json_models/model_dialog_parameters_index_widget_w_table_selector.json @@ -303,10 +303,14 @@ "column": " Date" } }, + "includes": [], + "scenarios": [], + "recorders": {}, "pywr_editor": { "schematic_size": [ 1900, 1450 - ] + ], + "shapes": [] } } \ No newline at end of file diff --git a/tests/json_models/model_dialog_parameters_index_widget_w_url.json b/tests/json_models/model_dialog_parameters_index_widget_w_url.json index 1a3d6cb8..09b3109c 100644 --- a/tests/json_models/model_dialog_parameters_index_widget_w_url.json +++ b/tests/json_models/model_dialog_parameters_index_widget_w_url.json @@ -284,10 +284,15 @@ "column": " Date" } }, + "includes": [], + "scenarios": [], + "tables": {}, + "recorders": {}, "pywr_editor": { "schematic_size": [ 1900, 1450 - ] + ], + "shapes": [] } } \ No newline at end of file diff --git a/tests/json_models/model_dialog_parameters_table_selector_widget.json b/tests/json_models/model_dialog_parameters_table_selector_widget.json index f6f74b3c..d88b7563 100644 --- a/tests/json_models/model_dialog_parameters_table_selector_widget.json +++ b/tests/json_models/model_dialog_parameters_table_selector_widget.json @@ -150,10 +150,14 @@ "table": "h5_no_keys" } }, + "includes": [], + "scenarios": [], + "recorders": {}, "pywr_editor": { "schematic_size": [ 1900, 1450 - ] + ], + "shapes": [] } } \ No newline at end of file diff --git a/tests/json_models/model_dialog_parameters_url_widget.json b/tests/json_models/model_dialog_parameters_url_widget.json index 8db298a6..f384da82 100644 --- a/tests/json_models/model_dialog_parameters_url_widget.json +++ b/tests/json_models/model_dialog_parameters_url_widget.json @@ -102,10 +102,15 @@ "url": "files/table_no_keys.h5" } }, + "includes": [], + "scenarios": [], + "tables": {}, + "recorders": {}, "pywr_editor": { "schematic_size": [ 1900, 1450 - ] + ], + "shapes": [] } } \ No newline at end of file