twitter 4.8.1 → 5.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (197) hide show
  1. data.tar.gz.sig +0 -0
  2. data/CHANGELOG.md +30 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +386 -266
  5. data/lib/twitter.rb +4 -39
  6. data/lib/twitter/arguments.rb +11 -0
  7. data/lib/twitter/base.rb +89 -68
  8. data/lib/twitter/client.rb +69 -110
  9. data/lib/twitter/configuration.rb +7 -3
  10. data/lib/twitter/creatable.rb +2 -4
  11. data/lib/twitter/cursor.rb +50 -42
  12. data/lib/twitter/direct_message.rb +2 -11
  13. data/lib/twitter/entity/uri.rb +13 -0
  14. data/lib/twitter/enumerable.rb +15 -0
  15. data/lib/twitter/error.rb +55 -7
  16. data/lib/twitter/error/already_favorited.rb +1 -1
  17. data/lib/twitter/error/already_posted.rb +10 -0
  18. data/lib/twitter/error/already_retweeted.rb +1 -1
  19. data/lib/twitter/error/bad_gateway.rb +2 -3
  20. data/lib/twitter/error/bad_request.rb +2 -2
  21. data/lib/twitter/error/forbidden.rb +2 -2
  22. data/lib/twitter/error/gateway_timeout.rb +2 -3
  23. data/lib/twitter/error/internal_server_error.rb +2 -3
  24. data/lib/twitter/error/not_acceptable.rb +2 -2
  25. data/lib/twitter/error/not_found.rb +2 -2
  26. data/lib/twitter/error/service_unavailable.rb +2 -3
  27. data/lib/twitter/error/too_many_requests.rb +2 -2
  28. data/lib/twitter/error/unauthorized.rb +2 -2
  29. data/lib/twitter/error/unprocessable_entity.rb +2 -2
  30. data/lib/twitter/factory.rb +2 -8
  31. data/lib/twitter/geo_factory.rb +2 -2
  32. data/lib/twitter/geo_results.rb +36 -0
  33. data/lib/twitter/identity.rb +0 -22
  34. data/lib/twitter/list.rb +18 -4
  35. data/lib/twitter/media/photo.rb +3 -3
  36. data/lib/twitter/media_factory.rb +2 -2
  37. data/lib/twitter/null_object.rb +24 -0
  38. data/lib/twitter/oembed.rb +3 -2
  39. data/lib/twitter/place.rb +15 -9
  40. data/lib/twitter/profile_banner.rb +5 -3
  41. data/lib/twitter/rate_limit.rb +1 -17
  42. data/lib/twitter/relationship.rb +2 -10
  43. data/lib/twitter/rest/api/direct_messages.rb +135 -0
  44. data/lib/twitter/rest/api/favorites.rb +120 -0
  45. data/lib/twitter/rest/api/friends_and_followers.rb +290 -0
  46. data/lib/twitter/rest/api/help.rb +58 -0
  47. data/lib/twitter/rest/api/lists.rb +491 -0
  48. data/lib/twitter/rest/api/oauth.rb +45 -0
  49. data/lib/twitter/rest/api/places_and_geo.rb +104 -0
  50. data/lib/twitter/rest/api/saved_searches.rb +91 -0
  51. data/lib/twitter/rest/api/search.rb +37 -0
  52. data/lib/twitter/rest/api/spam_reporting.rb +29 -0
  53. data/lib/twitter/rest/api/suggested_users.rb +51 -0
  54. data/lib/twitter/rest/api/timelines.rb +202 -0
  55. data/lib/twitter/rest/api/trends.rb +58 -0
  56. data/lib/twitter/rest/api/tweets.rb +293 -0
  57. data/lib/twitter/rest/api/undocumented.rb +52 -0
  58. data/lib/twitter/rest/api/users.rb +383 -0
  59. data/lib/twitter/rest/api/utils.rb +219 -0
  60. data/lib/twitter/rest/client.rb +193 -0
  61. data/lib/twitter/rest/request/multipart_with_file.rb +36 -0
  62. data/lib/twitter/rest/response/parse_json.rb +27 -0
  63. data/lib/twitter/{response → rest/response}/raise_error.rb +8 -11
  64. data/lib/twitter/search_results.rb +33 -21
  65. data/lib/twitter/settings.rb +1 -6
  66. data/lib/twitter/size.rb +1 -1
  67. data/lib/twitter/streaming/client.rb +77 -0
  68. data/lib/twitter/streaming/connection.rb +22 -0
  69. data/lib/twitter/streaming/response.rb +30 -0
  70. data/lib/twitter/suggestion.rb +4 -2
  71. data/lib/twitter/token.rb +8 -0
  72. data/lib/twitter/trend.rb +2 -1
  73. data/lib/twitter/trend_results.rb +59 -0
  74. data/lib/twitter/tweet.rb +41 -85
  75. data/lib/twitter/user.rb +51 -41
  76. data/lib/twitter/version.rb +4 -4
  77. data/spec/fixtures/already_posted.json +1 -0
  78. data/spec/fixtures/ids_list.json +1 -1
  79. data/spec/fixtures/ids_list2.json +1 -1
  80. data/spec/fixtures/search.json +1 -1
  81. data/spec/fixtures/search_malformed.json +1 -1
  82. data/spec/fixtures/track_streaming.json +3 -0
  83. data/spec/helper.rb +8 -13
  84. data/spec/twitter/base_spec.rb +25 -99
  85. data/spec/twitter/configuration_spec.rb +1 -1
  86. data/spec/twitter/cursor_spec.rb +13 -31
  87. data/spec/twitter/direct_message_spec.rb +41 -8
  88. data/spec/twitter/entity/uri_spec.rb +74 -0
  89. data/spec/twitter/error_spec.rb +59 -11
  90. data/spec/twitter/geo/point_spec.rb +1 -1
  91. data/spec/twitter/geo_factory_spec.rb +3 -3
  92. data/spec/twitter/geo_results_spec.rb +35 -0
  93. data/spec/twitter/identifiable_spec.rb +0 -21
  94. data/spec/twitter/list_spec.rb +51 -8
  95. data/spec/twitter/media/photo_spec.rb +118 -3
  96. data/spec/twitter/media_factory_spec.rb +2 -2
  97. data/spec/twitter/null_object_spec.rb +26 -0
  98. data/spec/twitter/oembed_spec.rb +69 -45
  99. data/spec/twitter/place_spec.rb +68 -12
  100. data/spec/twitter/profile_banner_spec.rb +1 -1
  101. data/spec/twitter/rate_limit_spec.rb +12 -12
  102. data/spec/twitter/relationship_spec.rb +31 -9
  103. data/spec/twitter/{api → rest/api}/direct_messages_spec.rb +22 -9
  104. data/spec/twitter/{api → rest/api}/favorites_spec.rb +80 -7
  105. data/spec/twitter/{api → rest/api}/friends_and_followers_spec.rb +104 -65
  106. data/spec/twitter/{api → rest/api}/geo_spec.rb +10 -10
  107. data/spec/twitter/{api → rest/api}/help_spec.rb +6 -6
  108. data/spec/twitter/{api → rest/api}/lists_spec.rb +77 -56
  109. data/spec/twitter/{api → rest/api}/oauth_spec.rb +6 -6
  110. data/spec/twitter/{api → rest/api}/saved_searches_spec.rb +7 -7
  111. data/spec/twitter/{api → rest/api}/search_spec.rb +8 -9
  112. data/spec/twitter/{api → rest/api}/spam_reporting_spec.rb +3 -3
  113. data/spec/twitter/{api → rest/api}/suggested_users_spec.rb +5 -5
  114. data/spec/twitter/{api → rest/api}/timelines_spec.rb +9 -9
  115. data/spec/twitter/{api → rest/api}/trends_spec.rb +6 -6
  116. data/spec/twitter/rest/api/tweets_spec.rb +503 -0
  117. data/spec/twitter/{api → rest/api}/undocumented_spec.rb +19 -45
  118. data/spec/twitter/{api → rest/api}/users_spec.rb +60 -35
  119. data/spec/twitter/rest/client_spec.rb +193 -0
  120. data/spec/twitter/saved_search_spec.rb +11 -0
  121. data/spec/twitter/search_results_spec.rb +29 -42
  122. data/spec/twitter/settings_spec.rb +17 -6
  123. data/spec/twitter/streaming/client_spec.rb +75 -0
  124. data/spec/twitter/token_spec.rb +16 -0
  125. data/spec/twitter/trend_results_spec.rb +89 -0
  126. data/spec/twitter/trend_spec.rb +23 -0
  127. data/spec/twitter/tweet_spec.rb +122 -115
  128. data/spec/twitter/user_spec.rb +136 -77
  129. data/spec/twitter_spec.rb +0 -119
  130. data/twitter.gemspec +8 -5
  131. metadata +148 -141
  132. metadata.gz.sig +0 -0
  133. data/lib/twitter/action/favorite.rb +0 -19
  134. data/lib/twitter/action/follow.rb +0 -30
  135. data/lib/twitter/action/list_member_added.rb +0 -39
  136. data/lib/twitter/action/mention.rb +0 -46
  137. data/lib/twitter/action/reply.rb +0 -27
  138. data/lib/twitter/action/retweet.rb +0 -27
  139. data/lib/twitter/action/tweet.rb +0 -20
  140. data/lib/twitter/action_factory.rb +0 -22
  141. data/lib/twitter/api/arguments.rb +0 -13
  142. data/lib/twitter/api/direct_messages.rb +0 -148
  143. data/lib/twitter/api/favorites.rb +0 -126
  144. data/lib/twitter/api/friends_and_followers.rb +0 -334
  145. data/lib/twitter/api/help.rb +0 -64
  146. data/lib/twitter/api/lists.rb +0 -618
  147. data/lib/twitter/api/oauth.rb +0 -44
  148. data/lib/twitter/api/places_and_geo.rb +0 -121
  149. data/lib/twitter/api/saved_searches.rb +0 -99
  150. data/lib/twitter/api/search.rb +0 -37
  151. data/lib/twitter/api/spam_reporting.rb +0 -30
  152. data/lib/twitter/api/suggested_users.rb +0 -55
  153. data/lib/twitter/api/timelines.rb +0 -214
  154. data/lib/twitter/api/trends.rb +0 -63
  155. data/lib/twitter/api/tweets.rb +0 -304
  156. data/lib/twitter/api/undocumented.rb +0 -97
  157. data/lib/twitter/api/users.rb +0 -439
  158. data/lib/twitter/api/utils.rb +0 -187
  159. data/lib/twitter/configurable.rb +0 -96
  160. data/lib/twitter/default.rb +0 -102
  161. data/lib/twitter/entity/url.rb +0 -9
  162. data/lib/twitter/error/client_error.rb +0 -35
  163. data/lib/twitter/error/decode_error.rb +0 -9
  164. data/lib/twitter/error/identity_map_key_error.rb +0 -9
  165. data/lib/twitter/error/server_error.rb +0 -28
  166. data/lib/twitter/exceptable.rb +0 -36
  167. data/lib/twitter/identity_map.rb +0 -22
  168. data/lib/twitter/request/multipart_with_file.rb +0 -34
  169. data/lib/twitter/response/parse_json.rb +0 -25
  170. data/spec/fixtures/about_me.json +0 -1
  171. data/spec/fixtures/activity_summary.json +0 -1
  172. data/spec/fixtures/bad_gateway.json +0 -1
  173. data/spec/fixtures/bad_request.json +0 -1
  174. data/spec/fixtures/by_friends.json +0 -1
  175. data/spec/fixtures/end_session.json +0 -1
  176. data/spec/fixtures/forbidden.json +0 -1
  177. data/spec/fixtures/internal_server_error.json +0 -1
  178. data/spec/fixtures/not_acceptable.json +0 -1
  179. data/spec/fixtures/phoenix_search.phoenix +0 -1
  180. data/spec/fixtures/resolve.json +0 -1
  181. data/spec/fixtures/service_unavailable.json +0 -1
  182. data/spec/fixtures/totals.json +0 -1
  183. data/spec/fixtures/trends.json +0 -1
  184. data/spec/fixtures/unauthorized.json +0 -1
  185. data/spec/fixtures/video_facets.json +0 -1
  186. data/spec/twitter/action/favorite_spec.rb +0 -29
  187. data/spec/twitter/action/follow_spec.rb +0 -29
  188. data/spec/twitter/action/list_member_added_spec.rb +0 -41
  189. data/spec/twitter/action/mention_spec.rb +0 -52
  190. data/spec/twitter/action/reply_spec.rb +0 -41
  191. data/spec/twitter/action/retweet_spec.rb +0 -41
  192. data/spec/twitter/action_factory_spec.rb +0 -35
  193. data/spec/twitter/action_spec.rb +0 -16
  194. data/spec/twitter/api/tweets_spec.rb +0 -285
  195. data/spec/twitter/client_spec.rb +0 -223
  196. data/spec/twitter/error/client_error_spec.rb +0 -23
  197. data/spec/twitter/error/server_error_spec.rb +0 -20
