Skip to content

Commit d3ec31f

Browse files
authored
Merge pull request #3700 from janezd/owsave-remove-extra-extensions
[FIX] Save Data: Remove extra file extensions
2 parents f1dff6c + 78f26e5 commit d3ec31f

File tree

2 files changed

+19
-4
lines changed

2 files changed

+19
-4
lines changed

Orange/widgets/data/owsave.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,23 @@ def _initial_start_dir(self):
185185

186186
@staticmethod
187187
def _replace_extension(filename, extension):
188-
known_extensions = map(OWSave._extension_from_filter, OWSave.filters)
189-
for known_ext in sorted(known_extensions, key=len, reverse=True):
190-
if filename.endswith(known_ext):
191-
filename = filename[:-len(known_ext)]
188+
"""
189+
Remove all extensions that appear in any filter.
190+
191+
Double extensions are broken in different weird ways across all systems,
192+
including omitting some, like turning iris.tab.gz to iris.gz. This
193+
function removes anything that can appear anywhere.
194+
"""
195+
known_extensions = set()
196+
for filt in OWSave.filters:
197+
known_extensions |= \
198+
set(OWSave._extension_from_filter(filt).split("."))
199+
known_extensions.remove("")
200+
while True:
201+
base, ext = os.path.splitext(filename)
202+
if ext[1:] not in known_extensions:
192203
break
204+
filename = base
193205
return filename + extension
194206

195207
@staticmethod

Orange/widgets/data/tests/test_owsave.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,9 @@ def test_save_file_dialog_enforces_extension_linux(self):
431431
dialog.selectFile("high.tab.gz")
432432
self.assertTrue(dialog.selectedFiles()[0].endswith("/high.csv"))
433433

434+
dialog.selectFile("high.tab.gz.tab.tab.gz")
435+
self.assertTrue(dialog.selectedFiles()[0].endswith("/high.csv"))
436+
434437
def test_save_file_dialog_uses_valid_filters_linux(self):
435438
widget = self.widget
436439
widget._valid_filters = lambda: ["a (*.a)", "b (*.b)"]

0 commit comments

Comments
 (0)