diff --git a/COMPATIBILITY.md b/COMPATIBILITY.md index 6da7a5e8..4d45c271 100644 --- a/COMPATIBILITY.md +++ b/COMPATIBILITY.md @@ -61,6 +61,7 @@ In case you find any error, please [create a new issue](https://github.com/packi | `add_group` | ✘ | ✘ | ✔ | | `remove_group` | ✘ | ✘ | ✔ | | `which_groups_can_merge_pr` | ✘ | ✘ | ✔ | +| `get_pr_files_diff` | ✘ | ✘ | ✔ | ## User diff --git a/ogr/abstract.py b/ogr/abstract.py index 4d4391bf..117d39a5 100644 --- a/ogr/abstract.py +++ b/ogr/abstract.py @@ -1688,6 +1688,18 @@ def get_pr(self, pr_id: int) -> "PullRequest": """ raise NotImplementedError() + def get_pr_files_diff(self, pr_id: int) -> dict: + """ + Get files diff of a pull request. + + Args: + pr_id: ID of the pull request. + + Returns: + Dictionary representing files diff. + """ + raise NotImplementedError() + def get_tags(self) -> list["GitTag"]: """ Returns: diff --git a/ogr/services/pagure/project.py b/ogr/services/pagure/project.py index ca0af027..c0938b95 100644 --- a/ogr/services/pagure/project.py +++ b/ogr/services/pagure/project.py @@ -275,6 +275,10 @@ def get_pr_list( def get_pr(self, pr_id: int) -> PullRequest: pass + @indirect(PagurePullRequest.get_files_diff) + def get_pr_files_diff(self, pr_id: int) -> dict: + pass + @if_readonly(return_function=GitProjectReadOnly.create_pr) @indirect(PagurePullRequest.create) def create_pr( diff --git a/ogr/services/pagure/pull_request.py b/ogr/services/pagure/pull_request.py index 66c9e647..6f86a61c 100644 --- a/ogr/services/pagure/pull_request.py +++ b/ogr/services/pagure/pull_request.py @@ -190,6 +190,20 @@ def get(project: "ogr_pagure.PagureProject", pr_id: int) -> "PullRequest": raw_pr = project._call_project_api("pull-request", str(pr_id)) return PagurePullRequest(raw_pr, project) + @staticmethod + def get_files_diff(project: "ogr_pagure.PagureProject", pr_id: int) -> dict: + try: + return project._call_project_api( + "pull-request", + str(pr_id), + "diffstats", + method="GET", + ) + except PagureAPIException as ex: + if "No statistics" in ex.pagure_error: + return {} + raise ex + @staticmethod def get_list( project: "ogr_pagure.PagureProject", diff --git a/tests/integration/pagure/test_data/test_pull_requests/PullRequests.test_pr_diff.yaml b/tests/integration/pagure/test_data/test_pull_requests/PullRequests.test_pr_diff.yaml new file mode 100644 index 00000000..6a2579df --- /dev/null +++ b/tests/integration/pagure/test_data/test_pull_requests/PullRequests.test_pr_diff.yaml @@ -0,0 +1,118 @@ +_requre: + DataTypes: 1 + key_strategy: StorageKeysInspectSimple + version_storage_file: 3 +requests.sessions: + send: + GET: + https://pagure.io/api/0/ogr-tests/pull-request/13/diffstats: + - metadata: + latency: 0.2961406707763672 + module_call_list: + - unittest.case + - requre.record_and_replace + - tests.integration.pagure.test_pull_requests + - ogr.abstract + - ogr.utils + - ogr.abstract + - ogr.services.pagure.pull_request + - ogr.abstract + - ogr.services.pagure.project + - ogr.abstract + - ogr.services.pagure.service + - ogr.abstract + - ogr.services.pagure.service + - ogr.abstract + - ogr.services.pagure.service + - requests.sessions + - requre.objects + - requre.cassette + - requests.sessions + - send + output: + __store_indicator: 2 + _content: + README.md: + lines_added: 5 + lines_removed: 1 + new_id: 3953698d00a5c8c8ef0582a05083a242beca4033 + old_id: a40a52a2ba46ddf4f9a4ecd04b47f717573467a6 + old_path: README.md + status: M + _next: null + elapsed: 0.2 + encoding: utf-8 + headers: + Connection: Keep-Alive + Content-Length: '239' + Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-YqLDC0BS8d7iY8mKO7VtBbIne' + https://apps.fedoraproject.org; style-src 'self' 'nonce-YqLDC0BS8d7iY8mKO7VtBbIne'; + object-src 'none';base-uri 'self';img-src 'self' https:; + Content-Type: application/json + Date: Fri, 01 Nov 2019 13-36-03 GMT + Keep-Alive: timeout=5, max=99 + Referrer-Policy: same-origin + Server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 + Python/3.6 + Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiOGRjYjBkOTVmZWVhYTdjMjhjNmNkNWNhN2ZlZmFmNGE3ZjMxZDliMSJ9.GFnCeg.6mYem_Ppb-t6pkIsrmcLGfZk3jg; + Expires=Fri, 12-Jan-2024 10:07:54 GMT; Secure; HttpOnly; Path=/ + Strict-Transport-Security: max-age=31536000; includeSubDomains; preload + X-Content-Type-Options: nosniff + X-Frame-Options: ALLOW-FROM https://pagure.io/ + X-Xss-Protection: 1; mode=block + raw: !!binary "" + reason: OK + status_code: 200 + POST: + https://pagure.io/api/0/-/whoami: + - metadata: + latency: 0.8561291694641113 + module_call_list: + - unittest.case + - requre.record_and_replace + - tests.integration.pagure.test_pull_requests + - tests.integration.pagure.base + - ogr.abstract + - ogr.services.pagure.service + - ogr.abstract + - ogr.services.pagure.user + - ogr.abstract + - ogr.services.pagure.service + - ogr.abstract + - ogr.services.pagure.service + - ogr.abstract + - ogr.services.pagure.service + - requests.sessions + - requre.objects + - requre.cassette + - requests.sessions + - send + output: + __store_indicator: 2 + _content: + username: lbarczio + _next: null + elapsed: 0.2 + encoding: utf-8 + headers: + Connection: Upgrade, Keep-Alive + Content-Length: '29' + Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-YqLDC0BS8d7iY8mKO7VtBbIne' + https://apps.fedoraproject.org; style-src 'self' 'nonce-YqLDC0BS8d7iY8mKO7VtBbIne'; + object-src 'none';base-uri 'self';img-src 'self' https:; + Content-Type: application/json + Date: Fri, 01 Nov 2019 13-36-03 GMT + Keep-Alive: timeout=5, max=100 + Referrer-Policy: same-origin + Server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 + Python/3.6 + Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiOGRjYjBkOTVmZWVhYTdjMjhjNmNkNWNhN2ZlZmFmNGE3ZjMxZDliMSJ9.GFnCeQ.AxPTspgeBuxKKhTR48bGrHZf2lE; + Expires=Fri, 12-Jan-2024 10:07:53 GMT; Secure; HttpOnly; Path=/ + Strict-Transport-Security: max-age=31536000; includeSubDomains; preload + Upgrade: h2,h2c + X-Content-Type-Options: nosniff + X-Frame-Options: ALLOW-FROM https://pagure.io/ + X-Xss-Protection: 1; mode=block + raw: !!binary "" + reason: OK + status_code: 200 diff --git a/tests/integration/pagure/test_data/test_pull_requests/PullRequests.test_pr_diff_empty_diff.yaml b/tests/integration/pagure/test_data/test_pull_requests/PullRequests.test_pr_diff_empty_diff.yaml new file mode 100644 index 00000000..b6a71f43 --- /dev/null +++ b/tests/integration/pagure/test_data/test_pull_requests/PullRequests.test_pr_diff_empty_diff.yaml @@ -0,0 +1,112 @@ +_requre: + DataTypes: 1 + key_strategy: StorageKeysInspectSimple + version_storage_file: 3 +requests.sessions: + send: + GET: + https://pagure.io/api/0/ogr-tests/pull-request/6/diffstats: + - metadata: + latency: 0.2965199947357178 + module_call_list: + - unittest.case + - requre.record_and_replace + - tests.integration.pagure.test_pull_requests + - ogr.abstract + - ogr.utils + - ogr.abstract + - ogr.services.pagure.pull_request + - ogr.abstract + - ogr.services.pagure.project + - ogr.abstract + - ogr.services.pagure.service + - ogr.abstract + - ogr.services.pagure.service + - ogr.abstract + - ogr.services.pagure.service + - requests.sessions + - requre.objects + - requre.cassette + - requests.sessions + - send + output: + __store_indicator: 2 + _content: + error: No statistics could be computed for this PR + error_code: ENOPRSTATS + _next: null + elapsed: 0.2 + encoding: utf-8 + headers: + Connection: close + Content-Length: '92' + Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-YqLDC0BS8d7iY8mKO7VtBbIne' + https://apps.fedoraproject.org; style-src 'self' 'nonce-YqLDC0BS8d7iY8mKO7VtBbIne'; + object-src 'none';base-uri 'self';img-src 'self' https:; + Content-Type: application/json + Date: Fri, 01 Nov 2019 13-36-03 GMT + Referrer-Policy: same-origin + Server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 + Python/3.6 + Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiMzU0YmExMTNlMWFhMGU0MzliZDFjN2UwZGY3ODg4OTBjODdhMzkwMSJ9.GFnGGw.MvcSSJ61ycB9FCodU3kj9hWZeGY; + Expires=Fri, 12-Jan-2024 10:23:23 GMT; Secure; HttpOnly; Path=/ + Strict-Transport-Security: max-age=31536000; includeSubDomains; preload + X-Content-Type-Options: nosniff + X-Frame-Options: ALLOW-FROM https://pagure.io/ + X-Xss-Protection: 1; mode=block + raw: !!binary "" + reason: BAD REQUEST + status_code: 400 + POST: + https://pagure.io/api/0/-/whoami: + - metadata: + latency: 0.565004825592041 + module_call_list: + - unittest.case + - requre.record_and_replace + - tests.integration.pagure.test_pull_requests + - tests.integration.pagure.base + - ogr.abstract + - ogr.services.pagure.service + - ogr.abstract + - ogr.services.pagure.user + - ogr.abstract + - ogr.services.pagure.service + - ogr.abstract + - ogr.services.pagure.service + - ogr.abstract + - ogr.services.pagure.service + - requests.sessions + - requre.objects + - requre.cassette + - requests.sessions + - send + output: + __store_indicator: 2 + _content: + username: lbarczio + _next: null + elapsed: 0.2 + encoding: utf-8 + headers: + Connection: Upgrade, Keep-Alive + Content-Length: '29' + Content-Security-Policy: default-src 'self';script-src 'self' 'nonce-YqLDC0BS8d7iY8mKO7VtBbIne' + https://apps.fedoraproject.org; style-src 'self' 'nonce-YqLDC0BS8d7iY8mKO7VtBbIne'; + object-src 'none';base-uri 'self';img-src 'self' https:; + Content-Type: application/json + Date: Fri, 01 Nov 2019 13-36-03 GMT + Keep-Alive: timeout=5, max=100 + Referrer-Policy: same-origin + Server: Apache/2.4.37 (Red Hat Enterprise Linux) OpenSSL/1.1.1k mod_wsgi/4.6.4 + Python/3.6 + Set-Cookie: pagure=eyJfcGVybWFuZW50Ijp0cnVlLCJjc3JmX3Rva2VuIjoiMzU0YmExMTNlMWFhMGU0MzliZDFjN2UwZGY3ODg4OTBjODdhMzkwMSJ9.GFnGGw.MvcSSJ61ycB9FCodU3kj9hWZeGY; + Expires=Fri, 12-Jan-2024 10:23:23 GMT; Secure; HttpOnly; Path=/ + Strict-Transport-Security: max-age=31536000; includeSubDomains; preload + Upgrade: h2,h2c + X-Content-Type-Options: nosniff + X-Frame-Options: ALLOW-FROM https://pagure.io/ + X-Xss-Protection: 1; mode=block + raw: !!binary "" + reason: OK + status_code: 200 diff --git a/tests/integration/pagure/test_pull_requests.py b/tests/integration/pagure/test_pull_requests.py index b5cee7af..2015657c 100644 --- a/tests/integration/pagure/test_pull_requests.py +++ b/tests/integration/pagure/test_pull_requests.py @@ -118,3 +118,13 @@ def test_commits_url(self): def test_get_comment(self): comment = self.ogr_project.get_pr(5).get_comment(comment_id=162373) assert "Billy: what the hell is going on up there?" in comment.body + + def test_pr_diff(self): + diff = self.ogr_project.get_pr_files_diff(13) + assert isinstance(diff, dict) + assert "README.md" in diff + + def test_pr_diff_empty_diff(self): + diff = self.ogr_project.get_pr_files_diff(6) + assert isinstance(diff, dict) + assert diff == {}