Add support for Twitter API v2 List lookup endpoints
authorHarmon <Harmon758@gmail.com>
Tue, 16 Nov 2021 13:52:59 +0000 (07:52 -0600)
committerHarmon <Harmon758@gmail.com>
Tue, 16 Nov 2021 13:52:59 +0000 (07:52 -0600)
14 files changed:
cassettes/test_get_followed_lists.yaml [new file with mode: 0644]
cassettes/test_get_list.yaml [new file with mode: 0644]
cassettes/test_get_list_followers.yaml [new file with mode: 0644]
cassettes/test_get_list_members.yaml [new file with mode: 0644]
cassettes/test_get_list_memberships.yaml [new file with mode: 0644]
cassettes/test_get_list_tweets.yaml [new file with mode: 0644]
cassettes/test_get_owned_lists.yaml [new file with mode: 0644]
cassettes/test_manage_and_get_pinned_lists.yaml [moved from cassettes/test_manage_list.yaml with 65% similarity]
docs/client.rst
docs/models.rst
tests/test_client.py
tweepy/__init__.py
tweepy/client.py
tweepy/list.py [new file with mode: 0644]

diff --git a/cassettes/test_get_followed_lists.yaml b/cassettes/test_get_followed_lists.yaml
new file mode 100644 (file)
index 0000000..61513b0
--- /dev/null
@@ -0,0 +1,66 @@
+interactions:
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
+    method: GET
+    uri: https://api.twitter.com/2/users/372575989/followed_lists
+  response:
+    body:
+      string: !!binary |
+        H4sIAAAAAAAAAKpWSkksSVSyiq5WykxRslIyNLcwt7QwNTBW0lHKS8xNBQqFBis4Z5ZkphYr1epA
+        VVlaWhoZmRkZIRT5p6VlJqcWK6gpOJfmlJQWpSrVxuoo5aaCzK5WKkotBorGJ+eX5pUoWRnV1gIA
+        AAD//wMAs7LZ53cAAAA=
+    headers:
+      api-version:
+      - '2.30'
+      cache-control:
+      - no-cache, no-store, max-age=0
+      content-disposition:
+      - attachment; filename=json.json
+      content-encoding:
+      - gzip
+      content-length:
+      - '128'
+      content-type:
+      - application/json; charset=utf-8
+      date:
+      - Mon, 15 Nov 2021 23:40:27 UTC
+      server:
+      - tsa_b
+      set-cookie:
+      - personalization_id="v1_8Es7xcFmkiEOwzSNGOFWDA=="; Max-Age=63072000; Expires=Wed,
+        15 Nov 2023 23:40:27 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id=v1%3A163701962770266612; Max-Age=63072000; Expires=Wed, 15 Nov 2023
+        23:40:27 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      strict-transport-security:
+      - max-age=631138519
+      x-access-level:
+      - read
+      x-connection-hash:
+      - fc14f027f77c919ed872be0f72b6d09b49fe0761fdf0524cd135ef26665b270e
+      x-content-type-options:
+      - nosniff
+      x-frame-options:
+      - SAMEORIGIN
+      x-rate-limit-limit:
+      - '15'
+      x-rate-limit-remaining:
+      - '14'
+      x-rate-limit-reset:
+      - '1637020527'
+      x-response-time:
+      - '97'
+      x-xss-protection:
+      - '0'
+    status:
+      code: 200
+      message: OK
+version: 1
diff --git a/cassettes/test_get_list.yaml b/cassettes/test_get_list.yaml
new file mode 100644 (file)
index 0000000..f08d498
--- /dev/null
@@ -0,0 +1,65 @@
+interactions:
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
+    method: GET
+    uri: https://api.twitter.com/2/lists/84839422
+  response:
+    body:
+      string: !!binary |
+        H4sIAAAAAAAAAKpWSkksSVSyqlbKTFGyUrIwsTC2NDEyUtJRykvMTQWK+KelZSZnJuYohJRnlpSk
+        Fik4Jifnl+aVFCvV1gIAAAD//wMA28iK2j0AAAA=
+    headers:
+      api-version:
+      - '2.30'
+      cache-control:
+      - no-cache, no-store, max-age=0
+      content-disposition:
+      - attachment; filename=json.json
+      content-encoding:
+      - gzip
+      content-length:
+      - '86'
+      content-type:
+      - application/json; charset=utf-8
+      date:
+      - Mon, 15 Nov 2021 23:40:28 UTC
+      server:
+      - tsa_b
+      set-cookie:
+      - personalization_id="v1_Aw9VuVg/CLJcjVZCjX82Lw=="; Max-Age=63072000; Expires=Wed,
+        15 Nov 2023 23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id=v1%3A163701962808455938; Max-Age=63072000; Expires=Wed, 15 Nov 2023
+        23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      strict-transport-security:
+      - max-age=631138519
+      x-access-level:
+      - read
+      x-connection-hash:
+      - fc9e2cdf5462c36c98e5dd040cb6988b4e2063917c37ebc235455c4fe24343f9
+      x-content-type-options:
+      - nosniff
+      x-frame-options:
+      - SAMEORIGIN
+      x-rate-limit-limit:
+      - '75'
+      x-rate-limit-remaining:
+      - '74'
+      x-rate-limit-reset:
+      - '1637020528'
+      x-response-time:
+      - '72'
+      x-xss-protection:
+      - '0'
+    status:
+      code: 200
+      message: OK
+version: 1
diff --git a/cassettes/test_get_list_followers.yaml b/cassettes/test_get_list_followers.yaml
new file mode 100644 (file)
index 0000000..7a8655f
--- /dev/null
@@ -0,0 +1,123 @@
+interactions:
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
+    method: GET
+    uri: https://api.twitter.com/2/lists/84839422/followers
+  response:
+    body:
+      string: !!binary |
+        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
+    headers:
+      api-version:
+      - '2.30'
+      cache-control:
+      - no-cache, no-store, max-age=0
+      content-disposition:
+      - attachment; filename=json.json
+      content-encoding:
+      - gzip
+      content-length:
+      - '3415'
+      content-type:
+      - application/json; charset=utf-8
+      date:
+      - Mon, 15 Nov 2021 23:40:28 UTC
+      server:
+      - tsa_b
+      set-cookie:
+      - personalization_id="v1_I59ov2pIWDJYXAR/YUv+xw=="; Max-Age=63072000; Expires=Wed,
+        15 Nov 2023 23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id=v1%3A163701962834890720; Max-Age=63072000; Expires=Wed, 15 Nov 2023
+        23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      strict-transport-security:
+      - max-age=631138519
+      x-access-level:
+      - read
+      x-connection-hash:
+      - 17be92252e12c1b432119645a59453e288159898b8dbb918b4fd7fb3c1792801
+      x-content-type-options:
+      - nosniff
+      x-frame-options:
+      - SAMEORIGIN
+      x-rate-limit-limit:
+      - '180'
+      x-rate-limit-remaining:
+      - '179'
+      x-rate-limit-reset:
+      - '1637020528'
+      x-response-time:
+      - '157'
+      x-xss-protection:
+      - '0'
+    status:
+      code: 200
+      message: OK
+version: 1
diff --git a/cassettes/test_get_list_members.yaml b/cassettes/test_get_list_members.yaml
new file mode 100644 (file)
index 0000000..e942421
--- /dev/null
@@ -0,0 +1,103 @@
+interactions:
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
+    method: GET
+    uri: https://api.twitter.com/2/lists/84839422/members
+  response:
+    body:
+      string: !!binary |
+        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
+        MhM7t7f/BwAA//8DACGrwl2PHQAA
+    headers:
+      api-version:
+      - '2.30'
+      cache-control:
+      - no-cache, no-store, max-age=0
+      content-disposition:
+      - attachment; filename=json.json
+      content-encoding:
+      - gzip
+      content-length:
+      - '2244'
+      content-type:
+      - application/json; charset=utf-8
+      date:
+      - Mon, 15 Nov 2021 23:40:28 UTC
+      server:
+      - tsa_b
+      set-cookie:
+      - personalization_id="v1_HB4AISsVuRwhCUTUD14jkg=="; Max-Age=63072000; Expires=Wed,
+        15 Nov 2023 23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id=v1%3A163701962871088445; Max-Age=63072000; Expires=Wed, 15 Nov 2023
+        23:40:28 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      strict-transport-security:
+      - max-age=631138519
+      x-access-level:
+      - read
+      x-connection-hash:
+      - d43a528453097434589e08eef021c1fcaf7b53343b1be8a7c2f3e259ea74d6fb
+      x-content-type-options:
+      - nosniff
+      x-frame-options:
+      - SAMEORIGIN
+      x-rate-limit-limit:
+      - '900'
+      x-rate-limit-remaining:
+      - '899'
+      x-rate-limit-reset:
+      - '1637020528'
+      x-response-time:
+      - '157'
+      x-xss-protection:
+      - '0'
+    status:
+      code: 200
+      message: OK
+version: 1
diff --git a/cassettes/test_get_list_memberships.yaml b/cassettes/test_get_list_memberships.yaml
new file mode 100644 (file)
index 0000000..6c3eab8
--- /dev/null
@@ -0,0 +1,99 @@
+interactions:
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
+    method: GET
+    uri: https://api.twitter.com/2/users/783214/list_memberships
+  response:
+    body:
+      string: !!binary |
+        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
+        BpaN0gly7vnznwEAAP//AwBWDnxo9hEAAA==
+    headers:
+      api-version:
+      - '2.30'
+      cache-control:
+      - no-cache, no-store, max-age=0
+      content-disposition:
+      - attachment; filename=json.json
+      content-encoding:
+      - gzip
+      content-length:
+      - '2020'
+      content-type:
+      - application/json; charset=utf-8
+      date:
+      - Mon, 15 Nov 2021 23:40:29 UTC
+      server:
+      - tsa_b
+      set-cookie:
+      - personalization_id="v1_i4VsZQuY+snYsjI718kvww=="; Max-Age=63072000; Expires=Wed,
+        15 Nov 2023 23:40:29 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id=v1%3A163701962907172503; Max-Age=63072000; Expires=Wed, 15 Nov 2023
+        23:40:29 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      strict-transport-security:
+      - max-age=631138519
+      x-access-level:
+      - read
+      x-connection-hash:
+      - a382da012e4685a6634f47b053d09c98fc1b6897d4f4a2cdec6a820465cb8574
+      x-content-type-options:
+      - nosniff
+      x-frame-options:
+      - SAMEORIGIN
+      x-rate-limit-limit:
+      - '75'
+      x-rate-limit-remaining:
+      - '74'
+      x-rate-limit-reset:
+      - '1637020529'
+      x-response-time:
+      - '203'
+      x-xss-protection:
+      - '0'
+    status:
+      code: 200
+      message: OK
+version: 1
diff --git a/cassettes/test_get_list_tweets.yaml b/cassettes/test_get_list_tweets.yaml
new file mode 100644 (file)
index 0000000..4cabf76
--- /dev/null
@@ -0,0 +1,233 @@
+interactions:
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
+    method: GET
+    uri: https://api.twitter.com/2/lists/84839422/tweets
+  response:
+    body:
+      string: !!binary |
+        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
+        XwAAAP//AwAnqKD+vEwAAA==
+    headers:
+      api-version:
+      - '2.30'
+      cache-control:
+      - no-cache, no-store, max-age=0
+      content-disposition:
+      - attachment; filename=json.json
+      content-encoding:
+      - gzip
+      content-length:
+      - '9649'
+      content-type:
+      - application/json; charset=utf-8
+      date:
+      - Mon, 15 Nov 2021 23:40:30 UTC
+      server:
+      - tsa_b
+      set-cookie:
+      - personalization_id="v1_lz79ltUO1v335/LHVR3DFg=="; Max-Age=63072000; Expires=Wed,
+        15 Nov 2023 23:40:30 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id=v1%3A163701962951943854; Max-Age=63072000; Expires=Wed, 15 Nov 2023
+        23:40:30 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      strict-transport-security:
+      - max-age=631138519
+      x-access-level:
+      - read
+      x-connection-hash:
+      - d3dc1553a22da6162c57858cf6023e814bb807bffd4afdc0da26ad788d0577a4
+      x-content-type-options:
+      - nosniff
+      x-frame-options:
+      - SAMEORIGIN
+      x-rate-limit-limit:
+      - '900'
+      x-rate-limit-remaining:
+      - '899'
+      x-rate-limit-reset:
+      - '1637020529'
+      x-response-time:
+      - '577'
+      x-xss-protection:
+      - '0'
+    status:
+      code: 200
+      message: OK
+version: 1
diff --git a/cassettes/test_get_owned_lists.yaml b/cassettes/test_get_owned_lists.yaml
new file mode 100644 (file)
index 0000000..35087b2
--- /dev/null
@@ -0,0 +1,69 @@
+interactions:
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      User-Agent:
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
+    method: GET
+    uri: https://api.twitter.com/2/users/783214/owned_lists
+  response:
+    body:
+      string: !!binary |
+        H4sIAAAAAAAAAGSRTWuEMBBA/4rk0JOHZEw08dZuS+lBeujeSimuzi6hGiXGLov43xtLS3T3Egbm
+        vcl8TKQuXUny94nomuSEAc0SwUEoKUAC5ZKSmJiyRZ/cnxHdEB0u0f6snUNL5vjfo0wApxkTQvpH
+        UmDBezGexcGrnblVpTeFYDTLpFQ05SoNZtG1aNwQYGA8g0xREZhH/Mam69GuMKUU+CZWvT833aFs
+        ol03Gmcv0X1VLdGVwlOeBOVt7PvOuisE2GqyAmtdboGEJRCAJ3PSBtFqc9pikMIKez0edYVDdBft
+        xsaNFrcw87sJ8MM4+JrDQhel/UK3KS65TBS/Ka798H+rXw3/EZMWl/tPxB/If/35myE5Y/P8AwAA
+        //8DABSm4kUcAgAA
+    headers:
+      api-version:
+      - '2.30'
+      cache-control:
+      - no-cache, no-store, max-age=0
+      content-disposition:
+      - attachment; filename=json.json
+      content-encoding:
+      - gzip
+      content-length:
+      - '297'
+      content-type:
+      - application/json; charset=utf-8
+      date:
+      - Mon, 15 Nov 2021 23:40:30 UTC
+      server:
+      - tsa_b
+      set-cookie:
+      - personalization_id="v1_hmzcZD29dnde4bZA2a6wNg=="; Max-Age=63072000; Expires=Wed,
+        15 Nov 2023 23:40:30 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id=v1%3A163701963029853787; Max-Age=63072000; Expires=Wed, 15 Nov 2023
+        23:40:30 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      strict-transport-security:
+      - max-age=631138519
+      x-access-level:
+      - read
+      x-connection-hash:
+      - 0adc0bb14e0c0ac0873d77f4cfc242e33ceefee8a9ab2d454d1d215d7630df22
+      x-content-type-options:
+      - nosniff
+      x-frame-options:
+      - SAMEORIGIN
+      x-rate-limit-limit:
+      - '15'
+      x-rate-limit-remaining:
+      - '14'
+      x-rate-limit-reset:
+      - '1637020530'
+      x-response-time:
+      - '92'
+      x-xss-protection:
+      - '0'
+    status:
+      code: 200
+      message: OK
+version: 1
similarity index 65%
rename from cassettes/test_manage_list.yaml
rename to cassettes/test_manage_and_get_pinned_lists.yaml
index 6fe1b77c62cf641d6c0d63ed45b96b67c4e6c68e..accae194bbec55236c976d75c3db3073cc7f2b4c 100644 (file)
@@ -13,17 +13,17 @@ interactions:
       Content-Type:
       - application/json
       User-Agent:
