b7a7f725b44882531f1245df49ca00304a071dfe
[munter.git] / munter.py
1 #! /usr/bin/env python
2
3 # Munter Time Calculation
4 #
5 # Rudimentary program written by ALV to implement the Munter time calculation
6
7 import sys
8 import argparse
9
10 class InvalidUnitsException(Exception):
11 pass
12
13 rates = {
14 'uphill': 4,
15 'flat': 6, # or downhill on foot
16 'downhill': 10,
17 'bushwhacking': 2
18 }
19
20 unit_choices = ['metric', 'imperial']
21 travel_mode_choices = rates.keys()
22
23 def munter(distance, elevation, rate='flat', units='metric'):
24 if units not in unit_choices:
25 raise InvalidUnitsException
26
27 if 'imperial' == units:
28 # convert to metric
29 distance = (distance * 1.609) # mi to km
30 elevation = (elevation * .305) # ft to m
31
32 time = (distance + (elevation / 100.0)) / rates[rate]
33
34 return time
35
36 def main():
37 parser = argparse.ArgumentParser(description='Munter Time Calculation')
38
39 parser.add_argument('--distance', '-d', type=float, required=True,
40 help='Distance (in km, by default)')
41 parser.add_argument('--elevation', '-e', type=float, required=True,
42 help='Elevation change (in m, by default)')
43 parser.add_argument('--travel-mode', '-t', type=str,
44 default='uphill', choices=travel_mode_choices, required=False,
45 help='Travel mode (flat, by default)')
46 parser.add_argument('--units', '-u', type=str, default='metric',
47 required=False,
48 choices=unit_choices,
49 help='Units of input values')
50 opts = parser.parse_args()
51
52 distance = opts.distance
53 elevation = opts.elevation
54 units = opts.units
55 travel_mode = opts.travel_mode
56
57 print("Estimated Time (in hours) = %8.2f"
58 % munter(distance, elevation, travel_mode, units=units))
59
60 if __name__ == "__main__":
61 main()