twitter-lists 0.0.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.
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