From 600ea3d5c50c1907e5f389d3040644543fae9077 Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Fri, 18 Sep 2009 03:37:52 +0000 Subject: Centralize resource_spec code. --- repoze/bfg/path.py | 4 ++++ repoze/bfg/renderers.py | 23 +++++++++-------------- repoze/bfg/resource.py | 9 +++++++++ repoze/bfg/tests/test_resource.py | 21 +++++++++++++++++++++ repoze/bfg/view.py | 11 ++++------- repoze/bfg/zcml.py | 14 +++----------- 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)) -- cgit v1.2.3