diff options
Diffstat (limited to 'defapp.py')
-rw-r--r-- | defapp.py | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/defapp.py b/defapp.py new file mode 100644 index 0000000..e459084 --- /dev/null +++ b/defapp.py | |||
@@ -0,0 +1,95 @@ | |||
1 | #!/usr/bin/env python | ||
2 | |||
3 | """ | ||
4 | A basic Python application shell, for copy&paste development. | ||
5 | """ | ||
6 | |||
7 | import optparse | ||
8 | import cmd | ||
9 | import sys | ||
10 | |||
11 | o = optparse.make_option | ||
12 | |||
13 | class App(cmd.Cmd): | ||
14 | def __init__(self, opts=None, defaults=None, no_std_opts=False, | ||
15 | stdout=sys.stdout, stderr=sys.stderr, default_cmd=None): | ||
16 | cmd.Cmd.__init__(self, None, stdout, stderr) | ||
17 | self.default_cmd = default_cmd | ||
18 | if not opts: | ||
19 | opts = [] | ||
20 | if not defaults: | ||
21 | defaults = {} | ||
22 | defaults["_App_file"] = None | ||
23 | self.f = None | ||
24 | if not no_std_opts: | ||
25 | opts += [ o('-o', '--output', action='store', dest='_App_file', | ||
26 | help='store output in FILE', metavar='FILE')] | ||
27 | (self.options, self.args) = self.__parse(opts, defaults) | ||
28 | |||
29 | def __parse(self, opts, defaults): | ||
30 | parser = optparse.OptionParser(option_list=opts) | ||
31 | parser.set_defaults(**defaults) | ||
32 | return parser.parse_args() | ||
33 | |||
34 | def launch(self, args=None): | ||
35 | if args: | ||
36 | self.args = args | ||
37 | try: | ||
38 | if self.options._App_file: | ||
39 | self.f = open(self.options._App_file, 'w') | ||
40 | self.onecmd(' '.join(self.args)) | ||
41 | except IOError, msg: | ||
42 | self.err("I/O Error:", msg) | ||
43 | except KeyboardInterrupt: | ||
44 | self.err("Interrupted.") | ||
45 | if self.f: | ||
46 | self.f.close() | ||
47 | |||
48 | def outfile(self): | ||
49 | if self.f: | ||
50 | return f | ||
51 | else: | ||
52 | return sys.stdout | ||
53 | |||
54 | def emptyline(self): | ||
55 | if self.default_cmd: | ||
56 | self.onecmd(self.default_cmd) | ||
57 | |||
58 | def default(self, line): | ||
59 | self.err("%s: Command not recognized." % line) | ||
60 | |||
61 | def do_dump_config(self, key): | ||
62 | """Display the configuration as parsed on the console.""" | ||
63 | def is_private(k): return k[0] == '_' | ||
64 | def show(k): print "%20s : %10s" % (k, str(self.options.__dict__[k])) | ||
65 | if not key: | ||
66 | for x in sorted(self.options.__dict__.keys()): | ||
67 | if not is_private(x): | ||
68 | show(x) | ||
69 | elif not is_private(key) and key in self.options.__dict__: | ||
70 | show(key) | ||
71 | else: | ||
72 | self.err("%s: unknown option." % key) | ||
73 | |||
74 | @staticmethod | ||
75 | def __write(stream, *args, **kargs): | ||
76 | stream.write(" ".join([str(a) for a in args])) | ||
77 | if not ('omit_newline' in kargs and kargs['omit_newline']): | ||
78 | stream.write("\n") | ||
79 | stream.flush() | ||
80 | |||
81 | def err(self, *args, **kargs): | ||
82 | self.__write(sys.stderr, *args, **kargs) | ||
83 | |||
84 | def msg(self, *args, **kargs): | ||
85 | self.__write(sys.stdout, *args, **kargs) | ||
86 | |||
87 | def out(self, *args, **kargs): | ||
88 | if self.f: | ||
89 | self.__write(self.f, *args, **kargs) | ||
90 | else: | ||
91 | self.__write(sys.stdout, *args, **kargs) | ||
92 | |||
93 | if __name__ == "__main__": | ||
94 | a = App() | ||
95 | a.launch() | ||