]> granicus.if.org Git - python/commitdiff
#17616: wave.open now supports the 'with' statement.
authorR David Murray <rdmurray@bitdance.com>
Wed, 31 Jul 2013 17:46:08 +0000 (13:46 -0400)
committerR David Murray <rdmurray@bitdance.com>
Wed, 31 Jul 2013 17:46:08 +0000 (13:46 -0400)
Feature and tests by ClClaudiu.Popa, I added the doc changes.

Doc/library/aifc.rst
Doc/library/wave.rst
Doc/whatsnew/3.4.rst
Lib/test/test_wave.py
Lib/wave.py
Misc/NEWS

index c1cd215c3ff9fa23a5a8911eed3cafabeefb67b9..44a0a24ff5fe79b928c7bb9e5abee35e17a27d2e 100644 (file)
@@ -51,7 +51,8 @@ Module :mod:`aifc` defines the following function:
    used for writing, the file object should be seekable, unless you know ahead of
    time how many samples you are going to write in total and use
    :meth:`writeframesraw` and :meth:`setnframes`.
-   Objects returned by :func:`.open` also supports the :keyword:`with` statement.
+   The :func:`.open` function may be used in a :keyword:`with` statement.  When
+   the :keyword:`with` block completes, the :meth:`~aifc.close` method is called.
 
 .. versionchanged:: 3.4
    Support for the :keyword:`with` statement was added.
index 2e64d00305d800440372892eefd82b9d16a02321..c52af89774c653dfb2aa94996f295637c2fe893b 100644 (file)
@@ -39,6 +39,11 @@ The :mod:`wave` module defines the following function and exception:
    :meth:`close` method is called; it is the caller's responsibility to close
    the file object.
 
+   The :func:`.open` function may be used in a :keyword:`with` statement.  When
+   the :keyword:`with` block completes, the :meth:`Wave_read.close()
+   <wave.Wave_read.close>` or :meth:`Wave_write.close()
+   <wave.Wave_write.close()>` method is called.
+
 
 .. function:: openfp(file, mode)
 
index 17cec3f2ad67a786fced568707fbd1c7570f28b1..2575170f4426c58d8919229f445026a5f5a2ad1a 100644 (file)
@@ -239,8 +239,11 @@ wave
 The :meth:`~wave.getparams` method now returns a namedtuple rather than a
 plain tuple.  (Contributed by Claudiu Popa in :issue:`17487`.)
 
+:meth:`wave.open` now supports the context manager protocol.  (Contributed
+by Claudiu Popa in :issue:`17616`.)
+
 stat
----
+----
 
 The stat module is now backed by a C implementation in :mod:`_stat`. A C
 implementation is required as most of the values aren't standardized and
index 581d9739d54f7d5461a262e8331a94b9365eb83c..e9ee15ca9ac0c03b7d611ef30a345bb85738b575 100644 (file)
@@ -1,7 +1,5 @@
-from test.support import TESTFN, run_unittest
-import os
+from test.support import TESTFN, unlink
 import wave
-import struct
 import unittest
 
 nchannels = 2
@@ -17,10 +15,7 @@ class TestWave(unittest.TestCase):
     def tearDown(self):
         if self.f is not None:
             self.f.close()
-        try:
-            os.remove(TESTFN)
-        except OSError:
-            pass
+        unlink(TESTFN)
 
     def test_it(self, test_rounding=False):
         self.f = wave.open(TESTFN, 'wb')
@@ -74,9 +69,23 @@ class TestWave(unittest.TestCase):
         self.assertEqual(params.comptype, self.f.getcomptype())
         self.assertEqual(params.compname, self.f.getcompname())
 
+    def test_context_manager(self):
+        self.f = wave.open(TESTFN, 'wb')
+        self.f.setnchannels(nchannels)
+        self.f.setsampwidth(sampwidth)
+        self.f.setframerate(framerate)
+        self.f.close()
+
+        with wave.open(TESTFN) as f:
+            self.assertFalse(f.getfp().closed)
+        self.assertIs(f.getfp(), None)
+
+        with open(TESTFN, 'wb') as testfile:
+            with self.assertRaises(wave.Error):
+                with wave.open(testfile, 'wb'):
+                    pass
+            self.assertEqual(testfile.closed, False)
 
-def test_main():
-    run_unittest(TestWave)
 
 if __name__ == '__main__':
-    test_main()
+    unittest.main()
index ea410c12d783ba2ff083f0819232c2e1f66695fc..695a4be83846320e430aecb304a13c349667b4b0 100644 (file)
@@ -167,6 +167,13 @@ class Wave_read:
 
     def __del__(self):
         self.close()
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
     #
     # User visible methods.
     #
@@ -323,6 +330,12 @@ class Wave_write:
     def __del__(self):
         self.close()
 
+    def __enter__(self):
+        return self
+
+    def __exit__(self, *args):
+        self.close()
+
     #
     # User visible methods.
     #
index d44a0433be8185807bfb0fb12c5b3cd9204b3163..a4aabbeba4b7617d3ab086123c368c5273e58770 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -173,6 +173,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #17616: wave.open now supports the context manager protocol.
+
 - Issue #18599: Fix name attribute of _sha1.sha1() object. It now returns
   'SHA1' instead of 'SHA'.