root / image_creator / output / cli.py @ 121f3bc0
History | View | Annotate | Download (4.6 kB)
1 | 121f3bc0 | Nikos Skalkotos | # -*- coding: utf-8 -*-
|
---|---|---|---|
2 | 121f3bc0 | Nikos Skalkotos | #
|
3 | e77e66a9 | Nikos Skalkotos | # Copyright 2012 GRNET S.A. All rights reserved.
|
4 | e77e66a9 | Nikos Skalkotos | #
|
5 | e77e66a9 | Nikos Skalkotos | # Redistribution and use in source and binary forms, with or
|
6 | e77e66a9 | Nikos Skalkotos | # without modification, are permitted provided that the following
|
7 | e77e66a9 | Nikos Skalkotos | # conditions are met:
|
8 | e77e66a9 | Nikos Skalkotos | #
|
9 | e77e66a9 | Nikos Skalkotos | # 1. Redistributions of source code must retain the above
|
10 | e77e66a9 | Nikos Skalkotos | # copyright notice, this list of conditions and the following
|
11 | e77e66a9 | Nikos Skalkotos | # disclaimer.
|
12 | e77e66a9 | Nikos Skalkotos | #
|
13 | e77e66a9 | Nikos Skalkotos | # 2. Redistributions in binary form must reproduce the above
|
14 | e77e66a9 | Nikos Skalkotos | # copyright notice, this list of conditions and the following
|
15 | e77e66a9 | Nikos Skalkotos | # disclaimer in the documentation and/or other materials
|
16 | e77e66a9 | Nikos Skalkotos | # provided with the distribution.
|
17 | e77e66a9 | Nikos Skalkotos | #
|
18 | e77e66a9 | Nikos Skalkotos | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
19 | e77e66a9 | Nikos Skalkotos | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
20 | e77e66a9 | Nikos Skalkotos | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
21 | e77e66a9 | Nikos Skalkotos | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
22 | e77e66a9 | Nikos Skalkotos | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
23 | e77e66a9 | Nikos Skalkotos | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
24 | e77e66a9 | Nikos Skalkotos | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
25 | e77e66a9 | Nikos Skalkotos | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
26 | e77e66a9 | Nikos Skalkotos | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
27 | e77e66a9 | Nikos Skalkotos | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
28 | e77e66a9 | Nikos Skalkotos | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
29 | e77e66a9 | Nikos Skalkotos | # POSSIBILITY OF SUCH DAMAGE.
|
30 | e77e66a9 | Nikos Skalkotos | #
|
31 | e77e66a9 | Nikos Skalkotos | # The views and conclusions contained in the software and
|
32 | e77e66a9 | Nikos Skalkotos | # documentation are those of the authors and should not be
|
33 | e77e66a9 | Nikos Skalkotos | # interpreted as representing official policies, either expressed
|
34 | e77e66a9 | Nikos Skalkotos | # or implied, of GRNET S.A.
|
35 | e77e66a9 | Nikos Skalkotos | |
36 | 88f83027 | Nikos Skalkotos | """Normal Command-line interface output"""
|
37 | 88f83027 | Nikos Skalkotos | |
38 | 4e58b51b | Nikos Skalkotos | from image_creator.output import Output |
39 | 4e58b51b | Nikos Skalkotos | |
40 | e77e66a9 | Nikos Skalkotos | import sys |
41 | e77e66a9 | Nikos Skalkotos | from colors import red, green, yellow |
42 | 4e58b51b | Nikos Skalkotos | from progress.bar import Bar |
43 | e77e66a9 | Nikos Skalkotos | |
44 | e77e66a9 | Nikos Skalkotos | |
45 | 789a3763 | Nikos Skalkotos | def output(msg, new_line, decorate, stream): |
46 | 710adfb2 | Nikos Skalkotos | nl = "\n" if new_line else ' ' |
47 | 789a3763 | Nikos Skalkotos | stream.write(decorate(msg) + nl) |
48 | e77e66a9 | Nikos Skalkotos | |
49 | e77e66a9 | Nikos Skalkotos | |
50 | 789a3763 | Nikos Skalkotos | def error(msg, new_line, colored, stream): |
51 | 4e58b51b | Nikos Skalkotos | color = red if colored else lambda x: x |
52 | 789a3763 | Nikos Skalkotos | output("Error: %s" % msg, new_line, color, stream)
|
53 | e77e66a9 | Nikos Skalkotos | |
54 | e77e66a9 | Nikos Skalkotos | |
55 | 789a3763 | Nikos Skalkotos | def warn(msg, new_line, colored, stream): |
56 | 4e58b51b | Nikos Skalkotos | color = yellow if colored else lambda x: x |
57 | 789a3763 | Nikos Skalkotos | output("Warning: %s" % msg, new_line, color, stream)
|
58 | e77e66a9 | Nikos Skalkotos | |
59 | e77e66a9 | Nikos Skalkotos | |
60 | 789a3763 | Nikos Skalkotos | def success(msg, new_line, colored, stream): |
61 | 4e58b51b | Nikos Skalkotos | color = green if colored else lambda x: x |
62 | 789a3763 | Nikos Skalkotos | output(msg, new_line, color, stream) |
63 | 4e58b51b | Nikos Skalkotos | |
64 | e77e66a9 | Nikos Skalkotos | |
65 | 789a3763 | Nikos Skalkotos | def clear(stream): |
66 | 121f3bc0 | Nikos Skalkotos | """Clears the terminal screen."""
|
67 | 789a3763 | Nikos Skalkotos | if stream.isatty():
|
68 | 789a3763 | Nikos Skalkotos | stream.write('\033[H\033[2J')
|
69 | 4a847a98 | Nikos Skalkotos | |
70 | 4a847a98 | Nikos Skalkotos | |
71 | 4e58b51b | Nikos Skalkotos | class SilentOutput(Output): |
72 | 88f83027 | Nikos Skalkotos | """Silent Output class. Only Errors are printed"""
|
73 | 4e58b51b | Nikos Skalkotos | pass
|
74 | e77e66a9 | Nikos Skalkotos | |
75 | 4e58b51b | Nikos Skalkotos | |
76 | 4e58b51b | Nikos Skalkotos | class SimpleOutput(Output): |
77 | 88f83027 | Nikos Skalkotos | """Print messages but not progress bars. Progress bars are treated as
|
78 | 88f83027 | Nikos Skalkotos | output messages. The user gets informed when the action begins and when it
|
79 | 88f83027 | Nikos Skalkotos | ends, but no progress is shown in between."""
|
80 | 789a3763 | Nikos Skalkotos | def __init__(self, colored=True, stream=None): |
81 | 4e58b51b | Nikos Skalkotos | self.colored = colored
|
82 | 789a3763 | Nikos Skalkotos | self.stream = sys.stderr if stream is None else stream |
83 | 1ea7fc2e | Nikos Skalkotos | |
84 | e77e66a9 | Nikos Skalkotos | def error(self, msg, new_line=True): |
85 | 88f83027 | Nikos Skalkotos | """Print an error"""
|
86 | 789a3763 | Nikos Skalkotos | error(msg, new_line, self.colored, self.stream) |
87 | e77e66a9 | Nikos Skalkotos | |
88 | e77e66a9 | Nikos Skalkotos | def warn(self, msg, new_line=True): |
89 | 88f83027 | Nikos Skalkotos | """Print a warning"""
|
90 | 789a3763 | Nikos Skalkotos | warn(msg, new_line, self.colored, self.stream) |
91 | e77e66a9 | Nikos Skalkotos | |
92 | e77e66a9 | Nikos Skalkotos | def success(self, msg, new_line=True): |
93 | 88f83027 | Nikos Skalkotos | """Print msg after an action is completed"""
|
94 | 789a3763 | Nikos Skalkotos | success(msg, new_line, self.colored, self.stream) |
95 | e77e66a9 | Nikos Skalkotos | |
96 | e77e66a9 | Nikos Skalkotos | def output(self, msg='', new_line=True): |
97 | 88f83027 | Nikos Skalkotos | """Print msg as normal program output"""
|
98 | 789a3763 | Nikos Skalkotos | output(msg, new_line, lambda x: x, self.stream) |
99 | e77e66a9 | Nikos Skalkotos | |
100 | 4a847a98 | Nikos Skalkotos | def clear(self): |
101 | 88f83027 | Nikos Skalkotos | """Clear the screen"""
|
102 | 789a3763 | Nikos Skalkotos | clear(self.stream)
|
103 | 4a847a98 | Nikos Skalkotos | |
104 | e77e66a9 | Nikos Skalkotos | |
105 | 4e58b51b | Nikos Skalkotos | class OutputWthProgress(SimpleOutput): |
106 | 88f83027 | Nikos Skalkotos | """Output class with progress."""
|
107 | 1ea7fc2e | Nikos Skalkotos | class _Progress(Bar): |
108 | e77e66a9 | Nikos Skalkotos | MESSAGE_LENGTH = 30
|
109 | e77e66a9 | Nikos Skalkotos | |
110 | e77e66a9 | Nikos Skalkotos | template = { |
111 | e77e66a9 | Nikos Skalkotos | 'default': '%(index)d/%(max)d', |
112 | e77e66a9 | Nikos Skalkotos | 'percent': '%(percent)d%%', |
113 | e77e66a9 | Nikos Skalkotos | 'b': '%(index)d/%(max)d B', |
114 | e77e66a9 | Nikos Skalkotos | 'kb': '%(index)d/%(max)d KB', |
115 | e77e66a9 | Nikos Skalkotos | 'mb': '%(index)d/%(max)d MB' |
116 | e77e66a9 | Nikos Skalkotos | } |
117 | e77e66a9 | Nikos Skalkotos | |
118 | 96171db1 | Nikos Skalkotos | def __init__(self, size, title, bar_type='default'): |
119 | 88f83027 | Nikos Skalkotos | """Create a Progress bar"""
|
120 | b87b7a14 | Nikos Skalkotos | self.hide_cursor = False |
121 | 4e58b51b | Nikos Skalkotos | super(OutputWthProgress._Progress, self).__init__() |
122 | e77e66a9 | Nikos Skalkotos | self.title = title
|
123 | e77e66a9 | Nikos Skalkotos | self.fill = '#' |
124 | e77e66a9 | Nikos Skalkotos | self.bar_prefix = ' [' |
125 | e77e66a9 | Nikos Skalkotos | self.bar_suffix = '] ' |
126 | e77e66a9 | Nikos Skalkotos | self.message = ("%s:" % self.title).ljust(self.MESSAGE_LENGTH) |
127 | e77e66a9 | Nikos Skalkotos | self.suffix = self.template[bar_type] |
128 | 96171db1 | Nikos Skalkotos | self.max = size
|
129 | 96171db1 | Nikos Skalkotos | |
130 | 4787037b | Nikos Skalkotos | # print empty progress bar
|
131 | 4787037b | Nikos Skalkotos | self.start()
|
132 | e77e66a9 | Nikos Skalkotos | |
133 | e77e66a9 | Nikos Skalkotos | def success(self, result): |
134 | 88f83027 | Nikos Skalkotos | """Print result after progress has finished"""
|
135 | 663f5f80 | Nikos Skalkotos | self.output.output("\r%s ...\033[K" % self.title, False) |
136 | 1ea7fc2e | Nikos Skalkotos | self.output.success(result)
|
137 | e77e66a9 | Nikos Skalkotos | |
138 | e77e66a9 | Nikos Skalkotos | # vim: set sta sts=4 shiftwidth=4 sw=4 et ai : |