omah 0.9.1 → 0.9.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (6) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/lib/omah.rb +88 -84
  4. data.tar.gz.sig +0 -0
  5. metadata +33 -29
  6. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5775bda4b445e69339cecb256cb6535d64a2c82e00102a56020a45d3c4baad59
4
- data.tar.gz: 426d302bd522404ed6fadcd9fedede85037e02d490198f2059c3174b657993e0
3
+ metadata.gz: 5f76c05ecaceb71b58cfb8f74a84108474fa51a887fdb85ec63af7a5f18e986b
4
+ data.tar.gz: 16145d2ccae4990dba144b1ffa27d193bc21287b5ebc0fa79f7d67cae36d628a
5
5
  SHA512:
6
- metadata.gz: d3d9080cb5c4f92bbbd1990b1a65b25efc3a87a89847aa5c64809cbb943ec17995080793140873b4b5537f9ab118a6021627b1d114829de1e736f96390a81c1d
7
- data.tar.gz: 86e1c0f6c3e8271d3cdc8ec26b665f5f91ab8b30478d3c8b8e2ff90765d56d524106cfb3d250fca01374c8c9b553deeaa8afcfc2c5c608b235049ab1d39f6f11
6
+ metadata.gz: 2a8cb70d398453b9301dcd6456151cb84a77ba49fdfe57af29bef6f608365ca6e2571072768866c0147772fd506c7fa28503ae695756e53c3d853e697e9d400d
7
+ data.tar.gz: fbd391990d5d32668981da65d0a4d365e830d7438c4c48ec85a102b47997085e059157a750f657b4449a8a599a9718b9558c4f311150ccf3ca7f75d15e54c733
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/omah.rb CHANGED
@@ -6,13 +6,14 @@
6
6
  require 'nokorexi'
7
7
  require 'dynarex-daily'
8
8
  require 'novowels'
9
+ require 'rxfreadwrite'
9
10
 
10
11
  module Library
11
12
 
12
13
  def fetch_file(filename)
13
14
 
14
15
  lib = File.dirname(__FILE__)
15
- File.read File.join(lib,'..','stylesheet',filename)
16
+ File.read filename
16
17
 
17
18
  end
18
19
  end
@@ -20,15 +21,15 @@ end
20
21
  class Omah
21
22
 
22
23
  include Library
23
- include RXFHelperModule
24
-
24
+ include RXFReadWriteModule
25
+
25
26
  def initialize(user: 'user', filepath: '.', \
26
- options: {xslt: 'listing.xsl', url_base: 'http://localhost/' },
27
+ options: {xslt: 'listing.xsl', url_base: 'http://localhost/' },
27
28
  plugins: [], webpath: '/email', debug: false)
28
29
 
29
-
30
+
30
31
  puts 'inside Omah::initialize' if @debug
31
-
32
+
32
33
  @user = user
33
34
  @xslt = options[:xslt]
34
35
  @css = options[:css]
@@ -40,86 +41,87 @@ class Omah
40
41
  @debug = debug
41
42
 
42
43
  puts 'Omah::initialize filepath: ' + filepath.inspect if @debug
43
-
44
+
44
45
  FileX.chdir filepath
45
46
 
46
47
  puts 'Omah::initialize making directory ' + @filepath_user if @debug
47
- FileX.mkdir_p @filepath_user
48
+ FileX.mkdir_p @filepath_user
48
49
 
49
50
  FileX.chdir @filepath_user
50
-
51
+
51
52
  dailyfile = File.join(@filepath_user, 'dynarexdaily.xml')
52
-
53
+
53
54
  x = if FileX.exists? dailyfile then dailyfile
54
55
 
55
56
  else
56
-
57
+
57
58
  'messages[date, prev_date, next_date]/message(msg_id, tags, from, ' + \
58
59
  'to, subject, date, txt_filepath, html_filepath, attachment1, ' + \
59
- 'attachment2, attachment3, attachments)'
60
+ 'attachment2, attachment3, attachments)'
60
61
 
61
62
  end
62
63
 
63
64
  puts 'Omah::initialize before DynarexDaily' if @debug
64
- @dd = DynarexDaily.new x, dir_archive: :yearly, debug: @debug
65
+ @dd = DynarexDaily.new x, dir_archive: :yearly, debug: @debug
65
66
  puts 'Omah::initialize after DynarexDaily' if @debug
