friend_collection 0.1.0
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.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +1 -0
- data/README.rdoc +3 -0
- data/Rakefile +52 -0
- data/VERSION +1 -0
- data/examples/config_store.rb +38 -0
- data/examples/connect.rb +37 -0
- data/examples/friends.rb +11 -0
- data/friend_collection.gemspec +60 -0
- data/lib/friend_collection.rb +58 -0
- data/test/helper.rb +11 -0
- data/test/test_friend_collection.rb +81 -0
- metadata +90 -0
data/.document
ADDED
data/.gitignore
ADDED
data/LICENSE
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
USE THIS CODE HOWEVER YOU WANT
|
data/README.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'jeweler'
|
6
|
+
Jeweler::Tasks.new do |gem|
|
7
|
+
gem.name = "friend_collection"
|
8
|
+
gem.summary = %Q{A way to pull all of a given users friends/followers}
|
9
|
+
gem.description = %Q{A way to pull all of a given users friends/followers}
|
10
|
+
gem.email = "matt.swasey@gmail.com"
|
11
|
+
gem.homepage = "http://github.com/mig/friend_collection"
|
12
|
+
gem.authors = ["Matt Swasey"]
|
13
|
+
gem.add_development_dependency "shoulda", ">= 0"
|
14
|
+
end
|
15
|
+
Jeweler::GemcutterTasks.new
|
16
|
+
rescue LoadError
|
17
|
+
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
18
|
+
end
|
19
|
+
|
20
|
+
require 'rake/testtask'
|
21
|
+
Rake::TestTask.new(:test) do |test|
|
22
|
+
test.libs << 'lib' << 'test'
|
23
|
+
test.pattern = 'test/**/test_*.rb'
|
24
|
+
test.verbose = true
|
25
|
+
end
|
26
|
+
|
27
|
+
begin
|
28
|
+
require 'rcov/rcovtask'
|
29
|
+
Rcov::RcovTask.new do |test|
|
30
|
+
test.libs << 'test'
|
31
|
+
test.pattern = 'test/**/test_*.rb'
|
32
|
+
test.verbose = true
|
33
|
+
end
|
34
|
+
rescue LoadError
|
35
|
+
task :rcov do
|
36
|
+
abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
task :test => :check_dependencies
|
41
|
+
|
42
|
+
task :default => :test
|
43
|
+
|
44
|
+
require 'rake/rdoctask'
|
45
|
+
Rake::RDocTask.new do |rdoc|
|
46
|
+
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
47
|
+
|
48
|
+
rdoc.rdoc_dir = 'rdoc'
|
49
|
+
rdoc.title = "friend_collection #{version}"
|
50
|
+
rdoc.rdoc_files.include('README*')
|
51
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
52
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.1.0
|
@@ -0,0 +1,38 @@
|
|
1
|
+
class ConfigStore
|
2
|
+
attr_reader :file
|
3
|
+
|
4
|
+
def initialize(file)
|
5
|
+
@file = file
|
6
|
+
end
|
7
|
+
|
8
|
+
def load
|
9
|
+
@config ||= YAML::load(open(file))
|
10
|
+
self
|
11
|
+
end
|
12
|
+
|
13
|
+
def [](key)
|
14
|
+
load
|
15
|
+
@config[key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def []=(key, value)
|
19
|
+
@config[key] = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def delete(*keys)
|
23
|
+
keys.each { |key| @config.delete(key) }
|
24
|
+
save
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
def update(c={})
|
29
|
+
@config.merge!(c)
|
30
|
+
save
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
def save
|
35
|
+
File.open(file, 'w') { |f| f.write(YAML.dump(@config)) }
|
36
|
+
self
|
37
|
+
end
|
38
|
+
end
|
data/examples/connect.rb
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/config_store'
|
2
|
+
|
3
|
+
class Connect
|
4
|
+
attr_reader :client
|
5
|
+
|
6
|
+
def self.go!
|
7
|
+
new.client
|
8
|
+
end
|
9
|
+
|
10
|
+
def initialize
|
11
|
+
config = ConfigStore.new("#{ENV['HOME']}/.twitter")
|
12
|
+
oauth = Twitter::OAuth.new(config['token'], config['secret'])
|
13
|
+
|
14
|
+
if config['atoken'] && config['asecret']
|
15
|
+
oauth.authorize_from_access(config['atoken'], config['asecret'])
|
16
|
+
@client = Twitter::Base.new(oauth)
|
17
|
+
|
18
|
+
elsif config['rtoken'] && config['rsecret']
|
19
|
+
oauth.authorize_from_request(config['rtoken'], config['rsecret'], config['pin'])
|
20
|
+
@client = Twitter::Base.new(oauth)
|
21
|
+
|
22
|
+
config.update({
|
23
|
+
'atoken' => oauth.access_token.token,
|
24
|
+
'asecret' => oauth.access_token.secret,
|
25
|
+
}).delete('rtoken', 'rsecret')
|
26
|
+
else
|
27
|
+
config.update({
|
28
|
+
'rtoken' => oauth.request_token.token,
|
29
|
+
'rsecret' => oauth.request_token.secret,
|
30
|
+
})
|
31
|
+
|
32
|
+
# authorize in browser
|
33
|
+
%x(open #{oauth.request_token.authorize_url})
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
data/examples/friends.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'twitter'
|
3
|
+
|
4
|
+
require 'connect'
|
5
|
+
require File.dirname(__FILE__) + '/../lib/friend_collection'
|
6
|
+
|
7
|
+
client = Connect.go!
|
8
|
+
fc = Twitter::FriendCollection.new(client)
|
9
|
+
fc.fetch_all
|
10
|
+
puts fc.collection
|
11
|
+
puts fc.collection.length
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{friend_collection}
|
8
|
+
s.version = "0.1.0"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Matt Swasey"]
|
12
|
+
s.date = %q{2010-03-17}
|
13
|
+
s.description = %q{A way to pull all of a given users friends/followers}
|
14
|
+
s.email = %q{matt.swasey@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"LICENSE",
|
17
|
+
"README.rdoc"
|
18
|
+
]
|
19
|
+
s.files = [
|
20
|
+
".document",
|
21
|
+
".gitignore",
|
22
|
+
"LICENSE",
|
23
|
+
"README.rdoc",
|
24
|
+
"Rakefile",
|
25
|
+
"VERSION",
|
26
|
+
"examples/config_store.rb",
|
27
|
+
"examples/connect.rb",
|
28
|
+
"examples/friends.rb",
|
29
|
+
"friend_collection.gemspec",
|
30
|
+
"lib/friend_collection.rb",
|
31
|
+
"test/helper.rb",
|
32
|
+
"test/test_friend_collection.rb"
|
33
|
+
]
|
34
|
+
s.homepage = %q{http://github.com/mig/friend_collection}
|
35
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
36
|
+
s.require_paths = ["lib"]
|
37
|
+
s.rubygems_version = %q{1.3.6}
|
38
|
+
s.summary = %q{A way to pull all of a given users friends/followers}
|
39
|
+
s.test_files = [
|
40
|
+
"test/helper.rb",
|
41
|
+
"test/test_friend_collection.rb",
|
42
|
+
"examples/config_store.rb",
|
43
|
+
"examples/connect.rb",
|
44
|
+
"examples/friends.rb"
|
45
|
+
]
|
46
|
+
|
47
|
+
if s.respond_to? :specification_version then
|
48
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
49
|
+
s.specification_version = 3
|
50
|
+
|
51
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
52
|
+
s.add_development_dependency(%q<shoulda>, [">= 0"])
|
53
|
+
else
|
54
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
55
|
+
end
|
56
|
+
else
|
57
|
+
s.add_dependency(%q<shoulda>, [">= 0"])
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
|
3
|
+
module Twitter
|
4
|
+
class FriendCollection
|
5
|
+
extend Forwardable
|
6
|
+
|
7
|
+
attr_accessor :client,
|
8
|
+
:relationship_type,
|
9
|
+
:page,
|
10
|
+
:collection,
|
11
|
+
:limit
|
12
|
+
|
13
|
+
def_delegators :client, :friends, :followers
|
14
|
+
|
15
|
+
def initialize(client, relationship_type = :friends, limit = 500)
|
16
|
+
@client = client
|
17
|
+
@relationship_type = relationship_type.to_sym
|
18
|
+
@collection = []
|
19
|
+
@limit = limit
|
20
|
+
end
|
21
|
+
|
22
|
+
def first_cursor
|
23
|
+
-1
|
24
|
+
end
|
25
|
+
|
26
|
+
def next_cursor
|
27
|
+
page['next_cursor']
|
28
|
+
end
|
29
|
+
|
30
|
+
def first_or_next_cursor
|
31
|
+
if page.nil?
|
32
|
+
first_cursor
|
33
|
+
else
|
34
|
+
next_cursor
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def no_more_cursors
|
39
|
+
first_or_next_cursor == 0
|
40
|
+
end
|
41
|
+
|
42
|
+
def over_limit?
|
43
|
+
collection.length >= limit
|
44
|
+
end
|
45
|
+
|
46
|
+
def fetch
|
47
|
+
self.page = send(relationship_type, {:cursor => first_or_next_cursor})
|
48
|
+
end
|
49
|
+
|
50
|
+
def fetch_all
|
51
|
+
until no_more_cursors || over_limit?
|
52
|
+
fetch
|
53
|
+
collection << page['users']
|
54
|
+
end
|
55
|
+
collection.flatten!
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'test/unit'
|
3
|
+
require 'shoulda'
|
4
|
+
require 'mocha'
|
5
|
+
|
6
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
7
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
8
|
+
require 'friend_collection'
|
9
|
+
|
10
|
+
class Test::Unit::TestCase
|
11
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require 'helper'
|
2
|
+
|
3
|
+
class TestFriendCollection < Test::Unit::TestCase
|
4
|
+
context "an instance of FriendCollection" do
|
5
|
+
setup do
|
6
|
+
@client = stub('client')
|
7
|
+
@friend_collection = Twitter::FriendCollection.new(@client)
|
8
|
+
end
|
9
|
+
|
10
|
+
should "call friends on client for fetch when friends is relationship type" do
|
11
|
+
@client.expects(:friends)
|
12
|
+
@friend_collection.stubs(:relationship_type).returns(:friends)
|
13
|
+
@friend_collection.fetch
|
14
|
+
end
|
15
|
+
|
16
|
+
should "call followers on client for fetch when followers is relationship type" do
|
17
|
+
@client.expects(:followers)
|
18
|
+
@friend_collection.stubs(:relationship_type).returns(:followers)
|
19
|
+
@friend_collection.fetch
|
20
|
+
end
|
21
|
+
|
22
|
+
should "set page to be result of relationship_type called on client" do
|
23
|
+
@client.expects(:friends).returns('result')
|
24
|
+
@friend_collection.fetch
|
25
|
+
assert_equal 'result', @friend_collection.page
|
26
|
+
end
|
27
|
+
|
28
|
+
should "use first_or_next_cursor value when calling relation_type on client" do
|
29
|
+
@client.expects(:friends).with(:cursor => "12345")
|
30
|
+
@friend_collection.stubs(:first_or_next_cursor).returns("12345")
|
31
|
+
@friend_collection.fetch
|
32
|
+
end
|
33
|
+
|
34
|
+
should "use -1 as the first cursor" do
|
35
|
+
assert_equal -1, @friend_collection.first_cursor
|
36
|
+
end
|
37
|
+
|
38
|
+
should "use value in page as next cursor" do
|
39
|
+
@friend_collection.expects(:page).returns('next_cursor' => '1234')
|
40
|
+
assert_equal '1234', @friend_collection.next_cursor
|
41
|
+
end
|
42
|
+
|
43
|
+
should "set initial cursor to -1" do
|
44
|
+
assert_equal -1, @friend_collection.first_or_next_cursor
|
45
|
+
end
|
46
|
+
|
47
|
+
should "set next cursor to next_cursor value in page" do
|
48
|
+
@friend_collection.page = {'next_cursor' => '12345'}
|
49
|
+
assert_equal "12345", @friend_collection.first_or_next_cursor
|
50
|
+
end
|
51
|
+
|
52
|
+
should "determine if there are no more cursors by next_cursor" do
|
53
|
+
@friend_collection.expects(:first_or_next_cursor).returns(1)
|
54
|
+
assert_equal false, @friend_collection.no_more_cursors
|
55
|
+
end
|
56
|
+
|
57
|
+
should "determine if we are over friend limits" do
|
58
|
+
@friend_collection.limit = 2
|
59
|
+
|
60
|
+
@friend_collection.collection << "1"
|
61
|
+
assert_equal false, @friend_collection.over_limit?
|
62
|
+
|
63
|
+
@friend_collection.collection << "2"
|
64
|
+
assert_equal true, @friend_collection.over_limit?
|
65
|
+
end
|
66
|
+
|
67
|
+
should "fetch pages of results till there are no more cursors" do
|
68
|
+
@friend_collection.expects(:no_more_cursors).times(3).returns(false, false, true)
|
69
|
+
@friend_collection.expects(:first_or_next_cursor).times(2).returns(-1, 12345)
|
70
|
+
@client.expects(:friends).with({:cursor => -1}).returns('users' => ['friends'])
|
71
|
+
@client.expects(:friends).with({:cursor => 12345}).returns('users' => [])
|
72
|
+
@friend_collection.fetch_all
|
73
|
+
end
|
74
|
+
|
75
|
+
should "fetch page of results till over limit" do
|
76
|
+
@friend_collection.limit = 1
|
77
|
+
@client.expects(:friends).returns({'users' => ['1']}, {'users' => []})
|
78
|
+
@friend_collection.fetch_all
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
metadata
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: friend_collection
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 0.1.0
|
10
|
+
platform: ruby
|
11
|
+
authors:
|
12
|
+
- Matt Swasey
|
13
|
+
autorequire:
|
14
|
+
bindir: bin
|
15
|
+
cert_chain: []
|
16
|
+
|
17
|
+
date: 2010-03-17 00:00:00 -04:00
|
18
|
+
default_executable:
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
name: shoulda
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
type: :development
|
31
|
+
version_requirements: *id001
|
32
|
+
description: A way to pull all of a given users friends/followers
|
33
|
+
email: matt.swasey@gmail.com
|
34
|
+
executables: []
|
35
|
+
|
36
|
+
extensions: []
|
37
|
+
|
38
|
+
extra_rdoc_files:
|
39
|
+
- LICENSE
|
40
|
+
- README.rdoc
|
41
|
+
files:
|
42
|
+
- .document
|
43
|
+
- .gitignore
|
44
|
+
- LICENSE
|
45
|
+
- README.rdoc
|
46
|
+
- Rakefile
|
47
|
+
- VERSION
|
48
|
+
- examples/config_store.rb
|
49
|
+
- examples/connect.rb
|
50
|
+
- examples/friends.rb
|
51
|
+
- friend_collection.gemspec
|
52
|
+
- lib/friend_collection.rb
|
53
|
+
- test/helper.rb
|
54
|
+
- test/test_friend_collection.rb
|
55
|
+
has_rdoc: true
|
56
|
+
homepage: http://github.com/mig/friend_collection
|
57
|
+
licenses: []
|
58
|
+
|
59
|
+
post_install_message:
|
60
|
+
rdoc_options:
|
61
|
+
- --charset=UTF-8
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
segments:
|
69
|
+
- 0
|
70
|
+
version: "0"
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
requirements: []
|
79
|
+
|
80
|
+
rubyforge_project:
|
81
|
+
rubygems_version: 1.3.6
|
82
|
+
signing_key:
|
83
|
+
specification_version: 3
|
84
|
+
summary: A way to pull all of a given users friends/followers
|
85
|
+
test_files:
|
86
|
+
- test/helper.rb
|
87
|
+
- test/test_friend_collection.rb
|
88
|
+
- examples/config_store.rb
|
89
|
+
- examples/connect.rb
|
90
|
+
- examples/friends.rb
|