content_type 2.1.4 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +6 -8
- data/ext/extconf.rb +9 -2
- metadata +74 -14
- data/spec/content_type_spec.rb +0 -121
data/Rakefile
CHANGED
@@ -1,8 +1,7 @@
|
|
1
|
-
require 'vendor/gems/environment'
|
2
|
-
|
3
1
|
require 'rake'
|
4
|
-
require '
|
5
|
-
require '
|
2
|
+
require 'jeweler'
|
3
|
+
require 'rspec'
|
4
|
+
require 'rspec/core/rake_task'
|
6
5
|
|
7
6
|
task :default => [:clean, :make, :spec]
|
8
7
|
|
@@ -13,16 +12,15 @@ task :make do
|
|
13
12
|
end
|
14
13
|
end
|
15
14
|
|
16
|
-
|
17
|
-
t.
|
18
|
-
t.
|
15
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
16
|
+
t.rspec_opts = %w(-fs -c)
|
17
|
+
t.pattern = FileList['spec/*_spec.rb']
|
19
18
|
end
|
20
19
|
|
21
20
|
task :clean do
|
22
21
|
`rm -r ext/*.o ext/*.so ext/*.bundle ext/conftest.dSYM 2>/dev/null`
|
23
22
|
end
|
24
23
|
|
25
|
-
require 'jeweler'
|
26
24
|
Jeweler::Tasks.new do |s|
|
27
25
|
s.name = 'content_type'
|
28
26
|
s.summary = 'libmagic bindings to quickly determine content type of files'
|
data/ext/extconf.rb
CHANGED
@@ -4,8 +4,15 @@ RbConfig::MAKEFILE_CONFIG['CC'] = ENV['CC'] if ENV['CC']
|
|
4
4
|
extension_name = 'content_type'
|
5
5
|
dir_config(extension_name)
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
brew_magic = Dir['/usr/local/Cellar/libmagic/**/magic.h']
|
8
|
+
if brew_magic
|
9
|
+
brew_dir = File.dirname(File.dirname(brew_magic[0]))
|
10
|
+
find_header('magic.h', File.join(brew_dir, 'include'))
|
11
|
+
find_library('magic', 'magic_open', File.join(brew_dir, 'lib'))
|
12
|
+
else
|
13
|
+
find_header('magic.h', '/opt/local/include')
|
14
|
+
find_library('magic', 'magic_open', '/opt/local/lib')
|
15
|
+
end
|
9
16
|
|
10
17
|
$CFLAGS += ' -Werror -Wall'
|
11
18
|
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: content_type
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 7
|
5
|
+
prerelease:
|
5
6
|
segments:
|
6
7
|
- 2
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 2.
|
8
|
+
- 2
|
9
|
+
- 0
|
10
|
+
version: 2.2.0
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- David Turnbull
|
@@ -14,10 +15,66 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date:
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
date: 2011-05-16 00:00:00 Z
|
19
|
+
dependencies:
|
20
|
+
- !ruby/object:Gem::Dependency
|
21
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
22
|
+
none: false
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
hash: 3
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
version: "0"
|
30
|
+
name: rake
|
31
|
+
prerelease: false
|
32
|
+
type: :runtime
|
33
|
+
requirement: *id001
|
34
|
+
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: &id002 !ruby/object:Gem::Requirement
|
36
|
+
none: false
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
hash: 3
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
version: "0"
|
44
|
+
name: rspec
|
45
|
+
prerelease: false
|
46
|
+
type: :runtime
|
47
|
+
requirement: *id002
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
version_requirements: &id003 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
hash: 3
|
55
|
+
segments:
|
56
|
+
- 0
|
57
|
+
version: "0"
|
58
|
+
name: jeweler
|
59
|
+
prerelease: false
|
60
|
+
type: :runtime
|
61
|
+
requirement: *id003
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
version_requirements: &id004 !ruby/object:Gem::Requirement
|
64
|
+
none: false
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
hash: 27
|
69
|
+
segments:
|
70
|
+
- 0
|
71
|
+
- 1
|
72
|
+
- 0
|
73
|
+
version: 0.1.0
|
74
|
+
name: should_be_faster
|
75
|
+
prerelease: false
|
76
|
+
type: :runtime
|
77
|
+
requirement: *id004
|
21
78
|
description: " Provides ContentType#content_type, File#content_type, File::content_type\n and String#content_type methods to determine mime type\n"
|
22
79
|
email: dsturnbull@me.com
|
23
80
|
executables: []
|
@@ -31,35 +88,38 @@ files:
|
|
31
88
|
- ext/content_type.c
|
32
89
|
- ext/extconf.rb
|
33
90
|
- README
|
34
|
-
has_rdoc: true
|
35
91
|
homepage: http://github.com/dsturnbull/content_type
|
36
92
|
licenses: []
|
37
93
|
|
38
94
|
post_install_message:
|
39
|
-
rdoc_options:
|
40
|
-
|
95
|
+
rdoc_options: []
|
96
|
+
|
41
97
|
require_paths:
|
42
98
|
- lib
|
43
99
|
required_ruby_version: !ruby/object:Gem::Requirement
|
100
|
+
none: false
|
44
101
|
requirements:
|
45
102
|
- - ">="
|
46
103
|
- !ruby/object:Gem::Version
|
104
|
+
hash: 3
|
47
105
|
segments:
|
48
106
|
- 0
|
49
107
|
version: "0"
|
50
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
109
|
+
none: false
|
51
110
|
requirements:
|
52
111
|
- - ">="
|
53
112
|
- !ruby/object:Gem::Version
|
113
|
+
hash: 3
|
54
114
|
segments:
|
55
115
|
- 0
|
56
116
|
version: "0"
|
57
117
|
requirements: []
|
58
118
|
|
59
119
|
rubyforge_project:
|
60
|
-
rubygems_version: 1.
|
120
|
+
rubygems_version: 1.7.2
|
61
121
|
signing_key:
|
62
122
|
specification_version: 3
|
63
123
|
summary: libmagic bindings to quickly determine content type of files
|
64
|
-
test_files:
|
65
|
-
|
124
|
+
test_files: []
|
125
|
+
|
data/spec/content_type_spec.rb
DELETED
@@ -1,121 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'should_be_faster'
|
3
|
-
require 'tempfile'
|
4
|
-
require 'ext/content_type'
|
5
|
-
|
6
|
-
describe ContentType do
|
7
|
-
before do
|
8
|
-
@img = 'spec/fixtures/grindewald.jpg'
|
9
|
-
@pdf = 'spec/fixtures/pdftest.pdf'
|
10
|
-
@lzm = 'spec/fixtures/compressed.jpg.lz'
|
11
|
-
@doc = 'spec/fixtures/wordtest.doc'
|
12
|
-
@dcx = 'spec/fixtures/wordtest.docx'
|
13
|
-
@dot = 'spec/fixtures/.supercabanafuntimekgozzzzzzzzzzzzzzzzzzzz'
|
14
|
-
@pdf_with_charset = 'spec/fixtures/bash.pdf'
|
15
|
-
end
|
16
|
-
|
17
|
-
context 'initialising' do
|
18
|
-
it 'should take a file path' do
|
19
|
-
path = @img
|
20
|
-
ct = ContentType.new(path)
|
21
|
-
ct.filepath.should == path
|
22
|
-
end
|
23
|
-
|
24
|
-
it 'should check that the file exists' do
|
25
|
-
lambda {
|
26
|
-
ct = ContentType.new('poopstain')
|
27
|
-
}.should raise_error ArgumentError
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'should memoize the content type' do
|
31
|
-
ct = ContentType.new(@img)
|
32
|
-
lambda {
|
33
|
-
ct.content_type.should == 'image/jpeg'
|
34
|
-
}.should change(ct, :processed).to(true)
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
context 'file ext overrides' do
|
39
|
-
it 'should detect docx files' do
|
40
|
-
ct = ContentType.new(@dcx)
|
41
|
-
ct.content_type.should ==
|
42
|
-
'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
|
43
|
-
end
|
44
|
-
|
45
|
-
it 'should handle dot files' do
|
46
|
-
ct = ContentType.new(@dot)
|
47
|
-
ct.content_type.should == 'text/plain'
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'detecting mime type' do
|
52
|
-
it 'should detect images' do
|
53
|
-
ct = ContentType.new(@img)
|
54
|
-
ct.content_type.should == 'image/jpeg'
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'should detect pdfs' do
|
58
|
-
ct = ContentType.new(@pdf)
|
59
|
-
ct.content_type.should == 'application/pdf'
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'should detect mime types with charsets by ignoring the charset' do
|
63
|
-
ct = ContentType.new(@pdf_with_charset)
|
64
|
-
ct.content_type.should == 'application/pdf'
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'should detect lzma files' do
|
68
|
-
ct = ContentType.new(@lzm)
|
69
|
-
ct.content_type.should == 'application/x-lzip'
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'should detect doc files' do
|
73
|
-
ct = ContentType.new(@doc)
|
74
|
-
ct.content_type.should == 'application/msword'
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
context 'comparing with shelling out' do
|
79
|
-
it 'should be much faster' do
|
80
|
-
shell = lambda { `file -i #{@img}` }
|
81
|
-
ext = lambda { ContentType.new(@img).content_type }
|
82
|
-
ext.should be_at_least(5).times.faster_than(shell)
|
83
|
-
end
|
84
|
-
|
85
|
-
it 'should slower to reinstantiate' do
|
86
|
-
@ct = ContentType.new(@img)
|
87
|
-
memo = lambda { @ct.content_type }
|
88
|
-
kgo = lambda { ContentType.new(@img).content_type }
|
89
|
-
kgo.should be_at_least(5).times.slower_than(memo, :iterations => 1000)
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
context 'when using the file class methods' do
|
94
|
-
it 'should have File.content_type(path)' do
|
95
|
-
File.content_type(@img).should == 'image/jpeg'
|
96
|
-
end
|
97
|
-
|
98
|
-
it 'should have File#content_type' do
|
99
|
-
File.open(@img).content_type.should == 'image/jpeg'
|
100
|
-
end
|
101
|
-
|
102
|
-
it 'should make it into tempfile' do
|
103
|
-
t = Tempfile.new('hi')
|
104
|
-
t.content_type.should == 'application/x-empty'
|
105
|
-
t << File.read(@img)
|
106
|
-
t.content_type.should == 'image/jpeg'
|
107
|
-
File.unlink(t.path)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
context 'on strings' do
|
112
|
-
it 'should have String#content_type' do
|
113
|
-
str = File.read(@img)
|
114
|
-
str.content_type.should == 'image/jpeg'
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'should work on empty strings' do
|
118
|
-
''.content_type.should == 'application/x-empty'
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|