diff options
| author | Chris McDonough <chrism@agendaless.com> | 2008-08-29 03:21:27 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2008-08-29 03:21:27 +0000 |
| commit | c750baac5bc6ceacdf5f58ce290324413c6c82b6 (patch) | |
| tree | b5bc53074c7e0b7fa5f105e285a7fe0e678a2373 | |
| parent | 6acc73eb70fa5e15f517eefdf0370a5078e7decc (diff) | |
| download | pyramid-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.txt | 23 | ||||
| -rw-r--r-- | docs/api/traversal.rst | 1 | ||||
| -rw-r--r-- | docs/notes.txt | 6 | ||||
| -rw-r--r-- | repoze/bfg/__init__.py | 8 | ||||
| -rw-r--r-- | repoze/bfg/paster_template/+package+/run.py_tmpl | 4 | ||||
| -rw-r--r-- | repoze/bfg/path.py | 1 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_traversal.py | 38 | ||||
| -rw-r--r-- | repoze/bfg/traversal.py | 24 | ||||
| -rw-r--r-- | setup.py | 2 |
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) @@ -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', |
