From c750baac5bc6ceacdf5f58ce290324413c6c82b6 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Fri, 29 Aug 2008 03:21:27 +0000 Subject: 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. --- repoze/bfg/__init__.py | 8 +---- repoze/bfg/paster_template/+package+/run.py_tmpl | 4 +-- repoze/bfg/path.py | 1 + repoze/bfg/tests/test_traversal.py | 38 ++++++++++++++++-------- repoze/bfg/traversal.py | 24 ++++++++++++--- 5 files changed, 49 insertions(+), 26 deletions(-) (limited to 'repoze') 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 @@ -234,19 +234,6 @@ class FindModelTests(unittest.TestCase): self._registerTraverser(traverser) self.assertRaises(KeyError, find, dummy, 'baz') - 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) - def test_absolute_found(self): dummy = DummyContext() baz = DummyContext() @@ -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) -- cgit v1.2.3