summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-09-18 03:37:52 +0000
committerChris McDonough <chrism@agendaless.com>2009-09-18 03:37:52 +0000
commit600ea3d5c50c1907e5f389d3040644543fae9077 (patch)
tree725073bb67b91af507797f0ea709ed67304793af
parent43514664d60d00721bfe9b32d68c5d9dcdb2419a (diff)
downloadpyramid-600ea3d5c50c1907e5f389d3040644543fae9077.tar.gz
pyramid-600ea3d5c50c1907e5f389d3040644543fae9077.tar.bz2
pyramid-600ea3d5c50c1907e5f389d3040644543fae9077.zip
Centralize resource_spec code.
-rw-r--r--repoze/bfg/path.py4
-rw-r--r--repoze/bfg/renderers.py23
-rw-r--r--repoze/bfg/resource.py9
-rw-r--r--repoze/bfg/tests/test_resource.py21
-rw-r--r--repoze/bfg/view.py11
-rw-r--r--repoze/bfg/zcml.py14
6 files changed, 50 insertions, 32 deletions
diff --git a/repoze/bfg/path.py b/repoze/bfg/path.py
index 6963d651f..db9efbf8d 100644
--- a/repoze/bfg/path.py
+++ b/repoze/bfg/path.py
@@ -54,3 +54,7 @@ def package_path(package):
# this is only an optimization, ignore any error
pass
return prefix
+
+
+
+
diff --git a/repoze/bfg/renderers.py b/repoze/bfg/renderers.py
index c5aed2906..840896f0e 100644
--- a/repoze/bfg/renderers.py
+++ b/repoze/bfg/renderers.py
@@ -10,6 +10,8 @@ from repoze.bfg.settings import get_settings
from repoze.bfg.interfaces import IRendererFactory
from repoze.bfg.interfaces import ITemplateRenderer
+from repoze.bfg.resource import resource_spec
+
try:
import json
except ImportError:
@@ -45,30 +47,23 @@ def template_renderer_factory(path, impl, level=3):
else:
# 'path' is a relative filename or a package:relpath spec
- if ':' in path:
- # it's a package:relpath spec
- spec = path.split(':', 1)
- utility_name = path
- else:
- # it's a relpath only
- package = caller_package(level=level)
- spec = (package.__name__, path)
- utility_name = '%s:%s' % spec # utility name must be a string
- renderer = queryUtility(ITemplateRenderer, name=utility_name)
+ spec = resource_spec(path, caller_package(level=level).__name__)
+ renderer = queryUtility(ITemplateRenderer, name=spec)
if renderer is None:
# service unit tests here by trying the relative path
# string as the utility name directly
renderer = queryUtility(ITemplateRenderer, name=path)
+ pkg, path = spec.split(':', 1)
if renderer is None:
- if not pkg_resources.resource_exists(*spec):
- raise ValueError('Missing template resource: %s' % utility_name)
- abspath = pkg_resources.resource_filename(*spec)
+ if not pkg_resources.resource_exists(pkg, path):
+ raise ValueError('Missing template resource: %s' % spec)
+ abspath = pkg_resources.resource_filename(pkg, path)
renderer = impl(abspath)
if not _reload_resources():
# cache the template
sm = getSiteManager()
sm.registerUtility(renderer, ITemplateRenderer,
- name=utility_name)
+ name=spec)
return renderer
diff --git a/repoze/bfg/resource.py b/repoze/bfg/resource.py
index babbbf84f..2b3101511 100644
--- a/repoze/bfg/resource.py
+++ b/repoze/bfg/resource.py
@@ -1,3 +1,5 @@
+import os
+
import pkg_resources
from zope.component import queryUtility
from zope.interface import implements
@@ -167,3 +169,10 @@ class FileOverride:
if resource_name == self.path:
return self.package, self.prefix
+def resource_spec(spec, package_name):
+ if os.path.isabs(spec):
+ return spec
+ if ':' in spec:
+ return spec
+ return '%s:%s' % (package_name, spec)
+
diff --git a/repoze/bfg/tests/test_resource.py b/repoze/bfg/tests/test_resource.py
index c07699893..efdc15c63 100644
--- a/repoze/bfg/tests/test_resource.py
+++ b/repoze/bfg/tests/test_resource.py
@@ -340,6 +340,27 @@ class TestDirectoryOverride(unittest.TestCase):
o = self._makeOne('foo/', 'package', 'bar/')
result = o('baz/notfound.pt')
self.assertEqual(result, None)
+
+class Test_resource_spec(unittest.TestCase):
+ def _callFUT(self, path, package):
+ from repoze.bfg.resource import resource_spec
+ return resource_spec(path, package)
+
+ def test_abspath(self):
+ import os
+ here = os.path.dirname(__file__)
+ path= os.path.abspath(here)
+ self.assertEqual(self._callFUT(path, 'apackage'), path)
+
+ def test_rel_spec(self):
+ pkg, path = 'repoze.bfg.tests', 'test_resource.py'
+ self.assertEqual(self._callFUT(path, pkg),
+ 'repoze.bfg.tests:test_resource.py')
+
+ def test_abs_spec(self):
+ pkg, path = 'repoze.bfg.tests', 'repoze.bfg.nottests:test_resource.py'
+ self.assertEqual(self._callFUT(path, pkg),
+ 'repoze.bfg.nottests:test_resource.py')
class TestFileOverride(unittest.TestCase):
diff --git a/repoze/bfg/view.py b/repoze/bfg/view.py
index 12c8b6f46..aa164f432 100644
--- a/repoze/bfg/view.py
+++ b/repoze/bfg/view.py
@@ -39,6 +39,7 @@ from repoze.bfg.security import Unauthorized
from repoze.bfg.settings import get_settings
from repoze.bfg.static import PackageURLParser
from repoze.bfg.renderers import renderer_from_name
+from repoze.bfg.resource import resource_spec
try:
all = all
@@ -188,13 +189,9 @@ class static(object):
if os.path.isabs(root_dir):
self.app = StaticURLParser(root_dir, cache_max_age=cache_max_age)
return
- # not os.path.isabs below for windows systems
- if (':' in root_dir) and (not os.path.isabs(root_dir)):
- package_name, root_dir = root_dir.split(':', 1)
- else:
- if package_name is None:
- package_name = caller_package().__name__
-
+ caller_package_name = caller_package().__name__
+ spec = resource_spec(root_dir, package_name or caller_package_name)
+ package_name, root_dir = spec.split(':', 1)
self.app = PackageURLParser(package_name, root_dir,
cache_max_age=cache_max_age)
diff --git a/repoze/bfg/zcml.py b/repoze/bfg/zcml.py
index bbfc8164e..29e54df28 100644
--- a/repoze/bfg/zcml.py
+++ b/repoze/bfg/zcml.py
@@ -43,6 +43,7 @@ from repoze.bfg.interfaces import IRendererFactory
from repoze.bfg.path import package_name
from repoze.bfg.resource import PackageOverrides
+from repoze.bfg.resource import resource_spec
from repoze.bfg.request import create_route_request_factory
@@ -159,11 +160,7 @@ def view(
score = sys.maxint
if renderer and '.' in renderer:
- if (not ':' in renderer) and (not os.path.isabs(renderer) ):
- # if it's not a package:relative/name and it's not an
- # /absolute/path it's a relative/path; this means its relative
- # to the package in which the ZCML file is defined.
- renderer = '%s:%s' % (package_name(_context.resolve('.')), renderer)
+ renderer = resource_spec(renderer, package_name(_context.resolve('.')))
def register():
derived_view = derive_view(view, permission, predicates, attr, renderer,
@@ -502,12 +499,7 @@ class IStaticDirective(Interface):
def static(_context, name, path, cache_max_age=3600):
""" Handle ``static`` ZCML directives
"""
- if (not ':' in path) and (not os.path.isabs(path)):
- # if it's not a package:relative/name and it's not an
- # /absolute/path it's a relative/path; this means its relative
- # to the package in which the ZCML file is defined.
- path = '%s:%s' % (package_name(_context.resolve('.')), path)
-
+ path = resource_spec(path, package_name(_context.resolve('.')))
view = static_view(path, cache_max_age=cache_max_age)
route(_context, name, "%s*subpath" % name, view=view,
view_for=StaticRootFactory, factory=StaticRootFactory(path))