mime_builder 0.0.1

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: e1b242e017dbe6bc717e94d6ef217bab7a7ff6d2
4
+ data.tar.gz: fefd7653cf050420e71d3f1434376a8793a9759b
5
+ SHA512:
6
+ metadata.gz: 1f7e5c60b154659606764c9fb73cf333c194e0aec35ca931a37e292a16f4188b01907ad88e7efdeb6bf1b0088600150b0bb3cf947626804f6fda31d1c2fcf2ea
7
+ data.tar.gz: 1e9ff54c3742e05f4be0ddfa5ee9fa2efd9b6cc64b38f19c0d81ff513a4d1b009dd6015e3f17e9860ceaaaf4322a4040e8a1739870dd33ebe986b19ab4bc0319
data/CHANGELOG.md ADDED
@@ -0,0 +1,4 @@
1
+ CHANGELOG
2
+ ---------
3
+ - **2016-01-23**: 0.0.1
4
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source ENV['GEM_SOURCE'] || 'https://rubygems.org'
2
+
3
+ gem 'coveralls'
4
+ gem 'mime'
5
+ gem 'mime-types'
6
+ gem 'mocha'
7
+ gem 'rake'
8
+ gem 'simplecov'
9
+ gem 'test-unit'
data/Gemfile.lock ADDED
@@ -0,0 +1,53 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ coveralls (0.8.1)
5
+ json (~> 1.8)
6
+ rest-client (>= 1.6.8, < 2)
7
+ simplecov (~> 0.10.0)
8
+ term-ansicolor (~> 1.3)
9
+ thor (~> 0.19.1)
10
+ docile (1.1.5)
11
+ domain_name (0.5.24)
12
+ unf (>= 0.0.5, < 1.0.0)
13
+ http-cookie (1.0.2)
14
+ domain_name (~> 0.5)
15
+ json (1.8.3)
16
+ metaclass (0.0.4)
17
+ mime (0.4.2)
18
+ mime-types (2.6.2)
19
+ mocha (1.1.0)
20
+ metaclass (~> 0.0.1)
21
+ netrc (0.10.3)
22
+ power_assert (0.2.4)
23
+ rake (10.4.2)
24
+ rest-client (1.8.0)
25
+ http-cookie (>= 1.0.2, < 2.0)
26
+ mime-types (>= 1.16, < 3.0)
27
+ netrc (~> 0.7)
28
+ simplecov (0.10.0)
29
+ docile (~> 1.1.0)
30
+ json (~> 1.8)
31
+ simplecov-html (~> 0.10.0)
32
+ simplecov-html (0.10.0)
33
+ term-ansicolor (1.3.0)
34
+ tins (~> 1.0)
35
+ test-unit (3.1.4)
36
+ power_assert
37
+ thor (0.19.1)
38
+ tins (1.5.2)
39
+ unf (0.1.4)
40
+ unf_ext
41
+ unf_ext (0.0.7.1)
42
+
43
+ PLATFORMS
44
+ ruby
45
+
46
+ DEPENDENCIES
47
+ coveralls
48
+ mime
49
+ mime-types
50
+ mocha
51
+ rake
52
+ simplecov
53
+ test-unit
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 John Wang
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,92 @@
1
+ MIMEBuilder Ruby
2
+ ================
3
+
4
+ [![Gem Version][gem-version-svg]][gem-version-link]
5
+ [![Build Status][build-status-svg]][build-status-link]
6
+ [![Coverage Status][coverage-status-svg]][coverage-status-link]
7
+ [![Dependency Status][dependency-status-svg]][dependency-status-link]
8
+ [![Code Climate][codeclimate-status-svg]][codeclimate-status-link]
9
+ [![Scrutinizer Code Quality][scrutinizer-status-svg]][scrutinizer-status-link]
10
+ [![Downloads][downloads-svg]][downloads-link]
11
+ [![Docs][docs-rubydoc-svg]][docs-rubydoc-link]
12
+ [![License][license-svg]][license-link]
13
+
14
+ ## Overview
15
+
16
+ This library creates `mime` parts from limited information.
17
+
18
+ ## Usage
19
+
20
+ ### From Filepath
21
+
22
+ ```ruby
23
+ builder = MIMEBuilder::Filepath('/path/to/file')
24
+ mime_part = builder.mime
25
+ ```
26
+
27
+ Options:
28
+
29
+ ```ruby
30
+ builder = MIMEBuilder::Filepath(
31
+ '/path/to/file',
32
+ {
33
+ :base64_encode => true, # base64 encode part
34
+ :content_id_disable => true, # remove auto-generated Content-Id header
35
+ :content_type => 'text/plain', # override auto-generated Content-Type
36
+ :is_attachment => true # add 'attachment' disposition
37
+ }
38
+ )
39
+ ```
40
+
41
+ ### From String
42
+
43
+ ```ruby
44
+ builder = MIMEBuilder::Filepath('Hi there!')
45
+ mime_part = builder.mime
46
+ ```
47
+
48
+ Options:
49
+
50
+ ```ruby
51
+ builder = MIMEBuilder::Filepath(
52
+ 'Hi there!',
53
+ {
54
+ :content_id_disable => true, # remove auto-generated Content-Id header
55
+ }
56
+ )
57
+ ```
58
+
59
+ ## Change Log
60
+
61
+ See [CHANGELOG.md](CHANGELOG.md)
62
+
63
+ ## Contributions
64
+
65
+ Any reports of problems, comments or suggestions are most welcome.
66
+
67
+ Please report these on [Github](https://github.com/grokify/mime-builder-ruby)
68
+
69
+ ## License
70
+
71
+ MIMEBuilder is available under an MIT-style license. See [LICENSE.txt](LICENSE.txt) for details.
72
+
73
+ MIMEBuilder &copy; 2016 by John Wang
74
+
75
+ [gem-version-svg]: https://badge.fury.io/rb/mime_builder.svg
76
+ [gem-version-link]: http://badge.fury.io/rb/mime_builder
77
+ [downloads-svg]: http://ruby-gem-downloads-badge.herokuapp.com/mime_builder
78
+ [downloads-link]: https://rubygems.org/gems/mime_builder
79
+ [build-status-svg]: https://api.travis-ci.org/grokify/mime-builder-ruby.svg?branch=master
80
+ [build-status-link]: https://travis-ci.org/grokify/mime-builder-ruby
81
+ [coverage-status-svg]: https://coveralls.io/repos/grokify/mime-builder-ruby/badge.svg?branch=master
82
+ [coverage-status-link]: https://coveralls.io/r/grokify/mime-builder-ruby?branch=master
83
+ [dependency-status-svg]: https://gemnasium.com/grokify/mime-builder-ruby.svg
84
+ [dependency-status-link]: https://gemnasium.com/grokify/mime-builder-ruby
85
+ [codeclimate-status-svg]: https://codeclimate.com/github/grokify/mime-builder-ruby/badges/gpa.svg
86
+ [codeclimate-status-link]: https://codeclimate.com/github/grokify/mime-builder-ruby
87
+ [scrutinizer-status-svg]: https://scrutinizer-ci.com/g/grokify/mime-builder-ruby/badges/quality-score.png?b=master
88
+ [scrutinizer-status-link]: https://scrutinizer-ci.com/g/grokify/mime-builder-ruby/?branch=master
89
+ [docs-rubydoc-svg]: https://img.shields.io/badge/docs-rubydoc-blue.svg
90
+ [docs-rubydoc-link]: http://www.rubydoc.info/gems/mime_builder/
91
+ [license-svg]: https://img.shields.io/badge/license-MIT-blue.svg
92
+ [license-link]: https://github.com/grokify/mime-builder-ruby/blob/master/LICENSE.txt
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+
4
+ desc 'Default: run unit tests.'
5
+ task :default => :test
6
+
7
+ desc 'Test the library.'
8
+ Rake::TestTask.new do |t|
9
+ t.libs << 'lib'
10
+ t.pattern = 'test/**/test_*.rb'
11
+ t.verbose = false
12
+ end
13
+
14
+ desc 'Generate YARD documentation.'
15
+ task :gendoc do
16
+ # puts 'yard doc generation disabled until JRuby build native
17
+ # extensions for redcarpet or yard removes the dependency.'
18
+ system 'yardoc'
19
+ system 'yard stats --list-undoc'
20
+ end
@@ -0,0 +1,6 @@
1
+ module MIMEBuilder
2
+ VERSION = '0.0.1'
3
+
4
+ autoload :Filepath, 'mime_builder/file'
5
+ autoload :Text, 'mime_builder/text'
6
+ end
@@ -0,0 +1,76 @@
1
+ require 'base64'
2
+ require 'mime'
3
+ require 'mime/types'
4
+
5
+ module MIMEBuilder
6
+ class Filepath
7
+ attr_accessor :mime
8
+ attr_accessor :filepath
9
+
10
+ # {:base64_encode bool, :content_type string, :content_id_disable bool}
11
+ def initialize(filepath, opts = {})
12
+ if opts.key?(:base64_encode) && opts[:base64_encode]
13
+ @base64_encode = true
14
+ else
15
+ @base64_encode = false
16
+ end
17
+
18
+ @mime = create_mime(filepath, opts[:content_id_disable])
19
+
20
+ @mime.headers.set(
21
+ 'Content-Type',
22
+ get_file_content_type(filepath, opts[:content_type]))
23
+
24
+ set_attachment_content_disposition(filepath, opts[:is_attachment])
25
+ end
26
+
27
+ def create_mime(filepath, content_id_disable)
28
+ bytes = read_file_bytes(filepath)
29
+
30
+ mime = nil
31
+
32
+ if @base64_encode
33
+ mime = MIME::Text.new(Base64.encode64(bytes))
34
+ mime.headers.set('Content-Transfer-Encoding', 'base64')
35
+ else
36
+ mime = MIME::Application.new(bytes)
37
+ end
38
+
39
+ mime.headers.delete('Content-Id') if content_id_disable
40
+
41
+ mime
42
+ end
43
+
44
+ def read_file_bytes(filepath = nil)
45
+ unless File.file?(filepath)
46
+ fail "File \"#{filepath}\" does not exist or cannot be read"
47
+ end
48
+
49
+ #File.open(filepath, 'rb:BINARY') { |f| f.read }
50
+ File.read(filepath)
51
+ end
52
+
53
+ def get_file_content_type(filepath = nil, content_type = nil)
54
+ if content_type.is_a?(String) && content_type =~ %r{^[^/\s]+/[^/\s]+}
55
+ return content_type
56
+ end
57
+ MIME::Types.type_for(filepath).first.content_type \
58
+ || 'application/octet-stream'
59
+ end
60
+
61
+ def set_attachment_content_disposition(filepath, is_attachment)
62
+ @mime.headers.set(
63
+ 'Content-Disposition',
64
+ get_attachment_content_disposition(filepath)
65
+ ) if is_attachment
66
+ end
67
+
68
+ def get_attachment_content_disposition(filepath = nil)
69
+ filename = File.basename(filepath.to_s)
70
+ if filename.is_a?(String) && filename.length > 0
71
+ return "attachment; filename=\"#{filename}\""
72
+ end
73
+ 'attachment'
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,15 @@
1
+ require 'mime'
2
+
3
+ module MIMEBuilder
4
+ class Text
5
+ attr_accessor :mime
6
+ attr_accessor :text
7
+
8
+ def initialize(text, opts = {})
9
+ @text = text
10
+ @mime = MIME::Text.new(text, 'plain')
11
+ @mime.headers.delete('Content-Id') \
12
+ if opts.key?(:content_id_disable) && opts[:content_id_disable]
13
+ end
14
+ end
15
+ end
data/test/test_base.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'coveralls'
2
+ Coveralls.wear!
3
+
4
+ require 'test/unit'
5
+ require 'mocha/test_unit'
6
+ require 'mime_builder'
Binary file
data/test/test_file.rb ADDED
@@ -0,0 +1,65 @@
1
+ require './test/test_base.rb'
2
+
3
+ class MIMEBuilderFileTest < Test::Unit::TestCase
4
+
5
+ def test_file_one
6
+ #assert_equal "bXlfYXBwX2tleTpteV9hcHBfc2VjcmV0", @rcsdk.send(:get_api_key)
7
+ end
8
+
9
+ def test_basic
10
+ filepath = './test/test_file.pdf'
11
+ filename = 'test_file.pdf'
12
+
13
+ filepart = MIMEBuilder::Filepath.new(filepath)
14
+
15
+ assert_equal 'application/pdf', filepart.get_file_content_type(filepath)
16
+ assert_equal 'application/pdf', filepart.mime.headers.get('Content-Type')
17
+
18
+ assert_equal 'attachment', filepart.get_attachment_content_disposition()
19
+ assert_equal 'attachment; filename="test_file.pdf"', filepart.get_attachment_content_disposition(filename)
20
+ assert_equal 'attachment; filename="test_file.pdf"', filepart.get_attachment_content_disposition(filepath)
21
+ end
22
+
23
+ def test_base64
24
+ filepath = './test/test_file.pdf'
25
+ filename = 'test_file.pdf'
26
+
27
+ filepart = MIMEBuilder::Filepath.new(filepath, {:base64_encode => true})
28
+
29
+ assert_equal 'application/pdf', filepart.get_file_content_type(filepath)
30
+ assert_equal 'application/pdf', filepart.mime.headers.get('Content-Type')
31
+
32
+ assert_equal 'base64', filepart.mime.headers.get('Content-Transfer-Encoding')
33
+ end
34
+
35
+ def test_content_type
36
+ filepath = './test/test_file.pdf'
37
+ filename = 'test_file.pdf'
38
+
39
+ filepart = MIMEBuilder::Filepath.new(filepath, {:content_type => 'application/pdf'})
40
+
41
+ assert_equal 'application/pdf', filepart.get_file_content_type(filepath)
42
+ assert_equal 'application/pdf', filepart.mime.headers.get('Content-Type')
43
+
44
+ assert_equal 'attachment', filepart.get_attachment_content_disposition()
45
+ assert_equal 'attachment; filename="test_file.pdf"', filepart.get_attachment_content_disposition(filename)
46
+ assert_equal 'attachment; filename="test_file.pdf"', filepart.get_attachment_content_disposition(filepath)
47
+ end
48
+
49
+ def test_attachment
50
+ filepath = './test/test_file.pdf'
51
+ filename = 'test_file.pdf'
52
+
53
+ filepart = MIMEBuilder::Filepath.new(filepath, {:is_attachment => true})
54
+
55
+ assert_equal 'attachment; filename="test_file.pdf"', filepart.mime.headers.get('Content-Disposition')
56
+ end
57
+
58
+ def test_nonexistent_file
59
+ filepath = './test/test_file_nonexistent.pdf'
60
+
61
+ assert_raise do
62
+ filepart = MIMEBuilder::Filepath.new(filepath)
63
+ end
64
+ end
65
+ end
data/test/test_text.rb ADDED
@@ -0,0 +1,19 @@
1
+ require './test/test_base.rb'
2
+
3
+ class MIMEBuilderTextTest < Test::Unit::TestCase
4
+
5
+ def test_file_one
6
+ #assert_equal "bXlfYXBwX2tleTpteV9hcHBfc2VjcmV0", @rcsdk.send(:get_api_key)
7
+ end
8
+
9
+ def test_contenttype
10
+ test_text = 'Hello world!'
11
+
12
+ filepart = MIMEBuilder::Text.new(test_text)
13
+
14
+ assert_equal 'text/plain', filepart.mime.headers.get('Content-Type')
15
+
16
+ assert_equal test_text, filepart.mime.body.to_s
17
+ end
18
+
19
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: mime_builder
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - John Wang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-01-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mime
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: mime-types
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '1.25'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '1.25'
41
+ description: Helper library to build MIME parts
42
+ email: johncwang@gmail.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - lib/mime_builder/file.rb
48
+ - lib/mime_builder/text.rb
49
+ - lib/mime_builder.rb
50
+ - CHANGELOG.md
51
+ - Gemfile
52
+ - Gemfile.lock
53
+ - LICENSE.txt
54
+ - Rakefile
55
+ - README.md
56
+ - test/test_base.rb
57
+ - test/test_file.pdf
58
+ - test/test_file.rb
59
+ - test/test_text.rb
60
+ homepage: https://github.com/grokify/
61
+ licenses:
62
+ - MIT
63
+ metadata: {}
64
+ post_install_message:
65
+ rdoc_options: []
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - '>='
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements: []
79
+ rubyforge_project:
80
+ rubygems_version: 2.1.5
81
+ signing_key:
82
+ specification_version: 4
83
+ summary: MIME Builder is a helper to build MIME parts
84
+ test_files: []