imap-backup 9.4.0.pre1 → 10.0.0

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 (41) hide show
  1. checksums.yaml +4 -4
  2. data/docs/development.md +6 -0
  3. data/lib/email/mboxrd/message.rb +5 -13
  4. data/lib/imap/backup/account/backup.rb +65 -0
  5. data/lib/imap/backup/account/{connection/backup_folders.rb → backup_folders.rb} +12 -5
  6. data/lib/imap/backup/account/{connection/client_factory.rb → client_factory.rb} +11 -11
  7. data/lib/imap/backup/account/folder.rb +8 -14
  8. data/lib/imap/backup/account/folder_ensurer.rb +24 -0
  9. data/lib/imap/backup/account/local_only_folder_deleter.rb +26 -0
  10. data/lib/imap/backup/account/restore.rb +20 -0
  11. data/lib/imap/backup/account/serialized_folders.rb +41 -0
  12. data/lib/imap/backup/account.rb +16 -4
  13. data/lib/imap/backup/cli/backup.rb +6 -7
  14. data/lib/imap/backup/cli/folder_enumerator.rb +1 -1
  15. data/lib/imap/backup/cli/helpers.rb +15 -15
  16. data/lib/imap/backup/cli/local.rb +31 -19
  17. data/lib/imap/backup/cli/mirror.rb +1 -1
  18. data/lib/imap/backup/cli/remote.rb +8 -8
  19. data/lib/imap/backup/cli/restore.rb +10 -14
  20. data/lib/imap/backup/cli/stats.rb +8 -3
  21. data/lib/imap/backup/cli/utils.rb +14 -5
  22. data/lib/imap/backup/cli.rb +13 -9
  23. data/lib/imap/backup/client/default.rb +28 -5
  24. data/lib/imap/backup/configuration.rb +8 -2
  25. data/lib/imap/backup/downloader.rb +4 -1
  26. data/lib/imap/backup/file_mode.rb +16 -0
  27. data/lib/imap/backup/mirror.rb +1 -2
  28. data/lib/imap/backup/serializer/directory.rb +6 -4
  29. data/lib/imap/backup/serializer/folder_maker.rb +33 -0
  30. data/lib/imap/backup/serializer/permission_checker.rb +26 -0
  31. data/lib/imap/backup/serializer.rb +9 -3
  32. data/lib/imap/backup/setup/connection_tester.rb +1 -7
  33. data/lib/imap/backup/setup/folder_chooser.rb +9 -9
  34. data/lib/imap/backup/thunderbird/mailbox_exporter.rb +34 -7
  35. data/lib/imap/backup/uploader.rb +1 -1
  36. data/lib/imap/backup/version.rb +3 -3
  37. data/lib/imap/backup.rb +0 -2
  38. metadata +14 -9
  39. data/lib/imap/backup/account/connection/folder_names.rb +0 -26
  40. data/lib/imap/backup/account/connection.rb +0 -136
  41. data/lib/imap/backup/utils.rb +0 -40
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd7a94d72f09a4364d3fd424b2e7fabbf4885726b07f0ffbb3e28a6a08e1507f
4
- data.tar.gz: ddc3624e1e7441422b93be0d5b651b80b4e7f78268e267573338cec557de2ae2
3
+ metadata.gz: a244374a14bae1b8d9bee48293eb744266d4d9fa67be560a3ca52a25b49a0cfa
4
+ data.tar.gz: 03fc3fe13037bcc3c9927117a5fb9edd4a85e053ea3d8e8f2380d8daee514c9d
5
5
  SHA512:
6
- metadata.gz: '09734ca2ee62e60830358a0d5404d2a5d4f8b8f47b1002cf5373c41a6f4f42cbd3487c66fd7c964c193b41b5b99fa81a173ae3061d43ebcfd8ca56eaee66010d'
7
- data.tar.gz: 1ebccf8170e1830222ba9f720be48668b067288bfe89754a98f0bc0146ed96086e8df2fb943c4ecd4f7ed7c4d75297b456a61f96225701e74d79c7aaba39529d
6
+ metadata.gz: fc751d9d7f9af7f483536251234b5b40ffa9813d947d0739229ab14bf3d35d8878af6656d2180a490ad21b06d5b99c746547a95b75b6925c968fca51b91ba917
7
+ data.tar.gz: 8f4944c21e5458dda098554b3338c5baaecfe2e111fc5acc23ca0bcf1a20794202a80d0139a9932bba28960702ed8531881ea5bc7030af1b04a2e98afdc6dd22
data/docs/development.md CHANGED
@@ -21,6 +21,12 @@ Before running the test suite, it needs to be started:
21
21
  $ docker-compose up -d
