summaryrefslogtreecommitdiff
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
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.
-rw-r--r--CHANGES.txt23
-rw-r--r--docs/api/traversal.rst1
-rw-r--r--docs/notes.txt6
-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
-rw-r--r--setup.py2
9 files changed, 77 insertions, 30 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index e9c600550..33476c7b5 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,3 +1,26 @@
+Next release
+
+ Backwards incompatibilities
+
+ - Make ``repoze.bfg`` a namespace package so we can allow folks to
+ create subpackages (e.g. ``repoze.bfg.otherthing``) within
+ separate eggs. This is a backwards incompatible change which
+ makes it impossible to import "make_app" and "get_options" from
+ the ``repoze.bfg`` module directly. This change will break all
+ existing apps generated by the paster code generator. Instead,
+ you need to import these functions as
+ ``repoze.bfg.router:make_app`` and
+ ``repoze.bfg.registry:get_options``, respectively. Sorry folks,
+ it has to be done now or never, and definitely better now.
+
+ Features
+
+ - Add ``model_path`` API function to traversal module.
+
+ Bugfixes
+
+ - Normalize path returned by repoze.bfg.caller_path.
+
0.3.3 (8/23/2008)
- Fix generated test.py module to use project name rather than package
diff --git a/docs/api/traversal.rst b/docs/api/traversal.rst
index a1b9ea95f..c9fab7d98 100644
--- a/docs/api/traversal.rst
+++ b/docs/api/traversal.rst
@@ -13,5 +13,6 @@
.. autofunction:: model_url
+ .. autofunction:: model_path
diff --git a/docs/notes.txt b/docs/notes.txt
index e8d679237..6f5b896e5 100644
--- a/docs/notes.txt
+++ b/docs/notes.txt
@@ -8,9 +8,9 @@
- "push" style templating
-- .001 case where there is a template without a view.
-
- Warn if permissions are defined but no security policy is in place.
-- Change port num due to conflict with Postgres.
+- Describe better that render_template_to_response is a shortcut.
+
+- Show usage of, e.g. HTTPFound(location=url).
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)
diff --git a/setup.py b/setup.py
index 9117e3e39..15714e78a 100644
--- a/setup.py
+++ b/setup.py
@@ -45,7 +45,7 @@ setup(name='repoze.bfg',
license="BSD-derived (http://www.repoze.org/LICENSE.txt)",
packages=find_packages(),
include_package_data=True,
- namespace_packages=['repoze'],
+ namespace_packages=['repoze', 'repoze.bfg'],
zip_safe=False,
install_requires=[
'zope.interface',