twitter 6.2.0 → 8.0.0.rc.1

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.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -10
  3. data/LICENSE.md +1 -1
  4. data/README.md +9 -14
  5. data/lib/twitter/base.rb +11 -11
  6. data/lib/twitter/basic_user.rb +3 -2
  7. data/lib/twitter/client.rb +8 -8
  8. data/lib/twitter/creatable.rb +7 -3
  9. data/lib/twitter/cursor.rb +15 -5
  10. data/lib/twitter/direct_message.rb +4 -3
  11. data/lib/twitter/direct_message_event.rb +44 -0
  12. data/lib/twitter/direct_messages/welcome_message.rb +17 -0
  13. data/lib/twitter/direct_messages/welcome_message_rule.rb +12 -0
  14. data/lib/twitter/direct_messages/welcome_message_rule_wrapper.rb +36 -0
  15. data/lib/twitter/direct_messages/welcome_message_wrapper.rb +42 -0
  16. data/lib/twitter/entities.rb +6 -6
  17. data/lib/twitter/entity/hashtag.rb +1 -1
  18. data/lib/twitter/entity/symbol.rb +1 -1
  19. data/lib/twitter/entity/uri.rb +1 -1
  20. data/lib/twitter/entity/user_mention.rb +1 -1
  21. data/lib/twitter/entity.rb +1 -1
  22. data/lib/twitter/enumerable.rb +15 -6
  23. data/lib/twitter/error.rb +52 -9
  24. data/lib/twitter/factory.rb +1 -1
  25. data/lib/twitter/geo/point.rb +1 -1
  26. data/lib/twitter/geo/polygon.rb +1 -1
  27. data/lib/twitter/geo.rb +2 -2
  28. data/lib/twitter/geo_factory.rb +3 -3
  29. data/lib/twitter/geo_results.rb +2 -2
  30. data/lib/twitter/headers.rb +4 -4
  31. data/lib/twitter/identity.rb +2 -2
  32. data/lib/twitter/language.rb +1 -1
  33. data/lib/twitter/list.rb +3 -2
  34. data/lib/twitter/media/animated_gif.rb +1 -1
  35. data/lib/twitter/media/photo.rb +2 -2
  36. data/lib/twitter/media/video.rb +3 -3
  37. data/lib/twitter/media/video_info.rb +2 -2
  38. data/lib/twitter/media_factory.rb +4 -4
  39. data/lib/twitter/metadata.rb +1 -1
  40. data/lib/twitter/null_object.rb +19 -5
  41. data/lib/twitter/oembed.rb +2 -1
  42. data/lib/twitter/place.rb +3 -3
  43. data/lib/twitter/premium_search_results.rb +67 -0
  44. data/lib/twitter/profile.rb +6 -6
  45. data/lib/twitter/profile_banner.rb +2 -2
  46. data/lib/twitter/rate_limit.rb +6 -6
  47. data/lib/twitter/relationship.rb +2 -1
  48. data/lib/twitter/rest/account_activity.rb +99 -0
  49. data/lib/twitter/rest/api.rb +22 -16
  50. data/lib/twitter/rest/client.rb +4 -4
  51. data/lib/twitter/rest/direct_messages/welcome_messages.rb +90 -0
  52. data/lib/twitter/rest/direct_messages.rb +136 -47
  53. data/lib/twitter/rest/favorites.rb +17 -21
  54. data/lib/twitter/rest/form_encoder.rb +27 -0
  55. data/lib/twitter/rest/friends_and_followers.rb +21 -21
  56. data/lib/twitter/rest/help.rb +6 -18
  57. data/lib/twitter/rest/lists.rb +33 -32
  58. data/lib/twitter/rest/oauth.rb +8 -8
  59. data/lib/twitter/rest/places_and_geo.rb +6 -6
  60. data/lib/twitter/rest/premium_search.rb +34 -0
  61. data/lib/twitter/rest/request.rb +64 -31
  62. data/lib/twitter/rest/saved_searches.rb +6 -6
  63. data/lib/twitter/rest/search.rb +6 -5
  64. data/lib/twitter/rest/spam_reporting.rb +3 -3
  65. data/lib/twitter/rest/suggested_users.rb +5 -5
  66. data/lib/twitter/rest/timelines.rb +8 -7
  67. data/lib/twitter/rest/trends.rb +7 -7
  68. data/lib/twitter/rest/tweets.rb +20 -53
  69. data/lib/twitter/rest/undocumented.rb +7 -7
  70. data/lib/twitter/rest/upload_utils.rb +68 -0
  71. data/lib/twitter/rest/users.rb +32 -32
  72. data/lib/twitter/rest/utils.rb +41 -24
  73. data/lib/twitter/saved_search.rb +2 -2
  74. data/lib/twitter/search_results.rb +10 -9
  75. data/lib/twitter/settings.rb +2 -1
  76. data/lib/twitter/size.rb +2 -2
  77. data/lib/twitter/source_user.rb +1 -1
  78. data/lib/twitter/streaming/client.rb +19 -15
  79. data/lib/twitter/streaming/connection.rb +19 -7
  80. data/lib/twitter/streaming/message_parser.rb +7 -7
  81. data/lib/twitter/streaming/response.rb +12 -10
  82. data/lib/twitter/suggestion.rb +3 -3
  83. data/lib/twitter/target_user.rb +1 -1
  84. data/lib/twitter/trend.rb +3 -2
  85. data/lib/twitter/trend_results.rb +5 -5
  86. data/lib/twitter/tweet.rb +13 -4
  87. data/lib/twitter/user.rb +9 -9
  88. data/lib/twitter/utils.rb +6 -4
  89. data/lib/twitter/variant.rb +2 -1
  90. data/lib/twitter/version.rb +4 -4
  91. data/lib/twitter.rb +36 -31
  92. data/twitter.gemspec +19 -19
  93. metadata +33 -37
  94. data/lib/twitter/configuration.rb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6c1797367fcb91dca015c7a77acd6273beb4c49e929c98d2d3a913ea37009496
