mbox_header_scraper 0.1.0

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.
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: []