mime-types 3.1 → 3.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,10 +1,10 @@
1
- == Licence
1
+ ## Licence
2
2
 
3
- * Copyright 2003–2015 Austin Ziegler and contributors.
3
+ * Copyright 2003–2018 Austin Ziegler and contributors.
4
4
 
5
5
  The software in this repository is made available under the MIT license.
6
6
 
7
- === MIT License
7
+ ### MIT License
8
8
 
9
9
  Permission is hereby granted, free of charge, to any person obtaining a copy of
10
10
  this software and associated documentation files (the "Software"), to deal in
@@ -1,7 +1,7 @@
1
- Code-of-Conduct.rdoc
2
- Contributing.rdoc
3
- History.rdoc
4
- Licence.rdoc
1
+ Code-of-Conduct.md
2
+ Contributing.md
3
+ History.md
4
+ Licence.md
5
5
  Manifest.txt
6
6
  README.rdoc
7
7
  Rakefile
@@ -41,9 +41,7 @@ mime-types 1.x is no longer supported as of 2015-10-27.
41
41
 
42
42
  === mime-types 2.x End of Life
43
43
 
44
- mime-types 2.x is supported as 2.99.x receiving quarterly updates of the IANA
45
- registry and security updates for two years. It will reach full end of life on
46
- 2017-11-21.
44
+ mime-types 2.x is no longer supported as of 2017-11-21.
47
45
 
48
46
  === mime-types 3.x
49
47
 
@@ -183,7 +181,7 @@ MAJOR.MINOR:
183
181
  incremented, MINOR will be set to zero, and PATCH will be reset to the
184
182
  implied zero.
185
183
 
186
- 2. If an API (code) feature is added that does not break compatibilty, the
184
+ 2. If an API (code) feature is added that does not break compatibility, the
187
185
  MINOR version will be incremented and PATCH will be reset to the implied zero.
188
186
 
189
187
  3. If there is a bugfix to a feature added in the most recent MAJOR.MINOR
@@ -195,8 +193,8 @@ features because of the existence of the [mime-types-data][] gem, and if
195
193
  features are marked deprecated in the course of mime-types 3.x, they will not
196
194
  be removed until mime-types 4.x or possibly later.
197
195
 
198
- :include: Code-of-Conduct.rdoc
196
+ {Code of Conduct}[Code-of-Conduct_md.html]
199
197
 
200
- :include: Contributing.rdoc
198
+ {Contributing}[Contributing_md.html]
201
199
 
202
- :include: Licence.rdoc
200
+ {Licence}[Licence_md.html]
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
3
5
  require 'rubygems'
@@ -17,7 +19,7 @@ spec = Hoe.spec 'mime-types' do
17
19
 
18
20
  require_ruby_version '>= 2.0'
19
21
 
20
- self.history_file = 'History.rdoc'
22
+ self.history_file = 'History.md'
21
23
  self.readme_file = 'README.rdoc'
22
24
 
23
25
  license 'MIT'
@@ -32,9 +34,9 @@ spec = Hoe.spec 'mime-types' do
32
34
  extra_dev_deps << ['minitest', '~> 5.4']
33
35
  extra_dev_deps << ['minitest-autotest', '~> 1.0']
34
36
  extra_dev_deps << ['minitest-focus', '~> 1.0']
35
- extra_dev_deps << ['minitest-bonus-assertions', '~> 2.0']
37
+ extra_dev_deps << ['minitest-bonus-assertions', '~> 3.0']
36
38
  extra_dev_deps << ['minitest-hooks', '~> 1.4']
37
- extra_dev_deps << ['rake', '~> 10.0']
39
+ extra_dev_deps << ['rake', '>= 10.0', '< 13.0']
38
40
  extra_dev_deps << ['fivemat', '~> 1.3' ]
39
41
  extra_dev_deps << ['minitest-rg', '~> 5.2']
40
42
 
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mime/types'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ##
2
4
  module MIME
3
5
  end
@@ -55,7 +57,7 @@ class MIME::Type
55
57
  end
56
58
 
57
59
  # The released version of the mime-types library.
58
- VERSION = '3.1'
60
+ VERSION = '3.2'
59
61
 
60
62
  include Comparable
61
63
 
@@ -129,7 +131,11 @@ class MIME::Type
129
131
  elsif other.respond_to?(:simplified)
130
132
  simplified <=> other.simplified
