From cd469c1a5ef3a725447c37cee5a21b8a9ef29efd Mon Sep 17 00:00:00 2001 From: tomykaira Date: Sat, 24 Mar 2012 09:45:15 +0900 Subject: [PATCH 1/5] Add entities attr_reader to Twitter::Status --- lib/twitter/status.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/twitter/status.rb b/lib/twitter/status.rb index aee525aad..50c6ddb97 100644 --- a/lib/twitter/status.rb +++ b/lib/twitter/status.rb @@ -16,7 +16,7 @@ class Status < Twitter::Base :in_reply_to_screen_name, :in_reply_to_attrs_id, :in_reply_to_status_id, :in_reply_to_user_id, :iso_language_code, :profile_image_url, :retweet_count, :retweeted, :source, :text, :to_user, :to_user_id, :to_user_name, - :truncated + :truncated, :entities alias :favorited? :favorited alias :retweeted? :retweeted alias :truncated? :truncated From e487614b65a4206500e438c6f9dab10a6e50d65a Mon Sep 17 00:00:00 2001 From: tomykaira Date: Tue, 27 Mar 2012 15:36:14 +0900 Subject: [PATCH 2/5] Revert "Add entities attr_reader to Twitter::Status" This reverts commit cd469c1a5ef3a725447c37cee5a21b8a9ef29efd. --- lib/twitter/status.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/twitter/status.rb b/lib/twitter/status.rb index 50c6ddb97..aee525aad 100644 --- a/lib/twitter/status.rb +++ b/lib/twitter/status.rb @@ -16,7 +16,7 @@ class Status < Twitter::Base :in_reply_to_screen_name, :in_reply_to_attrs_id, :in_reply_to_status_id, :in_reply_to_user_id, :iso_language_code, :profile_image_url, :retweet_count, :retweeted, :source, :text, :to_user, :to_user_id, :to_user_name, - :truncated, :entities + :truncated alias :favorited? :favorited alias :retweeted? :retweeted alias :truncated? :truncated From 83107e2a2660702e48c5e38014bc6ee980e2b78e Mon Sep 17 00:00:00 2001 From: tomykaira Date: Tue, 27 Mar 2012 15:05:08 +0900 Subject: [PATCH 3/5] Create entity related value types --- lib/twitter/entity.rb | 7 +++++++ lib/twitter/entity/hashtag.rb | 7 +++++++ lib/twitter/entity/url.rb | 7 +++++++ lib/twitter/entity/user_mention.rb | 7 +++++++ 4 files changed, 28 insertions(+) create mode 100644 lib/twitter/entity.rb create mode 100644 lib/twitter/entity/hashtag.rb create mode 100644 lib/twitter/entity/url.rb create mode 100644 lib/twitter/entity/user_mention.rb diff --git a/lib/twitter/entity.rb b/lib/twitter/entity.rb new file mode 100644 index 000000000..bfd350084 --- /dev/null +++ b/lib/twitter/entity.rb @@ -0,0 +1,7 @@ +require 'twitter/base' + +module Twitter + class Entity < Twitter::Base + lazy_attr_reader :indices + end +end diff --git a/lib/twitter/entity/hashtag.rb b/lib/twitter/entity/hashtag.rb new file mode 100644 index 000000000..8b59778d8 --- /dev/null +++ b/lib/twitter/entity/hashtag.rb @@ -0,0 +1,7 @@ +require 'twitter/entity' + +module Twitter + class Entity::Hashtag < Twitter::Entity + lazy_attr_reader :text + end +end diff --git a/lib/twitter/entity/url.rb b/lib/twitter/entity/url.rb new file mode 100644 index 000000000..863d2fe77 --- /dev/null +++ b/lib/twitter/entity/url.rb @@ -0,0 +1,7 @@ +require 'twitter/entity' + +module Twitter + class Entity::Url < Twitter::Entity + lazy_attr_reader :display_url, :expanded_url, :url + end +end diff --git a/lib/twitter/entity/user_mention.rb b/lib/twitter/entity/user_mention.rb new file mode 100644 index 000000000..0498bf12f --- /dev/null +++ b/lib/twitter/entity/user_mention.rb @@ -0,0 +1,7 @@ +require 'twitter/entity' + +module Twitter + class Entity::UserMention < Twitter::Entity + lazy_attr_reader :screen_name, :name, :id, :id_str + end +end From 3478ec749f716bb9169dd65f2dc8f9ffce7eeb7f Mon Sep 17 00:00:00 2001 From: tomykaira Date: Tue, 27 Mar 2012 15:22:59 +0900 Subject: [PATCH 4/5] Implement Twitter::Status#urls --- lib/twitter/status.rb | 22 ++++++++++++++++++++++ spec/twitter/status_spec.rb | 17 +++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/lib/twitter/status.rb b/lib/twitter/status.rb index aee525aad..7c120c0a3 100644 --- a/lib/twitter/status.rb +++ b/lib/twitter/status.rb @@ -8,9 +8,18 @@ require 'twitter/oembed' require 'twitter/place' require 'twitter/user' +require 'twitter/entity/url' +require 'twitter/entity/user_mention' +require 'twitter/entity/hashtag' module Twitter class Status < Twitter::Base + class NoEntityError < StandardError + def initialize + super("Entities are not available. Pass :include_entities => true on fetching the Twitter::Status object") + end + end + include Twitter::Creatable lazy_attr_reader :favorited, :from_user, :from_user_id, :from_user_name, :id, :in_reply_to_screen_name, :in_reply_to_attrs_id, :in_reply_to_status_id, @@ -76,5 +85,18 @@ def oembed(options={}) @client.oembed(@attrs['id'], options) unless @attrs['id'].nil? end + # @note Must :include_entities in your request for this method to work + # @return [Array] + # @raise [Twitter::Status::NoEntityError] Error raised when entities are not available + def urls + @urls ||= if @attrs['entities'].nil? + raise NoEntityError + else + Array(@attrs['entities']['urls']).map do |url| + Twitter::Entity::Url.new(url) + end + end + end + end end diff --git a/spec/twitter/status_spec.rb b/spec/twitter/status_spec.rb index 1e6c35418..c520e864d 100644 --- a/spec/twitter/status_spec.rb +++ b/spec/twitter/status_spec.rb @@ -145,4 +145,21 @@ end end + describe "#urls" do + it "should return an Array of Entity::Url when entities are set" do + urls_hash = [{'url' => 'http://example.com/t.co', + 'expanded_url' => 'http://example.com/expanded', + 'display_url' => 'example.com/expanded', + 'indices' => [10, 33]}] + urls = Twitter::Status.new('entities' => {'urls' => urls_hash}).urls + urls.should be_an Array + urls.first.should be_an Twitter::Entity::Url + urls.first.indices.should == [10, 33] + urls.first.display_url.should == 'example.com/expanded' + end + it "should raise NoEntityError when entities are not set" do + expect { Twitter::Status.new.urls }.to raise_error(Twitter::Status::NoEntityError) + end + end + end From 2d20f2304b4882f42a937718f13e1d742dcca885 Mon Sep 17 00:00:00 2001 From: tomykaira Date: Tue, 27 Mar 2012 15:30:15 +0900 Subject: [PATCH 5/5] Implement Twitter::Status#hastags and #user_mentions in the same manner as #urls --- lib/twitter/status.rb | 26 ++++++++++++++++++++++++++ spec/twitter/status_spec.rb | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/lib/twitter/status.rb b/lib/twitter/status.rb index 7c120c0a3..0903853e9 100644 --- a/lib/twitter/status.rb +++ b/lib/twitter/status.rb @@ -98,5 +98,31 @@ def urls end end + # @note Must :include_entities in your request for this method to work + # @return [Array] + # @raise [Twitter::Status::NoEntityError] Error raised when entities are not available + def hashtags + @hashtags ||= if @attrs['entities'].nil? + raise NoEntityError + else + Array(@attrs['entities']['hashtags']).map do |hashtag| + Twitter::Entity::Hashtag.new(hashtag) + end + end + end + + # @note Must :include_entities in your request for this method to work + # @return [Array] + # @raise [Twitter::Status::NoEntityError] Error raised when entities are not available + def user_mentions + @user_mentions ||= if @attrs['entities'].nil? + raise NoEntityError + else + Array(@attrs['entities']['user_mentions']).map do |user_mention| + Twitter::Entity::UserMention.new(user_mention) + end + end + end + end end diff --git a/spec/twitter/status_spec.rb b/spec/twitter/status_spec.rb index c520e864d..04b869999 100644 --- a/spec/twitter/status_spec.rb +++ b/spec/twitter/status_spec.rb @@ -162,4 +162,37 @@ end end + describe "#hashtags" do + it "should return an Array of Entity::Hashtag when entities are set" do + hashtags_hash = [{'text' => 'twitter', + 'indices' => [10, 33]}] + hashtags = Twitter::Status.new('entities' => {'hashtags' => hashtags_hash}).hashtags + hashtags.should be_an Array + hashtags.first.should be_an Twitter::Entity::Hashtag + hashtags.first.indices.should == [10, 33] + hashtags.first.text.should == 'twitter' + end + it "should raise NoEntityError when entities are not set" do + expect { Twitter::Status.new.hashtags }.to raise_error(Twitter::Status::NoEntityError) + end + end + + describe "#user_mentions" do + it "should return an Array of Entity::User_Mention when entities are set" do + user_mentions_hash = [{'screen_name'=>'sferik', + 'name'=>'Erik Michaels-Ober', + 'id_str'=>'7505382', + 'indices'=>[0, 6], + 'id'=>7505382}] + user_mentions = Twitter::Status.new('entities' => {'user_mentions' => user_mentions_hash}).user_mentions + user_mentions.should be_an Array + user_mentions.first.should be_an Twitter::Entity::UserMention + user_mentions.first.indices.should == [0, 6] + user_mentions.first.screen_name.should == 'sferik' + end + it "should raise NoEntityError when entities are not set" do + expect { Twitter::Status.new.user_mentions }.to raise_error(Twitter::Status::NoEntityError) + end + end + end