@@ -1,14 +1,10 @@
1
- require 'twitter/action_factory'
2
- require 'twitter/client'
3
- require 'twitter/configurable'
4
1
  require 'twitter/configuration'
5
2
  require 'twitter/cursor'
6
- require 'twitter/default'
7
3
  require 'twitter/direct_message'
8
4
  require 'twitter/entity'
9
5
  require 'twitter/entity/hashtag'
10
6
  require 'twitter/entity/symbol'
11
- require 'twitter/entity/url'
7
+ require 'twitter/entity/uri'
12
8
  require 'twitter/entity/user_mention'
13
9
  require 'twitter/geo_factory'
14
10
  require 'twitter/language'
@@ -20,47 +16,16 @@ require 'twitter/place'
20
16
  require 'twitter/profile_banner'
21
17
  require 'twitter/rate_limit'
22
18
  require 'twitter/relationship'
19
+ require 'twitter/rest/client'
23
20
  require 'twitter/saved_search'
24
21
  require 'twitter/search_results'
25
22
  require 'twitter/settings'
26
23
  require 'twitter/size'
27
24
  require 'twitter/source_user'
25
+ require 'twitter/streaming/client'
28
26
  require 'twitter/suggestion'
29
27
  require 'twitter/target_user'
30
28
  require 'twitter/trend'