131
133
  else
132
- simplified <=> MIME::Type.simplified(other.to_s)
134
+ filtered = 'silent' if other == :silent
135
+ filtered ||= 'true' if other == true
136
+ filtered ||= other.to_s
137
+
138
+ simplified <=> MIME::Type.simplified(filtered)
133
139
  end
134
140
  end
135
141
 
@@ -151,7 +157,7 @@ class MIME::Type
151
157
  # before unregistered or obsolete content types.
152
158
  def priority_compare(other)
153
159
  pc = simplified <=> other.simplified
154
- if pc.zero?
160
+ if pc.zero? || !(extensions & other.extensions).empty?
155
161
  pc = if (reg = registered?) != other.registered?
156
162
  reg ? -1 : 1 # registered < unregistered
157
163
  elsif (comp = complete?) != other.complete?
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mime/type'
2
4
 
3
5
  # A version of MIME::Type that works hand-in-hand with a MIME::Types::Columnar
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ##
2
4
  module MIME
3
5
  ##
@@ -149,7 +151,7 @@ class MIME::Types
149
151
  def type_for(filename)
150
152
  Array(filename).flat_map { |fn|
151
153
  @extension_index[fn.chomp.downcase[/\.?([^.]*?)$/, 1]]
152
- }.compact.inject(:+).sort { |a, b|
154
+ }.compact.inject(Set.new, :+).sort { |a, b|
153
155
  a.priority_compare(b)
154
156
  }
155
157
  end
@@ -169,7 +171,7 @@ class MIME::Types
169
171
  nil
170
172
  when MIME::Types
171
173
  variants = mime_type.instance_variable_get(:@type_variants)
172
- add(*variants.values.inject(:+).to_a, quiet)
174
+ add(*variants.values.inject(Set.new, :+).to_a, quiet)
173
175
  when Array
174
176
  add(*mime_type, quiet)
175
177
  else
@@ -195,7 +197,7 @@ Type #{type} is already registered as a variant of #{type.simplified}.
195
197
  private
196
198
 
197
199
  def add_type_variant!(mime_type)
198
- @type_variants[mime_type.simplified] << mime_type
200
+ @type_variants.add(mime_type.simplified, mime_type)
199
201
  end
200
202
 
201
203
  def reindex_extensions!(mime_type)
@@ -204,7 +206,7 @@ Type #{type} is already registered as a variant of #{type.simplified}.
204
206
  end
205
207
 
206
208
  def index_extensions!(mime_type)
207
- mime_type.extensions.each { |ext| @extension_index[ext] << mime_type }
209
+ mime_type.extensions.each { |ext| @extension_index.add(ext, mime_type) }
208
210
  end
209
211
 
210
212
  def prune_matches(matches, complete, registered)
@@ -216,7 +218,7 @@ Type #{type} is already registered as a variant of #{type.simplified}.
216
218
  def match(pattern)
217
219
  @type_variants.select { |k, _|
218
220
  k =~ pattern
219
- }.values.inject(:+)
221
+ }.values.inject(Set.new, :+)
220
222
  end
221
223
  end
222
224
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mime/type/columnar'
2
4
 
3
5
  # MIME::Types::Columnar is used to extend a MIME::Types container to load data
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  MIME::Types::Cache = Struct.new(:version, :data) # :nodoc:
2
4
 
3
5
  # Caching of MIME::Types registries is advisable if you will be loading
@@ -1 +1,3 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'mime/types'
@@ -1,30 +1,58 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'set'
4
+ require 'forwardable'
5
+
6
+ # MIME::Types requires a serializable keyed container that returns an empty Set
7
+ # on a key miss. Hash#default_value cannot be used because, while it traverses
8
+ # the Marshal format correctly, it won't survive any other serialization
9
+ # format (plus, a default of a mutable object resuls in a shared mess).
10
+ # Hash#default_proc cannot be used without a wrapper because it prevents
11
+ # Marshal serialization (and doesn't survive the round-trip).
12
+ class MIME::Types::Container #:nodoc:
13
+ extend Forwardable
2
14
 
3
- # MIME::Types requires a container Hash with a default values for keys
4
- # resulting in an empty array (<tt>[]</tt>), but this cannot be dumped through
5
- # Marshal because of the presence of that default Proc. This class exists
6
- # solely to satisfy that need.
7
- class MIME::Types::Container < Hash # :nodoc:
8
15
  def initialize
