mailhandler 1.0.13 → 1.0.14

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7d5da2d84a112a75963921878106d433e7692f45
4
- data.tar.gz: 6d52c2232c683d02a2cfb6d27da46e5d399cc6c2
3
+ metadata.gz: 2ec9ad0acba66aa31321e63ed9f9acf9b95f57ea
4
+ data.tar.gz: 16279973b129e4a3f384e7cfdaa025603b6b3814
5
5
  SHA512:
6
- metadata.gz: 1834533b14c45829273d4c050b5f9f3cb1e0ac08e834bd9ac4d0b4e5b79250fe7e926120a36e64c844a5351d2b43df14eabbf7b3fa0220c327921e6fc74f904d
7
- data.tar.gz: e595566eb6a85f3043bb371d48a51d38a04bc430d7b4e5fd5a3ea434af6c76126e44086b007e68db703cdc28e72cc37ed318c5f6078859c68b64710577dc02f4
6
+ metadata.gz: 04381e76cc9adc9b6bfa1e2d649957cf60a2fbd1f5b2da7fa08d50d51d2e6fe3beaa61d13de6a4dcde7719c24c5affe8519d4bc13e97364a94a0ecf5e812d7fe
7
+ data.tar.gz: e0c657384c7679083bbe7047738fb2fb810fe58e9562a3a7ed9fd3d764178d155ce905a82e2722520786af049dbfbfe4aab991ed0e9d7e9b0a764f7401764a0f
@@ -0,0 +1,56 @@
1
+ require 'fileutils'
2
+
3
+ # Base filtering class, which is used for reading list of all files based on passed pattern.
4
+ # Patterns to be used can be checked here: http://ruby-doc.org/core-1.9.3/Dir.html
5
+ module Filter
6
+
7
+ class Base
8
+
9
+ def Base.sort(files)
10
+
11
+ swapped = true
12
+ j = 0
13
+
14
+ while swapped do
15
+
16
+ swapped = false
17
+ j+=1
18
+
19
+ (files.size - j).times do |i|
20
+
21
+ if File.new(files[i]).ctime < File.new(files[i + 1]).ctime
22
+ tmp = files[i]
23
+ files[i] = files[i + 1]
24
+ files[i + 1] = tmp
25
+ swapped = true
26
+
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ files
34
+
35
+ end
36
+
37
+ def get(pattern)
38
+
39
+ files = []
40
+ Dir.glob(pattern).each { |file| files << File.absolute_path(file) }
41
+ files
42
+
43
+ end
44
+
45
+ protected
46
+
47
+ def read_email(content)
48
+
49
+ Mail.read_from_string(content)
50
+
51
+ end
52
+
53
+ end
54
+
55
+ end
56
+
@@ -0,0 +1,167 @@
1
+ require_relative 'base.rb'
2
+
3
+ # Implementations of base filtering, which will allow further filtering the list of files based on email content.
4
+ module Filter
5
+
6
+ class ByFilename < Base
7
+
8
+ def get(pattern)
9
+
10
+ super(pattern)
11
+
12
+ end
13
+
14
+ end
15
+
16
+ class ContentBase < Base
17
+
18
+ def initialize(content)
19
+
20
+ @content = content.to_s
21
+
22
+ end
23
+
24
+ protected
25
+
26
+ def filter_files(files)
27
+
28
+ files.select do |file|
29
+
30
+ begin
31
+
32
+ file_match_filter?(file)
33
+
34
+ rescue
35
+
36
+ # return false if error occurred or content was not found
37
+ false
38
+
39
+ end
40
+
41
+ end
42
+
43
+ end
44
+
45
+ def file_match_filter?(file)
46
+
47
+ raise StandardError, 'Not implemented'
48
+
49
+ end
50
+
51
+ end
52
+
53
+ class BySubject < ContentBase
54
+
55
+ def initialize(content)
56
+
57
+ super(content)
58
+
59
+ end
60
+
61
+ def get(pattern)
62
+
63
+ files = super(pattern)
64
+ filter_files(files)
65
+
66
+ end
67
+
68
+ private
69
+
70
+ def file_match_filter?(file)
71
+
72
+ read_email(File.read(file)).subject.include? @content
73
+
74
+ end
75
+
76
+ end
77
+
78
+ class ByContent < ContentBase
79
+
80
+ def initialize(content)
81
+
82
+ super(content)
83
+
84
+ end
85
+
86
+ def get(pattern)
87
+
88
+ files = super(pattern)
89
+ filter_files(files)
90
+
91
+ end
92
+
93
+ private
94
+
95
+ def file_match_filter?(file)
96
+
97
+ File.read(file).include? @content
98
+
99
+ end
100
+
101
+ end
102
+
103
+ class ByDate < ContentBase
104
+
105
+ def initialize(date)
106
+
107
+ @date = date
108
+
109
+ end
110
+
111
+ def get(pattern)
112
+
113
+ files = super(pattern)
114
+ filter_files(files)
115
+
116
+ end
117
+
118
+ private
119
+
120
+ def file_match_filter?(file)
121
+
122
+ file = File.new(file)
123
+ if file != nil
124
+
125
+ file.ctime > @date
126
+
127
+ else
128
+
129
+ false
130
+
131
+ end
132
+
133
+ end
134
+
135
+ end
136
+
137
+ module Email
138
+
139
+ class ByRecipient < ContentBase
140
+
141
+ def initialize(recipient)
142
+
143
+ @recipient = recipient
144
+
145
+ end
146
+
147
+ def get(pattern)
148
+
149
+ files = super(pattern)
150
+ filter_files(files)
151
+
152
+ end
153
+
154
+ private
155
+
156
+ def file_match_filter?(file)
157
+
158
+ email = read_email(File.read(file))
159
+ email[@recipient.keys.first].to_s.include? @recipient.values.first
160
+
161
+ end
162
+
163
+ end
164
+
165
+ end
166
+
167
+ end
@@ -1,8 +1,10 @@
1
- require_relative 'base.rb'
2
- require_relative 'filter'
3
1
  require 'mail'
