summaryrefslogtreecommitdiff
path: root/repoze
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2008-08-29 03:21:27 +0000
committerChris McDonough <chrism@agendaless.com>2008-08-29 03:21:27 +0000
commitc750baac5bc6ceacdf5f58ce290324413c6c82b6 (patch)
treeb5bc53074c7e0b7fa5f105e285a7fe0e678a2373 /repoze
parent6acc73eb70fa5e15f517eefdf0370a5078e7decc (diff)
downloadpyramid-c750baac5bc6ceacdf5f58ce290324413c6c82b6.tar.gz
pyramid-c750baac5bc6ceacdf5f58ce290324413c6c82b6.tar.bz2
pyramid-c750baac5bc6ceacdf5f58ce290324413c6c82b6.zip
model_path and *backwards incompatible change* removing "make_app" and "get_options" from __init__.py of repoze.bfg; use repoze.bfg.router:make_app and repoze.bfg.registry:get_options instead.
Diffstat (limited to 'repoze')
-rw-r--r--repoze/bfg/__init__.py8
-rw-r--r--repoze/bfg/paster_template/+package+/run.py_tmpl4
-rw-r--r--repoze/bfg/path.py1
-rw-r--r--repoze/bfg/tests/test_traversal.py38
-rw-r--r--repoze/bfg/traversal.py24
5 files changed, 49 insertions, 26 deletions
diff --git a/repoze/bfg/__init__.py b/repoze/bfg/__init__.py
index e603a8fac..de40ea7ca 100644
--- a/repoze/bfg/__init__.py
+++ b/repoze/bfg/__init__.py
@@ -1,7 +1 @@
-try:
- from repoze.bfg.router import make_app # for import elsewhere
- from repoze.bfg.registry import get_options # for import elsewhere
-except ImportError:
- # don't try so hard that we cause setup.py test to fail when the
- # right modules aren't installed.
- pass
+__import__('pkg_resources').declare_namespace(__name__)
diff --git a/repoze/bfg/paster_template/+package+/run.py_tmpl b/repoze/bfg/paster_template/+package+/run.py_tmpl
index 4b3322bce..42bc0ef02 100644
--- a/repoze/bfg/paster_template/+package+/run.py_tmpl
+++ b/repoze/bfg/paster_template/+package+/run.py_tmpl
@@ -1,5 +1,5 @@
-from repoze.bfg import make_app
-from repoze.bfg import get_options
+from repoze.bfg.router import make_app
+from repoze.bfg.registry import get_options
def app(global_config, **kw):
# paster app config callback
diff --git a/repoze/bfg/path.py b/repoze/bfg/path.py
index fcd317fba..68fa4ede4 100644
--- a/repoze/bfg/path.py
+++ b/repoze/bfg/path.py
@@ -9,6 +9,7 @@ def caller_path(path, level=2):
prefix = package_path(package)
path = os.path.join(prefix, path)
return path
+ return os.path.normpath(path)
def package_path(package):
return os.path.abspath(os.path.dirname(package.__file__))
diff --git a/repoze/bfg/tests/test_traversal.py b/repoze/bfg/tests/test_traversal.py
index a61a324e2..eba543cdb 100644
--- a/repoze/bfg/tests/test_traversal.py
+++ b/repoze/bfg/tests/test_traversal.py
@@ -246,19 +246,6 @@ class FindModelTests(unittest.TestCase):
self._registerTraverser(traverser)
result = find(baz, '/')
self.assertEqual(result, dummy)
-
- def test_absolute_found(self):
- dummy = DummyContext()
- baz = DummyContext()
- baz.__parent__ = dummy
- baz.__name__ = 'baz'
- dummy.__parent__ = None
- dummy.__name__ = None
- find = self._getFUT()
- traverser = make_traverser(dummy, '', [])
- self._registerTraverser(traverser)
- result = find(baz, '/')
- self.assertEqual(result, dummy)
self.assertEqual(dummy.wascontext, True)
def test_absolute_notfound(self):
@@ -274,6 +261,31 @@ class FindModelTests(unittest.TestCase):
self.assertRaises(KeyError, find, baz, '/')
self.assertEqual(dummy.wascontext, True)
+class ModelPathTests(unittest.TestCase):
+ def _getFUT(self):
+ from repoze.bfg.traversal import model_path
+ return model_path
+
+ def test_it(self):
+ baz = DummyContext()
+ bar = DummyContext(baz)
+ foo = DummyContext(bar)
+ root = DummyContext(foo)
+ root.__parent__ = None
+ root.__name__ = None
+ foo.__parent__ = root
+ foo.__name__ = 'foo '
+ bar.__parent__ = foo
+ bar.__name__ = 'bar'
+ baz.__parent__ = bar
+ baz.__name__ = 'baz'
+ request = DummyRequest()
+ model_path = self._getFUT()
+ request = DummyRequest()
+ result = model_path(baz, 'this/theotherthing', 'that')
+ self.assertEqual(result, '/foo /bar/baz/this/theotherthing/that')
+
+
def make_traverser(*args):
class DummyTraverser(object):
def __init__(self, context):
diff --git a/repoze/bfg/traversal.py b/repoze/bfg/traversal.py
index e307cae0c..dcbecf2ff 100644
--- a/repoze/bfg/traversal.py
+++ b/repoze/bfg/traversal.py
@@ -106,10 +106,11 @@ def find_interface(model, interface):
def model_url(model, request, *elements):
""" Return the absolute URL of the model object based on the
``wsgi.url_scheme``, ``HTTP_HOST`` or ``SERVER_NAME`` in the
- request, plus any ``SCRIPT_NAME``. Any positional passed in as
- ``elements`` will be joined by slashes and appended to the
- generated URL. The passed in elements are *not* URL-quoted. The
- ``model`` passed in must be :term:`location`-aware."""
+ request, plus any ``SCRIPT_NAME``. Any positional arguments
+ passed in as ``elements`` will be joined by slashes and appended
+ to the generated URL. The passed in elements are *not*
+ URL-quoted. The ``model`` passed in must be
+ :term:`location`-aware."""
rpath = []
for location in LocationIterator(model):
if location.__name__:
@@ -118,3 +119,18 @@ def model_url(model, request, *elements):
path.extend(elements)
path = '/'.join(path)
return urlparse.urljoin(request.application_url, path)
+
+def model_path(model, *elements):
+ """ Return a string representing the absolute path of the model
+ object based on its position in the model graph, e.g
+ ``/foo/bar``. Any positional arguments passed in as ``elements``
+ will be joined by slashes and appended to the generated path. The
+ ``model`` passed in must be :term:`location`-aware."""
+ rpath = []
+ for location in LocationIterator(model):
+ if location.__name__:
+ rpath.append(location.__name__)
+ path = list(reversed(rpath))
+ path.extend(elements)
+ path.insert(0, '')
+ return '/'.join(path)