module MIME::Types::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.

Private Instance Methods

arr(line) click to toggle source
# File lib/mime/types/_columnar.rb, line 169
def arr(line)
  if line == "-"
    []
  else
    line.split("|").flatten.compact.uniq
  end
end
dict(line, transform: nil) click to toggle source
# File lib/mime/types/_columnar.rb, line 136
def dict(line, transform: nil)
  if line == "-"
    {}
  else
    line.split("|").each_with_object({}) { |l, h|
      k, v = l.split("^")
      v = nil if v.empty?

      if transform
        send(:"dict_#{transform}", h, k, v)
      else
        h[k] = v
      end
    }
  end
end
dict_array(h, k, v) click to toggle source
# File lib/mime/types/_columnar.rb, line 165
def dict_array(h, k, v)
  h[k] = Array(v)
end
dict_extension_priority(h, k, v) click to toggle source
# File lib/mime/types/_columnar.rb, line 153
def dict_extension_priority(h, k, v)
  return if v.nil?

  v = v.to_i if v.is_a?(String)
  v = v.trunc if v.is_a?(Float)
  v = [[-20, v].max, 20].min

  return if v.zero?

  h[k] = v
end
each_file_byte(name) { |type, byte| ... } click to toggle source
# File lib/mime/types/_columnar.rb, line 70
def each_file_byte(name)
  LOAD_MUTEX.synchronize do
    next if @__files__.include?(name)

    i = -1

    filename = File.join(@__root__, "mime.#{name}.column")

    next unless File.exist?(filename)

    IO.binread(filename).unpack("C*").each do |byte|
      (type = @__mime_data__[i += 1]) || next
      yield type, byte
    end

    @__files__ << name
  end
end
each_file_line(name, lookup = true) { |type, line| ... } click to toggle source
# File lib/mime/types/_columnar.rb, line 48
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").each do |line|
      line.chomp!

      if lookup
        (type = @__mime_data__[i += 1]) || next
        yield type, line
      else
        yield line
      end
    end

    @__files__ << name
  end
end
flag(line) click to toggle source
# File lib/mime/types/_columnar.rb, line 181
def flag(line)
  line == "1"
end
load_docs() click to toggle source
# File lib/mime/types/_columnar.rb, line 96
def load_docs
  each_file_line("docs") do |type, line|
    type.instance_variable_set(:@docs, opt(line))
  end
end
load_encoding() click to toggle source
# File lib/mime/types/_columnar.rb, line 89
def load_encoding
  each_file_line("encoding") do |type, line|
    pool ||= {}
    type.instance_variable_set(:@encoding, pool[line] ||= line)
  end
end
load_flags() click to toggle source
# File lib/mime/types/_columnar.rb, line 108
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))
    type.instance_variable_set(:@provisional, flag(line.shift))
  end
end
load_friendly() click to toggle source
# File lib/mime/types/_columnar.rb, line 124
def load_friendly
  each_file_line("friendly") { |type, line|
    type.instance_variable_set(:@friendly, dict(line))
  }
end
load_preferred_extension() click to toggle source
# File lib/mime/types/_columnar.rb, line 102
def load_preferred_extension
  each_file_line("pext") do |type, line|
    type.instance_variable_set(:@preferred_extension, opt(line))
  end
end
load_use_instead() click to toggle source
# File lib/mime/types/_columnar.rb, line 130
def load_use_instead
  each_file_line("use_instead") do |type, line|
    type.instance_variable_set(:@use_instead, opt(line))
  end
end
load_xrefs() click to toggle source
# File lib/mime/types/_columnar.rb, line 118
def load_xrefs
  each_file_line("xrefs") { |type, line|
    type.instance_variable_set(:@xrefs, dict(line, transform: :array))
  }
end
opt(line) click to toggle source
# File lib/mime/types/_columnar.rb, line 177
def opt(line)
  line unless line == "-"
end