annotate numerics/text_display.py @ 172:dc0a620a0368

add another example
author Jeff Hammel <k0scist@gmail.com>
date Fri, 03 Jul 2015 11:11:01 -0700
parents 570ceafeb670
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
93
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
1 #!/usr/bin/env python
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
2 # -*- coding: utf-8 -*-
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
3
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
4 """
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
5 text display
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
6 """
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
7
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
8 # imports
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
9 import argparse
99
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
10 import sys
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
11 from collections import OrderedDict
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
12 from math import floor
93
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
13
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
14 # module globals
99
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
15 __all__ = ['main', 'blocks', 'frac', 'FracParser']
93
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
16
98
f6d885adb3d7 STUB: numerics/histogram.py numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 97
diff changeset
17 # Unicode is awesome; see http://www.alanwood.net/unicode/block_elements.html
99
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
18 blocks = OrderedDict([(0., ''),
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
19 (0.125, '▏'),
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
20 (0.25, '▎'),
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
21 (0.375, '▍'),
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
22 (0.5, '▌'),
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
23 (0.625, '▋'),
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
24 (0.75, '▊'),
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
25 (0.875, '▉'),
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
26 (1., '█'),
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
27 ])
93
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
28
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
29
95
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
30 def iterable(obj):
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
31 """is `obj` iterable?"""
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
32 # TODO: should probably go elsewhere
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
33 try:
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
34 iter(obj)
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
35 return True
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
36 except TypeError:
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
37 return False
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
38
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
39
99
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
40 def frac(fractions, width=20, bar=''):
93
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
41 """display fractions"""
95
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
42 if not iterable(fractions):
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
43 # convert single item to list
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
44 fractions = [fractions]
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
45 retval = []
Jeff Hammel <k0scist@gmail.com>
parents: 94
diff changeset
46 for fraction in fractions:
99
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
47 whole = int(floor(fraction*width))
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
48 part = (fraction*width)-whole
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
49 line = blocks[1.]*whole + blocks[int(floor(part * 8))/8.]
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
50 retval.append(line)
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
51 if bar:
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
52 lines = []
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
53 for line in retval:
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
54 newline = "{bar}{}{bar}".format(line.ljust(width),
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
55 bar=bar)
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
56 lines.append(newline)
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
57 retval = lines
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
58 return retval
93
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
59
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
60
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
61 class FracParser(argparse.ArgumentParser):
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
62 """CLI option parser"""
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
63 def __init__(self, **kwargs):
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
64 kwargs.setdefault('formatter_class', argparse.RawTextHelpFormatter)
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
65 kwargs.setdefault('description', __doc__)
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
66 argparse.ArgumentParser.__init__(self, **kwargs)
99
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
67 self.add_argument('fraction', type=float, nargs='+',
93
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
68 help="fractions to display")
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
69 self.add_argument('-w', '--width', dest='width',
99
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
70 type=int, default=40,
93
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
71 help="width to display [DEFAULT: %(default)s]")
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
72 self.options = None
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
73
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
74 def parse_args(self, *args, **kw):
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
75 options = argparse.ArgumentParser.parse_args(self, *args, **kw)
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
76 self.validate(options)
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
77 self.options = options
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
78 return options
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
79
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
80 def validate(self, options):
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
81 """validate options"""
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
82 if options.width < 1:
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
83 self.error("Width must be greater than zero (You gave: {})".format(options.width))
94
Jeff Hammel <k0scist@gmail.com>
parents: 93
diff changeset
84 out_of_range = [i for i in options.fraction
99
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
85 if not (0. <= i <= 1.)]
94
Jeff Hammel <k0scist@gmail.com>
parents: 93
diff changeset
86 if out_of_range:
Jeff Hammel <k0scist@gmail.com>
parents: 93
diff changeset
87 self.error("Fractions should be between 0 and 1")
93
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
88
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
89 def main(args=sys.argv[1:]):
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
90 """CLI"""
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
91
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
92 # parse command line options
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
93 parser = FracParser()
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
94 options = parser.parse_args(args)
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
95
99
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
96 # get fractions display
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
97 lines = frac(options.fraction, width=options.width)
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
98
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
99 # display
570ceafeb670 STUB: numerics/text_display.py
Jeff Hammel <k0scist@gmail.com>
parents: 98
diff changeset
100 print ('\n'.join(lines))
93
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
101
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
102 if __name__ == '__main__':
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
103 main()
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
104
b755a8d946de stub: txt display
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
105