jmcarbo-imapstore 0.0.2

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.
@@ -0,0 +1,4 @@
1
+ == 0.0.1 2009-01-07
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
@@ -0,0 +1,15 @@
1
+ History.txt
2
+ Manifest.txt
3
+ PostInstall.txt
4
+ README.rdoc
5
+ Rakefile
6
+ bin/imapstore
7
+ lib/imapstore.rb
8
+ lib/imapstore/imapstore.rb
9
+ script/console
10
+ script/destroy
11
+ script/generate
12
+ spec/imapstore_spec.rb
13
+ spec/spec.opts
14
+ spec/spec_helper.rb
15
+ tasks/rspec.rake
@@ -0,0 +1,7 @@
1
+
2
+ For more information on imapstore, see http://imapstore.rubyforge.org
3
+
4
+ NOTE: Change this information in PostInstall.txt
5
+ You can also delete it if you don't want it.
6
+
7
+
@@ -0,0 +1,74 @@
1
+ = imapstore
2
+
3
+ * http://wiki.github.com/jmcarbo/imapstore
4
+
5
+ == DESCRIPTION:
6
+
7
+ ruby gem to use an imap server as a file storage device
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * many
12
+
13
+ == SYNOPSIS:
14
+
15
+ Usage: imapstore -c <ls, rm, put, get, rmdir, mkdir, quota, setup> -s <subject> -d <folder> -f <file list or glob>
16
+ imapstore -h
17
+
18
+ == REQUIREMENTS:
19
+
20
+ * IMAP account
21
+ * config file. Currently only supports this location: ~/.imapstore/config.yml
22
+ * config file sample:
23
+
24
+ email: account@gmail.com
25
+ password: password
26
+ store_tag: IMAPSTORE
27
+ imap_server: imap.gmail.com
28
+ imap_port: 993
29
+
30
+ store_tag is the tag used in the message subject to distinguish imapstore created messages from any other messages in the
31
+ store.
32
+
33
+ == INSTALL:
34
+
35
+ # add githum gem repository if you haven't done so
36
+
37
+ gem sources -a http://gems.github.com
38
+
39
+ #install gem
40
+
41
+ sudo gem install imapstore
42
+
43
+ # Create sample config at ~/.imapstore/config.yml
44
+
45
+ imapstore -c setup
46
+
47
+ # Get help
48
+
49
+ imapstore -h
50
+
51
+ == LICENSE:
52
+
53
+ (The MIT License)
54
+
55
+ Copyright (c) 2009 Joan Marc Carbo Arnau
56
+
57
+ Permission is hereby granted, free of charge, to any person obtaining
58
+ a copy of this software and associated documentation files (the
59
+ 'Software'), to deal in the Software without restriction, including
60
+ without limitation the rights to use, copy, modify, merge, publish,
61
+ distribute, sublicense, and/or sell copies of the Software, and to
62
+ permit persons to whom the Software is furnished to do so, subject to
63
+ the following conditions:
64
+
65
+ The above copyright notice and this permission notice shall be
66
+ included in all copies or substantial portions of the Software.
67
+
68
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
69
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
70
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
71
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
72
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
73
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
74
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ %w[rubygems rake rake/clean fileutils newgem rubigen].each { |f| require f }
2
+ require File.dirname(__FILE__) + '/lib/imapstore'
3
+
4
+ # Generate all the Rake tasks
5
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
6
+ $hoe = Hoe.new('imapstore', IMAPSTORE::VERSION) do |p|
7
+ p.developer('Joan Marc Carbo Arnau', 'jmcarbo@gmail.com')
8
+ p.changes = p.paragraphs_of("History.txt", 0..1).join("\n\n")
9
+ #p.post_install_message = 'PostInstall.txt' # TODO remove if post-install message not required
10
+ p.rubyforge_name = p.name # TODO this is default value
11
+ p.extra_deps = [
12
+ ['tmail','>= 1.2.3'],
13
+ ['getoptions','>= 0.1']
14
+ ]
15
+ p.extra_dev_deps = [
16
+ ['newgem', ">= #{::Newgem::VERSION}"]
17
+ ]
18
+
19
+ p.clean_globs |= %w[**/.DS_Store tmp *.log]
20
+ path = (p.rubyforge_name == p.name) ? p.rubyforge_name : "\#{p.rubyforge_name}/\#{p.name}"
21
+ p.remote_rdoc_dir = File.join(path.gsub(/^#{p.rubyforge_name}\/?/,''), 'rdoc')
22
+ p.rsync_args = '-av --delete --ignore-errors'
23
+ end
24
+
25
+ require 'newgem/tasks' # load /tasks/*.rake
26
+ Dir['tasks/**/*.rake'].each { |t| load t }
27
+
28
+ # TODO - want other tests/tasks run by default? Add them to the list
29
+ # task :default => [:spec, :features]
@@ -0,0 +1,85 @@
1
+ #! /usr/bin/ruby
2
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../lib"))
3
+
4
+ require 'rubygems'
5
+ require 'imapstore'
6
+ require 'getoptions'
7
+
8
+ COMMAND_LIST = ['ls', 'rm', 'put', 'get', 'rmdir', 'mkdir', 'quota', 'setup' ]
9
+ opt = GetOptions.new(%w(help subject=s command=s dir=s files=@s recursive! versioned! ))
10
+
11
+ if opt['help']
12
+ puts "Usage: imapstore -c <#{COMMAND_LIST.join(', ')}> -s <subject> -d <folder> -f <file list or glob> "
13
+ puts " imapstore -h"
14
+ exit 0
15
+ end
16
+
17
+
18
+ command = opt['command'] || "ls"
19
+ dir = opt['dir'] || "INBOX"
20
+ files = opt['files'] || "*"
21
+ subject = opt['subject'] || ""
22
+ recursive = opt['recursive'] || false
23
+ versioned = opt['versioned']
24
+
25
+ begin
26
+ if COMMAND_LIST.include? command
27
+ if command == 'setup'
28
+ IMAPSTORE::Imapstore.create_config_file
29
+ exit
30
+ end
31
+ i = IMAPSTORE::Imapstore.new
32
+ i.versioned=versioned if versioned!=nil
33
+
34
+ case command
35
+ when 'ls':
36
+ files.each do |f|
37
+ f = /.+/ if f == '*'
38
+
39
+ i.ls(dir, Regexp.new(f)).each do |a|
40
+ puts a
41
+ end
42
+ end
43
+ when 'put':
44
+ files.each do |f|
45
+ Dir.glob(f) do |f2|
46
+ if(!File.directory? f2)
47
+ puts "Storing file #{f2}"
48
+ i.store_file(f2,dir,subject)
49
+ end
50
+ end
51
+ end
52
+ when 'get':
53
+ files.each do |f|
54
+ f = /.+/ if f == '*'
55
+ puts "Getting files"
56
+ i.get_file(dir, Regexp.new(f)).each do |a|
57
+ puts a
58
+ end
59
+ end
60
+ when 'rm':
61
+ files.each do |f|
62
+ f = /.+/ if f == '*'
63
+ puts "Deleting files"
64
+ i.rm_file(dir, Regexp.new(f)).each do |a|
65
+ puts a
66
+ end
67
+ end
68
+ when 'mkdir':
69
+ i.mkdir(dir)
70
+ when 'rmdir':
71
+ i.rmdir(dir)
72
+ when 'quota':
73
+ q = i.quota("INBOX")
74
+ puts "Used #{q[1]['usage'].to_s} of #{q[1]['quota'].to_s}"
75
+ else
76
+ puts "unimplemented command #{command}"
77
+ end
78
+
79
+
80
+
81
+ i.disconnect
82
+ end
83
+ rescue
84
+ puts "An error has occured #{$!}"
85
+ end
@@ -0,0 +1,9 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ require 'imapstore/imapstore.rb'
5
+
6
+ module IMAPSTORE
7
+ VERSION = '0.0.1'
8
+
9
+ end
@@ -0,0 +1,255 @@
1
+ require 'net/imap'
2
+ require 'rubygems'
3
+ require 'tmail'
4
+ require 'pp'
5
+ require 'base64'
6
+ require 'cgi'
7
+
8
+
9
+ module IMAPSTORE
10
+ class Imapstore
11
+ MAX_FILE_SIZE=20000000
12
+ CHUNK_SIZE=10000000
13
+
14
+ CONFIG_TEMPLATE = <<-END
15
+ email: account@gmail.com
16
+ password: password
17
+ store_tag: IMAPSTORE
18
+ imap_server: imap.gmail.com
19
+ imap_port: 993
20
+ END
21
+
22
+ def self.create_config_file(file = File.expand_path('~/.imapstore/config.yml'))
23
+ if !File.exists?(file)
24
+ puts "creating #{File.dirname(file)}"
25
+ FileUtils.mkdir_p(File.dirname(file))
26
+ File.open(file,"w").write(CONFIG_TEMPLATE)
27
+ end
28
+ end
29
+
30
+ def initialize
31
+ @versioned = true
32
+ get_config
33
+ connect
34
+ end
35
+
36
+ def versioned
37
+ @versioned
38
+ end
39
+
40
+ def versioned=(is_versioned)
41
+ @versioned = is_versioned
42
+ end
43
+
44
+ def email
45
+ @email
46
+ end
47
+
48
+ def password
49
+ @password
50
+ end
51
+
52
+ def store_tag
53
+ @store_tag
54
+ end
55
+
56
+ def imap_server
57
+ @imap_server
58
+ end
59
+
60
+ def imap_port
61
+ @imap_port
62
+ end
63
+
64
+ def connect()
65
+ if !@imap && @email && @password && @imap_server && @imap_port
66
+ @imap = Net::IMAP.new(@imap_server, @imap_port, true)
67
+ @imap.login(@email, @password)
68
+ end
69
+ end
70
+
71
+ def disconnect()
72
+ if @imap
73
+ @imap.logout()
74
+ begin
75
+ @imap.disconnect()
76
+ rescue
77
+ end
78
+ end
79
+ end
80
+
81
+ def get_config(file = File.expand_path('~/.imapstore/config.yml'))
82
+ if !File.exists?(file)
83
+ File.open(file,"w").write(CONFIG_TEMPLATE)
84
+ end
85
+ aConfig = YAML::load_file(file)
86
+
87
+ #COFIGURATION SECTION
88
+ @email = aConfig['email']
89
+ @password = aConfig['password']
90
+ @store_tag = aConfig['store_tag'] || "IMAPSTORE"
91
+ @imap_server = aConfig['imap_server']
92
+ @imap_port = aConfig['imap_port']
93
+ #END CONFIGURATION SECTION
94
+ end
95
+
96
+ def store_file_chunk( file, folder = "INBOX", subject = "", chunk=nil, chunk_no=0, max_chunk_no=0 )
97
+ if(max_chunk_no>0)
98
+ puts "Storing part #{chunk_no} of #{max_chunk_no}"
99
+ end
100
+ basename = File.basename(file)
101
+ version = 0
102
+
103
+ if max_chunk_no == 0
104
+ tag = "#{@store_tag}[#{basename}]"
105
+ else
106
+ tag = "#{@store_tag}[#{basename}](#{chunk_no}-#{max_chunk_no})"
107
+ end
108
+ @imap.select(folder)
109
+ @imap.search(["SUBJECT", tag, "NOT", "DELETED"]).each do |message_id|
110
+ if @versioned==true
111
+ version = version + 1
112
+ else
113
+ @imap.store(message_id, "+FLAGS", [:Deleted])
114
+ end
115
+ end
116
+ @imap.expunge
117
+
118
+ mail = TMail::Mail.new
119
+ mail.to = @email
120
+ mail.from = @email
121
+ if max_chunk_no == 0
122
+ mail.subject = "#{@store_tag}[#{basename}]"
123
+ else
124
+ mail.subject = "#{@store_tag}[#{basename}](#{chunk_no}-#{max_chunk_no})"
125
+ end
126
+
127
+ if version > 0
128
+ mail.subject = mail.subject + "(v. #{version})"
129
+ end
130
+
131
+ if subject
132
+ mail.subject = mail.subject + ": #{subject}"
133
+ end
134
+
135
+ mail.date = Time.now
136
+ mail.mime_version = '1.0'
137
+
138
+ mailpart1=TMail::Mail.new
139
+ mailpart1.set_content_type 'text', 'plain'
140
+ mailpart1.body = "This is a mail storage message of file #{file}"
141
+ mail.parts << mailpart1
142
+ mail.set_content_type 'multipart', 'mixed'
143
+
144
+ if FileTest.exists?(file)
145
+ mailpart=TMail::Mail.new
146
+ mailpart.body = Base64.encode64(chunk.to_s)
147
+ mailpart.transfer_encoding="Base64"
148
+ if max_chunk_no == 0
149
+ mailpart['Content-Disposition'] = "attachment; filename=#{CGI::escape(basename)}"
150
+ else
151
+ mailpart['Content-Disposition'] = "attachment; filename=#{CGI::escape(basename)}_#{chunk_no}-#{max_chunk_no}"
152
+ end
153
+ mail.parts.push(mailpart)
154
+ end
155
+
156
+
157
+ @imap.append(folder, mail.to_s, [:Seen], File.new(file).atime)
158
+
159
+ end
160
+
161
+ def store_file( file, folder = "INBOX", subject = "")
162
+
163
+ @imap.create(folder) if !@imap.list("", folder)
164
+
165
+ size = File.size(file)
166
+ if(size > MAX_FILE_SIZE)
167
+ remaining = size
168
+ max_chunk_no = (size/CHUNK_SIZE)+1
169
+ chunk_no = 1
170
+ File.open(file) do |f|
171
+ while(remaining>0)
172
+ content = f.read(CHUNK_SIZE)
173
+ store_file_chunk( file, folder, subject, content, chunk_no, max_chunk_no)
174
+ chunk_no = chunk_no +1
175
+ remaining = remaining - CHUNK_SIZE
176
+ end
177
+ end
178
+ else
179
+ content=File.open(file).read
180
+ store_file_chunk( file, folder, subject, content)
181
+ end
182
+ end
183
+
184
+ def ls(folder = "INBOX", glob = /.+/)
185
+ if folder == "/"
186
+ return @imap.list("","*").map { |d| d.name }.sort
187
+ end
188
+
189
+ file_list = []
190
+ @imap.select(folder)
191
+ @imap.search(["NOT", "DELETED"]).each do |message_id|
192
+ a = @imap.fetch(message_id, "RFC822")
193
+ mail = TMail::Mail.parse(a[0].attr["RFC822"])
194
+ file_name = mail.subject.match(/^[^\[]+\[([^\]]+)\]/)[1]
195
+ file_list << file_name if file_name.match(glob)
196
+ end
197
+ file_list
198
+ end
199
+
200
+ def get_file(folder = "INBOX", glob = /.+/)
201
+ file_list = []
202
+ @imap.select(folder)
203
+ @imap.search(["NOT", "DELETED"]).each do |message_id|
204
+ a = @imap.fetch(message_id, "RFC822")
205
+ mail = TMail::Mail.parse(a[0].attr["RFC822"])
206
+ file_name = mail.subject.match(/^[^\[]+\[([^\]]+)\]/)[1]
207
+ if file_name.match(glob)
208
+ if mail.multipart? then
209
+ mail.parts.each do |m|
210
+ if !m.main_type
211
+ File.open(file_name,"w").write(m.body)
212
+ end
213
+ end
214
+ end
215
+
216
+ file_list << file_name
217
+ end
218
+ end
219
+ file_list
220
+ end
221
+
222
+
223
+
224
+ def rm_file(folder = "INBOX", glob = /.+/)
225
+ file_list = []
226
+
227
+ @imap.select(folder)
228
+ @imap.search(["NOT", "DELETED"]).each do |message_id|
229
+ a = @imap.fetch(message_id, "RFC822")
230
+ mail = TMail::Mail.parse(a[0].attr["RFC822"])
231
+ file_name = mail.subject.match(/^[^\[]+\[([^\]]+)\]/)[1]
232
+ if glob && file_name.match(glob)
233
+ @imap.store(message_id, "+FLAGS", [:Deleted])
234
+ file_list << file_name
235
+ end
236
+ end
237
+ @imap.expunge
238
+
239
+ file_list
240
+ end
241
+
242
+ def mkdir(folder)
243
+ @imap.create(folder)
244
+ end
245
+
246
+ def rmdir(folder)
247
+ rm_file(folder)
248
+ @imap.delete(folder)
249
+ end
250
+
251
+ def quota(folder)
252
+ @imap.getquotaroot(folder)
253
+ end
254
+ end
255
+ end
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/imapstore.rb'}"
9
+ puts "Loading imapstore gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,72 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ # Time to add your specs!
4
+ # http://rspec.info/
5
+ describe "Configuration" do
6
+ it "Should read configuration" do
7
+ i = IMAPSTORE::Imapstore.new
8
+
9
+ i.email.should eql( 'account@gmail.com')
10
+ i.password.should eql('password')
11
+ i.store_tag.should eql('IMAPSTORE')
12
+ i.imap_server.should eql('imap.gmail.com')
13
+ i.imap_port.should eql(993)
14
+ end
15
+ end
16
+
17
+ describe "Connection" do
18
+
19
+ it "Should connect and disconnect properly" do
20
+ i = IMAPSTORE::Imapstore.new
21
+
22
+ i.disconnect
23
+ end
24
+
25
+
26
+ end
27
+
28
+ describe "Store file" do
29
+
30
+ it "Should store a file" do
31
+ i = IMAPSTORE::Imapstore.new
32
+ i.store_file(File.expand_path(File.dirname(__FILE__) + "/../lib/imapstore.rb"),"ttt","Test file")
33
+ i.rm_file("ttt")
34
+ i.disconnect
35
+ end
36
+ end
37
+
38
+ describe "List folder" do
39
+ it "Sholuld list a folder" do
40
+ i = IMAPSTORE::Imapstore.new
41
+ i.store_file(File.expand_path(File.dirname(__FILE__) + "/../lib/imapstore.rb"),"ttt","Test file")
42
+ i.ls("ttt").should eql(["imapstore.rb"])
43
+ i.rm_file("ttt")
44
+ i.disconnect
45
+ end
46
+ end
47
+
48
+ describe "rm_file" do
49
+ it "Sholuld remove a file" do
50
+ i = IMAPSTORE::Imapstore.new
51
+ i.store_file(File.expand_path(File.dirname(__FILE__) + "/../lib/imapstore.rb"),"ttt","Test file")
52
+ i.rm_file("ttt")
53
+ i.ls("ttt").should eql([])
54
+ i.disconnect
55
+ end
56
+ end
57
+
58
+ describe "mkdir" do
59
+ it "should be able to create a valid folder" do
60
+ i = IMAPSTORE::Imapstore.new
61
+ i.mkdir('blablabla')
62
+
63
+ end
64
+ end
65
+
66
+ describe "rmdir" do
67
+ it "should be able to delete an existing folder" do
68
+ i = IMAPSTORE::Imapstore.new
69
+ i.mkdir('blablabla2')
70
+ i.rmdir('blablabla2')
71
+ end
72
+ end
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,10 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ gem 'rspec'
6
+ require 'spec'
7
+ end
8
+
9
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
10
+ require 'imapstore'
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec/models"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "spec/spec.opts"]
20
+ t.spec_files = FileList['spec/**/*_spec.rb']
21
+ end
metadata ADDED
@@ -0,0 +1,107 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jmcarbo-imapstore
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Joan Marc Carbo Arnau
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-01-08 00:00:00 -08:00
13
+ default_executable: imapstore
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: tmail
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.2.3
23
+ version:
24
+ - !ruby/object:Gem::Dependency
25
+ name: getoptions
26
+ version_requirement:
27
+ version_requirements: !ruby/object:Gem::Requirement
28
+ requirements:
29
+ - - ">="
30
+ - !ruby/object:Gem::Version
31
+ version: "0.1"
32
+ version:
33
+ - !ruby/object:Gem::Dependency
34
+ name: newgem
35
+ version_requirement:
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 1.1.0
41
+ version:
42
+ - !ruby/object:Gem::Dependency
43
+ name: hoe
44
+ version_requirement:
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: 1.8.0
50
+ version:
51
+ description: ruby gem to use an imap server as a file storage device
52
+ email:
53
+ - jmcarbo@gmail.com
54
+ executables:
55
+ - imapstore
56
+ extensions: []
57
+
58
+ extra_rdoc_files:
59
+ - History.txt
60
+ - Manifest.txt
61
+ - PostInstall.txt
62
+ - README.rdoc
63
+ files:
64
+ - History.txt
65
+ - Manifest.txt
66
+ - PostInstall.txt
67
+ - README.rdoc
68
+ - Rakefile
69
+ - bin/imapstore
70
+ - lib/imapstore.rb
71
+ - lib/imapstore/imapstore.rb
72
+ - script/console
73
+ - script/destroy
74
+ - script/generate
75
+ - spec/imapstore_spec.rb
76
+ - spec/spec.opts
77
+ - spec/spec_helper.rb
78
+ - tasks/rspec.rake
79
+ has_rdoc: true
80
+ homepage: http://wiki.github.com/jmcarbo/imapstore
81
+ post_install_message:
82
+ rdoc_options:
83
+ - --main
84
+ - README.rdoc
85
+ require_paths:
86
+ - lib
87
+ required_ruby_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
90
+ - !ruby/object:Gem::Version
91
+ version: "0"
92
+ version:
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: "0"
98
+ version:
99
+ requirements: []
100
+
101
+ rubyforge_project: imapstore
102
+ rubygems_version: 1.2.0
103
+ signing_key:
104
+ specification_version: 2
105
+ summary: ruby gem to use an imap server as a file storage device
106
+ test_files: []
107
+