-      - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
     method: POST
     uri: https://api.twitter.com/2/lists
   response:
     body:
       string: !!binary |
-        H4sIAAAAAAAAAKpWSkksSVSyqlbKTFGyUjI0MTUyNTYzMzQzMjC2tDQ3tDRQ0lHKS8xNBUqGpBaX
-        KPhkFpco1dYCAAAA//8DAAZ8t6c4AAAA
+        H4sIAAAAAAAAAKpWSkksSVSyqlbKTFGyUjI0MTMwtjQysjSzMDKyMDQyszBV0lHKS8xNBUqGpBaX
+        KPhkFpco1dYCAAAA//8DAFYqGlw4AAAA
     headers:
       api-version:
-      - '2.27'
+      - '2.30'
       cache-control:
       - no-cache, no-store, max-age=0
       content-disposition:
@@ -35,22 +35,22 @@ interactions:
       content-type:
       - application/json; charset=utf-8
       date:
-      - Mon, 25 Oct 2021 07:24:50 UTC
+      - Mon, 15 Nov 2021 23:40:31 UTC
       location:
-      - https://api.twitter.com/2/lists/1452536616203997190
+      - https://api.twitter.com/2/lists/1460392296822812685
       server:
       - tsa_b
       set-cookie:
-      - personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog=="; Max-Age=63072000; Expires=Wed,
-        25 Oct 2023 07:24:50 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
-      - guest_id=v1%3A163514669039140044; Max-Age=63072000; Expires=Wed, 25 Oct 2023
-        07:24:50 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q=="; Max-Age=63072000; Expires=Wed,
+        15 Nov 2023 23:40:31 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
+      - guest_id=v1%3A163701963092846827; Max-Age=63072000; Expires=Wed, 15 Nov 2023
+        23:40:31 GMT; Path=/; Domain=.twitter.com; Secure; SameSite=None
       strict-transport-security:
       - max-age=631138519
       x-access-level:
       - read-write-directmessages
       x-connection-hash:
