Skip to content

Commit 8e88469

Browse files
authored
Merge pull request #4272 from ales-erjavec/fixes/owcsvimport-current-init
[FIX] owcsvimport: Fix last/recent item serialization
2 parents 0d04d81 + 46b05d5 commit 8e88469

File tree

3 files changed

+84
-6
lines changed

3 files changed

+84
-6
lines changed

Orange/widgets/data/owcsvimport.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -569,11 +569,12 @@ def update_buttons(cbindex):
569569
"button-layout: {:d};".format(QDialogButtonBox.MacLayout)
570570
)
571571
self.controlArea.layout().addWidget(button_box)
572+
self.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Maximum)
572573

573574
self._restoreState()
574-
if self.current_item() is not None:
575-
self._invalidate()
576-
self.setSizePolicy(QSizePolicy.MinimumExpanding, QSizePolicy.Maximum)
575+
item = self.current_item()
576+
if item is not None:
577+
self.set_selected_file(item.path(), item.options())
577578

578579
@Slot(int)
579580
def activate_recent(self, index):

Orange/widgets/data/tests/test_owcsvimport.py

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,111 @@
1-
from numpy.testing import assert_array_equal
21
import unittest
2+
from unittest import mock
3+
from contextlib import ExitStack
34

45
import os
56
import io
67
import csv
8+
import json
79

810
import numpy as np
11+
from numpy.testing import assert_array_equal
912

10-
from Orange.widgets.tests.base import WidgetTest, GuiTest
13+
from AnyQt.QtCore import QSettings
1114

15+
from Orange.tests import named_file
16+
from Orange.widgets.tests.base import WidgetTest, GuiTest
1217
from Orange.widgets.data import owcsvimport
1318
from Orange.widgets.data.owcsvimport import (
1419
pandas_to_table, ColumnType, RowSpec
1520
)
21+
from Orange.widgets.utils.settings import QSettings_writeArray
1622

1723

1824
class TestOWCSVFileImport(WidgetTest):
1925
def setUp(self):
26+
self._stack = ExitStack().__enter__()
27+
# patch `_local_settings` to avoid side effects, across tests
28+
fname = self._stack.enter_context(named_file(""))
29+
s = QSettings(fname, QSettings.IniFormat)
30+
self._stack.enter_context(mock.patch.object(
31+
owcsvimport.OWCSVFileImport, "_local_settings", lambda *a: s
32+
))
2033
self.widget = self.create_widget(owcsvimport.OWCSVFileImport)
2134

2235
def tearDown(self):
2336
self.widgets.remove(self.widget)
2437
self.widget.onDeleteWidget()
2538
self.widget = None
39+
self._stack.close()
2640

2741
def test_basic(self):
2842
w = self.widget
2943
w.activate_recent(0)
3044
w.cancel()
3145

46+
data_regions_options = owcsvimport.Options(
47+
encoding="ascii", dialect=csv.excel_tab(),
48+
columntypes=[
49+
(range(0, 1), ColumnType.Categorical),
50+
(range(1, 2), ColumnType.Text),
51+
(range(2, 3), ColumnType.Categorical),
52+
], rowspec=[
53+
(range(0, 1), RowSpec.Header),
54+
(range(1, 3), RowSpec.Skipped),
55+
],
56+
)
57+
58+
def _check_data_regions(self, table):
59+
self.assertEqual(len(table), 3)
60+
self.assertEqual(len(table), 3)
61+
self.assertTrue(table.domain["id"].is_discrete)
62+
self.assertTrue(table.domain["continent"].is_discrete)
63+
self.assertTrue(table.domain["state"].is_string)
64+
assert_array_equal(table.X, [[0, 1], [1, 1], [2, 0]])
65+
assert_array_equal(table.metas,
66+
np.array([["UK"], ["Russia"], ["Mexico"]], object))
67+
68+
def test_restore(self):
69+
dirname = os.path.dirname(__file__)
70+
path = os.path.join(dirname, "data-regions.tab")
71+
72+
w = self.create_widget(
73+
owcsvimport.OWCSVFileImport,
74+
stored_settings={
75+
"_session_items": [
76+
(path, self.data_regions_options.as_dict())
77+
]
78+
}
79+
)
80+
item = w.current_item()
81+
self.assertEqual(item.path(), path)
82+
self.assertEqual(item.options(), self.data_regions_options)
83+
out = self.get_output("Data", w)
84+
self._check_data_regions(out)
85+
86+
def test_restore_from_local(self):
87+
dirname = os.path.dirname(__file__)
88+
path = os.path.join(dirname, "data-regions.tab")
89+
s = owcsvimport.OWCSVFileImport._local_settings()
90+
s.clear()
91+
QSettings_writeArray(
92+
s, "recent", [
93+
{"path": path,
94+
"options": json.dumps(self.data_regions_options.as_dict())}]
95+
)
96+
w = self.create_widget(
97+
owcsvimport.OWCSVFileImport,
98+
)
99+
item = w.current_item()
100+
self.assertEqual(item.path(), path)
101+
self.assertEqual(item.options(), self.data_regions_options)
102+
self.assertEqual(
103+
w._session_items, [(path, self.data_regions_options.as_dict())],
104+
"local settings item must be recorded in _session_items when "
105+
"activated in __init__",
106+
)
107+
self._check_data_regions(self.get_output("Data", w))
108+
32109

33110
class TestImportDialog(GuiTest):
34111
def test_dialog(self):

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ def configuration(parent_package='', top_path=None):
203203
"icons/paintdata/*.svg"],
204204
"Orange.widgets.data.tests": ["origin1/*.tab",
205205
"origin2/*.tab",
206-
"*.txt"],
206+
"*.txt", "*.tab"],
207207
"Orange.widgets.evaluate": ["icons/*.svg"],
208208
"Orange.widgets.model": ["icons/*.svg"],
209209
"Orange.widgets.visualize": ["icons/*.svg"],

0 commit comments

Comments
 (0)