Skip to main content

Python client for the Chromium Issue Tracker

Project description

Buganize

Python client for the Chromium Issue Tracker.

Table of Contents

Installation

pip install buganize

or

pip install buganise

Usage as a library

from buganize import Buganize

or

from buganise import Buganise

Search issues

async def search():
    async with Buganize() as client:
        result = await client.search("status:open component:Blink", page_size=10)

        print(f"{result.total_count} total matches")
        for issue in result.issues:
            print(f"#{issue.id} [{issue.status.name}] {issue.title}")

        # Pagination
        if result.has_more:
            page2 = await client.next_page(result)
            for issue in page2.issues:
                print(f"#{issue.id} [{issue.status.name}] {issue.title}")

Get a single issue

async def get_issue():
    async with Buganize() as client:
        issue = await client.issue(40060244)

        print(issue.title)
        print(issue.url)  # https://issues.chromium.org/issues/40060244
        print(issue.status.name)  # e.g. "FIXED"
        print(issue.priority.name)  # e.g. "P2"
        print(issue.os)  # e.g. ["Linux", "Mac", "Windows"]
        print(issue.cve)  # e.g. ["CVE-2024-1234"]

Batch get issues

async def batch_get():
    async with Buganize() as client:
        issues = await client.issues([40060244, 485912774, 486077869])

        for issue in issues:
            print(f"#{issue.id} - {issue.title}")

Get comments

async def get_comments():
    async with Buganize() as client:
        comments = await client.comments(486077869)

        for comment in comments:
            print(f"#{comment.comment_number} by {comment.author}")
            print(comment.body)

Get full updates

Updates include both comments and field changes (status changes, priority changes, etc.):

async def get_updates():
    async with Buganize() as client:
        result = await client.issue_updates(486077869)

        print(f"{result.total_count} total updates")

        # Just the comments, in chronological order
        for comment in result.comments:
            print(f"#{comment.comment_number}: {comment.body[:80]}")

        # All updates (newest first), including field changes
        for update in result.updates:
            if update.field_changes:
                changed = ", ".join(fc.field for fc in update.field_changes)
                print(f"  Fields changed: {changed}")
            if update.comment:
                print(f"  Comment: {update.comment.body[:80]}")

CLI usage

Run with python -m buganize <command> or just buganize <command>.

Search

# Search for open issues
buganize search "status:open"

# Combined filters
buganize search "status:open component:Blink"

# Results per page (choices: 25, 50, 100, 250)
buganize search "type:bug" -n 100

# Fetch a total of 200 results, paginating as needed
buganize search "status:open" -l 200

Issue

buganize issue 486077869

Issues (batch)

buganize issues 40060244 485912774 486077869

Comments

buganize comments 486077869

Extra fields

By default, the table output only shows ID, Status, Priority, and Title. You can show additional columns:

# Show specific extra fields
buganize search "status:open" -f owner os milestone

# Show all available fields
buganize search "status:open" -F

# Works with issue and issues too
buganize issue 486077869 --fields cve tags labels
buganize issue 486077869 --all-fields

Available extra field names: owner, reporter, verifier, type, component, tags, ancestor_tags, labels, os, milestone, ccs, hotlists, blocking, cve, cwe, build, introduced_in, merge, merge_request, release_block, notice, flaky_test, est_days, next_action, vrp_reward, irm_link, sec_release, fixed_by, created, modified, verified, comments, stars, last_modifier.

Export

All commands support -e/--export for exporting to CSV, JSON, or HTML. You can specify multiple formats at once:

buganize -e csv search "status:open" -n 50
buganize -e json issue 486077869
buganize -e html comments 486077869

# Multiple formats in one command
buganize -e csv json search "status:open"

Debug logging

Use -d/--debug to see HTTP request/response details:

buganize --debug search "status:open"

Timeout

Use -t/--timeout to set the HTTP request timeout in seconds (default: 30):

buganize -t 60 search "status:open"

[!Tip] British English spelling buganise will also work.

How it works

The Chromium issue tracker at issues.chromium.org doesn't have a documented public API. But the web frontend talks to a set of POST endpoints under https://issues.chromium.org/action/ using JSON arrays as request/response bodies. This library speaks that same protocol.

Every response from the API starts with )]}'\n (an anti-XSSI prefix) followed by a JSON array. Issue data comes back as 48-element positional arrays, no keys, just indexes. The parser maps those indexes to fields on the Issue dataclass. Custom fields (things like OS, milestone, CVE, component tags) are embedded inside the issue array at a specific offset and have their own internal structure.

No cookies or tokens are needed for reading public issues. The only headers required are Content-Type, Origin, Referer, and a browser-like User-Agent.

Limitations

  • This uses an undocumented API. It could break if Google changes the response format.
  • Only works with public issues. Private/restricted issues need authentication cookies that this client doesn't handle.
  • The parser is entirely index-based. If the API adds or removes fields from the arrays, the parsing will silently return wrong data.
  • Pagination for updates (comments) is not fully wired up, currently fetches the first page only.
  • The batch endpoint may not return issues in the same order as the input IDs.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

buganize-0.2.3.tar.gz (18.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

buganize-0.2.3-py3-none-any.whl (22.7 kB view details)

Uploaded Python 3

File details

Details for the file buganize-0.2.3.tar.gz.

File metadata

  • Download URL: buganize-0.2.3.tar.gz
  • Upload date:
  • Size: 18.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for buganize-0.2.3.tar.gz
Algorithm Hash digest
SHA256 a7b977a27be331c7243e6fe9965b3570a3d31724d5776a2a0f08acdec4527a58
MD5 1acb8911bb7000a92d97e47223d3eec6
BLAKE2b-256 1d3bc01de8652e390fdba84347143c060064a86f54875666cd17b9e76cba6140

See more details on using hashes here.

Provenance

The following attestation bundles were made for buganize-0.2.3.tar.gz:

Publisher: publish-python.yml on rly0nheart/buganize

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file buganize-0.2.3-py3-none-any.whl.

File metadata

  • Download URL: buganize-0.2.3-py3-none-any.whl
  • Upload date:
  • Size: 22.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for buganize-0.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 ce39191163d7e71cb73c7362fbd030e895d8f112227f401ab9d0b7085bfda0c7
MD5 b4033b35a05c7a13bc1c4ceed37d656a
BLAKE2b-256 bd1003fd2901e766bd98d1eac77eecd6b075c12bf4f931e9c8a702ca6199b663

See more details on using hashes here.

Provenance

The following attestation bundles were made for buganize-0.2.3-py3-none-any.whl:

Publisher: publish-python.yml on rly0nheart/buganize

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page