# HG changeset patch -- Bitbucket.org # Project apipkg # URL http://bitbucket.org/hpk42/apipkg/overview # User Ronny Pfannschmidt <ronny.pfannschm...@gmx.de> # Date 1280667205 -7200 # Node ID ef6f2e4e8c1b97edfd8a946ee1fe84d719b99482 # Parent 6cb3976c8d8aac3d332ed8f507cfdad34b4279a1 turn package paths absolute, so we dont get surprised via chdir
--- a/test_apipkg.py +++ b/test_apipkg.py @@ -192,7 +192,7 @@ def test_initpkg_transfers_attrs(monkeyp apipkg.initpkg('hello', {}) newmod = sys.modules['hello'] assert newmod != mod - assert newmod.__file__ == mod.__file__ + assert newmod.__file__ == py.path.local(mod.__file__) assert newmod.__version__ == mod.__version__ assert newmod.__loader__ == mod.__loader__ @@ -203,7 +203,7 @@ def test_initpkg_not_transfers_not_exist apipkg.initpkg('hello', {}) newmod = sys.modules['hello'] assert newmod != mod - assert newmod.__file__ == mod.__file__ + assert newmod.__file__ == py.path.local(mod.__file__) assert not hasattr(newmod, '__loader__') assert not hasattr(newmod, '__path__') @@ -300,4 +300,36 @@ def test_bpython_getattr_override(tmpdir }) d = api.__dict__ assert 'abspath' in d - + + + + +def test_chdir_with_relative_imports_shouldnt_break_lazy_loading(tmpdir): + execnet = py.test.importorskip('execnet') + pkg = tmpdir.mkdir('pkg') + messy = tmpdir.mkdir('messy') + pkg.join('__init__.py').write(py.code.Source(""" + import apipkg + apipkg.initpkg(__name__, { + 'test': '.sub:test', + }) + """)) + pkg.join('sub.py').write('def test(): pass') + gw = execnet.makegateway() + + def remote(channel, pkg, mess): + import os + import sys + sys.path.insert(0, '') + os.chdir(pkg) + import pkg + import py + py.builtin.print_(pkg.__path__, file=sys.stderr) + py.builtin.print_(pkg.__file__, file=sys.stderr) + py.builtin.print_(pkg, file=sys.stderr) + os.chdir(mess) + pkg.test() + ch = gw.remote_exec(remote, pkg=str(tmpdir), mess=str(messy)) + ch.waitclose() + + --- a/apipkg.py +++ b/apipkg.py @@ -5,6 +5,7 @@ see http://pypi.python.org/pypi/apipkg (c) holger krekel, 2009 - MIT license """ +import os import sys from types import ModuleType @@ -14,11 +15,16 @@ def initpkg(pkgname, exportdefs): """ initialize given package from the export definitions. """ mod = ApiModule(pkgname, exportdefs, implprefix=pkgname) oldmod = sys.modules[pkgname] - mod.__file__ = getattr(oldmod, '__file__', None) + file = getattr(oldmod, '__file__', None) + if file: + file = os.path.abspath(file) + mod.__file__ = file mod.__version__ = getattr(oldmod, '__version__', '0') - for name in ('__path__', '__loader__'): - if hasattr(oldmod, name): - setattr(mod, name, getattr(oldmod, name)) + if hasattr(oldmod, '__loader__'): + mod.__loader__ = oldmod.__loader__ + if hasattr(oldmod, '__path__'): + mod.__path__ = [os.path.abspath(p) for p in oldmod.__path__] + sys.modules[pkgname] = mod def importobj(modpath, attrname): _______________________________________________ py-svn mailing list py-svn@codespeak.net http://codespeak.net/mailman/listinfo/py-svn