diff options
-rw-r--r-- | DEVELOP.md | 18 | ||||
-rw-r--r-- | qtip/cli/commands/cmd_report.py | 27 | ||||
-rw-r--r-- | qtip/cli/entry.py | 29 | ||||
-rw-r--r-- | qtip/reporter/console.py | 15 | ||||
-rw-r--r-- | qtip/reporter/templates/report.j2 | 22 | ||||
-rw-r--r-- | qtip/reporter/templates/timeline.j2 | 2 | ||||
-rw-r--r-- | tests/data/reporter/timeline.pickle | 3 | ||||
-rw-r--r-- | tests/unit/cli/cmd_report.py | 23 | ||||
-rw-r--r-- | tests/unit/cli/options_test.py | 9 | ||||
-rw-r--r-- | tests/unit/reporter/console_test.py | 22 |
10 files changed, 133 insertions, 37 deletions
@@ -151,7 +151,23 @@ TBD ### CLI -TBD +Click currently supports Bash completion. The prerequisite for this is that the program +needs to be installed correctly. To install Qtip, execute the following command in root +folder of Qtip: + +``` +cd <project root> +pip install -e . +``` + +Once the installation has been completed successfully, the following needs to be added to +the `.bashrc` file: + +``` +eval "$(_QTIP_COMPLETE=source qtip)" +``` + +The above would activate command completion for Qtip. ### API diff --git a/qtip/cli/commands/cmd_report.py b/qtip/cli/commands/cmd_report.py new file mode 100644 index 00000000..c780e847 --- /dev/null +++ b/qtip/cli/commands/cmd_report.py @@ -0,0 +1,27 @@ +############################################################################## +# Copyright (c) 2017 taseer94@gmail.com and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +import click + +from qtip.cli.entry import Context + +pass_context = click.make_pass_decorator(Context, ensure=False) + + +@click.group() +@pass_context +def cli(ctx): + """ View Qtip results""" + pass + + +@cli.command('show') +@pass_context +def show(ctx): + pass diff --git a/qtip/cli/entry.py b/qtip/cli/entry.py index 9f51f25e..6cf78b58 100644 --- a/qtip/cli/entry.py +++ b/qtip/cli/entry.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2016 ZTE Corp and others. +# Copyright (c) 2017 taseer94@gmail.com and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 @@ -7,33 +7,19 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## +import click import os import sys -import click CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) +# TODO (taseer) define user friendly error messages +sys.tracebacklimit = 0 -class Context(object): - - ''' TODO(taseer) implementation''' - - def __init__(self): - self.verbose = False - self.debug = False - - def log(self, msg, *args): - ''' Log message to stderr ''' - pass - def verbose(self, msg, *args): - ''' Log message to stderr when verbose ''' - pass - - def debug(self, msg, *args): - ''' Log message to debug ''' - pass +class Context(object): + """ Load configuration and pass to subcommands """ pass_context = click.make_pass_decorator(Context, ensure=True) @@ -70,4 +56,5 @@ class QtipCli(click.MultiCommand): @click.version_option('dev') @pass_context def cli(ctx, verbose, debug): - pass + if debug: + sys.tracebacklimit = 8 diff --git a/qtip/reporter/console.py b/qtip/reporter/console.py index 24c98e74..2b5130a6 100644 --- a/qtip/reporter/console.py +++ b/qtip/reporter/console.py @@ -1,5 +1,5 @@ ############################################################################## -# Copyright (c) 2016 ZTE Corp and others. +# Copyright (c) 2017 taseer94@gmail.com and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 @@ -7,6 +7,9 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## +from jinja2 import Environment +from jinja2 import FileSystemLoader +from os import path from qtip.base import BaseActor @@ -16,8 +19,12 @@ class ConsoleReporter(BaseActor): """ def __init__(self, config, parent=None): super(ConsoleReporter, self).__init__(config, parent=parent) - # TODO(yujunz) remove PoC code - self._fmt = "{title}: {description}" + + # TODO (taseer) load template from config + tpl_loader = FileSystemLoader(path.join(path.dirname(__file__), 'templates')) + env = Environment(loader=tpl_loader) + self._template = env.get_template('timeline.j2') def render(self, var_dict): - return self._fmt.format(**var_dict) + out = self._template.render(var_dict) + return out diff --git a/qtip/reporter/templates/report.j2 b/qtip/reporter/templates/report.j2 new file mode 100644 index 00000000..766e6dde --- /dev/null +++ b/qtip/reporter/templates/report.j2 @@ -0,0 +1,22 @@ +{{ title }} + +Plan: {{ plan.name }} + +{{ qpi.name }}: {{ qpi.score }} +Sections: +{% for section in sections %} + {{ section.name }}: {{ section.score }} + + Formula: {{ section.formula }} + Metrics: + {% for metric in section.metrics %} + {{ metric.name }}: {{ metric.score }} + Formula: {{ metric.formula }} + Workloads: + {% for workload in workloads %} + {{ workload.name }}: {{ workload.score }} + {% endfor %} + {% endfor %} +{% endfor %} + +{{ signature }} diff --git a/qtip/reporter/templates/timeline.j2 b/qtip/reporter/templates/timeline.j2 index 9c18a996..d4c95c46 100644 --- a/qtip/reporter/templates/timeline.j2 +++ b/qtip/reporter/templates/timeline.j2 @@ -1,4 +1,4 @@ -{% title %} +{{ title }} {% for phase in phases %} {{ phase.name|upper }}{{ "TIME" }} {% for cp in phase.checkpoints %} diff --git a/tests/data/reporter/timeline.pickle b/tests/data/reporter/timeline.pickle new file mode 100644 index 00000000..5c870d93 --- /dev/null +++ b/tests/data/reporter/timeline.pickle @@ -0,0 +1,3 @@ +VTimeline\u000a\u000aMONITOR TIME\u000a\u000aT00 1\u000a\u000a\u000aINSPECTOR TIME\u000a\u000aT01 2\u000a\u000aT02 5\u000a\u000aT03 8\u000a\u000a\u000aCONTROLLER TIME\u000a\u000aT04 11\u000a\u000a\u000aNOTIFIER TIME\u000a\u000aT05 16\u000a\u000a\u000aEVALUATOR TIME\u000a\u000aT06 40\u000a\u000a\u000aTotal: 312ms +p0 +. diff --git a/tests/unit/cli/cmd_report.py b/tests/unit/cli/cmd_report.py new file mode 100644 index 00000000..e010b960 --- /dev/null +++ b/tests/unit/cli/cmd_report.py @@ -0,0 +1,23 @@ +############################################################### +# Copyright (c) 2016 ZTE Corp and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +import pytest +from click.testing import CliRunner + +from qtip.cli.entry import cli + + +@pytest.fixture(scope="module") +def runner(): + return CliRunner() + + +def test_show(runner): + result = runner.invoke(cli, ['report', 'show']) + assert result.output == '' diff --git a/tests/unit/cli/options_test.py b/tests/unit/cli/options_test.py index f9472814..9dbbe6f3 100644 --- a/tests/unit/cli/options_test.py +++ b/tests/unit/cli/options_test.py @@ -1,5 +1,5 @@ ############################################################### -# Copyright (c) 2016 ZTE Corp and others. +# Copyright (c) 2017 taseer94@gmail.com and others. # # All rights reserved. This program and the accompanying materials # are made available under the terms of the Apache License, Version 2.0 @@ -8,8 +8,9 @@ ############################################################################## import pytest -from click.testing import CliRunner +import sys +from click.testing import CliRunner from qtip.cli.entry import cli @@ -28,5 +29,5 @@ class TestClass(object): assert 'dev' in result.output def test_debug(self, runner): - result = runner.invoke(cli, ['-d']) - assert '' in result.output + runner.invoke(cli, ['-d']) + assert sys.tracebacklimit == 8 diff --git a/tests/unit/reporter/console_test.py b/tests/unit/reporter/console_test.py index 8150239e..d2816690 100644 --- a/tests/unit/reporter/console_test.py +++ b/tests/unit/reporter/console_test.py @@ -7,7 +7,10 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## +import pickle import pytest +import os + from qtip.reporter.console import ConsoleReporter @@ -21,9 +24,16 @@ def test_constructor(console_reporter): def test_render(console_reporter): - var_dict = { - 'title': 'fake title', - 'description': 'fake description' - } - output = console_reporter.render(var_dict=var_dict) - assert output == 'fake title: fake description' + var_dict = {'title': 'Timeline', 'total': '312ms', 'phases': [{'name': 'Monitor ', + 'checkpoints': [{'name': 'T00 ', 'timestamp': '1'}]}, + {'name': 'Inspector ', 'checkpoints': [{'name': 'T01 ', 'timestamp': '2'}, + {'name': 'T02 ', 'timestamp': '5'}, {'name': 'T03 ', 'timestamp': '8'}]}, + {'name': 'Controller ', 'checkpoints': [{'name': 'T04 ', 'timestamp': '11'}]}, + {'name': 'Notifier ', 'checkpoints': [{'name': 'T05 ', 'timestamp': '16'}]}, + {'name': 'Evaluator ', 'checkpoints': [{'name': 'T06 ', 'timestamp': '40'}]}]} + + result = console_reporter.render(var_dict=var_dict) + path = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, + os.pardir, 'tests/data/reporter/') + timeline = pickle.load(open(path + 'timeline.pickle', 'rb')) + assert result == timeline |