Completed
Push — master ( 0bc61b...16fc24 )
by Thomas
8s
created

doorpi/action/base.py (1 issue)

1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3
4
import logging
5
logger = logging.getLogger(__name__)
6
logger.debug("%s loaded", __name__)
7
8
from time import sleep
0 ignored issues
show
Unused sleep imported from time
Loading history...
9
import importlib
10
11
class SingleAction:
12
    action_name = None
13
    single_fire_action = False
14
15
    @property
16
    def name(self):
17
        return "%s with args %s and kwargs %s" % (
18
            self.action_name,
19
            self.__args,
20
            self.__kwargs
21
        )
22
23
    def __init__(self, callback, *args, **kwargs):
24
        self.__callback = callback
25
        self.__args = args
26
        self.__kwargs = kwargs
27
        if len(self.__class__.__bases__) is 0:
28
            self.action_name = str(callback)
29
        else:
30
            self.action_name = self.__class__.__name__
31
32
    def __str__(self):
33
        return self.name
34
35
    def run(self, silent_mode = False):
36
        if not silent_mode:
37
            logger.trace('run %s with args %s and kwargs %s',
38
                         self.__class__.__name__,
39
                         self.__args,
40
                         self.__kwargs
41
            )
42
        try:
43
            if len(self.__args) is not 0 and len(self.__kwargs) is not 0:
44
                #print "args and kwargs"
45
                return self.__callback(*self.__args, **self.__kwargs)
46
            elif len(self.__args) is 0 and len(self.__kwargs) is not 0:
47
                #print "no args but kwargs"
48
                return self.__callback(**self.__kwargs)
49
            elif len(self.__args) is not 0 and len(self.__kwargs) is 0:
50
                #print "args and no kwargs"
51
                return self.__callback(*self.__args)
52
            else:
53
                #print "no args and no kwargs"
54
                return self.__callback()
55
        except TypeError as ex:
56
            logger.exception(ex)
57
58
    @staticmethod
59
    def from_string(config_string):
60
        try:
61
            action_name = config_string.split(':', 1)[0]
62
            try: parameters = config_string.split(':', 1)[1]
63
            except: parameters = ""
64
            return importlib.import_module('doorpi.action.SingleActions.'+action_name).get(
65
                parameters
66
            )
67
        except:
68
            logger.exception('error while creating SingleAction from config string: %s',config_string)
69
            return None