dancroak-twitter-search 0.5.1 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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