Bubble [main]

Compatibility with older versions of Python

=> 0d01131a492261983ad9ed92b3f28284b998febe

diff --git a/50_bubble.py b/50_bubble.py
index bc10f79..02b882e 100644
--- a/50_bubble.py
+++ b/50_bubble.py
@@ -51,7 +51,7 @@ class Bubble:
             return error.code, str(error)
         except Exception as fatal:
             import traceback
-            traceback.print_exception(fatal)
+            traceback.print_tb(fatal.__traceback__)
             return 42, 'Bubble Error: ' + str(fatal)[:500].replace('\n', ' ')
         finally:
             db.close()
@@ -296,7 +296,7 @@ Bubble is open source:
 
                     except Exception as x:
                         import traceback
-                        traceback.print_exception(x)
+                        traceback.print_tb(x.__traceback__)
                         return 10, 'That name is already taken. ' + session.NAME_HINT
 
                 if req.path == self.path + 'add-cert':
diff --git a/model.py b/model.py
index 8bcaf60..c2d3457 100644
--- a/model.py
+++ b/model.py
@@ -6,7 +6,7 @@ import re
 import shutil
 import time
 from typing import Union
-from utils import ago_text, clean_title, parse_at_names, GeminiError
+from utils import ago_text, clean_title, parse_at_names, GeminiError, UTC
 
 
 def parse_asn1_time(asn1_bytes):
@@ -64,7 +64,7 @@ class Notification:
         self.post_issueid = post_issueid
 
     def ymd_date(self):
-        dt = datetime.datetime.fromtimestamp(self.ts, datetime.UTC)
+        dt = datetime.datetime.fromtimestamp(self.ts, UTC)
         return dt.strftime('%Y-%m-%d')
 
     def age(self):
@@ -197,7 +197,7 @@ class Commit:
         self.ts = ts
 
     def ymd_date(self):
-        dt = datetime.datetime.fromtimestamp(self.ts, datetime.UTC)
+        dt = datetime.datetime.fromtimestamp(self.ts, UTC)
         return dt.strftime('%Y-%m-%d')
 
 
@@ -240,11 +240,11 @@ class Post:
             return '(untitled issue)' if self.issueid else '(untitled post)'
 
     def ymd_date(self):
-        dt = datetime.datetime.fromtimestamp(self.ts_created, datetime.UTC)
+        dt = datetime.datetime.fromtimestamp(self.ts_created, UTC)
         return dt.strftime('%Y-%m-%d')
 
     def ymd_hm_tz(self):
-        dt = datetime.datetime.fromtimestamp(self.ts_created, datetime.UTC)
+        dt = datetime.datetime.fromtimestamp(self.ts_created, UTC)
         return dt.strftime('%Y-%m-%d %H:%M UTC')
 
     def age(self):
diff --git a/subspace.py b/subspace.py
index a0e824b..2477997 100644
--- a/subspace.py
+++ b/subspace.py
@@ -120,7 +120,7 @@ def subspace_admin_actions(session, action):
                     page += 'Repository will be fetched soon.\n'
             else:
                 n = db.count_commits(repo)
-                page += f'{n} commits in history. Repository was last fetched on {datetime.datetime.fromtimestamp(repo.ts_fetch, datetime.UTC).strftime("%Y-%m-%d at %H:%M:%S %Z")}.\n'
+                page += f'{n} commits in history. Repository was last fetched on {datetime.datetime.fromtimestamp(repo.ts_fetch, UTC).strftime("%Y-%m-%d at %H:%M:%S %Z")}.\n'
 
             page += f'\n=> {admin_link}/repo/delete/{db.get_token(user)} ❌ Delete repository\n'
 
@@ -311,7 +311,7 @@ def listed_items(items):
 
 
 def make_timestamp(ts, fmt="%Y-%m-%d at %H:%M"):
-    return datetime.datetime.fromtimestamp(ts, datetime.UTC).strftime(fmt)
+    return datetime.datetime.fromtimestamp(ts, UTC).strftime(fmt)
 
 
 class GempubArchive:
@@ -319,7 +319,7 @@ class GempubArchive:
     class Entry:
         def __init__(self, post, label, page, file=None):
             self.ts = post.ts_created
-            self.dt = datetime.datetime.fromtimestamp(self.ts, datetime.UTC)
+            self.dt = datetime.datetime.fromtimestamp(self.ts, UTC)
             self.post_id = post.id
             self.subspace_id = post.subspace
             self.label = label
@@ -670,4 +670,4 @@ def export_gempub_archive(session):
     archive.render_file_entries()
     data = archive.compress()
 
-    return 20, 'application/gpub+zip', data
\ No newline at end of file
+    return 20, 'application/gpub+zip', data
diff --git a/utils.py b/utils.py
index 909aa49..c850703 100644
--- a/utils.py
+++ b/utils.py
@@ -3,6 +3,8 @@ import re
 import time
 import urllib.parse as urlparse
 
+UTC = datetime.timezone.utc
+
 
 class GeminiError (Exception):
     def __init__(self, code, msg):
@@ -123,7 +125,7 @@ def time_delta_text(sec, date_ts, suffix='ago', now='Now',
     if hours <= 24:
         return f'{hours} hour{plural_s(hours)} {suffix}'
     days = int(sec / 3600 / 24)
-    dt = datetime.datetime.fromtimestamp(date_ts, datetime.UTC)
+    dt = datetime.datetime.fromtimestamp(date_ts, UTC)
     age = date_prefix + dt.strftime(date_fmt)
     if days < 14:
         return age + f'{date_sep}{days} day{plural_s(days)} {suffix}'
@@ -181,4 +183,4 @@ def form_link(url_label: tuple):
         return url + ' ' + label
     if len(label) == 0:
         return url
-    return ''
\ No newline at end of file
+    return ''
Proxy Information
Original URL
gemini://git.skyjake.fi/bubble/main/cdiff/0d01131a492261983ad9ed92b3f28284b998febe
Status Code
Success (20)
Meta
text/gemini; charset=utf-8
Capsule Response Time
32.515688 milliseconds
Gemini-to-HTML Time
0.82073 milliseconds

This content has been proxied by September (3851b).