From 22cba75b5cc7ace669647ea5e21b8fbdac270f57 Mon Sep 17 00:00:00 2001 From: Umair Idris Date: Sat, 14 Mar 2015 20:36:22 -0400 Subject: [PATCH 1/6] Suggest unexisting default filename (Implement #3608) --- lib/matplotlib/backend_bases.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 8ef174652621..8fa4cfa126e6 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -2253,9 +2253,20 @@ def get_default_filename(self): Return a string, which includes extension, suitable for use as a default filename. """ - default_filename = self.get_window_title() or 'image' - default_filename = default_filename.lower().replace(' ', '_') - return default_filename + '.' + self.get_default_filetype() + default_basename = self.get_window_title() or 'image' + default_basename = default_basename.lower().replace(' ', '_') + default_filetype = self.get_default_filetype() + default_filename = default_basename + '.' + default_filetype + + dir_path = os.path.expanduser(rcParams.get('savefig.directory', '')) + + i = 1 + while os.path.isfile(os.path.join(dir_path, default_filename)): # file aleady exists + # attach numerical value to filename + default_filename = '{}-{}.{}'.format(default_basename, i, default_filetype) + i += 1 + + return default_filename def switch_backends(self, FigureCanvasClass): """ From 4fe562cd83279681161d518bded5e6bd69b33c5e Mon Sep 17 00:00:00 2001 From: Umair Idris Date: Sat, 14 Mar 2015 21:16:26 -0400 Subject: [PATCH 2/6] Improve comments and variable names --- lib/matplotlib/backend_bases.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 8fa4cfa126e6..542847cb129b 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -2258,11 +2258,12 @@ def get_default_filename(self): default_filetype = self.get_default_filetype() default_filename = default_basename + '.' + default_filetype - dir_path = os.path.expanduser(rcParams.get('savefig.directory', '')) + save_dir = os.path.expanduser(rcParams.get('savefig.directory', '')) + # ensure non-existing filename in save dir i = 1 - while os.path.isfile(os.path.join(dir_path, default_filename)): # file aleady exists - # attach numerical value to filename + while os.path.isfile(os.path.join(save_dir, default_filename)): + # attach numerical value to basename default_filename = '{}-{}.{}'.format(default_basename, i, default_filetype) i += 1 From 4da2db826428a385859e5e55f26b1a17566bffb5 Mon Sep 17 00:00:00 2001 From: Umair Idris Date: Sun, 15 Mar 2015 14:50:29 -0400 Subject: [PATCH 3/6] Use py2.6 supported str format --- lib/matplotlib/backend_bases.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 542847cb129b..02f67136e7d0 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -2263,8 +2263,8 @@ def get_default_filename(self): # ensure non-existing filename in save dir i = 1 while os.path.isfile(os.path.join(save_dir, default_filename)): - # attach numerical value to basename - default_filename = '{}-{}.{}'.format(default_basename, i, default_filetype) + # attach numerical count to basename + default_filename = '{0}-{1}.{2}'.format(default_basename, i, default_filetype) i += 1 return default_filename From 28d9f537ce20aa8820ecb6f77a203fb224e14cab Mon Sep 17 00:00:00 2001 From: Umair Idris Date: Mon, 16 Mar 2015 05:10:18 -0400 Subject: [PATCH 4/6] Add tests for FigureCanvasBase.get_default_filename() --- lib/matplotlib/tests/test_backend_bases.py | 37 +++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_backend_bases.py b/lib/matplotlib/tests/test_backend_bases.py index 643ebc89adeb..92ccad08ec8b 100644 --- a/lib/matplotlib/tests/test_backend_bases.py +++ b/lib/matplotlib/tests/test_backend_bases.py @@ -1,8 +1,16 @@ +from matplotlib.backend_bases import FigureCanvasBase from matplotlib.backend_bases import RendererBase +from matplotlib.testing.decorators import image_comparison, cleanup + +import matplotlib.pyplot as plt import matplotlib.transforms as transforms import matplotlib.path as path -import numpy as np +from nose.tools import assert_equal + +import numpy as np +import tempfile +import os def test_uses_per_path(): id = transforms.Affine2D() @@ -43,3 +51,30 @@ def check(master_transform, paths, all_transforms, check(id, paths, tforms, offsets, facecolors, []) check(id, paths, tforms, offsets, [], []) check(id, paths, tforms, offsets, facecolors[0:1], edgecolors) + +@cleanup +def test_get_default_filename(): + test_dir = tempfile.mkdtemp() + plt.rcParams['savefig.directory'] = test_dir + fig = plt.figure() + canvas = FigureCanvasBase(fig) + filename = canvas.get_default_filename() + assert_equal(filename, 'image.png') + +@cleanup +def test_get_default_filename_already_existing(): + # From #3068: Suggest non-existing default filename + test_dir = tempfile.mkdtemp() + plt.rcParams['savefig.directory'] = test_dir + fig = plt.figure() + canvas = FigureCanvasBase(fig) + + # create 'image.png' in figure's save dir + with open(os.path.join(test_dir, 'image.png'), 'a'): + filename = canvas.get_default_filename() + assert_equal(filename, 'image-1.png') + + +if __name__ == "__main__": + import nose + nose.runmodule(argv=['-s', '--with-doctest'], exit=False) From d30134f910f5ed1d4d9554fe678108f9c5b0f536 Mon Sep 17 00:00:00 2001 From: Umair Idris Date: Mon, 16 Mar 2015 15:21:10 -0400 Subject: [PATCH 5/6] Cleanup test dirs --- lib/matplotlib/tests/test_backend_bases.py | 43 +++++++++++++--------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/lib/matplotlib/tests/test_backend_bases.py b/lib/matplotlib/tests/test_backend_bases.py index 92ccad08ec8b..a43a4bf7f557 100644 --- a/lib/matplotlib/tests/test_backend_bases.py +++ b/lib/matplotlib/tests/test_backend_bases.py @@ -9,8 +9,10 @@ from nose.tools import assert_equal import numpy as np -import tempfile import os +import shutil +import tempfile + def test_uses_per_path(): id = transforms.Affine2D() @@ -52,28 +54,35 @@ def check(master_transform, paths, all_transforms, check(id, paths, tforms, offsets, [], []) check(id, paths, tforms, offsets, facecolors[0:1], edgecolors) + @cleanup def test_get_default_filename(): - test_dir = tempfile.mkdtemp() - plt.rcParams['savefig.directory'] = test_dir - fig = plt.figure() - canvas = FigureCanvasBase(fig) - filename = canvas.get_default_filename() - assert_equal(filename, 'image.png') + try: + test_dir = tempfile.mkdtemp() + plt.rcParams['savefig.directory'] = test_dir + fig = plt.figure() + canvas = FigureCanvasBase(fig) + filename = canvas.get_default_filename() + assert_equal(filename, 'image.png') + finally: + shutil.rmtree(test_dir) + @cleanup -def test_get_default_filename_already_existing(): +def test_get_default_filename_already_exists(): # From #3068: Suggest non-existing default filename - test_dir = tempfile.mkdtemp() - plt.rcParams['savefig.directory'] = test_dir - fig = plt.figure() - canvas = FigureCanvasBase(fig) - - # create 'image.png' in figure's save dir - with open(os.path.join(test_dir, 'image.png'), 'a'): - filename = canvas.get_default_filename() - assert_equal(filename, 'image-1.png') + try: + test_dir = tempfile.mkdtemp() + plt.rcParams['savefig.directory'] = test_dir + fig = plt.figure() + canvas = FigureCanvasBase(fig) + # create 'image.png' in figure's save dir + with open(os.path.join(test_dir, 'image.png'), 'a'): + filename = canvas.get_default_filename() + assert_equal(filename, 'image-1.png') + finally: + shutil.rmtree(test_dir) if __name__ == "__main__": import nose From 85f472a678f98998423d5abda7353b7ed84b2cc6 Mon Sep 17 00:00:00 2001 From: Umair Idris Date: Mon, 16 Mar 2015 15:26:03 -0400 Subject: [PATCH 6/6] Modify test to close empty file as soon as it's created --- lib/matplotlib/tests/test_backend_bases.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/tests/test_backend_bases.py b/lib/matplotlib/tests/test_backend_bases.py index a43a4bf7f557..780c34335891 100644 --- a/lib/matplotlib/tests/test_backend_bases.py +++ b/lib/matplotlib/tests/test_backend_bases.py @@ -78,9 +78,10 @@ def test_get_default_filename_already_exists(): canvas = FigureCanvasBase(fig) # create 'image.png' in figure's save dir - with open(os.path.join(test_dir, 'image.png'), 'a'): - filename = canvas.get_default_filename() - assert_equal(filename, 'image-1.png') + open(os.path.join(test_dir, 'image.png'), 'w').close() + + filename = canvas.get_default_filename() + assert_equal(filename, 'image-1.png') finally: shutil.rmtree(test_dir)