ruby-filemagic 0.5.2 → 0.6.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: de14d26ab48eb9a2a818ed8e264e3e5ef2b0f85f
4
- data.tar.gz: 96efd9c81179201c442d1886424bf712bb9eed44
3
+ metadata.gz: 1403f497e908d066aeaeb6d235b1b947de376a3f
4
+ data.tar.gz: 546e5fa1ac73f1a69ebee0f9347ffc2171ebe65d
5
5
  SHA512:
6
- metadata.gz: e369f3dec254577adfa08f49f80de64e3156e592669a60eb53006621b9c2914a5ac74136f5073f2821f47e3ec6109c25793f00c26692856e3e8859dab1330982
7
- data.tar.gz: d4db029e182841f8f62b927143b8f149ddbb0bc81f849e5169078acb3c3fdf3092f3a31da352d693e21497daa95d14db684488b6280f2d27b7c572bac9220113
6
+ metadata.gz: 1ea4401b1fcc93e015d4e7049928bc95381013f4e915f0e3a02ca30476d5f3a0454408b8da9ac875bf62427e6237630ac4cd8db2025347a86dae7ae04a65f004
7
+ data.tar.gz: 616165278b30cd859741a4a76dc752b6a798f5ac93951e294e0f4a5aaf228648f977d98899f165ccf28dfcc275cf087e6a7353f90f0511db32cfe4a60a04cde5
data/ChangeLog CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  = Revision history for ruby-filemagic
4
4
 
5
+ == 0.6.0 [2014-05-16]
6
+
7
+ * Required Ruby version >= 1.9.3.
8
+ * New method FileMagic#list (+magic_list+).
9
+ * New method FileMagic#load (+magic_load+).
10
+ * New method FileMagic.path (+magic_getpath+).
11
+ * New method FileMagic.magic_version.
12
+ * New method FileMagic.flags.
13
+ * New flag +no_check_builtin+.
14
+ * Tests print libmagic version and path.
15
+ * Internal refactoring.
16
+
5
17
  == 0.5.2 [2014-04-24]
6
18
 
7
19
  * Use MAGIC_VERSION if available.
data/README CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  == VERSION
4
4
 
5
- This documentation refers to filemagic version 0.5.2
5
+ This documentation refers to filemagic version 0.6.0
6
6
 
7
7
 
8
8
  == DESCRIPTION
@@ -43,9 +43,10 @@ Travis
43
43
  == LINKS
44
44
 
45
45
  Homepage:: http://www.darwinsys.com/file/
46
- Documentation:: https://blackwinter.github.io/ruby-filemagic/
46
+ Documentation:: https://blackwinter.github.com/ruby-filemagic
47
47
  Source code:: https://github.com/blackwinter/ruby-filemagic
48
48
  RubyGem:: https://rubygems.org/gems/ruby-filemagic
49
+ Travis CI:: https://travis-ci.org/blackwinter/ruby-filemagic
49
50
 
50
51
 
51
52
  == AUTHORS
data/Rakefile CHANGED
@@ -4,21 +4,23 @@ begin
4
4
  require 'hen'
5
5
 
