From 2d5a13262ddaf89d75c914545af1750dbb7ede33 Mon Sep 17 00:00:00 2001 From: Lan Zagar Date: Fri, 1 Jun 2018 09:36:23 +0200 Subject: [PATCH 1/5] filedialogs: Fix parsing of double extensions. This allows saving with compression (again?) by specifying extensions like .tab.gz and similar. --- Orange/widgets/utils/filedialogs.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Orange/widgets/utils/filedialogs.py b/Orange/widgets/utils/filedialogs.py index bc536b4bdfa..3fd4560517d 100644 --- a/Orange/widgets/utils/filedialogs.py +++ b/Orange/widgets/utils/filedialogs.py @@ -5,7 +5,7 @@ from AnyQt.QtWidgets import \ QMessageBox, QFileDialog, QFileIconProvider, QComboBox -from Orange.data.io import FileFormat +from Orange.data.io import FileFormat, Compression from Orange.widgets.settings import Setting from Orange.util import deprecated @@ -82,6 +82,9 @@ def open_filename_dialog_save(start_dir, start_filter, file_formats): return None, None, None base, ext = os.path.splitext(filename) + if ext in Compression.all: + base, base_ext = os.path.splitext(base) + ext = base_ext + ext if not ext: filename += format.EXTENSIONS[0] elif ext not in format.EXTENSIONS: From 643d4c51f8cfec71b27e4dda55412b33ff7cd382 Mon Sep 17 00:00:00 2001 From: Lan Zagar Date: Fri, 1 Jun 2018 09:39:44 +0200 Subject: [PATCH 2/5] io: Enable compression of pickled files --- Orange/data/io.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Orange/data/io.py b/Orange/data/io.py index 5d71bd2191a..98f365750ae 100644 --- a/Orange/data/io.py +++ b/Orange/data/io.py @@ -913,19 +913,20 @@ class PickleReader(FileFormat): """Reader for pickled Table objects""" EXTENSIONS = ('.pickle', '.pkl') DESCRIPTION = 'Pickled Python object file' + SUPPORT_COMPRESSED = True SUPPORT_SPARSE_DATA = True def read(self): - with open(self.filename, 'rb') as f: + with self.open(self.filename, 'rb') as f: table = pickle.load(f) if not isinstance(table, Table): raise TypeError("file does not contain a data table") else: return table - @staticmethod - def write_file(filename, data): - with open(filename, 'wb') as f: + @classmethod + def write_file(cls, filename, data): + with cls.open(filename, 'wb') as f: pickle.dump(data, f, pickle.HIGHEST_PROTOCOL) From 1348e63343c080f1e836c0b25c551ec2381d680c Mon Sep 17 00:00:00 2001 From: Lan Zagar Date: Fri, 1 Jun 2018 09:55:58 +0200 Subject: [PATCH 3/5] io: Change default extension for PickleReader to .pkl --- Orange/data/io.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Orange/data/io.py b/Orange/data/io.py index 98f365750ae..f4353586ed7 100644 --- a/Orange/data/io.py +++ b/Orange/data/io.py @@ -911,7 +911,7 @@ class TabReader(CSVReader): class PickleReader(FileFormat): """Reader for pickled Table objects""" - EXTENSIONS = ('.pickle', '.pkl') + EXTENSIONS = ('.pkl', '.pickle') DESCRIPTION = 'Pickled Python object file' SUPPORT_COMPRESSED = True SUPPORT_SPARSE_DATA = True From e0221c55c9ecab4371a663fe24db6cd4c90457d5 Mon Sep 17 00:00:00 2001 From: Lan Zagar Date: Fri, 1 Jun 2018 15:25:23 +0200 Subject: [PATCH 4/5] io: Workaround for OSX was applied for each extension --- Orange/data/io.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Orange/data/io.py b/Orange/data/io.py index f4353586ed7..92aedd4213d 100644 --- a/Orange/data/io.py +++ b/Orange/data/io.py @@ -297,13 +297,13 @@ def __new__(cls, name, bases, attrs): for compression in Compression.all: for ext in newcls.EXTENSIONS: new_extensions.append(ext + compression) - # OSX file dialog doesn't support filtering on double - # extensions (e.g. .csv.gz) - # https://bugreports.qt.io/browse/QTBUG-38303 - # This is just here for OWFile that gets QFileDialog - # filters from FileFormat.readers.keys() - if sys.platform == 'darwin': - new_extensions.append(compression) + # OSX file dialog doesn't support filtering on double + # extensions (e.g. .csv.gz) + # https://bugreports.qt.io/browse/QTBUG-38303 + # This is just here for OWFile that gets QFileDialog + # filters from FileFormat.readers.keys() + if sys.platform == 'darwin': + new_extensions.append(compression) newcls.EXTENSIONS = tuple(new_extensions) return newcls From b8ef72f4f6e040879e07df078f0d4979cf9ae9d6 Mon Sep 17 00:00:00 2001 From: Lan Zagar Date: Fri, 1 Jun 2018 15:38:12 +0200 Subject: [PATCH 5/5] io: Apply double extensions workaround for Windows too --- Orange/data/io.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Orange/data/io.py b/Orange/data/io.py index 92aedd4213d..245a4f0e650 100644 --- a/Orange/data/io.py +++ b/Orange/data/io.py @@ -297,12 +297,14 @@ def __new__(cls, name, bases, attrs): for compression in Compression.all: for ext in newcls.EXTENSIONS: new_extensions.append(ext + compression) - # OSX file dialog doesn't support filtering on double - # extensions (e.g. .csv.gz) - # https://bugreports.qt.io/browse/QTBUG-38303 - # This is just here for OWFile that gets QFileDialog - # filters from FileFormat.readers.keys() - if sys.platform == 'darwin': + if sys.platform in ('darwin', 'win32'): + # OSX file dialog doesn't support filtering on double + # extensions (e.g. .csv.gz) + # https://bugreports.qt.io/browse/QTBUG-38303 + # This is just here for OWFile that gets QFileDialog + # filters from FileFormat.readers.keys() + # EDIT: Windows exhibit similar problems: + # while .tab.gz works, .tab.xz and .tab.bz2 do not! new_extensions.append(compression) newcls.EXTENSIONS = tuple(new_extensions)