imap-backup 1.2.2 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +7 -0
  3. data/Gemfile +1 -1
  4. data/Rakefile +4 -4
  5. data/bin/imap-backup +23 -25
  6. data/imap-backup.gemspec +14 -14
  7. data/lib/email/mboxrd/message.rb +23 -5
  8. data/lib/email/provider.rb +4 -4
  9. data/lib/imap/backup.rb +18 -18
  10. data/lib/imap/backup/account/connection.rb +6 -6
  11. data/lib/imap/backup/account/folder.rb +4 -5
  12. data/lib/imap/backup/configuration/account.rb +20 -22
  13. data/lib/imap/backup/configuration/asker.rb +8 -10
  14. data/lib/imap/backup/configuration/connection_tester.rb +3 -5
  15. data/lib/imap/backup/configuration/folder_chooser.rb +10 -12
  16. data/lib/imap/backup/configuration/list.rb +1 -3
  17. data/lib/imap/backup/configuration/setup.rb +13 -14
  18. data/lib/imap/backup/configuration/store.rb +7 -8
  19. data/lib/imap/backup/downloader.rb +0 -2
  20. data/lib/imap/backup/serializer/base.rb +0 -2
  21. data/lib/imap/backup/serializer/directory.rb +3 -4
  22. data/lib/imap/backup/serializer/mbox.rb +11 -12
  23. data/lib/imap/backup/utils.rb +2 -3
  24. data/lib/imap/backup/version.rb +2 -2
  25. data/spec/spec_helper.rb +6 -6
  26. data/spec/support/higline_test_helpers.rb +1 -1
  27. data/spec/support/shared_examples/account_flagging.rb +6 -6
  28. data/spec/unit/account/connection_spec.rb +50 -51
  29. data/spec/unit/account/folder_spec.rb +18 -19
  30. data/spec/unit/configuration/account_spec.rb +96 -97
  31. data/spec/unit/configuration/asker_spec.rb +33 -34
  32. data/spec/unit/configuration/connection_tester_spec.rb +18 -19
  33. data/spec/unit/configuration/folder_chooser_spec.rb +34 -35
  34. data/spec/unit/configuration/list_spec.rb +13 -14
  35. data/spec/unit/configuration/setup_spec.rb +46 -47
  36. data/spec/unit/configuration/store_spec.rb +56 -57
  37. data/spec/unit/downloader_spec.rb +18 -19
  38. data/spec/unit/email/mboxrd/message_spec.rb +55 -11
  39. data/spec/unit/email/provider_spec.rb +12 -12
  40. data/spec/unit/serializer/base_spec.rb +7 -9
  41. data/spec/unit/serializer/directory_spec.rb +18 -19
  42. data/spec/unit/serializer/mbox_spec.rb +35 -37
  43. data/spec/unit/utils_spec.rb +26 -27
  44. metadata +17 -2
@@ -1,19 +1,17 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
1
+ require "spec_helper"
4
2
 
5
3
  describe Imap::Backup::Serializer::Base do
6
- context '#initialize' do
7
- let(:stat) { double('File::Stat', :mode => 0345) }
4
+ context "#initialize" do
5
+ let(:stat) { double("File::Stat", mode: 0345) }
8
6
 
9
7
  before do
10
- allow(File).to receive(:exist?).with('/base/path').and_return(true)
11
- allow(File).to receive(:stat).with('/base/path').and_return(stat)
8
+ allow(File).to receive(:exist?).with("/base/path").and_return(true)
9
+ allow(File).to receive(:stat).with("/base/path").and_return(stat)
12
10
  end
13
11
 
14
- it 'should fail if file permissions are to lax' do
12
+ it "should fail if file permissions are to lax" do
15
13
  expect do
16
- described_class.new('/base/path', 'my_folder')
14
+ described_class.new("/base/path", "my_folder")
17
15
  end.to raise_error(RuntimeError, "Permissions on '/base/path' should be 0700, not 0345")
18
16
  end
19
17
  end
@@ -1,11 +1,10 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
1
+ require "spec_helper"
3
2
 
4
3
  describe Imap::Backup::Serializer::Directory do
5
- let(:stat) { double('File::Stat', :mode => 0700) }
6
- let(:files) { ['00000123.json', '000001.json'] }
7
- let(:base) { '/base/path' }
8
- let(:folder) { '/base/path/my_folder' }
4
+ let(:stat) { double("File::Stat", mode: 0700) }
5
+ let(:files) { ["00000123.json", "000001.json"] }
6
+ let(:base) { "/base/path" }
7
+ let(:folder) { "/base/path/my_folder" }
9
8
  let(:folder_exists) { true }
10
9
 
11
10
  before do
