fileinfo 0.2.0 → 0.3.0

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: 3003ef10828a21e938e6329915aae768e7231565
4
- data.tar.gz: 5d32b96bce981dc1cbcbd0efb437760ba8d318e8
3
+ metadata.gz: 1fd22a80c28289631c040bde751eee82a7b51369
4
+ data.tar.gz: 38320adc6dc77ad1e6e38e6d4d1b4c49052da480
5
5
  SHA512:
6
- metadata.gz: 0ef4dff4dfe51878aa0a0d71ecfe6c1b95498f7e65048b38dd735a8dd523d371c91fc912943d698bafcc19d35b2616db94443738fe2a456468a9fdcf1f393708
7
- data.tar.gz: ef3b64ace53578d25f5d64d6a9cb08a1e59eb7f169497e61b2ec0f0c112e714535ba5b96300fea40f1fbea50c240cb60ee01d07f0a86470ca21a27d34451cbe3
6
+ metadata.gz: 24f820540d61e3e613b3c511eb3d5e8cebc7663de1c8828d6b4456a7215835ec7c18e1574411315e8961c0a7b1de2c63f7eddf1654b675a45139a0cf0ac8b59c
7
+ data.tar.gz: 2823c8c4c042db5d8b8aecbfffd38b3c552c7c2b20f1300bbddd4aacf5b08ff8139127339fd20d19043d795e1152dc6c3a88f32195aa86ec8f9d2eaf2f466e54
data/README.md CHANGED
@@ -6,7 +6,7 @@
6
6
  [![Coverage Status](https://coveralls.io/repos/rafBM/fileinfo/badge.png?branch=master)](https://coveralls.io/r/rafBM/fileinfo?branch=master)
7
7
  [![Dependency Status](https://gemnasium.com/rafBM/fileinfo.png)](https://gemnasium.com/rafBM/fileinfo)
8
8
 
9
- FileInfo detects encoding from strings and files using the [wonderful Unix `file` command](http://en.wikipedia.org/wiki/File_\(command\)).
9
+ FileInfo detects file encodings and MIME types using the [wonderful Unix `file` command](http://en.wikipedia.org/wiki/File_\(command\)).
10
10
 
11
11
  ## Installation
12
12
 
@@ -30,18 +30,43 @@ $ gem install fileinfo
30
30
 
31
31
  ## Usage
32
32
 
33
- Use `FileInfo.parse` with a string:
33
+ ### Detect encoding
34
+
35
+ Use `FileInfo.parse` with a string or `FileInfo.load` with a filename.
34
36
 
35
37
  ```ruby
36
38
  FileInfo.parse('foo bar baz').encoding # => #<Encoding:US-ASCII>
37
39
  FileInfo.parse('föø bår bàz').encoding # => #<Encoding:UTF-8>
40
+
41
+ filename = '/Users/rafbm/Downloads/some_crap_coming_from_windows.csv'
42
+ FileInfo.load(filename).encoding # => #<Encoding:ISO-8859-1>
38
43
  ```
39
44
 
40
- Use `FileInfo.load` with a filename:
45
+ ### Detect MIME type
46
+
47
+ A bunch of methods are available depending on your needs.
41
48
 
42
49
  ```ruby
43
- filename = '/Users/rafbm/Downloads/some_crap_coming_from_windows.csv'
44
- FileInfo.load(filename).encoding # => #<Encoding:ISO-8859-1>
50
+ info = FileInfo.load('picture.jpg')
51
+ info.type # => "image/jpeg"
52
+ info.media_type # => "image"
53
+ info.sub_type # => "jpeg"
54
+ ```
55
+
56
+ The `#mime_type` method can also return a `MIME::Type` instance.
57
+
58
+ ```ruby
59
+ info = FileInfo.parse('Hello world')
60
+ info.mime_type # => #<MIME::Type:0x007f81a1a36090 @content_type="text/plain" ...>
61
+ ```
62
+
63
+ **NOTE:** You must install the `mime-types` gem yourself as it is not a dependency of `fileinfo`.
64
+
65
+ Finally, `#content_type` can be used to get the full string returned by `file --mime --brief`.
66
+
67
+ ```ruby
68
+ info = FileInfo.parse('Hëllø wõrld')
69
+ info.content_type # => "text/plain; charset=utf-8"
45
70
  ```
46
71
 
47
72
  ## Contributing
@@ -54,4 +79,4 @@ FileInfo.load(filename).encoding # => #<Encoding:ISO-8859-1>
54
79
 
55
80
  ---
56
81
 
57
- © 2013 [Rafaël Blais Masson](http://heliom.ca). FileInfo is released under the MIT license.
82
+ © 2014 [Rafaël Blais Masson](http://rafbm.com). FileInfo is released under the MIT license.
@@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
8
8
  spec.version = FileInfo::VERSION
9
9
  spec.authors = ['Rafaël Blais Masson']
10
10
  spec.email = ['rafael@heliom.ca']
11
- spec.description = "FileInfo detects encoding from strings and files using the wonderful Unix `file` command."
12
- spec.summary = "FileInfo detects encoding from strings and files using the wonderful Unix `file` command."
11
+ spec.description = "FileInfo detects file encodings and MIME types using the wonderful Unix `file` command."
12
+ spec.summary = "FileInfo detects file encodings and MIME types using the wonderful Unix `file` command."
13
13
  spec.homepage = 'http://github.com/rafBM/fileinfo'
14
14
  spec.license = 'MIT'
15
15
 
@@ -21,4 +21,5 @@ Gem::Specification.new do |spec|
21
21
  spec.add_development_dependency 'bundler', '~> 1.3'
22
22
  spec.add_development_dependency 'rake'
23
23
  spec.add_development_dependency 'rspec', '~> 2.14'
24
+ spec.add_development_dependency 'mime-types'
24
25
  end
@@ -6,42 +6,60 @@ require 'tempfile'
6
6
  class FileInfo
7
7
  class UnknownEncodingError < StandardError; end
8
8
 
9
- STRING_REGEX = /: ([^:]+)$/
10
- ENCODING_REGEX = /charset=(\S+)/
9
+ MIME_TYPE_REGEX = /^[^;]+/
10
+ CHARSET_REGEX = /charset=(\S+)/
11
+
12
+ MIME_TYPE_ERROR_MESSAGE = 'You must install the "mime-types" gem to use FileInfo#mime_type'
13
+
14
+ attr_reader :content_type
11
15
 
12
16
  def initialize(output)
13
- @output = output
17
+ @content_type = output.strip
18
+ end
19
+
20
+ def type
21
+ @type ||= content_type.match(MIME_TYPE_REGEX)[0]
22
+ end
23
+
24
+ def media_type
25
+ @media_type ||= type.split('/')[0]
26
+ end
27
+
28
+ def sub_type
29
+ @sub_type ||= type.split('/')[1]
30
+ end
31
+
32
+ def mime_type
33
+ @mime_type ||= begin
34
+ require 'mime/types' unless defined? MIME::Types
35
+ MIME::Types[type][0]
36
+ rescue LoadError
37
+ raise LoadError, MIME_TYPE_ERROR_MESSAGE
38
+ end
39
+ end
40
+
41
+ def charset
42
+ @charset ||= content_type.match(CHARSET_REGEX)[1]
14
43
  end
15
44
 
16
45
  def encoding
17
- @encoding ||= ::Encoding.find(encoding_string)
46
+ @encoding ||= ::Encoding.find(charset)
18
47
  rescue ArgumentError => e
19
48
  raise UnknownEncodingError, e.message
20
49
  end
21
50
 
22
51
  def self.load(filename)
23
52
  raise ArgumentError, "File '#{filename}' does not exist." if !File.exists? filename
24
- new `file --mime #{Shellwords.escape(filename)}`
53
+ new `file --mime --brief #{Shellwords.escape(filename)}`
25
54
  end
26
55
 
27
56
  def self.parse(content)
28
57
  file = Tempfile.new(rand.to_s)
29
58
  file.write(content)
30
59
  file.rewind
31
- output = `file --mime #{file.path}`
60
+ new `file --mime --brief #{file.path}`
61
+ ensure
32
62
  file.close
33
63
  file.unlink
34
-
35
- new output
36
- end
37
-
38
- private
39
-
40
- def string
41
- @string ||= @output.match(STRING_REGEX)[1].strip
42
- end
43
-
44
- def encoding_string
45
- @encoding_string ||= string.match(ENCODING_REGEX)[1]
46
64
  end
47
65
  end
@@ -1,3 +1,3 @@
1
1
  class FileInfo
2
- VERSION = '0.2.0'
2
+ VERSION = '0.3.0'
3
3
  end
@@ -7,15 +7,33 @@ describe FileInfo do
7
7
  let(:macroman_file) { fixture('encoding_macroman.csv') }
8
8
  let(:utf8_file) { fixture('encoding_utf8.csv') }
9
9
 
10
- describe '.load' do
11
- it 'detects encoding from file' do
10
+ let(:photoshop_file) { fixture('mockup.psd') }
11
+ let(:binary_file) { fixture('bytes') }
12
+
13
+ describe '#charset' do
14
+ it 'returns encoding string' do
15
+ expect(FileInfo.load(ascii_file.path).charset).to eq 'us-ascii'
16
+ expect(FileInfo.load(isolatin_file.path).charset).to eq 'iso-8859-1'
17
+ expect(FileInfo.load(isowindows_file.path).charset).to eq 'iso-8859-1'
18
+ expect(FileInfo.load(utf8_file.path).charset).to eq 'utf-8'
19
+ end
20
+ end
21
+
22
+ describe '#encoding' do
23
+ it 'returns Encoding instance' do
12
24
  expect(FileInfo.load(ascii_file.path).encoding).to eq Encoding::US_ASCII
13
25
  expect(FileInfo.load(isolatin_file.path).encoding).to eq Encoding::ISO_8859_1
14
26
  expect(FileInfo.load(isowindows_file.path).encoding).to eq Encoding::ISO_8859_1
15
27
  expect(FileInfo.load(utf8_file.path).encoding).to eq Encoding::UTF_8
16
28
  end
17
29
 
18
- it 'detects encoding from file with space in filename' do
30
+ it 'raises UnknownEncodingError' do
31
+ expect { FileInfo.load(macroman_file.path).encoding }.to raise_error(FileInfo::UnknownEncodingError)
32
+ end
33
+ end
34
+
35
+ describe '.load' do
36
+ it 'accepts filename with space' do
19
37
  old_filename = fixture('encoding_utf8.csv').path
20
38
  new_filename = old_filename.sub('_', ' ')
21
39
  FileUtils.cp(old_filename, new_filename)
@@ -25,7 +43,7 @@ describe FileInfo do
25
43
  FileUtils.rm(new_filename)
26
44
  end
27
45
 
28
- it 'detects encoding from file with space and quote in filename' do
46
+ it 'accepts filename with space and quote' do
29
47
  old_filename = fixture('encoding_utf8.csv').path
30
48
  new_filename = old_filename.sub('_', ' " ')
31
49
  FileUtils.cp(old_filename, new_filename)
@@ -41,7 +59,7 @@ describe FileInfo do
41
59
  end
42
60
 
43
61
  describe '.parse' do
44
- it 'detects encoding from string' do
62
+ it 'accepts a string' do
45
63
  expect(FileInfo.parse(ascii_file.read).encoding).to eq Encoding::US_ASCII
46
64
  expect(FileInfo.parse(isolatin_file.read).encoding).to eq Encoding::ISO_8859_1
47
65
  expect(FileInfo.parse(isowindows_file.read).encoding).to eq Encoding::ISO_8859_1
@@ -49,9 +67,72 @@ describe FileInfo do
49
67
  end
50
68
  end
51
69
 
52
- describe '#encoding' do
53
- it 'raises UnknownEncodingError' do
54
- expect { FileInfo.load(macroman_file.path).encoding }.to raise_error(FileInfo::UnknownEncodingError)
70
+ let(:txt) { FileInfo.parse(FileInfo.parse('Hello, world!')) }
71
+ let(:csv) { FileInfo.load(utf8_file.path) }
72
+ let(:psd) { FileInfo.load(photoshop_file.path) }
73
+ let(:empty) { FileInfo.parse('') }
74
+ let(:bytes) { FileInfo.load(binary_file.path) }
75
+
76
+ describe '#content_type' do
77
+ it 'returns full Content-Type string' do
78
+ expect(txt.content_type).to eq 'text/plain; charset=us-ascii'
79
+ expect(csv.content_type).to eq 'text/plain; charset=utf-8'
80
+ expect(psd.content_type).to eq 'image/vnd.adobe.photoshop; charset=binary'
81
+ expect(empty.content_type).to eq 'application/x-empty; charset=binary'
82
+ expect(bytes.content_type).to eq 'application/octet-stream; charset=binary'
83
+ end
84
+ end
85
+
86
+ describe '#type' do
87
+ it 'returns MIME type string' do
88
+ expect(txt.type).to eq 'text/plain'
89
+ expect(csv.type).to eq 'text/plain'
90
+ expect(psd.type).to eq 'image/vnd.adobe.photoshop'
91
+ expect(empty.type).to eq 'application/x-empty'
92
+ expect(bytes.type).to eq 'application/octet-stream'
93
+ end
94
+ end
95
+
96
+ describe '#media_type' do
97
+ it 'returns MIME media type string' do
98
+ expect(txt.media_type).to eq 'text'
99
+ expect(csv.media_type).to eq 'text'
100
+ expect(psd.media_type).to eq 'image'
101
+ expect(empty.media_type).to eq 'application'
102
+ expect(bytes.media_type).to eq 'application'
103
+ end
104
+ end
105
+
106
+ describe '#sub_type' do
107
+ it 'returns MIME sub type string' do
108
+ expect(txt.sub_type).to eq 'plain'
109
+ expect(csv.sub_type).to eq 'plain'
110
+ expect(psd.sub_type).to eq 'vnd.adobe.photoshop'
111
+ expect(empty.sub_type).to eq 'x-empty'
112
+ expect(bytes.sub_type).to eq 'octet-stream'
113
+ end
114
+ end
115
+
116
+ describe '#mime_type' do
117
+ it 'returns a MIME::Type instance' do
118
+ [txt, csv, psd, bytes].each do |fileinfo|
119
+ expect(fileinfo.mime_type).to be_a MIME::Type
120
+ end
121
+ end
122
+
123
+ it 'returns nil for empty file' do
124
+ expect(empty.mime_type).to eq nil
125
+ end
126
+
127
+ context 'when "mime-types" gem isn’t available' do
128
+ before do
129
+ MIME.send(:remove_const, :Types)
130
+ allow_any_instance_of(FileInfo).to receive(:require).with('mime/types').and_raise(LoadError)
131
+ end
132
+
133
+ it 'raises LoadError with custom message' do
134
+ expect { txt.mime_type }.to raise_error(LoadError, FileInfo::MIME_TYPE_ERROR_MESSAGE)
135
+ end
55
136
  end
56
137
  end
57
138
  end
@@ -0,0 +1 @@
1
+ �Ɋ���z��S��Q_
Binary file
metadata CHANGED
@@ -1,68 +1,82 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fileinfo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafaël Blais Masson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-30 00:00:00.000000000 Z
11
+ date: 2014-04-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '2.14'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '2.14'
55
- description: FileInfo detects encoding from strings and files using the wonderful
56
- Unix `file` command.
55
+ - !ruby/object:Gem::Dependency
56
+ name: mime-types
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: FileInfo detects file encodings and MIME types using the wonderful Unix
70
+ `file` command.
57
71
  email:
58
72
  - rafael@heliom.ca
59
73
  executables: []
60
74
  extensions: []
61
75
  extra_rdoc_files: []
62
76
  files:
63
- - .gitignore
64
- - .rspec
65
- - .travis.yml
77
+ - ".gitignore"
78
+ - ".rspec"
79
+ - ".travis.yml"
66
80
  - Gemfile
67
81
  - LICENSE.txt
68
82
  - README.md
@@ -72,11 +86,13 @@ files:
72
86
  - lib/file_info/version.rb
73
87
  - lib/fileinfo.rb
74
88
  - spec/file_info_spec.rb
89
+ - spec/fixtures/bytes
75
90
  - spec/fixtures/encoding_ascii.csv
76
91
  - spec/fixtures/encoding_isolatin.csv
77
92
  - spec/fixtures/encoding_isowindows.csv
78
93
  - spec/fixtures/encoding_macroman.csv
79
94
  - spec/fixtures/encoding_utf8.csv
95
+ - spec/fixtures/mockup.psd
80
96
  - spec/spec_helper.rb
81
97
  homepage: http://github.com/rafBM/fileinfo
82
98
  licenses:
@@ -88,26 +104,28 @@ require_paths:
88
104
  - lib
89
105
  required_ruby_version: !ruby/object:Gem::Requirement
90
106
  requirements:
91
- - - '>='
107
+ - - ">="
92
108
  - !ruby/object:Gem::Version
93
109
  version: '0'
94
110
  required_rubygems_version: !ruby/object:Gem::Requirement
95
111
  requirements:
96
- - - '>='
112
+ - - ">="
97
113
  - !ruby/object:Gem::Version
98
114
  version: '0'
99
115
  requirements: []
100
116
  rubyforge_project:
101
- rubygems_version: 2.1.9
117
+ rubygems_version: 2.2.2
102
118
  signing_key:
103
119
  specification_version: 4
104
- summary: FileInfo detects encoding from strings and files using the wonderful Unix
105
- `file` command.
120
+ summary: FileInfo detects file encodings and MIME types using the wonderful Unix `file`
121
+ command.
106
122
  test_files:
107
123
  - spec/file_info_spec.rb
124
+ - spec/fixtures/bytes
108
125
  - spec/fixtures/encoding_ascii.csv
109
126
  - spec/fixtures/encoding_isolatin.csv
110
127
  - spec/fixtures/encoding_isowindows.csv
111
128
  - spec/fixtures/encoding_macroman.csv
112
129
  - spec/fixtures/encoding_utf8.csv
130
+ - spec/fixtures/mockup.psd
113
131
  - spec/spec_helper.rb