Revision: 4758
          http://matplotlib.svn.sourceforge.net/matplotlib/?rev=4758&view=rev
Author:   mdboom
Date:     2007-12-17 07:43:03 -0800 (Mon, 17 Dec 2007)

Log Message:
-----------
Merged revisions 4735-4757 via svnmerge from 
http://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib

........
  r4745 | jdh2358 | 2007-12-15 16:33:38 -0500 (Sat, 15 Dec 2007) | 1 line
  
  changed %g to %r for rec2csv
........
  r4747 | astraw | 2007-12-16 14:28:46 -0500 (Sun, 16 Dec 2007) | 1 line
  
  Add test for rec2csv and csv2rec roundtrip not losing precision.
........
  r4748 | astraw | 2007-12-16 15:53:35 -0500 (Sun, 16 Dec 2007) | 1 line
  
  rec2csv does not close filehandles passed in open
........
  r4749 | astraw | 2007-12-16 18:19:59 -0500 (Sun, 16 Dec 2007) | 1 line
  
  fix csv2rec roundtrip for funky strings, too
........
  r4755 | jdh2358 | 2007-12-16 23:37:38 -0500 (Sun, 16 Dec 2007) | 1 line
  
  mods to support dates in csv2rec and friends
........

Modified Paths:
--------------
    branches/transforms/CHANGELOG
    branches/transforms/lib/matplotlib/cbook.py
    branches/transforms/lib/matplotlib/mlab.py
    branches/transforms/lib/matplotlib/mpl-data/matplotlib.conf.template

Added Paths:
-----------
    branches/transforms/unit/mlab_unit.py

Property Changed:
----------------
    branches/transforms/


Property changes on: branches/transforms
___________________________________________________________________
Name: svnmerge-integrated
   - /trunk/matplotlib:1-4734
   + /trunk/matplotlib:1-4757

Modified: branches/transforms/CHANGELOG
===================================================================
--- branches/transforms/CHANGELOG       2007-12-17 15:41:47 UTC (rev 4757)
+++ branches/transforms/CHANGELOG       2007-12-17 15:43:03 UTC (rev 4758)
@@ -1,3 +1,6 @@
+2007-12-16 rec2csv saves doubles without losing precision. Also, it
+           does not close filehandles passed in open. - JDH,ADS
+
 2007-12-13 Moved rec2gtk to matplotlib.toolkits.gtktools and rec2excel
            to matplotlib.toolkits.exceltools - JDH
 

Modified: branches/transforms/lib/matplotlib/cbook.py
===================================================================
--- branches/transforms/lib/matplotlib/cbook.py 2007-12-17 15:41:47 UTC (rev 
4757)
+++ branches/transforms/lib/matplotlib/cbook.py 2007-12-17 15:43:03 UTC (rev 
4758)
@@ -225,7 +225,7 @@
     except TypeError: return False
     else: return True
 
