Update correlation logic for 2015 Gazetteer
[weather.git] / weather
diff --git a/weather b/weather
index 1110ea0..67a13c8 100755 (executable)
--- a/weather
+++ b/weather
 #!/usr/bin/env python
+# distributions may wish to edit the above to refer to a specific interpreter
+# path, such as #!/usr/bin/python
 
-# weather version 1.1, http://fungi.yuggoth.org/weather/
-# Copyright (c) 2006 Jeremy Stanley <fungi@yuggoth.org>, all rights reserved.
-# Licensed per terms in the LICENSE file distributed with this software.
+# Copyright (c) 2006-2012 Jeremy Stanley <fungi@yuggoth.org>. Permission to
+# use, copy, modify, and distribute this software is granted under terms
+# provided in the LICENSE file distributed with this software.
 
 """Wrapper utility using the weather.py module."""
 
+# added so distributors can consistently specify a private module location
+private_module_path = None
+if private_module_path:
+    import sys
+    sys.path.insert(1, private_module_path)
+
 import weather
 
 # initialize options and configs
 selections = weather.Selections()
-get = selections.get
-get_bool = selections.get_bool
 
 # this mode just lists the aliases defined in the config
-if get_bool("list"): print weather.list_aliases(selections.config)
+if selections.get_bool("list"):
+    print( weather.list_aliases(selections.config) )
+
+# this mode lists details of aliases defined in the config
+elif selections.get_bool("longlist"):
+    print( weather.list_aliases(selections.config, detail=True) )
+
+# this mode builds the correlation data files
+elif selections.get_bool("build_sets"):
+    weather.correlate()
+
+# if no arguments were provided
+elif not selections.arguments:
+    import sys
+
+    # substitute defaults if we have any
+    if selections.config.has_option("default", "defargs"):
+        sys.argv += selections.config.get("default", "defargs").split(",")
+        selections = weather.Selections()
+
+    # otherwise be helpful
+    else:
+        sys.argv += ("--help",)
+        selections = weather.Selections()
+
+# these modes analyze correlations
+if selections.get_bool("info"):
+    weather.guess(
+        selections.arguments[0],
+        path=selections.get("setpath"),
+        info=selections.get_bool("info"),
+        cache_search=(
+            selections.get_bool("cache") \
+                and selections.get_bool("cache_search")
+        ),
+        cacheage=selections.getint("cacheage"),
+        cachedir=selections.get("cachedir")
+    )
 
 # normal operation
 else:
-       for argument in selections.arguments:
-               if get_bool("conditions", argument):
-                       print weather.get_metar(
-                               get("id", argument),
-                               get_bool("verbose", argument)
-                               )
-               if not get_bool("conditions", argument) \
-                       or get_bool("forecast", argument):
-                       print weather.get_forecast(
-                               get("city", argument),
-                               get("st", argument),
-                               get_bool("verbose", argument)
-                               )
-
+    output = ""
+    for argument in selections.arguments:
+        if selections.get_bool("conditions", argument) or not (
+            selections.get_bool("alert", argument) \
+                or selections.get_bool("forecast", argument)
+            ):
+            partial = weather.get_metar(
+                uri=selections.get("metar", argument),
+                verbose=selections.get_bool("verbose", argument),
+                quiet=selections.get_bool("quiet", argument),
+                headers=selections.get("headers", argument),
+                imperial=selections.get_bool("imperial", argument),
+                metric=selections.get_bool("metric", argument),
+                cache_data=(
+                    selections.get_bool("cache") \
+                        and selections.get_bool("cache_data")
+                ),
+                cacheage=selections.getint("cacheage"),
+                cachedir=selections.get("cachedir")
+            )
+            if partial: output += partial + "\n"
+        if selections.get_bool("forecast", argument) \
+            or selections.get_bool("alert", argument):
+            alert_text = ""
+            if selections.get_bool("alert", argument):
+                atypes = selections.get("atypes", argument).split(",")
+            else:
+                atypes = []
+            if selections.get_bool("forecast", argument):
+                atypes = ["zone_forecast"] + atypes
+            for atype in atypes:
+                partial = weather.get_alert(
+                    uri=selections.get(atype, argument),
+                    verbose=selections.get_bool("verbose", argument),
+                    quiet=selections.get_bool("quiet", argument),
+                    cache_data=(
+                        selections.get_bool("cache") \
+                            and selections.get_bool("cache_data")
+                    ),
+                    cacheage=selections.getint("cacheage"),
+                    cachedir=selections.get("cachedir")
+                )
+                if partial:
+                    alert_text += "***** %s *****\n%s\n" % (
+                        atype.replace("_", " ").title(),
+                        partial
+                    )
+            if not alert_text:
+                alert_text = "(no current alerts for this zone)\n"
+            output += alert_text
+    output = output.strip()
+    if output: print( output )