@@ -16,37 +15,37 @@ describe Imap::Backup::Serializer::Directory do
16
15
  allow(File).to receive(:exist?).with(folder).and_return(folder_exists)
17
16
  end
18
17
 
19
- subject { described_class.new(base, 'my_folder') }
18
+ subject { described_class.new(base, "my_folder") }
20
19
 
21
- context '#uids' do
20
+ context "#uids" do
22
21
  before do
23
22
  allow(Dir).to receive(:open).with(folder).and_return(files)
24
23
  end
25
24
 
26
- it 'returns the backed-up uids' do
25
+ it "returns the backed-up uids" do
27
26
  expect(subject.uids).to eq([1, 123])
28
27
  end
29
28
 
30
- context 'if the directory does not exist' do
29
+ context "if the directory does not exist" do
31
30
  let(:folder_exists) { false }
32
31
 
33
- it 'returns an empty array' do
32
+ it "returns an empty array" do
34
33
  expect(subject.uids).to eq([])
35
34
  end
36
35
  end
37
36
  end
38
37
 
39
- context '#exist?' do
40
- it 'checks if the file exists' do
38
+ context "#exist?" do
39
+ it "checks if the file exists" do
41
40
  allow(File).to receive(:exist?).with(%r{/base/path/my_folder/0+123.json}).and_return(true)
42
41
 
43
42
  expect(subject.exist?(123)).to be_truthy
44
43
  end
45
44
  end
46
45
 
47
- context '#save' do
48
- let(:message) { {'RFC822' => 'the body', 'other' => 'xxx'} }
49
- let(:file) { double('File', :write => nil) }
46
+ context "#save" do
47
+ let(:message) { {"RFC822" => "the body", "other" => "xxx"} }
48
+ let(:file) { double("File", write: nil) }
50
49
 
51
50
  before do
52
51
  allow(File).to receive(:exist?).with(%r{/base/path/my_folder/0+1234.json}).and_return(true)
@@ -55,13 +54,13 @@ describe Imap::Backup::Serializer::Directory do
55
54
  end
56
55
  end
57
56
 
58
- it 'saves messages' do
59
- subject.save('1234', message)
57
+ it "saves messages" do
58
+ subject.save("1234", message)
60
59
 
61
60
  expect(file).to have_received(:write).with(message.to_json)
62
61
  end
63
62
 
64
- it 'sets file permissions' do
63
+ it "sets file permissions" do
65
64
  subject.save(1234, message)
66
65
 
67
66
  expect(FileUtils).to have_received(:chmod).with(0600, /0+1234.json$/)
@@ -1,13 +1,11 @@
1
- # encoding: utf-8
2
-
3
- require 'spec_helper'
1
+ require "spec_helper"
4
2
 
5
3
  describe Imap::Backup::Serializer::Mbox do
6
- let(:stat) { double('File::Stat', :mode => 0700) }
7
- let(:base_path) { '/base/path' }
8
- let(:mbox_pathname) { '/base/path/my/folder.mbox' }
4
+ let(:stat) { double("File::Stat", mode: 0700) }
5
+ let(:base_path) { "/base/path" }
6
+ let(:mbox_pathname) { "/base/path/my/folder.mbox" }
9
7
  let(:mbox_exists) { true }
10
- let(:imap_pathname) { '/base/path/my/folder.imap' }
8
+ let(:imap_pathname) { "/base/path/my/folder.imap" }
11
9
  let(:imap_exists) { true }
12
10
 
13
11
  before do
@@ -18,96 +16,96 @@ describe Imap::Backup::Serializer::Mbox do
18
16
  allow(File).to receive(:exist?).with(imap_pathname).and_return(imap_exists)
19
17
  end
20
18
 
21
- context '#initialize' do
22
- it 'creates the containing directory' do
23
- described_class.new(base_path, 'my/folder')
19
+ context "#initialize" do
20
+ it "creates the containing directory" do
21
+ described_class.new(base_path, "my/folder")
24
22
 
25
- expect(Imap::Backup::Utils).to have_received(:make_folder).with(base_path, 'my', 0700)
23
+ expect(Imap::Backup::Utils).to have_received(:make_folder).with(base_path, "my", 0700)
26
24
  end
27
25
 
28
- context 'mbox and imap files' do
26
+ context "mbox and imap files" do
29
27
  context "if mbox exists and imap doesn't" do
30
28
  let(:imap_exists) { false }
31
29
 
32
- it 'fails' do
30
+ it "fails" do
33
31
  expect {
34
- described_class.new(base_path, 'my/folder')
35
- }.to raise_error(RuntimeError, '.imap file missing')
32
+ described_class.new(base_path, "my/folder")
33
+ }.to raise_error(RuntimeError, ".imap file missing")
36
34
  end
