CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/pypi-pygithub

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

Pending

Quality

Pending

Does it follow best practices?

Impact

Pending

No eval scenarios have been run

Overview
Eval results
Files

issues-pull-requests.mddocs/

Issues and Pull Requests

Complete issue and pull request lifecycle management including creation, editing, commenting, labeling, milestone assignment, and review processes.

Capabilities

Issue Management

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."""

Issue Comments

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
        """

Pull Request Management

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
        """

Pull Request Reviews

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
        """

Labels and Milestones

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
        """

Usage Examples

Issue Management

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}")

Pull Request Management

# 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}")

Labels and Milestones

# 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

docs

authentication.md

git-operations.md

index.md

issues-pull-requests.md

repository-management.md

search-discovery.md

user-organization-management.md

workflows-actions.md

tile.json