ruby-magic 0.4.0 → 0.5.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,11 +10,8 @@ extern "C" {
10
10
 
11
11
  #define MAGIC_SYNCHRONIZED(f, d) magic_lock(object, (f), (d))
12
12
 
13
- #define MAGIC_OBJECT(o) \
14
- TypedData_Get_Struct(object, magic_object_t, &rb_magic_type, (o))
15
-
16
- #define MAGIC_COOKIE(o, c) \
17
- ((c) = MAGIC_OBJECT((o))->cookie)
13
+ #define MAGIC_OBJECT(o, t) \
14
+ TypedData_Get_Struct((o), rb_mgc_object_t, &rb_mgc_type, (t))
18
15
 
19
16
  #define MAGIC_CLOSED_P(o) RTEST(rb_mgc_close_p((o)))
20
17
  #define MAGIC_LOADED_P(o) RTEST(rb_mgc_load_p((o)))
@@ -25,60 +22,61 @@ extern "C" {
25
22
  rb_mgc_warning |= BIT(i); \
26
23
  rb_warn(__VA_ARGS__); \
27
24
  } \
28
- } while(0)
25
+ } while (0)
26
+
27
+ #define MAGIC_ERRORS(t) ruby_magic_errors[(t)]
29
28
 
30
29
  #define MAGIC_ARGUMENT_TYPE_ERROR(o, ...) \
31
- rb_raise(rb_eTypeError, error(E_ARGUMENT_TYPE_INVALID), CLASS_NAME((o)), __VA_ARGS__)
30
+ rb_raise(rb_eTypeError, MAGIC_ERRORS(E_ARGUMENT_TYPE_INVALID), CLASS_NAME((o)), __VA_ARGS__)
32
31
 
33
32
  #define MAGIC_GENERIC_ERROR(k, e, m) \
34
- rb_exc_raise(magic_generic_error((k), (e), error(m)))
33
+ rb_exc_raise(magic_generic_error((k), (e), MAGIC_ERRORS(m)))
35
34
 
36
35
  #define MAGIC_LIBRARY_ERROR(c) \
37
- rb_exc_raise(magic_library_error(rb_mgc_eMagicError, (c)))
36
+ rb_exc_raise(magic_library_error(rb_mgc_eMagicError, (c)->cookie))
38
37
 
39
38
  #define MAGIC_CHECK_INTEGER_TYPE(o) magic_check_type((o), T_FIXNUM)
40
39
  #define MAGIC_CHECK_STRING_TYPE(o) magic_check_type((o), T_STRING)
41
40
 
42
- #define MAGIC_CHECK_ARGUMENT_MISSING(t, o) \
43
- do { \
44
- if ((t) < (o)) \
45
- rb_raise(rb_eArgError, error(E_ARGUMENT_MISSING), (t), (o)); \
46
- } while(0)
47
-
48
- #define MAGIC_CHECK_ARRAY_EMPTY(o) \
49
- do { \
50
- if (RARRAY_EMPTY_P(o)) \
51
- rb_raise(rb_eArgError, "%s", error(E_ARGUMENT_TYPE_ARRAY_EMPTY)); \
52
- } while(0)
53
-
54
41
  #define MAGIC_CHECK_ARRAY_OF_STRINGS(o) \
55
42
  magic_check_type_array_of_strings((o))
56
43
 
44
+ #define MAGIC_CHECK_ARGUMENT_MISSING(t, o) \
45
+ do { \
46
+ if ((t) < (o)) \
47
+ rb_raise(rb_eArgError, MAGIC_ERRORS(E_ARGUMENT_MISSING), (t), (o)); \
48
+ } while (0)
49
+
50
+ #define MAGIC_CHECK_ARRAY_EMPTY(o) \
51
+ do { \
52
+ if (RARRAY_EMPTY_P(o)) \
53
+ rb_raise(rb_eArgError, "%s", MAGIC_ERRORS(E_ARGUMENT_TYPE_ARRAY_EMPTY)); \
54
+ } while (0)
55
+
56
+
57
57
  #define MAGIC_CHECK_OPEN(o) \
58
58
  do { \
59
59
  if (MAGIC_CLOSED_P(o)) \
60
60
  MAGIC_GENERIC_ERROR(rb_mgc_eLibraryError, EFAULT, \
61
61
  E_MAGIC_LIBRARY_CLOSED); \
62
- } while(0)
62
+ } while (0)
63
63
 