2
+ require_relative 'base.rb'
4
3
  require_relative '../errors'
5
4
 
5
+ require_relative 'file_filter/base.rb'
6
+ require_relative 'file_filter/filter.rb'
7
+
6
8
  module MailHandler
7
9
 
8
10
  module Receiving
@@ -45,7 +47,7 @@ module MailHandler
45
47
  # filter options which need to be done by searching files
46
48
  FILE_SEARCH_CLASSES = {
47
49
 
48
- :by_subject => Filter::ByContent,
50
+ :by_subject => Filter::BySubject,
49
51
  :by_content => Filter::ByContent,
50
52
  :by_date => Filter::ByDate,
51
53
  :by_recipient => Filter::Email::ByRecipient
@@ -59,12 +61,7 @@ module MailHandler
59
61
 
60
62
  def read_found_emails(files, count)
61
63
 
62
- files.first(count).map do |file|
63
-
64
- email_content = File.read(file)
65
- Mail.read_from_string(email_content)
66
-
67
- end
64
+ files.first(count).map { |file| Mail.read_from_string(File.read(file)) }
68
65
 
69
66
  end
70
67
 
@@ -103,7 +100,7 @@ module MailHandler
103
100
 
104
101
  def delete_file(file)
105
102
 
106
- FileUtils.rm_r "#{inbox_folder}/#{file}", :force => true
103
+ FileUtils.rm_r "#{inbox_folder}/#{file}", :force => false
107
104
 
108
105
  end
109
106
 
@@ -91,16 +91,7 @@ module MailHandler
91
91
 
92
92
  def find_emails(options)
93
93
 
94
- if options[:archive]
95
-
96
- result = Mail.find_and_delete(:what => :last, :count => search_options[:count], :order => :desc, :keys => imap_filter_keys(options))
97
-
98
- else
99
-
100
- result = Mail.find(:what => :last, :count => search_options[:count], :order => :desc, :keys => imap_filter_keys(options))
101
-
102
- end
103
-
94
+ result = Mail.find(:what => :last, :count => search_options[:count], :order => :desc, :keys => imap_filter_keys(options), :delete_after_find => options[:archive])
104
95
  (result.kind_of? Array)? result : [result]
105
96
 
106
97
  end
@@ -1,5 +1,5 @@
1
1
  module MailHandler
2
2
 
3
- VERSION = '1.0.13'
3
+ VERSION = '1.0.14'
4
4
 
5
5
  end
@@ -0,0 +1,47 @@
1
+ Delivered-To: igor@example.com
2
+ Received: by 12.74.171.199 with SMTP id 1w7csp487013o2c;
3
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
4
+ X-Received: by 11.14.225.211 with SMTP id k202mr13688721ywe.168.1450691103560;
5
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
6
+ Received: from sc-exam.mtasv.net (sc-exam.itasv.net. [51.32.152.221])
7
+ by mx.google.com with ESMTPS id n124si20919044ywc.44.2015.22.22.01.45.03
8
+ for <igor@example.com>
9
+ (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
10
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
11
+ Received-SPF: pass (google.com: domain of unces@wb.example.com designates 11.1.1.1 as permitted sender) client-ip=11.1.1.1;
12
+ Authentication-Results: mx.google.com;
13
+ spf=pass (google.com: domain of ounces@wb.example.com designates 11.1.1.1 as permitted sender) smtp.mailfrom=ounces@wb.example.com;
14
+ dkim=pass header.i=@example.com;
15
+ dmarc=pass (p=NONE dis=NONE) header.from=example.com
16
+ DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=jan2013.pm; d=example.com;
17
+ h=From:Date:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:To:Reply-To:Message-ID; i=igor@example.com;
18
+ bh=PzwfK1FvIpe5JXJSkPKh5z/fDTY=;
19
+ b=Y8QAdWtGwwC9QSXtVQ+QJzOt+dzOm+WrOCJ/dnGbD8eBKYuEBRxwo18FqmSIP7petsfqU3NIXK85
20
+ uF7yvyaBdMkafiKrR4du+TFTf+QBfsOoSrCIvKhCqnRgTEeL/niuYMbjNDrUNWcxq5VvUWKrtyjf
21
+ cvyZhxW2Cwdbd5nZ2NM=
22
+ DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=jan2013.pm; d=example.com;
23
+ b=S7CL7EMB1XKFCedi2NHfRSxWEnzBXnt6f48UxDcpGBWQGRj5b53isqmr5dnwAvP+q6HdQDc0rDgk
24
+ hXnckMTHE1p1MmeBSvETDB+FU4VXnA4CaAfeRTf+rUZlz1w5d/aWKqBSa9kPJQvwQrCypxqcPJql
25
+ 7K0YKl5PtWP3D5gn/KU=;
26
+ Received: by sc-exam.mtasv.net id hev51u1jk5kd for <igor@example.com>; Mon, 21 Dec 2015 04:45:03 -0500 (envelope-from <ounces@wb.example.com>)
27
+ X-IADB-IP: 11.1.1.1
28
+ X-IADB-IP-REVERSE: 11.1.1.2
29
+ From: "John Smith" <igor@example.com>
30
+ Date: Mon, 21 Dec 2015 04:45:03 -0500
31
+ Subject: =?UTF-8?Q?=D0=95-=D0=BC=D0=B0=D0=B8=D0=BB=20=D0=BF=D1=80?=
32
+ =?UTF-8?Q?=D0=B8=D0=BC=D0=B5=D1=80=2069578385=20?=
33
+ MIME-Version: 1.0
34
+ Content-Type: text/html; charset=UTF-8
35
+ Content-Transfer-Encoding: quoted-printable
36
+ X-Mailer: aspNetEmail ver 4.0.0.38
37
+ X-PM-RCPT: |bTB8MjA3NDd8MTYzODZ8aWJhbG9zaC50ZXN0aW5nQGdtYWlsLmNv11==|
38
+ X-PM-Message-Id: 1fb4ccd8-fe62-4424-a0aa-a30b281b9631
39
+ To: igor@example.com
40
+ Message-ID: <5677ca1e87ee0_de33fee2381c080708d8@Johns-MacBook-Pro.local.mail>
41
+
42
+ <=21DOCTYPE html>=0A<html>=0A=0A<body>=0A<h1>My First Heading</h1>=0A<p>M=
43
+ y first paragraph=2E</p>=0A<p>My first paragraph S=C3=BC=C3=9Fe =2E</p>=0A=
44
+ =0A<img src=3D=22http://ea=2Epstmrk=2Eit/open/MjA3NDdfMTYzODZfb3ZlcjUwXzh=
45
+ mYjRjY2Q4LWZlNjItNDQyNC1hMGFhLWEzMGIyODFiOTYzMF9pYmFsb3NoLnRlc3RpbmdAZ21h=
46
+ aWwuY29t=22 width=3D=221=22 height=3D=221=22 border=3D=220=22 /></body>=0A=
47
+ </html>
@@ -0,0 +1,46 @@
1
+ Delivered-To: igor@example.com
2
+ Received: by 12.74.171.199 with SMTP id 1w7csp487013o2c;
3
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
4
+ X-Received: by 11.14.225.211 with SMTP id k202mr13688721ywe.168.1450691103560;
5
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
6
+ Received: from sc-exam.mtasv.net (sc-exam.itasv.net. [51.32.152.221])
7
+ by mx.google.com with ESMTPS id n124si20919044ywc.44.2015.22.22.01.45.03
8
+ for <igor@example.com>
9
+ (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128);
10
+ Mon, 21 Dec 2015 01:45:03 -0800 (PST)
11
+ Received-SPF: pass (google.com: domain of unces@wb.example.com designates 11.1.1.1 as permitted sender) client-ip=11.1.1.1;
12
+ Authentication-Results: mx.google.com;
13
+ spf=pass (google.com: domain of ounces@wb.example.com designates 11.1.1.1 as permitted sender) smtp.mailfrom=ounces@wb.example.com;
14
+ dkim=pass header.i=@example.com;
15
+ dmarc=pass (p=NONE dis=NONE) header.from=example.com
16
+ DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; s=jan2013.pm; d=example.com;
17
+ h=From:Date:Subject:MIME-Version:Content-Type:Content-Transfer-Encoding:To:Reply-To:Message-ID; i=igor@example.com;
18
+ bh=PzwfK1FvIpe5JXJSkPKh5z/fDTY=;
19
+ b=Y8QAdWtGwwC9QSXtVQ+QJzOt+dzOm+WrOCJ/dnGbD8eBKYuEBRxwo18FqmSIP7petsfqU3NIXK85
20
+ uF7yvyaBdMkafiKrR4du+TFTf+QBfsOoSrCIvKhCqnRgTEeL/niuYMbjNDrUNWcxq5VvUWKrtyjf
21
+ cvyZhxW2Cwdbd5nZ2NM=
22
+ DomainKey-Signature: a=rsa-sha1; c=nofws; q=dns; s=jan2013.pm; d=example.com;
23
+ b=S7CL7EMB1XKFCedi2NHfRSxWEnzBXnt6f48UxDcpGBWQGRj5b53isqmr5dnwAvP+q6HdQDc0rDgk
24
+ hXnckMTHE1p1MmeBSvETDB+FU4VXnA4CaAfeRTf+rUZlz1w5d/aWKqBSa9kPJQvwQrCypxqcPJql
25
+ 7K0YKl5PtWP3D5gn/KU=;
26
+ Received: by sc-exam.mtasv.net id hev51u1jk5kd for <igor@example.com>; Mon, 21 Dec 2015 04:45:03 -0500 (envelope-from <ounces@wb.example.com>)
27
+ X-IADB-IP: 11.1.1.1
28
+ X-IADB-IP-REVERSE: 11.1.1.2
29
+ From: "John Smith" <igor@example.com>
30
+ Date: Mon, 21 Dec 2015 04:45:03 -0500
31
+ Subject: =?UTF-8?Q?E-Mail=20beispiels=20m=C3=B6glich=201=20?=
32
+ MIME-Version: 1.0
33
+ Content-Type: text/html; charset=UTF-8
34
+ Content-Transfer-Encoding: quoted-printable
35
+ X-Mailer: aspNetEmail ver 4.0.0.38
36
+ X-PM-RCPT: |bTB8MjA3NDd8MTYzODZ8aWJhbG9zaC50ZXN0aW5nQGdtYWlsLmNv11==|
37
+ X-PM-Message-Id: 1fb4ccd8-fe62-4424-a0aa-a30b281b9631
38
+ To: igor@example.com
39
+ Message-ID: <5677ca1e87ee0_de33fee2381c080708d8@Johns-MacBook-Pro.local.mail>
40
+
41
+ <=21DOCTYPE html>=0A<html>=0A=0A<body>=0A<h1>My First Heading</h1>=0A<p>M=
42
+ y first paragraph=2E</p>=0A<p>My first paragraph S=C3=BC=C3=9Fe =2E</p>=0A=
43
+ =0A<img src=3D=22http://ea=2Epstmrk=2Eit/open/MjA3NDdfMTYzODZfb3ZlcjUwXzh=
44
+ mYjRjY2Q4LWZlNjItNDQyNC1hMGFhLWEzMGIyODFiOTYzMF9pYmFsb3NoLnRlc3RpbmdAZ21h=
45
+ aWwuY29t=22 width=3D=221=22 height=3D=221=22 border=3D=220=22 /></body>=0A=
46
+ </html>
data/spec/data/email2.txt CHANGED
@@ -8,4 +8,4 @@ Content-Type: text/plain;
8
8
  charset=UTF-8
9
9
  Content-Transfer-Encoding: 7bit
10
10
 
11
- test body 1878275
11
+ test body 1878278
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  require 'spec_helper'
2
3
 
3
4
  describe MailHandler::Receiving::FolderChecker do
@@ -131,7 +132,7 @@ describe MailHandler::Receiving::FolderChecker do
131
132
 
132
133
  it 'by recipient' do
133
134
 
134
- checker.find({:by_recipient => { to: 'igor@example.com'} })
135
+ checker.find({:by_recipient => { to: 'igor+nonexisting@example.com'} })
135
136
  expect(checker.found_emails).to be_empty
136
137
 
137
138
  end
@@ -161,6 +162,13 @@ describe MailHandler::Receiving::FolderChecker do
161
162
 
162
163
  end
163
164
 
165
+ it 'by content' do
166
+
167
+ checker.find({:by_content => '1878271'})
168
+ expect(checker.found_emails.size).to be 1
169
+
170
+ end
171
+
164
172
  it 'by subject - multiple' do
165
173
 
166
174
  checker.find({:by_subject => 'test'})
@@ -183,7 +191,7 @@ describe MailHandler::Receiving::FolderChecker do
183
191
  it 'by date' do
184
192
 
185
193
  checker.find({:by_date => Time.new(2015,10,12,13,30,0, "+02:00")})
186
- expect(checker.found_emails.size).to be 2
194
+ expect(checker.found_emails.size).to be 4
187
195
 
188
196
  end
189
197
 
@@ -197,6 +205,24 @@ describe MailHandler::Receiving::FolderChecker do
197
205
 
198
206
  end
199
207
 
208
+ context 'unicode' do
209
+
210
+ it 'by subject - cyrillic' do
211
+
212
+ checker.find({:by_subject => 'Е-маил пример'})
213
+ expect(checker.found_emails.size).to be 1
214
+
215
+ end
216
+
217
+ it 'by subject - german' do
218
+
219
+ checker.find({:by_subject => 'möglich'})
220
+ expect(checker.found_emails.size).to be 1
221
+
222
+ end
223
+
224
+ end
225
+
200
226
  context 'archiving emails' do
201
227
 
202
228
  before(:each) {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mailhandler
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.13
4
+ version: 1.0.14
5
5
  platform: ruby
6
6
  authors:
7
7
  - Igor Balos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-18 00:00:00.000000000 Z
11
+ date: 2015-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mail
@@ -62,7 +62,8 @@ files:
62
62
  - lib/mailhandler/errors.rb
63
63
  - lib/mailhandler/receiver.rb
64
64
  - lib/mailhandler/receiving/base.rb
65
- - lib/mailhandler/receiving/filter.rb
65
+ - lib/mailhandler/receiving/file_filter/base.rb
66
+ - lib/mailhandler/receiving/file_filter/filter.rb
66
67
  - lib/mailhandler/receiving/folder.rb
67
68
  - lib/mailhandler/receiving/imap.rb
68
69
  - lib/mailhandler/receiving/notification/console.rb
@@ -78,6 +79,8 @@ files:
78
79
  - lib/mailhandler/version.rb
79
80
  - mailhandler.gemspec
80
81
  - readme.md
82
+ - spec/data/email-uni1.txt
83
+ - spec/data/email-uni2.txt
81
84
  - spec/data/email1.txt
82
85
  - spec/data/email2.txt
83
86
  - spec/spec_helper.rb
@@ -1,163 +0,0 @@
1
- require 'fileutils'
2
-
3
- module Filter
4
-
5
- class Base
6
-
7
- def Base.sort(files)
8
-
9
- swapped = true
10
- j = 0
11
-
12
- while swapped do
13
-
14
- swapped = false
15
- j+=1
16
-
17
- (files.size - j).times do |i|
18
-
19
- if File.new(files[i]).ctime < File.new(files[i + 1]).ctime
20
- tmp = files[i]
21
- files[i] = files[i + 1]
22
- files[i + 1] = tmp
23
- swapped = true
24
-
25
- end
26
-
27
- end
28
-
29
- end
30
-
31
- files
32
-
33
- end
34
-
35
- def get(pattern)
36
-
37
- files = []
38
- Dir.glob(pattern).each { |file| files << File.absolute_path(file) }
39
- files
40
-
41
- end
42
-
43
- end
44
-
45
- class ByFilename < Base
46
-
47
- def get(pattern)
48
-
49
- super(pattern)
50
-
51
- end
52
-
53
- end
54
-
55
- class ByContent < Base
56
-
57
- def initialize(content)
58
-
59
- @content = content.to_s
60
-
61
- end
62
-
63
- def get(pattern)
64
-
65
- files = super(pattern)
66
-
67
- matched_files = []
68
-
69
- files.each do |file|
70
-
71
- begin
72
-
73
- content = File.read(file)
74
- matched_files << file if content.include? @content
75
-
76
- rescue
77
-
78
- # skip file reading if file is not there anymore
79
-
80
- end
81
-
82
- end
83
-
84
- matched_files
85
-
86
- end
87
-
88
- end
89
-
90
- class ByDate < Base
91
-
92
- def initialize(date)
93
-
94
- @date = date
95
-
96
- end
97
-
98
- def get(pattern)
99
-
100
- files = super(pattern)
101
- files.select { |filename|
102
-
103
- file = nil
104
- begin
105
-
106
- file = File.new(filename)
107
-
108
- rescue
109
-
110
- # skip file reading if file is not there anymore
111
-
112
- end
113
-
114
- file.ctime > @date if (file != nil)
115
-
116
- }
117
-
118
- end
119
-
120
- end
121
-
122
- module Email
123
-
124
- class ByRecipient < Base
125
-
126
- def initialize(recipient)
127
-
128
- @recipient = recipient
129
-
130
- end
131
-
132
- def get(pattern)
133
-
134
- files = super(pattern)
135
-
136
- matched_files = []
137
-
138
- files.each do |file|
139
-
140
- begin
141
-
142
- content = File.read(file)
143
-
144
- email = Mail.read_from_string(content)
145
- matched_files << file if email[@recipient.keys.first].to_s.include? @recipient.values.first
146
-
147
- rescue
148
-
149
- # skip file reading if file is not there anymore
150
-
151
- end
152
-
153
- end
154
-
155
- matched_files
156
-
157
- end
158
-
159
- end
160
-
161
- end
162
-
163
- end