<reponame>lukebeer/GambolPutty
# -*- coding: utf-8 -*-
import sys
import BaseThreadedModule
import Utils
import Decorators

@Decorators.ModuleDocstringParser
class ExecPython(BaseThreadedModule.BaseThreadedModule):
    """
    Execute python code.

    To make sure that the yaml parser keeps the tabs in the source code, ensure that the code is preceded by a comment.
    E.g.:

- ExecPython:
    source: |
      # Useless comment...
        try:
            imported = math
        except NameError:
            import math
        event['request_time'] = math.ceil(event['request_time'] * 1000)

    imports: Modules to import, e.g. re, math etc.
    code: Code to execute.
    debug: Set to True to output the string that will be executed.

    Configuration template:

    - ExecPython:
        imports:              # <default: []; type: list; is: optional>
        source:               # <type: string; is: required>
        debug:                # <default: False; type: boolean; is: optional>
        receivers:
          - NextModule
    """

    module_type = "misc"
    """Set module type"""

    def configure(self, configuration):
        # Call parent configure method
        BaseThreadedModule.BaseThreadedModule.configure(self, configuration)
        for module in self.getConfigurationValue("imports"):
            exec("import %s" % module)
        source = "def UserFunc(event):\n%s" % self.getConfigurationValue("source")
        if self.getConfigurationValue("debug"):
            print source
        exec(source)
        try:
            pass
        except:
            etype, evalue, etb = sys.exc_info()
            self.logger.error("ExecPython failed while creating user function. Exception: %s, Error: %s" % (etype, evalue))
            self.gp.shutDown()
        self._func = locals()["UserFunc"]


    def handleEvent(self, event):
        try:
            self._func(event)
        except:
            etype, evalue, etb = sys.exc_info()
            self.logger.warning("ExecPython failed. Exception: %s, Error: %s" % (etype, evalue))
        yield event

# -*- coding: utf-8 -*-
import sys
import BaseThreadedModule
import Utils
import Decorators

@Decorators.ModuleDocstringParser
class ExecPython(BaseThreadedModule.BaseThreadedModule):
    """
    Execute python code.

    To make sure that the yaml parser keeps the tabs in the source code, ensure that the code is preceded by a comment.
    E.g.:

- ExecPython:
    source: |
      # Useless comment...
        try:
            imported = math
        except NameError:
            import math
        event['request_time'] = math.ceil(event['request_time'] * 1000)

    imports: Modules to import, e.g. re, math etc.
    code: Code to execute.
    debug: Set to True to output the string that will be executed.

    Configuration template:

    - ExecPython:
        imports:              # <default: []; type: list; is: optional>
        source:               # <type: string; is: required>
        debug:                # <default: False; type: boolean; is: optional>
        receivers:
          - NextModule
    """

    module_type = "misc"
    """Set module type"""

    def configure(self, configuration):
        # Call parent configure method
        BaseThreadedModule.BaseThreadedModule.configure(self, configuration)
        for module in self.getConfigurationValue("imports"):
            exec("import %s" % module)
        source = "def UserFunc(event):\n%s" % self.getConfigurationValue("source")
        if self.getConfigurationValue("debug"):
            print source
        exec(source)
        try:
            pass
        except:
            etype, evalue, etb = sys.exc_info()
            self.logger.error("ExecPython failed while creating user function. Exception: %s, Error: %s" % (etype, evalue))
            self.gp.shutDown()
        self._func = locals()["UserFunc"]


    def handleEvent(self, event):
        try:
            self._func(event)
        except:
            etype, evalue, etb = sys.exc_info()
            self.logger.warning("ExecPython failed. Exception: %s, Error: %s" % (etype, evalue))
        yield event
# -*- coding: utf-8 -*- Execute python code.      To make sure that the yaml parser keeps the tabs in the source code, ensure that the code is preceded by a comment.     E.g.:  - ExecPython:     source: |       # Useless comment...         try:             imported = math         except NameError:             import math         event['request_time'] = math.ceil(event['request_time'] * 1000)      imports: Modules to import, e.g. re, math etc.     code: Code to execute.     debug: Set to True to output the string that will be executed.      Configuration template:      - ExecPython:         imports:              # <default: []; type: list; is: optional>         source:               # <type: string; is: required>         debug:                # <default: False; type: boolean; is: optional>         receivers:           - NextModule Set module type # Call parent configure method