mime-types 2.99.3 → 3.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +5 -5
  2. data/{Code-of-Conduct.rdoc → Code-of-Conduct.md} +19 -20
  3. data/Contributing.md +139 -0
  4. data/History.md +208 -0
  5. data/{Licence.rdoc → Licence.md} +4 -18
  6. data/Manifest.txt +8 -25
  7. data/README.rdoc +63 -67
  8. data/Rakefile +144 -55
  9. data/lib/mime/type/columnar.rb +29 -62
  10. data/lib/mime/type.rb +192 -417
  11. data/lib/mime/types/_columnar.rb +137 -0
  12. data/lib/mime/types/cache.rb +51 -73
  13. data/lib/mime/types/columnar.rb +2 -147
  14. data/lib/mime/types/container.rb +94 -0
  15. data/lib/mime/types/deprecations.rb +5 -24
  16. data/lib/mime/types/full.rb +19 -0
  17. data/lib/mime/types/loader.rb +12 -141
  18. data/lib/mime/types/logger.rb +4 -0
  19. data/lib/mime/types/registry.rb +90 -0
  20. data/lib/mime/types.rb +43 -139
  21. data/lib/mime-types.rb +1 -1
  22. data/test/minitest_helper.rb +6 -12
  23. data/test/test_mime_type.rb +473 -455
  24. data/test/test_mime_types.rb +136 -86
  25. data/test/test_mime_types_cache.rb +83 -53
  26. data/test/test_mime_types_class.rb +119 -97
  27. data/test/test_mime_types_lazy.rb +27 -23
  28. data/test/test_mime_types_loader.rb +7 -32
  29. metadata +102 -62
  30. data/Contributing.rdoc +0 -170
  31. data/History-Types.rdoc +0 -454
  32. data/History.rdoc +0 -590
  33. data/data/mime-types.json +0 -1
  34. data/data/mime.content_type.column +0 -1980
  35. data/data/mime.docs.column +0 -1980
  36. data/data/mime.encoding.column +0 -1980
  37. data/data/mime.friendly.column +0 -1980
  38. data/data/mime.obsolete.column +0 -1980
  39. data/data/mime.registered.column +0 -1980
  40. data/data/mime.signature.column +0 -1980
  41. data/data/mime.use_instead.column +0 -1980
  42. data/data/mime.xrefs.column +0 -1980
  43. data/docs/COPYING.txt +0 -339
  44. data/docs/artistic.txt +0 -127
  45. data/lib/mime/types/loader_path.rb +0 -15
  46. data/support/apache_mime_types.rb +0 -108
  47. data/support/benchmarks/load.rb +0 -64
  48. data/support/benchmarks/load_allocations.rb +0 -83
  49. data/support/benchmarks/object_counts.rb +0 -41
  50. data/support/convert/columnar.rb +0 -88
  51. data/support/convert.rb +0 -158
  52. data/support/iana_registry.rb +0 -172
@@ -1,9 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
5
+ ##
3
6
  module MIME; end
7
+ ##
4
8
  class MIME::Types; end
5
9
 
6
- require 'mime/types/loader_path'
10
+ require 'mime/types/data'
7
11
 
8
12
  # This class is responsible for initializing the MIME::Types registry from
9
13
  # the data files supplied with the mime-types library.
@@ -11,7 +15,7 @@ require 'mime/types/loader_path'
11
15
  # The Loader will use one of the following paths:
12
16
  # 1. The +path+ provided in its constructor argument;
13
17
  # 2. The value of ENV['RUBY_MIME_TYPES_DATA']; or
14
- # 3. The value of MIME::Types::Loader::PATH.
18
+ # 3. The value of MIME::Types::Data::PATH.
15
19
  #
16
20
  # When #load is called, the +path+ will be searched recursively for all YAML
17
21
  # (.yml or .yaml) files. By convention, there is one file for each media
@@ -24,15 +28,11 @@ class MIME::Types::Loader
24
28
  attr_reader :container
25
29
 
26
30
  # Creates a Loader object that can be used to load MIME::Types registries
