SVN: zpkgtools/trunk/zpkgtools/ - clarify what is API and what is not for zpkgtools.locationmap

"Fred L. Drake, Jr." <[email protected]>
Newsgroups gmane.comp.web.zope.public-cvs
Message-ID <[email protected]>
Log message for revision 30692:
  - clarify what is API and what is not for zpkgtools.locationmap
  - make relative URLs in maps accessed by path produce the right results
    (tests partially based on the jim-relpath branch)
  - clean up the load()/fromPathOrUrl() signatures a bit
  

Changed:
  U   zpkgtools/trunk/zpkgtools/config.py
  U   zpkgtools/trunk/zpkgtools/locationmap.py
  U   zpkgtools/trunk/zpkgtools/tests/test_locationmap.py

-=-
Modified: zpkgtools/trunk/zpkgtools/config.py
===================================================================
--- zpkgtools/trunk/zpkgtools/config.py	2005-06-08 17:34:43 UTC (rev 30691)
+++ zpkgtools/trunk/zpkgtools/config.py	2005-06-09 04:11:54 UTC (rev 30692)
@@ -74,8 +74,7 @@
     def finalize(self):
         """Load the location maps into `locations`."""
         for loc in self.location_maps:
-            self.locations = locationmap.fromPathOrUrl(loc,
-                                                       mapping=self.locations)
+            self.locations = locationmap.fromPathOrUrl(loc, self.locations)
 
     def loadPath(self, path):
         """Load configuration from a file.

Modified: zpkgtools/trunk/zpkgtools/locationmap.py
===================================================================
--- zpkgtools/trunk/zpkgtools/locationmap.py	2005-06-08 17:34:43 UTC (rev 30691)
+++ zpkgtools/trunk/zpkgtools/locationmap.py	2005-06-09 04:11:54 UTC (rev 30692)
@@ -22,6 +22,7 @@
 import UserDict
 
 from zpkgsetup import loggingapi as logging
+from zpkgsetup import urlutils
 
 from zpkgtools import cvsloader
 from zpkgtools import loader
@@ -141,15 +142,25 @@
         return key in self._wildcards
 
 
-def load(f, base=None, mapping=None):
-    cvsbase = None
-    if base is not None:
-        try:
-            cvsbase = loader.parse(base)
-        except ValueError:
-            pass
-    if mapping is None:
-        mapping = LocationMap()
+def load(f, base, mapping):
+    """Parse a location map from an open file.
+
+    :param f:  The open file to read from.
+
+    :param base:  URL corresponding to the open file.
+
+    :param mapping:  Mapping to update.
+
+    This routine is not part of the API for this module; it is
+    separated out from the `fromPathOrUrl()` function to make it
+    easier to test the map parsing aspect of this module.
+
+    """
+    assert base
+    try:
+        cvsbase = loader.parse(base)
+    except ValueError:
+        cvsbase = None
     local_entries = {}
     lineno = 0
     for line in f:
@@ -204,9 +215,7 @@
             mapping[resource] = url
         local_entries[resource] = resource
 
-    return mapping
 
-
 def get_template_url(parsed):
     #
     # XXX We need to distinguish between the tag being unspecified at
@@ -221,11 +230,21 @@
 
 
 def fromPathOrUrl(path, mapping=None):
+    """Load or update a map base on the content of a path or URL.
+
+    :param path:  Path to a file (absolute or relative), or URL.
+
+    :param mapping:  Mapping object to update; if omitted or `None`, a
+      new `LocationMap` will be created and returned.
+
+    :return: New or updated location map.
+
+    """
     if os.path.isfile(path):
         # prefer a revision-control URL over a local path if possible:
         rcurl = loader.fromPath(path)
         if rcurl is None:
-            base = os.path.dirname(path)
+            base = urlutils.file_url(path)
         else:
             base = loader.baseUrl(rcurl)
         f = open(path, "rU")
@@ -237,10 +256,13 @@
         else:
             f = loader.open(path, "rU")
         base = loader.baseUrl(path)
+    if mapping is None:
+        mapping = LocationMap()
     try:
-        return load(f, base, mapping)
+        load(f, base, mapping)
     finally:
         f.close()
+    return mapping
 
 
 _ident = "[a-zA-Z_][a-zA-Z_0-9]*"

Modified: zpkgtools/trunk/zpkgtools/tests/test_locationmap.py
===================================================================
--- zpkgtools/trunk/zpkgtools/tests/test_locationmap.py	2005-06-08 17:34:43 UTC (rev 30691)
+++ zpkgtools/trunk/zpkgtools/tests/test_locationmap.py	2005-06-09 04:11:54 UTC (rev 30692)
@@ -15,6 +15,8 @@
 
 import doctest
 import os.path
+import shutil
+import tempfile
 import unittest
 import urllib
 
@@ -61,16 +63,19 @@
 
 class LoadTestCase(unittest.TestCase):
 
+    def setUp(self):
+        self.mapping = locationmap.LocationMap()
+
     def test_subversion_urls_dont_lose_templateness(self):
         url = "svn://svn.example.org/svnroot/proj/tags/*/file.txt"
         sio = StringIO("pkg %s \n" % url)
-        mapping = locationmap.load(sio)
-        self.assertEqual(mapping["pkg"], url)
+        locationmap.load(sio, "file:///does/not/exist.map", self.mapping)
+        self.assertEqual(self.mapping["pkg"], url)
 
     def test_load_without_base(self):
         sio = StringIO(SAMPLE_INPUT_WITHOUT_REPOSITORY_URLS)
-        mapping = locationmap.load(sio)
-        self.check_sample_results(mapping)
+        locationmap.load(sio, "file:///does/not/exist.map", self.mapping)
+        self.check_sample_results(self.mapping)
 
     def test_load_without_base_update(self):
         # Make sure that an existing mapping is updated, not ignored,
@@ -78,7 +83,7 @@
         sio = StringIO(SAMPLE_INPUT_WITHOUT_REPOSITORY_URLS)
         d = {"other":   "over-there",
              "ZConfig": "http://www.example.org/"}
-        mapping = locationmap.load(sio, mapping=d)
+        locationmap.load(sio, "file:///does/not/exist.map", d)
         self.assertEqual(d.pop("other"), "over-there")
         self.assertEqual(d["ZConfig"], "http://www.example.org/")
         # Slam in the expected result, now that we've checked the
@@ -88,11 +93,12 @@
 
     def test_load_with_cvs_base(self):
         sio = StringIO(SAMPLE_INPUT_WITH_REPOSITORY_URLS)
-        mapping = locationmap.load(
-            sio, "cvs://cvs.example.org:ext/cvsroot:module")
-        self.check_sample_results(mapping)
+        locationmap.load(
+            sio, "cvs://cvs.example.org:ext/cvsroot:module",
+            self.mapping)
+        self.check_sample_results(self.mapping)
 
-    def test_load_with_file_base(self):
+    def test_fromPathOrUrl_with_url(self):
         dirname = os.path.dirname(os.path.abspath(__file__))
         dirname = os.path.join(dirname, "input")
         fn = os.path.join(dirname, "packages.map")
@@ -104,6 +110,26 @@
         self.assertEqual(map["collection:collection-2"],
                          base + "/collection-2/")
 
+    def test_fromPathOrUrl_with_path(self):
+        # create a directory that contains no revision control stuff:
+        dirpath = tempfile.mkdtemp()
+        # compute paths:
+        here = os.path.dirname(os.path.abspath(__file__))
+        input = os.path.join(here, "input", "packages.map")
+        output = os.path.join(dirpath, "packages.map")
+        try:
+            # copy in our sample input:
+            shutil.copy(input, output)
+            # check the map:
+            map = locationmap.fromPathOrUrl(output)
+            base = urlutils.file_url(dirpath)
+            self.assertEqual(map["collection:collection-1"],
+                             base + "/collection-1/")
+            self.assertEqual(map["collection:collection-2"],
+                             base + "/collection-2/")
+        finally:
+            shutil.rmtree(dirpath)
+
     def check_sample_results(self, mapping):
         d = {}
         d.update(mapping)
@@ -125,31 +151,32 @@
     def check_error(self, input):
         sio = StringIO(input)
         try:
-            locationmap.load(sio)
+            locationmap.load(sio, "file:///does/not/exist.map",
+                             self.mapping)
         except locationmap.MapLoadingError, e:
             self.assertEqual(e.lineno, 1)
         else:
             self.fail("expected MapLoadingError")
 
     def test_duplicate_entry_generates_warning(self):
-        map = self.check_duplicate_entry_generates_warning("r1")
-        self.assertEqual(len(map), 1)
+        self.check_duplicate_entry_generates_warning("r1")
+        self.assertEqual(len(self.mapping), 1)
 
     def test_duplicate_wildcard_generates_warning(self):
-        map = self.check_duplicate_entry_generates_warning("pkg.*")
-        # len(map) == 0, but it's not clear we care at this point;
+        self.check_duplicate_entry_generates_warning("pkg.*")
+        # len(self.mapping) == 0, but it's not clear we care at this point;
         # wildcards make the len() pretty questionable
 
     def check_duplicate_entry_generates_warning(self, resource_name):
         sio = StringIO("%s cvs://cvs.example.org/cvsroot:foo\n"
                        "%s cvs://cvs.example.org/cvsroot:foo\n"
                        % (resource_name, resource_name))
-        map = self.collect_warnings(locationmap.load, sio)
+        self.collect_warnings(
+            locationmap.load, sio, "file:///does/not/exist.map", self.mapping)
         self.assertEqual(len(self.warnings), 1)
         r = self.warnings[0]
         self.assertEqual(r.levelno, logging.WARNING)
         self.assertEqual(r.name, "zpkgtools.locationmap")
-        return map
 
     def collect_warnings(self, callable, *args, **kw):
         self.warnings = []
@@ -165,22 +192,32 @@
         sio = StringIO("foo.*  cvs://cvs.example.org/cvsroot:foo\n"
                        "bar.*  file:///some/path/\n"
                        "bat.*  some/path\n")
-        map = locationmap.load(sio)
+
+        old_getcwd = os.getcwd
+        os.getcwd = lambda: "/home/dudette/python/project"
+
+        try:
+            locationmap.load(
+                sio, "file:///home/dudette/python/project/", self.mapping)
+        finally:
+            os.getcwd = old_getcwd
+
         eq = self.assertEqual
-        self.assert_("foo.bar" in map)
-        self.assert_("bar.foo" in map)
-        self.assert_("bat.splat.funk" in map)
-        eq(map["foo.bar"], "cvs://cvs.example.org/cvsroot:foo/bar")
-        eq(map["bar.foo"], "file:///some/path/foo")
-        eq(map["bat.splat.funk"], "some/path/splat/funk")
+        self.assert_("foo.bar" in self.mapping)
+        self.assert_("bar.foo" in self.mapping)
+        self.assert_("bat.splat.funk" in self.mapping)
+        eq(self.mapping["foo.bar"], "cvs://cvs.example.org/cvsroot:foo/bar")
+        eq(self.mapping["bar.foo"], "file:///some/path/foo")
+        eq(self.mapping["bat.splat.funk"],
+           "file:///home/dudette/python/project/some/path/splat/funk")
 
     def test_unmatched_wildcard(self):
         sio = StringIO("foo.bar.*  some/path\n")
-        map = locationmap.load(sio)
+        locationmap.load(sio, "file:///does/not/exist.map", self.mapping)
         eq = self.assertEqual
-        self.assert_("foo" not in map)
-        self.assert_("foo.bar" not in map)
-        self.assert_("foo.bar.bat" in map)
+        self.assert_("foo" not in self.mapping)
+        self.assert_("foo.bar" not in self.mapping)
+        self.assert_("foo.bar.bat" in self.mapping)
 
     def test_invalid_wildcards(self):
         self.check_error("not-a-package.*           some/path \n")
@@ -192,11 +229,33 @@
 
     def test_wildcards_with_subversion_tags(self):
         sio = StringIO("foo.* svn://svn.example.org/proj/tags/*/path\n")
-        map = locationmap.load(sio)
-        eq = self.assertEqual
-        eq(map["foo.bar"], "svn://svn.example.org/proj/tags/*/path/bar")
+        locationmap.load(sio, "file:///does/not/exist.map", self.mapping)
+        self.assertEqual(self.mapping["foo.bar"],
+                         "svn://svn.example.org/proj/tags/*/path/bar")
 
+    def test_load_w_relative_paths(self):
+        map_file = StringIO('''
+foo     svn+ssh://svn.zope.org/repos/main/Foo/trunk/src/foo
+bar     ../../bar
+baz     baz
+spam    file://spam.com/spam
+tools   cvs://[email protected]:pserver/'''
+      '''cvsroot/python:python/n\ondist/sandbox/setuptools/setuptools
+        ''')
 
+        old_getcwd = os.getcwd
+        os.getcwd = lambda: '/home/dudette/python/project'
+
+        try:
+            locationmap.load(map_file, 'http://acme.com/xxx', self.mapping)
+        finally:
+            os.getcwd = old_getcwd
+
+        self.assertEqual(
+            self.mapping['foo'],
+            'svn+ssh://svn.zope.org/repos/main/Foo/trunk/src/foo')
+
+
 class CollectingHandler(logging.Handler):
     """Log handler that simply collects emitted warning records."""
 

_______________________________________________
Zope-CVS maillist  -  [email protected]
http://mail.zope.org/mailman/listinfo/zope-cvs

Zope CVS instructions: http://dev.zope.org/CVS
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.