mirror of
https://bitbucket.org/smil3y/kde-workspace.git
synced 2025-02-26 11:52:52 +00:00
114 lines
3.8 KiB
Python
114 lines
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
#
|
|
# Copyright 2008 Simon Edwards <simon@simonzone.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU Library General Public License as
|
|
# published by the Free Software Foundation; either version 2, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details
|
|
#
|
|
# You should have received a copy of the GNU Library General Public
|
|
# License along with this program; if not, write to the
|
|
# Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
#
|
|
|
|
import sys
|
|
import os
|
|
import imp
|
|
|
|
class PlasmaImporter(object):
|
|
def __init__(self):
|
|
self.toplevel = {}
|
|
self.toplevelcount = {}
|
|
self.marker = '<plasma>' + str(id(self))
|
|
sys.path.append(self.marker)
|
|
sys.path_hooks.append(self.hook)
|
|
|
|
def hook(self,path):
|
|
if path==self.marker:
|
|
return self
|
|
else:
|
|
raise ImportError()
|
|
|
|
def register_top_level(self,name,path):
|
|
if name not in self.toplevel:
|
|
self.toplevelcount[name] = 1
|
|
self.toplevel[name] = path
|
|
else:
|
|
self.toplevelcount[name] += 1
|
|
|
|
def unregister_top_level(self,name):
|
|
value = self.toplevelcount[name]-1
|
|
self.toplevelcount[name] = value
|
|
if value==0:
|
|
del self.toplevelcount[name]
|
|
del self.toplevel[name]
|
|
for key in list(sys.modules.keys()):
|
|
if key==name or key.startswith(name+"."):
|
|
del sys.modules[key]
|
|
|
|
def find_module(self,fullname, path=None):
|
|
location = self.find_pymod(fullname)
|
|
if location is not None:
|
|
return self
|
|
else:
|
|
return None
|
|
|
|
# Find the given module in the plasma directory.
|
|
# Result a tuple on success otherwise None. The tuple contains the location
|
|
# of the module/package in disk and a boolean indicating if it is a package
|
|
# or module
|
|
def find_pymod(self,modulename):
|
|
parts = modulename.split('.')
|
|
toppackage = parts[0]
|
|
rest = parts[1:]
|
|
|
|
if toppackage in self.toplevel:
|
|
path = self.toplevel[toppackage]
|
|
if len(rest)==0:
|
|
# Simple top level Plasma package
|
|
return (path,True)
|
|
else:
|
|
restpath = apply(os.path.join,rest)
|
|
fullpath = os.path.join(path,'contents','code',restpath)
|
|
if os.path.isdir(fullpath):
|
|
return (fullpath,True)
|
|
elif os.path.exists(fullpath+'.py'):
|
|
return (fullpath+'.py',False)
|
|
else:
|
|
return None
|
|
|
|
def _get_code(self,location):
|
|
return open(location).read()
|
|
|
|
def load_module(self, fullname):
|
|
location,ispkg = self.find_pymod(fullname)
|
|
if ispkg: # Package dir.
|
|
initlocation = os.path.join(location,'__init__.py')
|
|
code = None
|
|
if os.path.isfile(initlocation):
|
|
code = open(initlocation)
|
|
else:
|
|
code = open(location)
|
|
|
|
mod = sys.modules.setdefault(fullname, imp.new_module(fullname))
|
|
mod.__file__ = location #"<%s>" % self.__class__.__name__
|
|
mod.__loader__ = self
|
|
if ispkg:
|
|
mod.__path__ = [self.marker]
|
|
if code is not None:
|
|
try:
|
|
exec(code in mod.__dict__)
|
|
finally:
|
|
code.close()
|
|
return mod
|
|
|
|
#plasma_importer = PlasmaImporter()
|
|
#plasma_importer.register_top_level('plasma_pyclock','/home/sbe/devel/python_plasma_2/test/plasma-pyclock')
|
|
#from plasma_pyclock import main
|