Since the next version will require Python 3.9 or later due to
relying on the zoneinfo module, go ahead and clean up code that
supported earlier versions of the interpreter as well as updating
documentation accordingly.
Basic Unix Installation Instructions for the Weather Utility
==============================================================
Basic Unix Installation Instructions for the Weather Utility
==============================================================
-:Copyright: (c) 2006-2014 Jeremy Stanley <fungi@yuggoth.org>. Permission
+:Copyright: (c) 2006-2024 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.
to use, copy, modify, and distribute this software is
granted under terms provided in the LICENSE file distributed
with this software.
Python, it can be obtained from http://www.python.org/ but chances are
your operating system at least provides some sort of native package for
it, which you should probably install in whatever means is recommended
Python, it can be obtained from http://www.python.org/ but chances are
your operating system at least provides some sort of native package for
it, which you should probably install in whatever means is recommended
-by your OS vendor/distributor. The script is tested with recent 2.x and
+by your OS vendor/distributor. The script is tested with recent
3.x Python versions, attempting to maintain forward/backward
compatability with the interpreter, so bug reports or patches to ensure
this continues to be the case are most welcome.
3.x Python versions, attempting to maintain forward/backward
compatability with the interpreter, so bug reports or patches to ensure
this continues to be the case are most welcome.
New Version Information for the Weather Utility
=================================================
New Version Information for the Weather Utility
=================================================
-:Copyright: (c) 2006-2020 Jeremy Stanley <fungi@yuggoth.org>. Permission
+:Copyright: (c) 2006-2024 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.
to use, copy, modify, and distribute this software is
granted under terms provided in the LICENSE file distributed
with this software.
2.4 Release
-----------
This is planned to be the last release supporting Python 2; starting
2.4 Release
-----------
This is planned to be the last release supporting Python 2; starting
-with the 3.0.0 release, this software will only be usable with Python
-3.5 and later.
+with the 2.5.0 release, this software will only be usable with Python
+3.x.
Refreshed correlation sets and data sources including updating to 2019
US Census locations and incorporating public domain airport information
Refreshed correlation sets and data sources including updating to 2019
US Census locations and incorporating public domain airport information
radian_to_km = 6372.795484
radian_to_mi = 3959.871528
radian_to_km = 6372.795484
radian_to_mi = 3959.871528
-def pyversion(ref=None):
- """Determine the Python version and optionally compare to a reference."""
- import platform
- ver = platform.python_version()
- if ref:
- return [
- int(x) for x in ver.split(".")[:2]
- ] >= [
- int(x) for x in ref.split(".")[:2]
- ]
- else: return ver
-
class Selections:
"""An object to contain selection data."""
def __init__(self):
class Selections:
"""An object to contain selection data."""
def __init__(self):
cachedir="."
):
"""Return a string containing the results of a URI GET."""
cachedir="."
):
"""Return a string containing the results of a URI GET."""
- if pyversion("3"):
- import urllib, urllib.error, urllib.request
- URLError = urllib.error.URLError
- urlopen = urllib.request.urlopen
- else:
- import urllib2 as urllib
- URLError = urllib.URLError
- urlopen = urllib.urlopen
- import os, time
+ import os, time, urllib, urllib.error, urllib.request
if cache_data:
dcachedir = os.path.join( os.path.expanduser(cachedir), "datacache" )
if not os.path.exists(dcachedir):
if cache_data:
dcachedir = os.path.join( os.path.expanduser(cachedir), "datacache" )
if not os.path.exists(dcachedir):
dcache_fd.close()
else:
try:
dcache_fd.close()
else:
try:
- data = urlopen(uri).read().decode("utf-8")
- except URLError:
+ data = urllib.request.urlopen(uri).read().decode("utf-8")
+ except urllib.error.URLError:
if ignore_fail: return ""
import os, sys
sys.stderr.write("%s error: failed to retrieve\n %s\n\n" % (
if ignore_fail: return ""
import os, sys
sys.stderr.write("%s error: failed to retrieve\n %s\n\n" % (
cacheage=cacheage,
cachedir=cachedir
)
cacheage=cacheage,
cachedir=cachedir
)
- if pyversion("3") and type(metar) is bytes: metar = metar.decode("utf-8")
+ if type(metar) is bytes: metar = metar.decode("utf-8")
if verbose: return metar
else:
import re
if verbose: return metar
else:
import re
cacheage=cacheage,
cachedir=cachedir
).strip()
cacheage=cacheage,
cachedir=cachedir
).strip()
- if pyversion("3") and type(alert) is bytes: alert = alert.decode("utf-8")
+ if type(alert) is bytes: alert = alert.decode("utf-8")
if alert:
if verbose: return alert
else:
if alert:
if verbose: return alert
else:
def get_config():
"""Parse the aliases and configuration."""
def get_config():
"""Parse the aliases and configuration."""
- if pyversion("3"): import configparser
- else: import ConfigParser as configparser
+ import configparser, os
config = configparser.ConfigParser()
config = configparser.ConfigParser()
rcfiles = [
"/etc/weatherrc",
"/etc/weather/weatherrc",
rcfiles = [
"/etc/weatherrc",
"/etc/weather/weatherrc",
]
for rcfile in rcfiles:
if os.access(rcfile, os.R_OK):
]
for rcfile in rcfiles:
if os.access(rcfile, os.R_OK):
- if pyversion("3"):
- config.read(rcfile, encoding="utf-8")
- else:
- config.read(rcfile)
+ config.read(rcfile, encoding="utf-8")
for section in config.sections():
if section != section.lower():
if config.has_section(section.lower()):
for section in config.sections():
if section != section.lower():
if config.has_section(section.lower()):
def integrate_search_cache(config, cachedir, setpath):
"""Add cached search results into the configuration."""
def integrate_search_cache(config, cachedir, setpath):
"""Add cached search results into the configuration."""
- if pyversion("3"): import configparser
- else: import ConfigParser as configparser
- import os, time
+ import configparser, os, time
scache_fn = os.path.join( os.path.expanduser(cachedir), "searches" )
if not os.access(scache_fn, os.R_OK): return config
scache_fd = open(scache_fn)
scache_fn = os.path.join( os.path.expanduser(cachedir), "searches" )
if not os.access(scache_fn, os.R_OK): return config
scache_fd = open(scache_fn)
pass
return config
scache = configparser.ConfigParser()
pass
return config
scache = configparser.ConfigParser()
- if pyversion("3"):
- scache.read(scache_fn, encoding="utf-8")
- else:
- scache.read(scache_fn)
+ scache.read(scache_fn, encoding="utf-8")
for section in scache.sections():
if not config.has_section(section):
config.add_section(section)
for section in scache.sections():
if not config.has_section(section):
config.add_section(section)
quiet=False
):
"""Find URIs using airport, gecos, placename, station, ZCTA/ZIP, zone."""
quiet=False
):
"""Find URIs using airport, gecos, placename, station, ZCTA/ZIP, zone."""
- import codecs, datetime, time, os, re, sys
- if pyversion("3"): import configparser
- else: import ConfigParser as configparser
+ import codecs, configparser, datetime, time, os, re, sys
datafiles = data_index(path)
if re.match("[A-Za-z]{3}$", expression): searchtype = "airport"
elif re.match("[A-Za-z0-9]{4}$", expression): searchtype = "station"
datafiles = data_index(path)
if re.match("[A-Za-z]{3}$", expression): searchtype = "airport"
elif re.match("[A-Za-z0-9]{4}$", expression): searchtype = "station"
datafile = datafiles[dataname][0]
if datafile.endswith(".gz"):
import gzip
datafile = datafiles[dataname][0]
if datafile.endswith(".gz"):
import gzip
- if pyversion("3"):
- stations.read_string(
- gzip.open(datafile).read().decode("utf-8") )
- else: stations.read_file( gzip.open(datafile) )
+ stations.read_string( gzip.open(datafile).read().decode("utf-8") )
- if pyversion("3"):
- stations.read(datafile, encoding="utf-8")
- else:
- stations.read(datafile)
+ stations.read(datafile, encoding="utf-8")
else:
message = "%s error: can't find \"%s\" data file\n" % (
os.path.basename( sys.argv[0] ),
else:
message = "%s error: can't find \"%s\" data file\n" % (
os.path.basename( sys.argv[0] ),
datafile = datafiles[dataname][0]
if datafile.endswith(".gz"):
import gzip
datafile = datafiles[dataname][0]
if datafile.endswith(".gz"):
import gzip
- if pyversion("3"):
- zones.read_string( gzip.open(datafile).read().decode("utf-8") )
- else: zones.read_file( gzip.open(datafile) )
+ zones.read_string( gzip.open(datafile).read().decode("utf-8") )
- if pyversion("3"):
- zones.read(datafile, encoding="utf-8")
- else:
- zones.read(datafile)
+ zones.read(datafile, encoding="utf-8")
else:
message = "%s error: can't find \"%s\" data file\n" % (
os.path.basename( sys.argv[0] ),
else:
message = "%s error: can't find \"%s\" data file\n" % (
os.path.basename( sys.argv[0] ),
datafile = datafiles[dataname][0]
if datafile.endswith(".gz"):
import gzip
datafile = datafiles[dataname][0]
if datafile.endswith(".gz"):
import gzip
- if pyversion("3"):
- airports.read_string(
- gzip.open(datafile).read().decode("utf-8") )
- else: airports.read_file( gzip.open(datafile) )
+ airports.read_string(
+ gzip.open(datafile).read().decode("utf-8") )
- if pyversion("3"):
- airports.read(datafile, encoding="utf-8")
- else:
- airports.read(datafile)
+ airports.read(datafile, encoding="utf-8")
else:
message = "%s error: can't find \"%s\" data file\n" % (
os.path.basename( sys.argv[0] ),
else:
message = "%s error: can't find \"%s\" data file\n" % (
os.path.basename( sys.argv[0] ),
datafile = datafiles[dataname][0]
if datafile.endswith(".gz"):
import gzip
datafile = datafiles[dataname][0]
if datafile.endswith(".gz"):
import gzip
- if pyversion("3"):
- zctas.read_string(
- gzip.open(datafile).read().decode("utf-8") )
- else: zctas.read_file( gzip.open(datafile) )
+ zctas.read_string( gzip.open(datafile).read().decode("utf-8") )
- if pyversion("3"):
- zctas.read(datafile, encoding="utf-8")
- else:
- zctas.read(datafile)
+ zctas.read(datafile, encoding="utf-8")
else:
message = "%s error: can't find \"%s\" data file\n" % (
os.path.basename( sys.argv[0] ),
else:
message = "%s error: can't find \"%s\" data file\n" % (
os.path.basename( sys.argv[0] ),
datafile = datafiles[dataname][0]
if datafile.endswith(".gz"):
import gzip
datafile = datafiles[dataname][0]
if datafile.endswith(".gz"):
import gzip
- if pyversion("3"):
- places.read_string(
- gzip.open(datafile).read().decode("utf-8") )
- else: places.read_file( gzip.open(datafile) )
+ places.read_string( gzip.open(datafile).read().decode("utf-8") )
- if pyversion("3"):
- places.read(datafile, encoding="utf-8")
- else:
- places.read(datafile)
+ places.read(datafile, encoding="utf-8")
else:
message = "%s error: can't find \"%s\" data file\n" % (
os.path.basename( sys.argv[0] ),
else:
message = "%s error: can't find \"%s\" data file\n" % (
os.path.basename( sys.argv[0] ),
)
try:
scache_existing = configparser.ConfigParser()
)
try:
scache_existing = configparser.ConfigParser()
- if pyversion("3"):
- scache_existing.read(scache_fn, encoding="utf-8")
- else:
- scache_existing.read(scache_fn)
+ scache_existing.read(scache_fn, encoding="utf-8")
if not scache_existing.has_section(search[0]):
scache_fd = codecs.open(scache_fn, "a", "utf-8")
scache_fd.writelines(search_cache)
if not scache_existing.has_section(search[0]):
scache_fd = codecs.open(scache_fn, "a", "utf-8")
scache_fd.writelines(search_cache)
return tuple(coordinates)
def correlate():
return tuple(coordinates)
def correlate():
- import codecs, csv, datetime, hashlib, os, re, sys, time, zipfile, zoneinfo
- if pyversion("3"): import configparser
- else: import ConfigParser as configparser
+ import codecs, configparser, csv, datetime, hashlib, os, re, sys, time
+ import zipfile, zoneinfo
for filename in os.listdir("."):
if re.match("[0-9]{4}_Gaz_counties_national.zip$", filename):
gcounties_an = filename
for filename in os.listdir("."):
if re.match("[0-9]{4}_Gaz_counties_national.zip$", filename):
gcounties_an = filename
sys.stdout.write(message)
sys.stdout.flush()
airports = configparser.ConfigParser()
sys.stdout.write(message)
sys.stdout.flush()
airports = configparser.ConfigParser()
- if pyversion("3"):
- airports.read(airports_fn, encoding="utf-8")
- else:
- airports.read(airports_fn)
+ airports.read(airports_fn, encoding="utf-8")
places = configparser.ConfigParser()
places = configparser.ConfigParser()
- if pyversion("3"):
- places.read(places_fn, encoding="utf-8")
- else:
- places.read(places_fn)
+ places.read(places_fn, encoding="utf-8")
stations = configparser.ConfigParser()
stations = configparser.ConfigParser()
- if pyversion("3"):
- stations.read(stations_fn, encoding="utf-8")
- else:
- stations.read(stations_fn)
+ stations.read(stations_fn, encoding="utf-8")
zctas = configparser.ConfigParser()
zctas = configparser.ConfigParser()
- if pyversion("3"):
- zctas.read(zctas_fn, encoding="utf-8")
- else:
- zctas.read(zctas_fn)
+ zctas.read(zctas_fn, encoding="utf-8")
zones = configparser.ConfigParser()
zones = configparser.ConfigParser()
- if pyversion("3"):
- zones.read(zones_fn, encoding="utf-8")
- else:
- zones.read(zones_fn)
+ zones.read(zones_fn, encoding="utf-8")
qalog = []
places_nocentroid = 0
places_nodescription = 0
qalog = []
places_nocentroid = 0
places_nodescription = 0