9
- super
10
- self.default_proc = ->(h, k) { h[k] = Set.new }
16
+ @container = {}
17
+ end
18
+
19
+ def [](key)
20
+ container[key] || EMPTY_SET
21
+ end
22
+
23
+ def_delegators :@container,
24
+ :count,
25
+ :each_value,
26
+ :keys,
27
+ :merge,
28
+ :merge!,
29
+ :select,
30
+ :values
31
+
32
+ def add(key, value)
33
+ (container[key] ||= Set.new).add(value)
11
34
  end
12
35
 
13
36
  def marshal_dump
14
- {}.merge(self)
37
+ {}.merge(container)
15
38
  end
16
39
 
17
40
  def marshal_load(hash)
18
- self.default_proc = ->(h, k) { h[k] = Set.new }
19
- merge!(hash)
41
+ @container = hash
20
42
  end
21
43
 
22
44
  def encode_with(coder)
23
- each { |k, v| coder[k] = v.to_a }
45
+ container.each { |k, v| coder[k] = v.to_a }
24
46
  end
25
47
 
26
48
  def init_with(coder)
27
- self.default_proc = ->(h, k) { h[k] = Set.new }
28
- coder.map.each { |k, v| self[k] = Set[*v] }
49
+ coder.map.each { |k, v| container[k] = Set[*v] }
29
50
  end
51
+
52
+ private
53
+
54
+ attr_reader :container
55
+
56
+ EMPTY_SET = Set.new.freeze
57
+ private_constant :EMPTY_SET
30
58
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
3
5
  require 'mime/types/logger'
@@ -23,9 +25,9 @@ module MIME
23
25
  else
24
26
  message
25
27
  end
26
- MIME::Types.logger.warn <<-warning.chomp
28
+ MIME::Types.logger.warn <<-WARNING.chomp
27
29
  #{caller[1]}: #{klass}#{level}#{sym} is deprecated #{message}.
28
- warning
30
+ WARNING
29
31
  block.call if block
30
32
  end
31
33
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  ##
2
4
  module MIME
3
5
  ##
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
3
5
  ##
@@ -31,10 +33,6 @@ class MIME::Types::Loader
31
33
  path = path || ENV['RUBY_MIME_TYPES_DATA'] || MIME::Types::Data::PATH
32
34
  @container = container || MIME::Types.new
33
35
  @path = File.expand_path(path)
34
- # begin
35
- # require 'mime/lazy_types'
36
- # @container.extend(MIME::LazyTypes)
37
- # end
38
36
  end
39
37
 
40
38
  # Loads a MIME::Types registry from YAML files (<tt>*.yml</tt> or
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
3
5
  require 'logger'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class << MIME::Types
2
4
  include Enumerable
3
5
 
@@ -41,7 +43,13 @@ class << MIME::Types
41
43
  private
42
44
 
43
45
  def lazy_load?
44
- (lazy = ENV['RUBY_MIME_TYPES_LAZY_LOAD']) && (lazy != 'false')
46
+ if ENV.key?('RUBY_MIME_TYPES_LAZY_LOAD')
47
+ MIME::Types.logger.warn <<-WARNING.chomp
48
+ Lazy loading ($RUBY_MIME_TYPES_LAZY_LOAD) is deprecated and will be removed.
49
+ WARNING
50
+
51
+ (lazy = ENV['RUBY_MIME_TYPES_LAZY_LOAD']) && (lazy != 'false')
52
+ end
45
53
  end
46
54
 
47
55
  def __types__
@@ -55,8 +63,9 @@ class << MIME::Types
55
63
  end
56
64
 
57
65
  def load_default_mime_types(mode = load_mode)
58
- @__types__ = MIME::Types::Cache.load
59
- unless @__types__
66
+ if @__types__ = MIME::Types::Cache.load
67
+ __instances__.add(@__types__)
68
+ else
60
69
  @__types__ = MIME::Types::Loader.load(mode)
61
70
  MIME::Types::Cache.save(@__types__)
62
71
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
3
5
  require 'mime/type'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
3
5
  require 'mime/types'
@@ -330,21 +332,32 @@ describe MIME::Type do
330
332
  assert_priority text_1, text_1p, text_2
331
333
  end
332
334
 