27
- # into memory, using YAML, JSON, or v1 registry format loaders.
31
+ # into memory, using YAML, JSON, or Columnar registry format loaders.
28
32
  def initialize(path = nil, container = nil)
29
- path = path || ENV['RUBY_MIME_TYPES_DATA'] || MIME::Types::Loader::PATH
33
+ path = path || ENV['RUBY_MIME_TYPES_DATA'] || MIME::Types::Data::PATH
30
34
  @container = container || MIME::Types.new
31
35
  @path = File.expand_path(path)
32
- # begin
33
- # require 'mime/lazy_types'
34
- # @container.extend(MIME::LazyTypes)
35
- # end
36
36
  end
37
37
 
38
38
  # Loads a MIME::Types registry from YAML files (<tt>*.yml</tt> or
@@ -41,8 +41,7 @@ class MIME::Types::Loader
41
41
  # It is expected that the YAML objects contained within the registry array
42
42
  # will be tagged as <tt>!ruby/object:MIME::Type</tt>.
43
43
  #
44
- # Note that the YAML format is about 2½ times *slower* than either the v1
45
- # format or the JSON format.
44
+ # Note that the YAML format is about 2½ times *slower* than the JSON format.
46
45
  #
47
46
  # NOTE: The purpose of this format is purely for maintenance reasons.
48
47
  def load_yaml
@@ -89,122 +88,19 @@ class MIME::Types::Loader
89
88
  end
90
89
  end
91
90
 
92
- # Loads a MIME::Types registry from files found in +path+ that are in the
93
- # v1 data format. The file search for this will exclude both JSON
94
- # (<tt>*.json</tt>) and YAML (<tt>*.yml</tt> or <tt>*.yaml</tt>) files.
95
- #
96
- # This method has been deprecated and will be removed from mime-types 3.0.
97
- def load_v1
98
- MIME::Types.deprecated(self.class, __method__)
99
- Dir[v1_path].sort.each do |f|
100
- next if f =~ /\.(?:ya?ml|json|column)$/
101
- container.add(self.class.load_from_v1(f, true), true)
102
- end
103
- container
104
- end
105
-
106
- # Raised when a V1 format file is discovered. This exception will be removed
107
- # for mime-types 3.0.
108
- BadV1Format = Class.new(Exception)
109
-
110
91
  class << self
111
92
  # Loads the default MIME::Type registry.
112
93
  def load(options = { columnar: false })
113
94
  new.load(options)
114
95
  end
115
96
 
116
- # Build the type list from a file in the format:
117
- #
118
- # [*][!][os:]mt/st[<ws>@ext][<ws>:enc][<ws>'url-list][<ws>=docs]
119
- #
120
- # == *
121
- # An unofficial MIME type. This should be used if and only if the MIME type
122
- # is not properly specified (that is, not under either x-type or
123
- # vnd.name.type).
124
- #
125
- # == !
126
- # An obsolete MIME type. May be used with an unofficial MIME type.
127
- #
128
- # == os:
129
- # Platform-specific MIME type definition.
130
- #
131
- # == mt
132
- # The media type.
133
- #
134
- # == st
135
- # The media subtype.
136
- #
137
- # == <ws>@ext
138
- # The list of comma-separated extensions.
139
- #
140
- # == <ws>:enc
141
- # The encoding.
142
- #
143
- # == <ws>'url-list
144
- # The list of comma-separated URLs.
145
- #
146
- # == <ws>=docs
147
- # The documentation string.
148
- #
149
- # That is, everything except the media type and the subtype is optional. The
150
- # more information that's available, though, the richer the values that can
151
- # be provided.
152
- #
153
- # This method has been deprecated and will be removed in mime-types 3.0.
154
- def load_from_v1(filename, __internal__ = false)
155
- MIME::Types.deprecated(self.class, __method__) unless __internal__
156
- data = read_file(filename).split($/)
157
- mime = MIME::Types.new
158
- data.each_with_index { |line, index|
159
- item = line.chomp.strip
160
- next if item.empty?
161
-
162
- m = V1_FORMAT.match(item)
163
-
164
- unless m
165
- MIME::Types.logger.warn <<-EOS
166
- #{filename}:#{index + 1}: Parsing error in v1 MIME type definition.
167
- => #{line}
168
- EOS
169
- fail BadV1Format, line
170
- end
171
-
172
- unregistered, obsolete, _, mediatype, subtype, extensions, encoding,
173
- urls, docs, _ = *m.captures
174
-
175
- next if mediatype.nil?
176
-
177
- extensions &&= extensions.split(/,/)
178
- urls &&= urls.split(/,/)
179
-
180
- if docs.nil?
181
- use_instead = nil
182
- else
183
- use_instead = docs.scan(%r{use-instead:(\S+)}).flatten.first
184
- docs = docs.gsub(%r{use-instead:\S+}, '').squeeze(' \t')
185
- end
186
-
187
- mime_type = MIME::Type.new("#{mediatype}/#{subtype}") do |t|
188
- t.extensions = extensions
189
- t.encoding = encoding
190
- t.obsolete = obsolete
191
- t.registered = false if unregistered
192
- t.use_instead = use_instead
193
- t.docs = docs
194
- end
195
-
196
- mime.add_type(mime_type, true)
197
- }
198
- mime
199
- end
200
-
201
97
  # Loads MIME::Types from a single YAML file.