31
29
  require 'twitter/tweet'
32
30
  require 'twitter/user'
33
-
34
- module Twitter
35
- class << self
36
- include Twitter::Configurable
37
-
38
- # Delegate to a Twitter::Client
39
- #
40
- # @return [Twitter::Client]
41
- def client
42
- @client = Twitter::Client.new(options) unless defined?(@client) && @client.hash == options.hash
43
- @client
44
- end
45
-
46
- # Has a client been initialized on the Twitter module
47
- #
48
- # @return [Boolean]
49
- def client?
50
- !!@client
51
- end
52
-
53
- def respond_to_missing?(method_name, include_private=false); client.respond_to?(method_name, include_private); end if RUBY_VERSION >= "1.9"
54
- def respond_to?(method_name, include_private=false); client.respond_to?(method_name, include_private) || super; end if RUBY_VERSION < "1.9"
55
-
56
- private
57
-
58
- def method_missing(method_name, *args, &block)
59
- return super unless client.respond_to?(method_name)
60
- client.send(method_name, *args, &block)
61
- end
62
-
63
- end
64
- end
65
-
66
- Twitter.setup
31
+ require 'uri'
@@ -0,0 +1,11 @@
1
+ module Twitter
2
+ class Arguments < Array
3
+ attr_reader :options
4
+
5
+ def initialize(args)
6
+ @options = args.last.is_a?(::Hash) ? args.pop : {}
7
+ super(args)
8
+ end
9
+
10
+ end
11
+ end
@@ -1,83 +1,114 @@
1
- require 'twitter/error/identity_map_key_error'
1
+ require 'forwardable'
2
+ require 'twitter/null_object'
3
+ require 'uri'
2
4
 
