forked from platypush/platypush
Support for synchronous and asynchronous procedures
This commit is contained in:
parent
b98fe01352
commit
f83aedf0f1
4 changed files with 26 additions and 12 deletions
|
@ -12,7 +12,7 @@ from .event.processor import EventProcessor
|
||||||
from .message.event import Event, StopEvent
|
from .message.event import Event, StopEvent
|
||||||
from .message.request import Request
|
from .message.request import Request
|
||||||
from .message.response import Response
|
from .message.response import Response
|
||||||
from .procedure import Procedure
|
|
||||||
|
|
||||||
__author__ = 'Fabio Manganiello <blacklight86@gmail.com>'
|
__author__ = 'Fabio Manganiello <blacklight86@gmail.com>'
|
||||||
__version__ = '0.6.5'
|
__version__ = '0.6.5'
|
||||||
|
|
|
@ -78,8 +78,13 @@ class Config(object):
|
||||||
hook_name = '.'.join(key.split('.')[2:])
|
hook_name = '.'.join(key.split('.')[2:])
|
||||||
self.event_hooks[hook_name] = self._config[key]
|
self.event_hooks[hook_name] = self._config[key]
|
||||||
elif key.startswith('procedure.'):
|
elif key.startswith('procedure.'):
|
||||||
procedure_name = '.'.join(key.split('.')[1:])
|
tokens = key.split('.')
|
||||||
self.procedures[procedure_name] = self._config[key]
|
async = True if tokens[1] == 'async' else False
|
||||||
|
procedure_name = '.'.join(tokens[2:])
|
||||||
|
self.procedures[procedure_name] = {
|
||||||
|
'async': async,
|
||||||
|
'actions': self._config[key]
|
||||||
|
}
|
||||||
else:
|
else:
|
||||||
self.plugins[key] = self._config[key]
|
self.plugins[key] = self._config[key]
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,10 @@ class Request(Message):
|
||||||
logging.info('Executing procedure request: {}'.format(self.action))
|
logging.info('Executing procedure request: {}'.format(self.action))
|
||||||
proc_name = self.action.split('.')[-1]
|
proc_name = self.action.split('.')[-1]
|
||||||
proc_config = Config.get_procedures()[proc_name]
|
proc_config = Config.get_procedures()[proc_name]
|
||||||
proc = Procedure.build(name=proc_name, requests=proc_config, backend=self.backend, id=self.id)
|
proc = Procedure.build(name=proc_name, requests=proc_config['actions'],
|
||||||
|
async=proc_config['async'],
|
||||||
|
backend=self.backend, id=self.id)
|
||||||
|
|
||||||
return proc.execute(*args, **kwargs)
|
return proc.execute(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,14 +7,17 @@ from ..message.response import Response
|
||||||
class Procedure(object):
|
class Procedure(object):
|
||||||
""" Procedure class. A procedure is a pre-configured list of requests """
|
""" Procedure class. A procedure is a pre-configured list of requests """
|
||||||
|
|
||||||
def __init__(self, name, requests, backend=None):
|
def __init__(self, name, async, requests, backend=None):
|
||||||
"""
|
"""
|
||||||
Params:
|
Params:
|
||||||
name -- Procedure name
|
name -- Procedure name
|
||||||
|
async -- Whether the actions in the procedure are supposed to
|
||||||
|
be executed sequentially or in parallel (True or False)
|
||||||
requests -- List of platylist.message.request.Request objects
|
requests -- List of platylist.message.request.Request objects
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.name = name
|
self.name = name
|
||||||
|
self.async = async
|
||||||
self.requests = requests
|
self.requests = requests
|
||||||
self.backend = backend
|
self.backend = backend
|
||||||
|
|
||||||
|
@ -22,7 +25,7 @@ class Procedure(object):
|
||||||
req.backend = self.backend
|
req.backend = self.backend
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def build(cls, name, requests, backend=None, id=None, **kwargs):
|
def build(cls, name, async, requests, backend=None, id=None, **kwargs):
|
||||||
reqs = []
|
reqs = []
|
||||||
for request_config in requests:
|
for request_config in requests:
|
||||||
request_config['origin'] = Config.get('device_id')
|
request_config['origin'] = Config.get('device_id')
|
||||||
|
@ -33,7 +36,7 @@ class Procedure(object):
|
||||||
request = Request.build(request_config)
|
request = Request.build(request_config)
|
||||||
reqs.append(request)
|
reqs.append(request)
|
||||||
|
|
||||||
return cls(name=name, requests=reqs, backend=backend, **kwargs)
|
return cls(name=name, async=async, requests=reqs, backend=backend, **kwargs)
|
||||||
|
|
||||||
def execute(self, n_tries=1):
|
def execute(self, n_tries=1):
|
||||||
"""
|
"""
|
||||||
|
@ -47,12 +50,15 @@ class Procedure(object):
|
||||||
response = Response()
|
response = Response()
|
||||||
|
|
||||||
for request in self.requests:
|
for request in self.requests:
|
||||||
response = request.execute(n_tries, async=False, **context)
|
if self.async:
|
||||||
context = { k:v for (k,v) in response.output.items() } \
|
request.execute(n_tries, async=True, **context)
|
||||||
if isinstance(response.output, dict) else {}
|
else:
|
||||||
|
response = request.execute(n_tries, async=False, **context)
|
||||||
|
context = { k:v for (k,v) in response.output.items() } \
|
||||||
|
if isinstance(response.output, dict) else {}
|
||||||
|
|
||||||
context['output'] = response.output
|
context['output'] = response.output
|
||||||
context['errors'] = response.errors
|
context['errors'] = response.errors
|
||||||
|
|
||||||
return response
|
return response
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue