85 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			85 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
"""
 | 
						|
 | 
						|
"""
 | 
						|
 | 
						|
import py
 | 
						|
import sys
 | 
						|
 | 
						|
log = py.log.get("dynpkg", 
 | 
						|
                 info=py.log.STDOUT, 
 | 
						|
                 debug=py.log.STDOUT,
 | 
						|
                 command=None) # py.log.STDOUT)
 | 
						|
 | 
						|
from distutils import util
 | 
						|
 | 
						|
class DistPython: 
 | 
						|
    def __init__(self, location=None, python=None): 
 | 
						|
        if python is None:
 | 
						|
            python = py.std.sys.executable
 | 
						|
        self.python = python
 | 
						|
        if location is None:
 | 
						|
            location = py.path.local()
 | 
						|
        self.location = location 
 | 
						|
        self.plat_specifier = '.%s-%s' % (util.get_platform(), sys.version[0:3])
 | 
						|
 | 
						|
    def clean(self):
 | 
						|
        out = self._exec("clean -a")
 | 
						|
        #print out
 | 
						|
 | 
						|
    def build(self):
 | 
						|
        out = self._exec("build")
 | 
						|
        #print out
 | 
						|
 | 
						|
    def _exec(self, cmd):
 | 
						|
        python = self.python 
 | 
						|
        old = self.location.chdir()
 | 
						|
        try:
 | 
						|
            cmd = "%(python)s setup.py %(cmd)s" % locals()
 | 
						|
            log.command(cmd)
 | 
						|
            out = py.process.cmdexec(cmd)
 | 
						|
        finally:
 | 
						|
            old.chdir()
 | 
						|
        return out 
 | 
						|
 | 
						|
    def get_package_path(self, pkgname):
 | 
						|
        pkg = self._get_package_path(pkgname) 
 | 
						|
        if pkg is None:
 | 
						|
            #self.clean()
 | 
						|
            self.build()
 | 
						|
            pkg = self._get_package_path(pkgname)
 | 
						|
        assert pkg is not None 
 | 
						|
        return pkg 
 | 
						|
 | 
						|
    def _get_package_path(self, pkgname):
 | 
						|
        major, minor = py.std.sys.version_info[:2]
 | 
						|
        #assert major >=2 and minor in (3,4,5)
 | 
						|
        suffix = "%s.%s" %(major, minor)
 | 
						|
        location = self.location
 | 
						|
        for base in [location.join('build', 'lib'),
 | 
						|
                     location.join('build', 'lib'+ self.plat_specifier)]:
 | 
						|
            if base.check(dir=1):
 | 
						|
                for pkg in base.visit(lambda x: x.check(dir=1)):
 | 
						|
                    if pkg.basename == pkgname:
 | 
						|
                        # 
 | 
						|
                        if pkg.dirpath().basename ==  'lib'+ self.plat_specifier or \
 | 
						|
                           pkg.dirpath().basename == 'lib':
 | 
						|
                            return pkg
 | 
						|
 | 
						|
def setpkg(finalpkgname, distdir):
 | 
						|
    assert distdir.check(dir=1)
 | 
						|
    dist = DistPython(distdir) 
 | 
						|
    pkg = dist.get_package_path(finalpkgname) 
 | 
						|
    assert pkg.check(dir=1)
 | 
						|
    sys.path.insert(0, str(pkg.dirpath()))
 | 
						|
    try:
 | 
						|
        modname = pkg.purebasename
 | 
						|
        if modname in sys.modules:
 | 
						|
            log.debug("removing from sys.modules:", modname)
 | 
						|
            del sys.modules[modname]
 | 
						|
        sys.modules[modname] = mod = __import__(modname) 
 | 
						|
    finally: 
 | 
						|
        sys.path[0] # XXX
 | 
						|
    log.info("module is at", mod.__file__) 
 | 
						|
    return mod 
 | 
						|
 
 |