-def to_filehandle(fname, flag='r'):
+def to_filehandle(fname, flag='r', return_opened=False):
     """
     fname can be a filename or a file handle.  Support for gzipped
     files is automatic, if the filename ends in .gz.  flag is a
@@ -237,10 +237,14 @@
             fh = gzip.open(fname, flag)
         else:
             fh = file(fname, flag)
+        opened = True
     elif hasattr(fname, 'seek'):
         fh = fname
+        opened = False
     else:
         raise ValueError('fname must be a string or file handle')
+    if return_opened:
+        return fh, opened
     return fh
 
 def flatten(seq, scalarp=is_scalar):

Modified: branches/transforms/lib/matplotlib/mlab.py
===================================================================
--- branches/transforms/lib/matplotlib/mlab.py  2007-12-17 15:41:47 UTC (rev 
4757)
+++ branches/transforms/lib/matplotlib/mlab.py  2007-12-17 15:43:03 UTC (rev 
4758)
@@ -2129,6 +2129,7 @@
 
     process_skiprows(reader)
 
+    dateparser = dateutil.parser.parse
 
     def myfloat(x):
         if x==missing:
@@ -2136,9 +2137,18 @@
         else:
             return float(x)
 
+    def mydate(x):
+        # try and return a date object
+        d = dateparser(x)
+
+        if d.hour>0 or d.minute>0 or d.second>0:
+            raise ValueError('not a date')
+        return d.date()
+
+
     def get_func(item, func):
         # promote functions in this order
-        funcmap = {int:myfloat, myfloat:dateutil.parser.parse, 
dateutil.parser.parse:str}
+        funcmap = {int:myfloat, myfloat:mydate, mydate:dateparser, 
dateparser:str}
         try: func(item)
         except:
             if func==str:
@@ -2238,8 +2248,12 @@
 
 class FormatString(FormatObj):
     def tostr(self, x):
-        return '"%s"'%self.toval(x)
+        val = repr(x)
+        return val[1:-1]
 
+#class FormatString(FormatObj):
+#    def tostr(self, x):
+#        return '"%r"'%self.toval(x)
 
 class FormatFormatStr(FormatObj):
     def __init__(self, fmt):
@@ -2297,7 +2311,7 @@
     npy.float32 : FormatFloat(),
     npy.float64 : FormatFloat(),
     npy.object_ : FormatObj(),
-    npy.string_ : FormatObj(),
+    npy.string_ : FormatString(),
     }
 
 def get_formatd(r, formatd=None):
@@ -2317,7 +2331,7 @@
     format = copy.deepcopy(format)
     if isinstance(format, FormatFloat):
         format.scale = 1. # override scaling for storage
-        format.fmt = '%g' # maximal precision
+        format.fmt = '%r'
     return format
 
 def rec2csv(r, fname, delimiter=',', formatd=None):
@@ -2335,13 +2349,14 @@
     for i, name in enumerate(r.dtype.names):
         funcs.append(csvformat_factory(formatd[name]).tostr)
 
-    fh = cbook.to_filehandle(fname, 'w')
+    fh, opened = cbook.to_filehandle(fname, 'w', return_opened=True)
     writer = csv.writer(fh, delimiter=delimiter)
     header = r.dtype.names
     writer.writerow(header)
     for row in r:
         writer.writerow([func(val) for func, val in zip(funcs, row)])
-    fh.close()
+    if opened:
+        fh.close()
 
 
 

Modified: branches/transforms/lib/matplotlib/mpl-data/matplotlib.conf.template
===================================================================
--- branches/transforms/lib/matplotlib/mpl-data/matplotlib.conf.template        
2007-12-17 15:41:47 UTC (rev 4757)
+++ branches/transforms/lib/matplotlib/mpl-data/matplotlib.conf.template        
2007-12-17 15:43:03 UTC (rev 4758)
@@ -3,32 +3,32 @@
 # This is a sample matplotlib configuration file.  It should be placed
 # in HOME/.matplotlib/matplotlibrc (unix/linux like systems) and
 # C:\Documents and Settings\yourname\.matplotlib (win32 systems)
-# 
+#
 # By default, the installer will overwrite the existing file in the install
 # path, so if you want to preserve yours, please move it to your HOME dir and
 # set the environment variable if necessary.
-# 
+#
 # This file is best viewed in a editor which supports ini or conf mode syntax
 # highlighting.
-# 
+#
 # Blank lines, or lines starting with a comment symbol, are ignored,
 # as are trailing comments.  Other lines must have the format
-# 
+#
 #   key = val   optional comment
-# 
+#
 # val should be valid python syntax, just as you would use when setting
 # properties using rcParams. This should become more obvious by inspecting
 # the default values listed herein.
-# 
+#
 # Colors: for the color values below, you can either use
 #  - a matplotlib color string, such as r | k | b
 #  - an rgb tuple, such as (1.0, 0.5, 0.0)
 #  - a hex string, such as #ff00ff or ff00ff
 #  - a scalar grayscale intensity such as 0.75
 #  - a legal html color name, eg red | blue | darkslategray
-# 
+#
 # Interactivity: see http://matplotlib.sourceforge.net/interactive.html.
-# 
+#
 # ### CONFIGURATION BEGINS HERE ###
 
 # a value of type 'str'
@@ -42,7 +42,7 @@
 # 'Africa/Abidjan' or 'Africa/Accra' or 'Africa/Addis_Ababa' or
 # 'Africa/Algiers' or 'Africa/Asmara' or 'Africa/Asmera' or 'Africa/Bamako' or
 # 'Africa/Bangui' or 'Africa/Banjul' or 'Africa/Bissau' or 'Africa/Blantyre'
-#  <...snipped 156 lines...> 
+#  <...snipped 156 lines...>
 # 'US/Michigan' or 'US/Mountain' or 'US/Pacific' or 'US/Pacific-New' or
 # 'US/Samoa' or 'UTC' or 'Universal' or 'W-SU' or 'WET' or 'Zulu' or
 # 'posixrules'
@@ -108,10 +108,10 @@
     [[ps]]
         # 3 or 42
         fonttype = 3
-        # 'auto' or 'letter' or 'legal' or 'ledger' or 'A0' or 'A1' or 'A2' or
-        # 'A3' or 'A4' or 'A5' or 'A6' or 'A7' or 'A8' or 'A9' or 'A10' or
-        # 'B0' or 'B1' or 'B2' or 'B3' or 'B4' or 'B5' or 'B6' or 'B7' or 'B8'
-        # or 'B9' or 'B10'
+        # auto | letter | legal | ledger | A0 | A1 | A2 |
+        # A3 | A4 | A5 | A6 | A7 | A8 | A9 | A10 |
+        # B0 | B1 | B2 | B3 | B4 | B5 | B6 | B7 | B8
+        # | B9 | B10
         papersize = 'letter'
         # a value of type 'bool'
         useafm = False
@@ -216,7 +216,7 @@
     # 'Accent' or 'Accent_r' or 'Blues' or 'Blues_r' or 'BrBG' or 'BrBG_r' or
     # 'BuGn' or 'BuGn_r' or 'BuPu' or 'BuPu_r' or 'Dark2' or 'Dark2_r' or
     # 'GnBu' or 'GnBu_r' or 'Greens' or 'Greens_r' or 'Greys' or 'Greys_r' or
-    #  <...snipped 16 lines...> 
+    #  <...snipped 16 lines...>
     # 'pink_r' or 'prism' or 'prism_r' or 'spectral' or 'spectral_r' or
     # 'spring' or 'spring_r' or 'summer' or 'summer_r' or 'winter' or
     # 'winter_r'
@@ -404,4 +404,4 @@
         # a value of type 'float'
         pad = 4.0
         # a value of type 'float'
-        size = 2.0
\ No newline at end of file
+        size = 2.0

Copied: branches/transforms/unit/mlab_unit.py (from rev 4755, 
trunk/matplotlib/unit/mlab_unit.py)
===================================================================
--- branches/transforms/unit/mlab_unit.py                               (rev 0)
+++ branches/transforms/unit/mlab_unit.py       2007-12-17 15:43:03 UTC (rev 
4758)
@@ -0,0 +1,59 @@
+import datetime, StringIO, unittest
+import matplotlib.mlab as mlab
+import numpy
+
+class TestMlab(unittest.TestCase):
+    def test_csv2rec_closefile(self):
+        # If passed a file-like object, rec2csv should not close it.
+        ra=numpy.rec.array([(123, 1197346475.0137341), (456, 123.456)],
+                           dtype=[('a', '<i8'), ('b', '<f8')])
+        fh = StringIO.StringIO()
+        mlab.rec2csv( ra, fh )
+        self.failIf( fh.closed )
+
+    def test_csv2rec_roundtrip(self):
+
+        # Make sure double-precision floats and strings pass through a
+        # roundtrip unaltered.
+
+        # A bug in numpy (fixed in r4602) meant that numpy scalars
+        # lost precision when passing through repr(). csv2rec was
+        # affected by this. This test will only pass on numpy >=
+        # 1.0.5.
+        delta = datetime.timedelta(days=1)
+        date0 = datetime.date(2007,12,16)
+        date1 = date0 + delta
+        date2 = date1 + delta
+
+        delta = datetime.timedelta(days=1)
+        datetime0 = datetime.datetime(2007,12,16,22,29,34,924122)
+        datetime1 = datetime0 + delta
+        datetime2 = datetime1 + delta
+        ra=numpy.rec.fromrecords([
+                (123, date0, datetime0, 1197346475.0137341, 'a,bc'),
+                (456, date1, datetime1, 123.456, 'd\'ef'),
+                (789, date2, datetime2, 0.000000001, 'ghi'),
+                            ],
+            names='intdata,datedata,datetimedata,floatdata,stringdata')
+
+        fh = StringIO.StringIO()
+        mlab.rec2csv( ra, fh )
+        fh.seek(0)
+        if 0:
+            print 'CSV contents:','-'*40
+            print fh.read()
+            print '-'*40
+            fh.seek(0)
+        ra2 = mlab.csv2rec(fh)
+        fh.close()
+        #print 'ra', ra
+        #print 'ra2', ra2
+        for name in ra.dtype.names:
+            if 0:
+                print name, repr(ra[name]), repr(ra2[name])
+                dt = ra.dtype[name]
+                print 'repr(dt.type)',repr(dt.type)
+            self.failUnless( numpy.all(ra[name] == ra2[name]) ) # should not 
fail with numpy 1.0.5
+
+if __name__=='__main__':
+    unittest.main()


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
SF.Net email is sponsored by:
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services
for just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
Matplotlib-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/matplotlib-checkins

Reply via email to