-      - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3
+      - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d
       x-content-type-options:
       - nosniff
       x-frame-options:
@@ -58,11 +58,11 @@ interactions:
       x-rate-limit-limit:
       - '300'
       x-rate-limit-remaining:
-      - '299'
+      - '298'
       x-rate-limit-reset:
-      - '1635147590'
+      - '1637019827'
       x-response-time:
-      - '412'
+      - '243'
       x-xss-protection:
       - '0'
     status:
@@ -82,18 +82,18 @@ interactions:
       Content-Type:
       - application/json
       Cookie:
-      - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog=="
+      - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q=="
       User-Agent:
-      - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
     method: POST
-    uri: https://api.twitter.com/2/lists/1452536616203997190/members
+    uri: https://api.twitter.com/2/lists/1460392296822812685/members
   response:
     body:
       string: !!binary |
         H4sIAAAAAAAAAKpWSkksSVSyqlbKLI7PTc1NSi1SsiopKk2trQUAAAD//wMAl7jcXBsAAAA=
     headers:
       api-version:
-      - '2.27'
+      - '2.30'
       cache-control:
       - no-cache, no-store, max-age=0
       content-disposition:
@@ -105,7 +105,7 @@ interactions:
       content-type:
       - application/json; charset=utf-8
       date:
-      - Mon, 25 Oct 2021 07:24:50 UTC
+      - Mon, 15 Nov 2021 23:40:31 UTC
       server:
       - tsa_b
       strict-transport-security:
@@ -113,7 +113,7 @@ interactions:
       x-access-level:
       - read-write-directmessages
       x-connection-hash:
-      - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3
+      - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d
       x-content-type-options:
       - nosniff
       x-frame-options:
@@ -123,16 +123,16 @@ interactions:
       x-rate-limit-remaining:
       - '299'
       x-rate-limit-reset:
-      - '1635147589'
+      - '1637020531'
       x-response-time:
-      - '101'
+      - '119'
       x-xss-protection:
       - '0'
     status:
       code: 200
       message: OK
 - request:
-    body: '{"list_id": "1452536616203997190"}'
+    body: '{"list_id": "1460392296822812685"}'
     headers:
       Accept:
       - '*/*'
@@ -145,9 +145,9 @@ interactions:
       Content-Type:
       - application/json
       Cookie:
-      - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog=="
+      - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q=="
       User-Agent:
-      - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
     method: POST
     uri: https://api.twitter.com/2/users/1072250532645998596/pinned_lists
   response:
@@ -156,7 +156,7 @@ interactions:
         H4sIAAAAAAAAAKpWSkksSVSyqlYqyMzLS01RsiopKk2trQUAAAD//wMAEmYA3BgAAAA=
     headers:
       api-version:
-      - '2.27'
+      - '2.30'
       cache-control:
       - no-cache, no-store, max-age=0
       content-disposition:
@@ -168,7 +168,7 @@ interactions:
       content-type:
       - application/json; charset=utf-8
       date:
-      - Mon, 25 Oct 2021 07:24:51 UTC
+      - Mon, 15 Nov 2021 23:40:31 UTC
       server:
       - tsa_b
       strict-transport-security:
@@ -176,7 +176,7 @@ interactions:
       x-access-level:
       - read-write-directmessages
       x-connection-hash:
-      - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3
+      - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d
       x-content-type-options:
       - nosniff
       x-frame-options:
@@ -184,11 +184,71 @@ interactions:
       x-rate-limit-limit:
       - '50'
       x-rate-limit-remaining:
-      - '49'
+      - '48'
+      x-rate-limit-reset:
+      - '1637019837'
+      x-response-time:
+      - '52'
+      x-xss-protection:
+      - '0'
+    status:
+      code: 200
+      message: OK
+- request:
+    body: null
+    headers:
+      Accept:
+      - '*/*'
+      Accept-Encoding:
+      - gzip, deflate
+      Connection:
+      - keep-alive
+      Cookie:
+      - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q=="
+      User-Agent:
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
+    method: GET
+    uri: https://api.twitter.com/2/users/1072250532645998596/pinned_lists
+  response:
+    body:
+      string: !!binary |
+        H4sIAAAAAAAAAKpWSkksSVSyiq5WykxRslIyNDEzMLY0MrI0szAysjA0MrMwVdJRykvMTQVKhqQW
+        lyj4ZBaXKNXG6ijlpoI0VisVpRaX5pTEJ+eX5pUoWRnW1gIAAAD//wMAQp76YVQAAAA=
+    headers:
+      api-version:
+      - '2.30'
+      cache-control:
+      - no-cache, no-store, max-age=0
+      content-disposition:
+      - attachment; filename=json.json
+      content-encoding:
+      - gzip
+      content-length:
+      - '107'
+      content-type:
+      - application/json; charset=utf-8
+      date:
+      - Mon, 15 Nov 2021 23:40:31 UTC
+      server:
+      - tsa_b
+      strict-transport-security:
+      - max-age=631138519
+      x-access-level:
+      - read-write-directmessages
+      x-connection-hash:
+      - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d
+      x-content-type-options:
+      - nosniff
+      x-frame-options:
+      - SAMEORIGIN
+      x-rate-limit-limit:
+      - '15'
+      x-rate-limit-remaining:
+      - '13'
       x-rate-limit-reset:
-      - '1635147591'
+      - '1637019842'
       x-response-time:
-      - '47'
+      - '45'
       x-xss-protection:
       - '0'
     status:
@@ -206,18 +266,18 @@ interactions:
       Content-Length:
       - '0'
       Cookie:
-      - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog=="
+      - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q=="
       User-Agent:
-      - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
     method: DELETE
-    uri: https://api.twitter.com/2/lists/1452536616203997190/members/783214
+    uri: https://api.twitter.com/2/lists/1460392296822812685/members/783214
   response:
     body:
       string: !!binary |
         H4sIAAAAAAAAAKpWSkksSVSyqlbKLI7PTc1NSi1SskpLzClOra0FAAAA//8DAPnKNe0cAAAA
     headers:
       api-version:
-      - '2.27'
+      - '2.30'
       cache-control:
       - no-cache, no-store, max-age=0
       content-disposition:
@@ -229,7 +289,7 @@ interactions:
       content-type:
       - application/json; charset=utf-8
       date:
