Title: [283428] trunk/Tools
Revision
283428
Author
jbed...@apple.com
Date
2021-10-01 17:53:30 -0700 (Fri, 01 Oct 2021)

Log Message

[webkitscmpy] Get pull-request by number
https://bugs.webkit.org/show_bug.cgi?id=231039
<rdar://problem/83740215>

Reviewed by Stephanie Lewis.

* Scripts/libraries/webkitscmpy/setup.py: Bump version.
* Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
* Scripts/libraries/webkitscmpy/webkitscmpy/mocks/remote/git_hub.py:
(GitHub.request): Add pull-request access by number.
* Scripts/libraries/webkitscmpy/webkitscmpy/remote/bitbucket.py:
(BitBucket.PRGenerator.PullRequest): Shared JSON pull-request generator.
(BitBucket.PRGenerator.get): Get pull-request by number.
(BitBucket.PRGenerator.find): Use shared pull-request generator.
(BitBucket.PRGenerator.create): Ditto.
* Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py:
(GitHub.PRGenerator.PullRequest): Shared JSON pull-request generator.
(GitHub.PRGenerator.get): Get pull-request by number.
(GitHub.PRGenerator.find): Use shared pull-request generator.
(GitHub.PRGenerator.create):
* Scripts/libraries/webkitscmpy/webkitscmpy/remote/scm.py:
(Scm.PRGenerator.get):
* Scripts/libraries/webkitscmpy/webkitscmpy/test/pull_request_unittest.py:
(TestNetworkPullRequestGitHub): Added.

Modified Paths

Diff

Modified: trunk/Tools/ChangeLog (283427 => 283428)


--- trunk/Tools/ChangeLog	2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/ChangeLog	2021-10-02 00:53:30 UTC (rev 283428)
@@ -1,3 +1,30 @@
+2021-10-01  Jonathan Bedard  <jbed...@apple.com>
+
+        [webkitscmpy] Get pull-request by number
+        https://bugs.webkit.org/show_bug.cgi?id=231039
+        <rdar://problem/83740215>
+
+        Reviewed by Stephanie Lewis.
+
+        * Scripts/libraries/webkitscmpy/setup.py: Bump version.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py: Ditto.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/mocks/remote/git_hub.py:
+        (GitHub.request): Add pull-request access by number.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/remote/bitbucket.py:
+        (BitBucket.PRGenerator.PullRequest): Shared JSON pull-request generator.
+        (BitBucket.PRGenerator.get): Get pull-request by number.
+        (BitBucket.PRGenerator.find): Use shared pull-request generator.
+        (BitBucket.PRGenerator.create): Ditto.
+        * Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py:
+        (GitHub.PRGenerator.PullRequest): Shared JSON pull-request generator.
+        (GitHub.PRGenerator.get): Get pull-request by number.
+        (GitHub.PRGenerator.find): Use shared pull-request generator.
+        (GitHub.PRGenerator.create):
+        * Scripts/libraries/webkitscmpy/webkitscmpy/remote/scm.py:
+        (Scm.PRGenerator.get):
+        * Scripts/libraries/webkitscmpy/webkitscmpy/test/pull_request_unittest.py:
+        (TestNetworkPullRequestGitHub): Added.
+
 2021-10-01  Alex Christensen  <achristen...@webkit.org>
 
         Implement HTTPS proxy in HTTPServer

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/setup.py (283427 => 283428)


