mime-types 2.5 → 2.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Contributing.rdoc +72 -20
  4. data/History-Types.rdoc +11 -0
  5. data/History.rdoc +31 -1
  6. data/Manifest.txt +18 -1
  7. data/README.rdoc +142 -61
  8. data/Rakefile +59 -91
  9. data/data/mime-types.json +1 -1
  10. data/data/mime.content_type.column +1907 -0
  11. data/data/mime.docs.column +1907 -0
  12. data/data/mime.encoding.column +1907 -0
  13. data/data/mime.friendly.column +1907 -0
  14. data/data/mime.obsolete.column +1907 -0
  15. data/data/mime.references.column +1907 -0
  16. data/data/mime.registered.column +1907 -0
  17. data/data/mime.signature.column +1907 -0
  18. data/data/mime.system.column +1907 -0
  19. data/data/mime.use_instead.column +1907 -0
  20. data/data/mime.xrefs.column +1907 -0
  21. data/lib/mime/type.rb +192 -119
  22. data/lib/mime/type/columnar.rb +112 -0
  23. data/lib/mime/types.rb +39 -25
  24. data/lib/mime/types/cache.rb +41 -35
  25. data/lib/mime/types/columnar.rb +160 -0
  26. data/lib/mime/types/deprecations.rb +53 -0
  27. data/lib/mime/types/loader.rb +60 -20
  28. data/lib/mime/types/loader_path.rb +2 -3
  29. data/lib/mime/types/logger.rb +35 -0
  30. data/support/apache_mime_types.rb +8 -1
  31. data/support/benchmarks/load.rb +17 -8
  32. data/support/benchmarks/load_allocations.rb +83 -0
  33. data/support/benchmarks/object_counts.rb +41 -0
  34. data/support/convert.rb +44 -24
  35. data/support/convert/columnar.rb +90 -0
  36. data/support/iana_registry.rb +18 -8
  37. data/test/fixture/json.json +1 -1
  38. data/test/fixture/yaml.yaml +3 -6
  39. data/test/minitest_helper.rb +9 -10
  40. data/test/test_mime_type.rb +126 -62
  41. data/test/test_mime_types.rb +15 -11
  42. data/test/test_mime_types_class.rb +16 -14
  43. data/test/test_mime_types_lazy.rb +7 -1
  44. data/test/test_mime_types_loader.rb +17 -8
  45. metadata +54 -12
  46. data/lib/mime.rb +0 -51
@@ -1,8 +1,5 @@
1
1
  # -*- ruby encoding: utf-8 -*-
2
2
 
3
- require 'mime'
4
- require 'json'
5
-
6
3
  # The definition of one MIME content-type.
7
4
  #
8
5
  # == Usage
@@ -50,16 +47,17 @@ class MIME::Type
50
47
  end
51
48
 
52
49
  def to_s
53
- "Invalid Encoding #{@encoding.inspect} (valid values: #{VALID_ENCODINGS.inspect})."
50
+ "Invalid Encoding #{@encoding.inspect}"
54
51
  end
55
52
  # :startdoc:
56
53
  end
57
54
 
58
55
  # The released version of the mime-types library.
59
- VERSION = '2.5'
56
+ VERSION = '2.6'
60
57
 
61
58
  include Comparable
62
59
 
60
+ # :stopdoc:
63
61
  MEDIA_TYPE_RE = %r{([-\w.+]+)/([-\w.+]*)}o
64
62
  UNREGISTERED_RE = %r{[Xx]-}o
65
63
  I18N_RE = %r{[^[:alnum:]]}o
@@ -70,20 +68,22 @@ class MIME::Type
70
68
  TEXT_ENCODINGS = %w(7bit quoted-printable)
71
69
  VALID_ENCODINGS = DEFAULT_ENCODINGS + BINARY_ENCODINGS + TEXT_ENCODINGS
72
70
 
