Class: Renamr::Renamer

Inherits:
Object
  • Object
show all
Defined in:
lib/renamr/renamer.rb

Overview

Renames files using configured rules.

Instance Method Summary collapse

Constructor Details

#initializeRenamer

Returns a new instance of Renamer.



15
16
17
18
# File 'lib/renamr/renamer.rb', line 15

def initialize
  @cfg = Configurator.new
  @fac = ActionsFactory.new(@cfg)
end

Instance Method Details

#doObject



72
73
74
75
76
# File 'lib/renamr/renamer.rb', line 72

def do
  Reporter.init(@cfg.act?, @cfg.wid)
  do_dir(@cfg.dir)
  Reporter.final
end

#do_dir(dir) ⇒ Object

rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/PerceivedComplexity



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/renamr/renamer.rb', line 52

def do_dir(dir) # rubocop:disable Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/AbcSize, Metrics/PerceivedComplexity
  raise "No such directory: #{dir}." unless File.directory?(dir)

  dat = []
  act = @fac.produce(dir)

  # Skips hidden files.
  Dir.entries(dir).reject { |f| f.start_with?('.') }.sort.each do |nme|
    src = File.join(dir, nme)
    do_dir(src) if @cfg.rec? && File.directory?(src)
    act.each { |a| a.set(nme) }
    act.each { |a| break if (nme = a.do(nme)).nil? } # rubocop:disable Style/CombinableLoops
    next if nme.nil?

    nme = unique(dat, nme)
    dat << [src, File.join(dir, nme)]
  end
  move(dir, dat) if dat.any?
end

#move(dir, dat) ⇒ Object

rubocop:disable Metrics/MethodLength, Metrics/AbcSize



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/renamr/renamer.rb', line 20

def move(dir, dat) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
  rep = Reporter.new(File.expand_path(dir))
  dat.each do |src, dst|
    if src == dst
      rep.add(File.basename(src), '')
      next
    end
    begin
      File.rename(src, dst) if @cfg.act?
      rep.add(File.basename(src), File.basename(dst))
    rescue StandardError => e
      rep.add(File.basename(src), e)
      msg = ": #{e}"
      msg += " (#{e.class})" if e.class
      msg += "\n\t#{e.backtrace.join("\n\t")}"
      puts msg
    end
  end
  rep.do
end

#unique(dat, nme) ⇒ Object



41
42
43
44
45
46
47
48
49
50
# File 'lib/renamr/renamer.rb', line 41

def unique(dat, nme)
  dst = dat.map { |_, d| File.basename(d) }
  return nme unless dst.include?(nme)

  ext = File.extname(nme)
  0.step do |i| # Iterates indefinitely with an index.
    n = ext.nil? ? "#{nme}-#{i}" : "#{File.basename(nme, ext)}-#{i}#{ext}"
    return n unless dst.include?(n)
  end
end