Mercurial > hg > numerics
annotate numerics/text_display.py @ 164:c16940bd2cee
this works
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Fri, 15 May 2015 16:59:09 -0700 |
parents | 570ceafeb670 |
children |
rev | line source |
---|---|
93 | 1 #!/usr/bin/env python |
2 # -*- coding: utf-8 -*- | |
3 | |
4 """ | |
5 text display | |
6 """ | |
7 | |
8 # imports | |
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 | 13 |
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 | 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 | 28 |
29 | |
95 | 30 def iterable(obj): |
31 """is `obj` iterable?""" | |
32 # TODO: should probably go elsewhere | |
33 try: | |
34 iter(obj) | |
35 return True | |
36 except TypeError: | |
37 return False | |
38 | |
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 | 41 """display fractions""" |
95 | 42 if not iterable(fractions): |
43 # convert single item to list | |
44 fractions = [fractions] | |
45 retval = [] | |
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 | 59 |
60 | |
61 class FracParser(argparse.ArgumentParser): | |
62 """CLI option parser""" | |
63 def __init__(self, **kwargs): | |
64 kwargs.setdefault('formatter_class', argparse.RawTextHelpFormatter) | |
65 kwargs.setdefault('description', __doc__) | |
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 | 68 help="fractions to display") |
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 | 71 help="width to display [DEFAULT: %(default)s]") |
72 self.options = None | |
73 | |
74 def parse_args(self, *args, **kw): | |
75 options = argparse.ArgumentParser.parse_args(self, *args, **kw) | |
76 self.validate(options) | |
77 self.options = options | |
78 return options | |
79 | |
80 def validate(self, options): | |
81 """validate options""" | |
82 if options.width < 1: | |
83 self.error("Width must be greater than zero (You gave: {})".format(options.width)) | |
94 | 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 | 86 if out_of_range: |
87 self.error("Fractions should be between 0 and 1") | |
93 | 88 |
89 def main(args=sys.argv[1:]): | |
90 """CLI""" | |
91 | |
92 # parse command line options | |
93 parser = FracParser() | |
94 options = parser.parse_args(args) | |
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 | 101 |
102 if __name__ == '__main__': | |
103 main() | |
104 | |
105 |