Create todoist api client each time, as it's not thread safe
This commit is contained in:
parent
69c5e0d6df
commit
deb87104bb
6 changed files with 44 additions and 18 deletions
|
@ -1,12 +1,13 @@
|
||||||
import os
|
|
||||||
import tempfile
|
|
||||||
|
|
||||||
from github import Github
|
from github import Github
|
||||||
from todoist import TodoistAPI
|
from todoist import TodoistAPI
|
||||||
|
|
||||||
from actioner.settings import GITHUB_TOKEN, TODOIST_TOKEN
|
from actioner.settings import GITHUB_TOKEN, TODOIST_TOKEN
|
||||||
|
|
||||||
github = Github(GITHUB_TOKEN)
|
github = Github(GITHUB_TOKEN)
|
||||||
todoist = TodoistAPI(
|
|
||||||
TODOIST_TOKEN, cache=os.path.join(tempfile.gettempdir(), "todoist-api")
|
|
||||||
)
|
def get_todoist_client():
|
||||||
|
"""
|
||||||
|
The Todoist client isn't thread safe, so we need to create it each time we want to use it
|
||||||
|
"""
|
||||||
|
return TodoistAPI(TODOIST_TOKEN)
|
||||||
|
|
|
@ -2,9 +2,10 @@ import logging
|
||||||
|
|
||||||
from github import Issue
|
from github import Issue
|
||||||
|
|
||||||
from actioner.clients import github, todoist
|
from actioner.clients import get_todoist_client, github
|
||||||
from actioner.utils import get_todoist_project_from_repo
|
from actioner.utils import get_todoist_project_from_repo
|
||||||
from actioner.utils.github import get_existing_task, get_issue_link
|
from actioner.utils.github import get_existing_task, get_issue_link
|
||||||
|
from actioner.utils.todoist import is_task_completed
|
||||||
|
|
||||||
REPOS = ["srobo/tasks", "srobo/core-team-minutes"]
|
REPOS = ["srobo/tasks", "srobo/core-team-minutes"]
|
||||||
|
|
||||||
|
@ -23,6 +24,7 @@ def issue_to_task_name(issue: Issue) -> str:
|
||||||
|
|
||||||
|
|
||||||
def todoist_assigned_issues():
|
def todoist_assigned_issues():
|
||||||
|
todoist = get_todoist_client()
|
||||||
me = github.get_user()
|
me = github.get_user()
|
||||||
todoist.projects.sync()
|
todoist.projects.sync()
|
||||||
todoist.items.sync()
|
todoist.items.sync()
|
||||||
|
@ -46,7 +48,7 @@ def todoist_assigned_issues():
|
||||||
elif (
|
elif (
|
||||||
issue.state == "closed"
|
issue.state == "closed"
|
||||||
and existing_task_id is not None
|
and existing_task_id is not None
|
||||||
and not todoist.items.get_by_id(existing_task_id)["checked"]
|
and not is_task_completed(todoist.items.get_by_id(existing_task_id))
|
||||||
):
|
):
|
||||||
logger.info("Completing task for '{}'".format(issue.title))
|
logger.info("Completing task for '{}'".format(issue.title))
|
||||||
todoist.items.complete([existing_task_id])
|
todoist.items.complete([existing_task_id])
|
||||||
|
@ -60,7 +62,7 @@ def todoist_assigned_issues():
|
||||||
)["id"]
|
)["id"]
|
||||||
existing_task = todoist.items.get_by_id(existing_task_id)
|
existing_task = todoist.items.get_by_id(existing_task_id)
|
||||||
|
|
||||||
if existing_task["checked"]:
|
if is_task_completed(existing_task):
|
||||||
logger.info("Re-opening task '{}'".format(issue.title))
|
logger.info("Re-opening task '{}'".format(issue.title))
|
||||||
todoist.items.uncomplete([existing_task_id])
|
todoist.items.uncomplete([existing_task_id])
|
||||||
|
|
||||||
|
|
|
@ -2,9 +2,10 @@ import logging
|
||||||
|
|
||||||
from github import PullRequest
|
from github import PullRequest
|
||||||
|
|
||||||
from actioner.clients import github, todoist
|
from actioner.clients import get_todoist_client, github
|
||||||
from actioner.utils import get_todoist_project_from_repo
|
from actioner.utils import get_todoist_project_from_repo
|
||||||
from actioner.utils.github import get_existing_task, get_issue_link
|
from actioner.utils.github import get_existing_task, get_issue_link
|
||||||
|
from actioner.utils.todoist import is_task_completed
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@ -23,6 +24,7 @@ def get_my_review(me, pr: PullRequest):
|
||||||
|
|
||||||
|
|
||||||
def todoist_repo_prs():
|
def todoist_repo_prs():
|
||||||
|
todoist = get_todoist_client()
|
||||||
me = github.get_user()
|
me = github.get_user()
|
||||||
todoist.projects.sync()
|
todoist.projects.sync()
|
||||||
todoist.items.sync()
|
todoist.items.sync()
|
||||||
|
@ -39,7 +41,12 @@ def todoist_repo_prs():
|
||||||
|
|
||||||
if pr.state == "closed" and existing_task_id:
|
if pr.state == "closed" and existing_task_id:
|
||||||
my_review = get_my_review(me, pr)
|
my_review = get_my_review(me, pr)
|
||||||
if pr.merged and my_review and my_review.state == "APPROVED":
|
if (
|
||||||
|
pr.merged
|
||||||
|
and my_review
|
||||||
|
and my_review.state == "APPROVED"
|
||||||
|
and not is_task_completed(existing_task_id)
|
||||||
|
):
|
||||||
logger.info("Completing task to review '{}'".format(pr.title))
|
logger.info("Completing task to review '{}'".format(pr.title))
|
||||||
todoist.items.complete([existing_task_id])
|
todoist.items.complete([existing_task_id])
|
||||||
else:
|
else:
|
||||||
|
@ -56,13 +63,16 @@ def todoist_repo_prs():
|
||||||
existing_task = todoist.items.get_by_id(existing_task_id)
|
existing_task = todoist.items.get_by_id(existing_task_id)
|
||||||
my_review = get_my_review(me, pr)
|
my_review = get_my_review(me, pr)
|
||||||
if existing_task_id and my_review:
|
if existing_task_id and my_review:
|
||||||
if (
|
if my_review.commit_id == pr.head.sha and not is_task_completed(
|
||||||
my_review.commit_id == pr.head.sha
|
existing_task
|
||||||
and not existing_task["checked"]
|
|
||||||
):
|
):
|
||||||
logger.info("Completing task to review '{}'".format(pr.title))
|
logger.info(
|
||||||
|
"Completing task to review '{}', because I already did it".format(
|
||||||
|
pr.title
|
||||||
|
)
|
||||||
|
)
|
||||||
todoist.items.complete([existing_task_id])
|
todoist.items.complete([existing_task_id])
|
||||||
elif existing_task["checked"] and existing_task["checked"]:
|
elif is_task_completed(existing_task):
|
||||||
logger.info("Re-opening task to review '{}'".format(pr.title))
|
logger.info("Re-opening task to review '{}'".format(pr.title))
|
||||||
todoist.items.uncomplete([existing_task_id])
|
todoist.items.uncomplete([existing_task_id])
|
||||||
existing_task.update(content=pr_to_task_name(pr))
|
existing_task.update(content=pr_to_task_name(pr))
|
||||||
|
|
11
actioner/utils/todoist.py
Normal file
11
actioner/utils/todoist.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
from todoist.models import Item
|
||||||
|
|
||||||
|
|
||||||
|
def is_task_completed(task: Item):
|
||||||
|
"""
|
||||||
|
`Item` doesn't support `.get`, so re-implement it
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
return task["checked"]
|
||||||
|
except KeyError:
|
||||||
|
return False
|
|
@ -1,9 +1,10 @@
|
||||||
from aiohttp import web
|
from aiohttp import web
|
||||||
|
|
||||||
from actioner.clients import github, todoist
|
from actioner.clients import get_todoist_client, github
|
||||||
|
|
||||||
|
|
||||||
async def healthcheck(request):
|
async def healthcheck(request):
|
||||||
|
todoist = get_todoist_client()
|
||||||
todoist.user.sync()
|
todoist.user.sync()
|
||||||
return web.json_response(
|
return web.json_response(
|
||||||
{"github": github.get_user().login, "todoist": todoist.user.get_id()}
|
{"github": github.get_user().login, "todoist": todoist.user.get_id()}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from actioner.clients import github, todoist
|
from actioner.clients import get_todoist_client, github
|
||||||
from actioner.utils import (
|
from actioner.utils import (
|
||||||
GH_ORG_TO_TODOIST,
|
GH_ORG_TO_TODOIST,
|
||||||
GH_REPO_TO_TODOIST,
|
GH_REPO_TO_TODOIST,
|
||||||
|
@ -28,6 +28,7 @@ class TodoistProjectToRepoTestCase(BaseTestCase):
|
||||||
github.get_organization(org)
|
github.get_organization(org)
|
||||||
|
|
||||||
def test_project_exists(self):
|
def test_project_exists(self):
|
||||||
|
todoist = get_todoist_client()
|
||||||
project_ids = set(GH_ORG_TO_TODOIST.values()).union(GH_REPO_TO_TODOIST.values())
|
project_ids = set(GH_ORG_TO_TODOIST.values()).union(GH_REPO_TO_TODOIST.values())
|
||||||
todoist.projects.sync()
|
todoist.projects.sync()
|
||||||
todoist_project_ids = {project["id"] for project in todoist.state["projects"]}
|
todoist_project_ids = {project["id"] for project in todoist.state["projects"]}
|
||||||
|
|
Reference in a new issue