imapget 0.0.8 → 0.1.0.pre1

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
  SHA1:
3
- metadata.gz: 3141767c21640d56d602e93228ef190eec1e0351
4
- data.tar.gz: 433ab8f76dd1535dcc3face20e86e34908fd0741
3
+ metadata.gz: cf0abd8585721204d2c457a24b593605dd1cd4fb
4
+ data.tar.gz: a7de9a98f18771603df466c0b055de8a83a704a3
5
5
  SHA512:
6
- metadata.gz: 46c6d3141d55548aec8d8fc5e5762c98de43d0123b315965704517e542447672b964699924fd5e2589a666594eaabeac9349df8b35227de31c8a9505b9572832
7
- data.tar.gz: b3837b0dd1932e296d9c87cf56d2d43c778689e0c61745a5de0adf82fec1861b526d0d0d9b6c888d0e6f1c03fd109703b13be628b3747bd031f0380681e14b35
6
+ metadata.gz: 76671c4d3a6c52713650c08ac824f208dcb66fbc1026c7fe2791ec2d9a52ce9ace41eed80aa9edcd96a2f223f080cb2c6ce7daa25aac2cb9662138951d45f777
7
+ data.tar.gz: 89c22c6aa52da221f20712b598adbac58eaf320daa3ec60129639d465fd483b2b86b48ac3ae30760c42ad2096da8b3595580fdfde81115c62f75746d5cf848e6
data/ChangeLog CHANGED
@@ -2,6 +2,16 @@
2
2
 
3
3
  = Revision history for imapget
4
4
 
5
+ == 0.1.0 [unreleased]
6
+
7
+ * Added options <tt>--dupes</tt> and <tt>--uniq</tt>.
8
+ * Added STARTTLS support.
9
+ * Added LOGIN as fallback for AUTHENTICATE.
10
+ * Added +batch_size+ option.
11
+ * Dropped +use_ssl+ options; use +ssl+ instead.
12
+ * Dropped support for Ruby 1.8.
13
+ * Internal refactoring.
14
+
5
15
  == 0.0.1 [2009-05-20]
6
16
 
7
17
  * Birthday :-)
data/README CHANGED
@@ -2,22 +2,21 @@
2
2
 
3
3
  == VERSION
4
4
 
5
- This documentation refers to imapget version 0.0.8
5
+ This documentation refers to imapget version 0.1.0
6
6
 
7
7
 
8
8
  == DESCRIPTION
9
9
 
10
- Downloads IMAP mails locally. It deletes local mails that have been deleted
11
- on the server, but never ever modifies anything on the server! Thus, it's
12
- different from your typical *sync* tool.
10
+ Downloads IMAP mails locally. It deletes local mails that are marked as deleted
11
+ on the server, but, while in download mode, never ever modifies anything on the
12
+ server! Thus, it's different from your typical *sync* tool.
13
13
 
14
14
 
15
15
  == LINKS
16
16
 
17
- <b></b>
18
- Documentation:: http://blackwinter.github.com/imapget
19
- Source code:: http://github.com/blackwinter/imapget
20
- RubyGem:: http://rubygems.org/gems/imapget
17
+ Documentation:: https://blackwinter.github.io/imapget/
18
+ Source code:: https://github.com/blackwinter/imapget
19
+ RubyGem:: https://rubygems.org/gems/imapget
21
20
 
22
21
 
23
22
  == AUTHORS
@@ -27,7 +26,7 @@ RubyGem:: http://rubygems.org/gems/imapget
27
26
 
28
27
  == LICENSE AND COPYRIGHT
29
28
 
30
- Copyright (C) 2009-2013 Jens Wille
29
+ Copyright (C) 2009-2014 Jens Wille
31
30
 
32
31
  imapget is free software: you can redistribute it and/or modify it under
33
32
  the terms of the GNU Affero General Public License as published by the Free
data/Rakefile CHANGED
@@ -4,15 +4,18 @@ begin
4
4
  require 'hen'
5
5
 