64
64
  #define MAGIC_CHECK_LOADED(o) \
65
65
  do { \
66
66
  if (!MAGIC_LOADED_P(o)) \
67
67
  MAGIC_GENERIC_ERROR(rb_mgc_eMagicError, EFAULT, \
68
68
  E_MAGIC_LIBRARY_NOT_LOADED); \
69
- } while(0)
69
+ } while (0)
70
70
 
71
71
  #define MAGIC_STRINGIFY(s) #s
72
72
 
73
73
  #define MAGIC_DEFINE_FLAG(c) \
74
- rb_define_const(rb_cMagic, MAGIC_STRINGIFY(c), INT2NUM(MAGIC_##c));
74
+ rb_define_const(rb_cMagic, MAGIC_STRINGIFY(c), INT2NUM(MAGIC_##c))
75
75
 
76
76
  #define MAGIC_DEFINE_PARAMETER(c) \
77
- rb_define_const(rb_cMagic, MAGIC_STRINGIFY(PARAM_##c), INT2NUM(MAGIC_PARAM_##c));
77
+ rb_define_const(rb_cMagic, MAGIC_STRINGIFY(PARAM_##c), INT2NUM(MAGIC_PARAM_##c))
78
78
 
79
- #define error(t) errors[(t)]
80
-
81
- enum error {
79
+ enum ruby_magic_error {
82
80
  E_UNKNOWN = 0,
83
81
  E_NOT_ENOUGH_MEMORY,
84
82
  E_ARGUMENT_MISSING,
@@ -95,49 +93,48 @@ enum error {
95
93
  E_FLAG_INVALID_TYPE
96
94
  };
97
95
 
98
- typedef struct parameter {
99
- size_t value;
96
+ struct parameter {
100
97
  int tag;
101
- } parameter_t;
98
+ size_t value;
99
+ };
102
100
 
103
- typedef union file {
101
+ union file {
104
102
  const char *path;
105
103
  int fd;
106
- } file_t;
104
+ };
107
105
 
108
- typedef struct buffers {
106
+ struct buffers {
109
107
  size_t count;
110
108
  size_t *sizes;
111
109
  void **pointers;
112
- } buffers_t;
110
+ };
113
111
 
114
112
  typedef struct magic_object {
115
113
  magic_t cookie;
116
114
  VALUE mutex;
117
115
  unsigned int database_loaded:1;
118
116
  unsigned int stop_on_errors:1;
119
- } magic_object_t;
117
+ } rb_mgc_object_t;
120
118
 
121
119
  typedef struct magic_arguments {
120
+ rb_mgc_object_t *magic_object;
122
121
  union {
123
- file_t file;
124
- parameter_t parameter;
125
- buffers_t buffers;
126
- } type;
127
- magic_t cookie;
122
+ struct parameter parameter;
123
+ union file file;
124
+ struct buffers buffers;
125
+ };
128
126
  const char *result;
129
- int flags;
130
127
  int status;
131
- unsigned int stop_on_errors:1;
132
- } magic_arguments_t;
128
+ int flags;
129
+ } rb_mgc_arguments_t;
133
130
 
134
- typedef struct magic_exception {
131
+ typedef struct magic_error {
135
132
  const char *magic_error;
136
133
  VALUE klass;
137
134
  int magic_errno;
138
- } magic_exception_t;
135
+ } rb_mgc_error_t;
139
136
 
140
- static const char *errors[] = {
137
+ static const char * const ruby_magic_errors[] = {
141
138
  [E_UNKNOWN] = "an unknown error has occurred",
142
139
  [E_NOT_ENOUGH_MEMORY] = "cannot allocate memory",
143
140
  [E_ARGUMENT_MISSING] = "wrong number of arguments (given %d, expected %d)",
@@ -156,7 +153,7 @@ static const char *errors[] = {
156
153
  };
157
154
 
158
155
  #if defined(MAGIC_CUSTOM_CHECK_TYPE)
159
- static const char *ruby_types[] = {
156
+ static const char * const magic_ruby_types[] = {
160
157
  "", /* Not an object */
161
158
  [T_OBJECT] = "Object",
162
159
  [T_CLASS] = "Class",
@@ -188,10 +185,10 @@ magic_ruby_type_name(int type)
188
185
  {
189
186
  const char *name;
190
187
 
191
- if (type >= ARRAY_SIZE(ruby_types))
188
+ if (type >= ARRAY_SIZE(magic_ruby_types))
192
189
  return NULL;
193
190
 
194
- name = ruby_types[type];
191
+ name = magic_ruby_types[type];
195
192
  if (name)
196
193
  return name;
197
194
 
@@ -232,48 +229,81 @@ magic_check_ruby_type(VALUE object, int type)
232
229
 
233
230
  name = magic_ruby_type_name(type);
234
231
  if (name)
235
- rb_raise(rb_eTypeError, error(E_ARGUMENT_TYPE_INVALID),
232
+ rb_raise(rb_eTypeError,
233
+ MAGIC_ERRORS(E_ARGUMENT_TYPE_INVALID),
236
234
  magic_ruby_class_name(object),
237
235
  name);
238
236
  error:
239
- rb_raise(rb_eTypeError, error(E_ARGUMENT_TYPE_UNKNOWN),
237
+ rb_raise(rb_eTypeError,
238
+ MAGIC_ERRORS(E_ARGUMENT_TYPE_UNKNOWN),
240
239
  object_type,
241
240
  type);
242
241
  }
243
242
  #endif /* MAGIC_CUSTOM_CHECK_TYPE */
244
243
 
244
+ static inline VALUE
245
+ magic_strip(VALUE v)
246
+ {
247
+ return (ARRAY_P(v) || STRING_P(v)) ?
248
+ rb_funcall(v, rb_intern("strip"), 0) :
249
+ Qnil;
250
+ }
251
+
245
252
  static inline VALUE
246
253
  magic_shift(VALUE v)
247
254
  {
248
- return ARRAY_P(v) ? \
249
- rb_funcall(v, rb_intern("shift"), 0) : \
255
+ return ARRAY_P(v) ?
256
+ rb_funcall(v, rb_intern("shift"), 0) :
250
257
  Qnil;
251
258
  }
252
259
 
253
260
  static inline VALUE
254
261
  magic_split(VALUE a, VALUE b)
255
262
  {
256
- return (STRING_P(a) && STRING_P(b)) ? \
257
- rb_funcall(a, rb_intern("split"), 1, b) : \
263
+ return (STRING_P(a) && STRING_P(b)) ?
264
+ rb_funcall(a, rb_intern("split"), 1, b) :
258
265
  Qnil;
259
266
  }
260
267
 
261
268
  static inline VALUE
262
269
  magic_join(VALUE a, VALUE b)
263
270
  {
264
- return (ARRAY_P(a) && STRING_P(b)) ? \
265
- rb_funcall(a, rb_intern("join"), 1, b) : \
271
+ return (ARRAY_P(a) && STRING_P(b)) ?
272
+ rb_funcall(a, rb_intern("join"), 1, b) :
266
273
  Qnil;
267
274
  }
268
275
 
269
276
  static inline VALUE
270
277
  magic_flatten(VALUE v)
271
278
  {
272
- return ARRAY_P(v) ? \
273
- rb_funcall(v, rb_intern("flatten"), 0) : \
279
+ return ARRAY_P(v) ?
280
+ rb_funcall(v, rb_intern("flatten"), 0) :
274
281
  Qnil;
275
282
  }
276
283
 
284
+ static inline VALUE
285
+ magic_strip_array(VALUE value) {
286
+ VALUE entry;
287
+ VALUE array = rb_ary_new();
288
+
289
+ for (int i = 0; i < RARRAY_LEN(value); i++) {
290
+ entry = rb_ary_entry(value, i);
291
+ if (NIL_P(entry))
292
+ continue;
293
+
294
+ if (STRING_P(entry)) {
295
+ if (RSTRING_EMPTY_P(entry))
296
+ continue;
297
+
298
+ entry = magic_strip(entry);
299
+ }
300
+
301
+ rb_ary_push(array, entry);
302
+ }
303
+
304
+ return array;
305
+ }
306
+
277
307
  static int
278
308
  magic_fileno(VALUE object)
279
309
  {
@@ -289,7 +319,9 @@ magic_fileno(VALUE object)
289
319
  object = rb_convert_type(object, T_FILE, "IO", "to_io");
290
320
 
291
321
  GetOpenFile(object, io);
292
- if ((fd = FPTR_TO_FD(io)) < 0)
322
+
323
+ fd = FPTR_TO_FD(io);
324
+ if (fd < 0)
293
325
  rb_raise(rb_eIOError, "closed stream");
294
326
 
295
327
  return fd;
@@ -316,7 +348,7 @@ magic_path(VALUE object)
316
348
  static inline void
317
349
  magic_check_type(VALUE object, RVALUE_TYPE type)
318
350
  {
319
- VALUE boolean = Qundef;
351
+ VALUE boolean;
320
352
 
321
353
  boolean = rb_obj_is_kind_of(object, T_INTEGER);
322
354
  if (type == T_FIXNUM && !RVAL2CBOOL(boolean))
@@ -328,35 +360,17 @@ magic_check_type(VALUE object, RVALUE_TYPE type)
328
360
  static inline void
329
361
  magic_check_type_array_of_strings(VALUE object)
330
362
  {
331
- VALUE value = Qundef;
363
+ VALUE value;
332
364
 
333
365
  for (int i = 0; i < RARRAY_LEN(object); i++) {
334
366
  value = RARRAY_AREF(object, (long)i);
335
367
  if (NIL_P(value) || !STRING_P(value))
336
368
  rb_raise(rb_eTypeError,
337
- error(E_ARGUMENT_TYPE_ARRAY_STRINGS),
369
+ MAGIC_ERRORS(E_ARGUMENT_TYPE_ARRAY_STRINGS),
338
370
  CLASS_NAME(value));
339
371
  }
340
372
  }
341
373
 
342
- static int rb_mgc_do_not_auto_load;
343
- static int rb_mgc_do_not_stop_on_error;
344
- static int rb_mgc_warning;
345
-
346
- static ID id_at_flags;
347
- static ID id_at_paths;
348
-
349
- static VALUE rb_cMagic;
350
-
351
- static VALUE rb_mgc_eError;
352
- static VALUE rb_mgc_eMagicError;
353
- static VALUE rb_mgc_eLibraryError;
354
- static VALUE rb_mgc_eNotImplementedError;
355
- static VALUE rb_mgc_eParameterError;
356
- static VALUE rb_mgc_eFlagsError;
357
-
358
- static const rb_data_type_t rb_magic_type;
359
-
360
374
  void Init_magic(void);
361
375
 
362
376
  VALUE rb_mgc_get_do_not_auto_load_global(VALUE object);
@@ -394,59 +408,6 @@ VALUE rb_mgc_descriptor(VALUE object, VALUE value);
394
408
 
395
409
  VALUE rb_mgc_version(VALUE object);
396
410
 
397
- static VALUE magic_get_parameter_internal(void *data);
398
- static VALUE magic_set_parameter_internal(void *data);
399
-
400
- static VALUE magic_get_flags_internal(void *data);
401
- static VALUE magic_set_flags_internal(void *data);
402
-
403
- static VALUE magic_load_internal(void *data);
404
- static VALUE magic_load_buffers_internal(void *data);
405
-
406
- static VALUE magic_compile_internal(void *data);
407
- static VALUE magic_check_internal(void *data);
408
-
409
- static VALUE magic_file_internal(void *data);
410
- static VALUE magic_buffer_internal(void *data);
411
- static VALUE magic_descriptor_internal(void *data);
412
-
413
- static VALUE magic_close_internal(void *data);
414
-
415
- static void* nogvl_magic_load(void *data);
416
- static void* nogvl_magic_compile(void *data);
417
- static void* nogvl_magic_check(void *data);
418
- static void* nogvl_magic_file(void *data);
419
- static void* nogvl_magic_descriptor(void *data);
420
-
421
- static void* magic_library_open(void);
422
- static void magic_library_close(void *data);
423
-
424
- static VALUE magic_allocate(VALUE klass);
425
- static void magic_mark(void *data);
426
- static void magic_free(void *data);
427
- static size_t magic_size(const void *data);
428
- #if defined(HAVE_RUBY_GC_COMPACT)
429
- static void magic_compact(void *data);
430
- #endif
431
-
432
- static VALUE magic_exception_wrapper(VALUE value);
433
- static VALUE magic_exception(void *data);
434
-
435
- static VALUE magic_library_error(VALUE klass, void *data);
436
- static VALUE magic_generic_error(VALUE klass, int magic_errno,
437
- const char *magic_error);
438
-
439
- static VALUE magic_lock(VALUE object, VALUE (*function)(ANYARGS),
440
- void *data);
441
- static VALUE magic_unlock(VALUE object);
442
-
443
- static VALUE magic_return(void *data);
444
-
445
- static int magic_get_flags(VALUE object);
446
- static int magic_set_flags(VALUE object, VALUE value);
447
-
448
- static VALUE magic_set_paths(VALUE object, VALUE value);
449
-
450
411
  #if defined(__cplusplus)
451
412
  }
452
413
  #endif
data/lib/magic/version.rb CHANGED
@@ -4,7 +4,7 @@ class Magic
4
4
  #
5
5
  # Current version of _Magic_.
6
6
  #
7
- VERSION = '0.4.0'.freeze
7
+ VERSION = '0.5.4'.freeze
8
8
 
9
9
  class << self
10
10
  #
data/lib/magic.rb CHANGED
@@ -1,6 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'magic/magic'
3
+ begin
4
+ ::RUBY_VERSION =~ /(\d+\.\d+)/
5
+ require_relative "magic/#{Regexp.last_match(1)}/magic"
6
+ rescue LoadError
7
+ # use "require" instead of "require_relative" because non-native gems will place C extension files
8
+ # in Gem::BasicSpecification#extension_dir after compilation (during normal installation), which
9
+ # is in $LOAD_PATH but not necessarily relative to this file (see #21 and nokogiri#2300)
10
+ require 'magic/magic'
11
+ end
12
+
4
13
  require_relative 'magic/version'
5
14
  require_relative 'magic/core/file'
6
15
  require_relative 'magic/core/string'
@@ -95,6 +104,8 @@ class Magic
95
104
  open(Magic::MIME, &block)
96
105
  end
97
106
 
107
+ alias_method :mime_type, :mime
108
+
98
109
  #
99
110
  # call-seq:
100
111
  # Magic.type -> self
@@ -175,6 +186,13 @@ class Magic
175
186
  end
176
187
 
177
188
  alias_method :fd, :descriptor
189
+
190
+ private
191
+
192
+ def default_paths
193
+ paths = Dir.glob(File.expand_path(File.join(File.dirname(__FILE__), "../ext/magic/share/*.mgc")))
194
+ paths.empty? ? nil : paths
195
+ end
178
196
  end
179
197
 
180
198
  private
data.tar.gz.sig ADDED
@@ -0,0 +1,3 @@
1
+
2
+ $xz\�B ���t��|xIh7�0�
3
+ e���N��!��mݪ�`� ��-���o �1�p�k�ezߡn����m��z:^J2���k
metadata CHANGED
@@ -1,15 +1,40 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-magic
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Krzysztof Wilczyński
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain:
11
- - kwilczynski-public.pem
12
- date: 2021-04-08 00:00:00.000000000 Z
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEIDCCAoigAwIBAgIBATANBgkqhkiG9w0BAQsFADAdMRswGQYDVQQDDBJrdy9E
14
+ Qz1saW51eC9EQz1jb20wHhcNMjEwMTAxMDAwOTU0WhcNMjYwMTAxMDAwOTU0WjAd
15
+ MRswGQYDVQQDDBJrdy9EQz1saW51eC9EQz1jb20wggGiMA0GCSqGSIb3DQEBAQUA
16
+ A4IBjwAwggGKAoIBgQCv02+pOrAMVUipLY7qjNLx8OMfMjnVCBH21SsWn8gyIHE9
17
+ BtQ+tlsJU8nWNjlr++7SKIV5vQmyYsC2UY0cdcFASdoV0A3Lc2Z0makfvPgcIlpL
18
+ 5THqQtP11tJfhjQ3MSFJYRG2D6m6GNqA+WTTsvJbPIxy5PHv5xb+79LLzcVxB9Op
19
+ C0ervTOF8W6Ye4EDvhQ5tppOr/d26UQV+8zRuxjxx5uZSPfUrE9u/gIIdeROoB3T
20
+ cnjAfzvjIzampLQppvhUnT4Vf5Rum2LohZ5GosKLy7tM65vr1eLyI2ndvS1MXWrU
21
+ 05sFKm5CSqORD+TVkR1jd3z5HdPgO1KwadccxFixoI8kEIt/iixWTzbka2T2iJoq
22
+ 5DeNMEMYYAZKuAGBzBcgvgPccCeAXFVF9AHjfaGRUMmYNHKK2HD6AdgNdhcE18V+
23
+ CJxFtggCJFYc1ygFOsHZPTbKo9+3ybSQhAswtDosWt26utUT1JOc2Bkj1sgQ0Yrk
24
+ orANsdYz2ee3JFkzx08CAwEAAaNrMGkwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
25
+ HQYDVR0OBBYEFME41mMBb/XAHgjhlX4kE8xnXxewMBcGA1UdEQQQMA6BDGt3QGxp
26
+ bnV4LmNvbTAXBgNVHRIEEDAOgQxrd0BsaW51eC5jb20wDQYJKoZIhvcNAQELBQAD
27
+ ggGBAF/2ryrSgTpf0+wYG46Oi6V3p9A3uMxxbGsh0ZmlLQT1Z1ozclR+xzxzyIFC
28
+ i7YWYyR085brDBnYNXgnUT9Nm4iAYx58MaPD28IFrcX0XA3DJE6Wkx4MmMV0chiJ
29
+ kf5ASikfGtFtf9qDmpLQB4louB6HpKNq1MwsQo8zwY93t77HCiV5f0g43rcZfGTn
30
+ wfBhpT7oOVWgfTLeBD811aS52VUCWclmnz+f01GdTeMwqsgc6oJaPSvg4JCMN94O
31
+ wcBlxus69rhM8PeTJNhwLxzRCNnZ69t9k2cU+4lTmQQIB8gnEFJxY9gZdgQ6pej0
32
+ HXUIut+6pp5BRYF2mTZ3fnxhWyIZaeB7lla2gI6rV2GXDbp4kVplGEuQ975YklJw
33
+ i4y7bz2Es4Hkly2Nc/J2L0+uMoBhMWMY3Xl0XDdkZYtBdnSB5g7NacChaAsukEkd
34
+ Ozt6vfXxSzW/KfodB+0ELjlHWiFbI8w7c8Kt7/ceZGVsXTxD/f4tVWy8MmxFy3pY
35
+ Cpe8Kg==
36
+ -----END CERTIFICATE-----
37
+ date: 2022-01-27 00:00:00.000000000 Z
13
38
  dependencies:
14
39
  - !ruby/object:Gem::Dependency
15
40
  name: mini_portile2
@@ -17,14 +42,14 @@ dependencies:
17
42
  requirements:
18
43
  - - "~>"
19
44
  - !ruby/object:Gem::Version
20
- version: 2.5.0
45
+ version: '2.6'
21
46
  type: :runtime
22
47
  prerelease: false
23
48
  version_requirements: !ruby/object:Gem::Requirement
24
49
  requirements:
25
50
  - - "~>"
26
51
  - !ruby/object:Gem::Version
27
- version: 2.5.0
52
+ version: '2.6'
28
53
  description: |
29
54
  File Magic in Ruby.
30
55
 
@@ -67,7 +92,7 @@ metadata:
67
92
  wiki_uri: https://github.com/kwilczynski/ruby-magic/wiki
68
93
  post_install_message: 'Thank you for installing!
69
94
 
70
- '
95
+ '
71
96
  rdoc_options: []
72
97
  require_paths:
73
98
  - lib
@@ -76,14 +101,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
76
101
  requirements:
77
102
  - - ">="
78
103
  - !ruby/object:Gem::Version
79
- version: 2.5.0
104
+ version: 2.6.0
80
105
  required_rubygems_version: !ruby/object:Gem::Requirement
81
106
  requirements:
82
107
  - - ">="
83
108
  - !ruby/object:Gem::Version
84
109
  version: '0'
85
110
  requirements: []
86
- rubygems_version: 3.1.4
111
+ rubygems_version: 3.2.22
87
112
  signing_key:
88
113
  specification_version: 4
89
114
  summary: File Magic in Ruby
metadata.gz.sig ADDED
@@ -0,0 +1 @@
1
+ ~<Y�{*86���|�?;��N"OiZ�/�A�B�"��u��樓�swk��#���G�)=�B�0\# �rw��h�`�t�G��!�ߡ}�Ὀ���0����"�k��]�A��nb31���}q>TXR2���%��?��"��#��� n�_�_�<7��;��oCB$n̹��)�[�$��Y�����X�.b�����!�#� j����W��