diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..9b38853 --- /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/main.py b/main.py index 22fa82c..70a39da 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() diff --git a/main.spec b/main.spec index 7d5b8ab..f18aa37 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={}, @@ -85,6 +88,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" +#) diff --git a/pywr_editor/model/model_config.py b/pywr_editor/model/model_config.py index b10c28b..4103c72 100644 --- a/pywr_editor/model/model_config.py +++ b/pywr_editor/model/model_config.py @@ -279,6 +279,7 @@ def check_missing_keys(self) -> None: ]: if key not in self.json: self.json[key] = {} + self.has_changed() if ( Constants.SHAPES_KEY.value @@ -287,6 +288,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 = { diff --git a/tests/dialogs/test_dialog_tables.py b/tests/dialogs/test_dialog_tables.py index 3109d8d..d23b0af 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/json_models/model_dialog_parameter_threshold_values_widget.json b/tests/json_models/model_dialog_parameter_threshold_values_widget.json index 3b38fa9..83b164c 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 cec9f00..b64d8df 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 92ea016..2ff1bd6 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 7711f88..dc2d42e 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 5e70d35..5cf9f3c 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 1a3d6cb..09b3109 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 f6f74b3..d88b756 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 8db298a..f384da8 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 diff --git a/tests/model/test_nodes.py b/tests/model/test_nodes.py index 8458461..fb77611 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 7d82bb1..10b58de 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}), ),