multi_mime 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.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ M2VlZmY3YTAyZmVhMjJmMDQ0YzEyNzE1YzU3MjAyN2Y4NjY3NjM4Nw==
5
+ data.tar.gz: !binary |-
6
+ ODI2MmFkMzNlMzVjZDY5MGI4YjA2ZTY0ZTQyZDMxMzk5ZTc0ZWQ3OQ==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ YzE5YmNkMzNhZmU4N2Y1MTcwZGM4MTcyNzYzMDljNzZiMzk5MWEzMGE0NjYx
10
+ MjBkNzkzN2E4MWEwMmMxOGJiNmYxZjkyZjAwZWMyMDM3NDFlZmM2ZmMwMjg3
11
+ NjY1ZjcxOTdkZWNhZDBkZjQ5MDE1Y2E3MTg3ZjYzYTRjOWVkMzM=
12
+ data.tar.gz: !binary |-
13
+ NjRmOThkMTA1MzkzN2EwODgwMjA0NTJhNWNlYTU4OWZkMzEwMWRiZjJkNWU1
14
+ MWExZDA2Y2U2MzNjMDc0MjE4YzU1OTQ0MmJhZDNmOTg0NmEzZWJhN2NhNDNm
15
+ NDZiOGYxYzFiMGNkZTEwZThhZTQ5ZjQ0MGJlZGViNmViN2Y4MTQ=
@@ -0,0 +1,3 @@
1
+ LICENSE.md
2
+ README.md
3
+ lib/**/*.rb
@@ -0,0 +1,19 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ coverage
6
+ InstalledFiles
7
+ lib/bundler/man
8
+ pkg
9
+ rdoc
10
+ spec/reports
11
+ test/tmp
12
+ test/version_tmp
13
+ tmp
14
+ *.lock
15
+
16
+ # YARD artifacts
17
+ .yardoc
18
+ _yardoc
19
+ doc/
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --order random
3
+ --format RSpec::Smart::Formatter
@@ -0,0 +1,17 @@
1
+ bundler_args: --without development
2
+ language: ruby
3
+ rvm:
4
+ - rbx-18mode
5
+ - rbx-19mode
6
+ - jruby-18mode
7
+ - jruby-19mode
8
+ - 1.8.7
9
+ - 1.9.2
10
+ - 1.9.3
11
+ - 2.0.0
12
+ matrix:
13
+ allow_failures:
14
+ - rvm: rbx-18mode
15
+ - rvm: jruby-18mode
16
+ - rvm: 1.8.7
17
+ - rvm: rbx-19mode
@@ -0,0 +1,6 @@
1
+ --markup markdown
2
+ -
3
+ CHANGELOG.md
4
+ CONTRIBUTING.md
5
+ LICENSE.md
6
+ README.md
File without changes
@@ -0,0 +1,46 @@
1
+ ## Contributing
2
+ In the spirit of [free software][free-sw], **everyone** is encouraged to help
3
+ improve this project.
4
+
5
+ [free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
6
+
7
+ Here are some ways *you* can contribute:
8
+
9
+ * by using alpha, beta, and prerelease versions
10
+ * by reporting bugs
11
+ * by suggesting new features
12
+ * by writing or editing documentation
13
+ * by writing specifications
14
+ * by writing code (**no patch is too small**: fix typos, add comments, clean up
15
+ inconsistent whitespace)
16
+ * by refactoring code
17
+ * by closing [issues][]
18
+ * by reviewing patches
19
+
20
+ [issues]: https://github.com/karlfreeman/multi_mime/issues
21
+
22
+ ## Submitting an Issue
23
+ We use the [GitHub issue tracker][issues] to track bugs and features. Before
24
+ submitting a bug report or feature request, check to make sure it hasn't
25
+ already been submitted. When submitting a bug report, please include a [Gist][]
26
+ that includes a stack trace and any details that may be necessary to reproduce
27
+ the bug, including your gem version, Ruby version, and operating system.
28
+ Ideally, a bug report should include a pull request with failing specs.
29
+
30
+ [gist]: https://gist.github.com/
31
+
32
+ ## Submitting a Pull Request
33
+ 1. [Fork the repository.][fork]
34
+ 2. [Create a topic branch.][branch]
35
+ 3. Add specs for your unimplemented feature or bug fix.
36
+ 4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
37
+ 5. Implement your feature or bug fix.
38
+ 6. Run `bundle exec rake spec`. If your specs fail, return to step 5.
39
+ 7. Run `open coverage/index.html`. If your changes are not completely covered
40
+ by your tests, return to step 3.
41
+ 8. Add, commit, and push your changes.
42
+ 9. [Submit a pull request.][pr]
43
+
44
+ [fork]: http://help.github.com/fork-a-repo/
45
+ [branch]: http://learn.github.com/p/branching.html
46
+ [pr]: http://help.github.com/send-pull-requests/
data/Gemfile ADDED
@@ -0,0 +1,34 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem "rake", ">= 1.2"
4
+ gem "yard"
5
+
6
+ # platforms :ruby_18 do
7
+ # end
8
+ # platforms :ruby, :mswin, :mingw do
9
+ # end
10
+ # platforms :jruby do
11
+ # end
12
+
13
+ gem "mime-types", :require => false
14
+ gem "actionpack", ">= 3.2", :require => false
15
+ gem "rack", :require => false
16
+ gem "mimemagic", :require => false
17
+
18
+ group :development do
19
+ gem "kramdown", ">= 0.14"
20
+ gem "pry"
21
+ gem "pry-debugger", :platforms => :mri_19
22
+ gem "awesome_print"
23
+ end
24
+
25
+ group :test do
26
+ gem "rspec"
27
+ gem "rspec-smart-formatter"
28
+ gem "fakefs", :git => "https://github.com/defunkt/fakefs.git", :require => "fakefs/safe"
29
+ gem "simplecov", :require => false
30
+ gem "coveralls", :require => false
31
+ gem "cane", :require => false, :platforms => :ruby_19
32
+ end
33
+
34
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Karl Freeman
2
+
3
+ MIT License
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.
@@ -0,0 +1,68 @@
1
+ # MultiMime
2
+
3
+ A generic swappable back-end for Mime Type detection
4
+
5
+ Lots of Ruby libraries utilize Mime Type detection in some form. In order to best support multiple Mime Type detection libraries, `multi_mime` is a general-purpose swappable Mime Type detection backend library.
6
+
7
+ ## Features / Usage Examples
8
+
9
+ ```ruby
10
+ require "multi_mime"
11
+
12
+ MultiMime.type_for("text/html") # "text/html"
13
+ # alias :by_type
14
+
15
+ MultiMime.type_for_extension(".html") # "text/html"
16
+ # alias :by_extension
17
+
18
+ MultiMime.type_for_path("/usr/local/foo/bar/foo.html") # "text/html"
19
+ # alias :by_path
20
+
21
+ MultiMime.type_for_file( File.open("foo.html", "w") ) # "text/html"
22
+ # alias :by_file
23
+ ```
24
+
25
+ ## Build & Dependency Status
26
+
27
+ [![Gem Version](https://badge.fury.io/rb/multi_mime.png)][gem]
28
+ [![Build Status](https://travis-ci.org/karlfreeman/multi_mime.png)][travis]
29
+ [![Dependency Status](https://gemnasium.com/karlfreeman/multi_mime.png?travis)][gemnasium]
30
+ [![Code Quality](https://codeclimate.com/github/karlfreeman/multi_mime.png)][codeclimate]
31
+ [![Coverage Status](https://coveralls.io/repos/karlfreeman/multi_mime/badge.png?branch=master)][coveralls]
32
+
33
+ ## Supported Mime Engines
34
+
35
+ * [MIME::Types](https://github.com/halostatue/mime-types)
36
+ * [MagicMime](https://github.com/minad/mimemagic)
37
+ * [Rails](http://api.rubyonrails.org/classes/Mime/Type.html) ( ActionDispatch::Http::Mime )
38
+ * [Rack](http://rack.rubyforge.org/doc/Rack/Mime.html) ( Rack::Mime )
39
+
40
+ ## Supported Ruby Versions
41
+ This library aims to support and is [tested against][travis] the following Ruby
42
+ implementations:
43
+
44
+ * Ruby 1.9.2
45
+ * Ruby 1.9.3
46
+ * Ruby 2.0.0
47
+ * [JRuby][]
48
+ * [Rubinius][]
49
+
50
+ # Credits
51
+
52
+ Inspiration:
53
+
54
+ * [MultiJSON](https://github.com/intridea/multi_json)
55
+ * [MultiXML](https://github.com/sferik/multi_xml)
56
+
57
+ Cribbed:
58
+
59
+ * [MultiJSON](https://github.com/intridea/multi_json)
60
+ * [Asset_Sync"s MultiMime module](https://github.com/rumblelabs/asset_sync/commit/9333bd01ae1a7cf2ffa046b8390fbc4165c38030)
61
+
62
+ [gem]: https://rubygems.org/gems/multi_mime
63
+ [travis]: http://travis-ci.org/karlfreeman/multi_mime
64
+ [gemnasium]: https://gemnasium.com/karlfreeman/multi_mime
65
+ [coveralls]: https://coveralls.io/r/karlfreeman/multi_mime
66
+ [codeclimate]: https://codeclimate.com/github/karlfreeman/multi_mime
67
+ [jruby]: http://www.jruby.org
68
+ [rubinius]: http://rubini.us
@@ -0,0 +1,27 @@
1
+ require "bundler"
2
+ Bundler.setup
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ require "yard"
6
+ YARD::Rake::YardocTask.new
7
+
8
+ require "rspec/core/rake_task"
9
+ desc "Run all examples"
10
+ RSpec::Core::RakeTask.new(:spec)
11
+
12
+ begin
13
+ require "cane/rake_task"
14
+ namespace :metric do
15
+ desc "Analyze for code quality"
16
+ Cane::RakeTask.new(:quality) do |cane|
17
+ cane.abc_max = 27
18
+ cane.no_doc = true
19
+ cane.style_measure = 200
20
+ end
21
+ end
22
+ rescue LoadError
23
+ warn "Cane is not available, metric:quality task not provided."
24
+ end
25
+
26
+ task :default => :spec
27
+ task :test => :spec
@@ -0,0 +1,142 @@
1
+ module MultiMime
2
+ extend self
3
+
4
+ REQUIREMENT_MAP = [
5
+ ["mime/types", :mime_types],
6
+ ["mimemagic", :mimemagic],
7
+ ["action_dispatch/http/mime_type", :mime_type],
8
+ ["rack/mime", :rack_mime]
9
+ ]
10
+
11
+ # The default adapter based on what you currently
12
+ # have loaded and installed. First checks to see
13
+ # if any adapters are already loaded, then checks
14
+ # to see which are installed if none are loaded.
15
+ def default_adapter
16
+ return :mime_types if defined?(::MIME::Types)
17
+ return :mimemagic if defined?(::MimeMagic)
18
+ return :mime_type if defined?(::Mime::Type)
19
+ return :rack_mime if defined?(::Rack::Mime)
20
+
21
+ REQUIREMENT_MAP.each do |library, adapter|
22
+ begin
23
+ require library
24
+ return adapter
25
+ rescue ::LoadError
26
+ next
27
+ end
28
+ end
29
+
30
+ Kernel.warn "[WARNING] MultiMime hasn't been able to detect an adapter"
31
+
32
+ nil
33
+
34
+ end
35
+
36
+ # Get the current adapter class.
37
+ def adapter
38
+ return @adapter if defined?(@adapter) && @adapter
39
+ self.use default_adapter # load default adapter
40
+ @adapter
41
+ end
42
+
43
+ # Set the Mime parser utilizing a symbol, string, or class.
44
+ #
45
+ # @param [Symbol, String, Class] new_adapter
46
+ # * mime_types
47
+ # * mimemagic
48
+ # * mime_type
49
+ # * rack_mime
50
+ def use(new_adapter)
51
+ @adapter = load_adapter(new_adapter)
52
+ end
53
+ alias :adapter= :use
54
+
55
+
56
+ # Get mime type by mime type
57
+ #
58
+ # @param [String] mime_type The mime_type to determine against
59
+ # @param [Hash] opts
60
+ # * adapter [String] If set, the selected adapter will be used for this call.
61
+ # @return [String] Mime type
62
+ def type_for(mime_type, opts={})
63
+ raise ArgumentError, "Mime Type must be a String. #{mime_type.inspect} given." unless mime_type.is_a? String
64
+ adapter = current_adapter(opts)
65
+ adapter.type_for(mime_type, opts)
66
+ end
67
+ alias :by_type :type_for
68
+
69
+ # Get mime type by extension
70
+ #
71
+ # @param [String] extension The extension to determine against
72
+ # @param [Hash] opts
73
+ # * adapter [String] If set, the selected adapter will be used for this call.
74
+ # @return [String] Mime type
75
+ def type_for_extension(extension, opts={})
76
+ raise ArgumentError, "Extension must be a String. #{extension.inspect} given." unless extension.is_a? String
77
+ adapter = current_adapter(opts)
78
+ adapter.type_for_extension(extension, opts)
79
+ end
80
+ alias :by_extension :type_for_extension
81
+
82
+ # Get mime type by path
83
+ #
84
+ # @param [String] path The path to determine against
85
+ # @param [Hash] opts
86
+ # * adapter [String] If set, the selected adapter will be used for this call.
87
+ # @return [String] Mime type
88
+ def type_for_path(path, opts={})
89
+ raise ArgumentError, "Path must be a String. #{path.inspect} given." unless path.is_a? String
90
+ adapter = current_adapter(opts)
91
+ adapter.type_for_path(path, opts)
92
+ end
93
+ alias :by_path :type_for_path
94
+
95
+ # Get mime type by file
96
+ #
97
+ # @param [File] file The file to determine against
98
+ # @param [Hash] opts
99
+ # * adapter [String] If set, the selected adapter will be used for this call.
100
+ # @return [String] Mime type
101
+ def type_for_file(file, opts={})
102
+ raise ArgumentError, "File must be a File. #{file.inspect} given." unless file.is_a? File
103
+ adapter = current_adapter(opts)
104
+ adapter.type_for_file(file, opts)
105
+ end
106
+ alias :by_file :type_for_file
107
+
108
+ private
109
+
110
+ #
111
+ def current_adapter(opts={})
112
+ if new_adapter = opts.delete(:adapter)
113
+ load_adapter(new_adapter)
114
+ else
115
+ self.adapter
116
+ end
117
+ end
118
+
119
+ #
120
+ def load_adapter(new_adapter)
121
+ case new_adapter
122
+ when String, Symbol
123
+ require "multi_mime/adapters/#{new_adapter}"
124
+ MultiMime::Adapters.const_get(:"#{new_adapter.to_s.split("_").map{|s| s.capitalize}.join("")}")
125
+ when NilClass, FalseClass
126
+ load_adapter self.default_adapter
127
+ when Class, Module
128
+ new_adapter
129
+ else
130
+ raise "Did not recognize your adapter specification. Please specify either a symbol or a class."
131
+ end
132
+ end
133
+
134
+ #
135
+ def with_adapter(new_adapter)
136
+ old_adapter, self.adapter = adapter, new_adapter
137
+ yield
138
+ ensure
139
+ self.adapter = old_adapter
140
+ end
141
+
142
+ end
@@ -0,0 +1,30 @@
1
+ require "singleton"
2
+
3
+ module MultiMime
4
+ class Adapter
5
+ include Singleton
6
+ class << self
7
+
8
+ #
9
+ def type_for(mime_type, opts={})
10
+ instance.type_for(mime_type, opts)
11
+ end
12
+
13
+ #
14
+ def type_for_extension(extension, opts={})
15
+ instance.type_for_extension(extension, opts)
16
+ end
17
+
18
+ #
19
+ def type_for_path(path, opts={})
20
+ instance.type_for_path(path, opts)
21
+ end
22
+
23
+ #
24
+ def type_for_file(file, opts={})
25
+ instance.type_for_file(file, opts)
26
+ end
27
+
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,35 @@
1
+ require "action_dispatch/http/mime_type" unless defined?(::Mime::Type)
2
+ require "multi_mime/adapter"
3
+ require "multi_mime/null_type"
4
+
5
+ module MultiMime
6
+ module Adapters
7
+
8
+ # Use the Mime::Type library
9
+ class MimeType < Adapter
10
+
11
+ #
12
+ def type_for(mime_type, opts={})
13
+ ::Mime::Type.parse_data_with_trailing_star(mime_type).first || MultiMime::NullType.new
14
+ end
15
+
16
+ #
17
+ def type_for_extension(extension, opts={})
18
+ extension = extension[/(?:.*\.)(.*$)/, 1] if extension.include?(".") # requires just the extension, without the dot
19
+ ::Mime::Type.lookup_by_extension(extension) || MultiMime::NullType.new
20
+ end
21
+
22
+ #
23
+ def type_for_path(path, opts={})
24
+ type_for_extension(File.extname(path))
25
+ end
26
+
27
+ #
28
+ def type_for_file(file, opts={})
29
+ type_for_extension(File.extname(file))
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,34 @@
1
+ require "mime/types" unless defined?(::MIME::Types)
2
+ require "multi_mime/adapter"
3
+ require "multi_mime/null_type"
4
+
5
+ module MultiMime
6
+ module Adapters
7
+
8
+ # Use the MIME::Types library
9
+ class MimeTypes < Adapter
10
+
11
+ #
12
+ def type_for(mime_type, opts={})
13
+ ::MIME::Types[mime_type].first || MultiMime::NullType.new
14
+ end
15
+
16
+ #
17
+ def type_for_extension(extension, opts={})
18
+ ::MIME::Types.type_for(extension).first || MultiMime::NullType.new
19
+ end
20
+
21
+ #
22
+ def type_for_path(path, opts={})
23
+ type_for_extension(File.extname(path))
24
+ end
25
+
26
+ #
27
+ def type_for_file(file, opts={})
28
+ type_for_extension(File.extname(file))
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,35 @@
1
+ require "mimemagic" unless defined?(::Mimemagic)
2
+ require "multi_mime/adapter"
3
+ require "multi_mime/null_type"
4
+
5
+ module MultiMime
6
+ module Adapters
7
+
8
+ # Use the Mimemagic library
9
+ class Mimemagic < Adapter
10
+
11
+ #
12
+ def type_for(mime_type, opts={})
13
+ type = ::MimeMagic::EXTENSIONS.key(mime_type) # Mimemagic actually doesnt allow you to simply verify that a mime type exists
14
+ type ? mime_type : MultiMime::NullType.new
15
+ end
16
+
17
+ #
18
+ def type_for_extension(extension, opts={})
19
+ ::MimeMagic.by_extension(extension) || MultiMime::NullType.new
20
+ end
21
+
22
+ #
23
+ def type_for_path(path, opts={})
24
+ type_for_extension(File.extname(path))
25
+ end
26
+
27
+ #
28
+ def type_for_file(file, opts={})
29
+ type_for_extension(File.extname(file))
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,36 @@
1
+ require "rack/mime" unless defined?(::Rack::Mime)
2
+ require "multi_mime/adapter"
3
+ require "multi_mime/null_type"
4
+
5
+ module MultiMime
6
+ module Adapters
7
+
8
+ # Use the Rack::Mime library
9
+ class RackMime < Adapter
10
+
11
+ #
12
+ def type_for(mime_type, opts={})
13
+ type = ::Rack::Mime::MIME_TYPES.key(mime_type) # Rack::Mime actually doesnt allow you to simply verify that a mime type exists
14
+ type ? mime_type : MultiMime::NullType.new
15
+ end
16
+
17
+ #
18
+ def type_for_extension(extension, opts={})
19
+ extension.insert(0, ".") unless extension[0] == "." # requires the extension with a dot
20
+ ::Rack::Mime.mime_type(extension, MultiMime::NullType.new) # set the fallback to nil
21
+ end
22
+
23
+ #
24
+ def type_for_path(path, opts={})
25
+ type_for_extension(File.extname(path))
26
+ end
27
+
28
+ #
29
+ def type_for_file(file, opts={})
30
+ type_for_extension(File.extname(file))
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,17 @@
1
+ module MultiMime
2
+ class NullType
3
+
4
+ #
5
+ def nil?
6
+ true
7
+ end
8
+
9
+ private
10
+
11
+ #
12
+ def method_missing(method, *args)
13
+ false if method.to_s[-1, 1] == "?"
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,3 @@
1
+ module MultiMime
2
+ VERSION = "0.0.2" unless defined?(MultiMime::VERSION)
3
+ end
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "multi_mime/version"
4
+
5
+ Gem::Specification.new do |gem|
6
+ gem.add_development_dependency "awesome_print"
7
+ gem.add_development_dependency "bundler", "~> 1.0"
8
+ gem.name = "multi_mime"
9
+ gem.version = MultiMime::VERSION
10
+ gem.authors = ["Karl Freeman"]
11
+ gem.email = ["karlfreeman@gmail.com"]
12
+ gem.license = "MIT"
13
+ gem.description = %q{A generic swappable back-end for Mime::Type detection}
14
+ gem.summary = %q{A generic swappable back-end for Mime::Type detection}
15
+ gem.homepage = "https://github.com/karlfreeman/multi_mime"
16
+ gem.files = `git ls-files`.split("\n")
17
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
18
+ gem.require_paths = ["lib"]
19
+ gem.required_ruby_version = ">= 1.9.2"
20
+ end
@@ -0,0 +1,101 @@
1
+ shared_examples_for "an adapter" do |adapter|
2
+
3
+ before do
4
+ begin
5
+ MultiMime.use adapter
6
+ rescue LoadError
7
+ pending "Adapter #{adapter} couldn't be loaded (not installed?)"
8
+ end
9
+ end
10
+
11
+ describe :type_for do
12
+
13
+ context :with_correct_mime_type do
14
+ subject { MultiMime.type_for("text/html") }
15
+ it { should eq "text/html" }
16
+ end
17
+
18
+ context :with_incorrect_mime_type do
19
+ subject { MultiMime.type_for("foo/bar") }
20
+ it { should be_nil }
21
+ it { should be_a MultiMime::NullType }
22
+ end
23
+
24
+ end
25
+
26
+ describe :type_for_extension do
27
+
28
+ context :without_dot do
29
+ subject { MultiMime.type_for_extension("html") }
30
+ it { should eq "text/html" }
31
+ end
32
+
33
+ context :with_dot do
34
+ subject { MultiMime.type_for_extension(".html") }
35
+ it { should eq "text/html" }
36
+ end
37
+
38
+ context :unknown_extension do
39
+ subject { MultiMime.type_for_extension(".foo.bar") }
40
+ it { should be_nil }
41
+ it { should be_a MultiMime::NullType }
42
+ end
43
+
44
+ end
45
+
46
+ describe :type_for_path do
47
+
48
+ context :known_extension do
49
+ subject { MultiMime.type_for_path("/usr/local/foo/bar.html") }
50
+ it { should eq "text/html" }
51
+ end
52
+
53
+ context :unknown_extension do
54
+ subject { MultiMime.type_for_path("/usr/local/foo/bar.foo") }
55
+ it { should be_nil }
56
+ it { should be_a MultiMime::NullType }
57
+ end
58
+
59
+ end
60
+
61
+ describe :type_for_file, :fakefs => true do
62
+
63
+ let(:extension_file) {
64
+ File.open("foo.html", "w")
65
+ }
66
+ let(:extensionless_file) {
67
+ File.open("foo", "w")
68
+ }
69
+
70
+ context :extension_file do
71
+ subject { MultiMime.type_for_file(extension_file) }
72
+ it { should eq "text/html" }
73
+ end
74
+
75
+ context :extensionless_file do
76
+ subject { MultiMime.type_for_file(extensionless_file) }
77
+ it { should be_nil }
78
+ it { should be_a MultiMime::NullType }
79
+ end
80
+
81
+ end
82
+
83
+ describe :null_type do
84
+
85
+ context :with_incorrect_mime_type do
86
+
87
+ it "should'nt raise an exception when querying for formats" do
88
+ mime = MultiMime.type_for("foo/bar")
89
+ expect(mime).to be_nil
90
+ expect(mime).to be_a MultiMime::NullType
91
+ expect(mime.html?).to be false
92
+ expect(mime.xml?).to be false
93
+ expect(mime.json?).to be false
94
+ end
95
+
96
+ end
97
+
98
+
99
+ end
100
+
101
+ end
@@ -0,0 +1,34 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
2
+
3
+ require "bundler"
4
+ Bundler.setup
5
+ begin; require "awesome_print"; rescue LoadError; end
6
+
7
+ require "rspec"
8
+
9
+ require "support/pry"
10
+ require "support/fakefs"
11
+ require "support/simplecov"
12
+
13
+ require "shared/adapter"
14
+
15
+ require "multi_mime"
16
+
17
+ # used as a stupid mixin class
18
+ class DummyClass
19
+ end
20
+
21
+ #
22
+ RSpec.configure do |config|
23
+
24
+ #
25
+ config.expect_with :rspec do |c|
26
+ c.syntax = :expect
27
+ end
28
+
29
+ #
30
+ def jruby?
31
+ defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
32
+ end
33
+
34
+ end
@@ -0,0 +1,6 @@
1
+ require "fakefs/spec_helpers"
2
+ require "pathname"
3
+ require "fileutils"
4
+ RSpec.configure do |config|
5
+ config.include FakeFS::SpecHelpers, :fakefs => true
6
+ end
@@ -0,0 +1,3 @@
1
+ if !ENV["CI"] && defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby"
2
+ require "pry"
3
+ end
@@ -0,0 +1,15 @@
1
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == "ruby"
2
+
3
+ require "simplecov"
4
+
5
+ if ENV["CI"]
6
+ require "coveralls"
7
+ Coveralls.wear!
8
+ SimpleCov.formatter = Coveralls::SimpleCov::Formatter
9
+ end
10
+
11
+ SimpleCov.start do
12
+ add_filter "vendor"
13
+ end
14
+
15
+ end
@@ -0,0 +1,111 @@
1
+ require "spec_helper"
2
+
3
+ describe MultiMime do
4
+
5
+ context :validations do
6
+
7
+ describe :type_for do
8
+ specify { expect { MultiMime.type_for(nil) }.to raise_error(ArgumentError) }
9
+ end
10
+
11
+ describe :type_for_extension do
12
+ specify { expect { MultiMime.type_for_extension(nil) }.to raise_error(ArgumentError) }
13
+ end
14
+
15
+ describe :type_for_path do
16
+ specify { expect { MultiMime.type_for_path(nil) }.to raise_error(ArgumentError) }
17
+ end
18
+
19
+ describe :type_for_file do
20
+ specify { expect { MultiMime.type_for_file(nil) }.to raise_error(ArgumentError) }
21
+ specify { expect { MultiMime.type_for_file(".html") }.to raise_error(ArgumentError) }
22
+ end
23
+
24
+ end
25
+
26
+ context :alias do
27
+
28
+ describe :by_type do
29
+ subject { MultiMime.instance_method(:by_type) }
30
+ it { should == MultiMime.instance_method(:type_for) }
31
+ end
32
+
33
+ describe :by_extension do
34
+ subject { MultiMime.instance_method(:by_extension) }
35
+ it { should == MultiMime.instance_method(:type_for_extension) }
36
+ end
37
+
38
+ describe :by_path do
39
+ subject { MultiMime.instance_method(:by_path) }
40
+ it { should == MultiMime.instance_method(:type_for_path) }
41
+ end
42
+
43
+ end
44
+
45
+ # context :defaults do
46
+
47
+ # describe "MIME::Types" do
48
+
49
+ # it "should detect adaptor" do
50
+ # Object.send(:remove_const, :MIME) if defined?(MIME)
51
+ # require "mime/types"
52
+ # MultiMime.default_adapter.should eq :mime_types
53
+ # end
54
+
55
+ # after(:each) do
56
+ # Object.send(:remove_const, :MIME) if defined?(MIME)
57
+ # end
58
+
59
+ # end
60
+
61
+ # describe "MimeMagic" do
62
+
63
+ # it "should detect adaptor" do
64
+ # Object.send(:remove_const, :MimeMagic) if defined?(MimeMagic)
65
+ # require "mimemagic"
66
+ # MultiMime.default_adapter.should eq :mimemagic
67
+ # end
68
+
69
+ # after(:each) do
70
+ # Object.send(:remove_const, :MimeMagic) if defined?(MimeMagic)
71
+ # end
72
+
73
+ # end
74
+
75
+ # describe "Mime::Type" do
76
+
77
+ # it "should detect adaptor" do
78
+ # Object.send(:remove_const, :Mime) if defined?(Mime)
79
+ # require "action_dispatch/http/mime_type"
80
+ # MultiMime.default_adapter.should eq :mime_type
81
+ # end
82
+
83
+ # after(:each) do
84
+ # Object.send(:remove_const, :Mime) if defined?(Mime)
85
+ # end
86
+
87
+ # end
88
+
89
+ # describe "Rack::Mime" do
90
+
91
+ # it "should detect adaptor" do
92
+ # Object.send(:remove_const, :Rack) if defined?(Rack)
93
+ # require "rack/mime"
94
+ # MultiMime.default_adapter.should eq :rack_mime
95
+ # end
96
+
97
+ # after(:each) do
98
+ # Object.send(:remove_const, :Rack) if defined?(Rack)
99
+ # end
100
+
101
+ # end
102
+
103
+ # end
104
+
105
+ %w(mime_types mimemagic mime_type rack_mime).each do |adapter|
106
+ context adapter do
107
+ it_behaves_like "an adapter", adapter
108
+ end
109
+ end
110
+
111
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: multi_mime
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Karl Freeman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-07-10 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: awesome_print
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ! '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
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: '1.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.0'
41
+ description: A generic swappable back-end for Mime::Type detection
42
+ email:
43
+ - karlfreeman@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - .document
49
+ - .gitignore
50
+ - .rspec
51
+ - .travis.yml
52
+ - .yardopts
53
+ - CHANGELOG.md
54
+ - CONTRIBUTING.md
55
+ - Gemfile
56
+ - LICENSE.md
57
+ - README.md
58
+ - Rakefile
59
+ - lib/multi_mime.rb
60
+ - lib/multi_mime/adapter.rb
61
+ - lib/multi_mime/adapters/mime_type.rb
62
+ - lib/multi_mime/adapters/mime_types.rb
63
+ - lib/multi_mime/adapters/mimemagic.rb
64
+ - lib/multi_mime/adapters/rack_mime.rb
65
+ - lib/multi_mime/null_type.rb
66
+ - lib/multi_mime/version.rb
67
+ - multi_mime.gemspec
68
+ - spec/shared/adapter.rb
69
+ - spec/spec_helper.rb
70
+ - spec/support/fakefs.rb
71
+ - spec/support/pry.rb
72
+ - spec/support/simplecov.rb
73
+ - spec/unit/multi_mime_spec.rb
74
+ homepage: https://github.com/karlfreeman/multi_mime
75
+ licenses:
76
+ - MIT
77
+ metadata: {}
78
+ post_install_message:
79
+ rdoc_options: []
80
+ require_paths:
81
+ - lib
82
+ required_ruby_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ! '>='
85
+ - !ruby/object:Gem::Version
86
+ version: 1.9.2
87
+ required_rubygems_version: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ! '>='
90
+ - !ruby/object:Gem::Version
91
+ version: '0'
92
+ requirements: []
93
+ rubyforge_project:
94
+ rubygems_version: 2.0.1
95
+ signing_key:
96
+ specification_version: 4
97
+ summary: A generic swappable back-end for Mime::Type detection
98
+ test_files:
99
+ - spec/shared/adapter.rb
100
+ - spec/spec_helper.rb
101
+ - spec/support/fakefs.rb
102
+ - spec/support/pry.rb
103
+ - spec/support/simplecov.rb
104
+ - spec/unit/multi_mime_spec.rb
105
+ has_rdoc: