class Libis::Format::Converter::Chain

Public Class Methods

new(source_format, target_format, operations = {}) click to toggle source
# File lib/libis/format/converter/chain.rb, line 18
def initialize(source_format, target_format, operations = {})
  @source_format = source_format.to_sym
  @target_format = target_format.to_sym
  @operations = operations || {}
  @converter_chain = []
end

Public Instance Methods

add_chain_node(node = {}) click to toggle source
# File lib/libis/format/converter/chain.rb, line 120
def add_chain_node(node = {})
  last_converter = @converter_chain.last
  source_format = last_converter ? last_converter[:output] : @source_format
  node[:input] ||= source_format
  return nil unless node[:input] == source_format
  return nil unless node[:output] && node[:converter].output_types(source_format).include?(node[:output])
  return nil unless node[:converter].input_types.include? source_format
  return nil if node_exists?(node)
  @converter_chain << node
  # debug "Chain: #{self}"
  self
end
append(converter) click to toggle source

@param [Libis::Format::Converter::Base.class] converter @return [Array]

# File lib/libis/format/converter/chain.rb, line 27
def append(converter)
  return [] unless converter
  valid_chain_nodes(converter).map do |node|
    self.ddup.add_chain_node(node)
  end.compact
end
apply_operations() click to toggle source
# File lib/libis/format/converter/chain.rb, line 133
def apply_operations
  temp_chain = @converter_chain.reverse.ddup
  applied = true
  operations = @operations && @operations.ddup || {}
  while (operation = operations.shift)
    method = operation.first.to_s.to_sym
    applied &&= :found == temp_chain.each do |node|
      next unless node[:converter].instance_methods.include?(method)
      node[:operations] ||= []
      node[:operations] << {method: method, argument: operation.last}
      break :found
    end
  end
  if applied && operations.empty?
    @converter_chain = temp_chain.reverse
    @operations.clear
    return true
  end
  false
end
closed?() click to toggle source
# File lib/libis/format/converter/chain.rb, line 34
def closed?
  !@converter_chain.empty? &&
      @converter_chain.first[:input].to_sym == @source_format &&
      @converter_chain.last[:output].to_sym == @target_format
end
convert(src_file, target_file) click to toggle source
# File lib/libis/format/converter/chain.rb, line 63
def convert(src_file, target_file)

  unless valid?
    error 'Converter chain is not valid'
    return nil
  end

  temp_files = []

  # noinspection RubyParenthesesAroundConditionInspection
  result = @converter_chain.each_with_index do |node, i|

    target_type = node[:output]
    converter_class = node[:converter]
    converter = converter_class.new

    node[:operations].each do |operation|
      converter.send operation[:method], operation[:argument]
    end if node[:operations]

    target = target_file

    if i < size - 1
      target += ".temp.#{Libis::Format::Library.get_field(target_type, :extensions).first}"
      target += ".#{Libis::Format::Library.get_field(target_type, :extensions).first}" while File.exist? target
      temp_files << target
    end

    FileUtils.mkdir_p File.dirname(target)

    src_file = converter.convert(src_file, target, target_type)

    break :failed unless src_file

  end

  temp_files.each do |f|
    FileUtils.rm(f, force: true)
  end

  result == :failed ? nil : target_file

end
length()
Alias for: size
size() click to toggle source
# File lib/libis/format/converter/chain.rb, line 48
def size
  @converter_chain.size
end
Also aliased as: length
to_array() click to toggle source
# File lib/libis/format/converter/chain.rb, line 44
def to_array
  @converter_chain
end
to_s() click to toggle source
# File lib/libis/format/converter/chain.rb, line 54
def to_s
  "#{@source_format}->-#{@converter_chain.map do |node|
    "#{node[:converter].name.gsub(/^.*::/, '')}#{node[:operations].empty? ? '' :
        "(#{node[:operations].each do |operation|
          "#{operation[:method]}:#{operation[:argument]}"
        end.join(',')})"}->-#{node[:output]}"
  end.join('->-')}"
end
valid?() click to toggle source
# File lib/libis/format/converter/chain.rb, line 40
def valid?
  closed? && apply_operations
end
valid_chain_nodes(converter) click to toggle source
# File lib/libis/format/converter/chain.rb, line 107
def valid_chain_nodes(converter)
  source_format = @converter_chain.last[:output] rescue @source_format
  nodes = []
  if converter.input_types.include? source_format
    converter.output_types(source_format).each do |format|
      node = {converter: converter, input: source_format, output: format}
      next if node_exists?(node)
      nodes << node
    end
  end
  nodes
end

Private Instance Methods

node_exists?(node) click to toggle source
# File lib/libis/format/converter/chain.rb, line 157
def node_exists?(node)
  @converter_chain.detect do |n|
    n[:converter] == node[:converter] && n[:input] == node[:input] && n[:output] == node[:output]
  end
end