Skip to content

Commit d002c46

Browse files
authored
Merge pull request #3311 from golbog/owsave
[FIX] Save data widget crash on no data
2 parents e452e4d + ec78cad commit d002c46

File tree

2 files changed

+43
-9
lines changed

2 files changed

+43
-9
lines changed

Orange/widgets/data/owsave.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -129,15 +129,18 @@ def dataset(self, data):
129129
self.data = data
130130
self.save.setDisabled(data is None)
131131
self.save_as.setDisabled(data is None)
132-
if data is not None:
133-
self.save_file()
132+
if data is None:
133+
return
134134

135-
self.controls.filetype.clear()
136-
if self.data.is_sparse():
137-
self.controls.filetype.insertItems(0, [item for item, _, supports_sparse in FILE_TYPES
138-
if supports_sparse])
139-
else:
140-
self.controls.filetype.insertItems(0, [item for item, _, _ in FILE_TYPES])
135+
items = [item for item, _, supports_sparse in FILE_TYPES
136+
if supports_sparse or not data.is_sparse()]
137+
if items != [self.controls.filetype.itemText(i) for i in
138+
range(self.controls.filetype.count())]:
139+
self.controls.filetype.clear()
140+
self.controls.filetype.insertItems(0, items)
141+
self.update_extension()
142+
143+
self.save_file()
141144

142145
def save_file_as(self):
143146
file_name = self.remove_extensions(self.filename) or os.path.join(

Orange/widgets/data/tests/test_owsave.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Test methods with long descriptive names can omit docstrings
22
# pylint: disable=missing-docstring
3-
from unittest.mock import patch
3+
from unittest.mock import patch, Mock
44
import itertools
55

66
from Orange.data import Table
@@ -82,3 +82,34 @@ def choose_file(a, b, c, d, e, fn=filename, w=writer):
8282
with patch("AnyQt.QtWidgets.QFileDialog.getSaveFileName", choose_file):
8383
self.widget.save_file_as()
8484
self.assertEqual(len(Table(filename)), 150)
85+
86+
def test_format_combo(self):
87+
widget = self.widget
88+
filetype = widget.controls.filetype
89+
90+
widget.save_file = Mock()
91+
92+
data = Table("iris")
93+
sparse_data = Table("iris")
94+
sparse_data.is_sparse = Mock(return_value=True)
95+
96+
self.send_signal(widget.Inputs.data, data)
97+
n_nonsparse = filetype.count()
98+
99+
self.send_signal(widget.Inputs.data, sparse_data)
100+
n_sparse = filetype.count()
101+
self.assertGreater(n_nonsparse, n_sparse)
102+
103+
self.send_signal(widget.Inputs.data, sparse_data)
104+
self.assertEqual(filetype.count(), n_sparse)
105+
106+
self.send_signal(widget.Inputs.data, data)
107+
self.assertEqual(filetype.count(), n_nonsparse)
108+
109+
self.send_signal(widget.Inputs.data, None)
110+
self.send_signal(widget.Inputs.data, data)
111+
self.assertEqual(filetype.count(), n_nonsparse)
112+
113+
self.send_signal(widget.Inputs.data, None)
114+
self.send_signal(widget.Inputs.data, sparse_data)
115+
self.assertEqual(filetype.count(), n_sparse)

0 commit comments

Comments
 (0)