eml2html 0.0.1 → 0.0.2

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 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