Module: Mez

Defined in:
lib/mez.rb,
lib/mez/VERSION.rb

Constant Summary collapse

APP_DIR =
if OS.windows?
  File.join(File.expand_path('~'), 'appdata', 'local', 'mez')
else
  File.join(File.expand_path('~'), '.mez')
end
CONFIG =
File.join(APP_DIR, 'folders.json')
DB =
if File.exist?(File.join(APP_DIR, 'folders.db'))
  SQLite3::Database.new(File.join(APP_DIR, 'folders.db'))
else
  FileUtils.mkdir_p(APP_DIR) unless File.exist?(APP_DIR)
  db = SQLite3::Database.new(File.join(APP_DIR, 'folders.db'))
  db.execute('CREATE TABLE folders (name string, date string, size int,
              PRIMARY KEY ("name", "date"))')
  db
end
VERSION =
'0.8.2'.freeze

Class Method Summary collapse

Class Method Details

.closing_line(total_size, total_difference) ⇒ Object



104
105
106
107
108
109
# 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) ⇒ String

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.

Parameters:

  • n (Integer)

    size differential in bytes

Returns:

  • (String)

    “+48,151”



74
75
76
# 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) ⇒ Integer

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.

Parameters:

  • folder (String)

    a path to a folder, eg ‘~/books’ or ‘c:books’

Returns:

  • (Integer)

    the folder’s size in bytes



34
35
36
37
38
39
40
41
42
43
# 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) ⇒ String

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

Parameters:

  • num (Integer)

    any integer, eg -48151

Returns:

  • (String)

    a human readable number, eg “-48,151”



49
50
51
52
53
54
55
56
57
58
59
# 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_lineObject



91
92
93
94
# 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) ⇒ String

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

Parameters:

  • n (Number)

Returns:

  • (String)

    “+” or “-”



65
66
67
# File 'lib/mez.rb', line 65

def self.prefix(n)
  n >= 0 ? '+' : '-'
end

.report(name, size, difference) ⇒ Object



85
86
87
88
89
# 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) ⇒ Integer

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

Parameters:

  • array (Array<String>)

    of folder names

Returns:

  • (Integer)

    total size of all folders and their contents



100
101
102
# File 'lib/mez.rb', line 100

def self.setsize(folderset)
  folderset.reduce(0) { |acc, elem| acc + Mez.folder_size(elem) }
end

.update(name, size) ⇒ Object



111
112
113
114
115
# 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) ⇒ Object



78
79
80
81
82
83
# 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