eml2html 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- ZDJkZmQ0OGM1YzQzMDllZTI4MzY2ZTBlNzg5MmZmMGU3ZTUwNDkyMQ==
5
- data.tar.gz: !binary |-
6
- ZDJhYzlkMGEzMTUxNTk2ZjRjZThkYTczYjVkOWIzOGVmNmE1NTE5Yg==
2
+ SHA1:
3
+ metadata.gz: 04bd88a978a506474d0edbcd15a40d9478496aae
4
+ data.tar.gz: 21eb52a38f946c0f219b257f06ad1c36e881d142
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- YjM2ZmQyNDc4NjI2NDgzMWJkMDFiN2Y0YzY2NDQxOTI2YWY3NTJjYWZmOWYz
10
- OTM0YTViNzUyOTFjODBiZjUzYzEyZTU0NDg1OTFhYjFmYTQwMTEyOGRkMzFi
11
- YTU3NGNhNTM1YTRjNmFiYjRkNTE4N2FiZjNhN2M2OTA4MTRlNWM=
12
- data.tar.gz: !binary |-
13
- MDI3ZjkzNzMwMGQ4YTNlYzFmMDRhZTU5YzI4NDc5ZDM4NWY5ZGYyZjEyOTVh
14
- YzcwOTIyNDg2Y2I3Y2M3MDI0ZDBmMDIzNTc3YTBlOGM0NWY0OTFiNjIzOTFm
15
- MjA2NjM0YjBhZDI2YzQ1ODY0MmY2ZDkzZjNhOWY1NTI5NTNjMDk=
6
+ metadata.gz: 2138f2f9723da3307c5f3789e5eb8fb1d16eda39e5d3ae1e70dfefa9333c39b6f2abbad252968db390fa47f919654e02cc99a4e80c12085f7251c71f8b58a2c0
7
+ data.tar.gz: 94fe427703da8455f9bfd485488e482025d7021744465db6aa8bbef572146853fac9de3d74385bceaf43e212eb70209ea5135fde1071056007ca8c36026010e1
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
data/Guardfile ADDED
@@ -0,0 +1,5 @@
1
+ guard :rspec, cmd: 'rspec' do
2
+ watch(%r{^spec/.+_spec\.rb$})
3
+ watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
4
+ watch('spec/spec_helper.rb') { "spec" }
5
+ end
data/bin/eml2html CHANGED
File without changes
data/eml2html.gemspec CHANGED
@@ -19,4 +19,10 @@ Gem::Specification.new do |spec|
19
19
 
20
20
  spec.add_development_dependency "bundler", "~> 1.3"
21
21
  spec.add_development_dependency "rake"
22
+ spec.add_development_dependency "rspec"
23
+ spec.add_development_dependency "guard"
24
+ spec.add_development_dependency "guard-rspec"
25
+
26
+ spec.add_dependency "mail"
27
+ spec.add_dependency "rubyzip"
22
28
  end
@@ -23,19 +23,17 @@ module Eml2Html
23
23
  end
24
24
 
25
25
  def save_txt
26
- print "Saving #{filename(:txt)}..."
27
26
  File.write(filename(:txt), text_body)
28
- puts "done."
29
27
  end
30
28
 
31
29
  def save_html
32
- print "Saving #{filename(:html)}..."
33
30
  File.write(filename(:html), html_body)
34
- puts "done."
31
+ each_attachment do |name, content|
32
+ File.write(name, content)
33
+ end
35
34
  end
36
35
 
37
36
  def save_zip(options = {})
38
- print "Saving #{filename(:zip)}..."
39
37
  Zip::File.open(filename(:zip), Zip::File::CREATE) do |zipfile|
40
38
  if options[:include_html]
41
39
  zipfile.get_output_stream(filename(:html)) do |out|
@@ -55,7 +53,6 @@ module Eml2Html
55
53
  end
56
54
  end
57
55
  end
58
- puts "done."
59
56
  end