-      - Mon, 25 Oct 2021 07:24:51 UTC
+      - Mon, 15 Nov 2021 23:40:31 UTC
       server:
       - tsa_b
       strict-transport-security:
@@ -237,7 +297,7 @@ interactions:
       x-access-level:
       - read-write-directmessages
       x-connection-hash:
-      - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3
+      - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d
       x-content-type-options:
       - nosniff
       x-frame-options:
@@ -247,9 +307,9 @@ interactions:
       x-rate-limit-remaining:
       - '299'
       x-rate-limit-reset:
-      - '1635147591'
+      - '1637020531'
       x-response-time:
-      - '66'
+      - '58'
       x-xss-protection:
       - '0'
     status:
@@ -267,18 +327,18 @@ interactions:
       Content-Length:
       - '0'
       Cookie:
-      - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog=="
+      - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q=="
       User-Agent:
-      - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
     method: DELETE
-    uri: https://api.twitter.com/2/users/1072250532645998596/pinned_lists/1452536616203997190
+    uri: https://api.twitter.com/2/users/1072250532645998596/pinned_lists/1460392296822812685
   response:
     body:
       string: !!binary |
         H4sIAAAAAAAAAKpWSkksSVSyqlYqyMzLS01RskpLzClOra0FAAAA//8DAIhhZ3AZAAAA
     headers:
       api-version:
-      - '2.27'
+      - '2.30'
       cache-control:
       - no-cache, no-store, max-age=0
       content-disposition:
@@ -290,7 +350,7 @@ interactions:
       content-type:
       - application/json; charset=utf-8
       date:
-      - Mon, 25 Oct 2021 07:24:51 UTC
+      - Mon, 15 Nov 2021 23:40:31 UTC
       server:
       - tsa_b
       strict-transport-security:
@@ -298,7 +358,7 @@ interactions:
       x-access-level:
       - read-write-directmessages
       x-connection-hash:
-      - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3
+      - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d
       x-content-type-options:
       - nosniff
       x-frame-options:
@@ -308,7 +368,7 @@ interactions:
       x-rate-limit-remaining:
       - '49'
       x-rate-limit-reset:
-      - '1635147591'
+      - '1637020531'
       x-response-time:
       - '46'
       x-xss-protection:
@@ -330,18 +390,18 @@ interactions:
       Content-Type:
       - application/json
       Cookie:
-      - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog=="
+      - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q=="
       User-Agent:
-      - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
     method: PUT
-    uri: https://api.twitter.com/2/lists/1452536616203997190
+    uri: https://api.twitter.com/2/lists/1460392296822812685
   response:
     body:
       string: !!binary |
-        H4sIAAAAAAAAAKpWKi1ISSxJTVGyKikqTa0FAAAA//8DACu2J84QAAAA
+        H4sIAAAAAAAAAKpWSkksSVSyqlYqLQCyUlOUrEqKSlNrawEAAAD//wMAiqN2DBkAAAA=
     headers:
       api-version:
-      - '2.27'
+      - '2.30'
       cache-control:
       - no-cache, no-store, max-age=0
       content-disposition:
@@ -349,11 +409,11 @@ interactions:
       content-encoding:
       - gzip
       content-length:
-      - '42'
+      - '50'
       content-type:
       - application/json; charset=utf-8
       date:
-      - Mon, 25 Oct 2021 07:24:51 UTC
+      - Mon, 15 Nov 2021 23:40:32 UTC
       server:
       - tsa_b
       strict-transport-security:
@@ -361,7 +421,7 @@ interactions:
       x-access-level:
       - read-write-directmessages
       x-connection-hash:
-      - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3
+      - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d
       x-content-type-options:
       - nosniff
       x-frame-options:
@@ -369,11 +429,11 @@ interactions:
       x-rate-limit-limit:
       - '300'
       x-rate-limit-remaining:
-      - '298'
+      - '299'
       x-rate-limit-reset:
-      - '1635147202'
+      - '1637020531'
       x-response-time:
-      - '387'
+      - '182'
       x-xss-protection:
       - '0'
     status:
@@ -391,18 +451,18 @@ interactions:
       Content-Length:
       - '0'
       Cookie:
-      - guest_id=v1%3A163514669039140044; personalization_id="v1_f6Q7tQ/Do3NkovyN4sJfog=="
+      - guest_id=v1%3A163701963092846827; personalization_id="v1_k+MErbX/xD8eWgq/YrNd0Q=="
       User-Agent:
-      - Python/3.10.0 Requests/2.26.0 Tweepy/4.1.0
+      - Python/3.10.0 Requests/2.26.0 Tweepy/4.3.0
     method: DELETE
-    uri: https://api.twitter.com/2/lists/1452536616203997190
+    uri: https://api.twitter.com/2/lists/1460392296822812685
   response:
     body:
       string: !!binary |
         H4sIAAAAAAAAAKpWSkksSVSyqlZKSc1JLUlNUbIqKSpNra0FAAAA//8DAD5d+0oZAAAA
     headers:
       api-version:
-      - '2.27'
+      - '2.30'
       cache-control:
       - no-cache, no-store, max-age=0
       content-disposition:
@@ -414,7 +474,7 @@ interactions:
       content-type:
       - application/json; charset=utf-8
       date:
-      - Mon, 25 Oct 2021 07:24:51 UTC
+      - Mon, 15 Nov 2021 23:40:32 UTC
       server:
       - tsa_b
       strict-transport-security:
@@ -422,7 +482,7 @@ interactions:
       x-access-level:
       - read-write-directmessages
       x-connection-hash:
-      - b20657636698db22333ea81a4e5d78f071184b672a5e536b229e6cada14038b3
+      - 6f6a7fa4a224bf36b49ae9bb1b0a07624359e343ddbccbafeed39d860e77a63d
       x-content-type-options:
       - nosniff
       x-frame-options:
@@ -430,11 +490,11 @@ interactions:
       x-rate-limit-limit:
       - '300'
       x-rate-limit-remaining:
-      - '299'
+      - '298'
       x-rate-limit-reset:
-      - '1635147591'
+      - '1637019854'
       x-response-time:
-      - '50'
+      - '48'
       x-xss-protection:
       - '0'
     status:
index 5665dd3326f2c882cdd2cc5c6f8019ddb23580f2..c93b25c5adfdad5e882ed0d2d9f444349e59c608 100644 (file)
     +--------------------------------------------------------------+----------------------------------------+
     | .. centered:: :ref:`Lists`                                                                            |
     +-------------------------------------------------------------------------------------------------------+
-    | .. centered:: |Manage Lists|_                                                                         |
+    | .. centered:: |List Tweets lookup|_                                                                   |
     +--------------------------------------------------------------+----------------------------------------+
-    | `DELETE /2/lists/:id`_                                       | :meth:`Client.delete_list`             |
+    | `GET /2/lists/:id/tweets`_                                   | :meth:`Client.get_list_tweets`         |
     +--------------------------------------------------------------+----------------------------------------+
-    | `DELETE /2/lists/:id/members/:user_id`_                      | :meth:`Client.remove_list_member`      |
+    | .. centered:: |List follows|_                                                                         |
     +--------------------------------------------------------------+----------------------------------------+
     | `DELETE /2/users/:id/followed_lists/:list_id`_               | :meth:`Client.unfollow_list`           |
     +--------------------------------------------------------------+----------------------------------------+
