]> granicus.if.org Git - python/commitdiff
Issue #22217: Implemented reprs of classes in the zipfile module.
authorSerhiy Storchaka <storchaka@gmail.com>
Wed, 29 Oct 2014 20:42:06 +0000 (22:42 +0200)
committerSerhiy Storchaka <storchaka@gmail.com>
Wed, 29 Oct 2014 20:42:06 +0000 (22:42 +0200)
Lib/test/test_zipfile.py
Lib/zipfile.py
Misc/NEWS

index a17eaaac31febb5174997aa35e2b5835d846d50f..7f2f1ec8f3c08865e9df35e0146004b3e5a1c09d 100644 (file)
@@ -326,6 +326,37 @@ class AbstractTestsWithSourceFile:
                     while zipopen.read1(100):
                         pass
 
+    def test_repr(self):
+        fname = 'file.name'
+        for f in get_files(self):
+            with zipfile.ZipFile(f, 'w', self.compression) as zipfp:
+                zipfp.write(TESTFN, fname)
+                r = repr(zipfp)
+                self.assertIn("mode='w'", r)
+
+            with zipfile.ZipFile(f, 'r') as zipfp:
+                r = repr(zipfp)
+                if isinstance(f, str):
+                    self.assertIn('filename=%r' % f, r)
+                else:
+                    self.assertIn('file=%r' % f, r)
+                self.assertIn("mode='r'", r)
+                r = repr(zipfp.getinfo(fname))
+                self.assertIn('filename=%r' % fname, r)
+                self.assertIn('filemode=', r)
+                self.assertIn('file_size=', r)
+                if self.compression != zipfile.ZIP_STORED:
+                    self.assertIn('compress_type=', r)
+                    self.assertIn('compress_size=', r)
+                with zipfp.open(fname) as zipopen:
+                    r = repr(zipopen)
+                    self.assertIn('name=%r' % fname, r)
+                    self.assertIn("mode='r'", r)
+                    if self.compression != zipfile.ZIP_STORED:
+                        self.assertIn('compress_type=', r)
+                self.assertIn('[closed]', repr(zipopen))
+            self.assertIn('[closed]', repr(zipfp))
+
     def tearDown(self):
         unlink(TESTFN)
         unlink(TESTFN2)
index bda61343571601a4f13a409d5e5020ed677b150b..74e1566c7d01d88b7c860a6cd3e01db3c22e8325 100644 (file)
@@ -355,6 +355,28 @@ class ZipInfo (object):
         # compress_size         Size of the compressed file
         # file_size             Size of the uncompressed file
 
+    def __repr__(self):
+        result = ['<%s filename=%r' % (self.__class__.__name__, self.filename)]
+        if self.compress_type != ZIP_STORED:
+            result.append(' compress_type=%s' %
+                          compressor_names.get(self.compress_type,
+                                               self.compress_type))
+        hi = self.external_attr >> 16
+        lo = self.external_attr & 0xFFFF
+        if hi:
+            result.append(' filemode=%r' % stat.filemode(hi))
+        if lo:
+            result.append(' external_attr=%#x' % lo)
+        isdir = self.filename[-1:] == '/'
+        if not isdir or self.file_size:
+            result.append(' file_size=%r' % self.file_size)
+        if ((not isdir or self.compress_size) and
+            (self.compress_type != ZIP_STORED or
+             self.file_size != self.compress_size)):
+            result.append(' compress_size=%r' % self.compress_size)
+        result.append('>')
+        return ''.join(result)
+
     def FileHeader(self, zip64=None):
         """Return the per-file header as a string."""
         dt = self.date_time
@@ -671,6 +693,20 @@ class ZipExtFile(io.BufferedIOBase):
         else:
             self._expected_crc = None
 
+    def __repr__(self):
+        result = ['<%s.%s' % (self.__class__.__module__,
+                              self.__class__.__qualname__)]
+        if not self.closed:
+            result.append(' name=%r mode=%r' % (self.name, self.mode))
+            if self._compress_type != ZIP_STORED:
+                result.append(' compress_type=%s' %
+                              compressor_names.get(self._compress_type,
+                                                   self._compress_type))
+        else:
+            result.append(' [closed]')
+        result.append('>')
+        return ''.join(result)
+
     def readline(self, limit=-1):
         """Read and return a line from the stream.
 
@@ -967,6 +1003,20 @@ class ZipFile:
     def __exit__(self, type, value, traceback):
         self.close()
 
+    def __repr__(self):
+        result = ['<%s.%s' % (self.__class__.__module__,
+                              self.__class__.__qualname__)]
+        if self.fp is not None:
+            if self._filePassed:
+                result.append(' file=%r' % self.fp)
+            elif self.filename is not None:
+                result.append(' filename=%r' % self.filename)
+            result.append(' mode=%r' % self.mode)
+        else:
+            result.append(' [closed]')
+        result.append('>')
+        return ''.join(result)
+
     def _RealGetContents(self):
         """Read in the table of contents for the ZIP file."""
         fp = self.fp
index 1925e5099f154c52b6d6b4ee10892e37e6c83a8e..7ad96495e4748b317a27c4618bd042dbf03ac952 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -181,6 +181,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #22217: Implemented reprs of classes in the zipfile module.
+
 - Issue #18216: gettext now raises an error when a .mo file has an
   unsupported major version number.  Patch by Aaron Hill.