# Copyright:: (c) Autotelik Media Ltd 2016 # Author :: Tom Statter # Date :: April 2016 # License:: MIT. # # require 'datashift' # Note, not DataShift, case sensitive, create namespace for command line : datashift module Datashift class Tools < Thor include DataShift::Logging desc 'file_rename', 'Clone a folder of files, consistently renaming each in the process' method_option :path, aliases: '-p', required: true, desc: 'The path to the original files' method_option :output, aliases: '-o', required: true, desc: 'The resulting zip file name' method_option :offset, required: false, type: :numeric, desc: 'A numeric offset to add to the file name' method_option :width, required: false, type: :numeric, desc: 'A numeric width tp pad the file name' method_option :prefix, required: false, desc: 'A strign prefix to add to file name' method_option :commit, required: false, type: :boolean, desc: 'Actually perform copy' def file_rename cache = options[:path] if File.exist?(cache) puts "Renaming files from #{cache}" Dir.glob(File.join(cache, '*')) do |name| path, base_name = File.split(name) id = base_name.slice!(/\w+/) id = id.to_i + options[:offset].to_i if options[:offset] id = format("%0#{width}d", id.to_i) if options[:width] id = options[:prefix] + id.to_s if options[:prefix] destination = File.join( options[:output], "#{id}#{base_name}") puts "File Rename: cp #{name} #{destination}" File.send( 'cp', name, destination) if options[:commit] end end end desc 'zip', 'Create zip of files' method_option :path, aliases: '-p', required: true, desc: 'The path to the digital files' method_option :output, aliases: '-o', required: true, desc: 'The resulting zip file name' def zip require 'zip/zip' require 'zip/zipfilesystem' output = options[:output] Zip::ZipOutputStream.open(output) do |zos| Dir[File.join(options[:path], '**', '*.*')].each do |p| zos.put_next_entry(File.basename(p)) zos.print IO.read(p) end end end desc 'zip_matching', 'Create zip of matching digital files e.g zip up pdf, jpg and png versions of a file' method_option :path, aliases: '-p', required: true, desc: 'The path to the digital files' method_option :results, aliases: '-r', required: true, desc: 'The path to store resulting zip files' def zip_matching require 'zip/zip' require 'zip/zipfilesystem' ready_to_zip = {} Dir[File.join(options[:path], '**', '*.*')].each do |p| next if File.directory? p basename = File.basename(p, '.*') ready_to_zip[basename] ||= [] ready_to_zip[basename] << p end output = options[:results] FileUtils.mkdir_p(output) unless File.exist?(output) puts "Creating #{ready_to_zip.keys.size} new zips" ready_to_zip.each do |basename, paths| z = File.join(output, basename + '.zip') puts "zipping to #{z}" Zip::ZipOutputStream.open(z) do |zos| paths.each do |file| zos.put_next_entry(File.basename(file)) zos.print IO.read(file) end end end end end end