Skip to content
This repository was archived by the owner on Nov 7, 2022. It is now read-only.

Commit 22c4b7b

Browse files
ltoussaintdghubble
authored andcommitted
Add support for rate_limit_status endpoint (#124)
1 parent 66265ea commit 22c4b7b

4 files changed

Lines changed: 110 additions & 0 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ go-twitter is a Go client library for the [Twitter API](https://dev.twitter.com/
1212
* Friends
1313
* Friendships
1414
* Followers
15+
* RateLimits
1516
* Search
1617
* Statuses
1718
* Timelines

twitter/rate_limits.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package twitter
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/dghubble/sling"
7+
)
8+
9+
// RateLimitService provides methods for accessing Twitter rate limits
10+
// API endpoints.
11+
type RateLimitService struct {
12+
sling *sling.Sling
13+
}
14+
15+
// newRateLimitService returns a new RateLimitService.
16+
func newRateLimitService(sling *sling.Sling) *RateLimitService {
17+
return &RateLimitService{
18+
sling: sling.Path("application/"),
19+
}
20+
}
21+
22+
// RateLimit summarizes current rate limits of resource families.
23+
type RateLimit struct {
24+
RateLimitContext *RateLimitContext `json:"rate_limit_context"`
25+
Resources *RateLimitResources `json:"resources"`
26+
}
27+
28+
// RateLimitContext contains auth context
29+
type RateLimitContext struct {
30+
AccessToken string `json:"access_token"`
31+
}
32+
33+
// RateLimitResources contains all limit status data for endpoints group by resources
34+
type RateLimitResources struct {
35+
Application map[string]*RateLimitResource `json:"application"`
36+
Favorites map[string]*RateLimitResource `json:"favorites"`
37+
Followers map[string]*RateLimitResource `json:"followers"`
38+
Friends map[string]*RateLimitResource `json:"friends"`
39+
Friendships map[string]*RateLimitResource `json:"friendships"`
40+
Geo map[string]*RateLimitResource `json:"geo"`
41+
Help map[string]*RateLimitResource `json:"help"`
42+
Lists map[string]*RateLimitResource `json:"lists"`
43+
Search map[string]*RateLimitResource `json:"search"`
44+
Statuses map[string]*RateLimitResource `json:"statuses"`
45+
Trends map[string]*RateLimitResource `json:"trends"`
46+
Users map[string]*RateLimitResource `json:"users"`
47+
}
48+
49+
// RateLimitResource contains limit status data for a single endpoint
50+
type RateLimitResource struct {
51+
Limit int `json:"limit"`
52+
Remaining int `json:"remaining"`
53+
Reset int `json:"reset"`
54+
}
55+
56+
// RateLimitParams are the parameters for RateLimitService.Status.
57+
type RateLimitParams struct {
58+
Resources []string `url:"resources,omitempty,comma"`
59+
}
60+
61+
// Status summarizes the current rate limits of specified resource families.
62+
// https://developer.twitter.com/en/docs/developer-utilities/rate-limit-status/api-reference/get-application-rate_limit_status
63+
func (s *RateLimitService) Status(params *RateLimitParams) (*RateLimit, *http.Response, error) {
64+
rateLimit := new(RateLimit)
65+
apiError := new(APIError)
66+
resp, err := s.sling.New().Get("rate_limit_status.json").QueryStruct(params).Receive(rateLimit, apiError)
67+
return rateLimit, resp, relevantError(err, *apiError)
68+
}

twitter/rate_limits_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package twitter
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
)
10+
11+
func TestRateLimitService_Status(t *testing.T) {
12+
httpClient, mux, server := testServer()
13+
defer server.Close()
14+
15+
mux.HandleFunc("/1.1/application/rate_limit_status.json", func(w http.ResponseWriter, r *http.Request) {
16+
assertMethod(t, "GET", r)
17+
assertQuery(t, map[string]string{"resources": "statuses,users"}, r)
18+
w.Header().Set("Content-Type", "application/json")
19+
fmt.Fprintf(w, `{"rate_limit_context":{"access_token":"a_fake_access_token"},"resources":{"statuses":{"/statuses/mentions_timeline":{"limit":75,"remaining":75,"reset":1403602426},"/statuses/lookup":{"limit":900,"remaining":900,"reset":1403602426}}}}`)
20+
})
21+
22+
client := NewClient(httpClient)
23+
rateLimits, _, err := client.RateLimits.Status(&RateLimitParams{Resources: []string{"statuses", "users"}})
24+
expected := &RateLimit{
25+
RateLimitContext: &RateLimitContext{AccessToken: "a_fake_access_token"},
26+
Resources: &RateLimitResources{
27+
Statuses: map[string]*RateLimitResource{
28+
"/statuses/mentions_timeline": &RateLimitResource{
29+
Limit: 75,
30+
Remaining: 75,
31+
Reset: 1403602426},
32+
"/statuses/lookup": &RateLimitResource{
33+
Limit: 900,
34+
Remaining: 900,
35+
Reset: 1403602426}}}}
36+
37+
assert.Nil(t, err)
38+
assert.Equal(t, expected, rateLimits)
39+
}

twitter/twitter.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type Client struct {
1818
Followers *FollowerService
1919
Friends *FriendService
2020
Friendships *FriendshipService
21+
RateLimits *RateLimitService
2122
Search *SearchService
2223
Statuses *StatusService
2324
Streams *StreamService
@@ -37,6 +38,7 @@ func NewClient(httpClient *http.Client) *Client {
3738
Followers: newFollowerService(base.New()),
3839
Friends: newFriendService(base.New()),
3940
Friendships: newFriendshipService(base.New()),
41+
RateLimits: newRateLimitService(base.New()),
4042
Search: newSearchService(base.New()),
4143
Statuses: newStatusService(base.New()),
4244
Streams: newStreamService(httpClient, base.New()),

0 commit comments

Comments
 (0)