twitter 4.8.1 → 5.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 (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