]> granicus.if.org Git - python/commitdiff
#1326: document and test zipimporter.archive and zipimporter.prefix.
authorGeorg Brandl <georg@python.org>
Sun, 11 May 2008 15:05:13 +0000 (15:05 +0000)
committerGeorg Brandl <georg@python.org>
Sun, 11 May 2008 15:05:13 +0000 (15:05 +0000)
Doc/library/zipimport.rst
Lib/test/test_zipimport.py
Modules/zipimport.c

index 0e8770c53edae89b8fbefe29ab793ede5bcd5dfa..104182e7e8c5ae9351f1dfb56cbc08be1b97d8e3 100644 (file)
@@ -65,17 +65,14 @@ zipimporter Objects
 
 .. class:: zipimporter(archivepath)
 
-   Create a new zipimporter instance. *archivepath* must be a path to a ZIP file.
+   Create a new zipimporter instance. *archivepath* must be a path to a ZIP
+   file, or to a specific path within a ZIP file.  For example, an *archivepath*
+   of :file:`foo/bar.zip/lib` will look for modules in the :file:`lib` directory
+   inside the ZIP file :file:`foo/bar.zip` (provided that it exists).
+
    :exc:`ZipImportError` is raised if *archivepath* doesn't point to a valid ZIP
    archive.
 
-   *archivepath* can also contain a path within the ZIP file -- the importer
-   object will then look under that path instead of the ZIP file root.  For
-   example, an *archivepath* of :file:`foo/bar.zip/lib` will look for modules
-   in the :file:`lib` directory inside the ZIP file :file:`foo/bar.zip`
-   (provided that it exists).
-
-
    .. method:: find_module(fullname[, path])
 
       Search for a module specified by *fullname*. *fullname* must be the fully
@@ -120,13 +117,19 @@ zipimporter Objects
 
    .. attribute:: archive
 
-      The file name of the importer's associated ZIP file.
+      The file name of the importer's associated ZIP file, without a possible
+      subpath.
 
 
    .. attribute:: prefix
 
-      The path within the ZIP file where modules are searched; see
-      :class:`zipimporter` for details.
+      The subpath within the ZIP file where modules are searched.  This is the
+      empty string for zipimporter objects which point to the root of the ZIP
+      file.
+
+   The :attr:`archive` and :attr:`prefix` attributes, when combined with a
+   slash, equal the original *archivepath* argument given to the
+   :class:`zipimporter` constructor.
 
 
 .. _zipimport-examples:
index 7ce0cf44fcb57eda10d3191110938904da6f2b38..205853d1866a167fad79caf75cf86be80a48d9ad 100644 (file)
@@ -212,6 +212,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
             z.close()
 
             zi = zipimport.zipimporter(TEMP_ZIP)
+            self.assertEquals(zi.archive, TEMP_ZIP)
             self.assertEquals(zi.is_package(TESTPACK), True)
             zi.load_module(TESTPACK)
 
@@ -232,6 +233,37 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
             z.close()
             os.remove(TEMP_ZIP)
 
+    def testZipImporterMethodsInSubDirectory(self):
+        packdir = TESTPACK + os.sep
+        packdir2 = packdir + TESTPACK2 + os.sep
+        files = {packdir2 + "__init__" + pyc_ext: (NOW, test_pyc),
+                 packdir2 + TESTMOD + pyc_ext: (NOW, test_pyc)}
+
+        z = ZipFile(TEMP_ZIP, "w")
+        try:
+            for name, (mtime, data) in files.items():
+                zinfo = ZipInfo(name, time.localtime(mtime))
+                zinfo.compress_type = self.compression
+                z.writestr(zinfo, data)
+            z.close()
+
+            zi = zipimport.zipimporter(TEMP_ZIP + os.sep + packdir)
+            self.assertEquals(zi.archive, TEMP_ZIP)
+            self.assertEquals(zi.prefix, packdir)
+            self.assertEquals(zi.is_package(TESTPACK2), True)
+            zi.load_module(TESTPACK2)
+
+            self.assertEquals(zi.is_package(TESTPACK2 + os.sep + '__init__'), False)
+            self.assertEquals(zi.is_package(TESTPACK2 + os.sep + TESTMOD), False)
+
+            mod_name = TESTPACK2 + os.sep + TESTMOD
+            mod = __import__(module_path_to_dotted_name(mod_name))
+            self.assertEquals(zi.get_source(TESTPACK2), None)
+            self.assertEquals(zi.get_source(mod_name), None)
+        finally:
+            z.close()
+            os.remove(TEMP_ZIP)
+
     def testGetData(self):
         z = ZipFile(TEMP_ZIP, "w")
         z.compression = self.compression
index a57812d6a4815606424927149591d89c2a9ba9e6..d3cd4ad61a753b532f7c4a8b263de84c09e3e0cd 100644 (file)
@@ -555,8 +555,15 @@ PyDoc_STRVAR(zipimporter_doc,
 "zipimporter(archivepath) -> zipimporter object\n\
 \n\
 Create a new zipimporter instance. 'archivepath' must be a path to\n\
-a zipfile. ZipImportError is raised if 'archivepath' doesn't point to\n\
-a valid Zip archive.");
+a zipfile, or to a specific path inside a zipfile. For example, it can be\n\
+'/tmp/myimport.zip', or '/tmp/myimport.zip/mydirectory', if mydirectory is a\n\
+valid directory inside the archive.\n\
+\n\
+'ZipImportError is raised if 'archivepath' doesn't point to a valid Zip\n\
+archive.\n\
+\n\
+The 'archive' attribute of zipimporter objects contains the name of the\n\
+zipfile targeted.");
 
 #define DEFERRED_ADDRESS(ADDR) 0