-    | `DELETE /2/users/:id/pinned_lists/:list_id`_                 | :meth:`Client.unpin_list`              |
+    | `GET /2/lists/:id/followers`_                                | :meth:`Client.get_list_followers`      |
+    +--------------------------------------------------------------+----------------------------------------+
+    | `GET /2/users/:id/followed_lists`_                           | :meth:`Client.get_followed_lists`      |
+    +--------------------------------------------------------------+----------------------------------------+
+    | `POST /2/users/:id/followed_lists`_                          | :meth:`Client.follow_list`             |
+    +--------------------------------------------------------------+----------------------------------------+
+    | .. centered:: |List lookup|_                                                                          |
+    +--------------------------------------------------------------+----------------------------------------+
+    | `GET /2/lists/:id`_                                          | :meth:`Client.get_list`                |
+    +--------------------------------------------------------------+----------------------------------------+
+    | `GET /2/users/:id/owned_lists`_                              | :meth:`Client.get_owned_lists`         |
+    +--------------------------------------------------------------+----------------------------------------+
+    | .. centered:: |List members|_                                                                         |
+    +--------------------------------------------------------------+----------------------------------------+
+    | `DELETE /2/lists/:id/members/:user_id`_                      | :meth:`Client.remove_list_member`      |
+    +--------------------------------------------------------------+----------------------------------------+
+    | `GET /2/lists/:id/members`_                                  | :meth:`Client.get_list_members`        |
+    +--------------------------------------------------------------+----------------------------------------+
+    | `GET /2/users/:id/list_memberships`_                         | :meth:`Client.get_list_memberships`    |
+    +--------------------------------------------------------------+----------------------------------------+
+    | `POST /2/lists/:id/members`_                                 | :meth:`Client.add_list_member`         |
+    +--------------------------------------------------------------+----------------------------------------+
+    | .. centered:: |Manage Lists|_                                                                         |
+    +--------------------------------------------------------------+----------------------------------------+
+    | `DELETE /2/lists/:id`_                                       | :meth:`Client.delete_list`             |
     +--------------------------------------------------------------+----------------------------------------+
     | `PUT /2/lists/:id`_                                          | :meth:`Client.update_list`             |
     +--------------------------------------------------------------+----------------------------------------+
     | `POST /2/lists`_                                             | :meth:`Client.create_list`             |
     +--------------------------------------------------------------+----------------------------------------+
-    | `POST /2/lists/:id/members`_                                 | :meth:`Client.add_list_member`         |
+    | .. centered:: |Pinned Lists|_                                                                         |
     +--------------------------------------------------------------+----------------------------------------+
-    | `POST /2/users/:id/followed_lists`_                          | :meth:`Client.follow_list`             |
+    | `DELETE /2/users/:id/pinned_lists/:list_id`_                 | :meth:`Client.unpin_list`              |
+    +--------------------------------------------------------------+----------------------------------------+
+    | `GET /2/users/:id/pinned_lists`_                             | :meth:`Client.get_pinned_lists`        |
     +--------------------------------------------------------------+----------------------------------------+
     | `POST /2/users/:id/pinned_lists`_                            | :meth:`Client.pin_list`                |
     +--------------------------------------------------------------+----------------------------------------+
 .. _GET /2/spaces: https://developer.twitter.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces
 .. _GET /2/spaces/by/creator_ids: https://developer.twitter.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces-by-creator-ids
 .. _GET /2/spaces/:id: https://developer.twitter.com/en/docs/twitter-api/spaces/lookup/api-reference/get-spaces-id
+.. |List Tweets lookup| replace:: *List Tweets lookup*
+.. _GET /2/lists/:id/tweets: https://developer.twitter.com/en/docs/twitter-api/lists/list-tweets/api-reference/get-lists-id-tweets
+.. |List follows| replace:: *List follows*
+.. _DELETE /2/users/:id/followed_lists/:list_id: https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/delete-users-id-followed-lists-list_id
+.. _GET /2/lists/:id/followers: https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/get-lists-id-followers
+.. _GET /2/users/:id/followed_lists: https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/get-users-id-followed_lists
+.. _POST /2/users/:id/followed_lists: https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/post-users-id-followed-lists
+.. |List lookup| replace:: *List lookup*
+.. _GET /2/lists/:id: https://developer.twitter.com/en/docs/twitter-api/lists/list-lookup/api-reference/get-lists-id
+.. _GET /2/users/:id/owned_lists: https://developer.twitter.com/en/docs/twitter-api/lists/list-lookup/api-reference/get-users-id-owned_lists
+.. |List members| replace:: *List members*
+.. _DELETE /2/lists/:id/members/:user_id: https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/delete-lists-id-members-user_id
+.. _GET /2/lists/:id/members: https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/get-lists-id-members
+.. _GET /2/users/:id/list_memberships: https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/get-users-id-list_memberships
+.. _POST /2/lists/:id/members: https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/post-lists-id-members
 .. |Manage Lists| replace:: *Manage Lists*
 .. _DELETE /2/lists/:id: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id
-.. _DELETE /2/lists/:id/members/:user_id: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id-members-user_id
-.. _DELETE /2/users/:id/followed_lists/:list_id: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-users-id-followed-lists-list_id
-.. _DELETE /2/users/:id/pinned_lists/:list_id: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-users-id-pinned-lists-list_id
 .. _PUT /2/lists/:id: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/put-lists-id
 .. _POST /2/lists: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-lists
-.. _POST /2/lists/:id/members: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-lists-id-members
-.. _POST /2/users/:id/followed_lists: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-users-id-followed-lists
-.. _POST /2/users/:id/pinned_lists: https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-users-id-pinned-lists
+.. |Pinned Lists| replace:: *Pinned Lists*
+.. _DELETE /2/users/:id/pinned_lists/:list_id: https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/delete-users-id-pinned-lists-list_id
+.. _GET /2/users/:id/pinned_lists: https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/get-users-id-pinned_lists
+.. _POST /2/users/:id/pinned_lists: https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/post-users-id-pinned-lists
 .. |Batch Compliance| replace:: *Batch Compliance*
 .. _GET /2/compliance/jobs: https://developer.twitter.com/en/docs/twitter-api/compliance/batch-compliance/api-reference/get-compliance-jobs
 .. _GET /2/compliance/jobs/:id: https://developer.twitter.com/en/docs/twitter-api/compliance/batch-compliance/api-reference/get-compliance-jobs-id
@@ -346,24 +385,55 @@ Spaces lookup
 Lists
 =====
 
-Manage Lists
+List Tweets lookup
+------------------
+
+.. automethod:: Client.get_list_tweets
+
+List follows
 ------------
 
-.. automethod:: Client.delete_list
+.. automethod:: Client.unfollow_list
+
+.. automethod:: Client.get_list_followers
+
+.. automethod:: Client.get_followed_lists
+
+.. automethod:: Client.follow_list
+
+List lookup
+-----------
+
+.. automethod:: Client.get_list
+
+.. automethod:: Client.get_owned_lists
+
+List members
+------------
 
 .. automethod:: Client.remove_list_member
 
-.. automethod:: Client.unfollow_list
+.. automethod:: Client.get_list_members
 
-.. automethod:: Client.unpin_list
+.. automethod:: Client.get_list_memberships
+
+.. automethod:: Client.add_list_member
+
+Manage Lists
+------------
+
+.. automethod:: Client.delete_list
 
 .. automethod:: Client.update_list
 
 .. automethod:: Client.create_list
 
-.. automethod:: Client.add_list_member
+Pinned Lists
+------------
 
-.. automethod:: Client.follow_list
+.. automethod:: Client.unpin_list
+
+.. automethod:: Client.get_pinned_lists
 
 .. automethod:: Client.pin_list
 
@@ -387,12 +457,16 @@ Expansions and Fields Parameters
 ``expansions``
 --------------
 `Expansions`_ enable you to request additional data objects that relate to the
-originally returned Space, Tweets, or users. Submit a list of desired
+originally returned List, Space, Tweets, or users. Submit a list of desired
 expansions in a comma-separated list without spaces. The ID that represents the
-expanded data object will be included directly in the Space, Tweet, or user
-data object, but the expanded object metadata will be returned within the
+expanded data object will be included directly in the List, Space, Tweet, or
+user data object, but the expanded object metadata will be returned within the
 ``includes`` response object, and will also include the ID so that you can
-match this data object to the original Space or Tweet object.
+match this data object to the original Space, Tweet, or user object.
+
+At this time, the only expansion available to endpoints that primarily return
+List objects is ``expansions=owner_id``. You will find the expanded user data
+object living in the ``includes`` response object.
 
 For methods that return Spaces, the following data objects can be expanded
 using this parameter:
@@ -419,6 +493,15 @@ At this time, the only expansion available to endpoints that primarily return
 user objects is ``expansions=pinned_tweet_id``. You will find the expanded
 Tweet data object living in the ``includes`` response object.
 
