imap-backup 6.0.0 → 6.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 00576d7b3a0482f2e2ede92e545a5bbebcdf5ab2a688feb8e0c54281a1d9ba9a
4
- data.tar.gz: e8bc14ff755f817cb08f4b979b6c689d4ee87c1b9d96acca4d0dc2a8297a40a7
3
+ metadata.gz: 6d4b9386097e77af34706992fb42b6ff9edd3a62a3cfb98e0b3363d864ee75dc
4
+ data.tar.gz: d72ec8493ea2436ccb033f2957d44236b71d3c607e25b15b0b755e93f011da10
5
5
  SHA512:
6
- metadata.gz: 155476a2d92177685b58802d1431a15975161fcee512f43ee79cb332078faba8e0247f81020eb4c92c20fdb308ec6bb1650136cf1d92f468e4ece68142717e67
7
- data.tar.gz: ddd269797169fdbc255ef907bb30a9c66775709ad32bc10f2a3d6ec75da441625269db307ed3bfa8e06dd3f076ff313e6124d47be73654c1f2b2cc8202e1f55a
6
+ metadata.gz: ab38ba548fa009c6f718f8da9b9fbb971751297eac03d2839e14f247c06d6858a155350291619090ef8165ffeb865674a19ef51c13dbf1220928106abfc79fa5
7
+ data.tar.gz: ad4e17a2b6b0b5a9ee1cc4737c324981069525a129018278514e51e8664008c71fc610539df58a2da590084bb7e3c46cd635fe1409ba0b53ad56bd241edfb9c8
@@ -18,12 +18,13 @@ module Imap::Backup
18
18
  @server = options[:server]
19
19
  @connection_options = options[:connection_options]
20
20
  @multi_fetch_size = options[:multi_fetch_size]
21
+ @connection = nil
21
22
  @changes = {}
22
23
  @marked_for_deletion = false
23
24
  end
24
25
 
25
26
  def connection
26
- Account::Connection.new(self)
27
+ @connection ||= Account::Connection.new(self)
27
28
  end
28
29
 
29
30
  def valid?
@@ -114,6 +115,7 @@ module Imap::Backup
114
115
  changes[field] = {from: current, to: value} if value != current
115
116
  end
116
117
 
118
+ @connection = nil
117
119
  instance_variable_set(key, value)
118
120
  end
119
121
  end
@@ -12,6 +12,15 @@ module Imap::Backup
12
12
  @loaded = false
13
13
  @uid_validity = nil
14
14
  @uids = nil
15
+ @version = nil
16
+ end
17
+
18
+ def valid?
19
+ return false if !exist?
20
+ return false if version != CURRENT_VERSION
21
+ return false if !uid_validity
22
+
23
+ true
15
24
  end
16
25
 
17
26
  def append(uid)
@@ -19,8 +28,10 @@ module Imap::Backup
19
28
  save
20
29
  end
21
30
 
22
- def exist?
23
- File.exist?(pathname)
31
+ def delete
32
+ return if !exist?
33
+
34
+ File.unlink(pathname)
24
35
  end
25
36
 
26
37
  def include?(uid)
@@ -66,12 +77,21 @@ module Imap::Backup
66
77
  save
67
78
  end
68
79
 
80
+ def version
81
+ ensure_loaded
82
+ @version
83
+ end
84
+
69
85
  private
70
86
 
71
87
  def pathname
72
88
  "#{folder_path}.imap"
73
89
  end
74
90
 
91
+ def exist?
92
+ File.exist?(pathname)
93
+ end
94
+
75
95
  def ensure_loaded
76
96
  return if loaded
77
97
 
@@ -79,9 +99,11 @@ module Imap::Backup
79
99
  if data
80
100
  @uids = data[:uids].map(&:to_i)
81
101
  @uid_validity = data[:uid_validity]
102
+ @version = data[:version]
82
103
  else
83
104
  @uids = []
84
105
  @uid_validity = nil
106
+ @version = CURRENT_VERSION
85
107
  end
86
108
  @loaded = true
87
109
  end
@@ -97,6 +119,8 @@ module Imap::Backup
97
119
  return nil
98
120
  end
99
121
 
122
+ return nil if !data.key?(:version)
123
+ return nil if !data.key?(:uid_validity)
100
124
  return nil if !data.key?(:uids)
101
125
  return nil if !data[:uids].is_a?(Array)
102
126
 
@@ -109,7 +133,7 @@ module Imap::Backup
109
133
  raise "Cannot save metadata without a uid_validity" if !uid_validity
110
134
 
111
135
  data = {
112
- version: CURRENT_VERSION,
136
+ version: @version,
113
137
  uid_validity: @uid_validity,
114
138
  uids: @uids
115
139
  }
@@ -6,14 +6,20 @@ module Imap::Backup
6
6
  @folder_path = folder_path
7
7
  end
8
8
 
9
+ def valid?
10
+ exist?
11
+ end
12
+
9
13
  def append(message)
10
14
  File.open(pathname, "ab") do |file|
11
15
  file.write message
12
16
  end
13
17
  end
14
18
 
15
- def exist?
16
- File.exist?(pathname)
19
+ def delete
20
+ return if !exist?
21
+
22
+ File.unlink(pathname)
17
23
  end
18
24
 
19
25
  def length
@@ -41,5 +47,15 @@ module Imap::Backup
41
47
  f.truncate(length)
42
48
  end
43
49
  end
50
+
51
+ def touch
52
+ File.open(pathname, "a") {}
53
+ end
54
+
55
+ private
56
+
57
+ def exist?
58
+ File.exist?(pathname)
59
+ end
44
60
  end
45
61
  end
@@ -8,20 +8,18 @@ module Imap::Backup
8
8
 
9
9
  def run
10
10
  digit = 0
11
- name = nil
11
+ folder = nil
12
12
 
13
13
  loop do
14
14
  extra = digit.zero? ? "" : "-#{digit}"
15
- name = "#{serializer.folder}-#{serializer.uid_validity}#{extra}"
16
- new_folder_path = Serializer.folder_path_for(path: serializer.path, folder: name)
17
- test_mbox = Serializer::Mbox.new(new_folder_path)
18
- test_imap = Serializer::Imap.new(new_folder_path)
19
- break if !test_mbox.exist? && !test_imap.exist?
15
+ folder = "#{serializer.folder}-#{serializer.uid_validity}#{extra}"
16
+ test = Serializer.new(serializer.path, folder)
17
+ break if !test.validate!
20
18
 
21
19
  digit += 1
22
20
  end
23
21
 
24
- name
22
+ folder
25
23
  end
26
24
  end
27
25
  end
@@ -28,10 +28,25 @@ module Imap::Backup
28
28
  @folder = folder
29
29
  end
30
30
 
31
+ # Returns true if there are existing, valid files
32
+ # false otherwise (in which case any existing files are deleted)
33
+ def validate!
34
+ return true if imap.valid? && mbox.valid?
35
+
36
+ imap.delete
37
+ @imap = nil
38
+ mbox.delete
39
+ @mbox = nil
40
+
41
+ false
42
+ end
43
+
31
44
  def apply_uid_validity(value)
45
+ validate!
46
+
32
47
  case
33
48
  when uid_validity.nil?
34
- imap.uid_validity = value
49
+ internal_force_uid_validity(value)
35
50
  nil
36
51
  when uid_validity == value
37
52
  # NOOP
@@ -42,39 +57,45 @@ module Imap::Backup
42
57
  end
43
58
 
44
59
  def force_uid_validity(value)
45
- imap.uid_validity = value
60
+ validate!
61
+
62
+ internal_force_uid_validity(value)
46
63
  end
47
64
 
48
65
  def append(uid, message)
66
+ validate!
67
+
49
68
  appender = Serializer::Appender.new(folder: folder, imap: imap, mbox: mbox)
50
69
  appender.run(uid: uid, message: message)
51
70
  end
52
71
 
53
72
  def load(uid_maybe_string)
73
+ validate!
74
+
54
75
  uid = uid_maybe_string.to_i
55
76
  message_index = imap.index(uid)
56
77
  return nil if message_index.nil?
57
78
 
58
- load_nth(message_index)
79
+ internal_load_nth(message_index)
59
80
  end
60
81
 
61
82
  def load_nth(index)
62
- enumerator = Serializer::MboxEnumerator.new(mbox.pathname)
63
- enumerator.each.with_index do |raw, i|
64
- next if i != index
83
+ validate!
65
84
 
66
- return Email::Mboxrd::Message.from_serialized(raw)
67
- end
68
- nil
85
+ internal_load_nth(index)
69
86
  end
70
87
 
71
88
  def each_message(required_uids, &block)
89
+ validate!
90
+
72
91
  return enum_for(:each_message, required_uids) if !block
73
92
 
74
93
  enumerator = Serializer::MessageEnumerator.new(imap: imap, mbox: mbox)
75
94
  enumerator.run(uids: required_uids, &block)
76
95
  end
77
96
 
97
+ private
98
+
78
99
  def rename(new_name)
79
100
  destination = self.class.folder_path_for(path: path, folder: new_name)
80
101
  ensure_containing_directory(new_name)
@@ -82,7 +103,20 @@ module Imap::Backup
82
103
  imap.rename destination
83
104
  end
84
105
 
85
- private
106
+ def internal_force_uid_validity(value)
107
+ imap.uid_validity = value
108
+ mbox.touch
109
+ end
110
+
111
+ def internal_load_nth(index)
112
+ enumerator = Serializer::MboxEnumerator.new(mbox.pathname)
113
+ enumerator.each.with_index do |raw, i|
114
+ next if i != index
115
+
116
+ return Email::Mboxrd::Message.from_serialized(raw)
117
+ end
118
+ nil
119
+ end
86
120
 
87
121
  def mbox
88
122
  @mbox ||=
@@ -115,7 +149,7 @@ module Imap::Backup
115
149
  # Clear memoization so we get empty data
116
150
  @mbox = nil
117
151
  @imap = nil
118
- imap.uid_validity = value
152
+ internal_force_uid_validity(value)
119
153
 
120
154
  new_name
121
155
  end
@@ -3,7 +3,7 @@ module Imap; end
3
3
  module Imap::Backup
4
4
  MAJOR = 6
5
5
  MINOR = 0
6
- REVISION = 0
6
+ REVISION = 1
7
7
  PRE = nil
8
8
  VERSION = [MAJOR, MINOR, REVISION, PRE].compact.map(&:to_s).join(".")
9
9
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imap-backup
3
3
  version: !ruby/object:Gem::Version
4
- version: 6.0.0
4
+ version: 6.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Yates
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-04 00:00:00.000000000 Z
11
+ date: 2022-07-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline