Minor fixes for the command system dispatching
This commit is contained in:
parent
09e1742bcc
commit
162dd1eb6f
|
@ -28,63 +28,63 @@ class Dispatcher(type):
|
||||||
commands = {}
|
commands = {}
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def register_host(klass, host):
|
def register_host(cls, host):
|
||||||
klass.containers[host] = []
|
cls.containers[host] = []
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def register_container(klass, container):
|
def register_container(cls, container):
|
||||||
for host in container.HOSTS:
|
for host in container.HOSTS:
|
||||||
klass.containers[host].append(container)
|
cls.containers[host].append(container)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def register_commands(klass, container):
|
def register_commands(cls, container):
|
||||||
klass.commands[container] = {}
|
cls.commands[container] = {}
|
||||||
for command in klass.traverse_commands(container):
|
for command in cls.traverse_commands(container):
|
||||||
for name in command.names:
|
for name in command.names:
|
||||||
klass.commands[container][name] = command
|
cls.commands[container][name] = command
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_command(klass, host, name):
|
def get_command(cls, host, name):
|
||||||
for container in klass.containers[host]:
|
for container in cls.containers[host]:
|
||||||
command = klass.commands[container].get(name)
|
command = cls.commands[container].get(name)
|
||||||
if command:
|
if command:
|
||||||
return command
|
return command
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def list_commands(klass, host):
|
def list_commands(cls, host):
|
||||||
for container in klass.containers[host]:
|
for container in cls.containers[host]:
|
||||||
commands = klass.commands[container]
|
commands = cls.commands[container]
|
||||||
for name, command in commands.iteritems():
|
for name, command in commands.iteritems():
|
||||||
yield name, command
|
yield name, command
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def traverse_commands(klass, container):
|
def traverse_commands(cls, container):
|
||||||
for name in dir(container):
|
for name in dir(container):
|
||||||
attribute = getattr(container, name)
|
attribute = getattr(container, name)
|
||||||
if klass.is_command(attribute):
|
if cls.is_command(attribute):
|
||||||
yield attribute
|
yield attribute
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def is_root(ns):
|
def is_root(ns):
|
||||||
meta = ns.get('__metaclass__', NoneType)
|
metaclass = ns.get('__metaclass__', NoneType)
|
||||||
return issubclass(meta, Dispatcher)
|
return issubclass(metaclass, Dispatcher)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def is_command(attribute):
|
def is_command(attribute):
|
||||||
name = attribute.__class__.__name__
|
from framework import Command
|
||||||
return name == 'Command'
|
return isinstance(attribute, Command)
|
||||||
|
|
||||||
class HostDispatcher(Dispatcher):
|
class HostDispatcher(Dispatcher):
|
||||||
|
|
||||||
def __init__(klass, name, bases, ns):
|
def __init__(self, name, bases, ns):
|
||||||
if not Dispatcher.is_root(ns):
|
if not Dispatcher.is_root(ns):
|
||||||
HostDispatcher.register_host(klass)
|
HostDispatcher.register_host(self)
|
||||||
super(HostDispatcher, klass).__init__(name, bases, ns)
|
super(HostDispatcher, self).__init__(name, bases, ns)
|
||||||
|
|
||||||
class ContainerDispatcher(Dispatcher):
|
class ContainerDispatcher(Dispatcher):
|
||||||
|
|
||||||
def __init__(klass, name, bases, ns):
|
def __init__(self, name, bases, ns):
|
||||||
if not Dispatcher.is_root(ns):
|
if not Dispatcher.is_root(ns):
|
||||||
ContainerDispatcher.register_container(klass)
|
ContainerDispatcher.register_container(self)
|
||||||
ContainerDispatcher.register_commands(klass)
|
ContainerDispatcher.register_commands(self)
|
||||||
super(ContainerDispatcher, klass).__init__(name, bases, ns)
|
super(ContainerDispatcher, self).__init__(name, bases, ns)
|
||||||
|
|
Loading…
Reference in New Issue