+.. _list_fields_parameter:
+
+``list_fields``
+---------------
+This `fields`_ parameter enables you to select which specific `List fields`_
+will deliver with each returned List objects. Specify the desired fields in a
+comma-separated list without spaces between commas and fields. These specified
+List fields will display directly in the List data objects.
+
 .. _media_fields_parameter:
 
 ``media_fields``
@@ -516,6 +599,7 @@ user data objects.
 
 .. _Expansions: https://developer.twitter.com/en/docs/twitter-api/expansions
 .. _fields: https://developer.twitter.com/en/docs/twitter-api/fields
+.. _list fields: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/lists
 .. _media fields: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/media
 .. _place fields: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/place
 .. _poll fields: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/poll
index 559bbdcfaa93d414482a7003bcc73ac68877622e..208f8e7ee0860a772314da1197b83c8c1d95e40b 100644 (file)
@@ -56,6 +56,12 @@ Models Reference
 
       .. versionadded:: 4.0
 
+      .. class:: tweepy.List
+
+         .. versionadded:: 4.4
+
+         :reference: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/lists
+
       .. class:: tweepy.Media
 
          :reference: https://developer.twitter.com/en/docs/twitter-api/data-dictionary/object-model/media
index c4f1313f7f94dfa25c09c370acccc22a2840a7cd..eb3aa5891efcba6dae7a196332b07e9569d226e5 100644 (file)
@@ -154,19 +154,56 @@ class TweepyTestCase(unittest.TestCase):
         # https://twitter.com/TwitterSpaces/status/1436382283347283969
         self.client.get_space(space_id)
 
+    @tape.use_cassette("test_get_list_tweets.yaml", serializer="yaml")
+    def test_get_list_tweets(self):
+        list_id = 84839422  # List ID for Official Twitter Accounts (@Twitter)
+        self.client.get_list_tweets(list_id)
+
     @tape.use_cassette("test_follow_and_unfollow_list.yaml", serializer="yaml")
     def test_follow_and_unfollow_list(self):
         list_id = 84839422  # List ID for Official Twitter Accounts (@Twitter)
         self.client.follow_list(list_id)
         self.client.unfollow_list(list_id)
 
-    @tape.use_cassette("test_manage_list.yaml", serializer="yaml")
-    def test_manage_list(self):
+    @tape.use_cassette("test_get_list_followers.yaml", serializer="yaml")
+    def test_get_list_followers(self):
+        list_id = 84839422  # List ID for Official Twitter Accounts (@Twitter)
+        self.client.get_list_followers(list_id)
+
+    @tape.use_cassette("test_get_followed_lists.yaml", serializer="yaml")
+    def test_get_followed_lists(self):
+        user_id = 372575989  # User ID for @TwitterNews
+        self.client.get_followed_lists(user_id)
+
+    @tape.use_cassette("test_get_list.yaml", serializer="yaml")
+    def test_get_list(self):
+        list_id = 84839422  # List ID for Official Twitter Accounts (@Twitter)
+        self.client.get_list(list_id)
+
+    @tape.use_cassette("test_get_owned_lists.yaml", serializer="yaml")
+    def test_get_owned_lists(self):
+        user_id = 783214  # User ID for @Twitter
+        self.client.get_owned_lists(user_id)
+
+    @tape.use_cassette("test_get_list_members.yaml", serializer="yaml")
+    def test_get_list_members(self):
+        list_id = 84839422  # List ID for Official Twitter Accounts (@Twitter)
+        self.client.get_list_members(list_id)
+
+    @tape.use_cassette("test_get_list_memberships.yaml", serializer="yaml")
+    def test_get_list_memberships(self):
+        user_id = 783214  # User ID for @Twitter
+        self.client.get_list_memberships(user_id)
+
+    @tape.use_cassette("test_manage_and_get_pinned_lists.yaml",
+                       serializer="yaml")
+    def test_manage_and_get_pinned_lists(self):
         response = self.client.create_list("Test List", private=True)
         list_id = response.data["id"]
         user_id = 783214  # User ID for @Twitter
         self.client.add_list_member(list_id, user_id)
         self.client.pin_list(list_id)
+        self.client.get_pinned_lists()
         self.client.remove_list_member(list_id, user_id)
         self.client.unpin_list(list_id)
         self.client.update_list(list_id, description="Test List Description")
index c9632ddec5255cf90be9a7f105f9b80e519a8a57..0609b948e63e5a4cc90d5830b7900a4171437fa8 100644 (file)
@@ -18,6 +18,7 @@ from tweepy.errors import (
     BadRequest, Forbidden, HTTPException, NotFound, TooManyRequests,
     TweepyException, TwitterServerError, Unauthorized
 )
+from tweepy.list import List
 from tweepy.media import Media
 from tweepy.pagination import Paginator
 from tweepy.place import Place
index 52c974bafb0bbcaf8239b7c2c1e66fac7046b879..1a05640472d2cfc61ab07b3329592a72ebd01cde 100644 (file)
@@ -17,6 +17,7 @@ from tweepy.errors import (
     BadRequest, Forbidden, HTTPException, TooManyRequests, TwitterServerError,
     Unauthorized
 )
+from tweepy.list import List
 from tweepy.media import Media
 from tweepy.place import Place
 from tweepy.poll import Poll
@@ -1864,17 +1865,66 @@ class Client:
             ), data_type=Space
         )
 
-    # Manage Lists
+    # List Tweets lookup
 
-    def delete_list(self, id):
-        """Enables the authenticated user to delete a List that they own.
+    def get_list_tweets(self, id, *, user_auth=False, **params):
+        """get_list_tweets(id, *, user_auth=False, expansions, max_results, \
+                           pagination_token, tweet_fields, user_fields)
+
+        Returns a list of Tweets from the specified List.
+
+        .. versionadded:: 4.4
+
+        Parameters
+        ----------
+        id : Union[List[str], str]
+            The ID of the List whose Tweets you would like to retrieve.
+        user_auth : bool
+            Whether or not to use OAuth 1.0a User context
+        expansions : Union[List[str], str]
+            :ref:`expansions_parameter`
+        max_results : int
+            The maximum number of results to be returned per page. This can be
+            a number between 1 and 100. By default, each page will return 100
+            results.
+        pagination_token : str
+            Used to request the next page of results if all results weren't
+            returned with the latest request, or to go back to the previous
+            page of results. To return the next page, pass the next_token
+            returned in your previous response. To go back one page, pass the
+            previous_token returned in your previous response.
+        tweet_fields : Union[List[str], str]
+            :ref:`tweet_fields_parameter`
+        user_fields : Union[List[str], str]
+            :ref:`user_fields_parameter`
+
+        Returns
+        -------
+        Union[dict, requests.Response, Response]
+
+        References
+        ----------
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-tweets/api-reference/get-lists-id-tweets
+        """
+        return self._make_request(
+            "GET", f"/2/lists/{id}/tweets", params=params,
+            endpoint_parameters=(
+                "expansions", "max_results", "pagination_token",
+                "tweet.fields", "user.fields"
+            ), data_type=Tweet, user_auth=user_auth
+        )
+
+    # List follows
+
+    def unfollow_list(self, list_id):
+        """Enables the authenticated user to unfollow a List.
 
         .. versionadded:: 4.2
 
         Parameters
         ----------
-        id : Union[int, str]
-            The ID of the List to be deleted.
+        list_id : Union[int, str]
+            The ID of the List that you would like the user to unfollow.
 
         Returns
         -------
@@ -1882,13 +1932,225 @@ class Client:
 
         References
         ----------
