Module: Indexer::Importer::FileImportation

Included in:
Indexer::Importer
Defined in:
lib/indexer/importer/file.rb

Overview

Import metadata from individual files.

Instance Method Summary collapse

Instance Method Details

#import(source) ⇒ Object

Files import procedure.



12
13
14
15
16
17
18
19
# File 'lib/indexer/importer/file.rb', line 12

def import(source)
  if File.directory?(source)
    load_directory(source)
    true
  else
    super(source) if defined?(super)
  end
end

#load_directory(folder) ⇒ Object

TODO:

Subdirectories are simply omitted. Maybe do otherwise in future?

Import files from a given directory. This will only import files that have a name corresponding to a metadata attribute, unless the file is listed in a ‘.index_extra` file within the directory.

However, files with an extension of ‘.yml` or `.yaml` will be loaded wholeclothe and not as a single attribute.



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/indexer/importer/file.rb', line 31

def load_directory(folder)
  if File.directory?(folder)
    extra = []
    extra_file = File.join(folder, '.index_extra')
    if File.exist?(extra_file)
      extra = File.read(extra_file).split("\n")
      extra = extra.collect{ |pattern| pattern.strip  }
      extra = extra.reject { |pattern| pattern.empty? }
      extra = extra.collect{ |pattern| Dir[File.join(folder, pattern)] }.flatten
    end
    files = Dir[File.join(folder, '*')]
    files.each do |file|
      next if File.directory?(file)
      name = File.basename(file).downcase
      next load_yaml(file) if %w{.yaml .yml}.include?(File.extname(file))
      next load_field_file(file) if extra.include?(name)
      next load_field_file(file) if .attributes.include?(name.to_sym)
    end
  end
end

#load_field_file(file) ⇒ Object

Import a field setting from a file.

TODO: Ultimately support JSON and maybe other types, and possibly use mime-types library to recognize them.



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/indexer/importer/file.rb', line 58

def load_field_file(file)
  if File.directory?(file)
    # ...
  else
    case File.extname(file).downcase
    when '.yaml', '.yml'
      name = File.basename(file).downcase
      name = name.chomp('.yaml').chomp('.yml')
      [name] = YAML.load_file(file)
      # TODO: should yaml files with explict extension by merged instead?
      #metadata.merge!(YAML.load_file(file))
    when '.text', '.txt'
      name = File.basename(file).downcase
      name = name.chomp('.text').chomp('.txt')
      text = File.read(file)
      [name] = text.strip
    else
      text = File.read(file)
      if /\A---/ =~ text
        name = File.basename(file).downcase
        [name] = YAML.load(text)
      else
        name = File.basename(file).downcase
        [name] = text.strip
      end
    end
  end
end