import unittest import os from pyramid.compat import PY2 here = os.path.abspath(os.path.dirname(__file__)) class TestCallerPath(unittest.TestCase): def tearDown(self): from . import test_path if hasattr(test_path, '__abspath__'): del test_path.__abspath__ def _callFUT(self, path, level=2): from pyramid.path import caller_path return caller_path(path, level) def test_isabs(self): result = self._callFUT('/a/b/c') self.assertEqual(result, '/a/b/c') def test_pkgrelative(self): import os result = self._callFUT('a/b/c') self.assertEqual(result, os.path.join(here, 'a/b/c')) def test_memoization_has_abspath(self): import os from . import test_path test_path.__abspath__ = '/foo/bar' result = self._callFUT('a/b/c') self.assertEqual(result, os.path.join('/foo/bar', 'a/b/c')) def test_memoization_success(self): import os from . import test_path result = self._callFUT('a/b/c') self.assertEqual(result, os.path.join(here, 'a/b/c')) self.assertEqual(test_path.__abspath__, here) class TestCallerModule(unittest.TestCase): def _callFUT(self, *arg, **kw): from pyramid.path import caller_module return caller_module(*arg, **kw) def test_it_level_1(self): from . import test_path result = self._callFUT(1) self.assertEqual(result, test_path) def test_it_level_2(self): from . import test_path result = self._callFUT(2) self.assertEqual(result, test_path) def test_it_level_3(self): from . import test_path result = self._callFUT(3) self.assertNotEqual(result, test_path) def test_it_no___name__(self): class DummyFrame(object): f_globals = {} class DummySys(object): def _getframe(self, level): return DummyFrame() modules = {'__main__':'main'} dummy_sys = DummySys() result = self._callFUT(3, sys=dummy_sys) self.assertEqual(result, 'main') class TestCallerPackage(unittest.TestCase): def _callFUT(self, *arg, **kw): from pyramid.path import caller_package return caller_package(*arg, **kw) def test_it_level_1(self): import tests result = self._callFUT(1) self.assertEqual(result, tests) def test_it_level_2(self): import tests result = self._callFUT(2) self.assertEqual(result, tests) def test_it_level_3(self): import unittest result = self._callFUT(3) self.assertEqual(result, unittest) def test_it_package(self): import tests def dummy_caller_module(*arg): return tests result = self._callFUT(1, caller_module=dummy_caller_module) self.assertEqual(result, tests) class TestPackagePath(unittest.TestCase): def _callFUT(self, package): from pyramid.path import package_path return package_path(package) def test_it_package(self): import tests package = DummyPackageOrModule(tests) result = self._callFUT(package) self.assertEqual(result, package.package_path) def test_it_module(self): from . import test_path module = DummyPackageOrModule(test_path) result = self._callFUT(module) self.assertEqual(result, module.package_path) def test_memoization_success(self): from . import test_path module = DummyPackageOrModule(test_path) self._callFUT(module) self.assertEqual(module.__abspath__, module.package_path) def test_memoization_fail(self): from . import test_path module = DummyPackageOrModule(test_path, raise_exc=TypeError) result = self._callFUT(module) self.assertFalse(hasattr(module, '__abspath__')) self.assertEqual(result, module.package_path) class TestPackageOf(unittest.TestCase): def _callFUT(self, package): from pyramid.path import package_of return package_of(package) def test_it_package(self): import tests package = DummyPackageOrModule(tests) result = self._callFUT(package) self.assertEqual(result, tests) def test_it_module(self): import tests.test_path import tests package = DummyPackageOrModule(tests.test_path) result = self._callFUT(package) self.assertEqual(result, tests) class TestPackageName(unittest.TestCase): def _callFUT(self, package): from pyramid.path import package_name return package_name(package) def test_it_package(self): import tests package = DummyPackageOrModule(tests) result = self._callFUT(package) self.assertEqual(result, 'tests') def test_it_namespace_package(self): import tests package = DummyNamespacePackage(tests) result = self._callFUT(package) self.assertEqual(result, 'tests') def test_it_module(self): from . import test_path module = DummyPackageOrModule(test_path) result = self._callFUT(module) self.assertEqual(result, 'tests') def test_it_None(self): result = self._callFUT(None) self.assertEqual(result, '__main__') def test_it_main(self): import __main__ result = self._callFUT(__main__) self.assertEqual(result, '__main__') class TestResolver(unittest.TestCase): def _getTargetClass(self): from pyramid.path import Resolver return Resolver def _makeOne(self, package): return self._getTargetClass()(package) def test_get_package_caller_package(self): import tests from pyramid.path import CALLER_PACKAGE self.assertEqual(self._makeOne(CALLER_PACKAGE).get_package(), tests) def test_get_package_name_caller_package(self): from pyramid.path import CALLER_PACKAGE self.assertEqual(self._makeOne(CALLER_PACKAGE).get_package_name(), 'tests') def test_get_package_string(self): import tests self.assertEqual(self._makeOne('tests').get_package(), tests) def test_get_package_name_string(self): self.assertEqual(self._makeOne('tests').get_package_name(), 'tests') class TestAssetResolver(unittest.TestCase): def _getTargetClass(self): from pyramid.path import AssetResolver return AssetResolver def _makeOne(self, package='tests'): return self._getTargetClass()(package) def test_ctor_as_package(self): import sys tests = sys.modules['tests'] inst = self._makeOne(tests) self.assertEqual(inst.package, tests) def test_ctor_as_str(self): import sys tests = sys.modules['tests'] inst = self._makeOne('tests') self.assertEqual(inst.package, tests) def test_resolve_abspath(self): from pyramid.path import FSAssetDescriptor inst = self._makeOne(None) r = inst.resolve(os.path.join(here, 'test_asset.py')) self.assertEqual(r.__class__, FSAssetDescriptor) self.assertTrue(r.exists()) def test_resolve_absspec(self): from pyramid.path import PkgResourcesAssetDescriptor inst = self._makeOne(None) r = inst.resolve('tests:test_asset.py') self.assertEqual(r.__class__, PkgResourcesAssetDescriptor) self.assertTrue(r.exists()) def test_resolve_relspec_with_pkg(self): from pyramid.path import PkgResourcesAssetDescriptor inst = self._makeOne('tests') r = inst.resolve('test_asset.py') self.assertEqual(r.__class__, PkgResourcesAssetDescriptor) self.assertTrue(r.exists()) def test_resolve_relspec_no_package(self): inst = self._makeOne(None) self.assertRaises(ValueError, inst.resolve, 'test_asset.py') def test_resolve_relspec_caller_package(self): from pyramid.path import PkgResourcesAssetDescriptor from pyramid.path import CALLER_PACKAGE inst = self._makeOne(CALLER_PACKAGE) r = inst.resolve('test_asset.py') self.assertEqual(r.__class__, PkgResourcesAssetDescriptor) self.assertTrue(r.exists()) class TestPkgResourcesAssetDescriptor(unittest.TestCase): def _getTargetClass(self): from pyramid.path import PkgResourcesAssetDescriptor return PkgResourcesAssetDescriptor def _makeOne(self, pkg='tests', path='test_asset.py'): return self._getTargetClass()(pkg, path) def test_class_conforms_to_IAssetDescriptor(self): from pyramid.interfaces import IAssetDescriptor from zope.interface.verify import verifyClass verifyClass(IAssetDescriptor, self._getTargetClass()) def test_instance_conforms_to_IAssetDescriptor(self): from pyramid.interfaces import IAssetDescriptor from zope.interface.verify import verifyObject verifyObject(IAssetDescriptor, self._makeOne()) def test_absspec(self): inst = self._makeOne() self.assertEqual(inst.absspec(), 'tests:test_asset.py') def test_abspath(self): inst = self._makeOne() self.assertEqual(inst.abspath(), os.path.join(here, 'test_asset.py')) def test_stream(self): inst = self._makeOne() inst.pkg_resources = DummyPkgResource() inst.pkg_resources.resource_stream = lambda x, y: '%s:%s' % (x, y) s = inst.stream() self.assertEqual(s, '%s:%s' % ('tests', 'test_asset.py')) def test_isdir(self): inst = self._makeOne() inst.pkg_resources = DummyPkgResource() inst.pkg_resources.resource_isdir = lambda x, y: '%s:%s' % (x, y) self.assertEqual(inst.isdir(), '%s:%s' % ('tests', 'test_asset.py')) def test_listdir(self): inst = self._makeOne() inst.pkg_resources = DummyPkgResource() inst.pkg_resources.resource_listdir = lambda x, y: '%s:%s' % (x, y) self.assertEqual(inst.listdir(), '%s:%s' % ('tests', 'test_asset.py')) def test_exists(self): inst = self._makeOne() inst.pkg_resources = DummyPkgResource() inst.pkg_resources.resource_exists = lambda x, y: '%s:%s' % (x, y) self.assertEqual(inst.exists(), '%s:%s' % ('tests', 'test_asset.py')) class TestFSAssetDescriptor(unittest.TestCase): def _getTargetClass(self): from pyramid.path import FSAssetDescriptor return FSAssetDescriptor def _makeOne(self, path=os.path.join(here, 'test_asset.py')): return self._getTargetClass()(path) def test_class_conforms_to_IAssetDescriptor(self): from pyramid.interfaces import IAssetDescriptor from zope.interface.verify import verifyClass verifyClass(IAssetDescriptor, self._getTargetClass()) def test_instance_conforms_to_IAssetDescriptor(self): from pyramid.interfaces import IAssetDescriptor from zope.interface.verify import verifyObject verifyObject(IAssetDescriptor, self._makeOne()) def test_absspec(self): inst = self._makeOne() self.assertRaises(NotImplementedError, inst.absspec) def test_abspath(self): inst = self._makeOne() self.assertEqual(inst.abspath(), os.path.join(here, 'test_asset.py')) def test_stream(self): inst = self._makeOne() s = inst.stream() val = s.read() s.close() self.assertTrue(b'asset' in val) def test_isdir_False(self): inst = self._makeOne() self.assertFalse(inst.isdir()) def test_isdir_True(self): inst = self._makeOne(here) self.assertTrue(inst.isdir()) def test_listdir(self): inst = self._makeOne(here) self.assertTrue(inst.listdir()) def test_exists(self): inst = self._makeOne() self.assertTrue(inst.exists()) class TestDottedNameResolver(unittest.TestCase): def _makeOne(self, package=None): from pyramid.path import DottedNameResolver return DottedNameResolver(package) def config_exc(self, func, *arg, **kw): try: func(*arg, **kw) except ValueError as e: return e else: raise AssertionError('Invalid not raised') # pragma: no cover def test_zope_dottedname_style_resolve_builtin(self): typ = self._makeOne() if PY2: result = typ._zope_dottedname_style('__builtin__.str', None) else: result = typ._zope_dottedname_style('builtins.str', None) self.assertEqual(result, str) def test_zope_dottedname_style_resolve_absolute(self): typ = self._makeOne() result = typ._zope_dottedname_style( 'tests.test_path.TestDottedNameResolver', None) self.assertEqual(result, self.__class__) def test_zope_dottedname_style_irrresolveable_absolute(self): typ = self._makeOne() self.assertRaises(ImportError, typ._zope_dottedname_style, 'pyramid.test_path.nonexisting_name', None) def test__zope_dottedname_style_resolve_relative(self): import tests typ = self._makeOne() result = typ._zope_dottedname_style( '.test_path.TestDottedNameResolver', tests) self.assertEqual(result, self.__class__) def test__zope_dottedname_style_resolve_relative_leading_dots(self): import tests.test_path typ = self._makeOne() result = typ._zope_dottedname_style( '..tests.test_path.TestDottedNameResolver', tests) self.assertEqual(result, self.__class__) def test__zope_dottedname_style_resolve_relative_is_dot(self): import tests typ = self._makeOne() result = typ._zope_dottedname_style('.', tests) self.assertEqual(result, tests) def test__zope_dottedname_style_irresolveable_relative_is_dot(self): typ = self._makeOne() e = self.config_exc(typ._zope_dottedname_style, '.', None) self.assertEqual( e.args[0], "relative name '.' irresolveable without package") def test_zope_dottedname_style_resolve_relative_nocurrentpackage(self): typ = self._makeOne() e = self.config_exc(typ._zope_dottedname_style, '.whatever', None) self.assertEqual( e.args[0], "relative name '.whatever' irresolveable without package") def test_zope_dottedname_style_irrresolveable_relative(self): import tests typ = self._makeOne() self.assertRaises(ImportError, typ._zope_dottedname_style, '.notexisting', tests) def test__zope_dottedname_style_resolveable_relative(self): import tests typ = self._makeOne() result = typ._zope_dottedname_style('.', tests) self.assertEqual(result, tests) def test__zope_dottedname_style_irresolveable_absolute(self): typ = self._makeOne() self.assertRaises( ImportError, typ._zope_dottedname_style, 'pyramid.fudge.bar', None) def test__zope_dottedname_style_resolveable_absolute(self): typ = self._makeOne() result = typ._zope_dottedname_style( 'tests.test_path.TestDottedNameResolver', None) self.assertEqual(result, self.__class__) def test__pkg_resources_style_resolve_absolute(self): typ = self._makeOne() result = typ._pkg_resources_style( 'tests.test_path:TestDottedNameResolver', None) self.assertEqual(result, self.__class__) def test__pkg_resources_style_irrresolveable_absolute(self): typ = self._makeOne() self.assertRaises(ImportError, typ._pkg_resources_style, 'tests:nonexisting', None) def test__pkg_resources_style_resolve_relative(self): import tests typ = self._makeOne() result = typ._pkg_resources_style( '.test_path:TestDottedNameResolver', tests) self.assertEqual(result, self.__class__) def test__pkg_resources_style_resolve_relative_is_dot(self): import tests typ = self._makeOne() result = typ._pkg_resources_style('.', tests) self.assertEqual(result, tests) def test__pkg_resources_style_resolve_relative_nocurrentpackage(self): typ = self._makeOne() self.assertRaises(ValueError, typ._pkg_resources_style, '.whatever', None) def test__pkg_resources_style_irrresolveable_relative(self): import pyramid typ = self._makeOne() self.assertRaises(ImportError, typ._pkg_resources_style, ':notexisting', pyramid) def test_resolve_not_a_string(self): typ = self._makeOne() e = self.config_exc(typ.resolve, None) self.assertEqual(e.args[0], 'None is not a string') def test_resolve_using_pkgresources_style(self): typ = self._makeOne() result = typ.resolve( 'tests.test_path:TestDottedNameResolver') self.assertEqual(result, self.__class__) def test_resolve_using_zope_dottedname_style(self): typ = self._makeOne() result = typ.resolve( 'tests.test_path:TestDottedNameResolver') self.assertEqual(result, self.__class__) def test_resolve_missing_raises(self): typ = self._makeOne() self.assertRaises(ImportError, typ.resolve, 'cant.be.found') def test_resolve_caller_package(self): from pyramid.path import CALLER_PACKAGE typ = self._makeOne(CALLER_PACKAGE) self.assertEqual(typ.resolve('.test_path.TestDottedNameResolver'), self.__class__) def test_maybe_resolve_caller_package(self): from pyramid.path import CALLER_PACKAGE typ = self._makeOne(CALLER_PACKAGE) self.assertEqual(typ.maybe_resolve('.test_path.TestDottedNameResolver'), self.__class__) def test_ctor_string_module_resolveable(self): import tests typ = self._makeOne('tests.test_path') self.assertEqual(typ.package, tests) def test_ctor_string_package_resolveable(self): import tests typ = self._makeOne('tests') self.assertEqual(typ.package, tests) def test_ctor_string_irresolveable(self): self.assertRaises(ValueError, self._makeOne, 'cant.be.found') def test_ctor_module(self): import tests from . import test_path typ = self._makeOne(test_path) self.assertEqual(typ.package, tests) def test_ctor_package(self): import tests typ = self._makeOne(tests) self.assertEqual(typ.package, tests) def test_ctor_None(self): typ = self._makeOne(None) self.assertEqual(typ.package, None) class DummyPkgResource(object): pass class DummyPackageOrModule: def __init__(self, real_package_or_module, raise_exc=None): self.__dict__['raise_exc'] = raise_exc self.__dict__['__name__'] = real_package_or_module.__name__ import os self.__dict__['package_path'] = os.path.dirname( os.path.abspath(real_package_or_module.__file__)) self.__dict__['__file__'] = real_package_or_module.__file__ def __setattr__(self, key, val): if self.raise_exc is not None: raise self.raise_exc self.__dict__[key] = val class DummyNamespacePackage: """Has no __file__ attribute. """ def __init__(self, real_package_or_module): self.__name__ = real_package_or_module.__name__ import os self.package_path = os.path.dirname( os.path.abspath(real_package_or_module.__file__))