37
35
  end
38
36
 
39
37
  context "if imap exists and mbox doesn't" do
40
38
  let(:mbox_exists) { false }
41
39
 
42
- it 'fails' do
40
+ it "fails" do
43
41
  expect {
44
- described_class.new(base_path, 'my/folder')
45
- }.to raise_error(RuntimeError, '.mbox file missing')
42
+ described_class.new(base_path, "my/folder")
43
+ }.to raise_error(RuntimeError, ".mbox file missing")
46
44
  end
47
45
  end
48
46
  end
49
47
  end
50
48
 
51
- context 'instance methods' do
49
+ context "instance methods" do
52
50
  let(:ids) { %w(3 2 1) }
53
51
 
54
52
  before do
55
53
  allow(CSV).to receive(:foreach) { |&b| ids.each { |id| b.call [id] } }
56
54
  end
57
55
 
58
- subject { described_class.new(base_path, 'my/folder') }
56
+ subject { described_class.new(base_path, "my/folder") }
59
57
 
60
- context '#uids' do
61
- it 'returns the backed-up uids as sorted integers' do
58
+ context "#uids" do
59
+ it "returns the backed-up uids as sorted integers" do
62
60
  expect(subject.uids).to eq(ids.map(&:to_i).sort)
63
61
  end
64
62
 
65
- context 'if the mbox does not exist' do
63
+ context "if the mbox does not exist" do
66
64
  let(:mbox_exists) { false }
67
65
  let(:imap_exists) { false }
68
66
 
69
- it 'returns an empty Array' do
67
+ it "returns an empty Array" do
70
68
  expect(subject.uids).to eq([])
71
69
  end
72
70
  end
73
71
  end
74
72
 
75
- context '#save' do
76
- let(:mbox_formatted_message) { 'message in mbox format' }
77
- let(:message_uid) { '999' }
78
- let(:message) { double('Email::Mboxrd::Message', :to_s => mbox_formatted_message) }
79
- let(:mbox_file) { double('File - mbox', :write => nil, :close => nil) }
80
- let(:imap_file) { double('File - imap', :write => nil, :close => nil) }
73
+ context "#save" do
74
+ let(:mbox_formatted_message) { "message in mbox format" }
75
+ let(:message_uid) { "999" }
76
+ let(:message) { double("Email::Mboxrd::Message", to_s: mbox_formatted_message) }
77
+ let(:mbox_file) { double("File - mbox", write: nil, close: nil) }
78
+ let(:imap_file) { double("File - imap", write: nil, close: nil) }
81
79
 
82
80
  before do
83
81
  allow(Email::Mboxrd::Message).to receive(:new).and_return(message)
84
- allow(File).to receive(:open).with(mbox_pathname, 'ab').and_return(mbox_file)
85
- allow(File).to receive(:open).with(imap_pathname, 'ab').and_return(imap_file)
82
+ allow(File).to receive(:open).with(mbox_pathname, "ab").and_return(mbox_file)
83
+ allow(File).to receive(:open).with(imap_pathname, "ab").and_return(imap_file)
86
84
  end
87
85
 
88
- it 'saves the message to the mbox' do
86
+ it "saves the message to the mbox" do
89
87
  subject.save(message_uid, "The\nemail\n")
90
88
 
91
89
  expect(mbox_file).to have_received(:write).with(mbox_formatted_message)
92
90
  end
93
91
 
94
- it 'saves the uid to the imap file' do
92
+ it "saves the uid to the imap file" do
95
93
  subject.save(message_uid, "The\nemail\n")
96
94
 
97
95
  expect(imap_file).to have_received(:write).with(message_uid + "\n")
98
96
  end
99
97
 
100
- context 'when the message causes parsing errors' do
98
+ context "when the message causes parsing errors" do
101
99
  before do
102
100
  allow(message).to receive(:to_s).and_raise(ArgumentError)
103
101
  end
104
102
 
105
- it 'skips the message' do
103
+ it "skips the message" do
106
104
  subject.save(message_uid, "The\nemail\n")
107
105
  expect(mbox_file).to_not have_received(:write)
108
106
  end
109
107
 
110
- it 'does not fail' do
108
+ it "does not fail" do
111
109
  expect do
112
110
  subject.save(message_uid, "The\nemail\n")
113
111
  end.to_not raise_error
@@ -1,9 +1,8 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
1
+ require "spec_helper"
3
2
 
4
3
  describe Imap::Backup::Utils do
5
- let(:filename) { 'foobar' }
6
- let(:stat) { double('File::Stat', :mode => mode) }
4
+ let(:filename) { "foobar" }
5
+ let(:stat) { double("File::Stat", mode: mode) }
7
6
  let(:mode) { 0777 }
