Comprehensive Python client library providing full access to the GitHub REST API v3 for programmatic management of repositories, users, organizations, issues, pull requests, and other GitHub entities
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Complete issue and pull request lifecycle management including creation, editing, commenting, labeling, milestone assignment, and review processes.
Create, edit, and manage GitHub issues with full support for labels, assignees, milestones, and comments.
class Repository:
def get_issues(
self,
milestone: Union[Milestone, str] = None,
state: str = None,
assignee: Union[NamedUser, str] = None,
mentioned: NamedUser = None,
labels: list = None,
sort: str = None,
direction: str = None,
since: datetime = None
):
"""
Get repository issues.
Args:
milestone (Union[Milestone, str], optional): Filter by milestone ("*", "none", or milestone)
state (str, optional): Issue state ("open", "closed", "all")
assignee (Union[NamedUser, str], optional): Filter by assignee ("*", "none", or username)
mentioned (NamedUser, optional): Filter by mentioned user
labels (list, optional): List of label names
sort (str, optional): Sort by ("created", "updated", "comments")
direction (str, optional): Sort direction ("asc", "desc")
since (datetime, optional): Only issues updated after this date
Returns:
PaginatedList[Issue]: List of issues
"""
def get_issue(self, number: int):
"""
Get a specific issue by number.
Args:
number (int): Issue number
Returns:
Issue: Issue object
"""
def create_issue(
self,
title: str,
body: str = None,
assignee: str = None,
milestone: Milestone = None,
labels: list = None,
assignees: list = None
):
"""
Create a new issue.
Args:
title (str): Issue title
body (str, optional): Issue body text
assignee (str, optional): Username of assignee (deprecated, use assignees)
milestone (Milestone, optional): Milestone to assign
labels (list, optional): List of label names or Label objects
assignees (list, optional): List of usernames to assign
Returns:
Issue: Created issue
"""
class Issue:
# Issue properties
@property
def number(self) -> int: ...
@property
def title(self) -> str: ...
@property
def body(self) -> str: ...
@property
def state(self) -> str: ... # "open" or "closed"
@property
def user(self) -> NamedUser: ...
@property
def assignee(self) -> NamedUser: ...
@property
def assignees(self) -> list: ...
@property
def milestone(self) -> Milestone: ...
@property
def labels(self) -> list: ...
@property
def comments(self) -> int: ...
@property
def created_at(self) -> datetime: ...
@property
def updated_at(self) -> datetime: ...
@property
def closed_at(self) -> datetime: ...
@property
def closed_by(self) -> NamedUser: ...
@property
def html_url(self) -> str: ...
@property
def pull_request(self) -> IssuePullRequest: ... # Present if issue is a PR
def edit(
self,
title: str = None,
body: str = None,
assignee: str = None,
state: str = None,
milestone: Milestone = None,
labels: list = None,
assignees: list = None
):
"""
Edit issue properties.
Args:
title (str, optional): New title
body (str, optional): New body text
assignee (str, optional): Username of assignee (deprecated)
state (str, optional): New state ("open", "closed")
milestone (Milestone, optional): Milestone to assign
labels (list, optional): List of labels
assignees (list, optional): List of assignee usernames
"""
def create_comment(self, body: str):
"""
Create a comment on the issue.
Args:
body (str): Comment body text
Returns:
IssueComment: Created comment
"""
def get_comments(self, since: datetime = None):
"""
Get issue comments.
Args:
since (datetime, optional): Only comments updated after this date
Returns:
PaginatedList[IssueComment]: List of comments
"""
def add_to_labels(self, *labels):
"""
Add labels to the issue.
Args:
*labels: Label names or Label objects to add
"""
def remove_from_labels(self, *labels):
"""
Remove labels from the issue.
Args:
*labels: Label names or Label objects to remove
"""
def set_labels(self, *labels):
"""
Replace all labels on the issue.
Args:
*labels: Label names or Label objects
"""
def add_to_assignees(self, *assignees):
"""
Add assignees to the issue.
Args:
*assignees: Usernames or NamedUser objects to assign
"""
def remove_from_assignees(self, *assignees):
"""
Remove assignees from the issue.
Args:
*assignees: Usernames or NamedUser objects to unassign
"""
def get_events(self):
"""
Get issue events (labeled, assigned, closed, etc.).
Returns:
PaginatedList[IssueEvent]: List of events
"""
def get_timeline(self):
"""
Get issue timeline (comments and events combined).
Returns:
PaginatedList[TimelineEvent]: List of timeline events
"""
def lock(self, lock_reason: str = None):
"""
Lock the issue.
Args:
lock_reason (str, optional): Lock reason ("off-topic", "too heated", "resolved", "spam")
"""
def unlock(self):
"""Unlock the issue."""Manage comments on issues and pull requests.
class IssueComment:
@property
def id(self) -> int: ...
@property
def body(self) -> str: ...
@property
def user(self) -> NamedUser: ...
@property
def created_at(self) -> datetime: ...
@property
def updated_at(self) -> datetime: ...
@property
def html_url(self) -> str: ...
def edit(self, body: str):
"""
Edit comment body.
Args:
body (str): New comment body
"""
def delete(self):
"""Delete the comment."""
def get_reactions(self):
"""
Get comment reactions.
Returns:
PaginatedList[Reaction]: List of reactions
"""
def create_reaction(self, reaction_type: str):
"""
Add reaction to comment.
Args:
reaction_type (str): Reaction type ("+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes")
Returns:
Reaction: Created reaction
"""Complete pull request lifecycle including creation, review, merging, and file management.
class Repository:
def get_pulls(
self,
state: str = None,
head: str = None,
base: str = None,
sort: str = None,
direction: str = None
):
"""
Get repository pull requests.
Args:
state (str, optional): PR state ("open", "closed", "all")
head (str, optional): Filter by head branch (format: "user:ref-name")
base (str, optional): Filter by base branch
sort (str, optional): Sort by ("created", "updated", "popularity")
direction (str, optional): Sort direction ("asc", "desc")
Returns:
PaginatedList[PullRequest]: List of pull requests
"""
def get_pull(self, number: int):
"""
Get a specific pull request by number.
Args:
number (int): Pull request number
Returns:
PullRequest: Pull request object
"""
def create_pull(
self,
title: str,
body: str = None,
head: str = None,
base: str = None,
maintainer_can_modify: bool = None,
draft: bool = None
):
"""
Create a new pull request.
Args:
title (str): Pull request title
body (str, optional): Pull request body text
head (str): Branch containing changes (format: "user:ref-name" or "ref-name")
base (str): Branch to merge into
maintainer_can_modify (bool, optional): Allow maintainers to modify PR
draft (bool, optional): Create as draft PR
Returns:
PullRequest: Created pull request
"""
class PullRequest:
# Pull request properties (inherits from Issue)
@property
def number(self) -> int: ...
@property
def title(self) -> str: ...
@property
def body(self) -> str: ...
@property
def state(self) -> str: ... # "open" or "closed"
@property
def user(self) -> NamedUser: ...
@property
def head(self) -> PullRequestPart: ...
@property
def base(self) -> PullRequestPart: ...
@property
def merged(self) -> bool: ...
@property
def merged_at(self) -> datetime: ...
@property
def merged_by(self) -> NamedUser: ...
@property
def mergeable(self) -> bool: ...
@property
def mergeable_state(self) -> str: ...
@property
def merge_commit_sha(self) -> str: ...
@property
def additions(self) -> int: ...
@property
def deletions(self) -> int: ...
@property
def changed_files(self) -> int: ...
@property
def commits(self) -> int: ...
@property
def review_comments(self) -> int: ...
@property
def maintainer_can_modify(self) -> bool: ...
@property
def draft(self) -> bool: ...
@property
def rebaseable(self) -> bool: ...
def edit(
self,
title: str = None,
body: str = None,
state: str = None,
base: str = None,
maintainer_can_modify: bool = None
):
"""
Edit pull request properties.
Args:
title (str, optional): New title
body (str, optional): New body text
state (str, optional): New state ("open", "closed")
base (str, optional): New base branch
maintainer_can_modify (bool, optional): Allow maintainer modifications
"""
def merge(
self,
commit_message: str = None,
commit_title: str = None,
merge_method: str = None,
sha: str = None
):
"""
Merge the pull request.
Args:
commit_message (str, optional): Merge commit message
commit_title (str, optional): Merge commit title
merge_method (str, optional): Merge method ("merge", "squash", "rebase")
sha (str, optional): SHA of head commit to verify
Returns:
PullRequestMergeStatus: Merge result
"""
def is_merged(self):
"""
Check if pull request is merged.
Returns:
bool: True if merged
"""
def get_commits(self):
"""
Get pull request commits.
Returns:
PaginatedList[Commit]: List of commits
"""
def get_files(self):
"""
Get files changed in the pull request.
Returns:
PaginatedList[File]: List of changed files
"""
def create_review(
self,
body: str = None,
event: str = None,
comments: list = None
):
"""
Create a pull request review.
Args:
body (str, optional): Review body text
event (str, optional): Review event ("APPROVE", "REQUEST_CHANGES", "COMMENT")
comments (list, optional): List of review comments
Returns:
PullRequestReview: Created review
"""
def get_reviews(self):
"""
Get pull request reviews.
Returns:
PaginatedList[PullRequestReview]: List of reviews
"""
def get_review_comments(self, since: datetime = None):
"""
Get pull request review comments.
Args:
since (datetime, optional): Only comments updated after this date
Returns:
PaginatedList[PullRequestComment]: List of review comments
"""
def create_review_comment(
self,
body: str,
commit_id: str,
path: str,
position: int
):
"""
Create a review comment on a specific line.
Args:
body (str): Comment body
commit_id (str): SHA of commit to comment on
path (str): File path
position (int): Line position in diff
Returns:
PullRequestComment: Created review comment
"""Manage pull request reviews and review comments.
class PullRequestReview:
@property
def id(self) -> int: ...
@property
def body(self) -> str: ...
@property
def user(self) -> NamedUser: ...
@property
def state(self) -> str: ... # "PENDING", "APPROVED", "CHANGES_REQUESTED", "COMMENTED", "DISMISSED"
@property
def commit_id(self) -> str: ...
@property
def submitted_at(self) -> datetime: ...
@property
def html_url(self) -> str: ...
def edit(self, body: str):
"""
Edit review body.
Args:
body (str): New review body
"""
def dismiss(self, message: str):
"""
Dismiss the review.
Args:
message (str): Dismissal message
"""
def submit(self, body: str, event: str):
"""
Submit pending review.
Args:
body (str): Review body
event (str): Review event ("APPROVE", "REQUEST_CHANGES", "COMMENT")
"""
class PullRequestComment:
@property
def id(self) -> int: ...
@property
def body(self) -> str: ...
@property
def user(self) -> NamedUser: ...
@property
def path(self) -> str: ...
@property
def position(self) -> int: ...
@property
def original_position(self) -> int: ...
@property
def commit_id(self) -> str: ...
@property
def original_commit_id(self) -> str: ...
@property
def diff_hunk(self) -> str: ...
@property
def created_at(self) -> datetime: ...
@property
def updated_at(self) -> datetime: ...
@property
def html_url(self) -> str: ...
def edit(self, body: str):
"""
Edit review comment body.
Args:
body (str): New comment body
"""
def delete(self):
"""Delete the review comment."""
def get_reactions(self):
"""
Get comment reactions.
Returns:
PaginatedList[Reaction]: List of reactions
"""
def create_reaction(self, reaction_type: str):
"""
Add reaction to comment.
Args:
reaction_type (str): Reaction type
Returns:
Reaction: Created reaction
"""Manage repository labels and milestones for issue organization.
class Repository:
def get_labels(self):
"""
Get repository labels.
Returns:
PaginatedList[Label]: List of labels
"""
def get_label(self, name: str):
"""
Get a specific label.
Args:
name (str): Label name
Returns:
Label: Label object
"""
def create_label(self, name: str, color: str, description: str = None):
"""
Create a new label.
Args:
name (str): Label name
color (str): Label color (hex code without #)
description (str, optional): Label description
Returns:
Label: Created label
"""
def get_milestones(self, state: str = None, sort: str = None, direction: str = None):
"""
Get repository milestones.
Args:
state (str, optional): Milestone state ("open", "closed", "all")
sort (str, optional): Sort by ("due_on", "completeness")
direction (str, optional): Sort direction ("asc", "desc")
Returns:
PaginatedList[Milestone]: List of milestones
"""
def get_milestone(self, number: int):
"""
Get a specific milestone.
Args:
number (int): Milestone number
Returns:
Milestone: Milestone object
"""
def create_milestone(
self,
title: str,
state: str = None,
description: str = None,
due_on: datetime = None
):
"""
Create a new milestone.
Args:
title (str): Milestone title
state (str, optional): Milestone state ("open", "closed")
description (str, optional): Milestone description
due_on (datetime, optional): Due date
Returns:
Milestone: Created milestone
"""
class Label:
@property
def name(self) -> str: ...
@property
def color(self) -> str: ...
@property
def description(self) -> str: ...
@property
def url(self) -> str: ...
def edit(self, name: str = None, color: str = None, description: str = None):
"""
Edit label properties.
Args:
name (str, optional): New name
color (str, optional): New color
description (str, optional): New description
"""
def delete(self):
"""Delete the label."""
class Milestone:
@property
def number(self) -> int: ...
@property
def title(self) -> str: ...
@property
def description(self) -> str: ...
@property
def state(self) -> str: ...
@property
def open_issues(self) -> int: ...
@property
def closed_issues(self) -> int: ...
@property
def created_at(self) -> datetime: ...
@property
def updated_at(self) -> datetime: ...
@property
def due_on(self) -> datetime: ...
@property
def creator(self) -> NamedUser: ...
def edit(
self,
title: str = None,
state: str = None,
description: str = None,
due_on: datetime = None
):
"""
Edit milestone properties.
Args:
title (str, optional): New title
state (str, optional): New state
description (str, optional): New description
due_on (datetime, optional): New due date
"""
def delete(self):
"""Delete the milestone."""
def get_labels(self):
"""
Get labels for issues in this milestone.
Returns:
PaginatedList[Label]: List of labels
"""from github import Github, Auth
g = Github(auth=Auth.Token("your_token"))
repo = g.get_repo("owner/repository")
# Create an issue
issue = repo.create_issue(
title="Bug: Application crashes on startup",
body="The application crashes when starting with the following error...",
labels=["bug", "high-priority"],
assignees=["developer1", "developer2"]
)
print(f"Created issue #{issue.number}")
# Add comment to issue
comment = issue.create_comment("I can reproduce this issue on Windows 10.")
print(f"Added comment: {comment.body}")
# Update issue
issue.edit(
state="closed",
body="Fixed in commit abc123"
)
# List repository issues
for issue in repo.get_issues(state='open', labels=['bug']):
print(f"Bug #{issue.number}: {issue.title}")# Create pull request
pr = repo.create_pull(
title="Fix application crash on startup",
body="This PR fixes the crash by handling the null pointer exception.",
head="fix-startup-crash", # Source branch
base="main" # Target branch
)
print(f"Created PR #{pr.number}")
# Review pull request
review = pr.create_review(
body="Great fix! Just a couple of minor suggestions.",
event="APPROVE"
)
# Add review comment on specific line
review_comment = pr.create_review_comment(
body="Consider adding error handling here.",
commit_id=pr.head.sha,
path="src/main.py",
position=42
)
# Merge pull request
merge_result = pr.merge(
commit_message="Fix application crash on startup",
merge_method="squash"
)
print(f"Merged: {merge_result.merged}")# Create labels
bug_label = repo.create_label(
name="bug",
color="d73a4a",
description="Something isn't working"
)
# Create milestone
milestone = repo.create_milestone(
title="Version 2.0",
description="Features and fixes for version 2.0 release",
due_on=datetime(2024, 12, 31)
)
# Create issue with label and milestone
issue = repo.create_issue(
title="Implement new feature",
labels=[bug_label],
milestone=milestone
)Install with Tessl CLI
npx tessl i tessl/pypi-pygithub