multi_mime 1.0 → 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5efc9d64b3c707b8ae9ce324808872e6c8a3cc85
4
- data.tar.gz: 8e8f1a3f5316ea7f5e4cf78d07160ab29d1bbbcc
3
+ metadata.gz: 283efbc22a54d1e6c7966a912d6dc10ef5a18bb3
4
+ data.tar.gz: 0b56e2dfae1e0811531ac0d65da3850c4328be3e
5
5
  SHA512:
6
- metadata.gz: fe30cc3af9523823eeeeaadc1d8ced587d0944479e6d59d020b7dd0c022c6f727c0114042c00a977df440e0ce1e420a48ca18ffd9d34776144b282740a22cec6
7
- data.tar.gz: 07ecf389df86c3a12e4d0bad9db367bc99a0b3afdf2ff5a1364cae33608830bb522843c63a30725825d48ac9e62b30742c8f23dbd41c1b0810ee3c5c0b874bb7
6
+ metadata.gz: 91ffaa1e34ddaee7b6b981e30ed06fbc47c2046415371ff8e60b8e4044cc1d68769780c49a53792d4a6900881bc844a7739d2fcda2891879521f07129e8d4e05
7
+ data.tar.gz: a86a627ab130712773aa5949800ed4b9aa4b4233e7362c5bd4fae34c180df652b976fa8ea533d9dd4a5691f86265bc043f11d3c3daea0ddede68a1adb9dcf06f
@@ -3,18 +3,20 @@ cache: bundler
3
3
  bundler_args: --without development
4
4
  rvm:
5
5
  - ruby-head
6
+ - ruby
6
7
  - jruby-head
8
+ - jruby
7
9
  - 2.1.0
8
10
  - 2.0.0
9
11
  - 1.9.3
10
- - rbx-19mode
11
- - jruby-19mode
12
+ - rbx-2
12
13
  matrix:
13
14
  fast_finish: true
14
15
  allow_failures:
15
16
  - rvm: ruby-head
17
+ - rvm: ruby
16
18
  - rvm: jruby-head
17
- - rvm: rbx-19mode
18
- - rvm: jruby-19mode
19
+ - rvm: jruby
20
+ - rvm: rbx-2
19
21
  notifications:
20
22
  email: false
@@ -36,10 +36,8 @@ Ideally, a bug report should include a pull request with failing specs.
36
36
  4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
37
37
  5. Implement your feature or bug fix.
38
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]
39
+ 7. Add, commit, and push your changes.
40
+ 8. [Submit a pull request.][pr]
43
41
 
44
42
  [fork]: http://help.github.com/fork-a-repo/
45
43
  [branch]: http://learn.github.com/p/branching.html
data/Gemfile CHANGED
@@ -7,10 +7,6 @@ gem 'actionpack', '~> 3.2'
7
7
  gem 'rack'
8
8
  gem 'mimemagic'
9
9
 
10
- group :developement do
11
- gem 'rubocop', github: 'bbatsov/rubocop'
12
- end
13
-
14
10
  group :test do
15
11
  gem 'rake', '~> 10.0'
16
12
  gem 'fakefs', '~> 0.4.3'
data/README.md CHANGED
@@ -2,7 +2,7 @@
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.
6
6
 
