class AdHocTemplate::RecipeManager

Attributes

output_file[R]
recipe[R]
records[R]
template[R]
template_encoding[R]

Public Class Methods

new(recipe_source) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 24
def initialize(recipe_source)
  @default = {}
  read_recipe(recipe_source)
end
update_output_files_in_recipe(recipe_file, force_update=false) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 13
def self.update_output_files_in_recipe(recipe_file, force_update=false)
  recipe_source = File.open(File.expand_path(recipe_file), &:read)
  recipes = YAML.load_stream(recipe_source)
  recipes.each do |recipe|
    manager = new(recipe)
    if manager.modified_after_last_output? || force_update
      manager.update_output_file
    end
  end
end

Public Instance Methods

load_records() click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 41
def load_records
  @records = prepare_block_data(@recipe).tap do |main_block|
    @recipe['blocks'].each do |block_source|
      block = prepare_block_data(block_source)
      block.keys.each do |key|
        main_block[key] ||= block[key]
      end
    end
  end
end
modified_after_last_output?() click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 83
def modified_after_last_output?
  return true unless @output_file
  output_path = File.expand_path(@output_file)
  return true unless File.exist? output_path
  output_time = File.mtime(output_path)
  return true if modified_time(@recipe['template']) >= output_time
  data_files = @recipe['blocks'].map {|block| block['data'] }
  data_files.unshift(@recipe['data'])
  data_files.any? {|data_file| modified_time(data_file) >= output_time }
end
parse_template() click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 61
def parse_template
  template_path = File.expand_path(@recipe['template'])
  template_source = File.open(template_path,
                              open_mode(@template_encoding), &:read)
  tag_type = @recipe['tag_type'] || :default
  tag_type = tag_type.to_sym unless tag_type.kind_of? Symbol
  @template = Parser.parse(template_source, tag_type)
end
prepare_block_data(block) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 52
def prepare_block_data(block)
  determine_data_format!(block)
  return {} unless block['data']
  data_source = read_file(block['data'],
                          block['data_encoding'])
  data_format = prepare_data_format(block)
  RecordReader.read_record(data_source, data_format)
end
read_recipe(recipe_source) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 29
def read_recipe(recipe_source)
  @recipe = if recipe_source.kind_of? String
              RecordReader::YAMLReader.read_record(recipe_source)
            else
              recipe_source
            end
  setup_default!(@recipe)
  @template_encoding = @default['template_encoding']
  @output_file = @default['output_file']
  @recipe
end
update_output_file() click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 70
def update_output_file
  @records ||= load_records
  parse_template
  content = AdHocTemplate::DataLoader.format(@template, @records)
  mode = @template_encoding ? "wb:#{@template_encoding}" : 'wb'
  if @output_file
    File.open(File.expand_path(@output_file),
              mode) {|file| file.print content }
  else
    STDOUT.print content
  end
end

Private Instance Methods

determine_data_format!(block) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 124
def determine_data_format!(block)
  data_format = block['data_format']
  if !data_format && block['data']
    data_format = guess_file_format(block['data'])
  end

  block['data_format'] ||= data_format
end
modified_time(filename) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 156
def modified_time(filename)
  File.mtime(File.expand_path(filename))
end
open_mode(encoding) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 138
def open_mode(encoding)
  encoding ||= Encoding.default_external.names[0]
  mode = 'rb'
  return mode unless encoding && !encoding.empty?
  bom = /\AUTF/i =~ encoding ? 'BOM|' : ''
  "#{mode}:#{bom}#{encoding}"
end
prepare_data_format(block) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 146
def prepare_data_format(block)
  data_format = block['data_format']
  data_format = :default if !data_format || data_format.empty?
  data_format = data_format.to_sym
  return data_format unless csv_or_tsv? data_format
  label = block['label']
  return { data_format => label.sub(/\A#/, '') } if label
  data_format
end
read_file(file_name, encoding) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 133
def read_file(file_name, encoding)
  File.open(File.expand_path(file_name),
            open_mode(encoding), &:read)
end
setup_default!(recipe) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 96
def setup_default!(recipe)
  recipe.each do |key, val|
    @default[key] = val unless val.kind_of? Array
  end

  setup_sub_blocks!(recipe)
  setup_main_label
end
setup_main_label() click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 118
def setup_main_label
  if (data_format = @default['data_format']) && csv_or_tsv?(data_format)
    @default['label'] ||= RecordReader::CSVReader::HEADER_POSITION::LEFT
  end
end
setup_sub_blocks!(recipe) click to toggle source
# File lib/ad_hoc_template/recipe_manager.rb, line 105
def setup_sub_blocks!(recipe)
  unless recipe['blocks']
    recipe['blocks'] = []
    return
  end

  recipe['blocks'].each do |block|
    @default.keys.each do |key|
      block[key] ||= @default[key]
    end
  end
end