333
- it 'sorts (2) based on the registration state' do
335
+ it 'sorts (2) based on extensions' do
336
+ text_1.extensions = ["foo", "bar"]
337
+ text_2.extensions = ["foo"]
338
+
339
+ assert_priority_same text_1, text_2
340
+
341
+ text_2.registered = true
342
+
343
+ assert_priority_more text_1, text_2
344
+ end
345
+
346
+ it 'sorts (3) based on the registration state' do
334
347
  text_1.registered = text_1p.registered = true
335
348
  text_1b = mime_type(text_1) { |t| t.registered = false }
336
349
 
337
350
  assert_priority text_1, text_1p, text_1b
338
351
  end
339
352
 
340
- it 'sorts (3) based on the completeness' do
353
+ it 'sorts (4) based on the completeness' do
341
354
  text_1.extensions = text_1p.extensions = '1'
342
355
  text_1b = mime_type(text_1) { |t| t.extensions = nil }
343
356
 
344
357
  assert_priority text_1, text_1p, text_1b
345
358
  end
346
359
 
347
- it 'sorts (4) based on obsolete status' do
360
+ it 'sorts (5) based on obsolete status' do
348
361
  text_1.obsolete = text_1p.obsolete = false
349
362
  text_1b = mime_type(text_1) { |t| t.obsolete = true }
350
363
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
3
5
  require 'mime/types'
@@ -83,6 +85,12 @@ describe MIME::Types do
83
85
  refute_empty mime_types[/gzip/, registered: true]
84
86
  refute_equal mime_types[/gzip/], mime_types[/gzip/, registered: true]
85
87
  end
88
+
89
+ it 'properly returns an empty result on a regular expression miss' do
90
+ assert_empty mime_types[/^foo/]
91
+ assert_empty mime_types[/^foo/, registered: true]
92
+ assert_empty mime_types[/^foo/, complete: true]
93
+ end
86
94
  end
87
95
 
88
96
  describe '#add' do
@@ -143,7 +151,9 @@ describe MIME::Types do
143
151
  end
144
152
 
145
153
  it 'does not find unknown extensions' do
154
+ keys = mime_types.instance_variable_get(:@extension_index).keys
146
155
  assert_empty mime_types.type_for('zzz')
156
+ assert_equal keys, mime_types.instance_variable_get(:@extension_index).keys
147
157
  end
148
158
 
149
159
  it 'modifying type extensions causes reindexing' do
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
3
5
  require 'mime/types'
@@ -35,11 +37,20 @@ describe MIME::Types::Cache do
35
37
  describe '.load' do
36
38
  it 'does not use cache when RUBY_MIME_TYPES_CACHE is unset' do
37
39
  ENV.delete('RUBY_MIME_TYPES_CACHE')
38
- assert_equal(nil, MIME::Types::Cache.load)
40
+ assert_nil MIME::Types::Cache.load
39
41
  end
40
42
 
41
43
  it 'does not use cache when missing' do
42
- assert_equal(nil, MIME::Types::Cache.load)
44
+ assert_nil MIME::Types::Cache.load
45
+ end
46
+
47
+ it 'registers the data to be updated by #add_extensions' do
48
+ MIME::Types::Cache.save
49
+ reset_mime_types
50
+ assert_equal([], MIME::Types.type_for('foo.additional'))
51
+ html = MIME::Types['text/html'][0]
52
+ html.add_extensions('additional')
53
+ assert_equal([html], MIME::Types.type_for('foo.additional'))
43
54
  end
44
55
 
45
56
  it 'outputs an error when there is an invalid version' do
@@ -69,7 +80,7 @@ describe MIME::Types::Cache do
69
80
  describe '.save' do
70
81
  it 'does not create cache when RUBY_MIME_TYPES_CACHE is unset' do
71
82
  ENV.delete('RUBY_MIME_TYPES_CACHE')
72
- assert_equal(nil, MIME::Types::Cache.save)
83
+ assert_nil MIME::Types::Cache.save
73
84
  end
74
85
 
75
86
  it 'creates the cache ' do
@@ -93,7 +104,7 @@ end
93
104
  describe MIME::Types::Container do
94
105
  it 'marshals and unmarshals correctly' do
95
106
  container = MIME::Types::Container.new
96
- container['xyz'] << 'abc'
107
+ container.add('xyz', 'abc')
97
108
 
98
109
  # default proc should return Set[]
99
110
  assert_equal(Set[], container['abc'])