twitter 4.5.0 → 4.6.0
Sign up to get free protection for your applications and to get access to all the features.
- data.tar.gz.sig +3 -0
- data/CHANGELOG.md +8 -1
- data/LICENSE.md +1 -1
- data/README.md +175 -155
- data/lib/twitter/api/friends_and_followers.rb +8 -8
- data/lib/twitter/api/tweets.rb +6 -5
- data/lib/twitter/api/users.rb +3 -0
- data/lib/twitter/base.rb +3 -1
- data/lib/twitter/error/client_error.rb +1 -1
- data/lib/twitter/tweet.rb +8 -5
- data/lib/twitter/user.rb +7 -0
- data/lib/twitter/version.rb +1 -1
- data/spec/helper.rb +10 -6
- data/spec/twitter/api/tweets_spec.rb +10 -0
- data/spec/twitter/tweet_spec.rb +8 -8
- data/spec/twitter/user_spec.rb +22 -0
- data/twitter.gemspec +13 -8
- metadata +66 -21
- metadata.gz.sig +0 -0
data.tar.gz.sig
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,13 @@
|
|
1
|
+
4.6.0
|
2
|
+
-----
|
3
|
+
* [Make `Twitter::Base#attrs` call methods if they exist](https://github.com/sferik/twitter/commit/ff4f2daccd1acdfddcea7139d4dd6490b55129db)
|
4
|
+
* [Allow `Twitter::API::Tweets#oembed` and `Twitter::API::Tweets#oembeds` to take a URL](https://github.com/sferik/twitter/commit/0d986fa4b0c254e8c816bce086c3f6648d8fd3d7) ([@bshelton229](https://twitter.com/bshelton229))
|
5
|
+
* [Add `Twitter::Tweet#filter_level` and `Twitter##Tweet#lang` attribute readers](https://github.com/sferik/twitter/commit/283aafbe1219e55f19a76517d9edce497001fca2)
|
6
|
+
* [Add "Quick Start Guide" to the `README`](https://github.com/sferik/twitter/commit/afc24ee1bd07f19ef7fb8fd6b85aede34f3ab156) ([@coreyhaines](https://twitter.com/coreyhaines))
|
7
|
+
|
1
8
|
4.5.0
|
2
9
|
-----
|
3
|
-
* [Add no_retweet_ids](https://github.com/sferik/twitter/commit/cab8d6ebf3afdbd24463932262798a132d70a6f1)
|
10
|
+
* [Add no_retweet_ids](https://github.com/sferik/twitter/commit/cab8d6ebf3afdbd24463932262798a132d70a6f1) ([@tibbon](https://twitter.com/tibbon))
|
4
11
|
|
5
12
|
4.4.4
|
6
13
|
-----
|
data/LICENSE.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
Copyright (c) 2006-
|
1
|
+
Copyright (c) 2006-2013 John Nunemaker, Wynn Netherland, Erik Michaels-Ober, Steve Richert
|
2
2
|
|
3
3
|
Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
a copy of this software and associated documentation files (the
|
data/README.md
CHANGED
@@ -1,31 +1,67 @@
|
|
1
1
|
# The Twitter Ruby Gem
|
2
|
+
|
2
3
|
[![Gem Version](https://badge.fury.io/rb/twitter.png)][gem]
|
3
4
|
[![Build Status](https://secure.travis-ci.org/sferik/twitter.png?branch=master)][travis]
|
4
5
|
[![Dependency Status](https://gemnasium.com/sferik/twitter.png?travis)][gemnasium]
|
5
|
-
[![Code Climate](https://codeclimate.com/
|
6
|
+
[![Code Climate](https://codeclimate.com/github/sferik/twitter.png)][codeclimate]
|
7
|
+
[![Coverage Status](https://coveralls.io/repos/sferik/twitter/badge.png?branch=master)][coveralls]
|
6
8
|
[![Click here to make a donation](http://www.pledgie.com/campaigns/18388.png)][pledgie]
|
7
9
|
|
8
10
|
[gem]: https://rubygems.org/gems/twitter
|
9
11
|
[travis]: http://travis-ci.org/sferik/twitter
|
10
12
|
[gemnasium]: https://gemnasium.com/sferik/twitter
|
11
13
|
[codeclimate]: https://codeclimate.com/github/sferik/twitter
|
14
|
+
[coveralls]: https://coveralls.io/r/sferik/twitter
|
12
15
|
[pledgie]: http://pledgie.com/campaigns/18388
|
13
16
|
|
14
17
|
A Ruby interface to the Twitter API.
|
15
18
|
|
16
19
|
## Installation
|
17
|
-
|
18
|
-
|
20
|
+
gem install twitter
|
21
|
+
|
22
|
+
To ensure the code you're installing hasn't been tampered with, it's
|
23
|
+
recommended that you verify the signature. To do this, you need to add my
|
24
|
+
public key as a trusted certificate (you only need to do this once):
|
25
|
+
|
26
|
+
gem cert --add <(curl -Ls https://gist.github.com/sferik/4701180/raw/public_cert.pem)
|
27
|
+
|
28
|
+
Then, install the gem with the high security trust policy:
|
29
|
+
|
30
|
+
gem install twitter -P HighSecurity
|
31
|
+
|
32
|
+
## Quick Start Guide
|
33
|
+
So you want to get up and tweeting as fast as possible?
|
34
|
+
|
35
|
+
First, [register your application with Twitter][register].
|
36
|
+
|
37
|
+
Then, copy and paste in your OAuth data.
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
Twitter.configure do |config|
|
41
|
+
config.consumer_key = YOUR_CONSUMER_KEY
|
42
|
+
config.consumer_secret = YOUR_CONSUMER_SECRET
|
43
|
+
config.oauth_token = YOUR_OAUTH_TOKEN
|
44
|
+
config.oauth_token_secret = YOUR_OAUTH_TOKEN_SECRET
|
45
|
+
end
|
19
46
|
```
|
20
47
|
|
48
|
+
That's it! You're ready to Tweet:
|
49
|
+
```ruby
|
50
|
+
Twitter.update("I'm tweeting with @gem!")
|
51
|
+
```
|
52
|
+
|
53
|
+
For more examples of how to use the gem, read the [documentation][] or see [Usage Examples][] below.
|
54
|
+
|
55
|
+
[register]: https://dev.twitter.com/apps/new
|
56
|
+
[Usage Examples]: #usage-examples
|
57
|
+
|
58
|
+
## CLI
|
59
|
+
|
21
60
|
Looking for the Twitter command-line interface? It was [removed][] from this
|
22
|
-
gem in version 0.5.0 and now exists as a [separate project][
|
61
|
+
gem in version 0.5.0 and now exists as a [separate project][t].
|
23
62
|
|
24
|
-
```sh
|
25
|
-
gem install t
|
26
|
-
```
|
27
63
|
[removed]: https://github.com/sferik/twitter/commit/dd2445e3e2c97f38b28a3f32ea902536b3897adf
|
28
|
-
[
|
64
|
+
[t]: https://github.com/sferik/t
|
29
65
|
|
30
66
|
## Documentation
|
31
67
|
[http://rdoc.info/gems/twitter][documentation]
|
@@ -49,132 +85,11 @@ wiki][apps]!
|
|
49
85
|
|
50
86
|
[apps]: https://github.com/sferik/twitter/wiki/apps
|
51
87
|
|
52
|
-
## What's new in version 4?
|
53
|
-
|
54
|
-
#### Twitter API v1.1
|
55
|
-
|
56
|
-
Version 4 of this library targets Twitter API v1.1. To understand the
|
57
|
-
implications of this change, please read the following announcements from
|
58
|
-
Twitter:
|
59
|
-
|
60
|
-
* [Changes coming in Version 1.1 of the Twitter API][coming]
|
61
|
-
* [Current status: API v1.1][status]
|
62
|
-
* [Overview: Version 1.1 of the Twitter API][overview]
|
63
|
-
|
64
|
-
[coming]: https://dev.twitter.com/blog/changes-coming-to-twitter-api
|
65
|
-
[status]: https://dev.twitter.com/blog/current-status-api-v1.1
|
66
|
-
[overview]: https://dev.twitter.com/docs/api/1.1/overview
|
67
|
-
|
68
|
-
Despite the removal of certain underlying functionality in Twitter API v1.1,
|
69
|
-
this library aims to preserve backward-compatibility wherever possible. For
|
70
|
-
example, despite the removal of the [`GET
|
71
|
-
statuses/retweeted_by_user`][retweeted_by_user] resource, the
|
72
|
-
`Twitter::API#retweeted_by_user` method continues to exist, implemented by
|
73
|
-
making multiple requests to the [`GET statuses/user_timeline`][user_timeline]
|
74
|
-
resource. As a result, there is no longer a one-to-one correlation between
|
75
|
-
method calls and Twitter API requests. In fact, it's possible for a single
|
76
|
-
method call to exceed the Twitter API rate limit for a resource. If you think
|
77
|
-
this might cause a problem for your application, feel free to [join the
|
78
|
-
discussion][discussion].
|
79
|
-
|
80
|
-
[retweeted_by_user]: https://dev.twitter.com/docs/api/1/get/statuses/retweeted_by_user
|
81
|
-
[user_timeline]: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
|
82
|
-
[discussion]: https://dev.twitter.com/discussions/10644
|
83
|
-
|
84
|
-
#### Rate Limiting
|
85
|
-
|
86
|
-
Another consequence of Twitter API v1.1 is that the
|
87
|
-
`Twitter::Client#rate_limit` method has been removed, since the concept of a
|
88
|
-
client-wide rate limit no longer exists. Rate limits are now applied on a
|
89
|
-
per-resource level, however, since there is no longer a one-to-one mapping
|
90
|
-
between methods and Twitter API resources, it's not entirely obvious how rate
|
91
|
-
limit information should be exposed. I've decided to go back to the pre-3.0.0
|
92
|
-
behavior of including rate limit information on `Twitter::Error` objects.
|
93
|
-
Here's an example of how to handle rate limits:
|
94
|
-
|
95
|
-
```ruby
|
96
|
-
MAX_ATTEMPTS = 3
|
97
|
-
num_attempts = 0
|
98
|
-
begin
|
99
|
-
num_attempts += 1
|
100
|
-
retweets = Twitter.retweeted_by_user("sferik")
|
101
|
-
rescue Twitter::Error::TooManyRequests => error
|
102
|
-
if num_attempts <= MAX_ATTEMPTS
|
103
|
-
# NOTE: Your process could go to sleep for up to 15 minutes but if you
|
104
|
-
# retry any sooner, it will almost certainly fail with the same exception.
|
105
|
-
sleep error.rate_limit.reset_in
|
106
|
-
retry
|
107
|
-
else
|
108
|
-
raise
|
109
|
-
end
|
110
|
-
end
|
111
|
-
```
|
112
|
-
#### Methods Missing
|
113
|
-
|
114
|
-
As a consequence of moving to Twitter API v1.1, the following methods from
|
115
|
-
version 3 are no longer available in version 4:
|
116
|
-
|
117
|
-
* `Twitter::API#accept`
|
118
|
-
* `Twitter::API#deny`
|
119
|
-
* `Twitter::API#disable_notifications`
|
120
|
-
* `Twitter::API#enable_notifications`
|
121
|
-
* `Twitter::API#end_session`
|
122
|
-
* `Twitter::API#rate_limit_status`
|
123
|
-
* `Twitter::API#rate_limited?`
|
124
|
-
* `Twitter::API#recommendations`
|
125
|
-
* `Twitter::API#related_results`
|
126
|
-
* `Twitter::API#retweeted_to_user`
|
127
|
-
* `Twitter::API#trends_daily`
|
128
|
-
* `Twitter::API#trends_weekly`
|
129
|
-
* `Twitter::Client#rate_limit`
|
130
|
-
* `Twitter::RateLimit#class`
|
131
|
-
|
132
|
-
#### Custom Endpoints
|
133
|
-
|
134
|
-
The `Twitter::API#update_with_media` method no longer uses the custom
|
135
|
-
`upload.twitter.com` endpoint, so `media_endpoint` configuration has been
|
136
|
-
removed. Likewise, the `Twitter::API#search` method no longer uses the custom
|
137
|
-
`search.twitter.com` endpoint, so `search_endpoint` configuration has also been
|
138
|
-
removed.
|
139
|
-
|
140
|
-
#### Errors
|
141
|
-
|
142
|
-
It's worth mentioning new error classes:
|
143
|
-
|
144
|
-
* `Twitter::Error::GatewayTimeout`
|
145
|
-
* `Twitter::Error::TooManyRequests`
|
146
|
-
* `Twitter::Error::UnprocessableEntity`
|
147
|
-
|
148
|
-
In previous versions of this library, rate limit errors were indicated by
|
149
|
-
raising either `Twitter::Error::BadRequest` or
|
150
|
-
`Twitter::Error::EnhanceYourCalm` (for the Search API). As of version 4, the
|
151
|
-
library will raise `Twitter::Error::TooManyRequests` for all rate limit errors.
|
152
|
-
The `Twitter::Error::EnhanceYourCalm` class has been aliased to
|
153
|
-
`Twitter::Error::TooManyRequests`.
|
154
|
-
|
155
|
-
#### Identity Map
|
156
|
-
|
157
|
-
In version 4, the identity map is [disabled by default][disabled]. If you want
|
158
|
-
to enable this feature, you can use the [default identity map][default] or
|
159
|
-
[write a custom identity map][custom].
|
160
|
-
|
161
|
-
```ruby
|
162
|
-
Twitter.identity_map = Twitter::IdentityMap
|
163
|
-
```
|
164
|
-
|
165
|
-
[disabled]: https://github.com/sferik/twitter/commit/c6c5960bea998abdc3e82cbb8dd68766a2df52e1
|
166
|
-
[default]: https://github.com/sferik/twitter/blob/master/lib/twitter/identity_map.rb
|
167
|
-
[custom]: https://github.com/sferik/twitter/blob/master/etc/sqlite_identity_map.rb
|
168
|
-
|
169
88
|
## Configuration
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
http://dev.twitter.com/apps/new. If you've previously registered a Twitter
|
175
|
-
application, it will be listed at http://dev.twitter.com/apps. Once you've
|
176
|
-
registered an application, make sure to set the correct access level, otherwise
|
177
|
-
you may see the error:
|
89
|
+
Twitter API v1.1 requires you to authenticate via OAuth, so you'll need to
|
90
|
+
[register your application with Twitter][register]. Once you've registered an
|
91
|
+
application, make sure to set the correct access level, otherwise you may see
|
92
|
+
the error:
|
178
93
|
|
179
94
|
Read-only application cannot POST
|
180
95
|
|
@@ -199,12 +114,10 @@ end
|
|
199
114
|
|
200
115
|
Alternately, you can set the following environment variables:
|
201
116
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
TWITTER_OAUTH_TOKEN_SECRET
|
207
|
-
```
|
117
|
+
TWITTER_CONSUMER_KEY
|
118
|
+
TWITTER_CONSUMER_SECRET
|
119
|
+
TWITTER_OAUTH_TOKEN
|
120
|
+
TWITTER_OAUTH_TOKEN_SECRET
|
208
121
|
|
209
122
|
After configuration, requests can be made like so:
|
210
123
|
|
@@ -213,7 +126,6 @@ Twitter.update("I'm tweeting with @gem!")
|
|
213
126
|
```
|
214
127
|
|
215
128
|
#### Thread Safety
|
216
|
-
|
217
129
|
Applications that make requests on behalf of multiple Twitter users should
|
218
130
|
avoid using global configuration. In this case, you may still specify the
|
219
131
|
`consumer_key` and `consumer_secret` globally. (In a Rails application, this
|
@@ -230,12 +142,12 @@ Then, for each user's access token/secret pair, instantiate a
|
|
230
142
|
`Twitter::Client`:
|
231
143
|
|
232
144
|
```ruby
|
233
|
-
|
145
|
+
erik = Twitter::Client.new(
|
234
146
|
:oauth_token => "Erik's access token",
|
235
147
|
:oauth_token_secret => "Erik's access secret"
|
236
148
|
)
|
237
149
|
|
238
|
-
|
150
|
+
john = Twitter::Client.new(
|
239
151
|
:oauth_token => "John's access token",
|
240
152
|
:oauth_token_secret => "John's access secret"
|
241
153
|
)
|
@@ -244,15 +156,15 @@ Then, for each user's access token/secret pair, instantiate a
|
|
244
156
|
You can now make threadsafe requests as the authenticated user:
|
245
157
|
|
246
158
|
```ruby
|
247
|
-
Thread.new{
|
248
|
-
Thread.new{
|
159
|
+
Thread.new{erik.update("Tweeting as Erik!")}
|
160
|
+
Thread.new{john.update("Tweeting as John!")}
|
249
161
|
```
|
250
162
|
|
251
163
|
Or, if you prefer, you can specify all configuration options when instantiating
|
252
164
|
a `Twitter::Client`:
|
253
165
|
|
254
166
|
```ruby
|
255
|
-
|
167
|
+
client = Twitter::Client.new(
|
256
168
|
:consumer_key => "an application's consumer key",
|
257
169
|
:consumer_secret => "an application's consumer secret",
|
258
170
|
:oauth_token => "a user's access token",
|
@@ -263,7 +175,6 @@ a `Twitter::Client`:
|
|
263
175
|
This may be useful if you're using multiple consumer key/secret pairs.
|
264
176
|
|
265
177
|
#### Middleware
|
266
|
-
|
267
178
|
The Faraday middleware stack is fully configurable and is exposed as a
|
268
179
|
`Faraday::Builder` object. You can modify the default middleware in-place:
|
269
180
|
|
@@ -360,7 +271,6 @@ Twitter.search("#ruby -rt", :lang => "ja", :count => 1).results.first.text
|
|
360
271
|
For more usage examples, please see the full [documentation][].
|
361
272
|
|
362
273
|
## Streaming
|
363
|
-
|
364
274
|
To access the Twitter Streaming API, we recommend [TweetStream][].
|
365
275
|
|
366
276
|
[tweetstream]: https://github.com/intridea/tweetstream
|
@@ -374,7 +284,6 @@ recommend [Oj][].
|
|
374
284
|
[oj]: https://rubygems.org/gems/oj
|
375
285
|
|
376
286
|
## Statistics
|
377
|
-
|
378
287
|
Here are some fun facts about this library:
|
379
288
|
|
380
289
|
* It is implemented in just 2,000 lines of Ruby code
|
@@ -396,13 +305,15 @@ Here are some fun facts about this library:
|
|
396
305
|
|
397
306
|
## Supported Ruby Versions
|
398
307
|
This library aims to support and is [tested against][travis] the following Ruby
|
399
|
-
|
308
|
+
implementations:
|
400
309
|
|
401
310
|
* Ruby 1.8.7
|
402
311
|
* Ruby 1.9.2
|
403
312
|
* Ruby 1.9.3
|
404
313
|
* Ruby 2.0.0
|
405
314
|
|
315
|
+
If something doesn't work on one of these interpreters, it's a bug.
|
316
|
+
|
406
317
|
This library may inadvertently work (or seem to work) on other Ruby
|
407
318
|
implementations, however support will only be provided for the versions listed
|
408
319
|
above.
|
@@ -410,12 +321,11 @@ above.
|
|
410
321
|
If you would like this library to support another Ruby version, you may
|
411
322
|
volunteer to be a maintainer. Being a maintainer entails making sure all tests
|
412
323
|
run and pass on that implementation. When something breaks on your
|
413
|
-
implementation, you will be
|
414
|
-
|
415
|
-
|
324
|
+
implementation, you will be responsible for providing patches in a timely
|
325
|
+
fashion. If critical issues for a particular implementation exist at the time
|
326
|
+
of a major release, support for that Ruby version may be dropped.
|
416
327
|
|
417
328
|
## Versioning
|
418
|
-
|
419
329
|
This library aims to adhere to [Semantic Versioning 2.0.0][semver]. Violations
|
420
330
|
of this scheme should be reported as bugs. Specifically, if a minor or patch
|
421
331
|
version is released that breaks backward compatibility, that version should be
|
@@ -430,6 +340,116 @@ Constraint][pvc] with two digits of precision. For example:
|
|
430
340
|
[semver]: http://semver.org/
|
431
341
|
[pvc]: http://docs.rubygems.org/read/chapter/16#page74
|
432
342
|
|
343
|
+
## What's new in version 4?
|
344
|
+
#### Twitter API v1.1
|
345
|
+
Version 4 of this library targets Twitter API v1.1. To understand the
|
346
|
+
implications of this change, please read the following announcements from
|
347
|
+
Twitter:
|
348
|
+
|
349
|
+
* [Changes coming in Version 1.1 of the Twitter API][coming]
|
350
|
+
* [Current status: API v1.1][status]
|
351
|
+
* [Overview: Version 1.1 of the Twitter API][overview]
|
352
|
+
|
353
|
+
[coming]: https://dev.twitter.com/blog/changes-coming-to-twitter-api
|
354
|
+
[status]: https://dev.twitter.com/blog/current-status-api-v1.1
|
355
|
+
[overview]: https://dev.twitter.com/docs/api/1.1/overview
|
356
|
+
|
357
|
+
Despite the removal of certain underlying functionality in Twitter API v1.1,
|
358
|
+
this library aims to preserve backward-compatibility wherever possible. For
|
359
|
+
example, despite the removal of the [`GET
|
360
|
+
statuses/retweeted_by_user`][retweeted_by_user] resource, the
|
361
|
+
`Twitter::API#retweeted_by_user` method continues to exist, implemented by
|
362
|
+
making multiple requests to the [`GET statuses/user_timeline`][user_timeline]
|
363
|
+
resource. As a result, there is no longer a one-to-one correlation between
|
364
|
+
method calls and Twitter API requests. In fact, it's possible for a single
|
365
|
+
method call to exceed the Twitter API rate limit for a resource. If you think
|
366
|
+
this might cause a problem for your application, feel free to [join the
|
367
|
+
discussion][discussion].
|
368
|
+
|
369
|
+
[retweeted_by_user]: https://dev.twitter.com/docs/api/1/get/statuses/retweeted_by_user
|
370
|
+
[user_timeline]: https://dev.twitter.com/docs/api/1.1/get/statuses/user_timeline
|
371
|
+
[discussion]: https://dev.twitter.com/discussions/10644
|
372
|
+
|
373
|
+
#### Rate Limiting
|
374
|
+
Another consequence of Twitter API v1.1 is that the
|
375
|
+
`Twitter::Client#rate_limit` method has been removed, since the concept of a
|
376
|
+
client-wide rate limit no longer exists. Rate limits are now applied on a
|
377
|
+
per-resource level, however, since there is no longer a one-to-one mapping
|
378
|
+
between methods and Twitter API resources, it's not entirely obvious how rate
|
379
|
+
limit information should be exposed. I've decided to go back to the pre-3.0.0
|
380
|
+
behavior of including rate limit information on `Twitter::Error` objects.
|
381
|
+
Here's an example of how to handle rate limits:
|
382
|
+
|
383
|
+
```ruby
|
384
|
+
MAX_ATTEMPTS = 3
|
385
|
+
num_attempts = 0
|
386
|
+
begin
|
387
|
+
num_attempts += 1
|
388
|
+
retweets = Twitter.retweeted_by_user("sferik")
|
389
|
+
rescue Twitter::Error::TooManyRequests => error
|
390
|
+
if num_attempts <= MAX_ATTEMPTS
|
391
|
+
# NOTE: Your process could go to sleep for up to 15 minutes but if you
|
392
|
+
# retry any sooner, it will almost certainly fail with the same exception.
|
393
|
+
sleep error.rate_limit.reset_in
|
394
|
+
retry
|
395
|
+
else
|
396
|
+
raise
|
397
|
+
end
|
398
|
+
end
|
399
|
+
```
|
400
|
+
#### Methods Missing
|
401
|
+
As a consequence of moving to Twitter API v1.1, the following methods from
|
402
|
+
version 3 are no longer available in version 4:
|
403
|
+
|
404
|
+
* `Twitter::API#accept`
|
405
|
+
* `Twitter::API#deny`
|
406
|
+
* `Twitter::API#disable_notifications`
|
407
|
+
* `Twitter::API#enable_notifications`
|
408
|
+
* `Twitter::API#end_session`
|
409
|
+
* `Twitter::API#rate_limit_status`
|
410
|
+
* `Twitter::API#rate_limited?`
|
411
|
+
* `Twitter::API#recommendations`
|
412
|
+
* `Twitter::API#related_results`
|
413
|
+
* `Twitter::API#retweeted_to_user`
|
414
|
+
* `Twitter::API#trends_daily`
|
415
|
+
* `Twitter::API#trends_weekly`
|
416
|
+
* `Twitter::Client#rate_limit`
|
417
|
+
* `Twitter::RateLimit#class`
|
418
|
+
|
419
|
+
#### Custom Endpoints
|
420
|
+
The `Twitter::API#update_with_media` method no longer uses the custom
|
421
|
+
`upload.twitter.com` endpoint, so `media_endpoint` configuration has been
|
422
|
+
removed. Likewise, the `Twitter::API#search` method no longer uses the custom
|
423
|
+
`search.twitter.com` endpoint, so `search_endpoint` configuration has also been
|
424
|
+
removed.
|
425
|
+
|
426
|
+
#### Errors
|
427
|
+
It's worth mentioning new error classes:
|
428
|
+
|
429
|
+
* `Twitter::Error::GatewayTimeout`
|
430
|
+
* `Twitter::Error::TooManyRequests`
|
431
|
+
* `Twitter::Error::UnprocessableEntity`
|
432
|
+
|
433
|
+
In previous versions of this library, rate limit errors were indicated by
|
434
|
+
raising either `Twitter::Error::BadRequest` or
|
435
|
+
`Twitter::Error::EnhanceYourCalm` (for the Search API). As of version 4, the
|
436
|
+
library will raise `Twitter::Error::TooManyRequests` for all rate limit errors.
|
437
|
+
The `Twitter::Error::EnhanceYourCalm` class has been aliased to
|
438
|
+
`Twitter::Error::TooManyRequests`.
|
439
|
+
|
440
|
+
#### Identity Map
|
441
|
+
In version 4, the identity map is [disabled by default][disabled]. If you want
|
442
|
+
to enable this feature, you can use the [default identity map][default] or
|
443
|
+
[write a custom identity map][custom].
|
444
|
+
|
445
|
+
```ruby
|
446
|
+
Twitter.identity_map = Twitter::IdentityMap
|
447
|
+
```
|
448
|
+
|
449
|
+
[disabled]: https://github.com/sferik/twitter/commit/c6c5960bea998abdc3e82cbb8dd68766a2df52e1
|
450
|
+
[default]: lib/twitter/identity_map.rb
|
451
|
+
[custom]: etc/sqlite_identity_map.rb
|
452
|
+
|
433
453
|
## Additional Notes
|
434
454
|
This will be the last major version of this library to support Ruby 1.8.
|
435
455
|
Requiring Ruby 1.9 will allow us to [remove][class_variable_get]
|
@@ -446,7 +466,7 @@ critical security vulnerabilities are discovered.
|
|
446
466
|
[ruby192]: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/367983
|
447
467
|
|
448
468
|
## Copyright
|
449
|
-
Copyright (c) 2006-
|
469
|
+
Copyright (c) 2006-2013 John Nunemaker, Wynn Netherland, Erik Michaels-Ober, Steve Richert.
|
450
470
|
See [LICENSE][] for details.
|
451
471
|
|
452
|
-
[license]:
|
472
|
+
[license]: LICENSE.md
|
@@ -115,7 +115,7 @@ module Twitter
|
|
115
115
|
# Allows the authenticating user to follow the specified users, unless they are already followed
|
116
116
|
#
|
117
117
|
# @see https://dev.twitter.com/docs/api/1.1/post/friendships/create
|
118
|
-
# @rate_limited
|
118
|
+
# @rate_limited Yes
|
119
119
|
# @authentication Requires user context
|
120
120
|
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
121
121
|
# @return [Array<Twitter::User>] The followed users.
|
@@ -259,7 +259,7 @@ module Twitter
|
|
259
259
|
# @authentication Requires user context
|
260
260
|
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
261
261
|
# @return [Twitter::Cursor]
|
262
|
-
# @overload
|
262
|
+
# @overload followers(options={})
|
263
263
|
# Returns an array of numeric IDs for every user the authenticated user is following
|
264
264
|
#
|
265
265
|
# @param options [Hash] A customizable set of options.
|
@@ -267,8 +267,8 @@ module Twitter
|
|
267
267
|
# @option options [Boolean, String, Integer] :skip_status Do not include contributee's Tweets when set to true, 't' or 1.
|
268
268
|
# @option options [Boolean, String, Integer] :include_user_entities The user entities node will be disincluded when set to false.
|
269
269
|
# @example Return the authenticated user's friends' IDs
|
270
|
-
# Twitter.
|
271
|
-
# @overload
|
270
|
+
# Twitter.followers
|
271
|
+
# @overload followers(user, options={})
|
272
272
|
# Returns an array of numeric IDs for every user the specified user is following
|
273
273
|
#
|
274
274
|
# @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, or object.
|
@@ -290,7 +290,7 @@ module Twitter
|
|
290
290
|
# @authentication Requires user context
|
291
291
|
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
292
292
|
# @return [Twitter::Cursor]
|
293
|
-
# @overload
|
293
|
+
# @overload friends(options={})
|
294
294
|
# Returns an array of numeric IDs for every user the authenticated user is following
|
295
295
|
#
|
296
296
|
# @param options [Hash] A customizable set of options.
|
@@ -298,8 +298,8 @@ module Twitter
|
|
298
298
|
# @option options [Boolean, String, Integer] :skip_status Do not include contributee's Tweets when set to true, 't' or 1.
|
299
299
|
# @option options [Boolean, String, Integer] :include_user_entities The user entities node will be disincluded when set to false.
|
300
300
|
# @example Return the authenticated user's friends' IDs
|
301
|
-
# Twitter.
|
302
|
-
# @overload
|
301
|
+
# Twitter.friends
|
302
|
+
# @overload friends(user, options={})
|
303
303
|
# Returns an array of numeric IDs for every user the specified user is following
|
304
304
|
#
|
305
305
|
# @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, or object.
|
@@ -330,7 +330,7 @@ module Twitter
|
|
330
330
|
get("/1.1/friendships/no_retweets/ids.json", options)[:body].map(&:to_i)
|
331
331
|
end
|
332
332
|
alias no_retweets_ids no_retweet_ids
|
333
|
-
|
333
|
+
|
334
334
|
end
|
335
335
|
end
|
336
336
|
end
|
data/lib/twitter/api/tweets.rb
CHANGED
@@ -212,7 +212,7 @@ module Twitter
|
|
212
212
|
# @authentication Requires user context
|
213
213
|
# @raise [Twitter::Error::Unauthorized] Error raised when supplied user credentials are not valid.
|
214
214
|
# @return [Twitter::OEmbed] OEmbed for the requested Tweet.
|
215
|
-
# @param
|
215
|
+
# @param id_or_url [Integer, String] A Tweet ID or URL.
|
216
216
|
# @param options [Hash] A customizable set of options.
|
217
217
|
# @option options [Integer] :maxwidth The maximum width in pixels that the embed should be rendered at. This value is constrained to be between 250 and 550 pixels.
|
218
218
|
# @option options [Boolean, String, Integer] :hide_media Specifies whether the embedded Tweet should automatically expand images which were uploaded via {https://dev.twitter.com/docs/api/1.1/post/statuses/update_with_media POST statuses/update_with_media}. When set to either true, t or 1 images will not be expanded. Defaults to false.
|
@@ -223,8 +223,9 @@ module Twitter
|
|
223
223
|
# @option options [String] :lang Language code for the rendered embed. This will affect the text and localization of the rendered HTML.
|
224
224
|
# @example Return oEmbeds for Tweet with the ID 25938088801
|
225
225
|
# Twitter.status_with_activity(25938088801)
|
226
|
-
def oembed(
|
227
|
-
|
226
|
+
def oembed(id_or_url, options={})
|
227
|
+
key = id_or_url.is_a?(String) && id_or_url.match(%r{^https?://}i) ? "url" : "id"
|
228
|
+
object_from_response(Twitter::OEmbed, :get, "/1.1/statuses/oembed.json?#{key}=#{id_or_url}", options)
|
228
229
|
end
|
229
230
|
|
230
231
|
# Returns oEmbeds for Tweets
|
@@ -250,8 +251,8 @@ module Twitter
|
|
250
251
|
# @option options [String] :lang Language code for the rendered embed. This will affect the text and localization of the rendered HTML.
|
251
252
|
def oembeds(*args)
|
252
253
|
arguments = Twitter::API::Arguments.new(args)
|
253
|
-
arguments.flatten.threaded_map do |
|
254
|
-
|
254
|
+
arguments.flatten.threaded_map do |id_or_url|
|
255
|
+
oembed(id_or_url, arguments.options)
|
255
256
|
end
|
256
257
|
end
|
257
258
|
|
data/lib/twitter/api/users.rb
CHANGED
@@ -270,6 +270,7 @@ module Twitter
|
|
270
270
|
# Returns extended information for the authenticated user
|
271
271
|
#
|
272
272
|
# @param options [Hash] A customizable set of options.
|
273
|
+
# @option options [Boolean] :include_entities The tweet entities node will be disincluded when set to false.
|
273
274
|
# @option options [Boolean, String, Integer] :skip_status Do not include user's Tweets when set to true, 't' or 1.
|
274
275
|
# @example Return extended information for the authenticated user
|
275
276
|
# Twitter.user
|
@@ -278,6 +279,8 @@ module Twitter
|
|
278
279
|
#
|
279
280
|
# @param user [Integer, String, Twitter::User] A Twitter user ID, screen name, or object.
|
280
281
|
# @param options [Hash] A customizable set of options.
|
282
|
+
# @option options [Boolean] :include_entities The tweet entities node will be disincluded when set to false.
|
283
|
+
# @option options [Boolean, String, Integer] :skip_status Do not include user's Tweets when set to true, 't' or 1.
|
281
284
|
# @example Return extended information for @sferik
|
282
285
|
# Twitter.user('sferik')
|
283
286
|
# Twitter.user(7505382) # Same as above
|
data/lib/twitter/base.rb
CHANGED
data/lib/twitter/tweet.rb
CHANGED
@@ -10,9 +10,8 @@ module Twitter
|
|
10
10
|
include Twitter::Exceptable
|
11
11
|
attr_reader :favorited, :favoriters, :from_user_id, :from_user_name,
|
12
12
|
:in_reply_to_screen_name, :in_reply_to_attrs_id, :in_reply_to_status_id,
|
13
|
-
:in_reply_to_user_id, :
|
14
|
-
:
|
15
|
-
:truncated
|
13
|
+
:in_reply_to_user_id, :lang, :repliers, :retweeted, :retweeters, :source,
|
14
|
+
:text, :to_user, :to_user_id, :to_user_name, :truncated
|
16
15
|
alias in_reply_to_tweet_id in_reply_to_status_id
|
17
16
|
alias favourited favorited
|
18
17
|
alias favourited? favorited?
|
@@ -40,6 +39,10 @@ module Twitter
|
|
40
39
|
@attrs[:from_user] || user && user.screen_name
|
41
40
|
end
|
42
41
|
|
42
|
+
def filter_level
|
43
|
+
@attrs[:filter_level] || "none"
|
44
|
+
end
|
45
|
+
|
43
46
|
# @return [String]
|
44
47
|
# @note May be > 140 characters.
|
45
48
|
def full_text
|
@@ -138,8 +141,8 @@ module Twitter
|
|
138
141
|
# @param key [Symbol]
|
139
142
|
def entities(klass, key)
|
140
143
|
if entities?
|
141
|
-
Array(@attrs[:entities][key.to_sym]).map do |
|
142
|
-
klass.fetch_or_new(
|
144
|
+
Array(@attrs[:entities][key.to_sym]).map do |entity|
|
145
|
+
klass.fetch_or_new(entity)
|
143
146
|
end
|
144
147
|
else
|
145
148
|
warn "#{Kernel.caller.first}: To get #{key.to_s.tr('_', ' ')}, you must pass `:include_entities => true` when requesting the #{self.class.name}."
|
data/lib/twitter/user.rb
CHANGED
@@ -32,6 +32,13 @@ module Twitter
|
|
32
32
|
alias update_count statuses_count
|
33
33
|
alias updates_count statuses_count
|
34
34
|
|
35
|
+
# @return [Array<Twitter::Entity::Url>]
|
36
|
+
def description_urls
|
37
|
+
@description_urls ||= Array(@attrs[:entities][:description][:urls]).map do |entity|
|
38
|
+
Twitter::Entity::Url.fetch_or_new(entity)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
35
42
|
# Return the URL to the user's profile banner image
|
36
43
|
#
|
37
44
|
# @param size [String, Symbol] The size of the image. Must be one of: 'mobile', 'mobile_retina', 'web', 'web_retina', 'ipad', or 'ipad_retina'
|
data/lib/twitter/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Twitter
|
2
2
|
class Version
|
3
3
|
MAJOR = 4 unless defined? Twitter::Version::MAJOR
|
4
|
-
MINOR =
|
4
|
+
MINOR = 6 unless defined? Twitter::Version::MINOR
|
5
5
|
PATCH = 0 unless defined? Twitter::Version::PATCH
|
6
6
|
PRE = nil unless defined? Twitter::Version::PRE
|
7
7
|
|
data/spec/helper.rb
CHANGED
@@ -1,9 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
require 'simplecov'
|
2
|
+
require 'coveralls'
|
3
|
+
|
4
|
+
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter[
|
5
|
+
SimpleCov::Formatter::HTMLFormatter,
|
6
|
+
Coveralls::SimpleCov::Formatter
|
7
|
+
]
|
8
|
+
SimpleCov.start
|
7
9
|
|
8
10
|
require 'twitter'
|
9
11
|
require 'twitter/identity_map'
|
@@ -13,6 +15,8 @@ require 'tempfile'
|
|
13
15
|
require 'timecop'
|
14
16
|
require 'webmock/rspec'
|
15
17
|
|
18
|
+
WebMock.disable_net_connect!(:allow => 'coveralls.io')
|
19
|
+
|
16
20
|
RSpec.configure do |config|
|
17
21
|
config.expect_with :rspec do |c|
|
18
22
|
c.syntax = :expect
|
@@ -220,11 +220,16 @@ describe Twitter::API::Tweets do
|
|
220
220
|
describe "#oembed" do
|
221
221
|
before do
|
222
222
|
stub_get("/1.1/statuses/oembed.json").with(:query => {:id => "25938088801"}).to_return(:body => fixture("oembed.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
223
|
+
stub_get("/1.1/statuses/oembed.json").with(:query => {:url => "https://twitter.com/sferik/status/25938088801"}).to_return(:body => fixture("oembed.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
223
224
|
end
|
224
225
|
it "requests the correct resource" do
|
225
226
|
@client.oembed(25938088801)
|
226
227
|
expect(a_get("/1.1/statuses/oembed.json").with(:query => {:id => "25938088801"})).to have_been_made
|
227
228
|
end
|
229
|
+
it "requests the correct resource when a URL is given" do
|
230
|
+
@client.oembed("https://twitter.com/sferik/status/25938088801")
|
231
|
+
expect(a_get("/1.1/statuses/oembed.json").with(:query => {:url => "https://twitter.com/sferik/status/25938088801"}))
|
232
|
+
end
|
228
233
|
it "returns an array of OEmbed instances" do
|
229
234
|
oembed = @client.oembed(25938088801)
|
230
235
|
expect(oembed).to be_a Twitter::OEmbed
|
@@ -234,11 +239,16 @@ describe Twitter::API::Tweets do
|
|
234
239
|
describe "#oembeds" do
|
235
240
|
before do
|
236
241
|
stub_get("/1.1/statuses/oembed.json").with(:query => {:id => "25938088801"}).to_return(:body => fixture("oembed.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
242
|
+
stub_get("/1.1/statuses/oembed.json").with(:query => {:url => "https://twitter.com/sferik/status/25938088801"}).to_return(:body => fixture("oembed.json"), :headers => {:content_type => "application/json; charset=utf-8"})
|
237
243
|
end
|
238
244
|
it "requests the correct resource" do
|
239
245
|
@client.oembeds(25938088801)
|
240
246
|
expect(a_get("/1.1/statuses/oembed.json").with(:query => {:id => "25938088801"})).to have_been_made
|
241
247
|
end
|
248
|
+
it "requests the correct resource when a URL is given" do
|
249
|
+
@client.oembeds("https://twitter.com/sferik/status/25938088801")
|
250
|
+
expect(a_get("/1.1/statuses/oembed.json").with(:query => {:url => "https://twitter.com/sferik/status/25938088801"})).to have_been_made
|
251
|
+
end
|
242
252
|
it "returns an array of OEmbed instances" do
|
243
253
|
oembeds = @client.oembeds(25938088801)
|
244
254
|
expect(oembeds).to be_an Array
|
data/spec/twitter/tweet_spec.rb
CHANGED
@@ -104,13 +104,13 @@ describe Twitter::Tweet do
|
|
104
104
|
|
105
105
|
describe "#hashtags" do
|
106
106
|
it "returns an Array of Entity::Hashtag when entities are set" do
|
107
|
-
|
107
|
+
hashtags_array = [
|
108
108
|
{
|
109
109
|
:text => 'twitter',
|
110
110
|
:indices => [10, 33],
|
111
111
|
}
|
112
112
|
]
|
113
|
-
hashtags = Twitter::Tweet.new(:id => 28669546014, :entities => {:hashtags =>
|
113
|
+
hashtags = Twitter::Tweet.new(:id => 28669546014, :entities => {:hashtags => hashtags_array}).hashtags
|
114
114
|
expect(hashtags).to be_an Array
|
115
115
|
expect(hashtags.first).to be_a Twitter::Entity::Hashtag
|
116
116
|
expect(hashtags.first.indices).to eq [10, 33]
|
@@ -234,7 +234,7 @@ describe Twitter::Tweet do
|
|
234
234
|
end
|
235
235
|
|
236
236
|
it "returns true if there are entities set" do
|
237
|
-
|
237
|
+
urls_array = [
|
238
238
|
{
|
239
239
|
:url => 'http://example.com/t.co',
|
240
240
|
:expanded_url => 'http://example.com/expanded',
|
@@ -242,14 +242,14 @@ describe Twitter::Tweet do
|
|
242
242
|
:indices => [10, 33],
|
243
243
|
}
|
244
244
|
]
|
245
|
-
tweet = Twitter::Tweet.new(:id => 28669546014, :entities => {:urls =>
|
245
|
+
tweet = Twitter::Tweet.new(:id => 28669546014, :entities => {:urls => urls_array})
|
246
246
|
expect(tweet.entities?).to be_true
|
247
247
|
end
|
248
248
|
end
|
249
249
|
|
250
250
|
describe "#urls" do
|
251
251
|
it "returns an Array of Entity::Url when entities are set" do
|
252
|
-
|
252
|
+
urls_array = [
|
253
253
|
{
|
254
254
|
:url => 'http://example.com/t.co',
|
255
255
|
:expanded_url => 'http://example.com/expanded',
|
@@ -257,7 +257,7 @@ describe Twitter::Tweet do
|
|
257
257
|
:indices => [10, 33],
|
258
258
|
}
|
259
259
|
]
|
260
|
-
urls = Twitter::Tweet.new(:id => 28669546014, :entities => {:urls =>
|
260
|
+
urls = Twitter::Tweet.new(:id => 28669546014, :entities => {:urls => urls_array}).urls
|
261
261
|
expect(urls).to be_an Array
|
262
262
|
expect(urls.first).to be_a Twitter::Entity::Url
|
263
263
|
expect(urls.first.indices).to eq [10, 33]
|
@@ -301,7 +301,7 @@ describe Twitter::Tweet do
|
|
301
301
|
|
302
302
|
describe "#user_mentions" do
|
303
303
|
it "returns an Array of Entity::UserMention when entities are set" do
|
304
|
-
|
304
|
+
user_mentions_array = [
|
305
305
|
{
|
306
306
|
:screen_name => 'sferik',
|
307
307
|
:name => 'Erik Michaels-Ober',
|
@@ -310,7 +310,7 @@ describe Twitter::Tweet do
|
|
310
310
|
:id => 7505382,
|
311
311
|
}
|
312
312
|
]
|
313
|
-
user_mentions = Twitter::Tweet.new(:id => 28669546014, :entities => {:user_mentions =>
|
313
|
+
user_mentions = Twitter::Tweet.new(:id => 28669546014, :entities => {:user_mentions => user_mentions_array}).user_mentions
|
314
314
|
expect(user_mentions).to be_an Array
|
315
315
|
expect(user_mentions.first).to be_a Twitter::Entity::UserMention
|
316
316
|
expect(user_mentions.first.indices).to eq [0, 6]
|
data/spec/twitter/user_spec.rb
CHANGED
@@ -31,6 +31,28 @@ describe Twitter::User do
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
+
describe "#description_urls" do
|
35
|
+
it "returns an Array of Entity::Url" do
|
36
|
+
urls_array = [
|
37
|
+
{
|
38
|
+
:url => 'http://example.com/t.co',
|
39
|
+
:expanded_url => 'http://example.com/expanded',
|
40
|
+
:display_url => 'example.com/expanded',
|
41
|
+
:indices => [10, 33],
|
42
|
+
}
|
43
|
+
]
|
44
|
+
description_urls = Twitter::User.new(:id => 7505382, :entities => {:description => {:urls => urls_array}}).description_urls
|
45
|
+
expect(description_urls).to be_an Array
|
46
|
+
expect(description_urls.first).to be_a Twitter::Entity::Url
|
47
|
+
expect(description_urls.first.indices).to eq [10, 33]
|
48
|
+
expect(description_urls.first.display_url).to eq 'example.com/expanded'
|
49
|
+
end
|
50
|
+
it "is empty when not set" do
|
51
|
+
description_urls = Twitter::User.new(:id => 7505382, :entities => {:description => {:urls => []}}).description_urls
|
52
|
+
expect(description_urls).to be_empty
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
34
56
|
describe "#profile_banner_url" do
|
35
57
|
it "returns a String when profile_banner_url is set" do
|
36
58
|
user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
|
data/twitter.gemspec
CHANGED
@@ -1,13 +1,17 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'twitter/version'
|
3
5
|
|
4
6
|
Gem::Specification.new do |spec|
|
5
|
-
spec.add_dependency 'faraday',
|
6
|
-
spec.add_dependency 'multi_json',
|
7
|
-
spec.add_dependency 'simple_oauth',
|
8
|
-
spec.
|
7
|
+
spec.add_dependency 'faraday', ['~> 0.8', '< 0.10']
|
8
|
+
spec.add_dependency 'multi_json', '~> 1.0'
|
9
|
+
spec.add_dependency 'simple_oauth', '~> 0.2'
|
10
|
+
spec.add_development_dependency 'bundler', '~> 1.0'
|
11
|
+
spec.authors = ["John Nunemaker", "Wynn Netherland", "Erik Michaels-Ober", "Steve Richert", "Steve Agalloco"]
|
12
|
+
spec.cert_chain = ['certs/sferik.pem']
|
9
13
|
spec.description = %q{A Ruby interface to the Twitter API.}
|
10
|
-
spec.email = ['nunemaker@gmail.com', 'wynn.netherland@gmail.com', 'sferik@gmail.com', 'steve.richert@gmail.com']
|
14
|
+
spec.email = ['nunemaker@gmail.com', 'wynn.netherland@gmail.com', 'sferik@gmail.com', 'steve.richert@gmail.com', 'steve.agalloco@gmail.com']
|
11
15
|
spec.files = %w(.yardopts CHANGELOG.md CONTRIBUTING.md LICENSE.md README.md Rakefile twitter.gemspec)
|
12
16
|
spec.files += Dir.glob("lib/**/*.rb")
|
13
17
|
spec.files += Dir.glob("spec/**/*")
|
@@ -15,7 +19,8 @@ Gem::Specification.new do |spec|
|
|
15
19
|
spec.licenses = ['MIT']
|
16
20
|
spec.name = 'twitter'
|
17
21
|
spec.require_paths = ['lib']
|
18
|
-
spec.required_rubygems_version =
|
22
|
+
spec.required_rubygems_version = '>= 1.3.6'
|
23
|
+
spec.signing_key = File.expand_path("~/.gem/private_key.pem") if $0 =~ /gem\z/
|
19
24
|
spec.summary = spec.description
|
20
25
|
spec.test_files = Dir.glob("spec/**/*")
|
21
26
|
spec.version = Twitter::Version
|
metadata
CHANGED
@@ -1,22 +1,51 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: twitter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
version: 4.6.0
|
4
5
|
prerelease:
|
5
|
-
version: 4.5.0
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- John Nunemaker
|
9
9
|
- Wynn Netherland
|
10
10
|
- Erik Michaels-Ober
|
11
11
|
- Steve Richert
|
12
|
+
- Steve Agalloco
|
12
13
|
autorequire:
|
13
14
|
bindir: bin
|
14
|
-
cert_chain:
|
15
|
-
|
15
|
+
cert_chain:
|
16
|
+
- !binary |-
|
17
|
+
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURMakNDQWhhZ0F3SUJB
|
18
|
+
Z0lCQURBTkJna3Foa2lHOXcwQkFRVUZBREE5TVE4d0RRWURWUVFEREFaelpt
|
19
|
+
VnkKYVdzeEZUQVRCZ29Ka2lhSmsvSXNaQUVaRmdWbmJXRnBiREVUTUJFR0Nn
|
20
|
+
bVNKb21UOGl4a0FSa1dBMk52YlRBZQpGdzB4TXpBeU1ETXhNREF5TWpkYUZ3
|
21
|
+
MHhOREF5TURNeE1EQXlNamRhTUQweER6QU5CZ05WQkFNTUJuTm1aWEpwCmF6
|
22
|
+
RVZNQk1HQ2dtU0pvbVQ4aXhrQVJrV0JXZHRZV2xzTVJNd0VRWUtDWkltaVpQ
|
23
|
+
eUxHUUJHUllEWTI5dE1JSUIKSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4
|
24
|
+
QU1JSUJDZ0tDQVFFQWwweDVkeDh1S3hpN1Rrckl1eUJVVEpWQgp2MW85M25V
|
25
|
+
QjlqL3k0TTk2Z1Yycll3QWNpMUpQQnNlTmQ2RnliempvM1lHdUhsN0VRSHVT
|
26
|
+
SE5hZjFwMmx4ZXcvCnk2MEpYSUpCQmdQY0RLL0tDUDROVUhvZm0wamZvWUQr
|
27
|
+
SDV1TkpmSENOcTcvWnNUeE90RTNSYTkyczBCQ01UcG0Kd0JNTWxXUjVNdGRF
|
28
|
+
aElZdUJPNFhobmVqWWdIMEwvN0JMMmx5bW50Vm5zci9hZ2RRb29qUUNOMUlR
|
29
|
+
bXNSSnZyUgpkdVpSTzN0WnZvSW8xcEJjNEpFZWhEdXFDZXlCZ1BMT3FNb0t0
|
30
|
+
UWxvbGQxVFFzMWtXVUJLN0tXTUZFaEtDL0tnCnp5ektSSFFvOXlEWXdPdllu
|
31
|
+
Z29CTFkrVC9sd0NUNGR5c3NkaHpSYmZueEFoYUt1NFNBc3NJd2FDMDF5Vm93
|
32
|
+
SUQKQVFBQm96a3dOekFKQmdOVkhSTUVBakFBTUIwR0ExVWREZ1FXQkJTMHJ1
|
33
|
+
RGZSYWs1Y2kxT3BETlgvWmRERWtJcwppVEFMQmdOVkhROEVCQU1DQkxBd0RR
|
34
|
+
WUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFISFNNcy9NUDBzT2FMa0V2NEpvCnp2
|
35
|
+
a20zcW41QTZ0MHZhSHg3NzRjbWVqeU1VKzV3eVN4UmV6c3BMN1VMaDlOZXVL
|
36
|
+
Mk9oVStPZTNUcHFyQWc1VEsKUjhHUUlMblZ1MkZlbUdBNnNBa1BEbGNQdGdB
|
37
|
+
NmllSTE5UFpPRjZIVkxtYy9JRC9kUC9OZ1pXV3pFZXFRS21jSwoyK0hNK1NF
|
38
|
+
RURoWmtTY1lla3c0Wk9lMTY0WnRaRzgxNm9BdjV4MHBHaXRTSWt1bVVwN1Y4
|
39
|
+
aUVaLzZlaHI3WTllClhPZzRlZXVuNUwvSmptakFSb1cya05kdmtSRDNjMkVl
|
40
|
+
U0xxV3ZRUnNCbHlwSGZoczZKSnVMbHlaUEdoVTNSL3YKU2YzbFZLcEJDV2dS
|
41
|
+
cEdUdnk0NVhWcEIrNTl5MzNQSm1FdVExUFRFT1l2UXlhbzlVS01BQWFBTi83
|
42
|
+
cVdRdGpsMApobHc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
|
43
|
+
date: 2013-03-08 00:00:00.000000000 Z
|
16
44
|
dependencies:
|
17
45
|
- !ruby/object:Gem::Dependency
|
18
|
-
|
19
|
-
|
46
|
+
name: faraday
|
47
|
+
requirement: !ruby/object:Gem::Requirement
|
48
|
+
none: false
|
20
49
|
requirements:
|
21
50
|
- - ~>
|
22
51
|
- !ruby/object:Gem::Version
|
@@ -24,10 +53,10 @@ dependencies:
|
|
24
53
|
- - <
|
25
54
|
- !ruby/object:Gem::Version
|
26
55
|
version: '0.10'
|
27
|
-
none: false
|
28
56
|
type: :runtime
|
29
|
-
|
30
|
-
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
59
|
+
none: false
|
31
60
|
requirements:
|
32
61
|
- - ~>
|
33
62
|
- !ruby/object:Gem::Version
|
@@ -35,45 +64,61 @@ dependencies:
|
|
35
64
|
- - <
|
36
65
|
- !ruby/object:Gem::Version
|
37
66
|
version: '0.10'
|
38
|
-
none: false
|
39
67
|
- !ruby/object:Gem::Dependency
|
40
|
-
|
41
|
-
|
68
|
+
name: multi_json
|
69
|
+
requirement: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
42
71
|
requirements:
|
43
72
|
- - ~>
|
44
73
|
- !ruby/object:Gem::Version
|
45
74
|
version: '1.0'
|
46
|
-
none: false
|
47
75
|
type: :runtime
|
48
|
-
|
49
|
-
|
76
|
+
prerelease: false
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
78
|
+
none: false
|
50
79
|
requirements:
|
51
80
|
- - ~>
|
52
81
|
- !ruby/object:Gem::Version
|
53
82
|
version: '1.0'
|
54
|
-
none: false
|
55
83
|
- !ruby/object:Gem::Dependency
|
84
|
+
name: simple_oauth
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
87
|
+
requirements:
|
88
|
+
- - ~>
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0.2'
|
91
|
+
type: :runtime
|
56
92
|
prerelease: false
|
57
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
58
95
|
requirements:
|
59
96
|
- - ~>
|
60
97
|
- !ruby/object:Gem::Version
|
61
98
|
version: '0.2'
|
62
|
-
|
63
|
-
|
64
|
-
name: simple_oauth
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: bundler
|
65
101
|
requirement: !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
66
103
|
requirements:
|
67
104
|
- - ~>
|
68
105
|
- !ruby/object:Gem::Version
|
69
|
-
version: '0
|
106
|
+
version: '1.0'
|
107
|
+
type: :development
|
108
|
+
prerelease: false
|
109
|
+
version_requirements: !ruby/object:Gem::Requirement
|
70
110
|
none: false
|
111
|
+
requirements:
|
112
|
+
- - ~>
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
version: '1.0'
|
71
115
|
description: A Ruby interface to the Twitter API.
|
72
116
|
email:
|
73
117
|
- nunemaker@gmail.com
|
74
118
|
- wynn.netherland@gmail.com
|
75
119
|
- sferik@gmail.com
|
76
120
|
- steve.richert@gmail.com
|
121
|
+
- steve.agalloco@gmail.com
|
77
122
|
executables: []
|
78
123
|
extensions: []
|
79
124
|
extra_rdoc_files: []
|
@@ -315,17 +360,17 @@ rdoc_options: []
|
|
315
360
|
require_paths:
|
316
361
|
- lib
|
317
362
|
required_ruby_version: !ruby/object:Gem::Requirement
|
363
|
+
none: false
|
318
364
|
requirements:
|
319
365
|
- - ! '>='
|
320
366
|
- !ruby/object:Gem::Version
|
321
367
|
version: '0'
|
322
|
-
none: false
|
323
368
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
369
|
+
none: false
|
324
370
|
requirements:
|
325
371
|
- - ! '>='
|
326
372
|
- !ruby/object:Gem::Version
|
327
373
|
version: 1.3.6
|
328
|
-
none: false
|
329
374
|
requirements: []
|
330
375
|
rubyforge_project:
|
331
376
|
rubygems_version: 1.8.25
|
metadata.gz.sig
ADDED
Binary file
|