8
7
  let(:exists) { true }
9
8
 
@@ -12,24 +11,24 @@ describe Imap::Backup::Utils do
12
11
  allow(File).to receive(:exist?).with(filename).and_return(exists)
13
12
  end
14
13
 
15
- context '.check_permissions' do
14
+ context ".check_permissions" do
16
15
  let(:requested) { 0345 }
17
16
 
18
- context 'with existing files' do
17
+ context "with existing files" do
19
18
  [
20
- [0100, 'less than the limit', true],
21
- [0345, 'equal to the limit', true],
22
- [0777, 'over the limit', false],
19
+ [0100, "less than the limit", true],
20
+ [0345, "equal to the limit", true],
21
+ [0777, "over the limit", false]
23
22
  ].each do |mode, description, success|
24
23
  context "when permissions are #{description}" do
25
24
  let(:mode) { mode }
26
25
 
27
26
  if success
28
- it 'succeeds' do
27
+ it "succeeds" do
29
28
  described_class.check_permissions(filename, requested)
30
29
  end
31
30
  else
32
- it 'fails' do
31
+ it "fails" do
33
32
  expect do
34
33
  described_class.check_permissions(filename, requested)
35
34
  end.to raise_error(RuntimeError, format("Permissions on '%s' should be 0%o, not 0%o", filename, requested, mode))
@@ -39,56 +38,56 @@ describe Imap::Backup::Utils do
39
38
  end
40
39
  end
41
40
 
42
- context 'with non-existent files' do
41
+ context "with non-existent files" do
43
42
  let(:exists) { false }
44
43
  let(:mode) { 0111 }
45
44
 
46
- it 'succeeds' do
45
+ it "succeeds" do
47
46
  described_class.check_permissions(filename, requested)
48
47
  end
49
48
  end
50
49
  end
51
50
 
52
- context '.stat' do
53
- context 'with existing files' do
51
+ context ".stat" do
52
+ context "with existing files" do
54
53
  let(:mode) { 02345 }
55
54
 
56
- it 'is the last 9 bits of the file mode' do
55
+ it "is the last 9 bits of the file mode" do
57
56
  expect(described_class.stat(filename)).to eq(0345)
58
57
  end
59
58
  end
60
59
 
61
- context 'with non-existent files' do
60
+ context "with non-existent files" do
62
61
  let(:exists) { false }
63
62
 
64
- it 'is nil' do
63
+ it "is nil" do
65
64
  expect(described_class.stat(filename)).to be_nil
66
65
  end
67
66
  end
68
67
  end
69
68
 
70
- context '.make_folder' do
69
+ context ".make_folder" do
71
70
  before do
72
71
  allow(FileUtils).to receive(:mkdir_p)
73
72
  allow(FileUtils).to receive(:chmod)
74
73
  end
75
74
 
76
- it 'does nothing if an empty path is supplied' do
77
- described_class.make_folder('aaa', '', 0222)
75
+ it "does nothing if an empty path is supplied" do
76
+ described_class.make_folder("aaa", "", 0222)
78
77
 
79
78
  expect(FileUtils).to_not have_received(:mkdir_p)
80
79
  end
81
80
 
82
- it 'creates the path' do
83
- described_class.make_folder('/base/path', 'new/folder', 0222)
81
+ it "creates the path" do
82
+ described_class.make_folder("/base/path", "new/folder", 0222)
84
83
 
85
- expect(FileUtils).to have_received(:mkdir_p).with('/base/path/new/folder')
84
+ expect(FileUtils).to have_received(:mkdir_p).with("/base/path/new/folder")
86
85
  end
87
86
 
88
- it 'sets permissions on the path' do
89
- described_class.make_folder('/base/path/new', 'folder', 0222)
87
+ it "sets permissions on the path" do
88
+ described_class.make_folder("/base/path/new", "folder", 0222)
90
89
 
91
- expect(FileUtils).to have_received(:chmod).with(0222, '/base/path/new/folder')
90
+ expect(FileUtils).to have_received(:chmod).with(0222, "/base/path/new/folder")
92
91
  end
93
92
  end
94
93
  end
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: 1.2.2
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joe Yates
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-05-13 00:00:00.000000000 Z
11
+ date: 2018-08-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: 3.0.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop-rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: simplecov
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -103,6 +117,7 @@ extensions: []
103
117
  extra_rdoc_files: []
104
118
  files:
105
119
  - ".gitignore"
120
+ - ".rubocop.yml"
106
121
  - ".travis.yml"
107
122
  - Gemfile
108
123
  - LICENSE