From: Matthew F. <mat...@as...> - 2005-12-10 08:34:34
Attachments:
datasave.patch
|
Attached is a patch that adds the keyword parameter 'filename' to the functions GridData and Data. Passing this parameter saves the passed data to a permanent file instead of a temporary file or a fifo. Note that I also changed the name of the class _TempFileItem to _NewFileItem since it now handles all non-fifo file creation, not just temporary files. Please CC me in your reply; I was unable to subscribe to the list due to (I believe) the current Sourceforge flux. -- Matthew Fulmer |
From: Michael H. <mh...@al...> - 2005-12-13 11:55:13
|
Matthew Fulmer wrote: > Attached is a patch that adds the keyword parameter 'filename' > to the functions GridData and Data. Passing this parameter saves > the passed data to a permanent file instead of a temporary file > or a fifo. Note that I also changed the name of the class > _TempFileItem to _NewFileItem since it now handles all non-fifo > file creation, not just temporary files. > > Please CC me in your reply; I was unable to subscribe to the > list due to (I believe) the current Sourceforge flux. Thanks for the patch! I think that this is a good idea in general, and I'd like to incorporate it into Gnuplot.py. But there are a few things to be fixed before I could merge your change: 1. Please use spaces instead of tabs for indenting Python code, for consistency with the rest of the code. And please limit line lengths to 79 characters and uniformly use 4 spaces for indenting. 2. I think that code like this > def __init__(self, content, **keyw): > + if keyw.has_key('filename'): > + filename = keyw['filename'] > + del keyw['filename'] > + if filename: > + self.temp = False > + else: > + filename = tempfile.mktemp() > + self.temp = True > + else: > + filename = tempfile.mktemp() > + self.temp = True can be more succinctly written like this: > def __init__(self, content, filename=None, **keyw): > + if filename: > + self.temp = False > + else: > + filename = tempfile.mktemp() > + self.temp = True 3. Please include a patch to the test.py script to test the new feature. 4. Please include a patch to NEWS.txt telling what's new. Also see notes below within your patch. > ------------------------------------------------------------------------ > > Index: PlotItems.py > =================================================================== > RCS file: /cvsroot/gnuplot-py/gnuplot-py/PlotItems.py,v > retrieving revision 2.16 > diff -u -p -r2.16 PlotItems.py > --- PlotItems.py 7 Nov 2005 21:10:00 -0000 2.16 > +++ PlotItems.py 10 Dec 2005 08:11:21 -0000 > @@ -302,6 +302,7 @@ class _FileItem(PlotItem): > > self.filename = filename > > + # Use single-quotes so that pgnuplot can handle DOS filenames: > apply(PlotItem.__init__, (self,), keyw) > > def get_base_command_string(self): I don't understand this comment in this context. > @@ -336,8 +337,20 @@ class _FileItem(PlotItem): > self._options['binary'] = (0, None) > > > -class _TempFileItem(_FileItem): > +class _NewFileItem(_FileItem): > def __init__(self, content, **keyw): > + if keyw.has_key('filename'): > + filename = keyw['filename'] > + del keyw['filename'] > + if filename: > + self.temp = False > + else: > + filename = tempfile.mktemp() > + self.temp = True > + else: > + filename = tempfile.mktemp() > + self.temp = True > + > binary = keyw.get('binary', 0) > if binary: > mode = 'wb' I don't see how this part of the patch can work, as filename is overwritten a few lines later. > @@ -359,13 +372,14 @@ class _TempFileItem(_FileItem): > > # If the user hasn't specified a title, set it to None so > # that the name of the temporary file is not used: > - if not keyw.has_key('title'): > + if not keyw.has_key('title') and self.temp: > keyw['title'] = None > > apply(_FileItem.__init__, (self, filename,), keyw) > > def __del__(self): > - os.unlink(self.filename) > + if self.temp: > + os.unlink(self.filename) > > > class _InlineFileItem(_FileItem): > @@ -529,6 +543,8 @@ def Data(*set, **keyw): > rather than through a temporary file. The default is the > value of gp.GnuplotOpts.prefer_inline_data. > > + 'filename=<string>' -- save data to a permanent file > + > The keyword arguments recognized by '_FileItem' can also be used > here. > > @@ -558,7 +574,17 @@ def Data(*set, **keyw): > cols = (cols,) > set = Numeric.take(set, cols, -1) > > + if keyw.has_key('filename'): > + filename = keyw['filename'] > + if not filename: > + del keyw['filename'] > + filename = None > + else: > + filename = None > + > if keyw.has_key('inline'): > + if filename: > + raise Errors.OptionError('cannot pass data both inline and via a file') > inline = keyw['inline'] > del keyw['inline'] > else: I think that the same OptionError test needs to be done a few lines later, if gp.GnuplotOpts.prefer_inline_data is set. Or, better yet, invert the test to check for filename before considering the inline option: if filename: if keyw.get('inline', 0): raise ... elif keyw.has_key('inline'): inline = keyw['inline'] del keyw['inline'] else: inline = gp.GnuplotOpts.prefer_inline_data > @@ -570,10 +596,10 @@ def Data(*set, **keyw): > content = f.getvalue() > if inline: > return apply(_InlineFileItem, (content,), keyw) > - elif gp.GnuplotOpts.prefer_fifo_data: > + elif (not filename) and gp.GnuplotOpts.prefer_fifo_data: > return apply(_FIFOFileItem, (content,), keyw) > else: > - return apply(_TempFileItem, (content,), keyw) > + return apply(_NewFileItem, (content,), keyw) > > > def GridData(data, xvals=None, yvals=None, inline=_unset, **keyw): > @@ -596,6 +622,8 @@ def GridData(data, xvals=None, yvals=Non > > 'inline=<bool>' -- send data to gnuplot "inline"? > > + 'filename=<string>' -- save data to a permanent file > + > Note the unusual argument order! The data are specified *before* > the x and y values. (This inconsistency was probably a mistake; > after all, the default xvals and yvals are not very useful.) > @@ -658,8 +686,22 @@ def GridData(data, xvals=None, yvals=Non > binary = keyw.get('binary', 1) and gp.GnuplotOpts.recognizes_binary_splot > keyw['binary'] = binary > > + if keyw.has_key('filename'): > + filename = keyw['filename'] > + if not filename: > + del keyw['filename'] > + filename = None > + else: > + filename = None > + > + binary = keyw.get('binary', 1) and gp.GnuplotOpts.recognizes_binary_splot > + keyw['binary'] = binary > + > if inline is _unset: > - inline = (not binary) and gp.GnuplotOpts.prefer_inline_data > + inline = (not binary) and (not filename) and gp.GnuplotOpts.prefer_inline_data > + elif inline: > + if filename: > + raise Errors.OptionError('cannot pass data both inline and via a file') > > # xvals, yvals, and data are now all filled with arrays of data. > if binary: > @@ -686,10 +728,10 @@ def GridData(data, xvals=None, yvals=Non > mout[1:,1:] = Numeric.transpose(data.astype(Numeric.Float32)) > > content = mout.tostring() > - if gp.GnuplotOpts.prefer_fifo_data: > + if (not filename) and gp.GnuplotOpts.prefer_fifo_data: > return apply(_FIFOFileItem, (content,), keyw) > else: > - return apply(_TempFileItem, (content,), keyw) > + return apply(_NewFileItem, (content,), keyw) > else: > # output data to file as "x y f(x)" triplets. This > # requires numy copies of each x value and numx copies of > @@ -709,9 +751,9 @@ def GridData(data, xvals=None, yvals=Non > > if inline: > return apply(_InlineFileItem, (content,), keyw) > - elif gp.GnuplotOpts.prefer_fifo_data: > + elif (not filename) and gp.GnuplotOpts.prefer_fifo_data: > return apply(_FIFOFileItem, (content,), keyw) > else: > - return apply(_TempFileItem, (content,), keyw) > + return apply(_NewFileItem, (content,), keyw) > > |
From: Matthew F. <mat...@as...> - 2005-12-15 20:25:00
Attachments:
datasave.patch
|
I made the changes you requested it and tested it via test.py. I also replaced occurences of the deprecated apply function with the recommended syntax. I did this because it makes it easier to call the _NewFileItem with keyword parameters that are not part of keyw (like filename). I will reverse that change if necessary (tested with python 2.4). I am subscribed to the mailing list now (I had a procmail bug that sent the subscription confirmation to the wrong place). Here is the new patch -- Matthew Fulmer |
From: Michael H. <mh...@al...> - 2005-12-15 22:28:17
|
Matthew Fulmer wrote: > I made the changes you requested it and tested it via test.py. I > also replaced occurences of the deprecated apply function with > the recommended syntax. I did this because it makes it easier to > call the _NewFileItem with keyword parameters that are not part > of keyw (like filename). I will reverse that change if necessary > (tested with python 2.4). > > I am subscribed to the mailing list now (I had a procmail bug > that sent the subscription confirmation to the wrong place). > Here is the new patch Thanks for the revised patch. I may not have time to look it over before leaving on a Xmas trip to America, but I'll try to get to it early in January. Lurkers should also feel free to jump in and help reviewing this (or any other) code. Yours, Michael |
From: Michael H. <mh...@al...> - 2005-12-18 13:08:10
|
Matthew Fulmer wrote: > I made the changes you requested it and tested it via test.py. I > also replaced occurences of the deprecated apply function with > the recommended syntax. I did this because it makes it easier to > call the _NewFileItem with keyword parameters that are not part > of keyw (like filename). I will reverse that change if necessary > (tested with python 2.4). > > I am subscribed to the mailing list now (I had a procmail bug > that sent the subscription confirmation to the wrong place). > Here is the new patch Thanks again. I just committed this patch to CVS. Michael |