From 4753641296fbf7806339e2f18d652f85838bc75c Mon Sep 17 00:00:00 2001 From: Langenfeld Date: Wed, 29 May 2019 17:37:03 +0200 Subject: [PATCH] cont. --- gitea/gitea.py | 183 ++++++++++++++----------------------------------- 1 file changed, 53 insertions(+), 130 deletions(-) diff --git a/gitea/gitea.py b/gitea/gitea.py index 791aaf0..f709106 100644 --- a/gitea/gitea.py +++ b/gitea/gitea.py @@ -15,6 +15,8 @@ class NotFoundException(Exception): class GiteaApiObject: + GET_API_OBJECT = "FORMAT/STINING/{argument}" + def __init__(self, gitea, id: int): self.id = id self.gitea = gitea @@ -25,18 +27,25 @@ class GiteaApiObject: def __eq__(self, other): return other.id == self.id if isinstance(other, type(self)) else False + def __hash__(self): + return self.id + fields_to_parsers = {} @classmethod def request(cls, gitea, id): """Use for ginving a nice e.g. 'request(gita, orgname, repo, ticket)'. All args are put into an args tuple for passing around""" - return cls._request(gitea, (id)) + return cls._request(gitea, {"id":id}) @classmethod def _request(cls, gitea, args): result = cls._get_gitea_api_object(gitea, args) - return cls.parse_request(gitea, result) + api_object = cls.parse_request(gitea, result) + api_object = cls.parse_request(gitea, result) + for key, value in args.items(): # hack: not all necessary request args in api result (e.g. repo name in issue) + setattr(api_object, key, value) + return api_object @classmethod def parse_request(cls, gitea, result): @@ -48,22 +57,23 @@ class GiteaApiObject: @classmethod def _get_gitea_api_object(cls, gitea, args): - """Make the conctrete request to gitea-api""" - return {"id":args[0]} + """Retrieving an object always as GET_API_OBJECT """ + return gitea.requests_get(cls.GET_API_OBJECT.format(**args)) @classmethod def _initialize(cls, gitea, api_object, result): for i, v in result.items(): - if i in cls.fields_to_parsers: + if i in cls.fields_to_parsers and v is not None: parse_func = cls.fields_to_parsers[i] setattr(api_object, i, parse_func(gitea, v)) else: setattr(api_object, i, v) + class Organization(GiteaApiObject): - ORG_REQUEST = """/orgs/%s""" # + GET_API_OBJECT = """/orgs/{name}""" # ORG_REPOS_REQUEST = """/orgs/%s/repos""" # ORG_TEAMS_REQUEST = """/orgs/%s/teams""" # ORG_TEAMS_CREATE = """/orgs/%s/teams""" # @@ -76,11 +86,8 @@ class Organization(GiteaApiObject): @classmethod def request(cls, gitea, name): - return cls._request(gitea, (name)) + return cls._request(gitea, {"name": name}) - @classmethod - def _get_gitea_api_object(cls, gitea, args): - return gitea.requests_get(cls.ORG_REQUEST % args) # oldstuff @@ -152,8 +159,8 @@ class Organization(GiteaApiObject): class User(GiteaApiObject): + GET_API_OBJECT = """/users/{name}""" # USER_MAIL = """/user/emails?sudo=%s""" # - USER_REQUEST = """/users/%s""" # USER_REPOS_REQUEST = """/users/%s/repos""" # USER_PATCH = """/admin/users/%s""" # ADMIN_DELETE_USER = """/admin/users/%s""" # @@ -164,11 +171,7 @@ class User(GiteaApiObject): @classmethod def request(cls, gitea, name): - return cls._request(gitea, (name)) - - @classmethod - def _get_gitea_api_object(cls, gitea, args): - return gitea.requests_get(cls.USER_REQUEST % args) + return cls._request(gitea, {"name": name}) def get_repositories(self): @@ -231,7 +234,7 @@ class User(GiteaApiObject): class Repository(GiteaApiObject): - REPO_REQUEST = """/repos/%s/%s""" # , + GET_API_OBJECT = """/repos/{owner}/{name}""" # , REPO_SEARCH = """/repos/search/%s""" # REPO_BRANCHES = """/repos/%s/%s/branches""" # , REPO_ISSUES = """/repos/%s/%s/issues""" # @@ -247,12 +250,8 @@ class Repository(GiteaApiObject): } @classmethod - def request(cls, gitea, name): - return cls._request(gitea, (name)) - - @classmethod - def _get_gitea_api_object(cls, gitea, args): - return gitea.requests_get(cls.REPO_REQUEST % args) + def request(cls, gitea, owner, name): + return cls._request(gitea, {"owner": owner, "name": name}) def get_branches(self): """Get all the Branches of this Repository. @@ -291,7 +290,12 @@ class Repository(GiteaApiObject): if len(results) <= 0: break index += 1 - issues += [Issue(self, result["id"], result) for result in results] + for result in results: + issue = Issue.parse_request(self.gitea, result) + #again a hack because this infomation gets lost after the api call + setattr(issue, "repo", self.name) + setattr(issue, "owner", self.owner.username) + issues.append(issue) return issues def get_user_time(self, username, ignore_above=8): @@ -330,128 +334,47 @@ class Repository(GiteaApiObject): ) -class Milestone: +class Milestone(GiteaApiObject): """Reperesents a Milestone in Gitea. """ - GET = """/repos/%s/%s/milestones/%s""" # + GET_API_OBJECT = """/repos/{owner}/{repo}/milestones/{number}""" # - def __init__(self, repo: Repository, id: int, initJson: json = None): - """ Initializes a Milestone. + def __init__(self, gitea, id: int): + super(Milestone, self).__init__(gitea, id=id) - Args: - repo (Repository): The Repository of this Milestone. - id (int): The id of the Milestone. - initJson (dict): Optional, init information for Milestone. - - Warning: - This does not create a Milestone. does. - - Throws: - NotFoundException, if the Milestone could not be found. - """ - self.gitea = repo.gitea - self.__initialize_milestone(repo, id, initJson) - - def __initialize_milestone(self, repository, id, result): - """ Initializes a Milestone. - - Args: - repo (Repository): The Repository of this Milestone. - id (int): The id of the Milestone. - initJson (dict): Optional, init information for Milestone. - - Throws: - NotFoundException, if the Milestone could not be found. - """ - if not result: - result = self.gitea.requests_get( - Milestone.GET % (repository.owner.username, repository.name, id) - ) - logging.debug( - "Milestone found: %s/%s/%s: %s" - % (repository.owner.username, repository.name, id, result["title"]) - ) - for i, v in result.items(): - setattr(self, i, v) - self.repository = repository - - def __eq__(self, other): - if other is not None: - if isinstance(other, Milestone): - return other.id == self.id - return False - - def __hash__(self): - return self.id - - def __repr__(self): - return "Milestone: '%s'" % self.title + @classmethod + def request(cls, gitea, owner, repo, number): + return cls._request(gitea, {"owner":owner, "repo":repo, "number":number}) def full_print(self): return str(vars(self)) -class Issue: - """Reperestents an Issue in Gitea. - """ +class Issue(GiteaApiObject): - GET = """/repos/%s/%s/issues/%s""" # + GET_API_OBJECT = """/repos/{owner}/{repo}/issues/{number}""" # GET_TIME = """/repos/%s/%s/issues/%s/times""" # - def __init__(self, repo: Repository, id: int, initJson: json = None): - """ Initializes a Issue. + closed = "closed" + open = "open" - Args: - repo (Repository): The Repository of this Issue. - id (int): The id of the Issue. - initJson (dict): Optional, init information for Issue. + def __init__(self, gitea, id: int): + super(Issue, self).__init__(gitea, id=id) - Warning: - This does not create an Issue. does. + fields_to_parsers = { + "milestone": lambda gitea, m: Milestone.parse_request(gitea, m), + "user": lambda gitea, u: User.parse_request(gitea, u), + "assignee": lambda gitea, u: User.parse_request(gitea, u), + "assignees": lambda gitea, us: [User.parse_request(gitea, u) for u in us], + "state": lambda gitea, s: Issue.closed if s == "closed" else Issue.open + } - Throws: - NotFoundException, if the Issue could not be found. - """ - self.gitea = repo.gitea - self.__initialize_issue(repo, id, initJson) + @classmethod + def request(cls, gitea, owner, repo, number): + api_object = cls._request(gitea, {"owner":owner, "repo":repo, "number":number}) + return api_object - def __initialize_issue(self, repository, id, result): - """ Initializing an Issue. - - Args: - repo (Repository): The Repository of this Issue. - id (int): The id of the Issue. - initJson (dict): Optional, init information for Issue. - - Throws: - NotFoundException, if the Issue could not be found. - """ - if not result: - result = self.gitea.requests_get( - Issue.GET % (repository.owner.username, repository.name, id) - ) - logging.debug( - "Issue found: %s/%s/%s: %s" - % (repository.owner.username, repository.name, id, result["title"]) - ) - for i, v in result.items(): - setattr(self, i, v) - self.repository = repository - self.milestone = ( - Milestone(repository, self.milestone["id"], self.milestone) - if self.milestone - else self.milestone - ) - - def __eq__(self, other): - if other is not None: - if isinstance(other, Milestone): - return other.id == self.id - return False - - def __repr__(self): - return "#%i %s" % (self.id, self.title) def get_estimate_sum(self): """Returns the summed estimate-labeled values""" @@ -467,7 +390,7 @@ class Issue: return sum( (t["time"] // 60) / 60 for t in self.gitea.requests_get( - Issue.GET_TIME % (self.repository.owner.username, self.repository.name, self.number) + Issue.GET_TIME % (self.owner, self.repo, self.number) ) if user_id and t["user_id"] == user_id )