class FileRenamer::RenameOrderer

Attributes

rename_processes[R]
unable_processes[R]

Public Class Methods

new(olds_news, dir = '.') click to toggle source

example of 'processes'

[
  [old0, new0],
  [old1, new1],
  ...
]
# File lib/filerenamer/renameorderer.rb, line 20
def initialize(olds_news, dir = '.')
  @dir = dir
  #@all_processes = processes.to_h
  @all_processes = olds_news
  @unworked_processes = Marshal.load(Marshal.dump(@all_processes))
  @rename_processes = []
  @unable_processes = []

  @post_processes = []
  while ! @unworked_processes.empty?
    key = @unworked_processes.keys[0]
    @first_old = key
    class_process(key)
  end
  @rename_processes += @post_processes unless @post_processes.empty?
  @post_processes = []

  @unable_processes.sort!
end

Private Instance Methods

add_rename(old, new) click to toggle source
# File lib/filerenamer/renameorderer.rb, line 140
def add_rename(old, new)
  @rename_processes << [old, new]
  @unworked_processes.delete(old)
  return true
end
add_unable(old, new) click to toggle source
# File lib/filerenamer/renameorderer.rb, line 146
def add_unable(old, new)
  @unable_processes << [old, new]
  @unworked_processes.delete(old)
  return false
end
class_process(old) click to toggle source

再帰的メソッド その process と、依存する全ての process を @rename_processes と @unable_processes に分類する。 その process が実行可能であるか? を返す。

# File lib/filerenamer/renameorderer.rb, line 45
def class_process(old)

  new = @unworked_processes[old]

  if $DEBUG
    puts "=" * 60
    pp self
    print "old "
    pp old
    print "new "
    pp new
    puts
  end

  # old と new が一致していれば不可
  if old == new
    puts "old(#{old}) == new(#{new}). retrun false." if $DEBUG
    add_unable(old, new)
    return false
  end
  puts "old(#{old}) != new(#{new})" if $DEBUG

  # old が存在しなければ不可
  unless FileTest.exist?("#{@dir}/#{old}")
    puts "old(#{old}) not exist in the file system. return false." if $DEBUG
    add_unable(old, new)
    return false
  end
  puts "old(#{old}) exist" if $DEBUG

  # new がどれかの dst と重複ならば、不可
  if @all_processes.values.select{|name| new == name}.size > 1
    puts "new(#{new}) is dpulicated in #{@all_processes.values}. return false." if $DEBUG
    add_unable(old, new)
    return false
  end
  puts "new(#{new}) is only one in new of @all_processes( #{@all_processes})" if $DEBUG

  unless File.exist?("#{@dir}/#{new}") # new がファイルとして存在しないならば、可能
    puts "new(#{new}) does not exist in the filesystem. return true." if $DEBUG
    add_rename(old, new)
    return true
  end
  puts "new(#{new}) exist in the filesystem" if $DEBUG

  # new がファイルとして存在する

  # 可能リストに入っていたら、ここまでにリネームされているので可能
  if @rename_processes.map{|o, n| o}.include?(new)
    puts "new(#{new}) is included in old of @rename_processes(#{@rename_processeses}). return true." if $DEBUG
    add_rename(old, new)
    return true
  end

  # new が、他のいずれかの process の old で ない ならば、空かないので不可
  unless @unworked_processes[new]
    puts "@unworked_processes[new](#{@unworked_processes[new] }). return false." if $DEBUG
    add_unable(old, new)
    return false
  end

  # new が、他のいずれかの process の old で ある

  # new が依存性チェーンの先頭と同じであれば、
  # 先頭を一時ファイルにリネームして、その上でリネーム可能とし、
  # 最後に一時ファイルからリネームする処理を追加。
  if new == @first_old
    puts "new #{new} == first_old #{@first_old}. use tmp file and return true." if $DEBUG
    #tmp = Tempfile.new("#{@first_old}-", @dir).path
    tmp = Tempfile.new("#{@all_processes[@first_old]}-#{@first_old}-", @dir).path
    add_rename(@first_old, tmp)
    @post_processes << [tmp, @all_processes[@first_old]]
    pp self if $DEBUG
    return true
  end
  puts "new(#{new}) != first_old(#{@first_old})" if $DEBUG

  puts "class_process(new)" if $DEBUG
  pp self if $DEBUG
  #ここでの new からリネームするプロセスについて、再帰的に実行
  if class_process(new)
    pp self if $DEBUG
    puts "depending process can be executed. return true." if $DEBUG
    #add_rename(old, new) unless @rename_processes.map{|o, n| o}.include?(old)
    #add_rename(old, new)
    return true
  else
    puts "depending process cannot be executed. return false." if $DEBUG
    add_unable(old, new)
    return false
  end
end