Improve structure ahead of library functionality
[munter.git] / munter.py
index 1e3ad6680408f9612de404e71aef61bbd1fc7d6a..8b23b25fd74a6b5010cfd9d697f28c266326d18f 100755 (executable)
--- a/munter.py
+++ b/munter.py
@@ -2,9 +2,15 @@
 # -*- coding: utf-8 -*-
 
 
-# Munter Time Calculation
-#
-# Rudimentary program written by ALV to implement the Munter time calculation
+"""
+Munter Time Calculation
+Alexander Vasarab
+Wylark Mountaineering LLC
+
+Version 1.0.2
+
+A rudimentary program which implements the Munter time calculation.
+"""
 
 import sys
 import argparse
@@ -22,7 +28,7 @@ rates = {
 unit_choices = ['metric', 'imperial']
 travel_mode_choices = rates.keys()
 
-def munter(distance, elevation, rate, units):
+def time_calc(distance, elevation, rate, units):
     retval = {}
 
     if units not in unit_choices:
@@ -44,28 +50,78 @@ def munter(distance, elevation, rate, units):
 
     return retval
 
-def main():
+def print_ugly_estimate(est):
+    hours = int(est['time'])
+    minutes = int((est['time'] - hours) * 60)
+    print("{human_time}".format(
+            human_time="{hours} hours {minutes} minutes".format(
+                hours=hours,
+                minutes=minutes)))
+
+def print_pretty_estimate(est):
+    hours = int(est['time'])
+    minutes = int((est['time'] - hours) * 60)
+
+    # NOTE: Below, the line with the unicode up arrow uses an alignment
+    #       value of 31. In the future, consider using e.g. wcwidth
+    #       library so that this is more elegant.
+    print("\n\t╒═══════════════════════════════╕")
+    print("\t╎▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╎╮")
+    print("\t╎▒{:^29}▒╎│".format(''))
+    print("\t╎▒{pace_readable:^31}▒╎│".format(
+            pace_readable="{units} {direction} @ {pace}".format(
+                units=round(est['unit_count']),
+                direction=est['direction'],
+                pace=est['pace'])))
+    print("\t╎▒{human_time:^29}▒╎│".format(
+            human_time="{hours} hours {minutes} minutes".format(
+                hours=hours,
+                minutes=minutes)))
+    print("\t╎▒{:^29}▒╎│".format(''))
+    print("\t╎▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╎│")
+    print("\t╘═══════════════════════════════╛│")
+    print("\t └───────────────────────────────┘\n")
+
+def get_parser():
     parser = argparse.ArgumentParser(description='Munter Time Calculation')
 
-    parser.add_argument('--distance', '-d', type=float,
+    parser.add_argument('--distance',
+        '-d',
+        type=float,
         required=True,
         help='Distance (in km, by default)')
 
-    parser.add_argument('--elevation', '-e', type=float,
+    parser.add_argument('--elevation',
+        '-e',
+        type=float,
         required=True,
         help='Elevation change (in m, by default)')
 
-    parser.add_argument('--travel-mode', '-t', type=str,
+    parser.add_argument('--travel-mode',
+        '-t',
+        type=str,
         default='uphill',
         choices=travel_mode_choices, required=False,
         help='Travel mode (flat, by default)')
 
-    parser.add_argument('--units', '-u', type=str,
+    parser.add_argument('--units',
+        '-u',
+        type=str,
         default='imperial',
         required=False,
         choices=unit_choices,
         help='Units of input values')
 
+    parser.add_argument('--pretty',
+        '-p',
+        action='store_true',
+        default=False,
+        required=False);
+
+    return parser
+
+def main():
+    parser = get_parser()
     opts = parser.parse_args()
 
     distance = opts.distance
@@ -73,27 +129,12 @@ def main():
     units = opts.units
     travel_mode = opts.travel_mode
 
-    time_calc = munter(distance, elevation, travel_mode, units=units)
+    time_estimate = time_calc(distance, elevation, travel_mode, units=units)
 
-    hours = int(time_calc['time'])
-    minutes = int((time_calc['time'] - hours) * 60)
-
-    print("\n\t╒═══════════════════════════════╕")
-    print("\t╎▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╎╮")
-    print("\t╎▒{:^29}▒╎│".format(''))
-    print("\t╎▒{pace_readable:^29}▒╎│".format(
-            pace_readable="{units} {direction} @ {pace}".format(
-                units=round(time_calc['unit_count']),
-                direction=time_calc['direction'],
-                pace=time_calc['pace'])))
-    print("\t╎▒{human_time:^29}▒╎│".format(
-            human_time="{hours} hours {minutes} minutes".format(
-                hours=hours,
-                minutes=minutes)))
-    print("\t╎▒{:^29}▒╎│".format(''))
-    print("\t╎▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒╎│")
-    print("\t╘═══════════════════════════════╛│")
-    print("\t └───────────────────────────────┘\n")
+    if opts.pretty:
+        print_pretty_estimate(time_estimate)
+    else:
+        print_ugly_estimate(time_estimate)
 
 if __name__ == "__main__":
     main()