From 967c2223ba5df3ca3c9187fb3fb5734c73922d20 Mon Sep 17 00:00:00 2001
From: James Powell <james@dutc.io>
Date: Mon, 4 Jul 2022 16:13:55 -0400
Subject: [PATCH] small fixes; use context managers; avoid explicit
 `StopIteration` in generator

---
 pattern/metrics.py            |  8 ++++----
 pattern/server/__init__.py    | 27 +++++++++++++--------------
 pattern/web/__init__.py       |  2 +-
 pattern/web/cache/__init__.py | 14 ++++++--------
 4 files changed, 24 insertions(+), 27 deletions(-)

diff --git a/pattern/metrics.py b/pattern/metrics.py
index d3abca0a..d8b20a3c 100644
--- a/pattern/metrics.py
+++ b/pattern/metrics.py
@@ -102,10 +102,10 @@ def run():
     id = function.__name__ + "()"
     profile.run("__profile_run__()", id)
     p = pstats.Stats(id)
-    p.stream = open(id, "w")
-    p.sort_stats("cumulative").print_stats(30)
-    p.stream.close()
-    s = open(id).read()
+    with open(id, "w") as p.stream:
+        p.sort_stats("cumulative").print_stats(30)
+    with open(id) as f:
+        s = f.read()
     os.remove(id)
     return s
 
diff --git a/pattern/server/__init__.py b/pattern/server/__init__.py
index d310556b..7c629163 100644
--- a/pattern/server/__init__.py
+++ b/pattern/server/__init__.py
@@ -1361,24 +1361,23 @@ def certificate(domain=LOCALHOST, country=None, state=None, city=None, company=N
     # > openssl genrsa 2048 -out ssl.key
     s = subprocess.PIPE
     p = ("openssl", "genrsa", "%s" % kwargs.get("encryption", 2048))
-    p = subprocess.Popen(p, stdin=s, stdout=s, stderr=s)
-    k = kwargs.get("key") or p.communicate()[0]
-    f = tempfile.NamedTemporaryFile(delete=False)
-    f.write(k)
-    f.close()
+    with subprocess.Popen(p, stdin=s, stdout=s, stderr=s) as p:
+        k = kwargs.get("key") or p.communicate()[0]
+        with tempfile.NamedTemporaryFile(delete=False) as f:
+            f.write(k)
     # Generate certificate.
     # > openssl req -new -x509 -days 365 -key ssl.key -out ssl.crt
     p = ("openssl", "req", "-new", "-key", f.name)
     p = p + ("-x509", "-days", "365") if signed else p
-    p = subprocess.Popen(p, stdin=s, stdout=s, stderr=s)
-    x = p.communicate("%s\n%s\n%s\n%s\n.\n%s\n%s\n\n\n" % (
-          country or ".",       # BE
-            state or ".",       # Antwerp
-             city or ".",       # Antwerp
-          company or ".",       # CLiPS
-           domain or LOCALHOST, # Tom De Smedt
-          contact or "."        # tom@organisms.be
-    ))[0]
+    with subprocess.Popen(p, stdin=s, stdout=s, stderr=s) as p:
+        x = p.communicate("%s\n%s\n%s\n%s\n.\n%s\n%s\n\n\n" % (
+              country or ".",       # BE
+                state or ".",       # Antwerp
+                 city or ".",       # Antwerp
+              company or ".",       # CLiPS
+               domain or LOCALHOST, # Tom De Smedt
+              contact or "."        # tom@organisms.be
+        ))[0]
     os.unlink(f.name)
     return (k, x)
 
diff --git a/pattern/web/__init__.py b/pattern/web/__init__.py
index c76cea88..95187051 100644
--- a/pattern/web/__init__.py
+++ b/pattern/web/__init__.py
@@ -221,7 +221,7 @@ def elapsed(self):
 
     @property
     def done(self):
-        return not self._thread.isAlive()
+        return not self._thread.is_alive()
 
     @property
     def value(self):
diff --git a/pattern/web/cache/__init__.py b/pattern/web/cache/__init__.py
index 30daabc9..6ac8c05a 100644
--- a/pattern/web/cache/__init__.py
+++ b/pattern/web/cache/__init__.py
@@ -87,11 +87,10 @@ def __getitem__(self, k):
         return self.get(k)
 
     def __setitem__(self, k, v):
-        f = open(self._hash(k), "w", encoding = "utf-8")
-        f.write(BOM_UTF8)
-        v = decode_utf8(v)
-        f.write(v)
-        f.close()
+        with open(self._hash(k), "w", encoding = "utf-8") as f:
+            f.write(BOM_UTF8)
+            v = decode_utf8(v)
+            f.write(v)
 
     def __delitem__(self, k):
         try:
@@ -104,9 +103,8 @@ def get(self, k, unicode=True):
             With unicode=True, returns a Unicode string.
         """
         if k in self:
-            f = open(self._hash(k), "rb")
-            v = f.read().lstrip(BOM_UTF8.encode("utf-8"))
-            f.close()
+            with open(self._hash(k), "rb") as f:
+                v = f.read().lstrip(BOM_UTF8.encode("utf-8"))
             if unicode is True:
                 return decode_utf8(v)
             else:
