twitter-lists 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/.gitignore ADDED
@@ -0,0 +1,22 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+
21
+ ## PROJECT::SPECIFIC
22
+ ivey-integration.rb
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Michael D. Ivey
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,42 @@
1
+ = twitter-lists
2
+
3
+ A library and command-line tool for working with Twitter lists.
4
+
5
+ * Set-based operations on lists, so you can, for instance,
6
+ make a list that is the union of two other lists.
7
+ * Command-line tool (twls) to manage list memberships
8
+ * Currently uses jnunemaker's twitter gem, but planned support
9
+ for twitter-auth as well.
10
+
11
+ NOTE: currently requires a patch to the twitter gem to get more
12
+ than 20 members
13
+
14
+ == Usage
15
+
16
+ * Standalone:
17
+ Twitter::List.setup_basic_auth "username", "password"
18
+
19
+ * Integration with an existing app using the Twitter gem
20
+ my_twitter_client = .... # Some method to access a configured Twitter::Base
21
+ Twitter::List.twitter_base = my_twitter_client
22
+
23
+ list = Twitter::List.parse "@ivey/hah"
24
+ list.load_members
25
+ list.members
26
+
27
+ Twitter::List.union "@ivey/hah", "@Favstar/rising-stars"
28
+
29
+ == Note on Patches/Pull Requests
30
+
31
+ * Fork the project.
32
+ * Make your feature addition or bug fix.
33
+ * Add tests for it. This is important so I don't break it in a
34
+ future version unintentionally.
35
+ * Commit, do not mess with rakefile, version, or history.
36
+ (if you want to have your own version, that is fine but bump
37
+ version in a commit by itself I can ignore when I pull)
38
+ * Send me a pull request. Bonus points for topic branches.
39
+
40
+ == Copyright
41
+
42
+ Copyright (c) 2009 Michael D. Ivey. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,57 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "twitter-lists"
8
+ gem.summary = %Q{A library and command-line tool for working with Twitter lists.}
9
+ gem.description = %Q{A library and command-line tool for working with Twitter lists}
10
+ gem.email = "ivey@gweezlebur.com"
11
+ gem.homepage = "http://github.com/ivey/twitter-lists"
12
+ gem.authors = ["Michael D. Ivey"]
13
+ gem.add_development_dependency "thoughtbot-shoulda", ">= 0"
14
+ gem.add_development_dependency "jnunemaker-matchy", ">= 0"
15
+ gem.add_development_dependency "jeremymcanally-context", ">= 0"
16
+ gem.add_development_dependency "jeremymcanally-stump", ">= 0"
17
+ gem.add_development_dependency "fakeweb", ">= 0"
18
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
19
+ end
20
+ Jeweler::GemcutterTasks.new
21
+ rescue LoadError
22
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
23
+ end
24
+
25
+ require 'rake/testtask'
26
+ Rake::TestTask.new(:test) do |test|
27
+ test.libs << 'lib' << 'test'
28
+ test.pattern = 'test/**/test_*.rb'
29
+ test.verbose = true
30
+ end
31
+
32
+ begin
33
+ require 'rcov/rcovtask'
34
+ Rcov::RcovTask.new do |test|
35
+ test.libs << 'test'
36
+ test.pattern = 'test/**/test_*.rb'
37
+ test.verbose = true
38
+ end
39
+ rescue LoadError
40
+ task :rcov do
41
+ abort "RCov is not available. In order to run rcov, you must: sudo gem install spicycode-rcov"
42
+ end
43
+ end
44
+
45
+ task :test => :check_dependencies
46
+
47
+ task :default => :test
48
+
49
+ require 'rake/rdoctask'
50
+ Rake::RDocTask.new do |rdoc|
51
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
52
+
53
+ rdoc.rdoc_dir = 'rdoc'
54
+ rdoc.title = "twitter-lists #{version}"
55
+ rdoc.rdoc_files.include('README*')
56
+ rdoc.rdoc_files.include('lib/**/*.rb')
57
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,71 @@
1
+ require 'set'
2
+ module Twitter
3
+ class List
4
+
5
+ attr_accessor :id, :name, :user, :description, :members
6
+
7
+ class << self
8
+ def twitter_base
9
+ @twitter_base
10
+ end
11
+
12
+ def twitter_base=(base)
13
+ @twitter_base=base
14
+ end
15
+
16
+ def setup_basic_auth(username, password)
17
+ self.twitter_base = Twitter::Base.new(Twitter::HTTPAuth.new(username, password))
18
+ end
19
+
20
+ def parse(str)
21
+ n= new
22
+ n.user, n.name = str.sub(/^@/,'').split('/')
23
+ n
24
+ end
25
+
26
+ def union(*lists)
27
+ lists = lists.collect { |l| l.is_a?(List) ? l : parse(l) }
28
+ sets = lists.collect { |l| Set.new l.members }
29
+ sets.inject { |u,s| s.union u }.to_a
30
+ end
31
+
32
+ def intersection(*lists)
33
+ lists = lists.collect { |l| l.is_a?(List) ? l : parse(l) }
34
+ sets = lists.collect { |l| Set.new l.members }
35
+ sets.inject { |i,s| s.intersection i }.to_a
36
+ end
37
+ end
38
+
39
+ def twitter_base
40
+ self.class.twitter_base
41
+ end
42
+
43
+ def load_members
44
+ self.members = load_members_paged.collect { |x| [x.id, x.screen_name] }
45
+ end
46
+
47
+ def member_names
48
+ members.collect { |x| username(x) }
49
+ end
50
+
51
+ def member_ids
52
+ members.collect { |x| userid(x) }
53
+ end
54
+
55
+ def load_members_paged(acc=[],cursor=-1)
56
+ response = twitter_base.list_members(user,name,cursor)
57
+ acc += response.users
58
+ response.next_cursor == 0 ? acc : load_members_paged(acc,response.next_cursor)
59
+ end
60
+
61
+ protected
62
+ def username(l)
63
+ l[1]
64
+ end
65
+
66
+ def userid(l)
67
+ l[0]
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,2 @@
1
+ require 'twitter'
2
+ require 'twitter-lists/list'
@@ -0,0 +1,23 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Mon, 30 Nov 2009 19:18:13 GMT
3
+ Server: hi
4
+ X-RateLimit-Limit: 150
5
+ X-Transaction: 1259608693-7574-22655
6
+ Status: 200 OK
7
+ ETag: "d4e12c5655b231fa23a211bfee963e26"
8
+ Last-Modified: Mon, 30 Nov 2009 19:18:13 GMT
9
+ X-RateLimit-Remaining: 118
10
+ X-Runtime: 0.04018
11
+ Content-Type: application/json; charset=utf-8
12
+ Pragma: no-cache
13
+ Content-Length: 1370
14
+ Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
15
+ Expires: Tue, 31 Mar 1981 05:00:00 GMT
16
+ X-Revision: DEV
17
+ X-RateLimit-Reset: 1259610494
18
+ Set-Cookie: lang=en; path=/
19
+ Set-Cookie: _twitter_sess=BAh7CjoTcGFzc3dvcmRfdG9rZW4iLTBlYzYwODE5MmU1Y2M4NmU1MDhjYzE0%250AOWE0Y2MzODFhMGZmYzI4NjI6EXRyYW5zX3Byb21wdDA6CXVzZXJpAtcqOgdp%250AZCIlM2U0ZGRhMGEyYjE0MDllMzFiMmVjZWUxZmE0MGJiNTEiCmZsYXNoSUM6%250AJ0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhhc2h7AAY6CkB1c2Vk%250AewA%253D--f464f0ad20d50938d8e77b12b26c182de3a29793; domain=.twitter.com; path=/
20
+ Vary: Accept-Encoding
21
+ Connection: close
22
+
23
+ {"users":[{"verified":false,"profile_sidebar_fill_color":"F3F3F3","description":"Style tips for proper writing. contact: fakeapstylebook at gmail dot com. No submissions, please.","screen_name":"FakeAPStylebook","followers_count":66732,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://www.hootsuite.com\" rel=\"nofollow\">HootSuite</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 19:01:28 +0000 2009","id":6209864396,"text":"Do not use the term \"press conference.\" Call the event a \"news conference,\" a \"sham\" or \"slopping the hogs.\""},"following":true,"time_zone":"Central Time (US & Canada)","profile_sidebar_border_color":"DFDFDF","friends_count":20,"notifications":false,"favourites_count":0,"profile_text_color":"333333","url":null,"profile_background_image_url":"http://a1.twimg.com/profile_background_images/47626304/fakeapbg__1_.gif","statuses_count":510,"profile_link_color":"990000","protected":false,"profile_background_tile":false,"created_at":"Tue Oct 20 17:06:49 +0000 2009","location":"","name":"Fake AP Stylebook","geo_enabled":false,"profile_background_color":"EBEBEB","profile_image_url":"http://a1.twimg.com/profile_images/486242668/ap-interro_normal.jpg","id":83883736,"utc_offset":-21600}], "next_cursor":0, "previous_cursor":-1317534510543023567 }
@@ -0,0 +1,23 @@
1
+ HTTP/1.1 200 OK
2
+ Date: Mon, 30 Nov 2009 18:06:40 GMT
3
+ Server: hi
4
+ X-RateLimit-Limit: 150
5
+ X-Transaction: 1259604400-88756-3956
6
+ Status: 200 OK
7
+ ETag: "7c1be64d3bc8781e1a6e7ec85cc76bb4"
8
+ Last-Modified: Mon, 30 Nov 2009 18:06:40 GMT
9
+ X-RateLimit-Remaining: 128
10
+ X-Runtime: 1.05233
11
+ Content-Type: application/json; charset=utf-8
12
+ Pragma: no-cache
13
+ Content-Length: 24918
14
+ Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
15
+ Expires: Tue, 31 Mar 1981 05:00:00 GMT
16
+ X-Revision: DEV
17
+ X-RateLimit-Reset: 1259606894
18
+ Set-Cookie: lang=en; path=/
19
+ Set-Cookie: _twitter_sess=BAh7CjoTcGFzc3dvcmRfdG9rZW4iLTBlYzYwODE5MmU1Y2M4NmU1MDhjYzE0%250AOWE0Y2MzODFhMGZmYzI4NjI6EXRyYW5zX3Byb21wdDA6CXVzZXJpAtcqOgdp%250AZCIlYTM2YWZkODU3ODE2ZDliMWIyZDNhYTk0YjVkNmNmNGUiCmZsYXNoSUM6%250AJ0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhhc2h7AAY6CkB1c2Vk%250AewA%253D--df4028b2b29cf6aeedcbb98f8090e6e0abe5137f; domain=.twitter.com; path=/
20
+ Vary: Accept-Encoding
21
+ Connection: close
22
+
23
+ {"users":[{"profile_sidebar_fill_color":"37a147","description":"Just a shotgun and a rocking chair between me and the hoosgow.","screen_name":"angryoldcoot","friends_count":181,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://ubertwitter.com\" rel=\"nofollow\">UberTwitter</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 14:33:54 +0000 2009","id":6202705319,"text":"Instead of my office, I'm going to an offsite training. It's like a vacay halfway house! I hope my ankle bracelet's red to go with my eyes."},"following":false,"statuses_count":564,"time_zone":"Central Time (US & Canada)","profile_sidebar_border_color":"9e132a","notifications":false,"favourites_count":3956,"geo_enabled":false,"profile_text_color":"333333","url":"http://favstar.fm/users/angryoldcoot/recent","profile_background_image_url":"http://a1.twimg.com/profile_background_images/50065810/tf2_alpine_concept.jpg","verified":false,"profile_link_color":"bd171f","protected":false,"profile_background_tile":true,"created_at":"Mon Aug 31 18:10:52 +0000 2009","location":"","name":"Angry Old Coot","profile_background_color":"084dd6","profile_image_url":"http://a1.twimg.com/profile_images/503867858/funny_face_old_man34_normal.jpg","id":70458837,"utc_offset":-21600,"followers_count":389},{"profile_sidebar_fill_color":"ecfada","description":"Used to give out welcome messages, but not since I SOLD OUT. averyedison[at]gmail[dot]com","screen_name":"aedison","followers_count":5232,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://birdhouseapp.com\" rel=\"nofollow\">Birdhouse</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 16:59:16 +0000 2009","id":6206627271,"text":"Going down to the tattoo parlor. Don't need any more ink, but they just create such a warm and not-at-all-terrifying atmosphere, you know?"},"following":null,"statuses_count":1507,"time_zone":"Eastern Time (US & Canada)","profile_sidebar_border_color":"ffffff","friends_count":231,"notifications":null,"favourites_count":12127,"profile_text_color":"051a01","url":"http://www.averyedison.com","profile_background_image_url":"http://a1.twimg.com/profile_background_images/56001290/background.jpg","geo_enabled":false,"profile_link_color":"1a8005","protected":false,"profile_background_tile":true,"created_at":"Mon Mar 19 04:26:41 +0000 2007","location":"Wareham, Dorset, UK","name":"Avery Edison","verified":false,"profile_background_color":"043301","profile_image_url":"http://a3.twimg.com/profile_images/543838825/DSC01581_normal.JPG","id":1471021,"utc_offset":-18000},{"profile_sidebar_fill_color":"afcade","description":"I'm a copywriter for a major greeting card company. I get bored and create cards I know we'll never print. These are those cards. ","screen_name":"RejectedCards","notifications":false,"favourites_count":0,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://www.hootsuite.com\" rel=\"nofollow\">HootSuite</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 16:17:49 +0000 2009","id":6205507693,"text":"Happy Holidays, Mom. I admire how you've never tried to live up to anyone else's expectations but your own. Including your Holiday cooking"},"following":false,"time_zone":"Central Time (US & Canada)","profile_sidebar_border_color":"a8c7f7","statuses_count":52,"geo_enabled":false,"profile_text_color":"333333","url":"http://www.facebook.com/RejectedGreetingCards","profile_background_image_url":"http://a1.twimg.com/profile_background_images/50175700/IMG_0657.JPG","verified":false,"profile_link_color":"0084B4","protected":false,"profile_background_tile":true,"created_at":"Sun Nov 01 18:26:06 +0000 2009","followers_count":2886,"location":"USA","name":"Rejected Cards","profile_background_color":"022330","profile_image_url":"http://a3.twimg.com/profile_images/502966305/photo_3__normal.jpg","id":86772969,"utc_offset":-21600,"friends_count":3082},{"profile_sidebar_fill_color":"fae17d","followers_count":2841,"description":"awesome at alliterations.","screen_name":"baileygenine","status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://birdhouseapp.com\" rel=\"nofollow\">Birdhouse</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 16:31:58 +0000 2009","id":6205893144,"text":"Christmas tree shopping is so arbortrary."},"following":false,"time_zone":"Pacific Time (US & Canada)","friends_count":228,"profile_sidebar_border_color":"181A1E","geo_enabled":false,"notifications":false,"profile_text_color":"610e10","url":"http://baileygenine.tumblr.com","verified":false,"statuses_count":2013,"profile_background_image_url":"http://a3.twimg.com/profile_background_images/24946329/WaynePaint.jpg","profile_link_color":"851603","protected":false,"profile_background_tile":true,"created_at":"Thu Dec 04 09:34:06 +0000 2008","location":"San Francisco, CA","name":"Bailey","profile_background_color":"1a1300","profile_image_url":"http://a1.twimg.com/profile_images/550770890/bg_normal.png","id":17864230,"utc_offset":-28800,"favourites_count":22705},{"profile_sidebar_fill_color":"DAECF4","description":"The Official Michael Ian Black Twitter Page","screen_name":"michaelianblack","notifications":false,"favourites_count":1,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"web","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 03:55:15 +0000 2009","id":6191060690,"text":"Just watched \"Bride Wars\" with my wife. Time to start cutting myself so I know I can feel again."},"following":false,"time_zone":"Eastern Time (US & Canada)","profile_sidebar_border_color":"C6E2EE","statuses_count":1740,"geo_enabled":false,"profile_text_color":"663B12","url":"http://michaelianblack.net","profile_background_image_url":"http://a1.twimg.com/profile_background_images/28544372/15rUYi.jpg","verified":true,"profile_link_color":"1F98C7","protected":false,"profile_background_tile":false,"created_at":"Mon Feb 16 22:15:15 +0000 2009","followers_count":1436034,"location":"Land of Go For It! ","name":"Michael Ian Black","profile_background_color":"C6E2EE","profile_image_url":"http://a3.twimg.com/profile_images/434712703/Photo_194_normal.jpg","id":21035409,"utc_offset":-18000,"friends_count":88},{"profile_sidebar_fill_color":"F3F3F3","description":"Cockblocking beats","screen_name":"fireland","followers_count":25575,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"web","favorited":false,"in_reply_to_screen_name":null,"created_at":"Thu Nov 19 20:59:11 +0000 2009","id":5868588181,"text":"I'm already 350 pounds, sleeping in my car, and doing a lot of speed. Do I really need to get some kind of special license to be a trucker?"},"following":false,"statuses_count":590,"time_zone":"Mountain Time (US & Canada)","profile_sidebar_border_color":"DFDFDF","friends_count":140,"notifications":false,"favourites_count":546,"profile_text_color":"333333","url":"http://www.fireland.com/","profile_background_image_url":"http://a1.twimg.com/profile_background_images/4036666/plaid.gif","geo_enabled":false,"profile_link_color":"990000","protected":false,"profile_background_tile":true,"created_at":"Mon Jan 15 21:55:37 +0000 2007","location":"Denver","name":"Joshua Allen","verified":false,"profile_background_color":"EBEBEB","profile_image_url":"http://a3.twimg.com/profile_images/367883407/farm_normal.jpg","id":639643,"utc_offset":-25200},{"verified":false,"geo_enabled":false,"profile_sidebar_fill_color":"047ca4","description":"reformed optimist","screen_name":"hoosiergirl","notifications":null,"statuses_count":1442,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"web","favorited":false,"in_reply_to_screen_name":null,"created_at":"Sat Nov 28 21:18:11 +0000 2009","id":6151129062,"text":"Time to lay off the leftovers. I've been lying down dozing & feeling the babies kick til I came to & realized they were born 2 weeks ago."},"following":null,"time_zone":"Central Time (US & Canada)","friends_count":164,"profile_sidebar_border_color":"076188","profile_text_color":"1e0557","url":null,"profile_background_image_url":"http://a1.twimg.com/profile_background_images/3875264/lights.jpg","followers_count":2229,"profile_link_color":"1a2428","protected":false,"profile_background_tile":true,"created_at":"Wed Mar 19 00:11:44 +0000 2008","location":"evansville, indiana","name":"hoosiergirl","profile_background_color":"093d53","profile_image_url":"http://a3.twimg.com/profile_images/60746143/hoosiergirl_normal.JPG","id":14173542,"utc_offset":-21600,"favourites_count":6089},{"profile_sidebar_fill_color":"FFFFFF","description":"i love breaking news. and apples.","screen_name":"echuckles","followers_count":2351,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"web","favorited":false,"in_reply_to_screen_name":null,"created_at":"Tue Nov 24 23:13:42 +0000 2009","id":6022581868,"text":"the drugstore sells condoms behind the counter with a big sign that says LATEX BALLOONS. they also sell balloons back there, but, um, wow."},"following":false,"statuses_count":1522,"time_zone":"Eastern Time (US & Canada)","profile_sidebar_border_color":"6D1F23","friends_count":232,"notifications":false,"favourites_count":856,"profile_text_color":"6D1F23","url":"http://www.flickr.com/photos/nochuckingaround/3622527299/","profile_background_image_url":"http://a1.twimg.com/profile_background_images/4619280/bkgd.jpg","geo_enabled":false,"profile_link_color":"6D1F23","protected":false,"profile_background_tile":false,"created_at":"Fri Dec 22 03:04:51 +0000 2006","location":"usually 30 Rock.","name":"Elizabeth Chuck","verified":false,"profile_background_color":"FFCCCC","profile_image_url":"http://a1.twimg.com/profile_images/51502776/red_red_wine_normal.JPG","id":145313,"utc_offset":-18000},{"profile_sidebar_fill_color":"e0ff92","description":"I blogged before rafeco.","screen_name":"gknauss","friends_count":124,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://birdhouseapp.com\" rel=\"nofollow\">Birdhouse</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 06:00:00 +0000 2009","id":6193880634,"text":"\"We've false-colored the infrared on the images that the perimeter-defense satellites have sent back, so you can clearly see the clown.\""},"following":false,"statuses_count":1998,"time_zone":"Pacific Time (US & Canada)","profile_sidebar_border_color":"87bc44","notifications":false,"favourites_count":433,"geo_enabled":false,"profile_text_color":"000000","url":"http://www.eod.com","profile_background_image_url":"http://a3.twimg.com/profile_background_images/48272213/back.gif","verified":false,"profile_link_color":"0000ff","protected":false,"profile_background_tile":true,"created_at":"Sun Apr 01 23:07:06 +0000 2007","location":"","name":"Greg Knauss","profile_background_color":"9ae4e8","profile_image_url":"http://a1.twimg.com/profile_images/38137892/greg-icon-128_normal.gif","id":3163591,"utc_offset":-28800,"followers_count":2021},{"profile_sidebar_fill_color":"e0ff92","description":"The savior of all, for all.","screen_name":"JesusGoneViral","notifications":false,"favourites_count":0,"status":{"in_reply_to_user_id":14184328,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://www.twhirl.org/\" rel=\"nofollow\">twhirl</a>","favorited":false,"in_reply_to_screen_name":"Gillis57","created_at":"Sun May 24 19:57:39 +0000 2009","id":1905338998,"text":"@Gillis57 check"},"following":false,"time_zone":"Central Time (US & Canada)","profile_sidebar_border_color":"87bc44","statuses_count":41,"geo_enabled":false,"profile_text_color":"000000","url":null,"profile_background_image_url":"http://a3.twimg.com/profile_background_images/2933549/Cross_Hill_Morning.jpg","verified":false,"profile_link_color":"0000ff","protected":false,"profile_background_tile":false,"created_at":"Mon Aug 25 22:16:56 +0000 2008","followers_count":671,"location":"Omnipresent","name":"JesusGoneViral","profile_background_color":"9ae4e8","profile_image_url":"http://a1.twimg.com/profile_images/58888266/jesus_normal.jpg","id":15988295,"utc_offset":-21600,"friends_count":1090},{"profile_sidebar_fill_color":"9AB5B6","description":"Hey, turtleface. Want a peanut? sprattacus [at] gmail","screen_name":"CcSteff","friends_count":194,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://www.atebits.com/\" rel=\"nofollow\">Tweetie</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Sun Nov 29 21:49:14 +0000 2009","id":6181041046,"text":"The state flower of Ohio is ranch dressing."},"following":null,"statuses_count":2866,"time_zone":"Eastern Time (US & Canada)","profile_sidebar_border_color":"9AB5B6","notifications":null,"favourites_count":34495,"geo_enabled":false,"profile_text_color":"333333","url":null,"profile_background_image_url":"http://a1.twimg.com/profile_background_images/4063824/background.jpg","verified":false,"profile_link_color":"0084B4","protected":false,"profile_background_tile":false,"created_at":"Tue Apr 08 21:26:46 +0000 2008","location":"Richmond, VA","name":"Stephanie","profile_background_color":"9ab5b6","profile_image_url":"http://a1.twimg.com/profile_images/63340206/twittah_normal.jpg","id":14336349,"utc_offset":-18000,"followers_count":4404},{"profile_sidebar_fill_color":"A0C5C7","description":"Comedian/Writer/Lady","screen_name":"Lizinhollywood","friends_count":53,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"web","favorited":false,"in_reply_to_screen_name":null,"created_at":"Sun Nov 29 21:58:34 +0000 2009","id":6181268618,"text":"I'm pretty sure all the other days of the week are jealous of Sunday. #bestdayoftheweek"},"following":false,"statuses_count":501,"time_zone":"Tehran","profile_sidebar_border_color":"86A4A6","notifications":false,"favourites_count":3,"geo_enabled":false,"profile_text_color":"333333","url":"http://myspace.com/lizinhollywood","profile_background_image_url":"http://s.twimg.com/a/1258570280/images/themes/theme6/bg.gif","verified":false,"profile_link_color":"233295","protected":false,"profile_background_tile":false,"created_at":"Mon Jan 26 00:22:48 +0000 2009","location":"Tehran, CA","name":"Liz Feldman","profile_background_color":"709397","profile_image_url":"http://a1.twimg.com/profile_images/335072330/8M5U4194_8x10_normal.jpg","id":19512616,"utc_offset":12600,"followers_count":9241},{"profile_sidebar_fill_color":"e8e8e8","description":"Rap is a poetry of sorts.","screen_name":"snacksandshit","statuses_count":694,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://www.atebits.com/\" rel=\"nofollow\">Tweetie</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Sat Nov 28 22:34:06 +0000 2009","id":6152844605,"text":"New Snacks!: #446 http://bit.ly/6A5ebl"},"following":false,"time_zone":"Pacific Time (US & Canada)","profile_sidebar_border_color":"2e93ff","geo_enabled":false,"verified":false,"profile_text_color":"262e5e","url":"http://snacksandshit.com","profile_background_image_url":"http://a1.twimg.com/profile_background_images/4749304/snacksicon.jpg","followers_count":2296,"profile_link_color":"9b1c2f","protected":false,"profile_background_tile":true,"created_at":"Mon Feb 23 23:27:07 +0000 2009","friends_count":300,"location":"Los Angeles, California","name":"Snacks And Shit","profile_background_color":"1A1B1F","profile_image_url":"http://a3.twimg.com/profile_images/378590567/JayZ_normal.jpg","id":21707052,"notifications":false,"utc_offset":-28800,"favourites_count":3},{"profile_sidebar_fill_color":"f0d860","description":"I used to find Lionel Richie very attractive. My 3yo son Chooch is smarter than me.","screen_name":"vagynafondue","notifications":false,"favourites_count":3,"status":{"in_reply_to_user_id":40951112,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://twitterrific.com\" rel=\"nofollow\">Twitterrific</a>","favorited":false,"in_reply_to_screen_name":"melissa_please","created_at":"Mon Nov 30 17:44:26 +0000 2009","id":6207836703,"text":"@Melissa_please yes plz send me some of THOSE! Or at least the recipe."},"following":false,"time_zone":"Eastern Time (US & Canada)","profile_sidebar_border_color":"f0d860","statuses_count":5548,"geo_enabled":false,"profile_text_color":"000000","url":"http://ohhonestlyerin.com","profile_background_image_url":"http://a1.twimg.com/profile_background_images/2667310/fr-fleur-d-lis-an.gif","verified":false,"profile_link_color":"0000ff","protected":false,"profile_background_tile":true,"created_at":"Sat Jul 14 13:32:01 +0000 2007","followers_count":298,"location":"\u00dcT: 40.394681,-80.029306","name":"Erin Honestly","profile_background_color":"000000","profile_image_url":"http://a3.twimg.com/profile_images/526874101/november09_normal.jpg","id":7470972,"utc_offset":-18000,"friends_count":141},{"profile_sidebar_fill_color":"e0ff92","description":"Cultural schizophrenic settled down, at last, in RVA. Specializing in awkwardness, which may be either hilarious or excruciating. Not for the faint of heart.","screen_name":"vmarinelli","followers_count":2298,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"web","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 17:48:26 +0000 2009","id":6207942203,"text":"\"This image is not simply an absurd juxtaposition of Jennifer Connelly & my toilet. It\u2019s also an invocation of happenstance.\" @ed_x is nuts."},"following":false,"statuses_count":8619,"time_zone":"Bogota","profile_sidebar_border_color":"87bc44","friends_count":203,"notifications":false,"favourites_count":34416,"profile_text_color":"000000","url":"http:///vmarinelli.tumblr.com","profile_background_image_url":"http://a3.twimg.com/profile_background_images/2566289/tunnel-background.jpg","geo_enabled":false,"profile_link_color":"0000ff","protected":false,"profile_background_tile":false,"created_at":"Thu Apr 26 06:48:04 +0000 2007","location":"Richmond, VA","name":"Victoria Marinelli","verified":false,"profile_background_color":"9ae4e8","profile_image_url":"http://a3.twimg.com/profile_images/76953857/220006156549_normal.jpg","id":5520382,"utc_offset":-18000},{"profile_sidebar_fill_color":"DDFFCC","followers_count":872391,"description":"I'm 29. I live with my 73-year-old dad. He is awesome. I just write down shit that he says","screen_name":"shitmydadsays","status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"web","favorited":false,"in_reply_to_screen_name":null,"created_at":"Fri Nov 27 21:31:06 +0000 2009","id":6123132850,"text":"\u201cThe whole world is fueled by bullshit\u2026 What? The kid asked me for advice on his science fair project so I\u2019m giving it to him.\u201d"},"following":false,"time_zone":"Pacific Time (US & Canada)","friends_count":1,"profile_sidebar_border_color":"BDDCAD","statuses_count":79,"notifications":false,"favourites_count":0,"profile_text_color":"333333","url":null,"geo_enabled":false,"profile_background_image_url":"http://s.twimg.com/a/1259091217/images/themes/theme16/bg.gif","profile_link_color":"0084B4","protected":false,"verified":false,"profile_background_tile":false,"created_at":"Mon Aug 03 18:20:34 +0000 2009","location":"","name":"Justin","profile_background_color":"9AE4E8","profile_image_url":"http://a3.twimg.com/profile_images/362705903/dad_normal.jpg","id":62581962,"utc_offset":-28800},{"profile_sidebar_fill_color":"252429","followers_count":1742,"description":"The best viral videos and pictures served daily!","screen_name":"DailyShite","status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://apiwiki.twitter.com/\" rel=\"nofollow\">API</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 18:01:32 +0000 2009","id":6208287595,"text":"Can&#8217;t Accuse This Guy of Too Many Decorations - http://scrw.us/2kt"},"following":false,"time_zone":"Central Time (US & Canada)","friends_count":1700,"profile_sidebar_border_color":"181A1E","geo_enabled":false,"notifications":false,"profile_text_color":"666666","url":"http://dailyshite.com","verified":false,"statuses_count":1131,"profile_background_image_url":"http://a1.twimg.com/profile_background_images/19243706/dailyshite-twitter.jpg","profile_link_color":"2FC2EF","protected":false,"profile_background_tile":true,"created_at":"Sun Mar 22 19:27:12 +0000 2009","location":"Mobile, AL / Cobh, Ireland","name":"Daily Shite","profile_background_color":"1A1B1F","profile_image_url":"http://a1.twimg.com/profile_images/107319570/avatar100_normal.jpg","id":25864339,"utc_offset":-21600,"favourites_count":0},{"profile_sidebar_fill_color":"e0ff92","description":"I'm an actor, director and producer. ","screen_name":"Danny_DeVito","notifications":false,"favourites_count":4,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://www.atebits.com/\" rel=\"nofollow\">Tweetie</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 17:05:06 +0000 2009","id":6206792187,"text":"Juxtible and the dirty dog brothers\nPodcast at WWW.\nWOBC 91.5 Oberlin College and community radio. Dig the World!"},"following":false,"time_zone":"Pacific Time (US & Canada)","profile_sidebar_border_color":"87bc44","statuses_count":465,"geo_enabled":false,"profile_text_color":"000000","url":"http://www.imdb.com/name/nm0000362/","profile_background_image_url":"http://s.twimg.com/a/1259091217/images/themes/theme1/bg.png","verified":true,"profile_link_color":"0000ff","protected":false,"profile_background_tile":false,"created_at":"Sat Sep 05 19:44:48 +0000 2009","followers_count":283379,"location":"Los Angeles","name":"Danny DeVito","profile_background_color":"9ae4e8","profile_image_url":"http://a3.twimg.com/profile_images/400232403/Photo_6_normal.jpg","id":71876190,"utc_offset":-28800,"friends_count":5},{"profile_sidebar_fill_color":"FFF7CC","description":"America's Finest News Source","screen_name":"TheOnion","friends_count":405051,"status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://twitterfeed.com\" rel=\"nofollow\">twitterfeed</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Mon Nov 30 18:05:33 +0000 2009","id":6208395405,"text":"In Focus: Armless, Legless Tiger Woods Wins U. S. Open http://bit.ly/899JgM"},"following":false,"time_zone":"Eastern Time (US & Canada)","profile_sidebar_border_color":"F2E195","notifications":false,"favourites_count":11,"statuses_count":3618,"profile_text_color":"0C3E53","url":"http://www.theonion.com","profile_background_image_url":"http://a1.twimg.com/profile_background_images/25775614/background4.png","geo_enabled":false,"profile_link_color":"FF0000","protected":false,"profile_background_tile":false,"created_at":"Tue Mar 04 02:48:37 +0000 2008","location":"New York, NY","name":"The Onion","verified":false,"profile_background_color":"006933","profile_image_url":"http://a1.twimg.com/profile_images/334357688/onion_logo_03_L_normal.png","id":14075928,"utc_offset":-18000,"followers_count":1969369},{"friends_count":0,"profile_sidebar_fill_color":"e0ff92","description":"2-time Emmy award winning comedian & star of Bravo's My Life on the D-List.","screen_name":"kathygriffin","status":{"in_reply_to_user_id":null,"in_reply_to_status_id":null,"truncated":false,"source":"<a href=\"http://echofon.com/\" rel=\"nofollow\">Echofon</a>","favorited":false,"in_reply_to_screen_name":null,"created_at":"Sun Nov 29 09:17:37 +0000 2009","id":6166085119,"text":"Thank you LA! On Chelsea Lately Monday night! Will twat about it. Maybe she will too. Twat to twat!"},"following":false,"time_zone":"Alaska","profile_sidebar_border_color":"87bc44","followers_count":215299,"profile_text_color":"000000","url":"http://www.kathygriffin.net","profile_background_image_url":"http://s.twimg.com/a/1259091217/images/themes/theme1/bg.png","profile_link_color":"0000ff","protected":false,"profile_background_tile":false,"favourites_count":2,"created_at":"Tue Feb 17 23:54:04 +0000 2009","location":"Los Angeles, CA","name":"Kathy Griffin","verified":true,"geo_enabled":false,"profile_background_color":"9ae4e8","profile_image_url":"http://a1.twimg.com/profile_images/507775388/51u2vJ-eEeL._SL500_AA280__normal.jpg","id":21148293,"notifications":false,"statuses_count":162,"utc_offset":-32400}], "next_cursor":1317534533279684274, "previous_cursor":0 }
data/test/helper.rb ADDED
@@ -0,0 +1,22 @@
1
+ require 'rubygems'
2
+ require 'test/unit'
3
+ require 'shoulda'
4
+ require 'matchy'
5
+ require 'context'
6
+ require 'stump'
7
+ require 'fakeweb'
8
+
9
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
10
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
11
+ require 'twitter-lists'
12
+
13
+ FakeWeb.allow_net_connect = false
14
+ FakeWeb.register_uri(:get,
15
+ "http://user:pass@twitter.com/ivey/hah/members.json?cursor=-1",
16
+ :response => File.join(File.dirname(__FILE__), 'fixtures', 'ivey-hah-members.json'))
17
+ FakeWeb.register_uri(:get,
18
+ "http://user:pass@twitter.com/ivey/hah/members.json?cursor=1317534533279684274",
19
+ :response => File.join(File.dirname(__FILE__), 'fixtures', 'ivey-hah-members-p2.json'))
20
+
21
+ class Test::Unit::TestCase
22
+ end
data/test/test_list.rb ADDED
@@ -0,0 +1,124 @@
1
+ require 'helper'
2
+
3
+ class TestTwitterList < Test::Unit::TestCase
4
+
5
+ should "Have a class-level accessor for the Twitter::Base object" do
6
+ base = "Twitter::Base mock"
7
+ lambda { Twitter::List.twitter_base = base }.should_not raise_error
8
+ Twitter::List.twitter_base.should be(base)
9
+ end
10
+
11
+ context "Setting up Basic Auth" do
12
+ setup do
13
+ Twitter::List.setup_basic_auth "user", "pass"
14
+ end
15
+
16
+ should "be a Twitter::Base" do
17
+ Twitter::List.twitter_base.class.should be(Twitter::Base)
18
+ end
19
+
20
+ end
21
+
22
+ context "A Twitter List" do
23
+ setup do
24
+ @list = Twitter::List.new
25
+ end
26
+
27
+ should "exist" do
28
+ @list.should_not be_nil
29
+ end
30
+
31
+ should "have a id" do
32
+ lambda { @list.id = 12223242 }.should_not raise_error
33
+ @list.id.should be(12223242)
34
+ end
35
+
36
+ should "have a name" do
37
+ lambda { @list.name = "Foo" }.should_not raise_error
38
+ @list.name.should be("Foo")
39
+ end
40
+
41
+ should "have a user" do
42
+ lambda { @list.user = "ivey" }.should_not raise_error
43
+ @list.user.should be("ivey")
44
+ end
45
+
46
+ should "have a description" do
47
+ lambda { @list.description = "Foo Bar Baz" }.should_not raise_error
48
+ @list.description.should be("Foo Bar Baz")
49
+ end
50
+
51
+ should "have members" do
52
+ lambda { @list.members = [[1,2],[3,4]] }.should_not raise_error
53
+ @list.members.should be([[1,2],[3,4]])
54
+ end
55
+
56
+ end
57
+
58
+ context "parsing a user/name string" do
59
+ setup do
60
+ @list = Twitter::List.parse "@ivey/hah"
61
+ end
62
+
63
+ should "have user = ivey" do
64
+ @list.user.should be("ivey")
65
+ end
66
+
67
+ should "have name = hah" do
68
+ @list.name.should be("hah")
69
+ end
70
+
71
+ context "loading from Twitter" do
72
+ setup do
73
+ Twitter::List.setup_basic_auth "user", "pass"
74
+ @list.load_members
75
+ end
76
+
77
+ should "have members" do
78
+ @list.members.size.should be(21)
79
+ end
80
+
81
+ should "have a userid for each member" do
82
+ @list.members.each { |x| x[0].class.should be(Fixnum)}
83
+ @list.member_ids.should be(@list.members.collect { |x| x[0] })
84
+ end
85
+
86
+ should "have a username for each member" do
87
+ @list.members.each { |x| x[1].class.should be(String)}
88
+ @list.member_names.should be(@list.members.collect { |x| x[1] })
89
+ end
90
+ end
91
+ end
92
+
93
+ context "Set math on 3 lists" do
94
+ setup do
95
+ @list1 = Twitter::List.new
96
+ @list1.members = [[1,"ivey"],[2,"emilyivey"],[3,"ellieivey"],[8,"billy_goat"]]
97
+ @list2 = Twitter::List.new
98
+ @list2.members = [[1,"ivey"],[4,"tensigma"],[5,"smahend"],[8,"billy_goat"]]
99
+ @list3 = Twitter::List.new
100
+ @list3.members = [[1,"ivey"],[3,"ellieivey"],[6,"jteeter"],[7,"jackowayed"],[8,"billy_goat"]]
101
+ end
102
+
103
+ context "find union of the 3 lists" do
104
+ setup do
105
+ @union = Twitter::List.union(@list1,@list2,@list3)
106
+ end
107
+
108
+ should "have 8 elements" do
109
+ @union.size.should be(8)
110
+ end
111
+ end
112
+
113
+ context "find intersection of the 3 lists" do
114
+ setup do
115
+ @union = Twitter::List.intersection(@list1,@list2,@list3)
116
+ end
117
+
118
+ should "have 3 elements" do
119
+ @union.size.should be(2)
120
+ end
121
+ end
122
+
123
+ end
124
+ end
metadata ADDED
@@ -0,0 +1,117 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: twitter-lists
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Michael D. Ivey
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-11-30 00:00:00 -06:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: thoughtbot-shoulda
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: jnunemaker-matchy
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: jeremymcanally-context
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "0"
44
+ version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: jeremymcanally-stump
47
+ type: :development
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ - !ruby/object:Gem::Dependency
56
+ name: fakeweb
57
+ type: :development
58
+ version_requirement:
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ version:
65
+ description: A library and command-line tool for working with Twitter lists
66
+ email: ivey@gweezlebur.com
67
+ executables: []
68
+
69
+ extensions: []
70
+
71
+ extra_rdoc_files:
72
+ - LICENSE
73
+ - README.rdoc
74
+ files:
75
+ - .document
76
+ - .gitignore
77
+ - LICENSE
78
+ - README.rdoc
79
+ - Rakefile
80
+ - VERSION
81
+ - lib/twitter-lists.rb
82
+ - lib/twitter-lists/list.rb
83
+ - test/fixtures/ivey-hah-members-p2.json
84
+ - test/fixtures/ivey-hah-members.json
85
+ - test/helper.rb
86
+ - test/test_list.rb
87
+ has_rdoc: true
88
+ homepage: http://github.com/ivey/twitter-lists
89
+ licenses: []
90
+
91
+ post_install_message:
92
+ rdoc_options:
93
+ - --charset=UTF-8
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: "0"
101
+ version:
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: "0"
107
+ version:
108
+ requirements: []
109
+
110
+ rubyforge_project:
111
+ rubygems_version: 1.3.5
112
+ signing_key:
113
+ specification_version: 3
114
+ summary: A library and command-line tool for working with Twitter lists.
115
+ test_files:
116
+ - test/helper.rb
117
+ - test/test_list.rb