mime-types 3.2.1 → 3.4.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/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" ]
25
48
  #
26
- # puts MIME::Types.any? { |type|
27
- # type.content_type == 'text/plain'
28
- # } # => true
29
- # puts MIME::Types.all?(&:registered?)
30
- # # => false
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
58
+ #
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.2.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.+]*)}
68
- I18N_RE = %r{[^[:alnum:]]}
69
- BINARY_ENCODINGS = %w(base64 8bit)
70
- ASCII_ENCODINGS = %w(7bit quoted-printable)
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
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
  ##
@@ -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'.freeze)
371
+ def friendly(lang = "en")
335
372
  @friendly ||= {}
336
373
 
337
374
  case lang
@@ -367,15 +404,15 @@ class MIME::Type
367
404
  attr_reader :xrefs
368
405
 
369
406
  ##
370
- def xrefs=(x) # :nodoc:
371
- @xrefs = MIME::Types::Container.new(x)
407
+ def xrefs=(xrefs) # :nodoc:
408
+ @xrefs = MIME::Types::Container.new(xrefs)
372
409
  end
373
410
 
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
 
@@ -383,6 +420,14 @@ class MIME::Type
383
420
  attr_accessor :registered
384
421
  alias_method :registered?, :registered
385
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
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
388
433
  # to <tt>base64</tt>.
@@ -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,28 +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
- unless @friendly.nil? or @friendly.empty?
444
- coder['friendly'] = @friendly
445
- end
446
- coder['encoding'] = @encoding
447
- coder['extensions'] = @extensions.to_a unless @extensions.empty?
448
- 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
449
492
  if obsolete?
450
- coder['obsolete'] = obsolete?
451
- coder['use-instead'] = use_instead if use_instead
493
+ coder["obsolete"] = obsolete?
494
+ coder["use-instead"] = use_instead if use_instead
452
495
  end
453
496
  unless xrefs.empty?
454
497
  {}.tap do |hash|
455
498
  xrefs.each do |k, v|
456
499
  hash[k] = v.to_a.sort
457
500
  end
458
- coder['xrefs'] = hash
501
+ coder["xrefs"] = hash
459
502
  end
460
503
  end
461
- coder['registered'] = registered?
462
- coder['signature'] = signature? if signature?
504
+ coder["registered"] = registered?
505
+ coder["provisional"] = provisional? if provisional?
506
+ coder["signature"] = signature? if signature?
463
507
  coder
464
508
  end
465
509
 
@@ -468,18 +512,19 @@ class MIME::Type
468
512
  #
469
513
  # This method should be considered a private implementation detail.
470
514
  def init_with(coder)
471
- self.content_type = coder['content-type']
472
- self.docs = coder['docs'] || ''
473
- self.encoding = coder['encoding']
474
- self.extensions = coder['extensions'] || []
475
- self.preferred_extension = coder['preferred-extension']
476
- self.obsolete = coder['obsolete'] || false
477
- self.registered = coder['registered'] || false
478
- self.signature = coder['signature']
479
- self.xrefs = coder['xrefs'] || {}
480
- 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"]
481
526
 
482
- friendly(coder['friendly'] || {})
527
+ friendly(coder["friendly"] || {})
483
528
  end
484
529
 
485
530
  def inspect # :nodoc:
@@ -503,8 +548,8 @@ class MIME::Type
503
548
  # Converts a provided +content_type+ into a translation key suitable for
504
549
  # use with the I18n library.
505
550
  def i18n_key(content_type)
506
- simplify_matchdata(match(content_type), joiner: '.') { |e|
507
- e.gsub!(I18N_RE, '-'.freeze)
551
+ simplify_matchdata(match(content_type), joiner: ".") { |e|
552
+ e.gsub!(I18N_RE, "-")
508
553
  }
509
554
  end
510
555
 
@@ -521,12 +566,12 @@ class MIME::Type
521
566
 
522
567
  private
523
568
 
524
- def simplify_matchdata(matchdata, remove_x = false, joiner: '/'.freeze)
569
+ def simplify_matchdata(matchdata, remove_x = false, joiner: "/")
525
570
  return nil unless matchdata
526
571
 
527
572
  matchdata.captures.map { |e|
528
573
  e.downcase!
529
- e.sub!(%r{^x-}, ''.freeze) if remove_x
574
+ e.sub!(/^x-/, "") if remove_x
530
575
  yield e if block_given?
531
576
  e
532
577
  }.join(joiner)
@@ -539,11 +584,28 @@ class MIME::Type
539
584
  match = MEDIA_TYPE_RE.match(type_string)
540
585
  fail InvalidContentType, type_string if match.nil?
541
586
 
542
- @content_type = type_string
587
+ @content_type = intern_string(type_string)
543
588
  @raw_media_type, @raw_sub_type = match.captures
544
- @simplified = MIME::Type.simplified(match)
545
- @i18n_key = MIME::Type.i18n_key(match)
546
- @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
592
+
593
+ @raw_media_type = intern_string(@raw_media_type)
594
+ @raw_sub_type = intern_string(@raw_sub_type)
595
+ @media_type = intern_string(@media_type)
596
+ @sub_type = intern_string(@sub_type)
597
+ end
598
+
599
+ if String.method_defined?(:-@)
600
+ def intern_string(string)
601
+ -string
602
+ end
603
+ else
604
+ # MRI 2.2 and older don't have a method for string interning,
605
+ # so we simply freeze them for keeping a similar interface
606
+ def intern_string(string)
607
+ string.freeze
608
+ end
547
609
  end
548
610
 
549
611
  def xref_map(values, helper)
@@ -551,23 +613,22 @@ class MIME::Type
551
613
  end
552
614
 
553
615
  def xref_url_for_rfc(value)
554
- 'http://www.iana.org/go/%s'.freeze % value
616
+ "http://www.iana.org/go/%s" % value
555
617
  end
556
618
 
557
619
  def xref_url_for_draft(value)
558
- 'http://www.iana.org/go/%s'.freeze % value.sub(/\ARFC/, 'draft')
620
+ "http://www.iana.org/go/%s" % value.sub(/\ARFC/, "draft")
559
621
  end
560
622
 
561
623
  def xref_url_for_rfc_errata(value)
562
- 'http://www.rfc-editor.org/errata_search.php?eid=%s'.freeze % value
624
+ "http://www.rfc-editor.org/errata_search.php?eid=%s" % value
563
625
  end
564
626
 
565
627
  def xref_url_for_person(value)
566
- 'http://www.iana.org/assignments/media-types/media-types.xhtml#%s'.freeze %
567
- value
628
+ "http://www.iana.org/assignments/media-types/media-types.xhtml#%s" % value
568
629
  end
569
630
 
570
631
  def xref_url_for_template(value)
571
- 'http://www.iana.org/assignments/media-types/%s'.freeze % value
632
+ "http://www.iana.org/assignments/media-types/%s" % value
572
633
  end
573
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'.freeze).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,58 +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
- line.freeze
67
66
  type.instance_variable_set(:@encoding, (pool[line] ||= line))
68
67
  end
69
68
  end
70
69
 
71
70
  def load_docs
72
- each_file_line('docs') do |type, line|
71
+ each_file_line("docs") do |type, line|
73
72
  type.instance_variable_set(:@docs, opt(line))
74
73
  end
75
74
  end
76
75
 
77
76
  def load_preferred_extension
78
- each_file_line('pext') do |type, line|
77
+ each_file_line("pext") do |type, line|
79
78
  type.instance_variable_set(:@preferred_extension, opt(line))
80
79
  end
81
80
  end
82
81
 
83
82
  def load_flags
84
- each_file_line('flags') do |type, line|
83
+ each_file_line("flags") do |type, line|
85
84
  line = line.split
86
85
  type.instance_variable_set(:@obsolete, flag(line.shift))
87
86
  type.instance_variable_set(:@registered, flag(line.shift))
88
87
  type.instance_variable_set(:@signature, flag(line.shift))
88
+ type.instance_variable_set(:@provisional, flag(line.shift))
89
89
  end
90
90
  end
91
91
 
92
92
  def load_xrefs
93
- each_file_line('xrefs') { |type, line|
93
+ each_file_line("xrefs") { |type, line|
94
94
  type.instance_variable_set(:@xrefs, dict(line, array: true))
95
95
  }
96
96
  end
97
97
 
98
98
  def load_friendly
99
- each_file_line('friendly') { |type, line|
99
+ each_file_line("friendly") { |type, line|
100
100
  type.instance_variable_set(:@friendly, dict(line))
101
101
  }
102
102
  end
103
103
 
104
104
  def load_use_instead
105
- each_file_line('use_instead') do |type, line|
105
+ each_file_line("use_instead") do |type, line|
106
106
  type.instance_variable_set(:@use_instead, opt(line))
107
107
  end
108
108
  end
109
109
 
110
110
  def dict(line, array: false)
111
- if line == '-'.freeze
111
+ if line == "-"
112
112
  {}
113
113
  else
114
- line.split('|'.freeze).each_with_object({}) { |l, h|
115
- k, v = l.split('^'.freeze)
114
+ line.split("|").each_with_object({}) { |l, h|
115
+ k, v = l.split("^")
116
116
  v = nil if v.empty?
117
117
  h[k] = array ? Array(v) : v
118
118
  }
@@ -120,18 +120,18 @@ module MIME::Types::Columnar
120
120
  end
121
121
 
122
122
  def arr(line)
123
- if line == '-'.freeze
123
+ if line == "-"
124
124
  []
125
125
  else
126
- line.split('|'.freeze).flatten.compact.uniq
126
+ line.split("|").flatten.compact.uniq
127
127
  end
128
128
  end
129
129
 
130
130
  def opt(line)
131
- line unless line == '-'.freeze
131
+ line unless line == "-"
132
132
  end
133
133
 
134
134
  def flag(line)
135
- line == '1'.freeze ? true : false
135
+ line == "1"
136
136
  end
137
137
  end
@@ -15,23 +15,23 @@ 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
27
- warning
25
+ MIME::Types.logger.warn <<~WARNING.chomp
26
+ Could not load MIME::Types cache: invalid version
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}
33
- warning
34
- return nil
31
+ MIME::Types.logger.warn <<~WARNING.chomp
32
+ Could not load MIME::Types cache: #{e}
33
+ WARNING
34
+ nil
35
35
  end
36
36
 
37
37
  # Attempts to save the types provided to the cache file provided.
@@ -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"