mime-types 3.3.1 → 3.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/mime/type.rb CHANGED
@@ -9,25 +9,61 @@ end
9
9
  # == Usage
10
10
  # require 'mime/types'
11
11
  #
12
- # plaintext = MIME::Types['text/plain'].first
13
- # # returns [text/plain, text/plain]
12
+ # plaintext = MIME::Types['text/plain'] # => [ text/plain ]
14
13
  # text = plaintext.first
15
- # print text.media_type # => 'text'
16
- # print text.sub_type # => 'plain'
14
+ # puts text.media_type # => 'text'
15
+ # puts text.sub_type # => 'plain'
17
16
  #
18
- # puts text.extensions.join(" ") # => 'asc txt c cc h hh cpp'
17
+ # puts text.extensions.join(' ') # => 'txt asc c cc h hh cpp hpp dat hlp'
18
+ # puts text.preferred_extension # => 'txt'
19
+ # puts text.friendly # => 'Text Document'
20
+ # puts text.i18n_key # => 'text.plain'
19
21
  #
20
- # puts text.encoding # => 8bit
22
+ # puts text.encoding # => quoted-printable
23
+ # puts text.default_encoding # => quoted-printable
21
24
  # puts text.binary? # => false
22
25
  # puts text.ascii? # => true
26
+ # puts text.obsolete? # => false
27
+ # puts text.registered? # => true
28
+ # puts text.provisional? # => false
29
+ # puts text.complete? # => true
30
+ #
31
+ # puts text # => 'text/plain'
32
+ #
23
33
  # puts text == 'text/plain' # => true
24
- # puts MIME::Type.simplified('x-appl/x-zip') # => 'appl/zip'
34
+ # puts 'text/plain' == text # => true
35
+ # puts text == 'text/x-plain' # => false
36
+ # puts 'text/x-plain' == text # => false
37
+ #
38
+ # puts MIME::Type.simplified('x-appl/x-zip') # => 'x-appl/x-zip'
39
+ # puts MIME::Type.i18n_key('x-appl/x-zip') # => 'x-appl.x-zip'
40
+ #
41
+ # puts text.like?('text/x-plain') # => true
42
+ # puts text.like?(MIME::Type.new('x-text/x-plain')) # => true
43
+ #
44
+ # puts text.xrefs.inspect # => { "rfc" => [ "rfc2046", "rfc3676", "rfc5147" ] }
45
+ # puts text.xref_urls # => [ "http://www.iana.org/go/rfc2046",
46
+ # # "http://www.iana.org/go/rfc3676",
47
+ # # "http://www.iana.org/go/rfc5147" ]
48
+ #
49
+ # xtext = MIME::Type.new('x-text/x-plain')
50
+ # puts xtext.media_type # => 'text'
51
+ # puts xtext.raw_media_type # => 'x-text'
52
+ # puts xtext.sub_type # => 'plain'
53
+ # puts xtext.raw_sub_type # => 'x-plain'
54
+ # puts xtext.complete? # => false
55
+ #
56
+ # puts MIME::Types.any? { |type| type.content_type == 'text/plain' } # => true
57
+ # puts MIME::Types.all?(&:registered?) # => false
25
58
  #
26
- # puts MIME::Types.any? { |type|
27
- # type.content_type == 'text/plain'
28
- # } # => true
29
- # puts MIME::Types.all?(&:registered?)
30
- # # => false
59
+ # # Various string representations of MIME types
60
+ # qcelp = MIME::Types['audio/QCELP'].first # => audio/QCELP
61
+ # puts qcelp.content_type # => 'audio/QCELP'
62
+ # puts qcelp.simplified # => 'audio/qcelp'
63
+ #
64
+ # xwingz = MIME::Types['application/x-Wingz'].first # => application/x-Wingz
65
+ # puts xwingz.content_type # => 'application/x-Wingz'
66
+ # puts xwingz.simplified # => 'application/x-wingz'
31
67
  class MIME::Type
32
68
  # Reflects a MIME content-type specification that is not correctly
33
69
  # formatted (it isn't +type+/+subtype+).
@@ -57,24 +93,24 @@ class MIME::Type
57
93
  end
58
94
 
59
95
  # The released version of the mime-types library.
60
- VERSION = '3.3.1'
96
+ VERSION = "3.4.0"
61
97
 
