module Mez

Constants

APP_DIR
CONFIG
DB
VERSION

Public Class Methods

closing_line(total_size, total_difference) click to toggle source
# File lib/mez.rb, line 104
def self.closing_line(total_size, total_difference)
  puts('-' * 80)
  puts 'TOTAL SIZE: ' +
       humanise(total_size / 1_000_000) +
       ('TOTAL CHANGE: ' + humanise(total_difference / 1_000_000)).rjust(59)
end
difference_report(n) click to toggle source

Format a number for the 'change' column, meaning a + or - prefix and a number in bytes converted to a comma-separated number in IEC megabytes.

@param n [Integer] size differential in bytes @return [String] “+48,151”

# File lib/mez.rb, line 74
def self.difference_report(n)
  n.zero? ? '' : prefix(n) + humanise(n.abs / 1_000_000)
end
folder_size(folder) click to toggle source

Calculates the size of a folder and its contents as an integer. On Windows, uses the Win32 API, which caches folder information and makes repeated calls to this function very fast. On other systems, sums individual file sizes.

@param folder [String] a path to a folder, eg '~/books' or 'c:books' @return [Integer] the folder's size in bytes

# File lib/mez.rb, line 34
def self.folder_size(folder)
  if OS.windows?
    # Much faster for repeated calls than calculating sizes in Ruby.
    WIN32OLE.new('Scripting.FileSystemObject').getFolder(folder).size.to_i
  else
    size = 0
    Dir.glob(File.join(folder, '**', '*')) { |file| size += File.size(file) }
    size
  end
end
humanise(num) click to toggle source

Uses commas as separators to make large numbers human-readable.

@param num [Integer] any integer, eg -48151 @return [String] a human readable number, eg “-48,151”

# File lib/mez.rb, line 49
def self.humanise(num)
  (prefix(num) == '-' ? '-' : '') + num
                                    .abs
                                    .to_s
                                    .split('')
                                    .reverse
                                    .each_slice(3)
                                    .map(&:join)
                                    .join(',')
                                    .reverse
end
intro_line() click to toggle source
# File lib/mez.rb, line 91
def self.intro_line
  puts "\nFOLDERSET".ljust(56) + 'SIZE (MB)' + 'CHANGE (MB)'.rjust(16)
  puts('-' * 80)
end
prefix(n) click to toggle source

Provide a “+” or “-” prefix based on whether `n` is positive or negative.

@param n [Number] @return [String] “+” or “-”

# File lib/mez.rb, line 65
def self.prefix(n)
  n >= 0 ? '+' : '-'
end
report(name, size, difference) click to toggle source
# File lib/mez.rb, line 85
def self.report(name, size, difference)
  puts name.ljust(54) +
       humanise(size / 1_000_000).rjust(10) +
       difference_report(difference).rjust(16)
end
setsize(folderset) click to toggle source

Take an array of folder names, and return their total size in bytes.

@param [Array<String>] array of folder names @return [Integer] total size of all folders and their contents

# File lib/mez.rb, line 100
def self.setsize(folderset)
  folderset.reduce(0) { |acc, elem| acc + Mez.folder_size(elem) }
end
update(name, size) click to toggle source
# File lib/mez.rb, line 111
def self.update(name, size)
  DB.execute('INSERT OR REPLACE INTO folders
              (name, size, date)
              VALUES (?,?,?)', name, size, Date.today.to_s)
end
yesterday_size(name) click to toggle source
# File lib/mez.rb, line 78
def self.yesterday_size(name)
  DB.get_first_value('SELECT size FROM folders
                      WHERE name = ? AND date <> ?
                      ORDER BY date DESC
                      LIMIT 1', name, Date.today.to_s)
end