7
7
  eg [MultiJson](https://github.com/intridea/multi_json) for MIME types.
8
8
 
@@ -18,7 +18,7 @@ require 'multi_mime'
18
18
 
19
19
  ## Features / Usage Examples
20
20
 
21
- Part of utilizing various mime type libraries is the need for a common interface. `MultiMime` provides just that with various methods.
21
+ Part of utilizing various MIME type libraries is the need for a common interface. `MultiMime` provides just that with following methods.
22
22
 
23
23
  ```ruby
24
24
  MultiMime.type_for('text/html') # 'text/html'
@@ -30,7 +30,7 @@ MultiMime.type_for_extension('.html') # 'text/html'
30
30
  MultiMime.type_for_path('/usr/local/foo/bar/foo.html') # 'text/html'
31
31
  # alias :by_path
32
32
 
33
- MultiMime.type_for_file( File.open('foo.html', 'w') ) # 'text/html'
33
+ MultiMime.type_for_file(File.open('foo.html', 'w')) # 'text/html'
34
34
  # alias :by_file
35
35
  ```
36
36
 
@@ -54,6 +54,8 @@ MultiMime.adapter # MultiMime::Adapters::MimeTypes
54
54
  MultiMime.type_for_extension('.json') # 'application/json'
55
55
  ```
56
56
 
57
+ When MultiMime fails to load the specified adapter, it'll throw `MultiMime::AdapterError` which inherits from `ArgumentError`.
58
+
57
59
  ## Badges
58
60
 
59
61
  [![Gem Version](http://img.shields.io/gem/v/multi_mime.svg)][gem]
@@ -61,7 +63,7 @@ MultiMime.type_for_extension('.json') # 'application/json'
61
63
  [![Code Quality](http://img.shields.io/codeclimate/github/karlfreeman/multi_mime.svg)][codeclimate]
62
64
  [![Gittip](http://img.shields.io/gittip/karlfreeman.svg)][gittip]
63
65
 
64
- ## Supported Mime Engines
66
+ ## Supported MIME Engines
65
67
 
66
68
  * [MIME::Types](https://github.com/halostatue/mime-types)
67
69
  * [MagicMime](https://github.com/minad/mimemagic)
@@ -1,3 +1,5 @@
1
+ require 'thread'
2
+ require 'multi_mime/adapter_error'
1
3
  module MultiMime
2
4
  extend self
3
5
 
@@ -26,16 +28,13 @@ module MultiMime
26
28
  next
27
29
  end
28
30
  end
29
-
30
- Kernel.warn '[WARNING] MultiMime hasn\'t been able to detect an adapter'
31
-
31
+ fail 'MultiMime hasn\'t been able to detect a default_adapter'
32
32
  nil
33
33
  end
34
34
 
35
35
  # Get the current adapter class.
36
36
  def adapter
37
- return @adapter if defined?(@adapter) && @adapter
38
- use default_adapter # load default adapter
37
+ use(default_adapter) unless defined?(@adapter) # load default adapter
39
38
  @adapter
40
39
  end
41
40
 
@@ -47,7 +46,9 @@ module MultiMime
47
46
  # * mime_type
48
47
  # * rack_mime
49
48
  def use(new_adapter)
50
- @adapter = load_adapter(new_adapter)
49
+ Thread.exclusive do
50
+ @adapter = load_adapter(new_adapter)
51
+ end
51
52
  end
52
53
  alias_method :adapter=, :use
53
54
 
@@ -132,8 +133,7 @@ module MultiMime
132
133
  end
133
134
  end
134
135
  if adapter_clazz.nil?
135
- Kernel.warn '[WARNING] MultiMime hasn\'t been able to detect an adapter'
136
- load_adapter nil
136
+ raise ::LoadError, new_adapter
137
137
  else
138
138
  return adapter_clazz
139
139
  end
@@ -142,14 +142,10 @@ module MultiMime
142
142
  when Class, Module
143
143
  new_adapter
144
144
  else
145
- fail 'Did not recognize your adapter specification. Please specify either a symbol or a class.'
145
+ raise ::LoadError, new_adapter
146
146
  end
147
+ rescue ::LoadError => exception
148
+ raise AdapterError.build(exception)
147
149
  end
148
150
 
149
- def with_adapter(new_adapter)
150
- old_adapter, self.adapter = adapter, new_adapter
151
- yield
152
- ensure
153
- self.adapter = old_adapter
154
- end
155
151
  end
@@ -0,0 +1,15 @@
1
+ module MultiMime
2
+ class AdapterError < ArgumentError
3
+ attr_reader :cause
4
+
5
+ def self.build(original_exception)
6
+ message = "Did not recognize your adapter specification (#{original_exception.message})."
7
+ new(message).tap do |exception|
8
+ exception.instance_eval do
9
+ @cause = original_exception
10
+ set_backtrace original_exception.backtrace
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,3 +1,3 @@
1
1
  module MultiMime
2
- VERSION = '1.0' unless defined?(MultiMime::VERSION)
2
+ VERSION = '1.0.1' unless defined?(MultiMime::VERSION)
3
3
  end
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency 'bundler', '~> 1.5'
23
23
  spec.add_development_dependency 'rake', '~> 10.0'
24
24
  spec.add_development_dependency 'kramdown', '>= 0.14'
25
- spec.add_development_dependency 'rubocop'
25
+ spec.add_development_dependency 'rubocop', '~> 0.19'
26
26
  spec.add_development_dependency 'pry'
27
27
  spec.add_development_dependency 'yard'
28
28
  end
@@ -13,23 +13,24 @@ RSpec.configure do |config|
13
13
  config.expect_with :rspec do |c|
14
14
  c.syntax = :expect
15
15
  end
16
- end
17
16
 
18
- def jruby?
19
- defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
20
- end
17
+ def jruby?
18
+ defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
19
+ end
21
20
 
22
- def undefine_constants(*consts)
23
- values = {}
24
- consts.each do |const|
25
- if Object.const_defined?(const)
26
- values[const] = Object.const_get(const)
27
- Object.send :remove_const, const
21
+ def undefine_constants(*consts)
22
+ values = {}
23
+ consts.each do |const|
24
+ if Object.const_defined?(const)
25
+ values[const] = Object.const_get(const)
26
+ Object.send :remove_const, const
27
+ end
28
+ end
29
+ yield
30
+ ensure
31
+ values.each do |const, value|
32
+ Object.const_set const, value
28
33
  end
29
34
  end
30
- yield
31
- ensure
32
- values.each do |const, value|
33
- Object.const_set const, value
34
- end
35
- end
35
+
36
+ end
@@ -2,8 +2,13 @@ require 'spec_helper'
2
2
 
3
3
  describe MultiMime do
4
4
 
5
- context :validations do
5
+ it 'should be thread safe' do
6
+ t1 = Thread.new { adapter = MultiMime.adapter; sleep 0.1; adapter }
7
+ t2 = Thread.new { MultiMime.adapter }
8
+ expect(t1.value).to eql t2.value
9
+ end
6
10
 
11
+ context :validations do
7
12
  describe :type_for do
8
13
  specify { expect { MultiMime.type_for(nil) }.to raise_error(ArgumentError) }
9
14
  end
@@ -21,10 +26,13 @@ describe MultiMime do
21
26
  specify { expect { MultiMime.type_for_file('.html') }.to raise_error(ArgumentError) }
22
27
  end
23
28
 
29
+ describe :adapter= do
30
+ specify { expect { MultiMime.adapter = Time.new }.to raise_error(MultiMime::AdapterError, /Did not recognize your adapter specification/) }
31
+ specify { expect { MultiMime.adapter = 'foo' }.to raise_error(MultiMime::AdapterError, /Did not recognize your adapter specification/) }
32
+ end
24
33
  end
25
34
 
26
35
  context :alias do
27
-
28
36
  describe :by_type do
29
37
  subject { MultiMime.instance_method(:by_type) }
30
38
  it { should == MultiMime.instance_method(:type_for) }
@@ -44,13 +52,10 @@ describe MultiMime do
44
52
  subject { MultiMime.instance_method(:by_file) }
45
53
  it { should == MultiMime.instance_method(:type_for_file) }
46
54
  end
47
-
48
55
  end
49
56
 
50
57
  context :defaults do
51
-
52
58
  describe 'MIME::Types' do
53
-
54
59
  around do |example|
55
60
  undefine_constants(:MimeMagic, :Mime, :Rack) { example.call }
56
61
  MultiMime.reset_adapter
@@ -60,11 +65,9 @@ describe MultiMime do
60
65
  require 'mime/types'
61
66
  expect(MultiMime.default_adapter).to eq :mime_types
62
67
  end
63
-
64
68
  end
65
69
 
66
70
  describe 'MimeMagic' do
67
-
68
71
  around do |example|
69
72
  undefine_constants(:MIME, :Mime, :Rack) { example.call }
70
73
  MultiMime.reset_adapter
@@ -74,11 +77,9 @@ describe MultiMime do
74
77
  require 'mimemagic'
75
78
  expect(MultiMime.default_adapter).to eq :mimemagic
76
79
  end
77
-
78
80
  end
79
81
 
80
82
  describe 'Mime::Type' do
81
-
82
83
  around do |example|
83
84
  undefine_constants(:MIME, :MimeMagic, :Rack) { example.call }
84
85
  MultiMime.reset_adapter
@@ -88,11 +89,9 @@ describe MultiMime do
88
89
  require 'action_dispatch/http/mime_type'
89
90
  expect(MultiMime.default_adapter).to eq :mime_type
90
91
  end
91
-
92
92
  end
93
93
 
94
94
  describe 'Rack::Mime' do
95
-
96
95
  around do |example|
97
96
  undefine_constants(:MIME, :Mime, :MimeMagic) { example.call }
98
97
  MultiMime.reset_adapter
@@ -102,7 +101,6 @@ describe MultiMime do
102
101
  require 'rack/mime'
103
102
  expect(MultiMime.default_adapter).to eq :rack_mime
104
103
  end
105
-
106
104
  end
107
105
 
108
106
  end
@@ -112,5 +110,4 @@ describe MultiMime do
112
110
  it_behaves_like 'an adapter', adapter
113
111
  end
114
112
  end
115
-
116
113
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: multi_mime
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.0'
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Karl Freeman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-03-03 00:00:00.000000000 Z
11
+ date: 2014-03-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -56,16 +56,16 @@ dependencies:
56
56
  name: rubocop
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: '0.19'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: '0.19'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: pry
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -114,6 +114,7 @@ files:
114
114
  - Rakefile
115
115
  - lib/multi_mime.rb
116
116
  - lib/multi_mime/adapter.rb
117
+ - lib/multi_mime/adapter_error.rb
117
118
  - lib/multi_mime/adapters/mime_type.rb
118
119
  - lib/multi_mime/adapters/mime_types.rb
119
120
  - lib/multi_mime/adapters/mimemagic.rb
@@ -158,4 +159,3 @@ test_files:
158
159
  - spec/support/pry.rb
159
160
  - spec/support/timecop.rb
160
161
  - spec/unit/multi_mime_spec.rb
161
- has_rdoc: