anthonycrumley-twitter 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. data/History.txt +106 -0
  2. data/License.txt +19 -0
  3. data/Manifest.txt +71 -0
  4. data/README.txt +84 -0
  5. data/Rakefile +4 -0
  6. data/bin/twitter +15 -0
  7. data/config/hoe.rb +74 -0
  8. data/config/requirements.rb +17 -0
  9. data/examples/blocks.rb +15 -0
  10. data/examples/direct_messages.rb +28 -0
  11. data/examples/favorites.rb +20 -0
  12. data/examples/friends_followers.rb +25 -0
  13. data/examples/friendships.rb +13 -0
  14. data/examples/identica_timeline.rb +7 -0
  15. data/examples/location.rb +8 -0
  16. data/examples/posting.rb +9 -0
  17. data/examples/replies.rb +26 -0
  18. data/examples/search.rb +17 -0
  19. data/examples/sent_messages.rb +26 -0
  20. data/examples/timeline.rb +33 -0
  21. data/examples/twitter.rb +27 -0
  22. data/examples/verify_credentials.rb +13 -0
  23. data/lib/twitter.rb +21 -0
  24. data/lib/twitter/base.rb +252 -0
  25. data/lib/twitter/cli.rb +328 -0
  26. data/lib/twitter/cli/config.rb +9 -0
  27. data/lib/twitter/cli/helpers.rb +97 -0
  28. data/lib/twitter/cli/migrations/20080722194500_create_accounts.rb +13 -0
  29. data/lib/twitter/cli/migrations/20080722194508_create_tweets.rb +16 -0
  30. data/lib/twitter/cli/migrations/20080722214605_add_account_id_to_tweets.rb +9 -0
  31. data/lib/twitter/cli/migrations/20080722214606_create_configurations.rb +13 -0
  32. data/lib/twitter/cli/models/account.rb +33 -0
  33. data/lib/twitter/cli/models/configuration.rb +13 -0
  34. data/lib/twitter/cli/models/tweet.rb +20 -0
  35. data/lib/twitter/direct_message.rb +22 -0
  36. data/lib/twitter/easy_class_maker.rb +43 -0
  37. data/lib/twitter/rate_limit_status.rb +19 -0
  38. data/lib/twitter/search.rb +94 -0
  39. data/lib/twitter/status.rb +22 -0
  40. data/lib/twitter/user.rb +37 -0
  41. data/lib/twitter/version.rb +9 -0
  42. data/script/destroy +14 -0
  43. data/script/generate +14 -0
  44. data/script/txt2html +74 -0
  45. data/setup.rb +1585 -0
  46. data/spec/base_spec.rb +109 -0
  47. data/spec/cli/helper_spec.rb +35 -0
  48. data/spec/direct_message_spec.rb +35 -0
  49. data/spec/fixtures/followers.xml +706 -0
  50. data/spec/fixtures/friends.xml +609 -0
  51. data/spec/fixtures/friends_for.xml +584 -0
  52. data/spec/fixtures/friends_lite.xml +192 -0
  53. data/spec/fixtures/friends_timeline.xml +66 -0
  54. data/spec/fixtures/public_timeline.xml +148 -0
  55. data/spec/fixtures/rate_limit_status.xml +7 -0
  56. data/spec/fixtures/search_results.json +1 -0
  57. data/spec/fixtures/status.xml +25 -0
  58. data/spec/fixtures/user.xml +38 -0
  59. data/spec/fixtures/user_timeline.xml +465 -0
  60. data/spec/search_spec.rb +89 -0
  61. data/spec/spec.opts +1 -0
  62. data/spec/spec_helper.rb +12 -0
  63. data/spec/status_spec.rb +40 -0
  64. data/spec/user_spec.rb +42 -0
  65. data/tasks/deployment.rake +50 -0
  66. data/tasks/environment.rake +7 -0
  67. data/tasks/website.rake +17 -0
  68. data/twitter.gemspec +49 -0
  69. data/website/css/common.css +47 -0
  70. data/website/images/terminal_output.png +0 -0
  71. data/website/index.html +156 -0
  72. metadata +180 -0