73
- IANA_URL = "http://www.iana.org/assignments/media-types/%s/%s"
74
- RFC_URL = "http://rfc-editor.org/rfc/rfc%s.txt"
75
- DRAFT_URL = "http://datatracker.ietf.org/public/idindex.cgi?command=id_details&filename=%s"
76
- CONTACT_URL = "http://www.iana.org/assignments/contact-people.htm#%s"
71
+ IANA_URL = 'http://www.iana.org/assignments/media-types/%s/%s'
72
+ RFC_URL = 'http://rfc-editor.org/rfc/rfc%s.txt'
73
+ DRAFT_URL = 'http://datatracker.ietf.org/public/idindex.cgi?command=id_details&filename=%s' # rubocop:disable Metrics/LineLength
74
+ CONTACT_URL = 'http://www.iana.org/assignments/contact-people.htm#%s'
75
+ # :startdoc:
77
76
 
78
77
  if respond_to? :private_constant
79
78
  private_constant :MEDIA_TYPE_RE, :UNREGISTERED_RE, :I18N_RE, :PLATFORM_RE,
80
- :DEFAULT_ENCODINGS, :BINARY_ENCODINGS, :TEXT_ENCODINGS, :VALID_ENCODINGS,
81
- :IANA_URL, :RFC_URL, :DRAFT_URL, :CONTACT_URL
79
+ :DEFAULT_ENCODINGS, :BINARY_ENCODINGS, :TEXT_ENCODINGS,
80
+ :VALID_ENCODINGS, :IANA_URL, :RFC_URL, :DRAFT_URL,
81
+ :CONTACT_URL
82
82
  end
83
83
 
84
- # Builds a MIME::Type object from the provided MIME Content Type value
85
- # (e.g., 'text/plain' or 'applicaton/x-eruby'). The constructed object is
86
- # yielded to an optional block for additional configuration, such as
84
+ # Builds a MIME::Type object from the +content_type+, a MIME Content Type
85
+ # value (e.g., 'text/plain' or 'applicaton/x-eruby'). The constructed object
86
+ # is yielded to an optional block for additional configuration, such as
87
87
  # associating extensions and encoding information.
88
88
  #
89
89
  # * When provided a Hash or a MIME::Type, the MIME::Type will be
@@ -92,39 +92,41 @@ class MIME::Type
92
92
  # the first two elements of the array as the content type and
93
93
  # extensions.
94
94
  # * Otherwise, the content_type will be used as a string.
95
+ #
96
+ # Yields the newly constructed +self+ object.
95
97
  def initialize(content_type) # :yields self:
96
- @friendly = {}
97
- self.system = nil
98
- self.obsolete = false
99
- self.registered = nil
98
+ @friendly = {}
99
+ self.system = nil
100
+ self.obsolete = false
101
+ self.registered = nil
100
102
  self.use_instead = nil
101
- self.signature = nil
103
+ self.signature = nil
102
104
 
103
105
  case content_type
104
106
  when Hash
105
107
  init_with(content_type)
106
108
  when Array
107
109
  self.content_type = content_type[0]
108
- self.extensions = content_type[1] || []
110
+ self.extensions = content_type[1] || []
109
111
  when MIME::Type
110
112
  init_with(content_type.to_h)
111
113
  else
112
114
  self.content_type = content_type
113
115
  end
114
116
 
115
- self.extensions ||= []
116
- self.docs ||= nil
117
- self.encoding ||= :default
117
+ self.extensions ||= []
118
+ self.docs ||= []
119
+ self.encoding ||= :default
118
120
  # This value will be deprecated in the future, as it will be an
119
121
  # alternative view on #xrefs. Silence an unnecessary warning for now by
120
122
  # assigning directly to the instance variable.
121
- @references ||= []
122
- self.xrefs ||= {}
123
+ @references ||= []
124
+ self.xrefs ||= {}
123
125
 
124
126
  yield self if block_given?
125
127
  end
126
128
 
127
- # Returns +true+ if the simplified type matches the current
129
+ # Returns +true+ if the +other+ simplified type matches the current type.
128
130
  def like?(other)
129
131
  if other.respond_to?(:simplified)
130
132
  @simplified == other.simplified