4
- data.tar.gz: 3c4a9f1fca5d3e99b9be0cb8993c4f274cb309b8fc19b2f3cf45838622484bce
3
+ metadata.gz: b80e3506c8a84c489163c646cc9dee9796125556ac219c29f324f533436e2699
4
+ data.tar.gz: 25c98a022fefc26d3c38de160a4afa6edcf619e79b9f72487e61643891eb65fb
5
5
  SHA512:
6
- metadata.gz: 887f6a6acfb58cd602fe1507c66e12fcb53c5b7479054a91e0ca68ee0c2a227c620b8bab614d256e4dfb31015cdc5c85fe8bdf9f05e9f48b8c38c8d945fbbf1e
7
- data.tar.gz: 631417a20ae3bca7970e05f6a63c6049af3c613b0f078a6d178d81f13750ff4a885514aa882be050a94f3909dc24df8df084fbc816bec280a9e7963fb7ab3750
6
+ metadata.gz: bd410ed4a557fb3e2890e9fc6cd81672f73b1d8dfa4d0c5cb3f793943074f5ef8aba43332e833bc411ac39c1648a0835145a4c722f6c94bd790fcd7d390610c3
7
+ data.tar.gz: 726be9e6536df1c63fdbf528011ddffeeee5c88bf65031f88555009718626c40a7e8661356abd4c58be6709b289565a4e56fb36127a9512b4c7009d27b4bf26b
data/CHANGELOG.md CHANGED
@@ -1,25 +1,47 @@
1
- 6.2.0
2
- ------
1
+ 8.0.0
2
+ -----
3
+ * [Fix filter limit issue](https://github.com/sferik/twitter/commit/be91024f7af7e94dd6578e08937975443dc09487)
4
+ * [Pass custom `HTTP::FormData` with encoder for post requests](https://github.com/sferik/twitter/commit/62d15daf1f7009b532bced2423d2e3878c4a6628)
5
+ * [Removed the `Twitter::Configuration` class](https://github.com/sferik/twitter/commit/d9b49dbb60427e447b25afad5a4824a068b577c5)
6
+ * [Replace `http_parser.rb` with `llhttp`](https://github.com/sferik/twitter/commit/b30a831477910fa6b311c6de98fafabc5dccf827)
7
+ * [Update `buftok` dependency to ~> 0.3.0](https://github.com/sferik/twitter/commit/69237190197cae174cee09b4765230aadf231e3a)
8
+ * [Update `http` dependency to ~> 5.0](https://github.com/sferik/twitter/commit/d218358b9fdba501d0f4e59a10bd1e86f18e044f)
9
+ * [Set minimum required ruby version to 2.7.7](https://github.com/sferik/twitter/commit/3b50a1fe31233fbe85e5cf9d722aba13fa61aed8)
10
+
11
+ 7.0.0
12
+ -----
13
+ * [Add `Twitter::DirectMessageEvent`](https://github.com/sferik/twitter/commit/38f6aaa482dcd5f4982abd811dbe6e21e36c2ae8) ([@FabienChaynes](https://twitter.com/FabienChaynes))
14
+ * [Create `Twitter::DirectMessageEvent` with media](https://github.com/sferik/twitter/commit/21478530ec6f8a798717a5ab8b197b895db3bc28) ([@FabienChaynes](https://twitter.com/FabienChaynes))
15
+ * [Support for DM welcome messages](https://github.com/sferik/twitter/pull/950) ([@FabienChaynes](https://twitter.com/FabienChaynes))
16
+ * [Support for closing `Twitter::Streaming::Connection`](https://github.com/sferik/twitter/commit/89e3543aa06e00eeab7eaf5bdd3a33a6112356b1) ([@okkez](https://twitter.com/okkez))
17
+ * [Add `Twitter::REST::Client#create_direct_message_event`](https://github.com/sferik/twitter/commit/b45d545c7ebfd28e4d908037dd3fde04e3c307cf) ([@cyu](https://twitter.com/cyu))
18
+ * [Add `Twitter::REST::Client#premium_search`](https://github.com/sferik/twitter/pull/953)
19
+ * [Add `Twitter::REST::AccountActivity`](https://github.com/sferik/twitter/pull/939)
20
+ * [Update all direct message methods to return `Twitter::DirectMessageEvent`](https://github.com/sferik/twitter/commit/0833471366a33657cd2920850e3928db010eecab) ([@flikglick](https://twitter.com/flikglick))
21
+ * [Correctly handle different `Twitter::Error::AlreadyRetweeted` error messages](https://github.com/sferik/twitter/commit/c9bf100eedc89aee43689c17f160025e0f40cfb4) ([@knu](https://twitter.com/knu))
22
+ * [Fix proxy setting sample](https://github.com/sferik/twitter/commit/91c037cfb26ac0c9d3099cdeec42d65fe8716b78) ([@nicklegr](https://twitter.com/nicklegr))
23
+ * [Add Active Support `presence` methods on `Twitter::NullObject`](https://github.com/sferik/twitter/commit/07a5d7b60f335aefd583dae85ba959235bc9f55f) ([@davebrace](https://twitter.com/davebrace))
24
+ * [Upload GIFs over 5MB in chunks](https://github.com/sferik/twitter/commit/ba6a3062782b37cf83b9813c5128c87d4971ab9c) ([@wild_dmitry](https://twitter.com/wild_dmitry))
25
+ * [Track rate limit when searching tweets](https://github.com/sferik/twitter/commit/067e751d58b7bb0bfbe8a5531a4288f4c966b301) ([@dsalahutdinov1](https://twitter.com/dsalahutdinov1))
26
+ * [Add `quote_count` and `reply_count` attributes to `Twitter::Tweet`](https://github.com/sferik/twitter/commit/844818cad07ce490ccb9d8542ebb6b4fc7a61cb4)
27
+ * [Drop support for Ruby 2.0, 2.1, and 2.2](https://github.com/sferik/twitter/commit/95861ec83e582c2a88499b97d9d5388a96d0abf0)
3
28
 
29
+ 6.2.0
30
+ -----
4
31
  Not yet documented, sorry. For now, please use git to compare tags:
5
32
  https://github.com/sferik/twitter/compare/v6.1.0...v6.2.0
6
33
 
7
34
  6.1.0
8
- ------
9
-
35
+ -----
10
36
  Not yet documented, sorry. For now, please use git to compare tags:
11
37
  https://github.com/sferik/twitter/compare/v6.0.0...v6.1.0
12
38
 
13
-
14
39
  6.0.0
15
- ------
16
-
17
- Not yet documented, sorry. For now, please use git to compare tags:
18
- https://github.com/sferik/twitter/compare/v5.16.0...v6.0.0
40
+ -----
41
+ * [Drop support for Ruby 1.8.7 and Ruby 1.9.3](https://github.com/sferik/twitter/commit/27980f45fb357e34b86e46cb9134d86ed29b3ce3)
19
42
 
20
43
  5.16.0
21
44
  ------
22
-
23
45
  * [Add Twitter::Trend#tweet_volume](https://github.com/sferik/twitter/commit/e797b62e5e6a768e8aeafde6186e1f5310e6bfc6)
24
46
  * [Add new settings to Twitter::Settings](https://github.com/sferik/twitter/commit/d047ce00034d26a99927076c28679ce08fd69308)
25
47
  * [Fix `Version.to_a`](https://github.com/sferik/twitter/commit/0cd119abf64e6c2b7fd861b0df65b7cb41d892b4)
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2006-2016 Erik Michaels-Ober, John Nunemaker, Wynn Netherland, Steve Richert, Steve Agalloco
1
+ Copyright (c) 2006-2020 Erik Berlin, John Nunemaker, Wynn Netherland, Steve Richert, Steve Agalloco
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,17 +1,13 @@
1
1
  # The Twitter Ruby Gem
2
2
 
3
- [![Gem Version](http://img.shields.io/gem/v/twitter.svg)][gem]
4
- [![Build Status](http://img.shields.io/travis/sferik/twitter.svg)][travis]
5
- [![Dependency Status](http://img.shields.io/gemnasium/sferik/twitter.svg)][gemnasium]
6
- [![Code Climate](http://img.shields.io/codeclimate/github/sferik/twitter.svg)][codeclimate]
7
- [![Coverage Status](http://img.shields.io/coveralls/sferik/twitter.svg)][coveralls]
3
+ [![Gem Version](https://badge.fury.io/rb/twitter.svg)][gem]
4
+ [![Build Status](https://travis-ci.org/sferik/twitter.svg?branch=master)][travis]
5
+ [![Maintainability](https://api.codeclimate.com/v1/badges/09362621ad91e8f599b3/maintainability)][maintainability]
8
6
  [![Inline docs](http://inch-ci.org/github/sferik/twitter.svg?style=shields)][inchpages]
9
7
 
10
8
  [gem]: https://rubygems.org/gems/twitter
11
9
  [travis]: https://travis-ci.org/sferik/twitter
12
- [gemnasium]: https://gemnasium.com/sferik/twitter
13
- [codeclimate]: https://codeclimate.com/github/sferik/twitter
14
- [coveralls]: https://coveralls.io/r/sferik/twitter
10
+ [maintainability]: https://codeclimate.com/github/sferik/twitter/maintainability
15
11
  [inchpages]: http://inch-ci.org/github/sferik/twitter
16
12
 
17
13
  A Ruby interface to the Twitter API.
@@ -231,11 +227,10 @@ command:
231
227
  This library aims to support and is [tested against][travis] the following Ruby
232
228
  versions:
233
229
 
234
- * Ruby 2.0.0
235
- * Ruby 2.1
236
- * Ruby 2.2
237
- * Ruby 2.3
238
- * JRuby 9.1.6.0
230
+ * Ruby 2.7
231
+ * Ruby 3.0
232
+ * Ruby 3.1
233
+ * Ruby 3.2
239
234
 
240
235
  If something doesn't work on one of these versions, it's a bug.
241
236
 
@@ -266,7 +261,7 @@ Constraint][pvc] with two digits of precision. For example:
266
261
  [pvc]: http://guides.rubygems.org/patterns/#pessimistic-version-constraint
267
262
 
268
263
  ## Copyright
269
- Copyright (c) 2006-2016 Erik Michaels-Ober, John Nunemaker, Wynn Netherland, Steve Richert, Steve Agalloco.
264
+ Copyright (c) 2006-2016 Erik Berlin, John Nunemaker, Wynn Netherland, Steve Richert, Steve Agalloco.
270
265
  See [LICENSE][] for details.
271
266
 
272
267
  [license]: LICENSE.md
data/lib/twitter/base.rb CHANGED
@@ -1,8 +1,8 @@
1
- require 'addressable/uri'
2
- require 'forwardable'
3
- require 'memoizable'
4
- require 'twitter/null_object'
5
- require 'twitter/utils'
1
+ require "addressable/uri"
2
+ require "forwardable"
3
+ require "memoizable"
4
+ require "twitter/null_object"
5
+ require "twitter/utils"
6
6
 
7
7
  module Twitter
8
8
  class Base
@@ -46,10 +46,10 @@ module Twitter
46
46
  # @param attrs [Array, Symbol]
47
47
  def uri_attr_reader(*attrs)
48
48
  attrs.each do |uri_key|
49
- array = uri_key.to_s.split('_')
50
- index = array.index('uri')
51
- array[index] = 'url'
52
- url_key = array.join('_').to_sym
49
+ array = uri_key.to_s.split("_")
50
+ index = array.index("uri")
51
+ array[index] = "url"
52
+ url_key = array.join("_").to_sym
53
53
  define_uri_method(uri_key, url_key)
54
54
  alias_method(url_key, uri_key)
55
55
  define_predicate_method(uri_key, url_key)
@@ -71,7 +71,7 @@ module Twitter
71
71
  # @param key2 [Symbol]
72
72
  def define_uri_method(key1, key2)
73
73
  define_method(key1) do
74
- Addressable::URI.parse(@attrs[key2].chomp('#')) unless @attrs[key2].nil?
74
+ Addressable::URI.parse(@attrs[key2].chomp("#")) unless @attrs[key2].nil?
75
75
  end
76
76
  memoize(key1)
77
77
  end
@@ -125,7 +125,7 @@ module Twitter
125
125
  private
126
126
 
127
127
  def attr_falsey_or_empty?(key)
128
- !@attrs[key] || @attrs[key].respond_to?(:empty?) && @attrs[key].empty?
128
+ !@attrs[key] || (@attrs[key].respond_to?(:empty?) && @attrs[key].empty?)
129
129
  end
130
130
 
131
131
  def attrs_for_object(key1, key2 = nil)
@@ -1,10 +1,11 @@
1
- require 'twitter/identity'
2
- require 'twitter/utils'
1
+ require "twitter/identity"
2
+ require "twitter/utils"
3
3
 
4
4
  module Twitter
5
5
  class BasicUser < Twitter::Identity
6
6
  # @return [String]
7
7
  attr_reader :screen_name
8
+
8
9
  predicate_attr_reader :following
9
10
  end
10
11
  end
@@ -1,11 +1,11 @@
1
- require 'twitter/error'
2
- require 'twitter/utils'
3
- require 'twitter/version'
1
+ require "twitter/error"
2
+ require "twitter/utils"
3
+ require "twitter/version"
4
4
 
5
5
  module Twitter
6
6
  class Client
7
7
  include Twitter::Utils
8
- attr_accessor :access_token, :access_token_secret, :consumer_key, :consumer_secret, :proxy, :timeouts
8
+ attr_accessor :access_token, :access_token_secret, :consumer_key, :consumer_secret, :proxy, :timeouts, :dev_environment
9
9
  attr_writer :user_agent
10
10
 
11
11
  # Initializes a new Client object
@@ -21,7 +21,7 @@ module Twitter
21
21
 
22
22
  # @return [Boolean]
23
23
  def user_token?
24
- !(blank?(access_token) || blank?(access_token_secret))
24
+ !(blank_string?(access_token) || blank_string?(access_token_secret))
25
25
  end
26
26
 
27
27
  # @return [String]
@@ -41,13 +41,13 @@ module Twitter
41
41
 
42
42
  # @return [Boolean]
43
43
  def credentials?
44
- credentials.values.none? { |v| blank?(v) }
44
+ credentials.values.none? { |v| blank_string?(v) }
45
45
  end
46
46
 
47
47
  private
48
48
 
49
- def blank?(s)
50
- s.respond_to?(:empty?) ? s.empty? : !s
49
+ def blank_string?(string)
50
+ string.respond_to?(:empty?) ? string.empty? : !string
51
51
  end
52
52
  end
53
53
  end
@@ -1,5 +1,5 @@
1
- require 'time'
2
- require 'memoizable'
1
+ require "time"
2
+ require "memoizable"
3
3
 
4
4
  module Twitter
5
5
  module Creatable
@@ -9,7 +9,11 @@ module Twitter
9
9
  #
10
10
  # @return [Time]
11
11
  def created_at
12
- Time.parse(@attrs[:created_at]).utc unless @attrs[:created_at].nil?
12
+ time = @attrs[:created_at]
13
+ return if time.nil?
14
+
15
+ time = Time.parse(time) unless time.is_a?(Time)
16
+ time.utc
13
17
  end
14
18
  memoize :created_at
15
19
 
@@ -1,6 +1,6 @@
1
- require 'twitter/enumerable'
2
- require 'twitter/rest/request'
3
- require 'twitter/utils'
1
+ require "twitter/enumerable"
2
+ require "twitter/rest/request"
3
+ require "twitter/utils"
4
4
 
5
5
  module Twitter
6
6
  class Cursor
@@ -16,8 +16,9 @@ module Twitter
16
16
  # @param key [String, Symbol] The key to fetch the data from the response
17
17
  # @param klass [Class] The class to instantiate objects in the response
18
18
  # @param request [Twitter::REST::Request]
19
+ # @param limit [Integer] After reaching the limit, we stop fetching next page
19
20
  # @return [Twitter::Cursor]
20
- def initialize(key, klass, request)
21
+ def initialize(key, klass, request, limit = nil)
21
22
  @key = key.to_sym
22
23
  @klass = klass
23
24
  @client = request.client
@@ -25,6 +26,7 @@ module Twitter
25
26
  @path = request.path
26
27
  @options = request.options
27
28
  @collection = []
29
+ @limit = limit
28
30
  self.attrs = request.perform
29
31
  end
30
32
 
@@ -32,15 +34,23 @@ module Twitter
32
34
 
33
35
  # @return [Integer]
34
36
  def next_cursor
35
- @attrs[:next_cursor] || -1
37
+ @attrs[:next_cursor]
36
38
  end
37
39
  alias next next_cursor
38
40
 
39
41
  # @return [Boolean]
40
42
  def last?
43
+ return false if next_cursor.is_a?(String)
44
+ return true if next_cursor.nil?
45
+
41
46
  next_cursor.zero?
42
47
  end
43
48
 
49
+ # @return [Boolean]
50
+ def reached_limit?
51
+ @limit && @limit <= attrs[@key].count
52
+ end
53
+
44
54
  # @return [Hash]
45
55
  def fetch_next_page
46
56
  response = Twitter::REST::Request.new(@client, @request_method, @path, @options.merge(cursor: next_cursor)).perform
@@ -1,6 +1,6 @@
1
- require 'twitter/creatable'
2
- require 'twitter/entities'
3
- require 'twitter/identity'
1
+ require "twitter/creatable"
2
+ require "twitter/entities"
3
+ require "twitter/identity"
4
4
 
5
5
  module Twitter
6
6
  class DirectMessage < Twitter::Identity
@@ -8,6 +8,7 @@ module Twitter
8
8
  include Twitter::Entities
9
9
  # @return [String]
10
10
  attr_reader :text
11
+ attr_reader :sender_id, :recipient_id
11
12
  alias full_text text
12
13
  object_attr_reader :User, :recipient
13
14
  object_attr_reader :User, :sender
@@ -0,0 +1,44 @@
1
+ require "twitter/creatable"
2
+ require "twitter/entities"
3
+ require "twitter/identity"
4
+
5
+ module Twitter
6
+ class DirectMessageEvent < Twitter::Identity
7
+ include Twitter::Creatable
8
+ include Twitter::Entities
9
+
10
+ attr_reader :created_timestamp
11
+
12
+ object_attr_reader :DirectMessage, :direct_message
13
+
14
+ def initialize(attrs)
15
+ attrs = read_from_response(attrs)
16
+ text = attrs.dig(:message_create, :message_data, :text)
17
+ urls = attrs.dig(:message_create, :message_data, :entities, :urls)
18
+
19
+ text.gsub!(urls[0][:url], urls[0][:expanded_url]) if urls.any?
20
+
21
+ attrs[:direct_message] = build_direct_message(attrs, text)
22
+ super
23
+ end
24
+
25
+ private
26
+
27
+ # @return [Hash] Normalized hash of attrs
28
+ def read_from_response(attrs)
29
+ attrs[:event].nil? ? attrs : attrs[:event]
30
+ end
31
+
32
+ def build_direct_message(attrs, text)
33
+ recipient_id = attrs[:message_create][:target][:recipient_id].to_i
34
+ sender_id = attrs[:message_create][:sender_id].to_i
35
+ {id: attrs[:id].to_i,
36
+ created_at: Time.at(attrs[:created_timestamp].to_i / 1000.0),
37
+ sender: {id: sender_id},
38
+ sender_id: sender_id,
39
+ recipient: {id: recipient_id},
40
+ recipient_id: recipient_id,
41
+ text: text}
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,17 @@
1
+ require "twitter/creatable"
2
+ require "twitter/entities"
3
+ require "twitter/identity"
4
+
5
+ module Twitter
6
+ module DirectMessages
7
+ class WelcomeMessage < Twitter::Identity
8
+ include Twitter::Creatable
9
+ include Twitter::Entities
10
+ # @return [String]
11
+ attr_reader :text
12
+ # @return [String]
13
+ attr_reader :name
14
+ alias full_text text
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ require "twitter/creatable"
2
+ require "twitter/identity"
3
+
4
+ module Twitter
5
+ module DirectMessages
6
+ class WelcomeMessageRule < Twitter::Identity
7
+ include Twitter::Creatable
8
+ # @return [Integer]
9
+ attr_reader :welcome_message_id
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,36 @@
1
+ require "twitter/creatable"
2
+ require "twitter/identity"
3
+
4
+ module Twitter
5
+ module DirectMessages
6
+ class WelcomeMessageRuleWrapper < Twitter::Identity
7
+ attr_reader :created_timestamp
8
+
9
+ object_attr_reader "DirectMessages::WelcomeMessageRule", :welcome_message_rule
10
+
11
+ def initialize(attrs)
12
+ attrs = read_from_response(attrs)
13
+
14
+ attrs[:welcome_message_rule] = build_welcome_message_rule(attrs)
15
+ super
16
+ end
17
+
18
+ private
19
+
20
+ # @return [Hash] Normalized hash of attrs
21
+ def read_from_response(attrs)
22
+ return attrs[:welcome_message_rule] unless attrs[:welcome_message_rule].nil?
23
+
24
+ attrs
25
+ end
26
+
27
+ def build_welcome_message_rule(attrs)
28
+ {
29
+ id: attrs[:id].to_i,
30
+ created_at: Time.at(attrs[:created_timestamp].to_i / 1000.0),
31
+ welcome_message_id: attrs[:welcome_message_id].to_i,
32
+ }
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,42 @@
1
+ require "twitter/creatable"
2
+ require "twitter/identity"
3
+
4
+ module Twitter
5
+ module DirectMessages
6
+ class WelcomeMessageWrapper < Twitter::Identity
7
+ attr_reader :created_timestamp
8
+
9
+ object_attr_reader "DirectMessages::WelcomeMessage", :welcome_message
10
+
11
+ def initialize(attrs)
12
+ attrs = read_from_response(attrs)
13
+ text = attrs.dig(:message_data, :text)
14
+ urls = attrs.dig(:message_data, :entities, :urls)
15
+
16
+ text.gsub!(urls[0][:url], urls[0][:expanded_url]) if urls.any?
17
+
18
+ attrs[:welcome_message] = build_welcome_message(attrs, text)
19
+ super
20
+ end
21
+
22
+ private
23
+
24
+ # @return [Hash] Normalized hash of attrs
25
+ def read_from_response(attrs)
26
+ return attrs[:welcome_message] unless attrs[:welcome_message].nil?
27
+
28
+ attrs
29
+ end
30
+
31
+ def build_welcome_message(attrs, text)
32
+ {
33
+ id: attrs[:id].to_i,
34
+ created_at: Time.at(attrs[:created_timestamp].to_i / 1000.0),
35
+ text: text,
36
+ name: attrs[:name],
37
+ entities: attrs.dig(:message_data, :entities),
38
+ }
39
+ end
40
+ end
41
+ end
42
+ end
@@ -1,9 +1,9 @@
1
- require 'memoizable'
2
- require 'twitter/entity/hashtag'
3
- require 'twitter/entity/symbol'
4
- require 'twitter/entity/uri'
5
- require 'twitter/entity/user_mention'
6
- require 'twitter/media_factory'
1
+ require "memoizable"
2
+ require "twitter/entity/hashtag"
3
+ require "twitter/entity/symbol"
4
+ require "twitter/entity/uri"
5
+ require "twitter/entity/user_mention"
6
+ require "twitter/media_factory"
7
7
 
8
8
  module Twitter
9
9
  module Entities
@@ -1,4 +1,4 @@
1
- require 'twitter/entity'
1
+ require "twitter/entity"
2
2
 
3
3
  module Twitter
4
4
  class Entity
@@ -1,4 +1,4 @@
1
- require 'twitter/entity'
1
+ require "twitter/entity"
2
2
 
3
3
  module Twitter
4
4
  class Entity
@@ -1,4 +1,4 @@
1
- require 'twitter/entity'
1
+ require "twitter/entity"
2
2
 
3
3
  module Twitter
4
4
  class Entity
@@ -1,4 +1,4 @@
1
- require 'twitter/entity'
1
+ require "twitter/entity"
2
2
 
3
3
  module Twitter
4
4
  class Entity
@@ -1,4 +1,4 @@
1
- require 'twitter/base'
1
+ require "twitter/base"
2
2
 
3
3
  module Twitter
4
4
  class Entity < Twitter::Base
@@ -3,15 +3,14 @@ module Twitter
3
3
  include ::Enumerable
4
4
 
5
5
  # @return [Enumerator]
6
- def each(start = 0)
6
+ def each(start = 0, &block)
7
7
  return to_enum(:each, start) unless block_given?
8
- Array(@collection[start..-1]).each do |element|
9
- yield(element)
10
- end
11
- unless last?
8
+
9
+ Array(@collection[start..]).each(&block)
10
+ unless finished?
12
11
  start = [@collection.size, start].max
13
12
  fetch_next_page
14
- each(start, &Proc.new)
13
+ each(start, &block)
15
14
  end
16
15
  self
17
16
  end
@@ -22,5 +21,15 @@ module Twitter
22
21
  def last?
23
22
  true
24
23
  end
24
+
25
+ # @return [Boolean]
26
+ def reached_limit?
27
+ false
28
+ end
29
+
30
+ # @return [Boolean]
31
+ def finished?
32
+ last? || reached_limit?
33
+ end
25
34
  end
26
35
  end