fix(ci): fix black/ruff failures, add CoC and PR template
- Fix Python formatting (sync no longer strips blank lines from .py files) - Remove test_community_build.py (tests private sync module) - Fix ruff warnings in test files - Add CODE_OF_CONDUCT.md - Add .github/PULL_REQUEST_TEMPLATE.md Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -11,6 +11,7 @@ from typing import Any
|
||||
|
||||
import aiohttp
|
||||
|
||||
|
||||
class GiteaClient:
|
||||
"""
|
||||
Gitea REST API client for HTTP communication.
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import Any
|
||||
|
||||
from plugins.gitea.client import GiteaClient
|
||||
|
||||
|
||||
def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
"""Return tool specifications for ToolGenerator"""
|
||||
return [
|
||||
@@ -353,6 +354,7 @@ def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
async def list_issues(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -369,12 +371,14 @@ async def list_issues(
|
||||
result = {"success": True, "count": len(issues), "issues": issues}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def get_issue(client: GiteaClient, owner: str, repo: str, issue_number: int) -> str:
|
||||
"""Get issue details"""
|
||||
issue = await client.get_issue(owner, repo, issue_number)
|
||||
result = {"success": True, "issue": issue}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_issue(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -405,6 +409,7 @@ async def create_issue(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def update_issue(
|
||||
client: GiteaClient, owner: str, repo: str, issue_number: int, **kwargs
|
||||
) -> str:
|
||||
@@ -424,6 +429,7 @@ async def update_issue(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def close_issue(client: GiteaClient, owner: str, repo: str, issue_number: int) -> str:
|
||||
"""Close an issue"""
|
||||
data = {"state": "closed"}
|
||||
@@ -435,6 +441,7 @@ async def close_issue(client: GiteaClient, owner: str, repo: str, issue_number:
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def reopen_issue(client: GiteaClient, owner: str, repo: str, issue_number: int) -> str:
|
||||
"""Reopen an issue"""
|
||||
data = {"state": "open"}
|
||||
@@ -446,6 +453,7 @@ async def reopen_issue(client: GiteaClient, owner: str, repo: str, issue_number:
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
# Comment operations
|
||||
async def list_issue_comments(client: GiteaClient, owner: str, repo: str, issue_number: int) -> str:
|
||||
"""List issue comments"""
|
||||
@@ -453,6 +461,7 @@ async def list_issue_comments(client: GiteaClient, owner: str, repo: str, issue_
|
||||
result = {"success": True, "count": len(comments), "comments": comments}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_issue_comment(
|
||||
client: GiteaClient, owner: str, repo: str, issue_number: int, body: str
|
||||
) -> str:
|
||||
@@ -466,6 +475,7 @@ async def create_issue_comment(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
# Label operations
|
||||
async def list_labels(client: GiteaClient, owner: str, repo: str) -> str:
|
||||
"""List repository labels"""
|
||||
@@ -473,6 +483,7 @@ async def list_labels(client: GiteaClient, owner: str, repo: str) -> str:
|
||||
result = {"success": True, "count": len(labels), "labels": labels}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_label(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -487,6 +498,7 @@ async def create_label(
|
||||
result = {"success": True, "message": f"Label '{name}' created successfully", "label": label}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
# Milestone operations
|
||||
async def list_milestones(
|
||||
client: GiteaClient, owner: str, repo: str, state: str | None = None
|
||||
@@ -496,6 +508,7 @@ async def list_milestones(
|
||||
result = {"success": True, "count": len(milestones), "milestones": milestones}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_milestone(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import Any
|
||||
|
||||
from plugins.gitea.client import GiteaClient
|
||||
|
||||
|
||||
def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
"""Return tool specifications for ToolGenerator"""
|
||||
return [
|
||||
@@ -430,6 +431,7 @@ def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
async def list_pull_requests(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -454,12 +456,14 @@ async def list_pull_requests(
|
||||
result = {"success": True, "count": len(prs), "pull_requests": prs}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def get_pull_request(client: GiteaClient, owner: str, repo: str, pr_number: int) -> str:
|
||||
"""Get pull request details"""
|
||||
pr = await client.get_pull_request(owner, repo, pr_number)
|
||||
result = {"success": True, "pull_request": pr}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_pull_request(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -492,6 +496,7 @@ async def create_pull_request(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def update_pull_request(
|
||||
client: GiteaClient, owner: str, repo: str, pr_number: int, **kwargs
|
||||
) -> str:
|
||||
@@ -509,6 +514,7 @@ async def update_pull_request(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def merge_pull_request(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -534,6 +540,7 @@ async def merge_pull_request(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def close_pull_request(client: GiteaClient, owner: str, repo: str, pr_number: int) -> str:
|
||||
"""Close a pull request"""
|
||||
data = {"state": "closed"}
|
||||
@@ -545,6 +552,7 @@ async def close_pull_request(client: GiteaClient, owner: str, repo: str, pr_numb
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def reopen_pull_request(client: GiteaClient, owner: str, repo: str, pr_number: int) -> str:
|
||||
"""Reopen a pull request"""
|
||||
data = {"state": "open"}
|
||||
@@ -556,6 +564,7 @@ async def reopen_pull_request(client: GiteaClient, owner: str, repo: str, pr_num
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
# PR Details
|
||||
async def list_pr_commits(client: GiteaClient, owner: str, repo: str, pr_number: int) -> str:
|
||||
"""List pull request commits"""
|
||||
@@ -563,18 +572,21 @@ async def list_pr_commits(client: GiteaClient, owner: str, repo: str, pr_number:
|
||||
result = {"success": True, "count": len(commits), "commits": commits}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def list_pr_files(client: GiteaClient, owner: str, repo: str, pr_number: int) -> str:
|
||||
"""List pull request files"""
|
||||
files = await client.list_pr_files(owner, repo, pr_number)
|
||||
result = {"success": True, "count": len(files), "files": files}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def get_pr_diff(client: GiteaClient, owner: str, repo: str, pr_number: int) -> str:
|
||||
"""Get pull request diff"""
|
||||
diff = await client.get_pr_diff(owner, repo, pr_number)
|
||||
result = {"success": True, "diff": diff}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def list_pr_comments(client: GiteaClient, owner: str, repo: str, pr_number: int) -> str:
|
||||
"""List pull request comments"""
|
||||
# PR comments are same as issue comments in Gitea API
|
||||
@@ -582,6 +594,7 @@ async def list_pr_comments(client: GiteaClient, owner: str, repo: str, pr_number
|
||||
result = {"success": True, "count": len(comments), "comments": comments}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_pr_comment(
|
||||
client: GiteaClient, owner: str, repo: str, pr_number: int, body: str
|
||||
) -> str:
|
||||
@@ -595,6 +608,7 @@ async def create_pr_comment(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
# PR Reviews
|
||||
async def list_pr_reviews(client: GiteaClient, owner: str, repo: str, pr_number: int) -> str:
|
||||
"""List pull request reviews"""
|
||||
@@ -602,6 +616,7 @@ async def list_pr_reviews(client: GiteaClient, owner: str, repo: str, pr_number:
|
||||
result = {"success": True, "count": len(reviews), "reviews": reviews}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_pr_review(
|
||||
client: GiteaClient, owner: str, repo: str, pr_number: int, event: str, body: str | None = None
|
||||
) -> str:
|
||||
@@ -615,6 +630,7 @@ async def create_pr_review(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def request_pr_reviewers(
|
||||
client: GiteaClient, owner: str, repo: str, pr_number: int, reviewers: list[str]
|
||||
) -> str:
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import Any
|
||||
|
||||
from plugins.gitea.client import GiteaClient
|
||||
|
||||
|
||||
def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
"""Return tool specifications for ToolGenerator"""
|
||||
return [
|
||||
@@ -483,6 +484,7 @@ def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
async def list_repositories(
|
||||
client: GiteaClient, owner: str | None = None, type: str = "all", page: int = 1, limit: int = 30
|
||||
) -> str:
|
||||
@@ -491,12 +493,14 @@ async def list_repositories(
|
||||
result = {"success": True, "count": len(repos), "repositories": repos}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def get_repository(client: GiteaClient, owner: str, repo: str) -> str:
|
||||
"""Get repository details"""
|
||||
repository = await client.get_repository(owner, repo)
|
||||
result = {"success": True, "repository": repository}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_repository(
|
||||
client: GiteaClient,
|
||||
name: str,
|
||||
@@ -528,6 +532,7 @@ async def create_repository(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def update_repository(client: GiteaClient, owner: str, repo: str, **kwargs) -> str:
|
||||
"""Update repository settings"""
|
||||
# Build update data from kwargs
|
||||
@@ -541,12 +546,14 @@ async def update_repository(client: GiteaClient, owner: str, repo: str, **kwargs
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def delete_repository(client: GiteaClient, owner: str, repo: str) -> str:
|
||||
"""Delete a repository"""
|
||||
await client.delete_repository(owner, repo)
|
||||
result = {"success": True, "message": f"Repository '{owner}/{repo}' deleted successfully"}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
# Branch operations
|
||||
async def list_branches(
|
||||
client: GiteaClient, owner: str, repo: str, page: int = 1, limit: int = 30
|
||||
@@ -556,12 +563,14 @@ async def list_branches(
|
||||
result = {"success": True, "count": len(branches), "branches": branches}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def get_branch(client: GiteaClient, owner: str, repo: str, branch: str) -> str:
|
||||
"""Get branch details"""
|
||||
branch_info = await client.get_branch(owner, repo, branch)
|
||||
result = {"success": True, "branch": branch_info}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_branch(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -584,12 +593,14 @@ async def create_branch(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def delete_branch(client: GiteaClient, owner: str, repo: str, branch: str) -> str:
|
||||
"""Delete a branch"""
|
||||
await client.delete_branch(owner, repo, branch)
|
||||
result = {"success": True, "message": f"Branch '{branch}' deleted successfully"}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
# Tag operations
|
||||
async def list_tags(
|
||||
client: GiteaClient, owner: str, repo: str, page: int = 1, limit: int = 30
|
||||
@@ -599,6 +610,7 @@ async def list_tags(
|
||||
result = {"success": True, "count": len(tags), "tags": tags}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_tag(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -613,12 +625,14 @@ async def create_tag(
|
||||
result = {"success": True, "message": f"Tag '{tag_name}' created successfully", "tag": tag}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def delete_tag(client: GiteaClient, owner: str, repo: str, tag: str) -> str:
|
||||
"""Delete a tag"""
|
||||
await client.delete_tag(owner, repo, tag)
|
||||
result = {"success": True, "message": f"Tag '{tag}' deleted successfully"}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
# File operations
|
||||
async def get_file(
|
||||
client: GiteaClient, owner: str, repo: str, path: str, ref: str | None = None
|
||||
@@ -628,6 +642,7 @@ async def get_file(
|
||||
result = {"success": True, "file": file_data}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_file(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -664,6 +679,7 @@ async def create_file(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def update_file(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -694,6 +710,7 @@ async def update_file(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def delete_file(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import Any
|
||||
|
||||
from plugins.gitea.client import GiteaClient
|
||||
|
||||
|
||||
def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
"""Return tool specifications for ToolGenerator"""
|
||||
return [
|
||||
@@ -190,12 +191,14 @@ def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
async def get_user(client: GiteaClient, username: str) -> str:
|
||||
"""Get user information"""
|
||||
user = await client.get_user(username)
|
||||
result = {"success": True, "user": user}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def list_user_repos(
|
||||
client: GiteaClient, username: str, page: int = 1, limit: int = 30
|
||||
) -> str:
|
||||
@@ -204,12 +207,14 @@ async def list_user_repos(
|
||||
result = {"success": True, "count": len(repos), "repositories": repos}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def search_users(client: GiteaClient, q: str | None = None, uid: int | None = None) -> str:
|
||||
"""Search users"""
|
||||
users = await client.search_users(query=q, uid=uid)
|
||||
result = {"success": True, "count": len(users), "users": users}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
# Organization operations
|
||||
async def list_organizations(client: GiteaClient, page: int = 1, limit: int = 30) -> str:
|
||||
"""List organizations"""
|
||||
@@ -217,18 +222,21 @@ async def list_organizations(client: GiteaClient, page: int = 1, limit: int = 30
|
||||
result = {"success": True, "count": len(orgs), "organizations": orgs}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def get_organization(client: GiteaClient, org: str) -> str:
|
||||
"""Get organization information"""
|
||||
organization = await client.get_organization(org)
|
||||
result = {"success": True, "organization": organization}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def list_org_repos(client: GiteaClient, org: str, page: int = 1, limit: int = 30) -> str:
|
||||
"""List organization repositories"""
|
||||
repos = await client.list_org_repos(org, page=page, limit=limit)
|
||||
result = {"success": True, "count": len(repos), "repositories": repos}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
# Team operations
|
||||
async def list_org_teams(client: GiteaClient, org: str, page: int = 1, limit: int = 30) -> str:
|
||||
"""List organization teams"""
|
||||
@@ -236,6 +244,7 @@ async def list_org_teams(client: GiteaClient, org: str, page: int = 1, limit: in
|
||||
result = {"success": True, "count": len(teams), "teams": teams}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def list_team_members(
|
||||
client: GiteaClient, team_id: int, page: int = 1, limit: int = 30
|
||||
) -> str:
|
||||
|
||||
@@ -5,6 +5,7 @@ from typing import Any
|
||||
|
||||
from plugins.gitea.client import GiteaClient
|
||||
|
||||
|
||||
def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
"""Return tool specifications for ToolGenerator"""
|
||||
return [
|
||||
@@ -160,12 +161,14 @@ def get_tool_specifications() -> list[dict[str, Any]]:
|
||||
},
|
||||
]
|
||||
|
||||
|
||||
async def list_webhooks(client: GiteaClient, owner: str, repo: str) -> str:
|
||||
"""List repository webhooks"""
|
||||
webhooks = await client.list_webhooks(owner, repo)
|
||||
result = {"success": True, "count": len(webhooks), "webhooks": webhooks}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def create_webhook(
|
||||
client: GiteaClient,
|
||||
owner: str,
|
||||
@@ -193,12 +196,14 @@ async def create_webhook(
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def delete_webhook(client: GiteaClient, owner: str, repo: str, webhook_id: int) -> str:
|
||||
"""Delete a webhook"""
|
||||
await client.delete_webhook(owner, repo, webhook_id)
|
||||
result = {"success": True, "message": f"Webhook {webhook_id} deleted successfully"}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def test_webhook(client: GiteaClient, owner: str, repo: str, webhook_id: int) -> str:
|
||||
"""Test a webhook"""
|
||||
test_result = await client.test_webhook(owner, repo, webhook_id)
|
||||
@@ -209,6 +214,7 @@ async def test_webhook(client: GiteaClient, owner: str, repo: str, webhook_id: i
|
||||
}
|
||||
return json.dumps(result, indent=2)
|
||||
|
||||
|
||||
async def get_webhook(client: GiteaClient, owner: str, repo: str, webhook_id: int) -> str:
|
||||
"""Get webhook details"""
|
||||
webhook = await client.get_webhook(owner, repo, webhook_id)
|
||||
|
||||
@@ -11,6 +11,7 @@ from plugins.base import BasePlugin
|
||||
from plugins.gitea import handlers
|
||||
from plugins.gitea.client import GiteaClient
|
||||
|
||||
|
||||
class GiteaPlugin(BasePlugin):
|
||||
"""
|
||||
Gitea project plugin - Clean architecture.
|
||||
|
||||
@@ -9,6 +9,7 @@ from typing import Any
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
|
||||
class Site(BaseModel):
|
||||
"""Gitea site configuration"""
|
||||
|
||||
@@ -20,6 +21,7 @@ class Site(BaseModel):
|
||||
alias: str | None = Field(None, description="Site alias")
|
||||
oauth_enabled: bool = Field(default=False, description="Whether OAuth is enabled")
|
||||
|
||||
|
||||
class PaginationParams(BaseModel):
|
||||
"""Pagination parameters for list endpoints"""
|
||||
|
||||
@@ -28,6 +30,7 @@ class PaginationParams(BaseModel):
|
||||
page: int = Field(default=1, ge=1, description="Page number (starts at 1)")
|
||||
limit: int = Field(default=30, ge=1, le=100, description="Number of items per page (1-100)")
|
||||
|
||||
|
||||
class ErrorResponse(BaseModel):
|
||||
"""Standard error response"""
|
||||
|
||||
@@ -36,6 +39,7 @@ class ErrorResponse(BaseModel):
|
||||
code: str | None = Field(None, description="Error code")
|
||||
details: dict[str, Any] | None = Field(None, description="Additional error details")
|
||||
|
||||
|
||||
class SuccessResponse(BaseModel):
|
||||
"""Standard success response"""
|
||||
|
||||
@@ -43,6 +47,7 @@ class SuccessResponse(BaseModel):
|
||||
message: str = Field(..., description="Success message")
|
||||
data: dict[str, Any] | None = Field(None, description="Response data")
|
||||
|
||||
|
||||
class GiteaUser(BaseModel):
|
||||
"""Gitea user information"""
|
||||
|
||||
@@ -55,6 +60,7 @@ class GiteaUser(BaseModel):
|
||||
avatar_url: str | None = None
|
||||
is_admin: bool = False
|
||||
|
||||
|
||||
class GiteaPermissions(BaseModel):
|
||||
"""Repository permissions"""
|
||||
|
||||
@@ -64,6 +70,7 @@ class GiteaPermissions(BaseModel):
|
||||
push: bool = False
|
||||
pull: bool = False
|
||||
|
||||
|
||||
class GiteaTimestamps(BaseModel):
|
||||
"""Common timestamp fields"""
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator
|
||||
|
||||
from .common import GiteaUser
|
||||
|
||||
|
||||
class Label(BaseModel):
|
||||
"""Issue/PR label"""
|
||||
|
||||
@@ -21,6 +22,7 @@ class Label(BaseModel):
|
||||
description: str | None = None
|
||||
url: str | None = None
|
||||
|
||||
|
||||
class Milestone(BaseModel):
|
||||
"""Issue/PR milestone"""
|
||||
|
||||
@@ -37,6 +39,7 @@ class Milestone(BaseModel):
|
||||
closed_at: datetime | None = None
|
||||
due_on: datetime | None = None
|
||||
|
||||
|
||||
class Issue(BaseModel):
|
||||
"""Gitea issue model"""
|
||||
|
||||
@@ -66,6 +69,7 @@ class Issue(BaseModel):
|
||||
html_url: str
|
||||
url: str
|
||||
|
||||
|
||||
class Comment(BaseModel):
|
||||
"""Issue/PR comment"""
|
||||
|
||||
@@ -82,6 +86,7 @@ class Comment(BaseModel):
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
|
||||
class CreateIssueRequest(BaseModel):
|
||||
"""Request to create an issue"""
|
||||
|
||||
@@ -97,6 +102,7 @@ class CreateIssueRequest(BaseModel):
|
||||
milestone: int | None = Field(None, description="Milestone ID")
|
||||
ref: str | None = Field(None, description="Issue ref")
|
||||
|
||||
|
||||
class UpdateIssueRequest(BaseModel):
|
||||
"""Request to update an issue"""
|
||||
|
||||
@@ -120,6 +126,7 @@ class UpdateIssueRequest(BaseModel):
|
||||
raise ValueError("State must be 'open' or 'closed'")
|
||||
return v
|
||||
|
||||
|
||||
class CreateCommentRequest(BaseModel):
|
||||
"""Request to create a comment"""
|
||||
|
||||
@@ -127,6 +134,7 @@ class CreateCommentRequest(BaseModel):
|
||||
|
||||
body: str = Field(..., min_length=1, description="Comment body")
|
||||
|
||||
|
||||
class CreateLabelRequest(BaseModel):
|
||||
"""Request to create a label"""
|
||||
|
||||
@@ -136,6 +144,7 @@ class CreateLabelRequest(BaseModel):
|
||||
color: str = Field(..., pattern=r"^[0-9A-Fa-f]{6}$", description="Label color (hex without #)")
|
||||
description: str | None = Field(None, max_length=200, description="Label description")
|
||||
|
||||
|
||||
class CreateMilestoneRequest(BaseModel):
|
||||
"""Request to create a milestone"""
|
||||
|
||||
@@ -153,6 +162,7 @@ class CreateMilestoneRequest(BaseModel):
|
||||
raise ValueError("State must be 'open' or 'closed'")
|
||||
return v
|
||||
|
||||
|
||||
class IssueListFilters(BaseModel):
|
||||
"""Filters for listing issues"""
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator
|
||||
from .common import GiteaUser
|
||||
from .issue import Label, Milestone
|
||||
|
||||
|
||||
class PRBranchInfo(BaseModel):
|
||||
"""Pull request branch information"""
|
||||
|
||||
@@ -22,6 +23,7 @@ class PRBranchInfo(BaseModel):
|
||||
repo_id: int
|
||||
repository: dict | None = None
|
||||
|
||||
|
||||
class PullRequest(BaseModel):
|
||||
"""Gitea pull request model"""
|
||||
|
||||
@@ -58,6 +60,7 @@ class PullRequest(BaseModel):
|
||||
allow_maintainer_edit: bool = False
|
||||
url: str
|
||||
|
||||
|
||||
class PRReview(BaseModel):
|
||||
"""Pull request review"""
|
||||
|
||||
@@ -72,6 +75,7 @@ class PRReview(BaseModel):
|
||||
pull_request_url: str
|
||||
submitted_at: datetime
|
||||
|
||||
|
||||
class PRCommit(BaseModel):
|
||||
"""Pull request commit"""
|
||||
|
||||
@@ -86,6 +90,7 @@ class PRCommit(BaseModel):
|
||||
committer: GiteaUser | None = None
|
||||
parents: list[dict] = []
|
||||
|
||||
|
||||
class PRFile(BaseModel):
|
||||
"""Pull request file change"""
|
||||
|
||||
@@ -101,6 +106,7 @@ class PRFile(BaseModel):
|
||||
patch: str | None = None
|
||||
previous_filename: str | None = None
|
||||
|
||||
|
||||
class CreatePullRequestRequest(BaseModel):
|
||||
"""Request to create a pull request"""
|
||||
|
||||
@@ -116,6 +122,7 @@ class CreatePullRequestRequest(BaseModel):
|
||||
milestone: int | None = Field(None, description="Milestone ID")
|
||||
due_date: datetime | None = Field(None, description="Due date")
|
||||
|
||||
|
||||
class UpdatePullRequestRequest(BaseModel):
|
||||
"""Request to update a pull request"""
|
||||
|
||||
@@ -139,6 +146,7 @@ class UpdatePullRequestRequest(BaseModel):
|
||||
raise ValueError("State must be 'open' or 'closed'")
|
||||
return v
|
||||
|
||||
|
||||
class MergePullRequestRequest(BaseModel):
|
||||
"""Request to merge a pull request"""
|
||||
|
||||
@@ -162,6 +170,7 @@ class MergePullRequestRequest(BaseModel):
|
||||
raise ValueError(f"Merge method must be one of: {', '.join(allowed)}")
|
||||
return v
|
||||
|
||||
|
||||
class CreateReviewRequest(BaseModel):
|
||||
"""Request to create a review"""
|
||||
|
||||
@@ -179,6 +188,7 @@ class CreateReviewRequest(BaseModel):
|
||||
raise ValueError(f"Review event must be one of: {', '.join(allowed)}")
|
||||
return v
|
||||
|
||||
|
||||
class RequestReviewersRequest(BaseModel):
|
||||
"""Request reviewers for a pull request"""
|
||||
|
||||
@@ -187,6 +197,7 @@ class RequestReviewersRequest(BaseModel):
|
||||
reviewers: list[str] = Field(..., min_items=1, description="List of reviewer usernames")
|
||||
team_reviewers: list[str] | None = Field(None, description="List of team slugs")
|
||||
|
||||
|
||||
class PRListFilters(BaseModel):
|
||||
"""Filters for listing pull requests"""
|
||||
|
||||
|
||||
@@ -11,6 +11,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator
|
||||
|
||||
from .common import GiteaPermissions, GiteaUser
|
||||
|
||||
|
||||
class Repository(BaseModel):
|
||||
"""Gitea repository model"""
|
||||
|
||||
@@ -59,6 +60,7 @@ class Repository(BaseModel):
|
||||
default_merge_style: str = "merge"
|
||||
avatar_url: str | None = None
|
||||
|
||||
|
||||
class Branch(BaseModel):
|
||||
"""Git branch model"""
|
||||
|
||||
@@ -73,6 +75,7 @@ class Branch(BaseModel):
|
||||
user_can_push: bool = False
|
||||
user_can_merge: bool = False
|
||||
|
||||
|
||||
class Tag(BaseModel):
|
||||
"""Git tag model"""
|
||||
|
||||
@@ -85,6 +88,7 @@ class Tag(BaseModel):
|
||||
zipball_url: str | None = None
|
||||
tarball_url: str | None = None
|
||||
|
||||
|
||||
class FileContent(BaseModel):
|
||||
"""File content model"""
|
||||
|
||||
@@ -104,6 +108,7 @@ class FileContent(BaseModel):
|
||||
target: str | None = None # For symlinks
|
||||
submodule_git_url: str | None = None
|
||||
|
||||
|
||||
class CreateRepositoryRequest(BaseModel):
|
||||
"""Request to create a repository"""
|
||||
|
||||
@@ -131,6 +136,7 @@ class CreateRepositoryRequest(BaseModel):
|
||||
)
|
||||
return v
|
||||
|
||||
|
||||
class UpdateRepositoryRequest(BaseModel):
|
||||
"""Request to update a repository"""
|
||||
|
||||
@@ -148,6 +154,7 @@ class UpdateRepositoryRequest(BaseModel):
|
||||
allow_rebase: bool | None = Field(None, description="Allow rebase")
|
||||
allow_squash_merge: bool | None = Field(None, description="Allow squash merge")
|
||||
|
||||
|
||||
class CreateBranchRequest(BaseModel):
|
||||
"""Request to create a branch"""
|
||||
|
||||
@@ -157,6 +164,7 @@ class CreateBranchRequest(BaseModel):
|
||||
old_branch_name: str | None = Field(None, description="Source branch (default: default branch)")
|
||||
old_ref_name: str | None = Field(None, description="Source commit SHA or ref")
|
||||
|
||||
|
||||
class CreateTagRequest(BaseModel):
|
||||
"""Request to create a tag"""
|
||||
|
||||
@@ -166,6 +174,7 @@ class CreateTagRequest(BaseModel):
|
||||
message: str | None = Field(None, description="Tag message")
|
||||
target: str | None = Field(None, description="Target commit SHA (default: latest)")
|
||||
|
||||
|
||||
class CreateFileRequest(BaseModel):
|
||||
"""Request to create a file"""
|
||||
|
||||
@@ -180,6 +189,7 @@ class CreateFileRequest(BaseModel):
|
||||
committer_email: str | None = Field(None, description="Committer email")
|
||||
new_branch: str | None = Field(None, description="Create new branch for this commit")
|
||||
|
||||
|
||||
class UpdateFileRequest(BaseModel):
|
||||
"""Request to update a file"""
|
||||
|
||||
|
||||
@@ -8,6 +8,7 @@ from datetime import datetime
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field
|
||||
|
||||
|
||||
class User(BaseModel):
|
||||
"""Gitea user model"""
|
||||
|
||||
@@ -34,6 +35,7 @@ class User(BaseModel):
|
||||
starred_repos_count: int = 0
|
||||
username: str | None = None # Alias for login
|
||||
|
||||
|
||||
class Organization(BaseModel):
|
||||
"""Gitea organization model"""
|
||||
|
||||
@@ -50,6 +52,7 @@ class Organization(BaseModel):
|
||||
repo_admin_change_team_access: bool = False
|
||||
username: str | None = None # Alias for name
|
||||
|
||||
|
||||
class Team(BaseModel):
|
||||
"""Organization team model"""
|
||||
|
||||
@@ -65,6 +68,7 @@ class Team(BaseModel):
|
||||
units: list[str] | None = None
|
||||
units_map: dict | None = None
|
||||
|
||||
|
||||
class TeamMember(BaseModel):
|
||||
"""Team member model"""
|
||||
|
||||
@@ -73,6 +77,7 @@ class TeamMember(BaseModel):
|
||||
user: User
|
||||
role: str | None = None # Role in team
|
||||
|
||||
|
||||
class Email(BaseModel):
|
||||
"""User email model"""
|
||||
|
||||
@@ -82,6 +87,7 @@ class Email(BaseModel):
|
||||
verified: bool
|
||||
primary: bool
|
||||
|
||||
|
||||
class SearchUsersRequest(BaseModel):
|
||||
"""Request to search users"""
|
||||
|
||||
@@ -90,6 +96,7 @@ class SearchUsersRequest(BaseModel):
|
||||
q: str | None = Field(None, description="Search query")
|
||||
uid: int | None = Field(None, description="User ID")
|
||||
|
||||
|
||||
class SearchOrgsRequest(BaseModel):
|
||||
"""Request to search organizations"""
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ from typing import Any
|
||||
|
||||
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
||||
|
||||
|
||||
class Webhook(BaseModel):
|
||||
"""Gitea webhook model"""
|
||||
|
||||
@@ -22,6 +23,7 @@ class Webhook(BaseModel):
|
||||
updated_at: datetime
|
||||
created_at: datetime
|
||||
|
||||
|
||||
class WebhookConfig(BaseModel):
|
||||
"""Webhook configuration"""
|
||||
|
||||
@@ -33,6 +35,7 @@ class WebhookConfig(BaseModel):
|
||||
http_method: str | None = "POST"
|
||||
branch_filter: str | None = None
|
||||
|
||||
|
||||
class CreateWebhookRequest(BaseModel):
|
||||
"""Request to create a webhook"""
|
||||
|
||||
@@ -109,6 +112,7 @@ class CreateWebhookRequest(BaseModel):
|
||||
v["content_type"] = "json"
|
||||
return v
|
||||
|
||||
|
||||
class UpdateWebhookRequest(BaseModel):
|
||||
"""Request to update a webhook"""
|
||||
|
||||
@@ -152,6 +156,7 @@ class UpdateWebhookRequest(BaseModel):
|
||||
raise ValueError(f"Invalid event: {event}")
|
||||
return v
|
||||
|
||||
|
||||
class WebhookTestResult(BaseModel):
|
||||
"""Webhook test result"""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user