imap-backup 1.0.3 → 1.0.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 +7 -0
- data/Gemfile +1 -1
- data/README.md +2 -2
- data/bin/imap-backup +6 -1
- data/imap-backup.gemspec +1 -1
- data/lib/imap/backup/account/connection.rb +50 -15
- data/lib/imap/backup/configuration/folder_chooser.rb +5 -0
- data/lib/imap/backup/version.rb +1 -1
- data/spec/unit/account/connection_spec.rb +88 -81
- data/spec/unit/account/folder_spec.rb +19 -22
- data/spec/unit/downloader_spec.rb +27 -22
- metadata +23 -45
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 75e9eecc039c7cd2b76fc1fbc1acfbe2e07009fa
|
4
|
+
data.tar.gz: ce731fe2f0cc8db8af5fb70ce77d5464b46b7066
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4135cd6ab9a7bd60d5f2e8ea9be63aaad5754621f87b809b6ac611390f1a906faec4019f7289a953509c2d1785f0891018cbd83c2e64da8ae6a30bf6ca8515a4
|
7
|
+
data.tar.gz: 439df924e96c91c571dc9943f23ccd77a939a83f396e235bf4ca5b5f123a2b1abdffd28f11fb313e1d235625ac681027057b8ef6f3b544560c5d1a92d5688127
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -91,8 +91,8 @@ Altertatively, add it to your crontab.
|
|
91
91
|
# Result
|
92
92
|
|
93
93
|
Each folder is saved to an mbox file.
|
94
|
-
Alongside each mbox is a
|
95
|
-
a full restore.
|
94
|
+
Alongside each mbox is a file with extension '.imap', which lists the source IMAP
|
95
|
+
UIDs to allow a full restore.
|
96
96
|
|
97
97
|
# Other Usage
|
98
98
|
|
data/bin/imap-backup
CHANGED
@@ -65,7 +65,12 @@ when 'backup'
|
|
65
65
|
when 'folders'
|
66
66
|
configuration.each_connection do |connection|
|
67
67
|
puts connection.username
|
68
|
-
|
68
|
+
folders = connection.folders
|
69
|
+
if folders.nil?
|
70
|
+
warn 'Unable to list account folders'
|
71
|
+
exit 1
|
72
|
+
end
|
73
|
+
folders.each { |f| puts "\t" + f.name }
|
69
74
|
end
|
70
75
|
when 'setup'
|
71
76
|
Imap::Backup::Configuration::Setup.new.run
|
data/imap-backup.gemspec
CHANGED
@@ -25,7 +25,7 @@ Gem::Specification.new do |gem|
|
|
25
25
|
|
26
26
|
gem.add_development_dependency 'pry'
|
27
27
|
gem.add_development_dependency 'pry-doc'
|
28
|
-
gem.add_development_dependency 'rspec', '>= 2.
|
28
|
+
gem.add_development_dependency 'rspec', '>= 2.12.0'
|
29
29
|
if RUBY_VERSION < '1.9'
|
30
30
|
gem.add_development_dependency 'rcov'
|
31
31
|
else
|
@@ -4,42 +4,77 @@ module Imap
|
|
4
4
|
module Backup
|
5
5
|
module Account
|
6
6
|
class Connection
|
7
|
-
attr_reader :username
|
8
|
-
attr_reader :imap
|
7
|
+
attr_reader :username, :local_path, :backup_folders
|
9
8
|
|
10
9
|
def initialize(options)
|
11
|
-
@username = options[:username]
|
10
|
+
@username, @password = options[:username], options[:password]
|
12
11
|
@local_path, @backup_folders = options[:local_path], options[:folders]
|
13
|
-
@imap = Net::IMAP.new(options[:server] || 'imap.gmail.com', 993, true)
|
14
|
-
@imap.login(@username, options[:password])
|
15
|
-
end
|
16
|
-
|
17
|
-
def disconnect
|
18
|
-
@imap.disconnect
|
19
12
|
end
|
20
13
|
|
21
14
|
def folders
|
22
|
-
|
15
|
+
root = root_for(username)
|
16
|
+
imap.list(root, '*')
|
23
17
|
end
|
24
18
|
|
25
19
|
def status
|
26
|
-
|
20
|
+
backup_folders.map do |folder|
|
27
21
|
f = Imap::Backup::Account::Folder.new(self, folder[:name])
|
28
|
-
s = Imap::Backup::Serializer::Directory.new(
|
22
|
+
s = Imap::Backup::Serializer::Directory.new(local_path, folder[:name])
|
29
23
|
{:name => folder[:name], :local => s.uids, :remote => f.uids}
|
30
24
|
end
|
31
25
|
end
|
32
26
|
|
33
27
|
def run_backup
|
34
|
-
|
28
|
+
backup_folders.each do |folder|
|
35
29
|
f = Imap::Backup::Account::Folder.new(self, folder[:name])
|
36
|
-
s = Imap::Backup::Serializer::Mbox.new(
|
30
|
+
s = Imap::Backup::Serializer::Mbox.new(local_path, folder[:name])
|
37
31
|
d = Imap::Backup::Downloader.new(f, s)
|
38
32
|
d.run
|
39
33
|
end
|
40
34
|
end
|
35
|
+
|
36
|
+
def disconnect
|
37
|
+
imap.disconnect
|
38
|
+
end
|
39
|
+
|
40
|
+
def imap
|
41
|
+
return @imap unless @imap.nil?
|
42
|
+
host = host_for(username)
|
43
|
+
options = options_for(username)
|
44
|
+
@imap = Net::IMAP.new(host, options)
|
45
|
+
@imap.login(username, @password)
|
46
|
+
@imap
|
47
|
+
end
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def host_for(username)
|
52
|
+
case username
|
53
|
+
when /@gmail\.com/
|
54
|
+
'imap.gmail.com'
|
55
|
+
when /@fastmail\.fm/
|
56
|
+
'mail.messagingengine.com'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def root_for(username)
|
61
|
+
case username
|
62
|
+
when /@gmail\.com/
|
63
|
+
'/'
|
64
|
+
when /@fastmail\.fm/
|
65
|
+
'INBOX'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def options_for(username)
|
70
|
+
case username
|
71
|
+
when /@gmail\.com/
|
72
|
+
{:port => 993, :ssl => true}
|
73
|
+
when /@fastmail\.fm/
|
74
|
+
{:port => 993, :ssl => true}
|
75
|
+
end
|
76
|
+
end
|
41
77
|
end
|
42
78
|
end
|
43
79
|
end
|
44
80
|
end
|
45
|
-
|
data/lib/imap/backup/version.rb
CHANGED
@@ -2,114 +2,121 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
describe Imap::Backup::Account::Connection do
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
Net::IMAP.should_receive(:new).with('imap.gmail.com', 993, true).and_return(imap)
|
9
|
-
imap.should_receive('login').with('myuser', 'secret')
|
10
|
-
|
11
|
-
Imap::Backup::Account::Connection.new(:username => 'myuser', :password => 'secret')
|
12
|
-
end
|
5
|
+
def self.folder_config
|
6
|
+
{:name => 'backup_folder'}
|
7
|
+
end
|
13
8
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
9
|
+
let(:imap) { double('Net::IMAP', :login => nil, :list => []) }
|
10
|
+
let(:options) do
|
11
|
+
{
|
12
|
+
:username => username,
|
13
|
+
:password => 'password',
|
14
|
+
:local_path => 'local_path',
|
15
|
+
:folders => [self.class.folder_config]
|
16
|
+
}
|
17
|
+
end
|
18
|
+
let(:username) { 'username@gmail.com' }
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
end
|
20
|
+
before do
|
21
|
+
allow(Net::IMAP).to receive(:new).and_return(imap)
|
23
22
|
end
|
24
23
|
|
25
|
-
|
26
|
-
before :each do
|
27
|
-
@imap = stub('Net::IMAP', :login => nil)
|
28
|
-
Net::IMAP.stub!(:new).and_return(@imap)
|
29
|
-
@account = {
|
30
|
-
:username => 'myuser',
|
31
|
-
:password => 'secret',
|
32
|
-
:folders => [{:name => 'my_folder'}],
|
33
|
-
:local_path => '/base/path',
|
34
|
-
}
|
35
|
-
end
|
24
|
+
subject { Imap::Backup::Account::Connection.new(options) }
|
36
25
|
|
37
|
-
|
26
|
+
shared_examples 'connects to IMAP' do |username = 'username@gmail.com', server = 'imap.gmail.com'|
|
27
|
+
it 'sets up the IMAP connection' do
|
28
|
+
expect(Net::IMAP).to have_received(:new).with(server, {:port => 993, :ssl => true})
|
29
|
+
end
|
38
30
|
|
39
|
-
|
40
|
-
|
41
|
-
|
31
|
+
it 'logs in to the imap server' do
|
32
|
+
expect(imap).to have_received(:login).with(username, 'password')
|
33
|
+
end
|
34
|
+
end
|
42
35
|
|
43
|
-
|
44
|
-
|
36
|
+
context '#initialize' do
|
37
|
+
[
|
38
|
+
[:username, 'username@gmail.com'],
|
39
|
+
[:local_path, 'local_path'],
|
40
|
+
[:backup_folders, [folder_config]]
|
41
|
+
].each do |attr, expected|
|
42
|
+
its(attr) { should eq(expected) }
|
45
43
|
end
|
44
|
+
end
|
46
45
|
|
47
|
-
|
48
|
-
|
49
|
-
|
46
|
+
[
|
47
|
+
['GMail', 'user@gmail.com', 'imap.gmail.com'],
|
48
|
+
['Fastmail', 'user@fastmail.fm', 'mail.messagingengine.com'],
|
49
|
+
].each do |service, email_username, server|
|
50
|
+
context service do
|
51
|
+
let(:username) { email_username }
|
50
52
|
|
51
|
-
|
52
|
-
|
53
|
+
before { allow(imap).to receive(:disconnect) }
|
54
|
+
before { subject.disconnect }
|
55
|
+
|
56
|
+
include_examples 'connects to IMAP', [email_username, server]
|
53
57
|
end
|
58
|
+
end
|
54
59
|
|
55
|
-
|
56
|
-
|
57
|
-
@folder = stub('Imap::Backup::Account::Folder', :uids => [])
|
58
|
-
Imap::Backup::Account::Folder.stub!(:new).with(subject, 'my_folder').and_return(@folder)
|
59
|
-
@serializer = stub('Imap::Backup::Serializer', :uids => [])
|
60
|
-
Imap::Backup::Serializer::Directory.stub!(:new).with('/base/path', 'my_folder').and_return(@serializer)
|
61
|
-
end
|
60
|
+
context '#folders' do
|
61
|
+
let(:folders) { 'folders' }
|
62
62
|
|
63
|
-
|
64
|
-
subject.status[0][:name].should == 'my_folder'
|
65
|
-
end
|
63
|
+
before { allow(imap).to receive(:list).and_return(folders) }
|
66
64
|
|
67
|
-
|
68
|
-
|
65
|
+
it 'returns the list of folders' do
|
66
|
+
expect(subject.folders).to eq(folders)
|
67
|
+
end
|
68
|
+
end
|
69
69
|
|
70
|
-
|
71
|
-
|
70
|
+
context '#status' do
|
71
|
+
let(:folder) { double('folder', :uids => [remote_uid]) }
|
72
|
+
let(:local_uid) { 'local_uid' }
|
73
|
+
let(:serializer) { double('serializer', :uids => [local_uid]) }
|
74
|
+
let(:remote_uid) { 'remote_uid' }
|
72
75
|
|
73
|
-
|
74
|
-
|
76
|
+
before do
|
77
|
+
allow(Imap::Backup::Account::Folder).to receive(:new).and_return(folder)
|
78
|
+
allow(Imap::Backup::Serializer::Directory).to receive(:new).and_return(serializer)
|
79
|
+
end
|
75
80
|
|
76
|
-
|
77
|
-
|
81
|
+
it 'should return the names of folders' do
|
82
|
+
expect(subject.status[0][:name]).to eq('backup_folder')
|
78
83
|
end
|
79
84
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
Imap::Backup::Account::Folder.stub!(:new).with(subject, 'my_folder').and_return(@folder)
|
84
|
-
@serializer = stub('Imap::Backup::Serializer')
|
85
|
-
Imap::Backup::Serializer::Mbox.stub!(:new).with('/base/path', 'my_folder').and_return(@serializer)
|
86
|
-
@downloader = stub('Imap::Backup::Downloader', :run => nil)
|
87
|
-
Imap::Backup::Downloader.stub!(:new).with(@folder, @serializer).and_return(@downloader)
|
88
|
-
end
|
85
|
+
it 'returns local message uids' do
|
86
|
+
expect(subject.status[0][:local]).to eq([local_uid])
|
87
|
+
end
|
89
88
|
|
90
|
-
|
91
|
-
|
89
|
+
it 'should retrieve the available uids' do
|
90
|
+
expect(subject.status[0][:remote]).to eq([remote_uid])
|
91
|
+
end
|
92
|
+
end
|
92
93
|
|
93
|
-
|
94
|
-
|
94
|
+
context '#disconnect' do
|
95
|
+
before { allow(imap).to receive(:disconnect) }
|
96
|
+
before { subject.disconnect }
|
95
97
|
|
96
|
-
|
97
|
-
|
98
|
+
it 'disconnects from the server' do
|
99
|
+
expect(imap).to have_received(:disconnect).with()
|
100
|
+
end
|
98
101
|
|
99
|
-
|
100
|
-
|
102
|
+
include_examples 'connects to IMAP'
|
103
|
+
end
|
101
104
|
|
102
|
-
|
103
|
-
|
105
|
+
context '#run_backup' do
|
106
|
+
let(:folder) { double('folder') }
|
107
|
+
let(:serializer) { double('serializer') }
|
108
|
+
let(:downloader) { double('downloader', run: nil) }
|
104
109
|
|
105
|
-
|
106
|
-
|
110
|
+
before do
|
111
|
+
allow(Imap::Backup::Account::Folder).to receive(:new).and_return(folder)
|
112
|
+
allow(Imap::Backup::Serializer::Mbox).to receive(:new).and_return(serializer)
|
113
|
+
allow(Imap::Backup::Downloader).to receive(:new).and_return(downloader)
|
114
|
+
end
|
107
115
|
|
108
|
-
|
109
|
-
@downloader.should_receive(:run)
|
116
|
+
before { subject.run_backup }
|
110
117
|
|
111
|
-
|
112
|
-
|
118
|
+
it 'runs downloaders' do
|
119
|
+
expect(downloader).to have_received(:run)
|
113
120
|
end
|
114
121
|
end
|
115
122
|
end
|
@@ -4,28 +4,25 @@ require 'spec_helper'
|
|
4
4
|
describe Imap::Backup::Account::Folder do
|
5
5
|
include InputOutputTestHelpers
|
6
6
|
|
7
|
+
let(:imap) { stub('Net::IMAP') }
|
8
|
+
let(:connection) { stub('Imap::Backup::Account::Connection', :imap => imap) }
|
7
9
|
let(:missing_mailbox_data) { stub('Data', :text => 'Unknown Mailbox: my_folder') }
|
8
10
|
let(:missing_mailbox_response) { stub('Response', :data => missing_mailbox_data) }
|
9
11
|
let(:missing_mailbox_error) { Net::IMAP::NoResponseError.new(missing_mailbox_response) }
|
10
12
|
|
11
13
|
context 'with instance' do
|
12
|
-
|
13
|
-
@imap = stub('Net::IMAP')
|
14
|
-
@connection = stub('Imap::Backup::Account::Connection', :imap => @imap)
|
15
|
-
end
|
16
|
-
|
17
|
-
subject { Imap::Backup::Account::Folder.new(@connection, 'my_folder') }
|
14
|
+
subject { Imap::Backup::Account::Folder.new(connection, 'my_folder') }
|
18
15
|
|
19
16
|
context '#uids' do
|
20
|
-
it '
|
21
|
-
|
22
|
-
|
17
|
+
it 'lists available messages' do
|
18
|
+
imap.should_receive(:examine).with('my_folder')
|
19
|
+
imap.should_receive(:uid_search).with(['ALL']).and_return([5678, 123])
|
23
20
|
|
24
21
|
subject.uids.should == [123, 5678]
|
25
22
|
end
|
26
23
|
|
27
24
|
it 'returns an empty array for missing mailboxes' do
|
28
|
-
|
25
|
+
imap.
|
29
26
|
should_receive(:examine).
|
30
27
|
with('my_folder').
|
31
28
|
and_raise(missing_mailbox_error)
|
@@ -37,25 +34,25 @@ describe Imap::Backup::Account::Folder do
|
|
37
34
|
end
|
38
35
|
|
39
36
|
context '#fetch' do
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
'RFC822' =>
|
37
|
+
let(:message_body) { 'the body' }
|
38
|
+
let(:message) do
|
39
|
+
{
|
40
|
+
'RFC822' => message_body,
|
44
41
|
'other' => 'xxx'
|
45
42
|
}
|
46
43
|
end
|
47
44
|
|
48
|
-
it '
|
49
|
-
|
50
|
-
|
45
|
+
it 'requests the message, the flags and the date' do
|
46
|
+
imap.should_receive(:examine).with('my_folder')
|
47
|
+
imap.should_receive(:uid_fetch).
|
51
48
|
with([123], ['RFC822', 'FLAGS', 'INTERNALDATE']).
|
52
|
-
and_return([[nil,
|
49
|
+
and_return([[nil, message]])
|
53
50
|
|
54
51
|
subject.fetch(123)
|
55
52
|
end
|
56
53
|
|
57
54
|
it "returns nil if the mailbox doesn't exist" do
|
58
|
-
|
55
|
+
imap.
|
59
56
|
should_receive(:examine).
|
60
57
|
with('my_folder').
|
61
58
|
and_raise(missing_mailbox_error)
|
@@ -66,10 +63,10 @@ describe Imap::Backup::Account::Folder do
|
|
66
63
|
end
|
67
64
|
|
68
65
|
if RUBY_VERSION > '1.9'
|
69
|
-
it '
|
70
|
-
|
66
|
+
it 'sets the encoding on the message' do
|
67
|
+
imap.stub!(:examine => nil, :uid_fetch => [[nil, message]])
|
71
68
|
|
72
|
-
|
69
|
+
message_body.should_receive(:force_encoding).with('utf-8')
|
73
70
|
|
74
71
|
subject.fetch(123)
|
75
72
|
end
|
@@ -3,55 +3,60 @@ require 'spec_helper'
|
|
3
3
|
|
4
4
|
describe Imap::Backup::Downloader do
|
5
5
|
context 'with account and downloader' do
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
@message = {
|
6
|
+
let(:local_path) { '/base/path' }
|
7
|
+
let(:stat) { stub('File::Stat', :mode => 0700) }
|
8
|
+
let(:message) do
|
9
|
+
{
|
12
10
|
'RFC822' => 'the body',
|
13
11
|
'other' => 'xxx'
|
14
12
|
}
|
15
|
-
@folder = stub('Imap::Backup::Account::Folder', :fetch => @message)
|
16
|
-
@serializer = stub('Imap::Backup::Serializer', :prepare => nil,
|
17
|
-
:exist? => true,
|
18
|
-
:uids => [],
|
19
|
-
:save => nil)
|
20
13
|
end
|
14
|
+
let(:folder) { stub('Imap::Backup::Account::Folder', :fetch => message) }
|
15
|
+
let(:serializer) do
|
16
|
+
stub(
|
17
|
+
'Imap::Backup::Serializer',
|
18
|
+
:prepare => nil,
|
19
|
+
:exist? => true,
|
20
|
+
:uids => [],
|
21
|
+
:save => nil
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
before { File.stub!(:stat).with(local_path).and_return(stat) }
|
21
26
|
|
22
|
-
subject { Imap::Backup::Downloader.new(
|
27
|
+
subject { Imap::Backup::Downloader.new(folder, serializer) }
|
23
28
|
|
24
29
|
context '#run' do
|
25
30
|
context 'with folder' do
|
26
31
|
it 'should list messages' do
|
27
|
-
|
32
|
+
folder.should_receive(:uids).and_return([])
|
28
33
|
|
29
34
|
subject.run
|
30
35
|
end
|
31
36
|
|
32
37
|
context 'with messages' do
|
33
38
|
before :each do
|
34
|
-
|
39
|
+
folder.stub!(:uids).and_return(['123', '999', '1234'])
|
35
40
|
end
|
36
41
|
|
37
42
|
it 'should skip messages that are downloaded' do
|
38
43
|
File.stub!(:exist?).and_return(true)
|
39
44
|
|
40
|
-
|
45
|
+
serializer.should_not_receive(:fetch)
|
41
46
|
|
42
47
|
subject.run
|
43
48
|
end
|
44
49
|
|
45
50
|
it 'skips failed fetches' do
|
46
|
-
|
47
|
-
|
51
|
+
folder.should_receive(:fetch).with('999').and_return(nil)
|
52
|
+
serializer.should_not_receive(:save).with('999', anything)
|
48
53
|
|
49
54
|
subject.run
|
50
55
|
end
|
51
56
|
|
52
57
|
context 'to download' do
|
53
58
|
before :each do
|
54
|
-
|
59
|
+
serializer.stub!(:exist?) do |uid|
|
55
60
|
if uid == '123'
|
56
61
|
true
|
57
62
|
else
|
@@ -61,15 +66,15 @@ describe Imap::Backup::Downloader do
|
|
61
66
|
end
|
62
67
|
|
63
68
|
it 'should request messages' do
|
64
|
-
|
65
|
-
|
69
|
+
folder.should_receive(:fetch).with('999')
|
70
|
+
folder.should_receive(:fetch).with('1234')
|
66
71
|
|
67
72
|
subject.run
|
68
73
|
end
|
69
74
|
|
70
75
|
it 'should save messages' do
|
71
|
-
|
72
|
-
|
76
|
+
serializer.should_receive(:save).with('999', message)
|
77
|
+
serializer.should_receive(:save).with('1234', message)
|
73
78
|
|
74
79
|
subject.run
|
75
80
|
end
|
metadata
CHANGED
@@ -1,126 +1,111 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: imap-backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
5
|
-
prerelease:
|
4
|
+
version: 1.0.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Joe Yates
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date: 2013-
|
11
|
+
date: 2013-12-10 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: highline
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - '>='
|
36
32
|
- !ruby/object:Gem::Version
|
37
33
|
version: '0'
|
38
34
|
type: :runtime
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - '>='
|
44
39
|
- !ruby/object:Gem::Version
|
45
40
|
version: '0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: mail
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - '>='
|
52
46
|
- !ruby/object:Gem::Version
|
53
47
|
version: '0'
|
54
48
|
type: :runtime
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - '>='
|
60
53
|
- !ruby/object:Gem::Version
|
61
54
|
version: '0'
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: pry
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
|
-
- -
|
59
|
+
- - '>='
|
68
60
|
- !ruby/object:Gem::Version
|
69
61
|
version: '0'
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
|
-
- -
|
66
|
+
- - '>='
|
76
67
|
- !ruby/object:Gem::Version
|
77
68
|
version: '0'
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: pry-doc
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
|
-
- -
|
73
|
+
- - '>='
|
84
74
|
- !ruby/object:Gem::Version
|
85
75
|
version: '0'
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
|
-
- -
|
80
|
+
- - '>='
|
92
81
|
- !ruby/object:Gem::Version
|
93
82
|
version: '0'
|
94
83
|
- !ruby/object:Gem::Dependency
|
95
84
|
name: rspec
|
96
85
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
86
|
requirements:
|
99
|
-
- -
|
87
|
+
- - '>='
|
100
88
|
- !ruby/object:Gem::Version
|
101
|
-
version: 2.
|
89
|
+
version: 2.12.0
|
102
90
|
type: :development
|
103
91
|
prerelease: false
|
104
92
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
93
|
requirements:
|
107
|
-
- -
|
94
|
+
- - '>='
|
108
95
|
- !ruby/object:Gem::Version
|
109
|
-
version: 2.
|
96
|
+
version: 2.12.0
|
110
97
|
- !ruby/object:Gem::Dependency
|
111
98
|
name: simplecov
|
112
99
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
100
|
requirements:
|
115
|
-
- -
|
101
|
+
- - '>='
|
116
102
|
- !ruby/object:Gem::Version
|
117
103
|
version: '0'
|
118
104
|
type: :development
|
119
105
|
prerelease: false
|
120
106
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
107
|
requirements:
|
123
|
-
- -
|
108
|
+
- - '>='
|
124
109
|
- !ruby/object:Gem::Version
|
125
110
|
version: '0'
|
126
111
|
description: Backup GMail, or any other IMAP email service, to disk.
|
@@ -175,33 +160,26 @@ files:
|
|
175
160
|
- spec/unit/utils_spec.rb
|
176
161
|
homepage: https://github.com/joeyates/imap-backup
|
177
162
|
licenses: []
|
163
|
+
metadata: {}
|
178
164
|
post_install_message:
|
179
165
|
rdoc_options: []
|
180
166
|
require_paths:
|
181
167
|
- lib
|
182
168
|
required_ruby_version: !ruby/object:Gem::Requirement
|
183
|
-
none: false
|
184
169
|
requirements:
|
185
|
-
- -
|
170
|
+
- - '>='
|
186
171
|
- !ruby/object:Gem::Version
|
187
172
|
version: '0'
|
188
|
-
segments:
|
189
|
-
- 0
|
190
|
-
hash: 1167713560722086376
|
191
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
192
|
-
none: false
|
193
174
|
requirements:
|
194
|
-
- -
|
175
|
+
- - '>='
|
195
176
|
- !ruby/object:Gem::Version
|
196
177
|
version: '0'
|
197
|
-
segments:
|
198
|
-
- 0
|
199
|
-
hash: 1167713560722086376
|
200
178
|
requirements: []
|
201
179
|
rubyforge_project:
|
202
|
-
rubygems_version:
|
180
|
+
rubygems_version: 2.0.3
|
203
181
|
signing_key:
|
204
|
-
specification_version:
|
182
|
+
specification_version: 4
|
205
183
|
summary: Backup GMail (or other IMAP) accounts to disk
|
206
184
|
test_files:
|
207
185
|
- spec/gather_rspec_coverage.rb
|