You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ponymail.apache.org by se...@apache.org on 2021/12/14 12:35:54 UTC

[incubator-ponymail-foal] 01/02: Add type hints

This is an automated email from the ASF dual-hosted git repository.

sebb pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-ponymail-foal.git

commit 5b23fd3bd2445ac944f6f65125ba7396e38fbc42
Author: Sebb <se...@apache.org>
AuthorDate: Tue Dec 14 12:24:24 2021 +0000

    Add type hints
---
 server/endpoints/gravatar.py   |  4 ++--
 server/endpoints/mbox.py       |  2 +-
 server/plugins/aaa.py          |  6 +++---
 server/plugins/auditlog.py     |  2 +-
 server/plugins/background.py   |  2 +-
 server/plugins/database.py     | 14 +++++++-------
 server/plugins/messages.py     | 26 +++++++++++++++-----------
 server/plugins/oauthGeneric.py |  7 ++++---
 server/plugins/oauthGithub.py  |  2 +-
 server/plugins/oauthGoogle.py  |  5 +++--
 server/plugins/session.py      |  2 +-
 11 files changed, 39 insertions(+), 33 deletions(-)

diff --git a/server/endpoints/gravatar.py b/server/endpoints/gravatar.py
index c0b1cf9..e5a4b97 100644
--- a/server/endpoints/gravatar.py
+++ b/server/endpoints/gravatar.py
@@ -29,7 +29,7 @@ gravatars = []
 gravatar_cache = {}
 
 
-async def fetch_gravatar(gid):
+async def fetch_gravatar(gid: str) -> None:
     headers = {"User-Agent": "Pony Mail Agent/0.1"}
     fetch_url = GRAVATAR_URL % gid
     # Fetch image and store internally
@@ -42,7 +42,7 @@ async def fetch_gravatar(gid):
         pass
 
 