60
57
 
61
58
  private
@@ -79,15 +76,23 @@ module Eml2Html
79
76
  end
80
77
 
81
78
  def read_attachments
82
- @attachments = @message.parts.map do |part|
83
- next if part.multipart?
84
- name = part['Content-Type'].to_s.split('; ').last[/^filename="(.*)"$/, 1]
85
- Attachment.new(part.cid, name, part.body.to_s)
79
+ @attachments = @message.parts.flat_map do |part|
80
+ if part.multipart?
81
+ part.parts.map do |part|
82
+ name = part['Content-Type'].filename
83
+ next unless name
84
+ Attachment.new(part.cid, name, part.body.to_s)
85
+ end
86
+ else
87
+ name = part['Content-Type'].filename
88
+ next unless name
89
+ Attachment.new(part.cid, name, part.body.to_s)
90
+ end
86
91
  end.compact
87
92
  end
88
93
 
89
94
  def replace_images_src(html)
90
- html.gsub(/(?<=src=['"])(cid:)([^'"]+)(?=['"])/) do |match|
95
+ html.gsub(/(?<=src=['"])cid:[^'"]+(?=['"])/) do |match|
91
96
  cid = match.sub(/^cid:/, '')
92
97
  @attachments.find{|a| a.cid == cid}.name
93
98
  end
