magic 0.1.1 → 0.2.0
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.
- data/README.rdoc +43 -2
- data/Rakefile +1 -1
- data/VERSION +1 -1
- data/lib/magic.rb +21 -19
- data/lib/magic/api.rb +1 -1
- data/lib/magic/database.rb +24 -7
- data/test/fixtures/magic_empty +1 -0
- data/test/fixtures/magic_jpeg +29 -0
- data/test/test_magic.rb +14 -0
- metadata +38 -34
data/README.rdoc
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
= magic
|
2
2
|
|
3
|
-
Ruby FFI bindings to the "magic" library
|
4
|
-
encoding of files and strings. There are three sets of tests,
|
3
|
+
Ruby FFI bindings to the "magic" library, that determines content type
|
4
|
+
and encoding of files and strings. There are three sets of tests,
|
5
5
|
performed in this order: filesystem tests, magic number tests, and
|
6
6
|
language tests. The first test that succeeds causes the file type to
|
7
7
|
be printed.
|
8
8
|
|
9
9
|
== Usage
|
10
|
+
|
10
11
|
require "magic"
|
11
12
|
Magic.guess_file_mime("public/images/rails.png")
|
12
13
|
# => "image/png; charset=binary"
|
@@ -20,6 +21,44 @@ be printed.
|
|
20
21
|
# => "utf-8"
|
21
22
|
Magic.guess_string_mime_type("Magic® File™")
|
22
23
|
# => "text/plain"
|
24
|
+
Magic.guess(:mime_type, :database => "/etc/magic") { |db| db.buffer("Magic® File™") }
|
25
|
+
# => "text/plain"
|
26
|
+
|
27
|
+
== Installation
|
28
|
+
|
29
|
+
gem install magic --source=http://gemcutter.org
|
30
|
+
|
31
|
+
=== Linux
|
32
|
+
|
33
|
+
Install magic library using your package manager, e.g.:
|
34
|
+
|
35
|
+
sudo apt-get install file
|
36
|
+
|
37
|
+
=== Mac OS
|
38
|
+
|
39
|
+
If you don't have <tt>libmagic.1.dylib</tt> file in your system, you need to
|
40
|
+
install it via port command:
|
41
|
+
|
42
|
+
sudo port install file
|
43
|
+
|
44
|
+
Sometimes you also need to set your
|
45
|
+
<tt>DYLD_FALLBACK_LIBRARY_PATH</tt> environment variable to the
|
46
|
+
directory of the <tt>libmagic.1.dylib</tt>:
|
47
|
+
|
48
|
+
export DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib
|
49
|
+
|
50
|
+
=== Windows
|
51
|
+
|
52
|
+
Install {File for
|
53
|
+
Windows}[http://gnuwin32.sourceforge.net/packages/file.htm]. You also
|
54
|
+
need to set your <tt>PATH</tt> environment variable to the directory of the
|
55
|
+
<tt>magic1.dll</tt> file:
|
56
|
+
|
57
|
+
set PATH=C:\Program Files\GnuWin32\bin;%PATH%
|
58
|
+
|
59
|
+
It might be also required to add <tt>database</tt> option explicitely:
|
60
|
+
|
61
|
+
Magic.guess_string_mime("Magic® File™", :database => 'C:\Program Files\GnuWin32\share\misc\magic.mgc')
|
23
62
|
|
24
63
|
== Links
|
25
64
|
* gemcutter[http://gemcutter.org/gems/magic]
|
@@ -28,6 +67,7 @@ be printed.
|
|
28
67
|
* rdoc[http://qoobaa.github.com/magic]
|
29
68
|
|
30
69
|
== Note on Patches/Pull Requests
|
70
|
+
|
31
71
|
* Fork the project.
|
32
72
|
* Make your feature addition or bug fix.
|
33
73
|
* Add tests for it. This is important so I don't break it in a future
|
@@ -38,6 +78,7 @@ be printed.
|
|
38
78
|
* Send me a pull request. Bonus points for topic branches.
|
39
79
|
|
40
80
|
== Copyright
|
81
|
+
|
41
82
|
Copyright (c) 2010 Jakub Kuźma. See
|
42
83
|
LICENSE[http://github.com/qoobaa/magic/raw/master/LICENSE] for
|
43
84
|
details.
|
data/Rakefile
CHANGED
@@ -31,7 +31,7 @@ begin
|
|
31
31
|
| You'll also need to set your PATH environment variable to the |
|
32
32
|
| directory of the magic1.dll file |
|
33
33
|
| |
|
34
|
-
| set PATH=C
|
34
|
+
| set PATH=C:\\Program Files\\GnuWin32\\bin;%PATH% |
|
35
35
|
| |
|
36
36
|
+-NOTE FOR MAC OS USERS --------------------------------------------+
|
37
37
|
| |
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.2.0
|
data/lib/magic.rb
CHANGED
@@ -13,57 +13,59 @@ module Magic
|
|
13
13
|
# ====== Example
|
14
14
|
# Magic.guess_file_mime("public/images/rails.png")
|
15
15
|
# # => "image/png; charset=binary"
|
16
|
-
def guess_file_mime(
|
17
|
-
guess(:
|
16
|
+
def guess_file_mime(filename, *args)
|
17
|
+
guess(*args.unshift(:mime)) { |db| db.file(filename) }
|
18
18
|
end
|
19
19
|
|
20
20
|
# Guesses mime encoding of given file
|
21
21
|
# ===== Example
|
22
22
|
# Magic.guess_file_mime_encoding("public/images/rails.png")
|
23
23
|
# # => "binary"
|
24
|
-
def guess_file_mime_encoding(
|
25
|
-
guess(:
|
24
|
+
def guess_file_mime_encoding(filename, *args)
|
25
|
+
guess(*args.unshift(:mime_encoding)) { |db| db.file(filename) }
|
26
26
|
end
|
27
27
|
|
28
28
|
# Guesses mime type of given file
|
29
29
|
# ===== Example
|
30
30
|
# Magic.guess_file_mime_type("public/images/rails.png")
|
31
31
|
# # => "image/png"
|
32
|
-
def guess_file_mime_type(
|
33
|
-
guess(:
|
32
|
+
def guess_file_mime_type(filename, *args)
|
33
|
+
guess(*args.unshift(:mime_type)) { |db| db.file(filename) }
|
34
34
|
end
|
35
35
|
|
36
36
|
# Guesses mime type of given string
|
37
37
|
# ===== Example
|
38
38
|
# Magic.guess_string_mime("Magic® File™")
|
39
39
|
# # => "text/plain; charset=utf-8"
|
40
|
-
def guess_string_mime(string)
|
41
|
-
guess(:
|
40
|
+
def guess_string_mime(string, *args)
|
41
|
+
guess(*args.unshift(:mime)) { |db| db.buffer(string) }
|
42
42
|
end
|
43
43
|
|
44
44
|
# Guesses mime type of given string
|
45
45
|
# ===== Example
|
46
46
|
# Magic.guess_string_mime_encoding("Magic® File™")
|
47
47
|
# # => "utf-8"
|
48
|
-
def guess_string_mime_encoding(string)
|
49
|
-
guess(:
|
48
|
+
def guess_string_mime_encoding(string, *args)
|
49
|
+
guess(*args.unshift(:mime_type)) { |db| db.buffer(string) }
|
50
50
|
end
|
51
51
|
|
52
52
|
# Guesses mime type of given string
|
53
53
|
# ===== Example
|
54
54
|
# Magic.guess_string_mime_type("Magic® File™")
|
55
55
|
# # => "text/plain"
|
56
|
-
def guess_string_mime_type(string)
|
57
|
-
guess(:
|
56
|
+
def guess_string_mime_type(string, *args)
|
57
|
+
guess(*args.unshift(:mime_type)) { |db| db.buffer(string) }
|
58
58
|
end
|
59
59
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
db.
|
66
|
-
|
60
|
+
# Creates magic database and yields it to the given block
|
61
|
+
# ===== Example
|
62
|
+
# Magic.guess(:mime) { |db| db.buffer("Magic® File™") }
|
63
|
+
# # => "text/plain; charset=utf-8"
|
64
|
+
def guess(*args)
|
65
|
+
db = Database.new(*args)
|
66
|
+
yield(db).tap do
|
67
|
+
db.close
|
68
|
+
end
|
67
69
|
end
|
68
70
|
end
|
69
71
|
end
|
data/lib/magic/api.rb
CHANGED
@@ -10,7 +10,7 @@ module Magic
|
|
10
10
|
# attach_function :magic_descriptor, [:pointer, :int], :string
|
11
11
|
attach_function :magic_buffer, [:pointer, :pointer, :uint], :pointer
|
12
12
|
attach_function :magic_error, [:pointer], :string
|
13
|
-
|
13
|
+
attach_function :magic_setflags, [:pointer, :int], :int
|
14
14
|
attach_function :magic_load, [:pointer, :string], :int
|
15
15
|
# attach_function :magic_compile, [:pointer, :string], :int
|
16
16
|
# attach_function :magic_check, [:pointer, :string], :int
|
data/lib/magic/database.rb
CHANGED
@@ -1,15 +1,20 @@
|
|
1
1
|
module Magic
|
2
2
|
class Database
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
attr_reader :flags
|
4
|
+
|
5
|
+
# Creates an instance of +Magic::Database+ using given database
|
6
|
+
# file and flags
|
7
|
+
def initialize(*args)
|
8
|
+
options = args.last.is_a?(Hash) ? args.pop : {} # extract options
|
9
|
+
database = options.delete(:database)
|
10
|
+
open(*args)
|
11
|
+
load(database)
|
7
12
|
end
|
8
13
|
|
9
14
|
# Opens magic db using given flags
|
10
15
|
def open(*flags)
|
11
|
-
|
12
|
-
@magic_set = Api.magic_open(
|
16
|
+
@flags = calculate_flags(*flags)
|
17
|
+
@magic_set = Api.magic_open(@flags)
|
13
18
|
end
|
14
19
|
|
15
20
|
# Closes the database
|
@@ -42,9 +47,21 @@ module Magic
|
|
42
47
|
end
|
43
48
|
end
|
44
49
|
|
45
|
-
# Returns last error occured
|
50
|
+
# Returns the last error occured
|
46
51
|
def error
|
47
52
|
Api.magic_error(@magic_set)
|
48
53
|
end
|
54
|
+
|
55
|
+
# Sets the flags
|
56
|
+
def flags=(*flags)
|
57
|
+
@flags = calculate_flags(*flags)
|
58
|
+
Api.magic_setflags(@magic_set, @flags)
|
59
|
+
end
|
60
|
+
|
61
|
+
protected
|
62
|
+
|
63
|
+
def calculate_flags(*flags)
|
64
|
+
flags.inject(0) { |calculated, flag| calculated |= Constants::Flag.const_get(flag.to_s.upcase) }
|
65
|
+
end
|
49
66
|
end
|
50
67
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# This is an empty magic database file
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#------------------------------------------------------------------------------
|
2
|
+
# JPEG images
|
3
|
+
# SunOS 5.5.1 had
|
4
|
+
#
|
5
|
+
# 0 string \377\330\377\340 JPEG file
|
6
|
+
# 0 string \377\330\377\356 JPG file
|
7
|
+
#
|
8
|
+
# both of which turn into "JPEG image data" here.
|
9
|
+
#
|
10
|
+
0 beshort 0xffd8 JPEG image data
|
11
|
+
!:mime image/jpeg
|
12
|
+
!:apple 8BIMJPEG
|
13
|
+
!:strength +1
|
14
|
+
>6 string JFIF \b, JFIF standard
|
15
|
+
# The following added by Erik Rossen <rossen@freesurf.ch> 1999-09-06
|
16
|
+
# in a vain attempt to add image size reporting for JFIF. Note that these
|
17
|
+
# tests are not fool-proof since some perfectly valid JPEGs are currently
|
18
|
+
# impossible to specify in magic(4) format.
|
19
|
+
# First, a little JFIF version info:
|
20
|
+
>>11 byte x \b %d.
|
21
|
+
>>12 byte x \b%02d
|
22
|
+
# Next, the resolution or aspect ratio of the image:
|
23
|
+
#>>13 byte 0 \b, aspect ratio
|
24
|
+
#>>13 byte 1 \b, resolution (DPI)
|
25
|
+
#>>13 byte 2 \b, resolution (DPCM)
|
26
|
+
#>>4 beshort x \b, segment length %d
|
27
|
+
# Next, show thumbnail info, if it exists:
|
28
|
+
>>18 byte !0 \b, thumbnail %dx
|
29
|
+
>>>19 byte x \b%d
|
data/test/test_magic.rb
CHANGED
@@ -42,4 +42,18 @@ class TestMagic < Test::Unit::TestCase
|
|
42
42
|
Magic.guess_file_mime_encoding(fixture("non-existing.file"))
|
43
43
|
end
|
44
44
|
end
|
45
|
+
|
46
|
+
def test_guess_magic_logo_mime_with_jpeg_database
|
47
|
+
assert_equal "image/jpeg; charset=binary", Magic.guess_file_mime(fixture("filelogo.jpg"), :database => fixture("magic_jpeg"))
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_guess_magic_logo_mime_with_empty_database
|
51
|
+
assert_equal "application/octet-stream; charset=binary", Magic.guess_file_mime(fixture("filelogo.jpg"), :database => fixture("magic_empty"))
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_guess_with_block
|
55
|
+
result = nil
|
56
|
+
Magic.guess(:mime) { |db| result = db.file(fixture("filelogo.jpg")) }
|
57
|
+
assert_equal "image/jpeg; charset=binary", result
|
58
|
+
end
|
45
59
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: magic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- "Jakub Ku\xC5\xBAma"
|
@@ -55,45 +55,49 @@ files:
|
|
55
55
|
- lib/magic/errors.rb
|
56
56
|
- test/fixtures/filelogo.jpg
|
57
57
|
- test/fixtures/magic.txt
|
58
|
+
- test/fixtures/magic_empty
|
59
|
+
- test/fixtures/magic_jpeg
|
58
60
|
- test/helper.rb
|
59
61
|
- test/test_magic.rb
|
60
62
|
has_rdoc: true
|
61
63
|
homepage: http://github.com/qoobaa/magic
|
62
64
|
licenses: []
|
63
65
|
|
64
|
-
post_install_message:
|
65
|
-
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
71
|
-
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
82
|
-
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
66
|
+
post_install_message: |
|
67
|
+
+-NOTE FOR LINUX USERS----------------------------------------------+
|
68
|
+
| |
|
69
|
+
| Install libmagic using your package manager, e.g. |
|
70
|
+
| |
|
71
|
+
| sudo apt-get install file |
|
72
|
+
| |
|
73
|
+
+-NOTE FOR WINDOWS USERS -------------------------------------------+
|
74
|
+
| |
|
75
|
+
| Install File for Windows from |
|
76
|
+
| |
|
77
|
+
| http://gnuwin32.sourceforge.net/packages/file.htm |
|
78
|
+
| |
|
79
|
+
| You'll also need to set your PATH environment variable to the |
|
80
|
+
| directory of the magic1.dll file |
|
81
|
+
| |
|
82
|
+
| set PATH=C:\Program Files\GnuWin32\bin;%PATH% |
|
83
|
+
| |
|
84
|
+
+-NOTE FOR MAC OS USERS --------------------------------------------+
|
85
|
+
| |
|
86
|
+
| If you don't have libmagic.1.dylib file in your system |
|
87
|
+
| |
|
88
|
+
| find / -name libmagic.1.dylib |
|
89
|
+
| |
|
90
|
+
| You need to install it via port command |
|
91
|
+
| |
|
92
|
+
| sudo port install file |
|
93
|
+
| |
|
94
|
+
| Sometimes you'll also need to set your DYLD_FALLBACK_LIBRARY_PATH |
|
95
|
+
| environment variable to the directory of the libmagic.1.dylib |
|
96
|
+
| |
|
97
|
+
| export DYLD_FALLBACK_LIBRARY_PATH=/opt/local/lib |
|
98
|
+
| |
|
99
|
+
+-------------------------------------------------------------------+
|
100
|
+
|
97
101
|
rdoc_options:
|
98
102
|
- --charset=UTF-8
|
99
103
|
require_paths:
|