imap-backup 3.4.1 → 4.0.0.rc1

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