Update version.py and ChangeLog for 0.6.1
[snf-image-creator] / image_creator / output / composite.py
1 # -*- coding: utf-8 -*-
2 #
3 # Copyright 2012 GRNET S.A. All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or
6 # without modification, are permitted provided that the following
7 # conditions are met:
8 #
9 #   1. Redistributions of source code must retain the above
10 #      copyright notice, this list of conditions and the following
11 #      disclaimer.
12 #
13 #   2. Redistributions in binary form must reproduce the above
14 #      copyright notice, this list of conditions and the following
15 #      disclaimer in the documentation and/or other materials
16 #      provided with the distribution.
17 #
18 # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25 # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 # POSSIBILITY OF SUCH DAMAGE.
30 #
31 # The views and conclusions contained in the software and
32 # documentation are those of the authors and should not be
33 # interpreted as representing official policies, either expressed
34 # or implied, of GRNET S.A.
35
36 """This module implements the CompositeOutput output class"""
37
38 from image_creator.output import Output
39
40
41 class CompositeOutput(Output):
42     """This class can be used to composite different outputs into a single one
43
44     You may create an instance of this class and then add other output
45     instances to it. Executing a method on this instance will cause the
46     execution of the same method in each output instance that has been added to
47     this one.
48     """
49
50     def __init__(self, outputs=[]):
51         """Add initial output instances"""
52         self._outputs = outputs
53
54     def add(self, output):
55         """Add another output instance"""
56         self._outputs.append(output)
57
58     def remove(self, output):
59         """Remove an output instance"""
60         self._outputs.remove(output)
61
62     def error(self, msg, new_line=True):
63         """Call the error method of each of the output instances"""
64         for out in self._outputs:
65             out.error(msg, new_line)
66
67     def warn(self, msg, new_line=True):
68         """Call the warn method of each of the output instances"""
69         for out in self._outputs:
70             out.warn(msg, new_line)
71
72     def success(self, msg, new_line=True):
73         """Call the success method of each of the output instances"""
74         for out in self._outputs:
75             out.success(msg, new_line)
76
77     def output(self, msg='', new_line=True):
78         """Call the output method of each of the output instances"""
79         for out in self._outputs:
80             out.output(msg, new_line)
81
82     def cleanup(self):
83         """Call the cleanup method of each of the output instances"""
84         for out in self._outputs:
85             out.cleanup()
86
87     def clear(self):
88         """Call the clear method of each of the output instances"""
89         for out in self._outputs:
90             out.clear()
91
92     class _Progress(object):
93         """Class used to composite different Progress objects"""
94
95         def __init__(self, size, title, bar_type='default'):
96             """Create a progress on each of the added output instances"""
97             self._progresses = []
98             for out in self.output._outputs:
99                 self._progresses.append(out.Progress(size, title, bar_type))
100
101         def goto(self, dest):
102             """Call the goto method of each of the progress instances"""
103             for progress in self._progresses:
104                 progress.goto(dest)
105
106         def next(self):
107             """Call the next method of each of the progress instances"""
108             for progress in self._progresses:
109                 progress.next()
110
111         def success(self, result):
112             """Call the success method of each of the progress instances"""
113             for progress in self._progresses:
114                 progress.success(result)
115
116 # vim: set sta sts=4 shiftwidth=4 sw=4 et ai :