Class: MIME::Types::Loader

Inherits:
Object
  • Object
show all
Defined in:
lib/mime/types/loader.rb

Overview

This class is responsible for initializing the MIME::Types registry from the data files supplied with the mime-types library.

The Loader will use one of the following paths:

  1. The path provided in its constructor argument;

  2. The value of ENV; or

  3. The value of MIME::Types::Data::PATH.

When #load is called, the path will be searched recursively for all YAML (.yml or .yaml) files. By convention, there is one file for each media type (application.yml, audio.yml, etc.), but this is not required.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(path = nil, container = nil) ⇒ Loader

Creates a Loader object that can be used to load MIME::Types registries into memory, using YAML, JSON, or Columnar registry format loaders.



31
32
33
34
35
# File 'lib/mime/types/loader.rb', line 31

def initialize(path = nil, container = nil)
  path = path || ENV["RUBY_MIME_TYPES_DATA"] || MIME::Types::Data::PATH
  @container = container || MIME::Types.new
  @path = File.expand_path(path)
end

Instance Attribute Details

#containerObject (readonly)

The MIME::Types container instance that will be loaded. If not provided at initialization, a new MIME::Types instance will be constructed.



27
28
29
# File 'lib/mime/types/loader.rb', line 27

def container
  @container
end

#pathObject (readonly)

The path that will be read for the MIME::Types files.



24
25
26
# File 'lib/mime/types/loader.rb', line 24

def path
  @path
end

Class Method Details

.load(options = {columnar: false}) ⇒ Object

Loads the default MIME::Type registry.



92
93
94
# File 'lib/mime/types/loader.rb', line 92

def load(options = {columnar: false})
  new.load(options)
end

.load_from_json(filename) ⇒ Object

Loads MIME::Types from a single JSON file.

It is expected that the JSON objects will be an array of hash objects. The JSON format is the registry format for the MIME types registry shipped with the mime-types library.



126
127
128
129
# File 'lib/mime/types/loader.rb', line 126

def load_from_json(filename)
  require "json"
  JSON.parse(read_file(filename)).map { |type| MIME::Type.new(type) }
end

.load_from_yaml(filename) ⇒ Object

Loads MIME::Types from a single YAML file.

It is expected that the YAML objects contained within the registry array will be tagged as !ruby/object:MIME::Type.

Note that the YAML format is about 2½ times slower than the JSON format.

NOTE: The purpose of this format is purely for maintenance reasons.



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/mime/types/loader.rb', line 105

def load_from_yaml(filename)
  begin
    require "psych"
  rescue LoadError
    nil
  end

  require "yaml"

  if old_yaml?
    YAML.safe_load(read_file(filename), [MIME::Type])
  else
    YAML.safe_load(read_file(filename), permitted_classes: [MIME::Type])
  end
end

Instance Method Details

#load(options = {columnar: false}) ⇒ Object

Loads a MIME::Types registry. Loads from JSON files by default (#load_json).

This will load from columnar files (#load_columnar) if columnar: true is provided in options and there are columnar files in path.



82
83
84
85
86
87
88
# File 'lib/mime/types/loader.rb', line 82

def load(options = {columnar: false})
  if options[:columnar] && !Dir[columnar_path].empty?
    load_columnar
  else
    load_json
  end
end

#load_columnarObject

Loads a MIME::Types registry from columnar files recursively found in path.



69
70
71
72
73
74
75
# File 'lib/mime/types/loader.rb', line 69

def load_columnar
  require "mime/types/columnar" unless defined?(MIME::Types::Columnar)
  container.extend(MIME::Types::Columnar)
  container.load_base_data(path)

  container
end

#load_jsonObject

Loads a MIME::Types registry from JSON files (*.json) recursively found in path.

It is expected that the JSON objects will be an array of hash objects. The JSON format is the registry format for the MIME types registry shipped with the mime-types library.



59
60
61
62
63
64
65
# File 'lib/mime/types/loader.rb', line 59

def load_json
  Dir[json_path].sort.each do |f|
    types = self.class.load_from_json(f)
    container.add(*types, :silent)
  end
  container
end

#load_yamlObject

Loads a MIME::Types registry from YAML files (*.yml or *.yaml) recursively found in path.

It is expected that the YAML objects contained within the registry array will be tagged as !ruby/object:MIME::Type.

Note that the YAML format is about 2½ times slower than the JSON format.

NOTE: The purpose of this format is purely for maintenance reasons.



46
47
48
49
50
51
# File 'lib/mime/types/loader.rb', line 46

def load_yaml
  Dir[yaml_path].sort.each do |f|
    container.add(*self.class.load_from_yaml(f), :silent)
  end
  container
end