11421139f71fd3affcee675d75431cf85c38acfb
[kamaki] / kamaki / cli / commands / history.py
1 #!/usr/bin/env python
2
3 # Copyright 2012-2014 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 from kamaki.cli.command_tree import CommandTree
37 from kamaki.cli.argument import ValueArgument
38 from kamaki.cli.history import History
39 from kamaki.cli import command
40 from kamaki.cli.commands import _command_init, errors
41
42
43 history_cmds = CommandTree('history', 'Kamaki command history')
44 _commands = [history_cmds]
45
46
47 class _init_history(_command_init):
48     @errors.generic.all
49     @errors.history.init
50     def _run(self):
51         self.history = History(self.config.get('global', 'history_file'))
52
53     def main(self):
54         self._run()
55
56
57 @command(history_cmds)
58 class history_show(_init_history):
59     """Show history
60         Featutes:
61         - slice notation (cmd numbers --> N or :N or N: or N1:N2)
62         - text matching (--match)
63     """
64
65     arguments = dict(
66         match=ValueArgument('Show lines matching this', '--match'),
67     )
68
69     @errors.generic.all
70     def _run(self, cmd_slice):
71         c = self.history.counter
72         lines = ['%s.\t%s' % (i + c, l) for i, l in enumerate(
73             self.history[:])][cmd_slice]
74         if not isinstance(cmd_slice, slice):
75             lines = [lines, ]
76         if self['match']:
77             lines = [l for l in lines if self._match(l, self['match'])]
78         self.print_items([l[:-1] for l in lines])
79
80     def main(self, cmd_numbers=''):
81         super(self.__class__, self)._run()
82         sl_args = [
83             int(x) if x else None for x in cmd_numbers.split(':')] if (
84                 cmd_numbers) else [None, None]
85         slice_cmds = slice(*sl_args) if len(sl_args) > 1 else sl_args[0]
86         self._run(slice_cmds)
87
88
89 @command(history_cmds)
90 class history_clean(_init_history):
91     """Clean up history (permanent)"""
92
93     @errors.generic.all
94     def _run(self):
95         self.history.empty()
96
97     def main(self):
98         super(self.__class__, self)._run()
99         self._run()