3
5
  module Twitter
4
6
  class Base
5
- # Define methods that retrieve the value from an initialized instance variable Hash, using the attribute as a key
7
+ extend Forwardable
8
+ attr_reader :attrs
9
+ alias to_h attrs
10
+ alias to_hash attrs
11
+ alias to_hsh attrs
12
+ def_delegators :attrs, :delete, :update
13
+
14
+ # Define methods that retrieve the value from attributes
6
15
  #
7
- # @param attrs [Array, Set, Symbol]
16
+ # @param attrs [Array, Symbol]
8
17
  def self.attr_reader(*attrs)
9
- mod = Module.new do
10
- attrs.each do |attribute|
11
- define_method attribute do
12
- @attrs[attribute.to_sym]
13
- end
14
- define_method "#{attribute}?" do
15
- !!@attrs[attribute.to_sym]
16
- end
17
- end
18
+ attrs.each do |attr|
19
+ define_attribute_method(attr)
20
+ define_predicate_method(attr)
18
21
  end
19
- const_set(:Attributes, mod)
20
- include mod
21
22
  end
22
23
 
23
- # return [Twitter::IdentityMap]
24
- def self.identity_map
25
- return unless Twitter.identity_map
26
- @identity_map = Twitter.identity_map.new unless defined?(@identity_map) && @identity_map.class == Twitter.identity_map
27
- @identity_map
24
+ # Define object methods from attributes
25
+ #
26
+ # @param klass [Symbol]
27
+ # @param key1 [Symbol]
28
+ # @param key2 [Symbol]
29
+ def self.object_attr_reader(klass, key1, key2=nil)
30
+ define_attribute_method(key1, klass, key2)
31
+ define_predicate_method(key1)
28
32
  end
29
33
 
30
- # Retrieves an object from the identity map.
34
+ # Define URI methods from attributes
31
35
  #
32
- # @param attrs [Hash]
33
- # @return [Twitter::Base]
34
- def self.fetch(attrs)
35
- return unless identity_map
36
- if object = identity_map.fetch(Marshal.dump(attrs))
37
- return object
36
+ # @param attrs [Array, Symbol]
37
+ def self.uri_attr_reader(*attrs)
38
+ attrs.each do |uri_key|
39
+ array = uri_key.to_s.split("_")
40
+ index = array.index("uri")
41
+ array[index] = "url"
42
+ url_key = array.join("_").to_sym
43
+ define_uri_method(uri_key, url_key)
44
+ define_predicate_method(uri_key, url_key)
45
+ alias_method(url_key, uri_key)
46
+ alias_method("#{url_key}?", "#{uri_key}?")
38
47
  end
39
- return yield if block_given?
40
- raise Twitter::Error::IdentityMapKeyError, "key not found"
41
48
  end
42
49
 
43
- # Stores an object in the identity map.
50
+ # Dynamically define a method for a URI
44
51
  #
45
- # @param object [Object]
46
- # @return [Twitter::Base]
47
- def self.store(object)
48
- return object unless identity_map
49
- identity_map.store(Marshal.dump(object.attrs), object)
52
+ # @param key1 [Symbol]
53
+ # @param key2 [Symbol]
54
+ def self.define_uri_method(key1, key2)
55
+ define_method(key1) do
56
+ memoize(key1) do
57
+ ::URI.parse(@attrs[key2]) if @attrs[key2]
58
+ end
59
+ end
50
60
  end
51
61
 
52
- # Returns a new object based on the response hash
62
+ # Dynamically define a method for an attribute
53
63
  #
54
- # @param response [Hash]
55
- # @return [Twitter::Base]
56
- def self.from_response(response={})
57
- fetch_or_new(response[:body])
64
+ # @param key1 [Symbol]
65
+ # @param klass [Symbol]
66
+ # @param key2 [Symbol]
67
+ def self.define_attribute_method(key1, klass=nil, key2=nil)
68
+ define_method(key1) do
69
+ memoize(key1) do
70
+ if klass.nil?
71
+ @attrs[key1]
72
+ else
73
+ if @attrs[key1]
74
+ if key2.nil?
75
+ Twitter.const_get(klass).new(@attrs[key1])
76
+ else
77
+ attrs = @attrs.dup
78
+ value = attrs.delete(key1)
79
+ Twitter.const_get(klass).new(value.update(key2 => attrs))
80
+ end
81
+ else
82
+ Twitter::NullObject.instance
83
+ end
84
+ end
85
+ end
86
+ end
58
87
  end
59
88
 
60
- # Retrieves an object from the identity map, or stores it in the
61
- # identity map if it doesn't already exist.
89
+ # Dynamically define a predicate method for an attribute
62
90
  #
63
- # @param attrs [Hash]
64
- # @return [Twitter::Base]
65
- def self.fetch_or_new(attrs={})
66
- return unless attrs
67
- return new(attrs) unless identity_map
68
-
69
- fetch(attrs) do
70
- object = new(attrs)
71
- store(object)
91
+ # @param key [Symbol]
92
+ def self.define_predicate_method(key1, key2=key1)
93
+ define_method(:"#{key1}?") do
94
+ !!@attrs[key2]
72
95
  end
73
96
  end
74
97
 
98
+ # Construct an object from a response hash
99
+ #
100
+ # @param response [Hash]
101
+ # @return [Twitter::Base]
102
+ def self.from_response(response={})
103
+ new(response[:body])
104
+ end
105
+
75
106
  # Initializes a new object
76
107
  #
77
108
  # @param attrs [Hash]
78
109
  # @return [Twitter::Base]
79
110
  def initialize(attrs={})
80
- @attrs = attrs
111
+ @attrs = attrs || {}
81
112
  end
82
113
 
83
114
  # Fetches an attribute of an object using hash notation
@@ -89,30 +120,20 @@ module Twitter
89
120
  nil
90
121
  end
91
122
 
92
- # Retrieve the attributes of an object
93
- #
94
- # @return [Hash]
95
- def attrs
96
- @attrs
97
- end
98
- alias to_hash attrs
99
-
100
- # Update the attributes of an object
101
- #
102
- # @param attrs [Hash]
103
- # @return [Twitter::Base]
104
- def update(attrs)
105
- @attrs.update(attrs)
106
- self
123
+ def memoize(key, &block)
124
+ ivar = :"@#{key}"
125
+ return instance_variable_get(ivar) if instance_variable_defined?(ivar)
126
+ result = block.call
127
+ instance_variable_set(ivar, result)
107
128
  end
108
129
 
109
- protected
130
+ private
110
131
 
111
132
  # @param attr [Symbol]
112
133
  # @param other [Twitter::Base]
113
134
  # @return [Boolean]
114
135
  def attr_equal(attr, other)
115
- self.class == other.class && !other.send(attr).nil? && send(attr) == other.send(attr)
136
+ self.class == other.class && !other.send(attr.to_sym).nil? && send(attr.to_sym) == other.send(attr.to_sym)
116
137
  end
117
138
 
118
139
  # @param other [Twitter::Base]
@@ -1,147 +1,106 @@
1
- require 'faraday'
2
- require 'multi_json'
3
- require 'twitter/api/direct_messages'
4
- require 'twitter/api/favorites'
5
- require 'twitter/api/friends_and_followers'
6
- require 'twitter/api/help'
7
- require 'twitter/api/lists'
8
- require 'twitter/api/oauth'
9
- require 'twitter/api/places_and_geo'
10
- require 'twitter/api/saved_searches'
11
- require 'twitter/api/search'
12
- require 'twitter/api/spam_reporting'
13
- require 'twitter/api/suggested_users'
14
- require 'twitter/api/timelines'
15
- require 'twitter/api/trends'
16
- require 'twitter/api/tweets'
17
- require 'twitter/api/undocumented'
18
- require 'twitter/api/users'
19
- require 'twitter/configurable'
20
- require 'twitter/error/client_error'
21
- require 'twitter/error/decode_error'
22
1
  require 'simple_oauth'
