Class: Libis::Format::TypeDatabase

Inherits:
Object
  • Object
show all
Includes:
Tools::Logger, Singleton
Defined in:
lib/libis/format/type_database.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#typesObject (readonly)

Returns the value of attribute types.



126
127
128
# File 'lib/libis/format/type_database.rb', line 126

def types
  @types
end

Class Method Details

.enrich(info, map_keys = {}) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/libis/format/type_database.rb', line 21

def self.enrich(info, map_keys = {})
  return {} unless info.is_a? Hash
  mapper = Hash.new {|hash,key| hash[key] = key}
  mapper.merge! map_keys
  unless (puid = info[mapper[:PUID]]).blank?
    info[mapper[:TYPE]] ||= self.puid_infos(puid).first[:TYPE] rescue nil
  end
  unless (mime = info[mapper[:MIME]]).blank?
    info[mapper[:TYPE]] ||= self.mime_infos(mime).first[:TYPE] rescue nil
  end
  unless (type_name = info[mapper[:TYPE]]).nil?
    info[mapper[:MIME]] = self.type_mimetypes(type_name).first if info[mapper[:MIME]].blank?
    info[mapper[:PUID]] = self.type_puids(type_name).first if info[mapper[:PUID]].blank?
    info[mapper[:EXTENSIONS]] = self.type_extentions(type_name)
    info[mapper[:GROUP]] = self.type_group(type_name)
  end
  info
end

.ext_infos(ext) ⇒ Object



98
99
100
101
102
103
# File 'lib/libis/format/type_database.rb', line 98

def self.ext_infos(ext)
  ext = ext.gsub /^\./, ''
  self.instance.types.select do |_, v|
    v[:EXTENSIONS].include?(ext) rescue false
  end.values
end

.ext_types(ext) ⇒ Object



105
106
107
108
109
110
# File 'lib/libis/format/type_database.rb', line 105

def self.ext_types(ext)
  ext = ext.gsub /^\./, ''
  self.instance.types.select do |_, v|
    v[:EXTENSIONS].include?(ext) rescue false
  end.keys
end

.group_types(group) ⇒ Object



56
57
58
59
60
# File 'lib/libis/format/type_database.rb', line 56

def self.group_types(group)
  self.instance.types.select do |_, v|
    v[:GROUP] == group.to_sym
  end.keys
end

.known_mime?(mime) ⇒ Boolean

Returns:

  • (Boolean)


119
120
121
122
123
124
# File 'lib/libis/format/type_database.rb', line 119

def self.known_mime?(mime)
  self.instance.types.each do |_, v|
    return true if v[:MIME].include? mime
  end
  false
end

.mime_groups(mime) ⇒ Object



92
93
94
95
96
# File 'lib/libis/format/type_database.rb', line 92

def self.mime_groups(mime)
  mime_types(mime).map do |t|
    type_group t
  end
end

.mime_infos(mime) ⇒ Object



80
81
82
83
84
# File 'lib/libis/format/type_database.rb', line 80

def self.mime_infos(mime)
  self.instance.types.select do |_, v|
    v[:MIME].include? mime rescue false
  end.values
end

.mime_types(mime) ⇒ Object



86
87
88
89
90
# File 'lib/libis/format/type_database.rb', line 86

def self.mime_types(mime)
  self.instance.types.select do |_, v|
    v[:MIME].include? mime rescue false
  end.keys
end

.puid_groups(puid) ⇒ Object



74
75
76
77
78
# File 'lib/libis/format/type_database.rb', line 74

def self.puid_groups(puid)
  puid_types(puid).map do |t|
    type_group t
  end
end

.puid_infos(puid) ⇒ Object



62
63
64
65
66
# File 'lib/libis/format/type_database.rb', line 62

def self.puid_infos(puid)
  self.instance.types.select do |_, v|
    v[:PUID].include? puid rescue false
  end.values
end

.puid_typeinfo(puid) ⇒ Object



112
113
114
115
116
117
# File 'lib/libis/format/type_database.rb', line 112

def self.puid_typeinfo(puid)
  self.instance.types.each do |_, v|
    return v if v[:PUID] and v[:PUID].include?(puid)
  end
  nil
end

.puid_types(puid) ⇒ Object



68
69
70
71
72
# File 'lib/libis/format/type_database.rb', line 68

def self.puid_types(puid)
  self.instance.types.select do |_, v|
    v[:PUID].include? puid rescue false
  end.keys
end

.type_extentions(t) ⇒ Object



52
53
54
# File 'lib/libis/format/type_database.rb', line 52

def self.type_extentions(t)
  typeinfo(t)[:EXTENSIONS] || []
end

.type_group(t) ⇒ Object



40
41
42
# File 'lib/libis/format/type_database.rb', line 40

def self.type_group(t)
  typeinfo(t)[:GROUP]
end

.type_mimetypes(t) ⇒ Object



44
45
46
# File 'lib/libis/format/type_database.rb', line 44

def self.type_mimetypes(t)
  typeinfo(t)[:MIME] || []
end

.type_puids(t) ⇒ Object



48
49
50
# File 'lib/libis/format/type_database.rb', line 48

def self.type_puids(t)
  typeinfo(t)[:PUID] || []
end

.typeinfo(t) ⇒ Object



17
18
19
# File 'lib/libis/format/type_database.rb', line 17

def self.typeinfo(t)
  self.instance.types[t.to_sym] || {}
end

Instance Method Details

#load_types(file_or_hash = {}, append = true) ⇒ Object



128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/libis/format/type_database.rb', line 128

def load_types(file_or_hash = {}, append = true)
  hash = file_or_hash.is_a?(Hash) ? file_or_hash : YAML::load_file(file_or_hash)
  # noinspection RubyResolve
  hash.each do |group, type_info|
    type_info.each do |type_name, info|
      type_key = type_name.to_sym
      info.symbolize_keys!
      info[:TYPE] = type_key
      info[:GROUP] = group.to_sym
      info[:MIME] = info[:MIME].strip.split(/[\s,]+/).map { |v| v.strip } rescue []
      info[:EXTENSIONS] = info[:EXTENSIONS].strip.split(/[\s,]+/).map { |v| v.strip } rescue []
      info[:PUID] = info[:PUID].strip.split(/[\s,]+/).map { |v| v.strip } if info[:PUID]
      if @types.has_key?(type_key)
        warn 'Type %s already defined; merging with info from %s.', type_name.to_s, file_or_hash
        info.merge!(@types[type_key]) do |_,v_new,v_old|
          case v_old
            when Array
              append ? v_old + v_new : v_new + v_old
            when Hash
              append ? v_new.merge(v_old) : v_old.merge(v_new)
            else
              append ? v_old : v_new
          end
        end
      end
      @types[type_key] = info
    end
  end
end