Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

added some tests; removed relative_created_at and replaced with creat…

…ed at; getting ready to release 0.1

git-svn-id: http://svn.addictedtonew.com/public/gems/twitter@40 fe7eae16-9a24-0410-a59d-9e59979e88be
  • Loading branch information...
commit ff1ae65766109c75f80c4b15797e12a69d7c29ad 1 parent c0f4a48
jnunemaker authored
Showing with 146 additions and 10,871 deletions.
  1. +8 −6 Rakefile
  2. +2 −1  examples/twitter.rb
  3. +29 −54 lib/twitter/command.rb
  4. +6 −19 lib/twitter/status.rb
  5. +0 −17 lib/twitter/user.rb
  6. +2 −2 lib/twitter/version.rb
  7. BIN  pkg/twitter-0.0.1.gem
  8. BIN  pkg/twitter-0.0.1.tgz
  9. +0 −5 pkg/twitter-0.0.1/CHANGELOG
  10. +0 −12 pkg/twitter-0.0.1/Manifest.txt
  11. +0 −46 pkg/twitter-0.0.1/README
  12. +0 −57 pkg/twitter-0.0.1/Rakefile
  13. +0 −35 pkg/twitter-0.0.1/bin/twitter
  14. +0 −7 pkg/twitter-0.0.1/lib/twitter.rb
  15. +0 −93 pkg/twitter-0.0.1/lib/twitter/base.rb
  16. +0 −190 pkg/twitter-0.0.1/lib/twitter/command.rb
  17. +0 −43 pkg/twitter-0.0.1/lib/twitter/easy_class_maker.rb
  18. +0 −33 pkg/twitter-0.0.1/lib/twitter/status.rb
  19. +0 −32 pkg/twitter-0.0.1/lib/twitter/user.rb
  20. +0 −9 pkg/twitter-0.0.1/lib/twitter/version.rb
  21. +0 −1,585 pkg/twitter-0.0.1/setup.rb
  22. BIN  pkg/twitter-0.0.2.gem
  23. BIN  pkg/twitter-0.0.2.tgz
  24. +0 −5 pkg/twitter-0.0.2/CHANGELOG
  25. +0 −46 pkg/twitter-0.0.2/README
  26. +0 −57 pkg/twitter-0.0.2/Rakefile
  27. +0 −35 pkg/twitter-0.0.2/bin/twitter
  28. +0 −7 pkg/twitter-0.0.2/lib/twitter.rb
  29. +0 −93 pkg/twitter-0.0.2/lib/twitter/base.rb
  30. +0 −190 pkg/twitter-0.0.2/lib/twitter/command.rb
  31. +0 −43 pkg/twitter-0.0.2/lib/twitter/easy_class_maker.rb
  32. +0 −33 pkg/twitter-0.0.2/lib/twitter/status.rb
  33. +0 −32 pkg/twitter-0.0.2/lib/twitter/user.rb
  34. +0 −9 pkg/twitter-0.0.2/lib/twitter/version.rb
  35. +0 −1,585 pkg/twitter-0.0.2/setup.rb
  36. BIN  pkg/twitter-0.0.3.gem
  37. BIN  pkg/twitter-0.0.3.tgz
  38. +0 −5 pkg/twitter-0.0.3/CHANGELOG
  39. +0 −46 pkg/twitter-0.0.3/README
  40. +0 −57 pkg/twitter-0.0.3/Rakefile
  41. +0 −35 pkg/twitter-0.0.3/bin/twitter
  42. +0 −7 pkg/twitter-0.0.3/lib/twitter.rb
  43. +0 −93 pkg/twitter-0.0.3/lib/twitter/base.rb
  44. +0 −190 pkg/twitter-0.0.3/lib/twitter/command.rb
  45. +0 −43 pkg/twitter-0.0.3/lib/twitter/easy_class_maker.rb
  46. +0 −33 pkg/twitter-0.0.3/lib/twitter/status.rb
  47. +0 −32 pkg/twitter-0.0.3/lib/twitter/user.rb
  48. +0 −9 pkg/twitter-0.0.3/lib/twitter/version.rb
  49. +0 −1,585 pkg/twitter-0.0.3/setup.rb
  50. BIN  pkg/twitter-0.0.4.gem
  51. BIN  pkg/twitter-0.0.4.tgz
  52. +0 −5 pkg/twitter-0.0.4/CHANGELOG
  53. +0 −46 pkg/twitter-0.0.4/README
  54. +0 −57 pkg/twitter-0.0.4/Rakefile
  55. +0 −35 pkg/twitter-0.0.4/bin/twitter
  56. +0 −7 pkg/twitter-0.0.4/lib/twitter.rb
  57. +0 −93 pkg/twitter-0.0.4/lib/twitter/base.rb
  58. +0 −190 pkg/twitter-0.0.4/lib/twitter/command.rb
  59. +0 −43 pkg/twitter-0.0.4/lib/twitter/easy_class_maker.rb
  60. +0 −33 pkg/twitter-0.0.4/lib/twitter/status.rb
  61. +0 −40 pkg/twitter-0.0.4/lib/twitter/user.rb
  62. +0 −9 pkg/twitter-0.0.4/lib/twitter/version.rb
  63. +0 −1,585 pkg/twitter-0.0.4/setup.rb
  64. BIN  pkg/twitter-0.0.5.gem
  65. BIN  pkg/twitter-0.0.5.tgz
  66. +0 −5 pkg/twitter-0.0.5/CHANGELOG
  67. +0 −46 pkg/twitter-0.0.5/README
  68. +0 −44 pkg/twitter-0.0.5/README.txt
  69. +0 −57 pkg/twitter-0.0.5/Rakefile
  70. +0 −35 pkg/twitter-0.0.5/bin/twitter
  71. +0 −25 pkg/twitter-0.0.5/examples/twitter.rb
  72. +0 −7 pkg/twitter-0.0.5/lib/twitter.rb
  73. +0 −93 pkg/twitter-0.0.5/lib/twitter/base.rb
  74. +0 −190 pkg/twitter-0.0.5/lib/twitter/command.rb
  75. +0 −43 pkg/twitter-0.0.5/lib/twitter/easy_class_maker.rb
  76. +0 −33 pkg/twitter-0.0.5/lib/twitter/status.rb
  77. +0 −40 pkg/twitter-0.0.5/lib/twitter/user.rb
  78. +0 −9 pkg/twitter-0.0.5/lib/twitter/version.rb
  79. +0 −1,585 pkg/twitter-0.0.5/setup.rb
  80. +20 −0 test/test_helper.rb
  81. +12 −0 test/unit/base.rb
  82. 0  test/unit/command.rb
  83. 0  test/unit/easy_class_maker.rb
  84. +27 −0 test/unit/status.rb
  85. +40 −0 test/unit/user.rb