-        https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/delete-users-id-followed-lists-list_id
         """
+        id = self.access_token.partition('-')[0]
+        route = f"/2/users/{id}/followed_lists/{list_id}"
 
         return self._make_request(
-            "DELETE", f"/2/lists/{id}", user_auth=True
+            "DELETE", route, user_auth=True
         )
 
+    def get_list_followers(self, id, *, user_auth=False, **params):
+        """get_list_followers( \
+            id, *, user_auth=False, expansions, max_results, \
+            pagination_token, tweet_fields, user_fields \
+        )
+
+        Returns a list of users who are followers of the specified List.
+
+        .. versionadded:: 4.4
+
+        Parameters
+        ----------
+        id : Union[List[str], str]
+            The ID of the List whose followers you would like to retrieve.
+        user_auth : bool
+            Whether or not to use OAuth 1.0a User context
+        expansions : Union[List[str], str]
+            :ref:`expansions_parameter`
+        max_results : int
+            The maximum number of results to be returned per page. This can be
+            a number between 1 and 100. By default, each page will return 100
+            results.
+        pagination_token : str
+            Used to request the next page of results if all results weren't
+            returned with the latest request, or to go back to the previous
+            page of results. To return the next page, pass the next_token
+            returned in your previous response. To go back one page, pass the
+            previous_token returned in your previous response.
+        tweet_fields : Union[List[str], str]
+            :ref:`tweet_fields_parameter`
+        user_fields : Union[List[str], str]
+            :ref:`user_fields_parameter`
+
+        Returns
+        -------
+        Union[dict, requests.Response, Response]
+
+        References
+        ----------
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/get-lists-id-followers
+        """
+        return self._make_request(
+            "GET", f"/2/lists/{id}/followers", params=params,
+            endpoint_parameters=(
+                "expansions", "max_results", "pagination_token",
+                "tweet.fields", "user.fields"
+            ), data_type=User, user_auth=user_auth
+        )
+
+    def get_followed_lists(self, id, *, user_auth=False, **params):
+        """get_followed_lists( \
+            id, *, user_auth=False, expansions, list_fields, max_results, \
+            pagination_token, user_fields \
+        )
+
+        Returns all Lists a specified user follows.
+
+        .. versionadded:: 4.4
+
+        Parameters
+        ----------
+        id : Union[List[str], str]
+            The user ID whose followed Lists you would like to retrieve.
+        user_auth : bool
+            Whether or not to use OAuth 1.0a User context
+        expansions : Union[List[str], str]
+            :ref:`expansions_parameter`
+        list_fields : Union[List[str], str]
+            :ref:`list_fields_parameter`
+        max_results : int
+            The maximum number of results to be returned per page. This can be
+            a number between 1 and 100. By default, each page will return 100
+            results.
+        pagination_token : str
+            Used to request the next page of results if all results weren't
+            returned with the latest request, or to go back to the previous
+            page of results. To return the next page, pass the next_token
+            returned in your previous response. To go back one page, pass the
+            previous_token returned in your previous response.
+        user_fields : Union[List[str], str]
+            :ref:`user_fields_parameter`
+
+        Returns
+        -------
+        Union[dict, requests.Response, Response]
+
+        References
+        ----------
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/get-users-id-followed_lists
+        """
+        return self._make_request(
+            "GET", f"/2/users/{id}/followed_lists", params=params,
+            endpoint_parameters=(
+                "expansions", "list.fields", "max_results", "pagination_token",
+                "user.fields"
+            ), data_type=List, user_auth=user_auth
+        )
+
+    def follow_list(self, list_id):
+        """Enables the authenticated user to follow a List.
+
+        .. versionadded:: 4.2
+
+        Parameters
+        ----------
+        list_id : Union[int, str]
+            The ID of the List that you would like the user to follow.
+
+        Returns
+        -------
+        Union[dict, requests.Response, Response]
+
+        References
+        ----------
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-follows/api-reference/post-users-id-followed-lists
+        """
+        id = self.access_token.partition('-')[0]
+        route = f"/2/users/{id}/followed_lists"
+
+        return self._make_request(
+            "POST", route, json={"list_id": str(list_id)}, user_auth=True
+        )
+
+    # List lookup
+
+    def get_list(self, id, *, user_auth=False, **params):
+        """get_list(id, *, user_auth=False, expansions, list_fields, \
+                    user_fields)
+
+        Returns the details of a specified List.
+
+        .. versionadded:: 4.4
+
+        Parameters
+        ----------
+        id : Union[List[str], str]
+            The ID of the List to lookup.
+        user_auth : bool
+            Whether or not to use OAuth 1.0a User context
+        expansions : Union[List[str], str]
+            :ref:`expansions_parameter`
+        list_fields : Union[List[str], str]
+            :ref:`list_fields_parameter`
+        user_fields : Union[List[str], str]
+            :ref:`user_fields_parameter`
+
+        Returns
+        -------
+        Union[dict, requests.Response, Response]
+
+        References
+        ----------
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-lookup/api-reference/get-lists-id
+        """
+        return self._make_request(
+            "GET", f"/2/lists/{id}", params=params,
+            endpoint_parameters=(
+                "expansions", "list.fields", "user.fields"
+            ), data_type=List, user_auth=user_auth
+        )
+
+    def get_owned_lists(self, id, *, user_auth=False, **params):
+        """get_owned_lists(id, *, user_auth=False, expansions, list_fields, \
+                           max_results, pagination_token, user_fields)
+
+        Returns all Lists owned by the specified user.
+
+        .. versionadded:: 4.4
+
+        Parameters
+        ----------
+        id : Union[List[str], str]
+            The user ID whose owned Lists you would like to retrieve.
+        user_auth : bool
+            Whether or not to use OAuth 1.0a User context
+        expansions : Union[List[str], str]
+            :ref:`expansions_parameter`
+        list_fields : Union[List[str], str]
+            :ref:`list_fields_parameter`
+        max_results : int
+            The maximum number of results to be returned per page. This can be
+            a number between 1 and 100. By default, each page will return 100
+            results.
+        pagination_token : str
+            Used to request the next page of results if all results weren't
+            returned with the latest request, or to go back to the previous
+            page of results. To return the next page, pass the next_token
+            returned in your previous response. To go back one page, pass the
+            previous_token returned in your previous response.
+        user_fields : Union[List[str], str]
+            :ref:`user_fields_parameter`
+
+        Returns
+        -------
+        Union[dict, requests.Response, Response]
+
+        References
+        ----------
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-lookup/api-reference/get-users-id-owned_lists
+        """
+        return self._make_request(
+            "GET", f"/2/users/{id}/owned_lists", params=params,
+            endpoint_parameters=(
+                "expansions", "list.fields", "max_results", "pagination_token",
+                "user.fields"
+            ), data_type=List, user_auth=user_auth
+        )
+
+    # List members
+
     def remove_list_member(self, id, user_id):
         """Enables the authenticated user to remove a member from a List they
         own.
@@ -1908,22 +2170,43 @@ class Client:
 
         References
         ----------
-        https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id-members-user_id
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/delete-lists-id-members-user_id
         """
 
         return self._make_request(
             "DELETE", f"/2/lists/{id}/members/{user_id}", user_auth=True
         )
 
-    def unfollow_list(self, list_id):
-        """Enables the authenticated user to unfollow a List.
+    def get_list_members(self, id, *, user_auth=False, **params):
+        """get_list_members(id, *, user_auth=False, expansions, max_results, \
+                            pagination_token, tweet_fields, user_fields)
 
-        .. versionadded:: 4.2
+        Returns a list of users who are members of the specified List.
+
+        .. versionadded:: 4.4
 
         Parameters
         ----------
-        list_id : Union[int, str]
-            The ID of the List that you would like the user to unfollow.
+        id : Union[List[str], str]
+            The ID of the List whose members you would like to retrieve.
+        user_auth : bool
+            Whether or not to use OAuth 1.0a User context
+        expansions : Union[List[str], str]
+            :ref:`expansions_parameter`
+        max_results : int
+            The maximum number of results to be returned per page. This can be
+            a number between 1 and 100. By default, each page will return 100
+            results.
+        pagination_token : str
+            Used to request the next page of results if all results weren't
+            returned with the latest request, or to go back to the previous
+            page of results. To return the next page, pass the next_token
+            returned in your previous response. To go back one page, pass the
+            previous_token returned in your previous response.
+        tweet_fields : Union[List[str], str]
+            :ref:`tweet_fields_parameter`
+        user_fields : Union[List[str], str]
+            :ref:`user_fields_parameter`
 
         Returns
         -------
@@ -1931,24 +2214,76 @@ class Client:
 
         References
         ----------
-        https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-users-id-followed-lists-list_id
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/get-lists-id-members
         """
