summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.txt6
-rw-r--r--repoze/bfg/resource.py43
-rw-r--r--repoze/bfg/tests/test_resource.py84
3 files changed, 132 insertions, 1 deletions
diff --git a/CHANGES.txt b/CHANGES.txt
index cd079950b..8e02a5bea 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,6 +1,12 @@
Next release
============
+- Added support for ``has_resource``, ``resource_isdir``, and
+ ``resource_listdir`` to the resource "OverrideProvider"; this fixes
+ a bug with a symptom that a file could not be overridden in a
+ resource directory unless a file with the same name existed in the
+ original directory being overridden.
+
- Fixed documentation bug showing invalid test for values from the
``matchdict``: they are stored as attributes of the ``Article``, rather
than subitems.
diff --git a/repoze/bfg/resource.py b/repoze/bfg/resource.py
index 276c52878..babbbf84f 100644
--- a/repoze/bfg/resource.py
+++ b/repoze/bfg/resource.py
@@ -46,6 +46,33 @@ class OverrideProvider(pkg_resources.DefaultProvider):
return pkg_resources.DefaultProvider.get_resource_string(
self, manager, resource_name)
+ def has_resource(self, resource_name):
+ overrides = self._get_overrides()
+ if overrides is not None:
+ result = overrides.has_resource(resource_name)
+ if result is not None:
+ return result
+ return pkg_resources.DefaultProvider.has_resource(
+ self, resource_name)
+
+ def resource_isdir(self, resource_name):
+ overrides = self._get_overrides()
+ if overrides is not None:
+ result = overrides.isdir(resource_name)
+ if result is not None:
+ return result
+ return pkg_resources.DefaultProvider.resource_isdir(
+ self, resource_name)
+
+ def resource_listdir(self, resource_name):
+ overrides = self._get_overrides()
+ if overrides is not None:
+ result = overrides.listdir(resource_name)
+ if result is not None:
+ return result
+ return pkg_resources.DefaultProvider.resource_listdir(
+ self, resource_name)
+
class PackageOverrides:
implements(IPackageOverrides)
# pkg_resources arg in kw args below for testing
@@ -102,6 +129,22 @@ class PackageOverrides:
if pkg_resources.resource_exists(package, rname):
return pkg_resources.resource_string(package, rname)
+ def has_resource(self, resource_name):
+ for package, rname in self.search_path(resource_name):
+ if pkg_resources.resource_exists(package, rname):
+ return True
+
+ def isdir(self, resource_name):
+ for package, rname in self.search_path(resource_name):
+ if pkg_resources.resource_exists(package, rname):
+ return pkg_resources.resource_isdir(package, rname)
+
+ def listdir(self, resource_name):
+ for package, rname in self.search_path(resource_name):
+ if pkg_resources.resource_exists(package, rname):
+ return pkg_resources.resource_listdir(package, rname)
+
+
class DirectoryOverride:
def __init__(self, path, package, prefix):
self.path = path
diff --git a/repoze/bfg/tests/test_resource.py b/repoze/bfg/tests/test_resource.py
index 5bc1be152..b3d9aedd6 100644
--- a/repoze/bfg/tests/test_resource.py
+++ b/repoze/bfg/tests/test_resource.py
@@ -52,6 +52,30 @@ class TestOverrideProvider(unittest.TestCase):
result = provider.get_resource_string(None, resource_name)
self.assertEqual(result, expected)
+ def test_has_resource_no_overrides(self):
+ resource_name = 'test_resource.py'
+ import repoze.bfg.tests
+ provider = self._makeOne(repoze.bfg.tests)
+ result = provider.has_resource(resource_name)
+ self.assertEqual(result, True)
+
+ def test_resource_isdir_no_overrides(self):
+ file_resource_name = 'test_resource.py'
+ directory_resource_name = 'fixtures'
+ import repoze.bfg.tests
+ provider = self._makeOne(repoze.bfg.tests)
+ result = provider.resource_isdir(file_resource_name)
+ self.assertEqual(result, False)
+ result = provider.resource_isdir(directory_resource_name)
+ self.assertEqual(result, True)
+
+ def test_resource_listdir_no_overrides(self):
+ resource_name = 'fixtures'
+ import repoze.bfg.tests
+ provider = self._makeOne(repoze.bfg.tests)
+ result = provider.resource_isdir(resource_name)
+ self.failUnless(result)
+
def test_get_resource_filename_override_returns_None(self):
overrides = DummyOverrides(None)
self._registerOverrides(overrides)
@@ -88,6 +112,33 @@ class TestOverrideProvider(unittest.TestCase):
result = provider.get_resource_filename(None, resource_name)
self.assertEqual(result, expected)
+ def test_has_resource_override_returns_None(self):
+ overrides = DummyOverrides(None)
+ self._registerOverrides(overrides)
+ resource_name = 'test_resource.py'
+ import repoze.bfg.tests
+ provider = self._makeOne(repoze.bfg.tests)
+ result = provider.has_resource(resource_name)
+ self.assertEqual(result, True)
+
+ def test_resource_isdir_override_returns_None(self):
+ overrides = DummyOverrides(None)
+ self._registerOverrides(overrides)
+ resource_name = 'fixtures'
+ import repoze.bfg.tests
+ provider = self._makeOne(repoze.bfg.tests)
+ result = provider.resource_isdir(resource_name)
+ self.assertEqual(result, True)
+
+ def test_resource_listdir_override_returns_None(self):
+ overrides = DummyOverrides(None)
+ self._registerOverrides(overrides)
+ resource_name = 'fixtures'
+ import repoze.bfg.tests
+ provider = self._makeOne(repoze.bfg.tests)
+ result = provider.resource_listdir(resource_name)
+ self.failUnless(result)
+
def test_get_resource_filename_override_returns_value(self):
overrides = DummyOverrides('value')
import repoze.bfg.tests
@@ -112,6 +163,30 @@ class TestOverrideProvider(unittest.TestCase):
result = provider.get_resource_string(None, 'test_resource.py')
self.assertEqual(result, 'value')
+ def test_has_resource_override_returns_True(self):
+ overrides = DummyOverrides(True)
+ import repoze.bfg.tests
+ self._registerOverrides(overrides)
+ provider = self._makeOne(repoze.bfg.tests)
+ result = provider.has_resource('test_resource.py')
+ self.assertEqual(result, True)
+
+ def test_resource_isdir_override_returns_False(self):
+ overrides = DummyOverrides(False)
+ import repoze.bfg.tests
+ self._registerOverrides(overrides)
+ provider = self._makeOne(repoze.bfg.tests)
+ result = provider.resource_isdir('fixtures')
+ self.assertEqual(result, False)
+
+ def test_resource_listdir_override_returns_values(self):
+ overrides = DummyOverrides(['a'])
+ import repoze.bfg.tests
+ self._registerOverrides(overrides)
+ provider = self._makeOne(repoze.bfg.tests)
+ result = provider.resource_listdir('fixtures')
+ self.assertEqual(result, ['a'])
+
class TestPackageOverrides(unittest.TestCase):
def _getTargetClass(self):
from repoze.bfg.resource import PackageOverrides
@@ -215,6 +290,13 @@ class TestPackageOverrides(unittest.TestCase):
expected = open(os.path.join(here, 'test_resource.py')).read()
self.assertEqual(po.get_string('whatever'), expected)
+ def test_has_resource(self):
+ overrides = [ DummyOverride(None), DummyOverride(
+ ('repoze.bfg.tests', 'test_resource.py'))]
+ package = DummyPackage('package')
+ po = self._makeOne(package)
+ po.overrides= overrides
+ self.assertEqual(po.has_resource('whatever'), True)
class TestDirectoryOverride(unittest.TestCase):
def _getTargetClass(self):
@@ -269,7 +351,7 @@ class DummyOverrides:
def get_filename(self, resource_name):
return self.result
- get_stream = get_string = get_filename
+ listdir = isdir = has_resource = get_stream = get_string = get_filename
class DummyPkgResources:
def __init__(self):