62
98
  include Comparable
63
99
 
64
100
  # :stopdoc:
65
101
  # TODO verify mime-type character restrictions; I am pretty sure that this is
66
102
  # too wide open.
67
- MEDIA_TYPE_RE = %r{([-\w.+]+)/([-\w.+]*)}.freeze
68
- I18N_RE = /[^[:alnum:]]/.freeze
69
- BINARY_ENCODINGS = %w(base64 8bit).freeze
70
- ASCII_ENCODINGS = %w(7bit quoted-printable).freeze
103
+ MEDIA_TYPE_RE = %r{([-\w.+]+)/([-\w.+]*)}.freeze
104
+ I18N_RE = /[^[:alnum:]]/.freeze
105
+ BINARY_ENCODINGS = %w[base64 8bit].freeze
106
+ ASCII_ENCODINGS = %w[7bit quoted-printable].freeze
71
107
  # :startdoc:
72
108
 
73
109
  private_constant :MEDIA_TYPE_RE, :I18N_RE, :BINARY_ENCODINGS,
74
- :ASCII_ENCODINGS
110
+ :ASCII_ENCODINGS
75
111
 
76
112
  # Builds a MIME::Type object from the +content_type+, a MIME Content Type
77
- # value (e.g., 'text/plain' or 'applicaton/x-eruby'). The constructed object
113
+ # value (e.g., 'text/plain' or 'application/x-eruby'). The constructed object
78
114
  # is yielded to an optional block for additional configuration, such as
79
115
  # associating extensions and encoding information.
80
116
  #
@@ -86,9 +122,9 @@ class MIME::Type
86
122
  # * Otherwise, the content_type will be used as a string.
87
123
  #
88
124
  # Yields the newly constructed +self+ object.
89
- def initialize(content_type) # :yields self:
125
+ def initialize(content_type) # :yields: self
90
126
  @friendly = {}
91
- @obsolete = @registered = false
127
+ @obsolete = @registered = @provisional = false
92
128
  @preferred_extension = @docs = @use_instead = nil
93
129
  self.extensions = []
94
130
 
@@ -113,11 +149,12 @@ class MIME::Type
113
149
  # Indicates that a MIME type is like another type. This differs from
114
150
  # <tt>==</tt> because <tt>x-</tt> prefixes are removed for this comparison.
115
151
  def like?(other)
116
- other = if other.respond_to?(:simplified)
117
- MIME::Type.simplified(other.simplified, remove_x_prefix: true)
118
- else
119
- MIME::Type.simplified(other.to_s, remove_x_prefix: true)
120
- end
152
+ other =
153
+ if other.respond_to?(:simplified)
154
+ MIME::Type.simplified(other.simplified, remove_x_prefix: true)
155
+ else
156
+ MIME::Type.simplified(other.to_s, remove_x_prefix: true)
157
+ end
121
158
  MIME::Type.simplified(simplified, remove_x_prefix: true) == other
122
159
  end
123
160
 
@@ -131,8 +168,8 @@ class MIME::Type
131
168
  elsif other.respond_to?(:simplified)
132
169
  simplified <=> other.simplified
133
170
  else
134
- filtered = 'silent' if other == :silent
135
- filtered ||= 'true' if other == true
171
+ filtered = "silent" if other == :silent
172
+ filtered ||= "true" if other == true
136
173
  filtered ||= other.to_s
137
174
 
138
175
  simplified <=> MIME::Type.simplified(filtered)
@@ -158,23 +195,24 @@ class MIME::Type
158
195
  def priority_compare(other)
159
196
  pc = simplified <=> other.simplified
160
197
  if pc.zero? || !(extensions & other.extensions).empty?