@@ -1,3 +1,3 @@
1
1
  module Eml2Html
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,5 @@
1
+ module FileHelper
2
+ def fixture_path(file)
3
+ File.join(File.dirname(__FILE__), 'fixtures', file)
4
+ end
5
+ end
Binary file
@@ -0,0 +1,234 @@
1
+
2
+ Return-Path: <bartek.bulat@gmail.com>
3
+ Received: from [192.168.1.109] (auh251.neoplus.adsl.tpnet.pl. [83.27.15.251])
4
+ by mx.google.com with ESMTPSA id ge8sm11020637wjc.32.2015.03.29.05.22.18
5
+ for <test@example.com>
6
+ (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
7
+ Sun, 29 Mar 2015 05:22:19 -0700 (PDT)
8
+ Message-ID: <5517EE79.4020202@gmail.com>
9
+ Date: Sun, 29 Mar 2015 14:22:17 +0200
10
+ From: =?UTF-8?B?QmFydMWCb21pZWogQnXFgmF0?= <bartek.bulat@gmail.com>
11
+ User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.5.0
12
+ MIME-Version: 1.0
13
+ To: test@example.com
14
+ Subject: Test
15
+ Content-Type: multipart/alternative;
16
+ boundary="------------090103020906070402090204"
17
+
18
+ This is a multi-part message in MIME format.
19
+ --------------090103020906070402090204
20
+ Content-Type: text/plain; charset=utf-8; format=flowed
21
+ Content-Transfer-Encoding: 7bit
22
+
23
+
24
+ Test email
25
+
26
+ Content
27
+
28
+
29
+ --------------090103020906070402090204
30
+ Content-Type: multipart/related;
31
+ boundary="------------010108060705050006080903"
32
+
33
+
34
+ --------------010108060705050006080903
35
+ Content-Type: text/html; charset=utf-8
36
+ Content-Transfer-Encoding: 7bit
37
+
38
+ <html>
39
+ <head>
40
+
41
+ <meta http-equiv="content-type" content="text/html; charset=utf-8">
42
+ <title>Test</title>
43
+ </head>
44
+ <body bgcolor="#FFFFFF" text="#000000">
45
+ <h1>Test email</h1>
46
+ <p>Content<br>
47
+ </p>
48
+ <img alt="" src="cid:part1.07080309.07070602@gmail.com"
49
+ moz-do-not-send="false" width="256" height="256">
50
+ </body>
51
+ </html>
52
+
53
+ --------------010108060705050006080903
54
+ Content-Type: image/png;
55
+ name="image.png"
56
+ Content-Transfer-Encoding: base64
57
+ Content-ID: <part1.07080309.07070602@gmail.com>
58
+ Content-Disposition: inline;
59
+ filename="image.png"
60
+
61
+ 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
231
+ hPD5zf8HVLpX3k1ZpoQAAAAASUVORK5CYII=
232
+ --------------010108060705050006080903--
233
+
234
+ --------------090103020906070402090204--
@@ -0,0 +1,35 @@
1
+ require 'eml2html/converter'
2
+
3
+ RSpec.describe Eml2Html::Converter do
4
+ around(:each) do |example|
5
+ Dir.mktmpdir do |dir|
6
+ FileUtils.cd(dir) do
7
+ example.run
8
+ end
9
+ end
10
+ end
11
+
12
+ let(:subject) { Eml2Html::Converter.new fixture_path('test.eml') }
13
+
14
+ context "save_txt" do
15
+ it "creates file" do
16
+ subject.save_txt
17
+ expect(File).to exist('test.txt')
18
+ end
19
+ end
20
+
21
+ context "save_html" do
22
+ before { subject.save_html }
23
+
24
+ it { expect(File).to exist('test.html') }
25
+ it { expect(File).to exist('image.png') }
26
+ it { expect(FileUtils).to satisfy { |f| f.identical?('image.png', fixture_path('image.png')) } }
27
+ end
28
+
29
+ context "save_zip" do
30
+ it "creates files" do
31
+ subject.save_zip
32
+ expect(File).to exist('test.zip')
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,93 @@
1
+ require_relative './file_helper'
2
+ # This file was generated by the `rspec --init` command. Conventionally, all
3
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
4
+ # The generated `.rspec` file contains `--require spec_helper` which will cause
5
+ # this file to always be loaded, without a need to explicitly require it in any
6
+ # files.
7
+ #
8
+ # Given that it is always loaded, you are encouraged to keep this file as
9
+ # light-weight as possible. Requiring heavyweight dependencies from this file
10
+ # will add to the boot time of your test suite on EVERY test run, even for an
11
+ # individual file that may not need all of that loaded. Instead, consider making
12
+ # a separate helper file that requires the additional dependencies and performs
13
+ # the additional setup, and require it from the spec files that actually need
14
+ # it.
15
+ #
16
+ # The `.rspec` file also contains a few flags that are not defaults but that
17
+ # users commonly want.
18
+ #
19
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
20
+ RSpec.configure do |config|
21
+ config.include FileHelper
22
+ # rspec-expectations config goes here. You can use an alternate
23
+ # assertion/expectation library such as wrong or the stdlib/minitest
24
+ # assertions if you prefer.
25
+ config.expect_with :rspec do |expectations|
26
+ # This option will default to `true` in RSpec 4. It makes the `description`
27
+ # and `failure_message` of custom matchers include text for helper methods
28
+ # defined using `chain`, e.g.:
29
+ # be_bigger_than(2).and_smaller_than(4).description
30
+ # # => "be bigger than 2 and smaller than 4"
31
+ # ...rather than:
32
+ # # => "be bigger than 2"
33
+ expectations.include_chain_clauses_in_custom_matcher_descriptions = true
34
+ end
35
+
36
+ # rspec-mocks config goes here. You can use an alternate test double
37
+ # library (such as bogus or mocha) by changing the `mock_with` option here.
38
+ config.mock_with :rspec do |mocks|
39
+ # Prevents you from mocking or stubbing a method that does not exist on
40
+ # a real object. This is generally recommended, and will default to
41
+ # `true` in RSpec 4.
42
+ mocks.verify_partial_doubles = true
43
+ end
44
+
45
+ # The settings below are suggested to provide a good initial experience
46
+ # with RSpec, but feel free to customize to your heart's content.
47
+ =begin
48
+ # These two settings work together to allow you to limit a spec run
49
+ # to individual examples or groups you care about by tagging them with
50
+ # `:focus` metadata. When nothing is tagged with `:focus`, all examples
51
+ # get run.
52
+ config.filter_run :focus
53
+ config.run_all_when_everything_filtered = true
54
+
55
+ # Limits the available syntax to the non-monkey patched syntax that is
56
+ # recommended. For more details, see:
57
+ # - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
58
+ # - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
59
+ # - http://myronmars.to/n/dev-blog/2014/05/notable-changes-in-rspec-3#new__config_option_to_disable_rspeccore_monkey_patching
60
+ config.disable_monkey_patching!
61
+
62
+ # This setting enables warnings. It's recommended, but in some cases may
63
+ # be too noisy due to issues in dependencies.
64
+ config.warnings = true
65
+
66
+ # Many RSpec users commonly either run the entire suite or an individual
67
+ # file, and it's useful to allow more verbose output when running an
68
+ # individual spec file.
69
+ if config.files_to_run.one?
70
+ # Use the documentation formatter for detailed output,
71
+ # unless a formatter has already been configured
72
+ # (e.g. via a command-line flag).
73
+ config.default_formatter = 'doc'
74
+ end
75
+
76
+ # Print the 10 slowest examples and example groups at the
77
+ # end of the spec run, to help surface which specs are running
78
+ # particularly slow.
79
+ config.profile_examples = 10
80
+
81
+ # Run specs in random order to surface order dependencies. If you find an
82
+ # order dependency and want to debug it, you can fix the order by providing
83
+ # the seed, which is printed after each run.
84
+ # --seed 1234
85
+ config.order = :random
86
+
87
+ # Seed global randomization in this process using the `--seed` CLI option.
88
+ # Setting this allows you to use `--seed` to deterministically reproduce
89
+ # test failures related to randomization by passing the same `--seed` value
90
+ # as the one that triggered the failure.
91
+ Kernel.srand config.seed
92
+ =end
93
+ end
metadata CHANGED
@@ -1,41 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eml2html
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bartłomiej Bułat
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-25 00:00:00.000000000 Z
11
+ date: 2015-03-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: guard
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: guard-rspec
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: mail
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
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: rubyzip
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
39
109
  - !ruby/object:Gem::Version
40
110
  version: '0'
41
111
  description: eml2html executable for unpacking .eml files into html and attachments
@@ -46,8 +116,10 @@ executables:
46
116
  extensions: []
47
117
  extra_rdoc_files: []
48
118
  files:
49
- - .gitignore
119
+ - ".gitignore"
120
+ - ".rspec"
50
121
  - Gemfile
122
+ - Guardfile
51
123
  - LICENSE
52
124
  - LICENSE.txt
53
125
  - README.md
@@ -57,6 +129,11 @@ files:
57
129
  - lib/eml2html.rb
58
130
  - lib/eml2html/converter.rb
59
131
  - lib/eml2html/version.rb
132
+ - spec/file_helper.rb
133
+ - spec/fixtures/image.png
134
+ - spec/fixtures/test.eml
135
+ - spec/lib/eml2html/converter_spec.rb
136
+ - spec/spec_helper.rb
60
137
  homepage: https://github.com/barthez/eml2html
61
138
  licenses:
62
139
  - MIT
@@ -67,17 +144,17 @@ require_paths:
67
144
  - lib
68
145
  required_ruby_version: !ruby/object:Gem::Requirement
69
146
  requirements:
70
- - - ! '>='
147
+ - - ">="
71
148
  - !ruby/object:Gem::Version
72
149
  version: '0'
73
150
  required_rubygems_version: !ruby/object:Gem::Requirement
74
151
  requirements:
75
- - - ! '>='
152
+ - - ">="
76
153
  - !ruby/object:Gem::Version
77
154
  version: '0'
78
155
  requirements: []
79
156
  rubyforge_project:
80
- rubygems_version: 2.4.4
157
+ rubygems_version: 2.4.5
81
158
  signing_key:
82
159
  specification_version: 4
83
160
  summary: eml2html executable for unpacking .eml files into html and attachments