6
6
  Hen.lay! {{
7
- :gem => {
8
- :name => %q{ruby-filemagic},
9
- :version => FileMagic::VERSION,
10
- :summary => 'Ruby bindings to the magic(4) library',
11
- :authors => ['Travis Whitton', 'Jens Wille'],
12
- :email => ['tinymountain@gmail.com', 'jens.wille@gmail.com'],
13
- :license => %q{Ruby},
14
- :homepage => :blackwinter,
15
- :extra_files => FileList['info/*'].to_a,
16
- :dependencies => %w[],
17
- :extension => {
18
- :name => 'ruby_filemagic',
19
- :ext_name => 'filemagic',
20
- :cross_compile => false
21
- }
7
+ gem: {
8
+ name: %q{ruby-filemagic},
9
+ version: FileMagic::VERSION,
10
+ summary: 'Ruby bindings to the magic(4) library',
11
+ authors: ['Travis Whitton', 'Jens Wille'],
12
+ email: 'jens.wille@gmail.com',
13
+ license: %q{Ruby},
14
+ homepage: :blackwinter,
15
+ extra_files: FileList['info/*'].to_a,
16
+ dependencies: %w[],
17
+ extension: {
18
+ name: 'ruby_filemagic',
19
+ ext_name: 'filemagic',
20
+ cross_compile: false
21
+ },
22
+
23
+ required_ruby_version: '>= 1.9.3'
22
24
  }
23
25
  }}
24
26
  rescue LoadError => err
@@ -1,28 +1,62 @@
1
- /*********************************************************
1
+ #include "filemagic.h"
2
2
 
3
- filemagic.c
3
+ /* Returns the magic path */
4
+ static VALUE
5
+ rb_magic_getpath(VALUE klass) {
6
+ return rb_str_new2(magic_getpath(NULL, 0));
7
+ }
4
8
 
5
- a Ruby extension to bind Ruby to the libmagic library
6
- (ftp://ftp.astron.com/pub/file/)
9
+ /* Converts flags to integer */
10
+ static VALUE
11
+ rb_magic_flags(VALUE klass, VALUE flags) {
12
+ VALUE map = rb_const_get(cFileMagic, rb_intern("FLAGS_BY_SYM")), f, g;
13
+ int i = MAGIC_NONE, j;
7
14
 
8
- patterned very closely off of audiofile.c by jaredj which
9
- is patterned very very closely off of gdbm.c by matz ;-)
15
+ if (TYPE(flags) != T_ARRAY) {
16
+ rb_raise(rb_eTypeError,
17
+ "wrong argument type %s (expected Array)",
18
+ rb_obj_classname(flags));
19
+ }
10
20
 
11
- $Author: twhitton $
12
- $Date: 2003/07/30 13:25:10 $
21
+ for (j = 0; j < RARRAY_LEN(flags); j++) {
22
+ f = rb_ary_entry(flags, j);
13
23
 
14
- *********************************************************/
24
+ switch (TYPE(f)) {
25
+ case T_SYMBOL:
26
+ if (RTEST(g = rb_hash_aref(map, f))) {
27
+ f = g;
28
+ /* fall through */
29
+ }
30
+ else {
31
+ f = rb_funcall(f, rb_intern("inspect"), 0);
32
+ rb_raise(rb_eArgError, "%s: %s",
33
+ NIL_P(g) ? "no such flag" : "flag not available",
34
+ StringValueCStr(f));
15
35
 
16
- #include "filemagic.h"
36
+ break;
37
+ }
38
+ case T_FIXNUM:
39
+ i |= NUM2INT(f);
40
+ break;
41
+ default:
42
+ rb_raise(rb_eTypeError,
43
+ "wrong argument type %s (expected Fixnum or Symbol)",
44
+ rb_obj_classname(f));
45
+ }
46
+ }
47
+
48
+ return INT2FIX(i);
49
+ }
17
50
 
18
51
  /* FileMagic.new */
19
52
  static VALUE
20
- rb_magic_new(int argc, VALUE *argv, VALUE class) {
53
+ rb_magic_new(int argc, VALUE *argv, VALUE klass) {
21
54
  VALUE obj, args[2];
22
- magic_t cookie;
55
+ magic_t ms;
23
56
 
24
57
  if (rb_block_given_p()) {
25
- rb_warn("FileMagic::new() does not take block; use FileMagic::open() instead");
58
+ rb_warn(
59
+ "FileMagic.new() does not take a block; use FileMagic.open() instead");
26
60
  }
27
61
 
28
62
  if (argc > 0 && TYPE(args[1] = argv[argc - 1]) == T_HASH) {
@@ -32,22 +66,29 @@ rb_magic_new(int argc, VALUE *argv, VALUE class) {
32
66
  args[1] = rb_hash_new();
33
67
  }
34
68
 
35
- args[0] = rb_magic_flags_to_int(rb_ary_new4(argc, argv));
69
+ args[0] = rb_magic_flags(klass, rb_ary_new4(argc, argv));
36
70
 
37
- if ((cookie = magic_open(NUM2INT(args[0]))) == NULL) {
38
- rb_fatal("out of memory");
71
+ if ((ms = magic_open(NUM2INT(args[0]))) == NULL) {
72
+ rb_raise(rb_FileMagicError,
73
+ "failed to initialize magic cookie (%d)", errno || -1);
39
74
  }
40
75
 
41
- if (magic_load(cookie, NULL) == -1) {
42
- rb_fatal("%s", magic_error(cookie));
76
+ if (magic_load(ms, NULL) == -1) {
77
+ rb_raise(rb_FileMagicError,
78
+ "failed to load database: %s", magic_error(ms));
43
79
  }
44
80
 
45
- obj = Data_Wrap_Struct(class, 0, rb_magic_free, cookie);
81
+ obj = Data_Wrap_Struct(klass, 0, rb_magic_free, ms);
46
82
  rb_obj_call_init(obj, 2, args);
47
83
 
48
84
  return obj;
49
85
  }
50
86
 
87
+ static void
88
+ rb_magic_free(magic_t ms) {
89
+ magic_close(ms);
90
+ }
91
+
51
92
  static VALUE
52
93
  rb_magic_init(int argc, VALUE *argv, VALUE self) {
53
94
  VALUE flags, options, keys, k, m;
@@ -58,16 +99,14 @@ rb_magic_init(int argc, VALUE *argv, VALUE self) {
58
99
  options = rb_hash_new();
59
100
  }
60
101
 
61
- rb_iv_set(self, "_flags", flags);
102
+ rb_iv_set(self, "iflags", flags);
62
103
  rb_iv_set(self, "closed", Qfalse);
63
104
 
64
105
  keys = rb_funcall(options, rb_intern("keys"), 0);
65
106
 
66
107
  for (i = 0; i < RARRAY_LEN(keys); i++) {
67
- k = rb_funcall(keys, rb_intern("[]"), 1, INT2FIX(i));
68
- m = rb_funcall(rb_funcall(k, rb_intern("to_s"), 0),
69
- rb_intern("+"), 1, rb_str_new2("=")
70
- );
108
+ k = rb_ary_entry(keys, i);
109
+ m = rb_str_plus(rb_obj_as_string(k), rb_str_new2("="));
71
110
 
72
111
  if (rb_respond_to(self, mid = rb_intern(StringValueCStr(m)))) {
73
112
  rb_funcall(self, mid, 1, rb_hash_aref(options, k));
@@ -84,17 +123,17 @@ rb_magic_init(int argc, VALUE *argv, VALUE self) {
84
123
  /* Frees resources allocated */
85
124
  static VALUE
86
125
  rb_magic_close(VALUE self) {
87
- magic_t cookie;
126
+ magic_t ms;
88
127
 
89
128
  if (RTEST(rb_magic_closed_p(self))) {
90
129
  return Qnil;
91
130
  }
92
131
 
93
- GetMagicCookie(self, cookie);
94
- magic_close(cookie);
132
+ GetMagicSet(self, ms);
133
+ rb_magic_free(ms);
95
134
 
96
135
  /* This keeps rb_magic_free from trying to free closed objects */
97
- RDATA(self)->data = NULL;
136
+ DATA_PTR(self) = NULL;
98
137
 
99
138
  rb_iv_set(self, "closed", Qtrue);
100
139
 
@@ -107,49 +146,17 @@ rb_magic_closed_p(VALUE self) {
107
146
  }
108
147
 
109
148
  /* Return a string describing file */
110
- static VALUE
111
- rb_magic_file(int argc, VALUE *argv, VALUE self) {
112
- VALUE file, s;
113
- const char *m;
114
- magic_t cookie;
115
-
116
- rb_scan_args(argc, argv, "11", &file, &s);
117
-
118
- m = StringValuePtr(file);
119
- GetMagicCookie(self, cookie);
120
-
121
- if ((m = magic_file(cookie, m)) == NULL) {
122
- rb_raise(rb_FileMagicError, "%s", magic_error(cookie));
123
- }
124
-
125
- return rb_magic_apply_simple(self, m, s);
126
- }
149
+ RB_MAGIC_TYPE(file, FILE)
127
150
 
128
151
  /* Return a string describing the string buffer */
129
- static VALUE
130
- rb_magic_buffer(int argc, VALUE *argv, VALUE self) {
131
- VALUE buffer, s;
132
- const char *m;
133
- magic_t cookie;
134
-
135
- rb_scan_args(argc, argv, "11", &buffer, &s);
136
-
137
- m = StringValuePtr(buffer);
138
- GetMagicCookie(self, cookie);
139
-
140
- if ((m = magic_buffer(cookie, m, RSTRING_LEN(buffer))) == NULL) {
141
- rb_raise(rb_FileMagicError, "%s", magic_error(cookie));
142
- }
143
-
144
- return rb_magic_apply_simple(self, m, s);
145
- }
152
+ RB_MAGIC_TYPE(buffer, BUFFER)
146
153
 
147
154
  /* Get the flags as array of symbols */
148
155
  static VALUE
149
156
  rb_magic_getflags(VALUE self) {
150
157
  VALUE ary = rb_ary_new();
151
158
  VALUE map = rb_const_get(cFileMagic, rb_intern("FLAGS_BY_INT"));
152
- int i = NUM2INT(rb_attr_get(self, rb_intern("_flags"))), j = 0;
159
+ int i = NUM2INT(rb_attr_get(self, rb_intern("iflags"))), j = 0;
153
160
 
154
161
  while ((i -= j) > 0) {
155
162
  j = pow(2, (int)(log(i) / log(2)));
@@ -159,117 +166,30 @@ rb_magic_getflags(VALUE self) {
159
166
  return ary;
160
167
  }
161
168
 
162
- /* Set flags on the cookie object */
169
+ /* Set flags on the ms object */
163
170
  static VALUE
164
171
  rb_magic_setflags(VALUE self, VALUE flags) {
165
- int retval;
166
- magic_t cookie;
172
+ magic_t ms;
167
173
 
168
- flags = rb_Array(flags);
169
- flags = rb_magic_flags_to_int(flags);
170
- rb_iv_set(self, "_flags", flags);
174
+ GetMagicSet(self, ms);
171
175
 
172
- GetMagicCookie(self, cookie);
173
- retval = magic_setflags(cookie, NUM2INT(flags));
176
+ rb_iv_set(self, "iflags",
177
+ flags = rb_magic_flags(CLASS_OF(self), rb_Array(flags)));
174
178
 
175
- return INT2FIX(retval);
179
+ return INT2FIX(magic_setflags(ms, NUM2INT(flags)));
176
180
  }
177
181
 
178
- /* Checks validity of a magic database file */
179
- static VALUE
180
- rb_magic_check(int argc, VALUE *argv, VALUE self) {
181
- VALUE s;
182
- const char *file;
183
- int retval;
184
- magic_t cookie;
182
+ /* Lists a magic database file */
183
+ RB_MAGIC_APPRENTICE(list)
185
184
 
186
- file = rb_scan_args(argc, argv, "01", &s) == 1 ? StringValuePtr(s) : NULL;
185
+ /* Loads a magic database file */
186
+ RB_MAGIC_APPRENTICE(load)
187
187
 
188
- GetMagicCookie(self, cookie);
189
- retval = magic_check(cookie, file);
190
-
191
- return INT2FIX(retval);
192
- }
188
+ /* Checks validity of a magic database file */
189
+ RB_MAGIC_APPRENTICE(check)
193
190
 
194
191
  /* Compiles a magic database file */
195
- static VALUE
196
- rb_magic_compile(VALUE self, VALUE file) {
197
- int retval;
198
- const char *m;
199
- magic_t cookie;
200
-
201
- GetMagicCookie(self, cookie);
202
- m = StringValuePtr(file);
203
- retval = magic_compile(cookie, m);
204
-
205
- return INT2FIX(retval);
206
- }
207
-
208
- static VALUE
209
- rb_magic_flags_to_int(VALUE ary) {
210
- VALUE map = rb_const_get(cFileMagic, rb_intern("FLAGS_BY_SYM"));
211
- VALUE f, g;
212
- int i = MAGIC_NONE, j;
213
-
214
- for (j = 0; j < RARRAY_LEN(ary); j++) {
215
- f = rb_ary_entry(ary, j);
216
-
217
- switch (TYPE(f)) {
218
- case T_SYMBOL:
219
- if (RTEST(g = rb_hash_aref(map, f))) {
220
- f = g;
221
- /* fall through */
222
- }
223
- else {
224
- f = rb_funcall(f, rb_intern("inspect"), 0);
225
- rb_raise(rb_eArgError,
226
- "%s: %s",
227
- NIL_P(g) ? "no such flag" : "flag not available",
228
- StringValueCStr(f)
229
- );
230
- break;
231
- }
232
- case T_FIXNUM:
233
- i |= NUM2INT(f);
234
- break;
235
- default:
236
- rb_raise(rb_eTypeError,
237
- "wrong argument type %s (expected Fixnum or Symbol)",
238
- rb_obj_classname(f)
239
- );
240
- }
241
- }
242
-
243
- return INT2FIX(i);
244
- }
245
-
246
- static VALUE
247
- rb_magic_apply_simple(VALUE self, const char *m, VALUE s) {
248
- VALUE str = rb_str_new2(m);
249
-
250
- if (RTEST(NIL_P(s) ? rb_attr_get(self, rb_intern("@simplified")) : s)) {
251
- rb_funcall(str, rb_intern("downcase!"), 0);
252
-
253
- return rb_funcall(str, rb_intern("slice"), 2,
254
- rb_const_get(cFileMagic, rb_intern("SIMPLE_RE")),
255
- INT2FIX(1)
256
- );
257
- }
258
- else {
259
- return str;
260
- }
261
- }
262
-
263
- /*
264
- GC never seems to happen until the program terminates, but this is called
265
- on any unclosed objects
266
- */
267
- static void
268
- rb_magic_free(magic_t cookie) {
269
- magic_close(cookie);
270
- }
271
-
272
- #define RB_MAGIC_SET_VERSION(m, p) sprintf(version, "%d.%02d", m, p);
192
+ RB_MAGIC_APPRENTICE(compile)
273
193
 
274
194
  void
275
195
  Init_ruby_filemagic() {
@@ -284,7 +204,9 @@ Init_ruby_filemagic() {
284
204
 
285
205
  rb_define_const(cFileMagic, "MAGIC_VERSION", rb_str_new2(version));
286
206
 
287
- rb_define_singleton_method(cFileMagic, "new", rb_magic_new, -1);
207
+ rb_define_singleton_method(cFileMagic, "path", rb_magic_getpath, 0);
208
+ rb_define_singleton_method(cFileMagic, "flags", rb_magic_flags, 1);
209
+ rb_define_singleton_method(cFileMagic, "new", rb_magic_new, -1);
288
210
 
289
211
  rb_define_method(cFileMagic, "initialize", rb_magic_init, -1);
290
212
  rb_define_method(cFileMagic, "close", rb_magic_close, 0);
@@ -293,8 +215,10 @@ Init_ruby_filemagic() {
293
215
  rb_define_method(cFileMagic, "buffer", rb_magic_buffer, -1);
294
216
  rb_define_method(cFileMagic, "flags", rb_magic_getflags, 0);
295
217
  rb_define_method(cFileMagic, "flags=", rb_magic_setflags, 1);
218
+ rb_define_method(cFileMagic, "list", rb_magic_list, -1);
219
+ rb_define_method(cFileMagic, "load", rb_magic_load, -1);
296
220
  rb_define_method(cFileMagic, "check", rb_magic_check, -1);
297
- rb_define_method(cFileMagic, "compile", rb_magic_compile, 1);
221
+ rb_define_method(cFileMagic, "compile", rb_magic_compile, -1);
298
222
 
299
223
  rb_alias(cFileMagic, rb_intern("valid?"), rb_intern("check"));
300
224
 
@@ -369,6 +293,10 @@ Init_ruby_filemagic() {
369
293
  #ifdef MAGIC_NO_CHECK_ENCODING
370
294
  rb_define_const(cFileMagic, "MAGIC_NO_CHECK_ENCODING", INT2FIX(MAGIC_NO_CHECK_ENCODING));
371
295
  #endif
296
+ #if defined(MAGIC_NO_CHECK_BUILTIN) && MAGIC_VERSION > 514
297
+ /* defined in b5be901 (2010-01-28, 5.05), but broken until 38e0136 (2013-08-15, 5.15) */
298
+ rb_define_const(cFileMagic, "MAGIC_NO_CHECK_BUILTIN", INT2FIX(MAGIC_NO_CHECK_BUILTIN));
299
+ #endif
372
300
  #ifdef MAGIC_NO_CHECK_ASCII
373
301
  rb_define_const(cFileMagic, "MAGIC_NO_CHECK_ASCII", INT2FIX(MAGIC_NO_CHECK_ASCII));
374
302
  #endif
@@ -3,46 +3,96 @@
3
3
 
4
4
  #include "ruby.h"
5
5
  #include <math.h>
6
+ #include <errno.h>
6
7
  #include <magic.h>
7
8
  #ifdef HAVE_FILE_PATCHLEVEL_H
8
9
  #include <file/patchlevel.h>
9
10
  #endif
10
11
 
11
- /* Ruby 1.8.5 compatibility */
12
- #ifndef RSTRING_LEN
13
- #define RSTRING_LEN(s) (RSTRING(s)->len)
14
- #endif
15
- #ifndef RARRAY_LEN
16
- #define RARRAY_LEN(s) (RARRAY(s)->len)
17
- #endif
18
-
19
- #define GetMagicCookie(obj, cookie) {\
12
+ #define GetMagicSet(obj, ms) {\
20
13
  if (RTEST(rb_magic_closed_p(obj))) {\
21
14
  rb_raise(rb_eRuntimeError, "closed stream");\
22
15
  }\
23
16
  else {\
24
- Data_Get_Struct((obj), struct magic_set, (cookie));\
17
+ Data_Get_Struct((obj), struct magic_set, (ms));\
18
+ }\
19
+ }
20
+
21
+ #define RB_MAGIC_TYPE_FILE magic_file(ms, str)
22
+ #define RB_MAGIC_TYPE_BUFFER magic_buffer(ms, str, RSTRING_LEN(arg))
23
+
24
+ #define RB_MAGIC_TYPE(what, WHAT) \
25
+ static VALUE \
26
+ rb_magic_##what(int argc, VALUE *argv, VALUE self) {\
27
+ VALUE arg, simple, res;\
28
+ const char *str, *type;\
29
+ magic_t ms;\
30
+ \
31
+ rb_scan_args(argc, argv, "11", &arg, &simple);\
32
+ \
33
+ str = StringValuePtr(arg);\
34
+ GetMagicSet(self, ms);\
35
+ \
36
+ if ((type = RB_MAGIC_TYPE_##WHAT) == NULL) {\
37
+ rb_raise(rb_FileMagicError, "failed lookup: %s", magic_error(ms));\
38
+ }\
39
+ \
40
+ res = rb_str_new2(type);\
41
+ \
42
+ if (NIL_P(simple)) {\
43
+ simple = rb_attr_get(self, rb_intern("@simplified"));\
44
+ }\
45
+ \
46
+ if (RTEST(simple)) {\
47
+ rb_funcall(res, rb_intern("downcase!"), 0);\
48
+ \
49
+ return rb_funcall(res, rb_intern("slice"), 2,\
50
+ rb_const_get(cFileMagic, rb_intern("SIMPLE_RE")), INT2FIX(1));\
51
+ }\
52
+ else {\
53
+ return res;\
25
54
  }\
26
55
  }
27
56
 
57
+ #define RB_MAGIC_APPRENTICE(what) \
58
+ static VALUE \
59
+ rb_magic_##what(int argc, VALUE *argv, VALUE self) {\
60
+ VALUE str;\
61
+ const char *file;\
62
+ magic_t ms;\
63
+ \
64
+ file = rb_scan_args(argc, argv, "01", &str) == 1 ? StringValuePtr(str) : NULL;\
65
+ \
66
+ GetMagicSet(self, ms);\
67
+ \
68
+ return magic_##what(ms, file) ? Qfalse : Qtrue;\
69
+ }
70
+
71
+ #define RB_MAGIC_SET_VERSION(m, p) sprintf(version, "%d.%02d", m, p);
72
+
28
73
  static VALUE cFileMagic, rb_FileMagicError;
29
74
 
75
+ static VALUE rb_magic_getpath(VALUE);
76
+ static VALUE rb_magic_flags(VALUE, VALUE);
77
+
30
78
  static VALUE rb_magic_new(int, VALUE*, VALUE);
79
+ static void rb_magic_free(magic_t);
31
80
  static VALUE rb_magic_init(int, VALUE*, VALUE);
32
81
 
33
82
  static VALUE rb_magic_close(VALUE);
34
83
  static VALUE rb_magic_closed_p(VALUE);
84
+
35
85
  static VALUE rb_magic_file(int, VALUE*, VALUE);
36
86
  static VALUE rb_magic_buffer(int, VALUE*, VALUE);
87
+
37
88
  static VALUE rb_magic_getflags(VALUE);
38
89
  static VALUE rb_magic_setflags(VALUE, VALUE);
39
- static VALUE rb_magic_check(int, VALUE*, VALUE);
40
- static VALUE rb_magic_compile(VALUE, VALUE);
41
90
 
42
- static VALUE rb_magic_flags_to_int(VALUE);
43
- static VALUE rb_magic_apply_simple(VALUE, const char*, VALUE);
91
+ static VALUE rb_magic_list(int, VALUE*, VALUE);
92
+ static VALUE rb_magic_load(int, VALUE*, VALUE);
93
+ static VALUE rb_magic_check(int, VALUE*, VALUE);
94
+ static VALUE rb_magic_compile(int, VALUE*, VALUE);
44
95
 
45
- static void rb_magic_free(magic_t);
46
96
  void Init_ruby_filemagic(void);
47
97
 
48
98
  #endif /* FILEMAGIC_H */
@@ -28,7 +28,12 @@ class FileMagic
28
28
  :no_check_cdf, # Don't check for cdf files
29
29
  :no_check_tokens, # Don't check ascii/tokens
30
30
  :no_check_encoding, # Don't check text encodings
31
+ :no_check_builtin, # No built-in tests; only consult the magic file
32
+
33
+ # Defined for backwards compatibility (renamed)
31
34
  :no_check_ascii, # MAGIC_NO_CHECK_TEXT
35
+
36
+ # Defined for backwards compatibility; do nothing
32
37
  :no_check_fortran, # Don't check ascii/fortran
33
38
  :no_check_troff # Don't check ascii/troff
34
39
  ].inject({}) { |flags, flag|
@@ -42,22 +47,22 @@ class FileMagic
42
47
  # Extract "simple" MIME type.
43
48
  SIMPLE_RE = %r{([.\w\/-]+)}
44
49
 
45
- @fm = Hash.new { |fm, flags|
46
- fm.key?(key = flags.to_s) ? fm[key] : fm[key] = new(*flags)
47
- }
50
+ @fm = {}
48
51
 
49
52
  class << self
50
53
 
51
54
  # Provide a "magic singleton".
52
55
  def fm(*flags)
53
- @fm.delete(flags.to_s) if @fm[flags].closed?
54
- @fm[flags]
56
+ if fm = @fm[flags = flags(flags)]
57
+ return fm unless fm.closed?
58
+ end
59
+
60
+ @fm[flags] = new(flags)
55
61
  end
56
62
 
57
63
  # Clear our instance cache.
58
64
  def clear!
59
- @fm.each_value { |fm| fm.close }
60
- @fm.clear
65
+ @fm.each_value(&:close).clear
61
66
  end
62
67
 
63
68
  # Just like #new, but takes an optional block, in which case #close
@@ -81,6 +86,31 @@ class FileMagic
81
86
  open(:mime, *flags, &block)
82
87
  end
83
88
 
89
+ def magic_version(default = MAGIC_VERSION)
90
+ default != '0' ? default :
91
+ user_magic_version ||
92
+ auto_magic_version ||
93
+ [default, 'unknown']
94
+ end
95
+
96
+ private
97
+
98
+ def user_magic_version(key = 'MAGIC_VERSION')
99
+ [ENV[key], 'user-specified'] if ENV[key]
100
+ end
101
+
102
+ def auto_magic_version
103
+ require 'nuggets/file/which'
104
+
105
+ if cmd = File.which_command([
106
+ 'dpkg-query -f \'${Version}\' -W libmagic-dev',
107
+ 'file -v'
108
+ ])
109
+ [%x{#{cmd}}[/\d+\.\d+/], 'auto-detected']
110
+ end
111
+ rescue LoadError
112
+ end
113
+
84
114
  end
85
115
 
86
116
  attr_writer :simplified
@@ -3,8 +3,8 @@ class FileMagic
3
3
  module Version
4
4
 
5
5
  MAJOR = 0
6
- MINOR = 5
7
- TINY = 2
6
+ MINOR = 6
7
+ TINY = 0
8
8
 
9
9
  class << self
10
10
 
@@ -3,15 +3,16 @@ require 'filemagic'
3
3
 
4
4
  class TestFileMagic < Test::Unit::TestCase
5
5
 
6
- magic_version = FileMagic::MAGIC_VERSION != '0' ? FileMagic::MAGIC_VERSION :
7
- ENV['MAGIC_VERSION'] || begin
8
- require 'nuggets/file/which'
9
- %x{dpkg-query -f '${Version}' -W libmagic-dev} if File.which('dpkg-query')
10
- rescue LoadError
11
- end
12
-
6
+ magic_version, origin = FileMagic.magic_version
13
7
  MAGIC_VERSION = magic_version.to_f
14
8
 
9
+ warn <<-EOT
10
+
11
+ libmagic version: #{MAGIC_VERSION}#{" (#{origin})" if origin}
12
+ magic file from #{FileMagic.path}
13
+
14
+ EOT
15
+
15
16
  def test_file
16
17
  fm = FileMagic.new(FileMagic::MAGIC_NONE)
17
18
 
@@ -25,7 +26,7 @@ class TestFileMagic < Test::Unit::TestCase
25
26
 
26
27
  if File.symlink?(path_to('pylink'))
27
28
  res = fm.file(path_to('pylink'))
28
- assert_equal("symbolic link to `pyfile'", res)
29
+ assert_equal("symbolic link to `pyfile'", res.strip)
29
30
  end
30
31
 
31
32
  fm.close
@@ -60,7 +61,7 @@ class TestFileMagic < Test::Unit::TestCase
60
61
  fm = FileMagic.new(FileMagic::MAGIC_NONE)
61
62
  res = silence_stderr { fm.check(path_to('perl')) }
62
63
  fm.close
63
- assert_equal(0, res)
64
+ assert(res)
64
65
  end
65
66
 
66
67
  def test_compile
@@ -68,7 +69,7 @@ class TestFileMagic < Test::Unit::TestCase
68
69
  fm = FileMagic.new(FileMagic::MAGIC_NONE)
69
70
  res = fm.compile(path_to('perl'))
70
71
  fm.close
71
- assert_equal(0, res)
72
+ assert(res)
72
73
  File.unlink(path_to('perl.mgc', '.'))
73
74
  end
74
75
 
@@ -85,6 +86,14 @@ class TestFileMagic < Test::Unit::TestCase
85
86
  assert block_fm.closed?
86
87
  end
87
88
 
89
+ def test_flags_to_int
90
+ assert_raise(TypeError) { FileMagic.flags(0) }
91
+ assert_equal(0, FileMagic.flags([FileMagic::MAGIC_NONE]))
92
+ assert_equal(0, FileMagic.flags([:none]))
93
+ assert_equal(0, FileMagic.flags([]))
94
+ assert_equal(1072, FileMagic.flags([:mime, :continue]))
95
+ end
96
+
88
97
  def test_setflags
89
98
  fm = FileMagic.new(FileMagic::MAGIC_NONE)
90
99
  assert_equal([], fm.flags)
@@ -95,7 +104,7 @@ class TestFileMagic < Test::Unit::TestCase
95
104
 
96
105
  def test_abbr
97
106
  fm = FileMagic.new(:mime, :continue)
98
- assert_equal([:mime_type, :continue, :mime_encoding] , fm.flags)
107
+ assert_equal([:mime_type, :continue, :mime_encoding], fm.flags)
99
108
  fm.flags = :symlink
100
109
  assert_equal([:symlink], fm.flags)
101
110
  fm.close
@@ -159,7 +168,8 @@ class TestFileMagic < Test::Unit::TestCase
159
168
  assert_equal('text/plain', fm.file(path_to('perl')))
160
169
  assert_equal(match_version(
161
170
  0 => 'application/vnd.ms-office',
162
- 5.11 => 'application/msword'
171
+ 5.11 => 'application/msword',
172
+ 5.14 => 'application/vnd.ms-office'
163
173
  ), fm.file(path_to('excel-example.xls')))
164
174
  end
165
175
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-filemagic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Travis Whitton
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-24 00:00:00.000000000 Z
12
+ date: 2014-05-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: hen
@@ -39,6 +39,20 @@ dependencies:
39
39
  - - ">="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: rake-compiler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
42
56
  - !ruby/object:Gem::Dependency
43
57
  name: test-unit
44
58
  requirement: !ruby/object:Gem::Requirement
@@ -54,9 +68,7 @@ dependencies:
54
68
  - !ruby/object:Gem::Version
55
69
  version: '0'
56
70
  description: Ruby bindings to the magic(4) library
57
- email:
58
- - tinymountain@gmail.com
59
- - jens.wille@gmail.com
71
+ email: jens.wille@gmail.com
60
72
  executables: []
61
73
  extensions:
62
74
  - ext/filemagic/extconf.rb
@@ -92,14 +104,21 @@ licenses:
92
104
  metadata: {}
93
105
  post_install_message: |2+
94
106
 
95
- ruby-filemagic-0.5.2 [2014-04-24]:
107
+ ruby-filemagic-0.6.0 [2014-05-16]:
96
108
 
97
- * Use MAGIC_VERSION if available.
98
- * Made tests more robust.
109
+ * Required Ruby version >= 1.9.3.
110
+ * New method FileMagic#list (+magic_list+).
111
+ * New method FileMagic#load (+magic_load+).
112
+ * New method FileMagic.path (+magic_getpath+).
113
+ * New method FileMagic.magic_version.
114
+ * New method FileMagic.flags.
115
+ * New flag +no_check_builtin+.
116
+ * Tests print libmagic version and path.
117
+ * Internal refactoring.
99
118
 
100
119
  rdoc_options:
101
120
  - "--title"
102
- - ruby-filemagic Application documentation (v0.5.2)
121
+ - ruby-filemagic Application documentation (v0.6.0)
103
122
  - "--charset"
104
123
  - UTF-8
105
124
  - "--line-numbers"
@@ -112,7 +131,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
112
131
  requirements:
113
132
  - - ">="
114
133
  - !ruby/object:Gem::Version
115
- version: '0'
134
+ version: 1.9.3
116
135
  required_rubygems_version: !ruby/object:Gem::Requirement
117
136
  requirements:
118
137
  - - ">="