22
22
  ```
23
23
 
24
+ or, with Podman
25
+
26
+ ```sh
27
+ $ podman-compose -f docker-compose.yml up -d
28
+ ```
29
+
24
30
  ```sh
25
31
  $ rake
26
32
  ```
@@ -38,7 +38,7 @@ module Email::Mboxrd
38
38
  end
39
39
 
40
40
  def subject
41
- parsed.subject&.force_encoding(Encoding::ASCII_8BIT)
41
+ parsed.subject
42
42
  end
43
43
 
44
44
  def imap_body
@@ -62,8 +62,9 @@ module Email::Mboxrd
62
62
 
63
63
  def best_from
64
64
  return first_from if first_from
65
- return sender if sender
66
- return return_path if return_path
65
+ return parsed.sender if parsed.sender
66
+ return parsed.envelope_from if parsed.envelope_from
67
+ return parsed.return_path if parsed.return_path
67
68
 
68
69
  ""
69
70
  end
@@ -71,16 +72,7 @@ module Email::Mboxrd
71
72
  def first_from
72
73
  return nil if !parsed.from.is_a?(Enumerable)
73
74
 
74
- first = parsed.from.compact.first
75
- first&.force_encoding(Encoding::ASCII_8BIT)
76
- end
77
-
78
- def return_path
79
- parsed.return_path&.force_encoding(Encoding::ASCII_8BIT)
80
- end
81
-
82
- def sender
83
- parsed.sender&.force_encoding(Encoding::ASCII_8BIT)
75
+ parsed.from.find { |from| from }
84
76
  end
85
77
 
86
78
  def mboxrd_body
@@ -0,0 +1,65 @@
1
+ require "imap/backup/account/folder_ensurer"
2
+ require "imap/backup/account/local_only_folder_deleter"
3
+ require "imap/backup/account/serialized_folders"
4
+ require "imap/backup/downloader"
5
+ require "imap/backup/flag_refresher"
6
+ require "imap/backup/local_only_message_deleter"
7
+
8
+ module Imap::Backup
9
+ class Account; end
10
+
11
+ class Account::Backup
12
+ attr_reader :account
13
+ attr_reader :refresh
14
+
15
+ def initialize(account:, refresh: false)
16
+ @account = account
17
+ @refresh = refresh
18
+ end
19
+
20
+ def run
21
+ Logger.logger.info "Running backup of account: #{account.username}"
22
+ # start the connection so we get logging messages in the right order
23
+ account.client
24
+
25
+ Account::FolderEnsurer.new(account: account).run
26
+ Account::LocalOnlyFolderDeleter.new(account: account).run if account.mirror_mode
27
+ each_folder do |folder, serializer|
28
+ begin
29
+ next if !folder.exist?
30
+ rescue Encoding::UndefinedConversionError
31
+ message = "Skipping backup for '#{folder.name}' " \
32
+ "as it is not UTF-7 encoded correctly"
33
+ Logger.logger.info message
34
+ next
35
+ end
36
+
37
+ Logger.logger.debug "[#{folder.name}] running backup"
38
+ serializer.apply_uid_validity(folder.uid_validity)
39
+ Downloader.new(
40
+ folder,
41
+ serializer,
42
+ multi_fetch_size: account.multi_fetch_size,
43
+ reset_seen_flags_after_fetch: account.reset_seen_flags_after_fetch
44
+ ).run
45
+ if account.mirror_mode
46
+ Logger.logger.info "Mirror mode - Deleting messages only present locally"
47
+ LocalOnlyMessageDeleter.new(folder, serializer).run
48
+ end
49
+ FlagRefresher.new(folder, serializer).run if account.mirror_mode || refresh
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def each_folder
56
+ backup_folders = Account::BackupFolders.new(
57
+ client: account.client, account: account
58
+ )
59
+ backup_folders.each do |folder|
60
+ serializer = Serializer.new(account.local_path, folder.name)
61
+ yield folder, serializer
62
+ end
63
+ end
64
+ end
65
+ end
@@ -1,8 +1,7 @@
1
1
  module Imap::Backup
2
2
  class Account; end
3
- class Account::Connection; end
4
3
 
5
- class Account::Connection::BackupFolders
4
+ class Account::BackupFolders
6
5
  attr_reader :account
7
6
  attr_reader :client
8
7
 
@@ -11,8 +10,10 @@ module Imap::Backup
11
10
  @account = account
12
11
  end
13
12
 
14
- def run
15
- all_names = Account::Connection::FolderNames.new(client: client, account: account).run
13
+ def each(&block)
14
+ return enum_for(:each) if !block
15
+
16
+ all_names = client.list
16
17
 
17
18
  configured =
18
19
  case
@@ -31,7 +32,13 @@ module Imap::Backup
31
32
  all_names & configured
32
33
  end
33
34
 
34
- names.map { |name| Account::Folder.new(account.connection, name) }
35
+ names.each { |name| block.call(Account::Folder.new(client, name)) }
36
+ end
37
+
38
+ def map(&block)
39
+ each.map do |folder|
40
+ block.call(folder)
41
+ end
35
42
  end
36
43
  end
37
44
  end
@@ -1,11 +1,17 @@
1
+ require "socket"
2
+
1
3
  require "email/provider"
4
+ require "imap/backup/client/apple_mail"
5
+ require "imap/backup/client/default"
2
6
  require "retry_on_error"
3
7
 
4
8
  module Imap::Backup
5
- class Account::Connection::ClientFactory
9
+ class Account; end
10
+
11
+ class Account::ClientFactory
6
12
  include RetryOnError
7
13
 
8
- LOGIN_RETRY_CLASSES = [EOFError, Errno::ECONNRESET, SocketError].freeze
14
+ LOGIN_RETRY_CLASSES = [::EOFError, ::Errno::ECONNRESET, ::SocketError].freeze
9
15
 
10
16
  attr_reader :account
11
17
 
@@ -23,23 +29,17 @@ module Imap::Backup
23
29
  )
24
30
  client =
25
31
  if provider.is_a?(Email::Provider::AppleMail)
26
- Client::AppleMail.new(server, options)
32
+ Client::AppleMail.new(server, account, options)
27
33
  else
28
- Client::Default.new(server, options)
34
+ Client::Default.new(server, account, options)
29
35
  end
30
- Logger.logger.debug "Logging in: #{account.username}/#{masked_password}"
31
- client.login(account.username, account.password)
32
- Logger.logger.debug "Login complete"
36
+ client.login
33
37
  client
34
38
  end
35
39
  end
36
40
 
37
41
  private
38
42
 
39
- def masked_password
40
- account.password.gsub(/./, "x")
41
- end
42
-
43
43
  def provider
44
44
  @provider ||= Email::Provider.for_address(account.username)
45
45
  end
@@ -1,4 +1,5 @@
1
1
  require "forwardable"
2
+ require "net/imap"
2
3
 
3
4
  require "retry_on_error"
4
5
 
@@ -12,28 +13,21 @@ module Imap::Backup
12
13
  include RetryOnError
13
14
 
14
15
  BODY_ATTRIBUTE = "BODY[]".freeze
15
- UID_FETCH_RETRY_CLASSES = [EOFError, Errno::ECONNRESET, IOError].freeze
16
- APPEND_RETRY_CLASSES = [Net::IMAP::BadResponseError].freeze
17
- CREATE_RETRY_CLASSES = [Net::IMAP::BadResponseError].freeze
18
- EXAMINE_RETRY_CLASSES = [Net::IMAP::BadResponseError].freeze
16
+ UID_FETCH_RETRY_CLASSES = [::EOFError, ::Errno::ECONNRESET, ::IOError].freeze
17
+ APPEND_RETRY_CLASSES = [::Net::IMAP::BadResponseError].freeze
18
+ CREATE_RETRY_CLASSES = [::Net::IMAP::BadResponseError].freeze
19
+ EXAMINE_RETRY_CLASSES = [::Net::IMAP::BadResponseError].freeze
19
20
  PERMITTED_FLAGS = %i(Answered Draft Flagged Seen).freeze
20
21
 
21
- attr_reader :connection
22
+ attr_reader :client
22
23
  attr_reader :name
23
24
 
24
- delegate client: :connection
25
-
26
- def initialize(connection, name)
27
- @connection = connection
25
+ def initialize(client, name)
26
+ @client = client
28
27
  @name = name
29
28
  @uid_validity = nil
30
29
  end
31
30
 
32
- # Deprecated: use #name
33
- def folder
34
- name
35
- end
36
-
37
31
  def exist?
38
32
  retry_on_error(errors: EXAMINE_RETRY_CLASSES) do
39
33
  examine
@@ -0,0 +1,24 @@
1
+ require "imap/backup/serializer/directory"
2
+ require "imap/backup/serializer/folder_maker"
3
+
4
+ module Imap::Backup
5
+ class Account; end
6
+
7
+ class Account::FolderEnsurer
8
+ attr_reader :account
9
+
10
+ def initialize(account:)
11
+ @account = account
12
+ end
13
+
14
+ def run
15
+ raise "The backup path for #{account.username} is not set" if !account.local_path
16
+
17
+ Serializer::FolderMaker.new(
18
+ base: File.dirname(account.local_path),
19
+ path: File.basename(account.local_path),
20
+ permissions: Serializer::Directory::DIRECTORY_PERMISSIONS
21
+ ).run
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,26 @@
1
+ require "imap/backup/account/backup_folders"
2
+ require "imap/backup/account/serialized_folders"
3
+
4
+ module Imap::Backup
5
+ class Account; end
6
+
7
+ # Deletes serialized folders that are not configured to be backed up
8
+ class Account::LocalOnlyFolderDeleter
9
+ attr_reader :account
10
+
11
+ def initialize(account:)
12
+ @account = account
13
+ end
14
+
15
+ def run
16
+ backup_folders = Account::BackupFolders.new(
17
+ client: account.client, account: account
18
+ )
19
+ wanted = backup_folders.map(&:name)
20
+ serialized_folders = Account::SerializedFolders.new(account: account)
21
+ serialized_folders.each do |serializer, _folder|
22
+ serializer.delete if !wanted.include?(serializer.folder)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,20 @@
1
+ require "imap/backup/account/serialized_folders"
2
+
3
+ module Imap::Backup
4
+ class Account; end
5
+
6
+ class Account::Restore
7
+ attr_reader :account
8
+
9
+ def initialize(account:)
10
+ @account = account
11
+ end
12
+
13
+ def run
14
+ serialized_folders = Account::SerializedFolders.new(account: account)
15
+ serialized_folders.each do |serializer, folder|
16
+ Uploader.new(folder, serializer).run
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,41 @@
1
+ require "imap/backup/account/folder_ensurer"
2
+
3
+ module Imap::Backup
4
+ class Account; end
5
+
6
+ class Account::SerializedFolders
7
+ include Enumerable
8
+
9
+ attr_reader :account
10
+
11
+ def initialize(account:)
12
+ @account = account
13
+ end
14
+
15
+ def each(&block)
16
+ return enum_for(:each) if !block
17
+
18
+ glob.each do |path|
19
+ name = path.relative_path_from(base).to_s[0..-6]
20
+ serializer = Serializer.new(account.local_path, name)
21
+ folder = Account::Folder.new(account.client, name)
22
+ block.call(serializer, folder)
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def base
29
+ @base ||= Pathname.new(account.local_path)
30
+ end
31
+
32
+ def glob
33
+ @glob ||= begin
34
+ Account::FolderEnsurer.new(account: account).run
35
+
36
+ pattern = File.join(account.local_path, "**", "*.imap")
37
+ Pathname.glob(pattern)
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,3 +1,6 @@
1
+ require "imap/backup/account/client_factory"
2
+ require "imap/backup/account/restore"
3
+
1
4
  module Imap; end
2
5
 
3
6
  module Imap::Backup
@@ -26,13 +29,22 @@ module Imap::Backup
26
29
  @connection_options = options[:connection_options]
27
30
  @multi_fetch_size = options[:multi_fetch_size]
28
31
  @reset_seen_flags_after_fetch = options[:reset_seen_flags_after_fetch]
29
- @connection = nil
32
+ @client = nil
30
33
  @changes = {}
31
34
  @marked_for_deletion = false
32
35
  end
33
36
 
34
- def connection
35
- @connection ||= Account::Connection.new(self)
37
+ def client
38
+ @client ||= Account::ClientFactory.new(account: self).run
39
+ end
40
+
41
+ def namespaces
42
+ client.namespace
43
+ end
44
+
45
+ def restore
46
+ restore = Account::Restore.new(account: self)
47
+ restore.run
36
48
  end
37
49
 
38
50
  def valid?
@@ -145,7 +157,7 @@ module Imap::Backup
145
157
  changes[field] = {from: current, to: value} if value != current
146
158
  end
147
159
 
148
- @connection = nil
160
+ @client = nil
149
161
  instance_variable_set(key, value)
150
162
  end
151
163
  end
@@ -1,3 +1,5 @@
1
+ require "imap/backup/account/backup"
2
+
1
3
  module Imap::Backup
2
4
  class CLI::Backup < Thor
3
5
  include Thor::Actions
@@ -13,21 +15,18 @@ module Imap::Backup
13
15
  no_commands do
14
16
  def run
15
17
  config = load_config(**options)
16
- each_connection(config, emails) do |connection|
17
- connection.run_backup(refresh: refresh)
18
+ requested_accounts(config).each do |account|
19
+ backup = Account::Backup.new(account: account, refresh: refresh)
20
+ backup.run
18
21
  rescue StandardError => e
19
22
  message =
20
- "Backup for account '#{connection.account.username}' " \
23
+ "Backup for account '#{account.username}' " \
21
24
  "failed with error #{e}"
22
25
  Logger.logger.warn message
23
26
  next
24
27
  end
25
28
  end
26
29
 
27
- def emails
28
- (options[:accounts] || "").split(",")
29
- end
30
-
31
30
  def refresh
32
31
  options.key?(:refresh) ? !!options[:refresh] : false
33
32
  end
@@ -72,7 +72,7 @@ module Imap::Backup
72
72
  destination_name = with_destination_prefix.join(destination_delimiter)
73
73
 
74
74
  Account::Folder.new(
75
- destination.connection,
75
+ destination.client,
76
76
  destination_name
77
77
  )
78
78
  end
@@ -4,6 +4,15 @@ module Imap::Backup
4
4
  module CLI::Helpers
5
5
  def self.included(base)
6
6
  base.class_eval do
7
+ def self.accounts_option
8
+ method_option(
9
+ "accounts",
10
+ type: :string,
11
+ desc: "a comma-separated list of accounts (defaults to all configured accounts)",
12
+ aliases: ["-a"]
13
+ )
14
+ end
15
+
7
16
  def self.config_option
8
17
  method_option(
9
18
  "config",
@@ -78,22 +87,13 @@ module Imap::Backup
78
87
  account
79
88
  end
80
89
 
81
- def connection(config, email)
82
- account = account(config, email)
83
-
84
- Account::Connection.new(account)
85
- end
86
-
87
- def each_connection(config, names)
88
- return enum_for(:each_connection, config, names) if !block_given?
89
-
90
- config.accounts.each do |account|
91
- next if names.any? && !names.include?(account.username)
92
-
93
- yield account.connection
90
+ def requested_accounts(config)
91
+ emails = (options[:accounts] || "").split(",")
92
+ if emails.any?
93
+ config.accounts.filter { |a| emails.include?(a.username) }
94
+ else
95
+ config.accounts
94
96
  end
95
- rescue ConfigurationNotFound
96
- raise "imap-backup is not configured. Run `imap-backup setup`"
97
97
  end
98
98
  end
99
99
  end
@@ -8,8 +8,9 @@ module Imap::Backup
8
8
  desc "accounts", "List locally backed-up accounts"
9
9
  config_option
10
10
  format_option
11
+ quiet_option
12
+ verbose_option
11
13
  def accounts
12
- config = load_config(**options)
13
14
  names = config.accounts.map(&:username)
14
15
  case options[:format]
15
16
  when "json"
@@ -29,13 +30,16 @@ module Imap::Backup
29
30
  type: :boolean,
30
31
  desc: "deletes any corrupted folders - USE WITH CAUTION!"
31
32
  )
33
+ accounts_option
32
34
  config_option
33
35
  format_option
36
+ quiet_option
37
+ verbose_option
34
38
  def check
35
- config = load_config(**options)
36
- results = each_connection(config, emails).map do |connection|
37
- folders = connection.local_folders
38
- folder_results = folders.map do |serializer|
39
+ results = requested_accounts(config).map do |account|
40
+ serialized_folders = Account::SerializedFolders.new(account: account)
41
+ folder_results = serialized_folders.map do |serializer, _folder|
42
+ puts "serializer: #{serializer.inspect}"
39
43
  serializer.check_integrity!
40
44
  {name: serializer.folder, result: "OK"}
41
45
  rescue Serializer::FolderIntegrityError => e
@@ -50,7 +54,7 @@ module Imap::Backup
50
54
  result: message
51
55
  }
52
56
  end
53
- {account: connection.account.username, folders: folder_results}
57
+ {account: account.username, folders: folder_results}
54
58
  end
55
59
 
56
60
  case options[:format]
@@ -64,17 +68,18 @@ module Imap::Backup
64
68
  desc "folders EMAIL", "List backed up folders"
65
69
  config_option
66
70
  format_option
71
+ quiet_option
72
+ verbose_option
67
73
  def folders(email)
68
- config = load_config(**options)
69
- connection = connection(config, email)
74
+ account = account(config, email)
70
75
 
71
- folders = connection.local_folders
76
+ serialized_folders = Account::SerializedFolders.new(account: account)
72
77
  case options[:format]
73
78
  when "json"
74
- list = folders.map { |_s, f| {name: f.name} }
79
+ list = serialized_folders.map { |_s, f| {name: f.name} }
75
80
  Kernel.puts list.to_json
76
81
  else
77
- folders.each do |_s, f|
82
+ serialized_folders.each do |_s, f|
78
83
  Kernel.puts %("#{f.name}")
79
84
  end
80
85
  end
@@ -83,11 +88,13 @@ module Imap::Backup
83
88
  desc "list EMAIL FOLDER", "List emails in a folder"
84
89
  config_option
85
90
  format_option
91
+ quiet_option
92
+ verbose_option
86
93
  def list(email, folder_name)
87
- config = load_config(**options)
88
- connection = connection(config, email)
94
+ account = account(config, email)
89
95
 
90
- serializer, _folder = connection.local_folders.find do |(_s, f)|
96
+ serialized_folders = Account::SerializedFolders.new(account: account)
97
+ serializer, _folder = serialized_folders.find do |_s, f|
91
98
  f.name == folder_name
92
99
  end
93
100
  raise "Folder '#{folder_name}' not found" if !serializer
@@ -108,11 +115,13 @@ module Imap::Backup
108
115
  DESC
109
116
  config_option
110
117
  format_option
118
+ quiet_option
119
+ verbose_option
111
120
  def show(email, folder_name, uids)
112
- config = load_config(**options)
113
- connection = connection(config, email)
121
+ account = account(config, email)
114
122
 
115
- serializer, _folder = connection.local_folders.find do |(_s, f)|
123
+ serialized_folders = Account::SerializedFolders.new(account: account)
124
+ serializer, _folder = serialized_folders.find do |_s, f|
116
125
  f.name == folder_name
117
126
  end
118
127
  raise "Folder '#{folder_name}' not found" if !serializer
@@ -197,8 +206,11 @@ module Imap::Backup
197
206
  end
198
207
  end
199
208
 
200
- def emails
201
- (options[:accounts] || "").split(",")
209
+ def config
210
+ @config ||= begin
211
+ non_logging_options = Logger.setup_logging(options)
212
+ load_config(**non_logging_options)
213
+ end
202
214
  end
203
215
  end
204
216
  end
@@ -61,7 +61,7 @@ module Imap::Backup
61
61
  message =
62
62
  "The account '#{source_account.username}' " \
63
63
  "is not set up to make mirror backups"
64
- Logger.logger.info message
64
+ Logger.logger.warn message
65
65
  end
66
66
 
67
67
  def config
@@ -12,12 +12,12 @@ module Imap::Backup
12
12
  verbose_option
13
13
  def folders(email)
14
14
  Imap::Backup::Logger.setup_logging options
15
- names = names(email)
15
+ folder_names = folder_names(email)
16
16
  case options[:format]
17
17
  when "json"
18
- json_format_names names
18
+ json_format_names folder_names
19
19
  else
20
- list_names names
20
+ list_names folder_names
21
21
  end
22
22
  end
23
23
 
@@ -35,8 +35,8 @@ module Imap::Backup
35
35
  def namespaces(email)
36
36
  Imap::Backup::Logger.setup_logging options
37
37
  config = load_config(**options)
38
- connection = connection(config, email)
39
- namespaces = connection.namespaces
38
+ account = account(config, email)
39
+ namespaces = account.namespaces
40
40
  case options[:format]
41
41
  when "json"
42
42
  json_format_namespaces namespaces
@@ -46,11 +46,11 @@ module Imap::Backup
46
46
  end
47
47
 
48
48
  no_commands do
49
- def names(email)
49
+ def folder_names(email)
50
50
  config = load_config(**options)
51
- connection = connection(config, email)
51
+ account = account(config, email)
52
52
 
53
- connection.folder_names
53
+ account.client.list
54
54
  end
55
55
 
56
56
  def json_format_names(names)