# encoding=utf8
from __future__ import unicode_literals
import abc
import click
import six
import stevedore
from mohand.exception import HandDuplicationOfNameError
from mohand.state import env
from mohand.utils import MohandDict, Singleton
[文档]@six.add_metaclass(abc.ABCMeta)
class HandBase(object):
"""
用于定义hand任务的基类
"""
[文档] @abc.abstractmethod
def register(self, *args, **kwargs):
"""
注册hand任务
:return: 返回待注册的hand函数
:rtype: function
"""
[文档] @abc.abstractmethod
def version(self):
"""
版本信息
:return: 返回包名,版本号元组
:rtype: (str, str)
"""
[文档]class HandDict(MohandDict):
"""
Hand扩展插件集合字典(单例)
"""
__metaclass__ = Singleton
def __init__(self, *args, **kwargs):
super(HandDict, self).__init__(*args, **kwargs)
self['_click'] = click
[文档]def load_hands():
"""
加载hand扩展插件
:return: 返回hand注册字典(单例)
:rtype: HandDict
"""
# 优先进行自带 hand 的注册加载
import mohand.decorator # noqa
# 注册hand插件
mgr = stevedore.ExtensionManager(
namespace=env.plugin_namespace,
invoke_on_load=True)
def register_hand(ext):
_hand = ext.obj.register()
if hasattr(hand, _hand.__name__):
raise HandDuplicationOfNameError(_hand.__name__)
hand[_hand.__name__] = _hand
_pkg, _ver = ext.obj.version()
env.version[_pkg] = _ver
try:
mgr.map(register_hand)
except stevedore.exception.NoMatches:
pass
return hand
#: 所有已注册hand插件的装饰器集合实例,可通过 ``.`` 语法获取
hand = HandDict()