6
6
  Hen.lay! {{
7
- :gem => {
8
- :name => %q{imapget},
9
- :version => IMAPGet::VERSION,
10
- :summary => %q{Get IMAP mails.},
11
- :author => %q{Jens Wille},
12
- :email => %q{jens.wille@gmail.com},
13
- :license => %q{AGPL-3.0},
14
- :homepage => :blackwinter,
15
- :dependencies => %w[highline]
7
+ gem: {
8
+ name: %q{imapget},
9
+ version: IMAPGet::VERSION,
10
+ summary: %q{Get IMAP mails.},
11
+ description: %q{Download e-mails from IMAP server.},
12
+ author: %q{Jens Wille},
13
+ email: %q{jens.wille@gmail.com},
14
+ license: %q{AGPL-3.0},
15
+ homepage: :blackwinter,
16
+ dependencies: %w[highline] << ['ruby-nuggets', '>= 0.9.8'],
17
+
18
+ required_ruby_version: '>= 1.9.3'
16
19
  }
17
20
  }}
18
21
  rescue LoadError => err
data/bin/imapget CHANGED
@@ -5,7 +5,7 @@
5
5
  # #
6
6
  # imapget -- Download IMAP mails #
7
7
  # #
8
- # Copyright (C) 2009-2013 Jens Wille #
8
+ # Copyright (C) 2009-2014 Jens Wille #
9
9
  # #
10
10
  # Authors: #
11
11
  # Jens Wille <jens.wille@gmail.com> #
@@ -26,90 +26,5 @@
26
26
  ###############################################################################
27
27
  #++
28
28
 
29
- require 'optparse'
30
- require 'yaml'
31
-
32
- require 'rubygems'
33
- require 'highline/import'
34
-
35
- $: << File.join(File.dirname(__FILE__), '..', 'lib')
36
-
37
- require 'imapget'
38
-
39
- USAGE = "Usage: #{$0} [-h|--help] [options] [profile]..."
40
-
41
- options = {
42
- :config => 'config.yaml',
43
- :directory => nil,
44
- :check => false
45
- }
46
-
47
- OptionParser.new { |opts|
48
- opts.banner = USAGE
49
-
50
- opts.separator ''
51
- opts.separator 'Options:'
52
-
53
- opts.on('-c', '--config YAML', "Config file [Default: #{options[:config]}#{' (currently not present)' unless File.readable?(options[:config])}]") { |f|
54
- options[:config] = f
55
- }
56
-
57
- opts.separator ''
58
-
59
- opts.on('-d', '--directory PATH', "Target directory to store mails [Default: BASE_DIR/<profile>]") { |d|
60
- options[:directory] = d
61
- }
62
-
63
- opts.separator ''
64
-
65
- opts.on('-C', '--check', "Only check include/exclude statements") {
66
- options[:check] = true
67
- }
68
-
69
- opts.separator ''
70
- opts.separator 'Generic options:'
71
-
72
- opts.on('-h', '--help', 'Print this help message and exit') {
73
- abort opts.to_s
74
- }
75
-
76
- opts.on('--version', 'Print program version and exit') {
77
- abort "#{File.basename($0)} v#{IMAPGet::VERSION}"
78
- }
79
- }.parse!
80
-
81
- abort "Config file not found: #{options[:config]}\n#{USAGE}" unless File.readable?(options[:config])
82
-
83
- global_config = YAML.load_file(options[:config])
84
- default_config = global_config.reject { |k, _| k.is_a?(String) }
85
-
86
- profiles = ARGV.empty? ? global_config.keys.select { |k| k.is_a?(String) }.sort : ARGV
87
-
88
- profiles.each { |profile|
89
- unless config = global_config[profile]
90
- warn "Profile not found: #{profile}"
91
- next
92
- end
93
-
94
- config.update(default_config) { |key, old, new| old }
95
-
96
- next if config[:skip]
97
-
98
- unless host = config[:host]
99
- warn "No host for profile #{profile}"
100
- next
101
- end
102
-
103
- config[:user] ||= ask("User for #{profile} on #{host}: ")
104
- config[:password] ||= ask("Password for #{config[:user]}@#{host}: ") { |q| q.echo = false }
105
-
106
- imapget = IMAPGet.new(config)
107
-
108
- if options[:check]
109
- imapget.each { |mailbox|
110
- puts mailbox.name
111
- }
112
- else
113
- imapget.get(options[:directory] || File.join(config[:base_dir] || '.', profile))
114
- end
115
- }
29
+ require 'imapget/cli'
30
+ IMAPGet::CLI.execute
data/example/config.yaml CHANGED
@@ -8,10 +8,10 @@
8
8
 
9
9
  # Get all mailboxes (via SSL), *except* Spam and Trash.
10
10
  you-1:
11
- :host: imap.example.com
12
- :port: 123
13
- :use_ssl: true
14
- :user: login
11
+ :host: imap.example.com
12
+ :port: 123
13
+ :ssl: true
14
+ :user: login
15
15
  :exclude:
16
16
  - Spam
17
17
  - Trash
@@ -0,0 +1,125 @@
1
+ #--
2
+ ###############################################################################
3
+ # #
4
+ # imapget -- Download IMAP mails #
5
+ # #
6
+ # Copyright (C) 2009-2014 Jens Wille #
7
+ # #
8
+ # Authors: #
9
+ # Jens Wille <jens.wille@gmail.com> #
10
+ # #
11
+ # imapget is free software; you can redistribute it and/or modify it under #
12
+ # the terms of the GNU Affero General Public License as published by the Free #
13
+ # Software Foundation; either version 3 of the License, or (at your option) #
14
+ # any later version. #
15
+ # #
16
+ # imapget is distributed in the hope that it will be useful, but WITHOUT ANY #
17
+ # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
18
+ # FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
19
+ # more details. #
20
+ # #
21
+ # You should have received a copy of the GNU Affero General Public License #
22
+ # along with imapget. If not, see <http://www.gnu.org/licenses/>. #
23
+ # #
24
+ ###############################################################################
25
+ #++
26
+
27
+ require 'nuggets/cli'
28
+
29
+ require 'imapget'
30
+
31
+ class IMAPGet
32
+
33
+ class CLI < Nuggets::CLI
34
+
35
+ class << self
36
+
37
+ def defaults
38
+ super.merge(
39
+ config: 'config.yaml',
40
+ directory: nil,
41
+ check: false,
42
+ dupe: false,
43
+ uniq: false
44
+ )
45
+ end
46
+
47
+ end
48
+
49
+ def usage
50
+ "#{super} [profile]..."
51
+ end
52
+
53
+ def run(arguments)
54
+ profiles, default_config = config.partition { |k,| k.is_a?(String) }
55
+
56
+ (arguments.empty? ? profiles.map(&:first) : arguments).each { |profile|
57
+ next unless profile_config = profile_config(profiles.assoc(profile))
58
+
59
+ imapget = IMAPGet.new(profile_config)
60
+
61
+ if options[:check]
62
+ imapget.each { |mailbox| puts mailbox.name }
63
+ elsif options[:dupe]
64
+ imapget.each { |mailbox| imapget.dupes(mailbox.name) }
65
+ elsif options[:uniq]
66
+ imapget.each { |mailbox| imapget.uniq!(mailbox.name) {
67
+ next unless agree('Really delete duplicates? ')
68
+ } }
69
+ else
70
+ imapget.get(options[:directory] ||
71
+ File.join(profile_config[:base_dir] || '.', profile))
72
+ end
73
+ }
74
+ end
75
+
76
+ private
77
+
78
+ def merge_config(*)
79
+ end
80
+
81
+ def opts(opts)
82
+ opts.on('-d', '--directory PATH', "Path to directory to store mails in [Default: BASE_DIR/<profile>]") { |d|
83
+ options[:directory] = d
84
+ }
85
+
86
+ opts.separator ''
87
+
88
+ opts.on('-C', '--check', "Only check include/exclude statements; don't download any mails") {
89
+ options[:check] = true
90
+ }
91
+
92
+ opts.on('-D', '--dupes', "Only check for duplicate mails; don't download any mails") {
93
+ options[:dupe] = true
94
+ }
95
+
96
+ opts.on('-U', '--uniq', "Only delete duplicate mails; don't download any mails") {
97
+ options[:uniq] = true
98
+ }
99
+ end
100
+
101
+ def profile_config(profile, profiles, default_config)
102
+ unless config = profiles.assoc(profile)
103
+ "No such profile: #{profile}"
104
+ return
105
+ end
106
+
107
+ config = config.last
108
+ default_config.each { |key, value| config[key] ||= value }
109
+
110
+ return if config[:skip]
111
+
112
+ unless host = config[:host]
113
+ warn "No host for profile: #{profile}"
114
+ return
115
+ end
116
+
117
+ config[:user] ||= ask("User for #{profile} on #{host}: ")
118
+ config[:password] ||= askpass("Password for #{config[:user]}@#{host}: ")
119
+
120
+ config
121
+ end
122
+
123
+ end
124
+
125
+ end
@@ -3,14 +3,14 @@ class IMAPGet
3
3
  module Version
4
4
 
5
5
  MAJOR = 0
6
- MINOR = 0
7
- TINY = 8
6
+ MINOR = 1
7
+ TINY = 0
8
8
 
9
9
  class << self
10
10
 
11
11
  # Returns array representation.
12
12
  def to_a
13
- [MAJOR, MINOR, TINY]
13
+ [MAJOR, MINOR, TINY] << 'pre1'
14
14
  end
15
15
 
16
16
  # Short-cut for version string.
data/lib/imapget.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  # #
4
4
  # imapget -- Download IMAP mails #
5
5
  # #
6
- # Copyright (C) 2009-2013 Jens Wille #
6
+ # Copyright (C) 2009-2014 Jens Wille #
7
7
  # #
8
8
  # Authors: #
9
9
  # Jens Wille <jens.wille@gmail.com> #
@@ -27,165 +27,186 @@
27
27
  require 'time'
28
28
  require 'net/imap'
29
29
  require 'fileutils'
30
- require 'enumerator' unless [].respond_to?(:each_slice)
31
30
 
32
- require 'imapget/version'
31
+ require_relative 'imapget/version'
33
32
 
34
33
  class IMAPGet
35
34
 
36
35
  include Enumerable
37
36
 
38
- STRATEGIES = [:include, :exclude]
39
- DEFAULT_STRATEGY = :exclude
40
-
41
- DEFAULT_LEVEL = 2
42
- DEFAULT_DELIM = '/'
37
+ DEFAULT_BATCH_SIZE = 100
38
+ DEFAULT_STRATEGY = :exclude
39
+ DEFAULT_LOG_LEVEL = 2
40
+ DEFAULT_DELIMITER = '/'
43
41
 
44
42
  FETCH_ATTR = %w[FLAGS INTERNALDATE RFC822]
45
- FETCH_SIZE = 100
46
43
 
47
44
  attr_reader :imap, :strategy, :incl, :excl
48
- attr_accessor :log_level
45
+ attr_accessor :batch_size, :log_level
49
46
 
50
47
  def initialize(options)
51
- @log_level = options[:log_level] || DEFAULT_LEVEL
48
+ @batch_size = options.fetch(:batch_size, DEFAULT_BATCH_SIZE)
49
+ @log_level = options.fetch(:log_level, DEFAULT_LOG_LEVEL)
50
+
51
+ @imap = Net::IMAP.new(options[:host], options)
52
+ @imap.starttls(options[:starttls]) if options[:starttls]
52
53
 
53
- init_imap options
54
- authenticate options
55
- inclexcl options
54
+ authenticate(options)
55
+ inclexcl(options)
56
56
  end
57
57
 
58
58
  def inclexcl(options)
59
- inclexcl = {}
60
-
61
- delim = Regexp.escape(options[:delim] || DEFAULT_DELIM)
62
-
63
- STRATEGIES.each { |key|
64
- inclexcl[key] = case value = options[key]
65
- when String
66
- Regexp.new(value)
67
- when Array
68
- Regexp.new(value.map { |v|
69
- "\\A#{Regexp.escape(Net::IMAP.encode_utf7(v))}(?:#{delim}|\\z)"
70
- }.join('|'))
71
- end
59
+ delim = Regexp.escape(options.fetch(:delim, DEFAULT_DELIMITER))
60
+
61
+ %w[include exclude].each { |key|
62
+ instance_variable_set("@#{key[0, 4]}", case value = options[key.to_sym]
63
+ when String then Regexp.new(value)
64
+ when Array then Regexp.new(value.map { |v|
65
+ "\\A#{Regexp.escape(Net::IMAP.encode_utf7(v))}(?:#{delim}|\\z)"
66
+ }.join('|'))
67
+ end)
72
68
  }
73
69
 
74
- @incl, @excl = inclexcl.values_at(:include, :exclude)
75
- @strategy = options[:strategy] || DEFAULT_STRATEGY
70
+ @strategy = options.fetch(:strategy, DEFAULT_STRATEGY)
76
71
  end
77
72
 
78
73
  def mailboxes
79
- @mailboxes ||= imap.list('', '*')
74
+ @mailboxes ||= imap.list('', '*').sort
80
75
  end
81
76
 
82
77
  def each
83
- mailboxes.each { |mailbox|
84
- name = mailbox.name
85
-
86
- case strategy
87
- when :include
88
- next if (excl && name =~ excl) || !(incl && name =~ incl)
89
- when :exclude
90
- next if (excl && name =~ excl) && !(incl && name =~ incl)
91
- end
92
-
93
- yield mailbox if self.include?(mailbox)
94
- }
78
+ mailboxes.each { |mailbox| yield mailbox if include?(mailbox) }
95
79
  end
96
80
 
97
- def include?(mailbox_or_name)
98
- !exclude?(mailbox_or_name)
81
+ def include?(mailbox)
82
+ !exclude?(mailbox)
99
83
  end
100
84
 
101
- def exclude?(mailbox_or_name)
102
- name = case mailbox_or_name
103
- when Net::IMAP::MailboxList then mailbox_or_name.name
104
- when String then mailbox_or_name
105
- else
106
- raise TypeError, "MailboxList or String expected, got #{mailbox_or_name.class}"
85
+ def exclude?(mailbox)
86
+ name = case mailbox
87
+ when String then mailbox
88
+ when Net::IMAP::MailboxList then mailbox.name
89
+ else raise TypeError, "MailboxList or String expected, got #{mailbox.class}"
107
90
  end
108
91
 
109
92
  case strategy
110
- when :include
111
- (excl && name =~ excl) || !(incl && name =~ incl)
112
- when :exclude
113
- (excl && name =~ excl) && !(incl && name =~ incl)
93
+ when :include then (excl && name =~ excl) || !(incl && name =~ incl)
94
+ when :exclude then (excl && name =~ excl) && !(incl && name =~ incl)
114
95
  end
115
96
  end
116
97
 
117
- def get(path)
118
- each { |mailbox|
119
- name = mailbox.name
120
- dir = File.join(path, Net::IMAP.decode_utf7(name))
121
- update = check_dir(dir)
122
-
123
- log "#{'=' * 10} #{name} #{'=' * 10}"
124
- imap.examine(name)
125
-
126
- uids = imap.uid_search("SINCE #{update.strftime('%d-%b-%Y')}")
127
- next if uids.empty?
128
-
129
- fetch(uids) { |mail, uid, flags, date, body|
130
- file = File.join(dir, uid.to_s)
131
- exists = File.exists?(file)
132
- deleted = flags.include?(Net::IMAP::DELETED)
133
-
134
- if deleted
135
- if exists
136
- info "#{dir}: #{name} <- #{uid}"
137
- File.unlink(file)
138
- end
139
- else
140
- unless exists && date && File.mtime(file) >= date
141
- info "#{dir}: #{name} -> #{uid}"
142
- File.open(file, 'w') { |f| f.puts body }
143
- end
144
- end
98
+ def get(dir)
99
+ each { |mailbox| get_name(name = mailbox.name,
100
+ File.join(dir, Net::IMAP.decode_utf7(name))) }
101
+ end
102
+
103
+ alias_method :download, :get
104
+
105
+ def get_name(name, dir)
106
+ log "#{'=' * 10} #{name} #{'=' * 10}"
107
+
108
+ imap.examine(name)
109
+
110
+ imap.uid_search("SINCE #{mtime(dir)}").each_slice(batch_size) { |batch|
111
+ fetch_batch(batch) { |mail| fetch(mail, dir, name) }
112
+ }
113
+ end
114
+
115
+ alias_method :download_name, :get_name
116
+
117
+ def size(name, attr = 'MESSAGES')
118
+ imap.status(name, [attr]).values.first
119
+ end
120
+
121
+ def dupes(name, quiet = false)
122
+ imap.examine(name)
123
+
124
+ hash = Hash.new { |h, k| h[k] = [] }
125
+
126
+ 1.step(size(name), step = batch_size) { |i|
127
+ fetch_batch([[i, step]]) { |mail|
128
+ hash[mail.attr['RFC822']] << mail.attr['UID'] unless deleted?(mail)
145
129
  }
146
130
  }
131
+
132
+ dupes = hash.flat_map { |_, uids| uids.drop(1) if uids.size > 1 }.compact
133
+
134
+ log "#{name}: #{dupes.size}" unless quiet
135
+
136
+ dupes
147
137
  end
148
138
 
149
- alias_method :download, :get
139
+ def delete!(name, uids)
140
+ unless uids.empty?
141
+ log "#{name}: #{uids.size}"
150
142
 
151
- private
143
+ yield if block_given?
144
+
145
+ imap.select(name)
146
+ count = imap.store(uids, '+FLAGS', [Net::IMAP::DELETED]).size
152
147
 
153
- def init_imap(options)
154
- @imap = Net::IMAP.new(
155
- options[:host],
156
- options[:port] || Net::IMAP::PORT,
157
- options[:use_ssl],
158
- options[:certs],
159
- options[:verify]
160
- )
148
+ log "#{count} DELETED!"
149
+
150
+ count
151
+ end
161
152
  end
162
153
 
154
+ def uniq!(name)
155
+ delete!(name, dupes(name, true))
156
+ end
157
+
158
+ private
159
+
163
160
  def authenticate(options)
164
- imap.authenticate(
165
- imap.capability.include?('AUTH=CRAM-MD5') ? 'CRAM-MD5' : 'LOGIN',
166
- options[:user], options[:password]
167
- )
168
- end
169
-
170
- def fetch(uids, fetch_size = FETCH_SIZE, fetch_attr = FETCH_ATTR)
171
- uids.each_slice(fetch_size) { |slice|
172
- imap.uid_fetch(slice, fetch_attr).each { |mail|
173
- yield mail, *['UID', *fetch_attr].map { |a|
174
- v = mail.attr[a]
175
- v = Time.parse(v) if v && a == 'INTERNALDATE'
176
- v
177
- }
178
- }
161
+ if auth = options.fetch(:auth) {
162
+ imap.capability.grep(/\AAUTH=(.*)/) { $1 }.first
179
163
  }
164
+ imap.authenticate(auth, options[:user], options[:password])
165
+ else
166
+ imap.login(options[:user], options[:password])
167
+ end
168
+ end
169
+
170
+ def fetch_batch(batch, fetch_attr = FETCH_ATTR, &block)
171
+ if batch.size == 1
172
+ case set = batch.first
173
+ when Array
174
+ batch = set.first .. (set.first + set.last - 1)
175
+ when Range
176
+ batch = set.first .. (set.last - 1) if set.exclude_end?
177
+ end
178
+ end
179
+
180
+ imap.uid_fetch(batch, fetch_attr).each(&block)
180
181
  end
181
182
 
182
- def check_dir(dir)
183
- if File.directory?(dir)
184
- File.mtime(dir)
183
+ def fetch(mail, dir, name)
184
+ uid = mail.attr['UID'].to_s
185
+ file = File.join(dir, uid)
186
+ exists = File.exists?(file)
187
+
188
+ if deleted?(mail)
189
+ if exists
190
+ info "#{dir}: #{name} <- #{uid}"
191
+ File.unlink(file)
192
+ end
185
193
  else
186
- FileUtils.mkdir_p(dir)
187
- Time.at(0)
188
- end.utc
194
+ date = mail.attr['INTERNALDATE']
195
+
196
+ unless exists && date && File.mtime(file) >= Time.parse(date)
197
+ info "#{dir}: #{name} -> #{uid}"
198
+ File.write(file, mail.attr['RFC822'])
199
+ end
200
+ end
201
+ end
202
+
203
+ def deleted?(mail)
204
+ mail.attr['FLAGS'].include?(Net::IMAP::DELETED)
205
+ end
206
+
207
+ def mtime(dir)
208
+ Net::IMAP.format_date((File.directory?(dir) ?
209
+ File.mtime(dir) : (FileUtils.mkdir_p(dir); Time.at(0))).utc)
189
210
  end
190
211
 
191
212
  def log(msg, level = 1)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: imapget
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.1.0.pre1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jens Wille
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-19 00:00:00.000000000 Z
11
+ date: 2014-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -24,7 +24,49 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
- description: Get IMAP mails.
27
+ - !ruby/object:Gem::Dependency
28
+ name: ruby-nuggets
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.8
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.8
41
+ - !ruby/object:Gem::Dependency
42
+ name: hen
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Download e-mails from IMAP server.
28
70
  email: jens.wille@gmail.com
29
71
  executables:
30
72
  - imapget
@@ -34,22 +76,34 @@ extra_rdoc_files:
34
76
  - COPYING
35
77
  - ChangeLog
36
78
  files:
37
- - lib/imapget.rb
38
- - lib/imapget/version.rb
39
- - bin/imapget
40
79
  - COPYING
41
80
  - ChangeLog
42
81
  - README
43
82
  - Rakefile
83
+ - bin/imapget
44
84
  - example/config.yaml
85
+ - lib/imapget.rb
86
+ - lib/imapget/cli.rb
87
+ - lib/imapget/version.rb
45
88
  homepage: http://github.com/blackwinter/imapget
46
89
  licenses:
47
90
  - AGPL-3.0
48
91
  metadata: {}
49
- post_install_message:
92
+ post_install_message: |2+
93
+
94
+ imapget-0.1.0 [unreleased]:
95
+
96
+ * Added options <tt>--dupes</tt> and <tt>--uniq</tt>.
97
+ * Added STARTTLS support.
98
+ * Added LOGIN as fallback for AUTHENTICATE.
99
+ * Added +batch_size+ option.
100
+ * Dropped +use_ssl+ options; use +ssl+ instead.
101
+ * Dropped support for Ruby 1.8.
102
+ * Internal refactoring.
103
+
50
104
  rdoc_options:
51
105
  - "--title"
52
- - imapget Application documentation (v0.0.8)
106
+ - imapget Application documentation (v0.1.0.pre1)
53
107
  - "--charset"
54
108
  - UTF-8
55
109
  - "--line-numbers"
@@ -62,15 +116,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
62
116
  requirements:
63
117
  - - ">="
64
118
  - !ruby/object:Gem::Version
65
- version: '0'
119
+ version: 1.9.3
66
120
  required_rubygems_version: !ruby/object:Gem::Requirement
67
121
  requirements:
68
- - - ">="
122
+ - - ">"
69
123
  - !ruby/object:Gem::Version
70
- version: '0'
124
+ version: 1.3.1
71
125
  requirements: []
72
126
  rubyforge_project:
73
- rubygems_version: 2.1.11
127
+ rubygems_version: 2.2.2
74
128
  signing_key:
75
129
  specification_version: 4
76
130
  summary: Get IMAP mails.