mime-types 2.5 → 2.6

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.
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