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