diff options
| author | Chris McDonough <chrism@agendaless.com> | 2009-07-22 19:14:27 +0000 |
|---|---|---|
| committer | Chris McDonough <chrism@agendaless.com> | 2009-07-22 19:14:27 +0000 |
| commit | 3099cfbbe404aaed7004e421aab09cf77b285c1a (patch) | |
| tree | 205785be7bd36d55e127ad44faaf873d6c910b88 | |
| parent | b8e2b16985c7e5b4cabf87be73c6384266b8d3b6 (diff) | |
| download | pyramid-3099cfbbe404aaed7004e421aab09cf77b285c1a.tar.gz pyramid-3099cfbbe404aaed7004e421aab09cf77b285c1a.tar.bz2 pyramid-3099cfbbe404aaed7004e421aab09cf77b285c1a.zip | |
- 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.
| -rw-r--r-- | CHANGES.txt | 6 | ||||
| -rw-r--r-- | repoze/bfg/resource.py | 43 | ||||
| -rw-r--r-- | repoze/bfg/tests/test_resource.py | 84 |
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): |
