Rename a flag.
[python_utils.git] / conversion_utils.py
index bab27e1215dc0a67389e2353ba77b9b53c4ff7a1..10908c54637c143ab6d58da1db95c4ec451c5e6e 100644 (file)
@@ -3,6 +3,8 @@
 from numbers import Number
 from typing import Callable
 
+import constants
+
 
 class Converter(object):
     def __init__(self,
@@ -28,6 +30,31 @@ class Converter(object):
 
 
 conversion_catalog = {
+    "Second": Converter("Second",
+                        "time",
+                        lambda s: s,
+                        lambda s: s,
+                        "s"),
+    "Minute": Converter("Minute",
+                        "time",
+                        lambda m: (m * constants.SECONDS_PER_MINUTE),
+                        lambda s: (s / constants.SECONDS_PER_MINUTE),
+                        "m"),
+    "Hour": Converter("Hour",
+                      "time",
+                      lambda h: (h * constants.SECONDS_PER_HOUR),
+                      lambda s: (s / constants.SECONDS_PER_HOUR),
+                      "h"),
+    "Day": Converter("Day",
+                     "time",
+                     lambda d: (d * constants.SECONDS_PER_DAY),
+                     lambda s: (s / constants.SECONDS_PER_DAY),
+                     "d"),
+    "Week": Converter("Week",
+                      "time",
+                      lambda w: (w * constants.SECONDS_PER_WEEK),
+                      lambda s: (s / constants.SECONDS_PER_WEEK),
+                      "w"),
     "Fahrenheit": Converter("Fahrenheit",
                             "temperature",
                             lambda f: (f - 32.0) * 0.55555555,
@@ -53,6 +80,8 @@ def convert(magnitude: Number,
     dst = conversion_catalog.get(to_thing, None)
     if src is None or dst is None:
         raise ValueError("No known conversion")
+    if src.category != dst.category:
+        raise ValueError("Incompatible conversion")
     return _convert(magnitude, src, dst)
 
 
@@ -64,6 +93,86 @@ def _convert(magnitude: Number,
     return converted
 
 
+def sec_to_min(s: float) -> float:
+    return convert(s, "Second", "Minute")
+
+
+def sec_to_hour(s: float) -> float:
+    return convert(s, "Second", "Hour")
+
+
+def sec_to_day(s: float) -> float:
+    return convert(s, "Second", "Day")
+
+
+def sec_to_week(s: float) -> float:
+    return convert(s, "Second", "Week")
+
+
+def min_to_sec(m: float) -> float:
+    return convert(m, "Minute", "Second")
+
+
+def min_to_hour(m: float) -> float:
+    return convert(m, "Minute", "Hour")
+
+
+def min_to_day(m: float) -> float:
+    return convert(m, "Minute", "Day")
+
+
+def min_to_week(m: float) -> float:
+    return convert(m, "Minute", "Week")
+
+
+def hour_to_sec(h: float) -> float:
+    return convert(h, "Hour", "Second")
+
+
+def hour_to_min(h: float) -> float:
+    return convert(h, "Hour", "Minute")
+
+
+def hour_to_day(h: float) -> float:
+    return convert(h, "Hour", "Day")
+
+
+def hour_to_week(h: float) -> float:
+    return convert(h, "Hour", "Week")
+
+
+def day_to_sec(d: float) -> float:
+    return convert(d, "Day", "Second")
+
+
+def day_to_min(d: float) -> float:
+    return convert(d, "Day", "Minute")
+
+
+def day_to_hour(d: float) -> float:
+    return convert(d, "Day", "Hour")
+
+
+def day_to_week(d: float) -> float:
+    return convert(d, "Day", "Week")
+
+
+def week_to_sec(w: float) -> float:
+    return convert(w, "Week", "Second")
+
+
+def week_to_min(w: float) -> float:
+    return convert(w, "Week", "Minute")
+
+
+def week_to_hour(w: float) -> float:
+    return convert(w, "Week", "Hour")
+
+
+def week_to_day(w: float) -> float:
+    return convert(w, "Week", "Day")
+
+
 def f_to_c(temp_f: float) -> float:
     """Fahrenheit to Celsius."""
     return convert(temp_f, "Fahrenheit", "Celsius")