<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>MIT-LICENSE</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -143,24 +143,20 @@ protected
 
 	# Twitter REST API Method: statuses friends
 	def friends(user=nil)
-		begin
-			self.twitagent.friends(user)
-		rescue =&gt; err
-			RAILS_DEFAULT_LOGGER.error &quot;Failed to get friends via OAuth for #{current_user.inspect}&quot;
-			flash[:error] = &quot;Twitter API failure (getting friends)&quot;
-			return
-		end	
+		self.twitagent.friends(user)
+	rescue =&gt; err
+		RAILS_DEFAULT_LOGGER.error &quot;Failed to get friends via OAuth for #{current_user.inspect}&quot;
+		flash[:error] = &quot;Twitter API failure (getting friends)&quot;
+		return
 	end
 
 	# Twitter REST API Method: statuses followers
 	def followers(user=nil)
-		begin
-			self.twitagent.followers(user)
-		rescue =&gt; err
-			RAILS_DEFAULT_LOGGER.error &quot;Failed to get followers via OAuth for #{current_user.inspect}&quot;
-			flash[:error] = &quot;Twitter API failure (getting followers)&quot;
-			return
-		end	
+		self.twitagent.followers(user)
+	rescue =&gt; err
+		RAILS_DEFAULT_LOGGER.error &quot;Failed to get followers via OAuth for #{current_user.inspect}&quot;
+		flash[:error] = &quot;Twitter API failure (getting followers)&quot;
+		return
 	end
 
 	# Twitter REST API Method: statuses mentions</diff>
      <filename>lib/oauth_system.rb</filename>
    </modified>
    <modified>
      <diff>@@ -7,10 +7,10 @@ task :demo_proxy_login =&gt; :environment do
 	twoauth = TwitterOauth.new(member.token, member.secret)
 
 	puts &quot;.. .. getting friends:&quot;
-	friends = twoauth.friends
-	friends.each do |friend|
-		puts &quot;.. .. .. #{friend['screen_name']}&quot;
-	end
+	twoauth.dump_friends
+	
+	puts &quot;.. .. getting followers:&quot;
+	twoauth.dump_followers
 	
 	puts &quot;demo_proxy_login: Done.&quot;
 end</diff>
      <filename>lib/tasks/test.rake</filename>
    </modified>
    <modified>
      <diff>@@ -92,85 +92,135 @@ class TwitterOauth
 		end
 	end	
 	
-	# Twitter REST API Method: statuses friends
+	# Twitter REST API Method: statuses friends (page-based implementation)
+	# Returns: friends array
 	def friends_by_page( user=nil, page = 1 )
-		begin
-			params = (
-				{ :screen_name =&gt; user, :page =&gt; page }.collect { |n| &quot;#{n[0]}=#{n[1]}&quot; if n[1] }
-			).compact.join('&amp;')
-			#params = &quot;?#{params}&quot; unless params.empty?
-			url = &quot;/statuses/friends.json?#{params}&quot;
-			response = access_token.get( url )
-			case response
-			when Net::HTTPSuccess
-				friends=JSON.parse(response.body)
-				raise TwitterOauth::UnexpectedResponse unless friends.is_a? Array
-				friends
-			else
-				raise TwitterOauth::APIError
-			end
-		rescue =&gt; err
-			puts &quot;Exception in friends_by_page: #{err}&quot;
-			raise err
+		warn &quot;[DEPRECATION] the page parameter ot the twitter API has been deprecated as of 26-Oct-2009. use 'friends_by_cursor' method instead.&quot;
+		params = (
+			{ :screen_name =&gt; user, :page =&gt; page }.collect { |n| &quot;#{n[0]}=#{n[1]}&quot; if n[1] }
+		).compact.join('&amp;')
+		url = &quot;/statuses/friends.json?#{params}&quot;
+		response = access_token.get( url )
+		case response
+		when Net::HTTPSuccess
+			friends=JSON.parse(response.body)
+			raise TwitterOauth::UnexpectedResponse unless friends.is_a? Array
+			friends
+		else
+			raise TwitterOauth::APIError
+		end
+	rescue =&gt; err
+		puts &quot;Exception in friends_by_page: #{err}&quot;
+		raise err
+	end
+	
+	# Twitter REST API Method: statuses friends (cursor-based implementation)
+	# Returns: friends hash
+	def friends_by_cursor( user=nil, cursor = -1 )
+		params = (
+			{ :screen_name =&gt; user, :cursor =&gt; cursor }.collect { |n| &quot;#{n[0]}=#{n[1]}&quot; if n[1] }
+		).compact.join('&amp;')
+		url = &quot;/statuses/friends.json?#{params}&quot;
+		response = access_token.get( url )
+		case response
+		when Net::HTTPSuccess
+			friends=JSON.parse(response.body)
+			raise TwitterOauth::UnexpectedResponse unless friends.is_a? Hash
+			friends
+		else
+			raise TwitterOauth::APIError
 		end
+	rescue =&gt; err
+		puts &quot;Exception in friends_by_cursor: #{err}&quot;
+		raise err
 	end
+
+	# Twitter REST API Method: statuses friends
+	# Returns: array of all friends for the given user
+	# Parameters:
+	# &lt;t&gt;user&lt;/t&gt; - screen_name of the user to retrieve friends for. if nil, returns friends for the current twitter-authenticated user
 	def friends(user=nil)
+		cursor = -1
+		page = 0
+		friends = []
 		begin
-			page = 1
-			friends = []
-			begin
-				friendspage = friends_by_page( user, page )
-				puts &quot;page #{page} - found #{friendspage.size} friends&quot;
-				friends += friendspage if friendspage
-				page += 1
-			end until friendspage.size == 0
+			friendspage = friends_by_cursor( user, cursor )
+			page += 1
+			puts &quot;page #{page}/cursor #{cursor} - found #{friendspage[&quot;users&quot;].size} friends. Next cursor: #{friendspage[&quot;next_cursor&quot;]}&quot;
+			friends += friendspage[&quot;users&quot;] if friendspage
+			cursor = friendspage[&quot;next_cursor&quot;]
+		end until cursor == 0
+		friends
+	rescue =&gt; err
+		puts &quot;Exception in friends: #{err}&quot;
+		raise err
+	end
+
+
+	# Twitter REST API Method: statuses followers (page-based implementation)
+	# Returns: followers array
+	def followers_by_page( user=nil, page = 1 )
+		warn &quot;[DEPRECATION] the page parameter ot the twitter API has been deprecated as of 26-Oct-2009. use 'followers_by_cursor' method instead.&quot;
+		params = (
+			{ :screen_name =&gt; user, :page =&gt; page }.collect { |n| &quot;#{n[0]}=#{n[1]}&quot; if n[1] }
+		).compact.join('&amp;')
+		url = &quot;/statuses/followers.json?#{params}&quot;
+		response = access_token.get( url )
+		case response
+		when Net::HTTPSuccess
+			friends=JSON.parse(response.body)
+			raise TwitterOauth::UnexpectedResponse unless friends.is_a? Array
 			friends
-		rescue =&gt; err
-			puts &quot;Exception in friends: #{err}&quot;
-			raise err
+		else
+			raise TwitterOauth::APIError
 		end
+	rescue =&gt; err
+		puts &quot;Exception in followers_by_page: #{err}&quot;
+		raise err
 	end
-
 	
-	# Twitter REST API Method: statuses followers
-	def followers_by_page( user=nil, page = 1 )
-		begin
-			params = (
-				{ :screen_name =&gt; user, :page =&gt; page }.collect { |n| &quot;#{n[0]}=#{n[1]}&quot; if n[1] }
-			).compact.join('&amp;')
-			#params = &quot;?#{params}&quot; unless params.empty?
-			url = &quot;/statuses/followers.json?#{params}&quot;
-			response = access_token.get( url )
-			case response
-			when Net::HTTPSuccess
-				friends=JSON.parse(response.body)
-				raise TwitterOauth::UnexpectedResponse unless friends.is_a? Array
-				friends
-			else
-				raise TwitterOauth::APIError
-			end
-		rescue =&gt; err
-			puts &quot;Exception in followers_by_page: #{err}&quot;
-			raise err
+	# Twitter REST API Method: statuses followers (cursor-based implementation)
+	# Returns: followers hash
+	def followers_by_cursor( user=nil, cursor = -1 )
+		params = (
+			{ :screen_name =&gt; user, :cursor =&gt; cursor }.collect { |n| &quot;#{n[0]}=#{n[1]}&quot; if n[1] }
+		).compact.join('&amp;')
+		url = &quot;/statuses/followers.json?#{params}&quot;
+		response = access_token.get( url )
+		case response
+		when Net::HTTPSuccess
+			friends=JSON.parse(response.body)
+			raise TwitterOauth::UnexpectedResponse unless friends.is_a? Hash
+			friends
+		else
+			raise TwitterOauth::APIError
 		end
+	rescue =&gt; err
+		puts &quot;Exception in followers_by_cursor: #{err}&quot;
+		raise err
 	end
+
+	# Twitter REST API Method: statuses friends
+	# Returns: array of all friends for the given user
+	# Parameters:
+	# &lt;t&gt;user&lt;/t&gt; - screen_name of the user to retrieve friends for. if nil, returns friends for the current twitter-authenticated user
 	def followers(user=nil)
+		cursor = -1
+		page = 0
+		followers = []
 		begin
-			page = 1
-			followers = []
-			begin
-				followerspage = followers_by_page( user, page )
-				puts &quot;page #{page} - found #{followerspage.size} followers&quot;
-				followers += followerspage if followerspage
-				page += 1
-			end until followerspage.size == 0
-			followers
-		rescue =&gt; err
-			puts &quot;Exception in followers: #{err}&quot;
-			raise err
-		end
+			followerspage = followers_by_cursor( user, cursor )
+			page += 1
+			puts &quot;page #{page}/cursor #{cursor} - found #{followerspage[&quot;users&quot;].size} followers. Next cursor: #{followerspage[&quot;next_cursor&quot;]}&quot;
+			followers += followerspage[&quot;users&quot;] if followerspage[&quot;users&quot;]
+			cursor = followerspage[&quot;next_cursor&quot;]
+		end until cursor == 0
+		followers
+	rescue =&gt; err
+		puts &quot;Exception in followers: #{err}&quot;
+		raise err
 	end
-	
+
 	# Twitter REST API Method: friendships exists
 	# Will return true if user_a follows user_b, otherwise will return false.
 	def friendship_exists?(user_a, user_b)</diff>
      <filename>lib/twitter_oauth.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>aae605e2c8c02a6e37d1f757d222244310c3036e</id>
    </parent>
  </parents>
  <author>
    <name>tardate</name>
    <email>gallagher.paul@gmail.com</email>
  </author>
  <url>http://github.com/tardate/rails-twitter-oauth-sample/commit/40419d2778c24f15d14ce54a1948c4e2ee2fb8cb</url>
  <id>40419d2778c24f15d14ce54a1948c4e2ee2fb8cb</id>
  <committed-date>2009-10-30T20:51:05-07:00</committed-date>
  <authored-date>2009-10-30T20:51:05-07:00</authored-date>
  <message>swithced to new cursor API for friends/followers social graph methods; github issue #1</message>
  <tree>47f41fe7f2efa77222e39fd907034cd8d7a03e72</tree>
  <committer>
    <name>tardate</name>
    <email>gallagher.paul@gmail.com</email>
  </committer>
</commit>
