rmbox 0.4

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.
Files changed (4) hide show
  1. data/README.md +56 -0
  2. data/lib/rmbox.rb +164 -0
  3. data/rmbox.gemspec +29 -0
  4. metadata +47 -0
data/README.md ADDED
@@ -0,0 +1,56 @@
1
+ #Ruby MailBox file management (rmbox)
2
+
3
+ Another library for manage a mailbox as object...
4
+
5
+ ##reading a mailbox
6
+
7
+ The new method create a new instance, classic:
8
+
9
+ require 'rmbox'
10
+ mbox=Mailbox.new '/var/mail/fulano'
11
+
12
+ If the mailbox do now exit, will be created. I suggest to write some email or you'll have an empty file :D
13
+
14
+ ##reading emails
15
+
16
+ Each mailbox has a mail number. Lets get the mail number 3 from the mailbox.
17
+
18
+ # return the amount of mails in the mailbox
19
+ mbox.mails
20
+ => 18
21
+
22
+ # get the mail number 3 as is in the mailbox
23
+ @myemail=mbox.get 3
24
+
25
+ If you mailbox change and you wanna reflect thats changes in you mailbox object, use the reread method:
26
+
27
+ # read the mailbox file again
28
+ mbox.reread
29
+
30
+ Ask a mail number bigger than existent mails will raise an exception. If your mailbox is not to big, you could use ".to_a" method for get an array with all the emails:
31
+
32
+ # get all the emails as an array
33
+ mbox.to_a
34
+
35
+ Then you can use, last and/or [-1] etc... but, be careful with big mailboxes and remember that you having a common array.
36
+
37
+ ##writing a mail to your mailbox
38
+
39
+ Write in the mailbox is append a mail to the mailbox.
40
+
41
+ # add a email to the Mailbox
42
+ mbox.append @myemail
43
+
44
+ # duplicate the first email
45
+ mbox.append(mbox.get 1)
46
+
47
+ Where @myemail is a rfc822 mail formated string. Mailbox will be "rereaded" after and before append any new mail. Remember use <b>.append</b> instead of write. Changes are updated (write) automatically.
48
+
49
+ ##deleting mails
50
+
51
+ Is very easy, just like any email client do it. Which mail number shall deleted?
52
+
53
+ # delete mail number 2
54
+ mbox.delete 2
55
+
56
+
data/lib/rmbox.rb ADDED
@@ -0,0 +1,164 @@
1
+ #!/usr/bin/env ruby
2
+ #encoding: utf-8
3
+
4
+ class Mailbox # handle mailbox files as object
5
+
6
+ # read or create a mailbox file
7
+ def initialize fichero=false
8
+
9
+ if fichero==false # if not mailbox was especified, not argument gived
10
+ raise ArgumentError, 'argument must be a valid absolute path file'
11
+ end
12
+
13
+ # we'll store ALL the mails here
14
+ # TERRIBLE ram usage if the mbox is a big file
15
+ @@correos={}
16
+
17
+ # take file's path
18
+ @@fichero=fichero
19
+
20
+ # file must exist an be readable or creations enabled
21
+ if File.exist?(fichero)
22
+
23
+ # can I read it?
24
+ if File.readable? fichero
25
+
26
+ # open and read the file
27
+ @@mbox=File.read fichero
28
+
29
+ unless @@mbox.length==0 # file must not empty
30
+
31
+ # must be a valid mailbox file
32
+ unless @@mbox.lines.to_a[0].downcase.start_with? 'from '
33
+ raise ArgumentError, 'argument must be a valid mailbox file'
34
+ end # unless
35
+
36
+ # split the file by the 'From ', first object is a "" skip it
37
+ @@mbox.lines.each do |li|
38
+
39
+ # take the 'From ' where split each mail at the mailbox file
40
+ @key=li if li.downcase.start_with? 'from ' and /from .* \d\d:\d\d:\d\d \d\d\d\d\n/===li.downcase
41
+
42
+ # fill the value with the email
43
+ unless @@correos.keys.include? @key
44
+ @@correos[@key]=''
45
+ else
46
+ @@correos[@key]+=li
47
+ end # unless
48
+
49
+ end # .each do
50
+
51
+ end # unless empty
52
+
53
+ else # some mailbox can be listed but not readed
54
+ raise ArgumentError, "Can't read the file #{fichero}. Permission?"
55
+
56
+ end # if File.readable?
57
+
58
+ else # try to write it
59
+
60
+ begin # create the file
61
+ File.write @@fichero,''
62
+
63
+ rescue # warn it if something get wrong
64
+ raise Exception, "can't write the file #{@@fichero}"
65
+
66
+ end # begin
67
+
68
+ end # if File.exist?
69
+
70
+ end # initialize
71
+
72
+ # return the number of email in the mbox
73
+ def mails
74
+ @@correos.values.length
75
+ end # mails
76
+
77
+ # read again the email
78
+ def reread
79
+ # reaload everything
80
+ # this is a very dirty operation
81
+ initialize @@fichero
82
+ end # reread
83
+
84
+
85
+ # return mail number num
86
+ def get num
87
+
88
+ if mails==0 # if has not mails, tell it
89
+ raise ArgumentError, 'Mailbox is empty'
90
+ elsif num.to_i==0 or num.to_i>mails
91
+ raise ArgumentError, "Give me a valid mail number from 1 to #{mails}"
92
+ end # if
93
+
94
+ # took the mail number "num" from mailbox
95
+ @@correos.values[num-1]
96
+
97
+ end # get
98
+
99
+ # return an array with all the mails
100
+ def to_a
101
+ return @@correos.values
102
+ end # to_a
103
+
104
+ # not move if file is not writable
105
+ def writable?
106
+ return true if File.writable?(@@fichero)
107
+ return false
108
+ end # writable?
109
+
110
+ # append a mail to the mailbox file
111
+ # argument must be RFC822 email as string
112
+ def append mail
113
+
114
+ raise Exception, "Fichero #{@@fichero} is not writable" unless writable?
115
+
116
+ # read again the email
117
+ reread
118
+
119
+ # generate a from based in the local user
120
+ @from=Time.now.strftime "From #{ENV['USER']} %a %b %d %T %Y\n"
121
+
122
+
123
+ # we'll append the email in the file
124
+ @fichero=File.open(@@fichero,'a')
125
+ @fichero.write @from+mail
126
+ @fichero.close
127
+
128
+ # read again the email
129
+ reread
130
+
131
+ end # append
132
+
133
+ # remove the mail number num from the mailbox
134
+ def delete num
135
+
136
+ # can't delete emails in a not writable mailbox file
137
+ raise Exception, "Fichero #{@@fichero} is not writable" unless writable?
138
+
139
+ reread # sync!
140
+
141
+ # can't parse a email out of range, and out or range is NOT the last email
142
+ if num.to_i==0 or num>mails
143
+ raise ArgumentError, "argument must be a valid mail's number from 1 to #{mails}"
144
+ end
145
+
146
+
147
+ # remove the email from the block
148
+ @@correos.delete(@@correos.keys[num-1])
149
+
150
+ # each From plus their mail
151
+ @mailbox=String.new
152
+ @@correos.each do|from,mail|
153
+ @mailbox<<from+mail
154
+ end # do
155
+
156
+ # write in to the disk
157
+ File.write @@fichero,@mailbox
158
+
159
+ # and again
160
+ reread
161
+
162
+ end # delete
163
+
164
+ end # class Mailbox
data/rmbox.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # autogeneramos la version a patitir de los commit de git
2
+ commit=File.read('.git/logs/HEAD').lines.to_a.length.to_s
3
+ if commit.length == 1
4
+ version="0.#{commit}"
5
+ else
6
+ version=commit[0..-2]+'.'+commit[-1]
7
+ end
8
+
9
+ # los ficheros que le pondremos al s.files
10
+ ficheros=[]
11
+ Dir.glob('*').each {|fi| ficheros << fi} unless Dir.glob('*')==[]
12
+ Dir.glob('*/*').each {|fi| ficheros << fi} unless Dir.glob('*/*')==[]
13
+
14
+
15
+
16
+ # podemos hacer un iterador que busca la ceadena 'description' en comentarios
17
+ # y la tome como descripcion, de esa misma form con el sumario
18
+
19
+ Gem::Specification.new do |s|
20
+ s.name = 'rmbox'
21
+ s.version = version
22
+ s.date = Time.now.to_s.split(' ')[0]
23
+ s.description = 'Manage Mailbox files using ruby'
24
+ s.summary = 'Manage Mailbox files using ruby'
25
+ s.authors = 'Lázaro Armando'
26
+ s.email = 'uranio-235@myopera.com'
27
+ s.files = ficheros.uniq
28
+ s.homepage = 'http://github.com/uranio-235/dev/rmbox'
29
+ end
metadata ADDED
@@ -0,0 +1,47 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rmbox
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.4'
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Lázaro Armando
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-09-16 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Manage Mailbox files using ruby
15
+ email: uranio-235@myopera.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - rmbox.gemspec
21
+ - README.md
22
+ - lib/rmbox.rb
23
+ homepage: http://github.com/uranio-235/dev/rmbox
24
+ licenses: []
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ required_rubygems_version: !ruby/object:Gem::Requirement
36
+ none: false
37
+ requirements:
38
+ - - ! '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubyforge_project:
43
+ rubygems_version: 1.8.23
44
+ signing_key:
45
+ specification_version: 3
46
+ summary: Manage Mailbox files using ruby
47
+ test_files: []