vmail 0.8.8 → 0.8.9

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.
@@ -35,9 +35,15 @@ module Vmail
35
35
  end
36
36
 
37
37
  # holds mail objects keyed by [mailbox, uid]
38
- # TODO don't cache a mail if too large; or come up with a way to purge
38
+ # TODO come up with a way to purge periodically
39
39
  def message_cache
40
40
  @message_cache ||= {}
41
+ size = @message_cache.values.reduce(0) {|sum, x| sum + x[:size]}
42
+ if size > 2_000_000 # TODO make this configurable
43
+ log "PRUNING MESSAGE CACHE; message cache is consuming #{number_to_human_size size}"
44
+ @message_cache.keys[0, @message_cache.size / 2].each {|k| @message_cache.delete(k)}
45
+ end
46
+ @message_cache
41
47
  end
42
48
 
43
49
  def open
@@ -249,7 +255,7 @@ module Vmail
249
255
  # borrowed from ActionView/Helpers
250
256
  def number_to_human_size(number)
251
257
  if number.to_i < 1024
252
- "#{number} b"
258
+ number = 1024 # round up to 1kh
253
259
  else
254
260
  max_exp = UNITS.size - 1
255
261
  exponent = (Math.log(number) / Math.log(1024)).to_i # Convert to base 1024
@@ -385,46 +391,52 @@ module Vmail
385
391
  x
386
392
  else
387
393
  log "- fetching and storing to message_cache[[#{@mailbox}, #{uid}]]"
388
- fetch_and_cache(uid)
394
+ fetch_and_cache(index)
389
395
  end
390
- # pre-fetch prev and next
391
396
 
397
+ # make this more DRY later by directly using a ref to the hash
392
398
  mail = data[:mail]
393
- size = data[:size]
399
+ size = data[:size]
394
400
  @current_message_index = index
395
401
  @current_mail = mail # used later to show raw message or extract attachments if any
396
- formatter = Vmail::MessageFormatter.new(mail)
397
- out = formatter.process_body
398
- @current_message = <<-EOF
399
- #{@mailbox} seqno:#{envelope_data[:seqno]} uid:#{uid} #{number_to_human_size size} #{format_parts_info(formatter.list_parts)}
400
- #{divider '-'}
401
- #{format_headers(formatter.extract_headers)}
402
-
403
- #{out}
404
- EOF
402
+ @current_message = data[:message_text]
405
403
  rescue
406
404
  log "parsing error"
407
405
  "Error encountered parsing this message:\n#{$!}\n#{$!.backtrace.join("\n")}"
408
406
  end
409
407
 
410
- def fetch_and_cache(uid)
408
+ def fetch_and_cache(index)
409
+ envelope_data = @message_list[index]
410
+ return unless envelope_data
411
+ seqno = envelope_data[:seqno]
412
+ uid = envelope_data[:uid]
411
413
  return if message_cache[[@mailbox, uid]]
412
414
  fetch_data = reconnect_if_necessary do
415
+ # log "@imap.uid_fetch #{uid}"
413
416
  @imap.uid_fetch(uid, ["FLAGS", "RFC822", "RFC822.SIZE"])[0]
414
417
  end
415
- d = {:mail => Mail.new(fetch_data.attr['RFC822']), :size => fetch_data.attr["RFC822.SIZE"]}
418
+ size = fetch_data.attr["RFC822.SIZE"]
419
+ mail = Mail.new(fetch_data.attr['RFC822'])
420
+ formatter = Vmail::MessageFormatter.new(mail)
421
+ message_text = <<-EOF
422
+ #{@mailbox} seqno:#{envelope_data[:seqno]} uid:#{uid} #{number_to_human_size size} #{format_parts_info(formatter.list_parts)}
423
+ #{divider '-'}
424
+ #{format_headers(formatter.extract_headers)}
425
+
426
+ #{formatter.process_body}
427
+ EOF
416
428
  log "storing message_cache[[#{@mailbox}, #{uid}]]"
429
+ d = {:mail => mail, :size => size, :message_text => message_text}
417
430
  message_cache[[@mailbox, uid]] = d
418
- d
431
+ rescue
432
+ msg = "Error encountered parsing message index #{index} seqno #{seqno} uid #{uid}:\n#{$!}\n#{$!.backtrace.join("\n")}"
433
+ log msg
419
434
  end
420
435
 
421
436
  def prefetch_adjacent(index)
422
437
  Thread.new do
423
438
  [index + 1, index - 1].each do |idx|
424
- envelope_data = @message_list[idx]
425
- next unless envelope_data
426
- uid = envelope_data[:uid]
427
- fetch_and_cache(uid)
439
+ fetch_and_cache(idx)
428
440
  end
429
441
  end
430
442
  end
@@ -1,3 +1,3 @@
1
1
  module Vmail
2
- VERSION = "0.8.8"
2
+ VERSION = "0.8.9"
3
3
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 8
8
- - 8
9
- version: 0.8.8
8
+ - 9
9
+ version: 0.8.9
10
10
  platform: ruby
11
11
  authors:
12
12
  - Daniel Choi