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 CHANGED
@@ -1,8 +1,7 @@
1
1
  require 'rake'
2
2
  require 'rake/testtask'
3
- require 'date'
4
3
 
5
- test_files_pattern = 'test/rails_root/test/{unit,functional,other}/**/*_test.rb'
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
- spec = Gem::Specification.new do |s|
16
- s.name = "twitter-search"
17
- s.summary = "Ruby client for Twitter Search."
18
- s.email = "dcroak@thoughtbot.com"
19
- s.homepage = "http://github.com/dancroak/twitter-search"
20
- s.description = "Ruby client for Twitter Search."
21
- s.authors = ["Dustin Sallings", "Dan Croak"]
22
- s.files = FileList["[A-Z]*", "{lib,test}/**/*"]
23
- s.add_dependency('json', '>= 1.1.2')
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
- begin
27
- require 'rubygems'
28
- require 'jeweler'
29
- Jeweler.gemspec = spec
30
- rescue LoadError
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__))
@@ -6,13 +6,13 @@ require 'cgi'
6
6
  module TwitterSearch
7
7
 
8
8
  class Tweet
9
- VARS = [:text, :from_user, :created_at, :id]
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(h)
14
- @language = h['iso_language_code']
15
- VARS.each { |v| instance_variable_set "@#{v}", h[v.to_s] }
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(h)
26
- @results = h['results'].map { |tweet| Tweet.new tweet }
27
- VARS.each { |v| instance_variable_set "@#{v}", h[v.to_s] }
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 = URI.parse 'http://search.twitter.com/search.json'
50
- url.query = sanitize_query opts
51
- Tweets.new JSON.parse(Net::HTTP.get(url))
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.map{ |k,v| "#{CGI.escape(k.to_s)}=#{CGI.escape(v.to_s)}" }.join('&')
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.1
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: 2008-10-17 00:00:00 -07:00
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
@@ -1,4 +0,0 @@
1
- ---
2
- patch: 1
3
- major: 0
4
- minor: 5
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
@@ -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
@@ -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