Skip to content

Commit 06d4088

Browse files
committed
Address comments
1 parent 0098fc7 commit 06d4088

File tree

7 files changed

+44
-43
lines changed

7 files changed

+44
-43
lines changed

src/ert/gui/tools/manage_experiments/export_parameters_dialog.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ def export(self) -> None:
7474
output_file: str = self._file_path_edit.text().strip()
7575
try:
7676
self._export_button.setEnabled(False)
77-
parameters_df = self._ensemble.load_all_scalar_keys(transformed=True)
77+
parameters_df = self._ensemble.load_scalar_keys(transformed=True)
7878
parameters_df.write_csv(output_file, float_precision=6)
7979
self._export_text_area.insertPlainText(
8080
f"Ensemble parameters exported to: {output_file}\n"
@@ -85,9 +85,6 @@ def export(self) -> None:
8585
f"Error exporting ensemble parameters: {e!s}"
8686
"</span><br>"
8787
)
88-
self._export_text_area.insertPlainText(
89-
f"Error exporting ensemble parameters: {e!s}\n"
90-
)
9188
finally:
9289
self._export_button.setEnabled(True)
9390

@@ -113,13 +110,12 @@ def _set_valid() -> None:
113110
self._file_path_edit.setToolTip("")
114111
self._export_button.setEnabled(True)
115112

116-
file_path = self._file_path_edit.text().strip()
117-
if not file_path or file_path.endswith(("/", "\\")):
113+
path = Path(self._file_path_edit.text().strip())
114+
if path.is_dir():
118115
_set_invalid()
119116
return
120117

121118
try:
122-
path = Path(file_path)
123119
if path.parent.exists() and path.parent.is_dir():
124120
_set_valid()
125121
return

src/ert/gui/tools/manage_experiments/storage_info_widget.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import contextlib
12
import json
23
from enum import IntEnum
34

@@ -388,19 +389,25 @@ def _currentTabChanged(self, index: int) -> None:
388389
elif index == _EnsembleWidgetTabs.PARAMETERS_TAB:
389390
assert self._ensemble is not None
390391

391-
parameters_df = self._ensemble.load_all_scalar_keys(transformed=True)
392+
df: pl.DataFrame = pl.DataFrame()
393+
with contextlib.suppress(Exception):
394+
df = self._ensemble.load_scalar_keys(transformed=True)
392395

393-
self._parameters_table.setRowCount(len(parameters_df))
394-
self._parameters_table.setColumnCount(len(parameters_df.columns))
395-
self._parameters_table.setHorizontalHeaderLabels(parameters_df.columns)
396+
table = self._parameters_table
396397

397-
for row_idx in range(len(parameters_df)):
398-
for col_idx, col_name in enumerate(parameters_df.columns):
399-
value = parameters_df[col_name][row_idx]
400-
table_widget_item = QTableWidgetItem(str(value))
401-
self._parameters_table.setItem(row_idx, col_idx, table_widget_item)
398+
table.setUpdatesEnabled(False)
399+
table.setSortingEnabled(False)
400+
table.setRowCount(df.height)
401+
table.setColumnCount(df.width)
402+
table.setHorizontalHeaderLabels(df.columns)
402403

403-
self._parameters_table.resizeColumnsToContents()
404+
rows = df.rows()
405+
for r, row in enumerate(rows):
406+
for c, v in enumerate(row):
407+
table.setItem(r, c, QTableWidgetItem("" if v is None else str(v)))
408+
409+
table.resizeColumnsToContents()
410+
table.setUpdatesEnabled(True)
404411

405412
@Slot(Ensemble)
406413
def setEnsemble(self, ensemble: Ensemble) -> None:

src/ert/run_models/_create_run_path.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ def _generate_parameter_files(
126126
]
127127
scalar_data: dict[str, float | str] = {}
128128
if keys:
129-
df = fs._load_scalar_keys(keys=keys, realizations=iens, transformed=True)
129+
df = fs.load_scalar_keys(keys=keys, realizations=iens, transformed=True)
130130
scalar_data = df.to_dicts()[0]
131131
exports: dict[str, dict[str, float | str]] = {}
132132
for param in parameter_configs:

src/ert/storage/local_ensemble.py

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -562,21 +562,15 @@ def _load_parameters_lazy(
562562
df = pl.scan_parquet(group_path)
563563
return df
564564

565-
def load_all_scalar_keys(self, transformed: bool = False) -> pl.DataFrame:
566-
try:
567-
return self._load_scalar_keys(
568-
keys=self.experiment.parameter_keys,
569-
transformed=transformed,
570-
)
571-
except KeyError:
572-
return pl.DataFrame([[np.nan] * len(self.experiment.parameter_keys)])
573-
574-
def _load_scalar_keys(
565+
def load_scalar_keys(
575566
self,
576-
keys: list[str],
567+
keys: list[str] | None = None,
577568
realizations: int | npt.NDArray[np.int_] | None = None,
578569
transformed: bool = False,
579570
) -> pl.DataFrame:
571+
if keys is None:
572+
keys = self.experiment.parameter_keys
573+
580574
df_lazy = self._load_parameters_lazy(SCALAR_FILENAME)
581575
df_lazy = df_lazy.select(["realization", *keys])
582576
if realizations is not None:
@@ -629,7 +623,7 @@ def load_parameters(
629623
cardinality = next(cfg.cardinality for cfg in cfgs)
630624

631625
if cardinality == ParameterCardinality.multiple_configs_per_ensemble_dataset:
632-
return self._load_scalar_keys(
626+
return self.load_scalar_keys(
633627
[cfg.name for cfg in cfgs], realizations, transformed
634628
)
635629
return self._load_dataset(
@@ -656,7 +650,7 @@ def load_parameters_numpy(
656650
]
657651
if keys:
658652
return (
659-
self._load_scalar_keys(keys, realizations)
653+
self.load_scalar_keys(keys, realizations)
660654
.drop("realization")
661655
.to_numpy()
662656
.T.copy()

test-data/ert/poly_example/poly.ert

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@ GEN_DATA POLY_RES RESULT_FILE:poly.out
1414

1515
INSTALL_JOB poly_eval POLY_EVAL
1616
FORWARD_MODEL poly_eval
17+
18+
19+
DESIGN_MATRIX design_matrix.xlsx DESIGN_SHEET:Sheet1

tests/ert/ui_tests/gui/test_export_parameters_dialog.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from ert.storage import Storage
1313

1414

15-
def test_that_export_writes_to_file(
15+
def test_that_export_writes_to_file_and_check_the_file_contents(
1616
qtbot, snake_oil_storage: Storage, change_to_tmpdir
1717
):
1818
ensemble = next(snake_oil_storage.ensembles)
@@ -34,7 +34,7 @@ def test_that_export_writes_to_file(
3434
)
3535

3636
assert_frame_equal(
37-
ensemble.load_all_scalar_keys(transformed=True),
37+
ensemble.load_scalar_keys(transformed=True),
3838
pl.read_csv("test_export.csv"),
3939
abs_tol=1e-6,
4040
)
@@ -46,12 +46,12 @@ def test_that_export_writes_to_file(
4646
"",
4747
"/non/existent/path/export.csv",
4848
" ",
49-
"hhhee/\0invalid.csv",
5049
"/",
51-
"\\",
5250
],
5351
)
54-
def test_file_path_validation_invalid(qtbot, snake_oil_storage: Storage, invalid_path):
52+
def test_that_file_path_validation_fails_on_invalid_paths(
53+
qtbot, snake_oil_storage: Storage, invalid_path
54+
):
5555
ensemble = next(snake_oil_storage.ensembles)
5656
dialog = ExportParametersDialog(ensemble)
5757
qtbot.addWidget(dialog)
@@ -72,9 +72,10 @@ def test_file_path_validation_invalid(qtbot, snake_oil_storage: Storage, invalid
7272
"valid_export.csv",
7373
" valid_export.csv ",
7474
"subdir/valid_export.csv",
75+
"valid-export",
7576
],
7677
)
77-
def test_file_path_validation_valid(
78+
def test_that_file_path_validation_succeeds_on_valid_paths(
7879
qtbot, snake_oil_storage: Storage, valid_path, change_to_tmpdir
7980
):
8081
ensemble = next(snake_oil_storage.ensembles)
@@ -92,11 +93,11 @@ def test_file_path_validation_valid(
9293
assert not dialog._file_path_edit.toolTip()
9394

9495

95-
@patch("ert.storage.Ensemble.load_all_scalar_keys")
96-
def test_export_failure_handling(
97-
patched_load_all_scalar_keys, qtbot, snake_oil_storage: Storage
96+
@patch("ert.storage.Ensemble.load_scalar_keys")
97+
def test_that_export_failure_is_handled_correctly(
98+
patched_load_scalar_keys, qtbot, snake_oil_storage: Storage
9899
):
99-
patched_load_all_scalar_keys.side_effect = Exception("i_am_an_exception")
100+
patched_load_scalar_keys.side_effect = Exception("i_am_an_exception")
100101

101102
ensemble = next(snake_oil_storage.ensembles)
102103
dialog = ExportParametersDialog(ensemble)

tests/ert/ui_tests/gui/test_manage_experiments_tool.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -550,7 +550,7 @@ def test_realization_view(
550550
} == set(realization_widget._parameter_text_edit.toPlainText().strip().splitlines())
551551

552552

553-
def test_parameters_pane(
553+
def test_that_parameters_pane_is_populated_correctly(
554554
qtbot, snake_oil_case_storage: ErtConfig, snake_oil_storage: Storage
555555
):
556556
config = snake_oil_case_storage
@@ -589,7 +589,7 @@ def test_parameters_pane(
589589
)
590590

591591

592-
def test_export_parameters_button(
592+
def test_that_export_parameters_button_opens_the_export_dialog(
593593
qtbot, snake_oil_case_storage: ErtConfig, snake_oil_storage: Storage
594594
):
595595
config = snake_oil_case_storage

0 commit comments

Comments
 (0)