imap_tickler 0.0.1
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 +3 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +32 -0
- data/README.markdown +57 -0
- data/Rakefile +5 -0
- data/autotest/discover.rb +1 -0
- data/bin/imap_tickler +5 -0
- data/imap_tickler.gemspec +25 -0
- data/lib/imap_tickler/cli.rb +24 -0
- data/lib/imap_tickler/tickler.rb +51 -0
- data/lib/imap_tickler/version.rb +3 -0
- data/lib/imap_tickler.rb +4 -0
- data/spec/lib/cli_spec.rb +22 -0
- data/spec/lib/ticker_spec.rb +63 -0
- data/spec/lib/version_spec.rb +6 -0
- data/spec/spec_helper.rb +10 -0
- metadata +127 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
imap_tickler (0.0.1)
|
5
|
+
|
6
|
+
GEM
|
7
|
+
remote: http://rubygems.org/
|
8
|
+
specs:
|
9
|
+
chronic (0.3.0)
|
10
|
+
delorean (0.2.1)
|
11
|
+
chronic
|
12
|
+
diff-lcs (1.1.2)
|
13
|
+
mocha (0.9.11)
|
14
|
+
rake
|
15
|
+
rake (0.8.7)
|
16
|
+
rspec (2.5.0)
|
17
|
+
rspec-core (~> 2.5.0)
|
18
|
+
rspec-expectations (~> 2.5.0)
|
19
|
+
rspec-mocks (~> 2.5.0)
|
20
|
+
rspec-core (2.5.1)
|
21
|
+
rspec-expectations (2.5.0)
|
22
|
+
diff-lcs (~> 1.1.2)
|
23
|
+
rspec-mocks (2.5.0)
|
24
|
+
|
25
|
+
PLATFORMS
|
26
|
+
ruby
|
27
|
+
|
28
|
+
DEPENDENCIES
|
29
|
+
delorean
|
30
|
+
imap_tickler!
|
31
|
+
mocha
|
32
|
+
rspec
|
data/README.markdown
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
imap\_tickler
|
2
|
+
===========
|
3
|
+
|
4
|
+
imap\_tickler is a utility that ticklers your _43 folders_ style mailfolders. It expects the following folderstructure in your mail.
|
5
|
+
|
6
|
+
@Tickler
|
7
|
+
Month
|
8
|
+
01 Jan
|
9
|
+
02 Feb
|
10
|
+
03 Mar
|
11
|
+
04 Apr
|
12
|
+
05 May
|
13
|
+
06 Jun
|
14
|
+
07 Jul
|
15
|
+
08 Aug
|
16
|
+
09 Sep
|
17
|
+
10 Oct
|
18
|
+
11 Nov
|
19
|
+
12 Dec
|
20
|
+
Week 1
|
21
|
+
1
|
22
|
+
2
|
23
|
+
3
|
24
|
+
4
|
25
|
+
5
|
26
|
+
6
|
27
|
+
7
|
28
|
+
Week 2
|
29
|
+
8
|
30
|
+
9
|
31
|
+
10
|
32
|
+
11
|
33
|
+
12
|
34
|
+
13
|
35
|
+
14
|
36
|
+
Week 3
|
37
|
+
15
|
38
|
+
16
|
39
|
+
17
|
40
|
+
18
|
41
|
+
19
|
42
|
+
20
|
43
|
+
21
|
44
|
+
Week 4
|
45
|
+
22
|
46
|
+
23
|
47
|
+
24
|
48
|
+
25
|
49
|
+
26
|
50
|
+
27
|
51
|
+
28
|
52
|
+
Week 5
|
53
|
+
29
|
54
|
+
30
|
55
|
+
31
|
56
|
+
|
57
|
+
It will move all mail from today's mailbox and this month's mailbox into your inbox.
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Autotest.add_discovery {"rspec2"}
|
data/bin/imap_tickler
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "imap_tickler/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "imap_tickler"
|
7
|
+
s.version = ImapTickler::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Jelle Helsen"]
|
10
|
+
s.email = ["jelle.helsen@hcode.be"]
|
11
|
+
s.homepage = "http://rubygems.org/gems/imap_tickler"
|
12
|
+
s.summary = %q{an imap tickler}
|
13
|
+
s.description = %q{imap_tickler is a utility that ticklers your 43 folders style mailfolders. It expects the following folderstructure in your mail.}
|
14
|
+
|
15
|
+
s.rubyforge_project = "imap_tickler"
|
16
|
+
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
19
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
|
22
|
+
s.add_development_dependency "rspec"
|
23
|
+
s.add_development_dependency "delorean"
|
24
|
+
s.add_development_dependency "mocha"
|
25
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require "yaml"
|
3
|
+
require "imap_tickler/tickler"
|
4
|
+
module ImapTickler
|
5
|
+
class CLI
|
6
|
+
def self.execute(input,output,arguments=[])
|
7
|
+
options = {:config_file => "~/.imap_tickler.conf"}
|
8
|
+
parser = OptionParser.new do |opts|
|
9
|
+
opts.banner = <<-BANNER.gsub(/^ /,'')
|
10
|
+
Usage: #{File.basename($0)} [options]
|
11
|
+
|
12
|
+
Options are:
|
13
|
+
BANNER
|
14
|
+
opts.on( "-F path", "", String,
|
15
|
+
"Load an alternate config file") do |opt|
|
16
|
+
options[:config_file] = opt
|
17
|
+
end
|
18
|
+
end
|
19
|
+
parser.parse(arguments)
|
20
|
+
config = YAML.load_file(File.expand_path(options[:config_file]))
|
21
|
+
Tickler.new(config).start
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "date"
|
2
|
+
require "net/imap"
|
3
|
+
module ImapTickler
|
4
|
+
class Tickler
|
5
|
+
attr_reader :config, :connection
|
6
|
+
def initialize(config)
|
7
|
+
@day_list = ["Week 1/1", "Week 1/2", "Week 1/3", "Week 1/4", "Week 1/5", "Week 1/6", "Week 1/7", "Week 2/8", "Week 2/9",
|
8
|
+
"Week 2/10", "Week 2/11", "Week 2/12", "Week 2/13", "Week 2/14", "Week 3/15", "Week 3/16", "Week 3/17", "Week 3/18",
|
9
|
+
"Week 3/19", "Week 3/20", "Week 3/21", "Week 4/22", "Week 4/23", "Week 4/24", "Week 4/25", "Week 4/26", "Week 4/27",
|
10
|
+
"Week 4/28", "Week 5/29", "Week 5/30", "Week 5/31"]
|
11
|
+
|
12
|
+
@month_list = ["Month/01 Jan", "Month/02 Feb", "Month/03 Mar", "Month/04 Apr", "Month/05 May", "Month/06 Jun",
|
13
|
+
"Month/07 Jul", "Month/08 Aug", "Month/09 Sep", "Month/10 Oct", "Month/11 Nov", "Month/12 Dec"]
|
14
|
+
|
15
|
+
@config = config
|
16
|
+
end
|
17
|
+
|
18
|
+
def connect
|
19
|
+
@connection = Net::IMAP.new(config[:mailserver], 993, true) if config[:use_ssl]
|
20
|
+
@connection ||= Net::IMAP.new(config[:mailserver])
|
21
|
+
if @connection
|
22
|
+
@connection.login(config[:username],config[:password])
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def this_months_mailbox
|
27
|
+
@month_list[Date.today.month - 1]
|
28
|
+
end
|
29
|
+
|
30
|
+
def todays_mailbox
|
31
|
+
@day_list[Date.today.day - 1]
|
32
|
+
end
|
33
|
+
|
34
|
+
def tickle_mailbox mailbox
|
35
|
+
connection.select("@Tickler/#{mailbox}")
|
36
|
+
messages = connection.responses["EXISTS"][-1]
|
37
|
+
if messages > 0
|
38
|
+
connection.copy(1..messages,"INBOX")
|
39
|
+
connection.store(1..messages,"+FLAGS", [:Deleted])
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def start
|
44
|
+
connect
|
45
|
+
[todays_mailbox, this_months_mailbox].each do |mailbox|
|
46
|
+
tickle_mailbox(mailbox)
|
47
|
+
end
|
48
|
+
return 0
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
data/lib/imap_tickler.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "imap_tickler/cli"
|
3
|
+
describe ImapTickler::CLI do
|
4
|
+
it "should load the default config file" do
|
5
|
+
YAML.expects(:load_file).with(File.expand_path('~/.imap_tickler.conf')).returns(config = mock)
|
6
|
+
ImapTickler::Tickler.expects(:new).with(config).returns(tickler = mock(:start => nil))
|
7
|
+
ImapTickler::CLI.execute(STDIN,STDOUT,[])
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should load the given config file" do
|
11
|
+
YAML.expects(:load_file).with(File.expand_path('/tmp/imap_tickler.conf')).returns(config = mock)
|
12
|
+
ImapTickler::Tickler.expects(:new).with(config).returns(tickler = mock(:start => nil))
|
13
|
+
ImapTickler::CLI.execute(STDIN,STDOUT,%w(-F /tmp/imap_tickler.conf))
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should start the tickler" do
|
17
|
+
YAML.expects(:load_file).with(File.expand_path('/tmp/imap_tickler.conf')).returns(config = mock)
|
18
|
+
ImapTickler::Tickler.expects(:new).with(config).returns(tickler = mock)
|
19
|
+
tickler.expects(:start).returns(0)
|
20
|
+
ImapTickler::CLI.execute(STDIN,STDOUT,%w(-F /tmp/imap_tickler.conf)).should == 0
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
describe ImapTickler::Tickler do
|
3
|
+
before do
|
4
|
+
@tickler = ImapTickler::Tickler.new({:mailserver => 'imap.example.com', :username => "user@domain", :password => "secret"})
|
5
|
+
end
|
6
|
+
it "should get the correct mailbox for this month" do
|
7
|
+
Delorean.time_travel_to "5 Jan 2011"
|
8
|
+
@tickler.this_months_mailbox.should == "Month/01 Jan"
|
9
|
+
Delorean.time_travel_to "5 Feb 2011"
|
10
|
+
@tickler.this_months_mailbox.should == "Month/02 Feb"
|
11
|
+
Delorean.time_travel_to "5 Dec 2011"
|
12
|
+
@tickler.this_months_mailbox.should == "Month/12 Dec"
|
13
|
+
Delorean.back_to_the_present
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should get the correct mailbox for today" do
|
17
|
+
Delorean.time_travel_to "5 Jan 2011"
|
18
|
+
@tickler.todays_mailbox.should == "Week 1/5"
|
19
|
+
Delorean.time_travel_to "15 Feb 2011"
|
20
|
+
@tickler.todays_mailbox.should == "Week 3/15"
|
21
|
+
Delorean.time_travel_to "25 Dec 2011"
|
22
|
+
@tickler.todays_mailbox.should == "Week 4/25"
|
23
|
+
Delorean.back_to_the_present
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should conect to the mailserver" do
|
27
|
+
Net::IMAP.expects(:new).with('imap.example.com').returns(connection = mock)
|
28
|
+
connection.expects(:login).with("user@domain","secret")
|
29
|
+
@tickler.connect
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should select the mailbox" do
|
33
|
+
@tickler.expects(:connection).times(2).returns(connection = mock)
|
34
|
+
connection.expects(:select).with("@Tickler/Week 1/5")
|
35
|
+
connection.expects(:responses).returns({"EXISTS" => [0]})
|
36
|
+
@tickler.tickle_mailbox("Week 1/5")
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should copy and delete all mails in the mailbox" do
|
40
|
+
@tickler.expects(:connection).times(4).returns(connection ||= mock)
|
41
|
+
connection.expects(:select).with("@Tickler/Week 1/5")
|
42
|
+
connection.expects(:responses).returns({"EXISTS" => [21]})
|
43
|
+
connection.expects(:copy).with(1..21,"INBOX")
|
44
|
+
connection.expects(:store).with(1..21, "+FLAGS", [:Deleted] )
|
45
|
+
@tickler.tickle_mailbox("Week 1/5")
|
46
|
+
end
|
47
|
+
|
48
|
+
it "should use ssl if instructed" do
|
49
|
+
@tickler = ImapTickler::Tickler.new({:mailserver => 'imap.example.com', :username => "user@domain", :password => "secret",:use_ssl => true})
|
50
|
+
Net::IMAP.expects(:new).with('imap.example.com', 993, true).returns(connection = mock)
|
51
|
+
connection.expects(:login).with("user@domain","secret")
|
52
|
+
@tickler.connect
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should connect and tickle todays and this months mailbox" do
|
56
|
+
Delorean.time_travel_to "5 Jan 2011"
|
57
|
+
@tickler.expects(:connect)
|
58
|
+
@tickler.expects(:tickle_mailbox).with("Week 1/5")
|
59
|
+
@tickler.expects(:tickle_mailbox).with("Month/01 Jan")
|
60
|
+
@tickler.start
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: imap_tickler
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Jelle Helsen
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2011-02-10 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 3
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
version: "0"
|
33
|
+
type: :development
|
34
|
+
version_requirements: *id001
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: delorean
|
37
|
+
prerelease: false
|
38
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
hash: 3
|
44
|
+
segments:
|
45
|
+
- 0
|
46
|
+
version: "0"
|
47
|
+
type: :development
|
48
|
+
version_requirements: *id002
|
49
|
+
- !ruby/object:Gem::Dependency
|
50
|
+
name: mocha
|
51
|
+
prerelease: false
|
52
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
53
|
+
none: false
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
hash: 3
|
58
|
+
segments:
|
59
|
+
- 0
|
60
|
+
version: "0"
|
61
|
+
type: :development
|
62
|
+
version_requirements: *id003
|
63
|
+
description: imap_tickler is a utility that ticklers your 43 folders style mailfolders. It expects the following folderstructure in your mail.
|
64
|
+
email:
|
65
|
+
- jelle.helsen@hcode.be
|
66
|
+
executables:
|
67
|
+
- imap_tickler
|
68
|
+
extensions: []
|
69
|
+
|
70
|
+
extra_rdoc_files: []
|
71
|
+
|
72
|
+
files:
|
73
|
+
- .gitignore
|
74
|
+
- Gemfile
|
75
|
+
- Gemfile.lock
|
76
|
+
- README.markdown
|
77
|
+
- Rakefile
|
78
|
+
- autotest/discover.rb
|
79
|
+
- bin/imap_tickler
|
80
|
+
- imap_tickler.gemspec
|
81
|
+
- lib/imap_tickler.rb
|
82
|
+
- lib/imap_tickler/cli.rb
|
83
|
+
- lib/imap_tickler/tickler.rb
|
84
|
+
- lib/imap_tickler/version.rb
|
85
|
+
- spec/lib/cli_spec.rb
|
86
|
+
- spec/lib/ticker_spec.rb
|
87
|
+
- spec/lib/version_spec.rb
|
88
|
+
- spec/spec_helper.rb
|
89
|
+
has_rdoc: true
|
90
|
+
homepage: http://rubygems.org/gems/imap_tickler
|
91
|
+
licenses: []
|
92
|
+
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 3
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
version: "0"
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
hash: 3
|
113
|
+
segments:
|
114
|
+
- 0
|
115
|
+
version: "0"
|
116
|
+
requirements: []
|
117
|
+
|
118
|
+
rubyforge_project: imap_tickler
|
119
|
+
rubygems_version: 1.4.2
|
120
|
+
signing_key:
|
121
|
+
specification_version: 3
|
122
|
+
summary: an imap tickler
|
123
|
+
test_files:
|
124
|
+
- spec/lib/cli_spec.rb
|
125
|
+
- spec/lib/ticker_spec.rb
|
126
|
+
- spec/lib/version_spec.rb
|
127
|
+
- spec/spec_helper.rb
|