1 # -*- coding: utf-8 -*-
4 Copyright (C) 2007, Karl Hasselström <kha@treskal.com>
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License version 2 as
8 published by the Free Software Foundation.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 class MessagePrinter(object):
23 def __init__(self
, file = None):
25 def __init__(self
, write
, flush
):
28 self
.at_start_of_line
= True
31 """Ensure that we're at the beginning of a line."""
32 if not self
.at_start_of_line
:
34 self
.at_start_of_line
= True
35 def single_line(self
, msg
, print_newline
= True,
37 """Write a single line. Newline before and after are
38 separately configurable."""
41 if self
.at_start_of_line
:
42 self
.write(' '*self
.level
)
46 self
.at_start_of_line
= True
49 self
.at_start_of_line
= False
50 def tagged_lines(self
, tag
, lines
):
52 width
= 79 - 2*self
.level
- len(tag
)
53 lines
= [wl
for line
in lines
54 for wl
in textwrap
.wrap(line
, width
,
55 break_long_words
= False)]
57 self
.single_line(tag
+ line
)
59 def write_line(self
, line
):
60 """Write one line of text on a lines of its own, not
63 self
.write('%s\n' % line
)
64 self
.at_start_of_line
= True
65 def write_raw(self
, string
):
66 """Write an arbitrary string, possibly containing
70 self
.at_start_of_line
= string
.endswith('\n')
72 self
.__stdout
= self
.__stderr
= Output(file.write
, file.flush
)
74 self
.__stdout
= Output(sys
.stdout
.write
, sys
.stdout
.flush
)
75 self
.__stderr
= Output(sys
.stdout
.write
, sys
.stdout
.flush
)
76 if file or sys
.stdout
.isatty():
77 self
.__out
= self
.__stdout
78 self
.__err
= self
.__stdout
80 self
.__out
= Output(lambda msg
: None, lambda: None)
81 self
.__err
= self
.__stderr
82 def stdout(self
, line
):
83 """Write a line to stdout."""
84 self
.__stdout
.write_line(line
)
85 def stdout_raw(self
, string
):
86 """Write a string possibly containing newlines to stdout."""
87 self
.__stdout
.write_raw(string
)
88 def err_raw(self
, string
):
89 """Write a string possibly containing newlines to the error
91 self
.__err
.write_raw(string
)
92 def info(self
, *msgs
):
94 self
.__out
.single_line(msg
)
95 def note(self
, *msgs
, **kw
):
96 self
.__out
.tagged_lines(kw
.get('title', 'Notice'), msgs
)
97 def warn(self
, *msgs
, **kw
):
98 self
.__err
.tagged_lines(kw
.get('title', 'Warning'), msgs
)
99 def error(self
, *msgs
, **kw
):
100 self
.__err
.tagged_lines(kw
.get('title', 'Error'), msgs
)
101 def start(self
, msg
):
102 """Start a long-running operation."""
103 self
.__out
.single_line('%s ... ' % msg
, print_newline
= False)
104 self
.__out
.level
+= 1
105 def done(self
, extramsg
= None):
106 """Finish long-running operation."""
107 self
.__out
.level
-= 1
109 msg
= 'done (%s)' % extramsg
112 self
.__out
.single_line(msg
, need_newline
= False)
114 out
= MessagePrinter()