View
14 Rakefile
@@ -48,10 +48,12 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
#p.spec_extras - A hash of extra values to set in the gemspec.
end
-
-
-desc "Package and Install Gem"
-task :package_and_install do
- `rake package`
- `sudo gem install pkg/#{NAME}-#{VERS}.gem`
+desc 'Publish HTML to RubyForge'
+task :publish_html do
+ config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
+ host = "#{config["username"]}@rubyforge.org"
+ remote_dir = "/var/www/gforge-projects/snitch/"
+ local_dir = 'html'
+ sh %{rsync -av --delete #{local_dir}/ #{host}:#{remote_dir}}
+ `rake publish_docs`
end
View
3  examples/twitter.rb
@@ -1,4 +1,5 @@
-require '../lib/twitter'
+require 'rubygems'
+require 'twitter'
puts "Public Timeline", "=" * 50
Twitter::Base.new('emailaddress', 'password').timeline(:public).each do |s|
View
83 lib/twitter/command.rb
@@ -15,8 +15,7 @@ class Command
email:
password:
EOF
- @@error_msg = "Something went wrong!!!\n\nMost likely: The twitter gem requires hpricot version >= 0.4.59. Check to make sure that you have at least that version installed. To install the newest version of hpricot:\n\n sudo gem install hpricot --source http://code.whytheluckystiff.net"
-
+
class << self
def process!
command = ARGV.shift
@@ -51,12 +50,8 @@ def post
post = ARGV.shift
- begin
- status = Twitter::Base.new(config['email'], config['password']).post(post)
- puts "\nGot it! New twitter created at: #{status.created_at}\n"
- rescue
- puts "\nTwitter what?. Something went wrong and your status could not be updated.\n"
- end
+ status = Twitter::Base.new(config['email'], config['password']).post(post)
+ puts "\nGot it! New twitter created at: #{status.created_at}\n"
end
# Shows status, time and user for the specified timeline
@@ -66,28 +61,20 @@ def timeline
timeline = :friends
timeline = ARGV.shift.intern if ARGV.size > 0 && Twitter::Base.timelines.include?(ARGV[0].intern)
- begin
- puts
- Twitter::Base.new(config['email'], config['password']).timeline(timeline).each do |s|
- puts "#{s.text}\n-- #{s.relative_created_at} by #{s.user.name}"
- puts
- end
- rescue
- puts @@error_msg
+ puts
+ Twitter::Base.new(config['email'], config['password']).timeline(timeline).each do |s|
+ puts "#{s.text}\n-- #{s.created_at} by #{s.user.name}"
end
+ puts
end
def friends
config = create_or_find_config
- begin
+ puts
+ Twitter::Base.new(config['email'], config['password']).friends.each do |u|
+ puts "#{u.name} (#{u.screen_name}) last updated #{u.status.created_at}\n-- #{u.status.text}"
puts
- Twitter::Base.new(config['email'], config['password']).friends.each do |u|
- puts "#{u.name} (#{u.screen_name}) last updated #{u.status.relative_created_at}\n-- #{u.status.text}"
- puts
- end
- rescue
- puts @@error_msg
end
end
@@ -103,23 +90,17 @@ def friend
screen_name = ARGV.shift
- begin
- puts
- found = false
- Twitter::Base.new(config['email'], config['password']).friends.each do |u|
- if u.screen_name == screen_name
- puts "#{u.name} last updated #{u.status.relative_created_at}\n-- #{u.status.text}"
- found = true
- end
- end
-
- unless found
- puts "Sorry couldn't find a friend of yours with #{screen_name} as a screen name"
+ puts
+ found = false
+ Twitter::Base.new(config['email'], config['password']).friends.each do |u|
+ if u.screen_name == screen_name
+ puts "#{u.name} last updated #{u.status.created_at}\n-- #{u.status.text}"
+ found = true
end
- puts
- rescue
- puts @@error_msg
end
+
+ puts "Sorry couldn't find a friend of yours with #{screen_name} as a screen name" unless found
+ puts
end
# Shows all followers and their last updated status
@@ -129,7 +110,7 @@ def followers
begin
puts
Twitter::Base.new(config['email'], config['password']).followers.each do |u|
- puts "#{u.name} last updated #{u.status.relative_created_at}\n-- #{u.status.text}"
+ puts "#{u.name} last updated #{u.status.created_at}\n-- #{u.status.text}"
puts
end
rescue
@@ -149,23 +130,17 @@ def follower
screen_name = ARGV.shift
- begin
- puts
- found = false
- Twitter::Base.new(config['email'], config['password']).followers.each do |u|
- if u.screen_name == screen_name
- puts "#{u.name} (#{u.screen_name}) last updated #{u.status.relative_created_at}\n-- #{u.status.text}"
- found = true
- end
- end
-
- unless found
- puts "Sorry couldn't find a follower of yours with #{screen_name} as a screen name"
+ puts
+ found = false
+ Twitter::Base.new(config['email'], config['password']).followers.each do |u|
+ if u.screen_name == screen_name
+ puts "#{u.name} (#{u.screen_name}) last updated #{u.status.created_at}\n-- #{u.status.text}"
+ found = true
end
- puts
- rescue
- puts @@error_msg
end
+
+ puts "Sorry couldn't find a follower of yours with #{screen_name} as a screen name" unless found
+ puts
end
private
View
25 lib/twitter/status.rb
@@ -1,31 +1,18 @@
-# The attributes are created_at, id, text, relative_created_at, and user (which is a user object)
-# new_from_xml expects xml along the lines of:
-# <status>
-# <id>1</id>
-# <created_at>a date</created_at>
-# <text>some text</text>
-# <relative_created_at>about 1 min ago</relative_created_at>
-# <user>
-# <id>1</id>
-# <name>John Nunemaker</name>
-# <screen_name>jnunemaker</screen_name>
-# </user>
-# </status>
module Twitter
class Status
include EasyClassMaker
- attributes :created_at, :id, :text, :relative_created_at, :user
+ attributes :created_at, :id, :text, :user
class << self
# Creates a new status from a piece of xml
def new_from_xml(xml)
Status.new do |s|
- s.id = (xml).at('id').innerHTML
- s.created_at = (xml).at('created_at').innerHTML
- s.text = (xml).at('text').innerHTML
- s.relative_created_at = (xml).at('relative_created_at').innerHTML
- s.user = User.new_from_xml(xml) if (xml).at('user')
+ s.id = (xml).at('id').innerHTML
+ s.created_at = (xml).at('created_at').innerHTML
+ s.text = (xml).at('text').innerHTML
+ s.created_at = (xml).at('created_at').innerHTML
+ s.user = User.new_from_xml(xml) if (xml).at('user')
end
end
end
View
17 lib/twitter/user.rb
@@ -1,20 +1,3 @@
-# The attributes for user are id, name, screen_name, status (which is a status object)
-# new_from_xml expects xml along the lines of:
-# <user>
-# <id>12796</id>
-# <name>William H Harle Jr.</name>
-# <screen_name>wharle</screen_name>
-# <location>South Bend, IN</location>
-# <description></description>
-# <profile_image_url>http://twitter.com/system/user/profile_image/12796/normal/Photo_248.jpg</profile_image_url>
-# <url>http://90percentgravity.com</url>
-# <status>
-# <created_at>Sat Jan 20 14:02:33 +0000 2007</created_at>
-# <id>3450573</id>
-# <text>proud of the weekend workout, day 4 of power 90 done</text>
-# <relative_created_at>about 15 hours ago</relative_created_at>
-# </status>
-# </user>
module Twitter
class User
include EasyClassMaker
View
4 lib/twitter/version.rb
@@ -1,8 +1,8 @@
module Twitter #:nodoc:
module VERSION #:nodoc:
MAJOR = 0
- MINOR = 0
- TINY = 5
+ MINOR = 1
+ TINY = 0
STRING = [MAJOR, MINOR, TINY].join('.')
end
View
BIN  pkg/twitter-0.0.1.gem
Binary file not shown
View
BIN  pkg/twitter-0.0.1.tgz
Binary file not shown
View
5 pkg/twitter-0.0.1/CHANGELOG
@@ -1,5 +0,0 @@
-0.0.5 - just a bit of code cleanup
-0.0.4 - added :location, :description, :url, :profile_image_url to user class (Alex Payne)
-0.0.3 - added a bit more informative message when things go wrong
-0.0.2 - added the command line options i forgot to add (friend and follower); improved some docs
-0.0.1 - initial release
View
12 pkg/twitter-0.0.1/Manifest.txt
@@ -1,12 +0,0 @@
-README
-CHANGELOG
-Rakefile
-setup.rb
-bin/twitter
-lib/twitter.rb
-lib/twitter/base.rb
-lib/twitter/command.rb
-lib/twitter/easy_class_maker.rb
-lib/twitter/status.rb
-lib/twitter/user.rb
-lib/twitter/version.rb
View
46 pkg/twitter-0.0.1/README
@@ -1,46 +0,0 @@
-addicted to twitter
-==================
-
-... a sweet little diddy that helps you twitter your life away
-
-
-== Command Line Use
-
-$ twitter
-
-That will show the commands and each command will either run or show you the options it needs to run
-
-$ twitter post "releasing my new twitter gem"
-
-That will post a status update to your twitter
-
-== Examples
-
- Twitter::Base.new('your email', 'your password').update('watching veronica mars')
-
- # or you can use post
- Twitter::Base.new('your email', 'your password').post('post works too')
-
- puts "Public Timeline", "=" * 50
- Twitter::Base.new('your email', 'your password').timeline(:public).each do |s|
- puts s.text, s.user.name
- puts
- end
-
- puts '', "Friends Timeline", "=" * 50
- Twitter::Base.new('your email', 'your password').timeline.each do |s|
- puts s.text, s.user.name
- puts
- end
-
- puts '', "Friends", "=" * 50
- Twitter::Base.new('your email', 'your password').friends.each do |u|
- puts u.name, u.status.text
- puts
- end
-
- puts '', "Followers", "=" * 50
- Twitter::Base.new('your email', 'your password').followers.each do |u|
- puts u.name, u.status.text
- puts
- end
View
57 pkg/twitter-0.0.1/Rakefile
@@ -1,57 +0,0 @@
-require 'rubygems'
-require 'rake'
-require 'rake/clean'
-require 'rake/testtask'
-require 'rake/packagetask'
-require 'rake/gempackagetask'
-require 'rake/rdoctask'
-require 'rake/contrib/rubyforgepublisher'
-require 'fileutils'
-require 'hoe'
-include FileUtils
-require File.join(File.dirname(__FILE__), 'lib', 'twitter', 'version')
-
-AUTHOR = "John Nunemaker" # can also be an array of Authors
-EMAIL = "nunemaker@gmail.com"
-DESCRIPTION = "a command line interface for twitter, also a library which wraps the twitter api"
-GEM_NAME = "twitter" # what ppl will type to install your gem
-RUBYFORGE_PROJECT = "twitter" # The unix name for your project
-HOMEPATH = "http://#{RUBYFORGE_PROJECT}.rubyforge.org"
-RELEASE_TYPES = %w( gem ) # can use: gem, tar, zip
-
-
-NAME = "twitter"
-REV = nil # UNCOMMENT IF REQUIRED: File.read(".svn/entries")[/committed-rev="(d+)"/, 1] rescue nil
-VERS = ENV['VERSION'] || (Twitter::VERSION::STRING + (REV ? ".#{REV}" : ""))
-CLEAN.include ['**/.*.sw?', '*.gem', '.config']
-RDOC_OPTS = ['--quiet', '--title', "twitter documentation",
- "--opname", "index.html",
- "--line-numbers",
- "--main", "README",
- "--inline-source"]
-
-# Generate all the Rake tasks
-# Run 'rake -T' to see list of generated tasks (from gem root directory)
-hoe = Hoe.new(GEM_NAME, VERS) do |p|
- p.author = AUTHOR
- p.description = DESCRIPTION
- p.email = EMAIL
- p.summary = DESCRIPTION
- p.url = HOMEPATH
- p.rubyforge_name = RUBYFORGE_PROJECT if RUBYFORGE_PROJECT
- p.test_globs = ["test/**/*_test.rb"]
- p.clean_globs = CLEAN #An array of file patterns to delete on clean.
-
- # == Optional
- #p.changes - A description of the release's latest changes.
- p.extra_deps = %w( hpricot )
- #p.spec_extras - A hash of extra values to set in the gemspec.
-end
-
-
-
-desc "Package and Install Gem"
-task :package_and_install do
- `rake package`
- `sudo gem install pkg/#{NAME}-#{VERS}.gem`
-end
View
35 pkg/twitter-0.0.1/bin/twitter
@@ -1,35 +0,0 @@
-#!/usr/bin/env ruby
-# = addicted to twitter
-#
-# ... a sweet little diddy that helps you twitter your life away from the command line
-#
-# == Install
-#
-# $ sudo gem install twitter
-#
-# == Command Line Use
-#
-# $ twitter
-#
-# Usage: twitter <command> [options]
-#
-# Available Commands:
-# - post
-# - timeline
-# - friends
-# - friend
-# - followers
-# - follower
-#
-# That will show the commands and each command will either run or show you the options it needs to run
-#
-# $ twitter post "releasing my new twitter gem"
-#
-# Got it! New twitter created at: Mon Nov 27 00:22:27 UTC 2006
-#
-# That will post a status update to your twitter
-require 'rubygems'
-require 'twitter'
-require 'twitter/command'
-
-Twitter::Command.process!
View
7 pkg/twitter-0.0.1/lib/twitter.rb
@@ -1,7 +0,0 @@
-%w(uri net/http yaml rubygems hpricot).each { |f| require f }
-
-require 'twitter/version'
-require 'twitter/easy_class_maker'
-require 'twitter/base'
-require 'twitter/user'
-require 'twitter/status'
View
93 pkg/twitter-0.0.1/lib/twitter/base.rb
@@ -1,93 +0,0 @@
-# This is the base class for the twitter library. It makes all the requests
-# to twitter, parses the xml (using hpricot) and returns ruby objects to play with.
-#
-# The private methods in this one are pretty fun. Be sure to check out users, statuses and call.
-module Twitter
- class Untwitterable < StandardError; end
- class CantConnect < Untwitterable; end
- class BadResponse < Untwitterable; end
- class UnknownTimeline < ArgumentError; end
-
- class Base
-
- # Twitter's url, duh!
- @@api_url = 'twitter.com'
-
- # Timelines exposed by the twitter api
- @@timelines = [:friends, :public]
-
- def self.timelines
- @@timelines
- end
-
- # Initializes the configuration for making requests to twitter
- def initialize(email, password)
- @config, @config[:email], @config[:password] = {}, email, password
- end
-
- # Returns an array of statuses for a timeline;
- # Available timelines are determined from the @@timelines variable
- # Defaults to your friends timeline
- def timeline(which=:friends)
- raise UnknownTimeline unless @@timelines.include?(which)
- auth = which.to_s.include?('public') ? false : true
- statuses(call("#{which}_timeline", :auth => auth))
- end
-
- # Returns an array of users who are in your friends list
- def friends
- users(call(:friends))
- end
-
- # Returns an array of users who are following you
- def followers
- users(call(:followers))
- end
-
- # Updates your twitter with whatever status string is passed in
- def post(status)
- url = URI.parse("http://#{@@api_url}/statuses/update.xml")
- req = Net::HTTP::Post.new(url.path)
-
- req.basic_auth(@config[:email], @config[:password])
- req.set_form_data({'status' => status})
-
- result = Net::HTTP.new(url.host, url.port).start { |http| http.request(req) }
- Status.new_from_xml(Hpricot.XML(result.body).at('status'))
- end
- alias :update :post
-
- private
- # Converts xml to an array of statuses
- def statuses(doc)
- (doc/:status).inject([]) { |statuses, status| statuses << Status.new_from_xml(status); statuses }
- end
-
- # Converts xml to an array of users
- def users(doc)
- (doc/:user).inject([]) { |users, user| users << User.new_from_xml(user); users }
- end
-
- # Calls whatever api method requested
- #
- # ie: call(:public_timeline, :auth => false)
- def call(method, arg_options={})
- options = { :auth => true }.merge(arg_options)
- path = "/statuses/#{method.to_s}.xml"
- headers = { "User-Agent" => @config[:email] }
-
- begin
- response = Net::HTTP.start(@@api_url, 80) do |http|
- req = Net::HTTP::Get.new(path, headers)
- req.basic_auth(@config[:email], @config[:password]) if options[:auth]
- http.request(req)
- end
-
- raise BadResponse unless response.message == 'OK'
- Hpricot.XML(response.body)
- rescue
- raise CantConnect
- end
- end
- end
-end
View
190 pkg/twitter-0.0.1/lib/twitter/command.rb
@@ -1,190 +0,0 @@
-# The command class is used for the command line interface.
-# It is only used and included in the bin/twitter file.
-module Twitter
- class Command
- @@commands = [:post, :timeline, :friends, :friend, :followers, :follower]
-
- @@template = <<EOF
-# .twitter
-#
-# Please fill in fields like this:
-#
-# email: bla@bla.com
-# password: secret
-#
-email:
-password:
-EOF
- @@error_msg = "Something went wrong!!!\n\nMost likely: The twitter gem requires hpricot version >= 0.4.59. Check to make sure that you have at least that version installed. To install the newest version of hpricot:\n\n sudo gem install hpricot --source http://code.whytheluckystiff.net"
-
- class << self
- def process!
- command = ARGV.shift
-
- case command
- when "post" then Command.post
- when "timeline" then Command.timeline
- when "friends" then Command.friends
- when "friend" then Command.friend
- when "followers" then Command.followers
- when "follower" then Command.follower
- else
- puts "\nUsage: twitter <command> [options]\n\nAvailable Commands:"
- Twitter::Command.commands.each do |com|
- puts " - #{com}"
- end
- end
- end
-
- def commands
- @@commands
- end
-
- # Posts an updated status to twitter
- def post
- config = create_or_find_config
-
- if ARGV.size == 0
- puts %(\n You didn't enter a message to post.\n\n Usage: twitter post "You're fabulous message"\n)
- exit(0)
- end
-
- post = ARGV.shift
-
- begin
- status = Twitter::Base.new(config['email'], config['password']).post(post)
- puts "\nGot it! New twitter created at: #{status.created_at}\n"
- rescue
- puts "\nTwitter what?. Something went wrong and your status could not be updated.\n"
- end
- end
-
- # Shows status, time and user for the specified timeline
- def timeline
- config = create_or_find_config
-
- timeline = :friends
- timeline = ARGV.shift.intern if ARGV.size > 0 && Twitter::Base.timelines.include?(ARGV[0].intern)
-
- begin
- puts
- Twitter::Base.new(config['email'], config['password']).timeline(timeline).each do |s|
- puts "#{s.text}\n-- #{s.relative_created_at} by #{s.user.name}"
- puts
- end
- rescue
- puts @@error_msg
- end
- end
-
- def friends
- config = create_or_find_config
-
- begin
- puts
- Twitter::Base.new(config['email'], config['password']).friends.each do |u|
- puts "#{u.name} (#{u.screen_name}) last updated #{u.status.relative_created_at}\n-- #{u.status.text}"
- puts
- end
- rescue
- puts @@error_msg
- end
- end
-
- # Shows last updated status and time for a friend
- # Needs a screen name
- def friend
- config = create_or_find_config
-
- if ARGV.size == 0
- puts %(\n You forgot to enter a screen name.\n\n Usage: twitter friend jnunemaker\n)
- exit(0)
- end
-
- screen_name = ARGV.shift
-
- begin
- puts
- found = false
- Twitter::Base.new(config['email'], config['password']).friends.each do |u|
- if u.screen_name == screen_name
- puts "#{u.name} last updated #{u.status.relative_created_at}\n-- #{u.status.text}"
- found = true
- end
- end
-
- unless found
- puts "Sorry couldn't find a friend of yours with #{screen_name} as a screen name"
- end
- puts
- rescue
- puts @@error_msg
- end
- end
-
- # Shows all followers and their last updated status
- def followers
- config = create_or_find_config
-
- begin
- puts
- Twitter::Base.new(config['email'], config['password']).followers.each do |u|
- puts "#{u.name} last updated #{u.status.relative_created_at}\n-- #{u.status.text}"
- puts
- end
- rescue
- puts @@error_msg
- end
- end
-
- # Shows last updated status and time for a follower
- # Needs a screen name
- def follower
- config = create_or_find_config
-
- if ARGV.size == 0
- puts %(\n You forgot to enter a screen name.\n\n Usage: twitter follower jnunemaker\n)
- exit(0)
- end
-
- screen_name = ARGV.shift
-
- begin
- puts
- found = false
- Twitter::Base.new(config['email'], config['password']).followers.each do |u|
- if u.screen_name == screen_name
- puts "#{u.name} (#{u.screen_name}) last updated #{u.status.relative_created_at}\n-- #{u.status.text}"
- found = true
- end
- end
-
- unless found
- puts "Sorry couldn't find a follower of yours with #{screen_name} as a screen name"
- end
- puts
- rescue
- puts @@error_msg
- end
- end
-
- private
- # Checks for the config, creates it if not found
- def create_or_find_config
- begin
- config = YAML::load open(ENV['HOME'] + "/.twitter")
- rescue
- open(ENV["HOME"] + '/.twitter','w').write(@@template)
- config = YAML::load open(ENV['HOME'] + "/.twitter")
- end
-
- if config['email'] == nil or config['password'] == nil
- puts "Please edit ~/.twitter to include your twitter email and password\nTextmate users: mate ~/.twitter"
- exit(0)
- end
-
- config
- end
- end
- end
-end
View
43 pkg/twitter-0.0.1/lib/twitter/easy_class_maker.rb
@@ -1,43 +0,0 @@
-# This is pretty much just a macro for creating a class that allows
-# using a block to initialize stuff and to define getters and setters
-# really quickly.
-module Twitter
- module EasyClassMaker
-
- def self.included(base)
- base.extend(ClassMethods)
- end
-
- module ClassMethods
- # creates the attributes class variable and creates each attribute's accessor methods
- def attributes(*attrs)
- @@attributes = attrs
- @@attributes.each { |a| attr_accessor a }
- end
-
- # read method for attributes class variable
- def self.attributes; @@attributes end
- end
-
- # allows for any class that includes this to use a block to initialize
- # variables instead of assigning each one seperately
- #
- # Example:
- #
- # instead of...
- #
- # s = Status.new
- # s.foo = 'thing'
- # s.bar = 'another thing'
- #
- # you can ...
- #
- # Status.new do |s|
- # s.foo = 'thing'
- # s.bar = 'another thing'
- # end
- def initialize
- yield self if block_given?
- end
- end
-end
View
33 pkg/twitter-0.0.1/lib/twitter/status.rb
@@ -1,33 +0,0 @@
-# The attributes are created_at, id, text, relative_created_at, and user (which is a user object)
-# new_from_xml expects xml along the lines of:
-# <status>
-# <id>1</id>
-# <created_at>a date</created_at>
-# <text>some text</text>
-# <relative_created_at>about 1 min ago</relative_created_at>
-# <user>
-# <id>1</id>
-# <name>John Nunemaker</name>
-# <screen_name>jnunemaker</screen_name>
-# </user>
-# </status>
-module Twitter
- class Status
- include EasyClassMaker
-
- attributes :created_at, :id, :text, :relative_created_at, :user
-
- class << self
- # Creates a new status from a piece of xml
- def new_from_xml(xml)
- Status.new do |s|
- s.id = (xml).at('id').innerHTML
- s.created_at = (xml).at('created_at').innerHTML
- s.text = (xml).at('text').innerHTML
- s.relative_created_at = (xml).at('relative_created_at').innerHTML
- s.user = User.new_from_xml(xml) if (xml).at('user')
- end
- end
- end
- end
-end
View
32 pkg/twitter-0.0.1/lib/twitter/user.rb
@@ -1,32 +0,0 @@
-# The attributes for user are id, name, screen_name, status (which is a status object)
-# new_from_xml expects xml along the lines of:
-# <user>
-# <id>1</id>
-# <name>John Nunemaker</name>
-# <screen_name>jnunemaker</screen_name>
-# <status>
-# <id>1</id>
-# <created_at>a date</created_at>
-# <text>some text</text>
-# <relative_created_at>about 1 min ago</relative_created_at>
-# </status>
-# </user>
-module Twitter
- class User
- include EasyClassMaker
-
- attributes :id, :name, :screen_name, :status
-
- class << self
- # Creates a new user from a piece of xml
- def new_from_xml(xml)
- User.new do |u|
- u.id = (xml).at('id').innerHTML
- u.name = (xml).at('name').innerHTML
- u.screen_name = (xml).at('screen_name').innerHTML
- u.status = Status.new_from_xml(xml) if (xml).at('status')
- end
- end
- end
- end
-end
View
9 pkg/twitter-0.0.1/lib/twitter/version.rb
@@ -1,9 +0,0 @@
-module Twitter #:nodoc:
- module VERSION #:nodoc:
- MAJOR = 0
- MINOR = 0
- TINY = 5
-
- STRING = [MAJOR, MINOR, TINY].join('.')
- end
-end
View
1,585 pkg/twitter-0.0.1/setup.rb
@@ -1,1585 +0,0 @@
-#
-# setup.rb
-#
-# Copyright (c) 2000-2005 Minero Aoki
-#
-# This program is free software.
-# You can distribute/modify this program under the terms of
-# the GNU LGPL, Lesser General Public License version 2.1.
-#
-
-unless Enumerable.method_defined?(:map) # Ruby 1.4.6
- module Enumerable
- alias map collect
- end
-end
-
-unless File.respond_to?(:read) # Ruby 1.6
- def File.read(fname)
- open(fname) {|f|
- return f.read
- }
- end
-end
-
-unless Errno.const_defined?(:ENOTEMPTY) # Windows?
- module Errno
- class ENOTEMPTY
- # We do not raise this exception, implementation is not needed.
- end
- end
-end
-
-def File.binread(fname)
- open(fname, 'rb') {|f|
- return f.read
- }
-end
-
-# for corrupted Windows' stat(2)
-def File.dir?(path)
- File.directory?((path[-1,1] == '/') ? path : path + '/')
-end
-
-
-class ConfigTable
-
- include Enumerable
-
- def initialize(rbconfig)
- @rbconfig = rbconfig
- @items = []
- @table = {}
- # options
- @install_prefix = nil
- @config_opt = nil
- @verbose = true
- @no_harm = false
- end
-
- attr_accessor :install_prefix
- attr_accessor :config_opt
-
- attr_writer :verbose
-
- def verbose?
- @verbose
- end
-
- attr_writer :no_harm
-
- def no_harm?
- @no_harm
- end
-
- def [](key)
- lookup(key).resolve(self)
- end
-
- def []=(key, val)
- lookup(key).set val
- end
-
- def names
- @items.map {|i| i.name }
- end
-
- def each(&block)
- @items.each(&block)
- end
-
- def key?(name)
- @table.key?(name)
- end
-
- def lookup(name)
- @table[name] or setup_rb_error "no such config item: #{name}"
- end
-
- def add(item)
- @items.push item
- @table[item.name] = item
- end
-
- def remove(name)
- item = lookup(name)
- @items.delete_if {|i| i.name == name }
- @table.delete_if {|name, i| i.name == name }
- item
- end
-
- def load_script(path, inst = nil)
- if File.file?(path)
- MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path
- end
- end
-
- def savefile
- '.config'
- end
-
- def load_savefile
- begin
- File.foreach(savefile()) do |line|
- k, v = *line.split(/=/, 2)
- self[k] = v.strip
- end
- rescue Errno::ENOENT
- setup_rb_error $!.message + "\n#{File.basename($0)} config first"
- end
- end
-
- def save
- @items.each {|i| i.value }
- File.open(savefile(), 'w') {|f|
- @items.each do |i|
- f.printf "%s=%s\n", i.name, i.value if i.value? and i.value
- end
- }
- end
-
- def load_standard_entries
- standard_entries(@rbconfig).each do |ent|
- add ent
- end
- end
-
- def standard_entries(rbconfig)
- c = rbconfig
-
- rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT'])
-
- major = c['MAJOR'].to_i
- minor = c['MINOR'].to_i
- teeny = c['TEENY'].to_i
- version = "#{major}.#{minor}"
-
- # ruby ver. >= 1.4.4?
- newpath_p = ((major >= 2) or
- ((major == 1) and
- ((minor >= 5) or
- ((minor == 4) and (teeny >= 4)))))
-
- if c['rubylibdir']
- # V > 1.6.3
- libruby = "#{c['prefix']}/lib/ruby"
- librubyver = c['rubylibdir']
- librubyverarch = c['archdir']
- siteruby = c['sitedir']
- siterubyver = c['sitelibdir']
- siterubyverarch = c['sitearchdir']
- elsif newpath_p
- # 1.4.4 <= V <= 1.6.3
- libruby = "#{c['prefix']}/lib/ruby"
- librubyver = "#{c['prefix']}/lib/ruby/#{version}"
- librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
- siteruby = c['sitedir']
- siterubyver = "$siteruby/#{version}"
- siterubyverarch = "$siterubyver/#{c['arch']}"
- else
- # V < 1.4.4
- libruby = "#{c['prefix']}/lib/ruby"
- librubyver = "#{c['prefix']}/lib/ruby/#{version}"
- librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}"
- siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby"
- siterubyver = siteruby
- siterubyverarch = "$siterubyver/#{c['arch']}"
- end
- parameterize = lambda {|path|
- path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix')
- }
-
- if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
- makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
- else
- makeprog = 'make'
- end
-
- [
- ExecItem.new('installdirs', 'std/site/home',
- 'std: install under libruby; site: install under site_ruby; home: install under $HOME')\
- {|val, table|
- case val
- when 'std'
- table['rbdir'] = '$librubyver'
- table['sodir'] = '$librubyverarch'
- when 'site'
- table['rbdir'] = '$siterubyver'
- table['sodir'] = '$siterubyverarch'
- when 'home'
- setup_rb_error '$HOME was not set' unless ENV['HOME']
- table['prefix'] = ENV['HOME']
- table['rbdir'] = '$libdir/ruby'
- table['sodir'] = '$libdir/ruby'
- end
- },
- PathItem.new('prefix', 'path', c['prefix'],
- 'path prefix of target environment'),
- PathItem.new('bindir', 'path', parameterize.call(c['bindir']),
- 'the directory for commands'),
- PathItem.new('libdir', 'path', parameterize.call(c['libdir']),
- 'the directory for libraries'),
- PathItem.new('datadir', 'path', parameterize.call(c['datadir']),
- 'the directory for shared data'),
- PathItem.new('mandir', 'path', parameterize.call(c['mandir']),
- 'the directory for man pages'),
- PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']),
- 'the directory for system configuration files'),
- PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']),
- 'the directory for local state data'),
- PathItem.new('libruby', 'path', libruby,
- 'the directory for ruby libraries'),
- PathItem.new('librubyver', 'path', librubyver,
- 'the directory for standard ruby libraries'),
- PathItem.new('librubyverarch', 'path', librubyverarch,
- 'the directory for standard ruby extensions'),
- PathItem.new('siteruby', 'path', siteruby,
- 'the directory for version-independent aux ruby libraries'),
- PathItem.new('siterubyver', 'path', siterubyver,
- 'the directory for aux ruby libraries'),
- PathItem.new('siterubyverarch', 'path', siterubyverarch,
- 'the directory for aux ruby binaries'),
- PathItem.new('rbdir', 'path', '$siterubyver',
- 'the directory for ruby scripts'),
- PathItem.new('sodir', 'path', '$siterubyverarch',
- 'the directory for ruby extentions'),
- PathItem.new('rubypath', 'path', rubypath,
- 'the path to set to #! line'),
- ProgramItem.new('rubyprog', 'name', rubypath,
- 'the ruby program using for installation'),
- ProgramItem.new('makeprog', 'name', makeprog,
- 'the make program to compile ruby extentions'),
- SelectItem.new('shebang', 'all/ruby/never', 'ruby',
- 'shebang line (#!) editing mode'),
- BoolItem.new('without-ext', 'yes/no', 'no',
- 'does not compile/install ruby extentions')
- ]
- end
- private :standard_entries
-
- def load_multipackage_entries
- multipackage_entries().each do |ent|
- add ent
- end
- end
-
- def multipackage_entries
- [
- PackageSelectionItem.new('with', 'name,name...', '', 'ALL',
- 'package names that you want to install'),
- PackageSelectionItem.new('without', 'name,name...', '', 'NONE',
- 'package names that you do not want to install')
- ]
- end
- private :multipackage_entries
-
- ALIASES = {
- 'std-ruby' => 'librubyver',
- 'stdruby' => 'librubyver',
- 'rubylibdir' => 'librubyver',
- 'archdir' => 'librubyverarch',
- 'site-ruby-common' => 'siteruby', # For backward compatibility
- 'site-ruby' => 'siterubyver', # For backward compatibility
- 'bin-dir' => 'bindir',
- 'bin-dir' => 'bindir',
- 'rb-dir' => 'rbdir',
- 'so-dir' => 'sodir',
- 'data-dir' => 'datadir',
- 'ruby-path' => 'rubypath',
- 'ruby-prog' => 'rubyprog',
- 'ruby' => 'rubyprog',
- 'make-prog' => 'makeprog',
- 'make' => 'makeprog'
- }
-
- def fixup
- ALIASES.each do |ali, name|
- @table[ali] = @table[name]
- end
- @items.freeze
- @table.freeze
- @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/
- end
-
- def parse_opt(opt)
- m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}"
- m.to_a[1,2]
- end
-
- def dllext
- @rbconfig['DLEXT']
- end
-
- def value_config?(name)
- lookup(name).value?
- end
-
- class Item
- def initialize(name, template, default, desc)
- @name = name.freeze
- @template = template
- @value = default
- @default = default
- @description = desc
- end
-
- attr_reader :name
- attr_reader :description
-
- attr_accessor :default
- alias help_default default
-
- def help_opt
- "--#{@name}=#{@template}"
- end
-
- def value?
- true
- end
-
- def value
- @value
- end
-
- def resolve(table)
- @value.gsub(%r<\$([^/]+)>) { table[$1] }
- end
-
- def set(val)
- @value = check(val)
- end
-
- private
-
- def check(val)
- setup_rb_error "config: --#{name} requires argument" unless val
- val
- end
- end
-
- class BoolItem < Item
- def config_type
- 'bool'
- end
-
- def help_opt
- "--#{@name}"
- end
-
- private
-
- def check(val)
- return 'yes' unless val
- case val
- when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes'
- when /\An(o)?\z/i, /\Af(alse)\z/i then 'no'
- else
- setup_rb_error "config: --#{@name} accepts only yes/no for argument"
- end
- end
- end
-
- class PathItem < Item
- def config_type
- 'path'
- end
-
- private
-
- def check(path)
- setup_rb_error "config: --#{@name} requires argument" unless path
- path[0,1] == '$' ? path : File.expand_path(path)
- end
- end
-
- class ProgramItem < Item
- def config_type
- 'program'
- end
- end
-
- class SelectItem < Item
- def initialize(name, selection, default, desc)
- super
- @ok = selection.split('/')
- end
-
- def config_type
- 'select'
- end
-
- private
-
- def check(val)
- unless @ok.include?(val.strip)
- setup_rb_error "config: use --#{@name}=#{@template} (#{val})"
- end
- val.strip
- end
- end
-
- class ExecItem < Item
- def initialize(name, selection, desc, &block)
- super name, selection, nil, desc
- @ok = selection.split('/')
- @action = block
- end
-
- def config_type
- 'exec'
- end
-
- def value?
- false
- end
-
- def resolve(table)
- setup_rb_error "$#{name()} wrongly used as option value"
- end
-
- undef set
-
- def evaluate(val, table)
- v = val.strip.downcase
- unless @ok.include?(v)
- setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})"
- end
- @action.call v, table
- end
- end
-
- class PackageSelectionItem < Item
- def initialize(name, template, default, help_default, desc)
- super name, template, default, desc
- @help_default = help_default
- end
-
- attr_reader :help_default
-
- def config_type
- 'package'
- end
-
- private
-
- def check(val)
- unless File.dir?("packages/#{val}")
- setup_rb_error "config: no such package: #{val}"
- end
- val
- end
- end
-
- class MetaConfigEnvironment
- def initialize(config, installer)
- @config = config
- @installer = installer
- end
-
- def config_names
- @config.names
- end
-
- def config?(name)
- @config.key?(name)
- end
-
- def bool_config?(name)
- @config.lookup(name).config_type == 'bool'
- end
-
- def path_config?(name)
- @config.lookup(name).config_type == 'path'
- end
-
- def value_config?(name)
- @config.lookup(name).config_type != 'exec'
- end
-
- def add_config(item)
- @config.add item
- end
-
- def add_bool_config(name, default, desc)
- @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc)
- end
-
- def add_path_config(name, default, desc)
- @config.add PathItem.new(name, 'path', default, desc)
- end
-
- def set_config_default(name, default)
- @config.lookup(name).default = default
- end
-
- def remove_config(name)
- @config.remove(name)
- end
-
- # For only multipackage
- def packages
- raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer
- @installer.packages
- end
-
- # For only multipackage
- def declare_packages(list)
- raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer
- @installer.packages = list
- end
- end
-
-end # class ConfigTable
-
-
-# This module requires: #verbose?, #no_harm?
-module FileOperations
-
- def mkdir_p(dirname, prefix = nil)
- dirname = prefix + File.expand_path(dirname) if prefix
- $stderr.puts "mkdir -p #{dirname}" if verbose?
- return if no_harm?
-
- # Does not check '/', it's too abnormal.
- dirs = File.expand_path(dirname).split(%r<(?=/)>)
- if /\A[a-z]:\z/i =~ dirs[0]
- disk = dirs.shift
- dirs[0] = disk + dirs[0]
- end
- dirs.each_index do |idx|
- path = dirs[0..idx].join('')
- Dir.mkdir path unless File.dir?(path)
- end
- end
-
- def rm_f(path)
- $stderr.puts "rm -f #{path}" if verbose?
- return if no_harm?
- force_remove_file path
- end
-
- def rm_rf(path)
- $stderr.puts "rm -rf #{path}" if verbose?
- return if no_harm?
- remove_tree path
- end
-
- def remove_tree(path)
- if File.symlink?(path)
- remove_file path
- elsif File.dir?(path)
- remove_tree0 path
- else
- force_remove_file path
- end
- end
-
- def remove_tree0(path)
- Dir.foreach(path) do |ent|
- next if ent == '.'
- next if ent == '..'
- entpath = "#{path}/#{ent}"
- if File.symlink?(entpath)
- remove_file entpath
- elsif File.dir?(entpath)
- remove_tree0 entpath
- else
- force_remove_file entpath
- end
- end
- begin
- Dir.rmdir path
- rescue Errno::ENOTEMPTY
- # directory may not be empty
- end
- end
-
- def move_file(src, dest)
- force_remove_file dest
- begin
- File.rename src, dest
- rescue
- File.open(dest, 'wb') {|f|
- f.write File.binread(src)
- }
- File.chmod File.stat(src).mode, dest
- File.unlink src
- end
- end
-
- def force_remove_file(path)
- begin
- remove_file path
- rescue
- end
- end
-
- def remove_file(path)
- File.chmod 0777, path
- File.unlink path
- end
-
- def install(from, dest, mode, prefix = nil)
- $stderr.puts "install #{from} #{dest}" if verbose?
- return if no_harm?
-
- realdest = prefix ? prefix + File.expand_path(dest) : dest
- realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest)
- str = File.binread(from)
- if diff?(str, realdest)
- verbose_off {
- rm_f realdest if File.exist?(realdest)
- }
- File.open(realdest, 'wb') {|f|
- f.write str
- }
- File.chmod mode, realdest
-
- File.open("#{objdir_root()}/InstalledFiles", 'a') {|f|
- if prefix
- f.puts realdest.sub(prefix, '')
- else
- f.puts realdest
- end
- }
- end
- end
-
- def diff?(new_content, path)
- return true unless File.exist?(path)
- new_content != File.binread(path)
- end
-
- def command(*args)
- $stderr.puts args.join(' ') if verbose?
- system(*args) or raise RuntimeError,
- "system(#{args.map{|a| a.inspect }.join(' ')}) failed"
- end
-
- def ruby(*args)
- command config('rubyprog'), *args
- end
-
- def make(task = nil)
- command(*[config('makeprog'), task].compact)
- end
-
- def extdir?(dir)
- File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb")
- end
-
- def files_of(dir)
- Dir.open(dir) {|d|
- return d.select {|ent| File.file?("#{dir}/#{ent}") }
- }
- end
-
- DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn )
-
- def directories_of(dir)
- Dir.open(dir) {|d|
- return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT
- }
- end
-
-end
-
-
-# This module requires: #srcdir_root, #objdir_root, #relpath
-module HookScriptAPI
-
- def get_config(key)
- @config[key]
- end
-
- alias config get_config
-
- # obsolete: use metaconfig to change configuration
- def set_config(key, val)
- @config[key] = val
- end
-
- #
- # srcdir/objdir (works only in the package directory)
- #
-
- def curr_srcdir
- "#{srcdir_root()}/#{relpath()}"
- end
-
- def curr_objdir
- "#{objdir_root()}/#{relpath()}"
- end
-
- def srcfile(path)
- "#{curr_srcdir()}/#{path}"
- end
-
- def srcexist?(path)
- File.exist?(srcfile(path))
- end
-
- def srcdirectory?(path)
- File.dir?(srcfile(path))
- end
-
- def srcfile?(path)
- File.file?(srcfile(path))
- end
-
- def srcentries(path = '.')
- Dir.open("#{curr_srcdir()}/#{path}") {|d|
- return d.to_a - %w(. ..)
- }
- end
-
- def srcfiles(path = '.')
- srcentries(path).select {|fname|
- File.file?(File.join(curr_srcdir(), path, fname))
- }
- end
-
- def srcdirectories(path = '.')
- srcentries(path).select {|fname|
- File.dir?(File.join(curr_srcdir(), path, fname))
- }
- end
-
-end
-
-
-class ToplevelInstaller
-
- Version = '3.4.1'
- Copyright = 'Copyright (c) 2000-2005 Minero Aoki'
-
- TASKS = [
- [ 'all', 'do config, setup, then install' ],
- [ 'config', 'saves your configurations' ],
- [ 'show', 'shows current configuration' ],
- [ 'setup', 'compiles ruby extentions and others' ],
- [ 'install', 'installs files' ],
- [ 'test', 'run all tests in test/' ],
- [ 'clean', "does `make clean' for each extention" ],
- [ 'distclean',"does `make distclean' for each extention" ]
- ]
-
- def ToplevelInstaller.invoke
- config = ConfigTable.new(load_rbconfig())
- config.load_standard_entries
- config.load_multipackage_entries if multipackage?
- config.fixup
- klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller)
- klass.new(File.dirname($0), config).invoke
- end
-
- def ToplevelInstaller.multipackage?
- File.dir?(File.dirname($0) + '/packages')
- end
-
- def ToplevelInstaller.load_rbconfig
- if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg }
- ARGV.delete(arg)
- load File.expand_path(arg.split(/=/, 2)[1])
- $".push 'rbconfig.rb'
- else
- require 'rbconfig'
- end
- ::Config::CONFIG
- end
-
- def initialize(ardir_root, config)
- @ardir = File.expand_path(ardir_root)
- @config = config
- # cache
- @valid_task_re = nil
- end
-
- def config(key)
- @config[key]
- end
-
- def inspect
- "#<#{self.class} #{__id__()}>"
- end
-
- def invoke
- run_metaconfigs
- case task = parsearg_global()
- when nil, 'all'
- parsearg_config
- init_installers
- exec_config
- exec_setup
- exec_install
- else
- case task
- when 'config', 'test'
- ;
- when 'clean', 'distclean'
- @config.load_savefile if File.exist?(@config.savefile)
- else
- @config.load_savefile
- end
- __send__ "parsearg_#{task}"
- init_installers
- __send__ "exec_#{task}"
- end
- end
-
- def run_metaconfigs
- @config.load_script "#{@ardir}/metaconfig"
- end
-
- def init_installers
- @installer = Installer.new(@config, @ardir, File.expand_path('.'))
- end
-
- #
- # Hook Script API bases
- #
-
- def srcdir_root
- @ardir
- end
-
- def objdir_root
- '.'
- end
-
- def relpath
- '.'
- end
-
- #
- # Option Parsing
- #
-
- def parsearg_global
- while arg = ARGV.shift
- case arg
- when /\A\w+\z/
- setup_rb_error "invalid task: #{arg}" unless valid_task?(arg)
- return arg
- when '-q', '--quiet'
- @config.verbose = false
- when '--verbose'
- @config.verbose = true
- when '--help'
- print_usage $stdout
- exit 0
- when '--version'
- puts "#{File.basename($0)} version #{Version}"
- exit 0
- when '--copyright'
- puts Copyright
- exit 0
- else
- setup_rb_error "unknown global option '#{arg}'"
- end
- end
- nil
- end
-
- def valid_task?(t)
- valid_task_re() =~ t
- end
-
- def valid_task_re
- @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/
- end
-
- def parsearg_no_options
- unless ARGV.empty?
- task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1)
- setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}"
- end
- end
-
- alias parsearg_show parsearg_no_options
- alias parsearg_setup parsearg_no_options
- alias parsearg_test parsearg_no_options
- alias parsearg_clean parsearg_no_options
- alias parsearg_distclean parsearg_no_options
-
- def parsearg_config
- evalopt = []
- set = []
- @config.config_opt = []
- while i = ARGV.shift
- if /\A--?\z/ =~ i
- @config.config_opt = ARGV.dup
- break
- end
- name, value = *@config.parse_opt(i)
- if @config.value_config?(name)
- @config[name] = value
- else
- evalopt.push [name, value]
- end
- set.push name
- end
- evalopt.each do |name, value|
- @config.lookup(name).evaluate value, @config
- end
- # Check if configuration is valid
- set.each do |n|
- @config[n] if @config.value_config?(n)
- end
- end
-
- def parsearg_install
- @config.no_harm = false
- @config.install_prefix = ''
- while a = ARGV.shift
- case a
- when '--no-harm'
- @config.no_harm = true
- when /\A--prefix=/
- path = a.split(/=/, 2)[1]
- path = File.expand_path(path) unless path[0,1] == '/'
- @config.install_prefix = path
- else
- setup_rb_error "install: unknown option #{a}"
- end
- end
- end
-
- def print_usage(out)
- out.puts 'Typical Installation Procedure:'
- out.puts " $ ruby #{File.basename $0} config"
- out.puts " $ ruby #{File.basename $0} setup"
- out.puts " # ruby #{File.basename $0} install (may require root privilege)"
- out.puts
- out.puts 'Detailed Usage:'
- out.puts " ruby #{File.basename $0} <global option>"
- out.puts " ruby #{File.basename $0} [<global options>] <task> [<task options>]"
-
- fmt = " %-24s %s\n"
- out.puts
- out.puts 'Global options:'
- out.printf fmt, '-q,--quiet', 'suppress message outputs'
- out.printf fmt, ' --verbose', 'output messages verbosely'
- out.printf fmt, ' --help', 'print this message'
- out.printf fmt, ' --version', 'print version and quit'
- out.printf fmt, ' --copyright', 'print copyright and quit'
- out.puts
- out.puts 'Tasks:'
- TASKS.each do |name, desc|
- out.printf fmt, name, desc
- end
-
- fmt = " %-24s %s [%s]\n"
- out.puts
- out.puts 'Options for CONFIG or ALL:'
- @config.each do |item|
- out.printf fmt, item.help_opt, item.description, item.help_default
- end
- out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's"
- out.puts
- out.puts 'Options for INSTALL:'
- out.printf fmt, '--no-harm', 'only display what to do if given', 'off'
- out.printf fmt, '--prefix=path', 'install path prefix', ''
- out.puts
- end
-
- #
- # Task Handlers
- #
-
- def exec_config
- @installer.exec_config
- @config.save # must be final
- end
-
- def exec_setup
- @installer.exec_setup
- end
-
- def exec_install
- @installer.exec_install
- end
-
- def exec_test
- @installer.exec_test
- end
-
- def exec_show
- @config.each do |i|
- printf "%-20s %s\n", i.name, i.value if i.value?
- end
- end
-
- def exec_clean
- @installer.exec_clean
- end
-
- def exec_distclean
- @installer.exec_distclean
- end
-
-end # class ToplevelInstaller
-
-
-class ToplevelInstallerMulti < ToplevelInstaller
-
- include FileOperations
-
- def initialize(ardir_root, config)
- super
- @packages = directories_of("#{@ardir}/packages")
- raise 'no package exists' if @packages.empty?
- @root_installer = Installer.new(@config, @ardir, File.expand_path('.'))
- end
-
- def run_metaconfigs
- @config.load_script "#{@ardir}/metaconfig", self
- @packages.each do |name|
- @config.load_script "#{@ardir}/packages/#{name}/metaconfig"
- end
- end
-
- attr_reader :packages
-
- def packages=(list)
- raise 'package list is empty' if list.empty?
- list.each do |name|
- raise "directory packages/#{name} does not exist"\
- unless File.dir?("#{@ardir}/packages/#{name}")
- end
- @packages = list
- end
-
- def init_installers
- @installers = {}
- @packages.each do |pack|
- @installers[pack] = Installer.new(@config,
- "#{@ardir}/packages/#{pack}",
- "packages/#{pack}")
- end
- with = extract_selection(config('with'))
- without = extract_selection(config('without'))
- @selected = @installers.keys.select {|name|
- (with.empty? or with.include?(name)) \
- and not without.include?(name)
- }
- end
-
- def extract_selection(list)
- a = list.split(/,/)
- a.each do |name|
- setup_rb_error "no such package: #{name}" unless @installers.key?(name)
- end
- a
- end
-
- def print_usage(f)
- super
- f.puts 'Inluded packages:'
- f.puts ' ' + @packages.sort.join(' ')
- f.puts
- end
-
- #
- # Task Handlers
- #
-
- def exec_config
- run_hook 'pre-config'
- each_selected_installers {|inst| inst.exec_config }
- run_hook 'post-config'
- @config.save # must be final
- end
-
- def exec_setup
- run_hook 'pre-setup'
- each_selected_installers {|inst| inst.exec_setup }
- run_hook 'post-setup'
- end
-
- def exec_install
- run_hook 'pre-install'
- each_selected_installers {|inst| inst.exec_install }
- run_hook 'post-install'
- end
-
- def exec_test
- run_hook 'pre-test'
- each_selected_installers {|inst| inst.exec_test }
- run_hook 'post-test'
- end
-
- def exec_clean
- rm_f @config.savefile
- run_hook 'pre-clean'
- each_selected_installers {|inst| inst.exec_clean }
- run_hook 'post-clean'
- end
-
- def exec_distclean
- rm_f @config.savefile
- run_hook 'pre-distclean'
- each_selected_installers {|inst| inst.exec_distclean }
- run_hook 'post-distclean'
- end
-
- #
- # lib
- #
-
- def each_selected_installers
- Dir.mkdir 'packages' unless File.dir?('packages')
- @selected.each do |pack|
- $stderr.puts "Processing the package `#{pack}' ..." if verbose?
- Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}")
- Dir.chdir "packages/#{pack}"
- yield @installers[pack]
- Dir.chdir '../..'
- end
- end
-
- def run_hook(id)
- @root_installer.run_hook id
- end
-
- # module FileOperations requires this
- def verbose?
- @config.verbose?
- end
-
- # module FileOperations requires this
- def no_harm?
- @config.no_harm?
- end
-
-end # class ToplevelInstallerMulti
-
-
-class Installer
-
- FILETYPES = %w( bin lib ext data conf man )
-
- include FileOperations
- include HookScriptAPI
-
- def initialize(config, srcroot, objroot)
- @config = config
- @srcdir = File.expand_path(srcroot)
- @objdir = File.expand_path(objroot)
- @currdir = '.'
- end
-
- def inspect
- "#<#{self.class} #{File.basename(@srcdir)}>"
- end
-
- def noop(rel)
- end
-
- #
- # Hook Script API base methods
- #
-
- def srcdir_root
- @srcdir
- end
-
- def objdir_root
- @objdir
- end
-
- def relpath
- @currdir
- end
-
- #
- # Config Access
- #
-
- # module FileOperations requires this
- def verbose?
- @config.verbose?
- end
-
- # module FileOperations requires this
- def no_harm?
- @config.no_harm?
- end
-
- def verbose_off
- begin
- save, @config.verbose = @config.verbose?, false
- yield
- ensure
- @config.verbose = save
- end
- end
-
- #
- # TASK config
- #
-
- def exec_config
- exec_task_traverse 'config'
- end
-
- alias config_dir_bin noop
- alias config_dir_lib noop
-
- def config_dir_ext(rel)
- extconf if extdir?(curr_srcdir())
- end
-
- alias config_dir_data noop
- alias config_dir_conf noop
- alias config_dir_man noop
-
- def extconf
- ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt
- end
-
- #
- # TASK setup
- #
-
- def exec_setup
- exec_task_traverse 'setup'
- end
-
- def setup_dir_bin(rel)
- files_of(curr_srcdir()).each do |fname|
- update_shebang_line "#{curr_srcdir()}/#{fname}"
- end
- end
-
- alias setup_dir_lib noop
-
- def setup_dir_ext(rel)
- make if extdir?(curr_srcdir())
- end
-
- alias setup_dir_data noop
- alias setup_dir_conf noop
- alias setup_dir_man noop
-
- def update_shebang_line(path)
- return if no_harm?
- return if config('shebang') == 'never'
- old = Shebang.load(path)
- if old
- $stderr.puts "warning: #{path}: Shebang line includes too many args. It is not portable and your program may not work." if old.args.size > 1
- new = new_shebang(old)
- return if new.to_s == old.to_s
- else
- return unless config('shebang') == 'all'
- new = Shebang.new(config('rubypath'))
- end
- $stderr.puts "updating shebang: #{File.basename(path)}" if verbose?
- open_atomic_writer(path) {|output|
- File.open(path, 'rb') {|f|
- f.gets if old # discard
- output.puts new.to_s
- output.print f.read
- }
- }
- end
-
- def new_shebang(old)
- if /\Aruby/ =~ File.basename(old.cmd)
- Shebang.new(config('rubypath'), old.args)
- elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby'
- Shebang.new(config('rubypath'), old.args[1..-1])
- else
- return old unless config('shebang') == 'all'
- Shebang.new(config('rubypath'))
- end
- end
-
- def open_atomic_writer(path, &block)
- tmpfile = File.basename(path) + '.tmp'
- begin
- File.open(tmpfile, 'wb', &block)
- File.rename tmpfile, File.basename(path)
- ensure
- File.unlink tmpfile if File.exist?(tmpfile)
- end
- end
-
- class Shebang
- def Shebang.load(path)
- line = nil
- File.open(path) {|f|
- line = f.gets
- }
- return nil unless /\A#!/ =~ line
- parse(line)
- end
-
- def Shebang.parse(line)
- cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ')
- new(cmd, args)
- end
-
- def initialize(cmd, args = [])
- @cmd = cmd
- @args = args
- end
-
- attr_reader :cmd
- attr_reader :args
-
- def to_s
- "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}")
- end
- end
-
- #
- # TASK install
- #
-
- def exec_install
- rm_f 'InstalledFiles'
- exec_task_traverse 'install'
- end
-