[ 
https://issues.apache.org/jira/browse/ARIA-146?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15983170#comment-15983170
 ] 

ASF GitHub Bot commented on ARIA-146:
-------------------------------------

Github user mxmrlv commented on a diff in the pull request:

    https://github.com/apache/incubator-ariatosca/pull/109#discussion_r113233667
  
    --- Diff: aria/cli/execution_logging.py ---
    @@ -12,62 +12,208 @@
     # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     # See the License for the specific language governing permissions and
     # limitations under the License.
    -
    +import os
    +import re
     from StringIO import StringIO
    +from contextlib import contextmanager
     
     from . import logger
    +from .color import Color
     from .env import env
     
    +
    +LEVEL = 'level'
    +TIMESTAMP = 'timestamp'
    +MESSAGE = 'message'
    +IMPLEMENTATION = 'implementation'
    +INPUTS = 'inputs'
    +TRACEBACK = 'traceback'
    +MARKER = 'marker'
    +
    +FINAL_STATES = 'final_states'
    +SUCCESS_STATE = 'success'
    +CANCEL_STATE = 'cancel'
    +FAIL_STATE = 'fail'
    +
    +
    +_EXECUTION_BASE_PATTERN = "\'.*\' workflow execution "
    +_SUCCESSFUL_EXECUTION_PATTERN = _EXECUTION_BASE_PATTERN + "succeeded"
    +_FAILED_EXECUTION_PATTERN = _EXECUTION_BASE_PATTERN + "failed"
    +_CANCELED_EXECUTION_PATTERN = _EXECUTION_BASE_PATTERN + "canceled"
    +
     DEFAULT_FORMATTING = {
    -    logger.NO_VERBOSE: {'message': '{item.msg}'},
    +    logger.NO_VERBOSE: {'message': '{message}'},
         logger.LOW_VERBOSE: {
    -        'message': '{timestamp} | {item.level[0]} | {item.msg}',
    -        'timestamp': '%H:%M:%S'
    +        MESSAGE: '{timestamp} | {level} | {message}',
    +        LEVEL: '{level[0]}',
    +        TIMESTAMP: '%H:%M:%S',
         },
         logger.MEDIUM_VERBOSE: {
    -        'message': '{timestamp} | {item.level[0]} | {implementation} | 
{item.msg} ',
    -        'timestamp': '%H:%M:%S'
    +        MESSAGE: '{timestamp} | {level} | {implementation} | {message} ',
    +        LEVEL: '{level[0]}',
    +        TIMESTAMP: '%H:%M:%S'
         },
         logger.HIGH_VERBOSE: {
    -        'message': '{timestamp} | {item.level[0]} | 
{implementation}({inputs}) | {item.msg} ',
    -        'timestamp': '%H:%M:%S'
    +        MESSAGE: '{timestamp} | {level} | {implementation} | {inputs} | 
{message} ',
    +        LEVEL: '{level[0]}',
    +        TIMESTAMP: '%H:%M:%S'
    +    },
    +}
    +
    +DEFAULT_STYLING = {
    +    LEVEL: {
    +        'info': Color.Fore.LIGHTMAGENTA_EX,
    +        'debug': Color.Schema(fore=Color.Fore.LIGHTMAGENTA_EX, 
style=Color.Style.DIM),
    +        'error': Color.Schema(fore=Color.Fore.RED, 
style=Color.Style.BRIGHT),
         },
    +    TIMESTAMP: {
    +        'info': Color.Fore.LIGHTMAGENTA_EX,
    +        'debug': Color.Schema(fore=Color.Fore.LIGHTMAGENTA_EX, 
style=Color.Style.DIM),
    +        'error': Color.Schema(fore=Color.Fore.RED, 
style=Color.Style.BRIGHT),
    +    },
    +    MESSAGE: {
    +        'info': Color.Fore.LIGHTBLUE_EX,
    +        'debug': Color.Schema(fore=Color.Fore.LIGHTBLUE_EX, 
style=Color.Style.DIM),
    +        'error': Color.Schema(fore=Color.Fore.RED, 
style=Color.Style.BRIGHT),
    +    },
    +    IMPLEMENTATION: {
    +        'info': Color.Fore.LIGHTBLACK_EX,
    +        'debug': Color.Schema(fore=Color.Fore.LIGHTBLACK_EX, 
style=Color.Style.DIM),
    +        'error': Color.Schema(fore=Color.Fore.RED, 
style=Color.Style.BRIGHT),
    +    },
    +    INPUTS: {
    +        'info': Color.Fore.BLUE,
    +        'debug': Color.Schema(fore=Color.Fore.BLUE, style=Color.Style.DIM),
    +        'error': Color.Schema(fore=Color.Fore.RED, 
style=Color.Style.BRIGHT),
    +    },
    +    TRACEBACK: {'error': Color.Fore.RED},
    +
    +    MARKER: Color.Back.LIGHTYELLOW_EX,
    +    FINAL_STATES: {
    +        SUCCESS_STATE: Color.Fore.GREEN,
    +        CANCEL_STATE: Color.Fore.YELLOW,
    +        FAIL_STATE: Color.Fore.RED,
    +    }
     }
     
    +_PATTERNS = {
    +    SUCCESS_STATE: re.compile(_SUCCESSFUL_EXECUTION_PATTERN),
    +    CANCEL_STATE: re.compile(_CANCELED_EXECUTION_PATTERN),
    +    FAIL_STATE: re.compile(_FAILED_EXECUTION_PATTERN)
    +
    +}
    +
    +
    +class _StylizedLogs(object):
    +
    +    def __init__(self):
    +        self._formats = DEFAULT_FORMATTING
    +        self._styles = DEFAULT_STYLING
    +        self._mark_pattern = None
    +
    +    def _push(self, styles=None, formats=None, mark_pattern=None):
    +        self._styles = styles or self._styles
    +        self._formats = formats or self._formats
    +        self._mark_pattern = mark_pattern
    +
    +    def _implementation(self, implementation, log_item):
    +        return self._stylize(implementation, log_item, IMPLEMENTATION)
    +
    +    def _inputs(self, inputs, log_item):
    +        return self._stylize(inputs, log_item, INPUTS)
    +
    +    def _timestamp(self, timestamp, log_item):
    +        return self._stylize(timestamp, log_item, TIMESTAMP)
    +
    +    def _message(self, message, log_item):
    +        return self._stylize(message, log_item, MESSAGE)
    +
    +    def _traceback(self, traceback, log_item):
    +        return self._stylize(traceback, log_item, TRACEBACK)
    +
    +    def _level(self, log_item):
    +        return self._stylize(log_item.level[0], log_item, LEVEL)
    +
    +    def _stylize(self, msg, log_item, msg_type):
    +        schema = (self._final_string_schema(log_item.msg) or
    +                  self._styles[msg_type].get(log_item.level.lower(), ''))
    +        return Color.stylize(msg, schema)
    +
    +    def _markup(self, str_, original_message):
    +        if self._mark_pattern is None:
    +            return str_
    +        else:
    +            regex_pattern = re.compile(self._mark_pattern)
    +            matches = re.search(regex_pattern, original_message)
    +            if not matches:
    +                return str_
    +            return Color.markup(str_, matches, self._styles[MARKER])
    +
    +    def _final_string_schema(self, original_message):
    +        for state, pattern in _PATTERNS.items():
    +            if re.match(pattern, original_message):
    +                return self._styles[FINAL_STATES][state]
    +
    +    def __call__(self, item):
    +        # If no formats are passed we revert to the default formats (per 
level)
    +        formatting = self._formats.get(env.logging.verbosity_level,
    +                                       
DEFAULT_FORMATTING[env.logging.verbosity_level])
    +        msg = StringIO()
    +        formatting_kwargs = dict(item=item)
    +
    +        # level
    +        formatting_kwargs['level'] = self._level(item)
    +
    +        # implementation
    +        if item.task:
    +            # operation task
    +            implementation = item.task.implementation
    +            inputs = dict(i.unwrap() for i in item.task.inputs.values())
    +        else:
    +            # execution task
    +            implementation = item.execution.workflow_name
    +            inputs = dict(i.unwrap() for i in 
item.execution.inputs.values())
    +
    +        formatting_kwargs['implementation'] = self._markup(
    +            self._implementation(implementation, item), implementation)
    +        formatting_kwargs['inputs'] = self._markup(self._inputs(inputs, 
item), str(inputs))
    +
    +        # timestamp
    +        if 'timestamp' in formatting:
    +            timestamp = item.created_at.strftime(formatting['timestamp'])
    +        else:
    +            timestamp = item.created_at
    +        formatting_kwargs['timestamp'] = self._timestamp(timestamp, item)
    +
    +        # message
    +        formatting_kwargs['message'] = self._message(item.msg, item)
     
    -def _str(item, formats=None):
    -    # If no formats are passed we revert to the default formats (per level)
    -    formats = formats or {}
    -    formatting = formats.get(env.logging.verbosity_level,
    -                             
DEFAULT_FORMATTING[env.logging.verbosity_level])
    -    msg = StringIO()
    +        # The message would be marked out if containing the provided 
pattern
    +        
msg.write(self._markup(formatting['message'].format(**formatting_kwargs), 
item.msg))
     
    -    formatting_kwargs = dict(item=item)
    +        # Add the exception and the error msg.
    +        if item.traceback and env.logging.verbosity_level >= 
logger.MEDIUM_VERBOSE:
    +            msg.write(os.linesep)
    +            for line in item.traceback.splitlines(True):
    +                msg.write(self._traceback('\t' + '|' + line, item))
     
    -    if item.task:
    -        formatting_kwargs['implementation'] = item.task.implementation
    -        formatting_kwargs['inputs'] = dict(i.unwrap() for i in 
item.task.inputs.values())
    -    else:
    -        formatting_kwargs['implementation'] = item.execution.workflow_name
    -        formatting_kwargs['inputs'] = dict(i.unwrap() for i in 
item.execution.inputs.values())
    +        return msg.getvalue()
     
    -    if 'timestamp' in formatting:
    -        formatting_kwargs['timestamp'] = 
item.created_at.strftime(formatting['timestamp'])
    -    else:
    -        formatting_kwargs['timestamp'] = item.created_at
     
    -    msg.write(formatting['message'].format(**formatting_kwargs))
    +_stylize_log = _StylizedLogs()
     
    -    # Add the exception and the error msg.
    -    if item.traceback and env.logging.verbosity_level >= 
logger.MEDIUM_VERBOSE:
    -        for line in item.traceback.splitlines(True):
    -            msg.write('\t' + '|' + line)
     
    -    return msg.getvalue()
    +@contextmanager
    +def format(styles=None, formats=None, mark_pattern=None):
    --- End diff --
    
    read styles and formats from config (if defined); mark pattern can be 
passed directly via `log` and `log_list`


> Support colorful execution logging
> ----------------------------------
>
>                 Key: ARIA-146
>                 URL: https://issues.apache.org/jira/browse/ARIA-146
>             Project: AriaTosca
>          Issue Type: Story
>            Reporter: Ran Ziv
>            Assignee: Maxim Orlov
>            Priority: Minor
>
> Add support for printing execution logs in color



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to