diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-06-29 10:18:10 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-06-29 10:18:10 +0000 |
| commit | 5f4b80e5a1508116271ae8a6087834fff8ee3825 (patch) | |
| tree | 36e941f40eb305add61f03381175b22e4c4e4297 | |
| parent | 60f06a229856bfd69edf2307ad80772563531a90 (diff) | |
| download | pyramid-5f4b80e5a1508116271ae8a6087834fff8ee3825.tar.gz pyramid-5f4b80e5a1508116271ae8a6087834fff8ee3825.tar.bz2 pyramid-5f4b80e5a1508116271ae8a6087834fff8ee3825.zip | |
- Use ``caller_package`` function instead of ``caller_module``
function within ``templating`` to avoid needing to name the caller
module in resource overrides (actually match docs).
- Make it possible to override templates stored directly in a module
with templates in a subdirectory of the same module, stored directly
within another module, or stored in a subdirectory of another module
(actually match docs).
| -rw-r--r-- | CHANGES.txt | 15 | ||||
| -rw-r--r-- | repoze/bfg/path.py | 10 | ||||
| -rw-r--r-- | repoze/bfg/resource.py | 2 | ||||
| -rw-r--r-- | repoze/bfg/templating.py | 6 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_path.py | 27 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_templating.py | 5 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_zcml.py | 36 | ||||
| -rw-r--r-- | repoze/bfg/zcml.py | 8 |
8 files changed, 98 insertions, 11 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index e69e3b594..2ae751fef 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,3 +1,18 @@ +Next release +============ + +Bug Fixes +--------- + +- Use ``caller_package`` function instead of ``caller_module`` + function within ``templating`` to avoid needing to name the caller + module in resource overrides (actually match docs). + +- Make it possible to override templates stored directly in a module + with templates in a subdirectory of the same module, stored directly + within another module, or stored in a subdirectory of another module + (actually match docs). + 1.0a5 (2009-06-28) ================== diff --git a/repoze/bfg/path.py b/repoze/bfg/path.py index 5b827f04b..b79ff3816 100644 --- a/repoze/bfg/path.py +++ b/repoze/bfg/path.py @@ -16,6 +16,16 @@ def caller_module(level=2): module = sys.modules[module_name] return module +def caller_package(level=2, caller_module=caller_module): + # caller_module in arglist for tests + module = caller_module(level+1) + if '__init__.py' in module.__file__: + # Module is a package + return module + # Go up one level to get package + package_name = module.__name__.rsplit('.', 1)[0] + return sys.modules[package_name] + def package_path(package): # computing the abspath is actually kinda expensive so we memoize # the result diff --git a/repoze/bfg/resource.py b/repoze/bfg/resource.py index 00e30170d..d11993e5b 100644 --- a/repoze/bfg/resource.py +++ b/repoze/bfg/resource.py @@ -53,7 +53,7 @@ class PackageOverrides: self.overridden_package = overridden_package def insert(self, path, package, prefix): - if path.endswith('/'): + if not path or path.endswith('/'): override = DirectoryOverride(path, package, prefix) else: override = FileOverride(path, package, prefix) diff --git a/repoze/bfg/templating.py b/repoze/bfg/templating.py index 337621eef..a81726bb9 100644 --- a/repoze/bfg/templating.py +++ b/repoze/bfg/templating.py @@ -2,7 +2,7 @@ import pkg_resources from zope.component import queryUtility from repoze.bfg.interfaces import ITemplateRenderer from zope.component import getSiteManager -from repoze.bfg.path import caller_module +from repoze.bfg.path import caller_package import os def renderer_from_cache(path, factory, level=3, **kw): @@ -19,8 +19,8 @@ def renderer_from_cache(path, factory, level=3, **kw): else: # 'path' is a relative filename - module = caller_module(level=level) - spec = (module.__name__, path) + package = caller_package(level=level) + spec = (package.__name__, path) utility_name = '%s\t%s' % spec # utility name must be a string :-( renderer = queryUtility(ITemplateRenderer, name=utility_name) if renderer is None: diff --git a/repoze/bfg/tests/test_path.py b/repoze/bfg/tests/test_path.py index e8068e52d..636481fde 100644 --- a/repoze/bfg/tests/test_path.py +++ b/repoze/bfg/tests/test_path.py @@ -55,6 +55,33 @@ class TestCallerModule(unittest.TestCase): import unittest result = self._callFUT(3) self.assertEqual(result, unittest) + +class TestCallerPackage(unittest.TestCase): + def _callFUT(self, *arg, **kw): + from repoze.bfg.path import caller_package + return caller_package(*arg, **kw) + + def test_it_level_1(self): + from repoze.bfg import tests + result = self._callFUT(1) + self.assertEqual(result, tests) + + def test_it_level_2(self): + from repoze.bfg import tests + result = self._callFUT(2) + self.assertEqual(result, tests) + + def test_it_level_3(self): + import unittest + result = self._callFUT(3) + self.assertEqual(result, unittest) + + def test_it_package(self): + import repoze.bfg.tests + def dummy_caller_module(*arg): + return repoze.bfg.tests + result = self._callFUT(1, caller_module=dummy_caller_module) + self.assertEqual(result, repoze.bfg.tests) class TestPackagePath(unittest.TestCase): def _callFUT(self, package): diff --git a/repoze/bfg/tests/test_templating.py b/repoze/bfg/tests/test_templating.py index 3ae0483d9..d413acc2e 100644 --- a/repoze/bfg/tests/test_templating.py +++ b/repoze/bfg/tests/test_templating.py @@ -54,8 +54,8 @@ class TestRendererFromCache(unittest.TestCase): def test_relpath_alreadyregistered(self): from repoze.bfg.interfaces import ITemplateRenderer - from repoze.bfg.tests import test_templating - module_name = test_templating.__name__ + from repoze.bfg import tests + module_name = tests.__name__ relpath = 'test_templating.py' spec = '%s\t%s' % (module_name, relpath) renderer = {} @@ -64,7 +64,6 @@ class TestRendererFromCache(unittest.TestCase): self.failUnless(result is renderer) def test_relpath_notyetregistered(self): - from repoze.bfg import resource import os from repoze.bfg.tests import test_templating module_name = test_templating.__name__ diff --git a/repoze/bfg/tests/test_zcml.py b/repoze/bfg/tests/test_zcml.py index a8eec3d48..cba460a0a 100644 --- a/repoze/bfg/tests/test_zcml.py +++ b/repoze/bfg/tests/test_zcml.py @@ -897,6 +897,42 @@ class TestResourceDirective(unittest.TestCase): self.assertEqual(action['args'], ('IDummy', 'foo.pt', 'IDummy', 'foo.pt')) + def test_override_module_with_directory(self): + from repoze.bfg.zcml import _override + context = DummyContext() + self._callFUT(context, 'a', 'b:foo/') + actions = context.actions + self.assertEqual(len(actions), 1) + action = actions[0] + self.assertEqual(action['callable'], _override) + self.assertEqual(action['discriminator'], None) + self.assertEqual(action['args'], + ('IDummy', '', 'IDummy', 'foo/')) + + def test_override_directory_with_module(self): + from repoze.bfg.zcml import _override + context = DummyContext() + self._callFUT(context, 'a:foo/', 'b') + actions = context.actions + self.assertEqual(len(actions), 1) + action = actions[0] + self.assertEqual(action['callable'], _override) + self.assertEqual(action['discriminator'], None) + self.assertEqual(action['args'], + ('IDummy', 'foo/', 'IDummy', '')) + + def test_override_module_with_module(self): + from repoze.bfg.zcml import _override + context = DummyContext() + self._callFUT(context, 'a', 'b') + actions = context.actions + self.assertEqual(len(actions), 1) + action = actions[0] + self.assertEqual(action['callable'], _override) + self.assertEqual(action['discriminator'], None) + self.assertEqual(action['args'], + ('IDummy', '', 'IDummy', '')) + class Test_OverrideFunction(unittest.TestCase): def setUp(self): cleanUp() diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py index 14b843bb1..1aedd88e4 100644 --- a/repoze/bfg/zcml.py +++ b/repoze/bfg/zcml.py @@ -202,14 +202,14 @@ def resource(context, to_override, override_with): if ':' in override_with: override_package, override_prefix = override_with.split(':', 1) - if path.endswith('/'): - if not override_prefix.endswith('/'): + if path and path.endswith('/'): + if override_prefix and (not override_prefix.endswith('/')): raise ConfigurationError( 'A directory cannot be overridden with a file (put a slash ' 'at the end of override_with if necessary)') - if override_prefix.endswith('/'): - if not path.endswith('/'): + if override_prefix and override_prefix.endswith('/'): + if path and (not path.endswith('/')): raise ConfigurationError( 'A file cannot be overridden with a directory (put a slash ' 'at the end of to_override if necessary)') |