66
67
  # is it a new day?
67
-
68
+
68
69
  if @dd.records.empty? then
69
-
70
- date_yesterday = File.join(@filepath_user,
70
+
71
+ date_yesterday = File.join(@filepath_user,
71
72
  (Date.today - 1).strftime("%Y/%b/%d").downcase)
72
-
73
- @dd.prev_date = File.join(@webpath_user, date_yesterday)
74
-
73
+
74
+ @dd.prev_date = File.join(@webpath_user,
75
+ (Date.today - 1).strftime("%Y/%b/%d").downcase)
76
+
75
77
  # add the next_day field value to the previous day file
76
-
78
+
77
79
  file_yesterday = date_yesterday + '/index.xml'
78
80
 
79
81
  if FileX.exists? file_yesterday then
80
-
82
+
81
83
  dx_yesterday = Dynarex.new file_yesterday
82
- dx_yesterday.next_date = File.join(@webpath_user,
84
+ dx_yesterday.next_date = File.join(@webpath_user,
83
85
  (Date.today).strftime("%Y/%b/%d").downcase)
84
86
  dx_yesterday.xslt = options[:archive_xsl] if options[:archive_xsl]
85
87
  dx_yesterday.save
86
88
  end
87
-
89
+
88
90
  end
89
-
91
+
90
92
  # intialize plugins
91
-
93
+
92
94
  puts 'Omah::initialize before plugins' if @debug
93
-
95
+
94
96
  @plugins = plugins.inject([]) do |r, plugin|
95
-
97
+
96
98
  name, settings = plugin
97
-
99
+
98
100
  puts 'Omah::initialize plugin: ' + name.inspect if @debug
99
-
101
+
100
102
  return r if settings[:active] == false and !settings[:active]
101
-
103
+
102
104
  klass_name = 'OmahPlugin' + name.to_s.split(/[-_]/)\
103
105
  .map{|x| x.capitalize}.join
104
106
 
105
- r << Kernel.const_get(klass_name).new(settings: settings,
107
+ r << Kernel.const_get(klass_name).new(settings: settings,
106
108
  variables: @variables, debug: @debug)
107
109
 
108
- end
110
+ end
109
111
 
110
112
  end
111
113
 
112
114
  def store(messages)
113
115
 
114
116
  messages.each.with_index do |x,i|
115
-
117
+
116
118
  email, msg = x
117
-
119
+
118
120
  begin
119
-
121
+
120
122
  puts "i: %d msg: %s" % [i, msg] if @debug
121
123
  subject = msg[:subject] || ''
122
-
124
+
123
125
  title = subject.gsub(/\W+/,'-')[0,30].sub(/^-/,'').sub(/-$/,'')
124
126
 
125
127
  a = @dd.all.select {|x| x.subject == subject}
@@ -134,7 +136,7 @@ class Omah
134
136
 
135
137
  path = archive()
136
138
 
137
- x_filepath = File.join(path, x_file)
139
+ x_filepath = File.join(path, x_file)
138
140
 
139
141
  puts 'FileX.pwd ' + FileX.pwd if @debug
140
142
  puts 'Omah::store before mkdir_p path: ' + path.inspect if @debug
@@ -146,8 +148,9 @@ class Omah
146
148
  end
147
149
 
148
150
  header = %i(from to subject).inject({}) {|r,x| r.merge(x => msg[x]) }
149
- Kvx.new(header).save File.join(@filepath_user, x_filepath + '.kvx')
150
-
151
+ filepath = File.join(@filepath_user, x_filepath + '.kvx')
152
+ Kvx.new(header, debug: false).save filepath
153
+
151
154
  txt_filepath = x_filepath + '.txt'
152
155
  FileX.write File.join(@filepath_user, txt_filepath), \
153
156
  text_sanitiser(msg[:body_text].to_s)
@@ -155,17 +158,20 @@ class Omah
155
158
  html_filepath = x_filepath + '.html'
156
159
  FileX.write File.join(@filepath_user, html_filepath), \
157
160
  html_sanitiser(msg[:body_html].to_s)
158
-
161
+
159
162
  parts_path = []
160
-
163
+
164
+ h = msg.merge(txt_filepath: txt_filepath, \
165
+ html_filepath: html_filepath)
166
+
161
167
  # save the attachments
162
168
  if msg[:attachments].length > 0 then
163
-
169
+
164
170
  attachment_path = File.join(path, title + ordinal)
165
171
  FileX.mkdir_p attachment_path
166
-
172
+
167
173
  msg[:attachments][0..2].each.with_index do |x, i|
168
-
174
+
169
175
  name, buffer = x
170
176
  parts_path[i] = File.join(attachment_path, name.gsub('/',''))
171
177
  begin
@@ -173,29 +179,27 @@ class Omah
173
179
  rescue
174
180
  puts ($!)
175
181
  end
176
-
177
- end
178
-
182
+
183
+ end
184
+
179
185
  h[:attachments] = msg[:attachments].map(&:first)
180
186
 
181
187
  end
182
-
188
+
183
189
  msg.delete :attachments
184
190
 
185
- h = msg.merge(txt_filepath: txt_filepath, \
186
- html_filepath: html_filepath)
187
191
  parts_path.each.with_index do |path, i|
188
192
  h.merge!("attachment#{i+1}" => @webpath_user + '/' + path)
189
193
  end
190
-
194
+
191
195
  if parts_path.any? then
192
-
196
+
193
197
  attachments = parts_path.map do |path|
194
- "<li><a href='%s'>%s</a></li>" % [@webpath_user + '/' + path,
198
+ "<li><a href='%s'>%s</a></li>" % [@webpath_user + '/' + path,
195
199
  File.basename(path)]
196
200
  end
197
-
198
-
201
+
202
+
199
203
  html_page= %Q(
200
204
  <html>
201
205
  <head>
@@ -204,7 +208,7 @@ html_page= %Q(
204
208
  <style></style>
205
209
  </head>
206
210
  <body>
207
- <iframe src='../#{File.basename(html_filepath)}'></iframe>
211
+ <iframe src='../#{File.basename(html_filepath)}'></iframe>
208
212
  <h2>attachments</h2>
209
213
  <ul>
210
214
  #{attachments.join("\n")}
@@ -220,70 +224,70 @@ html_page= %Q(
220
224
  h[:link] = File.join(@url_base, @webpath_user, html_filepath)
221
225
 
222
226
  @plugins.each {|x| x.on_newmessage(h) if x.respond_to? :on_newmessage }
223
-
227
+
224
228
  @dd.create h
225
-
226
-
229
+
230
+
227
231
  # remove the message from the server
228
232
  #jr250918 email.delete
229
-
233
+
230
234
  rescue
231
235
  puts 'Omah::store warning: ' + ($!).inspect
232
236
  end
233
237
 
234
238
  end
235
-
239
+
236
240
  if @xslt then
237
-
241
+
238
242
  unless FileX.exists? @xslt then
239
243
  FileX.write File.expand_path(@xslt), fetch_file(@xslt)
240
244
  FileX.write File.expand_path(@css), fetch_file(@css) if @css and \
241
245
  not FileX.exists? @css
242
246
  end
243
-
247
+
244
248
  @dd.xslt = @xslt
245
249
 
246
250
  end
247
-
248
-
251
+
252
+
249
253
  doc = @dd.to_doc
250
254
 
251
255
  doc.root.xpath('records/message').each do |message|
252
-
256
+
253
257
  classify message.element('from')
254
258
  classify message.element('to')
255
-
259
+
256
260
  end
257
261
 
258
- @plugins.each do |x|
262
+ @plugins.each do |x|
259
263
  x.on_newmail(messages, doc) if x.respond_to? :on_newmail
260
264
  end
261
-
265
+
262
266
  FileX.write File.join(@filepath_user, 'dynarexdaily.xml'), \
263
267
  doc.xml(pretty: true)
264
-
268
+
265
269
  end
266
-
270
+
267
271
  private
268
-
272
+
269
273
  def archive()
270
-
274
+
271
275
  t = Time.now
272
276
  path = File.join ['archive', t.year.to_s, \
273
277
  Date::MONTHNAMES[t.month].downcase[0..2], t.day.to_s]
274
278
 
275
- end
276
-
279
+ end
280
+
277
281
  def classify(e)
278
-
279
- s = e.text.to_s
282
+
283
+ s = e.text.to_s
280
284
  return if s.empty?
281
-
285
+
282
286
  e.attributes[:css_class] = NoVowels.compact(s.gsub(/\W+/,''))
283
- end
287
+ end
284
288
 
285
289
  def html_sanitiser(s)
286
- # Parsing HTML has proved problematic either way. Instead we will just
290
+ # Parsing HTML has proved problematic either way. Instead we will just
287
291
  # return whatever is given.
288
292
  =begin
289
293
  begin
@@ -296,12 +300,12 @@ html_page= %Q(
296
300
  =end
297
301
  s
298
302
  end
299
-
303
+
300
304
 
301
305
  def text_sanitiser(s)
302
- # Parsing HTML has proved problematic either way. Instead we will just
306
+ # Parsing HTML has proved problematic either way. Instead we will just
303
307
  # return whatever is given.
304
- =begin
308
+ =begin
305
309
  begin
306
310
  Rexle.new "<root>#{s}</root>"
307
311
  s2 = s
@@ -312,6 +316,6 @@ html_page= %Q(
312
316
  =end
313
317
  s
314
318
  end
315
-
319
+
316
320
 
317
321
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: omah
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,27 +10,32 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDXjCCAkagAwIBAgIBATANBgkqhkiG9w0BAQUFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTgwNzI0MjE1NDUxWhcN
15
- MTkwNzI0MjE1NDUxWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDUFiXU
17
- C+MpRXGK1y364aNZYHu0nBE58/E03G9PgNW5ey2WUG7VfqSpCHf+pnkKPvhERGcp
18
- fs2c+C8xMLYBlVEDR9UWgJTgAjYx3H79tMsgWn8xurMDKLjsxYW6RwP70HQMCFGU
19
- DChFrLLtNWLvW7giV00Miqlf9ZAEdphD8d+VFXIm8iDTUYitMOZE6NbmgacwZ4lu
20
- VHmOwNs3Wg+K66SobXrxBTrQzmYVTjJkgmbyEORH/of/oBvcOG5tZY9ELlZCxLhX
21
- sb1bQAi12cOkuOoCsV1tWtP9PVQWwoWMBjoC36sNemHmxzaNOt25BHxNdJrznlKt
22
- ZB52qlYVJ0qqbU0jAgMBAAGjgYowgYcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
23
- HQYDVR0OBBYEFN+DBAwxB/gSg8HcerKG5yiElimbMCYGA1UdEQQfMB2BG2dlbW1h
24
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTAmBgNVHRIEHzAdgRtnZW1tYXN0ZXJAamFt
25
- ZXNyb2JlcnRzb24uZXUwDQYJKoZIhvcNAQEFBQADggEBAD0byFUEJePXzFGCTQVx
26
- tr796ChW0Fxno+ZsR3jTvN6dMbAKUR+9/TYzXInbVx7z1edtUlDJJ02Cxpu0JCGu
27
- Wiu9aMjHLXVcicTo9t73xMcO0tguhINlvfubf80Co7t8m9Cv6W8WpIRp/I7XKxGe
28
- 1LsGhAYGIzku126UPCzdPhZvxXEiv63N4SBbjfpiDKWZLyQ8m0NEEKIN3ak89A78
29
- imC/Xwzv0SxyYibMdqD+fRP6HKhUzawMSRhNvnw4EhtqFVw6WOVjVHQHc4E9aptT
30
- QYtaxpGWTpAPjszaFSAGnt9wrzAMCFPhpqXanwuDYpQ0rmo/GgWyJNEJuUgvMZBi
31
- WfE=
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjExMTE4MTE0MTM3WhcN
15
+ MjIxMTE4MTE0MTM3WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCdnMRf
17
+ xtV4IAaB2Ev1nAT/IZsvOs0a/oCgv/+CFyuZxDhpTF+znJRAlBW8pMSOxmQ0/V04
18
+ owAW7+4lt/RkAZyUbgUqnWDsNIvBZcQbVnhQcJLCNBFPLSe9LeCz8gWqnSSZD0N2
19
+ ZuAm7EvBlWVRbMLZDNmUxpdRskdRZQQ9NOfTc9p4QU65x91Ys3RHCuGwB67H6ulp
20
+ O0PgSIyfs2IaEB8CR7pQk2qyEHVn81LkJLhlUvqM07vDYNflbGSwKgsIRYcu28jI
21
+ Xwb0Gpsjn/UcLsBuu/CvhqVx4CEdX6wo7DWtbeV3bWIf25T8cRGHZiftCDXI5a7H
22
+ YjdiqW38reXuPnWa2uqtdYWYUctHIObQ7OEAMKBiFbz9OPfw1z2acWpqs9JTwJLI
23
+ a3jQqPE7Qlifu/mtasZ94IBv+AJoMJeVuwIEcXlO8YlbAblMDeWz0MY2317g0xwy
24
+ lz6J6f9EXabWSk5q2PZMX4M5qHCPMoBwPX4NWjVscWY1Cs5KYERek079KZMCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUXGiFRVre
26
+ Vjoqpwk+D83rrR1OXpwwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAf2g/Yn2jGLrcB4UF/4aCNMqHYxw3Tc6ubW+eoH0L
29
+ 7xXPcsFl/5i6PTusx+DrVzE4g/jsKAIOkO9spU7uVcYAitadHZqmF1Y5/D64P1xo
30
+ ScfV1uRp3Dbeq3QQHqSPNTj17QXlspdaNw+tBJrI1O8/aTutwDg6tkcaC/yqGwFt
31
+ +bh7rB9730zTdurLNUTfruHI38CRSOjt4BkucvmuC17rHhx4h9jMCi6zu5rtengR
32
+ lnLA6WVHlggce4nsMEBQIZZLUOssW32OPGDVbjh/24jNpVukqRm5sQFRWWuWkrwd
33
+ jNJY60a6JkLn4Ahvzrhm2n7anGKTOpyVS62Qu8w6cUkjXpmwXWXWVN9N7/POG7EO
34
+ xgj1UqJaKqMEg3TAr0auf2iXyXfhxbRVryltYk+3SkZWbITs95cEbmfWSgoVu6os
35
+ v/Ouz34Li0pxu+f3q+Z4+FRkBjMmW1X8RIaeSj9LAirhInezIc2b9CkS5c5zkwkZ
36
+ S/OWSwnVm2eKNuPrpAfd36Wk
32
37
  -----END CERTIFICATE-----
33
- date: 2018-09-26 00:00:00.000000000 Z
38
+ date: 2022-02-22 00:00:00.000000000 Z
34
39
  dependencies:
35
40
  - !ruby/object:Gem::Dependency
36
41
  name: dynarex-daily
@@ -58,20 +63,20 @@ dependencies:
58
63
  requirements:
59
64
  - - "~>"
60
65
  - !ruby/object:Gem::Version
61
- version: '0.3'
66
+ version: '0.7'
62
67
  - - ">="
63
68
  - !ruby/object:Gem::Version
64
- version: 0.3.2
69
+ version: 0.7.0
65
70
  type: :runtime
66
71
  prerelease: false
67
72
  version_requirements: !ruby/object:Gem::Requirement
68
73
  requirements:
69
74
  - - "~>"
70
75
  - !ruby/object:Gem::Version
71
- version: '0.3'
76
+ version: '0.7'
72
77
  - - ">="
73
78
  - !ruby/object:Gem::Version
74
- version: 0.3.2
79
+ version: 0.7.0
75
80
  - !ruby/object:Gem::Dependency
76
81
  name: novowels
77
82
  requirement: !ruby/object:Gem::Requirement
@@ -93,7 +98,7 @@ dependencies:
93
98
  - !ruby/object:Gem::Version
94
99
  version: 0.1.3
95
100
  description:
96
- email: james@jamesrobertson.eu
101
+ email: digital.robertson@gmail.com
97
102
  executables: []
98
103
  extensions: []
99
104
  extra_rdoc_files: []
@@ -120,9 +125,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
120
125
  - !ruby/object:Gem::Version
121
126
  version: '0'
122
127
  requirements: []
123
- rubyforge_project:
124
- rubygems_version: 2.7.6
128
+ rubygems_version: 3.2.22
125
129
  signing_key:
126
130
  specification_version: 4
127
- summary: 'Offline Mail Helper: Stores email messages in a file directory archive'
131
+ summary: 'Offline Mail Helper: Stores email messages in a file directory archive.'
128
132
  test_files: []
metadata.gz.sig CHANGED
Binary file