multi_mime 0.0.2 → 0.0.3
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 +6 -14
- data/.gitignore +6 -7
- data/.rubocop.yml +24 -0
- data/.travis.yml +13 -11
- data/Gemfile +3 -30
- data/README.md +30 -23
- data/Rakefile +9 -19
- data/lib/multi_mime.rb +47 -32
- data/lib/multi_mime/adapter.rb +7 -12
- data/lib/multi_mime/adapters/mime_type.rb +7 -17
- data/lib/multi_mime/adapters/mime_types.rb +6 -16
- data/lib/multi_mime/adapters/mimemagic.rb +6 -16
- data/lib/multi_mime/adapters/rack_mime.rb +7 -17
- data/lib/multi_mime/null_type.rb +2 -6
- data/lib/multi_mime/version.rb +2 -2
- data/multi_mime.gemspec +36 -18
- data/spec/shared/adapter.rb +23 -30
- data/spec/spec_helper.rb +24 -23
- data/spec/support/fakefs.rb +5 -5
- data/spec/support/pry.rb +3 -3
- data/spec/support/timecop.rb +2 -0
- data/spec/unit/multi_mime_spec.rb +47 -47
- metadata +168 -14
- data/.rspec +0 -3
- data/spec/support/simplecov.rb +0 -15
checksums.yaml
CHANGED
@@ -1,15 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
YzE5YmNkMzNhZmU4N2Y1MTcwZGM4MTcyNzYzMDljNzZiMzk5MWEzMGE0NjYx
|
10
|
-
MjBkNzkzN2E4MWEwMmMxOGJiNmYxZjkyZjAwZWMyMDM3NDFlZmM2ZmMwMjg3
|
11
|
-
NjY1ZjcxOTdkZWNhZDBkZjQ5MDE1Y2E3MTg3ZjYzYTRjOWVkMzM=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
NjRmOThkMTA1MzkzN2EwODgwMjA0NTJhNWNlYTU4OWZkMzEwMWRiZjJkNWU1
|
14
|
-
MWExZDA2Y2U2MzNjMDc0MjE4YzU1OTQ0MmJhZDNmOTg0NmEzZWJhN2NhNDNm
|
15
|
-
NDZiOGYxYzFiMGNkZTEwZThhZTQ5ZjQ0MGJlZGViNmViN2Y4MTQ=
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8ca98ae851bcf551a7b48af37da35d64b7b96442
|
4
|
+
data.tar.gz: 61f05c26320dff71a61eeeca7cd37da0e2481842
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: c2b2780e6c326826415799b681c7b0d7987eb83c02cc7de0f10efca6d5f39bd100544139c09052bad6d9643f0cffd820581267047cc6bb79bbdf62ff33851ea4
|
7
|
+
data.tar.gz: 095d2022c8fda77d7d29d1d42718b0b0dec45725f953ac2db81cc9e412d975badc0f8108baff67346bec7c79a7adb235556e924b3316473eecb8e0bb48a3bb7d
|
data/.gitignore
CHANGED
@@ -2,8 +2,12 @@
|
|
2
2
|
*.rbc
|
3
3
|
.bundle
|
4
4
|
.config
|
5
|
-
|
5
|
+
.yardoc
|
6
|
+
Gemfile.lock
|
6
7
|
InstalledFiles
|
8
|
+
_yardoc
|
9
|
+
coverage
|
10
|
+
doc/
|
7
11
|
lib/bundler/man
|
8
12
|
pkg
|
9
13
|
rdoc
|
@@ -11,9 +15,4 @@ spec/reports
|
|
11
15
|
test/tmp
|
12
16
|
test/version_tmp
|
13
17
|
tmp
|
14
|
-
|
15
|
-
|
16
|
-
# YARD artifacts
|
17
|
-
.yardoc
|
18
|
-
_yardoc
|
19
|
-
doc/
|
18
|
+
bin
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
AllCops:
|
2
|
+
Includes:
|
3
|
+
- Rakefile
|
4
|
+
- Gemfile
|
5
|
+
Excludes:
|
6
|
+
- script/**
|
7
|
+
- vendor/**
|
8
|
+
- bin/**
|
9
|
+
LineLength:
|
10
|
+
Enabled: false
|
11
|
+
MethodLength:
|
12
|
+
Enabled: false
|
13
|
+
ClassLength:
|
14
|
+
Enabled: false
|
15
|
+
Documentation:
|
16
|
+
Enabled: false
|
17
|
+
Encoding:
|
18
|
+
Enabled: false
|
19
|
+
Blocks:
|
20
|
+
Enabled: false
|
21
|
+
AlignParameters:
|
22
|
+
Enabled: false
|
23
|
+
HashSyntax:
|
24
|
+
EnforcedStyle: ruby19
|
data/.travis.yml
CHANGED
@@ -1,17 +1,19 @@
|
|
1
|
-
bundler_args: --without development
|
2
1
|
language: ruby
|
2
|
+
cache: bundler
|
3
3
|
rvm:
|
4
|
-
-
|
4
|
+
- ruby-head
|
5
|
+
- jruby-head
|
6
|
+
- 2.1.0
|
7
|
+
- 2.0.0
|
8
|
+
- 1.9.3
|
5
9
|
- rbx-19mode
|
6
|
-
- jruby-18mode
|
7
10
|
- jruby-19mode
|
8
|
-
- 1.8.7
|
9
|
-
- 1.9.2
|
10
|
-
- 1.9.3
|
11
|
-
- 2.0.0
|
12
11
|
matrix:
|
12
|
+
fast_finish: true
|
13
13
|
allow_failures:
|
14
|
-
- rvm:
|
15
|
-
- rvm: jruby-
|
16
|
-
- rvm:
|
17
|
-
- rvm:
|
14
|
+
- rvm: ruby-head
|
15
|
+
- rvm: jruby-head
|
16
|
+
- rvm: rbx-19mode
|
17
|
+
- rvm: jruby-19mode
|
18
|
+
notifications:
|
19
|
+
email: false
|
data/Gemfile
CHANGED
@@ -1,34 +1,7 @@
|
|
1
|
-
source
|
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
|
1
|
+
source 'https://rubygems.org'
|
24
2
|
|
25
3
|
group :test do
|
26
|
-
gem
|
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
|
4
|
+
gem 'fakefs', github: 'defunkt/fakefs', require: 'fakefs/safe'
|
32
5
|
end
|
33
6
|
|
34
|
-
gemspec
|
7
|
+
gemspec
|
data/README.md
CHANGED
@@ -2,67 +2,74 @@
|
|
2
2
|
|
3
3
|
A generic swappable back-end for Mime Type detection
|
4
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.
|
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. eg [MultiJson](https://github.com/intridea/multi_json) for Mime Types.
|
6
6
|
|
7
|
-
##
|
7
|
+
## Installation
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
|
10
|
+
gem 'multi_mime', '~> 0.0.3'
|
11
|
+
```
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
require 'multi_mime'
|
15
|
+
```
|
11
16
|
|
12
|
-
|
17
|
+
## Features / Usage Examples
|
18
|
+
|
19
|
+
```ruby
|
20
|
+
MultiMime.type_for('text/html') # 'text/html'
|
13
21
|
# alias :by_type
|
14
22
|
|
15
|
-
MultiMime.type_for_extension(
|
23
|
+
MultiMime.type_for_extension('.html') # 'text/html'
|
16
24
|
# alias :by_extension
|
17
25
|
|
18
|
-
MultiMime.type_for_path(
|
26
|
+
MultiMime.type_for_path('/usr/local/foo/bar/foo.html') # 'text/html'
|
19
27
|
# alias :by_path
|
20
28
|
|
21
|
-
MultiMime.type_for_file( File.open(
|
29
|
+
MultiMime.type_for_file( File.open('foo.html', 'w') ) # 'text/html'
|
22
30
|
# alias :by_file
|
23
31
|
```
|
24
32
|
|
25
|
-
##
|
33
|
+
## Badges
|
26
34
|
|
27
35
|
[][gem]
|
28
36
|
[][travis]
|
29
|
-
[][gemnasium]
|
30
37
|
[][codeclimate]
|
31
|
-
[][gittip]
|
32
39
|
|
33
40
|
## Supported Mime Engines
|
34
41
|
|
35
42
|
* [MIME::Types](https://github.com/halostatue/mime-types)
|
36
43
|
* [MagicMime](https://github.com/minad/mimemagic)
|
37
|
-
* [Rails](http://api.rubyonrails.org/classes/Mime/Type.html) (
|
38
|
-
* [Rack](http://rack.rubyforge.org/doc/Rack/Mime.html) (
|
44
|
+
* [Rails](http://api.rubyonrails.org/classes/Mime/Type.html) (ActionDispatch::Http::Mime)
|
45
|
+
* [Rack](http://rack.rubyforge.org/doc/Rack/Mime.html) (Rack::Mime)
|
39
46
|
|
40
47
|
## Supported Ruby Versions
|
48
|
+
|
41
49
|
This library aims to support and is [tested against][travis] the following Ruby
|
42
50
|
implementations:
|
43
51
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
52
|
+
- Ruby 2.1.0
|
53
|
+
- Ruby 2.0.0
|
54
|
+
- Ruby 1.9.3
|
55
|
+
- [JRuby][jruby]
|
56
|
+
- [Rubinius][rubinius]
|
49
57
|
|
50
58
|
# Credits
|
51
59
|
|
52
60
|
Inspiration:
|
53
61
|
|
54
|
-
|
55
|
-
|
62
|
+
- [MultiJSON](https://github.com/intridea/multi_json)
|
63
|
+
- [MultiXML](https://github.com/sferik/multi_xml)
|
56
64
|
|
57
65
|
Cribbed:
|
58
66
|
|
59
|
-
|
60
|
-
|
67
|
+
- [MultiJSON](https://github.com/intridea/multi_json)
|
68
|
+
- [Asset_Sync"s MultiMime module](https://github.com/rumblelabs/asset_sync/commit/9333bd01ae1a7cf2ffa046b8390fbc4165c38030)
|
61
69
|
|
62
70
|
[gem]: https://rubygems.org/gems/multi_mime
|
63
71
|
[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
72
|
[codeclimate]: https://codeclimate.com/github/karlfreeman/multi_mime
|
73
|
+
[gittip]: https://www.gittip.com/karlfreeman/
|
67
74
|
[jruby]: http://www.jruby.org
|
68
75
|
[rubinius]: http://rubini.us
|
data/Rakefile
CHANGED
@@ -1,27 +1,17 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler'
|
2
2
|
Bundler.setup
|
3
3
|
Bundler::GemHelper.install_tasks
|
4
4
|
|
5
|
-
require
|
5
|
+
require 'yard'
|
6
6
|
YARD::Rake::YardocTask.new
|
7
7
|
|
8
|
-
require
|
9
|
-
desc
|
8
|
+
require 'rspec/core/rake_task'
|
9
|
+
desc 'Run all examples'
|
10
10
|
RSpec::Core::RakeTask.new(:spec)
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
12
|
+
require 'rubocop/rake_task'
|
13
|
+
desc 'Run rubocop'
|
14
|
+
Rubocop::RakeTask.new(:rubocop)
|
25
15
|
|
26
|
-
task :
|
27
|
-
task :
|
16
|
+
task default: :spec
|
17
|
+
task test: :spec
|
data/lib/multi_mime.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
module MultiMime
|
2
2
|
extend self
|
3
3
|
|
4
|
+
ADAPTERS = %i(mime_types rack_mime mimemagic mime_type)
|
5
|
+
|
4
6
|
REQUIREMENT_MAP = [
|
5
|
-
[
|
6
|
-
[
|
7
|
-
[
|
8
|
-
[
|
7
|
+
[:mime_types, 'mime/types', :MIME].freeze,
|
8
|
+
[:mimemagic, 'mimemagic', :MimeMagic].freeze,
|
9
|
+
[:mime_type, 'action_dispatch/http/mime_type', :Mime].freeze,
|
10
|
+
[:rack_mime, 'rack/mime', :Rack].freeze
|
9
11
|
]
|
10
12
|
|
11
13
|
# The default adapter based on what you currently
|
@@ -18,7 +20,7 @@ module MultiMime
|
|
18
20
|
return :mime_type if defined?(::Mime::Type)
|
19
21
|
return :rack_mime if defined?(::Rack::Mime)
|
20
22
|
|
21
|
-
REQUIREMENT_MAP.each do |library,
|
23
|
+
REQUIREMENT_MAP.each do |adapter, library, clazz|
|
22
24
|
begin
|
23
25
|
require library
|
24
26
|
return adapter
|
@@ -27,16 +29,15 @@ module MultiMime
|
|
27
29
|
end
|
28
30
|
end
|
29
31
|
|
30
|
-
Kernel.warn
|
32
|
+
Kernel.warn '[WARNING] MultiMime hasn\'t been able to detect an adapter'
|
31
33
|
|
32
34
|
nil
|
33
|
-
|
34
35
|
end
|
35
36
|
|
36
37
|
# Get the current adapter class.
|
37
38
|
def adapter
|
38
39
|
return @adapter if defined?(@adapter) && @adapter
|
39
|
-
|
40
|
+
use default_adapter # load default adapter
|
40
41
|
@adapter
|
41
42
|
end
|
42
43
|
|
@@ -50,8 +51,12 @@ module MultiMime
|
|
50
51
|
def use(new_adapter)
|
51
52
|
@adapter = load_adapter(new_adapter)
|
52
53
|
end
|
53
|
-
|
54
|
+
alias_method :adapter=, :use
|
54
55
|
|
56
|
+
# Remove the currently loaded adapter
|
57
|
+
def reset_adapter
|
58
|
+
remove_instance_variable :@adapter if defined?(@adapter)
|
59
|
+
end
|
55
60
|
|
56
61
|
# Get mime type by mime type
|
57
62
|
#
|
@@ -59,12 +64,12 @@ module MultiMime
|
|
59
64
|
# @param [Hash] opts
|
60
65
|
# * adapter [String] If set, the selected adapter will be used for this call.
|
61
66
|
# @return [String] Mime type
|
62
|
-
def type_for(mime_type, opts={})
|
63
|
-
|
67
|
+
def type_for(mime_type, opts = {})
|
68
|
+
fail ArgumentError, "Mime Type must be a String. #{mime_type.inspect} given." unless mime_type.is_a? String
|
64
69
|
adapter = current_adapter(opts)
|
65
70
|
adapter.type_for(mime_type, opts)
|
66
71
|
end
|
67
|
-
|
72
|
+
alias_method :by_type, :type_for
|
68
73
|
|
69
74
|
# Get mime type by extension
|
70
75
|
#
|
@@ -72,12 +77,12 @@ module MultiMime
|
|
72
77
|
# @param [Hash] opts
|
73
78
|
# * adapter [String] If set, the selected adapter will be used for this call.
|
74
79
|
# @return [String] Mime type
|
75
|
-
def type_for_extension(extension, opts={})
|
76
|
-
|
80
|
+
def type_for_extension(extension, opts = {})
|
81
|
+
fail ArgumentError, "Extension must be a String. #{extension.inspect} given." unless extension.is_a? String
|
77
82
|
adapter = current_adapter(opts)
|
78
83
|
adapter.type_for_extension(extension, opts)
|
79
84
|
end
|
80
|
-
|
85
|
+
alias_method :by_extension, :type_for_extension
|
81
86
|
|
82
87
|
# Get mime type by path
|
83
88
|
#
|
@@ -85,12 +90,12 @@ module MultiMime
|
|
85
90
|
# @param [Hash] opts
|
86
91
|
# * adapter [String] If set, the selected adapter will be used for this call.
|
87
92
|
# @return [String] Mime type
|
88
|
-
def type_for_path(path, opts={})
|
89
|
-
|
93
|
+
def type_for_path(path, opts = {})
|
94
|
+
fail ArgumentError, "Path must be a String. #{path.inspect} given." unless path.is_a? String
|
90
95
|
adapter = current_adapter(opts)
|
91
96
|
adapter.type_for_path(path, opts)
|
92
97
|
end
|
93
|
-
|
98
|
+
alias_method :by_path, :type_for_path
|
94
99
|
|
95
100
|
# Get mime type by file
|
96
101
|
#
|
@@ -98,45 +103,55 @@ module MultiMime
|
|
98
103
|
# @param [Hash] opts
|
99
104
|
# * adapter [String] If set, the selected adapter will be used for this call.
|
100
105
|
# @return [String] Mime type
|
101
|
-
def type_for_file(file, opts={})
|
102
|
-
|
106
|
+
def type_for_file(file, opts = {})
|
107
|
+
fail ArgumentError, "File must be a File. #{file.inspect} given." unless file.is_a? File
|
103
108
|
adapter = current_adapter(opts)
|
104
109
|
adapter.type_for_file(file, opts)
|
105
110
|
end
|
106
|
-
|
111
|
+
alias_method :by_file, :type_for_file
|
107
112
|
|
108
113
|
private
|
109
114
|
|
110
|
-
|
111
|
-
def current_adapter(opts={})
|
115
|
+
def current_adapter(opts = {})
|
112
116
|
if new_adapter = opts.delete(:adapter)
|
113
117
|
load_adapter(new_adapter)
|
114
118
|
else
|
115
|
-
|
119
|
+
adapter
|
116
120
|
end
|
117
121
|
end
|
118
122
|
|
119
|
-
#
|
120
123
|
def load_adapter(new_adapter)
|
121
124
|
case new_adapter
|
122
125
|
when String, Symbol
|
123
|
-
|
124
|
-
|
126
|
+
adapter_clazz = nil
|
127
|
+
REQUIREMENT_MAP.each do |adapter, library, clazz|
|
128
|
+
if new_adapter.to_sym == adapter
|
129
|
+
require library
|
130
|
+
require "multi_mime/adapters/#{new_adapter.to_s}"
|
131
|
+
adapter_clazz = MultiMime::Adapters.const_get(:"#{new_adapter.to_s.split('_').map { |s| s.capitalize }.join('')}")
|
132
|
+
else
|
133
|
+
next
|
134
|
+
end
|
135
|
+
end
|
136
|
+
if adapter_clazz.nil?
|
137
|
+
Kernel.warn '[WARNING] MultiMime hasn\'t been able to detect an adapter'
|
138
|
+
load_adapter nil
|
139
|
+
else
|
140
|
+
return adapter_clazz
|
141
|
+
end
|
125
142
|
when NilClass, FalseClass
|
126
|
-
load_adapter
|
143
|
+
load_adapter default_adapter
|
127
144
|
when Class, Module
|
128
145
|
new_adapter
|
129
146
|
else
|
130
|
-
|
147
|
+
fail 'Did not recognize your adapter specification. Please specify either a symbol or a class.'
|
131
148
|
end
|
132
149
|
end
|
133
150
|
|
134
|
-
#
|
135
151
|
def with_adapter(new_adapter)
|
136
152
|
old_adapter, self.adapter = adapter, new_adapter
|
137
153
|
yield
|
138
154
|
ensure
|
139
155
|
self.adapter = old_adapter
|
140
156
|
end
|
141
|
-
|
142
|
-
end
|
157
|
+
end
|