mime-types 2.99.3 → 3.4.1

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} +29 -30
  3. data/Contributing.md +132 -0
  4. data/History.md +269 -0
  5. data/{Licence.rdoc → Licence.md} +4 -18
  6. data/Manifest.txt +8 -25
  7. data/README.rdoc +63 -73
  8. data/Rakefile +200 -97
  9. data/lib/mime/type/columnar.rb +30 -63
  10. data/lib/mime/type.rb +294 -458
  11. data/lib/mime/types/_columnar.rb +137 -0
  12. data/lib/mime/types/cache.rb +52 -74
  13. data/lib/mime/types/columnar.rb +2 -147
  14. data/lib/mime/types/container.rb +96 -0
  15. data/lib/mime/types/deprecations.rb +17 -34
  16. data/lib/mime/types/full.rb +19 -0
  17. data/lib/mime/types/loader.rb +36 -152
  18. data/lib/mime/types/logger.rb +7 -5
  19. data/lib/mime/types/registry.rb +90 -0
  20. data/lib/mime/types.rb +55 -148
  21. data/lib/mime-types.rb +2 -2
  22. data/test/minitest_helper.rb +8 -18
  23. data/test/test_mime_type.rb +489 -464
  24. data/test/test_mime_types.rb +139 -91
  25. data/test/test_mime_types_cache.rb +85 -57
  26. data/test/test_mime_types_class.rb +120 -100
  27. data/test/test_mime_types_lazy.rb +30 -28
  28. data/test/test_mime_types_loader.rb +18 -45
  29. metadata +92 -77
  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,12 @@
1
- # -*- ruby encoding: utf-8 -*-
1
+ # frozen_string_literal: true
2
2
 
3
+ ##
3
4
  module MIME; end
5
+
6
+ ##
4
7
  class MIME::Types; end
5
8
 
6
- require 'mime/types/loader_path'
9
+ require "mime/types/data"
7
10
 
8
11
  # This class is responsible for initializing the MIME::Types registry from
9
12
  # the data files supplied with the mime-types library.
@@ -11,7 +14,7 @@ require 'mime/types/loader_path'
11
14
  # The Loader will use one of the following paths:
12
15
  # 1. The +path+ provided in its constructor argument;
13
16
  # 2. The value of ENV['RUBY_MIME_TYPES_DATA']; or
14
- # 3. The value of MIME::Types::Loader::PATH.
17
+ # 3. The value of MIME::Types::Data::PATH.
15
18
  #
16
19
  # When #load is called, the +path+ will be searched recursively for all YAML
17
20
  # (.yml or .yaml) files. By convention, there is one file for each media
@@ -24,15 +27,11 @@ class MIME::Types::Loader
24
27
  attr_reader :container
25
28
 
26
29
  # Creates a Loader object that can be used to load MIME::Types registries
27
- # into memory, using YAML, JSON, or v1 registry format loaders.
30
+ # into memory, using YAML, JSON, or Columnar registry format loaders.
28
31
  def initialize(path = nil, container = nil)
29
- path = path || ENV['RUBY_MIME_TYPES_DATA'] || MIME::Types::Loader::PATH
32
+ path = path || ENV["RUBY_MIME_TYPES_DATA"] || MIME::Types::Data::PATH
30
33
  @container = container || MIME::Types.new
31
34
  @path = File.expand_path(path)
32
- # begin
33
- # require 'mime/lazy_types'
34
- # @container.extend(MIME::LazyTypes)
35
- # end
36
35
  end
37
36
 
38
37
  # Loads a MIME::Types registry from YAML files (<tt>*.yml</tt> or
@@ -41,8 +40,7 @@ class MIME::Types::Loader
41
40
  # It is expected that the YAML objects contained within the registry array
42
41
  # will be tagged as <tt>!ruby/object:MIME::Type</tt>.
43
42
  #
44
- # Note that the YAML format is about 2½ times *slower* than either the v1
45
- # format or the JSON format.
43
+ # Note that the YAML format is about 2½ times *slower* than the JSON format.
46
44
  #
47
45
  # NOTE: The purpose of this format is purely for maintenance reasons.
48
46
  def load_yaml
@@ -69,7 +67,7 @@ class MIME::Types::Loader
69
67
  # Loads a MIME::Types registry from columnar files recursively found in
70
68
  # +path+.
71
69
  def load_columnar
72
- require 'mime/types/columnar' unless defined?(MIME::Types::Columnar)
70
+ require "mime/types/columnar" unless defined?(MIME::Types::Columnar)
73
71
  container.extend(MIME::Types::Columnar)
74
72
  container.load_base_data(path)
75
73
 
@@ -81,7 +79,7 @@ class MIME::Types::Loader
81
79
  #
82
80
  # This will load from columnar files (#load_columnar) if <tt>columnar:
83
81
  # true</tt> is provided in +options+ and there are columnar files in +path+.
84
- def load(options = { columnar: false })
82
+ def load(options = {columnar: false})
85
83
  if options[:columnar] && !Dir[columnar_path].empty?
86
84
  load_columnar
87
85
  else
@@ -89,132 +87,35 @@ class MIME::Types::Loader
89
87
  end
90
88
  end
91
89
 
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
90
  class << self
111
91
  # Loads the default MIME::Type registry.
112
- def load(options = { columnar: false })
92
+ def load(options = {columnar: false})
113
93
  new.load(options)
114
94
  end
115
95
 
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
96
  # Loads MIME::Types from a single YAML file.
202
97
  #
203
98
  # It is expected that the YAML objects contained within the registry
204
99
  # array will be tagged as <tt>!ruby/object:MIME::Type</tt>.
205
100
  #
206
- # Note that the YAML format is about 2½ times *slower* than either the v1
207
- # format or the JSON format.
101
+ # Note that the YAML format is about 2½ times *slower* than the JSON
102
+ # format.
208
103
  #
209
104
  # NOTE: The purpose of this format is purely for maintenance reasons.
210
105
  def load_from_yaml(filename)
211
106
  begin
212
- require 'psych'
107
+ require "psych"
213
108
  rescue LoadError
214
109
  nil
215
110
  end
216
- require 'yaml'
217
- YAML.load(read_file(filename))
111
+
112
+ require "yaml"
113
+
114
+ if old_yaml?
115
+ YAML.safe_load(read_file(filename), [MIME::Type])
116
+ else
117
+ YAML.safe_load(read_file(filename), permitted_classes: [MIME::Type])
118
+ end
218
119
  end
219
120
 
220
121
  # Loads MIME::Types from a single JSON file.
@@ -223,53 +124,36 @@ class MIME::Types::Loader
223
124
  # The JSON format is the registry format for the MIME types registry
224
125
  # shipped with the mime-types library.
225
126
  def load_from_json(filename)
226
- require 'json'
127
+ require "json"
227
128
  JSON.parse(read_file(filename)).map { |type| MIME::Type.new(type) }
228
129
  end
229
130
 
230
131
  private
231
132
 
232
133
  def read_file(filename)
233
- File.open(filename, 'r:UTF-8:-') { |f| f.read }
134
+ File.open(filename, "r:UTF-8:-", &:read)
135
+ end
136
+
137
+ def old_yaml?
138
+ @old_yaml ||=
139
+ begin
140
+ require "rubygems/version"
141
+ Gem::Version.new(YAML::VERSION) < Gem::Version.new("3.1")
142
+ end
234
143
  end
235
144
  end
236
145
 
237
146
  private
238
147
 
239
148
  def yaml_path
240
- File.join(path, '*.y{,a}ml')
149
+ File.join(path, "*.y{,a}ml")
241
150
  end
242
151
 
243
152
  def json_path
244
- File.join(path, '*.json')
153
+ File.join(path, "*.json")
245
154
  end
246
155
 
247
156
  def columnar_path
248
- File.join(path, '*.column')
157
+ File.join(path, "*.column")
249
158
  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
159
  end
@@ -1,8 +1,10 @@
1
- # -*- ruby encoding: utf-8 -*-
1
+ # frozen_string_literal: true
2
2
 
3
- require 'logger'
3
+ require "logger"
4
4
 
5
+ ##
5
6
  module MIME
7
+ ##
6
8
  class Types
7
9
  class << self
8
10
  # Configure the MIME::Types logger. This defaults to an instance of a
@@ -10,8 +12,8 @@ module MIME
10
12
  attr_accessor :logger
11
13
  end
12
14
 
13
- class WarnLogger < ::Logger #:nodoc:
14
- class WarnLogDevice < ::Logger::LogDevice #:nodoc:
15
+ class WarnLogger < ::Logger # :nodoc:
16
+ class WarnLogDevice < ::Logger::LogDevice # :nodoc:
15
17
  def initialize(*)
16
18
  end
17
19
 
@@ -23,7 +25,7 @@ module MIME
23
25
  end
24
26
  end
25
27
 
26
- def initialize(_1, _2 = nil, _3 = nil)
28
+ def initialize(_one, _two = nil, _three = nil)
27
29
  super nil
28
30
  @logdev = WarnLogDevice.new
29
31
  @formatter = ->(_s, _d, _p, m) { m }
@@ -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
+ return unless ENV.key?("RUBY_MIME_TYPES_LAZY_LOAD")
47
+
48
+ MIME::Types.logger.warn <<-WARNING.chomp.strip
49
+ Lazy loading ($RUBY_MIME_TYPES_LAZY_LOAD) is deprecated and will be removed.
50
+ WARNING
51
+
52
+ (lazy = ENV["RUBY_MIME_TYPES_LAZY_LOAD"]) && (lazy != "false")
53
+ end
54
+
55
+ def __types__
56
+ (defined?(@__types__) && @__types__) || 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
2
 
3
- require 'mime/types/deprecations'
4
- require 'mime/type'
5
- require 'mime/types/cache'
6
- require 'mime/types/loader'
3
+ ##
4
+ module MIME
5
+ ##
6
+ class Types
7
+ end
8
+ end
9
+
10
+ require "mime/type"
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
@@ -57,6 +61,7 @@ require 'mime/types/loader'
57
61
  # puts plaintext.ascii? # => true
58
62
  # puts plaintext.obsolete? # => false
59
63
  # puts plaintext.registered? # => true
64
+ # puts plaintext.provisional? # => false
60
65
  # puts plaintext == 'text/plain' # => true
61
66
  # puts MIME::Type.simplified('x-appl/x-zip') # => 'appl/zip'
62
67
  #
@@ -66,37 +71,19 @@ class MIME::Types
66
71
 
67
72
  include Enumerable
68
73
 
69
- # The data version.
70
- attr_reader :data_version
71
-
72
74
  # Creates a new MIME::Types registry.
73
75
  def initialize
74
- @type_variants = Container.new
75
- @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
76
+ @type_variants = Container.new
77
+ @extension_index = Container.new
95
78
  end
96
79
 
97
80
  # Returns the number of known type variants.
98
81
  def count
99
- @type_variants.values.reduce(0) { |m, o| m + o.size }
82
+ @type_variants.values.inject(0) { |a, e| a + e.size }
83
+ end
84
+
85
+ def inspect # :nodoc:
86
+ "#<#{self.class}: #{count} variants, #{@extension_index.count} extensions>"
100
87
  end
101
88
 
102
89
  # Iterates through the type variants.
@@ -108,7 +95,7 @@ class MIME::Types
108
95
  end
109
96
  end
110
97
 
111
- @__types__ = nil
98
+ @__types__ = nil
112
99
 
113
100
  # Returns a list of MIME::Type objects, which may be empty. The optional
114
101
  # flag parameters are <tt>:complete</tt> (finds only complete MIME::Type
@@ -135,23 +122,20 @@ class MIME::Types
135
122
  # without;
136
123
  # 5. Obsolete definitions use-instead clauses are compared.
137
124
  # 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
-
145
- matches = case type_id
125
+ def [](type_id, complete: false, registered: false)
126
+ matches =
127
+ case type_id
146
128
  when MIME::Type
147
129
  @type_variants[type_id.simplified]
148
130
  when Regexp
149
131
  match(type_id)
150
132
  else
151
133
  @type_variants[MIME::Type.simplified(type_id)]
152
- end
134
+ end
153
135
 
154
- prune_matches(matches, flags).sort { |a, b| a.priority_compare(b) }
136
+ prune_matches(matches, complete, registered).sort { |a, b|
137
+ a.priority_compare(b)
138
+ }
155
139
  end
156
140
 
157
141
  # Return the list of MIME::Types which belongs to the file based on its
@@ -166,17 +150,12 @@ class MIME::Types
166
150
  # => [image/gif]
167
151
  # puts MIME::Types.type_for(%w(citydesk.xml citydesk.gif))
168
152
  # => [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|
153
+ def type_for(filename)
154
+ Array(filename).flat_map { |fn|
173
155
  @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
156
+ }.compact.inject(Set.new, :+).sort { |a, b|
157
+ a.priority_compare(b)
158
+ }
180
159
  end
181
160
  alias_method :of, :type_for
182
161
 
@@ -186,7 +165,7 @@ class MIME::Types
186
165
  # The last parameter may be the value <tt>:silent</tt> or +true+ which
187
166
  # will suppress duplicate MIME type warnings.
188
167
  def add(*types)
189
- quiet = ((types.last == :silent) or (types.last == true))
168
+ quiet = ((types.last == :silent) || (types.last == true))
190
169
 
191
170
  types.each do |mime_type|
192
171
  case mime_type
@@ -194,7 +173,7 @@ class MIME::Types
194
173
  nil
195
174
  when MIME::Types
196
175
  variants = mime_type.instance_variable_get(:@type_variants)
197
- add(*variants.values.flatten, quiet)
176
+ add(*variants.values.inject(Set.new, :+).to_a, quiet)
198
177
  when Array
199
178
  add(*mime_type, quiet)
200
179
  else
@@ -207,120 +186,48 @@ class MIME::Types
207
186
  # already known, a warning will be displayed. The +quiet+ parameter may be a
208
187
  # truthy value to suppress that warning.
209
188
  def add_type(type, quiet = false)
210
- if !quiet and @type_variants[type.simplified].include?(type)
211
- MIME::Types.logger.warn <<-warning
212
- Type #{type} is already registered as a variant of #{type.simplified}.
213
- warning
189
+ if !quiet && @type_variants[type.simplified].include?(type)
190
+ MIME::Types.logger.warn <<-WARNING.chomp.strip
191
+ Type #{type} is already registered as a variant of #{type.simplified}.
192
+ WARNING
214
193
  end
215
194
 
216
195
  add_type_variant!(type)
217
196
  index_extensions!(type)
218
197
  end
219
198
 
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
199
+ private
292
200
 
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
201
+ def add_type_variant!(mime_type)
202
+ @type_variants.add(mime_type.simplified, mime_type)
301
203
  end
302
204
 
303
- private
205
+ def reindex_extensions!(mime_type)
206
+ return unless @type_variants[mime_type.simplified].include?(mime_type)
304
207
 
305
- def add_type_variant!(mime_type)
306
- @type_variants[mime_type.simplified] << mime_type
208
+ index_extensions!(mime_type)
307
209
  end
308
210
 
309
211
  def index_extensions!(mime_type)
310
- mime_type.extensions.each { |ext| @extension_index[ext] << mime_type }
212
+ mime_type.extensions.each { |ext| @extension_index.add(ext, mime_type) }
311
213
  end
312
214
 
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]
215
+ def prune_matches(matches, complete, registered)
216
+ matches.delete_if { |e| !e.complete? } if complete
217
+ matches.delete_if { |e| !e.registered? } if registered
316
218
  matches
317
219
  end
318
220
 
319
221
  def match(pattern)
320
- @type_variants.select { |k, _| k =~ pattern }.values.flatten
222
+ @type_variants.select { |k, _|
223
+ k =~ pattern
224
+ }.values.inject(Set.new, :+)
321
225
  end
322
-
323
- load_default_mime_types(load_mode) unless lazy_load?
324
226
  end
325
227
 
326
- # vim: ft=ruby
228
+ require "mime/types/cache"
229
+ require "mime/types/container"
230
+ require "mime/types/loader"
231
+ require "mime/types/logger"
232
+ require "mime/types/_columnar"
233
+ 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
- require 'mime/types'
3
+ require "mime/types"