5626897ebe391e23d53fc53b7d8b2fc238be8bf7
[munter.git] / munter.py
1 #! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3
4
5 # Munter Time Calculation
6 #
7 # Rudimentary program written by ALV to implement the Munter time calculation
8
9 import sys
10 import argparse
11
12 class InvalidUnitsException(Exception):
13 pass
14
15 rates = {
16 'uphill': { 'rate': 4, 'direction': '↑' },
17 'flat': { 'rate': 6, 'direction': '→' }, # or downhill on foot
18 'downhill': { 'rate': 10, 'direction': '↓' },
19 'bushwhacking': { 'rate': 2, 'direction': '↹' },
20 }
21
22 unit_choices = ['metric', 'imperial']
23 travel_mode_choices = rates.keys()
24
25 def munter(distance, elevation, rate, units):
26 retval = {}
27
28 if units not in unit_choices:
29 raise InvalidUnitsException
30
31 unit_count = 0
32
33 if 'imperial' == units:
34 # convert to metric
35 distance = (distance * 1.609) # mi to km
36 elevation = (elevation * .305) # ft to m
37
38 unit_count = distance + (elevation / 100.0)
39
40 retval['time'] = (distance + (elevation / 100.0)) / rates[rate]['rate']
41 retval['unit_count'] = unit_count
42 retval['direction'] = rates[rate]['direction']
43 retval['pace'] = rates[rate]['rate']
44
45 return retval
46
47 def main():
48 parser = argparse.ArgumentParser(description='Munter Time Calculation')
49
50 parser.add_argument('--distance', '-d', type=float,
51 required=True,
52 help='Distance (in km, by default)')
53
54 parser.add_argument('--elevation', '-e', type=float,
55 required=True,
56 help='Elevation change (in m, by default)')
57
58 parser.add_argument('--travel-mode', '-t', type=str,
59 default='uphill',
60 choices=travel_mode_choices, required=False,
61 help='Travel mode (flat, by default)')
62
63 parser.add_argument('--units', '-u', type=str,
64 default='imperial',
65 required=False,
66 choices=unit_choices,
67 help='Units of input values')
68
69 opts = parser.parse_args()
70
71 distance = opts.distance
72 elevation = opts.elevation
73 units = opts.units
74 travel_mode = opts.travel_mode
75
76 time_calc = munter(distance, elevation, travel_mode, units=units)
77
78 hours = int(time_calc['time'])
79 minutes = int((time_calc['time'] - hours) * 60)
80
81 print("\n\t╒═══════════════════════════════╕")
82 print("\t╎▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╎╮")
83 print("\t╎▒{:^29}▒╎│".format(''))
84 print("\t╎▒{pace_readable:^31}▒╎│".format(
85 pace_readable="{units} {direction} @ {pace}".format(
86 units=round(time_calc['unit_count']),
87 direction=time_calc['direction'],
88 pace=time_calc['pace'])))
89 print("\t╎▒{human_time:^29}▒╎│".format(
90 human_time="{hours} hours {minutes} minutes".format(
91 hours=hours,
92 minutes=minutes)))
93 print("\t╎▒{:^29}▒╎│".format(''))
94 print("\t╎▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╎│")
95 print("\t╘═══════════════════════════════╛│")
96 print("\t └───────────────────────────────┘\n")
97
98 if __name__ == "__main__":
99 main()