Clean up Python 2.x workarounds
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.
This commit is contained in:
4
INSTALL
4
INSTALL
@@ -2,7 +2,7 @@
|
|||||||
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
|
to use, copy, modify, and distribute this software is
|
||||||
granted under terms provided in the LICENSE file distributed
|
granted under terms provided in the LICENSE file distributed
|
||||||
with this software.
|
with this software.
|
||||||
@@ -16,7 +16,7 @@ modern UNIX derivatives come with one already). If you need to get
|
|||||||
Python, it can be obtained from http://www.python.org/ but chances are
|
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
|
your operating system at least provides some sort of native package for
|
||||||
it, which you should probably install in whatever means is recommended
|
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
|
3.x Python versions, attempting to maintain forward/backward
|
||||||
compatability with the interpreter, so bug reports or patches to ensure
|
compatability with the interpreter, so bug reports or patches to ensure
|
||||||
this continues to be the case are most welcome.
|
this continues to be the case are most welcome.
|
||||||
|
|||||||
6
NEWS
6
NEWS
@@ -2,7 +2,7 @@
|
|||||||
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
|
to use, copy, modify, and distribute this software is
|
||||||
granted under terms provided in the LICENSE file distributed
|
granted under terms provided in the LICENSE file distributed
|
||||||
with this software.
|
with this software.
|
||||||
@@ -12,8 +12,8 @@
|
|||||||
2.4 Release
|
2.4 Release
|
||||||
-----------
|
-----------
|
||||||
This is planned to be the last release supporting Python 2; starting
|
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
|
with the 2.5.0 release, this software will only be usable with Python
|
||||||
3.5 and later.
|
3.x.
|
||||||
|
|
||||||
Refreshed correlation sets and data sources including updating to 2019
|
Refreshed correlation sets and data sources including updating to 2019
|
||||||
US Census locations and incorporating public domain airport information
|
US Census locations and incorporating public domain airport information
|
||||||
|
|||||||
137
weather.py
137
weather.py
@@ -11,18 +11,6 @@ weather_version = "2.4.4"
|
|||||||
radian_to_km = 6372.795484
|
radian_to_km = 6372.795484
|
||||||
radian_to_mi = 3959.871528
|
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:
|
class Selections:
|
||||||
"""An object to contain selection data."""
|
"""An object to contain selection data."""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -204,15 +192,7 @@ def get_uri(
|
|||||||
cachedir="."
|
cachedir="."
|
||||||
):
|
):
|
||||||
"""Return a string containing the results of a URI GET."""
|
"""Return a string containing the results of a URI GET."""
|
||||||
if pyversion("3"):
|
import os, time, urllib, urllib.error, urllib.request
|
||||||
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
|
|
||||||
if cache_data:
|
if cache_data:
|
||||||
dcachedir = os.path.join( os.path.expanduser(cachedir), "datacache" )
|
dcachedir = os.path.join( os.path.expanduser(cachedir), "datacache" )
|
||||||
if not os.path.exists(dcachedir):
|
if not os.path.exists(dcachedir):
|
||||||
@@ -230,8 +210,8 @@ def get_uri(
|
|||||||
dcache_fd.close()
|
dcache_fd.close()
|
||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
data = urlopen(uri).read().decode("utf-8")
|
data = urllib.request.urlopen(uri).read().decode("utf-8")
|
||||||
except URLError:
|
except urllib.error.URLError:
|
||||||
if ignore_fail: return ""
|
if ignore_fail: return ""
|
||||||
import os, sys
|
import os, sys
|
||||||
sys.stderr.write("%s error: failed to retrieve\n %s\n\n" % (
|
sys.stderr.write("%s error: failed to retrieve\n %s\n\n" % (
|
||||||
@@ -273,7 +253,7 @@ def get_metar(
|
|||||||
cacheage=cacheage,
|
cacheage=cacheage,
|
||||||
cachedir=cachedir
|
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
|
if verbose: return metar
|
||||||
else:
|
else:
|
||||||
import re
|
import re
|
||||||
@@ -333,7 +313,7 @@ def get_alert(
|
|||||||
cacheage=cacheage,
|
cacheage=cacheage,
|
||||||
cachedir=cachedir
|
cachedir=cachedir
|
||||||
).strip()
|
).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 alert:
|
||||||
if verbose: return alert
|
if verbose: return alert
|
||||||
else:
|
else:
|
||||||
@@ -612,10 +592,8 @@ def get_options(config):
|
|||||||
|
|
||||||
def get_config():
|
def get_config():
|
||||||
"""Parse the aliases and configuration."""
|
"""Parse the aliases and configuration."""
|
||||||
if pyversion("3"): import configparser
|
import configparser, os
|
||||||
else: import ConfigParser as configparser
|
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
import os
|
|
||||||
rcfiles = [
|
rcfiles = [
|
||||||
"/etc/weatherrc",
|
"/etc/weatherrc",
|
||||||
"/etc/weather/weatherrc",
|
"/etc/weather/weatherrc",
|
||||||
@@ -625,10 +603,7 @@ def get_config():
|
|||||||
]
|
]
|
||||||
for rcfile in rcfiles:
|
for rcfile in rcfiles:
|
||||||
if os.access(rcfile, os.R_OK):
|
if os.access(rcfile, os.R_OK):
|
||||||
if pyversion("3"):
|
config.read(rcfile, encoding="utf-8")
|
||||||
config.read(rcfile, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
config.read(rcfile)
|
|
||||||
for section in config.sections():
|
for section in config.sections():
|
||||||
if section != section.lower():
|
if section != section.lower():
|
||||||
if config.has_section(section.lower()):
|
if config.has_section(section.lower()):
|
||||||
@@ -640,9 +615,7 @@ def get_config():
|
|||||||
|
|
||||||
def integrate_search_cache(config, cachedir, setpath):
|
def integrate_search_cache(config, cachedir, setpath):
|
||||||
"""Add cached search results into the configuration."""
|
"""Add cached search results into the configuration."""
|
||||||
if pyversion("3"): import configparser
|
import configparser, os, time
|
||||||
else: import ConfigParser as configparser
|
|
||||||
import os, time
|
|
||||||
scache_fn = os.path.join( os.path.expanduser(cachedir), "searches" )
|
scache_fn = os.path.join( os.path.expanduser(cachedir), "searches" )
|
||||||
if not os.access(scache_fn, os.R_OK): return config
|
if not os.access(scache_fn, os.R_OK): return config
|
||||||
scache_fd = open(scache_fn)
|
scache_fd = open(scache_fn)
|
||||||
@@ -664,10 +637,7 @@ def integrate_search_cache(config, cachedir, setpath):
|
|||||||
pass
|
pass
|
||||||
return config
|
return config
|
||||||
scache = configparser.ConfigParser()
|
scache = configparser.ConfigParser()
|
||||||
if pyversion("3"):
|
scache.read(scache_fn, encoding="utf-8")
|
||||||
scache.read(scache_fn, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
scache.read(scache_fn)
|
|
||||||
for section in scache.sections():
|
for section in scache.sections():
|
||||||
if not config.has_section(section):
|
if not config.has_section(section):
|
||||||
config.add_section(section)
|
config.add_section(section)
|
||||||
@@ -723,9 +693,7 @@ def guess(
|
|||||||
quiet=False
|
quiet=False
|
||||||
):
|
):
|
||||||
"""Find URIs using airport, gecos, placename, station, ZCTA/ZIP, zone."""
|
"""Find URIs using airport, gecos, placename, station, ZCTA/ZIP, zone."""
|
||||||
import codecs, datetime, time, os, re, sys
|
import codecs, configparser, datetime, time, os, re, sys
|
||||||
if pyversion("3"): import configparser
|
|
||||||
else: import ConfigParser as configparser
|
|
||||||
datafiles = data_index(path)
|
datafiles = data_index(path)
|
||||||
if re.match("[A-Za-z]{3}$", expression): searchtype = "airport"
|
if re.match("[A-Za-z]{3}$", expression): searchtype = "airport"
|
||||||
elif re.match("[A-Za-z0-9]{4}$", expression): searchtype = "station"
|
elif re.match("[A-Za-z0-9]{4}$", expression): searchtype = "station"
|
||||||
@@ -760,15 +728,9 @@ def guess(
|
|||||||
datafile = datafiles[dataname][0]
|
datafile = datafiles[dataname][0]
|
||||||
if datafile.endswith(".gz"):
|
if datafile.endswith(".gz"):
|
||||||
import gzip
|
import gzip
|
||||||
if pyversion("3"):
|
stations.read_string( gzip.open(datafile).read().decode("utf-8") )
|
||||||
stations.read_string(
|
|
||||||
gzip.open(datafile).read().decode("utf-8") )
|
|
||||||
else: stations.read_file( gzip.open(datafile) )
|
|
||||||
else:
|
else:
|
||||||
if pyversion("3"):
|
stations.read(datafile, encoding="utf-8")
|
||||||
stations.read(datafile, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
stations.read(datafile)
|
|
||||||
else:
|
else:
|
||||||
message = "%s error: can't find \"%s\" data file\n" % (
|
message = "%s error: can't find \"%s\" data file\n" % (
|
||||||
os.path.basename( sys.argv[0] ),
|
os.path.basename( sys.argv[0] ),
|
||||||
@@ -782,14 +744,9 @@ def guess(
|
|||||||
datafile = datafiles[dataname][0]
|
datafile = datafiles[dataname][0]
|
||||||
if datafile.endswith(".gz"):
|
if datafile.endswith(".gz"):
|
||||||
import gzip
|
import gzip
|
||||||
if pyversion("3"):
|
zones.read_string( gzip.open(datafile).read().decode("utf-8") )
|
||||||
zones.read_string( gzip.open(datafile).read().decode("utf-8") )
|
|
||||||
else: zones.read_file( gzip.open(datafile) )
|
|
||||||
else:
|
else:
|
||||||
if pyversion("3"):
|
zones.read(datafile, encoding="utf-8")
|
||||||
zones.read(datafile, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
zones.read(datafile)
|
|
||||||
else:
|
else:
|
||||||
message = "%s error: can't find \"%s\" data file\n" % (
|
message = "%s error: can't find \"%s\" data file\n" % (
|
||||||
os.path.basename( sys.argv[0] ),
|
os.path.basename( sys.argv[0] ),
|
||||||
@@ -811,15 +768,10 @@ def guess(
|
|||||||
datafile = datafiles[dataname][0]
|
datafile = datafiles[dataname][0]
|
||||||
if datafile.endswith(".gz"):
|
if datafile.endswith(".gz"):
|
||||||
import gzip
|
import gzip
|
||||||
if pyversion("3"):
|
airports.read_string(
|
||||||
airports.read_string(
|
gzip.open(datafile).read().decode("utf-8") )
|
||||||
gzip.open(datafile).read().decode("utf-8") )
|
|
||||||
else: airports.read_file( gzip.open(datafile) )
|
|
||||||
else:
|
else:
|
||||||
if pyversion("3"):
|
airports.read(datafile, encoding="utf-8")
|
||||||
airports.read(datafile, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
airports.read(datafile)
|
|
||||||
else:
|
else:
|
||||||
message = "%s error: can't find \"%s\" data file\n" % (
|
message = "%s error: can't find \"%s\" data file\n" % (
|
||||||
os.path.basename( sys.argv[0] ),
|
os.path.basename( sys.argv[0] ),
|
||||||
@@ -903,15 +855,9 @@ def guess(
|
|||||||
datafile = datafiles[dataname][0]
|
datafile = datafiles[dataname][0]
|
||||||
if datafile.endswith(".gz"):
|
if datafile.endswith(".gz"):
|
||||||
import gzip
|
import gzip
|
||||||
if pyversion("3"):
|
zctas.read_string( gzip.open(datafile).read().decode("utf-8") )
|
||||||
zctas.read_string(
|
|
||||||
gzip.open(datafile).read().decode("utf-8") )
|
|
||||||
else: zctas.read_file( gzip.open(datafile) )
|
|
||||||
else:
|
else:
|
||||||
if pyversion("3"):
|
zctas.read(datafile, encoding="utf-8")
|
||||||
zctas.read(datafile, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
zctas.read(datafile)
|
|
||||||
else:
|
else:
|
||||||
message = "%s error: can't find \"%s\" data file\n" % (
|
message = "%s error: can't find \"%s\" data file\n" % (
|
||||||
os.path.basename( sys.argv[0] ),
|
os.path.basename( sys.argv[0] ),
|
||||||
@@ -964,15 +910,9 @@ def guess(
|
|||||||
datafile = datafiles[dataname][0]
|
datafile = datafiles[dataname][0]
|
||||||
if datafile.endswith(".gz"):
|
if datafile.endswith(".gz"):
|
||||||
import gzip
|
import gzip
|
||||||
if pyversion("3"):
|
places.read_string( gzip.open(datafile).read().decode("utf-8") )
|
||||||
places.read_string(
|
|
||||||
gzip.open(datafile).read().decode("utf-8") )
|
|
||||||
else: places.read_file( gzip.open(datafile) )
|
|
||||||
else:
|
else:
|
||||||
if pyversion("3"):
|
places.read(datafile, encoding="utf-8")
|
||||||
places.read(datafile, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
places.read(datafile)
|
|
||||||
else:
|
else:
|
||||||
message = "%s error: can't find \"%s\" data file\n" % (
|
message = "%s error: can't find \"%s\" data file\n" % (
|
||||||
os.path.basename( sys.argv[0] ),
|
os.path.basename( sys.argv[0] ),
|
||||||
@@ -1189,10 +1129,7 @@ def guess(
|
|||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
scache_existing = configparser.ConfigParser()
|
scache_existing = configparser.ConfigParser()
|
||||||
if pyversion("3"):
|
scache_existing.read(scache_fn, encoding="utf-8")
|
||||||
scache_existing.read(scache_fn, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
scache_existing.read(scache_fn)
|
|
||||||
if not scache_existing.has_section(search[0]):
|
if not scache_existing.has_section(search[0]):
|
||||||
scache_fd = codecs.open(scache_fn, "a", "utf-8")
|
scache_fd = codecs.open(scache_fn, "a", "utf-8")
|
||||||
scache_fd.writelines(search_cache)
|
scache_fd.writelines(search_cache)
|
||||||
@@ -1243,9 +1180,8 @@ def gecos(formatted):
|
|||||||
return tuple(coordinates)
|
return tuple(coordinates)
|
||||||
|
|
||||||
def correlate():
|
def correlate():
|
||||||
import codecs, csv, datetime, hashlib, os, re, sys, time, zipfile, zoneinfo
|
import codecs, configparser, csv, datetime, hashlib, os, re, sys, time
|
||||||
if pyversion("3"): import configparser
|
import zipfile, zoneinfo
|
||||||
else: import ConfigParser as configparser
|
|
||||||
for filename in os.listdir("."):
|
for filename in os.listdir("."):
|
||||||
if re.match("[0-9]{4}_Gaz_counties_national.zip$", filename):
|
if re.match("[0-9]{4}_Gaz_counties_national.zip$", filename):
|
||||||
gcounties_an = filename
|
gcounties_an = filename
|
||||||
@@ -2077,30 +2013,15 @@ def correlate():
|
|||||||
sys.stdout.write(message)
|
sys.stdout.write(message)
|
||||||
sys.stdout.flush()
|
sys.stdout.flush()
|
||||||
airports = configparser.ConfigParser()
|
airports = configparser.ConfigParser()
|
||||||
if pyversion("3"):
|
airports.read(airports_fn, encoding="utf-8")
|
||||||
airports.read(airports_fn, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
airports.read(airports_fn)
|
|
||||||
places = configparser.ConfigParser()
|
places = configparser.ConfigParser()
|
||||||
if pyversion("3"):
|
places.read(places_fn, encoding="utf-8")
|
||||||
places.read(places_fn, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
places.read(places_fn)
|
|
||||||
stations = configparser.ConfigParser()
|
stations = configparser.ConfigParser()
|
||||||
if pyversion("3"):
|
stations.read(stations_fn, encoding="utf-8")
|
||||||
stations.read(stations_fn, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
stations.read(stations_fn)
|
|
||||||
zctas = configparser.ConfigParser()
|
zctas = configparser.ConfigParser()
|
||||||
if pyversion("3"):
|
zctas.read(zctas_fn, encoding="utf-8")
|
||||||
zctas.read(zctas_fn, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
zctas.read(zctas_fn)
|
|
||||||
zones = configparser.ConfigParser()
|
zones = configparser.ConfigParser()
|
||||||
if pyversion("3"):
|
zones.read(zones_fn, encoding="utf-8")
|
||||||
zones.read(zones_fn, encoding="utf-8")
|
|
||||||
else:
|
|
||||||
zones.read(zones_fn)
|
|
||||||
qalog = []
|
qalog = []
|
||||||
places_nocentroid = 0
|
places_nocentroid = 0
|
||||||
places_nodescription = 0
|
places_nodescription = 0
|
||||||
|
|||||||
Reference in New Issue
Block a user