[Python-checkins] cpython (3.2): Issue #13594: various fixes to aifc module; patch by Oleg Plakhotnyuk

sandro.tosi python-checkins at python.org
Sun Jan 1 22:54:24 CET 2012


http://hg.python.org/cpython/rev/c7a4405835e8
changeset:   74227:c7a4405835e8
branch:      3.2
parent:      74224:a9cdc3ff2b8e
user:        Sandro Tosi <sandro.tosi at gmail.com>
date:        Sun Jan 01 22:53:08 2012 +0100
summary:
  Issue #13594: various fixes to aifc module; patch by Oleg Plakhotnyuk

files:
  Lib/aifc.py           |  35 +++++++++++++++---------------
  Lib/test/test_aifc.py |  23 ++++++++++++++++++++
  2 files changed, 41 insertions(+), 17 deletions(-)


diff --git a/Lib/aifc.py b/Lib/aifc.py
--- a/Lib/aifc.py
+++ b/Lib/aifc.py
@@ -539,8 +539,7 @@
         self._aifc = 1      # AIFF-C is default
 
     def __del__(self):
-        if self._file:
-            self.close()
+        self.close()
 
     #
     # User visible methods.
@@ -643,8 +642,8 @@
             raise Error('marker ID must be > 0')
         if pos < 0:
             raise Error('marker position must be >= 0')
-        if not isinstance(name, str):
-            raise Error('marker name must be a string')
+        if not isinstance(name, bytes):
+            raise Error('marker name must be bytes')
         for i in range(len(self._markers)):
             if id == self._markers[i][0]:
                 self._markers[i] = id, pos, name
@@ -681,19 +680,21 @@
             self._patchheader()
 
     def close(self):
-        self._ensure_header_written(0)
-        if self._datawritten & 1:
-            # quick pad to even size
-            self._file.write(b'\x00')
-            self._datawritten = self._datawritten + 1
-        self._writemarkers()
-        if self._nframeswritten != self._nframes or \
-              self._datalength != self._datawritten or \
-              self._marklength:
-            self._patchheader()
-        # Prevent ref cycles
-        self._convert = None
-        self._file.close()
+        if self._file:
+            self._ensure_header_written(0)
+            if self._datawritten & 1:
+                # quick pad to even size
+                self._file.write(b'\x00')
+                self._datawritten = self._datawritten + 1
+            self._writemarkers()
+            if self._nframeswritten != self._nframes or \
+                  self._datalength != self._datawritten or \
+                  self._marklength:
+                self._patchheader()
+            # Prevent ref cycles
+            self._convert = None
+            self._file.close()
+            self._file = None
 
     #
     # Internal methods.
diff --git a/Lib/test/test_aifc.py b/Lib/test/test_aifc.py
--- a/Lib/test/test_aifc.py
+++ b/Lib/test/test_aifc.py
@@ -120,6 +120,29 @@
             self.assertEqual(fout.getsampwidth(), 2)
             fout.initfp(None)
 
+    def test_write_markers_values(self):
+        fout = self.fout = aifc.open(io.BytesIO(), 'wb')
+        self.assertEqual(fout.getmarkers(), None)
+        fout.setmark(1, 0, b'foo1')
+        fout.setmark(1, 1, b'foo2')
+        self.assertEqual(fout.getmark(1), (1, 1, b'foo2'))
+        self.assertEqual(fout.getmarkers(), [(1, 1, b'foo2')])
+        fout.initfp(None)
+
+    def test_read_markers(self):
+        fout = self.fout = aifc.open(TESTFN, 'wb')
+        fout.aiff()
+        fout.setparams((1, 1, 1, 1, b'NONE', b''))
+        fout.setmark(1, 0, b'odd')
+        fout.setmark(2, 0, b'even')
+        fout.writeframes(b'\x00')
+        fout.close()
+        f = self.f = aifc.open(TESTFN, 'rb')
+        self.assertEqual(f.getmarkers(), [(1, 0, b'odd'), (2, 0, b'even')])
+        self.assertEqual(f.getmark(1), (1, 0, b'odd'))
+        self.assertEqual(f.getmark(2), (2, 0, b'even'))
+        self.assertRaises(aifc.Error, f.getmark, 3)
+
 
 def test_main():
     run_unittest(AIFCTest)

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list