--- trunk/Tools/Scripts/libraries/webkitscmpy/setup.py	2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/setup.py	2021-10-02 00:53:30 UTC (rev 283428)
@@ -29,7 +29,7 @@
 
 setup(
     name='webkitscmpy',
-    version='2.2.3',
+    version='2.2.4',
     description='Library designed to interact with git and svn repositories.',
     long_description=readme(),
     classifiers=[

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py (283427 => 283428)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py	2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/__init__.py	2021-10-02 00:53:30 UTC (rev 283428)
@@ -46,7 +46,7 @@
         "Please install webkitcorepy with `pip install webkitcorepy --extra-index-url <package index URL>`"
     )
 
-version = Version(2, 2, 3)
+version = Version(2, 2, 4)
 
 AutoInstall.register(Package('fasteners', Version(0, 15, 0)))
 AutoInstall.register(Package('monotonic', Version(1, 5)))

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/remote/git_hub.py (283427 => 283428)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/remote/git_hub.py	2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/mocks/remote/git_hub.py	2021-10-02 00:53:30 UTC (rev 283428)
@@ -335,7 +335,7 @@
             username = (json or {}).get('owner', None)
             if username:
                 self.forks.append(username)
-            return mocks.Response.fromJson({}) if username else mocks.Response.create404(url)
+            return mocks.Response.fromJson({}, url="" if username else mocks.Response.create404(url)
 
         # All pull-requests
         pr_base = '{}/pulls'.format(self.api_remote)
@@ -352,8 +352,15 @@
                 if head and head not in [candidate.get('head', {}).get('ref'), candidate.get('head', {}).get('label')]:
                     continue
                 prs.append(candidate)
-            return mocks.Response.fromJson(prs)
+            return mocks.Response.fromJson(prs, url=""
 
+        # Pull-request by number
+        if method == 'GET' and stripped_url.startswith(pr_base):
+            for candidate in self.pull_requests:
+                if stripped_url.split('/')[-1] == str(candidate['number']):
+                    return mocks.Response.fromJson(candidate, url=""
+            return mocks.Response.create404(url)
+
         # Create/update pull-request
         pr = dict()
         if method == 'POST' and auth and stripped_url.startswith(pr_base):
@@ -379,7 +386,7 @@
             pr['number'] = 1 + max([0] + [pr.get('number', 0) for pr in self.pull_requests])
             pr['user'] = dict(login=auth.username)
             self.pull_requests.append(pr)
-            return mocks.Response.fromJson(pr)
+            return mocks.Response.fromJson(pr, url=""
 
         # Update specifically
         if method == 'POST' and auth and stripped_url.startswith(pr_base):
@@ -391,6 +398,6 @@
             if existing is None:
                 return mocks.Response.create404(url)
             self.pull_requests[existing].update(pr)
-            return mocks.Response.fromJson(self.pull_requests[i])
+            return mocks.Response.fromJson(self.pull_requests[i], url=""
 
         return mocks.Response.create404(url)

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/bitbucket.py (283427 => 283428)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/bitbucket.py	2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/bitbucket.py	2021-10-02 00:53:30 UTC (rev 283428)
@@ -39,6 +39,23 @@
         TITLE_CHAR_LIMIT = 254
         BODY_CHAR_LIMIT = 32766
 
+        def PullRequest(self, data):
+            if not data:
+                return None
+            return PullRequest(
+                number=data['id'],
+                title=data.get('title'),
+                body=data.get('description'),
+                author=self.repository.contributors.create(
+                    data['author']['user']['displayName'],
+                    data['author']['user']['emailAddress'],
+                ), head=data['fromRef']['displayId'],
+                base=data['toRef']['displayId'],
+            )
+
+        def get(self, number):
+            return self.PullRequest(self.repository.request('pull-requests/{}'.format(int(number))))
+
         def find(self, state=None, head=None, base=None):
             params = dict(
                 limit=100,
@@ -56,16 +73,7 @@
             for datum in data or []:
                 if base and not datum['toRef']['id'].endswith(base):
                     continue
-                yield PullRequest(
-                    number=datum['id'],
-                    title=datum.get('title'),
-                    body=datum.get('description'),
-                    author=self.repository.contributors.create(
-                        datum['author']['user']['displayName'],
-                        datum['author']['user']['emailAddress'],
-                    ), head=datum['fromRef']['displayId'],
-                    base=datum['toRef']['displayId'],
-                )
+                yield self.PullRequest(datum)
 
         def create(self, head, title, body=None, commits=None, base=None):
             for key, value in dict(head=head, title=title).items():
@@ -102,17 +110,7 @@
             )
             if response.status_code // 100 != 2:
                 return None
-            data = ""
-            return PullRequest(
-                number=data['id'],
-                title=data.get('title'),
-                body=data.get('description'),
-                author=self.repository.contributors.create(
-                    data['author']['user']['displayName'],
-                    data['author']['user']['emailAddress'],
-                ), head=data['fromRef']['displayId'],
-                base=data['toRef']['displayId'],
-            )
+            return self.PullRequest(response.json())
 
         def update(self, pull_request, head=None, title=None, body=None, commits=None, base=None):
             if not isinstance(pull_request, PullRequest):

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py (283427 => 283428)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py	2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/git_hub.py	2021-10-02 00:53:30 UTC (rev 283428)
@@ -39,6 +39,21 @@
     EMAIL_RE = re.compile(r'(?P<email>[^@]+@[^@]+)(@.*)?')
 
     class PRGenerator(Scm.PRGenerator):
+        def PullRequest(self, data):
+            if not data:
+                return None
+            return PullRequest(
+                number=data['number'],
+                title=data.get('title'),
+                body=data.get('body'),
+                author=self.repository.contributors.create(data['user']['login']),
+                head=data['head']['ref'],
+                base=data['base']['ref'],
+            )
+
+        def get(self, number):
+            return self.PullRequest(self.repository.request('pulls/{}'.format(int(number))))
+
         def find(self, state=None, head=None, base=None):
             if not state:
                 state = 'all'
@@ -51,16 +66,9 @@
             for datum in data or []:
                 if base and datum['base']['ref'] != base:
                     continue
-                if head and not datum['head']['ref'].endswith(head):
+                if head and not datum['head']['ref'].endswith(head.split(':')[-1]):
                     continue
-                yield PullRequest(
-                    number=datum['number'],
-                    title=datum.get('title'),
-                    body=datum.get('body'),
-                    author=self.repository.contributors.create(datum['user']['login']),
-                    head=datum['head']['ref'],
-                    base=datum['base']['ref'],
-                )
+                yield self.PullRequest(datum)
 
         def create(self, head, title, body=None, commits=None, base=None):
             for key, value in dict(head=head, title=title).items():
@@ -84,15 +92,7 @@
             )
             if response.status_code // 100 != 2:
                 return None
-            data = ""
-            return PullRequest(
-                number=data['number'],
-                title=data.get('title'),
-                body=data.get('body'),
-                author=self.repository.contributors.create(data['user']['login']),
-                head=data['head']['ref'],
-                base=data['base']['ref'],
-            )
+            return self.PullRequest(response.json())
 
         def update(self, pull_request, head=None, title=None, body=None, commits=None, base=None):
             if not isinstance(pull_request, PullRequest):

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/scm.py (283427 => 283428)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/scm.py	2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/remote/scm.py	2021-10-02 00:53:30 UTC (rev 283428)
@@ -30,6 +30,9 @@
         def __init__(self, repository):
             self.repository = repository
 
+        def get(self, number):
+            raise NotImplementedError()
+
         def find(self, state=None, head=None, base=None):
             raise NotImplementedError()
 

Modified: trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/pull_request_unittest.py (283427 => 283428)


--- trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/pull_request_unittest.py	2021-10-02 00:22:27 UTC (rev 283427)
+++ trunk/Tools/Scripts/libraries/webkitscmpy/webkitscmpy/test/pull_request_unittest.py	2021-10-02 00:53:30 UTC (rev 283428)
@@ -25,7 +25,7 @@
 import unittest
 
 from webkitcorepy import OutputCapture, testing
-from webkitscmpy import Commit, PullRequest, program, mocks
+from webkitscmpy import Commit, PullRequest, program, mocks, remote
 
 
 class TestPullRequest(unittest.TestCase):
@@ -425,3 +425,97 @@
                 "Updated 'PR 1 | Amended commit'!",
             ],
         )
+
+
+class TestNetworkPullRequestGitHub(unittest.TestCase):
+    remote = 'https://github.example.com/WebKit/WebKit'
+
+    @classmethod
+    def webserver(cls):
+        result = mocks.remote.GitHub()
+        result.pull_requests = [dict(
+            number=1,
+            state='open',
+            title='Example Change',
+            user=dict(login='tcontributor'),
+            body='''#### 95507e3a1a4a919d1a156abbc279fdf6d24b13f5
+<pre>
+Example Change
+<a href=""
+
+Reviewed by NOBODY (OOPS!).
+
+* Source/file.cpp:
+</pre>
+''',
+            head=dict(ref='eng/pull-request'),
+            base=dict(ref='main'),
+        )]
+        return result
+
+    def test_find(self):
+        with self.webserver():
+            prs = list(remote.GitHub(self.remote).pull_requests.find())
+            self.assertEqual(len(prs), 1)
+            self.assertEqual(prs[0].number, 1)
+            self.assertEqual(prs[0].title, 'Example Change')
+            self.assertEqual(prs[0].head, 'eng/pull-request')
+            self.assertEqual(prs[0].base, 'main')
+
+    def test_get(self):
+        with self.webserver():
+            pr = remote.GitHub(self.remote).pull_requests.get(1)
+            self.assertEqual(pr.number, 1)
+            self.assertEqual(pr.title, 'Example Change')
+            self.assertEqual(pr.head, 'eng/pull-request')
+            self.assertEqual(pr.base, 'main')
+
+
+class TestNetworkPullRequestBitBucket(unittest.TestCase):
+    remote = 'https://bitbucket.example.com/projects/WEBKIT/repos/webkit'
+
+    @classmethod
+    def webserver(cls):
+        result = mocks.remote.BitBucket()
+        result.pull_requests = [dict(
+            id=1,
+            state='OPEN',
+            title='Example Change',
+            author=dict(
+                user=dict(
+                    name='tcontributor',
+                    emailAddress='tcontribu...@apple.com',
+                    displayName='Tim Contributor',
+                ),
+            ), body='''#### 95507e3a1a4a919d1a156abbc279fdf6d24b13f5
+```
+Example Change
+https://bugs.webkit.org/show_bug.cgi?id=1234
+
+Reviewed by NOBODY (OOPS!).
+
+* Source/file.cpp:
+```
+''',
+            fromRef=dict(displayId='eng/pull-request'),
+            toRef=dict(displayId='main'),
+        )]
+        return result
+
+    def test_find(self):
+        with self.webserver():
+            with self.webserver():
+                prs = list(remote.BitBucket(self.remote).pull_requests.find())
+                self.assertEqual(len(prs), 1)
+                self.assertEqual(prs[0].number, 1)
+                self.assertEqual(prs[0].title, 'Example Change')
+                self.assertEqual(prs[0].head, 'eng/pull-request')
+                self.assertEqual(prs[0].base, 'main')
+
+    def test_get(self):
+        with self.webserver():
+            pr = remote.BitBucket(self.remote).pull_requests.get(1)
+            self.assertEqual(pr.number, 1)
+            self.assertEqual(pr.title, 'Example Change')
+            self.assertEqual(pr.head, 'eng/pull-request')
+            self.assertEqual(pr.base, 'main')
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to