summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/mime/type.rb11
-rw-r--r--lib/mime/types.rb10
-rw-r--r--lib/mime/types/_columnar.rb135
-rw-r--r--lib/mime/types/columnar.rb143
-rw-r--r--lib/mime/types/full.rb4
5 files changed, 152 insertions, 151 deletions
diff --git a/lib/mime/type.rb b/lib/mime/type.rb
index c62cf32..df0aac9 100644
--- a/lib/mime/type.rb
+++ b/lib/mime/type.rb
@@ -55,7 +55,7 @@ class MIME::Type
end
# The released version of the mime-types library.
- VERSION = '3.0'
+ VERSION = '3.1'
include Comparable
@@ -450,7 +450,14 @@ class MIME::Type
coder['obsolete'] = obsolete?
coder['use-instead'] = use_instead if use_instead
end
- coder['xrefs'] = xrefs unless xrefs.empty?
+ unless xrefs.empty?
+ {}.tap do |hash|
+ xrefs.each do |k, v|
+ hash[k] = v.sort.to_a
+ end
+ coder['xrefs'] = hash
+ end
+ end
coder['registered'] = registered?
coder['signature'] = signature? if signature?
coder
diff --git a/lib/mime/types.rb b/lib/mime/types.rb
index cd9b3ae..26277b3 100644
--- a/lib/mime/types.rb
+++ b/lib/mime/types.rb
@@ -5,11 +5,7 @@ module MIME
end
end
-require 'mime/types/logger'
-require 'mime/types/container'
require 'mime/type'
-require 'mime/types/cache'
-require 'mime/types/loader'
# MIME::Types is a registry of MIME types. It is both a class (created with
# MIME::Types.new) and a default registry (loaded automatically or through
@@ -224,5 +220,9 @@ Type #{type} is already registered as a variant of #{type.simplified}.
end
end
-require 'mime/types/columnar' unless defined?(MIME::Types::Columnar)
+require 'mime/types/cache'
+require 'mime/types/container'
+require 'mime/types/loader'
+require 'mime/types/logger'
+require 'mime/types/_columnar'
require 'mime/types/registry'
diff --git a/lib/mime/types/_columnar.rb b/lib/mime/types/_columnar.rb
new file mode 100644
index 0000000..acafbb9
--- /dev/null
+++ b/lib/mime/types/_columnar.rb
@@ -0,0 +1,135 @@
+require 'mime/type/columnar'
+
+# MIME::Types::Columnar is used to extend a MIME::Types container to load data
+# by columns instead of from JSON or YAML. Column loads of MIME types loaded
+# through the columnar store are synchronized with a Mutex.
+#
+# MIME::Types::Columnar is not intended to be used directly, but will be added
+# to an instance of MIME::Types when it is loaded with
+# MIME::Types::Loader#load_columnar.
+module MIME::Types::Columnar
+ LOAD_MUTEX = Mutex.new # :nodoc:
+
+ def self.extended(obj) # :nodoc:
+ super
+ obj.instance_variable_set(:@__mime_data__, [])
+ obj.instance_variable_set(:@__files__, Set.new)
+ end
+
+ # Load the first column data file (type and extensions).
+ def load_base_data(path) #:nodoc:
+ @__root__ = path
+
+ each_file_line('content_type', false) do |line|
+ line = line.split
+ content_type = line.shift
+ extensions = line
+ # content_type, *extensions = line.split
+
+ type = MIME::Type::Columnar.new(self, content_type, extensions)
+ @__mime_data__ << type
+ add(type)
+ end
+
+ self
+ end
+
+ private
+
+ def each_file_line(name, lookup = true)
+ LOAD_MUTEX.synchronize do
+ next if @__files__.include?(name)
+
+ i = -1
+ column = File.join(@__root__, "mime.#{name}.column")
+
+ IO.readlines(column, encoding: 'UTF-8'.freeze).each do |line|
+ line.chomp!
+
+ if lookup
+ type = @__mime_data__[i += 1] or next
+ yield type, line
+ else
+ yield line
+ end
+ end
+
+ @__files__ << name
+ end
+ end
+
+ def load_encoding
+ each_file_line('encoding') do |type, line|
+ pool ||= {}
+ line.freeze
+ type.instance_variable_set(:@encoding, (pool[line] ||= line))
+ end
+ end
+
+ def load_docs
+ each_file_line('docs') do |type, line|
+ type.instance_variable_set(:@docs, opt(line))
+ end
+ end
+
+ def load_preferred_extension
+ each_file_line('pext') do |type, line|
+ type.instance_variable_set(:@preferred_extension, opt(line))
+ end
+ end
+
+ def load_flags
+ each_file_line('flags') do |type, line|
+ line = line.split
+ type.instance_variable_set(:@obsolete, flag(line.shift))
+ type.instance_variable_set(:@registered, flag(line.shift))
+ type.instance_variable_set(:@signature, flag(line.shift))
+ end
+ end
+
+ def load_xrefs
+ each_file_line('xrefs') { |type, line|
+ type.instance_variable_set(:@xrefs, dict(line, array: true))
+ }
+ end
+
+ def load_friendly
+ each_file_line('friendly') { |type, line|
+ type.instance_variable_set(:@friendly, dict(line))
+ }
+ end
+
+ def load_use_instead
+ each_file_line('use_instead') do |type, line|
+ type.instance_variable_set(:@use_instead, opt(line))
+ end
+ end
+
+ def dict(line, array: false)
+ if line == '-'.freeze
+ {}
+ else
+ line.split('|'.freeze).each_with_object({}) { |l, h|
+ k, v = l.split('^'.freeze)
+ v = nil if v.empty?
+ h[k] = array ? Array(v) : v
+ }
+ end
+ end
+
+ def arr(line)
+ if line == '-'.freeze
+ []
+ else
+ line.split('|'.freeze).flatten.compact.uniq
+ end
+ end
+
+ def opt(line)
+ line unless line == '-'.freeze
+ end
+
+ def flag(line)
+ line == '1'.freeze ? true : false
+ end
+end
diff --git a/lib/mime/types/columnar.rb b/lib/mime/types/columnar.rb
index e018941..fc219b8 100644
--- a/lib/mime/types/columnar.rb
+++ b/lib/mime/types/columnar.rb
@@ -1,142 +1 @@
-module MIME
- class Types
- end
-end
-
-require 'mime/type/columnar'
-
-# MIME::Types::Columnar is used to extend a MIME::Types container to load data
-# by columns instead of from JSON or YAML. Column loads of MIME types loaded
-# through the columnar store are synchronized with a Mutex.
-#
-# MIME::Types::Columnar is not intended to be used directly, but will be added
-# to an instance of MIME::Types when it is loaded with
-# MIME::Types::Loader#load_columnar.
-module MIME::Types::Columnar
- LOAD_MUTEX = Mutex.new # :nodoc:
-
- def self.extended(obj) # :nodoc:
- super
- obj.instance_variable_set(:@__mime_data__, [])
- obj.instance_variable_set(:@__files__, Set.new)
- end
-
- # Load the first column data file (type and extensions).
- def load_base_data(path) #:nodoc:
- @__root__ = path
-
- each_file_line('content_type', false) do |line|
- line = line.split
- content_type = line.shift
- extensions = line
- # content_type, *extensions = line.split
-
- type = MIME::Type::Columnar.new(self, content_type, extensions)
- @__mime_data__ << type
- add(type)
- end
-
- self
- end
-
- private
-
- def each_file_line(name, lookup = true)
- LOAD_MUTEX.synchronize do
- next if @__files__.include?(name)
-
- i = -1
- column = File.join(@__root__, "mime.#{name}.column")
-
- IO.readlines(column, encoding: 'UTF-8'.freeze).each do |line|
- line.chomp!
-
- if lookup
- type = @__mime_data__[i += 1] or next
- yield type, line
- else
- yield line
- end
- end
-
- @__files__ << name
- end
- end
-
- def load_encoding
- each_file_line('encoding') do |type, line|
- pool ||= {}
- line.freeze
- type.instance_variable_set(:@encoding, (pool[line] ||= line))
- end
- end
-
- def load_docs
- each_file_line('docs') do |type, line|
- type.instance_variable_set(:@docs, opt(line))
- end
- end
-
- def load_preferred_extension
- each_file_line('pext') do |type, line|
- type.instance_variable_set(:@preferred_extension, opt(line))
- end
- end
-
- def load_flags
- each_file_line('flags') do |type, line|
- line = line.split
- type.instance_variable_set(:@obsolete, flag(line.shift))
- type.instance_variable_set(:@registered, flag(line.shift))
- type.instance_variable_set(:@signature, flag(line.shift))
- end
- end
-
- def load_xrefs
- each_file_line('xrefs') { |type, line|
- type.instance_variable_set(:@xrefs, dict(line, array: true))
- }
- end
-
- def load_friendly
- each_file_line('friendly') { |type, line|
- type.instance_variable_set(:@friendly, dict(line))
- }
- end
-
- def load_use_instead
- each_file_line('use_instead') do |type, line|
- type.instance_variable_set(:@use_instead, opt(line))
- end
- end
-
- def dict(line, array: false)
- if line == '-'.freeze
- {}
- else
- line.split('|'.freeze).each_with_object({}) { |l, h|
- k, v = l.split('^'.freeze)
- v = nil if v.empty?
- h[k] = array ? Array(v) : v
- }
- end
- end
-
- def arr(line)
- if line == '-'.freeze
- []
- else
- line.split('|'.freeze).flatten.compact.uniq
- end
- end
-
- def opt(line)
- line unless line == '-'.freeze
- end
-
- def flag(line)
- line == '1'.freeze ? true : false
- end
-end
-
-require 'mime/types' unless defined?(MIME::Types::VERSION)
+require 'mime/types'
diff --git a/lib/mime/types/full.rb b/lib/mime/types/full.rb
index 2023f54..cf2dc0c 100644
--- a/lib/mime/types/full.rb
+++ b/lib/mime/types/full.rb
@@ -10,8 +10,8 @@ module MIME
{ columnar: false }
end
end
-
- require 'mime/types'
end
end
end
+
+require 'mime/types'