[py-svn] r13645 - in py/dist/py: . misc/testing
hpk at codespeak.net
hpk at codespeak.net
Tue Jun 21 02:20:32 CEST 2005
Author: hpk
Date: Tue Jun 21 02:20:30 2005
New Revision: 13645
Modified:
py/dist/py/__init__.py
py/dist/py/initpkg.py
py/dist/py/misc/testing/test_initpkg.py
Log:
reworked and (i think) simplified the implementation for clean
imports from whole-modules. You now use '*' to specify that
you want to export a whole module's names. You cannot do this
currently at root-level, i think, but that is ok. let's
avoid using '*' for specifying names, anyway.
Modified: py/dist/py/__init__.py
==============================================================================
--- py/dist/py/__init__.py (original)
+++ py/dist/py/__init__.py Tue Jun 21 02:20:30 2005
@@ -3,7 +3,7 @@
py.test, an interactive testing tool which supports
unit-testing with practically no boilerplate.
"""
-from initpkg import initpkg, RealModule
+from initpkg import initpkg
initpkg(__name__,
description = "py.test and the py lib",
@@ -109,7 +109,7 @@
'log.STDOUT' : ('./log/consumer.py', 'STDOUT'),
'log.STDERR' : ('./log/consumer.py', 'STDERR'),
- 'compat.doctest' : ('./compat/doctest.py', RealModule),
- 'compat.optparse' : ('./compat/optparse.py', RealModule),
- 'compat.textwrap' : ('./compat/textwrap.py', RealModule),
+ 'compat.doctest' : ('./compat/doctest.py', '*'),
+ 'compat.optparse' : ('./compat/optparse.py', '*'),
+ 'compat.textwrap' : ('./compat/textwrap.py', '*'),
})
Modified: py/dist/py/initpkg.py
==============================================================================
--- py/dist/py/initpkg.py (original)
+++ py/dist/py/initpkg.py Tue Jun 21 02:20:30 2005
@@ -168,16 +168,24 @@
self.__map__ = {}
def __getattr__(self, name):
- try:
- extpy = self.__map__[name]
- except KeyError:
- __tracebackhide__ = True
- raise AttributeError(name)
- #print "getattr(%r, %r)" %(self, name)
- result = self.__package__._resolve(extpy)
+ if '*' in self.__map__:
+ extpy = self.__map__['*'][0], name
+ result = self.__package__._resolve(extpy)
+ else:
+ try:
+ extpy = self.__map__[name]
+ except KeyError:
+ __tracebackhide__ = True
+ raise AttributeError(name)
+ else:
+ result = self.__package__._resolve(extpy)
+ del self.__map__[name]
setattr(self, name, result)
- del self.__map__[name]
- # XXX modify some attrs to make a class appear at virtual module level
+ self._fixinspection(result, name)
+ return result
+
+ def _fixinspection(self, result, name):
+ # modify some attrs to make a class appear at export level
if hasattr(result, '__module__'):
try:
setattr(result, '__module__', self.__name__)
@@ -188,52 +196,22 @@
setattr(result, '__name__', name)
except (AttributeError, TypeError):
pass
- # print "setting virtual module on %r" % result
- return result
def __repr__(self):
return '<Module %r>' % (self.__name__, )
def getdict(self):
# force all the content of the module to be loaded when __dict__ is read
- for name in self.__map__.keys():
- hasattr(self, name) # force attribute to be loaded, ignore errors
- assert not self.__map__, "%r not empty" % self.__map__
- dictdescr = ModuleType.__dict__['__dict__']
- return dictdescr.__get__(self)
-
- __dict__ = property(getdict)
- del getdict
-
-class RealModule(ModuleType):
- def __init__(self, pkg, name, extpy):
- self.__package__ = pkg
- self.__name__ = name
- self.__extpy__ = extpy
- self.__isimported__ = False
-
- def __getattr__(self, name):
- dct = self.__doimport()
- if not name in dct:
- raise AttributeError, name
- return dct[name]
-
- def __repr__(self):
- return '<RealModule %r>' % (self.__name__, )
-
- def __doimport(self):
- dictdescr = ModuleType.__dict__['__dict__']
- dct = dictdescr.__get__(self) # avoid infinite recursion
- if not self.__isimported__:
- module = self.__package__._resolve(self.__extpy__)
- dct.update(module.__dict__)
- self.__isimported__ = True
- return dct
-
- def getdict(self):
- self.__doimport()
dictdescr = ModuleType.__dict__['__dict__']
- return dictdescr.__get__(self)
+ dict = dictdescr.__get__(self)
+ if '*' not in self.__map__:
+ for name in self.__map__.keys():
+ hasattr(self, name) # force attribute to be loaded, ignore errors
+ assert not self.__map__, "%r not empty" % self.__map__
+ else:
+ fsname = self.__map__['*'][0]
+ dict.update(self.__package__._loadimpl(fsname[:-3]).__dict__)
+ return dict
__dict__ = property(getdict)
del getdict
@@ -253,7 +231,11 @@
for pypath, extpy in pkg.exportitems():
pyparts = pypath.split('.')
- modparts = pyparts[:-1]
+ modparts = pyparts[:]
+ if extpy[1] != '*':
+ lastmodpart = modparts.pop()
+ else:
+ lastmodpart = '*'
current = pkgname
# ensure modules
@@ -265,23 +247,13 @@
setattr(seen[previous], name, mod)
setmodule(current, mod)
- if not isinstance(extpy[1], basestring):
- klass = extpy[1]
- previous = current
- name = pyparts[-1]
- current += '.' + name
- if current not in seen:
- seen[current] = mod = klass(pkg, current, extpy)
- setattr(seen[previous], name, mod)
- setmodule(current, mod)
- continue
-
mod = seen[current]
if not hasattr(mod, '__map__'):
assert mod is pkg.module, \
"only root modules are allowed to be non-lazy. "
deferred_imports.append((mod, pyparts[-1], extpy))
else:
- mod.__map__[pyparts[-1]] = extpy
+ mod.__map__[lastmodpart] = extpy
+
for mod, pypart, extpy in deferred_imports:
setattr(mod, pypart, pkg._resolve(extpy))
Modified: py/dist/py/misc/testing/test_initpkg.py
==============================================================================
--- py/dist/py/misc/testing/test_initpkg.py (original)
+++ py/dist/py/misc/testing/test_initpkg.py Tue Jun 21 02:20:30 2005
@@ -114,7 +114,7 @@
tfile.write(py.code.Source("""
import py
py.initpkg('realtest', {
- 'module': ('./testmodule.py', py.__.initpkg.RealModule)
+ 'x.module': ('./testmodule.py', '*'),
})
"""))
@@ -138,27 +138,27 @@
def setup_method(self, *args):
"""Unload the test modules before each test."""
- module_names = ['realtest.module', 'realtest']
+ module_names = ['realtest', 'realtest.x', 'realtest.x.module']
for modname in module_names:
if modname in sys.modules:
del sys.modules[modname]
def test_realmodule(self):
- """Testing 'import realtest.module'"""
- import realtest.module
- assert 'realtest.module' in sys.modules
- assert getattr(realtest.module, 'mytest0')
+ """Testing 'import realtest.x.module'"""
+ import realtest.x.module
+ assert 'realtest.x.module' in sys.modules
+ assert getattr(realtest.x.module, 'mytest0')
def test_realmodule_from(self):
"""Testing 'from test import module'."""
- from realtest import module
+ from realtest.x import module
assert getattr(module, 'mytest1')
def test_realmodule_star(self):
"""Testing 'from test.module import *'."""
tfile = self.tmpdir.join('startest.py')
- tfile.write(py.code.Source("""if True:
- from realtest.module import *
+ tfile.write(py.code.Source("""
+ from realtest.x.module import *
globals()['mytest0']
globals()['mytest1']
globals()['MyTest']
@@ -167,15 +167,12 @@
def test_realmodule_dict_import(self):
"Test verifying that accessing the __dict__ invokes the import"
- import realtest.module
- assert realtest.module.__isimported__ == False
- moddict = dir(realtest.module)
- assert realtest.module.__isimported__ == True
+ import realtest.x.module
+ moddict = realtest.x.module.__dict__
assert 'mytest0' in moddict
assert 'mytest1' in moddict
assert 'MyTest' in moddict
-
#class TestStdHook:
# """Tests imports for the standard Python library hook."""
#
More information about the pytest-commit
mailing list