@@ -133,10 +135,10 @@ class MIME::Type
133
135
  end
134
136
  end
135
137
 
136
- # Compares the MIME::Type against the exact content type or the simplified
137
- # type (the simplified type will be used if comparing against something
138
- # that can be treated as a String with #to_s). In comparisons, this is
139
- # done against the lowercase version of the MIME::Type.
138
+ # Compares the +other+ MIME::Type against the exact content type or the
139
+ # simplified type (the simplified type will be used if comparing against
140
+ # something that can be treated as a String with #to_s). In comparisons, this
141
+ # is done against the lowercase version of the MIME::Type.
140
142
  def <=>(other)
141
143
  if other.respond_to?(:content_type)
142
144
  @content_type.downcase <=> other.content_type.downcase
@@ -145,7 +147,7 @@ class MIME::Type
145
147
  end
146
148
  end
147
149
 
148
- # Compares the MIME::Type based on how reliable it is before doing a
150
+ # Compares the +other+ MIME::Type based on how reliable it is before doing a
149
151
  # normal <=> comparison. Used by MIME::Types#[] to sort types. The
150
152
  # comparisons involved are:
151
153
  #
@@ -157,6 +159,11 @@ class MIME::Type
157
159
  # 4. Current definitions < obsolete definitions.
158
160
  # 5. Obselete with use-instead references < obsolete without.
159
161
  # 6. Obsolete use-instead definitions are compared.
162
+ #
163
+ # While this method is public, its use is strongly discouraged by consumers
164
+ # of mime-types. In mime-types 3, this method is likely to see substantial
165
+ # revision and simplification to ensure current registered content types sort
166
+ # before unregistered or obsolete content types.
160
167
  def priority_compare(other)
161
168
  pc = simplified <=> other.simplified
162
169
  if pc.zero?
@@ -184,7 +191,7 @@ class MIME::Type
184
191
  pc
185
192
  end
186
193
 
187
- # Returns +true+ if the other object is a MIME::Type and the content types
194
+ # Returns +true+ if the +other+ object is a MIME::Type and the content types
188
195
  # match.
189
196
  def eql?(other)
190
197
  other.kind_of?(MIME::Type) and self == other
@@ -235,12 +242,14 @@ class MIME::Type
235
242
  attr_reader :extensions
236
243
  def extensions=(ext) # :nodoc:
237
244
  @extensions = Array(ext).flatten.compact.uniq
245
+ # TODO: In mime-types 3.x, we probably want to have a clue about the
246
+ # container(s) we belong to so we can trigger reindexing when this is done.
238
247
  end
239
248
 
240
- # Merge the extensions provided into this MIME::Type. The extensions added
249
+ # Merge the +extensions+ provided into this MIME::Type. The extensions added
241
250
  # will be merged uniquely.
242
- def add_extensions(*ext)
243
- self.extensions = self.extensions + ext
251
+ def add_extensions(*extensions)
252
+ self.extensions = self.extensions + extensions
244
253
  end
245
254
 
246
255
  ##
@@ -253,33 +262,39 @@ class MIME::Type
253
262
  extensions.first
254
263
  end
255
264
 
256
- # The encoding (7bit, 8bit, quoted-printable, or base64) required to
257
- # transport the data of this content type safely across a network, which
258
- # roughly corresponds to Content-Transfer-Encoding. A value of +nil+ or
259
- # <tt>:default</tt> will reset the #encoding to the #default_encoding for
260
- # the MIME::Type. Raises ArgumentError if the encoding provided is
261
- # invalid.
265
+ ##
266
+ # The encoding (+7bit+, +8bit+, <tt>quoted-printable</tt>, or +base64+)
267
+ # required to transport the data of this content type safely across a
268
+ # network, which roughly corresponds to Content-Transfer-Encoding. A value of
269
+ # +nil+ or <tt>:default</tt> will reset the #encoding to the
270
+ # #default_encoding for the MIME::Type. Raises ArgumentError if the encoding
271
+ # provided is invalid.
262
272
  #
263
273
  # If the encoding is not provided on construction, this will be either
264
274
  # 'quoted-printable' (for text/* media types) and 'base64' for eveything
265
275
  # else.
276
+ #
277
+ # :attr_accessor: encoding
278
+
279
+ ##
266
280
  attr_reader :encoding
267
281
  def encoding=(enc) # :nodoc:
268
282
  if DEFAULT_ENCODINGS.include?(enc)
269
- @encoding = self.default_encoding
283
+ @encoding = default_encoding
270
284
  elsif BINARY_ENCODINGS.include?(enc) or TEXT_ENCODINGS.include?(enc)
271
285
  @encoding = enc
272
286
  else
273
- raise InvalidEncoding, enc
287
+ fail InvalidEncoding, enc
274
288
  end
275
289
  end
276
290
 
277
291
  # If the MIME::Type is a system-specific MIME::Type, returns the regular
278
292
  # expression for the operating system indicated.
279
293
  #
280
- # This information about MIME content types is deprecated.
294
+ # This information about MIME content types is deprecated and will be removed
295
+ # in mime-types 3.
281
296
  def system
282
- MIME.deprecated(self, __method__)
297
+ MIME::Types.deprecated(self, __method__)
283
298
  @system
284
299
  end
285
300
 
@@ -287,7 +302,7 @@ class MIME::Type
287
302
  if os.nil? or os.kind_of?(Regexp)
288
303
  @system = os
289
304
  else
290
- @system = %r|#{os}|
305
+ @system = %r{#{os}}
291
306
  end
292
307
  end
293
308
 
@@ -300,11 +315,17 @@ class MIME::Type
300
315
  # Returns the media type or types that should be used instead of this
301
316
  # media type, if it is obsolete. If there is no replacement media type, or
302
317
  # it is not obsolete, +nil+ will be returned.
318
+ #
319
+ # :attr_accessor: use_instead
320
+
321
+ ##
303
322
  def use_instead
304
323
  return nil unless obsolete?
305
324
  @use_instead
306
325
  end
307
- attr_writer :use_instead # :nodoc:
326
+
327
+ ##
328
+ attr_writer :use_instead
308
329
 
309
330
  # Returns +true+ if the media type is obsolete.
310
331
  def obsolete?
@@ -323,7 +344,7 @@ class MIME::Type
323
344
  # call-seq:
324
345
  # text_plain.friendly # => "Text File"
325
346
  # text_plain.friendly('en') # => "Text File"
326
- def friendly(lang = 'en')
347
+ def friendly(lang = 'en'.freeze)
327
348
  @friendly ||= {}
328
349
 
329
350
  case lang
@@ -334,7 +355,7 @@ class MIME::Type
334
355
  when Hash
335
356
  @friendly.merge!(lang)
336
357
  else
337
- raise ArgumentError
358
+ fail ArgumentError
338
359
  end
339
360
  end
340
361
 
@@ -349,28 +370,59 @@ class MIME::Type
349
370
  # # from application/x-msword
350
371
  attr_reader :i18n_key
351
372
 
373
+ ##
352
374
  # The encoded references URL list for this MIME::Type. See #urls for more
353
375
  # information.
354
376
  #
355
377
  # This was previously called #url.
356
- attr_reader :references
378
+ #
379
+ # #references has been deprecated and both versions (#references and #url)
380
+ # will be removed in mime-types 3.
381
+ #
382
+ # :attr_accessor: references
383
+
384
+ ##
385
+ def references(__internal__ = false)
386
+ MIME::Types.deprecated(self, __method__) unless __internal__
387
+ @references
388
+ end
389
+
390
+ ##
357
391
  def references=(r) # :nodoc:
358
- MIME.deprecated(self, __method__)
392
+ MIME::Types.deprecated(self, __method__)
359
393
  @references = Array(r).flatten.compact.uniq
360
394
  end
361
395
 
362
- def url # :nodoc:
363
- MIME.deprecated(self, __method__, "and has been renamed to #references")
364
- references
396
+ ##
397
+ # The encoded references URL list for this MIME::Type. See #urls for more
398
+ # information.
399
+ #
400
+ # #urls has been deprecated and both versions (#references and #url) will be
401
+ # removed in mime-types 3.
402
+ #
403
+ # :attr_accessor: url
404
+
405
+ ##
406
+ def url
407
+ MIME::Types.deprecated(self, __method__)
408
+ references(true)
365
409
  end
366
410
 
411
+ ##
367
412
  def url=(r) # :nodoc:
368
- MIME.deprecated(self, __method__)
413
+ MIME::Types.deprecated(self, __method__)
369
414
  self.references = r
370
415
  end
371
416
 
417
+ ##
372
418
  # The cross-references list for this MIME::Type.
419
+ #
420
+ # :attr_accessor: xrefs
421
+
422
+ ##
373
423
  attr_reader :xrefs
424
+
425
+ ##
374
426
  def xrefs=(x) # :nodoc:
375
427
  @xrefs = MIME::Types::Container.new.merge(x)
376
428
  @xrefs.each_value(&:sort!)
@@ -394,8 +446,11 @@ class MIME::Type
394
446
  #
395
447
  # These values will be accessible through #urls, which always returns an
396
448
  # array.
449
+ #
450
+ # This method is deprecated and will be removed in mime-types 3.
397
451
  def urls
398
- references.map do |el|
452
+ MIME::Types.deprecated(self, __method__)
453
+ references(true).map do |el|
399
454
  case el
400
455
  when %r{^IANA$}
401
456
  IANA_URL % [ @media_type, @sub_type ]
@@ -417,32 +472,33 @@ class MIME::Type
417
472
 
418
473
  # The decoded cross-reference URL list for this MIME::Type.
419
474
  def xref_urls
420
- xrefs.map { |(type, values)|
475
+ xrefs.flat_map { |(type, values)|
421
476
  case type
422
- when 'rfc'
423
- values.map { |data| "http://www.iana.org/go/#{data}" }
424
- when 'draft'
477
+ when 'rfc'.freeze
478
+ values.map { |data| 'http://www.iana.org/go/%s'.freeze % data }
479
+ when 'draft'.freeze
425
480
  values.map { |data|
426
- "http://www.iana.org/go/#{data.sub(/\ARFC/, 'draft')}"
481
+ 'http://www.iana.org/go/%s'.freeze % data.sub(/\ARFC/, 'draft')
427
482
  }
428
- when 'rfc-errata'
483
+ when 'rfc-errata'.freeze
429
484
  values.map { |data|
430
- "http://www.rfc-editor.org/errata_search.php?eid=#{data}"
485
+ 'http://www.rfc-editor.org/errata_search.php?eid=%s'.freeze % data
431
486
  }
432
- when 'person'
487
+ when 'person'.freeze
433
488
  values.map { |data|
434
- "http://www.iana.org/assignments/media-types/media-types.xhtml##{data}"
489
+ 'http://www.iana.org/assignments/media-types/media-types.xhtml#%s'.freeze % data # rubocop:disable Metrics/LineLength
435
490
  }
436
- when 'template'
491
+ when 'template'.freeze
437
492
  values.map { |data|
438
- "http://www.iana.org/assignments/media-types/#{data}"
493
+ 'http://www.iana.org/assignments/media-types/%s'.freeze % data
439
494
  }
440
495
  else # 'uri', 'text', etc.
441
496
  values
442
497
  end
443
- }.flatten
498
+ }
444
499
  end
445
500
 
501
+ ##
446
502
  # Prior to BCP 178 (RFC 6648), it could be assumed that MIME content types
447
503
  # that start with <tt>x-</tt> were unregistered MIME. Per this BCP, this
448
504
  # assumption is no longer being made by default in this library.
@@ -453,6 +509,10 @@ class MIME::Type
453
509
  # - Unspecified, in which case the media-type and the content-type will be
454
510
  # scanned to see if they start with <tt>x-</tt>, indicating that they
455
511
  # are assumed unregistered.
512
+ #
513
+ # In mime-types 3, only a MIME content type that is explicitly registered
514
+ # will be used; there will be assumption that <tt>x-</tt> types are
515
+ # unregistered.
456
516
  def registered?
457
517
  if @registered.nil?
458
518
  (@raw_media_type !~ UNREGISTERED_RE) and
@@ -477,11 +537,11 @@ class MIME::Type
477
537
  # formats. This method returns +false+ when the MIME::Type encoding is
478
538
  # set to <tt>base64</tt>.
479
539
  def ascii?
480
- not binary?
540
+ !binary?
481
541
  end
482
542
 
483
- # Returns +true+ when the simplified MIME::Type is in the list of known
484
- # digital signatures.
543
+ # Returns +true+ when the simplified MIME::Type is one of the known digital
544
+ # signature types.
485
545
  def signature?
486
546
  !!@signature
487
547
  end
@@ -492,25 +552,25 @@ class MIME::Type
492
552
 
493
553
  # Returns +true+ if the MIME::Type is specific to an operating system.
494
554
  #
495
- # This method is deprecated.
555
+ # This method is deprecated and will be removed in mime-types 3.
496
556
  def system?(__internal__ = false)
497
- MIME.deprecated(self, __method__) unless __internal__
498
- not @system.nil?
557
+ MIME::Types.deprecated(self, __method__) unless __internal__
558
+ !@system.nil?
499
559
  end
500
560
 
501
561
  # Returns +true+ if the MIME::Type is specific to the current operating
502
562
  # system as represented by RUBY_PLATFORM.
503
563
  #
504
- # This method is deprecated.
564
+ # This method is deprecated and will be removed in mime-types 3.
505
565
  def platform?(__internal__ = false)
506
- MIME.deprecated(self, __method__) unless __internal__
566
+ MIME::Types.deprecated(self, __method__) unless __internal__
507
567
  system?(__internal__) and (RUBY_PLATFORM =~ @system)
508
568
  end
509
569
 
510
570
  # Returns +true+ if the MIME::Type specifies an extension list,
511
571
  # indicating that it is a complete MIME::Type.
512
572
  def complete?
513
- not @extensions.empty?
573
+ !@extensions.empty?
514
574
  end
515
575
 
516
576
  # Returns the MIME::Type as a string.
@@ -529,9 +589,9 @@ class MIME::Type
529
589
  # Returns the MIME::Type as an array suitable for use with
530
590
  # MIME::Type.from_array.
531
591
  #
532
- # This method is deprecated.
592
+ # This method is deprecated and will be removed in mime-types 3.
533
593
  def to_a
534
- MIME.deprecated(self, __method__)
594
+ MIME::Types.deprecated(self, __method__)
535
595
  [ @content_type, @extensions, @encoding, @system, obsolete?, @docs,
536
596
  @references, registered? ]
537
597
  end
@@ -539,9 +599,9 @@ class MIME::Type
539
599
  # Returns the MIME::Type as an array suitable for use with
540
600
  # MIME::Type.from_hash.
541
601
  #
542
- # This method is deprecated.
602
+ # This method is deprecated and will be removed in mime-types 3.
543
603
  def to_hash
544
- MIME.deprecated(self, __method__)
604
+ MIME::Types.deprecated(self, __method__)
545
605
  { 'Content-Type' => @content_type,
546
606
  'Content-Transfer-Encoding' => @encoding,
547
607
  'Extensions' => @extensions,
@@ -555,6 +615,7 @@ class MIME::Type
555
615
 
556
616
  # Converts the MIME::Type to a JSON string.
557
617
  def to_json(*args)
618
+ require 'json'
558
619
  to_h.to_json(*args)
559
620
  end
560
621
 
@@ -567,6 +628,8 @@ class MIME::Type
567
628
  # Populates the +coder+ with attributes about this record for
568
629
  # serialization. The structure of +coder+ should match the structure used
569
630
  # with #init_with.
631
+ #
632
+ # This method should be considered a private implementation detail.
570
633
  def encode_with(coder)
571
634
  coder['content-type'] = @content_type
572
635
  coder['docs'] = @docs unless @docs.nil? or @docs.empty?
@@ -577,7 +640,7 @@ class MIME::Type
577
640
  coder['obsolete'] = obsolete?
578
641
  coder['use-instead'] = use_instead if use_instead
579
642
  end
580
- coder['references'] = references unless references.empty?
643
+ coder['references'] = references(true) unless references(true).empty?
581
644
  coder['xrefs'] = xrefs unless xrefs.empty?
582
645
  coder['registered'] = registered?
583
646
  coder['signature'] = signature? if signature?
@@ -587,10 +650,12 @@ class MIME::Type
587
650
 
588
651
  # Initialize an empty object from +coder+, which must contain the
589
652
  # attributes necessary for initializing an empty object.
653
+ #
654
+ # This method should be considered a private implementation detail.
590
655
  def init_with(coder)
591
656
  self.content_type = coder['content-type']
592
657
  self.docs = coder['docs'] || []
593
- self.friendly(coder['friendly'] || {})
658
+ friendly(coder['friendly'] || {})
594
659
  self.encoding = coder['encoding']
595
660
  self.extensions = coder['extensions'] || []
596
661
  self.obsolete = coder['obsolete']
@@ -604,14 +669,13 @@ class MIME::Type
604
669
  self.xrefs = coder['xrefs'] || {}
605
670
  self.use_instead = coder['use-instead']
606
671
  end
607
- # :startdoc:
608
672
 
609
673
  class << self
610
674
  # The MIME types main- and sub-label can both start with <tt>x-</tt>,
611
675
  # which indicates that it is a non-registered name. Of course, after
612
- # registration this flag can disappear, adds to the confusing
613
- # proliferation of MIME types. The simplified string has the <tt>x-</tt>
614
- # removed and are translated to lowercase.
676
+ # registration this flag may disappear, adds to the confusing
677
+ # proliferation of MIME types. The simplified +content_type+ string has the
678
+ # <tt>x-</tt> removed and is translated to lowercase.
615
679
  def simplified(content_type)
616
680
  matchdata = case content_type
617
681
  when MatchData
@@ -620,16 +684,16 @@ class MIME::Type
620
684
  MEDIA_TYPE_RE.match(content_type)
621
685
  end
622
686
 
623
- if matchdata
624
- matchdata.captures.map { |e|
625
- e.downcase!
626
- e.gsub!(UNREGISTERED_RE, ''.freeze)
627
- e
628
- }.join('/'.freeze)
629
- end
687
+ return unless matchdata
688
+
689
+ matchdata.captures.map { |e|
690
+ e.downcase!
691
+ e.gsub!(UNREGISTERED_RE, ''.freeze)
692
+ e
693
+ }.join('/'.freeze)
630
694
  end
631
695
 
632
- # Converts a provided content type into a translation key suitable for
696
+ # Converts a provided +content_type+ into a translation key suitable for
633
697
  # use with the I18n library.
634
698
  def i18n_key(content_type)
635
699
  matchdata = case content_type
@@ -639,23 +703,23 @@ class MIME::Type
639
703
  MEDIA_TYPE_RE.match(content_type)
640
704
  end
641
705
 
642
- if matchdata
643
- matchdata.captures.map { |e|
644
- e.downcase!
645
- e.gsub!(UNREGISTERED_RE, ''.freeze)
646
- e.gsub!(I18N_RE, '-'.freeze)
647
- e
648
- }.join('.'.freeze)
649
- end
706
+ return unless matchdata
707
+
708
+ matchdata.captures.map { |e|
709
+ e.downcase!
710
+ e.gsub!(UNREGISTERED_RE, ''.freeze)
711
+ e.gsub!(I18N_RE, '-'.freeze)
712
+ e
713
+ }.join('.'.freeze)
650
714
  end
651
715
 
652
- # Creates a MIME::Type from an array in the form of:
653
- # [type-name, [extensions], encoding, system]
716
+ # Creates a MIME::Type from an +args+ array in the form of:
717
+ # [ type-name, [ extensions ], encoding, system ]
654
718
  #
655
719
  # +extensions+, +encoding+, and +system+ are optional.
656
720
  #
657
- # MIME::Type.from_array("application/x-ruby", ['rb'], '8bit')
658
- # MIME::Type.from_array(["application/x-ruby", ['rb'], '8bit'])
721
+ # MIME::Type.from_array('application/x-ruby', %w(rb), '8bit')
722
+ # MIME::Type.from_array([ 'application/x-ruby', [ 'rb' ], '8bit' ])
659
723
  #
660
724
  # These are equivalent to:
661
725
  #
@@ -664,15 +728,18 @@ class MIME::Type
664
728
  # t.encoding = '8bit'
665
729
  # end
666
730
  #
667
- # This method is deprecated.
668
- def from_array(*args) # :yields MIME::Type.new:
669
- MIME.deprecated(self, __method__)
731
+ # It will yield the type (+t+) if a block is given.
732
+ #
733
+ # This method is deprecated and will be removed in mime-types 3.
734
+ def from_array(*args) # :yields t:
735
+ MIME::Types.deprecated(self, __method__)
670
736
 
671
737
  # Dereferences the array one level, if necessary.
672
738
  args = args.first if args.first.kind_of? Array
673
739
 
674
740
  unless args.size.between?(1, 8)
675
- raise ArgumentError, "Array provided must contain between one and eight elements."
741
+ fail ArgumentError,
742
+ 'Array provided must contain between one and eight elements.'
676
743
  end
677
744
 
678
745
  MIME::Type.new(args.shift) do |t|
@@ -682,7 +749,7 @@ class MIME::Type
682
749
  end
683
750
  end
684
751
 
685
- # Creates a MIME::Type from a hash. Keys are case-insensitive, dashes
752
+ # Creates a MIME::Type from a +hash+. Keys are case-insensitive, dashes
686
753
  # may be replaced with underscores, and the internal Symbol of the
687
754
  # lowercase-underscore version can be used as well. That is,
688
755
  # Content-Type can be provided as content-type, Content_Type,
@@ -705,9 +772,12 @@ class MIME::Type
705
772
  # t.extensions = ['yaml', 'yml']
706
773
  # end
707
774
  #
708
- # This method has been deprecated.
709
- def from_hash(hash) # :yields MIME::Type.new:
710
- MIME.deprecated(self, __method__)
775
+ # It will yield the constructed type +t+ if a block has been provided.
776
+ #
777
+ #
778
+ # This method is deprecated and will be removed in mime-types 3.
779
+ def from_hash(hash) # :yields t:
780
+ MIME::Types.deprecated(self, __method__)
711
781
  type = {}
712
782
  hash.each_pair do |k, v|
713
783
  type[k.to_s.tr('A-Z', 'a-z').gsub(/-/, '_').to_sym] = v
@@ -726,7 +796,7 @@ class MIME::Type
726
796
  end
727
797
  end
728
798
 
729
- # Essentially a copy constructor.
799
+ # Essentially a copy constructor for +mime_type+.
730
800
  #
731
801
  # MIME::Type.from_mime_type(plaintext)
732
802
  #
@@ -738,17 +808,20 @@ class MIME::Type
738
808
  # t.encoding = plaintext.encoding.dup
739
809
  # end
740
810
  #
741
- # This method has been deprecated.
811
+ # It will yield the type (+t+) if a block is given.
812
+ #
813
+ # This method is deprecated and will be removed in mime-types 3.
742
814
  def from_mime_type(mime_type) # :yields the new MIME::Type:
743
- MIME.deprecated(self, __method__)
815
+ MIME::Types.deprecated(self, __method__)
744
816
  new(mime_type)
745
817
  end
746
818
  end
747
819
 
748
820
  private
821
+
749
822
  def content_type=(type_string)
750
823
  match = MEDIA_TYPE_RE.match(type_string)
751
- raise InvalidContentType, type_string if match.nil?
824
+ fail InvalidContentType, type_string if match.nil?
752
825
 
753
826
  @content_type = type_string
754
827
  @raw_media_type, @raw_sub_type = match.captures