161
- pc = if (reg = registered?) != other.registered?
162
- reg ? -1 : 1 # registered < unregistered
163
- elsif (comp = complete?) != other.complete?
164
- comp ? -1 : 1 # complete < incomplete
165
- elsif (obs = obsolete?) != other.obsolete?
166
- obs ? 1 : -1 # current < obsolete
167
- elsif obs and ((ui = use_instead) != (oui = other.use_instead))
168
- if ui.nil?
169
- 1
170
- elsif oui.nil?
171
- -1
172
- else
173
- ui <=> oui
174
- end
175
- else
176
- 0
177
- end
198
+ pc =
199
+ if (reg = registered?) != other.registered?
200
+ reg ? -1 : 1 # registered < unregistered
201
+ elsif (comp = complete?) != other.complete?
202
+ comp ? -1 : 1 # complete < incomplete
203
+ elsif (obs = obsolete?) != other.obsolete?
204
+ obs ? 1 : -1 # current < obsolete
205
+ elsif obs && ((ui = use_instead) != (oui = other.use_instead))
206
+ if ui.nil?
207
+ 1
208
+ elsif oui.nil?
209
+ -1
210
+ else
211
+ ui <=> oui
212
+ end
213
+ else
214
+ 0
215
+ end
178
216
  end
179
217
 
180
218
  pc
@@ -183,7 +221,7 @@ class MIME::Type
183
221
  # Returns +true+ if the +other+ object is a MIME::Type and the content types
184
222
  # match.
185
223
  def eql?(other)
186
- other.kind_of?(MIME::Type) and self == other
224
+ other.is_a?(MIME::Type) && (self == other)
187
225
  end
188
226
 
189
227
  # Returns the whole MIME content-type string.
@@ -197,8 +235,7 @@ class MIME::Type
197
235
  # audio/QCELP => audio/QCELP
198
236
  attr_reader :content_type
199
237
  # A simplified form of the MIME content-type string, suitable for
200
- # case-insensitive comparison, with any extension markers (<tt>x-</tt)
201
- # removed and converted to lowercase.
238
+ # case-insensitive comparison, with the content_type converted to lowercase.
202
239
  #
203
240
  # text/plain => text/plain
204
241
  # x-chemical/x-pdb => x-chemical/x-pdb
@@ -290,9 +327,9 @@ class MIME::Type
290
327
 
291
328
  ##
292
329
  def encoding=(enc) # :nodoc:
293
- if enc.nil? or enc == :default
330
+ if enc.nil? || (enc == :default)
294
331
  @encoding = default_encoding
295
- elsif BINARY_ENCODINGS.include?(enc) or ASCII_ENCODINGS.include?(enc)
332
+ elsif BINARY_ENCODINGS.include?(enc) || ASCII_ENCODINGS.include?(enc)
296
333
  @encoding = enc
297
334
  else
298
335
  fail InvalidEncoding, enc
@@ -301,7 +338,7 @@ class MIME::Type
301
338
 
302
339
  # Returns the default encoding for the MIME::Type based on the media type.
303
340
  def default_encoding
304
- @media_type == 'text' ? 'quoted-printable' : 'base64'
341
+ @media_type == "text" ? "quoted-printable" : "base64"
305
342
  end
306
343
 
307
344
  ##
@@ -321,7 +358,7 @@ class MIME::Type
321
358
 
322
359
  # Returns +true+ if the media type is obsolete.
323
360
  attr_accessor :obsolete
324
- alias obsolete? obsolete
361
+ alias_method :obsolete?, :obsolete
325
362
 
326
363
  # The documentation for this MIME::Type.
327
364
  attr_accessor :docs
@@ -331,7 +368,7 @@ class MIME::Type
331
368
  # call-seq:
332
369
  # text_plain.friendly # => "Text File"
333
370
  # text_plain.friendly('en') # => "Text File"
334
- def friendly(lang = 'en')
371
+ def friendly(lang = "en")
335
372
  @friendly ||= {}
336
373
 
337
374
  case lang
@@ -343,7 +380,7 @@ class MIME::Type
343
380
  @friendly.update(lang)
344
381
  else
345
382
  fail ArgumentError,
346
- "Expected a language or translation set, not #{lang.inspect}"
383
+ "Expected a language or translation set, not #{lang.inspect}"
347
384
  end
348
385
  end
349
386
 
@@ -374,14 +411,22 @@ class MIME::Type
374
411
  # The decoded cross-reference URL list for this MIME::Type.
375
412
  def xref_urls
376
413
  xrefs.flat_map { |type, values|
377
- name = :"xref_url_for_#{type.tr('-', '_')}"
378
- respond_to?(name, true) and xref_map(values, name) or values.to_a
414
+ name = :"xref_url_for_#{type.tr("-", "_")}"
415
+ respond_to?(name, true) && xref_map(values, name) || values.to_a
379
416
  }
