diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..3088a753 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: daily + + - package-ecosystem: pip + directory: /docs/source + schedule: + interval: daily diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 13892dcd..812515d1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,31 +2,39 @@ name: Python tests on: [push, pull_request] +permissions: + contents: read + jobs: test: runs-on: ubuntu-latest strategy: matrix: python: - - { VERSION: "3.7", TOXENV: "py37", ALLOW_FAILURE: false } - - { VERSION: "3.8", TOXENV: "py38", ALLOW_FAILURE: false } - { VERSION: "3.9", TOXENV: "py39", ALLOW_FAILURE: false } - { VERSION: "3.10", TOXENV: "py310", ALLOW_FAILURE: false } - { VERSION: "3.11", TOXENV: "py311", ALLOW_FAILURE: false } + - { VERSION: "3.12", TOXENV: "py312", ALLOW_FAILURE: false } + - { VERSION: "3.13", TOXENV: "py313", ALLOW_FAILURE: false } - { - VERSION: "3.11", + VERSION: "3.13", TOXENV: "flake8,doclint,docs,commitlint", ALLOW_FAILURE: false, } - - { VERSION: "3.11", TOXENV: "docstrings", ALLOW_FAILURE: true } + - { VERSION: "3.13", TOXENV: "docstrings", ALLOW_FAILURE: true } - { VERSION: "pypy3.9", TOXENV: "pypy", ALLOW_FAILURE: false } steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 + with: + egress-policy: audit + - name: Check out the repository - uses: actions/checkout@v3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup Python - uses: actions/setup-python@v4.2.0 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.PYTHON.VERSION }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index c0d5135c..4dc62954 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -20,6 +20,9 @@ on: schedule: - cron: '32 17 * * 6' +permissions: + contents: read + jobs: analyze: name: Analyze @@ -37,12 +40,17 @@ jobs: # Learn more about CodeQL language support at https://git.io/codeql-language-support steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 + with: + egress-policy: audit + - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -53,7 +61,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0 # â„šī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -67,4 +75,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0 diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml new file mode 100644 index 00000000..bb23bfeb --- /dev/null +++ b/.github/workflows/dependency-review.yml @@ -0,0 +1,27 @@ +# Dependency Review Action +# +# This Action will scan dependency manifest files that change as part of a Pull Request, +# surfacing known-vulnerable versions of the packages declared or updated in the PR. +# Once installed, if the workflow run is marked as required, +# PRs introducing known-vulnerable packages will be blocked from merging. +# +# Source repository: https://github.com/actions/dependency-review-action +name: 'Dependency Review' +on: [pull_request] + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 + with: + egress-policy: audit + + - name: 'Checkout Repository' + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - name: 'Dependency Review' + uses: actions/dependency-review-action@da24556b548a50705dd671f47852072ea4c105d9 # v4 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index c8cb6ac2..cae1b40a 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -13,13 +13,21 @@ name: Check documentation - "**.rst" - "docs/**" +permissions: + contents: read + jobs: docs: name: Build documentation & check links runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-python@v4 + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 + with: + egress-policy: audit + + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: "3.11" @@ -39,7 +47,7 @@ jobs: TOXENV: docs - name: Upload documentation - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: docs path: docs/build diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index f62967b1..1b09dc62 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -6,14 +6,25 @@ on: - main - master +permissions: + contents: read + jobs: labeler: + permissions: + contents: read # for actions/checkout to fetch code + issues: write # for crazy-max/ghaction-github-labeler to create, rename, update and delete label runs-on: ubuntu-latest steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 + with: + egress-policy: audit + - name: Check out the repository - uses: actions/checkout@v2.3.3 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Run Labeler - uses: crazy-max/ghaction-github-labeler@v3.1.1 + uses: crazy-max/ghaction-github-labeler@24d110aa46a59976b8a7f35518cb7f14f434c916 # v5.3.0 with: skip-delete: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 208d1b3d..94ed5179 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -18,11 +18,16 @@ jobs: hashes: ${{ steps.hash.outputs.hashes }} steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 + with: + egress-policy: audit + - name: "Checkout repository" - uses: "actions/checkout@8f4b7f84864484a7bf31766abe9204da3cbe65b3" + uses: "actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683" - name: "Setup Python" - uses: "actions/setup-python@57ded4d7d5e986d7296eab16560982c6dd7c923b" + uses: "actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065" with: python-version: "3.x" @@ -40,7 +45,7 @@ jobs: cd dist && echo "::set-output name=hashes::$(sha256sum * | base64 -w0)" - name: "Upload dists" - uses: "actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce" + uses: "actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02" with: name: "dist" path: "dist/" @@ -53,7 +58,7 @@ jobs: actions: read contents: write id-token: write # Needed to access the workflow's OIDC identity. - uses: "slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v1.5.0" + uses: "slsa-framework/slsa-github-generator/.github/workflows/generator_generic_slsa3.yml@v2.1.0" with: base64-subjects: "${{ needs.build.outputs.hashes }}" upload-assets: true @@ -69,11 +74,16 @@ jobs: runs-on: "ubuntu-latest" steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 + with: + egress-policy: audit + - name: "Download dists" - uses: "actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a" + uses: "actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093" with: name: "dist" path: "dist/" - name: "Publish dists to PyPI" - uses: "pypa/gh-action-pypi-publish@48b317d84d5f59668bb13be49d1697e36b3ad009" + uses: "pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc" diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml new file mode 100644 index 00000000..686a4a9f --- /dev/null +++ b/.github/workflows/scorecards.yml @@ -0,0 +1,81 @@ +# This workflow uses actions that are not certified by GitHub. They are provided +# by a third-party and are governed by separate terms of service, privacy +# policy, and support documentation. + +name: Scorecard supply-chain security +on: + # For Branch-Protection check. Only the default branch is supported. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection + branch_protection_rule: + # To guarantee Maintained check is occasionally updated. See + # https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained + schedule: + - cron: '20 7 * * 2' + push: + branches: ["main"] + +# Declare default permissions as read only. +permissions: read-all + +jobs: + analysis: + name: Scorecard analysis + runs-on: ubuntu-latest + permissions: + # Needed to upload the results to code-scanning dashboard. + security-events: write + # Needed to publish results and get a badge (see publish_results below). + id-token: write + contents: read + actions: read + # To allow GraphQL ListCommits to work + issues: read + pull-requests: read + # To detect SAST tools + checks: read + + steps: + - name: Harden the runner (Audit all outbound calls) + uses: step-security/harden-runner@002fdce3c6a235733a90a27c80493a3241e56863 # v2.12.1 + with: + egress-policy: audit + + - name: "Checkout code" + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + persist-credentials: false + + - name: "Run analysis" + uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2 + with: + results_file: results.sarif + results_format: sarif + # (Optional) "write" PAT token. Uncomment the `repo_token` line below if: + # - you want to enable the Branch-Protection check on a *public* repository, or + # - you are installing Scorecards on a *private* repository + # To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat. + # repo_token: ${{ secrets.SCORECARD_TOKEN }} + + # Public repositories: + # - Publish results to OpenSSF REST API for easy access by consumers + # - Allows the repository to include the Scorecard badge. + # - See https://github.com/ossf/scorecard-action#publishing-results. + # For private repositories: + # - `publish_results` will always be set to `false`, regardless + # of the value entered here. + publish_results: true + + # Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF + # format to the repository Actions tab. + - name: "Upload artifact" + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: SARIF file + path: results.sarif + retention-days: 5 + + # Upload the results to GitHub's code scanning dashboard. + - name: "Upload to code-scanning" + uses: github/codeql-action/upload-sarif@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0 + with: + sarif_file: results.sarif diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 02b06dcf..12d23ed4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.6.0 + rev: v5.0.0 hooks: - id: check-added-large-files - id: check-toml @@ -9,25 +9,25 @@ repos: types: [yaml] - id: end-of-file-fixer types: [text] - stages: [commit, push, manual] + stages: [pre-commit, pre-push, manual] - id: trailing-whitespace types: [text] - stages: [commit, push, manual] + stages: [pre-commit, pre-push, manual] - repo: https://github.com/PyCQA/isort - rev: 5.13.2 + rev: 6.0.1 hooks: - id: isort - repo: https://github.com/psf/black - rev: 24.4.2 + rev: 25.1.0 hooks: - id: black - repo: https://github.com/asottile/pyupgrade - rev: v3.17.0 + rev: v3.20.0 hooks: - id: pyupgrade args: [--py37-plus] - repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.11.0 + rev: v1.16.0 hooks: - id: mypy additional_dependencies: @@ -39,7 +39,11 @@ repos: hooks: - id: gitlint - repo: https://github.com/asottile/setup-cfg-fmt - rev: v2.5.0 + rev: v2.8.0 hooks: - id: setup-cfg-fmt args: [--min-py3-version, '3.7'] + - repo: https://github.com/gitleaks/gitleaks + rev: v8.27.2 + hooks: + - id: gitleaks diff --git a/AUTHORS.rst b/AUTHORS.rst index 1946eda3..5aecba4e 100644 --- a/AUTHORS.rst +++ b/AUTHORS.rst @@ -226,3 +226,7 @@ Contributors - Thomas Buchner (@MrBatschner) - Chris Cotter (@ccotter) + +- Daniel Diniz (@devdanzin) + +- Jonas Brand (@8R0WNI3) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..fc20da2e --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,18 @@ +# Security Policy + +github3.py takes security seriously. Any vulnerability discovered in the +library will be addressed with best possible urgency. This is, however, +a passion project that I may not have enough time to spend in order to fix +a larger security issue in an expedient fashion. + +All reports will be responded to within 7 days. + +## Supported Versions + +The latest version is the only supported version for security reports. We do +not maintain branches for older versions or long term support releases. + +## Reporting a Vulnerability + +Please use the security tab on GitHub to report a vulnerability. If this is +insufficient, please use the email address for @sigmavirus24. diff --git a/docs/source/release-notes/4.1.0.rst b/docs/source/release-notes/4.1.0.rst new file mode 100644 index 00000000..85cc38ee --- /dev/null +++ b/docs/source/release-notes/4.1.0.rst @@ -0,0 +1,11 @@ +4.1.0: 2025-xx-xx +----------------- + +Features Added +`````````````` + +- Add support for multiple assignees for + :meth:`github3.issues.issue.Issue.close` and + :meth:`github3.issues.issue.Issue.reopen`. This prevents extra-assignees from + being unassigned if an issue is closed and allows re-opening the issue with + the same set of assignees. diff --git a/docs/source/release-notes/index.rst b/docs/source/release-notes/index.rst index 61337860..2ee96dc5 100644 --- a/docs/source/release-notes/index.rst +++ b/docs/source/release-notes/index.rst @@ -11,6 +11,7 @@ here with the newest releases first. .. toctree:: 4.0.0 4.0.1 + 4.1.0 3.x Release Series ================== diff --git a/src/github3/issues/issue.py b/src/github3/issues/issue.py index 6588ad4d..76db19b5 100644 --- a/src/github3/issues/issue.py +++ b/src/github3/issues/issue.py @@ -110,11 +110,18 @@ def close(self): bool """ assignee = self.assignee.login if self.assignee else "" + assignees = [a.login for a in self.assignees] number = self.milestone.number if self.milestone else None labels = [lbl.name for lbl in self.original_labels] return self.edit( - self.title, self.body, assignee, "closed", number, labels + self.title, + self.body, + assignee, + "closed", + number, + labels, + assignees, ) def comment(self, id_num): @@ -388,10 +395,11 @@ def reopen(self): bool """ assignee = self.assignee.login if self.assignee else "" + assignees = [a.login for a in self.assignees] number = self.milestone.number if self.milestone else None labels = [str(lbl) for lbl in self.original_labels] return self.edit( - self.title, self.body, assignee, "open", number, labels + self.title, self.body, assignee, "open", number, labels, assignees ) @requires_auth diff --git a/src/github3/repos/branch.py b/src/github3/repos/branch.py index 8ebaaeb7..8b941a57 100644 --- a/src/github3/repos/branch.py +++ b/src/github3/repos/branch.py @@ -166,17 +166,13 @@ def protect( def sync_with_upstream(self) -> t.Mapping[str, str]: """Synchronize this branch with the upstream. - .. warning:: - - This API endpoint is still in Beta per gitHub - .. versionadded:: 3.0.0 Sync a branch of a forked repository to keep it up-to-date with the upstream repository. See also: - https://docs.github.com/en/rest/reference/repos#sync-a-fork-branch-with-the-upstream-repository + https://docs.github.com/en/rest/branches/branches#sync-a-fork-branch-with-the-upstream-repository :returns: The dictionary described in the documentation @@ -185,7 +181,7 @@ def sync_with_upstream(self) -> t.Mapping[str, str]: """ base = self._api.split("/branches", 1)[0] url = self._build_url("merge-upstream", base_url=base) - json = self._json(self._post(url), 200) + json = self._json(self._post(url, data={"branch": self.name}), 200) return json @decorators.requires_auth diff --git a/src/github3/repos/repo.py b/src/github3/repos/repo.py index 89e99e76..212c023a 100644 --- a/src/github3/repos/repo.py +++ b/src/github3/repos/repo.py @@ -1392,6 +1392,24 @@ def create_tree(self, tree, base_tree=None): json = self._json(self._post(url, data=data), 201) return self._instance_or_null(git.Tree, json) + @decorators.requires_auth + def create_dispatch_event(self, event_type, client_payload=None): + """Create a dispatch event for this repository. + + :param str event_type: + (required), webhook event name + :param client_payload: + (optional), information about the webhook that may be used by the + workflow + :returns: + True if successful, False otherwise + :rtype: + """ + url = self._build_url("dispatches", base_url=self._api) + data = {"event_type": event_type, "client_payload": client_payload} + self._remove_none(data) + return self._boolean(self._post(url, data=data), 204, 404) + @decorators.requires_auth def delete(self): """Delete this repository. diff --git a/tests/cassettes/Branch_sync_with_upstream.json b/tests/cassettes/Branch_sync_with_upstream.json new file mode 100644 index 00000000..aacdb812 --- /dev/null +++ b/tests/cassettes/Branch_sync_with_upstream.json @@ -0,0 +1 @@ +{"http_interactions": [{"request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"User-Agent": ["github3.py/4.0.1"], "Accept-Encoding": ["gzip, deflate"], "Accept": ["application/vnd.github.v3.full+json"], "Connection": ["keep-alive"], "Accept-Charset": ["utf-8"], "Content-Type": ["application/json"], "Authorization": ["token "]}, "method": "GET", "uri": "https://api.github.com/repos/devdanzin/cpython"}, "response": {"body": {"encoding": "utf-8", "base64_string": "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", "string": ""}, "headers": {"Date": ["Thu, 17 Oct 2024 15:20:14 GMT"], "Content-Type": ["application/json; charset=utf-8"], "Cache-Control": ["private, max-age=60, s-maxage=60"], "Vary": ["Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With"], "ETag": ["W/\"8f47f7c7601f53b27d896470216b96e512d311317207af2dae3ff4692348f62f\""], "Last-Modified": ["Thu, 17 Oct 2024 14:13:30 GMT"], "github-authentication-token-expiration": ["2025-01-15 11:11:08 -0300"], "X-GitHub-Media-Type": ["github.v3; param=full; format=json"], "x-accepted-github-permissions": ["metadata=read"], "x-github-api-version-selected": ["2022-11-28"], "X-RateLimit-Limit": ["5000"], "X-RateLimit-Remaining": ["4996"], "X-RateLimit-Reset": ["1729181822"], "X-RateLimit-Used": ["4"], "X-RateLimit-Resource": ["core"], "Access-Control-Expose-Headers": ["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset"], "Access-Control-Allow-Origin": ["*"], "Strict-Transport-Security": ["max-age=31536000; includeSubdomains; preload"], "X-Frame-Options": ["deny"], "X-Content-Type-Options": ["nosniff"], "X-XSS-Protection": ["0"], "Referrer-Policy": ["origin-when-cross-origin, strict-origin-when-cross-origin"], "Content-Security-Policy": ["default-src 'none'"], "Content-Encoding": ["gzip"], "Transfer-Encoding": ["chunked"], "Server": ["github.com"], "X-GitHub-Request-Id": ["5820:26AC7A:4759A3:4BDA74:67112B2E"]}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/devdanzin/cpython"}, "recorded_at": "2024-10-17T15:20:14"}, {"request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"User-Agent": ["github3.py/4.0.1"], "Accept-Encoding": ["gzip, deflate"], "Accept": ["application/vnd.github.loki-preview+json"], "Connection": ["keep-alive"], "Accept-Charset": ["utf-8"], "Content-Type": ["application/json"], "Authorization": ["token "]}, "method": "GET", "uri": "https://api.github.com/repos/devdanzin/cpython/branches/main"}, "response": {"body": {"encoding": "utf-8", "base64_string": "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", "string": ""}, "headers": {"Date": ["Thu, 17 Oct 2024 15:20:14 GMT"], "Content-Type": ["application/json; charset=utf-8"], "Cache-Control": ["private, max-age=60, s-maxage=60"], "Vary": ["Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With"], "ETag": ["W/\"ff2877c6e7c6074caa640ac16bc243d0c41c49597a4972116cf3eebf0d5aaf68\""], "github-authentication-token-expiration": ["2025-01-15 11:11:08 -0300"], "X-GitHub-Media-Type": ["github.v3; param=loki-preview; format=json"], "x-accepted-github-permissions": ["contents=read"], "x-github-api-version-selected": ["2022-11-28"], "X-RateLimit-Limit": ["5000"], "X-RateLimit-Remaining": ["4995"], "X-RateLimit-Reset": ["1729181822"], "X-RateLimit-Used": ["5"], "X-RateLimit-Resource": ["core"], "Access-Control-Expose-Headers": ["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset"], "Access-Control-Allow-Origin": ["*"], "Strict-Transport-Security": ["max-age=31536000; includeSubdomains; preload"], "X-Frame-Options": ["deny"], "X-Content-Type-Options": ["nosniff"], "X-XSS-Protection": ["0"], "Referrer-Policy": ["origin-when-cross-origin, strict-origin-when-cross-origin"], "Content-Security-Policy": ["default-src 'none'"], "Content-Encoding": ["gzip"], "Transfer-Encoding": ["chunked"], "Server": ["github.com"], "X-GitHub-Request-Id": ["5820:26AC7A:4759F5:4BDAC4:67112B2E"]}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/devdanzin/cpython/branches/main"}, "recorded_at": "2024-10-17T15:20:14"}, {"request": {"body": {"encoding": "utf-8", "string": "{\"branch\": \"main\"}"}, "headers": {"User-Agent": ["github3.py/4.0.1"], "Accept-Encoding": ["gzip, deflate"], "Accept": ["application/vnd.github.v3.full+json"], "Connection": ["keep-alive"], "Accept-Charset": ["utf-8"], "Content-Type": ["application/json"], "Content-Length": ["18"], "Authorization": ["token "]}, "method": "POST", "uri": "https://api.github.com/repos/devdanzin/cpython/merge-upstream"}, "response": {"body": {"encoding": "utf-8", "base64_string": "H4sIAAAAAAAAA02MSwrDMAwFryK0bnuAXKMHCIotxYX4gywTTOjdq+6yfG+YuTBz77QzLvgeIfiQcRwThC0kjkAlglC3p1Q9SaNfojXDaN2UKUOblmpZMn3KCx+e051Xm+1fvIvONuq8bkolJIc3Eb8/6CBOGIgAAAA=", "string": ""}, "headers": {"Date": ["Thu, 17 Oct 2024 15:20:15 GMT"], "Content-Type": ["application/json; charset=utf-8"], "Cache-Control": ["private, max-age=60, s-maxage=60"], "Vary": ["Accept, Authorization, Cookie, X-GitHub-OTP,Accept-Encoding, Accept, X-Requested-With"], "ETag": ["W/\"5f066f9e4b594b308e099fe06dd359a6998faafa1d5d359df0e6a2e50d3b6de4\""], "github-authentication-token-expiration": ["2025-01-15 11:11:08 -0300"], "X-GitHub-Media-Type": ["github.v3; param=full; format=json"], "x-accepted-github-permissions": ["contents=write"], "x-github-api-version-selected": ["2022-11-28"], "X-RateLimit-Limit": ["5000"], "X-RateLimit-Remaining": ["4994"], "X-RateLimit-Reset": ["1729181822"], "X-RateLimit-Used": ["6"], "X-RateLimit-Resource": ["core"], "Access-Control-Expose-Headers": ["ETag, Link, Location, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Used, X-RateLimit-Resource, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval, X-GitHub-Media-Type, X-GitHub-SSO, X-GitHub-Request-Id, Deprecation, Sunset"], "Access-Control-Allow-Origin": ["*"], "Strict-Transport-Security": ["max-age=31536000; includeSubdomains; preload"], "X-Frame-Options": ["deny"], "X-Content-Type-Options": ["nosniff"], "X-XSS-Protection": ["0"], "Referrer-Policy": ["origin-when-cross-origin, strict-origin-when-cross-origin"], "Content-Security-Policy": ["default-src 'none'"], "Content-Encoding": ["gzip"], "Transfer-Encoding": ["chunked"], "Server": ["github.com"], "X-GitHub-Request-Id": ["5820:26AC7A:475A21:4BDAEF:67112B2E"]}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/devdanzin/cpython/merge-upstream"}, "recorded_at": "2024-10-17T15:20:15"}], "recorded_with": "betamax/0.9.0"} diff --git a/tests/cassettes/Issue_closed.json b/tests/cassettes/Issue_closed.json index c8fdbe95..5d15dfe9 100644 --- a/tests/cassettes/Issue_closed.json +++ b/tests/cassettes/Issue_closed.json @@ -1 +1 @@ -{"http_interactions": [{"request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"User-Agent": "github3.py/1.0.0a4", "Accept-Encoding": "gzip, deflate", "Accept": "application/vnd.github.v3.full+json", "Connection": "keep-alive", "Accept-Charset": "utf-8", "Content-Type": "application/json", "Authorization": "token "}, "method": "GET", "uri": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "response": {"body": {"encoding": "utf-8", "base64_string": "H4sIAAAAAAAAA+2WW2vbMBTHv4oRDDZII8uJ18RkHd3Yw6BQKN3LLqSyrThismQkOZ1r+t13JCdpcyEtWR/20DfbOuenv85NblGtBUrQ3NrKJBjTivcLbud12s9UiTWrlMGGFyVdcF2baIi71UG/ajA3pmYGx+EY9ZA35VbpZno8EjiCpkyYf2A8koU7WIslLdk9wOFMJZP2pfArHJDZ4gW5HQyoc1uKrVA8ys6z8sJzlJAoGofjOBr3kKzLlGmUQNJ6yHIrGGT/q7Ss0NRyJQPLjA1mSgcs55bLIqAy8IkGObVxri0SquAS/Lg1JSuptdm8lgUYuM1OB/GIhFEP0QW1VG9n0n80ZFlljpgp2F5aX3A1Xrp/XHwYAhBUdRRHRk7CoXJ1NIN3VB2O4o75TAmhboG0LX2zN/Zthte+ILV7hhAezQHfFis7ZxBFOJqr4IKbp8p3rzDv10L3GjvluSMZyINm+RHilp4g7VaCqtaPCY+sU5NpXrlCOiZ6G/7AU7qgkt/5wjyGB/4GMH40HXFO7wf+z+ntvUHvHFtcab6gWeNCpFnG+ALCfjR0iwBM21Sui7+57oQkcMumNC9dh86oMOx+NVRR8qP1LUqGZHQaRuET7XR4+nezFX+hpoFd3YQFDcu3TAkFkwKFESNhBss5m9Fa2LWiTkf8fjgYxTF5CR1cvonCSqtCM+OSthTEZfDo40oXo1k4THd1/fJtYd1JMqEMy8FEqOw3PHSxhKlmYOxKBiayFuLh3UB0wb3kAgaokuv19R2RwDEzzYCeTylEAkUhiU9IdEJG1+E4IQNIy3fYr67yvTYkToZREsXOphO3gwGTAUkIcSa0tnOlpyBXZdx3EGz5+fLi4vzT5dX59eUV2KQqb6ZuOsLSpDq7nnMT3HIhgpQF3RZB2gQwf4JJpnJ25u+Bfrfy9t0E+48TXJ2tWJb9cSc7ANpELP0Ou9xs+tz8lA8RSJvX+2j5r7Z3Ar3eR6/30foHDf8n99H9X7wfQpR2DAAA", "string": ""}, "headers": {"Date": "Wed, 20 Dec 2017 21:58:01 GMT", "Content-Type": "application/json; charset=utf-8", "Transfer-Encoding": "chunked", "Server": "GitHub.com", "Status": "200 OK", "X-RateLimit-Limit": "5000", "X-RateLimit-Remaining": "4994", "X-RateLimit-Reset": "1513807760", "Cache-Control": "private, max-age=60, s-maxage=60", "Vary": "Accept, Authorization, Cookie, X-GitHub-OTP", "ETag": "W/\"d504ec810dda9aa826cf32f81eb61972\"", "Last-Modified": "Fri, 10 Nov 2017 14:34:03 GMT", "X-OAuth-Scopes": "admin:org, delete_repo, repo", "X-Accepted-OAuth-Scopes": "repo", "X-GitHub-Media-Type": "github.v3; param=full; format=json", "Access-Control-Expose-Headers": "ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "default-src 'none'", "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "deny", "X-XSS-Protection": "1; mode=block", "X-Runtime-rack": "0.094360", "Content-Encoding": "gzip", "X-GitHub-Request-Id": "C791:1E7F:E17A98:10E8464:5A3ADCE9"}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "recorded_at": "2017-12-20T21:58:01"}, {"request": {"body": {"encoding": "utf-8", "string": "{\"title\": \"Integration test for editing an issue\", \"body\": \"This will be closed by the `issue.closed()`\\n\", \"assignee\": \"\", \"state\": \"closed\", \"labels\": [\"Easy\", \"in progress\"]}"}, "headers": {"User-Agent": "github3.py/1.0.0a4", "Accept-Encoding": "gzip, deflate", "Accept": "application/vnd.github.v3.full+json", "Connection": "keep-alive", "Accept-Charset": "utf-8", "Content-Type": "application/json", "Authorization": "token ", "Content-Length": "177"}, "method": "PATCH", "uri": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "response": {"body": {"encoding": "utf-8", "base64_string": "H4sIAAAAAAAAA+2WW2vbMBTHv4oRDDbIIsuJ18RkHd3Yw6BQKNnLLqSyrThismQkOZ1n+t13JCdpcyEtWR/20DfbOuenv85NblGtBUrQwtrKJBjTivcLbhd12s9UiTWrlMGGFyVdcl2baIi71UG/ajA3pmYGx+EY9ZA35VbpZnY6EjiCpkyYf2A8kIU7WIslLdkdwOFMJZP2ufBrHJDZ8hm5HQyoC1uKnVA8yM6T8sJzlJAoGofjOBr3kKzLlGmUQNJ6yHIrGGT/i7Ss0NRyJQPLjA3mSgcs55bLIqAy8IkGObVxri0SquAS/Lg1JSuptdmilgUYuM3OBvGIhFEP0SW1VO9m0n80ZFVljpgp2F5aX3A1Xrl/WL4fAhBUdRRHRk7CsXJ1NIP3VB2P4p75XAmhboG0K327Nw5thje+ILV7hhCezAHfFiu7YBBFOJqr4IKbx8r3oDDv10L3GjvjuSMZyINm+QniVp4g7VaCqtaPCY+sU5NpXrlCOiV6W/7AU7qgkv/xhXkKD/wNYPxoOuGc3g/8n9LbB4PeOba40nxJs8aFSLOM8SWE/WToDgGYtqlcF3913QlJ4JbNaF66Dp1TYdjdeqii5HvrW5QMyegsjMJH2un49O9mK/5MTQO7ugkLGlZvmRIKJgUKI0bCDJZzNqe1sBtFnY743XAwimPyHDq4fBWFlVaFZsYlbSWIy+DBx7UuRrNwmO7r+unbwrqTZEIZloOJUNkveOhiCVPNwNiVDExkLcT9u4HognvJBQxQJTfrmzsigWNmmgE9n1GIBIpCEr8l0VsymobjhAwgLd9gv7rKt2zOnE0UTiOSxKMkjJxNJ24PQ+JkQBJCnAmt7ULpGchVGfcdBFt+urq8vPh4dX0xvboGm1TlzcxNR1iaVOfTBTfBLRciSFnQbRGkTQDzJ5hkKmfn/h7odyuv30yw/zjB1fmaZdlvd7IjoG3Eyu+4y822z80PeR+BtHm5j1b/agcn0Mt99HIfbX7Q8H9yH939BaEm/gh2DAAA", "string": ""}, "headers": {"Date": "Wed, 20 Dec 2017 21:58:02 GMT", "Content-Type": "application/json; charset=utf-8", "Transfer-Encoding": "chunked", "Server": "GitHub.com", "Status": "200 OK", "X-RateLimit-Limit": "5000", "X-RateLimit-Remaining": "4993", "X-RateLimit-Reset": "1513807760", "Cache-Control": "private, max-age=60, s-maxage=60", "Vary": "Accept, Authorization, Cookie, X-GitHub-OTP", "ETag": "W/\"a8bbefe768d759477b6df6a628089e23\"", "X-OAuth-Scopes": "admin:org, delete_repo, repo", "X-Accepted-OAuth-Scopes": "", "X-GitHub-Media-Type": "github.v3; param=full; format=json", "Access-Control-Expose-Headers": "ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "default-src 'none'", "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "deny", "X-XSS-Protection": "1; mode=block", "X-Runtime-rack": "0.209756", "Content-Encoding": "gzip", "X-GitHub-Request-Id": "C791:1E7F:E17AC1:10E848A:5A3ADCE9"}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "recorded_at": "2017-12-20T21:58:02"}], "recorded_with": "betamax/0.8.0"} +{"http_interactions": [{"request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"User-Agent": "github3.py/1.0.0a4", "Accept-Encoding": "gzip, deflate", "Accept": "application/vnd.github.v3.full+json", "Connection": "keep-alive", "Accept-Charset": "utf-8", "Content-Type": "application/json", "Authorization": "token "}, "method": "GET", "uri": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "response": {"body": {"encoding": "utf-8", "base64_string": "H4sIAAAAAAAAA+2WW2vbMBTHv4oRDDZII8uJ18RkHd3Yw6BQKN3LLqSyrThismQkOZ1r+t13JCdpcyEtWR/20DfbOuenv85NblGtBUrQ3NrKJBjTivcLbud12s9UiTWrlMGGFyVdcF2baIi71UG/ajA3pmYGx+EY9ZA35VbpZno8EjiCpkyYf2A8koU7WIslLdk9wOFMJZP2pfArHJDZ4gW5HQyoc1uKrVA8ys6z8sJzlJAoGofjOBr3kKzLlGmUQNJ6yHIrGGT/q7Ss0NRyJQPLjA1mSgcs55bLIqAy8IkGObVxri0SquAS/Lg1JSuptdm8lgUYuM1OB/GIhFEP0QW1VG9n0n80ZFlljpgp2F5aX3A1Xrp/XHwYAhBUdRRHRk7CoXJ1NIN3VB2O4o75TAmhboG0LX2zN/Zthte+ILV7hhAezQHfFis7ZxBFOJqr4IKbp8p3rzDv10L3GjvluSMZyINm+RHilp4g7VaCqtaPCY+sU5NpXrlCOiZ6G/7AU7qgkt/5wjyGB/4GMH40HXFO7wf+z+ntvUHvHFtcab6gWeNCpFnG+ALCfjR0iwBM21Sui7+57oQkcMumNC9dh86oMOx+NVRR8qP1LUqGZHQaRuET7XR4+nezFX+hpoFd3YQFDcu3TAkFkwKFESNhBss5m9Fa2LWiTkf8fjgYxTF5CR1cvonCSqtCM+OSthTEZfDo40oXo1k4THd1/fJtYd1JMqEMy8FEqOw3PHSxhKlmYOxKBiayFuLh3UB0wb3kAgaokuv19R2RwDEzzYCeTylEAkUhiU9IdEJG1+E4IQNIy3fYr67yvTYkToZREsXOphO3gwGTAUkIcSa0tnOlpyBXZdx3EGz5+fLi4vzT5dX59eUV2KQqb6ZuOsLSpDq7nnMT3HIhgpQF3RZB2gQwf4JJpnJ25u+Bfrfy9t0E+48TXJ2tWJb9cSc7ANpELP0Ou9xs+tz8lA8RSJvX+2j5r7Z3Ar3eR6/30foHDf8n99H9X7wfQpR2DAAA", "string": ""}, "headers": {"Date": "Wed, 20 Dec 2017 21:58:01 GMT", "Content-Type": "application/json; charset=utf-8", "Transfer-Encoding": "chunked", "Server": "GitHub.com", "Status": "200 OK", "X-RateLimit-Limit": "5000", "X-RateLimit-Remaining": "4994", "X-RateLimit-Reset": "1513807760", "Cache-Control": "private, max-age=60, s-maxage=60", "Vary": "Accept, Authorization, Cookie, X-GitHub-OTP", "ETag": "W/\"d504ec810dda9aa826cf32f81eb61972\"", "Last-Modified": "Fri, 10 Nov 2017 14:34:03 GMT", "X-OAuth-Scopes": "admin:org, delete_repo, repo", "X-Accepted-OAuth-Scopes": "repo", "X-GitHub-Media-Type": "github.v3; param=full; format=json", "Access-Control-Expose-Headers": "ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "default-src 'none'", "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "deny", "X-XSS-Protection": "1; mode=block", "X-Runtime-rack": "0.094360", "Content-Encoding": "gzip", "X-GitHub-Request-Id": "C791:1E7F:E17A98:10E8464:5A3ADCE9"}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "recorded_at": "2017-12-20T21:58:01"}, {"request": {"body": {"encoding": "utf-8", "string": "{\"title\": \"Integration test for editing an issue\", \"body\": \"This will be closed by the `issue.closed()`\\n\", \"assignee\": \"\", \"state\": \"closed\", \"labels\": [\"Easy\", \"in progress\"], \"assignees\": []}"}, "headers": {"User-Agent": "github3.py/1.0.0a4", "Accept-Encoding": "gzip, deflate", "Accept": "application/vnd.github.v3.full+json", "Connection": "keep-alive", "Accept-Charset": "utf-8", "Content-Type": "application/json", "Authorization": "token ", "Content-Length": "177"}, "method": "PATCH", "uri": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "response": {"body": {"encoding": "utf-8", "base64_string": "H4sIAAAAAAAAA+2WW2vbMBTHv4oRDDbIIsuJ18RkHd3Yw6BQKNnLLqSyrThismQkOZ1n+t13JCdpcyEtWR/20DfbOuenv85NblGtBUrQwtrKJBjTivcLbhd12s9UiTWrlMGGFyVdcl2baIi71UG/ajA3pmYGx+EY9ZA35VbpZnY6EjiCpkyYf2A8kIU7WIslLdkdwOFMJZP2ufBrHJDZ8hm5HQyoC1uKnVA8yM6T8sJzlJAoGofjOBr3kKzLlGmUQNJ6yHIrGGT/i7Ss0NRyJQPLjA3mSgcs55bLIqAy8IkGObVxri0SquAS/Lg1JSuptdmilgUYuM3OBvGIhFEP0SW1VO9m0n80ZFVljpgp2F5aX3A1Xrl/WL4fAhBUdRRHRk7CsXJ1NIP3VB2P4p75XAmhboG0K327Nw5thje+ILV7hhCezAHfFiu7YBBFOJqr4IKbx8r3oDDv10L3GjvjuSMZyINm+QniVp4g7VaCqtaPCY+sU5NpXrlCOiV6W/7AU7qgkv/xhXkKD/wNYPxoOuGc3g/8n9LbB4PeOba40nxJs8aFSLOM8SWE/WToDgGYtqlcF3913QlJ4JbNaF66Dp1TYdjdeqii5HvrW5QMyegsjMJH2un49O9mK/5MTQO7ugkLGlZvmRIKJgUKI0bCDJZzNqe1sBtFnY743XAwimPyHDq4fBWFlVaFZsYlbSWIy+DBx7UuRrNwmO7r+unbwrqTZEIZloOJUNkveOhiCVPNwNiVDExkLcT9u4HognvJBQxQJTfrmzsigWNmmgE9n1GIBIpCEr8l0VsymobjhAwgLd9gv7rKt2zOnE0UTiOSxKMkjJxNJ24PQ+JkQBJCnAmt7ULpGchVGfcdBFt+urq8vPh4dX0xvboGm1TlzcxNR1iaVOfTBTfBLRciSFnQbRGkTQDzJ5hkKmfn/h7odyuv30yw/zjB1fmaZdlvd7IjoG3Eyu+4y822z80PeR+BtHm5j1b/agcn0Mt99HIfbX7Q8H9yH939BaEm/gh2DAAA", "string": ""}, "headers": {"Date": "Wed, 20 Dec 2017 21:58:02 GMT", "Content-Type": "application/json; charset=utf-8", "Transfer-Encoding": "chunked", "Server": "GitHub.com", "Status": "200 OK", "X-RateLimit-Limit": "5000", "X-RateLimit-Remaining": "4993", "X-RateLimit-Reset": "1513807760", "Cache-Control": "private, max-age=60, s-maxage=60", "Vary": "Accept, Authorization, Cookie, X-GitHub-OTP", "ETag": "W/\"a8bbefe768d759477b6df6a628089e23\"", "X-OAuth-Scopes": "admin:org, delete_repo, repo", "X-Accepted-OAuth-Scopes": "", "X-GitHub-Media-Type": "github.v3; param=full; format=json", "Access-Control-Expose-Headers": "ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "default-src 'none'", "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "deny", "X-XSS-Protection": "1; mode=block", "X-Runtime-rack": "0.209756", "Content-Encoding": "gzip", "X-GitHub-Request-Id": "C791:1E7F:E17AC1:10E848A:5A3ADCE9"}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "recorded_at": "2017-12-20T21:58:02"}], "recorded_with": "betamax/0.8.0"} diff --git a/tests/cassettes/Issue_reopen.json b/tests/cassettes/Issue_reopen.json index 4941eacb..6334d30a 100644 --- a/tests/cassettes/Issue_reopen.json +++ b/tests/cassettes/Issue_reopen.json @@ -1 +1 @@ -{"http_interactions": [{"request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"User-Agent": "github3.py/1.0.0a4", "Accept-Encoding": "gzip, deflate", "Accept": "application/vnd.github.v3.full+json", "Connection": "keep-alive", "Accept-Charset": "utf-8", "Content-Type": "application/json", "Authorization": "token "}, "method": "GET", "uri": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "response": {"body": {"encoding": "utf-8", "base64_string": "H4sIAAAAAAAAA+2WXW+bMBSG/wriapPSGEiyNijr1O1qUqVKVXazD6UGHLBmbGQf0jGU/75jk6ZNGmUV68Uucgf4vM85Pl+i9Wst/NgvACoTE0IrPsw5FHUyTFVJNKuUIYbnJV1xXZtoTLrT0bBqCDemZoZMgqk/8J0pB6WbRX8kcgRNmDD/wHgSFulgLZG0ZGuE451KJuG18A84JLPVK3I7GFILKMVeKp5U50V14Zkfh1E0DaaTaDrwZV0mTPsxFm3gAwfBsPqfJbBcU+BKesAMeEulPZZx4DL3qPRcoTGc2lhp6wuVc4k6DqZkJQVIi1rmaGCdnY8mF2EQDXy6okD1fiXdRxNuuswSU4XuJbiGq8lG/mH1foxAjKqjWLJvQzjWrpZmyLOojmfxmflSCaHukbQf+u5sHHJGtloMtXvGFPbmoLYlCgqGWcSr2Q7Ouflb+x4MzOlanF4DC55ZksE6aJb1CG6jxNDuJUbVujXhkHViUs0r20h9srejR57SOZX8t2vMPjzUG8S41dTjnk6H+pfM9sGkd8KWVJqvaNrYFGmWMr7CtPeG7hGQCU1lp/iLnU4sAge2oFlpJ3RJhWHrh6Xqx99+uLqDNU+FMixDgVDpT3zojHFsDe4VydBE1kI8vptOXnKBG0LJ7fl2CcYRLljNkJ4tKKCHKAgnZ2F0Fl7Mg2kcjuJw/BX91VW2Y3NubaJgHkVx8C4ej6xNF9wzTDiJR2EchtaE1lAovcBwVcpdi6DLTzfX11cfb26v5je3aJOorFnY8cejWXU5L7jx7rkQXsK8zoWXNB4OmDdLVcYu3aIbdidv3s6I+zgj1eUDC9gve7MjoF3ERndccrerufsuHzOQNKeFu/kZOThip4V7WrjbPxDynyzc9R+UTw66VwsAAA==", "string": ""}, "headers": {"Date": "Wed, 20 Dec 2017 22:07:45 GMT", "Content-Type": "application/json; charset=utf-8", "Transfer-Encoding": "chunked", "Server": "GitHub.com", "Status": "200 OK", "X-RateLimit-Limit": "5000", "X-RateLimit-Remaining": "4979", "X-RateLimit-Reset": "1513807760", "Cache-Control": "private, max-age=60, s-maxage=60", "Vary": "Accept, Authorization, Cookie, X-GitHub-OTP", "ETag": "W/\"f31717830cbe7be8b4a608040947fde6\"", "Last-Modified": "Wed, 20 Dec 2017 22:06:43 GMT", "X-OAuth-Scopes": "admin:org, delete_repo, repo", "X-Accepted-OAuth-Scopes": "repo", "X-GitHub-Media-Type": "github.v3; param=full; format=json", "Access-Control-Expose-Headers": "ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "default-src 'none'", "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "deny", "X-XSS-Protection": "1; mode=block", "X-Runtime-rack": "0.069380", "Content-Encoding": "gzip", "X-GitHub-Request-Id": "C906:1E82:1DFBA8B:23B1763:5A3ADF31"}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "recorded_at": "2017-12-20T22:07:45"}, {"request": {"body": {"encoding": "utf-8", "string": "{\"title\": \"Integration test for editing an issue\", \"body\": \"This will be closed by the `issue.closed()`\\n\", \"assignee\": \"\", \"state\": \"open\", \"labels\": []}"}, "headers": {"User-Agent": "github3.py/1.0.0a4", "Accept-Encoding": "gzip, deflate", "Accept": "application/vnd.github.v3.full+json", "Connection": "keep-alive", "Accept-Charset": "utf-8", "Content-Type": "application/json", "Authorization": "token ", "Content-Length": "154"}, "method": "PATCH", "uri": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "response": {"body": {"encoding": "utf-8", "base64_string": "H4sIAAAAAAAAA+2WXW+bMBSG/wriapPSGGiiNCjr1O1qUqVKVXazD6UGXLBmbGQf0jGU/75jQ7ImjbKK9WIXvUvgvI9fny/R+rUWfuwXAJWJCaEVH+ccijoZp6okmlXKEMPzkq65rk00Id3b83HVEG5MzQyZBnN/5LtQDko3q+FI5AiaMGH+gfHIFulgLZG0ZBuE451KJuGl8Fscktn6BbkdDKkFlOIgFY+q86y68MyPwyiaB/NpNB/5si4Tpv0YizbygYNgWP1PEliuKXAlPWAGvHulPZZx4DL3qPRcodFObay09YXKuUQdB1OykgKkRS1zDLCHzc6nF2EQjXy6pkD1YSXdQxP2XWaJqcLjJbiGq0kvf79+N0EguuooluxbC6fa1dIMeeLqdBafhN8rIdQDkg6t78/GscPITotWu9+YwsEc1LZEQcEwi3g128E5N39r36PGnK7F6TWw4pklGayDZtkAc70SrT1IdNW6NeGQdWJSzSvbSEOyt6dHntI5lfyXa8whPNQbxLjVNOCeTof658z20aR3wpZUmq9p2tgUaZYyvsa0D4YeEJAJTWWn+LOdTiwCB7aiWWkn9J4KwzbbperHX7+7uoMNVxWTGC5U+oPhcLlQHFqDW0UyDJC1EH/+m05ccoH7Qcnd+90KjCNcr5ohO1tRQH4UhNOzMDoLL5bBPA7P43DyBc+rq2wvZmZjomAZRXEwiydTG5MKZXpM76KGQukVmlMpd+2AB3y8ub6++nBze7W8uUVRorJmZUcdXy2qy2XBjffAhfAS5nVAL2k8HCZvkaqMXbqlNu7evHm7IO7hglSXWxawn/YeJ0D7iF53WnK3r7n7ZmvQ3zdpXpdr/+FxdJxel+vrct19bZD/ZLlufgMvTIX5QwsAAA==", "string": ""}, "headers": {"Date": "Wed, 20 Dec 2017 22:07:45 GMT", "Content-Type": "application/json; charset=utf-8", "Transfer-Encoding": "chunked", "Server": "GitHub.com", "Status": "200 OK", "X-RateLimit-Limit": "5000", "X-RateLimit-Remaining": "4978", "X-RateLimit-Reset": "1513807760", "Cache-Control": "private, max-age=60, s-maxage=60", "Vary": "Accept, Authorization, Cookie, X-GitHub-OTP", "ETag": "W/\"6532805b54db37bdf0d45b91b28c3ab8\"", "X-OAuth-Scopes": "admin:org, delete_repo, repo", "X-Accepted-OAuth-Scopes": "", "X-GitHub-Media-Type": "github.v3; param=full; format=json", "Access-Control-Expose-Headers": "ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "default-src 'none'", "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "deny", "X-XSS-Protection": "1; mode=block", "X-Runtime-rack": "0.229646", "Content-Encoding": "gzip", "X-GitHub-Request-Id": "C906:1E82:1DFBAAA:23B1788:5A3ADF31"}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "recorded_at": "2017-12-20T22:07:46"}], "recorded_with": "betamax/0.8.0"} +{"http_interactions": [{"request": {"body": {"encoding": "utf-8", "string": ""}, "headers": {"User-Agent": "github3.py/1.0.0a4", "Accept-Encoding": "gzip, deflate", "Accept": "application/vnd.github.v3.full+json", "Connection": "keep-alive", "Accept-Charset": "utf-8", "Content-Type": "application/json", "Authorization": "token "}, "method": "GET", "uri": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "response": {"body": {"encoding": "utf-8", "base64_string": "H4sIAAAAAAAAA+2WXW+bMBSG/wriapPSGEiyNijr1O1qUqVKVXazD6UGHLBmbGQf0jGU/75jk6ZNGmUV68Uucgf4vM85Pl+i9Wst/NgvACoTE0IrPsw5FHUyTFVJNKuUIYbnJV1xXZtoTLrT0bBqCDemZoZMgqk/8J0pB6WbRX8kcgRNmDD/wHgSFulgLZG0ZGuE451KJuG18A84JLPVK3I7GFILKMVeKp5U50V14Zkfh1E0DaaTaDrwZV0mTPsxFm3gAwfBsPqfJbBcU+BKesAMeEulPZZx4DL3qPRcoTGc2lhp6wuVc4k6DqZkJQVIi1rmaGCdnY8mF2EQDXy6okD1fiXdRxNuuswSU4XuJbiGq8lG/mH1foxAjKqjWLJvQzjWrpZmyLOojmfxmflSCaHukbQf+u5sHHJGtloMtXvGFPbmoLYlCgqGWcSr2Q7Ouflb+x4MzOlanF4DC55ZksE6aJb1CG6jxNDuJUbVujXhkHViUs0r20h9srejR57SOZX8t2vMPjzUG8S41dTjnk6H+pfM9sGkd8KWVJqvaNrYFGmWMr7CtPeG7hGQCU1lp/iLnU4sAge2oFlpJ3RJhWHrh6Xqx99+uLqDNU+FMixDgVDpT3zojHFsDe4VydBE1kI8vptOXnKBG0LJ7fl2CcYRLljNkJ4tKKCHKAgnZ2F0Fl7Mg2kcjuJw/BX91VW2Y3NubaJgHkVx8C4ej6xNF9wzTDiJR2EchtaE1lAovcBwVcpdi6DLTzfX11cfb26v5je3aJOorFnY8cejWXU5L7jx7rkQXsK8zoWXNB4OmDdLVcYu3aIbdidv3s6I+zgj1eUDC9gve7MjoF3ERndccrerufsuHzOQNKeFu/kZOThip4V7WrjbPxDynyzc9R+UTw66VwsAAA==", "string": ""}, "headers": {"Date": "Wed, 20 Dec 2017 22:07:45 GMT", "Content-Type": "application/json; charset=utf-8", "Transfer-Encoding": "chunked", "Server": "GitHub.com", "Status": "200 OK", "X-RateLimit-Limit": "5000", "X-RateLimit-Remaining": "4979", "X-RateLimit-Reset": "1513807760", "Cache-Control": "private, max-age=60, s-maxage=60", "Vary": "Accept, Authorization, Cookie, X-GitHub-OTP", "ETag": "W/\"f31717830cbe7be8b4a608040947fde6\"", "Last-Modified": "Wed, 20 Dec 2017 22:06:43 GMT", "X-OAuth-Scopes": "admin:org, delete_repo, repo", "X-Accepted-OAuth-Scopes": "repo", "X-GitHub-Media-Type": "github.v3; param=full; format=json", "Access-Control-Expose-Headers": "ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "default-src 'none'", "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "deny", "X-XSS-Protection": "1; mode=block", "X-Runtime-rack": "0.069380", "Content-Encoding": "gzip", "X-GitHub-Request-Id": "C906:1E82:1DFBA8B:23B1763:5A3ADF31"}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "recorded_at": "2017-12-20T22:07:45"}, {"request": {"body": {"encoding": "utf-8", "string": "{\"title\": \"Integration test for editing an issue\", \"body\": \"This will be closed by the `issue.closed()`\\n\", \"assignee\": \"\", \"state\": \"open\", \"labels\": [], \"assignees\": []}"}, "headers": {"User-Agent": "github3.py/1.0.0a4", "Accept-Encoding": "gzip, deflate", "Accept": "application/vnd.github.v3.full+json", "Connection": "keep-alive", "Accept-Charset": "utf-8", "Content-Type": "application/json", "Authorization": "token ", "Content-Length": "154"}, "method": "PATCH", "uri": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "response": {"body": {"encoding": "utf-8", "base64_string": "H4sIAAAAAAAAA+2WXW+bMBSG/wriapPSGGiiNCjr1O1qUqVKVXazD6UGXLBmbGQf0jGU/75jQ7ImjbKK9WIXvUvgvI9fny/R+rUWfuwXAJWJCaEVH+ccijoZp6okmlXKEMPzkq65rk00Id3b83HVEG5MzQyZBnN/5LtQDko3q+FI5AiaMGH+gfHIFulgLZG0ZBuE451KJuGl8Fscktn6BbkdDKkFlOIgFY+q86y68MyPwyiaB/NpNB/5si4Tpv0YizbygYNgWP1PEliuKXAlPWAGvHulPZZx4DL3qPRcodFObay09YXKuUQdB1OykgKkRS1zDLCHzc6nF2EQjXy6pkD1YSXdQxP2XWaJqcLjJbiGq0kvf79+N0EguuooluxbC6fa1dIMeeLqdBafhN8rIdQDkg6t78/GscPITotWu9+YwsEc1LZEQcEwi3g128E5N39r36PGnK7F6TWw4pklGayDZtkAc70SrT1IdNW6NeGQdWJSzSvbSEOyt6dHntI5lfyXa8whPNQbxLjVNOCeTof658z20aR3wpZUmq9p2tgUaZYyvsa0D4YeEJAJTWWn+LOdTiwCB7aiWWkn9J4KwzbbperHX7+7uoMNVxWTGC5U+oPhcLlQHFqDW0UyDJC1EH/+m05ccoH7Qcnd+90KjCNcr5ohO1tRQH4UhNOzMDoLL5bBPA7P43DyBc+rq2wvZmZjomAZRXEwiydTG5MKZXpM76KGQukVmlMpd+2AB3y8ub6++nBze7W8uUVRorJmZUcdXy2qy2XBjffAhfAS5nVAL2k8HCZvkaqMXbqlNu7evHm7IO7hglSXWxawn/YeJ0D7iF53WnK3r7n7ZmvQ3zdpXpdr/+FxdJxel+vrct19bZD/ZLlufgMvTIX5QwsAAA==", "string": ""}, "headers": {"Date": "Wed, 20 Dec 2017 22:07:45 GMT", "Content-Type": "application/json; charset=utf-8", "Transfer-Encoding": "chunked", "Server": "GitHub.com", "Status": "200 OK", "X-RateLimit-Limit": "5000", "X-RateLimit-Remaining": "4978", "X-RateLimit-Reset": "1513807760", "Cache-Control": "private, max-age=60, s-maxage=60", "Vary": "Accept, Authorization, Cookie, X-GitHub-OTP", "ETag": "W/\"6532805b54db37bdf0d45b91b28c3ab8\"", "X-OAuth-Scopes": "admin:org, delete_repo, repo", "X-Accepted-OAuth-Scopes": "", "X-GitHub-Media-Type": "github.v3; param=full; format=json", "Access-Control-Expose-Headers": "ETag, Link, Retry-After, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval", "Access-Control-Allow-Origin": "*", "Content-Security-Policy": "default-src 'none'", "Strict-Transport-Security": "max-age=31536000; includeSubdomains; preload", "X-Content-Type-Options": "nosniff", "X-Frame-Options": "deny", "X-XSS-Protection": "1; mode=block", "X-Runtime-rack": "0.229646", "Content-Encoding": "gzip", "X-GitHub-Request-Id": "C906:1E82:1DFBAAA:23B1788:5A3ADF31"}, "status": {"code": 200, "message": "OK"}, "url": "https://api.github.com/repos/sigmavirus24/github3.py/issues/509"}, "recorded_at": "2017-12-20T22:07:46"}], "recorded_with": "betamax/0.8.0"} diff --git a/tests/integration/test_repos_branch.py b/tests/integration/test_repos_branch.py index 63aef805..c77d1e80 100644 --- a/tests/integration/test_repos_branch.py +++ b/tests/integration/test_repos_branch.py @@ -33,3 +33,22 @@ def test_latest_sha_differs(self): latest_sha = branch.latest_sha(differs_from=sha) assert not isinstance(latest_sha, bytes) + + def test_sync_with_upstream(self): + self.token_login() + cassette_name = self.cassette_name("sync_with_upstream") + betamax_kwargs = { + "match_requests_on": ["method", "uri", "if-none-match"] + } + with self.recorder.use_cassette(cassette_name, **betamax_kwargs): + repository = self.gh.repository("devdanzin", "cpython") + branch = repository.branch("main") + result = branch.sync_with_upstream() + + msg = ( + "Successfully fetched and fast-forwarded" + " from upstream python:main." + ) + assert result["message"] == msg + assert result["merge_type"] == "fast-forward" + assert result["base_branch"] == "python:main" diff --git a/tests/unit/test_issues_issue.py b/tests/unit/test_issues_issue.py index e1b12256..9c46d840 100644 --- a/tests/unit/test_issues_issue.py +++ b/tests/unit/test_issues_issue.py @@ -114,6 +114,7 @@ def test_close(self): """Verify the request for closing an issue.""" self.instance.close() labels = [label.name for label in self.instance.original_labels] + assignees = [a.login for a in self.instance.assignees] self.patch_called_with( url_for(), @@ -124,6 +125,7 @@ def test_close(self): "milestone": self.instance.milestone.number or "", "state": "closed", "title": self.instance.title, + "assignees": assignees, }, ) @@ -292,6 +294,7 @@ def test_remove_lock(self): def test_reopen(self): """Test the request for reopening an issue.""" labels = [str(label) for label in self.instance.original_labels] + assignees = [a.login for a in self.instance.assignees] with unittest.mock.patch.object(Issue, "edit") as edit: self.instance.reopen() edit.assert_called_once_with( @@ -301,6 +304,7 @@ def test_reopen(self): "open", self.instance.milestone.number, labels, + assignees, ) def test_replace_labels(self): diff --git a/tests/unit/test_repos_branch.py b/tests/unit/test_repos_branch.py index f381e200..72580a35 100644 --- a/tests/unit/test_repos_branch.py +++ b/tests/unit/test_repos_branch.py @@ -11,6 +11,9 @@ url_for_commits = helper.create_url_helper( "https://api.github.com/repos/octocat/Hello-World/commits/master" ) +url_for_sync = helper.create_url_helper( + "https://api.github.com/repos/octocat/Hello-World/merge-upstream" +) class TestBranch(helper.UnitHelper): @@ -30,6 +33,13 @@ def test_latest_sha(self): url_for_commits(), headers=headers ) + def test_sync_with_upstream(self): + """Verify the request fot syncing a branch with upstream.""" + self.instance.sync_with_upstream() + self.session.post.assert_called_once_with( + url_for_sync(), '{"branch": "master"}' + ) + def test_unprotect(self): """Verify the request to unprotect a branch.""" self.instance.unprotect() @@ -44,6 +54,10 @@ class TestBranchRequiresAuth(helper.UnitRequiresAuthenticationHelper): described_class = github3.repos.branch.Branch example_data = get_example_data() + def test_sync_with_upstream(self): + """Verify that branch syncing with upstream requires authentication.""" + self.assert_requires_auth(self.instance.sync_with_upstream) + def test_protect(self): """Verify that protecting a branch requires authentication.""" self.assert_requires_auth(self.instance.protect) diff --git a/tox.ini b/tox.ini index 0124dabe..283a7c23 100644 --- a/tox.ini +++ b/tox.ini @@ -81,7 +81,7 @@ commands = # rst-lint is really only valuable for non-Sphinx reStructuredText, see also: # https://github.com/twolfson/restructuredtext-lint/blob/65ce9d6c7768ef9135c1d3ee4a1ae8c7bf89d92f/README.rst#sphinx deps = - doc8 >= 0.10.1 + doc8 >= 0.10.1, != 1.1.2 proselint >= 0.13.0 pygments restructuredtext_lint