imap-backup 14.4.1 → 14.4.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.
- checksums.yaml +4 -4
- data/bin/imap-backup +5 -2
- data/docs/api.md +20 -0
- data/docs/development.md +18 -7
- data/lib/imap/backup/account/backup.rb +6 -3
- data/lib/imap/backup/account/backup_folders.rb +6 -3
- data/lib/imap/backup/account/client_factory.rb +3 -2
- data/lib/imap/backup/account/folder.rb +10 -9
- data/lib/imap/backup/account/folder_backup.rb +5 -4
- data/lib/imap/backup/account/folder_ensurer.rb +5 -2
- data/lib/imap/backup/account/local_only_folder_deleter.rb +7 -3
- data/lib/imap/backup/account/restore.rb +5 -2
- data/lib/imap/backup/account/serialized_folders.rb +3 -2
- data/lib/imap/backup/account.rb +85 -0
- data/lib/imap/backup/cli/backup.rb +14 -12
- data/lib/imap/backup/cli/folder_enumerator.rb +5 -5
- data/lib/imap/backup/cli/local/check.rb +4 -2
- data/lib/imap/backup/cli/local.rb +50 -49
- data/lib/imap/backup/cli/remote.rb +46 -46
- data/lib/imap/backup/cli/restore.rb +5 -3
- data/lib/imap/backup/cli/setup.rb +4 -2
- data/lib/imap/backup/cli/single/backup.rb +3 -3
- data/lib/imap/backup/cli/stats.rb +54 -52
- data/lib/imap/backup/cli/transfer.rb +93 -93
- data/lib/imap/backup/cli/utils.rb +28 -28
- data/lib/imap/backup/cli.rb +12 -0
- data/lib/imap/backup/client/default.rb +5 -5
- data/lib/imap/backup/configuration.rb +5 -4
- data/lib/imap/backup/downloader.rb +6 -14
- data/lib/imap/backup/email/mboxrd/message.rb +2 -3
- data/lib/imap/backup/file_mode.rb +4 -2
- data/lib/imap/backup/flag_refresher.rb +3 -3
- data/lib/imap/backup/local_only_message_deleter.rb +5 -3
- data/lib/imap/backup/migrator.rb +6 -4
- data/lib/imap/backup/mirror/map.rb +3 -3
- data/lib/imap/backup/mirror.rb +5 -5
- data/lib/imap/backup/serializer/appender.rb +7 -4
- data/lib/imap/backup/serializer/delayed_metadata_serializer.rb +15 -2
- data/lib/imap/backup/serializer/directory.rb +12 -3
- data/lib/imap/backup/serializer/folder_maker.rb +12 -4
- data/lib/imap/backup/serializer/imap.rb +5 -1
- data/lib/imap/backup/serializer/integrity_checker.rb +10 -3
- data/lib/imap/backup/serializer/mbox.rb +2 -1
- data/lib/imap/backup/serializer/message.rb +10 -18
- data/lib/imap/backup/serializer/permission_checker.rb +5 -3
- data/lib/imap/backup/serializer/transaction.rb +4 -1
- data/lib/imap/backup/serializer/unused_name_finder.rb +4 -2
- data/lib/imap/backup/serializer/version2_migrator.rb +2 -2
- data/lib/imap/backup/serializer.rb +5 -0
- data/lib/imap/backup/setup/account/header.rb +3 -3
- data/lib/imap/backup/setup/account.rb +6 -6
- data/lib/imap/backup/setup/asker.rb +6 -4
- data/lib/imap/backup/setup/backup_path.rb +3 -4
- data/lib/imap/backup/setup/connection_tester.rb +4 -2
- data/lib/imap/backup/setup/{email.rb → email_changer.rb} +4 -4
- data/lib/imap/backup/setup/folder_chooser.rb +2 -2
- data/lib/imap/backup/setup/global_options/download_strategy_chooser.rb +2 -2
- data/lib/imap/backup/setup/global_options.rb +2 -2
- data/lib/imap/backup/setup.rb +2 -2
- data/lib/imap/backup/text/sanitizer.rb +2 -2
- data/lib/imap/backup/thunderbird/mailbox_exporter.rb +10 -8
- data/lib/imap/backup/uploader.rb +3 -3
- data/lib/imap/backup/version.rb +1 -1
- metadata +4 -4
- data/lib/imap/backup/cli_coverage.rb +0 -21
@@ -4,9 +4,6 @@ module Imap; end
|
|
4
4
|
|
5
5
|
module Imap::Backup
|
6
6
|
class Serializer::PermissionChecker
|
7
|
-
attr_reader :filename
|
8
|
-
attr_reader :limit
|
9
|
-
|
10
7
|
def initialize(filename:, limit:)
|
11
8
|
@filename = filename
|
12
9
|
@limit = limit
|
@@ -26,5 +23,10 @@ module Imap::Backup
|
|
26
23
|
)
|
27
24
|
raise message
|
28
25
|
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :filename
|
30
|
+
attr_reader :limit
|
29
31
|
end
|
30
32
|
end
|
@@ -2,7 +2,6 @@ module Imap; end
|
|
2
2
|
|
3
3
|
module Imap::Backup
|
4
4
|
class Serializer::Transaction
|
5
|
-
attr_reader :owner
|
6
5
|
attr_reader :data
|
7
6
|
|
8
7
|
def initialize(owner:)
|
@@ -33,5 +32,9 @@ module Imap::Backup
|
|
33
32
|
def fail_outside_transaction!(method)
|
34
33
|
raise "#{owner.class}##{method} can only be called inside a transaction" if !in_transaction?
|
35
34
|
end
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
attr_reader :owner
|
36
39
|
end
|
37
40
|
end
|
@@ -4,8 +4,6 @@ module Imap; end
|
|
4
4
|
|
5
5
|
module Imap::Backup
|
6
6
|
class Serializer::UnusedNameFinder
|
7
|
-
attr_reader :serializer
|
8
|
-
|
9
7
|
def initialize(serializer:)
|
10
8
|
@serializer = serializer
|
11
9
|
end
|
@@ -25,5 +23,9 @@ module Imap::Backup
|
|
25
23
|
|
26
24
|
folder
|
27
25
|
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
attr_reader :serializer
|
28
30
|
end
|
29
31
|
end
|
@@ -6,8 +6,6 @@ module Imap; end
|
|
6
6
|
|
7
7
|
module Imap::Backup
|
8
8
|
class Serializer::Version2Migrator
|
9
|
-
attr_reader :folder_path
|
10
|
-
|
11
9
|
def initialize(folder_path)
|
12
10
|
@folder_path = folder_path
|
13
11
|
end
|
@@ -39,6 +37,8 @@ module Imap::Backup
|
|
39
37
|
|
40
38
|
private
|
41
39
|
|
40
|
+
attr_reader :folder_path
|
41
|
+
|
42
42
|
def imap_pathname
|
43
43
|
"#{folder_path}.imap"
|
44
44
|
end
|
@@ -35,6 +35,11 @@ module Imap::Backup
|
|
35
35
|
@validated = nil
|
36
36
|
end
|
37
37
|
|
38
|
+
# Calls the supplied block.
|
39
|
+
# This method is present so that this class implements the same
|
40
|
+
# interface as {DelayedMetadataSerializer}
|
41
|
+
#
|
42
|
+
# @return [void]
|
38
43
|
def transaction(&block)
|
39
44
|
block.call
|
40
45
|
end
|
@@ -9,9 +9,6 @@ module Imap::Backup
|
|
9
9
|
class Setup::Account; end
|
10
10
|
|
11
11
|
class Setup::Account::Header
|
12
|
-
attr_reader :account
|
13
|
-
attr_reader :menu
|
14
|
-
|
15
12
|
def initialize(menu:, account:)
|
16
13
|
@menu = menu
|
17
14
|
@account = account
|
@@ -41,6 +38,9 @@ module Imap::Backup
|
|
41
38
|
|
42
39
|
private
|
43
40
|
|
41
|
+
attr_reader :account
|
42
|
+
attr_reader :menu
|
43
|
+
|
44
44
|
def modified_flag
|
45
45
|
account.modified? ? "*" : ""
|
46
46
|
end
|
@@ -2,7 +2,7 @@ require "imap/backup/setup/account/header"
|
|
2
2
|
require "imap/backup/setup/asker"
|
3
3
|
require "imap/backup/setup/backup_path"
|
4
4
|
require "imap/backup/setup/connection_tester"
|
5
|
-
require "imap/backup/setup/
|
5
|
+
require "imap/backup/setup/email_changer"
|
6
6
|
require "imap/backup/setup/folder_chooser"
|
7
7
|
|
8
8
|
module Imap; end
|
@@ -11,10 +11,6 @@ module Imap::Backup
|
|
11
11
|
class Setup; end
|
12
12
|
|
13
13
|
class Setup::Account
|
14
|
-
attr_reader :account
|
15
|
-
attr_reader :config
|
16
|
-
attr_reader :highline
|
17
|
-
|
18
14
|
def initialize(config, account, highline)
|
19
15
|
@account = account
|
20
16
|
@config = config
|
@@ -36,6 +32,10 @@ module Imap::Backup
|
|
36
32
|
|
37
33
|
private
|
38
34
|
|
35
|
+
attr_reader :account
|
36
|
+
attr_reader :config
|
37
|
+
attr_reader :highline
|
38
|
+
|
39
39
|
def create_menu
|
40
40
|
highline.choose do |menu|
|
41
41
|
header menu
|
@@ -62,7 +62,7 @@ module Imap::Backup
|
|
62
62
|
|
63
63
|
def modify_email(menu)
|
64
64
|
menu.choice("modify email") do
|
65
|
-
Setup::
|
65
|
+
Setup::EmailChanger.new(account: account, config: config).run
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -4,10 +4,6 @@ module Imap::Backup
|
|
4
4
|
class Setup; end
|
5
5
|
|
6
6
|
class Setup::Asker
|
7
|
-
EMAIL_MATCHER = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]+$/i.freeze
|
8
|
-
|
9
|
-
attr_reader :highline
|
10
|
-
|
11
7
|
def initialize(highline)
|
12
8
|
@highline = highline
|
13
9
|
end
|
@@ -40,5 +36,11 @@ module Imap::Backup
|
|
40
36
|
def self.password
|
41
37
|
new(Setup.highline).password
|
42
38
|
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
EMAIL_MATCHER = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]+$/i.freeze
|
43
|
+
|
44
|
+
attr_reader :highline
|
43
45
|
end
|
44
46
|
end
|
@@ -4,9 +4,6 @@ module Imap::Backup
|
|
4
4
|
class Setup; end
|
5
5
|
|
6
6
|
class Setup::BackupPath
|
7
|
-
attr_reader :account
|
8
|
-
attr_reader :config
|
9
|
-
|
10
7
|
def initialize(account:, config:)
|
11
8
|
@account = account
|
12
9
|
@config = config
|
@@ -15,7 +12,6 @@ module Imap::Backup
|
|
15
12
|
def run
|
16
13
|
account.local_path = highline.ask("backup directory: ") do |q|
|
17
14
|
q.default = account.local_path
|
18
|
-
q.readline = true
|
19
15
|
q.validate = ->(path) { path_modification_validator(path) }
|
20
16
|
q.responses[:not_valid] = "Choose a different directory "
|
21
17
|
end
|
@@ -23,6 +19,9 @@ module Imap::Backup
|
|
23
19
|
|
24
20
|
private
|
25
21
|
|
22
|
+
attr_reader :account
|
23
|
+
attr_reader :config
|
24
|
+
|
26
25
|
def highline
|
27
26
|
Setup.highline
|
28
27
|
end
|
@@ -6,8 +6,6 @@ module Imap::Backup
|
|
6
6
|
class Setup; end
|
7
7
|
|
8
8
|
class Setup::ConnectionTester
|
9
|
-
attr_reader :account
|
10
|
-
|
11
9
|
def initialize(account)
|
12
10
|
@account = account
|
13
11
|
end
|
@@ -20,5 +18,9 @@ module Imap::Backup
|
|
20
18
|
rescue StandardError => e
|
21
19
|
"Unexpected error: #{e}"
|
22
20
|
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
attr_reader :account
|
23
25
|
end
|
24
26
|
end
|
@@ -6,10 +6,7 @@ module Imap; end
|
|
6
6
|
module Imap::Backup
|
7
7
|
class Setup; end
|
8
8
|
|
9
|
-
class Setup::
|
10
|
-
attr_reader :account
|
11
|
-
attr_reader :config
|
12
|
-
|
9
|
+
class Setup::EmailChanger
|
13
10
|
def initialize(account:, config:)
|
14
11
|
@account = account
|
15
12
|
@config = config
|
@@ -34,6 +31,9 @@ module Imap::Backup
|
|
34
31
|
|
35
32
|
private
|
36
33
|
|
34
|
+
attr_reader :account
|
35
|
+
attr_reader :config
|
36
|
+
|
37
37
|
def default_server(username)
|
38
38
|
provider = Email::Provider.for_address(username)
|
39
39
|
|
@@ -6,8 +6,6 @@ module Imap::Backup
|
|
6
6
|
class Setup; end
|
7
7
|
|
8
8
|
class Setup::FolderChooser
|
9
|
-
attr_reader :account
|
10
|
-
|
11
9
|
def initialize(account)
|
12
10
|
@account = account
|
13
11
|
end
|
@@ -36,6 +34,8 @@ module Imap::Backup
|
|
36
34
|
|
37
35
|
private
|
38
36
|
|
37
|
+
attr_reader :account
|
38
|
+
|
39
39
|
def show_menu
|
40
40
|
highline.choose do |menu|
|
41
41
|
menu.header = <<~MENU.chomp
|
@@ -6,8 +6,6 @@ class Imap::Backup::Setup; end
|
|
6
6
|
|
7
7
|
class Imap::Backup::Setup::GlobalOptions
|
8
8
|
class DownloadStrategyChooser
|
9
|
-
attr_reader :config
|
10
|
-
|
11
9
|
def initialize(config:)
|
12
10
|
@config = config
|
13
11
|
end
|
@@ -23,6 +21,8 @@ class Imap::Backup::Setup::GlobalOptions
|
|
23
21
|
|
24
22
|
private
|
25
23
|
|
24
|
+
attr_reader :config
|
25
|
+
|
26
26
|
def create_menu
|
27
27
|
strategies = Imap::Backup::Configuration::DOWNLOAD_STRATEGIES
|
28
28
|
highline.choose do |menu|
|
@@ -7,8 +7,6 @@ module Imap::Backup
|
|
7
7
|
class Setup; end
|
8
8
|
|
9
9
|
class Setup::GlobalOptions
|
10
|
-
attr_reader :config
|
11
|
-
|
12
10
|
def initialize(config:)
|
13
11
|
@config = config
|
14
12
|
end
|
@@ -24,6 +22,8 @@ module Imap::Backup
|
|
24
22
|
|
25
23
|
private
|
26
24
|
|
25
|
+
attr_reader :config
|
26
|
+
|
27
27
|
def show_menu
|
28
28
|
highline.choose do |menu|
|
29
29
|
menu.header = <<~MENU.chomp
|
data/lib/imap/backup/setup.rb
CHANGED
@@ -16,8 +16,6 @@ module Imap::Backup
|
|
16
16
|
end
|
17
17
|
self.highline = HighLine.new
|
18
18
|
|
19
|
-
attr_accessor :config
|
20
|
-
|
21
19
|
def initialize(config:)
|
22
20
|
@config = config
|
23
21
|
end
|
@@ -33,6 +31,8 @@ module Imap::Backup
|
|
33
31
|
|
34
32
|
private
|
35
33
|
|
34
|
+
attr_accessor :config
|
35
|
+
|
36
36
|
def show_menu
|
37
37
|
self.class.highline.choose do |menu|
|
38
38
|
menu.header = <<~MENU.chomp
|
@@ -8,8 +8,6 @@ module Imap::Backup
|
|
8
8
|
class Text::Sanitizer
|
9
9
|
extend Forwardable
|
10
10
|
|
11
|
-
attr_reader :output
|
12
|
-
|
13
11
|
delegate puts: :output
|
14
12
|
delegate write: :output
|
15
13
|
|
@@ -39,6 +37,8 @@ module Imap::Backup
|
|
39
37
|
|
40
38
|
private
|
41
39
|
|
40
|
+
attr_reader :output
|
41
|
+
|
42
42
|
def sanitize(text)
|
43
43
|
# Hide password in Net::IMAP debug output
|
44
44
|
text.gsub(
|
@@ -5,14 +5,9 @@ require "imap/backup/logger"
|
|
5
5
|
module Imap; end
|
6
6
|
|
7
7
|
module Imap::Backup
|
8
|
-
class Thunderbird
|
9
|
-
EXPORT_PREFIX = "imap-backup".freeze
|
10
|
-
|
11
|
-
attr_reader :email
|
12
|
-
attr_reader :serializer
|
13
|
-
attr_reader :profile
|
14
|
-
attr_reader :force
|
8
|
+
class Thunderbird; end
|
15
9
|
|
10
|
+
class Thunderbird::MailboxExporter
|
16
11
|
def initialize(email, serializer, profile, force: false)
|
17
12
|
@email = email
|
18
13
|
@serializer = serializer
|
@@ -48,6 +43,13 @@ module Imap::Backup
|
|
48
43
|
|
49
44
|
private
|
50
45
|
|
46
|
+
EXPORT_PREFIX = "imap-backup".freeze
|
47
|
+
|
48
|
+
attr_reader :email
|
49
|
+
attr_reader :serializer
|
50
|
+
attr_reader :profile
|
51
|
+
attr_reader :force
|
52
|
+
|
51
53
|
def profile_set_up
|
52
54
|
File.exist?(profile.local_folders_path)
|
53
55
|
end
|
@@ -95,7 +97,7 @@ module Imap::Backup
|
|
95
97
|
@local_folder ||= begin
|
96
98
|
top_level_folders = [EXPORT_PREFIX, email]
|
97
99
|
prefixed_folder_path = File.join(top_level_folders, serializer.folder)
|
98
|
-
Thunderbird::LocalFolder.new(profile, prefixed_folder_path)
|
100
|
+
::Thunderbird::LocalFolder.new(profile, prefixed_folder_path)
|
99
101
|
end
|
100
102
|
end
|
101
103
|
|
data/lib/imap/backup/uploader.rb
CHANGED
@@ -6,9 +6,6 @@ module Imap; end
|
|
6
6
|
|
7
7
|
module Imap::Backup
|
8
8
|
class Uploader
|
9
|
-
attr_reader :folder
|
10
|
-
attr_reader :serializer
|
11
|
-
|
12
9
|
def initialize(folder, serializer)
|
13
10
|
@folder = folder
|
14
11
|
@serializer = serializer
|
@@ -32,6 +29,9 @@ module Imap::Backup
|
|
32
29
|
|
33
30
|
private
|
34
31
|
|
32
|
+
attr_reader :folder
|
33
|
+
attr_reader :serializer
|
34
|
+
|
35
35
|
def upload_message(message, index)
|
36
36
|
return if message.nil?
|
37
37
|
|
data/lib/imap/backup/version.rb
CHANGED
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: 14.4.
|
4
|
+
version: 14.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Yates
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-11-
|
11
|
+
date: 2023-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: highline
|
@@ -133,6 +133,7 @@ files:
|
|
133
133
|
- LICENSE
|
134
134
|
- README.md
|
135
135
|
- bin/imap-backup
|
136
|
+
- docs/api.md
|
136
137
|
- docs/delimiters-and-prefixes.md
|
137
138
|
- docs/development.md
|
138
139
|
- docs/migrate-server-keep-address.md
|
@@ -162,7 +163,6 @@ files:
|
|
162
163
|
- lib/imap/backup/cli/stats.rb
|
163
164
|
- lib/imap/backup/cli/transfer.rb
|
164
165
|
- lib/imap/backup/cli/utils.rb
|
165
|
-
- lib/imap/backup/cli_coverage.rb
|
166
166
|
- lib/imap/backup/client/apple_mail.rb
|
167
167
|
- lib/imap/backup/client/automatic_login_wrapper.rb
|
168
168
|
- lib/imap/backup/client/default.rb
|
@@ -206,7 +206,7 @@ files:
|
|
206
206
|
- lib/imap/backup/setup/asker.rb
|
207
207
|
- lib/imap/backup/setup/backup_path.rb
|
208
208
|
- lib/imap/backup/setup/connection_tester.rb
|
209
|
-
- lib/imap/backup/setup/
|
209
|
+
- lib/imap/backup/setup/email_changer.rb
|
210
210
|
- lib/imap/backup/setup/folder_chooser.rb
|
211
211
|
- lib/imap/backup/setup/global_options.rb
|
212
212
|
- lib/imap/backup/setup/global_options/download_strategy_chooser.rb
|
@@ -1,21 +0,0 @@
|
|
1
|
-
module Imap; end
|
2
|
-
|
3
|
-
module Imap::Backup
|
4
|
-
class CliCoverage
|
5
|
-
def self.conditionally_activate
|
6
|
-
return if !ENV.key?("COVERAGE")
|
7
|
-
|
8
|
-
# Collect coverage separately
|
9
|
-
ENV["SIMPLECOV_COMMAND_NAME"] = "#{ENV.fetch('COVERAGE')} #{ARGV.join(' ')} coverage"
|
10
|
-
require "simplecov"
|
11
|
-
|
12
|
-
# Silence output
|
13
|
-
SimpleCov.formatter = SimpleCov::Formatter::SimpleFormatter
|
14
|
-
SimpleCov.print_error_status = false
|
15
|
-
|
16
|
-
# Ensure SimpleCov doesn't filter out all out code
|
17
|
-
project_root = File.expand_path("..", __dir__)
|
18
|
-
SimpleCov.root project_root
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|