2
+ require 'twitter/version'
23
3
  require 'uri'
24
4
 
25
5
  module Twitter
26
- # Wrapper for the Twitter REST API
27
- #
28
- # @note All methods have been separated into modules and follow the same grouping used in {http://dev.twitter.com/doc the Twitter API Documentation}.
29
- # @see http://dev.twitter.com/pages/every_developer
30
6
  class Client
31
- include Twitter::API::DirectMessages
32
- include Twitter::API::Favorites
33
- include Twitter::API::FriendsAndFollowers
34
- include Twitter::API::Help
35
- include Twitter::API::Lists
36
- include Twitter::API::OAuth
37
- include Twitter::API::PlacesAndGeo
38
- include Twitter::API::SavedSearches
39
- include Twitter::API::Search
40
- include Twitter::API::SpamReporting
41
- include Twitter::API::SuggestedUsers
42
- include Twitter::API::Timelines
43
- include Twitter::API::Trends
44
- include Twitter::API::Tweets
45
- include Twitter::API::Undocumented
46
- include Twitter::API::Users
47
- include Twitter::Configurable
7
+ attr_writer :access_token, :access_token_secret, :consumer_key,
8
+ :consumer_secret, :user_agent
9
+ alias oauth_token= access_token=
10
+ alias oauth_token_secret= access_token_secret=
48
11
 
49
12
  # Initializes a new Client object
50
13
  #
51
14
  # @param options [Hash]
52
- # @return [Twitter::Client]
15
+ # @return [Twitter::REST::Client]
53
16
  def initialize(options={})
54
- Twitter::Configurable.keys.each do |key|
55
- instance_variable_set(:"@#{key}", options[key] || Twitter.instance_variable_get(:"@#{key}"))
17
+ options.each do |key, value|
18
+ send(:"#{key}=", value)
56
19
  end
20
+ yield self if block_given?
21
+ validate_credential_type!
57
22
  end
58
23
 
59
- # Perform an HTTP DELETE request
60
- def delete(path, params={})
61
- request(:delete, path, params)
62
- end
63
-
64
- # Perform an HTTP GET request
65
- def get(path, params={})
66
- request(:get, path, params)
24
+ # @return [String]
25
+ def consumer_key
26
+ if instance_variable_defined?(:@consumer_key)
27
+ @consumer_key
28
+ else
29
+ ENV['TWITTER_CONSUMER_KEY']
30
+ end
67
31
  end
68
32
 
69
- # Perform an HTTP POST request
70
- def post(path, params={})
71
- signature_params = params.values.any?{|value| value.respond_to?(:to_io)} ? {} : params
72
- request(:post, path, params, signature_params)
33
+ # @return [String]
34
+ def consumer_secret
35
+ if instance_variable_defined?(:@consumer_secret)
36
+ @consumer_secret
37
+ else
38
+ ENV['TWITTER_CONSUMER_SECRET']
39
+ end
73
40
  end
74
41
 
75
- # Perform an HTTP PUT request
76
- def put(path, params={})
77
- request(:put, path, params)
42
+ # @return [String]
43
+ def access_token
44
+ if instance_variable_defined?(:@access_token)
45
+ @access_token
46
+ else
47
+ ENV['TWITTER_ACCESS_TOKEN'] || ENV['TWITTER_OAUTH_TOKEN']
48
+ end
78
49
  end
50
+ alias oauth_token access_token
79
51
 
80
- private
81
-
82
- # Returns a proc that can be used to setup the Faraday::Request headers
83
- #
84
- # @param method [Symbol]
85
- # @param path [String]
86
- # @param params [Hash]
87
- # @return [Proc]
88
- def request_setup(method, path, params, signature_params)
89
- Proc.new do |request|
90
- if params.delete(:bearer_token_request)
91
- request.headers[:authorization] = bearer_token_credentials_auth_header
92
- request.headers[:content_type] = 'application/x-www-form-urlencoded; charset=UTF-8'
93
- request.headers[:accept] = '*/*' # It is important we set this, otherwise we get an error.
94
- elsif params.delete(:app_auth) || !user_token?
95
- unless bearer_token?
96
- @bearer_token = token
97
- Twitter.client.bearer_token = @bearer_token if Twitter.client?
98
- end
99
- request.headers[:authorization] = bearer_auth_header
100
- else
101
- request.headers[:authorization] = oauth_auth_header(method, path, signature_params).to_s
102
- end
52
+ # @return [String]
53
+ def access_token_secret
54
+ if instance_variable_defined?(:@access_token_secret)
55
+ @access_token_secret
56
+ else
57
+ ENV['TWITTER_ACCESS_TOKEN_SECRET'] || ENV['TWITTER_OAUTH_TOKEN_SECRET']
103
58
  end
104
59
  end
60
+ alias oauth_token_secret access_token_secret
105
61
 
106
- def request(method, path, params={}, signature_params=params)
107
- request_setup = request_setup(method, path, params, signature_params)
108
- connection.send(method.to_sym, path, params, &request_setup).env
109
- rescue Faraday::Error::ClientError
110
- raise Twitter::Error::ClientError
111
- rescue MultiJson::DecodeError
112
- raise Twitter::Error::DecodeError
62
+ # @return [Boolean]
63
+ def user_token?
64
+ !!(access_token && access_token_secret)
113
65
  end
114
66
 
115
- # Returns a Faraday::Connection object
116
- #
117
- # @return [Faraday::Connection]
118
- def connection
119
- @connection ||= Faraday.new(@endpoint, @connection_options.merge(:builder => @middleware))
67
+ def user_agent
68
+ @user_agent ||= "Twitter Ruby Gem #{Twitter::Version}"
120
69
  end
121
70
 
122
- # Generates authentication header for a bearer token request
123
- #
124
- # @return [String]
125
- def bearer_token_credentials_auth_header
126
- basic_auth_token = encode_value("#{@consumer_key}:#{@consumer_secret}")
127
- "Basic #{basic_auth_token}"
71
+ # @return [Hash]
72
+ def credentials
73
+ {
74
+ :consumer_key => consumer_key,
75
+ :consumer_secret => consumer_secret,
76
+ :token => access_token,
77
+ :token_secret => access_token_secret,
78
+ }
128
79
  end
129
80
 
130
- def encode_value(value)
131
- [value].pack("m0").gsub("\n", '')
81
+ # @return [Boolean]
82
+ def credentials?
83
+ credentials.values.all?
132
84
  end
133
85
 
134
- def bearer_auth_header
135
- if @bearer_token.is_a?(Twitter::Token) && @bearer_token.token_type == "bearer"
136
- "Bearer #{@bearer_token.access_token}"
137
- else
138
- "Bearer #{@bearer_token}"
86
+ private
87
+
88
+ # Ensures that all credentials set during configuration are of a
89
+ # valid type. Valid types are String and Symbol.
90
+ #
91
+ # @raise [Twitter::Error::ConfigurationError] Error is raised when
92
+ # supplied twitter credentials are not a String or Symbol.
93
+ def validate_credential_type!
94
+ credentials.each do |credential, value|
95
+ next if value.nil?
96
+ raise(Error::ConfigurationError, "Invalid #{credential} specified: #{value.inspect} must be a string or symbol.") unless value.is_a?(String) || value.is_a?(Symbol)
139
97
  end
140
98
  end
141
99
 
142
- def oauth_auth_header(method, path, params={})
143
- uri = URI(@endpoint + path)
100
+ def oauth_auth_header(method, uri, params={})
101
+ uri = URI.parse(uri)
144
102
  SimpleOAuth::Header.new(method, uri, params, credentials)
145
103
  end
104
+
146
105
  end
147
106
  end