inbox-sync 0.1.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.
- data/.gitignore +21 -0
- data/Gemfile +7 -0
- data/LICENSE +22 -0
- data/README.md +185 -0
- data/Rakefile +8 -0
- data/inbox-sync.gemspec +23 -0
- data/lib/inbox-sync/config/credentials.rb +29 -0
- data/lib/inbox-sync/config/imap_config.rb +28 -0
- data/lib/inbox-sync/config/smtp_config.rb +30 -0
- data/lib/inbox-sync/config.rb +30 -0
- data/lib/inbox-sync/mail_item.rb +78 -0
- data/lib/inbox-sync/notice/base.rb +47 -0
- data/lib/inbox-sync/notice/run_sync_error.rb +44 -0
- data/lib/inbox-sync/notice/sync_mail_item_error.rb +45 -0
- data/lib/inbox-sync/runner.rb +123 -0
- data/lib/inbox-sync/sync.rb +249 -0
- data/lib/inbox-sync/version.rb +3 -0
- data/lib/inbox-sync.rb +16 -0
- data/log/.gitkeep +0 -0
- data/test/config_test.rb +302 -0
- data/test/helper.rb +87 -0
- data/test/irb.rb +9 -0
- data/test/mail_item_test.rb +62 -0
- data/test/runner_test.rb +40 -0
- data/test/sync/basic_test.rb +62 -0
- data/test/sync/login_test.rb +110 -0
- metadata +141 -0
data/test/helper.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# this file is automatically required in when you require 'assert' in your tests
|
2
|
+
# put test helpers here
|
3
|
+
|
4
|
+
# add root dir to the load path
|
5
|
+
$LOAD_PATH.unshift(File.expand_path("../..", __FILE__))
|
6
|
+
|
7
|
+
require 'logger'
|
8
|
+
require 'net/imap'
|
9
|
+
require 'inbox-sync/sync'
|
10
|
+
require 'inbox-sync/mail_item'
|
11
|
+
|
12
|
+
class Assert::Context
|
13
|
+
|
14
|
+
def configured_sync
|
15
|
+
InboxSync::Sync.new.configure do
|
16
|
+
source.host 'imap.gmail.com'
|
17
|
+
source.port 993
|
18
|
+
source.ssl 'Yes'
|
19
|
+
source.login 'joetest@kellyredding.com', 'joetest1'
|
20
|
+
|
21
|
+
dest.host 'imap.gmail.com'
|
22
|
+
dest.port 993
|
23
|
+
dest.ssl 'Yes'
|
24
|
+
dest.login 'suetest@kellyredding.com', 'suetest1'
|
25
|
+
|
26
|
+
notify.host 'smtp.gmail.com'
|
27
|
+
notify.port 587
|
28
|
+
notify.tls 'Yes'
|
29
|
+
notify.helo 'gmail.com'
|
30
|
+
notify.login 'suetest@kellyredding.com', 'suetest1'
|
31
|
+
notify.from_addr 'suetest@kellyredding.com'
|
32
|
+
notify.to_addr 'suetest@kellyredding.com'
|
33
|
+
|
34
|
+
logger Logger.new('log/tests.log')
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
TEST_MAIL_DATA = {
|
39
|
+
'RFC822' => "Delivered-To: joetest@kellyredding.com\r\nReceived: by 10.114.62.209 with SMTP id a17csp11732lds;\r\n Thu, 24 May 2012 08:34:46 -0700 (PDT)\r\nReceived: by 10.112.84.65 with SMTP id w1mr13705338lby.40.1337873686521;\r\n Thu, 24 May 2012 08:34:46 -0700 (PDT)\r\nReturn-Path: <suetest@kellyredding.com>\r\nReceived: from mail-lpp01m010-f67.google.com (mail-lpp01m010-f67.google.com [209.85.215.67])\r\n by mx.google.com with ESMTPS id a9si2217645lbh.1.2012.05.24.08.34.46\r\n (version=TLSv1/SSLv3 cipher=OTHER);\r\n Thu, 24 May 2012 08:34:46 -0700 (PDT)\r\nReceived-SPF: neutral (google.com: 209.85.215.67 is neither permitted nor denied by best guess record for domain of suetest@kellyredding.com) client-ip=209.85.215.67;\r\nAuthentication-Results: mx.google.com; spf=neutral (google.com: 209.85.215.67 is neither permitted nor denied by best guess record for domain of suetest@kellyredding.com) smtp.mail=suetest@kellyredding.com\r\nReceived: by lagv3 with SMTP id v3so751705lag.2\r\n for <joetest@kellyredding.com>; Thu, 24 May 2012 08:34:44 -0700 (PDT)\r\nX-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;\r\n d=google.com; s=20120113;\r\n h=mime-version:x-originating-ip:date:message-id:subject:from:to\r\n :content-type:x-gm-message-state;\r\n bh=jC/axn7WeCoH+0tXbYrcmVfGSuJ82WTAoccq2csJ8HA=;\r\n b=T5W+Ba0za3EsMrBgVM6Z2kJww/GvOIr5JzEMVwNnqJDMgFseumYcHw9f6OGZMuhvtH\r\n Ok3PCmg8uiDRj1Mm2YiE1O8dhQL7BgBd4UO5zBGcLzUDYHBLor+oSjh8pZOsNgHEJk9H\r\n dZSn0Af4q8RuCRNCyeD8xJt7rRF1EESAgqdQ35fd1GiTefGyhE1UwGkS/P4BiUga1wUr\r\n qG2fA7Sbj2XcTyCjvsXqgw/EoOuIgnOqeMHZ5CsCfE0FBhW24cIwAt59FIeTELcsb0QQ\r\n 4w76+RkaS4SxuNCEagsRN6DHnLB7SKqTRF6ZKt6xs/zbkz1Qz3mq4yrhrrYa3pNnK9Ez\r\n F2ug==\r\nMIME-Version: 1.0\r\nReceived: by 10.112.29.199 with SMTP id m7mr14024566lbh.31.1337873684699; Thu,\r\n 24 May 2012 08:34:44 -0700 (PDT)\r\nReceived: by 10.114.59.80 with HTTP; Thu, 24 May 2012 08:34:44 -0700 (PDT)\r\nX-Originating-IP: [209.133.30.126]\r\nDate: Thu, 24 May 2012 10:34:44 -0500\r\nMessage-ID: <CAA9i=SubBh6kAv=cxgGskY9cmS7gsT4m6YSGGdc417bM+DFk4Q@mail.gmail.com>\r\nSubject: test mail\r\nFrom: Sue Test <suetest@kellyredding.com>\r\nTo: joetest@kellyredding.com\r\nContent-Type: multipart/alternative; boundary=f46d04016b2dbb1bfe04c0c9fd9a\r\nX-Gm-Message-State: ALoCoQkFFPgZHO7zDsv7I5mvZqbwHdNjnyobpEyOYxxXgPySrU+OEAOtZSKX6G3vlddVo15J3A5s\r\n\r\n--f46d04016b2dbb1bfe04c0c9fd9a\r\nContent-Type: text/plain; charset=ISO-8859-1\r\n\r\nThis is a test mail\r\n\r\nWITH MARKUP!!!\r\n\r\n--f46d04016b2dbb1bfe04c0c9fd9a\r\nContent-Type: text/html; charset=ISO-8859-1\r\n\r\nThis is a test mail<div><br></div><div><font class=\"Apple-style-span\" color=\"#ff0000\">WITH MARKUP!!!</font></div>\r\n\r\n--f46d04016b2dbb1bfe04c0c9fd9a--\r\n",
|
40
|
+
'INTERNALDATE' => "24-May-2012 15:34:46 +0000"
|
41
|
+
}
|
42
|
+
|
43
|
+
def test_mail_item
|
44
|
+
InboxSync::MailItem.new('12345', TEST_MAIL_DATA['RFC822'], TEST_MAIL_DATA['INTERNALDATE'])
|
45
|
+
end
|
46
|
+
|
47
|
+
def setup_sync_mail_item
|
48
|
+
@sync = Assert::Context.new.configured_sync
|
49
|
+
@sync.login
|
50
|
+
@mail_item = Assert::Context.new.test_mail_item
|
51
|
+
[@sync, @mail_item]
|
52
|
+
end
|
53
|
+
|
54
|
+
def empty_source_selected(sync)
|
55
|
+
sync.source_imap.uid_search(['ALL']).each do |uid|
|
56
|
+
sync.source_imap.uid_store(uid, "+FLAGS", [:Deleted])
|
57
|
+
end
|
58
|
+
sync.source_imap.expunge
|
59
|
+
end
|
60
|
+
|
61
|
+
def reset_source_inbox(sync)
|
62
|
+
sync.source_imap.select(sync.config.source.inbox)
|
63
|
+
empty_source_selected(sync)
|
64
|
+
|
65
|
+
# append the test mail on the source imap
|
66
|
+
inbox = sync.config.source.inbox
|
67
|
+
mail_s = test_mail_item.meta['RFC822']
|
68
|
+
flags = []
|
69
|
+
date = test_mail_item.meta['INTERNALDATE']
|
70
|
+
|
71
|
+
sync.source_imap.append(inbox, mail_s, flags, date)
|
72
|
+
end
|
73
|
+
|
74
|
+
def reset_source_archive(sync)
|
75
|
+
begin
|
76
|
+
sync.source_imap.select(sync.config.archive_folder)
|
77
|
+
rescue Net::IMAP::NoResponseError => err
|
78
|
+
# do nothing - archive folder not present - no action needed
|
79
|
+
else
|
80
|
+
empty_source_selected(sync)
|
81
|
+
sync.source_imap.delete(sync.config.archive_folder)
|
82
|
+
ensure
|
83
|
+
sync.source_imap.select(sync.config.source.inbox)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
data/test/irb.rb
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'assert'
|
2
|
+
require 'mail'
|
3
|
+
require 'inbox-sync/mail_item'
|
4
|
+
|
5
|
+
module InboxSync
|
6
|
+
|
7
|
+
class MailItemTests < Assert::Context
|
8
|
+
desc 'a mail item'
|
9
|
+
before do
|
10
|
+
@item = test_mail_item
|
11
|
+
end
|
12
|
+
subject { @item }
|
13
|
+
|
14
|
+
should have_readers :uid, :meta, :message
|
15
|
+
should have_class_method :find
|
16
|
+
should have_instance_method :name, :stripped
|
17
|
+
|
18
|
+
should "build a Mail Message from the raw IMAP attr data" do
|
19
|
+
assert_kind_of ::Mail::Message, subject.message
|
20
|
+
end
|
21
|
+
|
22
|
+
should "provide the raw IMAP attrs in the meta hash" do
|
23
|
+
assert_includes 'RFC822', subject.meta
|
24
|
+
assert_includes 'INTERNALDATE', subject.meta
|
25
|
+
|
26
|
+
assert_equal TEST_MAIL_DATA['RFC822'], subject.meta['RFC822']
|
27
|
+
assert_equal TEST_MAIL_DATA['INTERNALDATE'], subject.meta['INTERNALDATE']
|
28
|
+
end
|
29
|
+
|
30
|
+
should "be named by its uid, from, subject, and date" do
|
31
|
+
exp = "[12345] suetest@kellyredding.com: \"test mail\" (Thu May 24 2012, 10:34 AM)"
|
32
|
+
assert_equal exp, subject.name
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
class StrippedMailItemTests < MailItemTests
|
38
|
+
desc 'that has been stripped'
|
39
|
+
before do
|
40
|
+
@stripped = @item.stripped
|
41
|
+
end
|
42
|
+
subject { @stripped }
|
43
|
+
|
44
|
+
should "be single part plain text only" do
|
45
|
+
assert_equal 1, subject.message.parts.size
|
46
|
+
end
|
47
|
+
|
48
|
+
should "have no attachments" do
|
49
|
+
assert_equal 0, subject.message.attachments.size
|
50
|
+
end
|
51
|
+
|
52
|
+
should "prefix the body with a note saying that it is stripped down" do
|
53
|
+
pref = /\A\*\*\[inbox-sync\] stripped down to just plain text part\*\*/
|
54
|
+
assert_match pref, subject.message.parts.first.body.to_s
|
55
|
+
end
|
56
|
+
|
57
|
+
should "set its RFC822 to the stripped message string" do
|
58
|
+
assert_equal subject.meta['RFC822'], subject.message.to_s
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
data/test/runner_test.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'assert'
|
2
|
+
|
3
|
+
require 'inbox-sync/sync'
|
4
|
+
require 'inbox-sync/runner'
|
5
|
+
|
6
|
+
module InboxSync
|
7
|
+
|
8
|
+
class RunnerTests < Assert::Context
|
9
|
+
desc "a sync runner"
|
10
|
+
before do
|
11
|
+
@syncs = [InboxSync::Sync.new, InboxSync::Sync.new]
|
12
|
+
@runner = InboxSync::Runner.new(@syncs, :interval => 20)
|
13
|
+
end
|
14
|
+
subject { @runner }
|
15
|
+
|
16
|
+
should have_readers :syncs, :interval, :logger
|
17
|
+
|
18
|
+
should "know its syncs" do
|
19
|
+
assert_equal @syncs, subject.syncs
|
20
|
+
end
|
21
|
+
|
22
|
+
should "know its interval seconds" do
|
23
|
+
assert_equal 20, subject.interval
|
24
|
+
end
|
25
|
+
|
26
|
+
should "default its interval to -1" do
|
27
|
+
assert_equal -1, InboxSync::Runner.new.interval
|
28
|
+
end
|
29
|
+
|
30
|
+
should "build from zero or many syncs" do
|
31
|
+
assert_equal @syncs, InboxSync::Runner.new(@syncs).syncs
|
32
|
+
assert_equal @syncs, InboxSync::Runner.new(*@syncs).syncs
|
33
|
+
assert_equal [@syncs.first], InboxSync::Runner.new(@syncs.first).syncs
|
34
|
+
assert_equal [], InboxSync::Runner.new(:interval => 5).syncs
|
35
|
+
assert_equal [], InboxSync::Runner.new().syncs
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'assert'
|
2
|
+
|
3
|
+
require 'inbox-sync/sync'
|
4
|
+
require 'inbox-sync/config'
|
5
|
+
|
6
|
+
module InboxSync
|
7
|
+
|
8
|
+
class BasicSyncTests < Assert::Context
|
9
|
+
desc "a sync"
|
10
|
+
before do
|
11
|
+
@sync = InboxSync::Sync.new
|
12
|
+
@raw_config = InboxSync::Config.new({
|
13
|
+
:source => { :host => 'imap.test.com'}
|
14
|
+
})
|
15
|
+
end
|
16
|
+
subject { @sync }
|
17
|
+
|
18
|
+
should have_readers :config, :source_imap, :notify_smtp
|
19
|
+
should have_instance_methods :uid, :name, :logger, :logged_in?
|
20
|
+
should have_instance_method :configure, :setup, :teardown, :run, :notify
|
21
|
+
|
22
|
+
should "configure using a block" do
|
23
|
+
subject.configure do
|
24
|
+
source.host 'imap.test.com'
|
25
|
+
end
|
26
|
+
assert_equal @raw_config.source, subject.config.source
|
27
|
+
end
|
28
|
+
|
29
|
+
should "configure passing in a settings hash" do
|
30
|
+
a_sync = InboxSync::Sync.new({
|
31
|
+
:source => {:host => 'imap.test.com'}
|
32
|
+
})
|
33
|
+
|
34
|
+
assert_equal a_sync.config.source, @raw_config.source
|
35
|
+
end
|
36
|
+
|
37
|
+
should "return itself when calling `configure`" do
|
38
|
+
assert_equal subject, subject.configure
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
class BasicConfiguredSyncTests < BasicSyncTests
|
44
|
+
desc 'that has the basic configs'
|
45
|
+
before do
|
46
|
+
subject.configure do
|
47
|
+
source.host 'imap.test.com'
|
48
|
+
source.login.user 'me@example.com'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
should "have a unique id" do
|
53
|
+
assert_equal "me@example.com:imap.test.com", subject.uid
|
54
|
+
end
|
55
|
+
|
56
|
+
should "be named by its source" do
|
57
|
+
assert_equal "me@example.com (imap.test.com)", subject.name
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'assert'
|
2
|
+
|
3
|
+
require 'inbox-sync/sync'
|
4
|
+
|
5
|
+
module InboxSync
|
6
|
+
|
7
|
+
class ConfiguredSyncTests < Assert::Context
|
8
|
+
desc "a sync that has been configured and setup"
|
9
|
+
before do
|
10
|
+
@sync = configured_sync
|
11
|
+
@sync.setup
|
12
|
+
end
|
13
|
+
after do
|
14
|
+
@sync.teardown
|
15
|
+
end
|
16
|
+
subject { @sync }
|
17
|
+
|
18
|
+
should "be logged in" do
|
19
|
+
assert subject.logged_in?
|
20
|
+
end
|
21
|
+
|
22
|
+
should "be logged out after teardown" do
|
23
|
+
subject.teardown
|
24
|
+
|
25
|
+
assert_not subject.logged_in?
|
26
|
+
end
|
27
|
+
|
28
|
+
should "set source IMAP and notify SMTP objects" do
|
29
|
+
assert_kind_of Net::IMAP, subject.source_imap
|
30
|
+
assert_kind_of Net::SMTP, subject.notify_smtp
|
31
|
+
end
|
32
|
+
|
33
|
+
should "remove source IMAP and notify SMTP objects after teardown" do
|
34
|
+
subject.teardown
|
35
|
+
|
36
|
+
assert_nil subject.source_imap
|
37
|
+
assert_nil subject.notify_smtp
|
38
|
+
end
|
39
|
+
|
40
|
+
should "validate the configs on setup" do
|
41
|
+
assert_raises ArgumentError do
|
42
|
+
InboxSync::Sync.new(:logger => '/dev/null').setup
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
class LoggedInTests < ConfiguredSyncTests
|
49
|
+
desc 'and is logged in and ready to run'
|
50
|
+
before do
|
51
|
+
reset_source_inbox(@sync)
|
52
|
+
reset_source_archive(@sync)
|
53
|
+
|
54
|
+
@sync_archive_folder = @sync.config.archive_folder
|
55
|
+
@mail_item = MailItem.find(@sync.source_imap).first
|
56
|
+
end
|
57
|
+
|
58
|
+
after do
|
59
|
+
@sync.config.archive_folder = @sync_archive_folder
|
60
|
+
@sync.source_imap.select(@sync.config.source.inbox)
|
61
|
+
|
62
|
+
reset_source_archive(@sync)
|
63
|
+
end
|
64
|
+
|
65
|
+
should "run without any errors" do
|
66
|
+
assert_nothing_raised do
|
67
|
+
subject.run
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
# class ArchiveTests < RunTests
|
74
|
+
# should "remove the message from the inbox" do
|
75
|
+
# @sync.archive_from_source(@mail_item)
|
76
|
+
|
77
|
+
# assert_not_included @mail_item.uid, @sync.source_imap.uid_search(['ALL'])
|
78
|
+
# assert_empty @sync.source_imap.uid_search(['ALL'])
|
79
|
+
# end
|
80
|
+
|
81
|
+
# should "move it to the archive folder" do
|
82
|
+
# @sync.archive_from_source(@mail_item)
|
83
|
+
# @sync.source_imap.select(@sync.config.archive_folder)
|
84
|
+
|
85
|
+
# assert_equal 1, @sync.source_imap.uid_search(['ALL']).size
|
86
|
+
# end
|
87
|
+
|
88
|
+
# should "not archive if no archive folder configured" do
|
89
|
+
# @sync.config.archive_folder = nil
|
90
|
+
# @sync.archive_from_source(@mail_item)
|
91
|
+
# @sync.source_imap.select(@sync.config.source.inbox)
|
92
|
+
|
93
|
+
# assert_not_included @mail_item.uid, @sync.source_imap.uid_search(['ALL'])
|
94
|
+
# end
|
95
|
+
|
96
|
+
# end
|
97
|
+
|
98
|
+
# class AppendTests < LoggedInTests
|
99
|
+
# should "append a source msg onto the dest" do
|
100
|
+
# assert_nothing_raised do
|
101
|
+
# @sync.append_to_dest(test_mail_item)
|
102
|
+
# end
|
103
|
+
# end
|
104
|
+
|
105
|
+
# should "parse the destination UID when appending mail items" do
|
106
|
+
# assert_match /\A\d+\Z/, @sync.append_to_dest(test_mail_item)
|
107
|
+
# end
|
108
|
+
# end
|
109
|
+
|
110
|
+
end
|
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: inbox-sync
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 0.1.0
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Kelly Redding
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2012-06-05 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
type: :development
|
22
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
23
|
+
none: false
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
hash: 3
|
28
|
+
segments:
|
29
|
+
- 0
|
30
|
+
version: "0"
|
31
|
+
name: assert
|
32
|
+
version_requirements: *id001
|
33
|
+
prerelease: false
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
type: :runtime
|
36
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
37
|
+
none: false
|
38
|
+
requirements:
|
39
|
+
- - ~>
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
hash: 13
|
42
|
+
segments:
|
43
|
+
- 0
|
44
|
+
- 4
|
45
|
+
- 1
|
46
|
+
version: 0.4.1
|
47
|
+
name: ns-options
|
48
|
+
version_requirements: *id002
|
49
|
+
prerelease: false
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
type: :runtime
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ~>
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 11
|
58
|
+
segments:
|
59
|
+
- 2
|
60
|
+
- 4
|
61
|
+
version: "2.4"
|
62
|
+
name: mail
|
63
|
+
version_requirements: *id003
|
64
|
+
prerelease: false
|
65
|
+
description: Move messages from one inbox to another
|
66
|
+
email:
|
67
|
+
- kelly@kellyredding.com
|
68
|
+
executables: []
|
69
|
+
|
70
|
+
extensions: []
|
71
|
+
|
72
|
+
extra_rdoc_files: []
|
73
|
+
|
74
|
+
files:
|
75
|
+
- .gitignore
|
76
|
+
- Gemfile
|
77
|
+
- LICENSE
|
78
|
+
- README.md
|
79
|
+
- Rakefile
|
80
|
+
- inbox-sync.gemspec
|
81
|
+
- lib/inbox-sync.rb
|
82
|
+
- lib/inbox-sync/config.rb
|
83
|
+
- lib/inbox-sync/config/credentials.rb
|
84
|
+
- lib/inbox-sync/config/imap_config.rb
|
85
|
+
- lib/inbox-sync/config/smtp_config.rb
|
86
|
+
- lib/inbox-sync/mail_item.rb
|
87
|
+
- lib/inbox-sync/notice/base.rb
|
88
|
+
- lib/inbox-sync/notice/run_sync_error.rb
|
89
|
+
- lib/inbox-sync/notice/sync_mail_item_error.rb
|
90
|
+
- lib/inbox-sync/runner.rb
|
91
|
+
- lib/inbox-sync/sync.rb
|
92
|
+
- lib/inbox-sync/version.rb
|
93
|
+
- log/.gitkeep
|
94
|
+
- test/config_test.rb
|
95
|
+
- test/helper.rb
|
96
|
+
- test/irb.rb
|
97
|
+
- test/mail_item_test.rb
|
98
|
+
- test/runner_test.rb
|
99
|
+
- test/sync/basic_test.rb
|
100
|
+
- test/sync/login_test.rb
|
101
|
+
homepage: http://github.com/kellyredding/inbox-sync
|
102
|
+
licenses: []
|
103
|
+
|
104
|
+
post_install_message:
|
105
|
+
rdoc_options: []
|
106
|
+
|
107
|
+
require_paths:
|
108
|
+
- lib
|
109
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
110
|
+
none: false
|
111
|
+
requirements:
|
112
|
+
- - ">="
|
113
|
+
- !ruby/object:Gem::Version
|
114
|
+
hash: 3
|
115
|
+
segments:
|
116
|
+
- 0
|
117
|
+
version: "0"
|
118
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
+
none: false
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
hash: 3
|
124
|
+
segments:
|
125
|
+
- 0
|
126
|
+
version: "0"
|
127
|
+
requirements: []
|
128
|
+
|
129
|
+
rubyforge_project:
|
130
|
+
rubygems_version: 1.8.11
|
131
|
+
signing_key:
|
132
|
+
specification_version: 3
|
133
|
+
summary: Move messages from one inbox to another
|
134
|
+
test_files:
|
135
|
+
- test/config_test.rb
|
136
|
+
- test/helper.rb
|
137
|
+
- test/irb.rb
|
138
|
+
- test/mail_item_test.rb
|
139
|
+
- test/runner_test.rb
|
140
|
+
- test/sync/basic_test.rb
|
141
|
+
- test/sync/login_test.rb
|