imap-backup 3.4.1 → 4.0.0.rc1

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: 79d29fc2a0bdce3edeeb819767c8c76ab319573ce1391e26cbfcb03df6f7d0b3
4
- data.tar.gz: f0c169eb81dff4cdfe793c53dfd5317425c737042fe69c65be30a6df186e5057
3
+ metadata.gz: ba3f202308a586f7ec54b28d66ea2f9422cf30f706c118ab02f362346351f268
4
+ data.tar.gz: 585bd29f2d2f836aad27c6ac58855649b7621eff770d5e2b40bfdd3f6aa774f0
5
5
  SHA512:
6
- metadata.gz: 4007a0ef75a42e3ad327c50bc24613a66ecf1b4f814d9f4cb91b65717199fd6a5521a8518691e56f33e7788007fa3b57a065d9383e7e0ced47d373fd7d1ab955
7
- data.tar.gz: 4e04086163be13d87de681d91aa7c1664a11a49fc44d089110e67e8c2d89b22ec6811902d34ee6f00e7a3e41ac21d04ea245997c5a7921c1c5990208e8989bd1
6
+ metadata.gz: 6270660f55ab52e3a3d8242bdfbb2d044ce7428ccc75daabf25b6753a7c91f9c3f4d8b2be4db517f44fb887663a40e946f128c2bf06f4d1006cd02182d9f477e
7
+ data.tar.gz: f94af41fee60be97e15e0d2aa3da5a0696b9d8bab5cb03cb42c805881b13e8a38fc5be42ee30efd26576d5cadb10d2f53b0c46c00fc94ca72cf23f94e05d602b
data/.circleci/config.yml CHANGED
@@ -27,7 +27,7 @@ jobs:
27
27
  type: string
28
28
  environment:
29
29
  BUNDLE_PATH: ./vendor/bundle
30
- DOCKER_IMAP_PORT: 993
30
+ DOCKER_IMAP_SERVER: 993
31
31
  docker:
32
32
  - image: "cimg/ruby:<< parameters.ruby_version >>"
33
33
  - image: antespi/docker-imap-devel:latest
data/.rubocop_todo.yml CHANGED
@@ -63,7 +63,7 @@ Metrics/AbcSize:
63
63
  # Offense count: 3
64
64
  # Configuration parameters: CountComments, CountAsOne.
65
65
  Metrics/ClassLength:
66
- Max: 171
66
+ Max: 172
67
67
 
68
68
  # Offense count: 19
69
69
  # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
