Source code for panoramisk.actions
import asyncio
from . import utils
[docs]class Action(utils.CaseInsensitiveDict, asyncio.Future):
"""Dict like object to handle actions.
Generate action IDs for you:
..
>>> utils.IdGenerator.reset('myuuid')
.. code-block:: python
>>> action = Action({'Action': 'Status'})
>>> print(action) # doctest: +NORMALIZE_WHITESPACE
Action: Status
ActionID: action/myuuid/1/1
>>> action = Action({'Action': 'SIPnotify',
... 'Variable': ['1', '2']})
>>> print(action) # doctest: +NORMALIZE_WHITESPACE
Action: SIPnotify
ActionID: action/myuuid/1/2
Variable: 1
Variable: 2
"""
action_id_generator = utils.IdGenerator('action')
def __init__(self, *args, **kwargs):
self.as_list = kwargs.pop('as_list', None)
super(Action, self).__init__(*args, **kwargs)
asyncio.Future.__init__(self)
if 'actionid' not in self:
self['ActionID'] = self.action_id_generator()
self.responses = []
self.responses_index = 0
def __aiter__(self):
return self
async def __anext__(self):
while True:
if self.responses_index < len(self.responses):
res = self.responses[self.responses_index]
self.responses_index += 1
return res
elif self.done():
raise StopAsyncIteration
else:
await asyncio.sleep(.1)
@property
def id(self):
return self.actionid
action_id = id
def __str__(self):
action = []
for k, v in sorted(self.items()):
if isinstance(v, (list, tuple)):
action.extend(['%s: %s' % (k, i) for i in v])
else:
action.append('%s: %s' % (k, v))
action.append(utils.EOL)
return utils.EOL.join(action)
@property
def multi(self):
resp = self.responses[0]
msg = resp.message.lower()
if self.as_list is not None:
return bool(self.as_list)
elif resp.subevent == 'Start':
return True
elif 'EventList' in resp and resp['EventList'] == 'start':
return True
elif 'will follow' in msg:
return True
elif msg.startswith('added') and msg.endswith('to queue'):
return True
elif msg.endswith('successfully queued') and self['async'] != 'false':
return True
return False
@property
def completed(self):
resp = self.responses[-1]
if resp.event.endswith('Complete'):
return True
elif resp.subevent in ('End', 'Exec'):
return True
elif resp.response in ('Success', 'Error', 'Fail', 'Failure'):
return True
elif not self.multi:
return True
return False
def add_message(self, message):
self.responses.append(message)
multi = self.multi
if self.completed and not self.done():
if multi and len(self.responses) > 1:
self.set_result(self.responses)
elif not multi:
self.set_result(self.responses[0])
else:
return False
return True
[docs]class Command(Action):
"""Dict like object to handle Commands.
Generate action/command IDs for you:
..
>>> utils.IdGenerator.reset('myuuid')
.. code-block:: python
>>> command = Command({'Command' : 'Do something'})
>>> print(command) # doctest: +NORMALIZE_WHITESPACE
Action: Command
ActionID: action/myuuid/1/1
Command: Do something
CommandID: command/myuuid/1/1
"""
command_id_generator = utils.IdGenerator('command')
def __init__(self, *args, **kwargs):
super(Command, self).__init__(*args, **kwargs)
if 'action' not in self:
self['Action'] = 'Command'
if 'commandid' not in self:
self['CommandID'] = self.command_id_generator()
@property
def id(self):
return self.commandid
@property
def action_id(self):
return self.actionid or None