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()