data/CHANGELOG.md ADDED
@@ -0,0 +1,11 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](http://keepachangelog.com/)
5
+ and this project adheres to [Semantic Versioning](http://semver.org/).
6
+
7
+ ## [4.0.0.rc1] - 2021-11-17
8
+
9
+ ### Added
10
+ * `local` commands to list accounts, folders and emails and to view single
11
+ emails.
data/bin/imap-backup CHANGED
@@ -1,98 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
- require "optparse"
3
2
 
4
3
  $LOAD_PATH.unshift(File.expand_path("../lib/", __dir__))
5
- require "imap/backup"
4
+ require "imap/backup/cli"
6
5
 
7
- KNOWN_COMMANDS = [
8
- {name: "setup", help: "Create/edit the configuration file"},
9
- {name: "backup", help: "Do the backup (default)"},
10
- {name: "folders", help: "List folders for all (or selected) accounts"},
11
- {name: "restore", help: "Restore emails to server"},
12
- {name: "status", help: "List count of non backed-up emails per folder"},
13
- {name: "help", help: "Show usage"}
14
- ].freeze
6
+ Imap::Backup::Configuration::List.new.setup_logging
15
7
 
16
- options = {command: "backup"}
17
- parser = OptionParser.new do |opts|
18
- opts.banner = "Usage: #{$PROGRAM_NAME} [options] COMMAND"
19
-
20
- opts.separator ""
21
- opts.separator "Commands:"
22
- KNOWN_COMMANDS.each do |command|
23
- opts.separator format("\t%- 20<name>s %<help>s", command)
24
- end
25
- opts.separator ""
26
- opts.separator "Common options:"
27
-
28
- opts.on(
29
- "-a",
30
- "--accounts ACCOUNT1[,ACCOUNT2,...]",
31
- Array,
32
- "only these accounts"
33
- ) do |account|
34
- options[:accounts] = account
35
- end
36
-
37
- opts.on_tail("-h", "--help", "Show usage") do
38
- puts opts
39
- exit
40
- end
41
-
42
- opts.on_tail("--version", "Show version") do
43
- puts Imap::Backup::VERSION
44
- exit
45
- end
46
- end
47
- parser.parse!
48
-
49
- options[:command] = ARGV.shift if !ARGV.empty?
50
-
51
- # rubocop:disable Style/IfUnlessModifier
52
- if KNOWN_COMMANDS.find { |c| c[:name] == options[:command] }.nil?
53
- raise "Unknown command '#{options[:command]}'"
54
- end
55
-
56
- # rubocop:enable Style/IfUnlessModifier
57
-
58
- if options[:command] == "help"
59
- puts parser
60
- exit
61
- end
62
-
63
- begin
64
- configuration = Imap::Backup::Configuration::List.new(options[:accounts])
65
- rescue Imap::Backup::ConfigurationNotFound
66
- Imap::Backup::Configuration::Setup.new.run
67
- exit
68
- end
69
-
70
- configuration.setup_logging
71
-
72
- case options[:command]
73
- when "setup"
74
- Imap::Backup::Configuration::Setup.new.run
75
- when "backup"
76
- configuration.each_connection(&:run_backup)
77
- when "folders"
78
- configuration.each_connection do |connection|
79
- puts connection.username
80
- folders = connection.folders
81
- if folders.nil?
82
- warn "Unable to list account folders"
83
- exit 1
84
- end
85
- folders.each { |f| puts "\t#{f}" }
86
- end
87
- when "restore"
88
- configuration.each_connection(&:restore)
89
- when "status"
90
- configuration.each_connection do |connection|
91
- puts connection.username
92
- folders = connection.status
93
- folders.each do |f|
94
- missing_locally = f[:remote] - f[:local]
95
- puts "#{f[:name]}: #{missing_locally.size}"
96
- end
97
- end
98
- end
8
+ Imap::Backup::CLI.start(ARGV)
data/imap-backup ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.expand_path("../lib/", __dir__))
4
+ require "imap/backup/cli"
5
+
6
+ Imap::Backup::CLI.start(ARGV)
7
+
8
+ __END__
9
+
data/imap-backup.gemspec CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |gem|
21
21
  gem.add_runtime_dependency "highline"
22
22
  gem.add_runtime_dependency "mail"
23
23
  gem.add_runtime_dependency "rake"
24
+ gem.add_runtime_dependency "thor", "~> 1.1"
24
25
 
25
26
  gem.add_development_dependency "codeclimate-test-reporter", "~> 0.4.8"
26
27
  if RUBY_ENGINE == "jruby"
@@ -36,12 +36,12 @@ module Email::Mboxrd
36
36
  supplied_body.gsub(/(?<!\r)\n/, "\r\n")
37
37
  end
38
38
 
39
- private
40
-
41
39
  def parsed
42
40
  @parsed ||= Mail.new(supplied_body)
43
41
  end
44
42
 
43
+ private
44
+
45
45
  def from
46
46
  @from ||=
47
47
  begin
@@ -73,6 +73,19 @@ module Imap::Backup
73
73
  end
74
74
  end
75
75
 
76
+ def local_folders
77
+ return enum_for(:local_folders) if !block_given?
78
+
79
+ glob = File.join(local_path, "**", "*.imap")
80
+ base = Pathname.new(local_path)
81
+ Pathname.glob(glob) do |path|
82
+ name = path.relative_path_from(base).to_s[0..-6]
83
+ serializer = Serializer::Mbox.new(local_path, name)
84
+ folder = Account::Folder.new(self, name)
85
+ yield serializer, folder
86
+ end
87
+ end
88
+
76
89
  def restore
77
90
  local_folders do |serializer, folder|
78
91
  restore_folder serializer, folder
@@ -80,7 +93,7 @@ module Imap::Backup
80
93
  end
81
94
 
82
95
  def disconnect
83
- imap.disconnect
96
+ imap.disconnect if @imap
84
97
  end
85
98
 
86
99
  def reconnect
@@ -174,17 +187,6 @@ module Imap::Backup
174
187
  ENV["IMAP_BACKUP_ENABLE_GMAIL_OAUTH2"]
175
188
  end
176
189
 
177
- def local_folders
178
- glob = File.join(local_path, "**", "*.imap")
179
- base = Pathname.new(local_path)
180
- Pathname.glob(glob) do |path|
181
- name = path.relative_path_from(base).to_s[0..-6]
182
- serializer = Serializer::Mbox.new(local_path, name)
183
- folder = Account::Folder.new(self, name)
184
- yield serializer, folder
185
- end
186
- end
187
-
188
190
  def backup_folders
189
191
  @backup_folders ||=
190
192
  begin
@@ -0,0 +1,21 @@
1
+ module Imap::Backup
2
+ class CLI::Backup < Thor
3
+ include Thor::Actions
4
+ include CLI::Helpers
5
+
6
+ attr_reader :account_names
7
+
8
+ def initialize(options)
9
+ super([])
10
+ @account_names = (options[:accounts] || "").split(",")
11
+ end
12
+
13
+ no_commands do
14
+ def run
15
+ each_connection(account_names) do |connection|
16
+ connection.run_backup
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ module Imap::Backup
2
+ class CLI::Folders < Thor
3
+ include Thor::Actions
4
+ include CLI::Helpers
5
+
6
+ attr_reader :account_names
7
+
8
+ def initialize(options)
9
+ super([])
10
+ @account_names = (options[:accounts] || "").split(",")
11
+ end
12
+
13
+ no_commands do
14
+ def run
15
+ each_connection(account_names) do |connection|
16
+ puts connection.username
17
+ folders = connection.folders
18
+ if folders.nil?
19
+ warn "Unable to list account folders"
20
+ return false
21
+ end
22
+ folders.each { |f| puts "\t#{f}" }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,20 @@
1
+ require "imap/backup"
2
+
3
+ module Imap::Backup::CLI::Helpers
4
+ def symbolized(options)
5
+ options.each.with_object({}) { |(k, v), acc| acc[k.intern] = v }
6
+ end
7
+
8
+ def each_connection(names)
9
+ begin
10
+ connections = Imap::Backup::Configuration::List.new(names)
11
+ rescue Imap::Backup::ConfigurationNotFound
12
+ raise "imap-backup is not configured. Run `imap-backup setup`"
13
+ return
14
+ end
15
+
16
+ connections.each_connection do |connection|
17
+ yield connection
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,70 @@
1
+ module Imap::Backup
2
+ class CLI::Local < Thor
3
+ include Thor::Actions
4
+ include CLI::Helpers
5
+
6
+ desc "accounts", "list locally backed-up accounts"
7
+ def accounts
8
+ connections = Imap::Backup::Configuration::List.new
9
+ connections.accounts.each { |a| puts a[:username] }
10
+ end
11
+
12
+ desc "folders EMAIL", "list account folders"
13
+ def folders(email)
14
+ connections = Imap::Backup::Configuration::List.new
15
+ account = connections.accounts.find { |a| a[:username] == email }
16
+ raise "#{email} is not a configured account" if !account
17
+
18
+ account_connection = Imap::Backup::Account::Connection.new(account)
19
+ account_connection.local_folders.each do |_s, f|
20
+ puts %("#{f.name}")
21
+ end
22
+ end
23
+
24
+ desc "emails EMAIL FOLDER", "list emails in a folder"
25
+ def emails(email, folder_name)
26
+ connections = Imap::Backup::Configuration::List.new
27
+ account = connections.accounts.find { |a| a[:username] == email }
28
+ raise "#{email} is not a configured account" if !account
29
+
30
+ account_connection = Imap::Backup::Account::Connection.new(account)
31
+ folder_serializer, folder = account_connection.local_folders.find do |(_s, f)|
32
+ f.name == folder_name
33
+ end
34
+ raise "Folder '#{folder_name}' not found" if !folder_serializer
35
+
36
+ max_subject = 60
37
+ puts format("%-10<uid>s %-#{max_subject}<subject>s - %<date>s", {uid: "UID", subject: "Subject", date: "Date"})
38
+ puts "-" * (12 + max_subject + 28)
39
+
40
+ uids = folder_serializer.uids
41
+
42
+ folder_serializer.each_message(uids).map do |uid, message|
43
+ m = {uid: uid, date: message.parsed.date.to_s, subject: message.parsed.subject}
44
+ if m[:subject].length > max_subject
45
+ puts format("% 10<uid>u: %.#{max_subject - 3}<subject>s... - %<date>s", m)
46
+ else
47
+ puts format("% 10<uid>u: %-#{max_subject}<subject>s - %<date>s", m)
48
+ end
49
+ end
50
+ end
51
+
52
+ desc "email EMAIL FOLDER UID", "show an email"
53
+ def email(email, folder_name, uid)
54
+ connections = Imap::Backup::Configuration::List.new
55
+ account = connections.accounts.find { |a| a[:username] == email }
56
+ raise "#{email} is not a configured account" if !account
57
+
58
+ account_connection = Imap::Backup::Account::Connection.new(account)
59
+ folder_serializer, _folder = account_connection.local_folders.find do |(_s, f)|
60
+ f.name == folder_name
61
+ end
62
+ raise "Folder '#{folder_name}' not found" if !folder_serializer
63
+
64
+ loaded_message = folder_serializer.load(uid)
65
+ raise "Message #{uid} not found in folder '#{folder_name}'" if !loaded_message
66
+
67
+ puts loaded_message.supplied_body
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,19 @@
1
+ module Imap::Backup
2
+ class CLI::Restore < Thor
3
+ include Thor::Actions
4
+ include CLI::Helpers
5
+
6
+ attr_reader :account_names
7
+
8
+ def initialize(options)
9
+ super([])
10
+ @account_names = (options[:accounts] || "").split(",")
11
+ end
12
+
13
+ no_commands do
14
+ def run
15
+ each_connection(account_names) { |connection| connection.restore }
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,13 @@
1
+ class Imap::Backup::CLI::Setup < Thor
2
+ include Thor::Actions
3
+
4
+ def initialize()
5
+ super([])
6
+ end
7
+
8
+ no_commands do
9
+ def run
10
+ Imap::Backup::Configuration::Setup.new.run
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,26 @@
1
+ module Imap::Backup
2
+ class CLI::Status < Thor
3
+ include Thor::Actions
4
+ include CLI::Helpers
5
+
6
+ attr_reader :account_names
7
+
8
+ def initialize(options)
9
+ super([])
10
+ @account_names = (options[:accounts] || "").split(",")
11
+ end
12
+
13
+ no_commands do
14
+ def run
15
+ each_connection(account_names) do |connection|
16
+ puts connection.username
17
+ folders = connection.status
18
+ folders.each do |f|
19
+ missing_locally = f[:remote] - f[:local]
20
+ puts "#{f[:name]}: #{missing_locally.size}"
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,87 @@
1
+ require "thor"
2
+
3
+ class Imap::Backup::CLI < Thor
4
+ require "imap/backup/cli/helpers"
5
+
6
+ autoload :Backup, "imap/backup/cli/backup"
7
+ autoload :Folders, "imap/backup/cli/folders"
8
+ autoload :Local, "imap/backup/cli/local"
9
+ autoload :Remote, "imap/backup/cli/remote"
10
+ autoload :Restore, "imap/backup/cli/restore"
11
+ autoload :Setup, "imap/backup/cli/setup"
12
+ autoload :Status, "imap/backup/cli/status"
13
+
14
+ include Helpers
15
+
16
+ default_task :backup
17
+
18
+ def self.exit_on_failure?
19
+ true
20
+ end
21
+
22
+ def self.accounts_option
23
+ method_option(
24
+ "accounts",
25
+ type: :string,
26
+ banner: "a comma-separated list of accounts (defaults to all configured accounts)",
27
+ aliases: ["-a"]
28
+ )
29
+ end
30
+
31
+ desc "backup [OPTIONS]", "Run the backup"
32
+ long_desc <<~DESC
33
+ Downloads any emails not yet present locally.
34
+ Runs the backup for each configured account,
35
+ or for those requested via the --accounts option.
36
+ By default all folders, are backed up.
37
+ The setup tool can be used to choose a specific list of folders to back up.
38
+ DESC
39
+ accounts_option
40
+ def backup
41
+ Backup.new(symbolized(options)).run
42
+ end
43
+
44
+ desc "folders [OPTIONS]", "This command is deprecated, use `imap-backup remote folders ACCOUNT`"
45
+ long_desc <<~DESC
46
+ Lists all folders of all configured accounts.
47
+ This command is deprecated.
48
+ Instead, use a combination of `imap-backup local accounts` to get the list of accounts,
49
+ and `imap-backup remote folders ACCOUNT` to get the folder list.
50
+ DESC
51
+ accounts_option
52
+ def folders
53
+ Folders.new(symbolized(options)).run
54
+ end
55
+
56
+ desc "restore [OPTIONS]", "This command is deprecated, use `imap-backup restore ACCOUNT`"
57
+ long_desc <<~DESC
58
+ By default, restores all local emails to their respective servers.
59
+ This command is deprecated.
60
+ Instead, use `imap-backup restore ACCOUNT` to restore a single account.
61
+ DESC
62
+ accounts_option
63
+ def restore
64
+ Restore.new(symbolized(options)).run
65
+ end
66
+
67
+ desc "setup", "Configure imap-backup"
68
+ long_desc <<~DESC
69
+ A menu-driven command-line application used to configure imap-backup.
70
+ Configure email accounts to back up.
71
+ DESC
72
+ def setup
73
+ Setup.new().run
74
+ end
75
+
76
+ desc "status", "Show backup status"
77
+ long_desc <<~DESC
78
+ For each configured account and folder, lists the number of emails yet to be downloaded.
79
+ DESC
80
+ accounts_option
81
+ def status
82
+ Status.new(symbolized(options)).run
83
+ end
84
+
85
+ desc "local subcommand ...ARGS", "View local info"
86
+ subcommand "local", Local
87
+ end
@@ -4,7 +4,7 @@ module Imap::Backup
4
4
  class Configuration::List
5
5
  attr_reader :required_accounts
6
6
 
7
- def initialize(required_accounts = nil)
7
+ def initialize(required_accounts = [])
8
8
  @required_accounts = required_accounts
9
9
  end
10
10
 
@@ -23,6 +23,17 @@ module Imap::Backup
23
23
  end
24
24
  end
25
25
 
26
+ def accounts
27
+ @accounts ||=
28
+ if required_accounts.empty?
29
+ config.accounts
30
+ else
31
+ config.accounts.select do |account|
32
+ required_accounts.include?(account[:username])
33
+ end
34
+ end
35
+ end
36
+
26
37
  private
27
38
 
28
39
  def config
@@ -38,16 +49,5 @@ module Imap::Backup
38
49
  def config_exists?
39
50
  Configuration::Store.exist?
40
51
  end
41
-
42
- def accounts
43
- @accounts ||=
44
- if required_accounts.nil?
45
- config.accounts
46
- else
47
- config.accounts.select do |account|
48
- required_accounts.include?(account[:username])
49
- end
50
- end
51
- end
52
52
  end
53
53
  end
@@ -1,9 +1,9 @@
1
1
  module Imap; end
2
2
 
3
3
  module Imap::Backup
4
- MAJOR = 3
5
- MINOR = 4
6
- REVISION = 1
7
- PRE = nil
4
+ MAJOR = 4
5
+ MINOR = 0
6
+ REVISION = 0
7
+ PRE = "rc1"
8
8
  VERSION = [MAJOR, MINOR, REVISION, PRE].compact.map(&:to_s).join(".")
9
9
  end
@@ -433,24 +433,49 @@ describe Imap::Backup::Account::Connection do
433
433
  end
434
434
 
435
435
  describe "#reconnect" do
436
- it "disconnects from the server" do
437
- expect(imap).to receive(:disconnect)
436
+ context "when the IMAP connection has been used" do
437
+ before { subject.imap }
438
438
 
439
- subject.reconnect
439
+ it "disconnects from the server" do
440
+ expect(imap).to receive(:disconnect)
441
+
442
+ subject.reconnect
443
+ end
444
+ end
445
+
446
+ context "when the IMAP connection has not been used" do
447
+ it "does not disconnect from the server" do
448
+ expect(imap).to_not receive(:disconnect)
449
+
450
+ subject.reconnect
451
+ end
440
452
  end
441
453
 
442
454
  it "causes reconnection on future access" do
443
455
  expect(Net::IMAP).to receive(:new)
444
456
 
445
457
  subject.reconnect
458
+ subject.imap
446
459
  end
447
460
  end
448
461
 
449
462
  describe "#disconnect" do
450
- it "disconnects from the server" do
451
- expect(imap).to receive(:disconnect)
463
+ context "when the IMAP connection has been used" do
464
+ it "disconnects from the server" do
465
+ subject.imap
466
+
467
+ expect(imap).to receive(:disconnect)
452
468
 
453
- subject.disconnect
469
+ subject.disconnect
470
+ end
471
+ end
472
+
473
+ context "when the IMAP connection has not been used" do
474
+ it "does not disconnect from the server" do
475
+ expect(imap).to_not receive(:disconnect)
476
+
477
+ subject.disconnect
478
+ end
454
479
  end
455
480
  end
456
481
  end
@@ -35,6 +35,7 @@ describe Imap::Backup::Configuration::List do
35
35
  allow(Imap::Backup::Configuration::Store).
36
36
  to receive(:exist?) { config_exists }
37
37
  allow(Imap::Backup).to receive(:setup_logging)
38
+ allow(store).to receive(:debug?)
38
39
  end
39
40
 
40
41
  it "sets global logging level" do
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: 3.4.1
4
+ version: 4.0.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Yates
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-11-16 00:00:00.000000000 Z
11
+ date: 2021-11-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gmail_xoauth
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: thor
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '1.1'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '1.1'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: codeclimate-test-reporter
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -178,6 +192,7 @@ files:
178
192
  - ".rspec-all"
179
193
  - ".rubocop.yml"
180
194
  - ".rubocop_todo.yml"
195
+ - CHANGELOG.md
181
196
  - Gemfile
182
197
  - LICENSE
183
198
  - README.md
@@ -211,6 +226,7 @@ files:
211
226
  - docs/27-success.png
212
227
  - docs/docker-imap.md
213
228
  - docs/setting-up-gmail-with-oauth2.md
229
+ - imap-backup
214
230
  - imap-backup.gemspec
215
231
  - lib/email/mboxrd/message.rb
216
232
  - lib/email/provider.rb
@@ -219,6 +235,14 @@ files:
219
235
  - lib/imap/backup.rb
220
236
  - lib/imap/backup/account/connection.rb
221
237
  - lib/imap/backup/account/folder.rb
238
+ - lib/imap/backup/cli.rb
239
+ - lib/imap/backup/cli/backup.rb
240
+ - lib/imap/backup/cli/folders.rb
241
+ - lib/imap/backup/cli/helpers.rb
242
+ - lib/imap/backup/cli/local.rb
243
+ - lib/imap/backup/cli/restore.rb
244
+ - lib/imap/backup/cli/setup.rb
245
+ - lib/imap/backup/cli/status.rb
222
246
  - lib/imap/backup/configuration/account.rb
223
247
  - lib/imap/backup/configuration/asker.rb
224
248
  - lib/imap/backup/configuration/connection_tester.rb
@@ -286,9 +310,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
286
310
  version: '2.5'
287
311
  required_rubygems_version: !ruby/object:Gem::Requirement
288
312
  requirements:
289
- - - ">="
313
+ - - ">"
290
314
  - !ruby/object:Gem::Version
291
- version: '0'
315
+ version: 1.3.1
292
316
  requirements: []
293
317
  rubygems_version: 3.1.4
294
318
  signing_key: