diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/mime/type.rb | 11 | ||||
-rw-r--r-- | lib/mime/types.rb | 10 | ||||
-rw-r--r-- | lib/mime/types/_columnar.rb | 135 | ||||
-rw-r--r-- | lib/mime/types/columnar.rb | 143 | ||||
-rw-r--r-- | lib/mime/types/full.rb | 4 |
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' |