diff options
-rw-r--r-- | core/entity.rb | 36 | ||||
-rw-r--r-- | test/core/test_entity.rb | 47 |
2 files changed, 49 insertions, 34 deletions
diff --git a/core/entity.rb b/core/entity.rb index 508ed5fe..ac6025f4 100644 --- a/core/entity.rb +++ b/core/entity.rb @@ -19,17 +19,26 @@ class Message::Entity self end def self.filter(slug, &filter) - parent = @@filter[slug] - @@filter[slug] = lambda{ |s| - result = filter.call(parent.call(s)) - [:url, :face].each{ |key| - raise InvalidEntityError.new("entity key :#{key} required. but not exist. ##{message[:id]}(#{message.to_s})") unless result[key] } - result } + if @@filter.has_key?(slug) + parent = @@filter[slug] + @@filter[slug] = filter_wrap{ |s| filter.call(parent.call(s)) } + else + @@filter[slug] = filter_wrap &filter end self end + def self.filter_wrap(&filter) + ->(s) { + result = filter.call(s) + [:url, :face].each{ |key| + if defined? result[:message] + raise InvalidEntityError.new("entity key :#{key} required. but not exist", result[:message]) unless result[key] + else + raise RuntimeError, "entity key :#{key} required. but not exist" end } + result } end + def self.refresh @@linkrule = {} - @@filter = Hash.new(ret_nth) + @@filter = Hash.new(filter_wrap(&ret_nth)) filter(:urls){ |segment| segment[:face] ||= segment[:url] if UserConfig[:shrinkurl_expand] @@ -161,11 +170,14 @@ class Message::Entity if message[:entities] message[:entities].each{ |slug, children| children.each{ |link| - rule = @@linkrule[slug] || {} - entity = @@filter[slug].call(rule.merge({ :message => message, - :from => :message_entities}.merge(link))) - entity[:range] = get_range_by_face(entity) #indices_to_range(link[:indices]) - result << entity.freeze } } end + begin + rule = @@linkrule[slug] || {} + entity = @@filter[slug].call(rule.merge({ :message => message, + :from => :message_entities}.merge(link))) + entity[:range] = get_range_by_face(entity) #indices_to_range(link[:indices]) + result << entity.freeze + rescue InvalidEntityError, RuntimeError => exception + error exception end } } end result.sort_by{ |r| r[:range].first }.freeze end def get_range_by_face(link) diff --git a/test/core/test_entity.rb b/test/core/test_entity.rb index c57222e2..3f458965 100644 --- a/test/core/test_entity.rb +++ b/test/core/test_entity.rb @@ -1,9 +1,5 @@ # -*- coding: utf-8 -*- -require 'test/unit' -require 'rubygems' -require 'mocha' -require 'pp' require File.expand_path(File.dirname(__FILE__) + '/../helper') #require File.expand_path(File.dirname(__FILE__) + '/../utils') miquire :core, 'entity' @@ -165,23 +161,30 @@ class TC_Message < Test::Unit::TestCase assert_equal(tweet, entity.to_s.inspect) end -end + def test_7 + tweet = "@uebayasi I tried and it works as below:\n$ uname -srm\nNetBSD 6.0.1 amd64\n$ s ( ) { local b; b=1; echo $b; b=\"$@\"; echo $b; }\n$ s d e\n1\nd e" + mes = stub + mes.stubs(:to_show).returns(tweet) + mes.stubs(:[]).with(:id).returns(325862212793159680) + mes.stubs(:[]).with(:message).returns(tweet) + mes.stubs(:[]).with(:entities). + returns({ hashtags: [], + symbols: [{ indices: [103, 105], + text: "b"}, + { indices: [120, 122], + text: "b"}], + urls: [], + user_mentions: [{ id: 5864792, + id_str: "5864792", + indices: [0, 9], + name: "Masao Uebayashi", + screen_name: "uebayasi" }]}) + mes.stubs(:is_a?).with(Message).returns(true) + entity = Message::Entity.new(mes) + assert_kind_of(String, entity.to_s) + assert_equal(tweet, entity.to_s.inspect) + end + +end -# >> Loaded suite - -# >> Started -# >> .F... -# >> Finished in 0.015698 seconds. -# >> -# >> 1) Failure: -# >> test_2(TC_Message) -# >> [-:145:in `test_2' -# >> /usr/lib/ruby/gems/1.8/gems/mocha-0.9.12/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb:22:in `__send__' -# >> /usr/lib/ruby/gems/1.8/gems/mocha-0.9.12/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb:22:in `run']: -# >> <♥ Unfaithful by Rihanna #lastfm: http://www.last.fm/music/Rihanna/_/Unfaithful amazon: http://www.amazon.com/A-Girl-Like-Me/dp/B001144EBA?SubscriptionId=12CBBK5SPFDF9BJG9N82&tag=nickelscom-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B001144EBA> expected but was -# >> <♥ Unfaithful by Rihanna #lahttp://www.last.fm/music/Rihanna/_/Unfaithful3YP9Hq amhttp://www.amazon.com/A-Girl-Like-Me/dp/B001144EBA?SubscriptionId=12CBBK5SPFDF9BJG9N82&tag=nickelscom-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B001144EBA1tmPYb>. -# >> -# >> 5 tests, 9 assertions, 1 failures, 0 errors - -# >> <♥ Unfaithful by Rihanna #lastfm: http://www.last.fm/music/Rihanna/_/Unfaithful amazon: http://www.amazon.com/A-Girl-Like-Me/dp/B001144EBA?SubscriptionId=12CBBK5SPFDF9BJG9N82&tag=nickelscom-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B001144EBA> expected but was -# >> <♥ Unfaithful by Rihanna #lasthttp://www.last.fm/music/Rihanna/_/UnfaithfulP9Hq amazhttp://www.amazon.com/A-Girl-Like-Me/dp/B001144EBA?SubscriptionId=12CBBK5SPFDF9BJG9N82&tag=nickelscom-20&linkCode=xm2&camp=2025&creative=165953&creativeASIN=B001144EBAmPYb>. |