Important
Request throttling
This release introduces a default throttling mechanism to mitigate secondary rate limit errors and comply with Github's best practices:
https://docs.github.com/en/rest/guides/best-practices-for-integrators?apiVersion=2022-11-28#dealing-with-secondary-rate-limits
The default throttling of 1 second between writes and 0.25 second between any requests can be configured
for `github.Github` and `github.GithubIntegration`:
python
g = github.Github(seconds_between_requests=0.25, seconds_between_writes=1)
Set these parameters to `None` to disable throttling and restore earlier behavior.
Request retry
This release introduces a default retry mechanism to retry retry-able 403 responses (primary and secondary rate limit errors only) and any 5xx response.
Class `github.GithubRetry` implements this behavior, and can be configured via the `retry` argument of `github.Github` and `github.GithubIntegration`.
Retry behavior is configured similar to `urllib3.Retry`: https://urllib3.readthedocs.io/en/stable/reference/urllib3.util.html
python
g = github.Github(retry=github.GithubRetry())
Set this parameter to `None` to disable retry mechanism and restore earlier behaviour.
Breaking Changes
Timestamps
Any timestamps returned by this library are `datetime` with timezone information, usually UTC.
Before this release, timestamps used to be naive `datetime` instances without timezone.
Comparing (other than `==`) these timestamps with naive `datetime` instances used to work but will now break.
Add a timezone information to your `datetime` instances before comparison:
python
if g.get_repo("PyGithub/PyGithub").created_at < datetime(2012, 2, 26, tzinfo=timezone.utc):
...
Netrc authentication
A Netrc file (e.g. `~/.netrc`) does not override PyGithub authentication, anymore.
If you require authentication through Netrc, then this is a breaking change.
Use a `github.Auth.NetrcAuth` instance to use Netrc credentials:
python
>>> auth = Auth.NetrcAuth()
>>> g = Github(auth=auth)
>>> g.get_user().login
'login'
Repository.create_pull
Merged overloaded `create_pull` methods
python
def create_pull(self, issue, base, head)
def create_pull(self, title, body, base, head, maintainer_can_modify=NotSet, draft=False)
into
python
def create_pull(self, base, head, *, title=NotSet, body=NotSet, maintainer_can_modify=NotSet, draft=NotSet, issue=NotSet)
Please update your usage of `Repository.create_pull` accordingly.
New features
* Throttle requests to mitigate RateLimitExceededExceptions (2145) (99155806)
* Retry retryable 403 (rate limit) (2387) (0bb72ca0)
* Close connections after use (2724) (73236e23)
Improvements
* Make datetime objects timezone-aware (2565) (0177f7c5)
* Make `Branch.edit_*` functions return objects (2748) (8dee53a8)
* Add `license` attribute to `Repository` (2721) (26d353e7)
* Add missing attributes to `Repository` (2742) (65cfeb1b)
* Add `is_alphanumeric` attribute to `Autolink` and `Repository.create_autolink` (2630) (b6a28a26)
* Suppress `requests` fallback to netrc, provide `github.Auth.Netrc` (2739) (ac36f6a9)
* Pass Requester arguments to `AppInstallationAuth.__integration` (2695) (8bf542ae)
* Adding feature for enterprise consumed license (2626) (a7bfdf2d)
* Search Workflows by Name (2711) (eadc241e)
* Add `Secret` and `Variable` classes (2623) (bcca758d)
* Add Autolink API link (2632) (aedfa0b9)
* Add `required_linear_history` attribute to `BranchProtection` (2643) (7a80fad9)
* Add retry issue to `GithubException`, don't log it (2611) (de80ff4b)
* Add `message` property to `GithubException` (2591) (f087cad3)
* Add support for repo and org level actions variables (2580) (91b3f40f)
* Add missing arguments to `Workflow.get_runs()` (2346) (766df993)
* Add `github.Rate.used` field (2531) (c4c2e527)
Bug Fixes
* Fix `Branch.bypass_pull_request_allowances` failing with "nil is not an object" (2535) (c5542a6a)
* Fix `required_conversation_resolution` assertion (2715) (54f22267)
* Fix assertion creating pull request review comment (2641) (2fa568b6)
* Safely coerce `responseHeaders` to `int` (2697) (adbfce92)
* Fix assertion for `subject_type` in creating pull request review comment (2642) (4933459e)
* Use timezone-aware reset datetime in `GithubRetry.py` (2610) (950a6949)
* Fix `Branch.bypass_pull_request_allowances` failing with "nil is not an object" (2535) (c5542a6a)
Maintenance
* Epic mass-merge `.pyi` type stubs back to `.py` sources (2636)
* Move to main default branch (2566) (e66c163a)
* Force Unix EOL (2573) (094538e1)
* Close replay test data file silently when test is failing already (2747) (6d871d56)
* CI: Make CI support merge queue (2644) (a91debf1)
* CI: Run CI on release branches (2708) (9a88b6b1)
* CI: remove conflict label workflow (2669) (95d8b83c)
* Fix pip install command in README.md (2731) (2cc1ba2c)
* Update `add_attribute.py` to latest conding style (2631) (e735972e)
* CI: Improve ruff DX (2667) (48d2009c)
* CI: Increase wait and retries of labels action (2670) (ff0f31c2)
* Replace `flake8` with `ruff` (2617) (42c3b47c)
* CI: update labels action name and version (2654) (c5c83eb5)
* CI: label PRs that have conflicts (2622) (1d637e4b)
* Unify requirements files location & source in setup.py (2598) (2edc0f8f)
* Enable mypy `disallow_untyped_defs` (2609) (294c0cc9)
* Enable mypy `check_untyped_defs` (2607) (8816889a)
* Set line length to 120 characters (2599) (13e178a3)
* CI: Build and check package before release (2593) (3c880e76)
* Use `typing_extensions` for `TypedDict` (2592) (5fcb0c7d)
* CI: Update action actions/setup-python (2382) (2e5cd31e)
* Add more methods and attributes to Repository.pyi (2581) (72840de4)
* CI: Make pytest color logs (2597) (73241102)
* precommit: move `flake8` as last (2595) (11bb6bd7)
* Test on Windows and macOS, don't fail fast (2590) (5c600894)
* Remove symlinks from test data (2588) (8d3b9057)