Class: M2Config::MimeType

Inherits:
Object
  • Object
show all
Defined in:
lib/m2config/mimetype.rb

Constant Summary collapse

MONGREL2_PREFS =
YAML.load File.read "#{File.dirname(__FILE__)}/mongrel2.mime.yml"
RECESSIVE =
YAML.load File.read "#{File.dirname(__FILE__)}/mongrel2.mime.yml"
SQL_FIND_DUPLICATES =
<<-SQL
select mimetype, extension, count(*)
from mimetype
group by extension
having count(*)>1
SQL

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(fields) ⇒ MimeType

Returns a new instance of MimeType.

Raises:

  • (ArgumentError)


60
61
62
63
64
65
66
# File 'lib/m2config/mimetype.rb', line 60

def initialize( fields )
  raise ArgumentError, "Extension must start with a ." unless fields[:extension] =~ /^\./
  type = M2Config::MimeType[extension:fields[:extension]]
  raise ArgumentError, "extension #{fields[:extension]} is already covered by #{type.mimetype} type" if type
  super(fields, false)
  save
end

Class Method Details

.not_dominant(mtype) ⇒ Object



36
37
38
# File 'lib/m2config/mimetype.rb', line 36

def self.not_dominant( mtype )
  mtype.obsolete? || superceded?(mtype)
end

.populate_tableObject

Raises:

  • (RuntimeError)


16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/m2config/mimetype.rb', line 16

def self.populate_table
  raise RuntimeError, "Table must be empty" if db[:mimetype].count > 0
  rows = []
  MIME::Types.each {
    |type|
    next if not_dominant(type)
    type.extensions.each {
      |ext|
      ext = "."+ext
      clashingType = M2Config::MimeType[extension:ext]
      raise ArgumentError, "extension #{ext} is already covered by #{clashingType.mimetype} type" if clashingType
      rows << [type.content_type, ext]
    }
  }
  db.transaction {
    db[:mimetype].import([:mimetype, :extension], rows)
  }
  remove_duplicates
end

.remove_duplicatesObject

Raises:

  • (RuntimeError)


44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/m2config/mimetype.rb', line 44

def self.remove_duplicates
  db[SQL_FIND_DUPLICATES].all.each {
    |r|
    ext = r[:extension]
    preferred = MONGREL2_PREFS[ext]
    if preferred
      db[:mimetype].where(extension:ext).delete
      db[:mimetype].insert(extension:ext, mimetype:preferred)
    else
      raise ArgumentError, "#{ext} has multiple content types but no Mongrel2 preference"
    end
  }
  raise RuntimeError, "Still duplicates after removing duplicates!" if
    db[SQL_FIND_DUPLICATES].all.size > 0
end

.superceded?(mtype) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/m2config/mimetype.rb', line 40

def self.superceded?( mtype )
  mtype.docs =~ /instead/
end