quinta-feira, 27 de outubro de 2005

Ruby - A primeira script , versão 1.1

Ruby - A primeira script , versão 1.1

A primeira versão deste FileRename tinha um bug, por isso aproveitei os últimos conhecimentos da linguagem para o melhorar.

O bug era nos casos limites das datas. Por exemplo, se um ficheiro tivesse a data de 30 de Setembro, ao adicionar mais 3 dias, a data passava para o impossível 33 de Setembro.

A solução consistiu em construir um objecto da classe DateTime que contem uma data de calendário. Esta data é definida pelo parsing directo do nome do ficheiro -data_hora = DateTime.strptime(filename, "%Y-%m-%d %H-%M-%S"). Através de um dos mecanismos da classe Time, é possivel manipular a componente dos segundos - uTime = uTime + (3*24*60*60). Assim consegui ajustar devidamente a data. No exemplo dado, passa logo para o dia 2 de Outubro, como esperado.

Aqui fica o código fonte actual:


 1 puts Dir.pwd
 2 
 3 Dir.glob("*.{jpg,JPG}") do

 4   |filename|
 5 
 6   # take out the last characters "5678.jpg"
 7   # this works because the name template has always 
 8   # the same number of characters
 9   # "1234-56-78 90-12-34 5678.jpg"
10   index = filename[-8..-1]
11   
12   data_hora = DateTime.strptime(filename, "%Y-%m-%d %H-%M-%S")
13   puts "\nData inicial: #{data_hora.to_s}"
14 
15   uTime = data_hora.to_time
16   
17   # add 3 days = 3 * 24 horas * 60 min * 60 seg
18   uTime = uTime + (3*24*60*60)

19   puts "Date Ajustada: " + uTime.strftime("%Y-%m-%d %H-%M-%S")
20 
21   newfilename = uTime.strftime("%Y-%m-%d %H-%M-%S") + " " + index
22   puts newfilename
23   
24   puts "Renamed file #{filename} to #{newfilename}"
25   File.rename(filename, newfilename)
26 
27 end

Nota: Na classe DateTime, falta a mensagem ".to_time" na minha versão 1.8.2 do Ruby. Este método, criar um objecto Time, com a mesma data de DateTime. Tive que adicionar manualmente no código fonte desta classe, este código da versão 1.9 do Ruby