twitter 4.5.0 → 4.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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]
|
3
4
|
[][travis]
|
4
5
|
[][gemnasium]
|
5
|
-
[][codeclimate]
|
7
|
+
[][coveralls]
|
6
8
|
[][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
|