mbox_header_scraper 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7be5524c12492b10eb63bfad40bac97efbce5ca3
4
+ data.tar.gz: 482a7926ad5e837d475b7615c3c60ee029b790bd
5
+ SHA512:
6
+ metadata.gz: 07e78ca647f47a93066b03bcceaa2dbb9a357103313ee780a74fc31d2f5fef5ae844073b1a58998476b162a98cf9839cc8cb26797daaa6c5d2583c0e89d6c3fa
7
+ data.tar.gz: 7dbd55635c648fe3feab7b730ec38f8db04a0339b49d323c3531d3c9a5d766c8c888f3daf7f5ebfbef1e1f3b7a25f098bc1cddd756c2f9ca84694b7ab8916aa9
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /vendor/bundle
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.rubocop.yml ADDED
@@ -0,0 +1,61 @@
1
+ # This configuration was generated by `rubocop --auto-gen-config`
2
+ # on 2014-09-11 18:44:31 +0900 using RuboCop version 0.26.0.
3
+ # The point is for the user to remove these configuration records
4
+ # one by one as the offenses are removed from the code base.
5
+ # Note that changes in the inspected code, or installation of new
6
+ # versions of RuboCop, may require this file to be generated again.
7
+
8
+ AllCops:
9
+ Exclude:
10
+ - 'bin/**/*'
11
+ - 'db/**/*'
12
+ - 'config/**/*'
13
+ - 'script/**/*'
14
+ - 'vendor/**/*'
15
+ - 'spec/spec_helper.rb'
16
+ - 'spec/rails_helper.rb'
17
+ - 'Guardfile'
18
+ #- !ruby/regexp /old_and_unused\.rb$/
19
+
20
+ # Configuration parameters: CountComments.
21
+ Metrics/ClassLength:
22
+ Max: 500
23
+
24
+ # Configuration parameters: AllowURI.
25
+ Metrics/LineLength:
26
+ Max: 120
27
+
28
+ # Configuration parameters: CountComments.
29
+ Metrics/MethodLength:
30
+ Max: 30
31
+
32
+ Metrics/AbcSize:
33
+ Enabled: true
34
+ Max: 17
35
+
36
+ Metrics/CyclomaticComplexity:
37
+ Enabled: true
38
+ Max: 10
39
+
40
+ Style/AsciiComments:
41
+ Enabled: false
42
+
43
+ # Cop supports --auto-correct.
44
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
45
+ Style/BracesAroundHashParameters:
46
+ Enabled: false
47
+
48
+ # Cop supports --auto-correct.
49
+ #Style/EmptyLinesAroundBody:
50
+ # Enabled: false
51
+
52
+ # Cop supports --auto-correct.
53
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
54
+ Style/SignalException:
55
+ Enabled: false
56
+
57
+ Style/WordArray:
58
+ MinSize: 10
59
+
60
+ ClassAndModuleChildren:
61
+ EnforcedStyle: compact
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 2.0.0-p0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in mbox_header_scraper.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,56 @@
1
+ # MboxHeaderScraper
2
+
3
+ [![Circle CI](https://circleci.com/gh/tamano/mbox_header_scraper.svg?style=svg)](https://circleci.com/gh/tamano/mbox_header_scraper) [![Code Climate](https://codeclimate.com/github/tamano/mbox_header_scraper/badges/gpa.svg)](https://codeclimate.com/github/tamano/mbox_header_scraper) [![Test Coverage](https://codeclimate.com/github/tamano/mbox_header_scraper/badges/coverage.svg)](https://codeclimate.com/github/tamano/mbox_header_scraper)
4
+
5
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/mbox_header_scraper`. To experiment with that code, run `bin/console` for an interactive prompt.
6
+
7
+ TODO: Delete this and the text above, and describe your gem
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'mbox_header_scraper'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install mbox_header_scraper
24
+
25
+ ## Usage
26
+
27
+ How to use.
28
+
29
+ ```bash
30
+ $ mbox_header_scraper mail_address_list {mbox_file} {output_tsv}
31
+ ```
32
+
33
+ Then, result TSV file goes like this.
34
+
35
+ ```
36
+ Subject Date From To CC
37
+ My Subject Fri, 15 May 2015 18:14:47 +0900 from@example.com to1@example.com
38
+ to2@example.com
39
+ テスト Thu, 14 May 2015 16:39:43 +0900 from@example.com to@example.com cc@example.com
40
+ ```
41
+
42
+ That's all!
43
+
44
+ ## Development
45
+
46
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
47
+
48
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
49
+
50
+ ## Contributing
51
+
52
+ 1. Fork it ( https://github.com/[my-github-username]/mbox_header_scraper/fork )
53
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
54
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
55
+ 4. Push to the branch (`git push origin my-new-feature`)
56
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "mbox_header_scraper"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ require "pry"
11
+ Pry.start
12
+
13
+ # require "irb"
14
+ # IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/circle.yml ADDED
@@ -0,0 +1,11 @@
1
+ machine:
2
+ timezone:
3
+ Asia/Tokyo
4
+
5
+ dependencies:
6
+ pre:
7
+ - gem install bundler --pre
8
+
9
+ test:
10
+ pre:
11
+ - bundle exec rubocop
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'mbox_header_scraper'
4
+
5
+ MboxHeaderScraper::CLI.start
@@ -0,0 +1,28 @@
1
+ # Command Interface
2
+ class MboxHeaderScraper::CLI < Thor
3
+ desc \
4
+ 'mail_address_list {in file} {out file}',
5
+ 'load {in file} and output email address included to {out file}'
6
+ long_desc \
7
+ 'load mbox file and output in tsv format file. ' \
8
+ 'the file includes No, Subject(short), From, To, CC'
9
+ def mail_address_list(in_file, out_file)
10
+ error_message = MboxHeaderScraper::Scraper.check_in_file(in_file)
11
+ if error_message
12
+ puts "input file error: #{error_message}"
13
+ exit 1
14
+ end
15
+
16
+ error_message = MboxHeaderScraper::Scraper.check_out_file(out_file)
17
+ if error_message
18
+ puts "output file error: #{error_message}"
19
+ exit 1
20
+ end
21
+
22
+ MboxHeaderScraper::Scraper.process(
23
+ in_file,
24
+ out_file,
25
+ { Subject: true, Date: true, From: true, To: true, CC: true }
26
+ )
27
+ end
28
+ end
@@ -0,0 +1,113 @@
1
+ require 'nkf'
2
+
3
+ # mail object
4
+ class MboxHeaderScraper::Mail
5
+ @mail = nil
6
+
7
+ def initialize(mail_fp)
8
+ @mail = mail_fp
9
+ end
10
+
11
+ # rubocop:disable Metrics/AbcSize
12
+ def header_to_tsv(options)
13
+ # TODO: prevent undefined options
14
+
15
+ targets = get_target_keys(options)
16
+ result = initialize_result_hash(targets)
17
+
18
+ last_symbol = nil
19
+
20
+ IO.foreach(@mail) do |line|
21
+ line.chomp!
22
+
23
+ # this must be continuous value of previous header
24
+ if /^ / =~ line
25
+ # use extract_email_address because Subjects and Dates can't be multiple line
26
+ result[last_symbol].concat(extract_email_address(line.chomp)) if last_symbol
27
+
28
+ next
29
+ end
30
+
31
+ targets.each do |param|
32
+ matched = get_if_matched(param, line)
33
+
34
+ if matched
35
+ result[param].concat(matched) unless matched.empty?
36
+ last_symbol = param
37
+ break
38
+ end
39
+
40
+ last_symbol = nil
41
+ end
42
+
43
+ result = uniquify_result_hash(result)
44
+
45
+ # mail header must finish with the first empty line
46
+ return build_tsv(result, options) if /^$/ =~ line
47
+ end
48
+
49
+ # mail without empty line must be broken
50
+ raise 'this mail is broken'
51
+ end
52
+ # rubocop:enable Metrics/AbcSize
53
+
54
+ private
55
+
56
+ def get_target_keys(options)
57
+ options.select { |v| options[v] == true }.keys
58
+ end
59
+
60
+ def initialize_result_hash(targets)
61
+ result = {}
62
+ targets.each do |v|
63
+ result[v] = []
64
+ end
65
+
66
+ result
67
+ end
68
+
69
+ def uniquify_result_hash(hash)
70
+ hash.keys.each do |v|
71
+ hash[v].uniq!
72
+ end
73
+
74
+ hash
75
+ end
76
+
77
+ def get_if_matched(param, line)
78
+ return nil unless /^#{param}: / =~ line
79
+
80
+ if param == :Subject
81
+ subject = NKF.nkf('-mw', ($'))
82
+ [subject.chomp]
83
+ elsif param == :Date
84
+ [($').chomp]
85
+ else
86
+ extract_email_address(($').chomp)
87
+ end
88
+ end
89
+
90
+ def build_tsv(hash, options)
91
+ targets = get_target_keys(options)
92
+
93
+ tsv = ''
94
+
95
+ i = 0
96
+ loop do
97
+ line = []
98
+ targets.each do |v|
99
+ line << (hash[v][i] || '')
100
+ end
101
+
102
+ break if line.all? { |v| v == '' }
103
+ tsv += (line.join("\t") + "\n")
104
+ i += 1
105
+ end
106
+
107
+ tsv
108
+ end
109
+
110
+ def extract_email_address(str)
111
+ str.scan(/[0-9a-z.\+\-\_]+@[0-9a-z.\+\-\_]+/i)
112
+ end
113
+ end
@@ -0,0 +1,60 @@
1
+ # scrape mbox file
2
+ class MboxHeaderScraper::Scraper
3
+ # rubocop:disable Metrics/AbcSize
4
+ def self.process(in_file, out_file, options = { Subject: true, Date: true, From: true, To: true, CC: true })
5
+ Tempfile.open('mbox_header_scraper_result') do |result_file|
6
+ result_file.write(insert_header(options))
7
+
8
+ tmp = nil
9
+
10
+ # to prevent nil error on first line
11
+ def tmp.closed?
12
+ true
13
+ end
14
+
15
+ IO.foreach(in_file) do |line|
16
+ if /^From / =~ line && !tmp.closed?
17
+ tmp.close(false)
18
+ result_file.write(single_mail_to_tsv(tmp, options))
19
+ tmp.delete
20
+ end
21
+
22
+ tmp = Tempfile.open('mbox_header_scraper_tmp') if tmp.closed?
23
+ tmp.write(line)
24
+ end
25
+
26
+ tmp.close(false)
27
+ result_file.write(single_mail_to_tsv(tmp, options))
28
+ tmp.delete
29
+
30
+ result_file.close(false)
31
+ FileUtils.copy_file(result_file.path, out_file)
32
+ end
33
+ end
34
+ # rubocop:enable Metrics/AbcSize
35
+
36
+ def self.check_in_file(filename)
37
+ return 'file does not exists.' unless File.exist?(filename)
38
+ nil
39
+ end
40
+
41
+ def self.check_out_file(filename)
42
+ return 'file already exists.' if File.exist?(filename)
43
+ nil
44
+ end
45
+
46
+ def self.single_mail_to_tsv(mail_file, options)
47
+ mail = MboxHeaderScraper::Mail.new(mail_file)
48
+ mail.header_to_tsv(options)
49
+ end
50
+
51
+ def self.insert_header(headers)
52
+ line = []
53
+
54
+ headers.select { |v| headers[v] == true }.keys.each do |v|
55
+ line << v
56
+ end
57
+
58
+ (line.join("\t") + "\n")
59
+ end
60
+ end
@@ -0,0 +1,4 @@
1
+ # About Version
2
+ module MboxHeaderScraper
3
+ VERSION = '0.1.0'
4
+ end
@@ -0,0 +1,10 @@
1
+ require 'thor'
2
+
3
+ require 'mbox_header_scraper/version'
4
+ require 'mbox_header_scraper/cli'
5
+ require 'mbox_header_scraper/scraper'
6
+ require 'mbox_header_scraper/mail'
7
+
8
+ # Main Class
9
+ module MboxHeaderScraper
10
+ end
@@ -0,0 +1,43 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'mbox_header_scraper/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'mbox_header_scraper'
8
+ spec.version = MboxHeaderScraper::VERSION
9
+ spec.authors = ['Yuya TAMANO']
10
+ spec.email = ['everfree.main@gmail.com']
11
+
12
+ spec.summary = 'tool to search mail header in mbox file'
13
+ spec.description = 'See README.md for more information.'
14
+ spec.homepage = 'https://github.com/tamano/mbox_header_scraper'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ if spec.respond_to?(:metadata)
23
+ # spec.metadata['allowed_push_host']
24
+ end
25
+
26
+ spec.add_dependency 'thor'
27
+ # spec.add_dependency 'mail'
28
+
29
+ spec.add_development_dependency 'bundler' # , '~> 1.9'
30
+ spec.add_development_dependency 'rake', '~> 10.0'
31
+ spec.add_development_dependency 'rspec'
32
+ spec.add_development_dependency 'codeclimate-test-reporter'
33
+ spec.add_development_dependency 'rubocop'
34
+
35
+ spec.add_development_dependency 'pry'
36
+ spec.add_development_dependency 'pry-byebug'
37
+ spec.add_development_dependency 'awesome_print'
38
+ spec.add_development_dependency 'hirb'
39
+
40
+ spec.add_development_dependency 'guard-rspec'
41
+ spec.add_development_dependency 'guard-rubocop'
42
+ spec.add_development_dependency 'terminal-notifier-guard'
43
+ end
metadata ADDED
@@ -0,0 +1,244 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mbox_header_scraper
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yuya TAMANO
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-05-24 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
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
+ - !ruby/object:Gem::Dependency
70
+ name: codeclimate-test-reporter
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: pry-byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: awesome_print
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: hirb
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: guard-rspec
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - '>='
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - '>='
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: guard-rubocop
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - '>='
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - '>='
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
181
+ - !ruby/object:Gem::Dependency
182
+ name: terminal-notifier-guard
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - '>='
186
+ - !ruby/object:Gem::Version
187
+ version: '0'
188
+ type: :development
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - '>='
193
+ - !ruby/object:Gem::Version
194
+ version: '0'
195
+ description: See README.md for more information.
196
+ email:
197
+ - everfree.main@gmail.com
198
+ executables:
199
+ - mbox_header_scraper
200
+ extensions: []
201
+ extra_rdoc_files: []
202
+ files:
203
+ - .gitignore
204
+ - .rspec
205
+ - .rubocop.yml
206
+ - .ruby-version
207
+ - Gemfile
208
+ - README.md
209
+ - Rakefile
210
+ - bin/console
211
+ - bin/setup
212
+ - circle.yml
213
+ - exe/mbox_header_scraper
214
+ - lib/mbox_header_scraper.rb
215
+ - lib/mbox_header_scraper/cli.rb
216
+ - lib/mbox_header_scraper/mail.rb
217
+ - lib/mbox_header_scraper/scraper.rb
218
+ - lib/mbox_header_scraper/version.rb
219
+ - mbox_header_scraper.gemspec
220
+ homepage: https://github.com/tamano/mbox_header_scraper
221
+ licenses:
222
+ - MIT
223
+ metadata: {}
224
+ post_install_message:
225
+ rdoc_options: []
226
+ require_paths:
227
+ - lib
228
+ required_ruby_version: !ruby/object:Gem::Requirement
229
+ requirements:
230
+ - - '>='
231
+ - !ruby/object:Gem::Version
232
+ version: '0'
233
+ required_rubygems_version: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - '>='
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ requirements: []
239
+ rubyforge_project:
240
+ rubygems_version: 2.0.0
241
+ signing_key:
242
+ specification_version: 4
243
+ summary: tool to search mail header in mbox file
244
+ test_files: []