summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-06-29 10:18:10 +0000
committerChris McDonough <chrism@agendaless.com>2009-06-29 10:18:10 +0000
commit5f4b80e5a1508116271ae8a6087834fff8ee3825 (patch)
tree36e941f40eb305add61f03381175b22e4c4e4297
parent60f06a229856bfd69edf2307ad80772563531a90 (diff)
downloadpyramid-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.txt15
-rw-r--r--repoze/bfg/path.py10
-rw-r--r--repoze/bfg/resource.py2
-rw-r--r--repoze/bfg/templating.py6
-rw-r--r--repoze/bfg/tests/test_path.py27
-rw-r--r--repoze/bfg/tests/test_templating.py5
-rw-r--r--repoze/bfg/tests/test_zcml.py36
-rw-r--r--repoze/bfg/zcml.py8
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)')