stackoverflow 0.1.3 → 0.1.4

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.
Files changed (2) hide show
  1. data/lib/stackoverflow.rb +59 -24
  2. metadata +3 -3
@@ -97,17 +97,17 @@ module StackOverflow
97
97
  sub_sql << "id=#{question_id}"
98
98
  end
99
99
  sql += sub_sql.join(' OR ')
100
- sql += ' ORDER BY score DESC'
100
+ sql += ' ORDER BY score DESC LIMIT 0,25'
101
101
 
102
102
  questions = []
103
103
  db_error_catching do
104
104
  @db.execute(sql) do |row|
105
- questions << { :id => row[0],
106
- :score => row[1],
107
- :body => row[2],
108
- :title => row[3],
109
- :link => '',
110
- :answers => get_answers(row[0]) }
105
+ questions << { 'id' => row[0],
106
+ 'score' => row[1],
107
+ 'body' => row[2],
108
+ 'title' => row[3],
109
+ 'link' => '',
110
+ 'answers' => get_answers(row[0]) }
111
111
  end
112
112
  end
113
113
  questions
@@ -136,9 +136,9 @@ module StackOverflow
136
136
  answers = []
137
137
  db_error_catching do
138
138
  @db.execute(sql) do |row|
139
- answers << { :id => row[0],
140
- :score => row[1],
141
- :body => row[2] }
139
+ answers << { 'id' => row[0],
140
+ 'score' => row[1],
141
+ 'body' => row[2] }
142
142
  end
143
143
  end
144
144
  answers
@@ -178,32 +178,68 @@ module StackOverflow
178
178
  end
179
179
  end
180
180
 
181
+ def can_resume?(remote_db_version)
182
+ can_resume = false
183
+ last_download_db_version_flagpath = File.join(@dir_path, ".last_download_db_version")
184
+ if file_exists?(last_download_db_version_flagpath)
185
+ File.open(last_download_db_version_flagpath, 'r') do |f|
186
+ can_resume = true if remote_db_version == f.read().to_i
187
+ end
188
+ end
189
+ File.open(last_download_db_version_flagpath, 'w+') { |f| f.write(remote_db_version.to_s) }
190
+ can_resume
191
+ end
192
+
181
193
  def update
182
194
  check_local_dir
183
195
  remote_db_version = get_remote_db_version
184
196
  db_version = get_db_version
197
+ can_resume = can_resume?(remote_db_version)
185
198
  if db_version < remote_db_version
186
199
  puts "Database update found!"
187
200
  puts "Updating from version #{db_version} to version #{remote_db_version} (several GB to download - this can take a while)..."
188
- download_all
201
+ download_all(can_resume)
189
202
  set_db_version(remote_db_version)
190
203
  end
191
204
  puts "The database is up to date (version #{get_db_version})."
192
205
  end
193
206
 
194
- def download_all
195
- download_file "stackoverflow_idx.db.gz"
196
- gunzip_file "stackoverflow_idx.db.gz"
197
- download_file "stackoverflow.db.gz"
198
- gunzip_file "stackoverflow.db.gz"
207
+ def wget_available?
208
+ available = false
209
+ ENV['PATH'].split(':').each {|folder| available = true if File.exists?(folder+'/wget')}
210
+ available
211
+ end
212
+
213
+ def download_all(can_resume)
214
+ files_names = ["stackoverflow_idx.db.gz", "stackoverflow.db.gz"]
215
+
216
+ for file_name in files_names
217
+ file_path = File.join(@dir_path, file_name)
218
+ File.delete(file_path) if file_exists?(file_path) and not can_resume
219
+
220
+ puts "Downloading #{file_path}..."
221
+ if wget_available?
222
+ wget file_name
223
+ else
224
+ puts "Warning: 'wget' utility unavailable. Install it to be able to resume failed downloads."
225
+ internal_download file_name
226
+ end
227
+
228
+ puts "Unpacking #{file_path}..."
229
+ gunzip_file file_name
230
+ end
231
+ end
232
+
233
+ def wget(file_name)
234
+ download_url = "http://#{@remote_hostname}" + File.join(@remote_path, file_name)
235
+ `wget -P #{@dir_path} -c #{download_url}`
199
236
  end
200
237
 
201
- def download_file(filename)
202
- puts "Downloading #{filename}..."
238
+ def internal_download(file_name)
203
239
  Net::HTTP.start(@remote_hostname) do |http|
204
- f = open(File.join(@dir_path, filename), "wb")
240
+ f = open(File.join(@dir_path, file_name), "wb")
205
241
  begin
206
- http.request_get(File.join(@remote_path, filename)) do |resp|
242
+ http.request_get(File.join(@remote_path, file_name)) do |resp|
207
243
  resp.read_body do |segment|
208
244
  f.write(segment)
209
245
  end
@@ -214,9 +250,8 @@ module StackOverflow
214
250
  end
215
251
  end
216
252
 
217
- def gunzip_file(filename)
218
- puts "Unpacking #{filename}..."
219
- gz_file_path = File.join(@dir_path, filename)
253
+ def gunzip_file(file_name)
254
+ gz_file_path = File.join(@dir_path, file_name)
220
255
  z = Zlib::Inflate.new(16+Zlib::MAX_WBITS)
221
256
 
222
257
  File.open(gz_file_path) do |f|
@@ -254,7 +289,7 @@ module StackOverflow
254
289
  else
255
290
  score = 0
256
291
  end
257
- t << ["[#{nb}]", "(#{score})", question['title']]
292
+ t << ["[#{nb}]", "(#{score})", question['title'][0..60]]
258
293
  nb += 1
259
294
  end
260
295
  t.style = {:padding_left => 2, :border_x => " ", :border_i => " ", :border_y => " "}
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 3
9
- version: 0.1.3
8
+ - 4
9
+ version: 0.1.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Xavier Antoviaque
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2012-03-24 00:00:00 -04:00
17
+ date: 2012-03-26 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency