diff --git a/bin/twhois b/bin/twhois index b142510..dcc6735 100755 --- a/bin/twhois +++ b/bin/twhois @@ -4,25 +4,32 @@ require 'twhois' if ARGV.size > 0 ARGV.each do |username| - user = Twhois.lookup(username) - if user - puts "@#{user.screen_name}:" - puts " Name: #{user.name}" - puts " URL: #{user.url}" if user.url - puts " Location: #{user.location}" if user.location - puts " Description: #{user.description}" if user.description - puts " Followers: #{user.followers_count}" - puts " Following: #{user.friends_count}" - puts " Tweets: #{user.statuses_count}" - puts " Last Tweet (#{user.status['created_at']}):" - puts " #{user.status['text']}" - puts " Timezone: #{user.time_zone}" if user.time_zone - puts " Joined On: #{user.created_at}" - puts " Profile Picture: #{user.profile_image_url}" - puts " Private Account: #{user.protected ? "Yes" : "No"}" - else - puts "@#{username}:" - puts " Not Found" + begin + user = Twhois.lookup(username) + if user + puts "@#{user.screen_name}:" + puts " Name: #{user.name}" + puts " URL: #{user.url}" if user.respond_to?(:url) + puts " Profile: http://twitter.com/#{user.screen_name}" + puts " Location: #{user.location}" if user.respond_to?(:location) + puts " Description: #{user.description}" if user.respond_to?(:description) + puts " Followers: #{user.followers_count}" + puts " Following: #{user.friends_count}" + puts " Tweets: #{user.statuses_count}" + if user.respond_to?(:status) + puts " Last Tweet (#{user.status['created_at']}):" + puts " #{user.status['text']}" + end + puts " Timezone: #{user.time_zone}" if user.respond_to?(:time_zone) + puts " Joined On: #{user.created_at}" + puts " Profile Picture: #{user.profile_image_url}" + puts " Private Account: #{user.protected ? "Yes" : "No"}" + else + puts "@#{username}:" + puts " Not Found" + end + rescue Twhois::InvalidUsername => e + puts "\"#{username}\" is not a valid Twitter username" end end else diff --git a/lib/twhois.rb b/lib/twhois.rb index 5e4db43..c6007b0 100644 --- a/lib/twhois.rb +++ b/lib/twhois.rb @@ -12,12 +12,20 @@ module Twhois LOOKUP_HOST = "api.twitter.com" LOOKUP_PATH = "/1/users/show.json?screen_name=" + class InvalidUsername < StandardError; end + # Lookup a Twitter user by their username. def self.lookup(username) + raise InvalidUsername, "Username is invalid" unless valid_username?(username) res = Net::HTTP.start(LOOKUP_HOST) { |http| http.get(LOOKUP_PATH + username) } if res.code == '200' User.new(JSON.parse(res.body)) end end + def self.valid_username?(username) + return false if username.match(/^[a-zA-Z0-9_]{1,15}$/).nil? + return true + end + end diff --git a/spec/twhois_spec.rb b/spec/twhois_spec.rb index 5a562d6..a456f19 100644 --- a/spec/twhois_spec.rb +++ b/spec/twhois_spec.rb @@ -18,8 +18,18 @@ describe Twhois do end it "should return error on unknown user" do - user = Twhois.lookup('jimehoawhefoahelfhasdf') + user = Twhois.lookup('akjsdfkjasdfasd') user.should be_nil end + it "should raise an exception on invalid usernames" do + lambda { # invalid characters + user = Twhois.lookup("abc/damn") + }.should raise_error(Twhois::InvalidUsername) + + lambda { # longer than 15 characters + user = Twhois.lookup("abcasdjfakajsdfasdfasdfa") + }.should raise_error(Twhois::InvalidUsername) + end + end \ No newline at end of file