Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions ogr/abstract/issue.py
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,9 @@ def get_comments(
reverse: Whether the comments are to be returned in
reversed order.

In case of Forgejo, setting reverse=True
leads to strict evaluation of all comments.

Defaults to `False`.
author: Filter the comments by author.

Expand Down
12 changes: 12 additions & 0 deletions ogr/services/forgejo/__init__.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,26 @@
# Copyright Contributors to the Packit project.
# SPDX-License-Identifier: MIT

from ogr.services.forgejo.comments import (
ForgejoComment,
ForgejoIssueComment,
ForgejoPRComment,
)
from ogr.services.forgejo.issue import ForgejoIssue
from ogr.services.forgejo.project import ForgejoProject
from ogr.services.forgejo.pull_request import ForgejoPullRequest
from ogr.services.forgejo.release import ForgejoRelease
from ogr.services.forgejo.service import ForgejoService
from ogr.services.forgejo.user import ForgejoUser

__all__ = [
ForgejoPullRequest.__name__,
ForgejoComment.__name__,
ForgejoIssueComment.__name__,
ForgejoPRComment.__name__,
ForgejoIssue.__name__,
ForgejoProject.__name__,
ForgejoRelease.__name__,
ForgejoService.__name__,
ForgejoUser.__name__,
]
105 changes: 105 additions & 0 deletions ogr/services/forgejo/comments.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# Copyright Contributors to the Packit project.
# SPDX-License-Identifier: MIT

import datetime
import logging

from pydantic import ValidationError
from pyforgejo.core.api_error import ApiError
from pyforgejo.types import Comment as _ForgejoComment
from pyforgejo.types.reaction import Reaction as _ForgejoReaction

from ogr.abstract import Comment, IssueComment, PRComment, Reaction
from ogr.services import forgejo

logger = logging.getLogger(__name__)


class ForgejoReaction(Reaction):
def __init__(
self,
raw_reaction: _ForgejoReaction,
parent: "forgejo.ForgejoComment",
) -> None:
super().__init__(raw_reaction)
self._parent = parent

def __str__(self) -> str:
return "Forgejo" + super().__str__()

def delete(self) -> None:
# self._raw_reaction is set to None after deleting
self._raw_reaction = self._parent._client.issue.delete_comment_reaction(
owner=self._parent._parent.project.namespace,
repo=self._parent._parent.project.repo,
id=self._parent._id,
)


class ForgejoComment(Comment):
def _from_raw_comment(self, raw_comment: _ForgejoComment) -> None:
self._raw_comment = raw_comment
self._id = raw_comment.id
self._author = raw_comment.user.login
self._created = raw_comment.created_at
self._edited = raw_comment.updated_at

@property
def body(self) -> str:
return self._raw_comment.body

@body.setter
def body(self, new_body: str) -> None:
self._raw_comment = self._client.issue.edit_comment(
owner=self._parent.project.namespace,
repo=self._parent.project.repo,
id=self._id,
body=new_body,
)

@property
def edited(self) -> datetime.datetime:
return self._edited

@property
def _client(self):
return self._parent.project.service.api

def get_reactions(self) -> list[Reaction]:
try:
reactions = self._client.issue.get_comment_reactions(
owner=self._parent.project.namespace,
repo=self._parent.project.repo,
id=self._id,
)

# in case no reactions exist:
# re-recording causes pyforgejo to raise pydantic's ValidationError
# re-running tests causes pyforgejo's ApiError to be raised instead
# both need to be caught
except (ValidationError, ApiError):
return []

return [
ForgejoReaction(raw_reaction=reaction, parent=self)
for reaction in reactions
]

def add_reaction(self, reaction: str) -> Reaction:
raw_reaction = self._client.issue.post_comment_reaction(
owner=self._parent.project.namespace,
repo=self._parent.project.repo,
id=self._id,
content=reaction,
)
return ForgejoReaction(raw_reaction=raw_reaction, parent=self)


class ForgejoIssueComment(ForgejoComment, IssueComment):
def __str__(self) -> str:
return "Forgejo" + super().__str__()


class ForgejoPRComment(ForgejoComment, PRComment):
def __str__(self) -> str:
return "Forgejo" + super().__str__()
Loading
Loading