twitter 5.0.1 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
Binary file
data/.yardopts CHANGED
@@ -8,3 +8,5 @@ CHANGELOG.md
8
8
  CONTRIBUTING.md
9
9
  LICENSE.md
10
10
  README.md
11
+ examples/Configuration.md
12
+ examples/Update.md
@@ -1,3 +1,9 @@
1
+ 5.1.0
2
+ -----
3
+ * [Use `Addressable::URI` everywhere](https://github.com/sferik/twitter/commit/97d7c68900c9974a1f6841f6eed2706df9030d64) ([@matthewrudy](https://twitter.com/matthewrudy))
4
+ * [Allow use of `Twitter::Place` instead of `place_id`](https://github.com/sferik/twitter/commit/c2b31dd2385fefa30a9ddccf15415a713cf5953a)
5
+ * [Allow use of `Twitter::Tweet` instead of `in_reply_to_status_id`](https://github.com/sferik/twitter/commit/6b7d6c2b637a074c348a56a51fb1e02252482fb2)
6
+
1
7
  5.0.1
2
8
  -----
3
9
  * [Fix `buftok` delimiter handling](https://github.com/sferik/twitter/pull/484)
data/README.md CHANGED
@@ -161,14 +161,14 @@ simplicity and performance.
161
161
  <th>Notes</th>
162
162
  <th colspan="2">Version 4</th>
163
163
  <th colspan="2">Version 5</th>
164
- </th>
164
+ </tr>
165
165
  <tr>
166
166
  <th></th>
167
167
  <th>Code</th>
168
168
  <th>HTTP GETs</th>
169
169
  <th>Code</th>
170
170
  <th>HTTP GETs</th>
171
- </th>
171
+ </tr>
172
172
  </thead>
173
173
  <tbody>
174
174
  <tr>
@@ -176,13 +176,13 @@ simplicity and performance.
176
176
  Are you at the start of the cursor?
177
177
  </td>
178
178
  <td>
179
- <pre><code lang="ruby">client.friends.first</code></pre>
179
+ <pre><code>client.friends.first</code></pre>
180
180
  </td>
181
181
  <td>
182
182
  <em>Θ(1)</em>
183
183
  </td>
184
184
  <td>
185
- <pre><code lang="ruby">client.friends.first?</code></pre>
185
+ <pre><code>client.friends.first?</code></pre>
186
186
  </td>
187
187
  <td>
188
188
  <em>Θ(1)</em>
@@ -193,13 +193,13 @@ simplicity and performance.
193
193
  Return your most recent follower.
194
194
  </td>
195
195
  <td>
196
- <pre><code lang="ruby">client.friends.users.first</code></pre>
196
+ <pre><code>client.friends.users.first</code></pre>
197
197
  </td>
198
198
  <td>
199
199
  <em>Θ(1)</em>
200
200
  </td>
201
201
  <td>
202
- <pre><code lang="ruby">client.friends.first</code></pre>
202
+ <pre><code>client.friends.first</code></pre>
203
203
  </td>
204
204
  <td>
205
205
  <em>Θ(1)</em>
@@ -210,13 +210,13 @@ simplicity and performance.
210
210
  Return an array of all your friends.
211
211
  </td>
212
212
  <td>
213
- <pre><code lang="ruby">client.friends.all</code></pre>
213
+ <pre><code>client.friends.all</code></pre>
214
214
  </td>
215
215
  <td>
216
216
  <em>Θ(n+1)</em>
217
217
  </td>
218
218
  <td>
219
- <pre><code lang="ruby">client.friends.to_a</code></pre>
219
+ <pre><code>client.friends.to_a</code></pre>
220
220
  </td>
221
221
  <td>
222
222
  <em>Θ(n)</em>
@@ -227,13 +227,13 @@ simplicity and performance.
227
227
  Collect your 20 most recent friends.
228
228
  </td>
229
229
  <td>
230
- <pre><code lang="ruby">client.friends.take(20)</code></pre>
230
+ <pre><code>client.friends.take(20)</code></pre>
231
231
  </td>
232
232
  <td>
233
233
  <em>Θ(n+1)</em>
234
234
  </td>
235
235
  <td>
236
- <pre><code lang="ruby">client.friends.take(20)</code></pre>
236
+ <pre><code>client.friends.take(20)</code></pre>
237
237
  </td>
238
238
  <td>
239
239
  <em>Θ(1)</em>
@@ -244,7 +244,7 @@ simplicity and performance.
244
244
  Collect your 20 most recent friends twice.
245
245
  </td>
246
246
  <td>
247
- <pre><code lang="ruby">friends = client.friends
247
+ <pre><code>friends = client.friends
248
248
  2.times.collect do
249
249
  friends.take(20)
250
250
  end</code></pre>
@@ -253,7 +253,7 @@ end</code></pre>
253
253
  <em>Θ(2n+2)</em>
254
254
  </td>
255
255
  <td>
256
- <pre><code lang="ruby">friends = client.friends
256
+ <pre><code>friends = client.friends
257
257
  2.times.collect do
258
258
  friends.take(20)
259
259
  end</code></pre>
@@ -423,8 +423,8 @@ These methods are aliased to `#url` for users who prefer that nomenclature.
423
423
  `Twitter::User` previously had a `#url` method, which returned the user's
424
424
  website. This URI is now available via the `#website` method.
425
425
 
426
- All `#uri` methods now return `URI` objects instead of strings. To convert a
427
- `URI` object to a string, call `#to_s` on it.
426
+ All `#uri` methods now return `Addressable::URI` objects instead of strings. To convert an
427
+ `Addressable::URI` object to a string, call `#to_s` on it.
428
428
 
429
429
  ## Configuration
430
430
  Twitter API v1.1 requires you to authenticate via OAuth, so you'll need to
@@ -74,7 +74,7 @@ module Twitter
74
74
  # @param key2 [Symbol]
75
75
  def define_uri_method(key1, key2)
76
76
  define_method(key1) do ||
77
- URI.parse(@attrs[key2]) if @attrs[key2]
77
+ Addressable::URI.parse(@attrs[key2]) if @attrs[key2]
78
78
  end
79
79
  memoize(key1)
80
80
  end
@@ -62,7 +62,7 @@ module Twitter
62
62
  end
63
63
 
64
64
  def oauth_auth_header(method, uri, params={})
65
- uri = URI.parse(uri)
65
+ uri = Addressable::URI.parse(uri)
66
66
  SimpleOAuth::Header.new(method, uri, params, credentials)
67
67
  end
68
68
 
@@ -8,23 +8,23 @@ module Twitter
8
8
  :mode, :name, :slug, :subscriber_count
9
9
  object_attr_reader :User, :user
10
10
 
11
- # @return [URI] The URI to the list members.
11
+ # @return [Addressable::URI] The URI to the list members.
12
12
  def members_uri
13
- URI.parse("https://twitter.com/#{user.screen_name}/#{slug}/members")
13
+ Addressable::URI.parse("https://twitter.com/#{user.screen_name}/#{slug}/members")
14
14
  end
15
15
  memoize :members_uri
16
16
  alias members_url members_uri
17
17
 
18
- # @return [URI] The URI to the list subscribers.
18
+ # @return [Addressable::URI] The URI to the list subscribers.
19
19
  def subscribers_uri
20
- URI.parse("https://twitter.com/#{user.screen_name}/#{slug}/subscribers")
20
+ Addressable::URI.parse("https://twitter.com/#{user.screen_name}/#{slug}/subscribers")
21
21
  end
22
22
  memoize :subscribers_uri
23
23
  alias subscribers_url subscribers_uri
24
24
 
25
- # @return [URI] The URI to the list.
25
+ # @return [Addressable::URI] The URI to the list.
26
26
  def uri
27
- URI.parse("https://twitter.com/#{user.screen_name}/#{slug}")
27
+ Addressable::URI.parse("https://twitter.com/#{user.screen_name}/#{slug}")
28
28
  end
29
29
  memoize :uri
30
30
  alias url uri
@@ -110,14 +110,19 @@ module Twitter
110
110
  # @return [Twitter::Tweet] The created Tweet.
111
111
  # @param status [String] The text of your status update, up to 140 characters.
112
112
  # @param options [Hash] A customizable set of options.
113
+ # @option options [Twitter::Tweet] :in_reply_to_status An existing status that the update is in reply to.
113
114
  # @option options [Integer] :in_reply_to_status_id The ID of an existing status that the update is in reply to.
114
115
  # @option options [Float] :lat The latitude of the location this tweet refers to. This option will be ignored unless it is inside the range -90.0 to +90.0 (North is positive) inclusive. It will also be ignored if there isn't a corresponding :long option.
115
116
  # @option options [Float] :long The longitude of the location this tweet refers to. The valid ranges for longitude is -180.0 to +180.0 (East is positive) inclusive. This option will be ignored if outside that range, if it is not a number, if geo_enabled is disabled, or if there not a corresponding :lat option.
117
+ # @option options [Twitter::Place] :place A place in the world. These can be retrieved from {Twitter::REST::API::PlacesAndGeo#reverse_geocode}.
116
118
  # @option options [String] :place_id A place in the world. These IDs can be retrieved from {Twitter::REST::API::PlacesAndGeo#reverse_geocode}.
117
119
  # @option options [String] :display_coordinates Whether or not to put a pin on the exact coordinates a tweet has been sent from.
118
120
  # @option options [Boolean, String, Integer] :trim_user Each tweet returned in a timeline will include a user object with only the author's numerical ID when set to true, 't' or 1.
119
121
  def update(status, options={})
120
- object_from_response(Twitter::Tweet, :post, "/1.1/statuses/update.json", options.merge(:status => status))
122
+ hash = options.dup
123
+ hash[:in_reply_to_status_id] = hash.delete(:in_reply_to_status).id unless hash[:in_reply_to_status].nil?
124
+ hash[:place_id] = hash.delete(:place).woeid unless hash[:place].nil?
125
+ object_from_response(Twitter::Tweet, :post, "/1.1/statuses/update.json", hash.merge(:status => status))
121
126
  rescue Twitter::Error::Forbidden => error
122
127
  handle_forbidden_error(Twitter::Error::AlreadyPosted, error)
123
128
  end
@@ -184,14 +189,20 @@ module Twitter
184
189
  # @param status [String] The text of your status update, up to 140 characters.
185
190
  # @param media [File, Hash] A File object with your picture (PNG, JPEG or GIF)
186
191
  # @param options [Hash] A customizable set of options.
192
+ # @option options [Boolean, String, Integer] :possibly_sensitive Set to true for content which may not be suitable for every audience.
193
+ # @option options [Twitter::Tweet] :in_reply_to_status An existing status that the update is in reply to.
187
194
  # @option options [Integer] :in_reply_to_status_id The ID of an existing Tweet that the update is in reply to.
188
195
  # @option options [Float] :lat The latitude of the location this tweet refers to. This option will be ignored unless it is inside the range -90.0 to +90.0 (North is positive) inclusive. It will also be ignored if there isn't a corresponding :long option.
189
196
  # @option options [Float] :long The longitude of the location this tweet refers to. The valid ranges for longitude is -180.0 to +180.0 (East is positive) inclusive. This option will be ignored if outside that range, if it is not a number, if geo_enabled is disabled, or if there not a corresponding :lat option.
197
+ # @option options [Twitter::Place] :place A place in the world. These can be retrieved from {Twitter::REST::API::PlacesAndGeo#reverse_geocode}.
190
198
  # @option options [String] :place_id A place in the world. These IDs can be retrieved from {Twitter::REST::API::PlacesAndGeo#reverse_geocode}.
191
199
  # @option options [String] :display_coordinates Whether or not to put a pin on the exact coordinates a tweet has been sent from.
192
200
  # @option options [Boolean, String, Integer] :trim_user Each tweet returned in a timeline will include a user object with only the author's numerical ID when set to true, 't' or 1.
193
201
  def update_with_media(status, media, options={})
194
- object_from_response(Twitter::Tweet, :post, "/1.1/statuses/update_with_media.json", options.merge('media[]' => media, 'status' => status))
202
+ hash = options.dup
203
+ hash[:in_reply_to_status_id] = hash.delete(:in_reply_to_status).id unless hash[:in_reply_to_status].nil?
204
+ hash[:place_id] = hash.delete(:place).woeid unless hash[:place].nil?
205
+ object_from_response(Twitter::Tweet, :post, "/1.1/statuses/update_with_media.json", hash.merge('media[]' => media, 'status' => status))
195
206
  rescue Twitter::Error::Forbidden => error
196
207
  handle_forbidden_error(Twitter::Error::AlreadyPosted, error)
197
208
  end
@@ -169,7 +169,7 @@ module Twitter
169
169
  user_id = case user
170
170
  when Integer
171
171
  user
172
- when String, URI
172
+ when String, URI, Addressable::URI
173
173
  user(user).id
174
174
  when Twitter::User
175
175
  user.id
@@ -185,7 +185,7 @@ module Twitter
185
185
  else
186
186
  set_compound_key("screen_name", user, hash, prefix)
187
187
  end
188
- when URI
188
+ when URI, Addressable::URI
189
189
  set_compound_key("screen_name", user.path.split("/").last, hash, prefix)
190
190
  when Twitter::User
191
191
  set_compound_key("user_id", user.id, hash, prefix)
@@ -79,7 +79,7 @@ module Twitter
79
79
 
80
80
  # @return [String] The URL to the tweet.
81
81
  def uri
82
- URI.parse("https://twitter.com/#{user.screen_name}/status/#{id}")
82
+ Addressable::URI.parse("https://twitter.com/#{user.screen_name}/status/#{id}")
83
83
  end
84
84
  memoize :uri
85
85
  alias url uri
@@ -109,14 +109,14 @@ module Twitter
109
109
 
110
110
  # @return [String] The URL to the user.
111
111
  def uri
112
- URI.parse("https://twitter.com/#{screen_name}")
112
+ Addressable::URI.parse("https://twitter.com/#{screen_name}")
113
113
  end
114
114
  memoize :uri
115
115
  alias url uri
116
116
 
117
117
  # @return [String] The URL to the user's website.
118
118
  def website
119
- URI.parse(@attrs[:url]) if @attrs[:url]
119
+ Addressable::URI.parse(@attrs[:url]) if @attrs[:url]
120
120
  end
121
121
  memoize :website
122
122
 
@@ -128,7 +128,7 @@ module Twitter
128
128
  private
129
129
 
130
130
  def parse_encoded_uri(uri)
131
- URI.parse(URI.encode(uri))
131
+ Addressable::URI.parse(URI.encode(uri))
132
132
  end
133
133
 
134
134
  def insecure_uri(uri)
@@ -1,8 +1,8 @@
1
1
  module Twitter
2
2
  class Version
3
3
  MAJOR = 5
4
- MINOR = 0
5
- PATCH = 1
4
+ MINOR = 1
5
+ PATCH = 0
6
6
  PRE = nil
7
7
 
8
8
  class << self
@@ -29,7 +29,7 @@ describe Twitter::Entity::URI do
29
29
  describe "#expanded_uri" do
30
30
  it "returns a URI when the expanded_url is set" do
31
31
  uri = Twitter::Entity::URI.new(:expanded_url => "https://github.com/sferik")
32
- expect(uri.expanded_uri).to be_a URI
32
+ expect(uri.expanded_uri).to be_a Addressable::URI
33
33
  expect(uri.expanded_uri.to_s).to eq("https://github.com/sferik")
34
34
  end
35
35
  it "returns nil when the expanded_url is not set" do
@@ -52,7 +52,7 @@ describe Twitter::Entity::URI do
52
52
  describe "#uri" do
53
53
  it "returns a URI when the url is set" do
54
54
  uri = Twitter::Entity::URI.new(:url => "https://github.com/sferik")
55
- expect(uri.uri).to be_a URI
55
+ expect(uri.uri).to be_a Addressable::URI
56
56
  expect(uri.uri.to_s).to eq("https://github.com/sferik")
57
57
  end
58
58
  it "returns nil when the url is not set" do
@@ -59,7 +59,7 @@ describe Twitter::Media::Photo do
59
59
  describe "#expanded_uri" do
60
60
  it "returns a URI when the expanded_url is set" do
61
61
  photo = Twitter::Media::Photo.new(:id => 1, :expanded_url => "http://pbs.twimg.com/media/BQD6MPOCEAAbCH0.png")
62
- expect(photo.expanded_uri).to be_a URI
62
+ expect(photo.expanded_uri).to be_a Addressable::URI
63
63
  expect(photo.expanded_uri.to_s).to eq("http://pbs.twimg.com/media/BQD6MPOCEAAbCH0.png")
64
64
  end
65
65
  it "returns nil when the expanded_url is not set" do
@@ -82,7 +82,7 @@ describe Twitter::Media::Photo do
82
82
  describe "#media_uri" do
83
83
  it "returns a URI when the media_url is set" do
84
84
  photo = Twitter::Media::Photo.new(:id => 1, :media_url => "http://pbs.twimg.com/media/BQD6MPOCEAAbCH0.png")
85
- expect(photo.media_uri).to be_a URI
85
+ expect(photo.media_uri).to be_a Addressable::URI
86
86
  expect(photo.media_uri.to_s).to eq("http://pbs.twimg.com/media/BQD6MPOCEAAbCH0.png")
87
87
  end
88
88
  it "returns nil when the media_url is not set" do
@@ -105,7 +105,7 @@ describe Twitter::Media::Photo do
105
105
  describe "#media_uri_https" do
106
106
  it "returns a URI when the media_url_https is set" do
107
107
  photo = Twitter::Media::Photo.new(:id => 1, :media_url_https => "http://pbs.twimg.com/media/BQD6MPOCEAAbCH0.png")
108
- expect(photo.media_uri_https).to be_a URI
108
+ expect(photo.media_uri_https).to be_a Addressable::URI
109
109
  expect(photo.media_uri_https.to_s).to eq("http://pbs.twimg.com/media/BQD6MPOCEAAbCH0.png")
110
110
  end
111
111
  it "returns nil when the media_url_https is not set" do
@@ -128,7 +128,7 @@ describe Twitter::Media::Photo do
128
128
  describe "#uri" do
129
129
  it "returns a URI when the url is set" do
130
130
  photo = Twitter::Media::Photo.new(:id => 1, :url => "http://pbs.twimg.com/media/BQD6MPOCEAAbCH0.png")
131
- expect(photo.uri).to be_a URI
131
+ expect(photo.uri).to be_a Addressable::URI
132
132
  expect(photo.uri.to_s).to eq("http://pbs.twimg.com/media/BQD6MPOCEAAbCH0.png")
133
133
  end
134
134
  it "returns nil when the url is not set" do
@@ -5,7 +5,7 @@ describe Twitter::OEmbed do
5
5
  describe "#author_uri" do
6
6
  it "returns a URI when the author_url is set" do
7
7
  oembed = Twitter::OEmbed.new(:author_url => "https://twitter.com/sferik")
8
- expect(oembed.author_uri).to be_a URI
8
+ expect(oembed.author_uri).to be_a Addressable::URI
9
9
  expect(oembed.author_uri.to_s).to eq("https://twitter.com/sferik")
10
10
  end
11
11
  it "returns nil when the author_uri is not set" do
@@ -87,7 +87,7 @@ describe Twitter::OEmbed do
87
87
  describe "#provider_uri" do
88
88
  it "returns a URI when the provider_url is set" do
89
89
  oembed = Twitter::OEmbed.new(:provider_url => "http://twitter.com")
90
- expect(oembed.provider_uri).to be_a URI
90
+ expect(oembed.provider_uri).to be_a Addressable::URI
91
91
  expect(oembed.provider_uri.to_s).to eq("http://twitter.com")
92
92
  end
93
93
  it "returns nil when the provider_uri is not set" do
@@ -136,7 +136,7 @@ describe Twitter::OEmbed do
136
136
  describe "#uri" do
137
137
  it "returns a URI when the url is set" do
138
138
  oembed = Twitter::OEmbed.new(:url => "https://twitter.com/twitterapi/status/133640144317198338")
139
- expect(oembed.uri).to be_a URI
139
+ expect(oembed.uri).to be_a Addressable::URI
140
140
  expect(oembed.uri.to_s).to eq("https://twitter.com/twitterapi/status/133640144317198338")
141
141
  end
142
142
  it "returns nil when the url is not set" do
@@ -108,7 +108,7 @@ describe Twitter::Place do
108
108
  describe "#uri" do
109
109
  it "returns a URI when the url is set" do
110
110
  place = Twitter::Place.new(:woeid => "247f43d441defc03", :url => "https://api.twitter.com/1.1/geo/id/247f43d441defc03.json")
111
- expect(place.uri).to be_a URI
111
+ expect(place.uri).to be_a Addressable::URI
112
112
  expect(place.uri.to_s).to eq("https://api.twitter.com/1.1/geo/id/247f43d441defc03.json")
113
113
  end
114
114
  it "returns nil when the url is not set" do
@@ -226,6 +226,44 @@ describe Twitter::REST::API::Tweets do
226
226
  expect{@client.update("The problem with your code is that it's doing exactly what you told it to do.")}.to raise_error Twitter::Error::AlreadyPosted
227
227
  end
228
228
  end
229
+ context "with an in-reply-to status" do
230
+ before do
231
+ @tweet = Twitter::Tweet.new(:id => 1)
232
+ stub_post("/1.1/statuses/update.json").with(:body => {:status => "The problem with your code is that it's doing exactly what you told it to do.", :in_reply_to_status_id => "1"}).to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
233
+ end
234
+ it "requests the correct resource" do
235
+ @client.update("The problem with your code is that it's doing exactly what you told it to do.", :in_reply_to_status => @tweet)
236
+ expect(a_post("/1.1/statuses/update.json").with(:body => {:status => "The problem with your code is that it's doing exactly what you told it to do.", :in_reply_to_status_id => "1"})).to have_been_made
237
+ end
238
+ end
239
+ context "with an in-reply-to status ID" do
240
+ before do
241
+ stub_post("/1.1/statuses/update.json").with(:body => {:status => "The problem with your code is that it's doing exactly what you told it to do.", :in_reply_to_status_id => "1"}).to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
242
+ end
243
+ it "requests the correct resource" do
244
+ @client.update("The problem with your code is that it's doing exactly what you told it to do.", :in_reply_to_status_id => 1)
245
+ expect(a_post("/1.1/statuses/update.json").with(:body => {:status => "The problem with your code is that it's doing exactly what you told it to do.", :in_reply_to_status_id => "1"})).to have_been_made
246
+ end
247
+ end
248
+ context "with a place" do
249
+ before do
250
+ @place = Twitter::Place.new(:woeid => "df51dec6f4ee2b2c")
251
+ stub_post("/1.1/statuses/update.json").with(:body => {:status => "The problem with your code is that it's doing exactly what you told it to do.", :place_id => "df51dec6f4ee2b2c"}).to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
252
+ end
253
+ it "requests the correct resource" do
254
+ @client.update("The problem with your code is that it's doing exactly what you told it to do.", :place => @place)
255
+ expect(a_post("/1.1/statuses/update.json").with(:body => {:status => "The problem with your code is that it's doing exactly what you told it to do.", :place_id => "df51dec6f4ee2b2c"})).to have_been_made
256
+ end
257
+ end
258
+ context "with a place ID" do
259
+ before do
260
+ stub_post("/1.1/statuses/update.json").with(:body => {:status => "The problem with your code is that it's doing exactly what you told it to do.", :place_id => "df51dec6f4ee2b2c"}).to_return(:body => fixture("status.json"), :headers => {:content_type => "application/json; charset=utf-8"})
261
+ end
262
+ it "requests the correct resource" do
263
+ @client.update("The problem with your code is that it's doing exactly what you told it to do.", :place_id => "df51dec6f4ee2b2c")
264
+ expect(a_post("/1.1/statuses/update.json").with(:body => {:status => "The problem with your code is that it's doing exactly what you told it to do.", :place_id => "df51dec6f4ee2b2c"})).to have_been_made
265
+ end
266
+ end
229
267
  end
230
268
 
231
269
  describe "#retweet" do
@@ -28,7 +28,7 @@ describe Twitter::Trend do
28
28
  describe "#uri" do
29
29
  it "returns a URI when the url is set" do
30
30
  trend = Twitter::Trend.new(:url => "http://twitter.com/search/?q=%23sevenwordsaftersex")
31
- expect(trend.uri).to be_a URI
31
+ expect(trend.uri).to be_a Addressable::URI
32
32
  expect(trend.uri.to_s).to eq("http://twitter.com/search/?q=%23sevenwordsaftersex")
33
33
  end
34
34
  it "returns nil when the url is not set" do
@@ -310,12 +310,29 @@ describe Twitter::Tweet do
310
310
  Twitter::Tweet.new(:id => 28669546014).urls
311
311
  expect($stderr.string).to match(/To get urls, you must pass `:include_entities => true` when requesting the Twitter::Tweet\./)
312
312
  end
313
+
314
+ it "can handle strange urls" do
315
+ urls_array = [
316
+ {
317
+ :url => "http://with_underscore.example.com/t.co",
318
+ :expanded_url => "http://with_underscore.example.com/expanded",
319
+ :display_url => "with_underscore.example.com/expanded…",
320
+ :indices => [10, 33],
321
+ }
322
+ ]
323
+ tweet = Twitter::Tweet.new(:id => 28669546014, :entities => {:urls => urls_array})
324
+ uri = tweet.uris.first
325
+ expect{ uri.url }.to_not raise_error
326
+ expect{ uri.expanded_url }.to_not raise_error
327
+ expect{ uri.display_url }.to_not raise_error
328
+ end
329
+
313
330
  end
314
331
 
315
332
  describe "#uri" do
316
333
  it "returns the URI to the tweet" do
317
334
  tweet = Twitter::Tweet.new(:id => 28669546014, :user => {:id => 7505382, :screen_name => "sferik"})
318
- expect(tweet.uri).to be_a URI
335
+ expect(tweet.uri).to be_a Addressable::URI
319
336
  expect(tweet.uri.to_s).to eq("https://twitter.com/sferik/status/28669546014")
320
337
  end
321
338
  end
@@ -68,11 +68,11 @@ describe Twitter::User do
68
68
  describe "#profile_banner_uri" do
69
69
  it "accepts utf8 urls" do
70
70
  user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581©_normal.png")
71
- expect(user.profile_banner_uri).to be_a URI
71
+ expect(user.profile_banner_uri).to be_a Addressable::URI
72
72
  end
73
73
  it "returns a URI when profile_banner_url is set" do
74
74
  user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
75
- expect(user.profile_banner_uri).to be_a URI
75
+ expect(user.profile_banner_uri).to be_a Addressable::URI
76
76
  end
77
77
  it "returns nil when profile_banner_uri is not set" do
78
78
  user = Twitter::User.new(:id => 7505382)
@@ -117,11 +117,11 @@ describe Twitter::User do
117
117
  describe "#profile_banner_uri_https" do
118
118
  it "accepts utf8 urls" do
119
119
  user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581©_normal.png")
120
- expect(user.profile_banner_uri_https).to be_a URI
120
+ expect(user.profile_banner_uri_https).to be_a Addressable::URI
121
121
  end
122
122
  it "returns a URI when profile_banner_url is set" do
123
123
  user = Twitter::User.new(:id => 7505382, :profile_banner_url => "https://si0.twimg.com/profile_banners/7505382/1348266581")
124
- expect(user.profile_banner_uri_https).to be_a URI
124
+ expect(user.profile_banner_uri_https).to be_a Addressable::URI
125
125
  end
126
126
  it "returns nil when created_at is not set" do
127
127
  user = Twitter::User.new(:id => 7505382)
@@ -177,11 +177,11 @@ describe Twitter::User do
177
177
  describe "#profile_image_uri" do
178
178
  it "accepts utf8 urls" do
179
179
  user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://si0.twimg.com/profile_images/7505382/1348266581©_normal.png")
180
- expect(user.profile_image_uri).to be_a URI
180
+ expect(user.profile_image_uri).to be_a Addressable::URI
181
181
  end
182
182
  it "returns a URI when profile_image_url_https is set" do
183
183
  user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
184
- expect(user.profile_image_uri).to be_a URI
184
+ expect(user.profile_image_uri).to be_a Addressable::URI
185
185
  end
186
186
  it "returns nil when created_at is not set" do
187
187
  user = Twitter::User.new(:id => 7505382)
@@ -222,11 +222,11 @@ describe Twitter::User do
222
222
  describe "#profile_image_uri_https" do
223
223
  it "accepts utf8 urls" do
224
224
  user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://si0.twimg.com/profile_images/7505382/1348266581©_normal.png")
225
- expect(user.profile_image_uri_https).to be_a URI
225
+ expect(user.profile_image_uri_https).to be_a Addressable::URI
226
226
  end
227
227
  it "returns a URI when profile_image_url_https is set" do
228
228
  user = Twitter::User.new(:id => 7505382, :profile_image_url_https => "https://a0.twimg.com/profile_images/1759857427/image1326743606_normal.png")
229
- expect(user.profile_image_uri_https).to be_a URI
229
+ expect(user.profile_image_uri_https).to be_a Addressable::URI
230
230
  end
231
231
  it "returns nil when created_at is not set" do
232
232
  user = Twitter::User.new(:id => 7505382)
@@ -305,7 +305,7 @@ describe Twitter::User do
305
305
  describe "#uri" do
306
306
  it "returns the URI to the user" do
307
307
  user = Twitter::User.new(:id => 7505382, :screen_name => "sferik")
308
- expect(user.uri).to be_a URI
308
+ expect(user.uri).to be_a Addressable::URI
309
309
  expect(user.uri.to_s).to eq("https://twitter.com/sferik")
310
310
  end
311
311
  end
@@ -313,7 +313,7 @@ describe Twitter::User do
313
313
  describe "#website" do
314
314
  it "returns a URI when the url is set" do
315
315
  user = Twitter::User.new(:id => 7505382, :url => "https://github.com/sferik")
316
- expect(user.website).to be_a URI
316
+ expect(user.website).to be_a Addressable::URI
317
317
  expect(user.website.to_s).to eq("https://github.com/sferik")
318
318
  end
319
319
  it "returns nil when the url is not set" do
metadata CHANGED
@@ -1,7 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitter
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.1
4
+ version: 5.1.0
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Erik Michaels-Ober
@@ -12,187 +13,215 @@ authors:
12
13
  autorequire:
13
14
  bindir: bin
14
15
  cert_chain:
15
- - |
16
- -----BEGIN CERTIFICATE-----
17
- MIIDLjCCAhagAwIBAgIBADANBgkqhkiG9w0BAQUFADA9MQ8wDQYDVQQDDAZzZmVy
18
- aWsxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2NvbTAe
19
- Fw0xMzAyMDMxMDAyMjdaFw0xNDAyMDMxMDAyMjdaMD0xDzANBgNVBAMMBnNmZXJp
20
- azEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29tMIIB
21
- IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl0x5dx8uKxi7TkrIuyBUTJVB
22
- v1o93nUB9j/y4M96gV2rYwAci1JPBseNd6Fybzjo3YGuHl7EQHuSHNaf1p2lxew/
23
- y60JXIJBBgPcDK/KCP4NUHofm0jfoYD+H5uNJfHCNq7/ZsTxOtE3Ra92s0BCMTpm
24
- wBMMlWR5MtdEhIYuBO4XhnejYgH0L/7BL2lymntVnsr/agdQoojQCN1IQmsRJvrR
25
- duZRO3tZvoIo1pBc4JEehDuqCeyBgPLOqMoKtQlold1TQs1kWUBK7KWMFEhKC/Kg
26
- zyzKRHQo9yDYwOvYngoBLY+T/lwCT4dyssdhzRbfnxAhaKu4SAssIwaC01yVowID
27
- AQABozkwNzAJBgNVHRMEAjAAMB0GA1UdDgQWBBS0ruDfRak5ci1OpDNX/ZdDEkIs
28
- iTALBgNVHQ8EBAMCBLAwDQYJKoZIhvcNAQEFBQADggEBAHHSMs/MP0sOaLkEv4Jo
29
- zvkm3qn5A6t0vaHx774cmejyMU+5wySxRezspL7ULh9NeuK2OhU+Oe3TpqrAg5TK
30
- R8GQILnVu2FemGA6sAkPDlcPtgA6ieI19PZOF6HVLmc/ID/dP/NgZWWzEeqQKmcK
31
- 2+HM+SEEDhZkScYekw4ZOe164ZtZG816oAv5x0pGitSIkumUp7V8iEZ/6ehr7Y9e
32
- XOg4eeun5L/JjmjARoW2kNdvkRD3c2EeSLqWvQRsBlypHfhs6JJuLlyZPGhU3R/v
33
- Sf3lVKpBCWgRpGTvy45XVpB+59y33PJmEuQ1PTEOYvQyao9UKMAAaAN/7qWQtjl0
34
- hlw=
35
- -----END CERTIFICATE-----
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
36
43
  date: 2013-11-28 00:00:00.000000000 Z
37
44
  dependencies:
38
45
  - !ruby/object:Gem::Dependency
39
46
  name: addressable
40
47
  requirement: !ruby/object:Gem::Requirement
48
+ none: false
41
49
  requirements:
42
- - - "~>"
50
+ - - ~>
43
51
  - !ruby/object:Gem::Version
44
52
  version: '2.3'
45
53
  type: :runtime
46
54
  prerelease: false
47
55
  version_requirements: !ruby/object:Gem::Requirement
56
+ none: false
48
57
  requirements:
49
- - - "~>"
58
+ - - ~>
50
59
  - !ruby/object:Gem::Version
51
60
  version: '2.3'
52
61
  - !ruby/object:Gem::Dependency
53
62
  name: buftok
54
63
  requirement: !ruby/object:Gem::Requirement
64
+ none: false
55
65
  requirements:
56
- - - "~>"
66
+ - - ~>
57
67
  - !ruby/object:Gem::Version
58
68
  version: 0.2.0
59
69
  type: :runtime
60
70
  prerelease: false
61
71
  version_requirements: !ruby/object:Gem::Requirement
72
+ none: false
62
73
  requirements:
63
- - - "~>"
74
+ - - ~>
64
75
  - !ruby/object:Gem::Version
65
76
  version: 0.2.0
66
77
  - !ruby/object:Gem::Dependency
67
78
  name: descendants_tracker
68
79
  requirement: !ruby/object:Gem::Requirement
80
+ none: false
69
81
  requirements:
70
- - - "~>"
82
+ - - ~>
71
83
  - !ruby/object:Gem::Version
72
84
  version: 0.0.1
73
85
  type: :runtime
74
86
  prerelease: false
75
87
  version_requirements: !ruby/object:Gem::Requirement
88
+ none: false
76
89
  requirements:
77
- - - "~>"
90
+ - - ~>
78
91
  - !ruby/object:Gem::Version
79
92
  version: 0.0.1
80
93
  - !ruby/object:Gem::Dependency
81
94
  name: equalizer
82
95
  requirement: !ruby/object:Gem::Requirement
96
+ none: false
83
97
  requirements:
84
- - - "~>"
98
+ - - ~>
85
99
  - !ruby/object:Gem::Version
86
100
  version: 0.0.7
87
101
  type: :runtime
88
102
  prerelease: false
89
103
  version_requirements: !ruby/object:Gem::Requirement
104
+ none: false
90
105
  requirements:
91
- - - "~>"
106
+ - - ~>
92
107
  - !ruby/object:Gem::Version
93
108
  version: 0.0.7
94
109
  - !ruby/object:Gem::Dependency
95
110
  name: faraday
96
111
  requirement: !ruby/object:Gem::Requirement
112
+ none: false
97
113
  requirements:
98
- - - ">="
114
+ - - ! '>='
99
115
  - !ruby/object:Gem::Version
100
116
  version: '0.8'
101
- - - "<"
117
+ - - <
102
118
  - !ruby/object:Gem::Version
103
119
  version: '0.10'
104
120
  type: :runtime
105
121
  prerelease: false
106
122
  version_requirements: !ruby/object:Gem::Requirement
123
+ none: false
107
124
  requirements:
108
- - - ">="
125
+ - - ! '>='
109
126
  - !ruby/object:Gem::Version
110
127
  version: '0.8'
111
- - - "<"
128
+ - - <
112
129
  - !ruby/object:Gem::Version
113
130
  version: '0.10'
114
131
  - !ruby/object:Gem::Dependency
115
132
  name: http
116
133
  requirement: !ruby/object:Gem::Requirement
134
+ none: false
117
135
  requirements:
118
- - - "~>"
136
+ - - ~>
119
137
  - !ruby/object:Gem::Version
120
138
  version: 0.5.0
121
139
  type: :runtime
122
140
  prerelease: false
123
141
  version_requirements: !ruby/object:Gem::Requirement
142
+ none: false
124
143
  requirements:
125
- - - "~>"
144
+ - - ~>
126
145
  - !ruby/object:Gem::Version
127
146
  version: 0.5.0
128
147
  - !ruby/object:Gem::Dependency
129
148
  name: http_parser.rb
130
149
  requirement: !ruby/object:Gem::Requirement
150
+ none: false
131
151
  requirements:
132
- - - "~>"
152
+ - - ~>
133
153
  - !ruby/object:Gem::Version
134
154
  version: 0.5.0
135
155
  type: :runtime
136
156
  prerelease: false
137
157
  version_requirements: !ruby/object:Gem::Requirement
158
+ none: false
138
159
  requirements:
139
- - - "~>"
160
+ - - ~>
140
161
  - !ruby/object:Gem::Version
141
162
  version: 0.5.0
142
163
  - !ruby/object:Gem::Dependency
143
164
  name: json
144
165
  requirement: !ruby/object:Gem::Requirement
166
+ none: false
145
167
  requirements:
146
- - - "~>"
168
+ - - ~>
147
169
  - !ruby/object:Gem::Version
148
170
  version: '1.8'
149
171
  type: :runtime
150
172
  prerelease: false
151
173
  version_requirements: !ruby/object:Gem::Requirement
174
+ none: false
152
175
  requirements:
153
- - - "~>"
176
+ - - ~>
154
177
  - !ruby/object:Gem::Version
155
178
  version: '1.8'
156
179
  - !ruby/object:Gem::Dependency
157
180
  name: memoizable
158
181
  requirement: !ruby/object:Gem::Requirement
182
+ none: false
159
183
  requirements:
160
- - - "~>"
184
+ - - ~>
161
185
  - !ruby/object:Gem::Version
162
186
  version: 0.2.0
163
187
  type: :runtime
164
188
  prerelease: false
165
189
  version_requirements: !ruby/object:Gem::Requirement
190
+ none: false
166
191
  requirements:
167
- - - "~>"
192
+ - - ~>
168
193
  - !ruby/object:Gem::Version
169
194
  version: 0.2.0
170
195
  - !ruby/object:Gem::Dependency
171
196
  name: simple_oauth
172
197
  requirement: !ruby/object:Gem::Requirement
198
+ none: false
173
199
  requirements:
174
- - - "~>"
200
+ - - ~>
175
201
  - !ruby/object:Gem::Version
176
202
  version: 0.2.0
177
203
  type: :runtime
178
204
  prerelease: false
179
205
  version_requirements: !ruby/object:Gem::Requirement
206
+ none: false
180
207
  requirements:
181
- - - "~>"
208
+ - - ~>
182
209
  - !ruby/object:Gem::Version
183
210
  version: 0.2.0
184
211
  - !ruby/object:Gem::Dependency
185
212
  name: bundler
186
213
  requirement: !ruby/object:Gem::Requirement
214
+ none: false
187
215
  requirements:
188
- - - "~>"
216
+ - - ~>
189
217
  - !ruby/object:Gem::Version
190
218
  version: '1.0'
191
219
  type: :development
192
220
  prerelease: false
193
221
  version_requirements: !ruby/object:Gem::Requirement
222
+ none: false
194
223
  requirements:
195
- - - "~>"
224
+ - - ~>
196
225
  - !ruby/object:Gem::Version
197
226
  version: '1.0'
198
227
  description: A Ruby interface to the Twitter API.
@@ -202,13 +231,13 @@ executables: []
202
231
  extensions: []
203
232
  extra_rdoc_files: []
204
233
  files:
205
- - ".yardopts"
234
+ - .yardopts
206
235
  - CHANGELOG.md
207
236
  - CONTRIBUTING.md
208
237
  - LICENSE.md
209
238
  - README.md
210
239
  - Rakefile
211
- - lib/twitter.rb
240
+ - twitter.gemspec
212
241
  - lib/twitter/arguments.rb
213
242
  - lib/twitter/base.rb
214
243
  - lib/twitter/basic_user.rb
@@ -219,13 +248,12 @@ files:
219
248
  - lib/twitter/creatable.rb
220
249
  - lib/twitter/cursor.rb
221
250
  - lib/twitter/direct_message.rb
222
- - lib/twitter/entity.rb
223
251
  - lib/twitter/entity/hashtag.rb
224
252
  - lib/twitter/entity/symbol.rb
225
253
  - lib/twitter/entity/uri.rb
226
254
  - lib/twitter/entity/user_mention.rb
255
+ - lib/twitter/entity.rb
227
256
  - lib/twitter/enumerable.rb
228
- - lib/twitter/error.rb
229
257
  - lib/twitter/error/already_favorited.rb
230
258
  - lib/twitter/error/already_posted.rb
231
259
  - lib/twitter/error/already_retweeted.rb
@@ -241,10 +269,11 @@ files:
241
269
  - lib/twitter/error/too_many_requests.rb
242
270
  - lib/twitter/error/unauthorized.rb
243
271
  - lib/twitter/error/unprocessable_entity.rb
272
+ - lib/twitter/error.rb
244
273
  - lib/twitter/factory.rb
245
- - lib/twitter/geo.rb
246
274
  - lib/twitter/geo/point.rb
247
275
  - lib/twitter/geo/polygon.rb
276
+ - lib/twitter/geo.rb
248
277
  - lib/twitter/geo_factory.rb
249
278
  - lib/twitter/geo_results.rb
250
279
  - lib/twitter/identity.rb
@@ -300,6 +329,7 @@ files:
300
329
  - lib/twitter/tweet.rb
301
330
  - lib/twitter/user.rb
302
331
  - lib/twitter/version.rb
332
+ - lib/twitter.rb
303
333
  - spec/fixtures/already_favorited.json
304
334
  - spec/fixtures/already_posted.json
305
335
  - spec/fixtures/already_retweeted.json
@@ -418,30 +448,30 @@ files:
418
448
  - spec/twitter/tweet_spec.rb
419
449
  - spec/twitter/user_spec.rb
420
450
  - spec/twitter_spec.rb
421
- - twitter.gemspec
422
451
  homepage: http://sferik.github.com/twitter/
423
452
  licenses:
424
453
  - MIT
425
- metadata: {}
426
454
  post_install_message:
427
455
  rdoc_options: []
428
456
  require_paths:
429
457
  - lib
430
458
  required_ruby_version: !ruby/object:Gem::Requirement
459
+ none: false
431
460
  requirements:
432
- - - ">="
461
+ - - ! '>='
433
462
  - !ruby/object:Gem::Version
434
463
  version: '0'
435
464
  required_rubygems_version: !ruby/object:Gem::Requirement
465
+ none: false
436
466
  requirements:
437
- - - ">="
467
+ - - ! '>='
438
468
  - !ruby/object:Gem::Version
439
469
  version: 1.3.5
440
470
  requirements: []
441
471
  rubyforge_project:
442
- rubygems_version: 2.2.0
472
+ rubygems_version: 1.8.23
443
473
  signing_key:
444
- specification_version: 4
474
+ specification_version: 3
445
475
  summary: A Ruby interface to the Twitter API.
446
476
  test_files:
447
477
  - spec/fixtures/already_favorited.json
metadata.gz.sig CHANGED
Binary file
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: cd3b043b736ba3c54df5a11613f965fe07d5cdd1
4
- data.tar.gz: 6877cd5f7ce89f0426c782f3422f43121bde323d
5
- SHA512:
6
- metadata.gz: 3bf02c9354b02c672eb6f2aa5be96c2c31c56b14062eb9b5d6e88289191e47d70e25afe261e9d4cb4dbc778fee756fa5f4743fe10254af65f1dd9677d9987b09
7
- data.tar.gz: 497a677015108a2867a605bf27df26e2e8cb4d1b5998464171e58d06fcbcb929ade0d1523e0b905c27d98582c22f943d3419e2f08d13aa79766ba3adf4bbdb1a
Binary file