-        id = self.access_token.partition('-')[0]
-        route = f"/2/users/{id}/followed_lists/{list_id}"
+        return self._make_request(
+            "GET", f"/2/lists/{id}/members", params=params,
+            endpoint_parameters=(
+                "expansions", "max_results", "pagination_token",
+                "tweet.fields", "user.fields"
+            ), data_type=User, user_auth=user_auth
+        )
+
+    def get_list_memberships(self, id, *, user_auth=False, **params):
+        """get_list_memberships( \
+            id, *, user_auth=False, expansions, list_fields, max_results, \
+            pagination_token, user_fields \
+        )
+
+        Returns all Lists a specified user is a member of.
+
+        .. versionadded:: 4.4
+
+        Parameters
+        ----------
+        id : Union[List[str], str]
+            The user ID whose List memberships you would like to retrieve.
+        user_auth : bool
+            Whether or not to use OAuth 1.0a User context
+        expansions : Union[List[str], str]
+            :ref:`expansions_parameter`
+        list_fields : Union[List[str], str]
+            :ref:`list_fields_parameter`
+        max_results : int
+            The maximum number of results to be returned per page. This can be
+            a number between 1 and 100. By default, each page will return 100
+            results.
+        pagination_token : str
+            Used to request the next page of results if all results weren't
+            returned with the latest request, or to go back to the previous
+            page of results. To return the next page, pass the next_token
+            returned in your previous response. To go back one page, pass the
+            previous_token returned in your previous response.
+        user_fields : Union[List[str], str]
+            :ref:`user_fields_parameter`
 
+        Returns
+        -------
+        Union[dict, requests.Response, Response]
+
+        References
+        ----------
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/get-users-id-list_memberships
+        """
         return self._make_request(
-            "DELETE", route, user_auth=True
+            "GET", f"/2/users/{id}/list_memberships", params=params,
+            endpoint_parameters=(
+                "expansions", "list.fields", "max_results", "pagination_token",
+                "user.fields"
+            ), data_type=List, user_auth=user_auth
         )
 
-    def unpin_list(self, list_id):
-        """Enables the authenticated user to unpin a List.
+    def add_list_member(self, id, user_id):
+        """Enables the authenticated user to add a member to a List they own.
 
         .. versionadded:: 4.2
 
         Parameters
         ----------
-        list_id : Union[int, str]
-            The ID of the List that you would like the user to unpin.
+        id : Union[int, str]
+            The ID of the List you are adding a member to.
+        user_id : Union[int, str]
+            The ID of the user you wish to add as a member of the List.
 
         Returns
         -------
@@ -1956,13 +2291,36 @@ class Client:
 
         References
         ----------
-        https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-users-id-pinned-lists-list_id
+        https://developer.twitter.com/en/docs/twitter-api/lists/list-members/api-reference/post-lists-id-members
+        """
+        return self._make_request(
+            "POST", f"/2/lists/{id}/members", json={"user_id": str(user_id)},
+            user_auth=True
+        )
+
+    # Manage Lists
+
+    def delete_list(self, id):
+        """Enables the authenticated user to delete a List that they own.
+
+        .. versionadded:: 4.2
+
+        Parameters
+        ----------
+        id : Union[int, str]
+            The ID of the List to be deleted.
+
+        Returns
+        -------
+        Union[dict, requests.Response, Response]
+
+        References
+        ----------
+        https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/delete-lists-id
         """
-        id = self.access_token.partition('-')[0]
-        route = f"/2/users/{id}/pinned_lists/{list_id}"
 
         return self._make_request(
-            "DELETE", route, user_auth=True
+            "DELETE", f"/2/lists/{id}", user_auth=True
         )
 
     def update_list(self, id, *, description=None, name=None, private=None):
@@ -2039,17 +2397,17 @@ class Client:
             "POST", f"/2/lists", json=json, user_auth=True
         )
 
-    def add_list_member(self, id, user_id):
-        """Enables the authenticated user to add a member to a List they own.
+    # Pinned Lists
+
+    def unpin_list(self, list_id):
+        """Enables the authenticated user to unpin a List.
 
         .. versionadded:: 4.2
 
         Parameters
         ----------
-        id : Union[int, str]
-            The ID of the List you are adding a member to.
-        user_id : Union[int, str]
-            The ID of the user you wish to add as a member of the List.
+        list_id : Union[int, str]
+            The ID of the List that you would like the user to unpin.
 
         Returns
         -------
@@ -2057,22 +2415,30 @@ class Client:
 
         References
         ----------
-        https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-lists-id-members
+        https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/delete-users-id-pinned-lists-list_id
         """
+        id = self.access_token.partition('-')[0]
+        route = f"/2/users/{id}/pinned_lists/{list_id}"
+
         return self._make_request(
-            "POST", f"/2/lists/{id}/members", json={"user_id": str(user_id)},
-            user_auth=True
+            "DELETE", route, user_auth=True
         )
 
-    def follow_list(self, list_id):
-        """Enables the authenticated user to follow a List.
+    def get_pinned_lists(self, **params):
+        """get_pinned_lists(*, expansions, list_fields, user_fields)
 
-        .. versionadded:: 4.2
+        Returns the Lists pinned by a specified user.
+
+        .. versionadded:: 4.4
 
         Parameters
         ----------
-        list_id : Union[int, str]
-            The ID of the List that you would like the user to follow.
+        expansions : Union[List[str], str]
+            :ref:`expansions_parameter`
+        list_fields : Union[List[str], str]
+            :ref:`list_fields_parameter`
+        user_fields : Union[List[str], str]
+            :ref:`user_fields_parameter`
 
         Returns
         -------
@@ -2080,13 +2446,16 @@ class Client:
 
         References
         ----------
-        https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-users-id-followed-lists
+        https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/get-users-id-pinned_lists
         """
         id = self.access_token.partition('-')[0]
-        route = f"/2/users/{id}/followed_lists"
+        route = f"/2/users/{id}/pinned_lists"
 
         return self._make_request(
-            "POST", route, json={"list_id": str(list_id)}, user_auth=True
+            "GET", route, params=params,
+            endpoint_parameters=(
+                "expansions", "list.fields", "user.fields"
+            ), data_type=List, user_auth = True
         )
 
     def pin_list(self, list_id):
@@ -2105,7 +2474,7 @@ class Client:
 
         References
         ----------
-        https://developer.twitter.com/en/docs/twitter-api/lists/manage-lists/api-reference/post-users-id-pinned-lists
+        https://developer.twitter.com/en/docs/twitter-api/lists/pinned-lists/api-reference/post-users-id-pinned-lists
         """
         id = self.access_token.partition('-')[0]
         route = f"/2/users/{id}/pinned_lists"
diff --git a/tweepy/list.py b/tweepy/list.py
new file mode 100644 (file)
index 0000000..a49264a
--- /dev/null
@@ -0,0 +1,35 @@
+# Tweepy
+# Copyright 2009-2021 Joshua Roesslein
+# See LICENSE for details.
+
+from tweepy.mixins import DataMapping, HashableID
+from tweepy.utils import parse_datetime
+
+
+class List(HashableID, DataMapping):
+
+    __slots__ = (
+        "data", "id", "name", "created_at", "description", "follower_count",
+        "member_count", "private", "owner_id"
+    )
+
+    def __init__(self, data):
+        self.data = data
+        self.id = data["id"]
+        self.name = data["name"]
+
+        self.created_at = data.get("created_at")
+        if self.created_at is not None:
+            self.created_at = parse_datetime(self.created_at)
+
+        self.description = data.get("description")
+        self.follower_count = data.get("follower_count")
+        self.member_count = data.get("member_count")
+        self.private = data.get("private")
+        self.owner_id = data.get("owner_id")
+
+    def __repr__(self):
+        return f"<List id={self.id} name={self.name}>"
+
+    def __str__(self):
+        return self.name