Add -v and "one true source"-ify program name
[munter.git] / munter / munter.py
index 7179e5272ebcef59572a1d5317d6297375567822..d8683491f2bd899aa08e1baea82697c935ca547a 100644 (file)
@@ -12,6 +12,9 @@ A rudimentary program which implements the Munter time calculation.
 import sys
 import argparse
 
+from . import __progname__ as progname
+from . import __version__ as version
+
 class InvalidUnitsException(Exception):
     pass
 
@@ -22,10 +25,18 @@ rates = {
     'bushwhacking': { 'rate': 2, 'direction': '↹' },
 }
 
+fitnesses = {
+    'slow': 1.2,
+    'average': 1,
+    'fast': .7,
+}
+
 unit_choices = ['metric', 'imperial']
 travel_mode_choices = rates.keys()
+fitness_choices = fitnesses.keys()
 
-def time_calc(distance, elevation, rate, units):
+def time_calc(distance, elevation, fitness='average', rate='uphill',
+    units='imperial'):
     retval = {}
 
     if units not in unit_choices:
@@ -41,6 +52,8 @@ def time_calc(distance, elevation, rate, units):
     unit_count = distance + (elevation / 100.0)
 
     retval['time'] = (distance + (elevation / 100.0)) / rates[rate]['rate']
+    retval['time'] = retval['time'] * fitnesses[fitness]
+
     retval['unit_count'] = unit_count
     retval['direction'] = rates[rate]['direction']
     retval['pace'] = rates[rate]['rate']
@@ -80,18 +93,22 @@ def print_pretty_estimate(est):
     print("\t └───────────────────────────────┘\n")
 
 def get_parser():
-    parser = argparse.ArgumentParser(description='Munter Time Calculation')
+    parser = argparse.ArgumentParser(description='Implementation of '
+        'the Munter time calculation')
 
+    # No required args anymore, since -g overrides any requirement
     parser.add_argument('--distance',
         '-d',
+        default=0.0,
         type=float,
-        required=True,
+        required=False,
         help='Distance (in km, by default)')
 
     parser.add_argument('--elevation',
         '-e',
+        default=0.0,
         type=float,
-        required=True,
+        required=False,
         help='Elevation change (in m, by default)')
 
     parser.add_argument('--travel-mode',
@@ -99,7 +116,14 @@ def get_parser():
         type=str,
         default='uphill',
         choices=travel_mode_choices, required=False,
-        help='Travel mode (flat, by default)')
+        help='Travel mode (uphill, by default)')
+
+    parser.add_argument('--fitness',
+        '-f',
+        type=str,
+        default='average',
+        choices=fitness_choices, required=False,
+        help='Fitness modifier (average, by default)')
 
     parser.add_argument('--units',
         '-u',
@@ -113,7 +137,22 @@ def get_parser():
         '-p',
         action='store_true',
         default=False,
-        required=False);
+        required=False,
+        help="Make output pretty");
+
+    parser.add_argument('--gui',
+        '-g',
+        action='store_true',
+        default=False,
+        required=False,
+        help='Launch GUI mode (overrides --pretty)')
+
+    parser.add_argument('--version',
+        '-v',
+        action='store_true',
+        default=False,
+        required=False,
+        help='Print version and exit')
 
     return parser
 
@@ -123,15 +162,28 @@ def main():
 
     distance = opts.distance
     elevation = opts.elevation
+    fitness = opts.fitness
     units = opts.units
     travel_mode = opts.travel_mode
+    pretty = opts.pretty
+    gui = opts.gui
+    get_version = opts.version
+
+    if get_version:
+        print("%s - v%s" % (progname, version))
+        return 0
 
-    time_estimate = time_calc(distance, elevation, travel_mode, units=units)
+    time_estimate = time_calc(distance=distance, elevation=elevation,
+        fitness=fitness, rate=travel_mode, units=units)
 
-    if opts.pretty:
-        print_pretty_estimate(time_estimate)
+    if gui:
+        from . import gui
+        gui.startup()
     else:
-        print_ugly_estimate(time_estimate)
+        if pretty:
+            print_pretty_estimate(time_estimate)
+        else:
+            print_ugly_estimate(time_estimate)
 
     return 0