380
417
  end
381
418
 
382
419
  # Indicates whether the MIME type has been registered with IANA.
383
420
  attr_accessor :registered
384
- alias registered? registered
421
+ alias_method :registered?, :registered
422
+
423
+ # Indicates whether the MIME type's registration with IANA is provisional.
424
+ attr_accessor :provisional
425
+
426
+ # Indicates whether the MIME type's registration with IANA is provisional.
427
+ def provisional?
428
+ registered? && @provisional
429
+ end
385
430
 
386
431
  # MIME types can be specified to be sent across a network in particular
387
432
  # formats. This method returns +true+ when the MIME::Type encoding is set
@@ -399,7 +444,7 @@ class MIME::Type
399
444
 
400
445
  # Indicateswhether the MIME type is declared as a signature type.
401
446
  attr_accessor :signature
402
- alias signature? signature
447
+ alias_method :signature?, :signature
403
448
 
404
449
  # Returns +true+ if the MIME::Type specifies an extension list,
405
450
  # indicating that it is a complete MIME::Type.
@@ -422,7 +467,7 @@ class MIME::Type
422
467
 
423
468
  # Converts the MIME::Type to a JSON string.
424
469
  def to_json(*args)
425
- require 'json'
470
+ require "json"
426
471
  to_h.to_json(*args)
427
472
  end
428
473
 
@@ -438,26 +483,27 @@ class MIME::Type
438
483
  #
439
484
  # This method should be considered a private implementation detail.
440
485
  def encode_with(coder)
441
- coder['content-type'] = @content_type
442
- coder['docs'] = @docs unless @docs.nil? or @docs.empty?
443
- coder['friendly'] = @friendly unless @friendly.nil? or @friendly.empty?
444
- coder['encoding'] = @encoding
445
- coder['extensions'] = @extensions.to_a unless @extensions.empty?
446
- coder['preferred-extension'] = @preferred_extension if @preferred_extension
486
+ coder["content-type"] = @content_type
487
+ coder["docs"] = @docs unless @docs.nil? || @docs.empty?
488
+ coder["friendly"] = @friendly unless @friendly.nil? || @friendly.empty?
489
+ coder["encoding"] = @encoding
490
+ coder["extensions"] = @extensions.to_a unless @extensions.empty?
491
+ coder["preferred-extension"] = @preferred_extension if @preferred_extension
447
492
  if obsolete?
448
- coder['obsolete'] = obsolete?
449
- coder['use-instead'] = use_instead if use_instead
493
+ coder["obsolete"] = obsolete?
494
+ coder["use-instead"] = use_instead if use_instead
450
495
  end
451
496
  unless xrefs.empty?
452
497
  {}.tap do |hash|
453
498
  xrefs.each do |k, v|
454
499
  hash[k] = v.to_a.sort
455
500
  end
456
- coder['xrefs'] = hash
501
+ coder["xrefs"] = hash
457
502
  end
458
503
  end
459
- coder['registered'] = registered?
460
- coder['signature'] = signature? if signature?
504
+ coder["registered"] = registered?
505
+ coder["provisional"] = provisional? if provisional?
506
+ coder["signature"] = signature? if signature?
461
507
  coder
462
508
  end
463
509
 
@@ -466,18 +512,19 @@ class MIME::Type
466
512
  #
467
513
  # This method should be considered a private implementation detail.
468
514
  def init_with(coder)
469
- self.content_type = coder['content-type']
470
- self.docs = coder['docs'] || ''
471
- self.encoding = coder['encoding']
472
- self.extensions = coder['extensions'] || []
473
- self.preferred_extension = coder['preferred-extension']
474
- self.obsolete = coder['obsolete'] || false
475
- self.registered = coder['registered'] || false
476
- self.signature = coder['signature']
477
- self.xrefs = coder['xrefs'] || {}
478
- self.use_instead = coder['use-instead']
515
+ self.content_type = coder["content-type"]
516
+ self.docs = coder["docs"] || ""
517
+ self.encoding = coder["encoding"]
518
+ self.extensions = coder["extensions"] || []
519
+ self.preferred_extension = coder["preferred-extension"]
520
+ self.obsolete = coder["obsolete"] || false
521
+ self.registered = coder["registered"] || false
522
+ self.provisional = coder["provisional"] || false
523
+ self.signature = coder["signature"]
524
+ self.xrefs = coder["xrefs"] || {}
525
+ self.use_instead = coder["use-instead"]
479
526
 
