twitter-text 1.14.7 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -34,7 +34,7 @@ RSpec::Matchers.define :match_autolink_expression_in do |text|
34
34
  @match_data && @match_data.to_s.strip == url
35
35
  end
36
36
 
37
- failure_message_for_should do |url|
37
+ failure_message do |url|
38
38
  "Expected to find url '#{url}' in text '#{text}', but the match was #{@match_data.captures}'"
39
39
  end
40
40
  end
@@ -47,7 +47,7 @@ RSpec::Matchers.define :have_autolinked_url do |url, inner_text|
47
47
  (inner_text && @link.inner_text == inner_text) || (!inner_text && @link.inner_text == url)
48
48
  end
49
49
 
50
- failure_message_for_should do |text|
50
+ failure_message do |text|
51
51
  "Expected url '#{url}'#{", inner_text '#{inner_text}'" if inner_text} to be autolinked in '#{text}'"
52
52
  end
53
53
  end
@@ -57,12 +57,11 @@ RSpec::Matchers.define :link_to_screen_name do |screen_name, inner_text|
57
57
 
58
58
  match do |text|
59
59
  @link = Nokogiri::HTML(text).search("a.username")
60
- @link &&
61
- @link.inner_text == expected &&
62
- "https://twitter.com/#{screen_name}".should == @link.first['href']
60
+ return false unless @link && @link.inner_text == expected
61
+ expect("https://twitter.com/#{screen_name}").to eq(@link.first['href'])
63
62
  end
64
63
 
65
- failure_message_for_should do |text|
64
+ failure_message do |text|
66
65
  if @link.first
67
66
  "Expected link '#{@link.inner_text}' with href '#{@link.first['href']}' to match screen_name '#{expected}', but it does not."
68
67
  else
@@ -70,7 +69,7 @@ RSpec::Matchers.define :link_to_screen_name do |screen_name, inner_text|
70
69
  end
71
70
  end
72
71
 
73
- failure_message_for_should_not do |text|
72
+ failure_message_when_negated do |text|
74
73
  "Expected link '#{@link.inner_text}' with href '#{@link.first['href']}' not to match screen_name '#{expected}', but it does."
75
74
  end
76
75
 
@@ -84,12 +83,11 @@ RSpec::Matchers.define :link_to_list_path do |list_path, inner_text|
84
83
 
85
84
  match do |text|
86
85
  @link = Nokogiri::HTML(text).search("a.list-slug")
87
- @link &&
88
- @link.inner_text == expected &&
89
- "https://twitter.com/#{list_path}".downcase.should == @link.first['href']
86
+ return false unless @link && @link.inner_text == expected
87
+ expect("https://twitter.com/#{list_path}".downcase).to eq(@link.first['href'])
90
88
  end
91
89
 
92
- failure_message_for_should do |text|
90
+ failure_message do |text|
93
91
  if @link.first
94
92
  "Expected link '#{@link.inner_text}' with href '#{@link.first['href']}' to match the list path '#{expected}', but it does not."
95
93
  else
@@ -97,7 +95,7 @@ RSpec::Matchers.define :link_to_list_path do |list_path, inner_text|
97
95
  end
98
96
  end
99
97
 
100
- failure_message_for_should_not do |text|
98
+ failure_message_when_negated do |text|
101
99
  "Expected link '#{@link.inner_text}' with href '#{@link.first['href']}' not to match the list path '#{expected}', but it does."
102
100
  end
103
101
 
@@ -108,13 +106,13 @@ end
108
106
 
109
107
  RSpec::Matchers.define :have_autolinked_hashtag do |hashtag|
110
108
  match do |text|
111
- @link = Nokogiri::HTML(text).search("a[@href='https://twitter.com/#!/search?q=#{hashtag.sub(/^#/, '%23')}']")
109
+ @link = Nokogiri::HTML(text).search("a[@href='https://twitter.com/search?q=#{hashtag.sub(/^#/, '%23')}']")
112
110
  @link &&
113
111
  @link.inner_text &&
114
112
  @link.inner_text == hashtag
115
113
  end
116
114
 
117
- failure_message_for_should do |text|
115
+ failure_message do |text|
118
116
  if @link.first
119
117
  "Expected link text to be [#{hashtag}], but it was [#{@link.inner_text}] in #{text}"
120
118
  else
@@ -122,7 +120,7 @@ RSpec::Matchers.define :have_autolinked_hashtag do |hashtag|
122
120
  end
123
121
  end
124
122
 
125
- failure_message_for_should_not do |text|
123
+ failure_message_when_negated do |text|
126
124
  "Expected link '#{@link.inner_text}' with href '#{@link.first['href']}' not to match the hashtag '#{hashtag}', but it does."
127
125
  end
128
126
  end
@@ -10,6 +10,8 @@ module TestUrls
10
10
  "http://somedomain.com/index.php?path=/abc/def/",
11
11
  "http://www.boingboing.net/2007/02/14/katamari_damacy_phon.html",
12
12
  "http://somehost.com:3000",
13
+ "http://a_b.c-d.com",
14
+ "http://sub_domain-dash.twitter.com",
13
15
  "http://xo.com/~matthew+%-x",
14
16
  "http://en.wikipedia.org/wiki/Primer_(film)",
15
17
  "http://www.ams.org/bookstore-getitem/item=mbk-59",
@@ -22,9 +24,7 @@ module TestUrls
22
24
  "http://mrs.domain-dash.biz",
23
25
  "http://x.com/has/one/char/domain",
24
26
  "http://t.co/nwcLTFF",
25
- "http://sub_domain-dash.twitter.com",
26
27
  "http://a.b.cd",
27
- "http://a_b.c-d.com",
28
28
  "http://a-b.b.com",
29
29
  "http://twitter-dash.com",
30
30
  "http://msdn.microsoft.com/ja-jp/library/system.net.httpwebrequest(v=VS.100).aspx",
@@ -36,7 +36,8 @@ module TestUrls
36
36
  "http://foobar.みんな",
37
37
  "http://foobar.中国",
38
38
  "http://foobar.پاکستان",
39
- "https://www.youtube.com/playlist?list=PL0ZPu8XSRTB7wZzn0mLHMvyzVFeRxbWn-"
39
+ "https://www.youtube.com/playlist?list=PL0ZPu8XSRTB7wZzn0mLHMvyzVFeRxbWn-",
40
+ "http://ああ.com"
40
41
  ] unless defined?(TestUrls::VALID)
41
42
 
42
43
  INVALID = [
@@ -56,7 +57,8 @@ module TestUrls
56
57
  "http://twitt#{[0x202B].pack('U')}er.com",
57
58
  "http://twitt#{[0x202C].pack('U')}er.com",
58
59
  "http://twitt#{[0x202D].pack('U')}er.com",
59
- "http://twitt#{[0x202E].pack('U')}er.com"
60
+ "http://twitt#{[0x202E].pack('U')}er.com",
61
+ "https://somesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurl.com/foo https://somesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurl.com/foo https://somesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurlsomesuperlongurl.com/foo"
60
62
  ] unless defined?(TestUrls::INVALID)
61
63
 
