From 6da01782b8ae6e3367b400cf8a075785f01b9bcc Mon Sep 17 00:00:00 2001 From: Chris McDonough Date: Mon, 22 Aug 2011 03:51:52 -0400 Subject: - Move the ``OverrideProvider``, ``PackageOverrides``, ``DirectoryOverride``, and ``FileOverride`` classes from ``pyramid.asset`` to ``pyramid.config.assets``. --- CHANGES.txt | 4 + TODO.txt | 5 +- pyramid/asset.py | 169 ---------- pyramid/config/assets.py | 171 +++++++++- pyramid/tests/test_asset.py | 442 -------------------------- pyramid/tests/test_config/fixtures/dummy.txt | 1 + pyramid/tests/test_config/test_assets.py | 447 +++++++++++++++++++++++++++ 7 files changed, 624 insertions(+), 615 deletions(-) create mode 100644 pyramid/tests/test_config/fixtures/dummy.txt create mode 100644 pyramid/tests/test_config/test_assets.py diff --git a/CHANGES.txt b/CHANGES.txt index f623ccbc3..994d8c301 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -134,6 +134,10 @@ Internal - Move the ``Settings`` class from ``pyramid.settings`` to ``pyramid.config.settings``. +- Move the ``OverrideProvider``, ``PackageOverrides``, ``DirectoryOverride``, + and ``FileOverride`` classes from ``pyramid.asset`` to + ``pyramid.config.assets``. + Deprecations ------------ diff --git a/TODO.txt b/TODO.txt index dc2d07c5b..cba1f5e02 100644 --- a/TODO.txt +++ b/TODO.txt @@ -6,9 +6,8 @@ Nice-to-Have - Flesh out "paste" chapter. -- Move config-related stuff from "renderers" to config/rendering, "asset" to - config/assets, and possibly mako/chameleon rendering stuff to - config/rendering. +- Move config-related stuff from "renderers" to config/rendering, and + possibly mako/chameleon rendering stuff to config/rendering. - _fix_registry should dictify the registry being fixed. diff --git a/pyramid/asset.py b/pyramid/asset.py index 0f8483c6b..730969a4a 100644 --- a/pyramid/asset.py +++ b/pyramid/asset.py @@ -1,177 +1,8 @@ import os import pkg_resources -from zope.interface import implements - -from pyramid.interfaces import IPackageOverrides - from pyramid.path import package_path from pyramid.path import package_name -from pyramid.threadlocal import get_current_registry - -class OverrideProvider(pkg_resources.DefaultProvider): - def __init__(self, module): - pkg_resources.DefaultProvider.__init__(self, module) - self.module_name = module.__name__ - - def _get_overrides(self): - reg = get_current_registry() - overrides = reg.queryUtility(IPackageOverrides, self.module_name) - return overrides - - def get_resource_filename(self, manager, resource_name): - """ Return a true filesystem path for resource_name, - co-ordinating the extraction with manager, if the resource - must be unpacked to the filesystem. - """ - overrides = self._get_overrides() - if overrides is not None: - filename = overrides.get_filename(resource_name) - if filename is not None: - return filename - return pkg_resources.DefaultProvider.get_resource_filename( - self, manager, resource_name) - - def get_resource_stream(self, manager, resource_name): - """ Return a readable file-like object for resource_name.""" - overrides = self._get_overrides() - if overrides is not None: - stream = overrides.get_stream(resource_name) - if stream is not None: - return stream - return pkg_resources.DefaultProvider.get_resource_stream( - self, manager, resource_name) - - def get_resource_string(self, manager, resource_name): - """ Return a string containing the contents of resource_name.""" - overrides = self._get_overrides() - if overrides is not None: - string = overrides.get_string(resource_name) - if string is not None: - return string - 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 - def __init__(self, package, pkg_resources=pkg_resources): - if hasattr(package, '__loader__') and not isinstance(package.__loader__, - self.__class__): - raise TypeError('Package %s already has a non-%s __loader__ ' - '(probably a module in a zipped egg)' % - (package, self.__class__)) - # We register ourselves as a __loader__ *only* to support the - # setuptools _find_adapter adapter lookup; this class doesn't - # actually support the PEP 302 loader "API". This is - # excusable due to the following statement in the spec: - # ... Loader objects are not - # required to offer any useful functionality (any such functionality, - # such as the zipimport get_data() method mentioned above, is - # optional)... - # A __loader__ attribute is basically metadata, and setuptools - # uses it as such. - package.__loader__ = self - # we call register_loader_type for every instantiation of this - # class; that's OK, it's idempotent to do it more than once. - pkg_resources.register_loader_type(self.__class__, OverrideProvider) - self.overrides = [] - self.overridden_package_name = package.__name__ - - def insert(self, path, package, prefix): - if not path or path.endswith('/'): - override = DirectoryOverride(path, package, prefix) - else: - override = FileOverride(path, package, prefix) - self.overrides.insert(0, override) - return override - - def search_path(self, resource_name): - for override in self.overrides: - o = override(resource_name) - if o is not None: - package, name = o - yield package, name - - def get_filename(self, resource_name): - for package, rname in self.search_path(resource_name): - if pkg_resources.resource_exists(package, rname): - return pkg_resources.resource_filename(package, rname) - - def get_stream(self, resource_name): - for package, rname in self.search_path(resource_name): - if pkg_resources.resource_exists(package, rname): - return pkg_resources.resource_stream(package, rname) - - def get_string(self, resource_name): - for package, rname in self.search_path(resource_name): - 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 - self.package = package - self.prefix = prefix - self.pathlen = len(self.path) - - def __call__(self, resource_name): - if resource_name.startswith(self.path): - name = '%s%s' % (self.prefix, resource_name[self.pathlen:]) - return self.package, name - -class FileOverride: - def __init__(self, path, package, prefix): - self.path = path - self.package = package - self.prefix = prefix - - def __call__(self, resource_name): - if resource_name == self.path: - return self.package, self.prefix def resolve_asset_spec(spec, pname='__main__'): if pname and not isinstance(pname, basestring): diff --git a/pyramid/config/assets.py b/pyramid/config/assets.py index cba171426..931ffb74c 100644 --- a/pyramid/config/assets.py +++ b/pyramid/config/assets.py @@ -1,12 +1,180 @@ +import pkg_resources import sys +from zope.interface import implements + from pyramid.interfaces import IPackageOverrides -from pyramid.asset import PackageOverrides from pyramid.exceptions import ConfigurationError +from pyramid.threadlocal import get_current_registry from pyramid.config.util import action_method +class OverrideProvider(pkg_resources.DefaultProvider): + def __init__(self, module): + pkg_resources.DefaultProvider.__init__(self, module) + self.module_name = module.__name__ + + def _get_overrides(self): + reg = get_current_registry() + overrides = reg.queryUtility(IPackageOverrides, self.module_name) + return overrides + + def get_resource_filename(self, manager, resource_name): + """ Return a true filesystem path for resource_name, + co-ordinating the extraction with manager, if the resource + must be unpacked to the filesystem. + """ + overrides = self._get_overrides() + if overrides is not None: + filename = overrides.get_filename(resource_name) + if filename is not None: + return filename + return pkg_resources.DefaultProvider.get_resource_filename( + self, manager, resource_name) + + def get_resource_stream(self, manager, resource_name): + """ Return a readable file-like object for resource_name.""" + overrides = self._get_overrides() + if overrides is not None: + stream = overrides.get_stream(resource_name) + if stream is not None: + return stream + return pkg_resources.DefaultProvider.get_resource_stream( + self, manager, resource_name) + + def get_resource_string(self, manager, resource_name): + """ Return a string containing the contents of resource_name.""" + overrides = self._get_overrides() + if overrides is not None: + string = overrides.get_string(resource_name) + if string is not None: + return string + 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 + def __init__(self, package, pkg_resources=pkg_resources): + if hasattr(package, '__loader__') and not isinstance(package.__loader__, + self.__class__): + raise TypeError('Package %s already has a non-%s __loader__ ' + '(probably a module in a zipped egg)' % + (package, self.__class__)) + # We register ourselves as a __loader__ *only* to support the + # setuptools _find_adapter adapter lookup; this class doesn't + # actually support the PEP 302 loader "API". This is + # excusable due to the following statement in the spec: + # ... Loader objects are not + # required to offer any useful functionality (any such functionality, + # such as the zipimport get_data() method mentioned above, is + # optional)... + # A __loader__ attribute is basically metadata, and setuptools + # uses it as such. + package.__loader__ = self + # we call register_loader_type for every instantiation of this + # class; that's OK, it's idempotent to do it more than once. + pkg_resources.register_loader_type(self.__class__, OverrideProvider) + self.overrides = [] + self.overridden_package_name = package.__name__ + + def insert(self, path, package, prefix): + if not path or path.endswith('/'): + override = DirectoryOverride(path, package, prefix) + else: + override = FileOverride(path, package, prefix) + self.overrides.insert(0, override) + return override + + def search_path(self, resource_name): + for override in self.overrides: + o = override(resource_name) + if o is not None: + package, name = o + yield package, name + + def get_filename(self, resource_name): + for package, rname in self.search_path(resource_name): + if pkg_resources.resource_exists(package, rname): + return pkg_resources.resource_filename(package, rname) + + def get_stream(self, resource_name): + for package, rname in self.search_path(resource_name): + if pkg_resources.resource_exists(package, rname): + return pkg_resources.resource_stream(package, rname) + + def get_string(self, resource_name): + for package, rname in self.search_path(resource_name): + 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 + self.package = package + self.prefix = prefix + self.pathlen = len(self.path) + + def __call__(self, resource_name): + if resource_name.startswith(self.path): + name = '%s%s' % (self.prefix, resource_name[self.pathlen:]) + return self.package, name + +class FileOverride: + def __init__(self, path, package, prefix): + self.path = path + self.package = package + self.prefix = prefix + + def __call__(self, resource_name): + if resource_name == self.path: + return self.package, self.prefix + + class AssetsConfiguratorMixin(object): def _override(self, package, path, override_package, override_prefix, PackageOverrides=PackageOverrides): @@ -71,3 +239,4 @@ class AssetsConfiguratorMixin(object): override_resource = override_asset # bw compat + diff --git a/pyramid/tests/test_asset.py b/pyramid/tests/test_asset.py index 1bd855cdb..badb91d91 100644 --- a/pyramid/tests/test_asset.py +++ b/pyramid/tests/test_asset.py @@ -1,404 +1,4 @@ import unittest -from pyramid.testing import cleanUp - -class TestOverrideProvider(unittest.TestCase): - def setUp(self): - cleanUp() - - def tearDown(self): - cleanUp() - - def _getTargetClass(self): - from pyramid.asset import OverrideProvider - return OverrideProvider - - def _makeOne(self, module): - klass = self._getTargetClass() - return klass(module) - - def _registerOverrides(self, overrides, name='pyramid.tests'): - from pyramid.interfaces import IPackageOverrides - from pyramid.threadlocal import get_current_registry - reg = get_current_registry() - reg.registerUtility(overrides, IPackageOverrides, name=name) - - def test_get_resource_filename_no_overrides(self): - import os - resource_name = 'test_asset.py' - import pyramid.tests - provider = self._makeOne(pyramid.tests) - here = os.path.dirname(os.path.abspath(__file__)) - expected = os.path.join(here, resource_name) - result = provider.get_resource_filename(None, resource_name) - self.assertEqual(result, expected) - - def test_get_resource_stream_no_overrides(self): - import os - resource_name = 'test_asset.py' - import pyramid.tests - provider = self._makeOne(pyramid.tests) - here = os.path.dirname(os.path.abspath(__file__)) - expected = open(os.path.join(here, resource_name)).read() - result = provider.get_resource_stream(None, resource_name) - self.assertEqual(result.read().replace('\r', ''), expected) - - def test_get_resource_string_no_overrides(self): - import os - resource_name = 'test_asset.py' - import pyramid.tests - provider = self._makeOne(pyramid.tests) - here = os.path.dirname(os.path.abspath(__file__)) - expected = open(os.path.join(here, resource_name)).read() - result = provider.get_resource_string(None, resource_name) - self.assertEqual(result.replace('\r', ''), expected) - - def test_has_resource_no_overrides(self): - resource_name = 'test_asset.py' - import pyramid.tests - provider = self._makeOne(pyramid.tests) - result = provider.has_resource(resource_name) - self.assertEqual(result, True) - - def test_resource_isdir_no_overrides(self): - file_resource_name = 'test_asset.py' - directory_resource_name = 'fixtures' - import pyramid.tests - provider = self._makeOne(pyramid.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 pyramid.tests - provider = self._makeOne(pyramid.tests) - result = provider.resource_listdir(resource_name) - self.assertTrue(result) - - def test_get_resource_filename_override_returns_None(self): - overrides = DummyOverrides(None) - self._registerOverrides(overrides) - import os - resource_name = 'test_asset.py' - import pyramid.tests - provider = self._makeOne(pyramid.tests) - here = os.path.dirname(os.path.abspath(__file__)) - expected = os.path.join(here, resource_name) - result = provider.get_resource_filename(None, resource_name) - self.assertEqual(result, expected) - - def test_get_resource_stream_override_returns_None(self): - overrides = DummyOverrides(None) - self._registerOverrides(overrides) - import os - resource_name = 'test_asset.py' - import pyramid.tests - provider = self._makeOne(pyramid.tests) - here = os.path.dirname(os.path.abspath(__file__)) - expected = open(os.path.join(here, resource_name)).read() - result = provider.get_resource_stream(None, resource_name) - self.assertEqual(result.read(), expected) - - def test_get_resource_string_override_returns_None(self): - overrides = DummyOverrides(None) - self._registerOverrides(overrides) - import os - resource_name = 'test_asset.py' - import pyramid.tests - provider = self._makeOne(pyramid.tests) - here = os.path.dirname(os.path.abspath(__file__)) - expected = open(os.path.join(here, resource_name)).read() - result = provider.get_resource_string(None, resource_name) - self.assertEqual(result, expected) - - def test_has_resource_override_returns_None(self): - overrides = DummyOverrides(None) - self._registerOverrides(overrides) - resource_name = 'test_asset.py' - import pyramid.tests - provider = self._makeOne(pyramid.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 pyramid.tests - provider = self._makeOne(pyramid.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 pyramid.tests - provider = self._makeOne(pyramid.tests) - result = provider.resource_listdir(resource_name) - self.assertTrue(result) - - def test_get_resource_filename_override_returns_value(self): - overrides = DummyOverrides('value') - import pyramid.tests - self._registerOverrides(overrides) - provider = self._makeOne(pyramid.tests) - result = provider.get_resource_filename(None, 'test_asset.py') - self.assertEqual(result, 'value') - - def test_get_resource_stream_override_returns_value(self): - overrides = DummyOverrides('value') - import pyramid.tests - self._registerOverrides(overrides) - provider = self._makeOne(pyramid.tests) - result = provider.get_resource_stream(None, 'test_asset.py') - self.assertEqual(result, 'value') - - def test_get_resource_string_override_returns_value(self): - overrides = DummyOverrides('value') - import pyramid.tests - self._registerOverrides(overrides) - provider = self._makeOne(pyramid.tests) - result = provider.get_resource_string(None, 'test_asset.py') - self.assertEqual(result, 'value') - - def test_has_resource_override_returns_True(self): - overrides = DummyOverrides(True) - import pyramid.tests - self._registerOverrides(overrides) - provider = self._makeOne(pyramid.tests) - result = provider.has_resource('test_asset.py') - self.assertEqual(result, True) - - def test_resource_isdir_override_returns_False(self): - overrides = DummyOverrides(False) - import pyramid.tests - self._registerOverrides(overrides) - provider = self._makeOne(pyramid.tests) - result = provider.resource_isdir('fixtures') - self.assertEqual(result, False) - - def test_resource_listdir_override_returns_values(self): - overrides = DummyOverrides(['a']) - import pyramid.tests - self._registerOverrides(overrides) - provider = self._makeOne(pyramid.tests) - result = provider.resource_listdir('fixtures') - self.assertEqual(result, ['a']) - -class TestPackageOverrides(unittest.TestCase): - def _getTargetClass(self): - from pyramid.asset import PackageOverrides - return PackageOverrides - - def _makeOne(self, package, pkg_resources=None): - klass = self._getTargetClass() - if pkg_resources is None: - pkg_resources = DummyPkgResources() - return klass(package, pkg_resources=pkg_resources) - - def test_ctor_package_already_has_loader_of_different_type(self): - package = DummyPackage('package') - package.__loader__ = True - self.assertRaises(TypeError, self._makeOne, package) - - def test_ctor_package_already_has_loader_of_same_type(self): - package = DummyPackage('package') - package.__loader__ = self._makeOne(package) - po = self._makeOne(package) - self.assertEqual(package.__loader__, po) - - def test_ctor_sets_loader(self): - package = DummyPackage('package') - po = self._makeOne(package) - self.assertEqual(package.__loader__, po) - - def test_ctor_registers_loader_type(self): - from pyramid.resource import OverrideProvider - dummy_pkg_resources = DummyPkgResources() - package = DummyPackage('package') - po = self._makeOne(package, dummy_pkg_resources) - self.assertEqual(dummy_pkg_resources.registered, [(po.__class__, - OverrideProvider)]) - - def test_ctor_sets_local_state(self): - package = DummyPackage('package') - po = self._makeOne(package) - self.assertEqual(po.overrides, []) - self.assertEqual(po.overridden_package_name, 'package') - - def test_insert_directory(self): - from pyramid.resource import DirectoryOverride - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= [None] - po.insert('foo/', 'package', 'bar/') - self.assertEqual(len(po.overrides), 2) - override = po.overrides[0] - self.assertEqual(override.__class__, DirectoryOverride) - - def test_insert_file(self): - from pyramid.resource import FileOverride - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= [None] - po.insert('foo.pt', 'package', 'bar.pt') - self.assertEqual(len(po.overrides), 2) - override = po.overrides[0] - self.assertEqual(override.__class__, FileOverride) - - def test_insert_emptystring(self): - # XXX is this a valid case for a directory? - from pyramid.resource import DirectoryOverride - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= [None] - po.insert('', 'package', 'bar/') - self.assertEqual(len(po.overrides), 2) - override = po.overrides[0] - self.assertEqual(override.__class__, DirectoryOverride) - - def test_search_path(self): - overrides = [ DummyOverride(None), DummyOverride(('package', 'name'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertEqual(list(po.search_path('whatever')), - [('package', 'name')]) - - def test_get_filename(self): - import os - overrides = [ DummyOverride(None), DummyOverride( - ('pyramid.tests', 'test_asset.py'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - here = os.path.dirname(os.path.abspath(__file__)) - expected = os.path.join(here, 'test_asset.py') - self.assertEqual(po.get_filename('whatever'), expected) - - def test_get_filename_file_doesnt_exist(self): - overrides = [ DummyOverride(None), DummyOverride( - ('pyramid.tests', 'wont_exist'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertEqual(po.get_filename('whatever'), None) - - def test_get_stream(self): - import os - overrides = [ DummyOverride(None), DummyOverride( - ('pyramid.tests', 'test_asset.py'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - here = os.path.dirname(os.path.abspath(__file__)) - expected = open(os.path.join(here, 'test_asset.py')).read() - self.assertEqual(po.get_stream('whatever').read().replace('\r', ''), - expected) - - def test_get_stream_file_doesnt_exist(self): - overrides = [ DummyOverride(None), DummyOverride( - ('pyramid.tests', 'wont_exist'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertEqual(po.get_stream('whatever'), None) - - def test_get_string(self): - import os - overrides = [ DummyOverride(None), DummyOverride( - ('pyramid.tests', 'test_asset.py'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - here = os.path.dirname(os.path.abspath(__file__)) - expected = open(os.path.join(here, 'test_asset.py')).read() - self.assertEqual(po.get_string('whatever').replace('\r', ''), expected) - - def test_get_string_file_doesnt_exist(self): - overrides = [ DummyOverride(None), DummyOverride( - ('pyramid.tests', 'wont_exist'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertEqual(po.get_string('whatever'), None) - - def test_has_resource(self): - overrides = [ DummyOverride(None), DummyOverride( - ('pyramid.tests', 'test_asset.py'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertEqual(po.has_resource('whatever'), True) - - def test_has_resource_file_doesnt_exist(self): - overrides = [ DummyOverride(None), DummyOverride( - ('pyramid.tests', 'wont_exist'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertEqual(po.has_resource('whatever'), None) - - def test_isdir_false(self): - overrides = [ DummyOverride( - ('pyramid.tests', 'test_asset.py'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertEqual(po.isdir('whatever'), False) - - def test_isdir_true(self): - overrides = [ DummyOverride( - ('pyramid.tests', 'fixtures'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertEqual(po.isdir('whatever'), True) - - def test_isdir_doesnt_exist(self): - overrides = [ DummyOverride(None), DummyOverride( - ('pyramid.tests', 'wont_exist'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertEqual(po.isdir('whatever'), None) - - def test_listdir(self): - overrides = [ DummyOverride( - ('pyramid.tests', 'fixtures'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertTrue(po.listdir('whatever')) - - def test_listdir_doesnt_exist(self): - overrides = [ DummyOverride(None), DummyOverride( - ('pyramid.tests', 'wont_exist'))] - package = DummyPackage('package') - po = self._makeOne(package) - po.overrides= overrides - self.assertEqual(po.listdir('whatever'), None) - -class TestDirectoryOverride(unittest.TestCase): - def _getTargetClass(self): - from pyramid.asset import DirectoryOverride - return DirectoryOverride - - def _makeOne(self, path, package, prefix): - klass = self._getTargetClass() - return klass(path, package, prefix) - - def test_it_match(self): - o = self._makeOne('foo/', 'package', 'bar/') - result = o('foo/something.pt') - self.assertEqual(result, ('package', 'bar/something.pt')) - - def test_it_no_match(self): - o = self._makeOne('foo/', 'package', 'bar/') - result = o('baz/notfound.pt') - self.assertEqual(result, None) class Test_resolve_asset_spec(unittest.TestCase): def _callFUT(self, spec, package_name='__main__'): @@ -443,25 +43,6 @@ class Test_resolve_asset_spec(unittest.TestCase): self.assertEqual(filename, 'test_asset.py') -class TestFileOverride(unittest.TestCase): - def _getTargetClass(self): - from pyramid.asset import FileOverride - return FileOverride - - def _makeOne(self, path, package, prefix): - klass = self._getTargetClass() - return klass(path, package, prefix) - - def test_it_match(self): - o = self._makeOne('foo.pt', 'package', 'bar.pt') - result = o('foo.pt') - self.assertEqual(result, ('package', 'bar.pt')) - - def test_it_no_match(self): - o = self._makeOne('foo.pt', 'package', 'bar.pt') - result = o('notfound.pt') - self.assertEqual(result, None) - class Test_abspath_from_asset_spec(unittest.TestCase): def _callFUT(self, spec, pname='__main__'): from pyramid.resource import abspath_from_asset_spec @@ -508,29 +89,6 @@ class Test_asset_spec_from_abspath(unittest.TestCase): self.assertEqual(result, abspath) -class DummyOverride: - def __init__(self, result): - self.result = result - - def __call__(self, resource_name): - return self.result - -class DummyOverrides: - def __init__(self, result): - self.result = result - - def get_filename(self, resource_name): - return self.result - - listdir = isdir = has_resource = get_stream = get_string = get_filename - -class DummyPkgResources: - def __init__(self): - self.registered = [] - - def register_loader_type(self, typ, inst): - self.registered.append((typ, inst)) - class DummyPackage: def __init__(self, name): self.__name__ = name diff --git a/pyramid/tests/test_config/fixtures/dummy.txt b/pyramid/tests/test_config/fixtures/dummy.txt new file mode 100644 index 000000000..18832d351 --- /dev/null +++ b/pyramid/tests/test_config/fixtures/dummy.txt @@ -0,0 +1 @@ +Hello. diff --git a/pyramid/tests/test_config/test_assets.py b/pyramid/tests/test_config/test_assets.py new file mode 100644 index 000000000..d9d48f333 --- /dev/null +++ b/pyramid/tests/test_config/test_assets.py @@ -0,0 +1,447 @@ +import unittest +from pyramid.testing import cleanUp + +class TestOverrideProvider(unittest.TestCase): + def setUp(self): + cleanUp() + + def tearDown(self): + cleanUp() + + def _getTargetClass(self): + from pyramid.config.assets import OverrideProvider + return OverrideProvider + + def _makeOne(self, module): + klass = self._getTargetClass() + return klass(module) + + def _registerOverrides(self, overrides, name='pyramid.tests.test_config'): + from pyramid.interfaces import IPackageOverrides + from pyramid.threadlocal import get_current_registry + reg = get_current_registry() + reg.registerUtility(overrides, IPackageOverrides, name=name) + + def test_get_resource_filename_no_overrides(self): + import os + resource_name = 'test_assets.py' + import pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + here = os.path.dirname(os.path.abspath(__file__)) + expected = os.path.join(here, resource_name) + result = provider.get_resource_filename(None, resource_name) + self.assertEqual(result, expected) + + def test_get_resource_stream_no_overrides(self): + import os + resource_name = 'test_assets.py' + import pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + here = os.path.dirname(os.path.abspath(__file__)) + expected = open(os.path.join(here, resource_name)).read() + result = provider.get_resource_stream(None, resource_name) + self.assertEqual(result.read().replace('\r', ''), expected) + + def test_get_resource_string_no_overrides(self): + import os + resource_name = 'test_assets.py' + import pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + here = os.path.dirname(os.path.abspath(__file__)) + expected = open(os.path.join(here, resource_name)).read() + result = provider.get_resource_string(None, resource_name) + self.assertEqual(result.replace('\r', ''), expected) + + def test_has_resource_no_overrides(self): + resource_name = 'test_assets.py' + import pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + result = provider.has_resource(resource_name) + self.assertEqual(result, True) + + def test_resource_isdir_no_overrides(self): + file_resource_name = 'test_assets.py' + directory_resource_name = 'fixtures' + import pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + 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 pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + result = provider.resource_listdir(resource_name) + self.assertTrue(result) + + def test_get_resource_filename_override_returns_None(self): + overrides = DummyOverrides(None) + self._registerOverrides(overrides) + import os + resource_name = 'test_assets.py' + import pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + here = os.path.dirname(os.path.abspath(__file__)) + expected = os.path.join(here, resource_name) + result = provider.get_resource_filename(None, resource_name) + self.assertEqual(result, expected) + + def test_get_resource_stream_override_returns_None(self): + overrides = DummyOverrides(None) + self._registerOverrides(overrides) + import os + resource_name = 'test_assets.py' + import pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + here = os.path.dirname(os.path.abspath(__file__)) + expected = open(os.path.join(here, resource_name)).read() + result = provider.get_resource_stream(None, resource_name) + self.assertEqual(result.read(), expected) + + def test_get_resource_string_override_returns_None(self): + overrides = DummyOverrides(None) + self._registerOverrides(overrides) + import os + resource_name = 'test_assets.py' + import pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + here = os.path.dirname(os.path.abspath(__file__)) + expected = open(os.path.join(here, resource_name)).read() + result = provider.get_resource_string(None, resource_name) + self.assertEqual(result, expected) + + def test_has_resource_override_returns_None(self): + overrides = DummyOverrides(None) + self._registerOverrides(overrides) + resource_name = 'test_assets.py' + import pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + 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 pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + 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 pyramid.tests.test_config + provider = self._makeOne(pyramid.tests.test_config) + result = provider.resource_listdir(resource_name) + self.assertTrue(result) + + def test_get_resource_filename_override_returns_value(self): + overrides = DummyOverrides('value') + import pyramid.tests.test_config + self._registerOverrides(overrides) + provider = self._makeOne(pyramid.tests.test_config) + result = provider.get_resource_filename(None, 'test_assets.py') + self.assertEqual(result, 'value') + + def test_get_resource_stream_override_returns_value(self): + overrides = DummyOverrides('value') + import pyramid.tests.test_config + self._registerOverrides(overrides) + provider = self._makeOne(pyramid.tests.test_config) + result = provider.get_resource_stream(None, 'test_assets.py') + self.assertEqual(result, 'value') + + def test_get_resource_string_override_returns_value(self): + overrides = DummyOverrides('value') + import pyramid.tests.test_config + self._registerOverrides(overrides) + provider = self._makeOne(pyramid.tests.test_config) + result = provider.get_resource_string(None, 'test_assets.py') + self.assertEqual(result, 'value') + + def test_has_resource_override_returns_True(self): + overrides = DummyOverrides(True) + import pyramid.tests.test_config + self._registerOverrides(overrides) + provider = self._makeOne(pyramid.tests.test_config) + result = provider.has_resource('test_assets.py') + self.assertEqual(result, True) + + def test_resource_isdir_override_returns_False(self): + overrides = DummyOverrides(False) + import pyramid.tests.test_config + self._registerOverrides(overrides) + provider = self._makeOne(pyramid.tests.test_config) + result = provider.resource_isdir('fixtures') + self.assertEqual(result, False) + + def test_resource_listdir_override_returns_values(self): + overrides = DummyOverrides(['a']) + import pyramid.tests.test_config + self._registerOverrides(overrides) + provider = self._makeOne(pyramid.tests.test_config) + result = provider.resource_listdir('fixtures') + self.assertEqual(result, ['a']) + +class TestPackageOverrides(unittest.TestCase): + def _getTargetClass(self): + from pyramid.config.assets import PackageOverrides + return PackageOverrides + + def _makeOne(self, package, pkg_resources=None): + klass = self._getTargetClass() + if pkg_resources is None: + pkg_resources = DummyPkgResources() + return klass(package, pkg_resources=pkg_resources) + + def test_ctor_package_already_has_loader_of_different_type(self): + package = DummyPackage('package') + package.__loader__ = True + self.assertRaises(TypeError, self._makeOne, package) + + def test_ctor_package_already_has_loader_of_same_type(self): + package = DummyPackage('package') + package.__loader__ = self._makeOne(package) + po = self._makeOne(package) + self.assertEqual(package.__loader__, po) + + def test_ctor_sets_loader(self): + package = DummyPackage('package') + po = self._makeOne(package) + self.assertEqual(package.__loader__, po) + + def test_ctor_registers_loader_type(self): + from pyramid.config.assets import OverrideProvider + dummy_pkg_resources = DummyPkgResources() + package = DummyPackage('package') + po = self._makeOne(package, dummy_pkg_resources) + self.assertEqual(dummy_pkg_resources.registered, [(po.__class__, + OverrideProvider)]) + + def test_ctor_sets_local_state(self): + package = DummyPackage('package') + po = self._makeOne(package) + self.assertEqual(po.overrides, []) + self.assertEqual(po.overridden_package_name, 'package') + + def test_insert_directory(self): + from pyramid.config.assets import DirectoryOverride + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= [None] + po.insert('foo/', 'package', 'bar/') + self.assertEqual(len(po.overrides), 2) + override = po.overrides[0] + self.assertEqual(override.__class__, DirectoryOverride) + + def test_insert_file(self): + from pyramid.config.assets import FileOverride + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= [None] + po.insert('foo.pt', 'package', 'bar.pt') + self.assertEqual(len(po.overrides), 2) + override = po.overrides[0] + self.assertEqual(override.__class__, FileOverride) + + def test_insert_emptystring(self): + # XXX is this a valid case for a directory? + from pyramid.config.assets import DirectoryOverride + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= [None] + po.insert('', 'package', 'bar/') + self.assertEqual(len(po.overrides), 2) + override = po.overrides[0] + self.assertEqual(override.__class__, DirectoryOverride) + + def test_search_path(self): + overrides = [ DummyOverride(None), DummyOverride(('package', 'name'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertEqual(list(po.search_path('whatever')), + [('package', 'name')]) + + def test_get_filename(self): + import os + overrides = [ DummyOverride(None), DummyOverride( + ('pyramid.tests.test_config', 'test_assets.py'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + here = os.path.dirname(os.path.abspath(__file__)) + expected = os.path.join(here, 'test_assets.py') + self.assertEqual(po.get_filename('whatever'), expected) + + def test_get_filename_file_doesnt_exist(self): + overrides = [ DummyOverride(None), DummyOverride( + ('pyramid.tests.test_config', 'wont_exist'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertEqual(po.get_filename('whatever'), None) + + def test_get_stream(self): + import os + overrides = [ DummyOverride(None), DummyOverride( + ('pyramid.tests.test_config', 'test_assets.py'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + here = os.path.dirname(os.path.abspath(__file__)) + expected = open(os.path.join(here, 'test_assets.py')).read() + self.assertEqual(po.get_stream('whatever').read().replace('\r', ''), + expected) + + def test_get_stream_file_doesnt_exist(self): + overrides = [ DummyOverride(None), DummyOverride( + ('pyramid.tests.test_config', 'wont_exist'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertEqual(po.get_stream('whatever'), None) + + def test_get_string(self): + import os + overrides = [ DummyOverride(None), DummyOverride( + ('pyramid.tests.test_config', 'test_assets.py'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + here = os.path.dirname(os.path.abspath(__file__)) + expected = open(os.path.join(here, 'test_assets.py')).read() + self.assertEqual(po.get_string('whatever').replace('\r', ''), expected) + + def test_get_string_file_doesnt_exist(self): + overrides = [ DummyOverride(None), DummyOverride( + ('pyramid.tests.test_config', 'wont_exist'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertEqual(po.get_string('whatever'), None) + + def test_has_resource(self): + overrides = [ DummyOverride(None), DummyOverride( + ('pyramid.tests.test_config', 'test_assets.py'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertEqual(po.has_resource('whatever'), True) + + def test_has_resource_file_doesnt_exist(self): + overrides = [ DummyOverride(None), DummyOverride( + ('pyramid.tests.test_config', 'wont_exist'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertEqual(po.has_resource('whatever'), None) + + def test_isdir_false(self): + overrides = [ DummyOverride( + ('pyramid.tests.test_config', 'test_assets.py'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertEqual(po.isdir('whatever'), False) + + def test_isdir_true(self): + overrides = [ DummyOverride( + ('pyramid.tests.test_config', 'fixtures'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertEqual(po.isdir('whatever'), True) + + def test_isdir_doesnt_exist(self): + overrides = [ DummyOverride(None), DummyOverride( + ('pyramid.tests.test_config', 'wont_exist'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertEqual(po.isdir('whatever'), None) + + def test_listdir(self): + overrides = [ DummyOverride( + ('pyramid.tests.test_config', 'fixtures'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertTrue(po.listdir('whatever')) + + def test_listdir_doesnt_exist(self): + overrides = [ DummyOverride(None), DummyOverride( + ('pyramid.tests.test_config', 'wont_exist'))] + package = DummyPackage('package') + po = self._makeOne(package) + po.overrides= overrides + self.assertEqual(po.listdir('whatever'), None) + +class TestDirectoryOverride(unittest.TestCase): + def _getTargetClass(self): + from pyramid.config.assets import DirectoryOverride + return DirectoryOverride + + def _makeOne(self, path, package, prefix): + klass = self._getTargetClass() + return klass(path, package, prefix) + + def test_it_match(self): + o = self._makeOne('foo/', 'package', 'bar/') + result = o('foo/something.pt') + self.assertEqual(result, ('package', 'bar/something.pt')) + + def test_it_no_match(self): + o = self._makeOne('foo/', 'package', 'bar/') + result = o('baz/notfound.pt') + self.assertEqual(result, None) + +class TestFileOverride(unittest.TestCase): + def _getTargetClass(self): + from pyramid.config.assets import FileOverride + return FileOverride + + def _makeOne(self, path, package, prefix): + klass = self._getTargetClass() + return klass(path, package, prefix) + + def test_it_match(self): + o = self._makeOne('foo.pt', 'package', 'bar.pt') + result = o('foo.pt') + self.assertEqual(result, ('package', 'bar.pt')) + + def test_it_no_match(self): + o = self._makeOne('foo.pt', 'package', 'bar.pt') + result = o('notfound.pt') + self.assertEqual(result, None) + +class DummyOverride: + def __init__(self, result): + self.result = result + + def __call__(self, resource_name): + return self.result + +class DummyOverrides: + def __init__(self, result): + self.result = result + + def get_filename(self, resource_name): + return self.result + + listdir = isdir = has_resource = get_stream = get_string = get_filename + +class DummyPkgResources: + def __init__(self): + self.registered = [] + + def register_loader_type(self, typ, inst): + self.registered.append((typ, inst)) + +class DummyPackage: + def __init__(self, name): + self.__name__ = name -- cgit v1.2.3