提交 80c223bf 编写于 作者: W wuzewu

Recover module.py

上级 997c3882
...@@ -135,18 +135,15 @@ def runnable(func): ...@@ -135,18 +135,15 @@ def runnable(func):
class Module(object): class Module(object):
def __new__(cls,
name=None, _record = {}
directory=None,
module_dir=None, def __new__(cls, name=None, directory=None, module_dir=None, version=None):
version=None,
**kwargs):
if cls.__name__ == "Module": if cls.__name__ == "Module":
if name: if name:
module = cls.init_with_name( module = cls.init_with_name(name=name, version=version)
name=name, version=version, **kwargs)
elif directory: elif directory:
module = cls.init_with_directory(directory=directory, **kwargs) module = cls.init_with_directory(directory=directory)
elif module_dir: elif module_dir:
logger.warning( logger.warning(
"Parameter module_dir is deprecated, please use directory to specify the path" "Parameter module_dir is deprecated, please use directory to specify the path"
...@@ -157,28 +154,19 @@ class Module(object): ...@@ -157,28 +154,19 @@ class Module(object):
version = module_dir[1] version = module_dir[1]
else: else:
directory = module_dir directory = module_dir
module = cls.init_with_directory(directory=directory, **kwargs) module = cls.init_with_directory(directory=directory)
CacheUpdater("update_cache", module.name, module.version).start() CacheUpdater("update_cache", module.name, module.version).start()
else: else:
if not name and not directory: module = object.__new__(cls)
directory = os.path.dirname(
sys.modules[cls.__module__].__file__)
module = Module.init_with_directory(
directory=directory, **kwargs)
else:
module = object.__new__(cls)
return module return module
def __init__(self, def __init__(self, name=None, directory=None, module_dir=None,
name=None, version=None):
directory=None,
module_dir=None,
version=None,
**kwargs):
# Avoid module being initialized multiple times # Avoid module being initialized multiple times
if "_is_initialize" in self.__dict__ and self._is_initialize: if not directory or id(self) in Module._record:
return return
Module._record[id(self)] = True
mod = self.__class__.__module__ + "." + self.__class__.__name__ mod = self.__class__.__module__ + "." + self.__class__.__name__
if mod in _module_runnable_func: if mod in _module_runnable_func:
...@@ -207,11 +195,10 @@ class Module(object): ...@@ -207,11 +195,10 @@ class Module(object):
self._summary = utils.from_module_attr_to_pyobj( self._summary = utils.from_module_attr_to_pyobj(
module_info.map.data['summary']) module_info.map.data['summary'])
self._initialize(**kwargs) self._initialize()
self._is_initialize = True
@classmethod @classmethod
def init_with_name(cls, name, version=None, **kwargs): def init_with_name(cls, name, version=None):
fp_lock = open(os.path.join(CACHE_HOME, name), "a") fp_lock = open(os.path.join(CACHE_HOME, name), "a")
lock.flock(fp_lock, lock.LOCK_EX) lock.flock(fp_lock, lock.LOCK_EX)
log_msg = "Installing %s module" % name log_msg = "Installing %s module" % name
...@@ -227,29 +214,22 @@ class Module(object): ...@@ -227,29 +214,22 @@ class Module(object):
logger.info(tips) logger.info(tips)
lock.flock(fp_lock, lock.LOCK_UN) lock.flock(fp_lock, lock.LOCK_UN)
return cls.init_with_directory(directory=module_dir[0], **kwargs) return cls.init_with_directory(directory=module_dir[0])
@classmethod @classmethod
def init_with_directory(cls, directory, **kwargs): def init_with_directory(cls, directory):
desc_file = os.path.join(directory, MODULE_DESC_PBNAME) desc_file = os.path.join(directory, MODULE_DESC_PBNAME)
checker = ModuleChecker(directory) checker = ModuleChecker(directory)
checker.check() checker.check()
module_code_version = checker.module_code_version module_code_version = checker.module_code_version
if module_code_version == "v2": if module_code_version == "v2":
sys.path.insert(0, directory) basename = os.path.split(directory)[-1]
# clear module cache dirname = os.path.join(*list(os.path.split(directory)[:-1]))
if 'module' in sys.modules: sys.path.append(dirname)
sys.modules.pop('module') user_module = importlib.import_module("{}.module".format(basename))
_module = importlib.import_module("module") return user_module.HubModule(directory=directory)
for _item, _cls in inspect.getmembers(_module, inspect.isclass): return ModuleV1(directory=directory)
_item = _module.__dict__[_item]
if issubclass(_item, Module):
user_module = _item(directory=directory, **kwargs)
break
sys.path.pop(0)
return user_module
return ModuleV1(directory=directory, **kwargs)
@property @property
def run_func(self): def run_func(self):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册