202
98
  #
203
99
  # It is expected that the YAML objects contained within the registry
204
100
  # array will be tagged as <tt>!ruby/object:MIME::Type</tt>.
205
101
  #
206
- # Note that the YAML format is about 2½ times *slower* than either the v1
207
- # format or the JSON format.
102
+ # Note that the YAML format is about 2½ times *slower* than the JSON
103
+ # format.
208
104
  #
209
105
  # NOTE: The purpose of this format is purely for maintenance reasons.
210
106
  def load_from_yaml(filename)
@@ -230,7 +126,7 @@ class MIME::Types::Loader
230
126
  private
231
127
 
232
128
  def read_file(filename)
233
- File.open(filename, 'r:UTF-8:-') { |f| f.read }
129
+ File.open(filename, 'r:UTF-8:-', &:read)
234
130
  end
235
131
  end
236
132
 
@@ -247,29 +143,4 @@ class MIME::Types::Loader
247
143
  def columnar_path
248
144
  File.join(path, '*.column')
249
145
  end
250
-
251
- def v1_path
252
- File.join(path, '*')
253
- end
254
-
255
- # The regular expression used to match a v1-format file-based MIME type
256
- # definition.
257
- #
258
- # This constant has been deprecated and will be removed in mime-types 3.0.
259
- V1_FORMAT = # :nodoc:
260
- %r{\A\s*
261
- ([*])? # 0: Unregistered?
262
- (!)? # 1: Obsolete?
263
- (?:(\w+):)? # 2: Platform marker
264
- ([-\w.+]+)/([-\w.+]*) # 3, 4: Media Type
265
- (?:\s+@(\S+))? # 5: Extensions
266
- (?:\s+:(base64|7bit|8bit|quoted\-printable))? # 6: Encoding
267
- (?:\s+'(\S+))? # 7: URL list
268
- (?:\s+=(.+))? # 8: Documentation
269
- (?:\s*([#].*)?)? # Comments
270
- \s*
271
- \z
272
- }x
273
-
274
- private_constant :V1_FORMAT if respond_to? :private_constant
275
146
  end
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
3
5
  require 'logger'
4
6
 
7
+ ##
5
8
  module MIME
9
+ ##
6
10
  class Types
7
11
  class << self
8
12
  # Configure the MIME::Types logger. This defaults to an instance of a
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ class << MIME::Types
4
+ include Enumerable
5
+
6
+ ##
7
+ def new(*) # :nodoc:
8
+ super.tap do |types|
9
+ __instances__.add types
10
+ end
11
+ end
12
+
13
+ # MIME::Types#[] against the default MIME::Types registry.
14
+ def [](type_id, complete: false, registered: false)
15
+ __types__[type_id, complete: complete, registered: registered]
16
+ end
17
+
18
+ # MIME::Types#count against the default MIME::Types registry.
19
+ def count
20
+ __types__.count
21
+ end
22
+
23
+ # MIME::Types#each against the default MIME::Types registry.
24
+ def each
25
+ if block_given?
26
+ __types__.each { |t| yield t }
27
+ else
28
+ enum_for(:each)
29
+ end
30
+ end
31
+
32
+ # MIME::Types#type_for against the default MIME::Types registry.
33
+ def type_for(filename)
34
+ __types__.type_for(filename)
35
+ end
36
+ alias_method :of, :type_for
37
+
38
+ # MIME::Types#add against the default MIME::Types registry.
39
+ def add(*types)
40
+ __types__.add(*types)
41
+ end
42
+
43
+ private
44
+
45
+ def lazy_load?
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
53
+ end
54
+
55
+ def __types__
56
+ (defined?(@__types__) and @__types__) or load_default_mime_types
57
+ end
58
+
59
+ unless private_method_defined?(:load_mode)
60
+ def load_mode
61
+ { columnar: true }
62
+ end
63
+ end
64
+
65
+ def load_default_mime_types(mode = load_mode)
66
+ if @__types__ = MIME::Types::Cache.load
67
+ __instances__.add(@__types__)
68
+ else
69
+ @__types__ = MIME::Types::Loader.load(mode)
70
+ MIME::Types::Cache.save(@__types__)
71
+ end
72
+ @__types__
73
+ end
74
+
75
+ def __instances__
76
+ @__instances__ ||= Set.new
77
+ end
78
+
79
+ def reindex_extensions(type)
80
+ __instances__.each do |instance|
81
+ instance.send(:reindex_extensions!, type)
82
+ end
83
+ true
84
+ end
85
+ end
86
+
87
+ ##
88
+ class MIME::Types
89
+ load_default_mime_types(load_mode) unless lazy_load?
90
+ end
data/lib/mime/types.rb CHANGED
@@ -1,9 +1,13 @@
1
- # -*- ruby encoding: utf-8 -*-
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ module MIME
5
+ ##
6
+ class Types
7
+ end
8
+ end
2
9
 
3
- require 'mime/types/deprecations'
4
10
  require 'mime/type'
5
- require 'mime/types/cache'
6
- require 'mime/types/loader'
7
11
 
8
12
  # MIME::Types is a registry of MIME types. It is both a class (created with
9
13
  # MIME::Types.new) and a default registry (loaded automatically or through
@@ -66,37 +70,19 @@ class MIME::Types
66
70
 
67
71
  include Enumerable
68
72
 
69
- # The data version.
70
- attr_reader :data_version
71
-
72
73
  # Creates a new MIME::Types registry.
73
74
  def initialize
74
75
  @type_variants = Container.new
75
76
  @extension_index = Container.new
76
- @data_version = VERSION.dup.freeze
77
- end
78
-
79
- # This method is deprecated and will be removed in mime-types 3.0.
80
- def add_type_variant(mime_type) # :nodoc:
81
- MIME::Types.deprecated(self, __method__, :private)
82
- add_type_variant!(mime_type)
83
- end
84
-
85
- # This method is deprecated and will be removed in mime-types 3.0.
86
- def index_extensions(mime_type) # :nodoc:
87
- MIME::Types.deprecated(self, __method__, :private)
88
- index_extensions!(mime_type)
89
- end
90
-
91
- # This method is deprecated and will be removed in mime-types 3.0.
92
- def defined_types # :nodoc:
93
- MIME::Types.deprecated(self, __method__)
94
- @type_variants.values.flatten
95
77
  end
96
78
 
97
79
  # Returns the number of known type variants.
98
80
  def count
99
- @type_variants.values.reduce(0) { |m, o| m + o.size }
81
+ @type_variants.values.inject(0) { |a, e| a + e.size }
82
+ end
83
+
84
+ def inspect # :nodoc:
85
+ "#<#{self.class}: #{count} variants, #{@extension_index.count} extensions>"
100
86
  end
101
87
 
102
88
  # Iterates through the type variants.
@@ -108,7 +94,7 @@ class MIME::Types
108
94
  end
109
95
  end
110
96
 
111
- @__types__ = nil
97
+ @__types__ = nil
112
98
 
113
99
  # Returns a list of MIME::Type objects, which may be empty. The optional
114
100
  # flag parameters are <tt>:complete</tt> (finds only complete MIME::Type
@@ -135,13 +121,7 @@ class MIME::Types
135
121
  # without;
136
122
  # 5. Obsolete definitions use-instead clauses are compared.
137
123
  # 6. Sort on name.
138
- #
139
- # The previously supported (but deprecated) <tt>:platform</tt> flag is now ignored.
140
- def [](type_id, flags = {})
141
- if flags.key?(:platform)
142
- MIME::Types.deprecated(self, __method__, 'using the :platform flag')
143
- end
144
-
124
+ def [](type_id, complete: false, registered: false)
145
125
  matches = case type_id
146
126
  when MIME::Type
147
127
  @type_variants[type_id.simplified]
@@ -151,7 +131,9 @@ class MIME::Types
151
131
  @type_variants[MIME::Type.simplified(type_id)]
152
132
  end
153
133
 
154
- prune_matches(matches, flags).sort { |a, b| a.priority_compare(b) }
134
+ prune_matches(matches, complete, registered).sort { |a, b|
135
+ a.priority_compare(b)
136
+ }
155
137
  end
156
138
 
157
139
  # Return the list of MIME::Types which belongs to the file based on its
@@ -166,17 +148,12 @@ class MIME::Types
166
148
  # => [image/gif]
167
149
  # puts MIME::Types.type_for(%w(citydesk.xml citydesk.gif))
168
150
  # => [application/xml, image/gif, text/xml]
169
- #
170
- # The deprecated +platform+ flag is ignored.
171
- def type_for(filename, platform = :deprecated)
172
- types = Array(filename).flat_map { |fn|
151
+ def type_for(filename)
152
+ Array(filename).flat_map { |fn|
173
153
  @extension_index[fn.chomp.downcase[/\.?([^.]*?)$/, 1]]
174
- }.compact.sort { |a, b| a.priority_compare(b) }.uniq
175
-
176
- unless platform == :deprecated
177
- MIME::Types.deprecated(self, __method__, 'using the platform parameter')
178
- end
179
- types
154
+ }.compact.inject(Set.new, :+).sort { |a, b|
155
+ a.priority_compare(b)
156
+ }
180
157
  end
181
158
  alias_method :of, :type_for
182
159
 
@@ -194,7 +171,7 @@ class MIME::Types
194
171
  nil
195
172
  when MIME::Types
196
173
  variants = mime_type.instance_variable_get(:@type_variants)
197
- add(*variants.values.flatten, quiet)
174
+ add(*variants.values.inject(Set.new, :+).to_a, quiet)
198
175
  when Array
199
176
  add(*mime_type, quiet)
200
177
  else
@@ -217,110 +194,37 @@ Type #{type} is already registered as a variant of #{type.simplified}.
217
194
  index_extensions!(type)
218
195
  end
219
196
 
220
- class << self
221
- include Enumerable
222
-
223
- # Load MIME::Types from a v1 file registry.
224
- #
225
- # This method has been deprecated and will be removed in mime-types 3.0.
226
- def load_from_file(filename)
227
- MIME::Types.deprecated(self, __method__)
228
- MIME::Types::Loader.load_from_v1(filename)
229
- end
230
-
231
- # MIME::Types#[] against the default MIME::Types registry.
232
- def [](type_id, flags = {})
233
- __types__[type_id, flags]
234
- end
235
-
236
- # MIME::Types#count against the default MIME::Types registry.
237
- def count
238
- __types__.count
239
- end
240
-
241
- # MIME::Types#each against the default MIME::Types registry.
242
- def each
243
- if block_given?
244
- __types__.each { |t| yield t }
245
- else
246
- enum_for(:each)
247
- end
248
- end
249
-
250
- # MIME::Types#type_for against the default MIME::Types registry.
251
- def type_for(filename, platform = :deprecated)
252
- __types__.type_for(filename, platform)
253
- end
254
- alias_method :of, :type_for
255
-
256
- # MIME::Types#add against the default MIME::Types registry.
257
- def add(*types)
258
- __types__.add(*types)
259
- end
260
-
261
- # Returns the currently defined cache file, if any.
262
- #
263
- # This method has been deprecated and will be removed in mime-types 3.0.
264
- def cache_file
265
- MIME::Types.deprecated(self, __method__)
266
- ENV['RUBY_MIME_TYPES_CACHE']
267
- end
268
-
269
- def add_type_variant(mime_type) # :nodoc:
270
- __types__.add_type_variant(mime_type)
271
- end
272
-
273
- def index_extensions(mime_type) # :nodoc:
274
- __types__.index_extensions(mime_type)
275
- end
276
-
277
- private
278
-
279
- def lazy_load?
280
- (lazy = ENV['RUBY_MIME_TYPES_LAZY_LOAD']) && (lazy != 'false')
281
- end
282
-
283
- def __types__
284
- (defined?(@__types__) and @__types__) or load_default_mime_types
285
- end
286
-
287
- unless private_method_defined?(:load_mode)
288
- def load_mode
289
- {}
290
- end
291
- end
292
-
293
- def load_default_mime_types(mode = load_mode())
294
- @__types__ = MIME::Types::Cache.load
295
- unless @__types__
296
- @__types__ = MIME::Types::Loader.load(mode)
297
- MIME::Types::Cache.save(@__types__)
298
- end
299
- @__types__
300
- end
301
- end
302
-
303
197
  private
304
198
 
305
199
  def add_type_variant!(mime_type)
306
- @type_variants[mime_type.simplified] << mime_type
200
+ @type_variants.add(mime_type.simplified, mime_type)
201
+ end
202
+
203
+ def reindex_extensions!(mime_type)
204
+ return unless @type_variants[mime_type.simplified].include?(mime_type)
205
+ index_extensions!(mime_type)
307
206
  end
308
207
 
309
208
  def index_extensions!(mime_type)
310
- mime_type.extensions.each { |ext| @extension_index[ext] << mime_type }
209
+ mime_type.extensions.each { |ext| @extension_index.add(ext, mime_type) }
311
210
  end
312
211
 
313
- def prune_matches(matches, flags)
314
- matches.delete_if { |e| !e.complete? } if flags[:complete]
315
- matches.delete_if { |e| !e.registered? } if flags[:registered]
212
+ def prune_matches(matches, complete, registered)
213
+ matches.delete_if { |e| !e.complete? } if complete
214
+ matches.delete_if { |e| !e.registered? } if registered
316
215
  matches
317
216
  end
318
217
 
319
218
  def match(pattern)
320
- @type_variants.select { |k, _| k =~ pattern }.values.flatten
219
+ @type_variants.select { |k, _|
220
+ k =~ pattern
221
+ }.values.inject(Set.new, :+)
321
222
  end
322
-
323
- load_default_mime_types(load_mode) unless lazy_load?
324
223
  end
325
224
 
326
- # vim: ft=ruby
225
+ require 'mime/types/cache'
226
+ require 'mime/types/container'
227
+ require 'mime/types/loader'
228
+ require 'mime/types/logger'
229
+ require 'mime/types/_columnar'
230
+ require 'mime/types/registry'
data/lib/mime-types.rb CHANGED
@@ -1,3 +1,3 @@
1
- # -*- ruby encoding: utf-8 -*-
1
+ # frozen_string_literal: true
2
2
 
3
3
  require 'mime/types'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # -*- ruby encoding: utf-8 -*-
2
4
 
3
5
  require 'mime/type'
@@ -6,16 +8,8 @@ require 'fileutils'
6
8
  gem 'minitest'
7
9
  require 'fivemat/minitest/autorun'
8
10
  require 'minitest/focus'
11
+ require 'minitest/rg'
12
+ require 'minitest-bonus-assertions'
13
+ require 'minitest/hooks'
9
14
 
10
- module Minitest::MIMEDeprecated
11
- def assert_deprecated name, message = 'and will be removed'
12
- name = Regexp.escape(name)
13
- message = Regexp.escape(message)
14
-
15
- assert_output nil, /#{name} is deprecated #{message}./ do
16
- yield
17
- end
18
- end
19
-
20
- Minitest::Test.send(:include, self)
21
- end
15
+ ENV['RUBY_MIME_TYPES_LAZY_LOAD'] = 'yes'