imap-backup 6.0.0 → 6.0.1

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.
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