62
64
  TCO = [
@@ -13,9 +13,9 @@ if major.to_i == 1 && minor.to_i < 9
13
13
  end
14
14
 
15
15
  it "should raise with invalid KCODE on Ruby < 1.9" do
16
- lambda do
16
+ expect(lambda do
17
17
  require 'twitter-text'
18
- end.should raise_error
18
+ end).to raise_error
19
19
  end
20
20
  end
21
21
  end
@@ -4,28 +4,28 @@ require File.dirname(__FILE__) + '/spec_helper'
4
4
  describe Twitter::Unicode do
5
5
 
6
6
  it "should lazy-init constants" do
7
- Twitter::Unicode.const_defined?(:UFEB6).should == false
8
- Twitter::Unicode::UFEB6.should_not be_nil
9
- Twitter::Unicode::UFEB6.should be_kind_of(String)
10
- Twitter::Unicode.const_defined?(:UFEB6).should == true
7
+ expect(Twitter::Unicode.const_defined?(:UFEB6)).to eq(false)
8
+ expect(Twitter::Unicode::UFEB6).to_not be_nil
9
+ expect(Twitter::Unicode::UFEB6).to be_kind_of(String)
10
+ expect(Twitter::Unicode.const_defined?(:UFEB6)).to eq(true)
11
11
  end
12
12
 
13
13
  it "should return corresponding character" do
14
- Twitter::Unicode::UFEB6.should == [0xfeb6].pack('U')
14
+ expect(Twitter::Unicode::UFEB6).to be == [0xfeb6].pack('U')
15
15
  end
16
16
 
17
17
  it "should allow lowercase notation" do
18
- Twitter::Unicode::Ufeb6.should == Twitter::Unicode::UFEB6
19
- Twitter::Unicode::Ufeb6.should === Twitter::Unicode::UFEB6
18
+ expect(Twitter::Unicode::Ufeb6).to be == Twitter::Unicode::UFEB6
19
+ expect(Twitter::Unicode::Ufeb6).to be === Twitter::Unicode::UFEB6
20
20
  end
21
21
 
22
22
  it "should allow underscore notation" do
23
- Twitter::Unicode::U_FEB6.should == Twitter::Unicode::UFEB6
24
- Twitter::Unicode::U_FEB6.should === Twitter::Unicode::UFEB6
23
+ expect(Twitter::Unicode::U_FEB6).to be == Twitter::Unicode::UFEB6
24
+ expect(Twitter::Unicode::U_FEB6).to be === Twitter::Unicode::UFEB6
25
25
  end
26
26
 
27
27
  it "should raise on invalid codepoints" do
28
- lambda { Twitter::Unicode::FFFFFF }.should raise_error(NameError)
28
+ expect(lambda { Twitter::Unicode::FFFFFF }).to raise_error(NameError)
29
29
  end
30
30
 
31
31
  end
@@ -8,36 +8,60 @@ end
8
8
  describe Twitter::Validation do
9
9
 
10
10
  it "should disallow invalid BOM character" do
11
- TestValidation.new.tweet_invalid?("Bom:#{Twitter::Unicode::UFFFE}").should == :invalid_characters
12
- TestValidation.new.tweet_invalid?("Bom:#{Twitter::Unicode::UFEFF}").should == :invalid_characters
11
+ expect(TestValidation.new.tweet_invalid?("Bom:#{Twitter::Unicode::UFFFE}")).to be == :invalid_characters
12
+ expect(TestValidation.new.tweet_invalid?("Bom:#{Twitter::Unicode::UFEFF}")).to be == :invalid_characters
13
13
  end
14
14
 
15
15
  it "should disallow invalid U+FFFF character" do
16
- TestValidation.new.tweet_invalid?("Bom:#{Twitter::Unicode::UFFFF}").should == :invalid_characters
16
+ expect(TestValidation.new.tweet_invalid?("Bom:#{Twitter::Unicode::UFFFF}")).to be == :invalid_characters
17
17
  end
18
18
 
19
19
  it "should disallow direction change characters" do
20
20
  [0x202A, 0x202B, 0x202C, 0x202D, 0x202E].map{|cp| [cp].pack('U') }.each do |char|
21
- TestValidation.new.tweet_invalid?("Invalid:#{char}").should == :invalid_characters
21
+ expect(TestValidation.new.tweet_invalid?("Invalid:#{char}")).to eq(:invalid_characters)
22
22
  end
23
23
  end
24
24
 
25
25
  it "should disallow non-Unicode" do
26
- TestValidation.new.tweet_invalid?("not-Unicode:\xfff0").should == :invalid_characters
26
+ expect(TestValidation.new.tweet_invalid?("not-Unicode:\xfff0")).to be == :invalid_characters
27
27
  end
28
28
 
29
29
  it "should allow <= 140 combined accent characters" do
30
30
  char = [0x65, 0x0301].pack('U')
31
- TestValidation.new.tweet_invalid?(char * 139).should == false
32
- TestValidation.new.tweet_invalid?(char * 140).should == false
33
- TestValidation.new.tweet_invalid?(char * 141).should == :too_long
31
+ expect(TestValidation.new.tweet_invalid?(char * 139)).to be false
32
+ expect(TestValidation.new.tweet_invalid?(char * 140)).to be false
33
+ expect(TestValidation.new.tweet_invalid?(char * 141)).to eq(:too_long)
34
34
  end
35
35
 
36
36
  it "should allow <= 140 multi-byte characters" do
37
37
  char = [ 0x1d106 ].pack('U')
38
- TestValidation.new.tweet_invalid?(char * 139).should == false
39
- TestValidation.new.tweet_invalid?(char * 140).should == false
40
- TestValidation.new.tweet_invalid?(char * 141).should == :too_long
38
+ expect(TestValidation.new.tweet_invalid?(char * 139)).to be false
39
+ expect(TestValidation.new.tweet_invalid?(char * 140)).to be false
40
+ expect(TestValidation.new.tweet_invalid?(char * 141)).to eq(:too_long)
41
41
  end
42
42
 
43
+ context "when returning results" do
44
+ it "should properly create new fully-populated results from arguments" do
45
+ results = Twitter::Validation::ParseResults.new(weighted_length: 26, permillage: 92, valid: true, display_range_start: 0, display_range_end: 16, valid_range_start: 0, valid_range_end:16)
46
+ expect(results).to_not be nil
47
+ expect(results[:weighted_length]).to eq(26)
48
+ expect(results[:permillage]).to eq(92)
49
+ expect(results[:valid]).to be true
50
+ expect(results[:display_range_start]).to eq(0)
51
+ expect(results[:display_range_end]).to eq(16)
52
+ expect(results[:valid_range_start]).to eq(0)
53
+ expect(results[:valid_range_end]).to eq(16)
54
+ end
55
+
56
+ it "should properly create empty results" do
57
+ results = Twitter::Validation::ParseResults.empty()
58
+ expect(results[:weighted_length]).to eq(0)
59
+ expect(results[:permillage]).to eq(0)
60
+ expect(results[:valid]).to be true
61
+ expect(results[:display_range_start]).to eq(0)
62
+ expect(results[:display_range_end]).to eq(0)
63
+ expect(results[:valid_range_start]).to eq(0)
64
+ expect(results[:valid_range_end]).to eq(0)
65
+ end
66
+ end
43
67
  end
@@ -62,6 +62,16 @@ class ConformanceTest < Test::Unit::TestCase
62
62
  element.attribute_nodes.map{|attr| [attr.name, attr.value]}.sort
63
63
  end
64
64
 
65
+ def assert_equal_parse_results(expected, actual, failure_message = nil)
66
+ e = {}
67
+ # Note that we don't assert display and valid ranges because of differences
68
+ # in how ruby counts characters (wrt surrogate pairs) vs. other platforms
69
+ range_keys = [:display_range_start, :display_range_end, :valid_range_start, :valid_range_end]
70
+ expected.keys.each { |k| e[k.gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').gsub(/([a-z\d])([A-Z])/,'\1_\2').tr("-", "_").downcase.to_sym] = expected[k] }
71
+ [e, actual].each { |a| range_keys.each { |k| a.delete(k) } }
72
+ assert_equal e, actual, failure_message
73
+ end
74
+
65
75
  CONFORMANCE_DIR = ENV['CONFORMANCE_DIR'] || File.expand_path("../../../conformance", __FILE__)
66
76
 
67
77
  def self.def_conformance_test(file, test_type, &block)
@@ -208,4 +218,8 @@ class ConformanceTest < Test::Unit::TestCase
208
218
  def_conformance_test("validate.yml", :lengths) do
209
219
  assert_equal expected, tweet_length(text), description
210
220
  end
221
+
222
+ def_conformance_test("validate.yml", :WeightedTweetsCounterTest) do
223
+ assert_equal_parse_results expected, parse_tweet(text), description
224
+ end
211
225
  end
@@ -2,11 +2,10 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "twitter-text"
5
- s.version = "1.14.7"
6
- s.authors = ["Matt Sanford", "Patrick Ewing", "Ben Cherry", "Britt Selvitelle",
7
- "Raffi Krikorian", "J.P. Cummins", "Yoshimasa Niwa", "Keita Fujii", "James Koval"]
8
- s.email = ["matt@twitter.com", "patrick.henry.ewing@gmail.com", "bcherry@gmail.com", "bs@brittspace.com",
9
- "raffi@twitter.com", "jcummins@twitter.com", "niw@niw.at", "keita@twitter.com", "jkoval@twitter.com"]
5
+ s.version = "2.0.0"
6
+ s.authors = ["David LaMacchia", "Sudheer Guntupalli", "Kaushik Lakshmikanth", "Jose Antonio Marquez Russo", "Lee Adams",
7
+ "Yoshimasa Niwa"]
8
+ s.email = ["opensource@twitter.com"]
10
9
  s.homepage = "http://twitter.com"
11
10
  s.description = s.summary = "A gem that provides text handling for Twitter"
12
11
  s.license = "Apache 2.0"
@@ -15,14 +14,17 @@ Gem::Specification.new do |s|
15
14
  s.has_rdoc = true
16
15
  s.summary = "Twitter text handling library"
17
16
 
17
+ s.add_development_dependency "pry"
18
18
  s.add_development_dependency "test-unit"
19
19
  s.add_development_dependency "multi_json", "~> 1.3"
20
- s.add_development_dependency "nokogiri", "~> 1.5.10"
21
- s.add_development_dependency "rake", "~> 11.1" # 12 removes method named `last_comment`
20
+ s.add_development_dependency "nokogiri", "~> 1.8.0"
21
+ s.add_development_dependency "rake"
22
22
  s.add_development_dependency "rdoc"
23
- s.add_development_dependency "rspec", "~> 2.14.0"
24
- s.add_development_dependency "simplecov", "~> 0.8.0"
23
+ s.add_development_dependency "rspec", "~> 3.0"
24
+ s.add_development_dependency "simplecov"
25
25
  s.add_runtime_dependency "unf", "~> 0.1.0"
26
+ # Use of idn-ruby requires libidn to be installed separately
27
+ s.add_runtime_dependency "idn-ruby"
26
28
 
27
29
  s.files = `git ls-files`.split("\n") + ['lib/assets/tld_lib.yml']
28
30
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
metadata CHANGED
@@ -1,23 +1,34 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: twitter-text
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.14.7
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Matt Sanford
8
- - Patrick Ewing
9
- - Ben Cherry
10
- - Britt Selvitelle
11
- - Raffi Krikorian
12
- - J.P. Cummins
7
+ - David LaMacchia
8
+ - Sudheer Guntupalli
9
+ - Kaushik Lakshmikanth
10
+ - Jose Antonio Marquez Russo
11
+ - Lee Adams
13
12
  - Yoshimasa Niwa
14
- - Keita Fujii
15
- - James Koval
16
13
  autorequire:
17
14
  bindir: bin
18
15
  cert_chain: []
19
- date: 2017-07-03 00:00:00.000000000 Z
16
+ date: 2017-12-15 00:00:00.000000000 Z
20
17
  dependencies:
18
+ - !ruby/object:Gem::Dependency
19
+ name: pry
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: '0'
25
+ type: :development
26
+ prerelease: false
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
21
32
  - !ruby/object:Gem::Dependency
22
33
  name: test-unit
23
34
  requirement: !ruby/object:Gem::Requirement
@@ -52,28 +63,28 @@ dependencies:
52
63
  requirements:
53
64
  - - "~>"
54
65
  - !ruby/object:Gem::Version
55
- version: 1.5.10
66
+ version: 1.8.0
56
67
  type: :development
57
68
  prerelease: false
58
69
  version_requirements: !ruby/object:Gem::Requirement
59
70
  requirements:
60
71
  - - "~>"
61
72
  - !ruby/object:Gem::Version
62
- version: 1.5.10
73
+ version: 1.8.0
63
74
  - !ruby/object:Gem::Dependency
64
75
  name: rake
65
76
  requirement: !ruby/object:Gem::Requirement
66
77
  requirements:
67
- - - "~>"
78
+ - - ">="
68
79
  - !ruby/object:Gem::Version
69
- version: '11.1'
80
+ version: '0'
70
81
  type: :development
71
82
  prerelease: false
72
83
  version_requirements: !ruby/object:Gem::Requirement
73
84
  requirements:
74
- - - "~>"
85
+ - - ">="
75
86
  - !ruby/object:Gem::Version
76
- version: '11.1'
87
+ version: '0'
77
88
  - !ruby/object:Gem::Dependency
78
89
  name: rdoc
79
90
  requirement: !ruby/object:Gem::Requirement
@@ -94,28 +105,28 @@ dependencies:
94
105
  requirements:
95
106
  - - "~>"
96
107
  - !ruby/object:Gem::Version
97
- version: 2.14.0
108
+ version: '3.0'
98
109
  type: :development
99
110
  prerelease: false
100
111
  version_requirements: !ruby/object:Gem::Requirement
101
112
  requirements:
102
113
  - - "~>"
103
114
  - !ruby/object:Gem::Version
104
- version: 2.14.0
115
+ version: '3.0'
105
116
  - !ruby/object:Gem::Dependency
106
117
  name: simplecov
107
118
  requirement: !ruby/object:Gem::Requirement
108
119
  requirements:
109
- - - "~>"
120
+ - - ">="
110
121
  - !ruby/object:Gem::Version
111
- version: 0.8.0
122
+ version: '0'
112
123
  type: :development
113
124
  prerelease: false
114
125
  version_requirements: !ruby/object:Gem::Requirement
115
126
  requirements:
116
- - - "~>"
127
+ - - ">="
117
128
  - !ruby/object:Gem::Version
118
- version: 0.8.0
129
+ version: '0'
119
130
  - !ruby/object:Gem::Dependency
120
131
  name: unf
121
132
  requirement: !ruby/object:Gem::Requirement
@@ -130,17 +141,23 @@ dependencies:
130
141
  - - "~>"
131
142
  - !ruby/object:Gem::Version
132
143
  version: 0.1.0
144
+ - !ruby/object:Gem::Dependency
145
+ name: idn-ruby
146
+ requirement: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ type: :runtime
152
+ prerelease: false
153
+ version_requirements: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
133
158
  description: A gem that provides text handling for Twitter
134
159
  email:
135
- - matt@twitter.com
136
- - patrick.henry.ewing@gmail.com
137
- - bcherry@gmail.com
138
- - bs@brittspace.com
139
- - raffi@twitter.com
140
- - jcummins@twitter.com
141
- - niw@niw.at
142
- - keita@twitter.com
143
- - jkoval@twitter.com
160
+ - opensource@twitter.com
144
161
  executables: []
145
162
  extensions: []
146
163
  extra_rdoc_files: []
@@ -156,6 +173,7 @@ files:
156
173
  - lib/assets/tld_lib.yml
157
174
  - lib/twitter-text.rb
158
175
  - lib/twitter-text/autolink.rb
176
+ - lib/twitter-text/configuration.rb
159
177
  - lib/twitter-text/deprecation.rb
160
178
  - lib/twitter-text/extractor.rb
161
179
  - lib/twitter-text/hash_helper.rb
@@ -164,9 +182,11 @@ files:
164
182
  - lib/twitter-text/rewriter.rb
165
183
  - lib/twitter-text/unicode.rb
166
184
  - lib/twitter-text/validation.rb
185
+ - lib/twitter-text/weighted_range.rb
167
186
  - script/destroy
168
187
  - script/generate
169
188
  - spec/autolinking_spec.rb
189
+ - spec/configuration_spec.rb
170
190
  - spec/extractor_spec.rb
171
191
  - spec/hithighlighter_spec.rb
172
192
  - spec/regex_spec.rb
@@ -198,12 +218,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
198
218
  version: '0'
199
219
  requirements: []
200
220
  rubyforge_project:
201
- rubygems_version: 2.4.5.1
221
+ rubygems_version: 2.7.0
202
222
  signing_key:
203
223
  specification_version: 4
204
224
  summary: Twitter text handling library
205
225
  test_files:
206
226
  - spec/autolinking_spec.rb
227
+ - spec/configuration_spec.rb
207
228
  - spec/extractor_spec.rb
208
229
  - spec/hithighlighter_spec.rb
209
230
  - spec/regex_spec.rb