480
- friendly(coder['friendly'] || {})
527
+ friendly(coder["friendly"] || {})
481
528
  end
482
529
 
483
530
  def inspect # :nodoc:
@@ -501,8 +548,8 @@ class MIME::Type
501
548
  # Converts a provided +content_type+ into a translation key suitable for
502
549
  # use with the I18n library.
503
550
  def i18n_key(content_type)
504
- simplify_matchdata(match(content_type), joiner: '.') { |e|
505
- e.gsub!(I18N_RE, '-')
551
+ simplify_matchdata(match(content_type), joiner: ".") { |e|
552
+ e.gsub!(I18N_RE, "-")
506
553
  }
507
554
  end
508
555
 
@@ -519,12 +566,12 @@ class MIME::Type
519
566
 
520
567
  private
521
568
 
522
- def simplify_matchdata(matchdata, remove_x = false, joiner: '/')
569
+ def simplify_matchdata(matchdata, remove_x = false, joiner: "/")
523
570
  return nil unless matchdata
524
571
 
525
572
  matchdata.captures.map { |e|
526
573
  e.downcase!
527
- e.sub!(/^x-/, '') if remove_x
574
+ e.sub!(/^x-/, "") if remove_x
528
575
  yield e if block_given?
529
576
  e
530
577
  }.join(joiner)
@@ -537,11 +584,11 @@ class MIME::Type
537
584
  match = MEDIA_TYPE_RE.match(type_string)
538
585
  fail InvalidContentType, type_string if match.nil?
539
586
 
540
- @content_type = intern_string(type_string)
587
+ @content_type = intern_string(type_string)
541
588
  @raw_media_type, @raw_sub_type = match.captures
542
- @simplified = intern_string(MIME::Type.simplified(match))
543
- @i18n_key = intern_string(MIME::Type.i18n_key(match))
544
- @media_type, @sub_type = MEDIA_TYPE_RE.match(@simplified).captures
589
+ @simplified = intern_string(MIME::Type.simplified(match))
590
+ @i18n_key = intern_string(MIME::Type.i18n_key(match))
591
+ @media_type, @sub_type = MEDIA_TYPE_RE.match(@simplified).captures
545
592
 
546
593
  @raw_media_type = intern_string(@raw_media_type)
547
594
  @raw_sub_type = intern_string(@raw_sub_type)
@@ -566,22 +613,22 @@ class MIME::Type
566
613
  end
567
614
 
568
615
  def xref_url_for_rfc(value)
569
- 'http://www.iana.org/go/%s' % value
616
+ "http://www.iana.org/go/%s" % value
570
617
  end
571
618
 
572
619
  def xref_url_for_draft(value)
573
- 'http://www.iana.org/go/%s' % value.sub(/\ARFC/, 'draft')
620
+ "http://www.iana.org/go/%s" % value.sub(/\ARFC/, "draft")
574
621
  end
575
622
 
576
623
  def xref_url_for_rfc_errata(value)
577
- 'http://www.rfc-editor.org/errata_search.php?eid=%s' % value
624
+ "http://www.rfc-editor.org/errata_search.php?eid=%s" % value
578
625
  end
579
626
 
580
627
  def xref_url_for_person(value)
581
- 'http://www.iana.org/assignments/media-types/media-types.xhtml#%s' % value
628
+ "http://www.iana.org/assignments/media-types/media-types.xhtml#%s" % value
582
629
  end
583
630
 
584
631
  def xref_url_for_template(value)
585
- 'http://www.iana.org/assignments/media-types/%s' % value
632
+ "http://www.iana.org/assignments/media-types/%s" % value
586
633
  end
587
634
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'mime/type/columnar'
3
+ require "mime/type/columnar"
4
4
 
5
5
  # MIME::Types::Columnar is used to extend a MIME::Types container to load data
6
6
  # by columns instead of from JSON or YAML. Column loads of MIME types loaded
@@ -19,10 +19,10 @@ module MIME::Types::Columnar
19
19
  end
20
20
 
21
21
  # Load the first column data file (type and extensions).
22
- def load_base_data(path) #:nodoc:
22
+ def load_base_data(path) # :nodoc:
23
23
  @__root__ = path
24
24
 
25
- each_file_line('content_type', false) do |line|
25
+ each_file_line("content_type", false) do |line|
26
26
  line = line.split
27
27
  content_type = line.shift
28
28
  extensions = line
@@ -45,11 +45,11 @@ module MIME::Types::Columnar
45
45
  i = -1
46
46
  column = File.join(@__root__, "mime.#{name}.column")
47
47
 
48
- IO.readlines(column, encoding: 'UTF-8').each do |line|
48
+ IO.readlines(column, encoding: "UTF-8").each do |line|
49
49
  line.chomp!
50
50
 
51
51
  if lookup
52
- type = @__mime_data__[i += 1] or next
52
+ (type = @__mime_data__[i += 1]) || next
53
53
  yield type, line
54
54
  else
55
55
  yield line
@@ -61,57 +61,58 @@ module MIME::Types::Columnar
61
61
  end
62
62
 
63
63
  def load_encoding
64
- each_file_line('encoding') do |type, line|
64
+ each_file_line("encoding") do |type, line|
65
65
  pool ||= {}
66
66
  type.instance_variable_set(:@encoding, (pool[line] ||= line))
67
67
  end
68
68
  end
69
69
 
70
70
  def load_docs
71
- each_file_line('docs') do |type, line|
71
+ each_file_line("docs") do |type, line|
72
72
  type.instance_variable_set(:@docs, opt(line))
73
73
  end
74
74
  end
75
75
 
76
76
  def load_preferred_extension
77
- each_file_line('pext') do |type, line|
77
+ each_file_line("pext") do |type, line|
78
78
  type.instance_variable_set(:@preferred_extension, opt(line))
79
79
  end
80
80
  end
81
81
 
82
82
  def load_flags
83
- each_file_line('flags') do |type, line|
83
+ each_file_line("flags") do |type, line|
84
84
  line = line.split
85
85
  type.instance_variable_set(:@obsolete, flag(line.shift))
86
86
  type.instance_variable_set(:@registered, flag(line.shift))
87
87
  type.instance_variable_set(:@signature, flag(line.shift))
88
+ type.instance_variable_set(:@provisional, flag(line.shift))
88
89
  end
89
90
  end
90
91
 
91
92
  def load_xrefs
92
- each_file_line('xrefs') { |type, line|
93
+ each_file_line("xrefs") { |type, line|
93
94
  type.instance_variable_set(:@xrefs, dict(line, array: true))
94
95
  }
95
96
  end
96
97
 
97
98
  def load_friendly
98
- each_file_line('friendly') { |type, line|
99
+ each_file_line("friendly") { |type, line|
99
100
  type.instance_variable_set(:@friendly, dict(line))
100
101
  }
101
102
  end
102
103
 
103
104
  def load_use_instead
104
- each_file_line('use_instead') do |type, line|
105
+ each_file_line("use_instead") do |type, line|
105
106
  type.instance_variable_set(:@use_instead, opt(line))
106
107
  end
107
108
  end
108
109
 
109
110
  def dict(line, array: false)
110
- if line == '-'
111
+ if line == "-"
111
112
  {}
112
113
  else
113
- line.split('|').each_with_object({}) { |l, h|
114
- k, v = l.split('^')
114
+ line.split("|").each_with_object({}) { |l, h|
115
+ k, v = l.split("^")
115
116
  v = nil if v.empty?
116
117
  h[k] = array ? Array(v) : v
117
118
  }
@@ -119,18 +120,18 @@ module MIME::Types::Columnar
119
120
  end
120
121
 
121
122
  def arr(line)
122
- if line == '-'
123
+ if line == "-"
123
124
  []
124
125
  else
125
- line.split('|').flatten.compact.uniq
126
+ line.split("|").flatten.compact.uniq
126
127
  end
127
128
  end
128
129
 
129
130
  def opt(line)
130
- line unless line == '-'
131
+ line unless line == "-"
131
132
  end
132
133
 
133
134
  def flag(line)
134
- line == '1'
135
+ line == "1"
135
136
  end
136
137
  end
@@ -15,21 +15,21 @@ class << MIME::Types::Cache
15
15
  # file does not exist, if the file cannot be loaded, or if the data in
16
16
  # the cache version is different than this version.
17
17
  def load(cache_file = nil)
18
- cache_file ||= ENV['RUBY_MIME_TYPES_CACHE']
19
- return nil unless cache_file and File.exist?(cache_file)
18
+ cache_file ||= ENV["RUBY_MIME_TYPES_CACHE"]
19
+ return nil unless cache_file && File.exist?(cache_file)
20
20
 
21
21
  cache = Marshal.load(File.binread(cache_file))
22
22
  if cache.version == MIME::Types::Data::VERSION
23
23
  Marshal.load(cache.data)
24
24
  else
25
- MIME::Types.logger.warn <<-WARNING.chomp
26
- Could not load MIME::Types cache: invalid version
25
+ MIME::Types.logger.warn <<~WARNING.chomp
26
+ Could not load MIME::Types cache: invalid version
27
27
  WARNING
28
28
  nil
29
29
  end
30
30
  rescue => e
31
- MIME::Types.logger.warn <<-WARNING.chomp
32
- Could not load MIME::Types cache: #{e}
31
+ MIME::Types.logger.warn <<~WARNING.chomp
32
+ Could not load MIME::Types cache: #{e}
33
33
  WARNING
34
34
  nil
35
35
  end
@@ -44,12 +44,12 @@ Could not load MIME::Types cache: #{e}
44
44
  # +RUBY_MIME_TYPES_CACHE+. If there is no cache file specified either
45
45
  # directly or through the environment, this method will return +nil+
46
46
  def save(types = nil, cache_file = nil)
47
- cache_file ||= ENV['RUBY_MIME_TYPES_CACHE']
47
+ cache_file ||= ENV["RUBY_MIME_TYPES_CACHE"]
48
48
  return nil unless cache_file
49
49
 
50
50
  types ||= MIME::Types.send(:__types__)
51
51
 
52
- File.open(cache_file, 'wb') do |f|
52
+ File.open(cache_file, "wb") do |f|
53
53
  f.write(
54
54
  Marshal.dump(new(MIME::Types::Data::VERSION, Marshal.dump(types)))
55
55
  )
@@ -1,3 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'mime/types'
3
+ require "mime/types"
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
4
- require 'forwardable'
3
+ require "set"
4
+ require "forwardable"
5
5
 
6
6
  # MIME::Types requires a serializable keyed container that returns an empty Set
7
7
  # on a key miss. Hash#default_value cannot be used because, while it traverses
@@ -9,7 +9,7 @@ require 'forwardable'
9
9
  # format (plus, a default of a mutable object resuls in a shared mess).
10
10
  # Hash#default_proc cannot be used without a wrapper because it prevents
11
11
  # Marshal serialization (and doesn't survive the round-trip).
12
- class MIME::Types::Container #:nodoc:
12
+ class MIME::Types::Container # :nodoc:
13
13
  extend Forwardable
14
14
 
15
15
  def initialize(hash = {})
@@ -37,7 +37,7 @@ class MIME::Types::Container #:nodoc:
37
37
 
38
38
  def merge!(other)
39
39
  tap {
40
- other = other.kind_of?(MIME::Types::Container) ? other.container : other
40
+ other = other.is_a?(MIME::Types::Container) ? other.container : other
41
41
  container.merge!(other)
42
42
  normalize
43
43
  }
@@ -48,15 +48,15 @@ class MIME::Types::Container #:nodoc:
48
48
  end
49
49
 
50
50
  def_delegators :@container,
51
- :==,
52
- :count,
53
- :each,
54
- :each_value,
55
- :empty?,
56
- :flat_map,
57
- :keys,
58
- :select,
59
- :values
51
+ :==,
52
+ :count,
53
+ :each,
54
+ :each_value,
55
+ :empty?,
56
+ :flat_map,
57
+ :keys,
58
+ :select,
59
+ :values
60
60
 
61
61
  def add(key, value)
62
62
  (container[key] ||= Set.new).add(value)
@@ -85,7 +85,7 @@ class MIME::Types::Container #:nodoc:
85
85
 
86
86
  def normalize
87
87
  container.each do |k, v|
88
- next if v.kind_of?(Set)
88
+ next if v.is_a?(Set)
89
89
 
90
90
  container[k] = Set[*v]
91
91
  end