@@ -0,0 +1,89 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Twitter::Search do
4
+ before do
5
+ @search = Twitter::Search.new
6
+ end
7
+
8
+ it "should be able to initialize with a search term" do
9
+ Twitter::Search.new('httparty').query[:q].should include('httparty')
10
+ end
11
+
12
+ it "should be able to specify from" do
13
+ @search.from('jnunemaker').query[:q].should include('from:jnunemaker')
14
+ end
15
+
16
+ it "should be able to specify to" do
17
+ @search.to('jnunemaker').query[:q].should include('to:jnunemaker')
18
+ end
19
+
20
+ it "should be able to specify referencing" do
21
+ @search.referencing('jnunemaker').query[:q].should include('@jnunemaker')
22
+ end
23
+
24
+ it "should alias references to referencing" do
25
+ @search.references('jnunemaker').query[:q].should include('@jnunemaker')
26
+ end
27
+
28
+ it "should alias ref to referencing" do
29
+ @search.ref('jnunemaker').query[:q].should include('@jnunemaker')
30
+ end
31
+
32
+ it "should be able to specify containing" do
33
+ @search.containing('milk').query[:q].should include('milk')
34
+ end
35
+
36
+ it "should alias contains to containing" do
37
+ @search.contains('milk').query[:q].should include('milk')
38
+ end
39
+
40
+ it "should be able to specify hashed" do
41
+ @search.hashed('twitter').query[:q].should include('#twitter')
42
+ end
43
+
44
+ it "should be able to specify the language" do
45
+ @search.lang('en').query[:lang].should == 'en'
46
+ end
47
+
48
+ it "should be able to specify the number of results per page" do
49
+ @search.per_page(25).query[:rpp].should == 25
50
+ end
51
+
52
+ it "should be able to specify only returning results greater than an id" do
53
+ @search.since(1234).query[:since_id].should == 1234
54
+ end
55
+
56
+ it "should be able to specify geo coordinates" do
57
+ @search.geocode('40.757929', '-73.985506', '25mi').query[:geocode].should == '40.757929,-73.985506,25mi'
58
+ end
59
+
60
+ it "should be able to clear the filters set" do
61
+ @search.from('jnunemaker').to('oaknd1')
62
+ @search.clear.query.should == {:q => []}
63
+ end
64
+
65
+ it "should be able to chain methods together" do
66
+ @search.from('jnunemaker').to('oaknd1').referencing('orderedlist').containing('milk').hashed('twitter').lang('en').per_page(20).since(1234).geocode('40.757929', '-73.985506', '25mi')
67
+ @search.query[:q].should == ['from:jnunemaker', 'to:oaknd1', '@orderedlist', 'milk', '#twitter']
68
+ @search.query[:lang].should == 'en'
69
+ @search.query[:rpp].should == 20
70
+ @search.query[:since_id].should == 1234
71
+ @search.query[:geocode].should == '40.757929,-73.985506,25mi'
72
+ end
73
+
74
+ describe "fetching" do
75
+ before do
76
+ @response = open(File.dirname(__FILE__) + '/fixtures/friends_timeline.xml').read
77
+ @search.class.stub!(:get).and_return(@response)
78
+ end
79
+
80
+ it "should return results" do
81
+ @search.class.should_receive(:get).and_return(@response)
82
+ @search.from('jnunemaker').fetch().should == @response
83
+ end
84
+ end
85
+
86
+ it "should be able to iterate over results" do
87
+ @search.respond_to?(:each).should == true
88
+ end
89
+ end
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,12 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ dir = File.dirname(__FILE__)
10
+
11
+ $:.unshift(File.join(dir, '/../lib/'))
12
+ require dir + '/../lib/twitter'
@@ -0,0 +1,40 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Twitter::Status do
4
+ it "should create new status from xml doc" do
5
+ xml = <<EOF
6
+ <status>
7
+ <created_at>Sun May 04 21:59:52 +0000 2008</created_at>
8
+ <id>803435310</id>
9
+ <text>Writing tests (rspec) for the twitter gem that all can run. Wish I would have done this when I wrote it years back.</text>
10
+ <source>&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;</source>
11
+ <truncated>false</truncated>
12
+ <in_reply_to_status_id></in_reply_to_status_id>
13
+ <in_reply_to_user_id></in_reply_to_user_id>
14
+ <favorited>false</favorited>
15
+ <user>
16
+ <id>4243</id>
17
+ <name>John Nunemaker</name>
18
+ <screen_name>jnunemaker</screen_name>
19
+ <location>Indiana</location>
20
+ <description>Loves his wife, ruby, notre dame football and iu basketball</description>
21
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/52619256/ruby_enterprise_shirt_normal.jpg</profile_image_url>
22
+ <url>http://addictedtonew.com</url>
23
+ <protected>false</protected>
24
+ <followers_count>363</followers_count>
25
+ </user>
26
+ </status>
27
+ EOF
28
+ s = Twitter::Status.new_from_xml(Hpricot.XML(xml))
29
+ s.id.should == '803435310'
30
+ s.created_at.should == 'Sun May 04 21:59:52 +0000 2008'
31
+ s.text.should == 'Writing tests (rspec) for the twitter gem that all can run. Wish I would have done this when I wrote it years back.'
32
+ s.source.should == '&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;'
33
+ s.truncated.should == false
34
+ s.in_reply_to_status_id.should == ''
35
+ s.in_reply_to_user_id.should == ''
36
+ s.favorited.should == false
37
+ s.user.id.should == '4243'
38
+ s.user.name.should == 'John Nunemaker'
39
+ end
40
+ end
@@ -0,0 +1,42 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Twitter::User do
4
+ it "should create new user from xml doc" do
5
+ xml = <<EOF
6
+ <user>
7
+ <id>18713</id>
8
+ <name>Alex Payne</name>
9
+ <screen_name>al3x</screen_name>
10
+ <location>San Francisco, CA</location>
11
+ <description>Oh, hi. No, I just work here.</description>
12
+ <profile_image_url>http://s3.amazonaws.com/twitter_production/profile_images/51961745/al3x_normal.jpg</profile_image_url>
13
+ <url>http://www.al3x.net</url>
14
+ <protected>false</protected>
15
+ <followers_count>2889</followers_count>
16
+ <status>
17
+ <created_at>Sun May 04 22:38:39 +0000 2008</created_at>
18
+ <id>803453211</id>
19
+ <text>@5dots Yes. Give me about 8 hours. *sigh*</text>
20
+
21
+ <source>&lt;a href="http://iconfactory.com/software/twitterrific"&gt;twitterrific&lt;/a&gt;</source>
22
+ <truncated>false</truncated>
23
+ <in_reply_to_status_id>803450314</in_reply_to_status_id>
24
+ <in_reply_to_user_id>618923</in_reply_to_user_id>
25
+ <favorited>false</favorited>
26
+
27
+ </status>
28
+ </user>
29
+ EOF
30
+ u = Twitter::User.new_from_xml(Hpricot.XML(xml))
31
+ u.id.should == '18713'
32
+ u.name.should =='Alex Payne'
33
+ u.screen_name.should == 'al3x'
34
+ u.location.should == 'San Francisco, CA'
35
+ u.description.should == 'Oh, hi. No, I just work here.'
36
+ u.profile_image_url.should == 'http://s3.amazonaws.com/twitter_production/profile_images/51961745/al3x_normal.jpg'
37
+ u.url.should == 'http://www.al3x.net'
38
+ u.protected.should == false
39
+ u.followers_count.should == '2889'
40
+ u.status.text.should == '@5dots Yes. Give me about 8 hours. *sigh*'
41
+ end
42
+ end
@@ -0,0 +1,50 @@
1
+ desc 'Preps the gem for a new release'
2
+ task :prep_for_release do
3
+ require 'rio'
4
+ Rake::Task['manifest:refresh'].invoke
5
+ gemspec = %x[rake debug_gem]
6
+ lines = gemspec.split("\n")
7
+ rio('twitter.gemspec') < lines[1, lines.length-1].join("\n")
8
+ end
9
+
10
+ desc 'Release the website and new gem version'
11
+ task :deploy => [:check_version, :website, :release] do
12
+ puts "Remember to create SVN tag:"
13
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
14
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
15
+ puts "Suggested comment:"
16
+ puts "Tagging release #{CHANGES}"
17
+ end
18
+
19
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
20
+ task :local_deploy => [:website_generate, :install_gem]
21
+
22
+ task :check_version do
23
+ unless ENV['VERSION']
24
+ puts 'Must pass a VERSION=x.y.z release version'
25
+ exit
26
+ end
27
+ unless ENV['VERSION'] == VERS
28
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
29
+ exit
30
+ end
31
+ end
32
+
33
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
34
+ task :install_gem_no_doc => [:clean, :package] do
35
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
36
+ end
37
+
38
+ namespace :manifest do
39
+ desc 'Recreate Manifest.txt to include ALL files'
40
+ task :refresh do
41
+ `rake check_manifest | patch -p0 > Manifest.txt`
42
+ end
43
+ end
44
+
45
+ namespace :files do
46
+ task :copy do
47
+ files = File.read(File.join(File.dirname(__FILE__), '..', 'Manifest.txt')).split("\n")
48
+ %x[echo '#{files.inspect}' | pbcopy]
49
+ end
50
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_upload, :publish_docs]
@@ -0,0 +1,49 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = %q{twitter}
3
+ s.version = "0.3.8"
4
+
5
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
6
+ s.authors = ["John Nunemaker"]
7
+ s.date = %q{2008-08-26}
8
+ s.default_executable = %q{twitter}
9
+ s.description = %q{a command line interface for twitter, also a library which wraps the twitter api}
10
+ s.email = %q{nunemaker@gmail.com}
11
+ s.executables = ["twitter"]
12
+ s.extra_rdoc_files = ["History.txt", "License.txt", "Manifest.txt", "README.txt"]
13
+ s.files = ["History.txt", "License.txt", "Manifest.txt", "README.txt", "Rakefile", "bin/twitter", "config/hoe.rb", "config/requirements.rb", "examples/blocks.rb", "examples/direct_messages.rb", "examples/favorites.rb", "examples/friends_followers.rb", "examples/friendships.rb", "examples/identica_timeline.rb", "examples/location.rb", "examples/posting.rb", "examples/replies.rb", "examples/search.rb", "examples/sent_messages.rb", "examples/timeline.rb", "examples/twitter.rb", "examples/verify_credentials.rb", "lib/twitter.rb", "lib/twitter/base.rb", "lib/twitter/cli.rb", "lib/twitter/cli/config.rb", "lib/twitter/cli/helpers.rb", "lib/twitter/cli/migrations/20080722194500_create_accounts.rb", "lib/twitter/cli/migrations/20080722194508_create_tweets.rb", "lib/twitter/cli/migrations/20080722214605_add_account_id_to_tweets.rb", "lib/twitter/cli/migrations/20080722214606_create_configurations.rb", "lib/twitter/cli/models/account.rb", "lib/twitter/cli/models/configuration.rb", "lib/twitter/cli/models/tweet.rb", "lib/twitter/direct_message.rb", "lib/twitter/easy_class_maker.rb", "lib/twitter/rate_limit_status.rb", "lib/twitter/search.rb", "lib/twitter/status.rb", "lib/twitter/user.rb", "lib/twitter/version.rb", "script/destroy", "script/generate", "script/txt2html", "setup.rb", "spec/base_spec.rb", "spec/cli/helper_spec.rb", "spec/direct_message_spec.rb", "spec/fixtures/followers.xml", "spec/fixtures/friends.xml", "spec/fixtures/friends_for.xml", "spec/fixtures/friends_lite.xml", "spec/fixtures/friends_timeline.xml", "spec/fixtures/public_timeline.xml", "spec/fixtures/rate_limit_status.xml", "spec/fixtures/search_results.json", "spec/fixtures/status.xml", "spec/fixtures/user.xml", "spec/fixtures/user_timeline.xml", "spec/search_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "spec/status_spec.rb", "spec/user_spec.rb", "tasks/deployment.rake", "tasks/environment.rake", "tasks/website.rake", "twitter.gemspec", "website/css/common.css", "website/images/terminal_output.png", "website/index.html"]
14
+ s.has_rdoc = true
15
+ s.homepage = %q{http://twitter.rubyforge.org}
16
+ s.rdoc_options = ["--main", "README.txt"]
17
+ s.require_paths = ["lib"]
18
+ s.rubyforge_project = %q{twitter}
19
+ s.rubygems_version = %q{1.2.0}
20
+ s.summary = %q{a command line interface for twitter, also a library which wraps the twitter api}
21
+
22
+ if s.respond_to? :specification_version then
23
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
24
+ s.specification_version = 2
25
+
26
+ if current_version >= 3 then
27
+ s.add_runtime_dependency(%q<hpricot>, [">= 0.6"])
28
+ s.add_runtime_dependency(%q<activesupport>, [">= 2.1"])
29
+ s.add_runtime_dependency(%q<main>, [">= 2.8.2"])
30
+ s.add_runtime_dependency(%q<highline>, [">= 1.4.0"])
31
+ s.add_runtime_dependency(%q<activerecord>, [">= 2.1"])
32
+ s.add_runtime_dependency(%q<httparty>, [">= 0.1.0"])
33
+ else
34
+ s.add_dependency(%q<hpricot>, [">= 0.6"])
35
+ s.add_dependency(%q<activesupport>, [">= 2.1"])
36
+ s.add_dependency(%q<main>, [">= 2.8.2"])
37
+ s.add_dependency(%q<highline>, [">= 1.4.0"])
38
+ s.add_dependency(%q<activerecord>, [">= 2.1"])
39
+ s.add_dependency(%q<httparty>, [">= 0.1.0"])
40
+ end
41
+ else
42
+ s.add_dependency(%q<hpricot>, [">= 0.6"])
43
+ s.add_dependency(%q<activesupport>, [">= 2.1"])
44
+ s.add_dependency(%q<main>, [">= 2.8.2"])
45
+ s.add_dependency(%q<highline>, [">= 1.4.0"])
46
+ s.add_dependency(%q<activerecord>, [">= 2.1"])
47
+ s.add_dependency(%q<httparty>, [">= 0.1.0"])
48
+ end
49
+ end
@@ -0,0 +1,47 @@
1
+ @media screen, projection {
2
+ /*
3
+ Copyright (c) 2007, Yahoo! Inc. All rights reserved.
4
+ Code licensed under the BSD License:
5
+ http://developer.yahoo.net/yui/license.txt
6
+ version: 2.2.0
7
+ */
8
+ body {font:13px arial,helvetica,clean,sans-serif;*font-size:small;*font:x-small;}table {font-size:inherit;font:100%;}select, input, textarea {font:99% arial,helvetica,clean,sans-serif;}pre, code {font:115% monospace;*font-size:100%;}body * {line-height:1.22em;}
9
+ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}/*ol,ul {list-style:none;}*/caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym {border:0;}
10
+ /* end of yahoo reset and fonts */
11
+
12
+ body {color:#333; background:#4b1a1a; line-height:1.3;}
13
+ p {margin:0 0 20px;}
14
+ a {color:#4b1a1a;}
15
+ a:hover {text-decoration:none;}
16
+ strong {font-weight:bold;}
17
+ em {font-style:italics;}
18
+ h1,h2,h3,h4,h5,h6 {font-weight:bold;}
19
+ h1 {font-size:197%; margin:30px 0; color:#4b1a1a;}
20
+ h2 {font-size:174%; margin:20px 0; color:#b8111a;}
21
+ h3 {font-size:152%; margin:10px 0;}
22
+ h4 {font-size:129%; margin:10px 0;}
23
+ pre {background:#eee; margin:0 0 20px; padding:20px; border:1px solid #ccc; font-size:100%; overflow:auto;}
24
+ code {font-size:100%; margin:0; padding:0;}
25
+ ul, ol {margin:10px 0 10px 25px;}
26
+ ol li {margin:0 0 10px;}
27
+
28
+
29
+
30
+
31
+
32
+ div#wrapper {background:#fff; width:560px; margin:0 auto; padding:20px; border:10px solid #bc8c46; border-width:0 10px;}
33
+ div#header {position:relative; border-bottom:1px dotted; margin:0 0 10px; padding:0 0 10px;}
34
+ div#header p {margin:0; padding:0;}
35
+ div#header h1 {margin:0; padding:0;}
36
+ ul#nav {position:absolute; top:0; right:0; list-style:none; margin:0; padding:0;}
37
+ ul#nav li {display:inline; padding:0 0 0 5px;}
38
+ ul#nav li a {}
39
+ div#content {}
40
+ div#footer {margin:40px 0 0; border-top:1px dotted; padding:10px 0 0;}
41
+
42
+
43
+
44
+
45
+
46
+
47
+ }
@@ -0,0 +1,156 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
5
+ <title>Ruby Twitter Gem by John Nunemaker</title>
6
+ <link rel="stylesheet" href="css/common.css" type="text/css" />
7
+ </head>
8
+ <body>
9
+
10
+ <div id="wrapper">
11
+ <div id="header">
12
+ <h1>Twitter</h1>
13
+ <p>command line tweets and an api wrapper</p>
14
+
15
+ <ul id="nav">
16
+ <li><a href="rdoc/">Docs</a></li>
17
+ <li><a href="http://github.com/jnunemaker/twitter">Github</a></li>
18
+ <li><a href="http://jnunemaker.lighthouseapp.com/projects/14843-twitter-gem/overview">Lighthouse</a></li>
19
+ <li><a href="http://rubyforge.org/projects/twitter/">Rubyforge</a></li>
20
+ </ul>
21
+ </div>
22
+
23
+ <div id="content">
24
+ <h2>Install</h2>
25
+ <pre><code>$ sudo gem install twitter</code></pre>
26
+ <p><small>note: the twitter gem now works with hpricot 0.5+</small></p>
27
+
28
+ <h2>API Wrapping</h2>
29
+ <p>I do my best to keep it easy to use. Below are some code samples showing a few of the methods.</p>
30
+
31
+ <pre><code>twit = twit
32
+ twit.update('watching veronica mars')
33
+
34
+ puts "Public Timeline", "=" * 50
35
+ twit.timeline(:public).each do |s|
36
+ puts s.text, s.user.name
37
+ puts
38
+ end
39
+
40
+ puts '', "Friends Timeline", "=" * 50
41
+ twit.timeline(:friends).each do |s|
42
+ puts s.text, s.user.name
43
+ puts
44
+ end
45
+
46
+ puts '', "You and Your Friends Timeline", "=" * 50
47
+ twit.timeline(:user).each do |s|
48
+ puts s.text, s.user.name
49
+ puts
50
+ end
51
+
52
+ puts '', "Your Friends", "=" * 50
53
+ twit.friends.each do |u|
54
+ puts u.name, u.status.text
55
+ puts
56
+ end
57
+
58
+ puts '', "jnunemaker's Friends", "=" * 50
59
+ twit.friends_for('jnunemaker').each do |u|
60
+ puts u.name
61
+ puts
62
+ end
63
+
64
+ puts '', "Your Followers", "=" * 50
65
+ twit.followers.each do |u|
66
+ puts u.name
67
+ puts
68
+ end
69
+ </code></pre>
70
+
71
+ <h2>Search API Examples</h2>
72
+
73
+ <pre><code>#searches all tweets for httparty
74
+ Twitter::Search.new('httparty').each { |r| puts r.inspect }
75
+
76
+ # searches all of jnunemaker's tweets for httparty
77
+ Twitter::Search.new('httparty').from('jnunemaker').each { |r| puts r.inspect }
78
+
79
+ # searches all tweets from jnunemaker to oaknd1
80
+ Twitter::Search.new.from('jnunemaker').to('oaknd1').each { |r| puts r.inspect }
81
+
82
+ # you can also use fetch to actually just get the parsed response
83
+ Twitter::Search.new.from('jnunemaker').to('oaknd1').fetch()
84
+ </code></pre>
85
+
86
+ <h2>Command Line</h2>
87
+
88
+ <p><img src="images/terminal_output.png" alt="Terminal Output" style="width:560px;" /></p>
89
+
90
+ <p><strong>Note: If you want to use twitter from the command line be sure that sqlite3 and the sqlite3-ruby gem are installed.</strong> I removed the sqlite3-ruby gem as a dependency because you shouldn't need that to just use the API wrapper. Eventually I'll move the CLI interface into another gem.</p>
91
+
92
+ <p>The first thing you'll want to do is install the database so your account(s) can be stored.</p>
93
+
94
+ <pre><code>$ twitter install</code></pre>
95
+
96
+ <p>You can always uninstall twitter like this:</p>
97
+
98
+ <pre><code>$ twitter uninstall</code></pre>
99
+
100
+ <p>Once the twitter database is installed and migrated, you can add accounts like this:</p>
101
+
102
+ <pre><code>$ twitter add
103
+ Add New Account:
104
+ Username: jnunemaker
105
+ Password (won't be displayed):
106
+ Account added.</code></pre>
107
+
108
+ <p>You can also list all the accounts you've added.</p>
109
+
110
+ <pre><code>$ twitter list
111
+ Account List
112
+ * jnunemaker
113
+ snitch_test</code></pre>
114
+
115
+ <p>The * means denotes the account that will be used when posting, befriending, defriending, following, leaving or viewing a timeline.</p>
116
+
117
+ <p>To post using the account marked with the *, simply type the following:</p>
118
+
119
+ <pre><code>$ twitter post "releasing my new twitter gem"</code></pre>
120
+
121
+ <p>That is about it. You can do pretty much anything that you can do with twitter from the command line interface.</p>
122
+
123
+ <pre><code>$ twitter</code></pre>
124
+
125
+ <p>Will give you a list of all the commands. You can get the help for each command by running twitter [command] -h. </p>
126
+
127
+
128
+ <h2>Support</h2>
129
+ <p>Conversations welcome in the <a href="http://groups.google.com/group/ruby-twitter-gem">google group</a> and bugs/features over at <a href="http://jnunemaker.lighthouseapp.com/projects/14843-twitter-gem/overview">lighthouse</a></p>
130
+
131
+ <h2>Uses</h2>
132
+ <ul>
133
+ <li><a href="http://snitch.rubyforge.org">Snitch</a></li>
134
+ <li><a href="http://al3x.net/entries/766">Growl + Twitter</a></li>
135
+ <li><a href="http://snippets.dzone.com/posts/show/3714">Twitter Woot Bot</a> (<a href="http://soylentfoo.jnewland.com/articles/2007/03/22/woot-twitter-bot-now-official">more here</a>)</li>
136
+ <li><a href="http://soylentfoo.jnewland.com/articles/2007/01/22/tweet-update-twitter-via-quicksilver">Tweet Quicksilver Action</a></li>
137
+ <li><a href="http://blog.evanweaver.com/articles/2007/02/09/log-system-security-events-to-twitter">logging security events to twitter</a></li>
138
+ <li><a href="http://shareomatic.com/">Shareomatic</a> is using it for their <a href="http://twitter.com/shareomatic">twitter account</a></li>
139
+ </ul>
140
+
141
+ <p>Using the twitter gem for something, <a href="mailto:nunemaker@gmail.com">let me know</a> and I'll add you above.</p>
142
+ </div>
143
+
144
+ <div id="footer">
145
+ <p>Created by <a href="http://addictedtonew.com/about/">John Nunemaker</a></p>
146
+ </div>
147
+ </div>
148
+
149
+ <script src="http://www.google-analytics.com/urchin.js" type="text/javascript"></script>
150
+ <script type="text/javascript">_uacct = "UA-85301-9"; urchinTracker();</script>
151
+
152
+ <!-- 103bees.com 'bee' code v1.11 - please do not make any changes! -->
153
+ <script type="text/javascript" src="http://103bees.com/bees/?bee=3672&amp;fid=5643"></script>
154
+ <!-- 103bees.com 'bee' code -->
155
+ </body>
156
+ </html>