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:
Jeremy Stanley
2024-05-11 02:22:04 +00:00
parent eb5bfa4c58
commit cc7cb0a613
3 changed files with 34 additions and 113 deletions

View File

@@ -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
View File

@@ -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

View File

@@ -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