aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/entity.rb36
-rw-r--r--test/core/test_entity.rb47
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']:
-# >> <&#9829; 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
-# >> <&#9829; 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
-
-# >> <&#9829; 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
-# >> <&#9829; 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>.