From de686ef4d29bf092cb8247df9954ee827d323e8b Mon Sep 17 00:00:00 2001 From: BoYanZh Date: Thu, 10 Jun 2021 21:41:10 +0800 Subject: [PATCH] feat: retrieve release --- README.md | 2 +- joint_teapot/__init__.py | 6 +++--- joint_teapot/config.py | 6 ------ joint_teapot/teapot.py | 22 ++++++++++++++++++++++ joint_teapot/workers/__init__.py | 3 +++ joint_teapot/{ => workers}/canvas.py | 28 ++++++++++++++-------------- joint_teapot/{ => workers}/git.py | 13 +++++++------ joint_teapot/{ => workers}/gitea.py | 0 joint_teapot/workers/joj.py | 2 ++ 9 files changed, 52 insertions(+), 30 deletions(-) create mode 100644 joint_teapot/workers/__init__.py rename joint_teapot/{ => workers}/canvas.py (51%) rename joint_teapot/{ => workers}/git.py (78%) rename joint_teapot/{ => workers}/gitea.py (100%) create mode 100644 joint_teapot/workers/joj.py diff --git a/README.md b/README.md index 69fddf6..693de87 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ pytest -svv ## Features -- [ ] retreive the hw/project releases for all students +- [x] retrieve the hw/project releases for all students - [x] open "bulk issues" to report something wrong - [x] collect all the public keys - [x] import groups (create teams) diff --git a/joint_teapot/__init__.py b/joint_teapot/__init__.py index be3c3d3..8c741e1 100644 --- a/joint_teapot/__init__.py +++ b/joint_teapot/__init__.py @@ -1,4 +1,4 @@ -from joint_teapot.canvas import Canvas as Canvas -from joint_teapot.git import Git as Git -from joint_teapot.gitea import Gitea as Gitea from joint_teapot.teapot import Teapot as Teapot +from joint_teapot.workers import Canvas as Canvas +from joint_teapot.workers import Git as Git +from joint_teapot.workers import Gitea as Gitea diff --git a/joint_teapot/config.py b/joint_teapot/config.py index 6a97143..ccab502 100644 --- a/joint_teapot/config.py +++ b/joint_teapot/config.py @@ -6,12 +6,6 @@ from pydantic import BaseSettings class Settings(BaseSettings): """ Define the settings (config). - - The selected value is determined as follows (in descending order of priority): - 1. The command line arguments, e.g., '--db-host' is mapped to 'db-host' - 2. Environment variables, e.g., '$DB_HOST' is mapped to 'db-host' - 3. Variables loaded from a dotenv (.env) file - 4. The default field values for the Settings model """ # canvas diff --git a/joint_teapot/teapot.py b/joint_teapot/teapot.py index 4a772a7..b3b1c2d 100644 --- a/joint_teapot/teapot.py +++ b/joint_teapot/teapot.py @@ -1,6 +1,8 @@ +from datetime import datetime from typing import Any, Dict, List from joint_teapot import Canvas, Git, Gitea +from joint_teapot.utils import first class Teapot: @@ -34,6 +36,26 @@ class Teapot: for repo_name in repo_names: self.gitea.create_issue(repo_name, title, body) + def checkout_to_repos_by_release_name( + self, + repo_names: List[str], + release_name: str, + due: datetime = datetime(3000, 1, 1), + ) -> List[str]: + failed_repos = [] + repos_releases = self.gitea.get_repos_releases(repo_names) + for repo_name, repo_releases in zip(repo_names, repos_releases): + release = first(repo_releases, lambda item: item["name"] == release_name) + if ( + release is None + or datetime.strptime(release["created_at"], "%Y-%m-%dT%H:%M:%S.%fZ") + >= due + ): + failed_repos.append(repo_name) + continue + self.git.repo_clean_and_checkout(repo_name, f"tags/{release['tag_name']}") + return failed_repos + if __name__ == "__main__": teapot = Teapot() diff --git a/joint_teapot/workers/__init__.py b/joint_teapot/workers/__init__.py new file mode 100644 index 0000000..aa8d92c --- /dev/null +++ b/joint_teapot/workers/__init__.py @@ -0,0 +1,3 @@ +from joint_teapot.workers.canvas import Canvas as Canvas +from joint_teapot.workers.git import Git as Git +from joint_teapot.workers.gitea import Gitea as Gitea diff --git a/joint_teapot/canvas.py b/joint_teapot/workers/canvas.py similarity index 51% rename from joint_teapot/canvas.py rename to joint_teapot/workers/canvas.py index 9372bec..45c785b 100644 --- a/joint_teapot/canvas.py +++ b/joint_teapot/workers/canvas.py @@ -1,8 +1,9 @@ from canvasapi import Canvas as PyCanvas -from canvasapi.group import Group, GroupMembership from joint_teapot.config import settings +# from canvasapi.group import Group, GroupMembership + class Canvas: def __init__( @@ -17,20 +18,19 @@ class Canvas: ) self.assignments = self.course.get_assignments() self.groups = self.course.get_groups() - # for attr in ["sis_login_id", "sortable_name"]: - # assert hasattr( - # self.students[0], attr - # ), f"Unable to gather students' {attr}, please contact the Canvas site admin" - group: Group - for group in self.groups: - membership: GroupMembership - print(group.__dict__) - for membership in group.get_memberships(): - print(membership.user_id, end=", ") - print("") + for attr in ["sis_login_id", "sortable_name"]: + if not hasattr(self.students[0], attr): + raise Exception( + f"Unable to gather students' {attr}, please contact the Canvas site admin" + ) + # group: Group + # for group in self.groups: + # membership: GroupMembership + # print(group.__dict__) + # for membership in group.get_memberships(): + # print(membership.user_id, end=", ") + # print("") if __name__ == "__main__": canvas = Canvas() - # for student in canvas.students: - # print(student.__dict__) diff --git a/joint_teapot/git.py b/joint_teapot/workers/git.py similarity index 78% rename from joint_teapot/git.py rename to joint_teapot/workers/git.py index ee03ecc..da3704b 100644 --- a/joint_teapot/git.py +++ b/joint_teapot/workers/git.py @@ -1,6 +1,6 @@ import os -import git +from git import Repo from joint_teapot.config import settings @@ -14,24 +14,25 @@ class Git: raise Exception(f"{repos_dir} does not exist! Create it first.") self.repos_dir = repos_dir - def clone_repo(self, repo_name: str) -> git.Repo: + def clone_repo(self, repo_name: str) -> Repo: repo_dir = os.path.join(self.repos_dir, repo_name) - return git.Repo.clone_from( + return Repo.clone_from( f"https://focs.ji.sjtu.edu.cn/git/{self.org_name}/{repo_name}", repo_dir, branch="master", ) - def get_repo(self, repo_name: str) -> git.Repo: + def get_repo(self, repo_name: str) -> Repo: repo_dir = os.path.join(self.repos_dir, repo_name) if os.path.exists(repo_dir): - return git.Repo(repo_dir) + return Repo(repo_dir) return self.clone_repo(repo_dir) def repo_clean_and_checkout(self, repo_name: str, checkout_dest: str) -> str: + repo_dir = os.path.join(self.repos_dir, repo_name) repo = self.get_repo(repo_name) repo.git.fetch("--tags", "--all", "-f") repo.git.reset("--hard", f"origin/master") repo.git.clean("-d", "-f", "-x") repo.git.checkout(checkout_dest) - return os.path.join(self.repos_dir, repo_name) + return repo_dir diff --git a/joint_teapot/gitea.py b/joint_teapot/workers/gitea.py similarity index 100% rename from joint_teapot/gitea.py rename to joint_teapot/workers/gitea.py diff --git a/joint_teapot/workers/joj.py b/joint_teapot/workers/joj.py new file mode 100644 index 0000000..7c8c9b8 --- /dev/null +++ b/joint_teapot/workers/joj.py @@ -0,0 +1,2 @@ +class JOJ: + ...