dancroak-twitter-search 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +17 -18
- data/lib/twitter_search.rb +37 -12
- metadata +3 -26
- data/VERSION.yml +0 -4
- data/test/test_helper.rb +0 -40
- data/test/twitter_search_test.rb +0 -307
- data/test/yaml/arabic.yaml +0 -100
- data/test/yaml/beer_minus_root.yaml +0 -98
- data/test/yaml/english.yaml +0 -98
- data/test/yaml/flight_negative_tude.yaml +0 -98
- data/test/yaml/from_alexiskold.yaml +0 -98
- data/test/yaml/ftw_until.yaml +0 -98
- data/test/yaml/happy_hour_exact.yaml +0 -98
- data/test/yaml/happy_hour_near_sf.yaml +0 -9
- data/test/yaml/hashtag_haiku.yaml +0 -98
- data/test/yaml/hilarious_links.yaml +0 -98
- data/test/yaml/movie_positive_tude.yaml +0 -98
- data/test/yaml/obama.yaml +0 -98
- data/test/yaml/obama_or_hillary.yaml +0 -98
- data/test/yaml/reference_mashable.yaml +0 -98
- data/test/yaml/results_per_page.yaml +0 -192
- data/test/yaml/superhero_since.yaml +0 -98
- data/test/yaml/to_techcrunch.yaml +0 -98
- data/test/yaml/traffic_question.yaml +0 -98
- data/test/yaml/twitter_search.yaml +0 -98
- data/test/yaml/twitter_search_and.yaml +0 -98
- data/test/yaml/within_15mi_nyc.yaml +0 -9
data/Rakefile
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
require 'rake'
|
2
2
|
require 'rake/testtask'
|
3
|
-
require 'date'
|
4
3
|
|
5
|
-
test_files_pattern = 'test/
|
4
|
+
test_files_pattern = 'test/twitter_search_test.rb'
|
6
5
|
Rake::TestTask.new do |t|
|
7
6
|
t.libs << 'lib'
|
8
7
|
t.pattern = test_files_pattern
|
@@ -12,23 +11,23 @@ end
|
|
12
11
|
desc "Run the test suite"
|
13
12
|
task :default => :test
|
14
13
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
14
|
+
gem_spec = Gem::Specification.new do |gem_spec|
|
15
|
+
gem_spec.name = "twitter-search"
|
16
|
+
gem_spec.version = "0.5.2"
|
17
|
+
gem_spec.summary = "Ruby client for Twitter Search."
|
18
|
+
gem_spec.email = "dcroak@thoughtbot.com"
|
19
|
+
gem_spec.homepage = "http://github.com/dancroak/twitter-search"
|
20
|
+
gem_spec.description = "Ruby client for Twitter Search."
|
21
|
+
gem_spec.authors = ["Dustin Sallings", "Dan Croak"]
|
22
|
+
gem_spec.files = FileList["[A-Z]*", "{generators,lib,shoulda_macros,rails}/**/*"]
|
23
|
+
gem_spec.add_dependency('json', '>= 1.1.2')
|
24
24
|
end
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
puts "Jeweler not available. sudo gem install technicalpickles-jeweler --source=http://gems.github.com"
|
25
|
+
|
26
|
+
desc "Generate a gemspec file"
|
27
|
+
task :gemspec do
|
28
|
+
File.open("#{gem_spec.name}.gemspec", 'w') do |f|
|
29
|
+
f.write gem_spec.to_yaml
|
30
|
+
end
|
32
31
|
end
|
33
32
|
|
34
33
|
require File.expand_path('lib/twitter_search', File.dirname(__FILE__))
|
data/lib/twitter_search.rb
CHANGED
@@ -6,13 +6,13 @@ require 'cgi'
|
|
6
6
|
module TwitterSearch
|
7
7
|
|
8
8
|
class Tweet
|
9
|
-
VARS = [:text, :from_user, :created_at, :
|
9
|
+
VARS = [:text, :from_user, :to_user, :to_user_id, :id, :iso_language_code, :from_user_id, :created_at, :profile_image_url ]
|
10
10
|
attr_reader *VARS
|
11
11
|
attr_reader :language
|
12
12
|
|
13
|
-
def initialize(
|
14
|
-
@language =
|
15
|
-
VARS.each { |
|
13
|
+
def initialize(opts)
|
14
|
+
@language = opts['iso_language_code']
|
15
|
+
VARS.each { |each| instance_variable_set "@#{each}", opts[each.to_s] }
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -22,9 +22,9 @@ module TwitterSearch
|
|
22
22
|
|
23
23
|
include Enumerable
|
24
24
|
|
25
|
-
def initialize(
|
26
|
-
@results =
|
27
|
-
VARS.each { |
|
25
|
+
def initialize(opts)
|
26
|
+
@results = opts['results'].collect { |each| Tweet.new(each) }
|
27
|
+
VARS.each { |each| instance_variable_set "@#{each}", opts[each.to_s] }
|
28
28
|
end
|
29
29
|
|
30
30
|
def each(&block)
|
@@ -41,14 +41,36 @@ module TwitterSearch
|
|
41
41
|
end
|
42
42
|
|
43
43
|
class Client
|
44
|
+
TWITTER_API_URL = 'http://search.twitter.com/search.json'
|
45
|
+
TWITTER_API_DEFAULT_TIMEOUT = 5
|
46
|
+
|
47
|
+
attr_accessor :agent
|
48
|
+
|
44
49
|
def initialize(agent = 'twitter-search')
|
45
50
|
@agent = agent
|
46
51
|
end
|
47
|
-
|
52
|
+
|
53
|
+
def headers
|
54
|
+
{ "Content-Type" => 'application/json',
|
55
|
+
"User-Agent" => @agent }
|
56
|
+
end
|
57
|
+
|
58
|
+
def timeout
|
59
|
+
TWITTER_API_DEFAULT_TIMEOUT
|
60
|
+
end
|
61
|
+
|
48
62
|
def query(opts = {})
|
49
|
-
url
|
50
|
-
url.query = sanitize_query
|
51
|
-
|
63
|
+
url = URI.parse(TWITTER_API_URL)
|
64
|
+
url.query = sanitize_query(opts)
|
65
|
+
|
66
|
+
req = Net::HTTP::Get.new(url.path)
|
67
|
+
http = Net::HTTP.new(url.host, url.port)
|
68
|
+
http.read_timeout = timeout
|
69
|
+
|
70
|
+
json = http.start { |http|
|
71
|
+
http.get("#{url.path}?#{url.query}", headers)
|
72
|
+
}.body
|
73
|
+
Tweets.new JSON.parse(json)
|
52
74
|
end
|
53
75
|
|
54
76
|
private
|
@@ -62,8 +84,11 @@ module TwitterSearch
|
|
62
84
|
end
|
63
85
|
|
64
86
|
def sanitize_query_hash(query_hash)
|
65
|
-
query_hash.
|
87
|
+
query_hash.collect { |key, value|
|
88
|
+
"#{CGI.escape(key.to_s)}=#{CGI.escape(value.to_s)}"
|
89
|
+
}.join('&')
|
66
90
|
end
|
91
|
+
|
67
92
|
end
|
68
93
|
|
69
94
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dancroak-twitter-search
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dustin Sallings
|
@@ -10,11 +10,12 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date:
|
13
|
+
date: 2009-02-03 21:00:00 -08:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: json
|
18
|
+
type: :runtime
|
18
19
|
version_requirement:
|
19
20
|
version_requirements: !ruby/object:Gem::Requirement
|
20
21
|
requirements:
|
@@ -36,30 +37,6 @@ files:
|
|
36
37
|
- TODO.markdown
|
37
38
|
- VERSION.yml
|
38
39
|
- lib/twitter_search.rb
|
39
|
-
- test/test_helper.rb
|
40
|
-
- test/twitter_search_test.rb
|
41
|
-
- test/yaml
|
42
|
-
- test/yaml/arabic.yaml
|
43
|
-
- test/yaml/beer_minus_root.yaml
|
44
|
-
- test/yaml/english.yaml
|
45
|
-
- test/yaml/flight_negative_tude.yaml
|
46
|
-
- test/yaml/from_alexiskold.yaml
|
47
|
-
- test/yaml/ftw_until.yaml
|
48
|
-
- test/yaml/happy_hour_exact.yaml
|
49
|
-
- test/yaml/happy_hour_near_sf.yaml
|
50
|
-
- test/yaml/hashtag_haiku.yaml
|
51
|
-
- test/yaml/hilarious_links.yaml
|
52
|
-
- test/yaml/movie_positive_tude.yaml
|
53
|
-
- test/yaml/obama.yaml
|
54
|
-
- test/yaml/obama_or_hillary.yaml
|
55
|
-
- test/yaml/reference_mashable.yaml
|
56
|
-
- test/yaml/results_per_page.yaml
|
57
|
-
- test/yaml/superhero_since.yaml
|
58
|
-
- test/yaml/to_techcrunch.yaml
|
59
|
-
- test/yaml/traffic_question.yaml
|
60
|
-
- test/yaml/twitter_search.yaml
|
61
|
-
- test/yaml/twitter_search_and.yaml
|
62
|
-
- test/yaml/within_15mi_nyc.yaml
|
63
40
|
has_rdoc: false
|
64
41
|
homepage: http://github.com/dancroak/twitter-search
|
65
42
|
post_install_message:
|
data/VERSION.yml
DELETED
data/test/test_helper.rb
DELETED
@@ -1,40 +0,0 @@
|
|
1
|
-
require File.expand_path('../lib/twitter_search', File.dirname(__FILE__))
|
2
|
-
require 'test/unit'
|
3
|
-
require 'rubygems'
|
4
|
-
require 'shoulda'
|
5
|
-
require 'yaml'
|
6
|
-
|
7
|
-
class Test::Unit::TestCase
|
8
|
-
|
9
|
-
def self.should_have_default_search_behaviors
|
10
|
-
should_find_tweets
|
11
|
-
should_have_text_for_all_tweets
|
12
|
-
should_return_page 1
|
13
|
-
should_return_tweets_in_sets_of 15
|
14
|
-
end
|
15
|
-
|
16
|
-
def self.should_find_tweets
|
17
|
-
should 'find tweets' do
|
18
|
-
assert @tweets.any?
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.should_have_text_for_all_tweets
|
23
|
-
should 'have text for all tweets' do
|
24
|
-
assert @tweets.all? { |tweet| tweet.text.size > 0 }
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def self.should_return_page(number)
|
29
|
-
should "return page #{number}" do
|
30
|
-
assert_equal number, @tweets.page
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def self.should_return_tweets_in_sets_of(number)
|
35
|
-
should "return tweets in sets of #{number}" do
|
36
|
-
assert_equal number, @tweets.results_per_page
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
data/test/twitter_search_test.rb
DELETED
@@ -1,307 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
|
3
|
-
require File.join(File.dirname(__FILE__), 'test_helper')
|
4
|
-
|
5
|
-
class TwitterSearchTest < Test::Unit::TestCase # :nodoc:
|
6
|
-
|
7
|
-
context "@client.query 'Obama'" do
|
8
|
-
setup do
|
9
|
-
@tweets = read_yaml :file => 'obama'
|
10
|
-
end
|
11
|
-
|
12
|
-
should_have_default_search_behaviors
|
13
|
-
|
14
|
-
should 'find tweets containing the single word "Obama"' do
|
15
|
-
assert @tweets.all? { |tweet| tweet.text =~ /obama/i }
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
context "@client.query 'twitter search'" do
|
20
|
-
setup do
|
21
|
-
@tweets = read_yaml :file => 'twitter_search'
|
22
|
-
end
|
23
|
-
|
24
|
-
should_have_default_search_behaviors
|
25
|
-
|
26
|
-
should 'find tweets containing both "twitter" and "search"' do
|
27
|
-
assert @tweets.all?{ |t| t.text =~ /twitter/i && t.text =~ /search/i }
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
context "@client.query :q => 'twitter search'" do
|
32
|
-
setup do
|
33
|
-
@tweets = read_yaml :file => 'twitter_search_and'
|
34
|
-
end
|
35
|
-
|
36
|
-
should_have_default_search_behaviors
|
37
|
-
|
38
|
-
should 'find tweets containing both "twitter" and "search"' do
|
39
|
-
assert @tweets.all?{ |t| t.text =~ /twitter/i && t.text =~ /search/i }
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
# TWITTER SEARCH OPERATORS
|
44
|
-
|
45
|
-
context '@client.query :q => \'"happy hour"\'' do
|
46
|
-
setup do
|
47
|
-
@tweets = read_yaml :file => 'happy_hour_exact'
|
48
|
-
end
|
49
|
-
|
50
|
-
should_have_default_search_behaviors
|
51
|
-
|
52
|
-
should 'find tweets containing the exact phrase "happy hour"' do
|
53
|
-
assert @tweets.all?{ |t| t.text =~ /happy hour/i }
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
context "@client.query :q => 'obama OR hillary'" do
|
58
|
-
setup do
|
59
|
-
@tweets = read_yaml :file => 'obama_or_hillary'
|
60
|
-
end
|
61
|
-
|
62
|
-
should_have_default_search_behaviors
|
63
|
-
|
64
|
-
should 'find tweets containing either "obama" or "hillary" (or both)' do
|
65
|
-
assert @tweets.all?{ |t| t.text =~ /obama/i || t.text =~ /hillary/i }
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
context "@client.query :q => 'beer -root'" do
|
70
|
-
setup do
|
71
|
-
@tweets = read_yaml :file => 'beer_minus_root'
|
72
|
-
end
|
73
|
-
|
74
|
-
should_have_default_search_behaviors
|
75
|
-
|
76
|
-
should 'find tweets containing "beer" but not "root"' do
|
77
|
-
assert @tweets.all?{ |t| t.text =~ /beer/i || t.text !~ /root/i }
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
context "@client.query :q => '#haiku'" do
|
82
|
-
setup do
|
83
|
-
@tweets = read_yaml :file => 'hashtag_haiku'
|
84
|
-
end
|
85
|
-
|
86
|
-
should_have_default_search_behaviors
|
87
|
-
|
88
|
-
should 'find tweets containing the hashtag "haiku"' do
|
89
|
-
assert @tweets.all?{ |t| t.text =~ /#haiku/i }
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
context "@client.query :q => 'from: alexiskold'" do
|
94
|
-
setup do
|
95
|
-
@tweets = read_yaml :file => 'from_alexiskold'
|
96
|
-
end
|
97
|
-
|
98
|
-
should_have_default_search_behaviors
|
99
|
-
|
100
|
-
should 'find tweets sent from person "alexiskold"' do
|
101
|
-
assert @tweets.all?{ |t| t.from_user == 'alexiskold' }
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
context "@client.query :q => 'to:techcrunch'" do
|
106
|
-
setup do
|
107
|
-
@tweets = read_yaml :file => 'to_techcrunch'
|
108
|
-
end
|
109
|
-
|
110
|
-
should_have_default_search_behaviors
|
111
|
-
|
112
|
-
should 'find tweets sent to person "techcrunch"' do
|
113
|
-
assert @tweets.all?{ |t| t.text =~ /^@techcrunch/i }
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
context "@client.query :q => '@mashable'" do
|
118
|
-
setup do
|
119
|
-
@tweets = read_yaml :file => 'reference_mashable'
|
120
|
-
end
|
121
|
-
|
122
|
-
should_have_default_search_behaviors
|
123
|
-
|
124
|
-
should 'find tweets referencing person "mashable"' do
|
125
|
-
assert @tweets.all?{ |t| t.text =~ /@mashable/i }
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
context "@client.query :q => '\"happy hour\" near:\"san francisco\"'" do
|
130
|
-
setup do
|
131
|
-
@tweets = read_yaml :file => 'happy_hour_near_sf'
|
132
|
-
end
|
133
|
-
|
134
|
-
# The Twitter Search API makes you use the geocode parameter for location searching
|
135
|
-
should 'not find tweets using the near operator' do
|
136
|
-
assert ! @tweets.any?
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
context "@client.query :q => 'near:NYC within:15mi'" do
|
141
|
-
setup do
|
142
|
-
@tweets = read_yaml :file => 'within_15mi_nyc'
|
143
|
-
end
|
144
|
-
|
145
|
-
# The Twitter Search API makes you use the geocode parameter for location searching
|
146
|
-
should 'not find tweets using the near operator' do
|
147
|
-
assert ! @tweets.any?
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
|
-
context "@client.query :q => 'superhero since:2008-05-01'" do
|
152
|
-
setup do
|
153
|
-
@tweets = read_yaml :file => 'superhero_since'
|
154
|
-
end
|
155
|
-
|
156
|
-
should_have_default_search_behaviors
|
157
|
-
|
158
|
-
should 'find tweets containing "superhero" and sent since date "2008-05-01" (year-month-day)' do
|
159
|
-
assert @tweets.all?{ |t| t.text =~ /superhero/i && convert_date(t.created_at) > DateTime.new(2008, 5, 1) }
|
160
|
-
end
|
161
|
-
end
|
162
|
-
|
163
|
-
context "@client.query :q => 'ftw until:2008-05-03'" do
|
164
|
-
setup do
|
165
|
-
@tweets = read_yaml :file => 'ftw_until'
|
166
|
-
end
|
167
|
-
|
168
|
-
should_have_default_search_behaviors
|
169
|
-
|
170
|
-
should 'find tweets containing "ftw" and sent up to date "2008-05-03"' do
|
171
|
-
assert @tweets.all?{ |t| t.text =~ /ftw/i && convert_date(t.created_at) < DateTime.new(2008, 5, 3, 11, 59) }
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
context "@client.query :q => 'movie -scary :)'" do
|
176
|
-
setup do
|
177
|
-
@tweets = read_yaml :file => 'movie_positive_tude'
|
178
|
-
end
|
179
|
-
|
180
|
-
should_have_default_search_behaviors
|
181
|
-
|
182
|
-
should 'find tweets containing "movie", but not "scary", and with a positive attitude' do
|
183
|
-
assert @tweets.all?{ |t| t.text =~ /movie/i && t.text !~ /scary/i && positive_attitude?(t.text) }
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
context "@client.query :q => 'flight :('" do
|
188
|
-
setup do
|
189
|
-
@tweets = read_yaml :file => 'flight_negative_tude'
|
190
|
-
end
|
191
|
-
|
192
|
-
should_have_default_search_behaviors
|
193
|
-
|
194
|
-
should 'find tweets containing "flight" and with a negative attitude' do
|
195
|
-
assert @tweets.all?{ |t| t.text =~ /flight/i && negative_attitude?(t.text) }
|
196
|
-
end
|
197
|
-
end
|
198
|
-
|
199
|
-
context "@client.query :q => 'traffic ?'" do
|
200
|
-
setup do
|
201
|
-
@tweets = read_yaml :file => 'traffic_question'
|
202
|
-
end
|
203
|
-
|
204
|
-
should_have_default_search_behaviors
|
205
|
-
|
206
|
-
should 'find tweets containing "traffic" and asking a question' do
|
207
|
-
assert @tweets.all?{ |t| t.text =~ /traffic/i && t.text.include?('?') }
|
208
|
-
end
|
209
|
-
end
|
210
|
-
|
211
|
-
context "@client.query :q => 'hilarious filter:links'" do
|
212
|
-
setup do
|
213
|
-
@tweets = read_yaml :file => 'hilarious_links'
|
214
|
-
end
|
215
|
-
|
216
|
-
should_have_default_search_behaviors
|
217
|
-
|
218
|
-
should 'find tweets containing "hilarious" and linking to URLs' do
|
219
|
-
assert @tweets.all?{ |t| t.text =~ /hilarious/i && hyperlinks?(t.text) }
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
|
-
# FOREIGN LANGUAGES
|
224
|
-
|
225
|
-
context "@client.query :q => 'congratulations', :lang => 'en'" do
|
226
|
-
setup do
|
227
|
-
@tweets = read_yaml :file => 'english'
|
228
|
-
end
|
229
|
-
|
230
|
-
should_have_default_search_behaviors
|
231
|
-
|
232
|
-
should 'find tweets containing "congratulations" and are in English' do
|
233
|
-
assert @tweets.all?{ |t| t.text =~ /congratulation/i && t.language == 'en' }
|
234
|
-
end
|
235
|
-
end
|
236
|
-
|
237
|
-
context "@client.query :q => 'با', :lang => 'ar'" do
|
238
|
-
setup do
|
239
|
-
@tweets = read_yaml :file => 'arabic'
|
240
|
-
end
|
241
|
-
|
242
|
-
should_have_default_search_behaviors
|
243
|
-
|
244
|
-
should 'find tweets containing "با" and are in Arabic' do
|
245
|
-
assert @tweets.all?{ |t| t.text.include?('با') && t.language == 'ar' }
|
246
|
-
end
|
247
|
-
end
|
248
|
-
|
249
|
-
# PAGINATION
|
250
|
-
|
251
|
-
context "@client.query :q => 'Boston Celtics', :rpp => '30'" do
|
252
|
-
setup do
|
253
|
-
@tweets = read_yaml :file => 'results_per_page'
|
254
|
-
end
|
255
|
-
|
256
|
-
should_find_tweets
|
257
|
-
should_have_text_for_all_tweets
|
258
|
-
should_return_page 1
|
259
|
-
should_return_tweets_in_sets_of 30
|
260
|
-
end
|
261
|
-
|
262
|
-
# HELPERS
|
263
|
-
|
264
|
-
context "@tweets[2]" do
|
265
|
-
setup do
|
266
|
-
@tweets = read_yaml :file => 'reference_mashable'
|
267
|
-
end
|
268
|
-
|
269
|
-
should_have_default_search_behaviors
|
270
|
-
|
271
|
-
should 'return the third tweet' do
|
272
|
-
assert_equal 859152168, @tweets[2].id
|
273
|
-
end
|
274
|
-
end
|
275
|
-
|
276
|
-
protected
|
277
|
-
|
278
|
-
def convert_date(date)
|
279
|
-
date = date.split(' ')
|
280
|
-
DateTime.new(date[3].to_i, convert_month(date[2]), date[1].to_i)
|
281
|
-
end
|
282
|
-
|
283
|
-
def convert_month(str)
|
284
|
-
months = { 'Jan' => 1, 'Feb' => 2, 'Mar' => 3, 'Apr' => 4,
|
285
|
-
'May' => 5, 'Jun' => 6, 'Jul' => 7, 'Aug' => 8,
|
286
|
-
'Sep' => 9, 'Oct' => 10, 'Nov' => 11, 'Dec' => 12 }
|
287
|
-
months[str]
|
288
|
-
end
|
289
|
-
|
290
|
-
def positive_attitude?(str)
|
291
|
-
str.include?(':)') || str.include?('=)') || str.include?(':-)') || str.include?(':D')
|
292
|
-
end
|
293
|
-
|
294
|
-
def negative_attitude?(str)
|
295
|
-
str.include?(':(') || str.include?('=(') || str.include?(':-(') || str.include?(':P')
|
296
|
-
end
|
297
|
-
|
298
|
-
def hyperlinks?(str)
|
299
|
-
str.include?('http://') || str.include?('https://')
|
300
|
-
end
|
301
|
-
|
302
|
-
def read_yaml(opts = {})
|
303
|
-
return if opts[:file].nil?
|
304
|
-
YAML.load_file File.join(File.dirname(__FILE__), 'yaml', "#{opts[:file]}.yaml")
|
305
|
-
end
|
306
|
-
|
307
|
-
end
|
data/test/yaml/arabic.yaml
DELETED
@@ -1,100 +0,0 @@
|
|
1
|
-
--- !ruby/object:TwitterSearch::Tweets
|
2
|
-
max_id: 859242438
|
3
|
-
next_page: ?page=2&max_id=859242438&q=%D8%A8%D8%A7
|
4
|
-
page: 1
|
5
|
-
query: !binary |
|
6
|
-
2KjYpw==
|
7
|
-
|
8
|
-
results:
|
9
|
-
- !ruby/object:TwitterSearch::Tweet
|
10
|
-
created_at: Tue, 15 Jul 2008 18:18:14 +0000
|
11
|
-
from_user: hot_badomo
|
12
|
-
id: 859242438
|
13
|
-
language: ar
|
14
|
-
text: "\xD8\xA8\xD8\xA7\xD9\x84\xD8\xA7\xD8\xAA\xD8\xB1\xDB\x8C\xD9\x86: \xD9\x88\xDB\x8C\xD8\xAF\xDB\x8C\xD9\x88/ \xD8\xA7\xD8\xAD\xD9\x85\xD8\xAF\xDB\x8C \xD9\x86\xDA\x98\xD8\xA7\xD8\xAF \xD8\xA8\xD9\x87 \xD9\x85\xD8\xAC\xD8\xB1\xDB\x8C \xD8\xAA\xD9\x84\xD9\x88\xDB\x8C\xD8\xB2\xDB\x8C\xD9\x88\xD9\x86: \xD9\x85\xD8\xAC\xD8\xB1\xD8\xAF\xDB\x8C \xD8\x9F! \xD8\xAE\xD8\xAC\xD8\xA7\xD9\x84\xD8\xAA \xD9\x86\xD9\x85\xDB\x8C \xDA\xA9\xD8\xB4\xDB\x8C \xD8\xAA\xD9\x88\xDB\x8C \xD8\xAA\xD9\x84\xD9\x88\xDB\x8C\xD8\xB2\xDB\x8C\xD9\x88\xD9\x86 \xD8\xA8\xD8\xA7 .. http://tinyurl.com/6geddk"
|
15
|
-
- !ruby/object:TwitterSearch::Tweet
|
16
|
-
created_at: Tue, 15 Jul 2008 18:17:03 +0000
|
17
|
-
from_user: hot_web
|
18
|
-
id: 859241374
|
19
|
-
language: ar
|
20
|
-
text: "\xD8\xA8\xD8\xA7\xD9\x84\xD8\xA7\xD8\xAA\xD8\xB1\xDB\x8C\xD9\x86: \xD9\x88\xDB\x8C\xD8\xAF\xDB\x8C\xD9\x88/ \xD8\xA7\xD8\xAD\xD9\x85\xD8\xAF\xDB\x8C \xD9\x86\xDA\x98\xD8\xA7\xD8\xAF \xD8\xA8\xD9\x87 \xD9\x85\xD8\xAC\xD8\xB1\xDB\x8C \xD8\xAA\xD9\x84\xD9\x88\xDB\x8C\xD8\xB2\xDB\x8C\xD9\x88\xD9\x86: \xD9\x85\xD8\xAC\xD8\xB1\xD8\xAF\xDB\x8C \xD8\x9F! \xD8\xAE\xD8\xAC\xD8\xA7\xD9\x84\xD8\xAA \xD9\x86\xD9\x85\xDB\x8C \xDA\xA9\xD8\xB4\xDB\x8C \xD8\xAA\xD9\x88\xDB\x8C \xD8\xAA\xD9\x84\xD9\x88\xDB\x8C\xD8\xB2\xDB\x8C\xD9\x88\xD9\x86 \xD8\xA8\xD8\xA7 \xD9\x85\xD8\xB1\xD8\xAF.. http://tinyurl.com/6geddk"
|
21
|
-
- !ruby/object:TwitterSearch::Tweet
|
22
|
-
created_at: Tue, 15 Jul 2008 18:09:51 +0000
|
23
|
-
from_user: foadsa
|
24
|
-
id: 859235167
|
25
|
-
language: ar
|
26
|
-
text: "\xD8\xAE\xDB\x8C\xD9\x84\xDB\x8C \xD8\xA8\xD8\xAF\xD9\x87 \xDA\xA9\xD9\x87 \xD8\xAA\xD8\xB1\xD8\xA7\xD9\x86\xD9\x87\xE2\x80\x8C\xD9\x87\xD8\xA7 \xD9\x85\xD9\x88\xD9\x82\xD8\xB9 \xD8\xAE\xD9\x88\xD9\x86\xD8\xAF\xD9\x87 \xD8\xB4\xD8\xAF\xD9\x86 \xD8\xAE\xD9\x84\xD8\xA7\xD8\xB5\xD9\x87 \xD9\x85\xDB\x8C\xE2\x80\x8C\xD8\xB4\xD9\x86. \xD8\xA7\xD8\xB3\xD9\x85\xD8\xA7\xDB\x8C\xD9\x84\xDB\x8C \xD9\x88\xD8\xA7\xD8\xB3\xD9\x87 \xD9\x87\xD9\x85\xDB\x8C\xD9\x86\xD9\x87 \xD9\x87\xD9\x86\xD9\x88\xD8\xB2 \xD8\xA8\xD8\xA7 \xD9\x87\xDB\x8C\xDA\x86 \xD8\xAE\xD9\x88\xD8\xA7\xD9\x86\xD9\x86\xD8\xAF\xD9\x87\xE2\x80\x8C\xD8\xA7\xDB\x8C \xDA\xA9\xD8\xA7\xD8\xB1 \xD9\x86\xDA\xA9\xD8\xB1\xD8\xAF\xD9\x85."
|
27
|
-
- !ruby/object:TwitterSearch::Tweet
|
28
|
-
created_at: Tue, 15 Jul 2008 18:09:14 +0000
|
29
|
-
from_user: elnaz_m
|
30
|
-
id: 859234644
|
31
|
-
language: ar
|
32
|
-
text: "\xD8\xA8\xD8\xA7 \xD9\x86\xD8\xB3\xD8\xB1\xDB\x8C\xD9\x86 \xD8\xAF\xD8\xB9\xD9\x88\xD8\xA7\xD9\x85 \xD8\xB4\xD8\xAF"
|
33
|
-
- !ruby/object:TwitterSearch::Tweet
|
34
|
-
created_at: Tue, 15 Jul 2008 18:02:13 +0000
|
35
|
-
from_user: donbaleh
|
36
|
-
id: 859228743
|
37
|
-
language: ar
|
38
|
-
text: "\xDA\x86\xD8\xB1\xD8\xA7\xD8\xBA\xD8\xA7\xD9\x86\xD9\x8A 66 \xD9\x85\xD8\xB9\xD8\xA8\xD8\xB1 \xD9\xBE\xD8\xA7\xD9\x8A\xD8\xAA\xD8\xAE\xD8\xAA \xD8\xAF\xD8\xB1 \xD8\xA7\xD9\x88\xD8\xAC \xD8\xA8\xD9\x8A \xD8\xA8\xD8\xB1\xD9\x82\xD9\x8A: \xD8\xA8\xD8\xA7 \xD9\x88\xD8\xAC\xD9\x88\xD8\xAF \xDA\xA9\xD9\x85\xD8\xA8\xD9\x88\xD8\xAF \xD9\x88 \xD9\x82\xD8\xB7\xD8\xB9\xD9\x8A \xD8\xA8\xD8\xB1\xD9\x82 \xD8\xAF\xD8\xB1 \xD9\x85\xD9\x86\xD8\xA7\xD8\xB7\xD9\x82 \xD9\x85\xD8\xAE\xD8\xAA\xD9\x84\xD9\x81 \xDA\xA9\xD8\xB4\xD9\x88\xD8\xB1\xD8\x8C \xD8\xB3\xD8\xA7\xD8\xB2\xD9\x85\xD8\xA7\xD9\x86 \xD8\xB2\xD9\x8A\xD8\xA8\xD8\xA7\xD8\xB3\xD8\xA7\xD8\xB2\xD9\x8A \xD8\xB4\xD9\x87\xD8\xB1.. http://tinyurl.com/5j22wm"
|
39
|
-
- !ruby/object:TwitterSearch::Tweet
|
40
|
-
created_at: Tue, 15 Jul 2008 18:01:37 +0000
|
41
|
-
from_user: WorldNewser
|
42
|
-
id: 859228232
|
43
|
-
language: ar
|
44
|
-
text: "\xD8\xAF\xD9\x88\xD9\x84\xD8\xAA \xD8\xB3\xD9\x88\xD8\xB1\xDB\x8C\xD9\x87 \xD8\xA8\xD8\xA7 \xD8\xAA\xD8\xA7\xD8\xB3\xDB\x8C\xD8\xB3 \xD8\xA8\xD8\xA7\xD9\x86\xDA\xA9 \xD9\x85\xD8\xB4\xD8\xAA\xD8\xB1\xDA\xA9 \xD8\xA8\xD8\xA7 \xD8\xA7\xDB\x8C\xD8\xB1\xD8\xA7\xD9\x86 \xD9\x85\xD9\x88\xD8\xA7\xD9\x81\xD9\x82\xD8\xAA \xDA\xA9\xD8\xB1\xD8\xAF: \xD8\xA7\xD9\x8A\xD8\xB1\xD9\x86\xD8\xA7 http://tinyurl.com/5dsm2c"
|
45
|
-
- !ruby/object:TwitterSearch::Tweet
|
46
|
-
created_at: Tue, 15 Jul 2008 18:01:32 +0000
|
47
|
-
from_user: WorldNewser
|
48
|
-
id: 859228151
|
49
|
-
language: ar
|
50
|
-
text: "\xD8\xAA\xDB\x8C\xD9\x85 \xD9\x85\xD9\x84\xDB\x8C \xD9\x81\xD9\x88\xD8\xAA\xD8\xA8\xD8\xA7\xD9\x84 \xD8\xB9\xD8\xB1\xD8\xA8\xD8\xB3\xD8\xAA\xD8\xA7\xD9\x86 \xD8\xA8\xD8\xA7 \xD8\xAA\xDB\x8C\xD9\x85 \xD8\xB3\xD9\x85\xD9\xBE\xD8\xAF\xD9\x88\xD8\xB1\xDB\x8C\xD8\xA7 \xD8\xAF\xDB\x8C\xD8\xAF\xD8\xA7\xD8\xB1 \xD8\xAE\xD9\x88\xD8\xA7\xD9\x87\xD8\xAF \xDA\xA9\xD8\xB1\xD8\xAF: \xD9\x88\xD8\xA7\xD8\xAD\xD8\xAF \xD9\x85\xD8\xB1\xD9\x83\xD8\xB2\xD9\x8A \xD8\xAE\xD8\xA8\xD8\xB1 http://tinyurl.com/6efegh"
|
51
|
-
- !ruby/object:TwitterSearch::Tweet
|
52
|
-
created_at: Tue, 15 Jul 2008 17:53:56 +0000
|
53
|
-
from_user: amin
|
54
|
-
id: 859221764
|
55
|
-
language: ar
|
56
|
-
text: "\xD9\x87\xDB\x8C \xD8\xAF\xD9\x86\xDB\x8C\xD8\xA7 \xD9\x87\xDB\x8C! (\xD8\xA7\xDB\x8C\xD9\x86 \xD8\xAF\xD9\x86\xDB\x8C\xD8\xA7 \xD8\xA7\xD8\xB1\xD8\xAA\xD8\xA8\xD8\xA7\xD8\xB7\xDB\x8C \xD8\xA8\xD8\xA7 \xD8\xAF\xD9\x86\xDB\x8C\xD8\xA7\xDB\x8C \xD9\x81\xD9\x88\xD8\xA7\xD8\xAF \xD9\x86\xD8\xAF\xD8\xA7\xD8\xB1\xD9\x87 \xD8\xA8\xD9\x87 \xD8\xAE\xD8\xAF\xD8\xA7! )"
|
57
|
-
- !ruby/object:TwitterSearch::Tweet
|
58
|
-
created_at: Tue, 15 Jul 2008 17:50:46 +0000
|
59
|
-
from_user: gerashi
|
60
|
-
id: 859219096
|
61
|
-
language: ar
|
62
|
-
text: "\xD8\xA8\xD8\xA7 \xD8\xA7\xD8\xAD\xD8\xB3\xD8\xA7\xD9\x86 \xD8\xAF\xD8\xB1\xD8\xAF \xD8\xAF\xD9\x84 \xD9\x85\xDB\x8C\xE2\x80\x8C\xDA\xA9\xD9\x86\xD9\x85. \xD9\x88\xD8\xA8 \xD8\xAF\xD9\x88\xDB\x8C\xDB\x8C\xD8\xB4"
|
63
|
-
- !ruby/object:TwitterSearch::Tweet
|
64
|
-
created_at: Tue, 15 Jul 2008 17:50:24 +0000
|
65
|
-
from_user: hot_web
|
66
|
-
id: 859218746
|
67
|
-
language: ar
|
68
|
-
text: "\xD8\xAF\xD9\x86\xD8\xA8\xD8\xA7\xD9\x84\xD9\x87: \xD8\xA7\xD8\xAD\xD9\x85\xD8\xAF\xDB\x8C\xE2\x80\x8C\xD9\x86\xDA\x98\xD8\xA7\xD8\xAF \xD8\xA7\xD8\xB2 \xD8\xA7\xD8\xAD\xD8\xAA\xD9\x85\xD8\xA7\xD9\x84 \xD9\x85\xD8\xB0\xD8\xA7\xDA\xA9\xD8\xB1\xD9\x87 \xD8\xA8\xD8\xA7 \xD8\xA2\xD9\x85\xD8\xB1\xDB\x8C\xDA\xA9\xD8\xA7 \xD9\x85\xDB\x8C\xE2\x80\x8C\xDA\xAF\xD9\x88\xDB\x8C\xD8\xAF: \xD8\xB1\xD8\xA6\xDB\x8C\xD8\xB3 \xD8\xAC\xD9\x85\xD9\x87\xD9\x88\xD8\xB1 \xD8\xA7\xDB\x8C\xD8\xB1\xD8\xA7\xD9\x86 \xD8\xAF\xD8\xB1 \xDB\x8C\xDA\xA9 \xDA\xAF\xD9\x81\xD8\xAA\xDA\xAF\xD9\x88\xDB\x8C \xD8\xAA\xD9\x84\xD9\x88\xDB\x8C\xD8\xB2\xDB\x8C\xD9\x88.. http://tinyurl.com/5lo2m8"
|
69
|
-
- !ruby/object:TwitterSearch::Tweet
|
70
|
-
created_at: Tue, 15 Jul 2008 17:48:51 +0000
|
71
|
-
from_user: hot_badomo
|
72
|
-
id: 859217290
|
73
|
-
language: ar
|
74
|
-
text: "\xD8\xAF\xD9\x86\xD8\xA8\xD8\xA7\xD9\x84\xD9\x87: \xD8\xA7\xD8\xAD\xD9\x85\xD8\xAF\xDB\x8C\xE2\x80\x8C\xD9\x86\xDA\x98\xD8\xA7\xD8\xAF \xD8\xA7\xD8\xB2 \xD8\xA7\xD8\xAD\xD8\xAA\xD9\x85\xD8\xA7\xD9\x84 \xD9\x85\xD8\xB0\xD8\xA7\xDA\xA9\xD8\xB1\xD9\x87 \xD8\xA8\xD8\xA7 \xD8\xA2\xD9\x85\xD8\xB1\xDB\x8C\xDA\xA9\xD8\xA7 \xD9\x85\xDB\x8C\xE2\x80\x8C\xDA\xAF\xD9\x88\xDB\x8C\xD8\xAF: \xD8\xB1\xD8\xA6\xDB\x8C\xD8\xB3 \xD8\xAC\xD9\x85\xD9\x87\xD9\x88\xD8\xB1 \xD8\xA7\xDB\x8C\xD8\xB1\xD8\xA7\xD9\x86 \xD8\xAF\xD8\xB1 \xDB\x8C\xDA\xA9 \xDA\xAF\xD9\x81\xD8\xAA\xDA\xAF\xD9\x88\xDB\x8C \xD8\xAA\xD9\x84\xD9\x88\xDB\x8C.. http://tinyurl.com/5lo2m8"
|
75
|
-
- !ruby/object:TwitterSearch::Tweet
|
76
|
-
created_at: Tue, 15 Jul 2008 17:41:15 +0000
|
77
|
-
from_user: miladi
|
78
|
-
id: 859210678
|
79
|
-
language: ar
|
80
|
-
text: "\xD8\xA8\xD8\xA7 \xD9\x85\xD9\x86 \xD9\x87\xD8\xB3\xD8\xAA\xDB\x8C \xD8\x9F :\xD8\xAF\xDB\x8C"
|
81
|
-
- !ruby/object:TwitterSearch::Tweet
|
82
|
-
created_at: Tue, 15 Jul 2008 17:35:58 +0000
|
83
|
-
from_user: miladi
|
84
|
-
id: 859206040
|
85
|
-
language: ar
|
86
|
-
text: "\xD8\xAE\xD8\xB3\xD8\xAA\xD9\x87 \xD8\xA8\xD8\xA7 \xD9\xBE\xD8\xA7\xD9\x87\xD8\xA7\xDB\x8C\xDB\x8C \xD8\xAE\xD8\xB3\xD8\xAA\xD9\x87 \xD8\xAA\xD8\xB1 \xD8\xA8\xD8\xB1\xDA\xAF\xD8\xB4\xD8\xAA\xD9\x85 \xD9\x87\xD8\xAA\xD9\x84 \xD8\xA8\xD9\x87 \xDB\x8C\xDA\xA9\xDB\x8C \xD8\xA7\xD8\xB2 \xD8\xAF\xD9\x88\xD8\xB3\xD8\xAA\xD8\xA7\xD9\x86 \xD9\x87\xD9\x85 \xD8\xA7\xD8\xB3 \xD8\xA7\xD9\x85 \xD8\xA7\xD8\xB3 \xDB\x8C\xD8\xA7\xD8\xAF\xD8\xA2\xD9\x88\xD8\xB1 \xD9\x81\xD8\xB1\xD8\xB3\xD8\xAA\xD8\xA7\xD8\xAF\xD9\x85 :))"
|
87
|
-
- !ruby/object:TwitterSearch::Tweet
|
88
|
-
created_at: Tue, 15 Jul 2008 17:35:42 +0000
|
89
|
-
from_user: gerashi
|
90
|
-
id: 859205791
|
91
|
-
language: ar
|
92
|
-
text: "\xD9\x87\xD9\x86\xD9\x88\xD8\xB2 \xD9\x87\xD9\x85 \xD8\xB3\xDB\x8C\xD8\xA7\xD9\x88\xD8\xB4. \xD8\xA8\xD8\xB1\xD8\xA7 \xDA\x86\xDB\x8C \xD8\xA7\xDB\x8C\xD9\x86\xD9\x82\xD8\xAF\xD9\x87 \xD8\xAD\xD8\xA7\xD9\x84 \xD9\x85\xDB\x8C\xE2\x80\x8C\xDA\xA9\xD9\x86\xD9\x85 \xD8\xA8\xD8\xA7 \xD8\xA7\xDB\x8C\xD9\x86 \xD8\xA2\xD9\x84\xD8\xA8\xD9\x88\xD9\x85 \xD8\xA2\xD8\xAE\xD9\x87\xD8\x9F! \xDB\x8C\xDA\xA9\xDB\x8C \xD8\xA8\xD8\xB2\xD9\x86\xD9\x87 \xD9\xBE\xD8\xB3 \xDA\xA9\xD9\x84\xD9\x85 \xD9\x84\xD8\xB7\xD9\x81\xD8\xA7\xD9\x8B"
|
93
|
-
- !ruby/object:TwitterSearch::Tweet
|
94
|
-
created_at: Tue, 15 Jul 2008 17:31:19 +0000
|
95
|
-
from_user: donbaleh
|
96
|
-
id: 859201827
|
97
|
-
language: ar
|
98
|
-
text: "\xD8\xB3\xD8\xAE\xD9\x86\xDA\xAF\xD9\x88\xD9\x8A \xD9\x86\xD9\x8A\xD8\xB1\xD9\x88\xD9\x87\xD8\xA7\xD9\x8A \xDA\x86\xD9\x86\xD8\xAF\xD9\x85\xD9\x84\xD9\x8A\xD8\xAA\xD9\x8A \xD8\xAF\xD8\xB1 \xD8\xB9\xD8\xB1\xD8\xA7\xD9\x82 \xD8\xA7\xD8\xB9\xD9\x84\xD8\xA7\xD9\x85 \xDA\xA9\xD8\xB1\xD8\xAF: \xD9\x81\xD8\xB1\xD9\x85\xD8\xA7\xD9\x86\xD8\xAF\xD9\x87 \xD8\xA2\xD9\x85\xD8\xB1\xDB\x8C\xDA\xA9\xD8\xA7\xDB\x8C\xDB\x8C \xD8\xA8\xD8\xA7 \xD8\xA7\xD8\xAD\xD9\x85\xD8\xAF\xDB\x8C \xD9\x86\xDA\x98\xD8\xA7\xD8\xAF \xD8\xB9\xDA\xA9\xD8\xB3 \xD9\x86\xDA\xAF\xD8\xB1\xD9\x81\xD8\xAA\xD9\x87 : \xD8\xAF\xD8\xB1 \xD8\xAD\xD8\xA7\xD9\x84\xDB\x8C \xDA\xA9\xD9\x87 \xD8\xB1\xD8\xA6\xDB\x8C\xD8\xB3\xE2\x80\x8C\xD8\xAC.. http://tinyurl.com/5v3jqu"
|
99
|
-
results_per_page: 15
|
100
|
-
since_id: 853023205
|