-async def gravatar_exists_in_db(session, gid):
+async def gravatar_exists_in_db(session: plugins.session.SessionObject, gid: str) -> bool:
     res = await session.database.search(
         index=session.database.dbs.db_mbox,
         size=1,
diff --git a/server/endpoints/mbox.py b/server/endpoints/mbox.py
index 624a889..27dd2dc 100644
--- a/server/endpoints/mbox.py
+++ b/server/endpoints/mbox.py
@@ -33,7 +33,7 @@ import email.utils as eutils
 import datetime
 
 
-async def convert_source(session: plugins.session.SessionObject, email: dict):
+async def convert_source(session: plugins.session.SessionObject, email: dict) -> str:
     source = await plugins.messages.get_source(session, permalink=email.get("dbid", email["mid"]))
     if source:
         source_as_text = source["_source"]["source"]
diff --git a/server/plugins/aaa.py b/server/plugins/aaa.py
index 789901c..a3f920a 100644
--- a/server/plugins/aaa.py
+++ b/server/plugins/aaa.py
@@ -23,15 +23,15 @@ It handles rights management for lists.
 import plugins.session
 
 
-def can_access_email(session: plugins.session.SessionObject, email) -> bool:
+def can_access_email(session: plugins.session.SessionObject, email: dict) -> bool:
     """Determine if an email can be accessed by the current user"""
     # If public email, it can always be accessed
     if not email.get("private", True): # Assume private if the flag is missing
         return True
     # If user can access the list, they can read the email
-    return can_access_list(session, email.get("list_raw"))
+    return can_access_list(session, email.get("list_raw", None))
 
-def can_access_list(session: plugins.session.SessionObject, _listid) -> bool:
+def can_access_list(session: plugins.session.SessionObject, _listid: str) -> bool:
     """Determine if a list can be accessed by the current user"""
     # If logged in via a known oauth, we assume access for now...TO BE CHANGED
     if session.credentials and session.credentials.authoritative:
diff --git a/server/plugins/auditlog.py b/server/plugins/auditlog.py
index 955ba82..43d69db 100644
--- a/server/plugins/auditlog.py
+++ b/server/plugins/auditlog.py
@@ -68,7 +68,7 @@ async def view(
             yield AuditLogEntry(doc["_source"])
 
 
-async def add_entry(session: plugins.session.SessionObject, action: str, target: str, lid: str, log: str):
+async def add_entry(session: plugins.session.SessionObject, action: str, target: str, lid: str, log: str) -> None:
     """ Adds an entry to the audit log"""
 
     # Default log entries based on type
diff --git a/server/plugins/background.py b/server/plugins/background.py
index 72c626d..d61f872 100644
--- a/server/plugins/background.py
+++ b/server/plugins/background.py
@@ -208,7 +208,7 @@ async def get_public_activity(database: plugins.configuration.DBConfig) -> dict:
     return activity
 
 
-async def run_tasks(server: plugins.server.BaseServer):
+async def run_tasks(server: plugins.server.BaseServer) -> None:
     """
         Runs long-lived background data gathering tasks such as gathering statistics about email activity and the list
         of archived mailing lists, for populating the pony mail main index.
diff --git a/server/plugins/database.py b/server/plugins/database.py
index eccb18b..ffe2d3c 100644
--- a/server/plugins/database.py
+++ b/server/plugins/database.py
@@ -113,13 +113,13 @@ class Database:
         return res
 
     async def scan(self,
-                   query=None,
-                   scroll="5m",
-                   preserve_order=False,
-                   size=1000,
-                   request_timeout=60,
-                   clear_scroll=True,
-                   scroll_kwargs=None,
+                   query: dict = None,
+                   scroll: str = "5m",
+                   preserve_order: bool = False,
+                   size: int = 1000,
+                   request_timeout: int = 60,
+                   clear_scroll: bool = True,
+                   scroll_kwargs: dict = None,
                    **kwargs) -> typing.AsyncIterator[typing.List[dict]]:
         
         scroll_kwargs = scroll_kwargs or {}
diff --git a/server/plugins/messages.py b/server/plugins/messages.py
index c7da36d..db99c5b 100644
--- a/server/plugins/messages.py
+++ b/server/plugins/messages.py
@@ -75,7 +75,7 @@ USED_UI_FIELDS = [
 MUST_HAVE = [ 'private', 'deleted', 'list_raw']
 
 
-def trim_email(doc, external=False):
+def trim_email(doc: dict, external: bool = False) -> None:
     """Trims away document fields not used by the UI"""
     for header in list(doc.keys()):
         # Remove meta data fields which start with an underscore
@@ -89,7 +89,7 @@ def trim_email(doc, external=False):
 
 # Format an email address given a name (optional) and an email address.
 # Same as email.utils.formataddr except no Unicode escaping happens.
-def make_address(name, email):
+def make_address(name: str, email: str) -> str:
     if name and email:
         quotes = ''
         if NEEDS_QUOTES.search(name):
@@ -103,7 +103,7 @@ def make_address(name, email):
 
 
 # anonymise a string of email entries
-def anonymize_mail_address(emailstring):
+def anonymize_mail_address(emailstring: str) -> str:
     out = []
     if not emailstring:
         return ""
@@ -116,7 +116,7 @@ def anonymize_mail_address(emailstring):
     # rejoin one per line
     return ",\n ".join(out)
 
-def anonymize(doc):
+def anonymize(doc: dict) -> dict:
     """ Anonymizes an email, hiding author email addresses."""
     # ES direct hit?
     ptr: typing.Dict[str, str] = doc
@@ -161,7 +161,11 @@ async def find_parent(session, doc: typing.Dict[str, str]):
     return doc
 
 
-async def fetch_children(session, pdoc, counter=0, pdocs=None, short=False):
+async def fetch_children(session: plugins.session.SessionObject,
+        pdoc: dict,
+        counter: int = 0,
+        pdocs: dict = None,
+        short: bool = False) -> typing.Tuple[list,list,dict]:
     """
     Fetches all child messages of a parent email
     """
@@ -169,8 +173,8 @@ async def fetch_children(session, pdoc, counter=0, pdocs=None, short=False):
         pdocs = {}
     counter = counter + 1
     if counter > 250:
-        return []
-    docs = await get_email_irt(session, pdoc["message-id"])
+        return [], [], {}
+    docs: typing.List[dict] = await get_email_irt(session, pdoc["message-id"])
 
     thread = []
     emails = []
@@ -211,8 +215,8 @@ async def fetch_children(session, pdoc, counter=0, pdocs=None, short=False):
 async def get_email(
     session: plugins.session.SessionObject,
     permalink: str = None,
-    messageid=None,
-    source=False,
+    messageid: str = None,
+    source: bool = False,
 ) -> typing.Optional[dict]:
     """
     Returns a matching mbox or source document or None
@@ -268,8 +272,8 @@ async def get_email(
 
 async def get_email_irt(
     session: plugins.session.SessionObject,
-    irt,
-    source=False,
+    irt: str,
+    source: bool = False,
 ) -> typing.List[dict]:
     """
     Returns a list of mbox or source document(s) that are related. May be empty.
diff --git a/server/plugins/oauthGeneric.py b/server/plugins/oauthGeneric.py
index 77c2d0f..20edd38 100644
--- a/server/plugins/oauthGeneric.py
+++ b/server/plugins/oauthGeneric.py
@@ -19,11 +19,11 @@
 
 # Generic OAuth plugin
 import re
+import typing
 import aiohttp.client
 
 
-async def process(formdata, _session, _server):
-    js = None
+async def process(formdata: dict, _session, _server) -> typing.Optional[dict]:
     # Extract domain, allowing for :port
     # Does not handle user/password prefix etc
     m = re.match(r"https?://([^/:]+)(?::\d+)?/", formdata["oauth_token"])
@@ -35,4 +35,5 @@ async def process(formdata, _session, _server):
             js = await rv.json()
             js["oauth_domain"] = oauth_domain
             js["authoritative"] = True
-    return js
+        return js
+    return None
\ No newline at end of file
diff --git a/server/plugins/oauthGithub.py b/server/plugins/oauthGithub.py
index 07d6f6a..55ae1e9 100644
--- a/server/plugins/oauthGithub.py
+++ b/server/plugins/oauthGithub.py
@@ -32,7 +32,7 @@ import plugins.server
 import typing
 
 
-async def process(formdata, _session, server: plugins.server.BaseServer) -> typing.Optional[dict]:
+async def process(formdata: dict, _session, server: plugins.server.BaseServer) -> typing.Optional[dict]:
     formdata["client_id"] = server.config.oauth.github_client_id
     formdata["client_secret"] = server.config.oauth.github_client_secret
     headers = {"Accept": "application/json"}
diff --git a/server/plugins/oauthGoogle.py b/server/plugins/oauthGoogle.py
index 99edd8c..24a5d5f 100644
--- a/server/plugins/oauthGoogle.py
+++ b/server/plugins/oauthGoogle.py
@@ -29,11 +29,12 @@ import google.auth.transport.urllib3 # type: ignore
 import google.oauth2.id_token # type: ignore
 import plugins.server
 import plugins.session
+import typing
 import urllib3
 
 
-async def process(formdata, _session, server: plugins.server.BaseServer):
-    js = None
+async def process(formdata: dict, _session, server: plugins.server.BaseServer) -> typing.Optional[dict]:
+    js: typing.Optional[dict] = None
     request = google.auth.transport.urllib3.Request(urllib3.PoolManager())
     # This is a synchronous process, so we offload it to an async runner in order to let the main loop continue.
     id_info = await server.runners.run(
diff --git a/server/plugins/session.py b/server/plugins/session.py
index ed44730..ccb8ce7 100644
--- a/server/plugins/session.py
+++ b/server/plugins/session.py
@@ -184,7 +184,7 @@ async def get_session(
     return session
 
 
-async def set_session(server: plugins.server.BaseServer, cid, **credentials):
+async def set_session(server: plugins.server.BaseServer, cid: str, **credentials):
     """Create a new user session in the database"""
     session_id = str(uuid.uuid4())
     cookie: http.cookies.SimpleCookie = http.cookies.SimpleCookie()